agent-afk 2.25.2 → 2.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1499,7 +1499,7 @@ ${p}`}}catch(c){return{content:`Error: ${c instanceof Error?c.message:String(c)}
1499
1499
  [output truncated]`),l({content:S})}),u.on("error",m=>{l({content:`Failed to execute grep: ${m.message}`,isError:!0})})})}}var Zo=gn();import{promises as _l}from"fs";var es=async(t,e,n)=>{if(!t||typeof t!="object")throw new Error("Invalid input: expected an object");let o=t.path;if(typeof o!="string")throw new Error("Invalid input: path must be a string");let s;try{s=J(o,n,"read")}catch(i){return{content:i instanceof Error?i.message:String(i),isError:!0}}try{let i=await _l.readdir(s,{withFileTypes:!0}),a=i.filter(u=>u.isDirectory()).map(u=>`${u.name}/`),c=i.filter(u=>!u.isDirectory()).map(u=>u.name);a.sort(),c.sort();let l=[...a,...c];return l.length===0?{content:"(empty directory)"}:{content:l.join(`
1500
1500
  `)}}catch(i){if(i instanceof Error){let a=i;return a.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${i.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};function vt(t,e=()=>{}){let n=new Set;if(!t)return n;for(let r of t.split(",")){let o=r.trim();if(o){if(!/^-?\d+$/.test(o)){e("[allowlist] Ignoring non-numeric chat ID:",o);continue}n.add(Number(o))}}return n}function yn(t,e=()=>{}){return async(n,r)=>{let o=n.chat?.id;if(o===void 0||!t.has(o)){e("[allowlist] Rejecting update from chat:",o??"<unknown>");return}await r()}}var Al="https://api.telegram.org";async function ts(t){if(!t.token)throw new Error("push: token is required");if(t.chatId===""||t.chatId==null||t.chatId===0)throw new Error("push: chatId is required");let e=t.fetchImpl??fetch,r=`${t.apiBase??Al}/bot${t.token}/sendMessage`,o={chat_id:t.chatId,text:t.text.slice(0,4096)};t.parseMode&&(o.parse_mode=t.parseMode),t.replyMarkup&&(o.reply_markup=t.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await e(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let c;try{c=(await a.json()).description}catch{c=`HTTP ${a.status}`}return{ok:!1,status:a.status,...c!==void 0?{errorMessage:c}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}var ns=4096;function Rl(t=ts){return async(e,n)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let o=e.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>ns)return{content:`Invalid input: message exceeds Telegram's ${ns}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=process.env.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=vt(process.env.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(i.size===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[...i],c=[];for(let l of a){let d=await t({token:s,chatId:l,text:o});d.ok||c.push(`chat ${l}: ${d.errorMessage??`HTTP ${d.status}`}`)}return c.length===a.length?{content:`Failed to send Telegram message to any chat. ${c.join("; ")}`,isError:!0}:c.length>0?{content:`Sent Telegram message to ${a.length-c.length}/${a.length} chat(s); ${c.length} failed: ${c.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var rs=Rl();var Cl=`
1501
1501
 
1502
- [\u2026truncated by agent-afk web_scrape]`,Il="https://r.jina.ai/",Ml="https://s.jina.ai/";function Dl(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=3e4;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,12e4)}let a=1e6;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,1e7)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ol(t){return t.mode==="search"?`${Ml}${encodeURIComponent(t.query)}`:t.mode==="markdown"?`${Il}${t.url}`:t.url}function Fl(t,e){let n={"User-Agent":"agent-afk/web_scrape",Accept:t.mode==="raw"?"*/*":"text/plain, text/markdown, */*;q=0.5"};return(t.mode==="markdown"||t.mode==="search")&&e.JINA_API_KEY&&(n.Authorization=`Bearer ${e.JINA_API_KEY}`),n}function Ll(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+Cl}function $l(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=Dl(r);if("error"in s)return{content:s.error,isError:!0};let i=Ol(s),a=Fl(s,n),c=new AbortController,l=()=>{c.abort(o.reason)},d;try{o.aborted?c.abort(o.reason):o.addEventListener("abort",l,{once:!0}),d=setTimeout(()=>{c.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let u;try{u=await e(i,{headers:a,signal:c.signal})}catch(b){if(c.signal.aborted){let m=c.signal.reason;return{content:`web_scrape aborted: ${m instanceof Error?m.message:String(m??"aborted")}`,isError:!0}}return{content:`web_scrape network error: ${b instanceof Error?b.message:String(b)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i}`,isError:!0};let p;try{p=await u.text()}catch(b){return{content:`web_scrape read error: ${b instanceof Error?b.message:String(b)}`,isError:!0}}return{content:Ll(p,s.maxBytes)}}finally{d!==void 0&&clearTimeout(d),o.removeEventListener("abort",l)}}}var os=$l();function St(t,e){let n=t!==void 0?yt(t,e):e!==void 0?yt("default",e):Ko,r=e!==void 0?hn(e):Qo,o=e!==void 0?gn(e):Zo;return new Map([["bash",n],["read_file",qo],["write_file",Vo],["edit_file",Jo],["glob",r],["grep",o],["list_directory",es],["send_telegram",rs],["web_scrape",os]])}var bn=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1502
+ [\u2026truncated by agent-afk web_scrape]`,Il="https://r.jina.ai/",Ml="https://s.jina.ai/";function Dl(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=3e4;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,12e4)}let a=1e6;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,1e7)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ol(t){return t.mode==="search"?`${Ml}${encodeURIComponent(t.query)}`:t.mode==="markdown"?`${Il}${t.url}`:t.url}function Fl(t,e){let n={"User-Agent":"agent-afk/web_scrape",Accept:t.mode==="raw"?"*/*":"text/plain, text/markdown, */*;q=0.5"};return(t.mode==="markdown"||t.mode==="search")&&e.JINA_API_KEY&&(n.Authorization=`Bearer ${e.JINA_API_KEY}`),n}function Ll(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+Cl}function $l(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=Dl(r);if("error"in s)return{content:s.error,isError:!0};let i=Ol(s),a=Fl(s,n);if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let c=new AbortController,l=()=>{c.abort(o.reason)},d;try{o.addEventListener("abort",l,{once:!0}),d=setTimeout(()=>{c.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let u;try{u=await e(i,{headers:a,signal:c.signal})}catch(b){if(c.signal.aborted){let m=c.signal.reason;return{content:`web_scrape aborted: ${m instanceof Error?m.message:String(m??"aborted")}`,isError:!0}}return{content:`web_scrape network error: ${b instanceof Error?b.message:String(b)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i}`,isError:!0};let p;try{p=await u.text()}catch(b){return{content:`web_scrape read error: ${b instanceof Error?b.message:String(b)}`,isError:!0}}return{content:Ll(p,s.maxBytes)}}finally{d!==void 0&&clearTimeout(d),o.removeEventListener("abort",l)}}}var os=$l();function St(t,e){let n=t!==void 0?yt(t,e):e!==void 0?yt("default",e):Ko,r=e!==void 0?hn(e):Qo,o=e!==void 0?gn(e):Zo;return new Map([["bash",n],["read_file",qo],["write_file",Vo],["edit_file",Jo],["glob",r],["grep",o],["list_directory",es],["send_telegram",rs],["web_scrape",os]])}var bn=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1503
1503
 
1504
1504
  - Use read_file before editing to verify the exact content you want to change.
1505
1505
  - Prefer edit_file over write_file for modifying existing files \u2014 write_file is for new files or complete rewrites.
package/dist/telegram.mjs CHANGED
@@ -1545,7 +1545,7 @@ ${p}`}}catch(c){return{content:`Error: ${c instanceof Error?c.message:String(c)}
1545
1545
  [output truncated]`),l({content:w})}),d.on("error",g=>{l({content:`Failed to execute grep: ${g.message}`,isError:!0})})})}}var Js=Gn();import{promises as yu}from"fs";var Ys=async(t,e,n)=>{if(!t||typeof t!="object")throw new Error("Invalid input: expected an object");let o=t.path;if(typeof o!="string")throw new Error("Invalid input: path must be a string");let s;try{s=Z(o,n,"read")}catch(i){return{content:i instanceof Error?i.message:String(i),isError:!0}}try{let i=await yu.readdir(s,{withFileTypes:!0}),a=i.filter(d=>d.isDirectory()).map(d=>`${d.name}/`),c=i.filter(d=>!d.isDirectory()).map(d=>d.name);a.sort(),c.sort();let l=[...a,...c];return l.length===0?{content:"(empty directory)"}:{content:l.join(`
1546
1546
  `)}}catch(i){if(i instanceof Error){let a=i;return a.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${i.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};var bu="https://api.telegram.org";async function Xs(t){if(!t.token)throw new Error("push: token is required");if(t.chatId===""||t.chatId==null||t.chatId===0)throw new Error("push: chatId is required");let e=t.fetchImpl??fetch,r=`${t.apiBase??bu}/bot${t.token}/sendMessage`,o={chat_id:t.chatId,text:t.text.slice(0,4096)};t.parseMode&&(o.parse_mode=t.parseMode),t.replyMarkup&&(o.reply_markup=t.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await e(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let c;try{c=(await a.json()).description}catch{c=`HTTP ${a.status}`}return{ok:!1,status:a.status,...c!==void 0?{errorMessage:c}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}var Qs=4096;function wu(t=Xs){return async(e,n)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let o=e.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Qs)return{content:`Invalid input: message exceeds Telegram's ${Qs}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=process.env.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=Be(process.env.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(i.size===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[...i],c=[];for(let l of a){let u=await t({token:s,chatId:l,text:o});u.ok||c.push(`chat ${l}: ${u.errorMessage??`HTTP ${u.status}`}`)}return c.length===a.length?{content:`Failed to send Telegram message to any chat. ${c.join("; ")}`,isError:!0}:c.length>0?{content:`Sent Telegram message to ${a.length-c.length}/${a.length} chat(s); ${c.length} failed: ${c.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var Zs=wu();var ku=`
1547
1547
 
1548
- [\u2026truncated by agent-afk web_scrape]`,vu="https://r.jina.ai/",Su="https://s.jina.ai/";function xu(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=3e4;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,12e4)}let a=1e6;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,1e7)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Eu(t){return t.mode==="search"?`${Su}${encodeURIComponent(t.query)}`:t.mode==="markdown"?`${vu}${t.url}`:t.url}function Tu(t,e){let n={"User-Agent":"agent-afk/web_scrape",Accept:t.mode==="raw"?"*/*":"text/plain, text/markdown, */*;q=0.5"};return(t.mode==="markdown"||t.mode==="search")&&e.JINA_API_KEY&&(n.Authorization=`Bearer ${e.JINA_API_KEY}`),n}function _u(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+ku}function Au(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=xu(r);if("error"in s)return{content:s.error,isError:!0};let i=Eu(s),a=Tu(s,n),c=new AbortController,l=()=>{c.abort(o.reason)},u;try{o.aborted?c.abort(o.reason):o.addEventListener("abort",l,{once:!0}),u=setTimeout(()=>{c.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let d;try{d=await e(i,{headers:a,signal:c.signal})}catch(y){if(c.signal.aborted){let g=c.signal.reason;return{content:`web_scrape aborted: ${g instanceof Error?g.message:String(g??"aborted")}`,isError:!0}}return{content:`web_scrape network error: ${y instanceof Error?y.message:String(y)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${i}`,isError:!0};let p;try{p=await d.text()}catch(y){return{content:`web_scrape read error: ${y instanceof Error?y.message:String(y)}`,isError:!0}}return{content:_u(p,s.maxBytes)}}finally{u!==void 0&&clearTimeout(u),o.removeEventListener("abort",l)}}}var ei=Au();function ti(t,e){let n=t!==void 0?Ht(t,e):e!==void 0?Ht("default",e):Hs,r=e!==void 0?Wn(e):Vs,o=e!==void 0?Gn(e):Js;return new Map([["bash",n],["read_file",Bs],["write_file",Gs],["edit_file",Ks],["glob",r],["grep",o],["list_directory",Ys],["send_telegram",Zs],["web_scrape",ei]])}var Kn=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1548
+ [\u2026truncated by agent-afk web_scrape]`,vu="https://r.jina.ai/",Su="https://s.jina.ai/";function xu(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=3e4;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,12e4)}let a=1e6;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,1e7)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Eu(t){return t.mode==="search"?`${Su}${encodeURIComponent(t.query)}`:t.mode==="markdown"?`${vu}${t.url}`:t.url}function Tu(t,e){let n={"User-Agent":"agent-afk/web_scrape",Accept:t.mode==="raw"?"*/*":"text/plain, text/markdown, */*;q=0.5"};return(t.mode==="markdown"||t.mode==="search")&&e.JINA_API_KEY&&(n.Authorization=`Bearer ${e.JINA_API_KEY}`),n}function _u(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+ku}function Au(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=xu(r);if("error"in s)return{content:s.error,isError:!0};let i=Eu(s),a=Tu(s,n);if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let c=new AbortController,l=()=>{c.abort(o.reason)},u;try{o.addEventListener("abort",l,{once:!0}),u=setTimeout(()=>{c.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let d;try{d=await e(i,{headers:a,signal:c.signal})}catch(y){if(c.signal.aborted){let g=c.signal.reason;return{content:`web_scrape aborted: ${g instanceof Error?g.message:String(g??"aborted")}`,isError:!0}}return{content:`web_scrape network error: ${y instanceof Error?y.message:String(y)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${i}`,isError:!0};let p;try{p=await d.text()}catch(y){return{content:`web_scrape read error: ${y instanceof Error?y.message:String(y)}`,isError:!0}}return{content:_u(p,s.maxBytes)}}finally{u!==void 0&&clearTimeout(u),o.removeEventListener("abort",l)}}}var ei=Au();function ti(t,e){let n=t!==void 0?Ht(t,e):e!==void 0?Ht("default",e):Hs,r=e!==void 0?Wn(e):Vs,o=e!==void 0?Gn(e):Js;return new Map([["bash",n],["read_file",Bs],["write_file",Gs],["edit_file",Ks],["glob",r],["grep",o],["list_directory",Ys],["send_telegram",Zs],["web_scrape",ei]])}var Kn=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1549
1549
 
1550
1550
  - Use read_file before editing to verify the exact content you want to change.
1551
1551
  - Prefer edit_file over write_file for modifying existing files \u2014 write_file is for new files or complete rewrites.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "2.25.2",
3
+ "version": "2.26.0",
4
4
  "description": "CLI tool for interacting with AI agents via multiple interfaces",
5
5
  "main": "dist/index.mjs",
6
6
  "type": "module",