eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 1.88 kB
JavaScript
import{truncateHead}from"#execution/sandbox/truncate-output.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{convertHtmlToMarkdown,extractTextFromHtml}from"#execution/web-fetch/html.js";const MAX_RESPONSE_SIZE=5*1024*1024;async function executeWebFetchTool(n,r){let{url:i,format:a=`markdown`,timeout:o}=n;if(!i.startsWith(`http://`)&&!i.startsWith(`https://`))throw Error(`URL must start with http:// or https://`);let s=Math.min(o===void 0?3e4:o*1e3,12e4),c=AbortSignal.timeout(s),l=r?.abortSignal===void 0?c:AbortSignal.any([r.abortSignal,c]),u=buildHeaders(a),d=await fetch(i,{headers:u,signal:l}),f=d.status===403&&d.headers.get(`cf-mitigated`)===`challenge`?await fetch(i,{headers:{...u,"User-Agent":EVE_PACKAGE_NAME},signal:l}):d;if(!f.ok)throw Error(`Request failed with status code: ${f.status}`);let p=f.headers.get(`content-length`);if(p!==null&&parseInt(p,10)>MAX_RESPONSE_SIZE)throw Error(`Response too large (exceeds 5 MB limit).`);let m=await f.arrayBuffer();if(m.byteLength>MAX_RESPONSE_SIZE)throw Error(`Response too large (exceeds 5 MB limit).`);let h=f.headers.get(`content-type`)??``,g=h.includes(`text/html`),_=new TextDecoder().decode(m),v;v=a===`markdown`&&g?convertHtmlToMarkdown(_):a===`text`&&g?extractTextFromHtml(_):_;let{output:y,truncated:b}=truncateHead(v);return{content:y,contentType:h,truncated:b,url:i}}function buildHeaders(e){let t;return t=e===`markdown`?`text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1`:e===`text`?`text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1`:`text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1`,{Accept:t,"Accept-Language":`en-US,en;q=0.9`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36`}}export{executeWebFetchTool};