agent-afk 5.169.1 → 5.169.3

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/cli.mjs CHANGED
@@ -75,8 +75,8 @@ ${r}
75
75
  ### end \xB7 ${t.reason??"unknown"} \xB7 ${n}
76
76
  `}function xN(e){if(!Iue(e))return null;let t=wx(e.sessionId),n=Cue(t,`${Pue(e.subagentId)}.md`),r=[],o=0,i=!1,s=!1,a=!1,l=Promise.resolve(),c=d=>{if(i)return;o>=EN&&(i=!0,d=`
77
77
  <!-- CAP REACHED at ${EN} bytes \u2014 capture stopped -->
78
- `),o+=Buffer.byteLength(d,"utf8");let p=s?d:`${Mue(e)}${d}`;s=!0,l=l.then(async()=>{await Aue(t,{recursive:!0,mode:448}),await xue(n,p,{encoding:"utf8",mode:384})}).catch(f=>{Tt("subagent-output-capture",e.sessionId??"unknown","write",f)})},u=()=>{if(r.length===0)return;let d=r.join("").trim();r=[],d.length>0&&(c(Qh("say",{text:d})),a=!0)};return{observe(d){try{if(d.type==="chunk"){let p=d.chunk;if(p.type==="content"){r.push(p.content);return}if(p.type==="tool_use_detail"){if(p.pending)return;u(),c(Qh("tool",{toolName:p.toolName,toolInput:p.toolInputCapture??p.toolInputRaw??p.toolInput}))}return}if(d.type==="message"){if(!a&&r.length===0){let p=d.message.content.trim();p.length>0&&(c(Qh("say",{text:p})),a=!0)}return}(d.type==="done"||d.type==="error")&&(u(),a=!1)}catch(p){Tt("subagent-output-capture",e.sessionId??"unknown","observe",p)}},end(d){try{u(),c(Qh("end",{reason:d}))}catch(p){Tt("subagent-output-capture",e.sessionId??"unknown","end",p)}}}}var TN,EN,_ue,AN=y(()=>{"use strict";L();U();Yh();ui();Vx();TN=4*1024,EN=512*1024,_ue="<!-- Best-effort secret redaction only. Connection strings, PEM blocks, and PII are NOT caught. -->"});var Zh,CN=y(()=>{"use strict";Zh=class{subscribers=new Set;closed=!1;push(t){for(let n of this.subscribers)if(n.resolve){let r=n.resolve;n.resolve=null,r({value:t,done:!1})}else n.buffer.push(t)}close(){this.closed=!0;for(let t of this.subscribers)if(t.resolve){let n=t.resolve;t.resolve=null,n({value:void 0,done:!0})}}subscribe(){let t={buffer:[],resolve:null};this.subscribers.add(t);let n=this,r={next(){return t.buffer.length>0?Promise.resolve({value:t.buffer.shift(),done:!1}):n.closed?(n.subscribers.delete(t),Promise.resolve({value:void 0,done:!0})):new Promise(o=>{t.resolve=o})},return(){if(t.resolve){let o=t.resolve;t.resolve=null,o({value:void 0,done:!0})}return n.subscribers.delete(t),Promise.resolve({value:void 0,done:!0})}};return{[Symbol.asyncIterator]:()=>r}}}});async function Us(e,t){if(e)try{await e.write({kind:"tool_call",payload:t})}catch(n){Tt("trace.emit",e,"tool_call",n)}}async function Nn(e,t){if(e)try{await e.write({kind:"hook_decision",payload:t})}catch(n){Tt("trace.emit",e,"hook_decision",n)}}async function js(e,t){if(e)try{await e.write({kind:"subagent_lifecycle",payload:t})}catch(n){Tt("trace.emit",e,"subagent_lifecycle",n)}}async function Hs(e,t){if(e)try{await e.write({kind:"background_agent",payload:t})}catch(n){Tt("trace.emit",e,"background_agent",n)}}async function _N(e,t){if(e)try{await e.write({kind:"budget",payload:t})}catch(n){Tt("trace.emit",e,"budget",n)}}async function IN(e,t){if(e)try{await e.write({kind:"abort",payload:t})}catch(n){Tt("trace.emit",e,"abort",n)}}async function ey(e,t){if(e)try{await e.write({kind:"compaction",payload:t})}catch(n){Tt("trace.emit",e,"compaction",n)}}async function PN(e,t){if(e)try{await e.write({kind:"closure",payload:t})}catch(n){Tt("trace.emit",e,"closure",n)}}async function Et(e,t){if(e)try{await e.write({kind:"browser_event",payload:t})}catch(n){Tt("trace.emit",e,"browser_event",n)}}async function MN(e,t){if(e)try{await e.write({kind:"queued_user_message",payload:t})}catch(n){Tt("trace.emit",e,"queued_user_message",n)}}async function re(e,t){if(e)try{await e.write({kind:"session_phase",payload:t})}catch(n){Tt("trace.emit",e,"session_phase",n)}}var pe=y(()=>{"use strict";Yh()});function ON(e){let t=[...e.oauthEntries??[],...e.effort?[e.effortEntry]:[],...e.extendedCacheTtl?[e.extendedCacheEntry]:[],...e.fast?[Oue]:[]].filter(Boolean);return[...new Set(t)].join(",")||void 0}var Oue,DN=y(()=>{"use strict";Oue="fast-mode-2026-02-01"});function ty(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function Tp(e,t,n,r){let o=t==="oauth"?{authToken:e}:{apiKey:e},i=typeof n=="string"&&n.length>0?{...o,baseURL:n}:o;return r?{...i,fetch:r}:i}function di(e,t,n,r,o,i){let s=ON({oauthEntries:e==="oauth"?Due.split(","):[],effort:e==="oauth"&&r===!0,extendedCacheTtl:o,fast:i,effortEntry:$ue,extendedCacheEntry:$N});return e!=="oauth"?s?{"anthropic-beta":s}:{}:{"anthropic-beta":s,"x-app":"cli","User-Agent":Lue,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function LN(e){return e!=="oauth"?null:[{type:"text",text:Fue}]}var $N,Due,$ue,Lue,Fue,Ws=y(()=>{"use strict";DN();$N="extended-cache-ttl-2025-04-11",Due=`claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,${$N}`,$ue="effort-2025-11-24",Lue="claude-cli/1.0.0 (external, cli)",Fue="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;"});function ry(e){Xx=e}function Yx(e){if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0}function ny(e,t,n){let r={},o=Yx(e);o&&(r.id=o);let i=Yx(t);i&&(r.baseUrl=i);let s=Yx(n);return s&&(r.apiKey=s),r}function Uue(){return{local:ny(v.AFK_MODEL_LOCAL,v.AFK_MODEL_LOCAL_BASE_URL,v.AFK_MODEL_LOCAL_API_KEY),small:ny(v.AFK_MODEL_SMALL,v.AFK_MODEL_SMALL_BASE_URL,v.AFK_MODEL_SMALL_API_KEY),medium:ny(v.AFK_MODEL_MEDIUM,v.AFK_MODEL_MEDIUM_BASE_URL,v.AFK_MODEL_MEDIUM_API_KEY),large:ny(v.AFK_MODEL_LARGE,v.AFK_MODEL_LARGE_BASE_URL,v.AFK_MODEL_LARGE_API_KEY)}}function eA(e){let t=Uue(),n={};for(let r of Rp){let o=Ks[r],i=e?.[r],s=t[r],a={id:s.id??i?.id??o.id},l=i?.name;l&&(a.name=l);let c=i?.provider;c&&(a.provider=c);let u=s.baseUrl??i?.baseUrl;u&&(a.baseUrl=u);let d=s.apiKey??i?.apiKey;d&&(a.apiKey=d),n[r]=a}return n}function pi(e){return e||Xx||eA()}function mi(e,t=pi()){let n=e.trim().toLowerCase();if(!(!n||n===BN)){for(let r of Rp){let o=t[r].name;if(o&&o.trim().toLowerCase()===n)return r}if(n==="local"||n==="small"||n==="medium"||n==="large")return n}}function Gs(e,t=pi()){if(e===void 0)return{id:""};let n=mi(e,t);if(n)return t[n];let r=Zx[e.trim().toLowerCase()];return r?{id:r}:{id:e}}function Br(e,t=pi()){if(e!==void 0)return Gs(e,t).id}function ec(e,t=pi()){if(e===void 0)return;let n=mi(e,t);if(n&&t[n].id.trim()===""){let r=n.toUpperCase();return`The "${n}" model tier is not configured (no model id). Set AFK_MODEL_${r}=<id> (optionally AFK_MODEL_${r}_BASE_URL / AFK_MODEL_${r}_API_KEY) or "models.${n}" in afk.config.json, then retry.`}}function UN(e){let t={};if(!e||typeof e!="object")return t;let n=e;for(let r of Rp){let o=Hue(n[r]);o&&(t[r]=o)}return t}function jN(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="anthropic"||t==="anthropic-direct")return"anthropic";if(t==="openai"||t==="openai-compatible")return"openai";if(t==="chatgpt-oauth"||t==="chatgpt")return"chatgpt-oauth";if(t==="xai")return"xai";if(t==="xai-oauth"||t==="xai_oauth")return"xai-oauth"}function Ql(e){return typeof e=="string"?e.trim():""}function FN(e){return/[\x00-\x1f\x7f]/.test(e)}function Hue(e){if(typeof e=="string"){let t=e.trim();return t?{id:t}:void 0}if(e&&typeof e=="object"){let t=e,n=Ql(t.id);if(!n)return;let r={id:n},o=Ql(t.name);o&&(r.name=o);let i=jN(t.provider);i&&(r.provider=i);let s=Ql(t.baseUrl);s&&(r.baseUrl=s);let a=Ql(t.apiKey);return a&&(r.apiKey=a),r}}function HN(e){if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,error:'model binding must be an object with at least an "id"'};let t=e;if("apiKey"in t||"api_key"in t)return{ok:!1,error:"per-slot API keys are credentials; set AFK_MODEL_<TIER>_API_KEY via `afk config env set` instead of afk.config.json"};if("baseUrl"in t||"base_url"in t)return{ok:!1,error:"per-slot baseUrl is an endpoint-redirect credential vector; set AFK_MODEL_<TIER>_BASE_URL via `afk config env set` instead of afk.config.json"};let n=Ql(t.id);if(!n)return{ok:!1,error:'model binding requires a non-empty "id"'};if(FN(n))return{ok:!1,error:'model binding "id" must not contain control characters'};let r={id:n},o=Ql(t.name);if(o){if(FN(o))return{ok:!1,error:'model binding "name" must not contain control characters'};if(jue.has(o.trim().toLowerCase()))return{ok:!1,error:`model binding "name" must not shadow a built-in alias ("${o}")`};r.name=o}if(t.provider!==void 0&&t.provider!==""){let i=jN(t.provider);if(!i)return{ok:!1,error:'model binding "provider" must be one of: anthropic, openai (aliases: anthropic-direct, openai-compatible)'};r.provider=i}return{ok:!0,value:r}}var Rp,NN,Ep,Jx,Qx,Nue,Ks,BN,Zx,Bue,Zl,Xx,jue,Rt=y(()=>{"use strict";L();Rp=["local","small","medium","large"],NN="claude-haiku-4-5-20251001",Ep="claude-sonnet-4-6",Jx="claude-opus-5",Qx="claude-fable-5",Nue="grok-4.6",Ks={local:{id:""},small:{id:NN},medium:{id:Ep},large:{id:Jx}},BN="auto",Zx={opus:Jx,opus_1m:Jx,sonnet:Ep,sonnet_1m:Ep,haiku:NN,fable:Qx,grok:Nue},Bue=["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5"],Zl=[...Rp,...Object.keys(Zx),...Bue];jue=new Set([...Rp,BN,...Object.keys(Zx)])});function xp(e){return e in tA}function Dt(e){return Br(e)}var tA,Bn=y(()=>{"use strict";Rt();tA={opus:Ks.large.id,opus_1m:Ks.large.id,sonnet:Ks.medium.id,sonnet_1m:Ks.medium.id,haiku:Ks.small.id,fable:Qx}});import Wue from"@anthropic-ai/sdk";import{randomUUID as WN}from"node:crypto";async function tc(e){let{token:t,model:n,system:r,user:o,maxTokens:i=64,signal:s,clientFactory:a}=e;if(!t)throw new Error("oneShotCompletion: token required");let l=ty(t),c=Tp(t,l),u=a?a(c):new Wue(c),d=WN(),p=WN(),f=di(l,d,p),g=Dt(n)??n,h={};Object.keys(f).length>0&&(h.headers=f),s&&(h.signal=s);let b=await u.messages.create({model:g,max_tokens:i,system:r,messages:[{role:"user",content:o}]},Object.keys(h).length>0?h:void 0),w=[];for(let k of b.content)k.type==="text"&&w.push(k.text);let S=w.join("").trim();return S.length===0&&console.warn("oneShotCompletion: response contained no text blocks \u2014 returning empty string"),S}var oy=y(()=>{"use strict";Ws();Bn()});function que(){let e=v.AFK_VISION_MODELS,t=[],n=[];if(e)for(let r of e.split(",")){let o=r.trim().toLowerCase();if(o)if(o.startsWith("!")){let i=o.slice(1).trim();i&&n.push(i)}else t.push(o)}return{enable:t,disable:n}}function KN(e,t){return e===t||e.includes(t)}function iy(e){if(!e)return!1;let t=(Br(e)??e).trim();if(!t)return!1;let n=t.toLowerCase(),{enable:r,disable:o}=que();return o.some(i=>KN(n,i))?!1:r.some(i=>KN(n,i))||Kue.has(n)?!0:Gue.some(i=>i.test(t))}function GN(e){let t=e.trim().toLowerCase();return t.includes("/")?t.slice(t.lastIndexOf("/")+1):t}function qs(e){return e?/^o[0-9]/.test(GN(e)):!1}function Ap(e){if(!e)return!1;if(qs(e))return!0;let t=GN(e);return zue.some(n=>n.test(t))}var Kue,Gue,zue,zs=y(()=>{"use strict";L();Rt();Kue=new Set(["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4-turbo","o1","o3","o4-mini"]),Gue=[/^claude-/i,/^gpt-4o/i,/^gpt-4\.1/i,/^gpt-4-turbo/i,/^gpt-4-vision/i,/^gpt-5/i,/(?:^|[/_-])(?:vl|vlm)(?:[/_.-]|$)/i,/(?:^|[/_-])(?:llava|pixtral|internvl|cogvlm|idefics|moondream|janus)/i,/(?:vision|minicpm-?[vo]|qwen[\d.]*-?vl|llama-?3\.2-\d+b-vision|gemma-3|phi-3\.5-vision|phi-4-multimodal)/i];zue=[/^gpt-5/]});function nA(e){let t=String(e).trim().toLowerCase(),n=sy[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Br(e)??String(e);return sy[r]??sy[r.toLowerCase()]}function Vs(e){return nA(e)??Vue}function Xue(e){if(!e)return!1;let t=e.trim().toLowerCase();return t?!!(t.includes("/")||t.startsWith("gpt-")||t.startsWith("gpt_")||qs(t)||t.startsWith("codex-")||t.startsWith("codex_")||t==="codex"||t==="grok"||t.startsWith("grok-")||t.startsWith("grok_")):!1}function it(e){let t=String(e).trim().toLowerCase(),n=nc[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Br(e)??String(e),o=nc[r]??nc[r.toLowerCase()];return o!==void 0?o:Xue(r)?Jue:Yue}function vo(e){let t=it(e);if(String(e).trim().toLowerCase().endsWith("_1m"))return t;let r=Br(e)??String(e),o=qN[r]??qN[r.toLowerCase()];return o!==void 0?Math.min(t,o):t}var sy,Vue,nc,Yue,Jue,qN,lr=y(()=>{"use strict";Rt();zs();sy={opus:128e3,opus_1m:128e3,sonnet:128e3,sonnet_1m:128e3,haiku:64e3,fable:128e3,"claude-opus-5":128e3,"claude-opus-4-8":128e3,"claude-opus-4-7":128e3,"claude-opus-4-6":128e3,"claude-sonnet-5":128e3,"claude-sonnet-4-6":128e3,"claude-haiku-4-5-20251001":64e3,"claude-fable-5":128e3,"gpt-5.5":128e3,"gpt-5.6":128e3,"gpt-5.6-sol":128e3,"gpt-5.6-terra":128e3,"gpt-5.6-luna":128e3},Vue=64e3;nc={opus:1e6,opus_1m:1e6,sonnet:1e6,sonnet_1m:1e6,haiku:2e5,fable:1e6,"claude-fable-5":1e6,"claude-sonnet-5":1e6,"claude-opus-5":1e6,"claude-opus-4-8":1e6,"claude-opus-4-7":1e6,"claude-opus-4-6":1e6,"claude-sonnet-4-6":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"gpt-4.1":1e6,"gpt-4.1-mini":1e6,"gpt-5.5":1e6,"gpt-5.6":1e6,"gpt-5.6-sol":1e6,"gpt-5.6-terra":1e6,"gpt-5.6-luna":1e6,o1:2e5,"o1-mini":128e3,o3:2e5,"o3-mini":2e5,"o4-mini":2e5,"mlx-community/qwen3-30b-a3b-4bit":128e3,"mlx-community/qwen3-32b-4bit":128e3,"mlx-community/qwen2.5-coder-32b-instruct-4bit":131072,"grok-4.6":5e5,"grok-4.5":5e5,"grok-4.3":1e6,"grok-4.20-0309-reasoning":1e6,"grok-4.20-0309-non-reasoning":1e6,"grok-4.20-multi-agent-0309":1e6,"grok-build-0.1":256e3},Yue=2e5,Jue=262144;qN={"claude-sonnet-5":2e5,"claude-opus-5":2e5,"claude-sonnet-4-6":2e5,"claude-opus-4-8":2e5,"claude-opus-4-7":2e5,"claude-opus-4-6":2e5}});function zN(e){return(e.inputTokens??0)+(e.outputTokens??0)}function $t(e){return e.contextWindowTokens??zN(e)}function Cp(e){return e?{totalTokens:$t(e),apiUsage:{input_tokens:e.inputTokens??0,output_tokens:e.outputTokens??0,cache_read_input_tokens:e.cachedInputTokens??0,cache_creation_input_tokens:e.cacheCreationTokens??0,context_window_tokens:$t(e)}}:{totalTokens:0,apiUsage:null}}function _p(e,t,n){return t<=0||e<=0||n<=0||n>=1?!1:e/t>=n}function Ip(e,t){return t<=0||e<=0?0:e/t}function VN(e){let t=it(e),n=vo(e),r=Vs(e);if(t<=0||r<=0||n<t)return ay;let o=(t-r)/t-Que;return o>0?o:ay}function Pp(e,t,n,r){if(e<=0||n<=0||t<=0)return;let o=e+t;if(!(o<=n))throw new Error(`[afk] Context-window overflow: the conversation already used ~${e.toLocaleString()} tokens (last-turn API count) and the configured output ceiling is ${t.toLocaleString()} tokens \u2014 together they exceed the ${r} context window of ${n.toLocaleString()} tokens by ${(o-n).toLocaleString()} tokens. The provider would reject this request with HTTP 400. To continue: run /compact to summarise the conversation history, or start a new session.`)}function Mp(e,t){if(e===void 0||e===!1)return;let n=t!==void 0?VN(t):1;if(e===!0)return Math.min(ay,n);let r=e.threshold;if(!(typeof r!="number"||!Number.isFinite(r)||r<=0||r>=1))return Math.min(r,n)}var ay,Que,rc=y(()=>{"use strict";lr();ay=.9,Que=.04});function JN(e){if(e!==void 0&&!(!Number.isFinite(e)||e<0)){if(e>ly){let t=`temp:${e}`;return YN.has(t)||(YN.add(t),console.warn(`[afk] temperature ${e} exceeds the Anthropic maximum (${ly}); clamping to ${ly}.`)),ly}return e}}function uy(e,t){let n=Vs(t),r=e.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let i=`max:${t}:${o}`;return cy.has(i)||(cy.add(i),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${t} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function XN(e){if(!e||e.length===0)return;let t=[];for(let n of e)n.user.length>0&&t.push({role:"user",content:n.user}),n.assistant.length>0&&t.push({role:"assistant",content:n.assistant});return t.length>0?t:void 0}function dy(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&ede(n))return{type:"adaptive",display:"summarized"};if(t<=1024)throw new Error(`[afk] Extended thinking requires max_tokens > 1024 (the API constraint is 1024 <= budget_tokens < max_tokens), but the resolved output cap is ${t}. Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS above 1024, or disable thinking with --thinking disabled.`);let r=Math.floor(t*tde),o=Math.max(1024,t-1-r),i=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.floor(e.budgetTokens):void 0,s=Math.min(Math.max(i??o,1024),o);if(i!==void 0&&i>o){let a=`think:${n??"default"}:${i}:${t}`;cy.has(a)||(cy.add(a),console.warn(`[afk] thinking budgetTokens ${i} leaves too little of max_tokens ${t} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:s,display:"summarized"}}}}function py(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-(4-[678]|5)/.test(n))return"max"}var Zue,ede,cy,YN,ly,tde,my=y(()=>{"use strict";lr();rc();Zue=e=>/opus-4-(7|[89])/.test(e),ede=e=>Zue(e)||/(claude-)?(opus|sonnet)-5/.test(e),cy=new Set,YN=new Set,ly=1;tde=.25});import rA from"path";import{dirname as nde}from"path";import{appendFileSync as rde,mkdirSync as ode}from"fs";var fi,fy=y(()=>{"use strict";U();fi=class{hooks;constructor(t){this.hooks=t}addReadRoot(t,n="slash",r){this.hooks.ensureInitialized?.();let o=this.hooks.getReadRoots();if(!o)return;let i=rA.resolve(t);o.includes(i)||(o.push(i),this.appendAuditLog({action:"grant-read",path:i,source:n,sessionId:r}))}addWriteRoot(t,n="slash",r){this.hooks.ensureInitialized?.();let o=this.hooks.getReadRoots(),i=this.hooks.getWriteRoots();if(!o||!i)return;let s=rA.resolve(t);o.includes(s)||o.push(s),i.includes(s)||(i.push(s),this.appendAuditLog({action:"grant-write",path:s,source:n,sessionId:r}))}revokeRoot(t,n="slash",r){let o=this.hooks.getReadRoots();if(!o)return;let i=rA.resolve(t),s=this.hooks.getProtectedRoot();if(s!==void 0&&i===s)return;let a=o.indexOf(i);a!==-1&&o.splice(a,1);let l=this.hooks.getWriteRoots();if(l){let c=l.indexOf(i);c!==-1&&l.splice(c,1)}this.appendAuditLog({action:"revoke",path:i,source:n,sessionId:r})}getGrants(){return{resolveBase:this.hooks.getProtectedRoot(),readRoots:this.hooks.getReadRoots()?.slice()??[],writeRoots:this.hooks.getWriteRoots()?.slice()??[],allowAll:this.hooks.getAllowAll()}}appendAuditLog(t){try{let n=ap();ode(nde(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??this.hooks.getDefaultSessionId?.()??null,action:t.action,path:t.path,source:t.source});rde(n,r+`
79
- `)}catch{}}}});function cr(e){return e==="bypassPermissions"||e==="autonomous"}var oc=y(()=>{"use strict"});var gy,QN=y(()=>{"use strict";fy();oc();gy=class{_readRoots;_writeRoots;_initialResolveBase;_currentCwd;_permissionMode="default";manager=new fi({getReadRoots:()=>this._readRoots,getWriteRoots:()=>this._writeRoots,ensureInitialized:()=>this.ensureInitialized(),getProtectedRoot:()=>this._initialResolveBase,getAllowAll:()=>cr(this._permissionMode)});get readRoots(){return this._readRoots}get writeRoots(){return this._writeRoots}get currentCwd(){return this._currentCwd}set currentCwd(t){this._currentCwd=t}get permissionMode(){return this._permissionMode}set permissionMode(t){this._permissionMode=t}ensureInitialized(t){if(!this._readRoots){let n=t?[t]:[];this._readRoots=n.slice(),this._writeRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t),t&&!this._currentCwd&&(this._currentCwd=t)}}}});import ide from"better-sqlite3";function ade(e){let t=[...new Set(e.toLowerCase().split(/\W+/).filter(n=>n.length>=3))].slice(0,25);return t.length===0?"":t.map(n=>`"${n}"`).join(" OR ")}var sde,ko,Op=y(()=>{"use strict";sde=`
78
+ `),o+=Buffer.byteLength(d,"utf8");let p=s?d:`${Mue(e)}${d}`;s=!0,l=l.then(async()=>{await Aue(t,{recursive:!0,mode:448}),await xue(n,p,{encoding:"utf8",mode:384})}).catch(f=>{Tt("subagent-output-capture",e.sessionId??"unknown","write",f)})},u=()=>{if(r.length===0)return;let d=r.join("").trim();r=[],d.length>0&&(c(Qh("say",{text:d})),a=!0)};return{observe(d){try{if(d.type==="chunk"){let p=d.chunk;if(p.type==="content"){r.push(p.content);return}if(p.type==="tool_use_detail"){if(p.pending)return;u(),c(Qh("tool",{toolName:p.toolName,toolInput:p.toolInputCapture??p.toolInputRaw??p.toolInput}))}return}if(d.type==="message"){if(!a&&r.length===0){let p=d.message.content.trim();p.length>0&&(c(Qh("say",{text:p})),a=!0)}return}(d.type==="done"||d.type==="error")&&(u(),a=!1)}catch(p){Tt("subagent-output-capture",e.sessionId??"unknown","observe",p)}},end(d){try{u(),c(Qh("end",{reason:d}))}catch(p){Tt("subagent-output-capture",e.sessionId??"unknown","end",p)}}}}var TN,EN,_ue,AN=y(()=>{"use strict";L();U();Yh();ui();Vx();TN=4*1024,EN=512*1024,_ue="<!-- Best-effort secret redaction only. Connection strings, PEM blocks, and PII are NOT caught. -->"});var Zh,CN=y(()=>{"use strict";Zh=class{subscribers=new Set;closed=!1;push(t){for(let n of this.subscribers)if(n.resolve){let r=n.resolve;n.resolve=null,r({value:t,done:!1})}else n.buffer.push(t)}close(){this.closed=!0;for(let t of this.subscribers)if(t.resolve){let n=t.resolve;t.resolve=null,n({value:void 0,done:!0})}}subscribe(){let t={buffer:[],resolve:null};this.subscribers.add(t);let n=this,r={next(){return t.buffer.length>0?Promise.resolve({value:t.buffer.shift(),done:!1}):n.closed?(n.subscribers.delete(t),Promise.resolve({value:void 0,done:!0})):new Promise(o=>{t.resolve=o})},return(){if(t.resolve){let o=t.resolve;t.resolve=null,o({value:void 0,done:!0})}return n.subscribers.delete(t),Promise.resolve({value:void 0,done:!0})}};return{[Symbol.asyncIterator]:()=>r}}}});async function Us(e,t){if(e)try{await e.write({kind:"tool_call",payload:t})}catch(n){Tt("trace.emit",e,"tool_call",n)}}async function Nn(e,t){if(e)try{await e.write({kind:"hook_decision",payload:t})}catch(n){Tt("trace.emit",e,"hook_decision",n)}}async function js(e,t){if(e)try{await e.write({kind:"subagent_lifecycle",payload:t})}catch(n){Tt("trace.emit",e,"subagent_lifecycle",n)}}async function Hs(e,t){if(e)try{await e.write({kind:"background_agent",payload:t})}catch(n){Tt("trace.emit",e,"background_agent",n)}}async function _N(e,t){if(e)try{await e.write({kind:"budget",payload:t})}catch(n){Tt("trace.emit",e,"budget",n)}}async function IN(e,t){if(e)try{await e.write({kind:"abort",payload:t})}catch(n){Tt("trace.emit",e,"abort",n)}}async function ey(e,t){if(e)try{await e.write({kind:"compaction",payload:t})}catch(n){Tt("trace.emit",e,"compaction",n)}}async function PN(e,t){if(e)try{await e.write({kind:"closure",payload:t})}catch(n){Tt("trace.emit",e,"closure",n)}}async function Et(e,t){if(e)try{await e.write({kind:"browser_event",payload:t})}catch(n){Tt("trace.emit",e,"browser_event",n)}}async function MN(e,t){if(e)try{await e.write({kind:"queued_user_message",payload:t})}catch(n){Tt("trace.emit",e,"queued_user_message",n)}}async function re(e,t){if(e)try{await e.write({kind:"session_phase",payload:t})}catch(n){Tt("trace.emit",e,"session_phase",n)}}var pe=y(()=>{"use strict";Yh()});function ON(e){let t=[...e.oauthEntries??[],...e.effort?[e.effortEntry]:[],...e.extendedCacheTtl?[e.extendedCacheEntry]:[],...e.fast?[Oue]:[]].filter(Boolean);return[...new Set(t)].join(",")||void 0}var Oue,DN=y(()=>{"use strict";Oue="fast-mode-2026-02-01"});function ty(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function Tp(e,t,n,r){let o=t==="oauth"?{authToken:e}:{apiKey:e},i=typeof n=="string"&&n.length>0?{...o,baseURL:n}:o;return r?{...i,fetch:r}:i}function di(e,t,n,r,o,i){let s=ON({oauthEntries:e==="oauth"?Due.split(","):[],effort:e==="oauth"&&r===!0,extendedCacheTtl:o,fast:i,effortEntry:$ue,extendedCacheEntry:$N});return e!=="oauth"?s?{"anthropic-beta":s}:{}:{"anthropic-beta":s,"x-app":"cli","User-Agent":Lue,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function LN(e){return e!=="oauth"?null:[{type:"text",text:Fue}]}var $N,Due,$ue,Lue,Fue,Ws=y(()=>{"use strict";DN();$N="extended-cache-ttl-2025-04-11",Due=`claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,${$N}`,$ue="effort-2025-11-24",Lue="claude-cli/1.0.0 (external, cli)",Fue="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;"});function ry(e){Xx=e}function Yx(e){if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0}function ny(e,t,n){let r={},o=Yx(e);o&&(r.id=o);let i=Yx(t);i&&(r.baseUrl=i);let s=Yx(n);return s&&(r.apiKey=s),r}function Uue(){return{local:ny(v.AFK_MODEL_LOCAL,v.AFK_MODEL_LOCAL_BASE_URL,v.AFK_MODEL_LOCAL_API_KEY),small:ny(v.AFK_MODEL_SMALL,v.AFK_MODEL_SMALL_BASE_URL,v.AFK_MODEL_SMALL_API_KEY),medium:ny(v.AFK_MODEL_MEDIUM,v.AFK_MODEL_MEDIUM_BASE_URL,v.AFK_MODEL_MEDIUM_API_KEY),large:ny(v.AFK_MODEL_LARGE,v.AFK_MODEL_LARGE_BASE_URL,v.AFK_MODEL_LARGE_API_KEY)}}function eA(e){let t=Uue(),n={};for(let r of Rp){let o=Ks[r],i=e?.[r],s=t[r],a={id:s.id??i?.id??o.id},l=i?.name;l&&(a.name=l);let c=i?.provider;c&&(a.provider=c);let u=s.baseUrl??i?.baseUrl;u&&(a.baseUrl=u);let d=s.apiKey??i?.apiKey;d&&(a.apiKey=d),n[r]=a}return n}function pi(e){return e||Xx||eA()}function mi(e,t=pi()){let n=e.trim().toLowerCase();if(!(!n||n===BN)){for(let r of Rp){let o=t[r].name;if(o&&o.trim().toLowerCase()===n)return r}if(n==="local"||n==="small"||n==="medium"||n==="large")return n}}function Gs(e,t=pi()){if(e===void 0)return{id:""};let n=mi(e,t);if(n)return t[n];let r=Zx[e.trim().toLowerCase()];return r?{id:r}:{id:e}}function Br(e,t=pi()){if(e!==void 0)return Gs(e,t).id}function ec(e,t=pi()){if(e===void 0)return;let n=mi(e,t);if(n&&t[n].id.trim()===""){let r=n.toUpperCase();return`The "${n}" model tier is not configured (no model id). Set AFK_MODEL_${r}=<id> (optionally AFK_MODEL_${r}_BASE_URL / AFK_MODEL_${r}_API_KEY) or "models.${n}" in afk.config.json, then retry.`}}function UN(e){let t={};if(!e||typeof e!="object")return t;let n=e;for(let r of Rp){let o=Hue(n[r]);o&&(t[r]=o)}return t}function jN(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="anthropic"||t==="anthropic-direct")return"anthropic";if(t==="openai"||t==="openai-compatible")return"openai";if(t==="chatgpt-oauth"||t==="chatgpt")return"chatgpt-oauth";if(t==="xai")return"xai";if(t==="xai-oauth"||t==="xai_oauth")return"xai-oauth"}function Ql(e){return typeof e=="string"?e.trim():""}function FN(e){return/[\x00-\x1f\x7f]/.test(e)}function Hue(e){if(typeof e=="string"){let t=e.trim();return t?{id:t}:void 0}if(e&&typeof e=="object"){let t=e,n=Ql(t.id);if(!n)return;let r={id:n},o=Ql(t.name);o&&(r.name=o);let i=jN(t.provider);i&&(r.provider=i);let s=Ql(t.baseUrl);s&&(r.baseUrl=s);let a=Ql(t.apiKey);return a&&(r.apiKey=a),r}}function HN(e){if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,error:'model binding must be an object with at least an "id"'};let t=e;if("apiKey"in t||"api_key"in t)return{ok:!1,error:"per-slot API keys are credentials; set AFK_MODEL_<TIER>_API_KEY via `afk config env set` instead of afk.config.json"};if("baseUrl"in t||"base_url"in t)return{ok:!1,error:"per-slot baseUrl is an endpoint-redirect credential vector; set AFK_MODEL_<TIER>_BASE_URL via `afk config env set` instead of afk.config.json"};let n=Ql(t.id);if(!n)return{ok:!1,error:'model binding requires a non-empty "id"'};if(FN(n))return{ok:!1,error:'model binding "id" must not contain control characters'};let r={id:n},o=Ql(t.name);if(o){if(FN(o))return{ok:!1,error:'model binding "name" must not contain control characters'};if(jue.has(o.trim().toLowerCase()))return{ok:!1,error:`model binding "name" must not shadow a built-in alias ("${o}")`};r.name=o}if(t.provider!==void 0&&t.provider!==""){let i=jN(t.provider);if(!i)return{ok:!1,error:'model binding "provider" must be one of: anthropic, openai (aliases: anthropic-direct, openai-compatible)'};r.provider=i}return{ok:!0,value:r}}var Rp,NN,Ep,Jx,Qx,Nue,Ks,BN,Zx,Bue,Zl,Xx,jue,Rt=y(()=>{"use strict";L();Rp=["local","small","medium","large"],NN="claude-haiku-4-5-20251001",Ep="claude-sonnet-4-6",Jx="claude-opus-5",Qx="claude-fable-5",Nue="grok-4.6",Ks={local:{id:""},small:{id:NN},medium:{id:Ep},large:{id:Jx}},BN="auto",Zx={opus:Jx,opus_1m:Jx,sonnet:Ep,sonnet_1m:Ep,haiku:NN,fable:Qx,grok:Nue},Bue=["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5"],Zl=[...Rp,...Object.keys(Zx),...Bue];jue=new Set([...Rp,BN,...Object.keys(Zx)])});function xp(e){return e in tA}function Dt(e){return Br(e)}var tA,Bn=y(()=>{"use strict";Rt();tA={opus:Ks.large.id,opus_1m:Ks.large.id,sonnet:Ks.medium.id,sonnet_1m:Ks.medium.id,haiku:Ks.small.id,fable:Qx}});import Wue from"@anthropic-ai/sdk";import{randomUUID as WN}from"node:crypto";async function tc(e){let{token:t,model:n,system:r,user:o,maxTokens:i=64,signal:s,clientFactory:a}=e;if(!t)throw new Error("oneShotCompletion: token required");let l=ty(t),c=Tp(t,l),u=a?a(c):new Wue(c),d=WN(),p=WN(),f=di(l,d,p),g=Dt(n)??n,h={};Object.keys(f).length>0&&(h.headers=f),s&&(h.signal=s);let b=await u.messages.create({model:g,max_tokens:i,system:r,messages:[{role:"user",content:o}]},Object.keys(h).length>0?h:void 0),w=[];for(let k of b.content)k.type==="text"&&w.push(k.text);let S=w.join("").trim();return S.length===0&&console.warn("oneShotCompletion: response contained no text blocks \u2014 returning empty string"),S}var oy=y(()=>{"use strict";Ws();Bn()});function que(){let e=v.AFK_VISION_MODELS,t=[],n=[];if(e)for(let r of e.split(",")){let o=r.trim().toLowerCase();if(o)if(o.startsWith("!")){let i=o.slice(1).trim();i&&n.push(i)}else t.push(o)}return{enable:t,disable:n}}function KN(e,t){return e===t||e.includes(t)}function iy(e){if(!e)return!1;let t=(Br(e)??e).trim();if(!t)return!1;let n=t.toLowerCase(),{enable:r,disable:o}=que();return o.some(i=>KN(n,i))?!1:r.some(i=>KN(n,i))||Kue.has(n)?!0:Gue.some(i=>i.test(t))}function GN(e){let t=e.trim().toLowerCase();return t.includes("/")?t.slice(t.lastIndexOf("/")+1):t}function qs(e){return e?/^o[0-9]/.test(GN(e)):!1}function Ap(e){if(!e)return!1;if(qs(e))return!0;let t=GN(e);return zue.some(n=>n.test(t))}var Kue,Gue,zue,zs=y(()=>{"use strict";L();Rt();Kue=new Set(["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4-turbo","o1","o3","o4-mini"]),Gue=[/^claude-/i,/^gpt-4o/i,/^gpt-4\.1/i,/^gpt-4-turbo/i,/^gpt-4-vision/i,/^gpt-5/i,/(?:^|[/_-])(?:vl|vlm)(?:[/_.-]|$)/i,/(?:^|[/_-])(?:llava|pixtral|internvl|cogvlm|idefics|moondream|janus)/i,/(?:vision|minicpm-?[vo]|qwen[\d.]*-?vl|llama-?3\.2-\d+b-vision|gemma-3|phi-3\.5-vision|phi-4-multimodal)/i];zue=[/^gpt-5/]});function nA(e){let t=String(e).trim().toLowerCase(),n=sy[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Br(e)??String(e);return sy[r]??sy[r.toLowerCase()]}function Vs(e){return nA(e)??Vue}function Xue(e){if(!e)return!1;let t=e.trim().toLowerCase();return t?!!(t.includes("/")||t.startsWith("gpt-")||t.startsWith("gpt_")||qs(t)||t.startsWith("codex-")||t.startsWith("codex_")||t==="codex"||t==="grok"||t.startsWith("grok-")||t.startsWith("grok_")):!1}function it(e){let t=String(e).trim().toLowerCase(),n=nc[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Br(e)??String(e),o=nc[r]??nc[r.toLowerCase()];return o!==void 0?o:Xue(r)?Jue:Yue}function vo(e){let t=it(e);if(String(e).trim().toLowerCase().endsWith("_1m"))return t;let r=Br(e)??String(e),o=qN[r]??qN[r.toLowerCase()];return o!==void 0?Math.min(t,o):t}var sy,Vue,nc,Yue,Jue,qN,lr=y(()=>{"use strict";Rt();zs();sy={opus:128e3,opus_1m:128e3,sonnet:128e3,sonnet_1m:128e3,haiku:64e3,fable:128e3,"claude-opus-5":128e3,"claude-opus-4-8":128e3,"claude-opus-4-7":128e3,"claude-opus-4-6":128e3,"claude-sonnet-5":128e3,"claude-sonnet-4-6":128e3,"claude-haiku-4-5-20251001":64e3,"claude-fable-5":128e3,"gpt-5.5":128e3,"gpt-5.6":128e3,"gpt-5.6-sol":128e3,"gpt-5.6-terra":128e3,"gpt-5.6-luna":128e3},Vue=64e3;nc={opus:1e6,opus_1m:1e6,sonnet:1e6,sonnet_1m:1e6,haiku:2e5,fable:1e6,"claude-fable-5":1e6,"claude-sonnet-5":1e6,"claude-opus-5":1e6,"claude-opus-4-8":1e6,"claude-opus-4-7":1e6,"claude-opus-4-6":1e6,"claude-sonnet-4-6":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"gpt-4.1":1e6,"gpt-4.1-mini":1e6,"gpt-5.5":1e6,"gpt-5.6":1e6,"gpt-5.6-sol":1e6,"gpt-5.6-terra":1e6,"gpt-5.6-luna":1e6,o1:2e5,"o1-mini":128e3,o3:2e5,"o3-mini":2e5,"o4-mini":2e5,"mlx-community/qwen3-30b-a3b-4bit":128e3,"mlx-community/qwen3-32b-4bit":128e3,"mlx-community/qwen2.5-coder-32b-instruct-4bit":131072,"grok-4.6":5e5,"grok-4.5":5e5,"grok-4.3":1e6,"grok-4.20-0309-reasoning":1e6,"grok-4.20-0309-non-reasoning":1e6,"grok-4.20-multi-agent-0309":1e6,"grok-build-0.1":256e3},Yue=2e5,Jue=262144;qN={"claude-sonnet-5":2e5,"claude-opus-5":2e5,"claude-sonnet-4-6":2e5,"claude-opus-4-8":2e5,"claude-opus-4-7":2e5,"claude-opus-4-6":2e5}});function zN(e){return(e.inputTokens??0)+(e.outputTokens??0)}function $t(e){return e.contextWindowTokens??zN(e)}function Cp(e){return e?{totalTokens:$t(e),apiUsage:{input_tokens:e.inputTokens??0,output_tokens:e.outputTokens??0,cache_read_input_tokens:e.cachedInputTokens??0,cache_creation_input_tokens:e.cacheCreationTokens??0,context_window_tokens:$t(e)}}:{totalTokens:0,apiUsage:null}}function _p(e,t,n){return t<=0||e<=0||n<=0||n>=1?!1:e/t>=n}function Ip(e,t){return t<=0||e<=0?0:e/t}function VN(e){let t=it(e),n=vo(e),r=Vs(e);if(t<=0||r<=0||n<t)return ay;let o=(t-r)/t-Que;return o>0?o:ay}function Pp(e,t,n,r){if(e<=0||n<=0||t<=0)return;let o=e+t;if(!(o<=n))throw new Error(`[afk] Context-window overflow: the conversation already used ~${e.toLocaleString()} tokens (last-turn API count) and the configured output ceiling is ${t.toLocaleString()} tokens \u2014 together they exceed the ${r} context window of ${n.toLocaleString()} tokens by ${(o-n).toLocaleString()} tokens. The provider would reject this request with HTTP 400. To continue: run /compact to summarise the conversation history, or start a new session.`)}function Mp(e,t){if(e===void 0||e===!1)return;let n=t!==void 0?VN(t):1;if(e===!0)return Math.min(ay,n);let r=e.threshold;if(!(typeof r!="number"||!Number.isFinite(r)||r<=0||r>=1))return Math.min(r,n)}var ay,Que,rc=y(()=>{"use strict";lr();ay=.9,Que=.04});function JN(e){if(e!==void 0&&!(!Number.isFinite(e)||e<0)){if(e>ly){let t=`temp:${e}`;return YN.has(t)||(YN.add(t),console.warn(`[afk] temperature ${e} exceeds the Anthropic maximum (${ly}); clamping to ${ly}.`)),ly}return e}}function uy(e,t){let n=Vs(t),r=e.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let i=`max:${t}:${o}`;return cy.has(i)||(cy.add(i),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${t} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function XN(e){if(!e||e.length===0)return;let t=[];for(let n of e)n.user.length>0&&t.push({role:"user",content:n.user}),n.assistant.length>0&&t.push({role:"assistant",content:n.assistant});return t.length>0?t:void 0}function dy(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&ede(n))return{type:"adaptive",display:"summarized"};if(t<=1024)throw new Error(`[afk] Extended thinking requires max_tokens > 1024 (the API constraint is 1024 <= budget_tokens < max_tokens), but the resolved output cap is ${t}. Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS above 1024, or disable thinking with --thinking disabled.`);let r=Math.floor(t*tde),o=Math.max(1024,t-1-r),i=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.floor(e.budgetTokens):void 0,s=Math.min(Math.max(i??o,1024),o);if(i!==void 0&&i>o){let a=`think:${n??"default"}:${i}:${t}`;cy.has(a)||(cy.add(a),console.warn(`[afk] thinking budgetTokens ${i} leaves too little of max_tokens ${t} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:s,display:"summarized"}}}}function py(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-(4-[678]|5)/.test(n))return"max"}var Zue,ede,cy,YN,ly,tde,my=y(()=>{"use strict";lr();rc();Zue=e=>/opus-4-(7|[89])/.test(e),ede=e=>Zue(e)||/(claude-)?(opus|sonnet)-5/.test(e),cy=new Set,YN=new Set,ly=1;tde=.25});import rA from"path";import{dirname as nde}from"path";import{appendFileSync as rde,mkdirSync as ode}from"fs";var fi,fy=y(()=>{"use strict";U();fi=class{hooks;constructor(t){this.hooks=t}addReadRoot(t,n="slash",r){this.hooks.ensureInitialized?.();let o=this.hooks.getReadRoots();if(!o)return;let i=rA.resolve(t);o.includes(i)||(o.push(i),this.appendAuditLog({action:"grant-read",path:i,source:n,sessionId:r}))}addWriteRoot(t,n="slash",r){this.hooks.ensureInitialized?.();let o=this.hooks.getReadRoots(),i=this.hooks.getWriteRoots();if(!o||!i)return;let s=rA.resolve(t);o.includes(s)||o.push(s),i.includes(s)||(i.push(s),this.appendAuditLog({action:"grant-write",path:s,source:n,sessionId:r}))}revokeRoot(t,n="slash",r){let o=this.hooks.getReadRoots();if(!o)return;let i=rA.resolve(t),s=this.hooks.getProtectedRoot();if(s!==void 0&&i===s)return;let a=o.indexOf(i),l=a!==-1;l&&o.splice(a,1);let c=this.hooks.getWriteRoots(),u=!1;if(c){let d=c.indexOf(i);u=d!==-1,u&&c.splice(d,1)}(l||u)&&this.appendAuditLog({action:"revoke",path:i,source:n,sessionId:r})}getGrants(){return{resolveBase:this.hooks.getDisplayResolveBase?this.hooks.getDisplayResolveBase():this.hooks.getProtectedRoot(),readRoots:this.hooks.getReadRoots()?.slice()??[],writeRoots:this.hooks.getWriteRoots()?.slice()??[],allowAll:this.hooks.getAllowAll()}}appendAuditLog(t){try{let n=ap();ode(nde(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??this.hooks.getDefaultSessionId?.()??null,action:t.action,path:t.path,source:t.source});rde(n,r+`
79
+ `)}catch{}}}});function cr(e){return e==="bypassPermissions"||e==="autonomous"}var oc=y(()=>{"use strict"});var gy,QN=y(()=>{"use strict";fy();oc();gy=class{_readRoots;_writeRoots;_currentCwd;_permissionMode="default";manager=new fi({getReadRoots:()=>this._readRoots,getWriteRoots:()=>this._writeRoots,ensureInitialized:()=>this.ensureInitialized(),getProtectedRoot:()=>this._currentCwd,getAllowAll:()=>cr(this._permissionMode)});get readRoots(){return this._readRoots}get writeRoots(){return this._writeRoots}get currentCwd(){return this._currentCwd}set currentCwd(t){this._currentCwd=t}get permissionMode(){return this._permissionMode}set permissionMode(t){this._permissionMode=t}ensureInitialized(t){if(!this._readRoots){let n=t?[t]:[];this._readRoots=n.slice(),this._writeRoots=n.slice(),t&&!this._currentCwd&&(this._currentCwd=t)}}}});import ide from"better-sqlite3";function ade(e){let t=[...new Set(e.toLowerCase().split(/\W+/).filter(n=>n.length>=3))].slice(0,25);return t.length===0?"":t.map(n=>`"${n}"`).join(" OR ")}var sde,ko,Op=y(()=>{"use strict";sde=`
80
80
  CREATE TABLE IF NOT EXISTS workspace_entries (
81
81
  id INTEGER PRIMARY KEY AUTOINCREMENT,
82
82
  session_id TEXT NOT NULL,
@@ -296,7 +296,7 @@ ${n}
296
296
  Remedy: these paths are outside the fork's granted read roots. Re-dispatch with the needed paths inside the child's cwd/worktree, or pass explicit readRoots granting them. If this worker is deliberately confined (e.g. an \`afk farm\` branch worker), this failure is expected \u2014 the paths are outside its assigned scope; widen the scope or narrow the task.`}var ac,aU,PA,qp=y(()=>{"use strict";ac="denial-breaker",aU=new Set(["read_file","list_directory","glob","grep"]),PA="Sub-agent path access denied:"});import{createHash as kme}from"node:crypto";function dU(){return{recent:[],firedFingerprints:new Set}}function Fy(e){let t;try{t=Eme(e.input)}catch{t=String(e.input)}return kme("sha256").update(e.name).update("\0").update(t).digest("hex")}function Eme(e){return JSON.stringify(MA(e))??"null"}function MA(e){if(Array.isArray(e))return e.map(MA);if(e!==null&&typeof e=="object"){let t=e,n={};for(let r of Object.keys(t).sort())n[r]=MA(t[r]);return n}return e}function Rme(e,t){let n=0;for(let r of e)r===t&&(n+=1);return n}function pU(e,t){e.recent.push(t),e.recent.length>OA&&e.recent.shift();let n=Rme(e.recent,t);return n>=Tme&&!e.firedFingerprints.has(t)?(e.firedFingerprints.add(t),{fired:!0,count:n}):{fired:!1,count:n}}var Tme,OA,DA=y(()=>{"use strict";Tme=5,OA=20});function Ame(e){if(e===null||typeof e!="object"||Array.isArray(e))return e;let t={};for(let[n,r]of Object.entries(e))xme.has(n)||(t[n]=r);return t}function zp(e){return Fy({...e,input:Ame(e.input)})}function Cme(e){let t=e.content.split(`
297
297
  `).find(n=>n.trim()!=="")?.trim()??"";return t.length<=mU?t:`${t.slice(0,mU)}\u2026`}var $A,xme,mU,Ny,LA=y(()=>{"use strict";DA();$A=3,xme=new Set(["timeout_ms","timeoutMs","timeout"]),mU=240;Ny=class{streaks=new Map;check(t){let n=this.streaks.get(zp(t));return n===void 0||n.count<$A?null:{count:n.count,tool:t.name,result:{content:`Repeat-failure guard: "${t.name}" has already failed ${n.count} times in a row with the same arguments, so this call was NOT executed again. The last failure was: ${n.lastError}
298
298
 
299
- Retrying it verbatim will fail the same way. Fix the underlying cause, change the arguments, use a different tool, or stop and report the blocker.`,isError:!0,failureClass:"repeat-failure"}}}note(t,n){let r=zp(t);if(n.isError!==!0){this.streaks.delete(r);return}let o=this.streaks.get(r);this.streaks.set(r,{count:(o?.count??0)+1,lastError:Cme(n)})}streakFor(t){return this.streaks.get(zp(t))?.count??0}}});async function lc(e,t,n){let r=new Array(e.length),o=Math.min(Math.max(1,Math.floor(t)),e.length),i=0,s=[];for(let a=0;a<o;a++)s.push((async()=>{for(;i<e.length;){let l=i++;try{r[l]={status:"fulfilled",value:await n(e[l])}}catch(c){r[l]={status:"rejected",reason:c}}}})());return await Promise.all(s),r}var By=y(()=>{"use strict";Fp()});function fU(e,t,n){if(n.has(e.name))return null;let r=t.check(e);return r===null?null:(N(`[repeat-failure-guard #723] refused ${r.tool} after ${r.count} identical failures`),r.result)}async function _me(e,t,n){let{call:r,originalIndex:o}=t[e];return r.signal.aborted?{result:{content:"Tool call aborted",isError:!0,failureClass:Zt(r.signal)},originalIndex:o}:{result:await n(r),originalIndex:o}}function Ime(e,t,n,r){for(let o of e)if(o.status==="fulfilled")r[o.value.originalIndex]=o.value.result;else{let i=o.reason instanceof Error?o.reason.message:String(o.reason),s=t[e.indexOf(o)];r[n[s].originalIndex]={content:`Tool execution error: ${i}`,isError:!0}}}function gU(e,t,n){let r=e.indices.length;for(let o=0;o<e.indices.length;o++){let i=e.indices[o],s=n[t[i].originalIndex];s&&(s.batchIndex=o+1,s.batchSize=r)}}async function hU(e,t,n,r){let o=[...e.indices];for(;o.length>0;){let i=new Map,s=[],a=[];for(let u of o){let{call:d,originalIndex:p}=t[u],f=fU(d,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(f){n[p]=f;continue}if(r.repeatBreakerExemptTools.has(d.name)){s.push(u);continue}let g=zp(d),h=$A-r.repeatFailureGuard.streakFor(d),b=i.get(g)??0;b<h?(i.set(g,b+1),s.push(u)):a.push(u)}o=a;let l=s.map(u=>t[u]?.call).filter(u=>u!==void 0&&u.name==="agent");if(l.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveStart(l,r.sessionId??"",null)}catch{}let c=await lc(s,r.maxConcurrentSafeCalls,u=>_me(u,t,r.executeCore));Ime(c,s,t,n);for(let u of s){let{call:d,originalIndex:p}=t[u],f=n[p];f!==void 0&&f.failureClass!=="abort"&&r.repeatFailureGuard.note(d,f)}if(l.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveEnd()}catch{}}}async function yU(e,t,n,r){for(let o of e.indices){let{call:i,originalIndex:s}=t[o];if(i.signal.aborted){n[s]={content:"Tool call aborted",isError:!0,failureClass:Zt(i.signal)};continue}let a=fU(i,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(a){n[s]=a;continue}let l=await r.executeCore(i);n[s]=l,r.repeatFailureGuard.note(i,l)}}var bU=y(()=>{"use strict";hi();By();ue();LA()});function wU(e){return e==="agent"||e==="cancel_background_job"}async function SU(e,t){if(!e)return{result:{content:t.name==="agent"?"Agent tool is not available in this session configuration":"Background mode is not available in this session configuration",isError:!0}};try{return{result:t.name==="agent"?await e.execute(t):await e.cancelBackgroundJob(t)}}catch(n){let r=n instanceof Error?n.message:String(n);return{result:{content:`${t.name==="agent"?"Agent":"Background cancellation"} tool error: ${r}`,isError:!0},thrownMessage:r}}}var vU=y(()=>{"use strict"});var cc,FA,cn,uc=y(()=>{"use strict";Fp();ue();Ne();hi();hy();wy();dA();yi();fy();pe();IA();sU();qp();DA();LA();bU();vU();IA();cc=8,FA=new Set,cn=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;subagentId;sessionGrantManager;traceWriter;readOnlyBash;maxOutputBytes;repeatBreaker=null;repeatFailureGuard=new Ny;denialBreaker=null;suspectedLoopWindow=null;grantManager;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.canUseTool=t.canUseTool,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.composeExecutor=t.composeExecutor,this.classifier=t.concurrencyClassifier??_A,this.maxConcurrentSafeCalls=typeof t.maxConcurrentSafeCalls=="number"&&Number.isFinite(t.maxConcurrentSafeCalls)&&t.maxConcurrentSafeCalls>=1?Math.floor(t.maxConcurrentSafeCalls):mB(),this.resolveBase=t.cwd,this._env=t.env,this.sessionId=t.sessionId,this.parentSessionId=t.parentSessionId,this.subagentId=t.subagentId,this.sessionGrantManager=t.sessionGrantManager,this.traceWriter=t.traceWriter,this.readOnlyBash=t.readOnlyBash===!0,this.maxOutputBytes=typeof t.maxOutputBytes=="number"&&Number.isFinite(t.maxOutputBytes)&&t.maxOutputBytes>0?t.maxOutputBytes:void 0,this._allowAll=t.allowAll===!0;let n=t.cwd?[t.cwd]:[];this._readRoots=t.readRoots??n.slice(),this._writeRoots=t.writeRoots??n.slice(),this.grantManager=new fi({getReadRoots:()=>this._readRoots,getWriteRoots:()=>this._writeRoots,getProtectedRoot:()=>this.resolveBase,getAllowAll:()=>this._allowAll,getDefaultSessionId:()=>this.sessionId})}get handlerContext(){return{cwd:this.resolveBase,resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),...this._allowAll?{allowAll:!0}:{},...this._env!==void 0?{env:this._env}:{},...this.sessionId!==void 0?{sessionId:this.sessionId}:{}}}callHandlerContext(t){return{...this.handlerContext,toolUseId:t.id,...this.traceWriter!==void 0?{traceWriter:this.traceWriter}:{}}}addReadRoot(t,n="slash"){this.grantManager.addReadRoot(t,n)}addWriteRoot(t,n="slash"){this.grantManager.addWriteRoot(t,n)}revokeRoot(t,n="slash"){this.grantManager.revokeRoot(t,n)}getGrants(){return this.grantManager.getGrants()}setAllowAll(t){this._allowAll=t}setResolveBase(t){let n=this.resolveBase;if(n!==t){if(this.resolveBase=t,n!==void 0){let r=this._readRoots.indexOf(n);r!==-1?this._readRoots[r]=t:this._readRoots.includes(t)||this._readRoots.push(t);let o=this._writeRoots.indexOf(n);o!==-1?this._writeRoots[o]=t:this._writeRoots.includes(t)||this._writeRoots.push(t)}else this._readRoots.includes(t)||this._readRoots.push(t),this._writeRoots.includes(t)||this._writeRoots.push(t);this.subagentExecutor?.setCwd(t),this.skillExecutor?.setCwd(t),this.composeExecutor?.setCwd(t)}}get toolDefs(){let t=this.subagentExecutor?.supportsBackgroundJobs?.()?this.schemas:this.schemas.filter(o=>o.name!=="cancel_background_job"),n=this.permissions?.allowedTools;if(!n)return t;let r=new Set(n);return t.filter(o=>r.has(o.name))}denialReason(t,n){return this.isRegisteredTool(t)?n??`Tool "${t}" is not permitted`:this.unknownToolMessage(t)}isRegisteredTool(t){return this.handlers.has(t)||t==="agent"&&this.subagentExecutor!==void 0||t==="cancel_background_job"&&this.subagentExecutor?.supportsBackgroundJobs?.()===!0||t==="skill"&&this.skillExecutor!==void 0||t==="compose"&&this.composeExecutor!==void 0}unknownToolMessage(t){let n=this.toolDefs.map(o=>o.name).join(", "),r=n.length>0?`Available tools: ${n}. Do NOT retry "${t}" or a variant of it; use one of the tools listed above.`:`Do NOT retry "${t}" or a variant of it.`;return`Unknown tool "${t}" \u2014 it does not exist in this session. ${r}`}async checkReadOnlyBash(t){if(!this.readOnlyBash||t.name!=="bash")return null;let n=t.input,r=typeof n=="object"&&n!==null?n.command:void 0;if(typeof r!="string")return null;let o=ky(r);if(!o.mutating)return null;let i=`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff/show/ls-remote, ls, cat, find, grep, gh pr view/diff). For a remote ref you have not fetched, \`gh pr diff <n>\`, \`gh pr view <n>\` and \`git ls-remote\` need no local ref \u2014 \`git fetch\` is blocked. Do NOT retry variants of a blocked command: if the task genuinely requires a mutation, stop and report that requirement to your caller instead.`;return await this.emitPreToolUseBlock(t.name,i),{content:i,isError:!0,failureClass:"permission-denied"}}async emitPreToolUseBlock(t,n){await Nn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t,reason:n,...this.subagentId!==void 0?{subagentId:this.subagentId}:{}})}checkRepeatCircuitBreaker(t){if(FA.has(t.name))return null;let n=iU(t);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<cc?null:{content:`Loop circuit breaker: "${t.name}" has been called ${this.repeatBreaker.count} times in a row with byte-identical input. The result will not change. Stop repeating this call \u2014 reuse the previous result, change the input, try a different tool, or end the turn.`,isError:!0,circuitBreaker:!0}}checkRepeatFailureGuard(t){if(FA.has(t.name))return null;let n=this.repeatFailureGuard.check(t);return n===null?null:(N(`[repeat-failure-guard #723] refused ${n.tool} after ${n.count} identical failures`),n.result)}observeSuspectedLoop(t){if(this.parentSessionId===void 0)return;this.suspectedLoopWindow===null&&(this.suspectedLoopWindow=dU());let n=Fy(t),r=pU(this.suspectedLoopWindow,n);r.fired&&re(this.traceWriter,{phase:"suspected_loop",metadata:{tool:t.name,count:r.count,windowSize:OA}})}recordForkReadDenial(t,n,r){if(this.parentSessionId===void 0||!aU.has(t.name)||!lU(n))return r;let o=this.denialBreaker??{count:0,deniedPaths:[]};o.count+=1;let i=cU(t);return o.deniedPaths.includes(i)||o.deniedPaths.push(i),this.denialBreaker=o,o.count<5?r:{content:uU(o.deniedPaths,o.count),isError:!0,failureClass:ac}}resetDenialBreaker(){this.denialBreaker=null}async runCanUseTool(t){if(!this.canUseTool)return null;let n;try{n=await this.canUseTool(t.name,t.input??{},{signal:t.signal,toolUseID:t.id})}catch(r){let o=`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`;return await this.emitPreToolUseBlock(t.name,o),{content:o,isError:!0,failureClass:"permission-denied"}}if(n.behavior==="deny"){let r=n.message||`Tool "${t.name}" denied by permission policy`;return await this.emitPreToolUseBlock(t.name,r),{content:r,isError:!0,failureClass:"permission-denied"}}return n.updatedInput!==void 0&&(t.input=n.updatedInput),null}async runPreDispatchGates(t){if(this.hookRegistry){let a={event:"PreToolUse",toolName:t.name,input:t.input,...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{},...t.id!==void 0?{toolUseId:t.id}:{}};try{await bB(this.hookRegistry,a,{signal:t.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(l){if(l instanceof Ae)return this.recordForkReadDenial(t,l.reason,{content:`Tool "${t.name}" blocked by PreToolUse hook${l.reason?`: ${l.reason}`:""}${l.injectContext?`
299
+ Retrying it verbatim will fail the same way. Fix the underlying cause, change the arguments, use a different tool, or stop and report the blocker.`,isError:!0,failureClass:"repeat-failure"}}}note(t,n){let r=zp(t);if(n.isError!==!0){this.streaks.delete(r);return}let o=this.streaks.get(r);this.streaks.set(r,{count:(o?.count??0)+1,lastError:Cme(n)})}streakFor(t){return this.streaks.get(zp(t))?.count??0}}});async function lc(e,t,n){let r=new Array(e.length),o=Math.min(Math.max(1,Math.floor(t)),e.length),i=0,s=[];for(let a=0;a<o;a++)s.push((async()=>{for(;i<e.length;){let l=i++;try{r[l]={status:"fulfilled",value:await n(e[l])}}catch(c){r[l]={status:"rejected",reason:c}}}})());return await Promise.all(s),r}var By=y(()=>{"use strict";Fp()});function fU(e,t,n){if(n.has(e.name))return null;let r=t.check(e);return r===null?null:(N(`[repeat-failure-guard #723] refused ${r.tool} after ${r.count} identical failures`),r.result)}async function _me(e,t,n){let{call:r,originalIndex:o}=t[e];return r.signal.aborted?{result:{content:"Tool call aborted",isError:!0,failureClass:Zt(r.signal)},originalIndex:o}:{result:await n(r),originalIndex:o}}function Ime(e,t,n,r){for(let o of e)if(o.status==="fulfilled")r[o.value.originalIndex]=o.value.result;else{let i=o.reason instanceof Error?o.reason.message:String(o.reason),s=t[e.indexOf(o)];r[n[s].originalIndex]={content:`Tool execution error: ${i}`,isError:!0}}}function gU(e,t,n){let r=e.indices.length;for(let o=0;o<e.indices.length;o++){let i=e.indices[o],s=n[t[i].originalIndex];s&&(s.batchIndex=o+1,s.batchSize=r)}}async function hU(e,t,n,r){let o=[...e.indices];for(;o.length>0;){let i=new Map,s=[],a=[];for(let u of o){let{call:d,originalIndex:p}=t[u],f=fU(d,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(f){n[p]=f;continue}if(r.repeatBreakerExemptTools.has(d.name)){s.push(u);continue}let g=zp(d),h=$A-r.repeatFailureGuard.streakFor(d),b=i.get(g)??0;b<h?(i.set(g,b+1),s.push(u)):a.push(u)}o=a;let l=s.map(u=>t[u]?.call).filter(u=>u!==void 0&&u.name==="agent");if(l.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveStart(l,r.sessionId??"",null)}catch{}let c=await lc(s,r.maxConcurrentSafeCalls,u=>_me(u,t,r.executeCore));Ime(c,s,t,n);for(let u of s){let{call:d,originalIndex:p}=t[u],f=n[p];f!==void 0&&f.failureClass!=="abort"&&r.repeatFailureGuard.note(d,f)}if(l.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveEnd()}catch{}}}async function yU(e,t,n,r){for(let o of e.indices){let{call:i,originalIndex:s}=t[o];if(i.signal.aborted){n[s]={content:"Tool call aborted",isError:!0,failureClass:Zt(i.signal)};continue}let a=fU(i,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(a){n[s]=a;continue}let l=await r.executeCore(i);n[s]=l,r.repeatFailureGuard.note(i,l)}}var bU=y(()=>{"use strict";hi();By();ue();LA()});function wU(e){return e==="agent"||e==="cancel_background_job"}async function SU(e,t){if(!e)return{result:{content:t.name==="agent"?"Agent tool is not available in this session configuration":"Background mode is not available in this session configuration",isError:!0}};try{return{result:t.name==="agent"?await e.execute(t):await e.cancelBackgroundJob(t)}}catch(n){let r=n instanceof Error?n.message:String(n);return{result:{content:`${t.name==="agent"?"Agent":"Background cancellation"} tool error: ${r}`,isError:!0},thrownMessage:r}}}var vU=y(()=>{"use strict"});var cc,FA,cn,uc=y(()=>{"use strict";Fp();ue();Ne();hi();hy();wy();dA();yi();fy();pe();IA();sU();qp();DA();LA();bU();vU();IA();cc=8,FA=new Set,cn=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;subagentId;sessionGrantManager;traceWriter;readOnlyBash;maxOutputBytes;repeatBreaker=null;repeatFailureGuard=new Ny;denialBreaker=null;suspectedLoopWindow=null;grantManager;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.canUseTool=t.canUseTool,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.composeExecutor=t.composeExecutor,this.classifier=t.concurrencyClassifier??_A,this.maxConcurrentSafeCalls=typeof t.maxConcurrentSafeCalls=="number"&&Number.isFinite(t.maxConcurrentSafeCalls)&&t.maxConcurrentSafeCalls>=1?Math.floor(t.maxConcurrentSafeCalls):mB(),this.resolveBase=t.cwd,this._env=t.env,this.sessionId=t.sessionId,this.parentSessionId=t.parentSessionId,this.subagentId=t.subagentId,this.sessionGrantManager=t.sessionGrantManager,this.traceWriter=t.traceWriter,this.readOnlyBash=t.readOnlyBash===!0,this.maxOutputBytes=typeof t.maxOutputBytes=="number"&&Number.isFinite(t.maxOutputBytes)&&t.maxOutputBytes>0?t.maxOutputBytes:void 0,this._allowAll=t.allowAll===!0;let n=t.cwd?[t.cwd]:[];this._readRoots=t.readRoots??n.slice(),this._writeRoots=t.writeRoots??n.slice(),this.grantManager=new fi({getReadRoots:()=>this._readRoots,getWriteRoots:()=>this._writeRoots,getProtectedRoot:()=>this.resolveBase,getAllowAll:()=>this._allowAll,getDefaultSessionId:()=>this.sessionId})}get handlerContext(){return{cwd:this.resolveBase,resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),...this._allowAll?{allowAll:!0}:{},...this._env!==void 0?{env:this._env}:{},...this.sessionId!==void 0?{sessionId:this.sessionId}:{}}}callHandlerContext(t){return{...this.handlerContext,toolUseId:t.id,...this.traceWriter!==void 0?{traceWriter:this.traceWriter}:{}}}addReadRoot(t,n="slash",r){this.grantManager.addReadRoot(t,n,r)}addWriteRoot(t,n="slash",r){this.grantManager.addWriteRoot(t,n,r)}revokeRoot(t,n="slash",r){this.grantManager.revokeRoot(t,n,r)}getGrants(){return this.grantManager.getGrants()}setAllowAll(t){this._allowAll=t}setResolveBase(t){let n=this.resolveBase;if(n!==t){if(this.resolveBase=t,n!==void 0){let r=this._readRoots.indexOf(n);r!==-1?this._readRoots[r]=t:this._readRoots.includes(t)||this._readRoots.push(t);let o=this._writeRoots.indexOf(n);o!==-1?this._writeRoots[o]=t:this._writeRoots.includes(t)||this._writeRoots.push(t)}else this._readRoots.includes(t)||this._readRoots.push(t),this._writeRoots.includes(t)||this._writeRoots.push(t);this.subagentExecutor?.setCwd(t),this.skillExecutor?.setCwd(t),this.composeExecutor?.setCwd(t)}}get toolDefs(){let t=this.subagentExecutor?.supportsBackgroundJobs?.()?this.schemas:this.schemas.filter(o=>o.name!=="cancel_background_job"),n=this.permissions?.allowedTools;if(!n)return t;let r=new Set(n);return t.filter(o=>r.has(o.name))}denialReason(t,n){return this.isRegisteredTool(t)?n??`Tool "${t}" is not permitted`:this.unknownToolMessage(t)}isRegisteredTool(t){return this.handlers.has(t)||t==="agent"&&this.subagentExecutor!==void 0||t==="cancel_background_job"&&this.subagentExecutor?.supportsBackgroundJobs?.()===!0||t==="skill"&&this.skillExecutor!==void 0||t==="compose"&&this.composeExecutor!==void 0}unknownToolMessage(t){let n=this.toolDefs.map(o=>o.name).join(", "),r=n.length>0?`Available tools: ${n}. Do NOT retry "${t}" or a variant of it; use one of the tools listed above.`:`Do NOT retry "${t}" or a variant of it.`;return`Unknown tool "${t}" \u2014 it does not exist in this session. ${r}`}async checkReadOnlyBash(t){if(!this.readOnlyBash||t.name!=="bash")return null;let n=t.input,r=typeof n=="object"&&n!==null?n.command:void 0;if(typeof r!="string")return null;let o=ky(r);if(!o.mutating)return null;let i=`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff/show/ls-remote, ls, cat, find, grep, gh pr view/diff). For a remote ref you have not fetched, \`gh pr diff <n>\`, \`gh pr view <n>\` and \`git ls-remote\` need no local ref \u2014 \`git fetch\` is blocked. Do NOT retry variants of a blocked command: if the task genuinely requires a mutation, stop and report that requirement to your caller instead.`;return await this.emitPreToolUseBlock(t.name,i),{content:i,isError:!0,failureClass:"permission-denied"}}async emitPreToolUseBlock(t,n){await Nn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t,reason:n,...this.subagentId!==void 0?{subagentId:this.subagentId}:{}})}checkRepeatCircuitBreaker(t){if(FA.has(t.name))return null;let n=iU(t);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<cc?null:{content:`Loop circuit breaker: "${t.name}" has been called ${this.repeatBreaker.count} times in a row with byte-identical input. The result will not change. Stop repeating this call \u2014 reuse the previous result, change the input, try a different tool, or end the turn.`,isError:!0,circuitBreaker:!0}}checkRepeatFailureGuard(t){if(FA.has(t.name))return null;let n=this.repeatFailureGuard.check(t);return n===null?null:(N(`[repeat-failure-guard #723] refused ${n.tool} after ${n.count} identical failures`),n.result)}observeSuspectedLoop(t){if(this.parentSessionId===void 0)return;this.suspectedLoopWindow===null&&(this.suspectedLoopWindow=dU());let n=Fy(t),r=pU(this.suspectedLoopWindow,n);r.fired&&re(this.traceWriter,{phase:"suspected_loop",metadata:{tool:t.name,count:r.count,windowSize:OA}})}recordForkReadDenial(t,n,r){if(this.parentSessionId===void 0||!aU.has(t.name)||!lU(n))return r;let o=this.denialBreaker??{count:0,deniedPaths:[]};o.count+=1;let i=cU(t);return o.deniedPaths.includes(i)||o.deniedPaths.push(i),this.denialBreaker=o,o.count<5?r:{content:uU(o.deniedPaths,o.count),isError:!0,failureClass:ac}}resetDenialBreaker(){this.denialBreaker=null}async runCanUseTool(t){if(!this.canUseTool)return null;let n;try{n=await this.canUseTool(t.name,t.input??{},{signal:t.signal,toolUseID:t.id})}catch(r){let o=`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`;return await this.emitPreToolUseBlock(t.name,o),{content:o,isError:!0,failureClass:"permission-denied"}}if(n.behavior==="deny"){let r=n.message||`Tool "${t.name}" denied by permission policy`;return await this.emitPreToolUseBlock(t.name,r),{content:r,isError:!0,failureClass:"permission-denied"}}return n.updatedInput!==void 0&&(t.input=n.updatedInput),null}async runPreDispatchGates(t){if(this.hookRegistry){let a={event:"PreToolUse",toolName:t.name,input:t.input,...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{},...t.id!==void 0?{toolUseId:t.id}:{}};try{await bB(this.hookRegistry,a,{signal:t.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(l){if(l instanceof Ae)return this.recordForkReadDenial(t,l.reason,{content:`Tool "${t.name}" blocked by PreToolUse hook${l.reason?`: ${l.reason}`:""}${l.injectContext?`
300
300
 
301
301
  ${l.injectContext}`:""}`,isError:!0,failureClass:"hook-block"});throw l}}let n=vB(t.name,this.permissions);if(!n.allowed){let a=this.denialReason(t.name,n.reason);return await this.emitPreToolUseBlock(t.name,a),{content:a,isError:!0,failureClass:"permission-denied"}}let r=await this.runCanUseTool(t);if(r)return r;let o=await this.checkReadOnlyBash(t);if(o)return o;let i=this.checkRepeatCircuitBreaker(t);if(i)return i;let s=this.checkRepeatFailureGuard(t);return s||(this.observeSuspectedLoop(t),null)}async execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0,failureClass:Zt(t.signal)};let n=await this.runPreDispatchGates(t);if(n)return n;let r=await this.executeCore(t);return this.repeatFailureGuard.note(t,r),r.isError!==!0&&this.resetDenialBreaker(),r}async executeBatch(t){if(t.length===0)return[];if(t.length===1)return[await this.execute(t[0])];let n=new Array(t.length),r=new Set;for(let a=0;a<t.length;a++){let l=t[a];if(l.signal.aborted){n[a]={content:"Tool call aborted",isError:!0,failureClass:Zt(l.signal)},r.add(a);continue}let c=await this.runPreDispatchGates(l);if(c){n[a]=c,r.add(a);continue}}let o=t.map((a,l)=>({call:a,originalIndex:l})).filter((a,l)=>!r.has(l));if(o.length===0)return n;let i=oU(o.map(a=>a.call),this.classifier),s={repeatFailureGuard:this.repeatFailureGuard,repeatBreakerExemptTools:FA,executeCore:a=>this.executeCore(a),subagentExecutor:this.subagentExecutor,sessionId:this.sessionId,maxConcurrentSafeCalls:this.maxConcurrentSafeCalls};for(let a of i)a.isConcurrencySafe?await hU(a,o,n,s):await yU(a,o,n,s),gU(a,o,n);return n.some(a=>a!==void 0&&a.isError!==!0)&&this.resetDenialBreaker(),n}async executeCore(t){let n=await this.executeCoreInner(t);return this.applyOutputCap(n)}applyOutputCap(t){let n=this.maxOutputBytes;if(n===void 0)return t;let r=Buffer.byteLength(t.content,"utf8");return r<=n||(t.content=Xs(t.content,n),t.truncated=!0,N(`[output-cap #661] fork tool result capped: original=${r}B capped=${Buffer.byteLength(t.content,"utf8")}B (cap=${n}B)`)),t}async executeCoreInner(t){if(wU(t.name)){let s=await SU(this.subagentExecutor,t);return s.thrownMessage!==void 0?this.firePostToolUseFailure(t.name,s.thrownMessage,t.signal,t.input):this.firePostToolUse(t.name,s.result.content,t.signal,t.input,s.result),s.result}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let s,a=!1,l="";try{s=await this.skillExecutor.execute(t)}catch(c){a=!0,l=c instanceof Error?c.message:String(c),s={content:`Skill tool error: ${l}`,isError:!0}}return a?this.firePostToolUseFailure(t.name,l,t.signal,t.input):this.firePostToolUse(t.name,s.content,t.signal,t.input,s),s}if(t.name==="compose"){let s=await this.executeCompose(t);return this.firePostToolUse(t.name,s.content,t.signal,t.input,s),s}let n=this.handlers.get(t.name);if(!n){let s=this.unknownToolMessage(t.name);return await this.emitPreToolUseBlock(t.name,s),{content:s,isError:!0,failureClass:"permission-denied"}}let r,o=!1,i="";try{r=await n(t.input,t.signal,this.callHandlerContext(t))}catch(s){o=!0,i=s instanceof Error?s.message:String(s),r={content:`Tool execution error: ${i}`,isError:!0}}return o?this.firePostToolUseFailure(t.name,i,t.signal,t.input):this.firePostToolUse(t.name,r.content,t.signal,t.input,r),r}async executeCompose(t){if(!this.composeExecutor)return{content:"Compose tool is not available in this session configuration",isError:!0};try{return await this.composeExecutor.execute(t)}catch(n){return{content:`Compose tool error: ${n instanceof Error?n.message:String(n)}`,isError:!0}}}firePostToolUse(t,n,r,o,i){if(!this.hookRegistry)return;let s={event:"PostToolUse",toolName:t,output:n,...o!==void 0?{input:o}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{},...i?.incomplete===!0?{incomplete:!0}:{},...i?.incompleteReason?{incompleteReason:i.incompleteReason}:{}};wB(this.hookRegistry,s,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(()=>{})}firePostToolUseFailure(t,n,r,o){if(!this.hookRegistry)return;let i={event:"PostToolUseFailure",toolName:t,error:n,...o!==void 0?{input:o}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};SB(this.hookRegistry,i,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(s=>{N(`firePostToolUseFailure outer catch (tool=${t}): ${String(s)}`)})}}});import{mkdir as Mme,writeFile as Ome}from"fs/promises";import{dirname as Dme,join as $me}from"path";function Lme(){return $me(vt(),"routing-decisions.jsonl")}function Fme(e){let t={surface:"afk"};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}async function Le(e){if(!(v.VITEST||v.NODE_ENV==="test"))try{let t=Lme();await Mme(Dme(t),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r=JSON.stringify({ts:n,...Fme(e)})+`
302
302
  `;await Ome(t,r,{flag:"a"})}catch{}}var dr=y(()=>{"use strict";L();U()});function Vme(e){let t=e.match(Nme);if(!t)return null;let n=parseInt(t[1]??"0",10),r=parseInt(t[2]??"0",10),o=t[3]!==void 0?parseInt(t[3],10):void 0;return{runner:"vitest",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function Yme(e){let t=e.match(Bme);if(!t)return null;let n=parseInt(t[1]??"0",10);return{runner:"jest",passed:parseInt(t[2]??"0",10),failed:n}}function Jme(e){let t=e.match(Ume);if(!t)return null;if(t[2]!==void 0){let n=parseInt(t[2],10),r=parseInt(t[1]??"0",10);return{runner:"pytest",passed:n,failed:r}}return t[4]!==void 0?{runner:"pytest",passed:parseInt(t[4],10),failed:0}:null}function Xme(e){let t=e.match(jme);if(!t)return null;let n=parseInt(t[1]??"0",10),r=e.match(Hme),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function Qme(e){let t=[...e.matchAll(Wme)];if(t.length===0)return null;let n=0,r=0;for(let o of t)o[1]==="ok"?n++:o[1]==="FAIL"&&r++;return{runner:"go-test",passed:n,failed:r}}function Zme(e){let t=e.match(Kme);if(!t)return null;let n=parseInt(t[1]??"0",10),r=parseInt(t[2]??"0",10),o=t[3]!==void 0?parseInt(t[3],10):void 0;return{runner:"cargo",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function efe(e){let t=e.match(Gme);if(!t)return null;let n=parseInt(t[1]??"0",10),r=parseInt(t[2]??"0",10);return{runner:"rspec",passed:n-r,failed:r}}function tfe(e){let t=e.match(qme);if(t)return{runner:"phpunit",passed:parseInt(t[1]??"0",10),failed:0};let n=e.match(zme);if(n){let r=parseInt(n[1]??"0",10),o=parseInt(n[2]??"0",10);return{runner:"phpunit",passed:r-o,failed:o}}return null}function NA(e){return Vme(e)??Yme(e)??Jme(e)??Xme(e)??Qme(e)??Zme(e)??efe(e)??tfe(e)??null}var Nme,Bme,Ume,jme,Hme,Wme,Kme,Gme,qme,zme,kU=y(()=>{"use strict";Nme=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,Bme=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,Ume=/={3,}\s*(?:(\d+)\s+failed,\s*)?(\d+)\s+passed(?:,\s*(\d+)\s+warning)?.*in\s+[\d.]+s\s*={3,}|={3,}\s*(\d+)\s+passed.*in\s+[\d.]+s\s*={3,}/,jme=/(\d+)\s+passing/,Hme=/(\d+)\s+failing/,Wme=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,Kme=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,Gme=/(\d+) examples?, (\d+) failures?/,qme=/OK \((\d+) tests?/,zme=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});import{statSync as nfe}from"node:fs";function Vp(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.code==="ENOENT"&&typeof t.syscall=="string"&&t.syscall.startsWith("spawn")}function rfe(e){if(e===void 0)return!1;try{return nfe(e),!1}catch{return!0}}function dc(e,t){let n=e instanceof Error?e.message:typeof e?.message=="string"?String(e.message):String(e);return Vp(e)&&rfe(t)?`working directory does not exist: ${t} (deleted worktree?) \u2014 underlying: ${n}`:n}var BA=y(()=>{"use strict"});function Wr(e){let t=e instanceof Error?e.message:String(e);TU.has(t)||(TU.add(t),console.warn(`[afk-home] Malformed AFK home/state env var ignored while deriving the credential floor: ${t}. The relocated tree is NOT protected \u2014 the default ~/.afk entries still apply. Fix the env var to restore coverage.`))}var TU,Yp=y(()=>{"use strict";TU=new Set});import{statSync as jA}from"node:fs";import{homedir as ofe}from"node:os";import{basename as ife,dirname as RU,join as sfe}from"node:path";function xU(e){return typeof e=="object"&&e!==null&&"code"in e?String(e.code):void 0}function afe(e){let t=ife(e),n=t===t.toLowerCase()?t.toUpperCase():t.toLowerCase();if(n===t)return;let r;try{r=jA(e)}catch{return}let o=UA.get(r.dev);if(o!==void 0)return o;try{let i=jA(sfe(RU(e),n)),s=r.dev===i.dev&&r.ino===i.ino;return UA.set(r.dev,s),s}catch(i){let s=xU(i);return s==="ENOENT"||s==="ENOTDIR"?(UA.set(r.dev,!1),!1):void 0}}function AU(e=ofe()){if(EU!==void 0)return EU;let t=e;for(;;)try{return jA(t),afe(t)??!0}catch(n){let r=xU(n);if(r!=="ENOENT"&&r!=="ENOTDIR")return!0;let o=RU(t);if(o===t)return!0;t=o}}function pc(e,t,n=t){if(e===t||e.startsWith(t+"/")||e.startsWith(t+"\\"))return!0;if(!AU(n))return!1;let r=e.toLowerCase(),o=t.toLowerCase();return r===o||r.startsWith(o+"/")||r.startsWith(o+"\\")}function Uy(e,t){return e.includes(t)?!0:AU(t)?e.toLowerCase().includes(t.toLowerCase()):!1}var EU,UA,jy=y(()=>{"use strict";UA=new Map});import{realpathSync as CU}from"fs";import{dirname as lfe,resolve as oa,join as Wy}from"path";import{homedir as jn}from"os";function ufe(){let e=[];try{let t=we();e.push(oa(Wy(t,"config"))),e.push(oa(Wy(t,"state")))}catch(t){Wr(t)}try{e.push(oa(ge()))}catch(t){Wr(t)}return e}function HA(){let e=`${v.AFK_WRITE_DENYLIST??""}\0${v.AFK_HOME??""}\0${v.AFK_STATE_DIR??""}`;if(!Hy||Hy.key!==e){let t=v.AFK_WRITE_DENYLIST,n=process.platform==="win32"?";":":",r=t?t.split(n).map(o=>o.trim()).filter(Boolean).map(o=>o==="~"||o.startsWith("~/")||o.startsWith("~\\")?Wy(jn(),o.slice(2)):o).map(o=>oa(o)).filter(Boolean):[];Hy={key:e,unresolved:[...new Set([...cfe.map(o=>oa(o)),...ufe()]),...r]}}return[...new Set(Hy.unresolved.map(t=>ft(t)))]}function ft(e){let t=oa(e);try{return CU(t)}catch{}let n=[],r=t;for(let o=0;o<64;o++){let i=lfe(r);if(i===r)break;n.unshift(r.slice(i.length+1)),r=i;try{let s=CU(r);return Wy(s,...n)}catch{}}return t}function Ky(e,t="write_file"){let n=ft(oa(e));for(let r of HA())if(pc(n,r))throw new Error(`${t}: refusing to write to protected path: ${n} (matches denylist entry: ${r})`)}var cfe,Hy,ia=y(()=>{"use strict";L();U();Yp();jy();cfe=[`${jn()}/.ssh`,`${jn()}/.aws`,`${jn()}/.gnupg`,`${jn()}/.config/gcloud`,"/etc","/System","/private/etc","/usr/local/etc",`${jn()}/.afk/config`,`${jn()}/.afk/state`,`${jn()}/.npmrc`,`${jn()}/.docker/config.json`,`${jn()}/Library/LaunchAgents`,`${jn()}/Library/LaunchDaemons`,"/Library/LaunchAgents","/Library/LaunchDaemons",`${jn()}/.config/systemd`,...process.platform==="win32"&&v.APPDATA?[`${v.APPDATA}\\gcloud`,`${v.APPDATA}\\Docker`]:[],...process.platform==="win32"&&v.USERPROFILE?[`${v.USERPROFILE}\\.ssh`,`${v.USERPROFILE}\\.aws`,`${v.USERPROFILE}\\.gnupg`]:[]]});import{isAbsolute as dfe,relative as pfe,sep as mfe}from"node:path";import{homedir as Gy}from"node:os";function ffe(e,t){let n=pfe(t,e);return n===""||n!==".."&&!n.startsWith(`..${mfe}`)&&!dfe(n)}function WA(e,t){return e.filter(n=>!t.some(r=>ffe(n,r)))}function gfe(e,t){return e.filter(({source:n})=>n!==t).map(({root:n})=>n)}function _U(e,t){return e.flatMap(({rel:n,resolved:r})=>WA([r],gfe(t,hfe[n])))}var hfe,IU=y(()=>{"use strict";hfe={".afk/config/mcp.json":`${Gy()}/.afk/config`,".afk/config/schedules.json":`${Gy()}/.afk/config`,".ssh/config":`${Gy()}/.ssh`,".ssh/known_hosts":`${Gy()}/.ssh`}});import{existsSync as PU}from"fs";import{isAbsolute as yfe,resolve as DU}from"path";import{homedir as MU}from"os";function sa(e){return e==="~"?MU():e.startsWith("~/")?DU(MU(),e.slice(2)):e}function qy(e){if(!e.startsWith("https://"))throw new Error(`Plugin source must use https:// (got: ${e}). git://, http://, ssh://, file://, and git@ are rejected to avoid downgrade attacks and unauthenticated clones.`)}function mc(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(vfe(t)){let o=OU(t);if(!PU(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(bfe.test(t))return{type:"git",url:t};let n=Sfe.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=wfe.exec(t);if(r&&r[1]&&r[2]){let o=r[1],i=r[2];return{type:"github",owner:o,repo:i,url:`https://github.com/${o}/${i}.git`}}if(PU(t))return{type:"local",path:OU(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function vfe(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function OU(e){let t=sa(e);return yfe(t)?t:DU(process.cwd(),t)}var bfe,wfe,Sfe,fc=y(()=>{"use strict";bfe=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|file:\/\/|git@[^:]+:)/,wfe=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,Sfe=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/});import{basename as kfe,dirname as Tfe,join as zy,relative as Efe,resolve as gc,sep as Jp}from"path";import{homedir as st}from"os";function LU(e){let t=gc(e);return zy(ft(Tfe(t)),kfe(t))}function GA(e){if(!e)return[];let t=process.platform==="win32"?";":":";return e.split(t).map(n=>n.trim()).filter(Boolean).map(n=>n==="~"||n.startsWith("~/")||n.startsWith("~\\")?sa(n.replace(/^~[/\\]+/,"~/")):n).map(n=>gc(n))}function xfe(){try{return[ft(gc(zy(we(),"config")))]}catch(e){return Wr(e),[]}}function Afe(){try{let e=we();return Eo.filter(t=>t.startsWith($U)).map(t=>LU(zy(e,t.slice($U.length))))}catch(e){return Wr(e),[]}}function FU(){let e=`${v.AFK_READ_DENYLIST??""}\0${v.AFK_HOME??""}`;if(Xp&&Xp.key===e)return Xp;let t=GA(v.AFK_READ_DENYLIST).map(s=>ft(s)).filter(Boolean),n=KA.map(s=>({source:s,root:ft(gc(s))})),r=xfe(),o=[...new Set([...n.map(({root:s})=>s),...r])],i=n.filter(({source:s,root:a})=>s!==Rfe||!r.includes(a)).map(({root:s})=>s);return Xp={key:e,builtins:o,extras:t,allow:[...new Set([..._U(Eo.map(s=>({rel:s,resolved:LU(`${st()}/${s}`)})),n),...WA(Afe(),i)])]},Xp}function qA(){let{builtins:e,extras:t}=FU();return[...e,...t]}function NU(e){let t=ft(gc(e));return qA().filter(n=>n!==t&&pc(n,t,n)).map(n=>(n.startsWith(t+Jp)?Efe(t,n):n.split(Jp).slice(t.split(Jp).length).join(Jp)).split(Jp).join("/"))}function un(e){let t=ft(gc(e)),{builtins:n,extras:r,allow:o}=FU();for(let i of r)if(pc(t,i))return{denied:!0,matched:i};if(o.includes(t))return{denied:!1};for(let i of n)if(pc(t,i))return{denied:!0,matched:i};return{denied:!1}}var KA,Eo,Rfe,X8e,Xp,$U,wi,hc,Kr=y(()=>{"use strict";L();ia();U();Yp();IU();jy();fc();KA=[`${st()}/.ssh`,`${st()}/.aws`,`${st()}/.gnupg`,`${st()}/.config/gcloud`,`${st()}/.afk/config`,`${st()}/.npmrc`,`${st()}/.docker/config.json`,`${st()}/.git-credentials`,`${st()}/.netrc`,`${st()}/.config/gh/hosts.yml`,`${st()}/.kube/config`,"/etc/shadow","/etc/sudoers","/private/etc/master.passwd",`${st()}/.password-store`,`${st()}/Library/Application Support/Google/Chrome`,`${st()}/Library/Application Support/Chromium`,`${st()}/Library/Application Support/BraveSoftware`,`${st()}/Library/Application Support/Microsoft Edge`,`${st()}/Library/Application Support/Arc`,`${st()}/Library/Application Support/Firefox`,...process.platform==="win32"&&v.USERPROFILE?[`${v.USERPROFILE}\\.ssh`,`${v.USERPROFILE}\\.aws`,`${v.USERPROFILE}\\.gnupg`]:[],...process.platform==="win32"&&v.APPDATA?[`${v.APPDATA}\\gcloud`,`${v.APPDATA}\\Docker`,`${v.APPDATA}\\Mozilla\\Firefox`]:[],...process.platform==="win32"&&v.LOCALAPPDATA?[`${v.LOCALAPPDATA}\\Google\\Chrome`,`${v.LOCALAPPDATA}\\Chromium`,`${v.LOCALAPPDATA}\\BraveSoftware`,`${v.LOCALAPPDATA}\\Microsoft\\Edge`]:[]],Eo=[".afk/config/mcp.json",".afk/config/schedules.json",".ssh/config",".ssh/known_hosts"],Rfe=`${st()}/.afk/config`,X8e=Eo.map(e=>zy(st(),e));$U=".afk/";wi="read-denylist entry:",hc="is a protected credential/secret path"});import aa from"path";import{realpathSync as Cfe}from"fs";function en(e){try{return Cfe.native(e)}catch{let t=aa.dirname(e),n=aa.basename(e);return t===e?e:aa.join(en(t),n)}}function _fe(e){let t=BU.get(e);if(t!==void 0)return t;let n=en(e);return BU.set(e,n),n}function UU(e,t,n,r){let o=t?.resolveBase??t?.cwd??r,i=aa.isAbsolute(e)?e:aa.resolve(o??process.cwd(),e);if(t?.allowAll===!0)return{restricted:!1,resolved:i,roots:[]};if(o===void 0)return{restricted:!1,resolved:i,roots:[]};let s=en(i),a=n==="read"?t?.readRoots??[o]:t?.writeRoots??[o];for(let l of a){let c=_fe(l),u=aa.relative(c,s);if(!u.startsWith("..")&&!aa.isAbsolute(u))return{restricted:!1,resolved:i,roots:a}}return{restricted:!0,resolved:i,roots:a}}function qt(e,t,n="read",r){let{restricted:o,resolved:i,roots:s}=UU(e,t,n,r);if(n==="read"){let a=un(i);if(a.denied)throw new Error(`Path \`${e}\` ${hc} (${wi} \`${a.matched}\`) and cannot be read.`)}if(o){let a=s.map(c=>`\`${c}\``).join(", "),l=n==="read"?"read roots":"write roots";throw new Error(`Path \`${e}\` is outside the allowed ${l} [${a}].`)}return i}function Qp(e,t,n="read",r){return UU(e,t,n,r)}function jU(e){let t=new Set,n=[];for(let r of e.split(/\s+/)){if(r.length===0)continue;let o=r.replace(/^\d*[<>|&]+/,"").replace(/^['"]/,"").replace(/['";,)]+$/,"");if(o.length===0)continue;let i=o.startsWith("/"),s=o==="~"||o.startsWith("~/");!i&&!s||t.has(o)||(t.add(o),n.push(o))}return n}var BU,dn=y(()=>{"use strict";Kr();BU=new Map});import{execFileSync as Ife}from"node:child_process";function Si(e,t="SIGKILL"){if(!(e<=0))try{process.platform==="win32"?Ife("taskkill",["/F","/T","/PID",String(e)],{stdio:"ignore",timeout:5e3}):process.kill(-e,t)}catch{}}var Vy=y(()=>{"use strict"});import{spawn as Pfe}from"child_process";import Mfe from"os";function Ofe(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.command!="string")throw new Error('Input must have a "command" field of type string');let n=12e4;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number")throw new Error("timeout_ms must be a number");if(t.timeout_ms<0||t.timeout_ms>6e5)throw new Error("timeout_ms must be between 0 and 600000");n=t.timeout_ms}return{command:t.command,timeout_ms:n}}function Yy(e,t){let n=!1,r=!1;function o(){n||e==="bypassPermissions"&&(n=!0,console.warn("[security] bash handler: shell=true with bypassPermissions \u2014 all shell metacharacters are interpreted without confirmation. Migrate to execFile to eliminate this risk (tracked: C4)."))}function i(s,a){if(r)return;let l=a.resolveBase??a.cwd??t,c=Mfe.homedir(),u=[];for(let d of jU(s)){let p=d==="~"?c:d.startsWith("~/")?c+d.slice(1):d,f=Qp(p,a,"write",l);f.restricted&&u.push(f.resolved)}u.length!==0&&(r=!0,console.warn(`[security] bash: command references path(s) outside writeRoots: ${u.join(", ")} \u2014 bash containment is best-effort (tracked C4); use file tools for contained writes.`),Le({event:"tool.bash_path_escape",tool:"bash",restricted_count:u.length,mode:"write"}))}return async(s,a,l)=>{let{command:c,timeout_ms:u}=Ofe(s);if(a.aborted)return{content:"Command aborted",isError:!0};if(o(),l!==void 0)try{i(c,l)}catch{}return new Promise(d=>{let p=!1;function f(R){p||(p=!0,clearTimeout(h),a.removeEventListener("abort",T),d(R))}let g=Pfe(c,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...(l?.resolveBase??l?.cwd??t)!==void 0?{cwd:l?.resolveBase??l?.cwd??t}:{},...l?.env!==void 0?{env:{...process.env,...l.env}}:{}});g.unref();let h=setTimeout(()=>{g.pid!==void 0&&Si(g.pid),f({content:`Command timed out after ${u}ms`,isError:!0})},u),b="",w="",S=0,k=!1;function E(R){if(k||p||S<8e6)return;k=!0,console.warn(`[bash] overflow kill: stream=${R} totalBytes=${S} command="${c}"`),Le({event:"tool.overflow_kill",tool:"bash",total_bytes:S,stream:R}),g.kill("SIGKILL");let I=Pe((b+w).trimEnd()),C=NA(I)??void 0,x=Xs(I,1e5)+_B;f({content:x,truncated:!0,...C!==void 0?{testResult:C}:{}})}g.stdout.on("data",R=>{let I=8e6-S,C=R.length<=I?R:R.subarray(0,Math.max(0,I));S+=C.length,b+=C.toString("utf8"),E("stdout")}),g.stderr.on("data",R=>{let I=8e6-S,C=R.length<=I?R:R.subarray(0,Math.max(0,I));S+=C.length,w+=C.toString("utf8"),E("stderr")});let T=()=>{g.pid!==void 0&&Si(g.pid),f({content:"Command aborted",isError:!0})};a.addEventListener("abort",T),a.aborted&&T(),g.on("close",R=>{if(a.aborted){f({content:"Command aborted",isError:!0});return}if(R!==null&&R!==0){let _=Qs(w.trimEnd()||b.trimEnd());f({content:`Command exited with code ${R}${_.content?`
@@ -420,7 +420,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
420
420
 
421
421
  ${t}`}var uye,kC=y(()=>{"use strict";uye=new Set(["script","style","noscript","template","svg"])});function mye(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function M1(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function fye(e,t){let n=e.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,t)}async function O1(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??mye,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!pye.has(d.status)||u===o)return d;let p=fye(d,s)??M1(u,i,s);N("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=M1(u,i,s);N("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var pye,D1=y(()=>{"use strict";ue();pye=new Set([429,502,503,504])});import{BlockList as gye,isIP as EC}from"node:net";import{lookup as hye}from"node:dns/promises";import{Agent as yye}from"undici";function L1(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function vye(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function TC(e){let t=EC(e);return t===0?!1:Sye.check(e,t===4?"ipv4":"ipv6")}async function F1(e){return hye(e,{all:!0,verbatim:!0})}async function RC(e,t={}){if(t.allowPrivateHosts??L1())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=vye(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(EC(r)!==0)return TC(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??F1,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(TC(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function gm(e,t={}){let n=await RC(e,t);if(!n.allowed)throw new mr(n.reason)}async function bb(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=$1;s++){await gm(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??L1())?{dispatcher:kye}:{}},l=await O1(e,i,a,r.retry??{});if(!Tye.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new mr(`too many redirects (>${$1}) starting from ${t}`)}var bye,wye,Sye,mr,kye,$1,Tye,xC=y(()=>{"use strict";L();D1();bye=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],wye=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Sye=(()=>{let e=new gye;for(let[t,n]of bye)e.addSubnet(t,n,"ipv4");for(let[t,n]of wye)e.addSubnet(t,n,"ipv6");return e})(),mr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};kye=new yye({connect:{lookup(e,t,n){F1(e).then(r=>{let o=r.find(s=>TC(s.address));if(o!==void 0){n(new mr(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,EC(i.address))},r=>n(r,"",0))}}});$1=20,Tye=new Set([301,302,303,307,308])});var j1={};vn(j1,{enforceDomainPolicy:()=>fr,loadBrowserConfig:()=>AC});import{readFileSync as Eye}from"node:fs";import{join as Rye}from"path";function xye(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function N1(e,t){return xye(t).test(e)}function _ye(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(Aye.has(t))return!0;if(Cye.has(t))return!1}return!1}function B1(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Iye(e){if(e===void 0||e==="")return"auto";if(e==="playwright"||e==="agent-browser"||e==="auto")return e;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${e}`)}function U1(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Fl(t),t}function Pye(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Mye(e){try{return Eye(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Oye(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright"||t.backend==="agent-browser"||t.backend==="auto")n.backend=t.backend;else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=U1(t.defaultProfile)),n}function AC(e){let t=e?.env??v,n=e?.readFileSync??Mye,r=e?.surface??t.AGENT_SURFACE,o=_ye(t.AFK_BROWSER_HEADLESS,r),i=B1(t.AFK_BROWSER_ALLOWED_DOMAINS),s=B1(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Pye(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Iye(t.AFK_BROWSER_BACKEND),c=U1(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():Rye(Dn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Oye(u,g);return h.configPath=p,h}function fr(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(N1(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>N1(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Aye,Cye,ca=y(()=>{"use strict";L();U();Aye=new Set(["daemon","subagent","telegram","afk"]),Cye=new Set(["repl","interactive","cli"])});import{readFileSync as Dye}from"node:fs";import{join as $ye}from"node:path";import{homedir as Lye}from"node:os";function Nye(e){let t=e??Fye,n;try{n=Dye(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let i;try{i=new URL(o.url)}catch{return null}let{hostname:s,protocol:a}=i;if(!(s==="127.0.0.1"||s==="localhost"||s==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function Bye(e){try{return process.kill(e,0),!0}catch{return!1}}async function Uye(e,t,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),i=await fetch(`${e}/health`,{method:"GET",headers:{Authorization:`Bearer ${t}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),i.ok}catch{return!1}}async function CC(e){let t=Nye(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:Bye(t.pid)?await Uye(t.url,t.token)?{available:!0,connection:t,reason:null}:{available:!1,connection:t,reason:`health probe failed at ${t.url}`}:{available:!1,connection:t,reason:`stale connection file: PID ${t.pid} not alive`}}var Fye,H1=y(()=>{"use strict";Fye=$ye(Lye(),".config","agent-browser","connection.json")});async function W1(e){let{config:t,surface:n}=e;if(t.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(t.backend==="agent-browser"){let s=Date.now(),a=await CC(),l=Date.now()-s;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:l,availability:a}}if(n&&jye.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(t.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await CC(),i=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:i,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:i,availability:o}}var jye,K1=y(()=>{"use strict";H1();jye=new Set(["daemon","subagent"])});import{createHash as Hye}from"crypto";function G1(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Wye.test(e.label))}function q1(e){return Hye("sha256").update(e,"utf8").digest("hex").slice(0,8)}function z1(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Wye,wb=y(()=>{"use strict";Wye=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as Kye}from"crypto";import{mkdir as Gye,stat as qye,writeFile as zye}from"fs/promises";import{join as _C}from"path";import{gzip as Vye}from"zlib";import{promisify as Yye}from"util";function Jye(e){return _C(sn(e),"browser")}function Xye(e){return _C(Jye(e),"screenshots")}function Qye(){return new Date().toISOString().replace(/[:.]/g,"-")}function Zye(){return Kye(3).toString("hex")}async function Rc(e,t,n){if(t.length>V1)throw new Error(`writeScreenshotSidecar: buffer exceeds ${V1} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Xye(e);await Gye(r,{recursive:!0});let o=`${Qye()}-${Zye()}-${n}.png`,i=_C(r,o);await zye(i,t);let{size:s}=await qye(i);return{path:i,bytes:s}}var N7e,V1,IC=y(()=>{"use strict";U();wb();N7e=Yye(Vye);V1=5*1024*1024});var Sb,Y1=y(()=>{"use strict";Sb=class{baseUrl;token;constructor(t){this.baseUrl=t.url,this.token=t.token}async call(t,n,r=3e4){let o={version:1,method:t,params:n},i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:i.signal});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Agent Browser ${t} failed (HTTP ${a.status}): ${l}`)}return await a.json()}finally{clearTimeout(s)}}async listTabs(){return(await this.call("tabs.list",null)).tabs}async openTab(t){return{tabId:(await this.call("tabs.open",{url:t},6e4)).tab_id}}async closeTab(t){await this.call("tabs.close",{tab_id:t})}async read(t,n){return this.call("page.read",{tab_id:t,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(t,n){return this.call("page.inspect",{tab_id:t,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(t,n){await this.call("page.click",{tab_id:t,element_id:n})}async fill(t,n,r){await this.call("page.fill",{tab_id:t,element_id:n,value:r})}async press(t,n,r){await this.call("page.press",{tab_id:t,key:n,...r?{element_id:r}:{}})}async select(t,n,r){await this.call("page.select",{tab_id:t,element_id:n,value:r})}async waitFor(t,n,r){await this.call("page.wait",{tab_id:t,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(t,n){return this.call("page.eval",{tab_id:t,script:n})}async screenshot(t){return this.call("page.screenshot",{tab_id:t})}}});function PC(e){return{id:e.id,role:e.role,label:e.label,kind:e.kind,value:e.value,state:{disabled:e.disabled,...e.checked!==void 0?{checked:e.checked}:{},...e.selected!==void 0?{selected:e.selected}:{},...e.expanded!==void 0?{expanded:e.expanded}:{}},bbox:e.bbox,...e.selector?{selector:e.selector}:{}}}function J1(e,t){switch(t.kind){case"element_id":if(e.has(t.elementId))return t.elementId;throw new Error(`Element ${t.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function MC(e,t,n,r,o,i){switch(n){case"click":await e.click(t,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await e.fill(t,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await e.press(t,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await e.select(t,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let s=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await e.evalScript(t,`document.querySelector('[data-element-id="${s}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await e.waitFor(t,"element",{value:r,timeout:i??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function X1(e,t){if(t.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await e.client.inspect(e.tabId,{mode:"interactive",query:t.target.text,limit:10}),r=n;if(t.target.role){let l=t.target.role.toLowerCase();r=n.filter(c=>c.role.toLowerCase()===l)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${t.target.text}"`+(t.target.role?`, role="${t.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:t.target.text,...t.target.role?{role:t.target.role}:{}},candidates:r.slice(0,5).map(PC)};let i=r[0].id;await MC(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=fr(s.url,e.config);return a.allowed?{elementId:i}:{outcome:"blocked_by_policy",url:s.url,reason:`action navigated to blocked domain: ${a.reason}`}}var Q1=y(()=>{"use strict";ca()});var Z1={};vn(Z1,{AgentBrowserProvider:()=>OC});var OC,eH=y(()=>{"use strict";ca();IC();Y1();Q1();OC=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new Sb(n)}async open(t){let n=fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let r=this.sessions.get(t.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(t.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:t.timeoutMs??3e4});else{let{tabId:s}=await this.client.openTab(t.url);await this.client.waitFor(s,"load",{timeout:t.timeoutMs??3e4}),r={tabId:s,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(t.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),i=fr(o.url,this.config);return i.allowed?this.buildObservation(r,t.sessionId,t.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${i.reason}`})}async observe(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);return this.buildObservation(n,t.sessionId,t.screenshot,t.maxElements,"browser_observe")}async act(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);let r=J1(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await X1({client:this.client,config:this.config,tabId:n.tabId},t);return"outcome"in s?s:(n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"))}throw t.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(t.target)}`)}await MC(this.client,n.tabId,t.action,r,t.value,t.timeoutMs),n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),i=fr(o.url,this.config);return i.allowed?this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${i.reason}`})}async render(t){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);if(t.target!==void 0||t.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),i=o.length>=24?o.readUInt32BE(16):0,s=o.length>=24?o.readUInt32BE(20):0;return{path:(await Rc(t.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:i,height:s,dataBase64:r.data,mediaType:"image/png"}}async extract(t){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(t){let n=this.sessions.get(t.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(t.sessionId)}}describe(t){let n=this.sessions.get(t);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let t=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(t),this.sessions.clear()}async buildObservation(t,n,r,o,i="browser_open"){let[s,a]=await Promise.all([this.client.read(t.tabId,{mode:"main",budget:4e3}),this.client.inspect(t.tabId,{mode:"interactive",limit:o??80})]),l=a.elements.map(PC),c=o??80,u=l.slice(0,c);t.observationCounter+=1,t.knownElements=new Map(u.map(h=>[h.id,h])),t.currentUrl=s.url,t.currentTitle=s.title;let d=[];l.length>c&&d.push(`page has ${l.length} interactive elements; showing first ${c}`);let p=null;if(r)try{let h=await this.client.screenshot(t.tabId),b=Buffer.from(h.data,"base64");p=(await Rc(n,b,i)).path}catch{d.push("screenshot capture failed")}let f=`obs_${t.observationCounter.toString(36)}`,g={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:s.url,title:s.title,textSummary:s.content.slice(0,4e3),interactive:u,status:g,warnings:d,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as ebe,readFileSync as tbe}from"node:fs";import{createRequire as nbe}from"node:module";import{dirname as rbe,join as obe}from"node:path";function rH(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<sbe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function mn(e){let t=rH(e);return nH.some(n=>t.includes(n))}function abe(){try{let t=nbe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(tbe(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=obe(rbe(t),o);return ebe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function hm(){return tH??=abe()??ibe,tH}function DC(e){return e.includes("install chromium")}function Wn(e,t){let n=rH(e),r=t?.latched===!0?` ${lbe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${hm()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${hm()}). Or pick a different tool.${r}`}function ym(e,t,n=!1){if(!mn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
422
422
 
423
- ${Wn(e,{headless:t,latched:n})}`,{cause:e})}var nH,ibe,sbe,tH,lbe,vb=y(()=>{"use strict";nH=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],ibe="pnpm exec playwright install chromium",sbe=4;lbe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import ua from"node:fs";import kb from"node:path";import{randomBytes as cbe}from"node:crypto";import{chromium as ube}from"playwright";function dbe(){try{return"5.169.1"}catch{}try{let e=kb.resolve(import.meta.dirname,"../../../package.json"),t=ua.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var pbe,Tb,oH=y(()=>{"use strict";vb();U();ue();pbe=dbe(),Tb=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=ube.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=ym(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let 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 a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);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(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.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/${pbe}`}}loadStorageState(t){let n=Nl(t);try{if(!ua.existsSync(n))return;let r=JSON.parse(ua.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Nl(t);if(!ua.existsSync(r))return;let o=await n.storageState(),i=kb.join(kb.dirname(r),`.${kb.basename(r)}.${process.pid}.${cbe(4).toString("hex")}.tmp`);ua.writeFileSync(i,JSON.stringify(o),{mode:384}),ua.chmodSync(i,384),ua.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as mbe}from"node:crypto";function fbe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function gbe(e,t,n){return`el_${mbe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function hbe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function iH(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function aH(e,t){let n=e.role??"",r=e.name??"";sH.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])aH(i,t)}async function ybe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},lH).catch(()=>[])}async function bbe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},lH).catch(()=>[])}function wbe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Eb(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=wbe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=ybe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],aH(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await bbe(e)).filter(D=>sH.has(D.role??"")));let S=new Map;for(let M of p){let D=iH(M.name),B=S.get(D);(!B||B.bbox.w===0&&M.bbox.w>0)&&S.set(D,M)}let k=b.map(M=>({ax:M,dom:S.get(iH(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,D)=>{let B=M.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(B!==F)return B-F;let j=M.dom?.bbox.x??0,q=D.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,D)=>{let B=M.ax.role??"generic",F=M.ax.name??"",j=gbe(B,F,D),q=M.dom?.bbox??{x:0,y:0,w:0,h:0},H=M.dom?.type??null,W=null;M.ax.value!==void 0&&M.ax.value!==null&&(W=String(M.ax.value)),M.ax.checked!==void 0&&(W=String(M.ax.checked)),G1({role:B,kind:H})&&(W="[redacted]");let Q={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(Q.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(Q.selected=M.ax.selected),M.ax.expanded!==void 0&&(Q.expanded=M.ax.expanded);let G;M.dom?.testId?G=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(G=`#${M.dom.id}`);let P={id:j,role:B,label:fbe(F),kind:H,value:W,state:Q,bbox:q};return G!==void 0&&(P.selector=G),P}),I="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?I="loading":M==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=hbe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var sH,lH,cH=y(()=>{"use strict";wb();sH=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);lH="a[href], button, input, select, textarea, [role], [tabindex], label"});async function uH(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>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 $C(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>uH(e,i)))).filter(o=>o!==null)}async function Sbe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function LC(e,t,n){switch(t.kind){case"element_id":return vbe(e,t,n);case"selector":return kbe(e,t);case"semantic":return Tbe(e,t)}}async function vbe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await $C(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function kbe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await $C(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Tbe(e,t){return t.role!==void 0?Ebe(e,t.text,t.role):Rbe(e,t.text,t)}async function Ebe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await $C(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Rbe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Sbe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await uH(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,k=0;for(let E=0;E<S.length;E++)k=k*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var dH=y(()=>{"use strict"});async function FC(e,t,n,r){let o=e.url();if(o===n)return null;let i=fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var pH=y(()=>{"use strict";ca()});var BC={};vn(BC,{PlaywrightProvider:()=>NC});function mH(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var NC,UC=y(()=>{"use strict";oH();cH();dH();ca();pH();IC();NC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Tb(t)}async open(t){let n=fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await FC(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await Eb(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Eb(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,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),i=r.url(),s=t.timeoutMs??3e4,a=await LC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mH(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await FC(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Eb(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,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),i;if(t.target!==void 0){let u=await LC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mH(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Rc(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);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(t){let n=this.sessions.get(t);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(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Rc(n,o,r);return i}catch{return null}}}});var pa={};vn(pa,{__resetBrowserRegistryForTests:()=>Pbe,browserProviderActive:()=>Cbe,closeBrowserProvider:()=>HC,getBrowserProvider:()=>Abe,getLastRoutingDecision:()=>Ibe,peekBrowserProvider:()=>_be});function fH(){Promise.resolve(HC()).then(()=>{process.exit(130)})}function gH(){Promise.resolve(HC()).then(()=>{process.exit(143)})}function hH(){Yr=null}function xbe(){Rb||(process.on("SIGINT",fH),process.on("SIGTERM",gH),process.on("exit",hH),Rb=!0)}function yH(){Rb&&(process.removeListener("SIGINT",fH),process.removeListener("SIGTERM",gH),process.removeListener("exit",hH),Rb=!1)}async function Abe(e){return Yr!==null?Yr:(da!==null||(da=(async()=>{let t=AC(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??v.AGENT_SURFACE,r=await W1({config:t,surface:n});jC=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(eH(),Z1)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(UC(),BC));o=new i(t)}return xbe(),Yr=o,da=null,o})()),da)}async function HC(){if(Yr===null)return;let e=Yr;Yr=null,da=null,yH(),await e.shutdown()}function Cbe(){return Yr!==null}function _be(){return Yr}function Ibe(){return jC}function Pbe(){Yr=null,da=null,jC=null,yH()}var Yr,da,Rb,jC,ma=y(()=>{"use strict";ca();K1();L();Yr=null,da=null,Rb=!1,jC=null});async function bH(e,t){try{return await _1(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Fbe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ma(),pa)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(UC(),BC)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(ca(),j1)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function wH(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Fbe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await bb(n,e,{headers:Lbe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if($be.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Dbe.test(p)&&!Obe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await bH(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof mr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=vC({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await gm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>gm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await gm(d.finalUrl,o);let p=await bH(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=vC({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof mr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Obe,Dbe,$be,Lbe,SH=y(()=>{"use strict";I1();kC();xC();ue();Obe=/(text\/html|application\/xhtml\+xml)/i,Dbe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,$be=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Lbe={"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 Ube(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Nbe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Bbe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function vH(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Ube({apiKey:e.exaApiKey,fetchFn:e.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 kH(e,t){if(t.length===0)return`# Search results for "${e}"
423
+ ${Wn(e,{headless:t,latched:n})}`,{cause:e})}var nH,ibe,sbe,tH,lbe,vb=y(()=>{"use strict";nH=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],ibe="pnpm exec playwright install chromium",sbe=4;lbe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import ua from"node:fs";import kb from"node:path";import{randomBytes as cbe}from"node:crypto";import{chromium as ube}from"playwright";function dbe(){try{return"5.169.3"}catch{}try{let e=kb.resolve(import.meta.dirname,"../../../package.json"),t=ua.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var pbe,Tb,oH=y(()=>{"use strict";vb();U();ue();pbe=dbe(),Tb=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=ube.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=ym(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let 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 a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);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(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.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/${pbe}`}}loadStorageState(t){let n=Nl(t);try{if(!ua.existsSync(n))return;let r=JSON.parse(ua.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Nl(t);if(!ua.existsSync(r))return;let o=await n.storageState(),i=kb.join(kb.dirname(r),`.${kb.basename(r)}.${process.pid}.${cbe(4).toString("hex")}.tmp`);ua.writeFileSync(i,JSON.stringify(o),{mode:384}),ua.chmodSync(i,384),ua.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as mbe}from"node:crypto";function fbe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function gbe(e,t,n){return`el_${mbe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function hbe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function iH(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function aH(e,t){let n=e.role??"",r=e.name??"";sH.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])aH(i,t)}async function ybe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},lH).catch(()=>[])}async function bbe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},lH).catch(()=>[])}function wbe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Eb(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=wbe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=ybe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],aH(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await bbe(e)).filter(D=>sH.has(D.role??"")));let S=new Map;for(let M of p){let D=iH(M.name),B=S.get(D);(!B||B.bbox.w===0&&M.bbox.w>0)&&S.set(D,M)}let k=b.map(M=>({ax:M,dom:S.get(iH(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,D)=>{let B=M.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(B!==F)return B-F;let j=M.dom?.bbox.x??0,q=D.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,D)=>{let B=M.ax.role??"generic",F=M.ax.name??"",j=gbe(B,F,D),q=M.dom?.bbox??{x:0,y:0,w:0,h:0},H=M.dom?.type??null,W=null;M.ax.value!==void 0&&M.ax.value!==null&&(W=String(M.ax.value)),M.ax.checked!==void 0&&(W=String(M.ax.checked)),G1({role:B,kind:H})&&(W="[redacted]");let Q={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(Q.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(Q.selected=M.ax.selected),M.ax.expanded!==void 0&&(Q.expanded=M.ax.expanded);let G;M.dom?.testId?G=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(G=`#${M.dom.id}`);let P={id:j,role:B,label:fbe(F),kind:H,value:W,state:Q,bbox:q};return G!==void 0&&(P.selector=G),P}),I="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?I="loading":M==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=hbe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var sH,lH,cH=y(()=>{"use strict";wb();sH=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);lH="a[href], button, input, select, textarea, [role], [tabindex], label"});async function uH(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>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 $C(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>uH(e,i)))).filter(o=>o!==null)}async function Sbe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function LC(e,t,n){switch(t.kind){case"element_id":return vbe(e,t,n);case"selector":return kbe(e,t);case"semantic":return Tbe(e,t)}}async function vbe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await $C(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function kbe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await $C(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Tbe(e,t){return t.role!==void 0?Ebe(e,t.text,t.role):Rbe(e,t.text,t)}async function Ebe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await $C(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Rbe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Sbe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await uH(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,k=0;for(let E=0;E<S.length;E++)k=k*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var dH=y(()=>{"use strict"});async function FC(e,t,n,r){let o=e.url();if(o===n)return null;let i=fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var pH=y(()=>{"use strict";ca()});var BC={};vn(BC,{PlaywrightProvider:()=>NC});function mH(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var NC,UC=y(()=>{"use strict";oH();cH();dH();ca();pH();IC();NC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Tb(t)}async open(t){let n=fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await FC(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await Eb(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Eb(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,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),i=r.url(),s=t.timeoutMs??3e4,a=await LC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mH(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await FC(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Eb(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,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),i;if(t.target!==void 0){let u=await LC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mH(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Rc(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);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(t){let n=this.sessions.get(t);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(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Rc(n,o,r);return i}catch{return null}}}});var pa={};vn(pa,{__resetBrowserRegistryForTests:()=>Pbe,browserProviderActive:()=>Cbe,closeBrowserProvider:()=>HC,getBrowserProvider:()=>Abe,getLastRoutingDecision:()=>Ibe,peekBrowserProvider:()=>_be});function fH(){Promise.resolve(HC()).then(()=>{process.exit(130)})}function gH(){Promise.resolve(HC()).then(()=>{process.exit(143)})}function hH(){Yr=null}function xbe(){Rb||(process.on("SIGINT",fH),process.on("SIGTERM",gH),process.on("exit",hH),Rb=!0)}function yH(){Rb&&(process.removeListener("SIGINT",fH),process.removeListener("SIGTERM",gH),process.removeListener("exit",hH),Rb=!1)}async function Abe(e){return Yr!==null?Yr:(da!==null||(da=(async()=>{let t=AC(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??v.AGENT_SURFACE,r=await W1({config:t,surface:n});jC=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(eH(),Z1)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(UC(),BC));o=new i(t)}return xbe(),Yr=o,da=null,o})()),da)}async function HC(){if(Yr===null)return;let e=Yr;Yr=null,da=null,yH(),await e.shutdown()}function Cbe(){return Yr!==null}function _be(){return Yr}function Ibe(){return jC}function Pbe(){Yr=null,da=null,jC=null,yH()}var Yr,da,Rb,jC,ma=y(()=>{"use strict";ca();K1();L();Yr=null,da=null,Rb=!1,jC=null});async function bH(e,t){try{return await _1(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Fbe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ma(),pa)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(UC(),BC)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(ca(),j1)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function wH(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Fbe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await bb(n,e,{headers:Lbe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if($be.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Dbe.test(p)&&!Obe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await bH(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof mr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=vC({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await gm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>gm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await gm(d.finalUrl,o);let p=await bH(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=vC({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof mr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Obe,Dbe,$be,Lbe,SH=y(()=>{"use strict";I1();kC();xC();ue();Obe=/(text\/html|application\/xhtml\+xml)/i,Dbe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,$be=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Lbe={"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 Ube(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Nbe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Bbe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function vH(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Ube({apiKey:e.exaApiKey,fetchFn:e.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 kH(e,t){if(t.length===0)return`# Search results for "${e}"
424
424
 
425
425
  (no results)`;let n=[`# Search results for "${e}"`,""];return t.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(`
426
426
  `).trimEnd()}var Nbe,Bbe,TH=y(()=>{"use strict";je();Nbe="https://api.exa.ai/search",Bbe=10});function xb(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var fa=y(()=>{"use strict";vb()});function qbe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.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,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=jbe;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,Hbe)}let a=Wbe;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,Kbe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function WC(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Xs(e,t),truncated:!0}}function zbe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=qbe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await RC(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await bb(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof mr?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=WC(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await wH(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=WC(P1(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof mr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=mn(p)&&!DC(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${hm()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=vH({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:Gbe,timeoutMs:s.timeoutMs,signal:a.signal}),f=WC(kH(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var jbe,Hbe,Wbe,Kbe,Gbe,EH,RH=y(()=>{"use strict";SH();TH();xC();yi();kC();fa();jbe=3e4,Hbe=12e4,Wbe=1e5,Kbe=1e6,Gbe=10;EH=zbe()});import{existsSync as AH,mkdirSync as Vbe,readFileSync as Ybe,renameSync as Jbe,unlinkSync as Xbe,writeFileSync as Qbe}from"node:fs";import{dirname as xH,join as Zbe}from"node:path";import{randomBytes as ewe}from"node:crypto";function Rn(e){let t=e??vh();if(!AH(t))return[];try{let n=Ybe(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Ei(e,t){let n=t??vh();Vbe(xH(n),{recursive:!0});let r=Zbe(xH(n),`.schedules.json.${process.pid}.${ewe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Qbe(r,o,"utf-8"),Jbe(r,n)}catch(i){try{AH(r)&&Xbe(r)}catch{}throw i}}function Ab(e,t){let n=Rn(t),r=n.map(l=>l.id),o=twe(e.name),i=nwe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Ei(n,t),a}function Cb(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Ei(o,t),!0)}function bm(e,t){return Rn(t).find(n=>n.id===e)}function twe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function nwe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function _b(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Ib=y(()=>{"use strict";U()});import{existsSync as rwe,readFileSync as owe}from"node:fs";import{join as iwe}from"node:path";async function Kn(e,t,n){let r,o;try{let i=iwe(cp("default"),"port");if(!rwe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=owe(i,"utf-8").trim(),a=swe(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function swe(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var Ri,KC=y(()=>{"use strict";U();Ri="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as awe}from"node:fs";import{readFile as lwe}from"node:fs/promises";var CH,_H,IH,PH,MH=y(()=>{"use strict";Ib();U();KC();CH=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=Ab({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await Kn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await Kn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:Ri}})}},_H=async(e,t)=>{let n=Rn();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},IH=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=sr();if(!awe(i))return{content:JSON.stringify([])};let s;try{let c=await lwe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1174,9 +1174,9 @@ ${w.content}`,isError:!0,...w.truncated===!0?{truncated:!0}:{}}),p.push({call:b,
1174
1174
 
1175
1175
  ${b}`:l,sessionId:this.initSessionId}:(yield{type:"assistant.message",text:l,sessionId:this.initSessionId},b!==null&&(yield{type:"notice",text:b,kind:"truncation",sessionId:this.initSessionId})),yield*this.finishTurn(p!==null?{...a,stopReason:p}:a,r)}*finishTurn(t,n){this.lastUsage=t,yield{type:"turn.completed",usage:{...t,durationMs:Date.now()-n},sessionId:this.initSessionId}}clarifyResponsesError(t,n){let r=t instanceof Error?t:new Error(String(t));if(!n||(t&&typeof t=="object"&&"status"in t?t.status:void 0)!==400&&!/\b400\b/.test(r.message))return r;let i,s=t?.error;if(s&&typeof s=="object"){let a=s;typeof a.detail=="string"?i=a.detail:typeof a.message=="string"&&(i=a.message)}return new Error(`ChatGPT/Codex backend rejected model "${this.currentModel}" (HTTP 400). A ChatGPT subscription only serves certain OpenAI models on this backend (gpt-5.6 and gpt-5.5 work; gpt-5, gpt-5.1, gpt-5.2 and *-codex do not). `+(i?`Backend said: ${i}`:"No error body was returned."))}async*runIteration(t,n,r=null){let o=JK({config:this.opts.config,...this.opts.config.resumeHistory!==void 0?{resumeHistory:this.opts.config.resumeHistory}:{},priorTurns:this.priorTurns,vision:n});if(o[0]?.role==="system"){let a=this.currentPermissionMode==="plan"?Kw:this.currentPermissionMode==="autonomous"?Gw:null;a!==null&&(o[0]={...o[0],content:o[0].content+`
1176
1176
 
1177
- `+a})}if(r!==null){let a=r===br?Xw:tS;o.push({role:"user",content:a})}let i=r!==null?void 0:this.activeOpenAITools(),s={controller:t,traceWriter:this.traceWriter,initSessionId:this.initSessionId,currentModel:this.currentModel,isClosed:()=>this.closed};if(this.wireMode==="responses"){let a=this.opts.auth.source==="chatgpt-oauth";if(a&&Ow(this.currentModel))return yield{type:"error",error:new Error(`Model "${this.currentModel}" can't run on a ChatGPT subscription \u2014 the ChatGPT/Codex backend only supports OpenAI gpt-5.x models. This usually means a subagent or skill requested a Claude model. Pass a gpt-5.x model to it (e.g. model: "gpt-5.5"); for an auto-dispatched agent you can't pass a model to (e.g. git-investigator), set AFK_DEFAULT_SUBAGENT_MODEL to a gpt-5.x id. Or run it on a provider configured with the matching API key.`)},null;let l=Nw({model:this.currentModel,messages:o,activeTools:i,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,temperature:this.opts.config.temperature,isChatGptBackend:a});return yield*pI(s,{createStream:async c=>await this.client.responses.create(l,{signal:c}),translate:(c,u)=>Mw(c,u,this.initSessionId),clarifyError:c=>this.clarifyResponsesError(c,a)})}else{let a=RG({model:this.currentModel,messages:o,activeTools:i,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,temperature:this.opts.config.temperature});return yield*pI(s,{createStream:async l=>await this.client.chat.completions.create(a,{signal:l}),translate:(l,c)=>tG(l,c,this.initSessionId),clarifyError:l=>l instanceof Error?l:new Error(String(l))})}}async*dispatchAndAppend(t,n,r){return yield*DG({state:t,signal:n,vision:r,toolDispatcher:this.toolDispatcher,traceWriter:this.traceWriter,priorTurns:this.priorTurns,sessionId:this.initSessionId,subagentId:this.opts.config.subagentId})}async interrupt(t="interrupted"){this.abort.requestAbort(t)}async compact(){let t=await this.compactHistory("manual");return t.compacted&&(this.lastUsage=null),t}async compactHistory(t){let n=this.priorTurns.length;if(this.opts.auth.apiKey===null)return{compacted:!1,reason:"no-usable-auth",messagesBefore:n,messagesAfter:n};if(this.wireMode==="responses"&&this.responsesCompactionUnavailable){let i=qc(v.AFK_MICROCOMPACT_TOOL_RESULT_BYTES,v.AFK_MICROCOMPACT_KEEP_LAST),{blocksCleared:s,bytesReclaimed:a}=tI(this.priorTurns,i);return s>0?{compacted:!1,reason:"microcompacted",messagesBefore:n,messagesAfter:this.priorTurns.length,microcompaction:{blocksCleared:s,bytesReclaimed:a}}:{compacted:!1,reason:"responses-compaction-unavailable",messagesBefore:n,messagesAfter:n}}let r=v.AFK_COMPACT_MODEL??this.currentModel,o=Ip($t(this.lastUsage??{}),vo(this.currentModel));return bG({priorTurns:this.priorTurns,usedFraction:o,shrinkAtFraction:yG(),summarize:(i,s)=>this.wireMode==="responses"?this.summarizeViaResponses(i,s,r):Uw({client:this.client,model:r,system:Nm,user:jm(i),maxTokens:1024,signal:s}),isClosed:this.closed,isIdle:this.abort.isIdle(),beginAbort:()=>this.abort.begin(),clearAbort:i=>this.abort.clear(i),trigger:t,traceWriter:this.traceWriter})}async summarizeViaResponses(t,n,r){try{return await AG({client:this.client,model:r,system:Nm,user:jm(t),isChatGptBackend:this.opts.auth.source==="chatgpt-oauth",maxTokens:1024,signal:n})}catch(o){if(!n.aborted&&KG(o)){this.responsesCompactionUnavailable=!0;let i=Di(o);re(this.traceWriter,{phase:"compaction_disabled",metadata:{wire:"responses",reason:"responses-compaction-unavailable",error:o instanceof Error?o.message:String(o),...i!==void 0?{status:i}:{}}})}throw o}}async setModel(t){t!==void 0&&(this.currentModel=Dt(t)??t)}async setPermissionMode(t){this.currentPermissionMode=nI(t);let n=cr(this.currentPermissionMode);this.toolDispatcher?.setAllowAll?.(n),this.onPermissionMode?.(this.currentPermissionMode)}setCwd(t){this.toolDispatcher?.setResolveBase?.(t),this.onCwdChange?.(t)}async supportedCommands(){return xw()}async supportedModels(){return[{value:"gpt-5.6",displayName:"GPT-5.6 (Sol)",description:"OpenAI flagship \u2014 alias for gpt-5.6-sol"},{value:"gpt-5.6-sol",displayName:"GPT-5.6 Sol",description:"Frontier capability"},{value:"gpt-5.6-terra",displayName:"GPT-5.6 Terra",description:"Balanced intelligence/cost"},{value:"gpt-5.6-luna",displayName:"GPT-5.6 Luna",description:"Fast, high-volume workloads"},{value:"gpt-5.5",displayName:"GPT-5.5",description:"Prior flagship (ChatGPT backend)"},{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=it(this.currentModel),r;if(t&&n>0){let s=$t(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=Cp(t);return{tools:[],agents:[],isAutoCompactEnabled:this.autoCompactThreshold!==void 0,apiUsage:i,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(t,n){return{canRewind:!1,error:`${mI} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed(),N(`\u{1F7E2} ${mI}: closed`)}}});var gI,Yt,Vke,Jc=y(()=>{"use strict";uw();wy();uc();fy();oc();w_();ya();Tn();tn();gi();F_();yr();fI();jw();Gt();M_();jc();fI();gI="openai-compatible",Yt=class{name=gI;providerOpts;memoryStore;workspaceStore;schemas;_defaultHeaders;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_initialResolveBase;_presenceSessionId=null;_mintedSessionId=null;constructor(t={}){this.providerOpts=t,this._defaultHeaders=t.defaultHeaders,this.memoryStore=t.memoryStore??new Lt,this.workspaceStore=t.workspaceStore;let n=[...Hr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??kn),t.skillExecutor&&n.push(Zs),t.composeExecutor&&n.push(ea),t.readOnlyMemory===!0?n.push(ic):n.push(...bi),n.push(...this.workspaceStore!==void 0?Dp:[],ur);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);this.schemas=n}setEndpointDefaults(t){t.baseURL!==void 0&&(this.providerOpts.baseURL=t.baseURL),t.defaultHeaders!==void 0&&(this._defaultHeaders=t.defaultHeaders)}query(t){let n=t.config,r=n.permissionMode??"default";this._currentPermissionMode=r,this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,i=typeof n.model=="string"?n.model:String(n.model),s=n.cwd??process.cwd(),a=Hp({surface:this.providerOpts.surface??"cli",getCwd:()=>s,modelName:i,providerName:gI,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof cn?o.toolDefs.map(E=>E.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?Wp(this.providerOpts.tools,a):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.subagentId!==void 0?{subagentId:n.subagentId}:{},...n.subagentToolOutputCapBytes!==void 0?{subagentToolOutputCapBytes:n.subagentToolOutputCapBytes}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:a,...n.isSkillDispatch?{isSkillDispatch:!0}:{},...n.isNonInteractive?{isNonInteractive:!0}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{},...n.planExitControls!==void 0?{planExitControls:n.planExitControls}:{}});let l=Cm({sessionId:n.sessionId,resume:n.resume,depth:n.depth,parentSessionId:n.parentSessionId,surface:this.providerOpts.surface??"cli",memoized:this._mintedSessionId});this._mintedSessionId=l.memoized;let c={};l.id!==void 0&&(c.sessionIdOverride=l.id);let u=n.openaiBaseUrl??this.providerOpts.baseURL;u!==void 0&&(c.baseURL=u),this._defaultHeaders!==void 0&&(c.defaultHeaders=this._defaultHeaders),c.toolDispatcher=o,c.onPermissionMode=E=>{this._currentPermissionMode=E},this.providerOpts.mcpManager!==void 0&&(c.mcpManager=this.providerOpts.mcpManager),this._presenceSessionId=_m({depth:n.depth,parentSessionId:n.parentSessionId,sessionId:l.id,currentPresenceSessionId:this._presenceSessionId,runtimeStateSource:a,surface:this.providerOpts.surface??"cli",cwd:n.cwd,providerName:gI,model:i});let d=Tw(n.isSkillDispatch),p=Ew(this.providerOpts.readOnlyMemory),f=this.providerOpts.skillExecutor?iS(void 0,{...typeof n.cwd=="string"&&n.cwd.length>0?{cwd:n.cwd}:{},...typeof n.skillDispatchName=="string"&&n.skillDispatchName.length>0?{excludeName:n.skillDispatchName}:{}}):"",g=typeof n.hotMemory=="string"?n.hotMemory:"",h=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,b=E=>{let T=[d];h!==void 0&&h.length>0&&T.push(h),T.push(p);let R=Rw(this.workspaceStore!==void 0);return R&&T.push(R),g.length>0&&T.push(g),T.push(E),f.length>0&&T.push(f),T.join(`
1177
+ `+a})}if(r!==null){let a=r===br?Xw:tS;o.push({role:"user",content:a})}let i=r!==null?void 0:this.activeOpenAITools(),s={controller:t,traceWriter:this.traceWriter,initSessionId:this.initSessionId,currentModel:this.currentModel,isClosed:()=>this.closed};if(this.wireMode==="responses"){let a=this.opts.auth.source==="chatgpt-oauth";if(a&&Ow(this.currentModel))return yield{type:"error",error:new Error(`Model "${this.currentModel}" can't run on a ChatGPT subscription \u2014 the ChatGPT/Codex backend only supports OpenAI gpt-5.x models. This usually means a subagent or skill requested a Claude model. Pass a gpt-5.x model to it (e.g. model: "gpt-5.5"); for an auto-dispatched agent you can't pass a model to (e.g. git-investigator), set AFK_DEFAULT_SUBAGENT_MODEL to a gpt-5.x id. Or run it on a provider configured with the matching API key.`)},null;let l=Nw({model:this.currentModel,messages:o,activeTools:i,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,temperature:this.opts.config.temperature,isChatGptBackend:a});return yield*pI(s,{createStream:async c=>await this.client.responses.create(l,{signal:c}),translate:(c,u)=>Mw(c,u,this.initSessionId),clarifyError:c=>this.clarifyResponsesError(c,a)})}else{let a=RG({model:this.currentModel,messages:o,activeTools:i,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,temperature:this.opts.config.temperature});return yield*pI(s,{createStream:async l=>await this.client.chat.completions.create(a,{signal:l}),translate:(l,c)=>tG(l,c,this.initSessionId),clarifyError:l=>l instanceof Error?l:new Error(String(l))})}}async*dispatchAndAppend(t,n,r){return yield*DG({state:t,signal:n,vision:r,toolDispatcher:this.toolDispatcher,traceWriter:this.traceWriter,priorTurns:this.priorTurns,sessionId:this.initSessionId,subagentId:this.opts.config.subagentId})}async interrupt(t="interrupted"){this.abort.requestAbort(t)}async compact(){let t=await this.compactHistory("manual");return t.compacted&&(this.lastUsage=null),t}async compactHistory(t){let n=this.priorTurns.length;if(this.opts.auth.apiKey===null)return{compacted:!1,reason:"no-usable-auth",messagesBefore:n,messagesAfter:n};if(this.wireMode==="responses"&&this.responsesCompactionUnavailable){let i=qc(v.AFK_MICROCOMPACT_TOOL_RESULT_BYTES,v.AFK_MICROCOMPACT_KEEP_LAST),{blocksCleared:s,bytesReclaimed:a}=tI(this.priorTurns,i);return s>0?{compacted:!1,reason:"microcompacted",messagesBefore:n,messagesAfter:this.priorTurns.length,microcompaction:{blocksCleared:s,bytesReclaimed:a}}:{compacted:!1,reason:"responses-compaction-unavailable",messagesBefore:n,messagesAfter:n}}let r=v.AFK_COMPACT_MODEL??this.currentModel,o=Ip($t(this.lastUsage??{}),vo(this.currentModel));return bG({priorTurns:this.priorTurns,usedFraction:o,shrinkAtFraction:yG(),summarize:(i,s)=>this.wireMode==="responses"?this.summarizeViaResponses(i,s,r):Uw({client:this.client,model:r,system:Nm,user:jm(i),maxTokens:1024,signal:s}),isClosed:this.closed,isIdle:this.abort.isIdle(),beginAbort:()=>this.abort.begin(),clearAbort:i=>this.abort.clear(i),trigger:t,traceWriter:this.traceWriter})}async summarizeViaResponses(t,n,r){try{return await AG({client:this.client,model:r,system:Nm,user:jm(t),isChatGptBackend:this.opts.auth.source==="chatgpt-oauth",maxTokens:1024,signal:n})}catch(o){if(!n.aborted&&KG(o)){this.responsesCompactionUnavailable=!0;let i=Di(o);re(this.traceWriter,{phase:"compaction_disabled",metadata:{wire:"responses",reason:"responses-compaction-unavailable",error:o instanceof Error?o.message:String(o),...i!==void 0?{status:i}:{}}})}throw o}}async setModel(t){t!==void 0&&(this.currentModel=Dt(t)??t)}async setPermissionMode(t){this.currentPermissionMode=nI(t);let n=cr(this.currentPermissionMode);this.toolDispatcher?.setAllowAll?.(n),this.onPermissionMode?.(this.currentPermissionMode)}setCwd(t){this.toolDispatcher?.setResolveBase?.(t),this.onCwdChange?.(t)}async supportedCommands(){return xw()}async supportedModels(){return[{value:"gpt-5.6",displayName:"GPT-5.6 (Sol)",description:"OpenAI flagship \u2014 alias for gpt-5.6-sol"},{value:"gpt-5.6-sol",displayName:"GPT-5.6 Sol",description:"Frontier capability"},{value:"gpt-5.6-terra",displayName:"GPT-5.6 Terra",description:"Balanced intelligence/cost"},{value:"gpt-5.6-luna",displayName:"GPT-5.6 Luna",description:"Fast, high-volume workloads"},{value:"gpt-5.5",displayName:"GPT-5.5",description:"Prior flagship (ChatGPT backend)"},{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=it(this.currentModel),r;if(t&&n>0){let s=$t(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=Cp(t);return{tools:[],agents:[],isAutoCompactEnabled:this.autoCompactThreshold!==void 0,apiUsage:i,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(t,n){return{canRewind:!1,error:`${mI} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed(),N(`\u{1F7E2} ${mI}: closed`)}}});var gI,Yt,Vke,Jc=y(()=>{"use strict";uw();wy();uc();fy();oc();w_();ya();Tn();tn();gi();F_();yr();fI();jw();Gt();M_();jc();fI();gI="openai-compatible",Yt=class{name=gI;providerOpts;memoryStore;workspaceStore;schemas;_defaultHeaders;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_sharedCurrentCwd;_presenceSessionId=null;_mintedSessionId=null;constructor(t={}){this.providerOpts=t,this._defaultHeaders=t.defaultHeaders,this.memoryStore=t.memoryStore??new Lt,this.workspaceStore=t.workspaceStore;let n=[...Hr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??kn),t.skillExecutor&&n.push(Zs),t.composeExecutor&&n.push(ea),t.readOnlyMemory===!0?n.push(ic):n.push(...bi),n.push(...this.workspaceStore!==void 0?Dp:[],ur);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);this.schemas=n}setEndpointDefaults(t){t.baseURL!==void 0&&(this.providerOpts.baseURL=t.baseURL),t.defaultHeaders!==void 0&&(this._defaultHeaders=t.defaultHeaders)}query(t){let n=t.config,r=n.permissionMode??"default";this._currentPermissionMode=r,this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,i=typeof n.model=="string"?n.model:String(n.model),s=n.cwd??process.cwd(),a=Hp({surface:this.providerOpts.surface??"cli",getCwd:()=>s,modelName:i,providerName:gI,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof cn?o.toolDefs.map(E=>E.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?Wp(this.providerOpts.tools,a):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.subagentId!==void 0?{subagentId:n.subagentId}:{},...n.subagentToolOutputCapBytes!==void 0?{subagentToolOutputCapBytes:n.subagentToolOutputCapBytes}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:a,...n.isSkillDispatch?{isSkillDispatch:!0}:{},...n.isNonInteractive?{isNonInteractive:!0}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{},...n.planExitControls!==void 0?{planExitControls:n.planExitControls}:{}});let l=Cm({sessionId:n.sessionId,resume:n.resume,depth:n.depth,parentSessionId:n.parentSessionId,surface:this.providerOpts.surface??"cli",memoized:this._mintedSessionId});this._mintedSessionId=l.memoized;let c={};l.id!==void 0&&(c.sessionIdOverride=l.id);let u=n.openaiBaseUrl??this.providerOpts.baseURL;u!==void 0&&(c.baseURL=u),this._defaultHeaders!==void 0&&(c.defaultHeaders=this._defaultHeaders),c.toolDispatcher=o,c.onPermissionMode=E=>{this._currentPermissionMode=E},this.providerOpts.mcpManager!==void 0&&(c.mcpManager=this.providerOpts.mcpManager),this._presenceSessionId=_m({depth:n.depth,parentSessionId:n.parentSessionId,sessionId:l.id,currentPresenceSessionId:this._presenceSessionId,runtimeStateSource:a,surface:this.providerOpts.surface??"cli",cwd:n.cwd,providerName:gI,model:i});let d=Tw(n.isSkillDispatch),p=Ew(this.providerOpts.readOnlyMemory),f=this.providerOpts.skillExecutor?iS(void 0,{...typeof n.cwd=="string"&&n.cwd.length>0?{cwd:n.cwd}:{},...typeof n.skillDispatchName=="string"&&n.skillDispatchName.length>0?{excludeName:n.skillDispatchName}:{}}):"",g=typeof n.hotMemory=="string"?n.hotMemory:"",h=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,b=E=>{let T=[d];h!==void 0&&h.length>0&&T.push(h),T.push(p);let R=Rw(this.workspaceStore!==void 0);return R&&T.push(R),g.length>0&&T.push(g),T.push(E),f.length>0&&T.push(f),T.join(`
1178
1178
 
1179
- `)},w=()=>jp({cwd:s,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:a.getWorkspace()}),S={...n,systemPrompt:b(w())},k=E=>{s=E,S.systemPrompt=b(w())};return c.onCwdChange=k,qG(S,t.prompt,c)}buildDispatcher(t,n){let r=ow(t,n.cwd),o=Up(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[u,d]of o)this.providerOpts.readOnlyMemory===!0&&u!=="memory_search"||r.set(u,d);if(this.workspaceStore!==void 0)for(let[u,d]of $p(this.workspaceStore,n.sessionId??"",n.subagentId))r.set(u,d);n.runtimeStateSource&&r.set("get_runtime_state",sc(n.runtimeStateSource));for(let u of this.providerOpts.customTools??[])r.has(u.schema.name)||r.set(u.schema.name,u.handler);let i=n.planExitControls;i&&r.set(xn,aw(i));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[u,d]of this.providerOpts.mcpManager.getMcpHandlers())r.set(u,d);let a=n.isSkillDispatch?this.schemas.filter(u=>u.name!=="ask_question"&&u.name!=="terminal_font_size"):n.isNonInteractive?this.schemas.filter(u=>u.name!=="ask_question"):this.schemas,l={handlers:r,schemas:[...a,...s,...i?[sw]:[]],hookRegistry:cw(n.hookRegistry,this.providerOpts.hookRegistry)},c=by(this.providerOpts.mcpManager?yy(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(u=>u.schema.name));return c!==void 0&&(l.permissions=c),this.providerOpts.subagentExecutor!==void 0&&(l.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(l.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(l.composeExecutor=this.providerOpts.composeExecutor),this.providerOpts.canUseTool!==void 0&&(l.canUseTool=this.providerOpts.canUseTool),n.cwd!==void 0&&(l.cwd=n.cwd),n.readRoots!==void 0&&(l.readRoots=n.readRoots),n.writeRoots!==void 0&&(l.writeRoots=n.writeRoots),n.sessionId!==void 0&&(l.sessionId=n.sessionId),n.parentSessionId!==void 0&&(l.parentSessionId=n.parentSessionId),n.subagentId!==void 0&&(l.subagentId=n.subagentId),n.subagentToolOutputCapBytes!==void 0&&(l.maxOutputBytes=n.subagentToolOutputCapBytes),n.traceWriter!==void 0&&(l.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(l.readOnlyBash=!0),l.allowAll=cr(t),l.sessionGrantManager=this,new cn(l)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t)}}grantManager=new fi({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._initialResolveBase,getAllowAll:()=>cr(this._currentPermissionMode)});addReadRoot(t,n="slash",r){this.grantManager.addReadRoot(t,n,r)}addWriteRoot(t,n="slash",r){this.grantManager.addWriteRoot(t,n,r)}revokeRoot(t,n="slash",r){this.grantManager.revokeRoot(t,n,r)}getGrants(){return this.grantManager.getGrants()}close(){this.memoryStore.close(),this.workspaceStore?.close()}async complete(t){let n={model:t.model??"gpt-4o-mini",system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.apiKey!==void 0&&(n.apiKey=t.apiKey);let r=t.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),this._defaultHeaders!==void 0&&(n.defaultHeaders=this._defaultHeaders),t.signal&&(n.signal=t.signal),Uw(n)}},Vke=new Yt});function Fi(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}function Sr(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":Fi(Yke,e)?"read":Fi(Jke,e)?"write":Fi(Xke,e)?"shell":Fi(Ni,e)?"subagent":Fi(zm,e)?"skill":Fi(Vm,e)?"dag":Fi(Qke,e)?"web":Zke.has(e)?"browser":Fi(eTe,e)?"planning":tTe.has(e)?"schedule":"other"}function yI(e){return nTe[e]}var Yke,Jke,Xke,Ni,zm,Vm,dt,Qke,Zke,eTe,tTe,hI,zG,nTe,Ta=y(()=>{"use strict";Oy();Yke=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","extract_document","glob","grep","list_directory","config_get","memory_search","workspace_query","read_witness","search_witness"]),Jke=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size","config_set","workspace_publish"]),Xke=new Set(["Bash","BashOutput","KillBash","bash"]),Ni=new Set(["Agent","Task","agent","cancel_background_job"]),zm=new Set(["Skill","skill"]),Vm=new Set(["Compose","compose"]),dt=new Set([...Ni,...Vm,...zm]),Qke=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),Zke=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),eTe=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),tTe=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);hI=["Read","Glob","Grep","NotebookRead","LS","read_file","extract_document","glob","grep","list_directory","config_get","memory_search","read_witness","search_witness","workspace_publish","workspace_query",...At],zG=[...hI,"web_scrape","agent"];nTe={subagent:"worker",skill:"skill",dag:"workflow"}});function sS(e,t){return`Skill tool not available at nesting depth ${e} (max ${t}). ${Bi}`}function VG(e,t){return`Agent tool not available at nesting depth ${e} (max ${t}). ${Bi}`}function YG(e,t){return`Compose tool not available at nesting depth ${e} (max ${t}). ${Bi}`}var Bi,Ym=y(()=>{"use strict";Bi="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function XG(e){JG.add(e)}function QG(e){return JG.has(e)}var JG,bI=y(()=>{"use strict";JG=new Set});function ZG(e){wI.add(e)}function e2(e){wI.delete(e)}function t2(e){SI.add(e)}function n2(e){SI.delete(e)}function r2(e){for(let t of wI)t(e)}function o2(e){for(let t of SI)t(e)}var wI,SI,vI=y(()=>{"use strict";wI=new Set,SI=new Set});function aS(e){return rTe.has(e)}function i2(e,t=oTe){return e.length<=t?e:e.slice(0,t)+"\u2026"}function Xc(e){return e.surface!==void 0?{origin:Ci(e.surface),actor:_i(e.depth)}:{}}var rTe,oTe,kI=y(()=>{"use strict";ba();rTe=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);oTe=240});function s2(e){let t=[],n="",r=null,o=!1;for(let i of e){if(r!==null){i===r?r=null:n+=i;continue}if(i==='"'||i==="'"){r=i,o=!0;continue}if(/\s/.test(i)){o&&(t.push(n),n="",o=!1);continue}n+=i,o=!0}return o&&t.push(n),t}function Ui(e,t){let n=t??"",r;return e.replace(/(\\?)\$(ARGUMENTS?\b|\{(\d+)\})/g,(o,i,s,a)=>{if(i==="\\")return o.slice(1);if(s==="ARGUMENT"||s==="ARGUMENTS")return n;let l=Number(a);return l<1?o:(r??=s2(n),r[l-1]??o)})}var lS=y(()=>{"use strict"});function a2(e,t,n){let r=n&&n.trim().length>0?n.trim():"(none)";return{content:`${`[Skill "${e}" loaded into your current context \u2014 act on it now]
1179
+ `)},w=()=>jp({cwd:s,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:a.getWorkspace()}),S={...n,systemPrompt:b(w())},k=E=>{s=E,this._sharedCurrentCwd=E,S.systemPrompt=b(w())};return c.onCwdChange=k,qG(S,t.prompt,c)}buildDispatcher(t,n){let r=ow(t,n.cwd),o=Up(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[u,d]of o)this.providerOpts.readOnlyMemory===!0&&u!=="memory_search"||r.set(u,d);if(this.workspaceStore!==void 0)for(let[u,d]of $p(this.workspaceStore,n.sessionId??"",n.subagentId))r.set(u,d);n.runtimeStateSource&&r.set("get_runtime_state",sc(n.runtimeStateSource));for(let u of this.providerOpts.customTools??[])r.has(u.schema.name)||r.set(u.schema.name,u.handler);let i=n.planExitControls;i&&r.set(xn,aw(i));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[u,d]of this.providerOpts.mcpManager.getMcpHandlers())r.set(u,d);let a=n.isSkillDispatch?this.schemas.filter(u=>u.name!=="ask_question"&&u.name!=="terminal_font_size"):n.isNonInteractive?this.schemas.filter(u=>u.name!=="ask_question"):this.schemas,l={handlers:r,schemas:[...a,...s,...i?[sw]:[]],hookRegistry:cw(n.hookRegistry,this.providerOpts.hookRegistry)},c=by(this.providerOpts.mcpManager?yy(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(u=>u.schema.name));return c!==void 0&&(l.permissions=c),this.providerOpts.subagentExecutor!==void 0&&(l.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(l.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(l.composeExecutor=this.providerOpts.composeExecutor),this.providerOpts.canUseTool!==void 0&&(l.canUseTool=this.providerOpts.canUseTool),n.cwd!==void 0&&(l.cwd=n.cwd),n.readRoots!==void 0&&(l.readRoots=n.readRoots),n.writeRoots!==void 0&&(l.writeRoots=n.writeRoots),n.sessionId!==void 0&&(l.sessionId=n.sessionId),n.parentSessionId!==void 0&&(l.parentSessionId=n.parentSessionId),n.subagentId!==void 0&&(l.subagentId=n.subagentId),n.subagentToolOutputCapBytes!==void 0&&(l.maxOutputBytes=n.subagentToolOutputCapBytes),n.traceWriter!==void 0&&(l.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(l.readOnlyBash=!0),l.allowAll=cr(t),l.sessionGrantManager=this,new cn(l)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._sharedCurrentCwd&&(this._sharedCurrentCwd=t)}}grantManager=new fi({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._sharedCurrentCwd,getAllowAll:()=>cr(this._currentPermissionMode)});addReadRoot(t,n="slash",r){this.grantManager.addReadRoot(t,n,r)}addWriteRoot(t,n="slash",r){this.grantManager.addWriteRoot(t,n,r)}revokeRoot(t,n="slash",r){this.grantManager.revokeRoot(t,n,r)}getGrants(){return this.grantManager.getGrants()}close(){this.memoryStore.close(),this.workspaceStore?.close()}async complete(t){let n={model:t.model??"gpt-4o-mini",system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.apiKey!==void 0&&(n.apiKey=t.apiKey);let r=t.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),this._defaultHeaders!==void 0&&(n.defaultHeaders=this._defaultHeaders),t.signal&&(n.signal=t.signal),Uw(n)}},Vke=new Yt});function Fi(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}function Sr(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":Fi(Yke,e)?"read":Fi(Jke,e)?"write":Fi(Xke,e)?"shell":Fi(Ni,e)?"subagent":Fi(zm,e)?"skill":Fi(Vm,e)?"dag":Fi(Qke,e)?"web":Zke.has(e)?"browser":Fi(eTe,e)?"planning":tTe.has(e)?"schedule":"other"}function yI(e){return nTe[e]}var Yke,Jke,Xke,Ni,zm,Vm,dt,Qke,Zke,eTe,tTe,hI,zG,nTe,Ta=y(()=>{"use strict";Oy();Yke=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","extract_document","glob","grep","list_directory","config_get","memory_search","workspace_query","read_witness","search_witness"]),Jke=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size","config_set","workspace_publish"]),Xke=new Set(["Bash","BashOutput","KillBash","bash"]),Ni=new Set(["Agent","Task","agent","cancel_background_job"]),zm=new Set(["Skill","skill"]),Vm=new Set(["Compose","compose"]),dt=new Set([...Ni,...Vm,...zm]),Qke=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),Zke=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),eTe=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),tTe=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);hI=["Read","Glob","Grep","NotebookRead","LS","read_file","extract_document","glob","grep","list_directory","config_get","memory_search","read_witness","search_witness","workspace_publish","workspace_query",...At],zG=[...hI,"web_scrape","agent"];nTe={subagent:"worker",skill:"skill",dag:"workflow"}});function sS(e,t){return`Skill tool not available at nesting depth ${e} (max ${t}). ${Bi}`}function VG(e,t){return`Agent tool not available at nesting depth ${e} (max ${t}). ${Bi}`}function YG(e,t){return`Compose tool not available at nesting depth ${e} (max ${t}). ${Bi}`}var Bi,Ym=y(()=>{"use strict";Bi="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function XG(e){JG.add(e)}function QG(e){return JG.has(e)}var JG,bI=y(()=>{"use strict";JG=new Set});function ZG(e){wI.add(e)}function e2(e){wI.delete(e)}function t2(e){SI.add(e)}function n2(e){SI.delete(e)}function r2(e){for(let t of wI)t(e)}function o2(e){for(let t of SI)t(e)}var wI,SI,vI=y(()=>{"use strict";wI=new Set,SI=new Set});function aS(e){return rTe.has(e)}function i2(e,t=oTe){return e.length<=t?e:e.slice(0,t)+"\u2026"}function Xc(e){return e.surface!==void 0?{origin:Ci(e.surface),actor:_i(e.depth)}:{}}var rTe,oTe,kI=y(()=>{"use strict";ba();rTe=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);oTe=240});function s2(e){let t=[],n="",r=null,o=!1;for(let i of e){if(r!==null){i===r?r=null:n+=i;continue}if(i==='"'||i==="'"){r=i,o=!0;continue}if(/\s/.test(i)){o&&(t.push(n),n="",o=!1);continue}n+=i,o=!0}return o&&t.push(n),t}function Ui(e,t){let n=t??"",r;return e.replace(/(\\?)\$(ARGUMENTS?\b|\{(\d+)\})/g,(o,i,s,a)=>{if(i==="\\")return o.slice(1);if(s==="ARGUMENT"||s==="ARGUMENTS")return n;let l=Number(a);return l<1?o:(r??=s2(n),r[l-1]??o)})}var lS=y(()=>{"use strict"});function a2(e,t,n){let r=n&&n.trim().length>0?n.trim():"(none)";return{content:`${`[Skill "${e}" loaded into your current context \u2014 act on it now]
1180
1180
  The instructions below are your operating procedure for THIS task. Execute them immediately, in this session, using the tools you already have. This is an instruction set, not reference material: follow it directly \u2014 do not merely summarize or describe it. No sub-agent was forked; you are the one carrying it out.
1181
1181
  Arguments: ${r}`}
1182
1182
 
@@ -2052,7 +2052,7 @@ ${E}
2052
2052
  ${T}`})}return{fileBlocks:l,warnings:c}}function ire(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function sre(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}L();$();L();rt();$();Ba();function are(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function lre(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function cre(e,t,n,r){if(!Fe())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Oe(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ye(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function ure(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Oe(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ye(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var sR=class{state;writer;ttfb;constructor(t,n){this.state=are(),this.writer=t,this.ttfb=n}onToolStart(t){lre(this.state,t)}onToolResult(t,n){cre(this.state,t,n,this.writer)}onSubagentEvent(t,n){ure(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function dre(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function pre(e){return e.received?{}:{turnStartedAt:e.startedAt}}function mre(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function fre(e,t=process.stdout,n){if(!Fe()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new sR(e,n)))}ue();$();var Hje=3e3;async function gre(e,t){if(!e)return t;let n=Date.now();if(n-t<Hje)return t;try{let r=e();r instanceof Promise&&await r}catch(r){He()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}$();ue();mt();hs();var Wje="Keep waiting \u2014 auto-resume in progress",hre="Switch model / provider (type /model after)",Kje="Stop waiting";async function yre(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:Wje,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];bn(r,{header:p,options:[d,hre,Kje],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===hre&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{He()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{He()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(BF({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}cT();async function bre(e,t,n,r,o="summary",i,s){let a=v3(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=dre(l);fre(i,process.stdout,c),Vu(process.stdout,zf(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,w,S=!1,k=!1,E={abort:null},T=0,R=[],I=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&sre(j,_,r.onQueuedUserMessage).then(({jobs:q,flushedText:H,flushedPreview:W})=>{let Q=(i??{fn:console.log}).fn;for(let G of q)Q(m.dim(` \u2192 subagent backgrounded as ${G.jobId}: ${G.label}`));H!==void 0&&Q(m.dim(` \u2192 queued message sent to this turn: ${ire(W??H)}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,M=()=>new Sd({out:kd(i),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(j=>{He()&&console.error(" "+m.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:x}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},..._?{compositor:_}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...pre(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),D=M(),B=async()=>{if(!h){h=!0;try{await D.dispose()}catch{}}},F=async()=>{await D.arm();let j=D.getCompositor();if(i&&j){let q=j;i.fn=H=>q.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(q=>D.setInterrupting(q)),r.rearmStatus?.()};try{_?_.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,D.setSoftStopping(!0),t.interrupt().catch(P=>{He()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),P)});let G=r.subagentControl;G?.hasActiveForeground()&&G.cancelActiveForeground().catch(P=>{He()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),P)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch(G=>{He()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),G)})}),await F(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(x),r.setTaskViewHandler?.(Zne(r));let{fileBlocks:j,warnings:q}=ore(e.text,{rootDir:process.cwd()});for(let G of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${G}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let H=j.length>0||e.attachments.length>0?await rre(e.text,e.attachments,void 0,j,t.sessionId):e.text,W=t.sendMessageStream(H);if(await Fc((G,P)=>{D.process(G,P),P&&c.plainHooks?.onSubagentEvent(G,P)},async()=>{for await(let G of W){if(S||k)break;let P=mre(c,G,f);if(G.type==="chunk"&&G.chunk.type==="content"?(u=p?Xne(u,G.chunk.content):u+G.chunk.content,p=!1,f=!0):G.type==="message"&&!f&&(u=G.message.content),G.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),G.type==="chunk"&&G.chunk.type==="tool_use_detail"){let K=G.chunk,ee={toolName:K.toolName,toolUseId:K.toolUseId,input:K.toolInput,...K.toolInputRaw!==void 0&&{inputRaw:K.toolInputRaw}};I.set(K.toolUseId,ee),R.push(ee),c.plainHooks?.onToolStart(K)}else if(G.type==="chunk"&&G.chunk.type==="tool_result"){let K=G.chunk;d=u.length,p=!0;let ee=I.get(K.toolUseId);ee&&(ee.result=K.content,ee.isError=K.isError,I.delete(K.toolUseId)),c.plainHooks?.onToolResult(K,ee?.toolName),T=await gre(r.onContextProgress,T)}if(G.type==="paused"){await yre({event:G,session:t,borrowedCompositor:_,pickerRef:E,completionWriter:i,disposeRendererOnce:B,setPausedState:r.setPausedState,onPauseInterrupt:()=>{k=!0}});continue}if(G.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let K=G.hotSwapped&&G.accountId?`\u25B6 Resumed on ${G.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,I.clear(),b=!1,w=void 0,g=!1,D=M(),h=!1,await F(),(i??{fn:console.log}).fn(m.success(K));continue}if(G.type==="error"){await B(),Xl(Wl(G.error)),g=!0;continue}D.process(G),P&&(c.plainHooks?.onFirstContent(process.stdout),D.notifyFirstContent()),G.type==="done"&&(b=!0,w=G.metadata)}}),await B(),S){let G=i?i.fn:console.log,P=_?_.getPendingCount():0,K=P>0?` \xB7 ${P} queued`:"";G(m.warning(`\u23F8 Stopped${K} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),G("")}if(k){let G=i?i.fn:console.log;G(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),G("")}if(b&&!S&&!k){Ka(n,a,u,w,R),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),zu(process.stdout),_5(process.stdout,"afk: turn complete");let G=K=>{i?i.fn(K):console.log(K)},P=oR(u);if(P){G(Qne(P,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:R.length})),G("");let K=kD(R),ee=X7(R);if(r.onTerminalState)try{r.onTerminalState(P,{doneHasCorroboratingEvidence:ee,doneEvidenceClassification:K})}catch{}if(n.permissionMode==="autonomous"){let Re=P.kind==="done"&&mm().verifyDone===!0&&!ee;Z7(P,void 0,{unverified:Re})}}if(A$(w,n,G),r.onAfterTurn){let K=r.onAfterTurn();K instanceof Promise&&await K.catch(()=>{})}}}catch(j){await B(),g||Xl(Wl(j))}finally{await B(),Vu(process.stdout,zf(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}rs();wp();var Gje=5e3,qje=3,zje="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Vje(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function wre(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async M=>{He()&&(h=cE(M)),await Tg(e.session.current),He()&&(b=KO())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,k=!1,E=!1,T,R,I,C,x=(()=>{let M=parseInt(e.options.maxTurns,10);return M>0?M:void 0})(),_=0;g.onInjectable=()=>{_>=qje||!o.isAwaitingInput()||!o.bufferIsEmpty()||n.pendingSteerRead||(_++,zu(process.stdout),w={text:zje,attachments:[]},o.abortPendingRead())};try{for(n.steerReadLine=async M=>{let D=()=>o.abortPendingRead({clearBuffer:!0});if(M?.addEventListener("abort",D,{once:!0}),M?.aborted)return"";try{return(await o.readLine({promptFn:()=>"Steer the agent \u2192 ",onEscape:D})).text}finally{M?.removeEventListener("abort",D)}};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let P of b)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),b=[]}let M=f.drainNotifications();for(let{job:P,result:K}of M){let ee=K.errorReason===void 0?"\u2713":"\u2717",Re=K.errorReason==="abort"?"killed":K.errorReason==="timeout"?"timed out":K.errorReason==="signal-killed"?"killed by signal":`exit ${K.exitCode??0}`,ie=Math.max(0,Math.round(K.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${ee} [${P.id}] ${Re} \xB7 ${ie}s \xB7 `)+P.command)}let D=g.drainNotifications();for(let{job:P}of D){let K=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",ee=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,Re=ne(P.label,60);e.replRenderer.writeLine(m.dim(` ${K} [${P.jobId}] subagent ${P.status} \xB7 ${ee}s \xB7 `)+Re)}let B=l.renderIfChanged(e.stats.sessionId);if(B.length>0){for(let P of B)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let F,j,q=n.pendingSteerRead;if(q){let P=await q;n.pendingSteerRead===q&&(n.pendingSteerRead=null),P?.trim()&&(n.pendingSteerText=P)}if(n.pendingSteerText&&(w={text:n.pendingSteerText,attachments:[]},n.pendingSteerText=null),w===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,w={text:P.message,attachments:[]})}if(w!==void 0){let P=w;w=void 0;let K=Md(e.stats.permissionMode),ee=Ya({buffer:P.text,promptText:K,isTTY:!!process.stdout.isTTY,attachmentSummary:sd([...P.attachments])});e.replRenderer.writeLine(ee),F=P.text.trim(),j=P.attachments}else{let P=S;S=void 0;let K=await o.readLine({promptFn:()=>Md(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{QE(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});F=K.text.trim(),j=K.attachments}if(!F&&j.length===0)continue;if(F.startsWith("!")){let P=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(F))){e.statusLine.rearm();continue}}let H=!1;if(F.startsWith("/")){let P=await M5(F,e.slashCtx,j);if(P.handled){if(P.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((F==="/clear"||F.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){w={text:P.result.message,attachments:j??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){S=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}H=!0}a.push(F),await Vje(e,F);let W=F;if(H){let P=g0(F);if(P){let K=P.name.replace(/^\//,"").split(":").pop()??"";if(K&&BO(K)){let ee={skillName:K,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},Re=e.session.current.sessionId,ie=cl(Re),xe=Date.now();N(`[afk trace] preflight.start commandName=${K}`);let Ge=!1,or=await ll(ee,{cwd:e.stats.cwd??process.cwd(),artifactDir:ie},qe=>{He()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${K}) failed: `)+(qe instanceof Error?qe.message:String(qe)))});Ge=or!==null,N(`[afk trace] preflight.end commandName=${K} durationMs=${Date.now()-xe} success=${Ge}`),W=HO(or?.manifestBlock,F)}}}let Q=f.drainInjections();Q.length>0&&(W=Q+W);let G=g.drainInjections();if(G.length>0&&(W=G+W),T!==void 0&&(W=T+`
2053
2053
 
2054
2054
  `+W,T=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:W,sessionId:e.stats.sessionId},K=await e.hookRegistry.dispatch(P);K.injectContext&&(W=K.injectContext+W)}catch(P){if(P instanceof Ae){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(P.reason?m.dim(`: ${se(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Ur){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(R=I=C=void 0,qF(),JF(),await bre({text:W,attachments:j},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onQueuedUserMessage(P){await t.appendQueuedUser(P)},async onTurnComplete(P,K){if(await t.appendTurn(P,K),e.stats.sessionId)try{ns(e.stats)}catch(ee){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(ee instanceof Error?ee.message:String(ee))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(er(e.stats,e.contextSampler,e.gitStatusSampler,x)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,K)=>{p?.push(P),R=P.kind,I=K?.doneHasCorroboratingEvidence,C=K?.doneEvidenceClassification},setActiveCompositor:P=>{n.activeCompositor=P,P===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setTaskViewHandler:P=>o.setTaskViewHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(er(e.stats,e.contextSampler,e.gitStatusSampler,x)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(P,K)=>{c.repaint(P),u?.onStage(P,K)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Md(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},...I!==void 0?{doneHasCorroboratingEvidence:I}:{},...C!==void 0?{doneEvidenceClassification:C}:{}},void 0,Gje);P.injectContext&&P.injectContext.trim().length>0&&(T=P.injectContext)}catch(P){if(P instanceof Ot)throw P;P instanceof Ur?(N("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):P instanceof Ae?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${se(P.reason??"no reason given")}`)):N("[stop hook] unexpected error: "+String(P))}}}finally{n.steerReadLine=null,n.pendingSteerRead=null,n.pendingSteerText=null}}function Yje(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function Sre(e,t,n,r){let o=await dne(),i=new XE({rl:e.rl,history:o,statusLine:e.statusLine}),s=Yje(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await One(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=Jne(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await wre(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}im();xc();import{execFile as Jje}from"node:child_process";import{dirname as Xje,isAbsolute as Qje,resolve as Zje}from"node:path";import{promisify as e1e}from"node:util";var vre=e1e(Jje),t1e=3e3,n1e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function r1e(){let t=(await vre("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Qje(t)?t:Zje(process.cwd(),t);return Xje(n)}async function kre(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await r1e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),t1e)});try{let o=qn({execFile:vre,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>n1e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}oy();im();import{promises as o1e}from"node:fs";import{dirname as i1e,join as Rre}from"node:path";import{randomBytes as s1e}from"node:crypto";var a1e=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
2055
- `),Tre=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,_$=30,l1e=1024,c1e=8e3,u1e="haiku";async function d1e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=g1e(n,l1e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??c1e),s=t.signal?h1e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await tc({token:t.token,model:t.model??u1e,system:a1e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=p1e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=i1e(t.worktreePath);return await m1e(l,c)}function p1e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Tre.test(t)&&t.length<=_$)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>_$)break;o=s}return Tre.test(o)?o:null}async function m1e(e,t){if(!await f1e(Rre(t,e)))return e;let n=s1e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,_$-5)}-${n}`}async function f1e(e){try{return await o1e.access(e),!0}catch{return!1}}function g1e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function h1e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function xre(e){let t,n,r=Rre(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await d1e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${ub(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Ere(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Ere(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Ere(e,t){e&&e.setCwd(t),y1e(t)}function y1e(e){try{process.chdir(e)}catch{}}wt();Ct();jl();po();U();import{spawn as Cre}from"child_process";import{existsSync as _re,mkdirSync as k1e,readFileSync as Ire,unlinkSync as Are,writeFileSync as Pre}from"fs";import{get as T1e}from"https";import{join as Mre}from"path";import{readFileSync as b1e}from"fs";import{dirname as w1e,join as S1e}from"path";import{fileURLToPath as v1e}from"url";function go(){try{return"5.169.1"}catch{}try{let e=w1e(v1e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(b1e(S1e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}$();L();var E1e=64*1024,R1e=10800*1e3,x1e=800,A1e=3600*1e3,C1e="update-check.json",_1e="pending-update.json";function I$(){return Mre(Os(),C1e)}function Kg(){return Mre(Os(),_1e)}function P$(){let e=Os();_re(e)||k1e(e,{recursive:!0})}function Ore(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Dre(){try{let e=Ire(I$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function $re(){try{P$();let e=`
2055
+ `),Tre=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,_$=30,l1e=1024,c1e=8e3,u1e="haiku";async function d1e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=g1e(n,l1e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??c1e),s=t.signal?h1e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await tc({token:t.token,model:t.model??u1e,system:a1e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=p1e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=i1e(t.worktreePath);return await m1e(l,c)}function p1e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Tre.test(t)&&t.length<=_$)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>_$)break;o=s}return Tre.test(o)?o:null}async function m1e(e,t){if(!await f1e(Rre(t,e)))return e;let n=s1e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,_$-5)}-${n}`}async function f1e(e){try{return await o1e.access(e),!0}catch{return!1}}function g1e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function h1e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function xre(e){let t,n,r=Rre(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await d1e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${ub(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Ere(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Ere(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Ere(e,t){e&&e.setCwd(t),y1e(t)}function y1e(e){try{process.chdir(e)}catch{}}wt();Ct();jl();po();U();import{spawn as Cre}from"child_process";import{existsSync as _re,mkdirSync as k1e,readFileSync as Ire,unlinkSync as Are,writeFileSync as Pre}from"fs";import{get as T1e}from"https";import{join as Mre}from"path";import{readFileSync as b1e}from"fs";import{dirname as w1e,join as S1e}from"path";import{fileURLToPath as v1e}from"url";function go(){try{return"5.169.3"}catch{}try{let e=w1e(v1e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(b1e(S1e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}$();L();var E1e=64*1024,R1e=10800*1e3,x1e=800,A1e=3600*1e3,C1e="update-check.json",_1e="pending-update.json";function I$(){return Mre(Os(),C1e)}function Kg(){return Mre(Os(),_1e)}function P$(){let e=Os();_re(e)||k1e(e,{recursive:!0})}function Ore(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Dre(){try{let e=Ire(I$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function $re(){try{P$();let e=`
2056
2056
  const https = require('https');
2057
2057
  const fs = require('fs');
2058
2058
  const url = 'https://registry.npmjs.org/agent-afk/latest';