agent-afk 5.83.3 → 5.83.4

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/telegram.mjs CHANGED
@@ -160,7 +160,7 @@ ${n.join(`
160
160
  `,s),a=i===-1?t.length:i,l=t.slice(s+Ld.length,a),c=Mi(e??new Date,n);return l===c?t:t.slice(0,s+Ld.length)+c+t.slice(a)}var Hh,Ld,Wh=y(()=>{"use strict";Be();Hh=`# Environment
161
161
  - Working directory: `,Ld="- Date: "});function bn(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 Kh(t,e){return e.has(t)}function Gh(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 go=y(()=>{"use strict"});var sr,Nd,$d=y(()=>{"use strict";sr={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},Nd="bypassPermissions"});function ho(){return _.ANTHROPIC_API_KEY||_.CLAUDE_CODE_OAUTH_TOKEN||Ue()}function $i(){return _.OPENAI_API_KEY||_.CODEX_API_KEY||void 0}function ie(t){let e=Q(t);return e==="openai-compatible"||e==="openai-codex"?$i():ho()}var xe=y(()=>{"use strict";ke();rr();H()});import{existsSync as hC}from"fs";import{join as yC}from"path";import{config as bC}from"dotenv";function Ui(){return ho()}function Jh(t){let e=t.trim();if(!e)return e;let n="/chat/completions";if(e.endsWith(n)){let r=e.slice(0,-n.length);return zh.has(e)||(zh.add(e),console.warn(`[afk] AFK_OPENAI_BASE_URL: stripped trailing "/chat/completions" \u2014 the OpenAI SDK appends it automatically.
162
162
  Effective base URL: ${r}`)),r}return e}function Vh(){if(Ud!==void 0)return Ud;if(!qh){let o=[yC(process.cwd(),".env"),cn(),Zm()];for(let s of o)hC(s)&&bC({path:s,override:!1});qh=!0}let t={},e=_.AFK_MODEL??_.CLAUDE_MODEL;if(e){let o=e.toLowerCase();t.model=oo(o)?o:e}if(Q(e)==="anthropic-direct"){let o=Ui();o!==void 0&&(t.apiKey=o)}let r=_.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(t.baseUrl=r,t.apiKey=_.AFK_LOCAL_API_KEY||"local"),_.AFK_MAX_TOKENS){let o=Number(_.AFK_MAX_TOKENS);Number.isInteger(o)&&(t.maxTokens=o)}if(_.AFK_TEMPERATURE){let o=Number(_.AFK_TEMPERATURE);Number.isFinite(o)&&(t.temperature=o)}if(_.AFK_SYSTEM_PROMPT&&(t.systemPrompt=_.AFK_SYSTEM_PROMPT),_.AFK_AUTO_ROUTING){let o=_.AFK_AUTO_ROUTING.toLowerCase()==="true";t.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return _.AFK_OPENAI_BASE_URL&&(t.openaiBaseUrl=Jh(_.AFK_OPENAI_BASE_URL)),Ud=t,t}var qh,Ud,zh,Bd=y(()=>{"use strict";ze();ke();K();xe();H();qh=!1;zh=new Set});var Hd=y(()=>{"use strict";H();K()});var Yh=y(()=>{"use strict";H();Hd()});function Xh(t){let e=t.replace(/\\/g,"/").replace(/^\.\//,"");return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e}function _C(t){let e=t.replace(/\/+$/,""),n=e.lastIndexOf("/");return n===-1?e:e.slice(n+1)}function Qh(t){let e=_C(Xh(t)).toLowerCase();return e===""?!1:wC.some(n=>n.test(e))}function Bi(t){let e=Xh(t);return e===""||Qh(e)?"protected":kC.some(n=>n.test(e))||SC.some(n=>n.test(e))?"opaque":vC.some(n=>n.test(e))?"inspectable":"protected"}var wC,SC,vC,kC,jd=y(()=>{"use strict";wC=[/\.env$/,/^\.env\./,/\.pem$/,/\.key$/,/\.p12$/,/\.keystore$/,/\.jks$/,/^id_rsa/,/^id_ed25519/,/^\.netrc$/,/credential/,/secret/,/\.sqlite3?$/,/\.db$/],SC=[/(?:^|\/)node_modules\//,/(?:^|\/)\.pnpm(-store)?\//,/(?:^|\/)\.yarn\//,/(?:^|\/)bower_components\//,/(?:^|\/)vendor\/bundle\//,/(?:^|\/)\.venv\//,/(?:^|\/)venv\//,/(?:^|\/)__pycache__\//,/(?:^|\/)\.turbo\//,/(?:^|\/)\.parcel-cache\//,/(?:^|\/)\.vite\//,/(?:^|\/)\.cache\//,/(?:^|\/)\.gradle\//,/(?:^|\/)\.pytest_cache\//,/(?:^|\/)\.mypy_cache\//,/(?:^|\/)\.ruff_cache\//,/(?:^|\/)\.nyc_output\//],vC=[/(?:^|\/)dist\//,/(?:^|\/)build\//,/(?:^|\/)out\//,/(?:^|\/)lib-cov\//,/(?:^|\/)\.next\//,/(?:^|\/)\.nuxt\//,/(?:^|\/)\.svelte-kit\//,/(?:^|\/)\.output\//,/(?:^|\/)target\//,/(?:^|\/)coverage\//,/(?:^|\/)logs\//],kC=[/^\.afk-worktree-meta\.json$/,/\.tsbuildinfo$/,/^\.eslintcache$/,/^\.stylelintcache$/,/^\.DS_Store$/,/(?:^|\/)debug\.log$/,/(?:^|\/)npm-debug\.log$/,/(?:^|\/)yarn-error\.log$/,/(?:^|\/)yarn-debug\.log$/,/(?:^|\/)pnpm-debug\.log$/,/(?:^|\/)lerna-debug\.log$/]});async function Zh(t,e,n){let r=[...EC,"-C",e,"status","--porcelain","--ignored"];n!==void 0&&r.push("--untracked-files=all","--",n);try{let{stdout:o}=await t("git",r,AC);return{entries:o.split(`
163
- `).filter(s=>s.startsWith("!!")).map(s=>s.slice(2).trim()).filter(s=>s!=="")}}catch(o){let s=o instanceof Error?o.message:String(o);return{failure:n===void 0?s:`expanding ${n}: ${s}`}}}async function TC(t,e,n){let r=await Zh(t,e,n);if("failure"in r)return{protect:!0,because:"git-failed",detail:r.failure};for(let o of r.entries)if(o!==n&&Bi(o)==="protected")return{protect:!0,because:"non-rebuildable-entry"};return{protect:!1}}async function Wd(t,e){let n=await Zh(t,e);if("failure"in n)return{protect:!0,because:"git-failed",detail:n.failure};for(let r of n.entries){let o=Bi(r);if(o==="protected")return{protect:!0,because:"non-rebuildable-entry"};if(o==="inspectable"&&r.endsWith("/")){let s=await TC(t,e,r);if(s.protect)return s}}return{protect:!1}}async function Kd(t,e){return(await Wd(t,e)).protect}var EC,AC,Hi=y(()=>{"use strict";jd();jd();EC=["-c","core.quotePath=false"],AC={maxBuffer:64*1024*1024,timeout:1e4}});import{execFile as xC}from"node:child_process";import{promisify as RC}from"node:util";function ty(t,e){if(t.length>ey)throw new Error(`Invalid branch prefix from ${e}: length ${t.length} exceeds ${ey}.`);if(!IC.test(t))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 only [A-Za-z0-9_-./] are allowed.`);if(t.startsWith("-"))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);return t}function ny(t,e){if(t.trim().length===0)throw new Error(`Invalid worktree base ref from ${e}: '' \u2014 base ref cannot be empty.`);if(t.startsWith("-"))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);if(t.includes("\0"))throw new Error(`Invalid worktree base ref from ${e}: contains a NUL byte.`);if(/\s/.test(t))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not contain whitespace.`)}var X2,IC,ey,ry=y(()=>{"use strict";H();Hd();Yh();Hi();X2=RC(xC),IC=/^[A-Za-z0-9_\-./]*$/,ey=64});import{existsSync as bo,readdirSync as ez,readFileSync as oy,realpathSync as tz,statSync as nz}from"fs";import{homedir as sy}from"os";import{join as Rt}from"path";function Gd(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e={};for(let n of iy){let r=t[n];if(r!==void 0){if(r===!0){e[n]={plugins:!0,skills:!0,mcp:!0};continue}if(r!==!1&&typeof r=="object"&&r!==null&&!Array.isArray(r)){let o=r;e[n]={plugins:o.plugins===!0,skills:o.skills===!0,mcp:o.mcp===!0}}}}return Object.keys(e).length>0?e:void 0}function qd(){return[At(),Xs()]}function wo(t=qd()){for(let e of t)if(bo(e))try{let n=JSON.parse(oy(e,"utf-8")),r=Gd(n.importFrom);if(r!==void 0)return r}catch{}}function So(t,e=sy()){let n={pluginRoots:[],skillRoots:[],mcpConfigs:[]};if(!t)return n;for(let r of iy){let o=t[r];if(!o)continue;let s=ji[r];if(o.plugins)for(let i of s.pluginRoots(e))bo(i)&&n.pluginRoots.push({dir:i,binary:r});if(o.skills){let i=`imported:${r}`;for(let a of s.skillRoots(e))bo(a)&&n.skillRoots.push({dir:a,origin:i})}if(o.mcp){let i=CC(s.mcpConfigCandidates(e));i&&n.mcpConfigs.push({source:i,format:s.mcpFormat})}}return n}function ay(t,e=sy()){return ji[t].pluginEnabledState(e)}function CC(t){for(let e of t)if(bo(e))return e;return null}function PC(t){let e=Rt(t,".claude","settings.json");if(!bo(e))return yo;let n;try{n=JSON.parse(oy(e,"utf-8"))}catch{return yo}if(!n||typeof n!="object")return yo;let r=n.enabledPlugins;if(!r||typeof r!="object"||Array.isArray(r))return yo;let o=new Map;for(let[s,i]of Object.entries(r))typeof i=="boolean"&&o.set(s,i);return o}var iy,yo,ji,iz,Wi=y(()=>{"use strict";K();iy=["claude-code","codex"],yo=new Map,ji={"claude-code":{label:"Claude Code",pluginRoots:t=>[Rt(t,".claude","plugins")],skillRoots:t=>[Rt(t,".claude","skills")],mcpConfigCandidates:t=>[Rt(t,".claude","mcp.json"),Rt(t,".claude",".mcp.json"),Rt(t,".claude","claude-code","mcp.json")],mcpFormat:"json",pluginEnabledState:t=>PC(t)},codex:{label:"Codex",pluginRoots:t=>[Rt(t,".codex","plugins")],skillRoots:t=>[Rt(t,".codex","skills")],mcpConfigCandidates:t=>[Rt(t,".codex","config.toml")],mcpFormat:"toml",pluginEnabledState:()=>yo}},iz={"claude-code":ji["claude-code"].label,codex:ji.codex.label}});import{readFileSync as MC,existsSync as OC}from"fs";import{join as DC}from"path";function zd(){if(Ki!==void 0)return Ki;let t=[DC(process.cwd(),"afk.config.json"),At(),Xs()],e=!1;for(let r of t)if(OC(r))try{let o=MC(r,"utf-8"),s=JSON.parse(o),i={},a=rh(s.models);if(typeof s.model=="string"&&s.model.length>0){let c=s.model.toLowerCase();i.model=oo(c)?c:s.model}if(typeof s.maxTokens=="number"&&(i.maxTokens=s.maxTokens),typeof s.temperature=="number"&&(i.temperature=s.temperature),typeof s.systemPrompt=="string"&&s.systemPrompt.length>0&&(i.systemPrompt=s.systemPrompt),typeof s.permissionMode=="string"){let c=s.permissionMode;(c==="default"||c==="plan"||c==="autonomous"||c==="bypassPermissions")&&(i.permissionMode=c)}if(s.autoRouting&&typeof s.autoRouting=="object"){let c={};typeof s.autoRouting.interactive=="boolean"&&(c.interactive=s.autoRouting.interactive),typeof s.autoRouting.chat=="boolean"&&(c.chat=s.autoRouting.chat),typeof s.autoRouting.telegram=="boolean"&&(c.telegram=s.autoRouting.telegram),typeof s.autoRouting.daemon=="boolean"&&(c.daemon=s.autoRouting.daemon),i.autoRouting=c}if(s.daemon&&typeof s.daemon=="object"){let c={};typeof s.daemon.task=="string"&&(c.task=s.daemon.task),typeof s.daemon.taskId=="string"&&(c.taskId=s.daemon.taskId);let d=s.daemon.worktreePrune;d&&typeof d=="object"&&(c.worktreePrune={enabled:typeof d.enabled=="boolean"?d.enabled:!0,cron:typeof d.cron=="string"?d.cron:"0 4 * * *",maxAgeDaysClean:typeof d.maxAgeDaysClean=="number"?d.maxAgeDaysClean:14,maxAgeDaysDirty:typeof d.maxAgeDaysDirty=="number"?d.maxAgeDaysDirty:30,scope:typeof d.scope=="string"?d.scope:"all"}),typeof s.daemon.verifyDone=="boolean"&&(c.verifyDone=s.daemon.verifyDone),i.daemon=c}if(s.telegram&&typeof s.telegram=="object"){let c={},d=s.telegram.notify;if(d&&typeof d=="object"){let u={};if((d.mode==="primary"||d.mode==="broadcast"||d.mode==="custom")&&(u.mode=d.mode),typeof d.primaryChatId=="number"&&Number.isFinite(d.primaryChatId)&&(u.primaryChatId=d.primaryChatId),Array.isArray(d.targets)){let p=d.targets.filter(f=>typeof f=="number"&&Number.isFinite(f));p.length>0&&(u.targets=p)}c.notify=u}if(typeof s.telegram.verifyDone=="boolean"&&(c.verifyDone=s.telegram.verifyDone),Array.isArray(s.telegram.tagOnlyChats)){let u=s.telegram.tagOnlyChats.filter(p=>typeof p=="number"&&Number.isFinite(p));u.length>0&&(c.tagOnlyChats=u)}if(s.telegram.chatAliases&&typeof s.telegram.chatAliases=="object"&&!Array.isArray(s.telegram.chatAliases)){let u={};for(let[p,f]of Object.entries(s.telegram.chatAliases))typeof f=="number"&&Number.isFinite(f)&&f!==0&&(u[p]=f);Object.keys(u).length>0&&(c.chatAliases=u)}i.telegram=c}if(s.updatePolicy&&["notify","auto","off"].includes(s.updatePolicy)&&(i.updatePolicy=s.updatePolicy),s.theme&&["dark","light","auto"].includes(s.theme)&&(i.theme=s.theme),typeof s.autoResumeOnUsageLimit=="boolean"&&(i.autoResumeOnUsageLimit=s.autoResumeOnUsageLimit),typeof s.enforceDoneEvidence=="boolean"&&(i.enforceDoneEvidence=s.enforceDoneEvidence),typeof s.bgSummaries=="boolean"&&(i.bgSummaries=s.bgSummaries),typeof s.maxSummaryCallsPerSession=="number"&&(i.maxSummaryCallsPerSession=Math.min(500,Math.max(1,s.maxSummaryCallsPerSession))),s.hooks!==null&&typeof s.hooks=="object"&&!Array.isArray(s.hooks)&&(i.hooks=s.hooks),typeof s.enableShellHooks=="boolean"&&(i.enableShellHooks=s.enableShellHooks),typeof s.enablePluginHooks=="boolean"&&(i.enablePluginHooks=s.enablePluginHooks),qd().includes(r)){let c=Gd(s.importFrom);c!==void 0&&(i.importFrom=c)}if(s.interactive&&typeof s.interactive=="object"){let c={};typeof s.interactive.worktreeAutoname=="boolean"&&(c.worktreeAutoname=s.interactive.worktreeAutoname),typeof s.interactive.worktreeBranchPrefix=="string"&&(c.worktreeBranchPrefix=ty(s.interactive.worktreeBranchPrefix,`${r}#/interactive/worktreeBranchPrefix`)),typeof s.interactive.worktreeBase=="string"&&s.interactive.worktreeBase.trim().length>0&&(ny(s.interactive.worktreeBase,`${r}#/interactive/worktreeBase`),c.worktreeBase=s.interactive.worktreeBase),typeof s.interactive.suggestGhost=="boolean"&&(c.suggestGhost=s.interactive.suggestGhost),(s.interactive.thinkingUi==="summary"||s.interactive.thinkingUi==="live"||s.interactive.thinkingUi==="digest"||s.interactive.thinkingUi==="off")&&(c.thinkingUi=s.interactive.thinkingUi),Object.keys(c).length>0&&(i.interactive=c)}let l={config:i,sourcePath:r,modelsPartial:a};return e||(Ki=l),l}catch(o){console.error(`Warning: Failed to parse ${r}:`,o),e=!0}let n={config:{},sourcePath:void 0,modelsPartial:{}};return e||(Ki=n),n}var Ki,ly=y(()=>{"use strict";ze();qe();K();ry();Wi()});import{readFileSync as FC,existsSync as LC}from"fs";import{join as cy}from"path";function dy(){if(ir!==void 0)return ir.value;let t=[cy(process.cwd(),"AFK.md"),cy(oe(),"AFK.md")];for(let e of t)if(LC(e))try{let n=FC(e,"utf-8").trim();if(n.length>0)return ir={value:{content:n,path:e}},ir.value}catch{}return ir={value:null},ir.value}var ir,uy=y(()=>{"use strict";K()});function vo(){return zd().config.telegram??{}}function Jd(t){let e=Vh(),{config:n,sourcePath:r,modelsPartial:o}=zd(),s={...sr,...e,...n,...t},i;if(e.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=dy();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??sr.model,maxTokens:s.maxTokens??sr.maxTokens,temperature:s.temperature??sr.temperature,updatePolicy:s.updatePolicy??sr.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??Nd,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.enablePluginHooks!==void 0?{enablePluginHooks:s.enablePluginHooks}:{},...s.enforceDoneEvidence!==void 0?{enforceDoneEvidence:s.enforceDoneEvidence}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{},...s.theme!==void 0?{theme:s.theme}:{}},l=t?.models??yd(o);if(ki(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var Gi=y(()=>{"use strict";ze();qe();ke();$d();Bd();ly();uy();$d();Bd()});function NC(t,e){return e!==void 0&&Number.isFinite(e)&&e!==0?e:t.find(r=>r>0)??t[0]}function $C(t,e={}){let n=[...t],r=e.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(e.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=NC(n,e.primaryChatId);return o!==void 0?[o]:[]}function py(t,e={}){if(typeof t=="number")return!Number.isFinite(t)||t===0?{ok:!1,reason:"invalid",message:`Invalid chat id: ${t}`}:{ok:!0,id:t};let n=t.trim();if(n.length===0)return{ok:!1,reason:"invalid",message:"Invalid chat: empty string"};let r=fy(n);if(r!==void 0)return{ok:!0,id:r};let o=Object.keys(e),s=Object.prototype.hasOwnProperty.call(e,n)?e[n]:void 0;if(s!==void 0&&Number.isFinite(s)&&s!==0)return{ok:!0,id:s};let i=o.length>0?`Available aliases: ${o.join(", ")}.`:"No chat aliases are configured (set telegram.chatAliases in afk.config.json).";return{ok:!1,reason:"unknown-alias",message:`Unknown chat alias "${n}". ${i}`}}function fy(t){if(!t)return;let e=t.trim();if(!/^-?\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)&&n!==0?n:void 0}function UC(t){if(!t)return;let e=t.trim().toLowerCase();return e==="primary"||e==="broadcast"||e==="custom"?e:void 0}function BC(){let t=vo().notify??{},e=t.mode??UC(_.AFK_TELEGRAM_NOTIFY_MODE),n=t.primaryChatId??fy(_.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...e!==void 0?{mode:e}:{},...n!==void 0?{primaryChatId:n}:{},...t.targets!==void 0?{targets:t.targets}:{}}}function qi(){let t=bn(_.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return $C(t,BC())}function my(){return vo().chatAliases??{}}var Vd=y(()=>{"use strict";go();Gi();H()});var hy={};Hc(hy,{push:()=>ar,pushIfConfigured:()=>ko,pushMarkdown:()=>gy});async function ar(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??HC}/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 l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function gy(t){let e=un(t.text),n=Ge(e),r={ok:!0,status:200};for(let o of n)if(r=await ar({...t,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?ar({...t}):r;return r}async function ko(t,e={}){let n=_.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=e.target===void 0?[]:(typeof e.target=="number"?[e.target]:[...e.target]).filter(a=>Number.isFinite(a)&&a!==0),o=r.length>0?r:qi();if(o.length===0)return null;let s=Ge(t),i=[];for(let a of o)for(let l=0;l<s.length;l++){let c={token:n,chatId:a,text:s[l]??"",...e.replyMarkup!==void 0&&l===0?{replyMarkup:e.replyMarkup}:{},...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}};i.push(e.markdown?await gy(c):await ar({...c,...e.parseMode!==void 0?{parseMode:e.parseMode}:{}}))}return i}var HC,_o=y(()=>{"use strict";Vd();Ne();H();HC="https://api.telegram.org"});function jC(t){return t.length<=yy?t:`${t.slice(0,yy)}\u2026(truncated)`}function WC(t){try{let n=[`\u{1F514} AFK needs you \u2014 stuck on: ${t.title??t.serverName}`,jC(t.message)];t.url!==void 0&&t.url!==""&&n.push(t.url),ko(n.join(`
163
+ `).filter(s=>s.startsWith("!!")).map(s=>s.slice(2).trim()).filter(s=>s!=="")}}catch(o){let s=o instanceof Error?o.message:String(o);return{failure:n===void 0?s:`expanding ${n}: ${s}`}}}async function TC(t,e,n){let r=await Zh(t,e,n);if("failure"in r)return{protect:!0,because:"git-failed",detail:r.failure};for(let o of r.entries)if(o!==n&&Bi(o)==="protected")return{protect:!0,because:"non-rebuildable-entry"};return{protect:!1}}async function Wd(t,e){let n=await Zh(t,e);if("failure"in n)return{protect:!0,because:"git-failed",detail:n.failure};for(let r of n.entries){let o=Bi(r);if(o==="protected")return{protect:!0,because:"non-rebuildable-entry"};if(o==="inspectable"&&r.endsWith("/")){let s=await TC(t,e,r);if(s.protect)return s}}return{protect:!1}}async function Kd(t,e){return(await Wd(t,e)).protect}var EC,AC,Hi=y(()=>{"use strict";jd();jd();EC=["-c","core.quotePath=false"],AC={maxBuffer:64*1024*1024,timeout:1e4}});import{execFile as xC}from"node:child_process";import{promisify as RC}from"node:util";function ty(t,e){if(t.length>ey)throw new Error(`Invalid branch prefix from ${e}: length ${t.length} exceeds ${ey}.`);if(!IC.test(t))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 only [A-Za-z0-9_-./] are allowed.`);if(t.startsWith("-"))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);return t}function ny(t,e){if(t.trim().length===0)throw new Error(`Invalid worktree base ref from ${e}: '' \u2014 base ref cannot be empty.`);if(t.startsWith("-"))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);if(t.includes("\0"))throw new Error(`Invalid worktree base ref from ${e}: contains a NUL byte.`);if(/\s/.test(t))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not contain whitespace.`)}var X2,IC,ey,ry=y(()=>{"use strict";H();Hd();Yh();Hi();X2=RC(xC),IC=/^[A-Za-z0-9_\-./]*$/,ey=64});import{existsSync as bo,readdirSync as ez,readFileSync as oy,realpathSync as tz,statSync as nz}from"fs";import{homedir as sy}from"os";import{join as Rt}from"path";function Gd(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e={};for(let n of iy){let r=t[n];if(r!==void 0){if(r===!0){e[n]={plugins:!0,skills:!0,mcp:!0};continue}if(r!==!1&&typeof r=="object"&&r!==null&&!Array.isArray(r)){let o=r;e[n]={plugins:o.plugins===!0,skills:o.skills===!0,mcp:o.mcp===!0}}}}return Object.keys(e).length>0?e:void 0}function qd(){return[At(),Xs()]}function wo(t=qd()){for(let e of t)if(bo(e))try{let n=JSON.parse(oy(e,"utf-8")),r=Gd(n.importFrom);if(r!==void 0)return r}catch{}}function So(t,e=sy()){let n={pluginRoots:[],skillRoots:[],mcpConfigs:[]};if(!t)return n;for(let r of iy){let o=t[r];if(!o)continue;let s=ji[r];if(o.plugins)for(let i of s.pluginRoots(e))bo(i)&&n.pluginRoots.push({dir:i,binary:r});if(o.skills){let i=`imported:${r}`;for(let a of s.skillRoots(e))bo(a)&&n.skillRoots.push({dir:a,origin:i})}if(o.mcp){let i=CC(s.mcpConfigCandidates(e));i&&n.mcpConfigs.push({source:i,format:s.mcpFormat})}}return n}function ay(t,e=sy()){return ji[t].pluginEnabledState(e)}function CC(t){for(let e of t)if(bo(e))return e;return null}function PC(t){let e=Rt(t,".claude","settings.json");if(!bo(e))return yo;let n;try{n=JSON.parse(oy(e,"utf-8"))}catch{return yo}if(!n||typeof n!="object")return yo;let r=n.enabledPlugins;if(!r||typeof r!="object"||Array.isArray(r))return yo;let o=new Map;for(let[s,i]of Object.entries(r))typeof i=="boolean"&&o.set(s,i);return o}var iy,yo,ji,iz,Wi=y(()=>{"use strict";K();iy=["claude-code","codex"],yo=new Map,ji={"claude-code":{label:"Claude Code",pluginRoots:t=>[Rt(t,".claude","plugins")],skillRoots:t=>[Rt(t,".claude","skills")],mcpConfigCandidates:t=>[Rt(t,".claude","mcp.json"),Rt(t,".claude",".mcp.json"),Rt(t,".claude","claude-code","mcp.json")],mcpFormat:"json",pluginEnabledState:t=>PC(t)},codex:{label:"Codex",pluginRoots:t=>[Rt(t,".codex","plugins")],skillRoots:t=>[Rt(t,".codex","skills")],mcpConfigCandidates:t=>[Rt(t,".codex","config.toml")],mcpFormat:"toml",pluginEnabledState:()=>yo}},iz={"claude-code":ji["claude-code"].label,codex:ji.codex.label}});import{readFileSync as MC,existsSync as OC}from"fs";import{join as DC}from"path";function zd(){if(Ki!==void 0)return Ki;let t=[DC(process.cwd(),"afk.config.json"),At(),Xs()],e=!1;for(let r of t)if(OC(r))try{let o=MC(r,"utf-8"),s=JSON.parse(o),i={},a=rh(s.models);if(typeof s.model=="string"&&s.model.length>0){let c=s.model.toLowerCase();i.model=oo(c)?c:s.model}if(typeof s.maxTokens=="number"&&(i.maxTokens=s.maxTokens),typeof s.temperature=="number"&&(i.temperature=s.temperature),typeof s.systemPrompt=="string"&&s.systemPrompt.length>0&&(i.systemPrompt=s.systemPrompt),typeof s.permissionMode=="string"){let c=s.permissionMode;(c==="default"||c==="plan"||c==="autonomous"||c==="bypassPermissions")&&(i.permissionMode=c)}if(s.autoRouting&&typeof s.autoRouting=="object"){let c={};typeof s.autoRouting.interactive=="boolean"&&(c.interactive=s.autoRouting.interactive),typeof s.autoRouting.chat=="boolean"&&(c.chat=s.autoRouting.chat),typeof s.autoRouting.telegram=="boolean"&&(c.telegram=s.autoRouting.telegram),typeof s.autoRouting.daemon=="boolean"&&(c.daemon=s.autoRouting.daemon),i.autoRouting=c}if(s.daemon&&typeof s.daemon=="object"){let c={};typeof s.daemon.task=="string"&&(c.task=s.daemon.task),typeof s.daemon.taskId=="string"&&(c.taskId=s.daemon.taskId);let d=s.daemon.worktreePrune;d&&typeof d=="object"&&(c.worktreePrune={enabled:typeof d.enabled=="boolean"?d.enabled:!0,cron:typeof d.cron=="string"?d.cron:"0 4 * * *",maxAgeDaysClean:typeof d.maxAgeDaysClean=="number"?d.maxAgeDaysClean:14,maxAgeDaysDirty:typeof d.maxAgeDaysDirty=="number"?d.maxAgeDaysDirty:30,scope:typeof d.scope=="string"?d.scope:"all"}),typeof s.daemon.verifyDone=="boolean"&&(c.verifyDone=s.daemon.verifyDone),i.daemon=c}if(s.telegram&&typeof s.telegram=="object"){let c={},d=s.telegram.notify;if(d&&typeof d=="object"){let u={};if((d.mode==="primary"||d.mode==="broadcast"||d.mode==="custom")&&(u.mode=d.mode),typeof d.primaryChatId=="number"&&Number.isFinite(d.primaryChatId)&&(u.primaryChatId=d.primaryChatId),Array.isArray(d.targets)){let p=d.targets.filter(f=>typeof f=="number"&&Number.isFinite(f));p.length>0&&(u.targets=p)}c.notify=u}if(typeof s.telegram.verifyDone=="boolean"&&(c.verifyDone=s.telegram.verifyDone),Array.isArray(s.telegram.tagOnlyChats)){let u=s.telegram.tagOnlyChats.filter(p=>typeof p=="number"&&Number.isFinite(p));u.length>0&&(c.tagOnlyChats=u)}if(s.telegram.chatAliases&&typeof s.telegram.chatAliases=="object"&&!Array.isArray(s.telegram.chatAliases)){let u={};for(let[p,f]of Object.entries(s.telegram.chatAliases))typeof f=="number"&&Number.isFinite(f)&&f!==0&&(u[p]=f);Object.keys(u).length>0&&(c.chatAliases=u)}i.telegram=c}if(s.updatePolicy&&["notify","auto","off"].includes(s.updatePolicy)&&(i.updatePolicy=s.updatePolicy),s.theme&&["dark","light","auto"].includes(s.theme)&&(i.theme=s.theme),typeof s.autoResumeOnUsageLimit=="boolean"&&(i.autoResumeOnUsageLimit=s.autoResumeOnUsageLimit),typeof s.enforceDoneEvidence=="boolean"&&(i.enforceDoneEvidence=s.enforceDoneEvidence),typeof s.bgSummaries=="boolean"&&(i.bgSummaries=s.bgSummaries),typeof s.maxSummaryCallsPerSession=="number"&&(i.maxSummaryCallsPerSession=Math.min(500,Math.max(1,s.maxSummaryCallsPerSession))),s.hooks!==null&&typeof s.hooks=="object"&&!Array.isArray(s.hooks)&&(i.hooks=s.hooks),typeof s.enableShellHooks=="boolean"&&(i.enableShellHooks=s.enableShellHooks),typeof s.enablePluginHooks=="boolean"&&(i.enablePluginHooks=s.enablePluginHooks),qd().includes(r)){let c=Gd(s.importFrom);c!==void 0&&(i.importFrom=c)}if(s.interactive&&typeof s.interactive=="object"){let c={};typeof s.interactive.worktreeAutoname=="boolean"&&(c.worktreeAutoname=s.interactive.worktreeAutoname),typeof s.interactive.worktreeBranchPrefix=="string"&&(c.worktreeBranchPrefix=ty(s.interactive.worktreeBranchPrefix,`${r}#/interactive/worktreeBranchPrefix`)),typeof s.interactive.worktreeBase=="string"&&s.interactive.worktreeBase.trim().length>0&&(ny(s.interactive.worktreeBase,`${r}#/interactive/worktreeBase`),c.worktreeBase=s.interactive.worktreeBase),typeof s.interactive.suggestGhost=="boolean"&&(c.suggestGhost=s.interactive.suggestGhost),(s.interactive.thinkingUi==="summary"||s.interactive.thinkingUi==="live"||s.interactive.thinkingUi==="digest"||s.interactive.thinkingUi==="off")&&(c.thinkingUi=s.interactive.thinkingUi),Object.keys(c).length>0&&(i.interactive=c)}let l={config:i,sourcePath:r,modelsPartial:a};return e||(Ki=l),l}catch(o){console.error(`Warning: Failed to parse ${r}:`,o),e=!0}let n={config:{},sourcePath:void 0,modelsPartial:{}};return e||(Ki=n),n}var Ki,ly=y(()=>{"use strict";ze();qe();K();ry();Wi()});import{readFileSync as FC,existsSync as LC}from"fs";import{join as cy}from"path";function dy(){if(ir!==void 0)return ir.value;let t=[cy(process.cwd(),"AFK.md"),cy(oe(),"AFK.md")];for(let e of t)if(LC(e))try{let n=FC(e,"utf-8").trim();if(n.length>0)return ir={value:{content:n,path:e}},ir.value}catch{}return ir={value:null},ir.value}var ir,uy=y(()=>{"use strict";K()});function vo(){return zd().config.telegram??{}}function Jd(t){let e=Vh(),{config:n,sourcePath:r,modelsPartial:o}=zd(),s={...sr,...e,...n,...t},i;if(e.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=dy();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??sr.model,maxTokens:s.maxTokens??sr.maxTokens,temperature:s.temperature??sr.temperature,updatePolicy:s.updatePolicy??sr.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??Nd,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:s.autoResumeOnUsageLimit}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.enablePluginHooks!==void 0?{enablePluginHooks:s.enablePluginHooks}:{},...s.enforceDoneEvidence!==void 0?{enforceDoneEvidence:s.enforceDoneEvidence}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{},...s.theme!==void 0?{theme:s.theme}:{}},l=t?.models??yd(o);if(ki(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var Gi=y(()=>{"use strict";ze();qe();ke();$d();Bd();ly();uy();$d();Bd()});function NC(t,e){return e!==void 0&&Number.isFinite(e)&&e!==0?e:t.find(r=>r>0)??t[0]}function $C(t,e={}){let n=[...t],r=e.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(e.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=NC(n,e.primaryChatId);return o!==void 0?[o]:[]}function py(t,e={}){if(typeof t=="number")return!Number.isFinite(t)||t===0?{ok:!1,reason:"invalid",message:`Invalid chat id: ${t}`}:{ok:!0,id:t};let n=t.trim();if(n.length===0)return{ok:!1,reason:"invalid",message:"Invalid chat: empty string"};let r=fy(n);if(r!==void 0)return{ok:!0,id:r};let o=Object.keys(e),s=Object.prototype.hasOwnProperty.call(e,n)?e[n]:void 0;if(s!==void 0&&Number.isFinite(s)&&s!==0)return{ok:!0,id:s};let i=o.length>0?`Available aliases: ${o.join(", ")}.`:"No chat aliases are configured (set telegram.chatAliases in afk.config.json).";return{ok:!1,reason:"unknown-alias",message:`Unknown chat alias "${n}". ${i}`}}function fy(t){if(!t)return;let e=t.trim();if(!/^-?\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)&&n!==0?n:void 0}function UC(t){if(!t)return;let e=t.trim().toLowerCase();return e==="primary"||e==="broadcast"||e==="custom"?e:void 0}function BC(){let t=vo().notify??{},e=t.mode??UC(_.AFK_TELEGRAM_NOTIFY_MODE),n=t.primaryChatId??fy(_.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...e!==void 0?{mode:e}:{},...n!==void 0?{primaryChatId:n}:{},...t.targets!==void 0?{targets:t.targets}:{}}}function qi(){let t=bn(_.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return $C(t,BC())}function my(){return vo().chatAliases??{}}var Vd=y(()=>{"use strict";go();Gi();H()});var hy={};Hc(hy,{push:()=>ar,pushIfConfigured:()=>ko,pushMarkdown:()=>gy});async function ar(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??HC}/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 l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function gy(t){let e=un(t.text),n=Ge(e),r={ok:!0,status:200};for(let o of n)if(r=await ar({...t,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?ar({...t}):r;return r}async function ko(t,e={}){let n=_.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=e.target===void 0?[]:(typeof e.target=="number"?[e.target]:[...e.target]).filter(a=>Number.isFinite(a)&&a!==0),o=r.length>0?r:qi();if(o.length===0)return null;let s=Ge(t),i=[];for(let a of o)for(let l=0;l<s.length;l++){let c={token:n,chatId:a,text:s[l]??"",...e.replyMarkup!==void 0&&l===0?{replyMarkup:e.replyMarkup}:{},...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}};i.push(e.markdown?await gy(c):await ar({...c,...e.parseMode!==void 0?{parseMode:e.parseMode}:{}}))}return i}var HC,_o=y(()=>{"use strict";Vd();Ne();H();HC="https://api.telegram.org"});function jC(t){return t.length<=yy?t:`${t.slice(0,yy)}\u2026(truncated)`}function WC(t){try{let n=[`\u{1F514} AFK needs you \u2014 stuck on: ${t.title??t.serverName}`,jC(t.message)];t.url!==void 0&&t.url!==""&&n.push(t.url),ko(n.join(`
164
164
  `)).catch(()=>{})}catch{}}function by(t,e){if(!(t===void 0||t===""))try{Fd(t,e).catch(()=>{})}catch{}}var lr,yy,Yd,He,wn=y(()=>{"use strict";_o();yn();lr={action:"decline"},yy=300;Yd=class{handler=null;queue=Promise.resolve();queueDepth=0;install(e){this.handler=e}uninstall(){this.handler=null}hasHandler(){return this.handler!==null}pendingCount(){return this.queueDepth}route(e,n){if(n.signal.aborted)return Promise.resolve(lr);this.queueDepth+=1;let r,o=new Promise(i=>{r=i}),s=this.handler;return this.queue=this.queue.then(async()=>{try{if(n.signal.aborted){r(lr);return}if(!s){WC(e),r(lr);return}let i,a=new Promise(l=>{i=()=>l(lr),n.signal.addEventListener("abort",i,{once:!0})});try{try{n.onActive?.()}catch{}by(n.sessionId,!0);let l=await Promise.race([s(e,n).catch(()=>lr),a]);r(l)}finally{by(n.sessionId,!1),n.signal.removeEventListener("abort",i)}}finally{this.queueDepth-=1,r(lr)}}).catch(()=>{}),o}},He=new Yd});function wy(t){return["The user has switched off plan mode. Writes are now permitted. Do two things, in order:","",`1. Save the plan. Write the plan you developed in this conversation to a new markdown file under \`${t}/\` \u2014 pick a short, descriptive kebab-case filename (e.g. \`${t}/refactor-auth-flow.md\`). Capture the full plan: the chosen approach, the concrete step-by-step changes, the risks named, and the alternatives considered. This is the durable record.`,"","2. Implement the plan. Work through the steps you just recorded, verifying as you go \u2014 run the project's lint/test gates where they apply. End in a terminal state: Done with evidence, Blocked with the exact unblock condition, or Asking one precise question."].join(`
165
165
  `)}var Sy=y(()=>{"use strict"});function GC(t){switch(t){case"bypassPermissions":return"Approve \u2014 implement now (restore bypass mode: no prompts, read/write any path)";case"acceptEdits":return"Approve \u2014 implement now (restore accept-edits mode: edits auto-approved)";case"dontAsk":case"auto":return"Approve \u2014 implement now (restore your previous mode: no approval prompts)";default:return"Approve \u2014 implement now (restore default mode: writes ask for confirmation, contained to the workspace)"}}function Ji(t){return async(e,n,r)=>{let o=t.getPrePlanMode()??"default",s=GC(o),a={serverName:"agent",origin:"agent",type:"choice",message:"Plan ready. How do you want to proceed? (Your plan is in the conversation above.)",choices:o==="bypassPermissions"?[s,Xd]:[s,KC,Xd]},l=await He.route(a,{signal:n,...r?.sessionId!==void 0?{sessionId:r.sessionId}:{}});if(l.action!=="accept")return{content:"Plan exit not confirmed (the user did not approve). Stay in plan mode \u2014 keep refining the plan; do not implement. Call exit_plan_mode again when ready."};let c=typeof l.content?.value=="string"?l.content.value:"";if(c.startsWith("Keep")||c===Xd)return{content:"User chose to keep planning. Stay in plan mode and refine the plan; do not implement. Call exit_plan_mode again when ready."};let d=c.includes("bypass")?"bypassPermissions":o,u=Gm(r?.resolveBase??r?.cwd??process.cwd());return t.requestImplementSeed(wy(u),d),{content:`Plan approved (mode=${d}). The implementation instruction will follow as a new message \u2014 end your turn now.`}}}var Je,KC,Xd,zi,Sn=y(()=>{"use strict";wn();Sy();K();Je="exit_plan_mode",KC="Approve \u2014 implement now (bypass mode: no prompts, read/write any path)",Xd="Keep planning";zi={name:Je,category:"other",concurrencySafe:!1,description:`Signal that your plan is ready and present it to the user for approval. The user is shown a picker: approve and implement (you pick neither mode \u2014 the user does), or keep planning.
166
166
 
@@ -861,7 +861,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
861
861
 
862
862
  `).trim()}function E0(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function fw(t,e){let{JSDOM:n,Readability:r,turndown:o}=await _0(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=pw(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=pw(o.turndown(d));return{title:a,markdown:u,textLength:E0(c),usedFallback:!0}}var $u,mw=y(()=>{"use strict";$u=null});function T0(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function gw(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function x0(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function hw(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??T0,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!A0.has(u.status)||d===o)return u;let p=x0(u,i)??gw(d,s,i);N("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=gw(d,s,i);N("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var A0,yw=y(()=>{"use strict";me();A0=new Set([429,502,503,504])});import{BlockList as R0,isIP as Bu}from"node:net";import{lookup as I0}from"node:dns/promises";import{Agent as C0}from"undici";function ww(){let t=_.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function D0(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function Uu(t){let e=Bu(t);return e===0?!1:O0.check(t,e===4?"ipv4":"ipv6")}async function Sw(t){return I0(t,{all:!0,verbatim:!0})}async function Hu(t,e={}){if(e.allowPrivateHosts??ww())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=D0(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(Bu(r)!==0)return Uu(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??Sw,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(Uu(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Oo(t,e={}){let n=await Hu(t,e);if(!n.allowed)throw new ot(n.reason)}async function Ea(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=bw;i++){await Oo(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??ww())?{dispatcher:F0}:{}},l=await hw(t,s,a,r.retry??{});if(!L0.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let d;try{d=new URL(c,l.url||s).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),s=d}throw new ot(`too many redirects (>${bw}) starting from ${e}`)}var P0,M0,O0,ot,F0,bw,L0,ju=y(()=>{"use strict";H();yw();P0=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],M0=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],O0=(()=>{let t=new R0;for(let[e,n]of P0)t.addSubnet(e,n,"ipv4");for(let[e,n]of M0)t.addSubnet(e,n,"ipv6");return t})(),ot=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};F0=new C0({connect:{lookup(t,e,n){Sw(t).then(r=>{let o=r.find(i=>Uu(i.address));if(o!==void 0){n(new ot(`refusing to connect to ${t} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,Bu(s.address))},r=>n(r,"",0))}}});bw=20,L0=new Set([301,302,303,307,308])});import{readFileSync as N0}from"node:fs";import{join as $0}from"path";function U0(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function vw(t,e){return U0(e).test(t)}function j0(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(B0.has(e))return!0;if(H0.has(e))return!1}return!1}function kw(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function W0(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function _w(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Jc(e),e}function K0(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function G0(t){try{return N0(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function q0(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=_w(e.defaultProfile)),n}function Ew(t){let e=t?.env??_,n=t?.readFileSync??G0,r=t?.surface??e.AGENT_SURFACE,o=j0(e.AFK_BROWSER_HEADLESS,r),s=kw(e.AFK_BROWSER_ALLOWED_DOMAINS),i=kw(e.AFK_BROWSER_BLOCKED_DOMAINS),a=K0(e.AFK_BROWSER_DOM_SNAPSHOTS),l=W0(e.AFK_BROWSER_BACKEND),c=_w(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():$0(Et(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(h){throw new Error(`Failed to parse browser config at ${p}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=q0(d,m);return g.configPath=p,g}function Aa(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if(vw(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>vw(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var B0,H0,Ta=y(()=>{"use strict";H();K();B0=new Set(["daemon","subagent","telegram","afk"]),H0=new Set(["repl","interactive","cli"])});import{existsSync as z0,readFileSync as J0}from"node:fs";import{createRequire as V0}from"node:module";import{dirname as Y0,join as X0}from"node:path";function xw(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<Z0&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Pe(t){let e=xw(t);return Tw.some(n=>e.includes(n))}function eD(){try{let e=V0(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(J0(e,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let s=X0(Y0(e),o);return z0(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function Do(){return Aw??=eD()??Q0,Aw}function Wu(t){return t.includes("install chromium")}function Xe(t,e){let n=xw(t),r=e?.latched===!0?` ${tD}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${Do()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Do()}). Or pick a different tool.${r}`}function Ku(t,e,n=!1){if(!Pe(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
863
863
 
864
- ${Xe(t,{headless:e,latched:n})}`,{cause:t})}var Tw,Q0,Z0,Aw,tD,Gu=y(()=>{"use strict";Tw=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Q0="pnpm exec playwright install chromium",Z0=4;tD="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Fn from"node:fs";import xa from"node:path";import{randomBytes as nD}from"node:crypto";import{chromium as rD}from"playwright";function oD(){try{return"5.83.3"}catch{}try{let t=xa.resolve(import.meta.dirname,"../../../package.json"),e=Fn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var sD,Ra,Rw=y(()=>{"use strict";Gu();K();me();sD=oD(),Ra=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=rD.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Ku(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){s=l,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let c=await a.content();if(s!==void 0)throw s;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${sD}`}}loadStorageState(e){let n=Vc(e);try{if(!Fn.existsSync(n))return;let r=JSON.parse(Fn.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Vc(e);if(!Fn.existsSync(r))return;let o=await n.storageState(),s=xa.join(xa.dirname(r),`.${xa.basename(r)}.${process.pid}.${nD(4).toString("hex")}.tmp`);Fn.writeFileSync(s,JSON.stringify(o),{mode:384}),Fn.chmodSync(s,384),Fn.renameSync(s,r),N("[browser/vault] saved session",{profile:e,file:r})}catch(r){N("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as iD}from"crypto";function Iw(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&aD.test(t.label))}function Cw(t){return iD("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Pw(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var aD,Ia=y(()=>{"use strict";aD=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as lD}from"node:crypto";function cD(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function dD(t,e,n){return`el_${lD("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function uD(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Mw(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Dw(t,e){let n=t.role??"",r=t.name??"";Ow.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Dw(s,e)}async function pD(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Fw).catch(()=>[])}async function fD(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Fw).catch(()=>[])}function mD(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ca(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=mD(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=pD(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],Dw(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await fD(t)).filter($=>Ow.has($.role??"")));let k=new Map;for(let P of p){let $=Mw(P.name),G=k.get($);(!G||G.bbox.w===0&&P.bbox.w>0)&&k.set($,P)}let E=h.map(P=>({ax:P,dom:k.get(Mw(P.name??""))})),v=r?E:E.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,$)=>{let G=P.dom?.bbox.y??0,F=$.dom?.bbox.y??0;if(G!==F)return G-F;let B=P.dom?.bbox.x??0,M=$.dom?.bbox.x??0;return B-M}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=v.slice(0,n).map((P,$)=>{let G=P.ax.role??"generic",F=P.ax.name??"",B=dD(G,F,$),M=P.dom?.bbox??{x:0,y:0,w:0,h:0},I=P.dom?.type??null,O=null;P.ax.value!==void 0&&P.ax.value!==null&&(O=String(P.ax.value)),P.ax.checked!==void 0&&(O=String(P.ax.checked)),Iw({role:G,kind:I})&&(O="[redacted]");let U={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(U.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(U.selected=P.ax.selected),P.ax.expanded!==void 0&&(U.expanded=P.ax.expanded);let q;P.dom?.testId?q=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(q=`#${P.dom.id}`);let Z={id:B,role:G,label:cD(F),kind:I,value:O,state:U,bbox:M};return q!==void 0&&(Z.selector=q),Z}),x="idle";try{let P=await t.evaluate(()=>document.readyState);P==="loading"?x="loading":P==="interactive"?x="navigating":x="idle"}catch{x="navigating"}x!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=uD(f),R=`obs_${e.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:R,url:m,title:g,textSummary:S,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:x,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:C}}var Ow,Fw,Lw=y(()=>{"use strict";Ia();Ow=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Fw="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Nw(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function qu(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Nw(t,s)))).filter(o=>o!==null)}async function gD(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function zu(t,e,n){switch(e.kind){case"element_id":return hD(t,e,n);case"selector":return yD(t,e);case"semantic":return bD(t,e)}}async function hD(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await qu(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function yD(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await qu(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function bD(t,e){return e.role!==void 0?wD(t,e.text,e.role):SD(t,e.text,e)}async function wD(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await qu(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function SD(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await gD(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await Nw(h.locator,h.index);if(w!==null){let k=`${w.role}:${w.label}:${g}`,E=0;for(let v=0;v<k.length;v++)E=E*31+k.charCodeAt(v)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var $w=y(()=>{"use strict"});async function Ju(t,e,n,r){let o=t.url();if(o===n)return null;let s=Aa(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var Uw=y(()=>{"use strict";Ta()});import{randomBytes as vD}from"crypto";import{mkdir as kD,stat as _D,writeFile as ED}from"fs/promises";import{join as Vu}from"path";import{gzip as AD}from"zlib";import{promisify as TD}from"util";function xD(t){return Vu(Ys(t),"browser")}function RD(t){return Vu(xD(t),"screenshots")}function ID(){return new Date().toISOString().replace(/[:.]/g,"-")}function CD(){return vD(3).toString("hex")}async function Yu(t,e,n){if(e.length>Bw)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Bw} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=RD(t);await kD(r,{recursive:!0});let o=`${ID()}-${CD()}-${n}.png`,s=Vu(r,o);await ED(s,e);let{size:i}=await _D(s);return{path:s,bytes:i}}var M5,Bw,Hw=y(()=>{"use strict";K();Ia();M5=TD(AD);Bw=5*1024*1024});var Ww={};Hc(Ww,{PlaywrightProvider:()=>Xu});function jw(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Xu,Kw=y(()=>{"use strict";Rw();Lw();$w();Ta();Uw();Hw();Xu=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Ra(e)}async open(e){let n=Aa(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await Ju(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Ca(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Ca(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await zu(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${jw(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await Ju(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ca(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await zu(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${jw(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Yu(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Yu(n,o,r);return s}catch{return null}}}});var Nn={};Hc(Nn,{__resetBrowserRegistryForTests:()=>FD,browserProviderActive:()=>OD,closeBrowserProvider:()=>Qu,getBrowserProvider:()=>MD,peekBrowserProvider:()=>DD});function Gw(){Promise.resolve(Qu()).then(()=>{process.exit(130)})}function qw(){Promise.resolve(Qu()).then(()=>{process.exit(143)})}function zw(){bt=null}function PD(){Pa||(process.on("SIGINT",Gw),process.on("SIGTERM",qw),process.on("exit",zw),Pa=!0)}function Jw(){Pa&&(process.removeListener("SIGINT",Gw),process.removeListener("SIGTERM",qw),process.removeListener("exit",zw),Pa=!1)}async function MD(t){return bt!==null?bt:(Ln!==null||(Ln=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(Kw(),Ww)),n=Ew(t),r=new e(n);return PD(),bt=r,Ln=null,r})()),Ln)}async function Qu(){if(bt===null)return;let t=bt;bt=null,Ln=null,Jw(),await t.shutdown()}function OD(){return bt!==null}function DD(){return bt}function FD(){bt=null,Ln=null,Jw()}var bt,Ln,Pa,$n=y(()=>{"use strict";Ta();bt=null,Ln=null,Pa=!1});async function Vw(t,e){try{return await fw(t,e)}catch(n){return N("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function HD(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>($n(),Nn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function Yw(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??HD,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i=t,a=null,l=null;try{let d=await Ea(n,t,{headers:BD,signal:e.signal},o);a=d.status,i=d.url||t;let u=d.headers.get("content-type")??"";if(d.ok){if(UD.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if($D.test(u)&&!ND.test(u))return{title:"",markdown:p.trim(),finalUrl:i,usedRender:!1};if(s=await Vw(p,i),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(d){if(e.signal.aborted||d instanceof ot||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(s===null||s.textLength<200)&&s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};try{await Oo(t,o);let d=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:p=>Oo(p,o)});d.finalUrl!==t&&/^https?:\/\//i.test(d.finalUrl)&&await Oo(d.finalUrl,o);let u=await Vw(d.html,d.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||u.textLength>=s.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(e.signal.aborted||d instanceof ot)throw d;if(s===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${t}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${a??"error"}).`)}var ND,$D,UD,BD,Xw=y(()=>{"use strict";mw();ju();me();ND=/(text\/html|application\/xhtml\+xml)/i,$D=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,UD=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,BD={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function KD(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(jD,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),WD),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=fr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function Qw(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?KD({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function Zw(t,e){if(e.length===0)return`# Search results for "${t}"
864
+ ${Xe(t,{headless:e,latched:n})}`,{cause:t})}var Tw,Q0,Z0,Aw,tD,Gu=y(()=>{"use strict";Tw=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Q0="pnpm exec playwright install chromium",Z0=4;tD="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Fn from"node:fs";import xa from"node:path";import{randomBytes as nD}from"node:crypto";import{chromium as rD}from"playwright";function oD(){try{return"5.83.4"}catch{}try{let t=xa.resolve(import.meta.dirname,"../../../package.json"),e=Fn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var sD,Ra,Rw=y(()=>{"use strict";Gu();K();me();sD=oD(),Ra=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=rD.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Ku(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){s=l,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let c=await a.content();if(s!==void 0)throw s;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${sD}`}}loadStorageState(e){let n=Vc(e);try{if(!Fn.existsSync(n))return;let r=JSON.parse(Fn.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Vc(e);if(!Fn.existsSync(r))return;let o=await n.storageState(),s=xa.join(xa.dirname(r),`.${xa.basename(r)}.${process.pid}.${nD(4).toString("hex")}.tmp`);Fn.writeFileSync(s,JSON.stringify(o),{mode:384}),Fn.chmodSync(s,384),Fn.renameSync(s,r),N("[browser/vault] saved session",{profile:e,file:r})}catch(r){N("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as iD}from"crypto";function Iw(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&aD.test(t.label))}function Cw(t){return iD("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Pw(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var aD,Ia=y(()=>{"use strict";aD=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as lD}from"node:crypto";function cD(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function dD(t,e,n){return`el_${lD("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function uD(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Mw(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Dw(t,e){let n=t.role??"",r=t.name??"";Ow.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Dw(s,e)}async function pD(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Fw).catch(()=>[])}async function fD(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Fw).catch(()=>[])}function mD(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ca(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=mD(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=pD(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],Dw(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await fD(t)).filter($=>Ow.has($.role??"")));let k=new Map;for(let P of p){let $=Mw(P.name),G=k.get($);(!G||G.bbox.w===0&&P.bbox.w>0)&&k.set($,P)}let E=h.map(P=>({ax:P,dom:k.get(Mw(P.name??""))})),v=r?E:E.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,$)=>{let G=P.dom?.bbox.y??0,F=$.dom?.bbox.y??0;if(G!==F)return G-F;let B=P.dom?.bbox.x??0,M=$.dom?.bbox.x??0;return B-M}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=v.slice(0,n).map((P,$)=>{let G=P.ax.role??"generic",F=P.ax.name??"",B=dD(G,F,$),M=P.dom?.bbox??{x:0,y:0,w:0,h:0},I=P.dom?.type??null,O=null;P.ax.value!==void 0&&P.ax.value!==null&&(O=String(P.ax.value)),P.ax.checked!==void 0&&(O=String(P.ax.checked)),Iw({role:G,kind:I})&&(O="[redacted]");let U={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(U.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(U.selected=P.ax.selected),P.ax.expanded!==void 0&&(U.expanded=P.ax.expanded);let q;P.dom?.testId?q=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(q=`#${P.dom.id}`);let Z={id:B,role:G,label:cD(F),kind:I,value:O,state:U,bbox:M};return q!==void 0&&(Z.selector=q),Z}),x="idle";try{let P=await t.evaluate(()=>document.readyState);P==="loading"?x="loading":P==="interactive"?x="navigating":x="idle"}catch{x="navigating"}x!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=uD(f),R=`obs_${e.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:R,url:m,title:g,textSummary:S,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:x,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:C}}var Ow,Fw,Lw=y(()=>{"use strict";Ia();Ow=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Fw="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Nw(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function qu(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Nw(t,s)))).filter(o=>o!==null)}async function gD(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function zu(t,e,n){switch(e.kind){case"element_id":return hD(t,e,n);case"selector":return yD(t,e);case"semantic":return bD(t,e)}}async function hD(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await qu(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function yD(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await qu(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function bD(t,e){return e.role!==void 0?wD(t,e.text,e.role):SD(t,e.text,e)}async function wD(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await qu(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function SD(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await gD(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await Nw(h.locator,h.index);if(w!==null){let k=`${w.role}:${w.label}:${g}`,E=0;for(let v=0;v<k.length;v++)E=E*31+k.charCodeAt(v)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var $w=y(()=>{"use strict"});async function Ju(t,e,n,r){let o=t.url();if(o===n)return null;let s=Aa(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var Uw=y(()=>{"use strict";Ta()});import{randomBytes as vD}from"crypto";import{mkdir as kD,stat as _D,writeFile as ED}from"fs/promises";import{join as Vu}from"path";import{gzip as AD}from"zlib";import{promisify as TD}from"util";function xD(t){return Vu(Ys(t),"browser")}function RD(t){return Vu(xD(t),"screenshots")}function ID(){return new Date().toISOString().replace(/[:.]/g,"-")}function CD(){return vD(3).toString("hex")}async function Yu(t,e,n){if(e.length>Bw)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Bw} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=RD(t);await kD(r,{recursive:!0});let o=`${ID()}-${CD()}-${n}.png`,s=Vu(r,o);await ED(s,e);let{size:i}=await _D(s);return{path:s,bytes:i}}var M5,Bw,Hw=y(()=>{"use strict";K();Ia();M5=TD(AD);Bw=5*1024*1024});var Ww={};Hc(Ww,{PlaywrightProvider:()=>Xu});function jw(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Xu,Kw=y(()=>{"use strict";Rw();Lw();$w();Ta();Uw();Hw();Xu=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Ra(e)}async open(e){let n=Aa(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await Ju(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Ca(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Ca(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await zu(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${jw(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await Ju(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ca(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await zu(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${jw(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Yu(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Yu(n,o,r);return s}catch{return null}}}});var Nn={};Hc(Nn,{__resetBrowserRegistryForTests:()=>FD,browserProviderActive:()=>OD,closeBrowserProvider:()=>Qu,getBrowserProvider:()=>MD,peekBrowserProvider:()=>DD});function Gw(){Promise.resolve(Qu()).then(()=>{process.exit(130)})}function qw(){Promise.resolve(Qu()).then(()=>{process.exit(143)})}function zw(){bt=null}function PD(){Pa||(process.on("SIGINT",Gw),process.on("SIGTERM",qw),process.on("exit",zw),Pa=!0)}function Jw(){Pa&&(process.removeListener("SIGINT",Gw),process.removeListener("SIGTERM",qw),process.removeListener("exit",zw),Pa=!1)}async function MD(t){return bt!==null?bt:(Ln!==null||(Ln=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(Kw(),Ww)),n=Ew(t),r=new e(n);return PD(),bt=r,Ln=null,r})()),Ln)}async function Qu(){if(bt===null)return;let t=bt;bt=null,Ln=null,Jw(),await t.shutdown()}function OD(){return bt!==null}function DD(){return bt}function FD(){bt=null,Ln=null,Jw()}var bt,Ln,Pa,$n=y(()=>{"use strict";Ta();bt=null,Ln=null,Pa=!1});async function Vw(t,e){try{return await fw(t,e)}catch(n){return N("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function HD(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>($n(),Nn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function Yw(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??HD,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i=t,a=null,l=null;try{let d=await Ea(n,t,{headers:BD,signal:e.signal},o);a=d.status,i=d.url||t;let u=d.headers.get("content-type")??"";if(d.ok){if(UD.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if($D.test(u)&&!ND.test(u))return{title:"",markdown:p.trim(),finalUrl:i,usedRender:!1};if(s=await Vw(p,i),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(d){if(e.signal.aborted||d instanceof ot||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(s===null||s.textLength<200)&&s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};try{await Oo(t,o);let d=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:p=>Oo(p,o)});d.finalUrl!==t&&/^https?:\/\//i.test(d.finalUrl)&&await Oo(d.finalUrl,o);let u=await Vw(d.html,d.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||u.textLength>=s.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(e.signal.aborted||d instanceof ot)throw d;if(s===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${t}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${a??"error"}).`)}var ND,$D,UD,BD,Xw=y(()=>{"use strict";mw();ju();me();ND=/(text\/html|application\/xhtml\+xml)/i,$D=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,UD=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,BD={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function KD(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(jD,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),WD),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=fr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function Qw(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?KD({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function Zw(t,e){if(e.length===0)return`# Search results for "${t}"
865
865
 
866
866
  (no results)`;let n=[`# Search results for "${t}"`,""];return e.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
867
867
  `).trimEnd()}var jD,WD,eS=y(()=>{"use strict";vn();jD="https://api.exa.ai/search",WD=10});function Ma(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var Un=y(()=>{"use strict";Gu()});function YD(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 l;try{l=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=GD;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,qD)}let a=zD;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,JD)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Zu(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:Ct(t,e),truncated:!0}}function XD(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{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 i=YD(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(s.reason)},c,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await Hu(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let g={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Ea(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof ot?{content:`web_scrape blocked: ${g.message}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let m=Zu(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await Yw(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=Zu(p.markdown,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof ot)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=Pe(p)&&!Wu(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Do()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=Qw({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:VD,timeoutMs:i.timeoutMs,signal:a.signal}),f=Zu(Zw(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),s.removeEventListener("abort",l)}}}var GD,qD,zD,JD,VD,tS,nS=y(()=>{"use strict";Xw();eS();ju();Rn();Un();GD=3e4,qD=12e4,zD=1e5,JD=1e6,VD=10;tS=XD()});import{existsSync as oS,mkdirSync as QD,readFileSync as ZD,renameSync as eF,unlinkSync as tF,writeFileSync as nF}from"node:fs";import{dirname as rS,join as rF}from"node:path";import{randomBytes as oF}from"node:crypto";function wr(t){let e=t??Gc();if(!oS(e))return[];try{let n=ZD(e,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${e}: ${r}`),[]}}function Oa(t,e){let n=e??Gc();QD(rS(n),{recursive:!0});let r=rF(rS(n),`.schedules.json.${process.pid}.${oF(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{nF(r,o,"utf-8"),eF(r,n)}catch(s){try{oS(r)&&tF(r)}catch{}throw s}}function sS(t,e){let n=wr(e),r=n.map(l=>l.id),o=sF(t.name),s=iF(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),Oa(n,e),a}function iS(t,e){let n=wr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(Oa(o,e),!0)}function aS(t,e){return wr(e).find(n=>n.id===t)}function sF(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function iF(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}var lS=y(()=>{"use strict";K()});import{existsSync as aF,readFileSync as lF}from"node:fs";import{join as cF}from"node:path";async function Fo(t,e,n){let r;try{let o=cF(Ym("default"),"port");if(!aF(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=lF(o,"utf-8").trim();if(r=parseInt(s,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:t==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var ep,cS=y(()=>{"use strict";K();ep="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as dF}from"node:fs";import{readFile as uF}from"node:fs/promises";var dS,uS,pS,fS,mS=y(()=>{"use strict";lS();K();cS();dS=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let s=sS({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),i=s.enabled?await Fo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await Fo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:ep}})}},uS=async(t,e)=>{let n=wr();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},pS=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,s=Ws();if(!dF(s))return{content:JSON.stringify([])};let i;try{let c=await uF(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.83.3",
3
+ "version": "5.83.4",
4
4
  "description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
5
5
  "main": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",