agent-afk 5.19.0 → 5.19.1

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
@@ -1057,7 +1057,7 @@ Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2
1057
1057
  `)}}catch(i){if(i instanceof Error){let a=i;return a.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${i.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}}});function fs(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 Tf(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 ms=y(()=>{"use strict"});var ic=y(()=>{"use strict";H();K()});var xf=y(()=>{"use strict";H();ic()});import{execFile as zA}from"node:child_process";import{promisify as VA}from"node:util";function Pf(t,e){if(t.length>Rf)throw new Error(`Invalid branch prefix from ${e}: length ${t.length} exceeds ${Rf}.`);if(!JA.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 If(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 MB,JA,Rf,Cf=y(()=>{"use strict";H();ic();xf();MB=VA(zA),JA=/^[A-Za-z0-9_\-./]*$/,Rf=64});import{existsSync as gs,readdirSync as FB,readFileSync as YA,realpathSync as LB,statSync as NB}from"fs";import{homedir as XA}from"os";import{join as Et}from"path";function cc(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e={};for(let n of Mf){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 QA(){return[gt(),co()]}function or(t=QA()){for(let e of t)if(gs(e))try{let n=JSON.parse(YA(e,"utf-8")),r=cc(n.importFrom);if(r!==void 0)return r}catch{}}function sr(t,e=XA()){let n={pluginRoots:[],skillRoots:[],mcpConfigs:[]};if(!t)return n;for(let r of Mf){let o=t[r];if(!o)continue;let s=ac[r];if(o.plugins)for(let i of s.pluginRoots(e))gs(i)&&n.pluginRoots.push(i);if(o.skills){let i=`imported:${r}`;for(let a of s.skillRoots(e))gs(a)&&n.skillRoots.push({dir:a,origin:i})}if(o.mcp){let i=ZA(s.mcpConfigCandidates(e));i&&n.mcpConfigs.push({source:i,format:s.mcpFormat})}}return n}function ZA(t){for(let e of t)if(gs(e))return e;return null}var Mf,ac,jB,hs=y(()=>{"use strict";K();Mf=["claude-code","codex"],ac={"claude-code":{label:"Claude Code",pluginRoots:t=>[Et(t,".claude","plugins")],skillRoots:t=>[Et(t,".claude","skills")],mcpConfigCandidates:t=>[Et(t,".claude","mcp.json"),Et(t,".claude",".mcp.json"),Et(t,".claude","claude-code","mcp.json")],mcpFormat:"json"},codex:{label:"Codex",pluginRoots:t=>[Et(t,".codex","plugins")],skillRoots:t=>[Et(t,".codex","skills")],mcpConfigCandidates:t=>[Et(t,".codex","config.toml")],mcpFormat:"toml"}},jB={"claude-code":ac["claude-code"].label,codex:ac.codex.label}});import{readFileSync as Ff,existsSync as dc}from"fs";import{join as ar}from"path";import{config as eT}from"dotenv";function uc(){return Da()}function nT(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 Df.has(e)||(Df.add(e),console.warn(`[afk] AFK_OPENAI_BASE_URL: stripped trailing "/chat/completions" \u2014 the OpenAI SDK appends it automatically.
1058
1058
  Effective base URL: ${r}`)),r}return e}function rT(){if(lc!==void 0)return lc;if(!Of){let o=[ar(process.cwd(),".env"),Mt(),tu()];for(let s of o)dc(s)&&eT({path:s,override:!1});Of=!0}let t={},e=k.AFK_MODEL??k.CLAUDE_MODEL;if(e){let o=e.toLowerCase();t.model=_a(o)?o:e}if(J(e)==="anthropic-direct"){let o=uc();o!==void 0&&(t.apiKey=o)}let r=k.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(t.baseUrl=r,t.apiKey=k.AFK_LOCAL_API_KEY||"local"),k.AFK_MAX_TOKENS&&(t.maxTokens=parseInt(k.AFK_MAX_TOKENS,10)),k.AFK_TEMPERATURE&&(t.temperature=parseFloat(k.AFK_TEMPERATURE)),k.AFK_SYSTEM_PROMPT&&(t.systemPrompt=k.AFK_SYSTEM_PROMPT),k.AFK_AUTO_ROUTING){let o=k.AFK_AUTO_ROUTING.toLowerCase()==="true";t.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return k.AFK_OPENAI_BASE_URL&&(t.openaiBaseUrl=nT(k.AFK_OPENAI_BASE_URL)),lc=t,t}function Lf(){if(kn!==void 0)return kn;let t=[ar(process.cwd(),"afk.config.json"),gt(),co()];for(let e of t)if(dc(e))try{let n=Ff(e,"utf-8"),r=JSON.parse(n),o={},s=Ku(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=_a(i)?i:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),typeof r.permissionMode=="string"){let i=r.permissionMode;(i==="default"||i==="plan"||i==="autonomous"||i==="bypassPermissions")&&(o.permissionMode=i)}if(r.autoRouting&&typeof r.autoRouting=="object"){let i={};typeof r.autoRouting.interactive=="boolean"&&(i.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(i.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(i.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(i.daemon=r.autoRouting.daemon),o.autoRouting=i}if(r.daemon&&typeof r.daemon=="object"){let i={};typeof r.daemon.task=="string"&&(i.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(i.taskId=r.daemon.taskId);let a=r.daemon.worktreePrune;a&&typeof a=="object"&&(i.worktreePrune={enabled:typeof a.enabled=="boolean"?a.enabled:!0,cron:typeof a.cron=="string"?a.cron:"0 4 * * *",maxAgeDaysClean:typeof a.maxAgeDaysClean=="number"?a.maxAgeDaysClean:14,maxAgeDaysDirty:typeof a.maxAgeDaysDirty=="number"?a.maxAgeDaysDirty:30,scope:typeof a.scope=="string"?a.scope:"all"}),o.daemon=i}if(r.telegram&&typeof r.telegram=="object"){let i={},a=r.telegram.notify;if(a&&typeof a=="object"){let c={};if((a.mode==="primary"||a.mode==="broadcast"||a.mode==="custom")&&(c.mode=a.mode),typeof a.primaryChatId=="number"&&Number.isFinite(a.primaryChatId)&&(c.primaryChatId=a.primaryChatId),Array.isArray(a.targets)){let l=a.targets.filter(d=>typeof d=="number"&&Number.isFinite(d));l.length>0&&(c.targets=l)}i.notify=c}typeof r.telegram.verifyDone=="boolean"&&(i.verifyDone=r.telegram.verifyDone),o.telegram=i}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.hooks!==null&&typeof r.hooks=="object"&&!Array.isArray(r.hooks)&&(o.hooks=r.hooks),typeof r.enableShellHooks=="boolean"&&(o.enableShellHooks=r.enableShellHooks),e!==ar(process.cwd(),"afk.config.json")){let i=cc(r.importFrom);i!==void 0&&(o.importFrom=i)}if(r.interactive&&typeof r.interactive=="object"){let i={};typeof r.interactive.worktreeAutoname=="boolean"&&(i.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(i.worktreeBranchPrefix=Pf(r.interactive.worktreeBranchPrefix,`${e}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(If(r.interactive.worktreeBase,`${e}#/interactive/worktreeBase`),i.worktreeBase=r.interactive.worktreeBase),typeof r.interactive.suggestGhost=="boolean"&&(i.suggestGhost=r.interactive.suggestGhost),Object.keys(i).length>0&&(o.interactive=i)}return kn={config:o,sourcePath:e,modelsPartial:s},kn}catch(n){console.error(`Warning: Failed to parse ${e}:`,n)}return kn={config:{},sourcePath:void 0,modelsPartial:{}},kn}function oT(){if(_n!==void 0)return _n.value;let t=[ar(process.cwd(),"AFK.md"),ar(me(),"AFK.md")];for(let e of t)if(dc(e))try{let n=Ff(e,"utf-8").trim();if(n.length>0)return _n={value:{content:n,path:e}},_n.value}catch{}return _n={value:null},_n.value}function Nf(){return Lf().config.telegram??{}}function pc(t){let e=rT(),{config:n,sourcePath:r,modelsPartial:o}=Lf(),s={...ir,...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 l=oT();l!==null&&(s.systemPrompt=l.content,i=`afk-md:${l.path}`)}let a={model:s.model??ir.model,maxTokens:s.maxTokens??ir.maxTokens,temperature:s.temperature??ir.temperature,updatePolicy:s.updatePolicy??ir.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??tT,...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.importFrom!==void 0?{importFrom:s.importFrom}:{}},c=t?.models??va(o);if(Oo(c),a.models=c,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 ir,tT,Of,lc,Df,kn,_n,ys=y(()=>{"use strict";He();et();Se();K();pn();Cf();H();hs();ir={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},tT="bypassPermissions",Of=!1;Df=new Set});function sT(t,e){return e!==void 0&&Number.isFinite(e)&&e!==0?e:t.find(r=>r>0)??t[0]}function iT(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=sT(n,e.primaryChatId);return o!==void 0?[o]:[]}function aT(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 cT(t){if(!t)return;let e=t.trim().toLowerCase();return e==="primary"||e==="broadcast"||e==="custom"?e:void 0}function lT(){let t=Nf().notify??{},e=t.mode??cT(k.AFK_TELEGRAM_NOTIFY_MODE),n=t.primaryChatId??aT(k.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...e!==void 0?{mode:e}:{},...n!==void 0?{primaryChatId:n}:{},...t.targets!==void 0?{targets:t.targets}:{}}}function bs(){let t=fs(k.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return iT(t,lT())}var fc=y(()=>{"use strict";ms();ys();H()});var Uf={};Qi(Uf,{push:()=>En,pushIfConfigured:()=>mc,pushMarkdown:()=>$f});async function En(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??dT}/bot${t.token}/sendMessage`,o={chat_id:t.chatId,text:t.text.slice(0,4096)};t.parseMode&&(o.parse_mode=t.parseMode),t.replyMarkup&&(o.reply_markup=t.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await e(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let c;try{c=(await a.json()).description}catch{c=`HTTP ${a.status}`}return{ok:!1,status:a.status,...c!==void 0?{errorMessage:c}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function $f(t){let e=Ot(t.text),n=Te(e),r={ok:!0,status:200};for(let o of n)if(r=await En({...t,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?En({...t}):r;return r}async function mc(t,e={}){let n=k.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=bs();if(r.length===0)return null;let o=Te(t),s=[];for(let i of r)for(let a=0;a<o.length;a++){let c={token:n,chatId:i,text:o[a]??"",...e.replyMarkup!==void 0&&a===0?{replyMarkup:e.replyMarkup}:{},...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}};s.push(e.markdown?await $f(c):await En({...c,...e.parseMode!==void 0?{parseMode:e.parseMode}:{}}))}return s}var dT,ws=y(()=>{"use strict";fc();Ue();H();dT="https://api.telegram.org"});function uT(t=En){return async(e,n)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let o=e.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Bf)return{content:`Invalid input: message exceeds Telegram's ${Bf}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=k.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=bs();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let c of i){let l=await t({token:s,chatId:c,text:o});l.ok||a.push(`chat ${c}: ${l.errorMessage??`HTTP ${l.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var Bf,jf,Hf=y(()=>{"use strict";H();ws();fc();Bf=4096;jf=uT()});import{JSDOM as pT}from"jsdom";import{Readability as fT}from"@mozilla/readability";import mT from"turndown";function Wf(t){return t.replace(/\n{3,}/g,`
1059
1059
 
1060
- `).trim()}function gT(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}function Gf(t,e){let r=new pT(t,{url:e}).window.document,o=(r.title??"").trim(),s=null;try{let l=r.cloneNode(!0);s=new fT(l).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let l=Wf(gc.turndown(s.content)),d=(s.title??"").trim()||o,u=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:l,textLength:u,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",c=Wf(gc.turndown(a));return{title:o,markdown:c,textLength:gT(i),usedFallback:!0}}var Kf,gc,qf=y(()=>{"use strict";Kf=200,gc=new mT({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});gc.remove(["script","style","noscript","iframe"])});function yT(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 zf(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function bT(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 vs(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??yT,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!hT.has(u.status)||d===o)return u;let p=bT(u,i)??zf(d,s,i);j("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=zf(d,s,i);j("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var hT,hc=y(()=>{"use strict";de();hT=new Set([429,502,503,504])});import{readFileSync as wT}from"node:fs";import{join as vT}from"path";function ST(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function Vf(t,e){return ST(e).test(t)}function ET(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(kT.has(e))return!0;if(_T.has(e))return!1}return!1}function Jf(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function AT(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 Yf(t){let e=t===void 0||t.trim()===""?"default":t.trim();return ra(e),e}function TT(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function xT(t){try{return wT(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function RT(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=Yf(e.defaultProfile)),n}function Xf(t){let e=t?.env??k,n=t?.readFileSync??xT,r=t?.surface??e.AGENT_SURFACE,o=ET(e.AFK_BROWSER_HEADLESS,r),s=Jf(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Jf(e.AFK_BROWSER_BLOCKED_DOMAINS),a=TT(e.AFK_BROWSER_DOM_SNAPSHOTS),c=AT(e.AFK_BROWSER_BACKEND),l=Yf(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():vT(Ze(),"browser.json"),f=n(p);if(f===void 0)return d;let h;try{h=JSON.parse(f)}catch(w){throw new Error(`Failed to parse browser config at ${p}: ${String(w)}`)}if(typeof h!="object"||h===null||Array.isArray(h))throw new Error(`Browser config at ${p} must be a JSON object`);let g=RT(d,h);return g.configPath=p,g}function yc(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(Vf(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>Vf(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var kT,_T,bc=y(()=>{"use strict";H();K();kT=new Set(["daemon","subagent","telegram","afk"]),_T=new Set(["repl","interactive","cli"])});import qt from"node:fs";import Ss from"node:path";import{randomBytes as PT}from"node:crypto";import{chromium as IT}from"playwright";function CT(){try{return"5.19.0"}catch{}try{let t=Ss.resolve(import.meta.dirname,"../../../package.json"),e=qt.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var MT,ks,Qf=y(()=>{"use strict";K();de();MT=CT(),ks=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(e){this.config=e}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=IT.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,e)).catch(e=>{throw this.launchPromise=void 0,e}),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=()=>{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",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),c=await i.content(),l=i.url(),d=a!==null?a.status():null;return{html:c,finalUrl:l,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),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){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.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/${MT}`}}loadStorageState(e){let n=oa(e);try{if(!qt.existsSync(n))return;let r=JSON.parse(qt.readFileSync(n,"utf8"));return j("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){j("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=oa(e);if(!qt.existsSync(r))return;let o=await n.storageState(),s=Ss.join(Ss.dirname(r),`.${Ss.basename(r)}.${process.pid}.${PT(4).toString("hex")}.tmp`);qt.writeFileSync(s,JSON.stringify(o),{mode:384}),qt.chmodSync(s,384),qt.renameSync(s,r),j("[browser/vault] saved session",{profile:e,file:r})}catch(r){j("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as OT}from"crypto";function wc(t){if(t.length===0)return t;let e=t;for(let{regex:n,name:r}of DT)r==="form-password"?e=e.replace(n,"password=[redacted]"):e=e.replace(n,"[redacted]");return e}function Zf(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&FT.test(t.label))}function em(t){return OT("sha256").update(t,"utf8").digest("hex").slice(0,8)}function tm(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var DT,FT,cr=y(()=>{"use strict";DT=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];FT=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as LT}from"node:crypto";function NT(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function $T(t,e,n){return`el_${LT("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function UT(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function nm(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function om(t,e){let n=t.role??"",r=t.name??"";rm.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])om(s,e)}async function BT(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(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,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},sm).catch(()=>[])}async function jT(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")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)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,h={role:l,name:c,disabled:p};u!==void 0&&(h.value=u),f!==void 0&&(h.checked=f),o.push(h)}return o},sm).catch(()=>[])}function HT(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function _s(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=HT(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=BT(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,h,g]=await Promise.all([i,a,c,l,d]),w,b=!1;u!==null?(w=[],om(u,w)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,w=(await jT(t)).filter(U=>rm.has(U.role??"")));let E=new Map;for(let R of p){let U=nm(R.name),B=E.get(U);(!B||B.bbox.w===0&&R.bbox.w>0)&&E.set(U,R)}let A=w.map(R=>({ax:R,dom:E.get(nm(R.name??""))})),v=r?A:A.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);v.sort((R,U)=>{let B=R.dom?.bbox.y??0,M=U.dom?.bbox.y??0;if(B!==M)return B-M;let P=R.dom?.bbox.x??0,$=U.dom?.bbox.x??0;return P-$}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let I=v.slice(0,n).map((R,U)=>{let B=R.ax.role??"generic",M=R.ax.name??"",P=$T(B,M,U),$=R.dom?.bbox??{x:0,y:0,w:0,h:0},C=R.dom?.type??null,N=null;R.ax.value!==void 0&&R.ax.value!==null&&(N=String(R.ax.value)),R.ax.checked!==void 0&&(N=String(R.ax.checked)),Zf({role:B,kind:C})&&(N="[redacted]");let D={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(D.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(D.selected=R.ax.selected),R.ax.expanded!==void 0&&(D.expanded=R.ax.expanded);let L;R.dom?.testId?L=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&(L=`#${R.dom.id}`);let z={id:P,role:B,label:NT(M),kind:C,value:N,state:D,bbox:$};return L!==void 0&&(z.selector=L),z}),S="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?S="loading":R==="interactive"?S="navigating":S="idle"}catch{S="navigating"}S!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let T=UT(f),x=`obs_${e.observationCounter.toString(36)}`,O=new Date().toISOString();return{observationId:x,url:h,title:g,textSummary:T,interactive:I,status:{httpStatus:e.httpStatus??null,loadingState:S,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:O}}var rm,sm,im=y(()=>{"use strict";cr();rm=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);sm="a[href], button, input, select, textarea, [role], [tabindex], label"});async function am(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,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 vc(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>am(t,s)))).filter(o=>o!==null)}async function WT(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 c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Sc(t,e,n){switch(e.kind){case"element_id":return KT(t,e,n);case"selector":return GT(t,e);case"semantic":return qT(t,e)}}async function KT(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 c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}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 vc(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function GT(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 vc(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function qT(t,e){return e.role!==void 0?zT(t,e.text,e.role):VT(t,e.text,e)}async function zT(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 vc(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function VT(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===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}),c>0&&d.push({loc:s,count:c});let u=await WT(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 w=p[g];if(w===void 0)continue;let b=await am(w.locator,w.index);if(b!==null){let E=`${b.role}:${b.label}:${g}`,A=0;for(let v=0;v<E.length;v++)A=A*31+E.charCodeAt(v)>>>0;f.push({...b,id:`el_${A.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var cm=y(()=>{"use strict"});import{randomBytes as JT}from"crypto";import{mkdir as YT,stat as XT,writeFile as QT}from"fs/promises";import{join as kc}from"path";import{gzip as ZT}from"zlib";import{promisify as ex}from"util";function tx(t){return kc(ao(t),"browser")}function nx(t){return kc(tx(t),"screenshots")}function rx(){return new Date().toISOString().replace(/[:.]/g,"-")}function ox(){return JT(3).toString("hex")}async function _c(t,e,n){if(e.length>lm)throw new Error(`writeScreenshotSidecar: buffer exceeds ${lm} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=nx(t);await YT(r,{recursive:!0});let o=`${rx()}-${ox()}-${n}.png`,s=kc(r,o);await QT(s,e);let{size:i}=await XT(s);return{path:s,bytes:i}}var Kj,lm,dm=y(()=>{"use strict";K();cr();Kj=ex(ZT);lm=5*1024*1024});var pm={};Qi(pm,{PlaywrightProvider:()=>Ec});function um(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 Ec,fm=y(()=>{"use strict";Qf();im();cm();bc();cr();dm();Ec=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new ks(e)}async open(e){let n=yc(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(l){a=l}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let c=await _s(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,c.interactive,c.url,c.title,"browser_open"),a!==null)throw a;return c}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 _s(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 Sc(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${um(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":{let g=wc(e.value??"");await c.fill(e.value??"");break}case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.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(w){l=w}else l=g}let u=r.url();if(u!==s){let g=yc(u,this.config);if(!g.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:g.reason}}let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await _s(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),h=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,h),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}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 Sc(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${um(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 _c(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,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 _c(n,o,r);return s}catch{return null}}}});var Vt={};Qi(Vt,{__resetBrowserRegistryForTests:()=>lx,browserProviderActive:()=>ax,closeBrowserProvider:()=>Ac,getBrowserProvider:()=>ix,peekBrowserProvider:()=>cx});function mm(){Promise.resolve(Ac()).then(()=>{process.exit(130)})}function gm(){Promise.resolve(Ac()).then(()=>{process.exit(143)})}function hm(){qe=null}function sx(){Es||(process.on("SIGINT",mm),process.on("SIGTERM",gm),process.on("exit",hm),Es=!0)}function ym(){Es&&(process.removeListener("SIGINT",mm),process.removeListener("SIGTERM",gm),process.removeListener("exit",hm),Es=!1)}async function ix(t){return qe!==null?qe:(zt!==null||(zt=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(fm(),pm)),n=Xf(t),r=new e(n);return sx(),qe=r,zt=null,r})()),zt)}async function Ac(){if(qe===null)return;let t=qe;qe=null,zt=null,ym(),await t.shutdown()}function ax(){return qe!==null}function cx(){return qe}function lx(){qe=null,zt=null,ym()}var qe,zt,Es,Jt=y(()=>{"use strict";bc();qe=null,zt=null,Es=!1});function bm(t,e){try{return Gf(t,e)}catch(n){return j("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function mx(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Jt(),Vt));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function wm(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??mx,o=null,s=t,i=null,a=null;try{let l=await vs(n,t,{headers:fx,redirect:"follow",signal:e.signal});i=l.status,s=l.url||t;let d=l.headers.get("content-type")??"";if(l.ok){if(px.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await l.text();if(ux.test(d)&&!dx.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};o=bm(u,s)}}catch(l){if(e.signal.aborted||l instanceof Error&&l.message.startsWith("web_scrape markdown mode received binary"))throw l;a=l}if(!(o===null||o.textLength<Kf)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let l=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=bm(l.html,l.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:l.finalUrl,usedRender:!0}}catch(l){if(e.signal.aborted)throw l;if(o===null){let d=l instanceof Error?l.message:String(l),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=l,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var dx,ux,px,fx,vm=y(()=>{"use strict";qf();hc();de();dx=/(text\/html|application\/xhtml\+xml)/i,ux=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,px=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,fx={"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 yx(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(gx,{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),hx),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Yo(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function Sm(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?yx({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 km(t,e){if(e.length===0)return`# Search results for "${t}"
1060
+ `).trim()}function gT(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}function Gf(t,e){let r=new pT(t,{url:e}).window.document,o=(r.title??"").trim(),s=null;try{let l=r.cloneNode(!0);s=new fT(l).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let l=Wf(gc.turndown(s.content)),d=(s.title??"").trim()||o,u=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:l,textLength:u,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",c=Wf(gc.turndown(a));return{title:o,markdown:c,textLength:gT(i),usedFallback:!0}}var Kf,gc,qf=y(()=>{"use strict";Kf=200,gc=new mT({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});gc.remove(["script","style","noscript","iframe"])});function yT(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 zf(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function bT(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 vs(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??yT,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!hT.has(u.status)||d===o)return u;let p=bT(u,i)??zf(d,s,i);j("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=zf(d,s,i);j("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var hT,hc=y(()=>{"use strict";de();hT=new Set([429,502,503,504])});import{readFileSync as wT}from"node:fs";import{join as vT}from"path";function ST(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function Vf(t,e){return ST(e).test(t)}function ET(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(kT.has(e))return!0;if(_T.has(e))return!1}return!1}function Jf(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function AT(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 Yf(t){let e=t===void 0||t.trim()===""?"default":t.trim();return ra(e),e}function TT(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function xT(t){try{return wT(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function RT(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=Yf(e.defaultProfile)),n}function Xf(t){let e=t?.env??k,n=t?.readFileSync??xT,r=t?.surface??e.AGENT_SURFACE,o=ET(e.AFK_BROWSER_HEADLESS,r),s=Jf(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Jf(e.AFK_BROWSER_BLOCKED_DOMAINS),a=TT(e.AFK_BROWSER_DOM_SNAPSHOTS),c=AT(e.AFK_BROWSER_BACKEND),l=Yf(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():vT(Ze(),"browser.json"),f=n(p);if(f===void 0)return d;let h;try{h=JSON.parse(f)}catch(w){throw new Error(`Failed to parse browser config at ${p}: ${String(w)}`)}if(typeof h!="object"||h===null||Array.isArray(h))throw new Error(`Browser config at ${p} must be a JSON object`);let g=RT(d,h);return g.configPath=p,g}function yc(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(Vf(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>Vf(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var kT,_T,bc=y(()=>{"use strict";H();K();kT=new Set(["daemon","subagent","telegram","afk"]),_T=new Set(["repl","interactive","cli"])});import qt from"node:fs";import Ss from"node:path";import{randomBytes as PT}from"node:crypto";import{chromium as IT}from"playwright";function CT(){try{return"5.19.1"}catch{}try{let t=Ss.resolve(import.meta.dirname,"../../../package.json"),e=qt.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var MT,ks,Qf=y(()=>{"use strict";K();de();MT=CT(),ks=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(e){this.config=e}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=IT.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,e)).catch(e=>{throw this.launchPromise=void 0,e}),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=()=>{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",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),c=await i.content(),l=i.url(),d=a!==null?a.status():null;return{html:c,finalUrl:l,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),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){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.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/${MT}`}}loadStorageState(e){let n=oa(e);try{if(!qt.existsSync(n))return;let r=JSON.parse(qt.readFileSync(n,"utf8"));return j("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){j("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=oa(e);if(!qt.existsSync(r))return;let o=await n.storageState(),s=Ss.join(Ss.dirname(r),`.${Ss.basename(r)}.${process.pid}.${PT(4).toString("hex")}.tmp`);qt.writeFileSync(s,JSON.stringify(o),{mode:384}),qt.chmodSync(s,384),qt.renameSync(s,r),j("[browser/vault] saved session",{profile:e,file:r})}catch(r){j("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as OT}from"crypto";function wc(t){if(t.length===0)return t;let e=t;for(let{regex:n,name:r}of DT)r==="form-password"?e=e.replace(n,"password=[redacted]"):e=e.replace(n,"[redacted]");return e}function Zf(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&FT.test(t.label))}function em(t){return OT("sha256").update(t,"utf8").digest("hex").slice(0,8)}function tm(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var DT,FT,cr=y(()=>{"use strict";DT=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];FT=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as LT}from"node:crypto";function NT(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function $T(t,e,n){return`el_${LT("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function UT(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function nm(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function om(t,e){let n=t.role??"",r=t.name??"";rm.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])om(s,e)}async function BT(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(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,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},sm).catch(()=>[])}async function jT(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")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)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,h={role:l,name:c,disabled:p};u!==void 0&&(h.value=u),f!==void 0&&(h.checked=f),o.push(h)}return o},sm).catch(()=>[])}function HT(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function _s(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=HT(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=BT(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,h,g]=await Promise.all([i,a,c,l,d]),w,b=!1;u!==null?(w=[],om(u,w)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,w=(await jT(t)).filter(U=>rm.has(U.role??"")));let E=new Map;for(let R of p){let U=nm(R.name),B=E.get(U);(!B||B.bbox.w===0&&R.bbox.w>0)&&E.set(U,R)}let A=w.map(R=>({ax:R,dom:E.get(nm(R.name??""))})),v=r?A:A.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);v.sort((R,U)=>{let B=R.dom?.bbox.y??0,M=U.dom?.bbox.y??0;if(B!==M)return B-M;let P=R.dom?.bbox.x??0,$=U.dom?.bbox.x??0;return P-$}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let I=v.slice(0,n).map((R,U)=>{let B=R.ax.role??"generic",M=R.ax.name??"",P=$T(B,M,U),$=R.dom?.bbox??{x:0,y:0,w:0,h:0},C=R.dom?.type??null,N=null;R.ax.value!==void 0&&R.ax.value!==null&&(N=String(R.ax.value)),R.ax.checked!==void 0&&(N=String(R.ax.checked)),Zf({role:B,kind:C})&&(N="[redacted]");let D={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(D.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(D.selected=R.ax.selected),R.ax.expanded!==void 0&&(D.expanded=R.ax.expanded);let L;R.dom?.testId?L=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&(L=`#${R.dom.id}`);let z={id:P,role:B,label:NT(M),kind:C,value:N,state:D,bbox:$};return L!==void 0&&(z.selector=L),z}),S="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?S="loading":R==="interactive"?S="navigating":S="idle"}catch{S="navigating"}S!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let T=UT(f),x=`obs_${e.observationCounter.toString(36)}`,O=new Date().toISOString();return{observationId:x,url:h,title:g,textSummary:T,interactive:I,status:{httpStatus:e.httpStatus??null,loadingState:S,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:O}}var rm,sm,im=y(()=>{"use strict";cr();rm=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);sm="a[href], button, input, select, textarea, [role], [tabindex], label"});async function am(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,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 vc(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>am(t,s)))).filter(o=>o!==null)}async function WT(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 c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Sc(t,e,n){switch(e.kind){case"element_id":return KT(t,e,n);case"selector":return GT(t,e);case"semantic":return qT(t,e)}}async function KT(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 c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}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 vc(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function GT(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 vc(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function qT(t,e){return e.role!==void 0?zT(t,e.text,e.role):VT(t,e.text,e)}async function zT(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 vc(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function VT(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===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}),c>0&&d.push({loc:s,count:c});let u=await WT(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 w=p[g];if(w===void 0)continue;let b=await am(w.locator,w.index);if(b!==null){let E=`${b.role}:${b.label}:${g}`,A=0;for(let v=0;v<E.length;v++)A=A*31+E.charCodeAt(v)>>>0;f.push({...b,id:`el_${A.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var cm=y(()=>{"use strict"});import{randomBytes as JT}from"crypto";import{mkdir as YT,stat as XT,writeFile as QT}from"fs/promises";import{join as kc}from"path";import{gzip as ZT}from"zlib";import{promisify as ex}from"util";function tx(t){return kc(ao(t),"browser")}function nx(t){return kc(tx(t),"screenshots")}function rx(){return new Date().toISOString().replace(/[:.]/g,"-")}function ox(){return JT(3).toString("hex")}async function _c(t,e,n){if(e.length>lm)throw new Error(`writeScreenshotSidecar: buffer exceeds ${lm} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=nx(t);await YT(r,{recursive:!0});let o=`${rx()}-${ox()}-${n}.png`,s=kc(r,o);await QT(s,e);let{size:i}=await XT(s);return{path:s,bytes:i}}var Kj,lm,dm=y(()=>{"use strict";K();cr();Kj=ex(ZT);lm=5*1024*1024});var pm={};Qi(pm,{PlaywrightProvider:()=>Ec});function um(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 Ec,fm=y(()=>{"use strict";Qf();im();cm();bc();cr();dm();Ec=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new ks(e)}async open(e){let n=yc(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(l){a=l}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let c=await _s(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,c.interactive,c.url,c.title,"browser_open"),a!==null)throw a;return c}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 _s(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 Sc(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${um(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":{let g=wc(e.value??"");await c.fill(e.value??"");break}case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.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(w){l=w}else l=g}let u=r.url();if(u!==s){let g=yc(u,this.config);if(!g.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:g.reason}}let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await _s(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),h=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,h),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}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 Sc(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${um(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 _c(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,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 _c(n,o,r);return s}catch{return null}}}});var Vt={};Qi(Vt,{__resetBrowserRegistryForTests:()=>lx,browserProviderActive:()=>ax,closeBrowserProvider:()=>Ac,getBrowserProvider:()=>ix,peekBrowserProvider:()=>cx});function mm(){Promise.resolve(Ac()).then(()=>{process.exit(130)})}function gm(){Promise.resolve(Ac()).then(()=>{process.exit(143)})}function hm(){qe=null}function sx(){Es||(process.on("SIGINT",mm),process.on("SIGTERM",gm),process.on("exit",hm),Es=!0)}function ym(){Es&&(process.removeListener("SIGINT",mm),process.removeListener("SIGTERM",gm),process.removeListener("exit",hm),Es=!1)}async function ix(t){return qe!==null?qe:(zt!==null||(zt=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(fm(),pm)),n=Xf(t),r=new e(n);return sx(),qe=r,zt=null,r})()),zt)}async function Ac(){if(qe===null)return;let t=qe;qe=null,zt=null,ym(),await t.shutdown()}function ax(){return qe!==null}function cx(){return qe}function lx(){qe=null,zt=null,ym()}var qe,zt,Es,Jt=y(()=>{"use strict";bc();qe=null,zt=null,Es=!1});function bm(t,e){try{return Gf(t,e)}catch(n){return j("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function mx(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Jt(),Vt));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function wm(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??mx,o=null,s=t,i=null,a=null;try{let l=await vs(n,t,{headers:fx,redirect:"follow",signal:e.signal});i=l.status,s=l.url||t;let d=l.headers.get("content-type")??"";if(l.ok){if(px.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await l.text();if(ux.test(d)&&!dx.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};o=bm(u,s)}}catch(l){if(e.signal.aborted||l instanceof Error&&l.message.startsWith("web_scrape markdown mode received binary"))throw l;a=l}if(!(o===null||o.textLength<Kf)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let l=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=bm(l.html,l.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:l.finalUrl,usedRender:!0}}catch(l){if(e.signal.aborted)throw l;if(o===null){let d=l instanceof Error?l.message:String(l),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=l,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var dx,ux,px,fx,vm=y(()=>{"use strict";qf();hc();de();dx=/(text\/html|application\/xhtml\+xml)/i,ux=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,px=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,fx={"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 yx(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(gx,{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),hx),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Yo(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function Sm(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?yx({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 km(t,e){if(e.length===0)return`# Search results for "${t}"
1061
1061
 
1062
1062
  (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(`
1063
1063
  `).trimEnd()}var gx,hx,_m=y(()=>{"use strict";hn();gx="https://api.exa.ai/search",hx=10});function Ax(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=bx;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,wx)}let a=vx;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,Sx)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Tc(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+kx}function Tx(t){let e=[],n=t;for(let o=0;o<4&&n instanceof Error;o++)e.push(n.message),n=n.cause;let r=e.join(" | ");return Ex.some(o=>r.includes(o))}function xx(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=Ax(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},c,l=()=>{let d=i.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),c=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let u;try{u=await vs(e,s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(f){return i.signal.aborted?{content:`web_scrape aborted: ${l()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await u.text()}catch(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:Tc(p,s.maxBytes)}}if(s.mode==="markdown")try{let u=await wm(s.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:Tc(u.markdown,s.maxBytes)}}catch(u){if(i.signal.aborted)return{content:`web_scrape aborted: ${l()}`,isError:!0};let p=u instanceof Error?u.message:String(u),f=Tx(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${f}`,isError:!0}}let d=Sm({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(s.query,{limit:_x,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Tc(km(s.query,u),s.maxBytes)}}catch(u){return i.signal.aborted?{content:`web_scrape aborted: ${l()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),o.removeEventListener("abort",a)}}}var bx,wx,vx,Sx,kx,_x,Ex,Em,Am=y(()=>{"use strict";vm();_m();hc();bx=3e4,wx=12e4,vx=1e6,Sx=1e7,kx=`
@@ -1157,7 +1157,7 @@ ${f.content}`,isError:!0,...f.truncated===!0?{truncated:!0}:{}}),c.push({call:p,
1157
1157
 
1158
1158
  `)};return Ch(w,e.prompt,a)}buildDispatcher(e,n){let r=$s(e,n.cwd),o=zn(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[d,u]of o)this.providerOpts.readOnlyMemory===!0&&d!=="memory_search"||r.set(d,u);n.runtimeStateSource&&r.set("get_runtime_state",wn(n.runtimeStateSource));for(let d of this.providerOpts.customTools??[])r.has(d.schema.name)||r.set(d.schema.name,d.handler);let s=e==="plan"?n.planExitControls:void 0;s&&r.set(At,Bs(s));let i=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[d,u]of this.providerOpts.mcpManager.getMcpHandlers())r.set(d,u);let a=n.isSkillDispatch?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="terminal_font_size"):n.isNonInteractive?this.schemas.filter(d=>d.name!=="ask_question"):this.schemas,c={handlers:r,schemas:[...a,...i,...s?[Us]:[]],hookRegistry:Zo(n.hookRegistry,this.providerOpts.hookRegistry)},l=ns(this.providerOpts.mcpManager?ts(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(d=>d.schema.name));return l!==void 0&&(c.permissions=l),this.providerOpts.subagentExecutor!==void 0&&(c.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(c.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(c.composeExecutor=this.providerOpts.composeExecutor),this.providerOpts.canUseTool!==void 0&&(c.canUseTool=this.providerOpts.canUseTool),n.cwd!==void 0&&(c.cwd=n.cwd),n.readRoots!==void 0&&(c.readRoots=n.readRoots),n.writeRoots!==void 0&&(c.writeRoots=n.writeRoots),n.sessionId!==void 0&&(c.sessionId=n.sessionId),n.parentSessionId!==void 0&&(c.parentSessionId=n.parentSessionId),n.traceWriter!==void 0&&(c.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(c.readOnlyBash=!0),c.allowAll=We(e),new lt(c)}ensureSharedRoots(e){if(!this._sharedReadRoots){let n=e?[e]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),e&&!this._initialResolveBase&&(this._initialResolveBase=e)}}addReadRoot(e,n="slash",r){this.ensureSharedRoots();let o=cl.resolve(e);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(e,n="slash",r){this.ensureSharedRoots();let o=cl.resolve(e);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(e,n="slash",r){if(!this._sharedReadRoots)return;let o=cl.resolve(e);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[],allowAll:We(this._currentPermissionMode)}}appendProviderAuditLog(e){try{let n=tn();DP(FP(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId??null,action:e.action,path:e.path,source:e.source});OP(n,r+`
1159
1159
  `)}catch{}}close(){this.memoryStore.close()}async complete(e){let n={model:e.model??"gpt-4o-mini",system:e.system,user:e.user,maxTokens:e.maxTokens??64};e.apiKey!==void 0&&(n.apiKey=e.apiKey);let r=e.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),e.signal&&(n.signal=e.signal),Mh(n)}},LP=new he});function xt(t,e){if(t.has(e))return!0;let n=e.charAt(0).toUpperCase()+e.slice(1);return n!==e&&t.has(n)}function Xs(t){return t.startsWith("mcp__")||t.startsWith("MCP__")?"mcp":xt(NP,t)?"read":xt($P,t)?"write":xt(UP,t)?"shell":xt(Dh,t)?"subagent":xt(Fh,t)?"skill":xt(Lh,t)?"dag":xt(BP,t)?"web":jP.has(t)?"browser":xt(HP,t)?"planning":WP.has(t)?"schedule":"other"}var NP,$P,UP,Dh,Fh,Lh,h1,BP,jP,HP,WP,Nh,Qs=y(()=>{"use strict";as();NP=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search"]),$P=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size","config_set"]),UP=new Set(["Bash","BashOutput","KillBash","bash"]),Dh=new Set(["Agent","Task","agent"]),Fh=new Set(["Skill","skill"]),Lh=new Set(["Compose","compose"]),h1=new Set([...Dh,...Lh,...Fh]),BP=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),jP=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),HP=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),WP=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);Nh=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search",...ke]});import{z as Rt}from"zod";function zP(t){let e=/```(?:json)?\s*([\s\S]*?)```/gi,n;for(;(n=e.exec(t))!==null;){let r=n[1];if(r===void 0)continue;let o=$h(r.trim());if(Uh(o))return o}for(let r=0;r<t.length;r++){if(t[r]!=="{"||VP(t,r))continue;let o=JP(t,r);if(o===-1)continue;let s=t.slice(r,o+1),i=$h(s);if(Uh(i))return i;r=o}}function VP(t,e){for(let n=e-1;n>=0;n--){let r=t[n];if(!(r===" "||r===" "||r===`
1160
- `||r==="\r"))return r==="["||r===","}return!1}function Bh(t){let e=zP(t);if(e===void 0)return{ok:!1,reason:"absent"};let n=qP.safeParse(e);return n.success?{ok:!0,signal:n.data.signal}:{ok:!1,reason:"malformed"}}function $h(t){try{return JSON.parse(t)}catch{return}}function Uh(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)&&"signal"in t}function JP(t,e){let n=0,r=!1,o=!1;for(let s=e;s<t.length;s++){let i=t[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="{")n++;else if(i==="}"&&(n--,n===0))return s}return-1}var KP,GP,qP,jh=y(()=>{"use strict";KP=Rt.enum(["supports","opposes","uncertain","blocks"]),GP=Rt.object({issue:Rt.string().min(1),stance:KP,confidence:Rt.number().min(0).max(1),evidence:Rt.array(Rt.string()),claim:Rt.string().min(1)}),qP=Rt.object({signal:GP}).passthrough()});function Zs(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function Hh(t,e,n,r,o){let s=Bh(n.content),i=s.ok?s.signal:void 0;if(!r)return{id:t,status:e,message:n,trace:o,...i!==void 0&&{signal:i}};let a=Go(n.content),c=r.safeParse(a);return c.success?{id:t,status:e,message:n,output:c.data,trace:o,...i!==void 0&&{signal:i}}:{id:t,status:"failed",message:n,error:new Error(`structured output did not match schema: ${c.error.message}`,{cause:c.error}),schemaError:c.error,trace:o,...i!==void 0&&{signal:i}}}function dl(t,e,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:t,status:e,error:o,trace:r}}function oe(t){return`${t.status}${t.error?`: ${t.error.message}`:""}`}function Wh(t,e){let n=t;return e.partialOutput!==void 0&&e.partialOutput!==null&&(n.partialOutput=e.partialOutput),e.subagentId!==void 0&&(n.subagentId=e.subagentId),n}var _e=y(()=>{"use strict";La();jh()});var Kh=y(()=>{"use strict";K()});var F1,ei,Gh=y(()=>{"use strict";_e();de();ne();Kh();K();st();F1=300*1e3,ei=class extends Error{constructor(e,n){super(`Background job cap reached (${e}/${n} running). Wait for existing jobs to finish or cancel them before spawning more.`),this.name="BackgroundJobCapError"}}});function qh(t){return typeof t=="string"&&t.startsWith("sk-ant-")}function Sr(t){let{childModel:e,resolved:n,parentApiKey:r}=t;return n!==void 0&&n.length>0||J(e)==="openai-compatible"?n:qh(r)?r:n}function zh(t){let{childModel:e,configApiKey:n,parentApiKey:r,parentProvider:o}=t;if(n!==void 0&&n.length>0)return n;if(r===void 0)return;let s=o??(qh(r)?"anthropic-direct":void 0);return s===void 0||J(e)===s?r:void 0}var ti=y(()=>{"use strict";Se()});import{isAbsolute as QP}from"node:path";function ZP(t){if(typeof t!="object"||t===null)throw new Error("Agent tool input must be an object");let e=t,n=e.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=e.model;if(o!==void 0){if(typeof o!="string")throw new Error("Agent tool model must be a string");r=o}let s=10,i=e.max_turns;if(i!==void 0){if(typeof i!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(i)))}let a="agent-tool",c=e.id_prefix;if(c!==void 0){if(typeof c!="string")throw new Error("Agent tool id_prefix must be a string");a=c}let l="foreground",d=e.mode;if(d!==void 0){if(d!=="foreground"&&d!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(d)}`);l=d}let u,p=e.cwd;if(p!==void 0){if(typeof p!="string")throw new Error(`Agent tool cwd must be a string, got: ${JSON.stringify(p)}`);if(p.length===0)throw new Error("Agent tool cwd must be a non-empty string");if(!QP(p))throw new Error(`Agent tool cwd must be an absolute path, got: ${JSON.stringify(p)}`);if(p.split(/[/\\]/).includes(".."))throw new Error(`Agent tool cwd must not contain '..' segments, got: ${JSON.stringify(p)}`);u=p}return{prompt:n,model:r,max_turns:s,id_prefix:a,mode:l,...u!==void 0?{cwd:u}:{}}}function ni(t){try{return re(t).catch(()=>{})}catch{return Promise.resolve()}}function In(t,e=240){return t.length<=e?t:t.slice(0,e)+"\u2026"}function Jh(t){if(t!=null){if(typeof t=="string")return t.length;try{return JSON.stringify(t).length}catch{return}}}function tI(t){if(t==null)return;let e=Jh(t);return e!==void 0&&e>eI?{truncated:!0,chars:e}:t}function nI(t){let e={status:t.status,error:In(t.errorMessage,Vh),subagent_id:t.subagentId};t.schemaErrorMessage&&(e.schemaError=In(t.schemaErrorMessage,Vh));let n=tI(t.partialOutput);return n!==void 0&&(e.partialOutput=n),e}var eI,Vh,Cn,ul=y(()=>{"use strict";le();Gh();Se();ti();pn();On();st();de();hn();yt();On();eI=4096,Vh=1024;Cn=class t{constructor(e){this.ctx=e;this.currentCwd=e.cwd}ctx;currentCwd;setCwd(e){this.currentCwd=e,this.ctx.subagentManager.setCwd(e)}promotionTriggers=new Map;hasPromotableForeground(){return this.ctx.backgroundRegistry!==void 0&&this.promotionTriggers.size>0}async promoteActiveForeground(){let e=[...this.promotionTriggers.values()];return e.forEach(r=>r.fire()),(await Promise.all(e.map(r=>r.ready))).filter(r=>r!==null)}getSubagentsLite(){let e=this.ctx.subagentManager.list().map(r=>({id:r.id,status:r.status})),n=this.ctx.backgroundRegistry?this.ctx.backgroundRegistry.list().map(r=>({jobId:r.jobId,status:r.status,startedAt:new Date(r.startedAt).toISOString(),label:r.label.length>0?r.label:null})):[];return{active:e,backgroundJobs:n}}async execute(e){if(e.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=ZP(e.input)}catch(S){return{content:`Agent tool input validation failed: ${S instanceof Error?S.message:String(S)}`,isError:!0}}let r=this.ctx.depth,o=this.ctx.maxDepth??Mn,s,i=this.ctx.surface!==void 0?{origin:ht(this.ctx.surface),actor:Ne(r)}:{},a=n.model??this.ctx.defaultSubagentModel??"sonnet",c=J(a)==="openai-compatible",l=Sr({childModel:a,resolved:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(a):nt(a),parentApiKey:this.ctx.defaultConfig.apiKey}),d={model:a,apiKey:c?void 0:l,systemPrompt:this.ctx.defaultConfig.systemPrompt,baseUrl:c?void 0:this.ctx.defaultConfig.baseUrl,maxTurns:n.max_turns,depth:r+1,maxDepth:o,...n.cwd!==void 0?{cwd:n.cwd}:{}},u;if(this.ctx.childProviderFactory&&r<o){s=new q({parentAbortSignal:e.signal,...this.currentCwd!==void 0?{cwd:this.currentCwd}:{}}),u=kr(e.signal);let S=new t({subagentManager:s,parentSession:u,defaultConfig:this.ctx.defaultConfig,...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{},defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,...this.ctx.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:this.ctx.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...this.ctx.allowedTools!==void 0?{allowedTools:this.ctx.allowedTools}:{},...this.ctx.readOnlyBash?{readOnlyBash:!0}:{}}),T=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,e.signal):void 0;d.provider=this.ctx.childProviderFactory({childExecutor:S,...T!==void 0?{childSkillExecutor:T}:{},...d.model!==void 0?{model:d.model}:{},...this.ctx.allowedTools!==void 0?{allowedTools:this.ctx.allowedTools}:{},...this.ctx.readOnlyBash?{readOnlyBash:!0}:{}})}let p;try{p=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,parentId:e.id,config:d,idPrefix:n.id_prefix,agentType:n.id_prefix&&n.id_prefix!=="agent-tool"?ot(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":ot(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:!0}),u!==void 0&&(u.sessionId=p.id)}catch(S){let T=S instanceof Error?S.message:String(S);return ni({...i,event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:In(T),depth:r}),{content:`Failed to fork subagent: ${T}`,isError:!0}}if(n.mode==="background"){let S=this.ctx.backgroundRegistry;if(!S)return await p.teardown().catch(O=>j("subagent-executor: handle teardown failed: "+(O instanceof Error?O.message:String(O)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let T;try{T=S.register({handle:p,prompt:n.prompt,model:d.model??"sonnet",parentSessionId:this.ctx.parentSession.sessionId})}catch(O){if(O instanceof ei)return await p.teardown().catch(R=>j("subagent-executor: handle teardown failed after cap error: "+(R instanceof Error?R.message:String(R)))),{content:O.message,isError:!0};throw O}let x={status:"running",jobId:T.jobId,subagentId:T.subagentId,label:T.label,message:`Background subagent started (jobId=${T.jobId}). It is running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${T.jobId} remains available for manual replay.`};return{content:JSON.stringify(x)}}let f=()=>{p.cancel()};e.signal.addEventListener("abort",f,{once:!0});let h=Date.now(),g=this.ctx.parentSession.sessionId,w=!1,b,E=new Promise(S=>{b=S}),A,v=new Promise(S=>{A=S});this.promotionTriggers.set(p.id,{fire:b,ready:v});let _,I=p.runToResult(n.prompt);try{let S=await Promise.race([I.then(U=>({kind:"result",result:U})),E.then(()=>({kind:"promote"}))]);if(S.kind==="promote"){let U=this.ctx.backgroundRegistry;if(U)try{let B=U.adoptRunning({handle:p,runPromise:I,prompt:n.prompt,model:d.model??"sonnet",parentSessionId:g});return w=!0,e.signal.removeEventListener("abort",f),A({jobId:B.jobId,label:B.label}),{content:JSON.stringify({status:"running",jobId:B.jobId,subagentId:B.subagentId,label:B.label,message:`Subagent backgrounded by user (jobId=${B.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${B.jobId} remains available for manual replay.`})}}catch(B){j("subagent-executor: promotion failed, staying foreground: "+(B instanceof Error?B.message:String(B))),A(null)}else A(null)}let T=S.kind==="result"?S.result:await I;if(T.status==="succeeded"&&T.message){let U=T.message.content,B=typeof U=="string"?U:JSON.stringify(U),M=T.trace;return ni({...i,event:"subagent.completed",subagent_id:p.id,parent_session_id:g,status:T.status,duration_ms:Date.now()-h,content_chars:B.length,depth:r,tool_call_count:M?.toolCalls.length,thinking_present:M?.thinkingPresent,tool_names:M?.toolCalls.length?JSON.stringify([...new Set(M.toolCalls.map(P=>P.name))]):void 0}),_={content:B},_}let x=T.error?.message??"Subagent failed with no output",O=T.trace;ni({...i,event:"subagent.failed",subagent_id:p.id,id_prefix:n.id_prefix,parent_session_id:g,status:T.status,duration_ms:Date.now()-h,error_message:In(x),schema_error:T.schemaError?In(T.schemaError.message):void 0,partial_output_chars:Jh(T.partialOutput),depth:r,tool_call_count:O?.toolCalls.length,thinking_present:O?.thinkingPresent,tool_names:O?.toolCalls.length?JSON.stringify([...new Set(O.toolCalls.map(U=>U.name))]):void 0});let R=nI({status:T.status,errorMessage:x,schemaErrorMessage:T.schemaError?.message,partialOutput:T.partialOutput,subagentId:p.id});return _={content:JSON.stringify(R),isError:!0},_}catch(S){let T=S instanceof Error?S.message:String(S);throw ni({...i,event:"subagent.failed",subagent_id:p.id,id_prefix:n.id_prefix,parent_session_id:g,status:"failed",duration_ms:Date.now()-h,error_message:In(T),depth:r}),S}finally{if(this.promotionTriggers.delete(p.id),A(null),!w){e.signal.removeEventListener("abort",f),await s?.teardownAll(),await p.teardown({deferInjectContextToCaller:!0});let S=p.getLastStopInjectContext?.();_!==void 0&&S!==void 0&&S.length>0&&(_.content=`${_.content}
1160
+ `||r==="\r"))return r==="["||r===","}return!1}function Bh(t){let e=zP(t);if(e===void 0)return{ok:!1,reason:"absent"};let n=qP.safeParse(e);return n.success?{ok:!0,signal:n.data.signal}:{ok:!1,reason:"malformed"}}function $h(t){try{return JSON.parse(t)}catch{return}}function Uh(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)&&"signal"in t}function JP(t,e){let n=0,r=!1,o=!1;for(let s=e;s<t.length;s++){let i=t[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="{")n++;else if(i==="}"&&(n--,n===0))return s}return-1}var KP,GP,qP,jh=y(()=>{"use strict";KP=Rt.enum(["supports","opposes","uncertain","blocks"]),GP=Rt.object({issue:Rt.string().min(1),stance:KP,confidence:Rt.number().min(0).max(1),evidence:Rt.array(Rt.string()),claim:Rt.string().min(1)}),qP=Rt.object({signal:GP}).passthrough()});function Zs(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function Hh(t,e,n,r,o){let s=Bh(n.content),i=s.ok?s.signal:void 0;if(!r)return{id:t,status:e,message:n,trace:o,...i!==void 0&&{signal:i}};let a=Go(n.content),c=r.safeParse(a);return c.success?{id:t,status:e,message:n,output:c.data,trace:o,...i!==void 0&&{signal:i}}:{id:t,status:"failed",message:n,error:new Error(`structured output did not match schema: ${c.error.message}`,{cause:c.error}),schemaError:c.error,trace:o,...i!==void 0&&{signal:i}}}function dl(t,e,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:t,status:e,error:o,trace:r}}function oe(t){return`${t.status}${t.error?`: ${t.error.message}`:""}`}function Wh(t,e){let n=t;return e.partialOutput!==void 0&&e.partialOutput!==null&&(n.partialOutput=e.partialOutput),e.subagentId!==void 0&&(n.subagentId=e.subagentId),n}var _e=y(()=>{"use strict";La();jh()});var Kh=y(()=>{"use strict";K()});var F1,ei,Gh=y(()=>{"use strict";_e();de();ne();Kh();K();st();F1=300*1e3,ei=class extends Error{constructor(e,n){super(`Background job cap reached (${e}/${n} running). Wait for existing jobs to finish or cancel them before spawning more.`),this.name="BackgroundJobCapError"}}});function qh(t){return typeof t=="string"&&t.startsWith("sk-ant-")}function Sr(t){let{childModel:e,resolved:n,parentApiKey:r}=t;return n!==void 0&&n.length>0||J(e)==="openai-compatible"?n:qh(r)?r:n}function zh(t){let{childModel:e,configApiKey:n,parentApiKey:r,parentProvider:o}=t;if(n!==void 0&&n.length>0)return n;if(r===void 0)return;let s=o??(qh(r)?"anthropic-direct":void 0);return s===void 0||J(e)===s?r:void 0}var ti=y(()=>{"use strict";Se()});import{isAbsolute as QP}from"node:path";function ZP(t){if(typeof t!="object"||t===null)throw new Error("Agent tool input must be an object");let e=t,n=e.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=e.model;if(o!==void 0){if(typeof o!="string")throw new Error("Agent tool model must be a string");r=o}let s=10,i=e.max_turns;if(i!==void 0){if(typeof i!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(i)))}let a="agent-tool",c=e.id_prefix;if(c!==void 0){if(typeof c!="string")throw new Error("Agent tool id_prefix must be a string");a=c}let l="foreground",d=e.mode;if(d!==void 0){if(d!=="foreground"&&d!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(d)}`);l=d}let u,p=e.cwd;if(p!==void 0){if(typeof p!="string")throw new Error(`Agent tool cwd must be a string, got: ${JSON.stringify(p)}`);if(p.length===0)throw new Error("Agent tool cwd must be a non-empty string");if(!QP(p))throw new Error(`Agent tool cwd must be an absolute path, got: ${JSON.stringify(p)}`);if(p.split(/[/\\]/).includes(".."))throw new Error(`Agent tool cwd must not contain '..' segments, got: ${JSON.stringify(p)}`);u=p}return{prompt:n,model:r,max_turns:s,id_prefix:a,mode:l,...u!==void 0?{cwd:u}:{}}}function ni(t){try{return re(t).catch(()=>{})}catch{return Promise.resolve()}}function In(t,e=240){return t.length<=e?t:t.slice(0,e)+"\u2026"}function Jh(t){if(t!=null){if(typeof t=="string")return t.length;try{return JSON.stringify(t).length}catch{return}}}function tI(t){if(t==null)return;let e=Jh(t);return e!==void 0&&e>eI?{truncated:!0,chars:e}:t}function nI(t){let e={status:t.status,error:In(t.errorMessage,Vh),subagent_id:t.subagentId};t.schemaErrorMessage&&(e.schemaError=In(t.schemaErrorMessage,Vh));let n=tI(t.partialOutput);return n!==void 0&&(e.partialOutput=n),e}var eI,Vh,Cn,ul=y(()=>{"use strict";le();Gh();Se();ti();pn();On();st();de();hn();yt();On();eI=4096,Vh=1024;Cn=class t{constructor(e){this.ctx=e;this.currentCwd=e.cwd}ctx;currentCwd;setCwd(e){this.currentCwd=e,this.ctx.subagentManager.setCwd(e)}promotionTriggers=new Map;activeForegroundHandles=new Map;hasPromotableForeground(){return this.ctx.backgroundRegistry!==void 0&&this.promotionTriggers.size>0}hasActiveForeground(){return this.activeForegroundHandles.size>0}async cancelActiveForeground(){let e=[...this.activeForegroundHandles.values()];return e.length===0?0:(await Promise.all(e.map(n=>n.cancel().catch(()=>{}))),e.length)}async promoteActiveForeground(){let e=[...this.promotionTriggers.values()];return e.forEach(r=>r.fire()),(await Promise.all(e.map(r=>r.ready))).filter(r=>r!==null)}getSubagentsLite(){let e=this.ctx.subagentManager.list().map(r=>({id:r.id,status:r.status})),n=this.ctx.backgroundRegistry?this.ctx.backgroundRegistry.list().map(r=>({jobId:r.jobId,status:r.status,startedAt:new Date(r.startedAt).toISOString(),label:r.label.length>0?r.label:null})):[];return{active:e,backgroundJobs:n}}async execute(e){if(e.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=ZP(e.input)}catch(S){return{content:`Agent tool input validation failed: ${S instanceof Error?S.message:String(S)}`,isError:!0}}let r=this.ctx.depth,o=this.ctx.maxDepth??Mn,s,i=this.ctx.surface!==void 0?{origin:ht(this.ctx.surface),actor:Ne(r)}:{},a=n.model??this.ctx.defaultSubagentModel??"sonnet",c=J(a)==="openai-compatible",l=Sr({childModel:a,resolved:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(a):nt(a),parentApiKey:this.ctx.defaultConfig.apiKey}),d={model:a,apiKey:c?void 0:l,systemPrompt:this.ctx.defaultConfig.systemPrompt,baseUrl:c?void 0:this.ctx.defaultConfig.baseUrl,maxTurns:n.max_turns,depth:r+1,maxDepth:o,...n.cwd!==void 0?{cwd:n.cwd}:{}},u;if(this.ctx.childProviderFactory&&r<o){s=new q({parentAbortSignal:e.signal,...this.currentCwd!==void 0?{cwd:this.currentCwd}:{}}),u=kr(e.signal);let S=new t({subagentManager:s,parentSession:u,defaultConfig:this.ctx.defaultConfig,...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{},defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,...this.ctx.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:this.ctx.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...this.ctx.allowedTools!==void 0?{allowedTools:this.ctx.allowedTools}:{},...this.ctx.readOnlyBash?{readOnlyBash:!0}:{}}),T=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,e.signal):void 0;d.provider=this.ctx.childProviderFactory({childExecutor:S,...T!==void 0?{childSkillExecutor:T}:{},...d.model!==void 0?{model:d.model}:{},...this.ctx.allowedTools!==void 0?{allowedTools:this.ctx.allowedTools}:{},...this.ctx.readOnlyBash?{readOnlyBash:!0}:{}})}let p;try{p=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,parentId:e.id,config:d,idPrefix:n.id_prefix,agentType:n.id_prefix&&n.id_prefix!=="agent-tool"?ot(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":ot(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:!0}),u!==void 0&&(u.sessionId=p.id)}catch(S){let T=S instanceof Error?S.message:String(S);return ni({...i,event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:In(T),depth:r}),{content:`Failed to fork subagent: ${T}`,isError:!0}}if(n.mode==="background"){let S=this.ctx.backgroundRegistry;if(!S)return await p.teardown().catch(O=>j("subagent-executor: handle teardown failed: "+(O instanceof Error?O.message:String(O)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let T;try{T=S.register({handle:p,prompt:n.prompt,model:d.model??"sonnet",parentSessionId:this.ctx.parentSession.sessionId})}catch(O){if(O instanceof ei)return await p.teardown().catch(R=>j("subagent-executor: handle teardown failed after cap error: "+(R instanceof Error?R.message:String(R)))),{content:O.message,isError:!0};throw O}let x={status:"running",jobId:T.jobId,subagentId:T.subagentId,label:T.label,message:`Background subagent started (jobId=${T.jobId}). It is running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${T.jobId} remains available for manual replay.`};return{content:JSON.stringify(x)}}let f=()=>{p.cancel()};e.signal.addEventListener("abort",f,{once:!0});let h=Date.now(),g=this.ctx.parentSession.sessionId,w=!1,b,E=new Promise(S=>{b=S}),A,v=new Promise(S=>{A=S});this.promotionTriggers.set(p.id,{fire:b,ready:v}),this.activeForegroundHandles.set(p.id,p);let _,I=p.runToResult(n.prompt);try{let S=await Promise.race([I.then(U=>({kind:"result",result:U})),E.then(()=>({kind:"promote"}))]);if(S.kind==="promote"){let U=this.ctx.backgroundRegistry;if(U)try{let B=U.adoptRunning({handle:p,runPromise:I,prompt:n.prompt,model:d.model??"sonnet",parentSessionId:g});return w=!0,e.signal.removeEventListener("abort",f),A({jobId:B.jobId,label:B.label}),{content:JSON.stringify({status:"running",jobId:B.jobId,subagentId:B.subagentId,label:B.label,message:`Subagent backgrounded by user (jobId=${B.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${B.jobId} remains available for manual replay.`})}}catch(B){j("subagent-executor: promotion failed, staying foreground: "+(B instanceof Error?B.message:String(B))),A(null)}else A(null)}let T=S.kind==="result"?S.result:await I;if(T.status==="succeeded"&&T.message){let U=T.message.content,B=typeof U=="string"?U:JSON.stringify(U),M=T.trace;return ni({...i,event:"subagent.completed",subagent_id:p.id,parent_session_id:g,status:T.status,duration_ms:Date.now()-h,content_chars:B.length,depth:r,tool_call_count:M?.toolCalls.length,thinking_present:M?.thinkingPresent,tool_names:M?.toolCalls.length?JSON.stringify([...new Set(M.toolCalls.map(P=>P.name))]):void 0}),_={content:B},_}let x=T.error?.message??"Subagent failed with no output",O=T.trace;ni({...i,event:"subagent.failed",subagent_id:p.id,id_prefix:n.id_prefix,parent_session_id:g,status:T.status,duration_ms:Date.now()-h,error_message:In(x),schema_error:T.schemaError?In(T.schemaError.message):void 0,partial_output_chars:Jh(T.partialOutput),depth:r,tool_call_count:O?.toolCalls.length,thinking_present:O?.thinkingPresent,tool_names:O?.toolCalls.length?JSON.stringify([...new Set(O.toolCalls.map(U=>U.name))]):void 0});let R=nI({status:T.status,errorMessage:x,schemaErrorMessage:T.schemaError?.message,partialOutput:T.partialOutput,subagentId:p.id});return _={content:JSON.stringify(R),isError:!0},_}catch(S){let T=S instanceof Error?S.message:String(S);throw ni({...i,event:"subagent.failed",subagent_id:p.id,id_prefix:n.id_prefix,parent_session_id:g,status:"failed",duration_ms:Date.now()-h,error_message:In(T),depth:r}),S}finally{if(this.promotionTriggers.delete(p.id),this.activeForegroundHandles.delete(p.id),A(null),!w){e.signal.removeEventListener("abort",f),await s?.teardownAll(),await p.teardown({deferInjectContextToCaller:!0});let S=p.getLastStopInjectContext?.();_!==void 0&&S!==void 0&&S.length>0&&(_.content=`${_.content}
1161
1161
 
1162
1162
  ${S}`)}}}}});function Yh(t,e){return`Skill tool not available at nesting depth ${t} (max ${e}). ${rI}`}var rI,Xh=y(()=>{"use strict";rI="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function Qh(t){return oI.has(t)}var oI,Zh=y(()=>{"use strict";oI=new Set});function ey(t){for(let e of sI)e(t)}function ty(t){for(let e of iI)e(t)}var sI,iI,ny=y(()=>{"use strict";sI=new Set,iI=new Set});function ry(t){return aI.has(t)}function lI(t,e=cI){return t.length<=e?t:t.slice(0,e)+"\u2026"}function dI(t){if(typeof t!="object"||t===null)return;let e=t.name;if(typeof e!="string")return;let n=e.trim();return n.length>0?n:void 0}function uI(t){if(typeof t!="object"||t===null)throw new Error("Skill tool input must be an object");let e=t,n=e.name;if(typeof n!="string"||n.trim().length===0)throw new Error('Skill tool input must have a non-empty "name" field');let r,o=e.arguments;if(o!==void 0){if(typeof o!="string")throw new Error('Skill tool "arguments" must be a string');r=o}return{name:n.trim(),arguments:r}}var aI,cI,Dn,fl=y(()=>{"use strict";Re();le();Qt();On();ul();Xh();ti();pn();Ht();xe();st();Zh();ny();de();yt();aI=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","intent-lock","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);cI=240;Dn=class{constructor(e){this.ctx=e;this.currentCwd=e.cwd}ctx;pluginBodies=null;currentCwd;setCwd(e){this.currentCwd=e}sessionIdentity(){return this.ctx.surface!==void 0?{origin:ht(this.ctx.surface),actor:Ne(this.ctx.depth)}:{}}async execute(e){if(e.signal.aborted)return{content:"Skill tool call aborted",isError:!0};let n=this.ctx.depth??0,r=this.ctx.maxDepth??Mn;if(n>=r){let c=dI(e.input);return re({...this.sessionIdentity(),event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:n,requested_name:c}).catch(()=>{}),{content:Yh(n,r),isError:!0}}let o;try{o=uI(e.input)}catch(c){return{content:`Skill tool input validation failed: ${c instanceof Error?c.message:String(c)}`,isError:!0}}try{let c=Oe(o.name);return await this.executeRegistrySkill(c,o.arguments,e)}catch{}let s=this.getPluginSkillBody(o.name);if(s){if(s.context==="fork"){let l=s.readOnly===!0||pl.has(o.name);return await this.executePluginSkill(o.name,s.body,s.pluginPath,o.arguments,e,l,s.allowedTools)}let c=s.body.replace(/\$\{?PLUGIN_ROOT\}?/g,()=>s.pluginPath);return this.executeLoadedPluginSkill(o.name,c,o.arguments,e)}let a=_r(this.ctx.pluginConfigs).map(c=>c.name).join(", ");return{content:`Skill "${o.name}" not found. Available skills: ${a||"(none)"}`,isError:!0}}async executeRegistrySkill(e,n,r){if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};if(e.context==="fork")return this.executeForkedRegistrySkill(e,n,r);if(e.context==="load")return this.executeLoadedRegistrySkill(e,n,r);let o=Qh(e.name);o&&ty(e.name);let s=this.ctx.depth??0;re({...this.sessionIdentity(),event:"skill.dispatched",requested_name:e.name,parent_session_id:this.ctx.parentSession.sessionId,depth:s,...ry(e.name)?{is_gate:!0}:{},...e.model!==void 0?{model:e.model}:{}}).catch(()=>{});let i=Date.now(),a,c;try{c=await e.handler(n&&n.length>0?n:void 0,this.ctx.parentSession,{apiKey:this.ctx.apiKey,defaultModel:this.ctx.defaultModel,defaultSubagentModel:this.ctx.defaultSubagentModel,callId:r.id,dispatchSkill:this.createDispatchSkillCallback(r),...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{}})}catch(d){a=d}finally{let d=Date.now()-i;o&&ey({skillName:e.name,durationMs:d,...a!==void 0?{isError:!0}:{}});let u=a!==void 0?a instanceof Error?a.message:String(a):void 0,p=a===void 0?typeof c=="string"?c.length:c!=null?JSON.stringify(c).length:0:void 0;re({...this.sessionIdentity(),event:"skill.completed",requested_name:e.name,parent_session_id:this.ctx.parentSession.sessionId,status:a!==void 0?"failed":"succeeded",duration_ms:d,depth:s,...p!==void 0?{content_chars:p}:{},...u!==void 0?{error_message:lI(u)}:{},...e.model!==void 0?{model:e.model}:{}}).catch(()=>{})}return a!==void 0?{content:`Skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}:{content:typeof c=="string"?c:c!=null?JSON.stringify(c):"Skill completed successfully."}}buildForkedChildConfig(e,n,r=!1,o){let s=this.ctx.depth??0,i=this.ctx.maxDepth??Mn,a={...e},c=r&&o!==void 0?o.filter(f=>ri.includes(f)):r?[...ri]:o,l=r;if(!this.ctx.childProviderFactory||s>=i)return r?a.provider=oy(a.model):c!==void 0&&(a.provider=sy(c,a.model)),{childConfig:a,childManager:void 0};let d=new q({parentAbortSignal:n,...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},...this.currentCwd!==void 0?{cwd:this.currentCwd}:{}}),u=new Cn({subagentManager:d,parentSession:kr(n),defaultConfig:{model:a.model,apiKey:this.ctx.apiKey,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{}},...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{},defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,...this.ctx.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:this.ctx.resolveApiKeyForModel}:{},depth:s+1,maxDepth:i,...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...this.ctx.backgroundRegistry!==void 0?{backgroundRegistry:this.ctx.backgroundRegistry}:{},...c!==void 0?{allowedTools:c}:{},...l?{readOnlyBash:!0}:{}}),p=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(s+1,i,n):void 0;return a.provider=this.ctx.childProviderFactory({childExecutor:u,...p!==void 0?{childSkillExecutor:p}:{},...a.model!==void 0?{model:a.model}:{},...c!==void 0?{allowedTools:c}:{},...l?{readOnlyBash:!0}:{}}),{childConfig:a,childManager:d}}async executeForkedRegistrySkill(e,n,r){if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};let o=e.readOnly===!0||pl.has(e.name),s;try{if(s=ee(e.name)["system.md"],!s)return{content:`Skill "${e.name}" has context: "fork" but no prompts/system.md found`,isError:!0}}catch(f){return{content:`Failed to load skill prompts: ${f instanceof Error?f.message:String(f)}`,isError:!0}}let i=e.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",a=Sr({childModel:i,resolved:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(i):nt(i),parentApiKey:this.ctx.apiKey}),c=new q({parentAbortSignal:r.signal,apiKey:a,parentModel:i,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},progressSink:Pe(),...this.currentCwd!==void 0?{cwd:this.currentCwd}:{}}),{childConfig:l,childManager:d}=this.buildForkedChildConfig({model:i,systemPrompt:s,isSkillDispatch:!0,...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{}},r.signal,o),u,p;try{u=await c.forkSubagent({parent:this.ctx.parentSession,config:l,idPrefix:`skill-fork-${e.name}`,parentId:r.id,agentType:e.name});let f=n&&n.length>0?n:`Run the ${e.name} skill now, following the instructions in your system prompt.`,h=await u.runToResult(f);return h.status==="succeeded"&&h.message?(p={content:h.message.content},p):h.status==="cancelled"&&typeof h.partialOutput=="string"&&h.partialOutput.length>0?(p={content:`[skill cancelled mid-flight \u2014 partial output preserved below]
1163
1163
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.19.0",
3
+ "version": "5.19.1",
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",