agent-afk 5.33.0 → 5.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -843,7 +843,7 @@ ${Uy}
843
843
  `,"utf-8")}catch(r){W("WAL append failed (non-fatal):",String(r))}}};jG=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;HG=new Set(["fact","session_start","session_end","supersede"]),WG=new Set(["preference","convention","decision","learning"])});function Zx(e){return GG.has(e)}function Mu(){return k.AFK_MEMORY_EVIDENCE_GATE==="1"}function jy(e){return Zx(e)}function Ou(e){if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null}function Qx(e,t){return Zx(e)?Ou(t)?"verified":"unverified":"not-applicable"}function eR(e,t){return t!=="unverified"||e.startsWith(Xx)?e:`${Xx} ${e}`}var GG,Xx,tR=R(()=>{"use strict";q();GG=new Set(["convention"]),Xx="[unverified]"});function zG(e,t){return t?e.map(n=>{if(n.type!=="fact"||!n.category)return{...n,verification:"not-applicable"};let r=Qx(n.category,n.evidence);return{...n,verification:r,content:eR(n.content,r)}}):e.map(n=>{let r={...n};return delete r.evidence,delete r.verification,r})}function El(e,t,n){let r=async s=>{try{let a=JG(s),l=e.search(a.query,{category:a.category,since:a.since,limit:a.limit??10});return{content:JSON.stringify(zG(l,Mu()))}}catch(a){return{content:`memory_search error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}},o=async s=>{try{let a=VG(s);if(a.target==="hot"){if(a.action!=="set")return{content:'Hot memory only supports action: "set". Use supersede/remove only for facts.',isError:!0};if(!a.content)return{content:'content is required for action: "set"',isError:!0};let l=e.saveHot(a.content),c={saved:!0,target:"hot",usage:{tokens:l.tokens,maxTokens:l.maxTokens,pct:l.pct}};return l.truncated?(c.truncated=!0,c.note='Hot memory exceeded the ~1,500-token cap and was truncated from the end (lowest-priority lines dropped; a sentinel marks the cut). Keep hot memory to a few durable essentials \u2014 move detail to the fact archive with target:"fact".'):l.pct>=Vx*100&&(c.warning=`Hot memory is at ${l.pct}% of the ~1,500-token cap. Move non-essential lines to the fact archive (target:"fact") before it truncates.`),{content:JSON.stringify(c)}}if(a.action==="set"){if(!a.category)return{content:"category is required for fact storage",isError:!0};if(!a.content)return{content:'content is required for action: "set"',isError:!0};let l=a.category,c=Ou(a.evidence),u={id:e.storeFact({session_id:t,category:l,content:a.content,source_surface:n??"cli",evidence:c}),action:"set",target:"fact"};return Mu()&&jy(l)&&!c&&(u.warning=nR),{content:JSON.stringify(u)}}if(a.action==="supersede"){if(!a.supersedes)return{content:'supersedes (fact ID) is required for action: "supersede"',isError:!0};if(!a.content)return{content:'content is required for action: "supersede"',isError:!0};let l=e.getFact(a.supersedes),c=a.evidence===void 0?void 0:Ou(a.evidence),u={id:e.supersedeFact(a.supersedes,a.content,a.category??void 0,c),action:"supersede",target:"fact",supersedes:a.supersedes};if(Mu()){let m=a.category??l?.category;m&&jy(m)&&((c===void 0?l?.evidence??null:c)?c===void 0&&(u.warning=qG):u.warning=nR)}return{content:JSON.stringify(u)}}if(a.action==="remove"){if(!a.id)return{content:'id (fact ID) is required for action: "remove"',isError:!0};let l=e.removeFact(a.id);return{content:JSON.stringify({removed:l,action:"remove",target:"fact"})}}return{content:`Unknown action: ${a.action}`,isError:!0}}catch(a){return{content:`memory_update error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}},i=async s=>{try{let a=YG(s);return e.writeProcedure(a.name,a.content,t),{content:JSON.stringify({name:a.name,written:!0})}}catch(a){return{content:`procedure_write error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}};return new Map([["memory_search",r],["memory_update",o],["procedure_write",i]])}function JG(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.query!="string")throw new Error("query (string) is required");let n={query:t.query};if(t.category!==void 0){if(typeof t.category!="string")throw new Error("category must be a string");let r=["preference","convention","decision","learning"];if(!r.includes(t.category))throw new Error(`category must be one of: ${r.join(", ")}`);n.category=t.category}if(t.since!==void 0){if(typeof t.since!="string")throw new Error("since must be a string (ISO date)");n.since=t.since}if(t.limit!==void 0){if(typeof t.limit!="number"||t.limit<=0)throw new Error("limit must be a positive number");n.limit=t.limit}return n}function VG(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e,n=["hot","fact"];if(typeof t.target!="string"||!n.includes(t.target))throw new Error(`target must be one of: ${n.join(", ")}`);let r=["set","supersede","remove"];if(typeof t.action!="string"||!r.includes(t.action))throw new Error(`action must be one of: ${r.join(", ")}`);let o={target:t.target,action:t.action};if(t.content!==void 0){if(typeof t.content!="string")throw new Error("content must be a string");o.content=t.content}if(t.category!==void 0){if(typeof t.category!="string")throw new Error("category must be a string");let i=["preference","convention","decision","learning"];if(!i.includes(t.category))throw new Error(`category must be one of: ${i.join(", ")}`);o.category=t.category}if(t.evidence!==void 0){if(typeof t.evidence!="string")throw new Error("evidence must be a string");o.evidence=t.evidence}if(t.supersedes!==void 0){if(typeof t.supersedes!="number"||t.supersedes<=0)throw new Error("supersedes must be a positive fact ID");o.supersedes=t.supersedes}if(t.id!==void 0){if(typeof t.id!="number"||t.id<=0)throw new Error("id must be a positive fact ID");o.id=t.id}return o}function YG(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.name!="string")throw new Error("name (string) is required");if(typeof t.content!="string")throw new Error("content (string) is required");return{name:t.name,content:t.content}}var ms,rR,oR,Gr,Go,nR,qG,Hy=R(()=>{"use strict";Pu();tR();ms={name:"memory_search",category:"read",concurrencySafe:!0,description:'Search cross-session memory for facts and procedures. Returns results ranked by relevance. Use this to recall information from prior sessions. Supports FTS5 match syntax: AND, OR, NOT, "exact phrase", prefix*',input_schema:{type:"object",properties:{query:{type:"string",description:'Search query (supports FTS5 match syntax: AND, OR, NOT, "exact phrase", prefix*)'},category:{type:"string",enum:["preference","convention","decision","learning"],description:"Optional: filter by fact category"},since:{type:"string",description:"Optional: ISO date \u2014 only return facts created after this date"},limit:{type:"number",description:"Max results (default 10)"}},required:["query"]}},rR={name:"memory_update",category:"write",concurrencySafe:!1,description:'Store a fact in cross-session memory or update hot memory. Hot memory (target: "hot") persists in the system prompt across all future sessions. Facts (target: "fact") are stored in the searchable archive.',input_schema:{type:"object",properties:{target:{type:"string",enum:["hot","fact"],description:'"hot" writes to HOT.md (system prompt), "fact" writes to the searchable archive'},action:{type:"string",enum:["set","supersede","remove"],description:"Operation: set (create/overwrite), supersede (replace while keeping history), remove (delete)"},content:{type:"string",description:"The content to store (for set/supersede)"},category:{type:"string",enum:["preference","convention","decision","learning"],description:"Required for fact target"},evidence:{type:"string",description:'Optional provenance citation backing a codebase fact \u2014 a file:line, commit SHA, or trace-event id. When the evidence gate is enabled, a "convention" fact stored without it is recalled as [unverified]; preferences and reflections never need it.'},supersedes:{type:"number",description:"Fact ID being superseded (for supersede action)"},id:{type:"number",description:"Fact ID to remove (for remove action)"}},required:["target","action"]}},oR={name:"procedure_write",category:"write",concurrencySafe:!1,description:"Write a reusable procedure to memory. Procedures are markdown files describing how to perform recurring tasks. They persist across sessions and are searchable via memory_search.",input_schema:{type:"object",properties:{name:{type:"string",description:"Procedure name (kebab-case, becomes the filename)"},content:{type:"string",description:"Procedure content (markdown)"}},required:["name","content"]}},Gr=[ms,rR,oR],Go=Gr.map(e=>e.name),nR='Stored without evidence \u2014 this codebase fact (category "convention") will be recalled as [unverified]. Supply `evidence` (a file:line, commit SHA, or trace-event id) so future sessions can trust it as ground truth rather than an unverified agent claim.',qG='Superseded without fresh evidence \u2014 the prior citation is carried forward and this codebase fact (category "convention") is still recalled as verified against the OLD evidence, which may not back the changed content. Re-supply `evidence` if the claim changed (or pass an empty string to clear it and recall as [unverified]).'});function Wy(e,t="all"){switch(t){case"self":return{self:e.getSelf()};case"tools":return{tools:e.getTools()};case"subagents":return{subagents:e.getSubagents()};case"workspace":return{workspace:e.getWorkspace()};default:return{self:e.getSelf(),tools:e.getTools(),subagents:e.getSubagents(),workspace:e.getWorkspace()}}}function Ky(e){return e==="self"||e==="tools"||e==="subagents"||e==="workspace"||e==="all"?e:"all"}function Tl(e){let n=[`- Working directory: ${e.cwd.replace(/[\r\n]/g," ")}`];n.push(`- Date: ${XG(e.now??new Date,e.timeZone)}`);let r=typeof e.sessionId=="string"&&e.sessionId.length>0?e.sessionId.slice(0,8):null,o=e.surface&&e.surface!=="unknown"?e.surface:null,i=typeof e.depth=="number"?typeof e.maxDepth=="number"?`depth ${e.depth}/${e.maxDepth}`:`depth ${e.depth}`:null,s=[o,i].filter(a=>typeof a=="string");if(r!==null||s.length>0){let a=["- Session:"];r!==null&&a.push(r),s.length>0&&a.push(`(${s.join(", ")})`),n.push(a.join(" "))}if(e.workspace!==void 0&&e.workspace!==null){let a=e.workspace;if(a.branch!==null||a.headSha!==null){let l=a.branch??"(detached)",c=a.headSha!==null?` @ ${a.headSha}`:"",d;a.dirty===null?d="":a.dirty?d=` (${a.dirtyCount!==null?a.dirtyCount:"?"} dirty)`:d=" (clean)",n.push(`- Workspace: ${l}${c}${d}`)}}return`# Environment
844
844
  ${n.join(`
845
845
  `)}`}function XG(e,t){try{let n=t??Intl.DateTimeFormat().resolvedOptions().timeZone??"UTC",r=new Intl.DateTimeFormat("en-CA",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),o=s=>r.find(a=>a.type===s)?.value??"";return`${new Intl.DateTimeFormat("en-US",{timeZone:n,weekday:"long"}).format(e)}, ${o("year")}-${o("month")}-${o("day")} (${n})`}catch{return e.toISOString().slice(0,10)}}var Gy=R(()=>{"use strict"});import{spawnSync as ZG}from"child_process";function $u(e,t,n=!1){try{let r=ZG("git",t,{cwd:e,encoding:"utf8",maxBuffer:4096,shell:!1});if(r.status!==0||r.signal!==null||r.error!==void 0)return null;let o=typeof r.stdout=="string"?r.stdout.trim():null;return o===null?null:o.length>0||n?o:null}catch{return null}}function qy(e){let t=$u(e,["rev-parse","--short","HEAD"]);if(t===null)return{...QG};let n=$u(e,["symbolic-ref","--short","HEAD"]),r=$u(e,["status","--porcelain"],!0),o=!1,i=0;if(r!==null){let a=r.split(`
846
- `).filter(l=>l.trim().length>0);o=a.length>0,i=a.length}else o=null,i=null;let s=$u(e,["remote","get-url","origin"]);return{branch:n,headSha:t,dirty:o,dirtyCount:i,remoteUrl:s}}var QG,zy=R(()=>{"use strict";QG={branch:null,headSha:null,dirty:null,dirtyCount:null,remoteUrl:null}});function xl(e){return{getSelf(){return{sessionId:e.sessionId??null,surface:t2(e.surface),parentSessionId:e.parentSessionId??null,depth:e.depth??null,maxDepth:e.maxDepth??null,phaseRole:e.phaseRole??null,cwd:e.cwd,model:{provider:e.providerName,name:e.modelName},permissionMode:e2(e.permissionMode)}},getTools(){return{enabled:e.getEnabledToolNames(),mcpServers:n2(e.getMcpTools())}},getSubagents(){return e.getSubagents()},getWorkspace(){return qy(e.cwd)}}}function e2(e){switch(e){case"bypassPermissions":case"acceptEdits":case"dontAsk":case"auto":return"elevated";default:return"default"}}function t2(e){switch(e){case"cli":case"repl":case"daemon":case"telegram":case"subagent":return e;default:return"unknown"}}function n2(e){let t=new Map;for(let n of e){if(!n.name.startsWith("mcp__"))continue;let r=n.name.split("__");if(r.length<3)continue;let o=r[1];typeof o!="string"||o.length===0||t.set(o,(t.get(o)??0)+1)}return[...t.entries()].map(([n,r])=>({name:n,toolCount:r})).sort((n,r)=>n.name.localeCompare(r.name))}var iR=R(()=>{"use strict";zy()});function fs(e){return async(t,n)=>{let r=t&&typeof t=="object"?Ky(t.view):"all",o=Wy(e,r);return{content:JSON.stringify(o)}}}function Rl(e,t){let n=fs(t),r=e,o=Array.isArray(r.toolDefs)?r.toolDefs:null,i={async execute(s){return s.name==="get_runtime_state"?n(s.input,s.signal):e.execute(s)}};if(o!==null){let s=o.some(a=>a.name==="get_runtime_state");i.toolDefs=s?o:[...o,Un]}return i}var Un,st,Du=R(()=>{"use strict";Gy();Un={name:"get_runtime_state",category:"other",concurrencySafe:!0,description:"Inspect what the runtime knows about this session: identity (sessionId, surface, depth, parent), tool affordances (currently-enabled tool names and MCP server summary), delegation state (active subagent handles, background jobs), and git workspace state (branch, HEAD SHA, dirty count, remote URL). Returns a compact JSON snapshot.\n\nUse when uncertain about: your current nesting depth, whether a tool you want is actually available right now, what MCP servers are wired, whether earlier subagents you dispatched are still running, or what git branch / commit the session started on.\n\nViews:\n- `self` \u2014 identity + model + permissions + cwd only\n- `tools` \u2014 enabled tool names + MCP server summary only\n- `subagents` \u2014 active subagent handles + background jobs only\n- `workspace` \u2014 git state (branch, headSha, dirty, dirtyCount, remoteUrl)\n- `all` \u2014 union of the four above (default)\n\nThis is a read-only, in-memory inspection. It does not probe the file system or network. Fields the runtime does not know (e.g. depth for a top-level session) come back as `null` rather than synthesised defaults.",input_schema:{type:"object",properties:{view:{type:"string",enum:["self","tools","subagents","workspace","all"],description:'Which slice of state to return. Defaults to "all". Use a narrower view when only one slice is needed to keep the response compact.'}},required:[]}},st=[Un.name]});import{mkdir as r2,writeFile as Jy,unlink as Oge,readdir as o2,readFile as Vy}from"fs/promises";import{unlinkSync as i2,existsSync as s2}from"fs";import{join as sR}from"path";function Fu(e){return sR(Ad(),`${e}.json`)}async function a2(){try{return await r2(Ad(),{recursive:!0}),!0}catch{return!1}}async function Cl(e){try{if(!await a2())return;let n=Fu(e.sessionId);await Jy(n,JSON.stringify(e,null,2),"utf8")}catch{}}async function Yy(e,t){try{let n=Fu(e),r=await Vy(n,"utf8"),o=JSON.parse(r);o.afk=t,await Jy(n,JSON.stringify(o,null,2),"utf8")}catch{}}async function aR(e,t){try{let n=Fu(e),r=await Vy(n,"utf8"),o=JSON.parse(r);o.cwd=t,await Jy(n,JSON.stringify(o,null,2),"utf8")}catch{}}function hr(e){try{let t=Fu(e);s2(t)&&i2(t)}catch{}}async function Xy(){let e=Ad(),t;try{t=await o2(e)}catch{return[]}let n=[];for(let r of t){if(!r.endsWith(".json"))continue;let o=sR(e,r);try{let i=await Vy(o,"utf8"),s=JSON.parse(i);s!==null&&typeof s=="object"&&"sessionId"in s&&typeof s.sessionId=="string"&&n.push({...s,path:o})}catch{}}return n}var Al=R(()=>{"use strict";G()});var dn=R(()=>{"use strict";Gy();iR();Du();zy();Al()});function Zy(e){return l2.has(e)}function lR(e,t){return e.reduce((n,r,o)=>{let i=t(r.name,r.input),s=n[n.length-1];return s&&i&&s.isConcurrencySafe?s.indices.push(o):n.push({isConcurrencySafe:i,indices:[o]}),n},[])}var l2,Qy=R(()=>{"use strict";ln();Hy();dn();l2=new Set([...gr,Wt,Wo,Ko,...Gr,Un].filter(e=>e.concurrencySafe===!0).map(e=>e.name))});import{createHash as c2}from"node:crypto";function cR(e){let t;try{t=JSON.stringify(e.input)??"null"}catch{t=String(e.input)}return c2("sha256").update(e.name).update("\0").update(t).digest("hex")}var dR=R(()=>{"use strict"});var gs,d2,u2,Kt,_l=R(()=>{"use strict";ve();pt();ku();hu();vu();Ny();xu();xe();Qy();dR();Qy();gs=8,d2=new Set,u2=8,Kt=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;traceWriter;readOnlyBash;repeatBreaker=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??Zy,this.maxConcurrentSafeCalls=typeof t.maxConcurrentSafeCalls=="number"&&Number.isFinite(t.maxConcurrentSafeCalls)&&t.maxConcurrentSafeCalls>=1?Math.floor(t.maxConcurrentSafeCalls):u2,this.resolveBase=t.cwd,this._env=t.env,this.sessionId=t.sessionId,this.parentSessionId=t.parentSessionId,this.traceWriter=t.traceWriter,this.readOnlyBash=t.readOnlyBash===!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 Kr({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}:{}}}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.permissions?.allowedTools;if(!t)return this.schemas;let n=new Set(t);return this.schemas.filter(r=>n.has(r.name))}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=Tu(r);return o.mutating?{content:`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff, ls, cat, find, grep).`,isError:!0,failureClass:"permission-denied"}:null}checkRepeatCircuitBreaker(t){if(d2.has(t.name))return null;let n=cR(t);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<gs?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}}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){return await wn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t.name,reason:`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`}),{content:`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`,isError:!0,failureClass:"permission-denied"}}return n.behavior==="deny"?(await wn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t.name,reason:n.message||`Tool "${t.name}" denied by permission policy`}),{content:n.message||`Tool "${t.name}" denied by permission policy`,isError:!0,failureClass:"permission-denied"}):(n.updatedInput!==void 0&&(t.input=n.updatedInput),null)}async execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0,failureClass:"abort"};if(this.hookRegistry){let s={event:"PreToolUse",toolName:t.name,input:t.input,...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};try{await Oy(this.hookRegistry,s,{signal:t.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(a){if(a instanceof me)return{content:`Tool "${t.name}" blocked by PreToolUse hook: ${a.message}`,isError:!0,failureClass:"hook-block"};throw a}}let n=Ly(t.name,this.permissions);if(!n.allowed)return{content:n.reason??`Tool "${t.name}" is not permitted`,isError:!0,failureClass:"permission-denied"};let r=await this.runCanUseTool(t);if(r)return r;let o=this.checkReadOnlyBash(t);if(o)return o;let i=this.checkRepeatCircuitBreaker(t);return i||this.executeCore(t)}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 s=0;s<t.length;s++){let a=t[s];if(a.signal.aborted){n[s]={content:"Tool call aborted",isError:!0,failureClass:"abort"},r.add(s);continue}if(this.hookRegistry){let m={event:"PreToolUse",toolName:a.name,input:a.input,...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};try{await Oy(this.hookRegistry,m,{signal:a.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(p){if(p instanceof me){n[s]={content:`Tool "${a.name}" blocked by PreToolUse hook: ${p.message}`,isError:!0,failureClass:"hook-block"},r.add(s);continue}throw p}}let l=Ly(a.name,this.permissions);if(!l.allowed){n[s]={content:l.reason??`Tool "${a.name}" is not permitted`,isError:!0,failureClass:"permission-denied"},r.add(s);continue}let c=await this.runCanUseTool(a);if(c){n[s]=c,r.add(s);continue}let d=this.checkReadOnlyBash(a);if(d){n[s]=d,r.add(s);continue}let u=this.checkRepeatCircuitBreaker(a);if(u){n[s]=u,r.add(s);continue}}let o=t.map((s,a)=>({call:s,originalIndex:a})).filter((s,a)=>!r.has(a));if(o.length===0)return n;let i=lR(o.map(s=>s.call),this.classifier);for(let s of i){if(s.isConcurrencySafe){let l=await ps(s.indices,this.maxConcurrentSafeCalls,async c=>{let{call:d,originalIndex:u}=o[c];return d.signal.aborted?{result:{content:"Tool call aborted",isError:!0,failureClass:"abort"},originalIndex:u}:{result:await this.executeCore(d),originalIndex:u}});for(let c of l)if(c.status==="fulfilled")n[c.value.originalIndex]=c.value.result;else{let d=c.reason instanceof Error?c.reason.message:String(c.reason),u=s.indices[l.indexOf(c)];n[o[u].originalIndex]={content:`Tool execution error: ${d}`,isError:!0}}}else for(let l of s.indices){let{call:c,originalIndex:d}=o[l];if(c.signal.aborted){n[d]={content:"Tool call aborted",isError:!0,failureClass:"abort"};continue}n[d]=await this.executeCore(c)}let a=s.indices.length;s.indices.forEach((l,c)=>{let d=n[o[l].originalIndex];d&&(d.batchIndex=c+1,d.batchSize=a)})}return n}async executeCore(t){if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let s,a=!1,l="";try{s=await this.subagentExecutor.execute(t)}catch(c){a=!0,l=c instanceof Error?c.message:String(c),s={content:`Agent 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}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}if(t.name==="compose"){let s=await this.executeCompose(t);return this.firePostToolUse(t.name,s.content,t.signal,t.input),s}let n=this.handlers.get(t.name);if(!n)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};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}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){if(!this.hookRegistry)return;let i={event:"PostToolUse",toolName:t,output:n,...o!==void 0?{input:o}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};Px(this.hookRegistry,i,{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}:{}};Mx(this.hookRegistry,i,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(s=>{W(`firePostToolUseFailure outer catch (tool=${t}): ${String(s)}`)})}}});function k2(e){let t=e.match(p2);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 E2(e){let t=e.match(m2);if(!t)return null;let n=parseInt(t[1]??"0",10);return{runner:"jest",passed:parseInt(t[2]??"0",10),failed:n}}function T2(e){let t=e.match(f2);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 x2(e){let t=e.match(g2);if(!t)return null;let n=parseInt(t[1]??"0",10),r=e.match(h2),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function R2(e){let t=[...e.matchAll(y2)];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 C2(e){let t=e.match(b2);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 A2(e){let t=e.match(w2);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 _2(e){let t=e.match(S2);if(t)return{runner:"phpunit",passed:parseInt(t[1]??"0",10),failed:0};let n=e.match(v2);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 eb(e){return k2(e)??E2(e)??T2(e)??x2(e)??R2(e)??C2(e)??A2(e)??_2(e)??null}var p2,m2,f2,g2,h2,y2,b2,w2,S2,v2,uR=R(()=>{"use strict";p2=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,m2=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,f2=/={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,}/,g2=/(\d+)\s+passing/,h2=/(\d+)\s+failing/,y2=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,b2=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,w2=/(\d+) examples?, (\d+) failures?/,S2=/OK \((\d+) tests?/,v2=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});function qo(e){return e.replace(pR,"").replace(I2," ").trim()}function yr(e){return e.replace(pR,"")}var pR,I2,zo=R(()=>{"use strict";pR=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B[P^_X][^\x1B]*\x1B\\|\x1B\[[0-?]*[ -/]*[@-~]|\x9B[0-?]*[ -/]*[@-~]|\x1B[@-_]/g,I2=/[\x00-\x1F\x7F-\x9F]/g});import{statSync as P2}from"node:fs";function Il(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 M2(e){if(e===void 0)return!1;try{return P2(e),!1}catch{return!0}}function hs(e,t){let n=e instanceof Error?e.message:typeof e?.message=="string"?String(e.message):String(e);return Il(e)&&M2(t)?`working directory does not exist: ${t} (deleted worktree?) \u2014 underlying: ${n}`:n}var tb=R(()=>{"use strict"});function O2(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}function $2(e,t){if(e.length<=t)return e;let n=e.length-t;for(;n<e.length&&(e[n]&192)===128;)n++;return e.subarray(n)}function Pl(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=Math.max(0,t-D2),o=Math.ceil(r/2),i=r-o,s=O2(n,o),a=$2(n,i),c=`
846
+ `).filter(l=>l.trim().length>0);o=a.length>0,i=a.length}else o=null,i=null;let s=$u(e,["remote","get-url","origin"]);return{branch:n,headSha:t,dirty:o,dirtyCount:i,remoteUrl:s}}var QG,zy=R(()=>{"use strict";QG={branch:null,headSha:null,dirty:null,dirtyCount:null,remoteUrl:null}});function xl(e){return{getSelf(){return{sessionId:e.sessionId??null,surface:t2(e.surface),parentSessionId:e.parentSessionId??null,depth:e.depth??null,maxDepth:e.maxDepth??null,phaseRole:e.phaseRole??null,cwd:e.cwd,model:{provider:e.providerName,name:e.modelName},permissionMode:e2(e.permissionMode)}},getTools(){return{enabled:e.getEnabledToolNames(),mcpServers:n2(e.getMcpTools())}},getSubagents(){return e.getSubagents()},getWorkspace(){return qy(e.cwd)}}}function e2(e){switch(e){case"bypassPermissions":case"acceptEdits":case"dontAsk":case"auto":return"elevated";default:return"default"}}function t2(e){switch(e){case"cli":case"repl":case"daemon":case"telegram":case"subagent":return e;default:return"unknown"}}function n2(e){let t=new Map;for(let n of e){if(!n.name.startsWith("mcp__"))continue;let r=n.name.split("__");if(r.length<3)continue;let o=r[1];typeof o!="string"||o.length===0||t.set(o,(t.get(o)??0)+1)}return[...t.entries()].map(([n,r])=>({name:n,toolCount:r})).sort((n,r)=>n.name.localeCompare(r.name))}var iR=R(()=>{"use strict";zy()});function fs(e){return async(t,n)=>{let r=t&&typeof t=="object"?Ky(t.view):"all",o=Wy(e,r);return{content:JSON.stringify(o)}}}function Rl(e,t){let n=fs(t),r=e,o=Array.isArray(r.toolDefs)?r.toolDefs:null,i={async execute(s){return s.name==="get_runtime_state"?n(s.input,s.signal):e.execute(s)}};if(o!==null){let s=o.some(a=>a.name==="get_runtime_state");i.toolDefs=s?o:[...o,Un]}return i}var Un,st,Du=R(()=>{"use strict";Gy();Un={name:"get_runtime_state",category:"other",concurrencySafe:!0,description:"Inspect what the runtime knows about this session: identity (sessionId, surface, depth, parent), tool affordances (currently-enabled tool names and MCP server summary), delegation state (active subagent handles, background jobs), and git workspace state (branch, HEAD SHA, dirty count, remote URL). Returns a compact JSON snapshot.\n\nUse when uncertain about: your current nesting depth, whether a tool you want is actually available right now, what MCP servers are wired, whether earlier subagents you dispatched are still running, or what git branch / commit the session started on.\n\nViews:\n- `self` \u2014 identity + model + permissions + cwd only\n- `tools` \u2014 enabled tool names + MCP server summary only\n- `subagents` \u2014 active subagent handles + background jobs only\n- `workspace` \u2014 git state (branch, headSha, dirty, dirtyCount, remoteUrl)\n- `all` \u2014 union of the four above (default)\n\nThis is a read-only, in-memory inspection. It does not probe the file system or network. Fields the runtime does not know (e.g. depth for a top-level session) come back as `null` rather than synthesised defaults.",input_schema:{type:"object",properties:{view:{type:"string",enum:["self","tools","subagents","workspace","all"],description:'Which slice of state to return. Defaults to "all". Use a narrower view when only one slice is needed to keep the response compact.'}},required:[]}},st=[Un.name]});import{mkdir as r2,writeFile as Jy,unlink as Oge,readdir as o2,readFile as Vy}from"fs/promises";import{unlinkSync as i2,existsSync as s2}from"fs";import{join as sR}from"path";function Fu(e){return sR(Ad(),`${e}.json`)}async function a2(){try{return await r2(Ad(),{recursive:!0}),!0}catch{return!1}}async function Cl(e){try{if(!await a2())return;let n=Fu(e.sessionId);await Jy(n,JSON.stringify(e,null,2),"utf8")}catch{}}async function Yy(e,t){try{let n=Fu(e),r=await Vy(n,"utf8"),o=JSON.parse(r);o.afk=t,await Jy(n,JSON.stringify(o,null,2),"utf8")}catch{}}async function aR(e,t){try{let n=Fu(e),r=await Vy(n,"utf8"),o=JSON.parse(r);o.cwd=t,await Jy(n,JSON.stringify(o,null,2),"utf8")}catch{}}function hr(e){try{let t=Fu(e);s2(t)&&i2(t)}catch{}}async function Xy(){let e=Ad(),t;try{t=await o2(e)}catch{return[]}let n=[];for(let r of t){if(!r.endsWith(".json"))continue;let o=sR(e,r);try{let i=await Vy(o,"utf8"),s=JSON.parse(i);s!==null&&typeof s=="object"&&"sessionId"in s&&typeof s.sessionId=="string"&&n.push({...s,path:o})}catch{}}return n}var Al=R(()=>{"use strict";G()});var dn=R(()=>{"use strict";Gy();iR();Du();zy();Al()});function Zy(e){return l2.has(e)}function lR(e,t){return e.reduce((n,r,o)=>{let i=t(r.name,r.input),s=n[n.length-1];return s&&i&&s.isConcurrencySafe?s.indices.push(o):n.push({isConcurrencySafe:i,indices:[o]}),n},[])}var l2,Qy=R(()=>{"use strict";ln();Hy();dn();l2=new Set([...gr,Wt,Wo,Ko,...Gr,Un].filter(e=>e.concurrencySafe===!0).map(e=>e.name))});import{createHash as c2}from"node:crypto";function cR(e){let t;try{t=JSON.stringify(e.input)??"null"}catch{t=String(e.input)}return c2("sha256").update(e.name).update("\0").update(t).digest("hex")}var dR=R(()=>{"use strict"});var gs,d2,u2,Kt,_l=R(()=>{"use strict";ve();pt();ku();hu();vu();Ny();xu();xe();Qy();dR();Qy();gs=8,d2=new Set,u2=8,Kt=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;sessionGrantManager;traceWriter;readOnlyBash;repeatBreaker=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??Zy,this.maxConcurrentSafeCalls=typeof t.maxConcurrentSafeCalls=="number"&&Number.isFinite(t.maxConcurrentSafeCalls)&&t.maxConcurrentSafeCalls>=1?Math.floor(t.maxConcurrentSafeCalls):u2,this.resolveBase=t.cwd,this._env=t.env,this.sessionId=t.sessionId,this.parentSessionId=t.parentSessionId,this.sessionGrantManager=t.sessionGrantManager,this.traceWriter=t.traceWriter,this.readOnlyBash=t.readOnlyBash===!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 Kr({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}:{}}}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.permissions?.allowedTools;if(!t)return this.schemas;let n=new Set(t);return this.schemas.filter(r=>n.has(r.name))}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=Tu(r);return o.mutating?{content:`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff, ls, cat, find, grep).`,isError:!0,failureClass:"permission-denied"}:null}checkRepeatCircuitBreaker(t){if(d2.has(t.name))return null;let n=cR(t);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<gs?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}}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){return await wn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t.name,reason:`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`}),{content:`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`,isError:!0,failureClass:"permission-denied"}}return n.behavior==="deny"?(await wn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t.name,reason:n.message||`Tool "${t.name}" denied by permission policy`}),{content:n.message||`Tool "${t.name}" denied by permission policy`,isError:!0,failureClass:"permission-denied"}):(n.updatedInput!==void 0&&(t.input=n.updatedInput),null)}async execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0,failureClass:"abort"};if(this.hookRegistry){let s={event:"PreToolUse",toolName:t.name,input:t.input,...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{}};try{await Oy(this.hookRegistry,s,{signal:t.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(a){if(a instanceof me)return{content:`Tool "${t.name}" blocked by PreToolUse hook: ${a.message}`,isError:!0,failureClass:"hook-block"};throw a}}let n=Ly(t.name,this.permissions);if(!n.allowed)return{content:n.reason??`Tool "${t.name}" is not permitted`,isError:!0,failureClass:"permission-denied"};let r=await this.runCanUseTool(t);if(r)return r;let o=this.checkReadOnlyBash(t);if(o)return o;let i=this.checkRepeatCircuitBreaker(t);return i||this.executeCore(t)}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 s=0;s<t.length;s++){let a=t[s];if(a.signal.aborted){n[s]={content:"Tool call aborted",isError:!0,failureClass:"abort"},r.add(s);continue}if(this.hookRegistry){let m={event:"PreToolUse",toolName:a.name,input:a.input,...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{}};try{await Oy(this.hookRegistry,m,{signal:a.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(p){if(p instanceof me){n[s]={content:`Tool "${a.name}" blocked by PreToolUse hook: ${p.message}`,isError:!0,failureClass:"hook-block"},r.add(s);continue}throw p}}let l=Ly(a.name,this.permissions);if(!l.allowed){n[s]={content:l.reason??`Tool "${a.name}" is not permitted`,isError:!0,failureClass:"permission-denied"},r.add(s);continue}let c=await this.runCanUseTool(a);if(c){n[s]=c,r.add(s);continue}let d=this.checkReadOnlyBash(a);if(d){n[s]=d,r.add(s);continue}let u=this.checkRepeatCircuitBreaker(a);if(u){n[s]=u,r.add(s);continue}}let o=t.map((s,a)=>({call:s,originalIndex:a})).filter((s,a)=>!r.has(a));if(o.length===0)return n;let i=lR(o.map(s=>s.call),this.classifier);for(let s of i){if(s.isConcurrencySafe){let l=await ps(s.indices,this.maxConcurrentSafeCalls,async c=>{let{call:d,originalIndex:u}=o[c];return d.signal.aborted?{result:{content:"Tool call aborted",isError:!0,failureClass:"abort"},originalIndex:u}:{result:await this.executeCore(d),originalIndex:u}});for(let c of l)if(c.status==="fulfilled")n[c.value.originalIndex]=c.value.result;else{let d=c.reason instanceof Error?c.reason.message:String(c.reason),u=s.indices[l.indexOf(c)];n[o[u].originalIndex]={content:`Tool execution error: ${d}`,isError:!0}}}else for(let l of s.indices){let{call:c,originalIndex:d}=o[l];if(c.signal.aborted){n[d]={content:"Tool call aborted",isError:!0,failureClass:"abort"};continue}n[d]=await this.executeCore(c)}let a=s.indices.length;s.indices.forEach((l,c)=>{let d=n[o[l].originalIndex];d&&(d.batchIndex=c+1,d.batchSize=a)})}return n}async executeCore(t){if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let s,a=!1,l="";try{s=await this.subagentExecutor.execute(t)}catch(c){a=!0,l=c instanceof Error?c.message:String(c),s={content:`Agent 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}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}if(t.name==="compose"){let s=await this.executeCompose(t);return this.firePostToolUse(t.name,s.content,t.signal,t.input),s}let n=this.handlers.get(t.name);if(!n)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};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}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){if(!this.hookRegistry)return;let i={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}:{}};Px(this.hookRegistry,i,{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}:{}};Mx(this.hookRegistry,i,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(s=>{W(`firePostToolUseFailure outer catch (tool=${t}): ${String(s)}`)})}}});function k2(e){let t=e.match(p2);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 E2(e){let t=e.match(m2);if(!t)return null;let n=parseInt(t[1]??"0",10);return{runner:"jest",passed:parseInt(t[2]??"0",10),failed:n}}function T2(e){let t=e.match(f2);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 x2(e){let t=e.match(g2);if(!t)return null;let n=parseInt(t[1]??"0",10),r=e.match(h2),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function R2(e){let t=[...e.matchAll(y2)];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 C2(e){let t=e.match(b2);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 A2(e){let t=e.match(w2);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 _2(e){let t=e.match(S2);if(t)return{runner:"phpunit",passed:parseInt(t[1]??"0",10),failed:0};let n=e.match(v2);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 eb(e){return k2(e)??E2(e)??T2(e)??x2(e)??R2(e)??C2(e)??A2(e)??_2(e)??null}var p2,m2,f2,g2,h2,y2,b2,w2,S2,v2,uR=R(()=>{"use strict";p2=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,m2=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,f2=/={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,}/,g2=/(\d+)\s+passing/,h2=/(\d+)\s+failing/,y2=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,b2=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,w2=/(\d+) examples?, (\d+) failures?/,S2=/OK \((\d+) tests?/,v2=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});function qo(e){return e.replace(pR,"").replace(I2," ").trim()}function yr(e){return e.replace(pR,"")}var pR,I2,zo=R(()=>{"use strict";pR=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B[P^_X][^\x1B]*\x1B\\|\x1B\[[0-?]*[ -/]*[@-~]|\x9B[0-?]*[ -/]*[@-~]|\x1B[@-_]/g,I2=/[\x00-\x1F\x7F-\x9F]/g});import{statSync as P2}from"node:fs";function Il(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 M2(e){if(e===void 0)return!1;try{return P2(e),!1}catch{return!0}}function hs(e,t){let n=e instanceof Error?e.message:typeof e?.message=="string"?String(e.message):String(e);return Il(e)&&M2(t)?`working directory does not exist: ${t} (deleted worktree?) \u2014 underlying: ${n}`:n}var tb=R(()=>{"use strict"});function O2(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}function $2(e,t){if(e.length<=t)return e;let n=e.length-t;for(;n<e.length&&(e[n]&192)===128;)n++;return e.subarray(n)}function Pl(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=Math.max(0,t-D2),o=Math.ceil(r/2),i=r-o,s=O2(n,o),a=$2(n,i),c=`
847
847
 
848
848
  \u2026 [${n.length-s.length-a.length} bytes truncated: showing first ${s.length} + last ${a.length} of ${n.length}] \u2026
849
849
 
@@ -859,7 +859,7 @@ ${n.join(`
859
859
  Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:C});return}if(S===2){let C=ys(h.trim());d({content:`grep error: ${C.content}`,isError:!0,...C.truncated?{truncated:!0}:{}});return}let E=yr(g.trimEnd()),x=ys(E);d({content:x.content,...x.truncated?{truncated:!0}:{}})}),p.on("error",S=>{let E;if(m===void 0&&Il(S))try{E=hs(S,process.cwd())}catch{E=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${S.message}`}else E=hs(S,m);d({content:`Failed to execute grep: ${E}`,isError:!0})})})}}var _R,IR=R(()=>{"use strict";Bn();qr();zo();tb();nb();_R=ub()});import{promises as pq}from"fs";function pb(e){return(t,n,r)=>mq(t,n,r,e)}var mq,PR,MR=R(()=>{"use strict";qr();mq=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=un(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await pq.readdir(s,{withFileTypes:!0}),l=a.filter(m=>m.isDirectory()).map(m=>`${m.name}/`),c=a.filter(m=>!m.isDirectory()).map(m=>m.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
860
860
  `)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};PR=pb()});function fq(e=ls){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>OR)return{content:`Invalid input: message exceeds Telegram's ${OR}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=k.TELEGRAM_BOT_TOKEN;if(!i)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let s=as();if(s.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of s){let c=await e({token:i,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===s.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${s.length-a.length}/${s.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:s.length===1?`Sent Telegram message to chat ${s[0]}.`:`Sent Telegram message to ${s.length} chats.`}}}var OR,$R,DR=R(()=>{"use strict";q();pr();uu();OR=4096;$R=fq()});import{JSDOM as gq}from"jsdom";import{Readability as hq}from"@mozilla/readability";import yq from"turndown";function FR(e){return e.replace(/\n{3,}/g,`
861
861
 
862
- `).trim()}function bq(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function NR(e,t){let r=new gq(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new hq(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=FR(mb.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=FR(mb.turndown(a));return{title:o,markdown:l,textLength:bq(s),usedFallback:!0}}var LR,mb,BR=R(()=>{"use strict";LR=200,mb=new yq({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});mb.remove(["script","style","noscript","iframe"])});function Sq(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 UR(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function vq(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 Hu(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Sq,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!wq.has(u.status)||d===o)return u;let m=vq(u,s)??UR(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=UR(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var wq,fb=R(()=>{"use strict";ve();wq=new Set([429,502,503,504])});import{readFileSync as kq}from"node:fs";import{join as Eq}from"path";function Tq(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function jR(e,t){return Tq(t).test(e)}function Cq(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(xq.has(t))return!0;if(Rq.has(t))return!1}return!1}function HR(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Aq(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function WR(e){let t=e===void 0||e.trim()===""?"default":e.trim();return sl(t),t}function _q(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Iq(e){try{return kq(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Pq(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")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=WR(t.defaultProfile)),n}function KR(e){let t=e?.env??k,n=e?.readFileSync??Iq,r=e?.surface??t.AGENT_SURFACE,o=Cq(t.AFK_BROWSER_HEADLESS,r),i=HR(t.AFK_BROWSER_ALLOWED_DOMAINS),s=HR(t.AFK_BROWSER_BLOCKED_DOMAINS),a=_q(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Aq(t.AFK_BROWSER_BACKEND),c=WR(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():Eq(bn(),"browser.json"),p=n(m);if(p===void 0)return d;let g;try{g=JSON.parse(p)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=Pq(d,g);return h.configPath=m,h}function gb(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(jR(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>jR(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var xq,Rq,hb=R(()=>{"use strict";q();G();xq=new Set(["daemon","subagent","telegram","afk"]),Rq=new Set(["repl","interactive","cli"])});import Vo from"node:fs";import Wu from"node:path";import{randomBytes as Mq}from"node:crypto";import{chromium as Oq}from"playwright";function $q(){try{return"5.33.0"}catch{}try{let e=Wu.resolve(import.meta.dirname,"../../../package.json"),t=Vo.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Dq,Ku,GR=R(()=>{"use strict";G();ve();Dq=$q(),Ku=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=Oq.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),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=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),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){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.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/${Dq}`}}loadStorageState(t){let n=al(t);try{if(!Vo.existsSync(n))return;let r=JSON.parse(Vo.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=al(t);if(!Vo.existsSync(r))return;let o=await n.storageState(),i=Wu.join(Wu.dirname(r),`.${Wu.basename(r)}.${process.pid}.${Mq(4).toString("hex")}.tmp`);Vo.writeFileSync(i,JSON.stringify(o),{mode:384}),Vo.chmodSync(i,384),Vo.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Fq}from"crypto";function yb(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of Lq)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function qR(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Nq.test(e.label))}function zR(e){return Fq("sha256").update(e,"utf8").digest("hex").slice(0,8)}function JR(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Lq,Nq,Ol=R(()=>{"use strict";Lq=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];Nq=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Bq}from"node:crypto";function Uq(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function jq(e,t,n){return`el_${Bq("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Hq(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function VR(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function XR(e,t){let n=e.role??"",r=e.name??"";YR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])XR(i,t)}async function Wq(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 d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},ZR).catch(()=>[])}async function Kq(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 d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,p=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),p!==void 0&&(g.checked=p),o.push(g)}return o},ZR).catch(()=>[])}function Gq(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Gu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Gq(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Wq(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,p,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],XR(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await Kq(e)).filter(_=>YR.has(_.role??"")));let w=new Map;for(let I of m){let _=VR(I.name),D=w.get(_);(!D||D.bbox.w===0&&I.bbox.w>0)&&w.set(_,I)}let v=y.map(I=>({ax:I,dom:w.get(VR(I.name??""))})),S=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);S.sort((I,_)=>{let D=I.dom?.bbox.y??0,F=_.dom?.bbox.y??0;if(D!==F)return D-F;let U=I.dom?.bbox.x??0,H=_.dom?.bbox.x??0;return U-H}),S.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=S.slice(0,n).map((I,_)=>{let D=I.ax.role??"generic",F=I.ax.name??"",U=jq(D,F,_),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},B=I.dom?.type??null,P=null;I.ax.value!==void 0&&I.ax.value!==null&&(P=String(I.ax.value)),I.ax.checked!==void 0&&(P=String(I.ax.checked)),qR({role:D,kind:B})&&(P="[redacted]");let M={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(M.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(M.selected=I.ax.selected),I.ax.expanded!==void 0&&(M.expanded=I.ax.expanded);let O;I.dom?.testId?O=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(O=`#${I.dom.id}`);let j={id:U,role:D,label:Uq(F),kind:B,value:P,state:M,bbox:H};return O!==void 0&&(j.selector=O),j}),C="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let A=Hq(p),N=`obs_${t.observationCounter.toString(36)}`,$=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:A,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:$}}var YR,ZR,QR=R(()=>{"use strict";Ol();YR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);ZR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function eC(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")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${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 bb(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>eC(e,i)))).filter(o=>o!==null)}async function qq(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 wb(e,t,n){switch(t.kind){case"element_id":return zq(e,t,n);case"selector":return Jq(e,t);case"semantic":return Vq(e,t)}}async function zq(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 bb(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Jq(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 bb(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Vq(e,t){return t.role!==void 0?Yq(e,t.text,t.role):Xq(e,t.text,t)}async function Yq(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 bb(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Xq(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 d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await qq(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),p=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await eC(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,v=0;for(let S=0;S<w.length;S++)v=v*31+w.charCodeAt(S)>>>0;p.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:p}}var tC=R(()=>{"use strict"});import{randomBytes as Zq}from"crypto";import{mkdir as Qq,stat as ez,writeFile as tz}from"fs/promises";import{join as Sb}from"path";import{gzip as nz}from"zlib";import{promisify as rz}from"util";function oz(e){return Sb($o(e),"browser")}function iz(e){return Sb(oz(e),"screenshots")}function sz(){return new Date().toISOString().replace(/[:.]/g,"-")}function az(){return Zq(3).toString("hex")}async function vb(e,t,n){if(t.length>nC)throw new Error(`writeScreenshotSidecar: buffer exceeds ${nC} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=iz(e);await Qq(r,{recursive:!0});let o=`${sz()}-${az()}-${n}.png`,i=Sb(r,o);await tz(i,t);let{size:s}=await ez(i);return{path:i,bytes:s}}var jye,nC,rC=R(()=>{"use strict";G();Ol();jye=rz(nz);nC=5*1024*1024});var iC={};kd(iC,{PlaywrightProvider:()=>kb});function oC(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 kb,sC=R(()=>{"use strict";GR();QR();tC();hb();Ol();rC();kb=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ku(t)}async open(t){let n=gb(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(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Gu(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,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}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 Gu(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 wb(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${oC(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=yb(t.value??"");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 d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=gb(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let p=await Gu(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,p.interactive,p.url,p.title,g),c!==null)throw c;return p}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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 d=await wb(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${oC(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await vb(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path: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 vb(n,o,r);return i}catch{return null}}}});var Xo={};kd(Xo,{__resetBrowserRegistryForTests:()=>pz,browserProviderActive:()=>dz,closeBrowserProvider:()=>Eb,getBrowserProvider:()=>cz,peekBrowserProvider:()=>uz});function aC(){Promise.resolve(Eb()).then(()=>{process.exit(130)})}function lC(){Promise.resolve(Eb()).then(()=>{process.exit(143)})}function cC(){jn=null}function lz(){qu||(process.on("SIGINT",aC),process.on("SIGTERM",lC),process.on("exit",cC),qu=!0)}function dC(){qu&&(process.removeListener("SIGINT",aC),process.removeListener("SIGTERM",lC),process.removeListener("exit",cC),qu=!1)}async function cz(e){return jn!==null?jn:(Yo!==null||(Yo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(sC(),iC)),n=KR(e),r=new t(n);return lz(),jn=r,Yo=null,r})()),Yo)}async function Eb(){if(jn===null)return;let e=jn;jn=null,Yo=null,dC(),await e.shutdown()}function dz(){return jn!==null}function uz(){return jn}function pz(){jn=null,Yo=null,dC()}var jn,Yo,qu,Zo=R(()=>{"use strict";hb();jn=null,Yo=null,qu=!1});function uC(e,t){try{return NR(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function yz(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Zo(),Xo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function pC(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??yz,o=null,i=e,s=null,a=null;try{let c=await Hu(n,e,{headers:hz,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(gz.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(fz.test(d)&&!mz.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=uC(u,i)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<LR)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=uC(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var mz,fz,gz,hz,mC=R(()=>{"use strict";BR();fb();ve();mz=/(text\/html|application\/xhtml\+xml)/i,fz=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,gz=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,hz={"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 Sz(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(bz,{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),wz),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=qo(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}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 fC(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Sz({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 gC(e,t){if(t.length===0)return`# Search results for "${e}"
862
+ `).trim()}function bq(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function NR(e,t){let r=new gq(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new hq(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=FR(mb.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=FR(mb.turndown(a));return{title:o,markdown:l,textLength:bq(s),usedFallback:!0}}var LR,mb,BR=R(()=>{"use strict";LR=200,mb=new yq({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});mb.remove(["script","style","noscript","iframe"])});function Sq(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 UR(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function vq(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 Hu(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Sq,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!wq.has(u.status)||d===o)return u;let m=vq(u,s)??UR(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=UR(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var wq,fb=R(()=>{"use strict";ve();wq=new Set([429,502,503,504])});import{readFileSync as kq}from"node:fs";import{join as Eq}from"path";function Tq(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function jR(e,t){return Tq(t).test(e)}function Cq(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(xq.has(t))return!0;if(Rq.has(t))return!1}return!1}function HR(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Aq(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function WR(e){let t=e===void 0||e.trim()===""?"default":e.trim();return sl(t),t}function _q(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Iq(e){try{return kq(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Pq(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")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=WR(t.defaultProfile)),n}function KR(e){let t=e?.env??k,n=e?.readFileSync??Iq,r=e?.surface??t.AGENT_SURFACE,o=Cq(t.AFK_BROWSER_HEADLESS,r),i=HR(t.AFK_BROWSER_ALLOWED_DOMAINS),s=HR(t.AFK_BROWSER_BLOCKED_DOMAINS),a=_q(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Aq(t.AFK_BROWSER_BACKEND),c=WR(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():Eq(bn(),"browser.json"),p=n(m);if(p===void 0)return d;let g;try{g=JSON.parse(p)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=Pq(d,g);return h.configPath=m,h}function gb(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(jR(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>jR(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var xq,Rq,hb=R(()=>{"use strict";q();G();xq=new Set(["daemon","subagent","telegram","afk"]),Rq=new Set(["repl","interactive","cli"])});import Vo from"node:fs";import Wu from"node:path";import{randomBytes as Mq}from"node:crypto";import{chromium as Oq}from"playwright";function $q(){try{return"5.33.1"}catch{}try{let e=Wu.resolve(import.meta.dirname,"../../../package.json"),t=Vo.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Dq,Ku,GR=R(()=>{"use strict";G();ve();Dq=$q(),Ku=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=Oq.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),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=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),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){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.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/${Dq}`}}loadStorageState(t){let n=al(t);try{if(!Vo.existsSync(n))return;let r=JSON.parse(Vo.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=al(t);if(!Vo.existsSync(r))return;let o=await n.storageState(),i=Wu.join(Wu.dirname(r),`.${Wu.basename(r)}.${process.pid}.${Mq(4).toString("hex")}.tmp`);Vo.writeFileSync(i,JSON.stringify(o),{mode:384}),Vo.chmodSync(i,384),Vo.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Fq}from"crypto";function yb(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of Lq)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function qR(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Nq.test(e.label))}function zR(e){return Fq("sha256").update(e,"utf8").digest("hex").slice(0,8)}function JR(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Lq,Nq,Ol=R(()=>{"use strict";Lq=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];Nq=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Bq}from"node:crypto";function Uq(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function jq(e,t,n){return`el_${Bq("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Hq(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function VR(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function XR(e,t){let n=e.role??"",r=e.name??"";YR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])XR(i,t)}async function Wq(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 d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},ZR).catch(()=>[])}async function Kq(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 d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,p=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),p!==void 0&&(g.checked=p),o.push(g)}return o},ZR).catch(()=>[])}function Gq(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Gu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Gq(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Wq(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,p,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],XR(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await Kq(e)).filter(_=>YR.has(_.role??"")));let w=new Map;for(let I of m){let _=VR(I.name),D=w.get(_);(!D||D.bbox.w===0&&I.bbox.w>0)&&w.set(_,I)}let v=y.map(I=>({ax:I,dom:w.get(VR(I.name??""))})),S=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);S.sort((I,_)=>{let D=I.dom?.bbox.y??0,F=_.dom?.bbox.y??0;if(D!==F)return D-F;let U=I.dom?.bbox.x??0,H=_.dom?.bbox.x??0;return U-H}),S.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=S.slice(0,n).map((I,_)=>{let D=I.ax.role??"generic",F=I.ax.name??"",U=jq(D,F,_),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},B=I.dom?.type??null,P=null;I.ax.value!==void 0&&I.ax.value!==null&&(P=String(I.ax.value)),I.ax.checked!==void 0&&(P=String(I.ax.checked)),qR({role:D,kind:B})&&(P="[redacted]");let M={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(M.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(M.selected=I.ax.selected),I.ax.expanded!==void 0&&(M.expanded=I.ax.expanded);let O;I.dom?.testId?O=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(O=`#${I.dom.id}`);let j={id:U,role:D,label:Uq(F),kind:B,value:P,state:M,bbox:H};return O!==void 0&&(j.selector=O),j}),C="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let A=Hq(p),N=`obs_${t.observationCounter.toString(36)}`,$=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:A,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:$}}var YR,ZR,QR=R(()=>{"use strict";Ol();YR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);ZR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function eC(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")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${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 bb(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>eC(e,i)))).filter(o=>o!==null)}async function qq(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 wb(e,t,n){switch(t.kind){case"element_id":return zq(e,t,n);case"selector":return Jq(e,t);case"semantic":return Vq(e,t)}}async function zq(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 bb(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Jq(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 bb(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Vq(e,t){return t.role!==void 0?Yq(e,t.text,t.role):Xq(e,t.text,t)}async function Yq(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 bb(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Xq(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 d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await qq(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),p=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await eC(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,v=0;for(let S=0;S<w.length;S++)v=v*31+w.charCodeAt(S)>>>0;p.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:p}}var tC=R(()=>{"use strict"});import{randomBytes as Zq}from"crypto";import{mkdir as Qq,stat as ez,writeFile as tz}from"fs/promises";import{join as Sb}from"path";import{gzip as nz}from"zlib";import{promisify as rz}from"util";function oz(e){return Sb($o(e),"browser")}function iz(e){return Sb(oz(e),"screenshots")}function sz(){return new Date().toISOString().replace(/[:.]/g,"-")}function az(){return Zq(3).toString("hex")}async function vb(e,t,n){if(t.length>nC)throw new Error(`writeScreenshotSidecar: buffer exceeds ${nC} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=iz(e);await Qq(r,{recursive:!0});let o=`${sz()}-${az()}-${n}.png`,i=Sb(r,o);await tz(i,t);let{size:s}=await ez(i);return{path:i,bytes:s}}var jye,nC,rC=R(()=>{"use strict";G();Ol();jye=rz(nz);nC=5*1024*1024});var iC={};kd(iC,{PlaywrightProvider:()=>kb});function oC(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 kb,sC=R(()=>{"use strict";GR();QR();tC();hb();Ol();rC();kb=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ku(t)}async open(t){let n=gb(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(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Gu(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,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}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 Gu(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 wb(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${oC(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=yb(t.value??"");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 d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=gb(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let p=await Gu(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,p.interactive,p.url,p.title,g),c!==null)throw c;return p}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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 d=await wb(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${oC(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await vb(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path: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 vb(n,o,r);return i}catch{return null}}}});var Xo={};kd(Xo,{__resetBrowserRegistryForTests:()=>pz,browserProviderActive:()=>dz,closeBrowserProvider:()=>Eb,getBrowserProvider:()=>cz,peekBrowserProvider:()=>uz});function aC(){Promise.resolve(Eb()).then(()=>{process.exit(130)})}function lC(){Promise.resolve(Eb()).then(()=>{process.exit(143)})}function cC(){jn=null}function lz(){qu||(process.on("SIGINT",aC),process.on("SIGTERM",lC),process.on("exit",cC),qu=!0)}function dC(){qu&&(process.removeListener("SIGINT",aC),process.removeListener("SIGTERM",lC),process.removeListener("exit",cC),qu=!1)}async function cz(e){return jn!==null?jn:(Yo!==null||(Yo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(sC(),iC)),n=KR(e),r=new t(n);return lz(),jn=r,Yo=null,r})()),Yo)}async function Eb(){if(jn===null)return;let e=jn;jn=null,Yo=null,dC(),await e.shutdown()}function dz(){return jn!==null}function uz(){return jn}function pz(){jn=null,Yo=null,dC()}var jn,Yo,qu,Zo=R(()=>{"use strict";hb();jn=null,Yo=null,qu=!1});function uC(e,t){try{return NR(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function yz(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Zo(),Xo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function pC(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??yz,o=null,i=e,s=null,a=null;try{let c=await Hu(n,e,{headers:hz,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(gz.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(fz.test(d)&&!mz.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=uC(u,i)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<LR)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=uC(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var mz,fz,gz,hz,mC=R(()=>{"use strict";BR();fb();ve();mz=/(text\/html|application\/xhtml\+xml)/i,fz=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,gz=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,hz={"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 Sz(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(bz,{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),wz),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=qo(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}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 fC(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Sz({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 gC(e,t){if(t.length===0)return`# Search results for "${e}"
863
863
 
864
864
  (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(`
865
865
  `).trimEnd()}var bz,wz,hC=R(()=>{"use strict";zo();bz="https://api.exa.ai/search",wz=10});function Az(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=vz;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,kz)}let a=Ez;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,Tz)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function Tb(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+xz}function _z(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return Cz.some(o=>r.includes(o))}function Iz(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{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 i=Az(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await Hu(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(p){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(p){return{content:`web_scrape read error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}return{content:Tb(m,i.maxBytes)}}if(i.mode==="markdown")try{let u=await pC(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0}:{content:Tb(u.markdown,i.maxBytes)}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),p=_z(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${p}`,isError:!0}}let d=fC({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:Rz,timeoutMs:i.timeoutMs,signal:s.signal});return{content:Tb(gC(i.query,u),i.maxBytes)}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var vz,kz,Ez,Tz,xz,Rz,Cz,yC,bC=R(()=>{"use strict";mC();hC();fb();vz=3e4,kz=12e4,Ez=1e6,Tz=1e7,xz=`
@@ -964,7 +964,7 @@ ${y.content}`,isError:!0,...y.truncated===!0?{truncated:!0}:{}}),u.push({call:h,
964
964
 
965
965
  `+a})}r&&o.push({role:"user",content:Fp});let i=r?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&&qA(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"), or run it on a provider configured with the matching API key.`)},null;let l=g_({model:this.currentModel,messages:o,activeTools:i,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,isChatGptBackend:a});return yield*pw(s,{createStream:async c=>await this.client.responses.create(l,{signal:c}),translate:(c,d)=>WA(c,d,this.initSessionId),clarifyError:c=>this.clarifyResponsesError(c,a)})}else{let a=h_({model:this.currentModel,messages:o,activeTools:i,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort});return yield*pw(s,{createStream:async l=>await this.client.chat.completions.create(a,{signal:l}),translate:(l,c)=>DA(l,c,this.initSessionId),clarifyError:l=>l instanceof Error?l:new Error(String(l))})}}async*dispatchAndAppend(t,n,r){yield*t_({state:t,signal:n,vision:r,toolDispatcher:this.toolDispatcher,traceWriter:this.traceWriter,priorTurns:this.priorTurns,sessionId:this.initSessionId})}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async compact(){return this.compactHistory("manual")}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")return{compacted:!1,reason:"unsupported-wire-mode",messagesBefore:n,messagesAfter:n};let r=k.AFK_COMPACT_MODEL??this.currentModel;return ZA({priorTurns:this.priorTurns,summarize:(o,i)=>Mp({client:this.client,model:r,system:_p,user:Ip(o),maxTokens:1024,signal:i}),isClosed:this.closed,isIdle:this.abortController===null,beginAbort:()=>{let o=new AbortController;return this.abortController=o,o},clearAbort:o=>{this.abortController===o&&(this.abortController=null)},trigger:t,traceWriter:this.traceWriter})}async setModel(t){t!==void 0&&(this.currentModel=Et(t)??t)}async setPermissionMode(t){this.currentPermissionMode=lw(t);let n=Dn(this.currentPermissionMode);this.toolDispatcher?.setAllowAll?.(n),this.onPermissionMode?.(this.currentPermissionMode)}setCwd(t){this.toolDispatcher?.setResolveBase?.(t)}async supportedCommands(){return Wp()}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=Gt(this.currentModel),r;if(t&&n>0){let s=Zr(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=Wl(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:`${mw} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),W(`\u{1F7E2} ${mw}: closed`)}}});var hw,qt,VV,Jl=R(()=>{"use strict";bu();vu();_l();xu();hl();zb();jo();ln();Rn();Vb();Gn();fw();ow();dn();Xr();Hl();fw();hw="openai-compatible",qt=class{name=hw;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_initialResolveBase;_presenceSessionId=null;constructor(t={}){this.providerOpts=t,this.memoryStore=t.memoryStore??new mt;let n=[...gr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??Wt),t.skillExecutor&&n.push(Wo),t.composeExecutor&&n.push(Ko),t.readOnlyMemory===!0?n.push(ms):n.push(...Gr),n.push(Un);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);this.schemas=n}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=xl({surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),modelName:i,providerName:hw,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 Kt?o.toolDefs.map(b=>b.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?Rl(this.providerOpts.tools,s):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.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:s,...n.isSkillDispatch?{isSkillDispatch:!0}:{},...n.isNonInteractive?{isNonInteractive:!0}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{},...n.planExitControls!==void 0?{planExitControls:n.planExitControls}:{}});let a={},l=n.openaiBaseUrl??this.providerOpts.baseURL;if(l!==void 0&&(a.baseURL=l),a.toolDispatcher=o,a.onPermissionMode=b=>{this._currentPermissionMode=b},this.providerOpts.mcpManager!==void 0&&(a.mcpManager=this.providerOpts.mcpManager),(n.depth===void 0||n.depth===0)&&n.parentSessionId===void 0&&n.sessionId!==void 0&&this._presenceSessionId===null){this._presenceSessionId=n.sessionId;let b=n.sessionId,w=s.getWorkspace();Cl({sessionId:b,surface:this.providerOpts.surface??"cli",actor:Kn(n.depth),cwd:n.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:hw,name:i},workspace:w,pid:process.pid}),process.once("exit",()=>{hr(b)}),process.once("SIGINT",()=>{hr(b),process.exit(130)}),process.once("SIGTERM",()=>{hr(b),process.exit(143)})}let d=Tl({cwd:n.cwd??process.cwd(),...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:s.getWorkspace()}),u=vp(n.isSkillDispatch),m=kp(this.providerOpts.readOnlyMemory),p=this.providerOpts.skillExecutor?Kp():"",g=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,h=[u,m,d];p.length>0&&h.push(p),g!==void 0&&g.length>0&&h.push(g);let y={...n,systemPrompt:h.join(`
966
966
 
967
- `)};return b_(y,t.prompt,a)}buildDispatcher(t,n){let r=wp(t,n.cwd),o=El(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[d,u]of o)this.providerOpts.readOnlyMemory===!0&&d!=="memory_search"||r.set(d,u);n.runtimeStateSource&&r.set("get_runtime_state",fs(n.runtimeStateSource));for(let d of this.providerOpts.customTools??[])r.has(d.schema.name)||r.set(d.schema.name,d.handler);let i=n.planExitControls;i&&r.set(Ht,fu(i));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[d,u]of this.providerOpts.mcpManager.getMcpHandlers())r.set(d,u);let a=n.isSkillDispatch?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="terminal_font_size"):n.isNonInteractive?this.schemas.filter(d=>d.name!=="ask_question"):this.schemas,l={handlers:r,schemas:[...a,...s,...i?[mu]:[]],hookRegistry:yu(n.hookRegistry,this.providerOpts.hookRegistry)},c=Su(this.providerOpts.mcpManager?wu(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(d=>d.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.traceWriter!==void 0&&(l.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(l.readOnlyBash=!0),l.allowAll=Dn(t),new Kt(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 Kr({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._initialResolveBase,getAllowAll:()=>Dn(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()}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),t.signal&&(n.signal=t.signal),Mp(n)}},VV=new qt});function to(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}function qn(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":to(YV,e)?"read":to(XV,e)?"write":to(ZV,e)?"shell":to(no,e)?"subagent":to(Vl,e)?"skill":to(Yl,e)?"dag":to(QV,e)?"web":eY.has(e)?"browser":to(tY,e)?"planning":nY.has(e)?"schedule":"other"}function yw(e){return rY[e]}var YV,XV,ZV,no,Vl,Yl,Ye,QV,eY,tY,nY,w_,rY,Xl=R(()=>{"use strict";Du();YV=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search"]),XV=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size","config_set"]),ZV=new Set(["Bash","BashOutput","KillBash","bash"]),no=new Set(["Agent","Task","agent"]),Vl=new Set(["Skill","skill"]),Yl=new Set(["Compose","compose"]),Ye=new Set([...no,...Yl,...Vl]),QV=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),eY=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),tY=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),nY=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);w_=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search",...st];rY={subagent:"subagent",skill:"skill",dag:"dag"}});function Gp(e,t){return`Skill tool not available at nesting depth ${e} (max ${t}). ${Cs}`}var Cs,bw=R(()=>{"use strict";Cs="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function v_(e){S_.add(e)}function k_(e){return S_.has(e)}var S_,ww=R(()=>{"use strict";S_=new Set});function E_(e){Sw.add(e)}function T_(e){Sw.delete(e)}function x_(e){vw.add(e)}function R_(e){vw.delete(e)}function C_(e){for(let t of Sw)t(e)}function A_(e){for(let t of vw)t(e)}var Sw,vw,kw=R(()=>{"use strict";Sw=new Set,vw=new Set});function qp(e){return oY.has(e)}function __(e,t=iY){return e.length<=t?e:e.slice(0,t)+"\u2026"}function As(e){return e.surface!==void 0?{origin:Yr(e.surface),actor:Kn(e.depth)}:{}}var oY,iY,Ew=R(()=>{"use strict";Xr();oY=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","intent-lock","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);iY=240});function I_(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]
967
+ `)};return b_(y,t.prompt,a)}buildDispatcher(t,n){let r=wp(t,n.cwd),o=El(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[d,u]of o)this.providerOpts.readOnlyMemory===!0&&d!=="memory_search"||r.set(d,u);n.runtimeStateSource&&r.set("get_runtime_state",fs(n.runtimeStateSource));for(let d of this.providerOpts.customTools??[])r.has(d.schema.name)||r.set(d.schema.name,d.handler);let i=n.planExitControls;i&&r.set(Ht,fu(i));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[d,u]of this.providerOpts.mcpManager.getMcpHandlers())r.set(d,u);let a=n.isSkillDispatch?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="terminal_font_size"):n.isNonInteractive?this.schemas.filter(d=>d.name!=="ask_question"):this.schemas,l={handlers:r,schemas:[...a,...s,...i?[mu]:[]],hookRegistry:yu(n.hookRegistry,this.providerOpts.hookRegistry)},c=Su(this.providerOpts.mcpManager?wu(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(d=>d.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.traceWriter!==void 0&&(l.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(l.readOnlyBash=!0),l.allowAll=Dn(t),l.sessionGrantManager=this,new Kt(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 Kr({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._initialResolveBase,getAllowAll:()=>Dn(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()}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),t.signal&&(n.signal=t.signal),Mp(n)}},VV=new qt});function to(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}function qn(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":to(YV,e)?"read":to(XV,e)?"write":to(ZV,e)?"shell":to(no,e)?"subagent":to(Vl,e)?"skill":to(Yl,e)?"dag":to(QV,e)?"web":eY.has(e)?"browser":to(tY,e)?"planning":nY.has(e)?"schedule":"other"}function yw(e){return rY[e]}var YV,XV,ZV,no,Vl,Yl,Ye,QV,eY,tY,nY,w_,rY,Xl=R(()=>{"use strict";Du();YV=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search"]),XV=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size","config_set"]),ZV=new Set(["Bash","BashOutput","KillBash","bash"]),no=new Set(["Agent","Task","agent"]),Vl=new Set(["Skill","skill"]),Yl=new Set(["Compose","compose"]),Ye=new Set([...no,...Yl,...Vl]),QV=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),eY=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),tY=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),nY=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);w_=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search",...st];rY={subagent:"subagent",skill:"skill",dag:"dag"}});function Gp(e,t){return`Skill tool not available at nesting depth ${e} (max ${t}). ${Cs}`}var Cs,bw=R(()=>{"use strict";Cs="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function v_(e){S_.add(e)}function k_(e){return S_.has(e)}var S_,ww=R(()=>{"use strict";S_=new Set});function E_(e){Sw.add(e)}function T_(e){Sw.delete(e)}function x_(e){vw.add(e)}function R_(e){vw.delete(e)}function C_(e){for(let t of Sw)t(e)}function A_(e){for(let t of vw)t(e)}var Sw,vw,kw=R(()=>{"use strict";Sw=new Set,vw=new Set});function qp(e){return oY.has(e)}function __(e,t=iY){return e.length<=t?e:e.slice(0,t)+"\u2026"}function As(e){return e.surface!==void 0?{origin:Yr(e.surface),actor:Kn(e.depth)}:{}}var oY,iY,Ew=R(()=>{"use strict";Xr();oY=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","intent-lock","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);iY=240});function I_(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]
968
968
  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.
969
969
  Arguments: ${r}`}
970
970
 
@@ -1335,7 +1335,7 @@ ${t.body}`)}var Z4,nS=R(()=>{"use strict";Z4=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9
1335
1335
  `;process.stderr.write(c)}}var y5,b5,w5,Ys=R(()=>{"use strict";q();y5=`# AFK PROMPT DUMP \u2014 May contain secrets. Inspect before sharing.
1336
1336
  `,b5=/key|token|secret|password|credential|auth/i,w5=[[/sk-ant-[A-Za-z0-9_\-]{8,200}/g,e=>`<REDACTED sk-ant length=${e[0].length}>`],[/sk-(?!ant-)[A-Za-z0-9_\-]{20,200}/g,e=>`<REDACTED sk- length=${e[0].length}>`],[/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,e=>`<REDACTED Bearer length=${e[0].length}>`],[/AKIA[A-Z0-9]{16}/g,e=>`<REDACTED AKIA length=${e[0].length}>`],[/xox[baprs]-[A-Za-z0-9\-]{10,200}/g,e=>`<REDACTED xox token length=${e[0].length}>`],[/\d{8,12}:[A-Za-z0-9_\-]{35}/g,e=>`<REDACTED Telegram token length=${e[0].length}>`],[/([A-Za-z_]{3,}(?:[Kk][Ee][Yy]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|[Cc][Rr][Ee][Dd][Ee][Nn][Tt][Ii][Aa][Ll])[A-Za-z_]*)=([^\s]{16,})/g,e=>`${e[1]}=<REDACTED length=${e[2].length}>`],[/([A-Z_]{3,}(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*)=([^\s]{16,})/g,e=>`${e[1]}=<REDACTED length=${e[2].length}>`]]});function pM(e){let t=typeof e.baseUrl=="string"&&e.baseUrl.length>0,n=t?e.apiKey&&e.apiKey.length>0?e.apiKey:k.AFK_LOCAL_API_KEY||"local":e.apiKey&&e.apiKey.length>0?e.apiKey:k.ANTHROPIC_API_KEY||k.CLAUDE_CODE_OAUTH_TOKEN||"";return{localMode:t,token:n}}var mM=R(()=>{"use strict";q()});function fM(e){if((e.depth===void 0||e.depth===0)&&e.parentSessionId===void 0&&e.sessionId!==void 0&&e.currentPresenceSessionId===null){let n=e.sessionId,r=e.runtimeStateSource.getWorkspace();return Cl({sessionId:n,surface:e.surface,actor:Kn(e.depth),cwd:e.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:e.providerName,name:e.model},workspace:r,pid:process.pid}),process.once("exit",()=>{hr(n)}),process.once("SIGINT",()=>{hr(n),process.exit(130)}),process.once("SIGTERM",()=>{hr(n),process.exit(143)}),n}return e.currentPresenceSessionId}var gM=R(()=>{"use strict";dn();Xr()});function hM(e){let t=[e.toolBase,e.memoryPrompt];return e.manifest.length>0&&t.push(e.manifest),e.userSystem&&t.push(e.userSystem),t}function _m(e,t,n){return[e[0],e[1],Tl({cwd:t,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:n.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:n.workspace}),...e.slice(2)].join(`
1337
1337
 
1338
- `)}var yS=R(()=>{"use strict";dn()});function yM(e){return t=>{let n=e.getCurrentCwd();if(e.sharedReadRoots&&n!==void 0&&n!==t){let i=e.sharedReadRoots.indexOf(n);i!==-1?e.sharedReadRoots[i]=t:e.sharedReadRoots.includes(t)||e.sharedReadRoots.push(t)}if(e.sharedWriteRoots&&n!==void 0&&n!==t){let i=e.sharedWriteRoots.indexOf(n);i!==-1?e.sharedWriteRoots[i]=t:e.sharedWriteRoots.includes(t)||e.sharedWriteRoots.push(t)}e.setCurrentCwd(t),e.subagentExecutor?.setCwd(t),e.skillExecutor?.setCwd(t),e.composeExecutor?.setCwd(t);let r=_m(e.stableSystemPrefix,t,{surface:e.surface,sessionId:e.config.sessionId,depth:e.config.depth,maxDepth:e.config.maxDepth,workspace:e.runtimeStateSource.getWorkspace()}),o=e.buildDispatcher(e.getCurrentPermissionMode(),{cwd:t,readRoots:e.sharedReadRoots,writeRoots:e.sharedWriteRoots,...e.config.env!==void 0?{env:e.config.env}:{},sessionId:e.config.sessionId,parentSessionId:e.config.parentSessionId,traceWriter:e.config.traceWriter,runtimeStateSource:e.runtimeStateSource,hookRegistry:e.config.hookRegistry,planExitControls:e.config.planExitControls});return{userSystem:r,dispatcher:o}}}var bM=R(()=>{"use strict";yS()});import wM from"@anthropic-ai/sdk";function k5(e){if(e===void 0)return null;if(typeof e=="string")return e.length>0?e:null;if(typeof e=="object"&&e!==null&&"append"in e){let t=e.append;return t&&t.length>0?t:null}return null}var fc,SM,bS,tt,E5,li=R(()=>{"use strict";Vi();Xd();HT();ts();cM();hl();gS();gS();_l();xu();zb();jo();ln();Vb();vu();bu();vn();Gn();Rn();Ys();q();mM();dn();gM();bM();yS();fc="anthropic-direct",SM="claude-sonnet-5",bS=null,tt=class{name=fc;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;composeExecutor;surface;readOnlyMemory;readOnlyBash;mcpManager;customTools;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_initialResolveBase;_currentCwd;_mcpToolsCache=null;_mcpHandlersCache=null;_presenceSessionId=null;constructor(t={}){let n=[...gr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??Wt),t.skillExecutor&&n.push(Wo),t.composeExecutor&&n.push(Ko),t.readOnlyMemory===!0?n.push(ms):n.push(...Gr),n.push(Un);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);if(this.memoryStore=t.memoryStore??new mt,this.externalTools=t.tools,this.skillExecutor=t.skillExecutor,this.schemas=n,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.canUseTool=t.canUseTool,this.subagentExecutor=t.subagentExecutor,this.composeExecutor=t.composeExecutor,this.surface=t.surface??"cli",this.readOnlyMemory=t.readOnlyMemory===!0,this.readOnlyBash=t.readOnlyBash===!0,this.customTools=t.customTools??[],this.mcpManager=t.mcpManager,t.mcpManager){let r=t.mcpManager.onToolsRefreshed;t.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}t.clientFactory&&(this.providerFactory=t.clientFactory)}buildDispatcher(t,n){let r=wp(t,n?.cwd),o=El(this.memoryStore,void 0,this.surface);for(let[a,l]of o)this.readOnlyMemory&&a!=="memory_search"||r.set(a,l);n?.runtimeStateSource&&r.set("get_runtime_state",fs(n.runtimeStateSource));for(let a of this.customTools)r.has(a.schema.name)||r.set(a.schema.name,a.handler);if(this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[a,l]of this._mcpHandlersCache)r.set(a,l)}let i=this._mcpToolsCache??[],s=n?.planExitControls;return s&&r.set(Ht,fu(s)),new Kt({handlers:r,allowAll:Dn(t),schemas:[...this.schemas,...i,...s?[mu]:[]],hookRegistry:yu(n?.hookRegistry,this.hookRegistry),permissions:Su(this.mcpManager?wu(this.permissions,this.mcpManager.getMcpToolWireNames()):this.permissions,this.customTools.map(a=>a.schema.name)),subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,...this.canUseTool!==void 0?{canUseTool:this.canUseTool}:{},cwd:n?.cwd,readRoots:n?.readRoots,writeRoots:n?.writeRoots,...n?.env!==void 0?{env:n.env}:{},sessionId:n?.sessionId,parentSessionId:n?.parentSessionId,...n?.traceWriter?{traceWriter:n.traceWriter}:{},readOnlyBash:this.readOnlyBash})}close(){this.memoryStore.close()}async complete(t){let n=t.apiKey&&t.apiKey.length>0?t.apiKey:k.ANTHROPIC_API_KEY||k.CLAUDE_CODE_OAUTH_TOKEN||"";if(!n)throw new Error(`${fc} complete() requires an API key or OAuth token (config apiKey, ANTHROPIC_API_KEY, or CLAUDE_CODE_OAUTH_TOKEN)`);let r={token:n,model:t.model??SM,system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.signal&&(r.signal=t.signal);let o=this.providerFactory??bS;return o&&(r.clientFactory=o),es(r)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t),t&&!this._currentCwd&&(this._currentCwd=t)}}grantManager=new Kr({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._initialResolveBase,getAllowAll:()=>Dn(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()}query(t){let n=t.config,{localMode:r,token:o}=pM(n);if(!o||o.length===0)throw new Error(`${fc} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let i=zd(o),s=fl(o,i,n.baseUrl,!r&&n.traceWriter?sy(n.traceWriter):void 0),a=this.providerFactory??bS,l=a?a(s):new wM(s),c=r?null:TT(i),d=k5(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?Et(n.model)??n.model:SM,m=pS(n,u),p=n.permissionMode??"default";this._currentPermissionMode=p,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 g,h=xl({surface:this.surface,cwd:n.cwd??process.cwd(),modelName:u,providerName:fc,permissionMode:p,...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:()=>g instanceof Kt?g.toolDefs.map(F=>F.name):[],getMcpTools:()=>this.mcpManager?.getMcpTools()??[],getSubagents:()=>this.subagentExecutor?this.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});this._presenceSessionId=fM({depth:n.depth,parentSessionId:n.parentSessionId,sessionId:n.sessionId,currentPresenceSessionId:this._presenceSessionId,runtimeStateSource:h,surface:this.surface,cwd:n.cwd,providerName:fc,model:u}),g=this.externalTools?Rl(this.externalTools,h):this.buildDispatcher(p,{cwd:n.cwd,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,parentSessionId:n.parentSessionId,traceWriter:n.traceWriter,runtimeStateSource:h,hookRegistry:n.hookRegistry,planExitControls:n.planExitControls});let y=g instanceof Kt?[...g.toolDefs]:[...gr,Un],b=n.isSkillDispatch?y.filter(F=>F.name!=="ask_question"&&F.name!=="terminal_font_size"):n.isNonInteractive?y.filter(F=>F.name!=="ask_question"):y,w=n.cwd||process.cwd(),v=this.skillExecutor?Kp(void 0,{cwd:w}):"",S=vp(n.isSkillDispatch),E=kp(this.readOnlyMemory),x={surface:this.surface,sessionId:n.sessionId,depth:n.depth,maxDepth:n.maxDepth,workspace:h.getWorkspace()},C=hM({toolBase:S,memoryPrompt:E,manifest:v,userSystem:d}),A=_m(C,w,x);uM({prompt:t.prompt,options:{model:u,maxTokens:m,system:A},provenance:{systemPrompt:{source:n.systemPromptSource??"none",shape:typeof n.systemPrompt=="string"?"string":Array.isArray(n.systemPrompt)?"string[]":n.systemPrompt!=null?"preset":"undefined",...typeof n.systemPrompt=="string"?{length:n.systemPrompt.length}:{}},...n.apiKey?{apiKey:{source:"config"}}:{}}});let N;if(i==="oauth"&&!r){let F=this.providerFactory??bS;N=async()=>{let U=await ry();if(!U)return null;let H=fl(U,"oauth",n.baseUrl,n.traceWriter?sy(n.traceWriter):void 0);return F?F(H):new wM(H)}}let $=n.sessionId??n.resume,I=dM(n.resumeHistory),_=this.externalTools?void 0:yM({stableSystemPrefix:C,config:n,surface:this.surface,runtimeStateSource:h,getCurrentCwd:()=>this._currentCwd,setCurrentCwd:F=>{this._currentCwd=F},getCurrentPermissionMode:()=>this._currentPermissionMode,sharedReadRoots:this._sharedReadRoots,sharedWriteRoots:this._sharedWriteRoots,subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,buildDispatcher:(F,U)=>this.buildDispatcher(F,U)}),D=fS(n.effort,u);return new Cm({client:l,authMode:r?"api-key":i,promptStream:t.prompt,toolDispatcher:g,...$!==void 0?{sessionId:$}:{},...I!==void 0?{initialMessages:I}:{},model:u,requestedModel:typeof n.model=="string"&&n.model.length>0?n.model:u,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:m,tools:b,userSystem:A,systemPrefix:c,tokenRefresher:N,...n.thinking!==void 0?{thinking:mS(n.thinking,m,u)}:{},...D!==void 0?{effort:D}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...n.maxToolUseIterations!==void 0?{maxToolUseIterations:n.maxToolUseIterations}:{},..._!==void 0?{cwdDependentsFactory:_}:{},onPermissionMode:F=>{this._currentPermissionMode=F},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...Rs(n.autoCompact)!==void 0?{autoCompactThreshold:Rs(n.autoCompact)}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{}})}};E5=new tt});function x5(e){if(!e)return;let t=e.trim().toLowerCase();if(t){if(t==="anthropic"||t==="anthropic-direct")return"anthropic-direct";if(t==="openai"||t==="openai-compatible"||t==="openai-codex")return"openai-compatible"}}function re(e,t){let n=t?.explicit??k.AFK_PROVIDER,r=t?.openaiBaseUrl??k.AFK_OPENAI_BASE_URL,o=x5(n);if(o)return o;let i=ty(e,t?.slots);if(i.provider==="anthropic")return"anthropic-direct";if(i.provider==="openai")return"openai-compatible";let s=i.id.trim().toLowerCase();return s&&(T5.has(s)||s.startsWith("claude-")||s.startsWith("claude_")||s.startsWith("local-")||s.startsWith("local_"))?"anthropic-direct":s&&(s.startsWith("gpt-")||s.startsWith("gpt_")||ei(s)||s.startsWith("codex-")||s.startsWith("codex_")||s==="codex"||s.startsWith("deepseek-")||s.startsWith("deepseek_")||s.startsWith("mistral-")||s.startsWith("mistral_")||s.startsWith("mixtral-")||s.startsWith("mixtral_")||s.startsWith("llama-")||s.startsWith("llama_")||s.startsWith("qwen-")||s.startsWith("qwen_")||s.includes("/"))||i.baseUrl&&i.baseUrl.trim()||r&&r.trim()?"openai-compatible":"anthropic-direct"}function Im(e,t,n){let r=re(e,t),o=n?.customTools,i=n?.canUseTool,s={...o!==void 0&&o.length>0?{customTools:o}:{},...i!==void 0?{canUseTool:i}:{}};switch(r){case"openai-compatible":case"openai-codex":return new qt(s);default:return new tt(s)}}var T5,Je=R(()=>{"use strict";li();Jl();vn();Lt();Es();q();li();Jl();T5=new Set([...Object.keys(ny),"auto"])});var Xs,wS=R(()=>{"use strict";Xs=class{pendingResolve=null;bufferedMessages=[];getSessionId;constructor(t){this.getSessionId=t}pushUserMessage(t){if(this.pendingResolve){let n=this.pendingResolve;this.pendingResolve=null;let r=this.getSessionId();n({content:t,...r!==void 0?{sessionId:r}:{}});return}this.bufferedMessages.push(t)}createIterable(){let t=this;return{[Symbol.asyncIterator](){return{next(){if(t.bufferedMessages.length>0){let n=t.bufferedMessages.shift(),r=t.getSessionId();return Promise.resolve({value:{content:n,...r!==void 0?{sessionId:r}:{}},done:!1})}return new Promise(n=>{t.pendingResolve=r=>n({value:r,done:!1})})},return(){return Promise.resolve({value:void 0,done:!0})}}}}}}});function Pm(e,t){let n=t??Xi(),r=Zi(e.model,n);if(!r)return;let o=n[r],i=o.provider==="anthropic"?"anthropic-direct":o.provider==="openai"?"openai-compatible":re(e.model,t?{slots:t}:void 0);o.apiKey!==void 0?e.apiKey=o.apiKey:(i==="openai-compatible"||o.baseUrl!==void 0)&&(e.apiKey=void 0),o.baseUrl!==void 0&&(i==="openai-compatible"?e.openaiBaseUrl=o.baseUrl:e.baseUrl=o.baseUrl)}var SS=R(()=>{"use strict";Je();Lt()});function R5(e){return typeof e=="string"?e:e.map(t=>{let n=t;return n.type==="text"&&typeof n.text=="string"?n.text:""}).filter(t=>t.length>0).join(`
1338
+ `)}var yS=R(()=>{"use strict";dn()});function yM(e){return t=>{let n=e.getCurrentCwd();if(e.sharedReadRoots&&n!==void 0&&n!==t){let i=e.sharedReadRoots.indexOf(n);i!==-1?e.sharedReadRoots[i]=t:e.sharedReadRoots.includes(t)||e.sharedReadRoots.push(t)}if(e.sharedWriteRoots&&n!==void 0&&n!==t){let i=e.sharedWriteRoots.indexOf(n);i!==-1?e.sharedWriteRoots[i]=t:e.sharedWriteRoots.includes(t)||e.sharedWriteRoots.push(t)}e.setCurrentCwd(t),e.subagentExecutor?.setCwd(t),e.skillExecutor?.setCwd(t),e.composeExecutor?.setCwd(t);let r=_m(e.stableSystemPrefix,t,{surface:e.surface,sessionId:e.config.sessionId,depth:e.config.depth,maxDepth:e.config.maxDepth,workspace:e.runtimeStateSource.getWorkspace()}),o=e.buildDispatcher(e.getCurrentPermissionMode(),{cwd:t,readRoots:e.sharedReadRoots,writeRoots:e.sharedWriteRoots,...e.config.env!==void 0?{env:e.config.env}:{},sessionId:e.config.sessionId,parentSessionId:e.config.parentSessionId,traceWriter:e.config.traceWriter,runtimeStateSource:e.runtimeStateSource,hookRegistry:e.config.hookRegistry,planExitControls:e.config.planExitControls});return{userSystem:r,dispatcher:o}}}var bM=R(()=>{"use strict";yS()});import wM from"@anthropic-ai/sdk";function k5(e){if(e===void 0)return null;if(typeof e=="string")return e.length>0?e:null;if(typeof e=="object"&&e!==null&&"append"in e){let t=e.append;return t&&t.length>0?t:null}return null}var fc,SM,bS,tt,E5,li=R(()=>{"use strict";Vi();Xd();HT();ts();cM();hl();gS();gS();_l();xu();zb();jo();ln();Vb();vu();bu();vn();Gn();Rn();Ys();q();mM();dn();gM();bM();yS();fc="anthropic-direct",SM="claude-sonnet-5",bS=null,tt=class{name=fc;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;composeExecutor;surface;readOnlyMemory;readOnlyBash;mcpManager;customTools;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_initialResolveBase;_currentCwd;_mcpToolsCache=null;_mcpHandlersCache=null;_presenceSessionId=null;constructor(t={}){let n=[...gr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??Wt),t.skillExecutor&&n.push(Wo),t.composeExecutor&&n.push(Ko),t.readOnlyMemory===!0?n.push(ms):n.push(...Gr),n.push(Un);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);if(this.memoryStore=t.memoryStore??new mt,this.externalTools=t.tools,this.skillExecutor=t.skillExecutor,this.schemas=n,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.canUseTool=t.canUseTool,this.subagentExecutor=t.subagentExecutor,this.composeExecutor=t.composeExecutor,this.surface=t.surface??"cli",this.readOnlyMemory=t.readOnlyMemory===!0,this.readOnlyBash=t.readOnlyBash===!0,this.customTools=t.customTools??[],this.mcpManager=t.mcpManager,t.mcpManager){let r=t.mcpManager.onToolsRefreshed;t.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}t.clientFactory&&(this.providerFactory=t.clientFactory)}buildDispatcher(t,n){let r=wp(t,n?.cwd),o=El(this.memoryStore,void 0,this.surface);for(let[a,l]of o)this.readOnlyMemory&&a!=="memory_search"||r.set(a,l);n?.runtimeStateSource&&r.set("get_runtime_state",fs(n.runtimeStateSource));for(let a of this.customTools)r.has(a.schema.name)||r.set(a.schema.name,a.handler);if(this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[a,l]of this._mcpHandlersCache)r.set(a,l)}let i=this._mcpToolsCache??[],s=n?.planExitControls;return s&&r.set(Ht,fu(s)),new Kt({handlers:r,sessionGrantManager:this,allowAll:Dn(t),schemas:[...this.schemas,...i,...s?[mu]:[]],hookRegistry:yu(n?.hookRegistry,this.hookRegistry),permissions:Su(this.mcpManager?wu(this.permissions,this.mcpManager.getMcpToolWireNames()):this.permissions,this.customTools.map(a=>a.schema.name)),subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,...this.canUseTool!==void 0?{canUseTool:this.canUseTool}:{},cwd:n?.cwd,readRoots:n?.readRoots,writeRoots:n?.writeRoots,...n?.env!==void 0?{env:n.env}:{},sessionId:n?.sessionId,parentSessionId:n?.parentSessionId,...n?.traceWriter?{traceWriter:n.traceWriter}:{},readOnlyBash:this.readOnlyBash})}close(){this.memoryStore.close()}async complete(t){let n=t.apiKey&&t.apiKey.length>0?t.apiKey:k.ANTHROPIC_API_KEY||k.CLAUDE_CODE_OAUTH_TOKEN||"";if(!n)throw new Error(`${fc} complete() requires an API key or OAuth token (config apiKey, ANTHROPIC_API_KEY, or CLAUDE_CODE_OAUTH_TOKEN)`);let r={token:n,model:t.model??SM,system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.signal&&(r.signal=t.signal);let o=this.providerFactory??bS;return o&&(r.clientFactory=o),es(r)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t),t&&!this._currentCwd&&(this._currentCwd=t)}}grantManager=new Kr({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._initialResolveBase,getAllowAll:()=>Dn(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()}query(t){let n=t.config,{localMode:r,token:o}=pM(n);if(!o||o.length===0)throw new Error(`${fc} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let i=zd(o),s=fl(o,i,n.baseUrl,!r&&n.traceWriter?sy(n.traceWriter):void 0),a=this.providerFactory??bS,l=a?a(s):new wM(s),c=r?null:TT(i),d=k5(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?Et(n.model)??n.model:SM,m=pS(n,u),p=n.permissionMode??"default";this._currentPermissionMode=p,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 g,h=xl({surface:this.surface,cwd:n.cwd??process.cwd(),modelName:u,providerName:fc,permissionMode:p,...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:()=>g instanceof Kt?g.toolDefs.map(F=>F.name):[],getMcpTools:()=>this.mcpManager?.getMcpTools()??[],getSubagents:()=>this.subagentExecutor?this.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});this._presenceSessionId=fM({depth:n.depth,parentSessionId:n.parentSessionId,sessionId:n.sessionId,currentPresenceSessionId:this._presenceSessionId,runtimeStateSource:h,surface:this.surface,cwd:n.cwd,providerName:fc,model:u}),g=this.externalTools?Rl(this.externalTools,h):this.buildDispatcher(p,{cwd:n.cwd,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,parentSessionId:n.parentSessionId,traceWriter:n.traceWriter,runtimeStateSource:h,hookRegistry:n.hookRegistry,planExitControls:n.planExitControls});let y=g instanceof Kt?[...g.toolDefs]:[...gr,Un],b=n.isSkillDispatch?y.filter(F=>F.name!=="ask_question"&&F.name!=="terminal_font_size"):n.isNonInteractive?y.filter(F=>F.name!=="ask_question"):y,w=n.cwd||process.cwd(),v=this.skillExecutor?Kp(void 0,{cwd:w}):"",S=vp(n.isSkillDispatch),E=kp(this.readOnlyMemory),x={surface:this.surface,sessionId:n.sessionId,depth:n.depth,maxDepth:n.maxDepth,workspace:h.getWorkspace()},C=hM({toolBase:S,memoryPrompt:E,manifest:v,userSystem:d}),A=_m(C,w,x);uM({prompt:t.prompt,options:{model:u,maxTokens:m,system:A},provenance:{systemPrompt:{source:n.systemPromptSource??"none",shape:typeof n.systemPrompt=="string"?"string":Array.isArray(n.systemPrompt)?"string[]":n.systemPrompt!=null?"preset":"undefined",...typeof n.systemPrompt=="string"?{length:n.systemPrompt.length}:{}},...n.apiKey?{apiKey:{source:"config"}}:{}}});let N;if(i==="oauth"&&!r){let F=this.providerFactory??bS;N=async()=>{let U=await ry();if(!U)return null;let H=fl(U,"oauth",n.baseUrl,n.traceWriter?sy(n.traceWriter):void 0);return F?F(H):new wM(H)}}let $=n.sessionId??n.resume,I=dM(n.resumeHistory),_=this.externalTools?void 0:yM({stableSystemPrefix:C,config:n,surface:this.surface,runtimeStateSource:h,getCurrentCwd:()=>this._currentCwd,setCurrentCwd:F=>{this._currentCwd=F},getCurrentPermissionMode:()=>this._currentPermissionMode,sharedReadRoots:this._sharedReadRoots,sharedWriteRoots:this._sharedWriteRoots,subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,buildDispatcher:(F,U)=>this.buildDispatcher(F,U)}),D=fS(n.effort,u);return new Cm({client:l,authMode:r?"api-key":i,promptStream:t.prompt,toolDispatcher:g,...$!==void 0?{sessionId:$}:{},...I!==void 0?{initialMessages:I}:{},model:u,requestedModel:typeof n.model=="string"&&n.model.length>0?n.model:u,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:m,tools:b,userSystem:A,systemPrefix:c,tokenRefresher:N,...n.thinking!==void 0?{thinking:mS(n.thinking,m,u)}:{},...D!==void 0?{effort:D}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...n.maxToolUseIterations!==void 0?{maxToolUseIterations:n.maxToolUseIterations}:{},..._!==void 0?{cwdDependentsFactory:_}:{},onPermissionMode:F=>{this._currentPermissionMode=F},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...Rs(n.autoCompact)!==void 0?{autoCompactThreshold:Rs(n.autoCompact)}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{}})}};E5=new tt});function x5(e){if(!e)return;let t=e.trim().toLowerCase();if(t){if(t==="anthropic"||t==="anthropic-direct")return"anthropic-direct";if(t==="openai"||t==="openai-compatible"||t==="openai-codex")return"openai-compatible"}}function re(e,t){let n=t?.explicit??k.AFK_PROVIDER,r=t?.openaiBaseUrl??k.AFK_OPENAI_BASE_URL,o=x5(n);if(o)return o;let i=ty(e,t?.slots);if(i.provider==="anthropic")return"anthropic-direct";if(i.provider==="openai")return"openai-compatible";let s=i.id.trim().toLowerCase();return s&&(T5.has(s)||s.startsWith("claude-")||s.startsWith("claude_")||s.startsWith("local-")||s.startsWith("local_"))?"anthropic-direct":s&&(s.startsWith("gpt-")||s.startsWith("gpt_")||ei(s)||s.startsWith("codex-")||s.startsWith("codex_")||s==="codex"||s.startsWith("deepseek-")||s.startsWith("deepseek_")||s.startsWith("mistral-")||s.startsWith("mistral_")||s.startsWith("mixtral-")||s.startsWith("mixtral_")||s.startsWith("llama-")||s.startsWith("llama_")||s.startsWith("qwen-")||s.startsWith("qwen_")||s.includes("/"))||i.baseUrl&&i.baseUrl.trim()||r&&r.trim()?"openai-compatible":"anthropic-direct"}function Im(e,t,n){let r=re(e,t),o=n?.customTools,i=n?.canUseTool,s={...o!==void 0&&o.length>0?{customTools:o}:{},...i!==void 0?{canUseTool:i}:{}};switch(r){case"openai-compatible":case"openai-codex":return new qt(s);default:return new tt(s)}}var T5,Je=R(()=>{"use strict";li();Jl();vn();Lt();Es();q();li();Jl();T5=new Set([...Object.keys(ny),"auto"])});var Xs,wS=R(()=>{"use strict";Xs=class{pendingResolve=null;bufferedMessages=[];getSessionId;constructor(t){this.getSessionId=t}pushUserMessage(t){if(this.pendingResolve){let n=this.pendingResolve;this.pendingResolve=null;let r=this.getSessionId();n({content:t,...r!==void 0?{sessionId:r}:{}});return}this.bufferedMessages.push(t)}createIterable(){let t=this;return{[Symbol.asyncIterator](){return{next(){if(t.bufferedMessages.length>0){let n=t.bufferedMessages.shift(),r=t.getSessionId();return Promise.resolve({value:{content:n,...r!==void 0?{sessionId:r}:{}},done:!1})}return new Promise(n=>{t.pendingResolve=r=>n({value:r,done:!1})})},return(){return Promise.resolve({value:void 0,done:!0})}}}}}}});function Pm(e,t){let n=t??Xi(),r=Zi(e.model,n);if(!r)return;let o=n[r],i=o.provider==="anthropic"?"anthropic-direct":o.provider==="openai"?"openai-compatible":re(e.model,t?{slots:t}:void 0);o.apiKey!==void 0?e.apiKey=o.apiKey:(i==="openai-compatible"||o.baseUrl!==void 0)&&(e.apiKey=void 0),o.baseUrl!==void 0&&(i==="openai-compatible"?e.openaiBaseUrl=o.baseUrl:e.baseUrl=o.baseUrl)}var SS=R(()=>{"use strict";Je();Lt()});function R5(e){return typeof e=="string"?e:e.map(t=>{let n=t;return n.type==="text"&&typeof n.text=="string"?n.text:""}).filter(t=>t.length>0).join(`
1339
1339
  `)}var Mm,vM=R(()=>{"use strict";wS();SS();ve();Mm=class{outerIterator;baseConfig;deps;currentModel;currentPermissionMode;currentCwd;startupFamily;active;activeModel;closed=!1;shadowHistory;pendingUserText;pendingAssistantText="";lastSessionId;constructor(t,n){this.outerIterator=t.prompt[Symbol.asyncIterator](),this.baseConfig=t.config,this.deps=n,this.currentModel=typeof t.config.model=="string"?t.config.model:void 0,this.currentPermissionMode=t.config.permissionMode,this.currentCwd=t.config.cwd,this.startupFamily=n.providerNameForModel(this.currentModel),this.shadowHistory=[...t.config.resumeHistory??[]]}resolveInner(t){let n=this.deps.resolveProvider(t),r={...this.baseConfig};r.model=t??this.baseConfig.model;let o=n.name===this.startupFamily&&this.baseConfig.apiKey!==void 0?this.baseConfig.apiKey:this.deps.resolveApiKey(t);o!==void 0?r.apiKey=o:delete r.apiKey,Pm(r);let i=[n.name,r.baseUrl??"",r.openaiBaseUrl??"",r.apiKey??""].join("\0");return{provider:n,innerConfig:r,signature:i}}buildInner(t,n){let{provider:r,innerConfig:o,signature:i}=this.resolveInner(t),s=new Xs(()=>this.lastSessionId);this.currentPermissionMode!==void 0&&(o.permissionMode=this.currentPermissionMode),this.currentCwd!==void 0&&(o.cwd=this.currentCwd),n&&(o.resumeHistory=[...this.shadowHistory]);let a=r.query({prompt:s.createIterable(),config:o});return{family:r.name,signature:i,query:a,iterator:a[Symbol.asyncIterator](),input:s}}async closeActive(){let t=this.active;if(t){this.active=void 0;try{await t.iterator.return?.(void 0)}catch{}try{await t.query.close()}catch{}}}observeEvent(t){t.type==="assistant.message"&&(this.pendingAssistantText+=(this.pendingAssistantText?`
1340
1340
  `:"")+t.text)}commitShadowTurn(){this.pendingUserText!==void 0&&(this.shadowHistory.push({user:this.pendingUserText,assistant:this.pendingAssistantText}),this.pendingUserText=void 0,this.pendingAssistantText="")}async*[Symbol.asyncIterator](){try{for(this.active=this.buildInner(this.currentModel,!1),this.activeModel=this.currentModel,yield*this.driveUntilInit(!1);!this.closed;){let t=await this.outerIterator.next();if(t.done)break;let n=t.value;this.lastSessionId=n.sessionId;let r=this.currentModel!==this.activeModel,o=!this.active||r&&this.resolveInner(this.currentModel).signature!==this.active.signature;if(this.activeModel=this.currentModel,o&&(await this.closeActive(),this.active=this.buildInner(this.currentModel,!0),W(`\u{1F500} ProviderRouter: switched inner provider \u2192 ${this.active.family} (model=${this.currentModel})`),yield*this.driveUntilInit(!0)))break;for(this.pendingUserText=R5(n.content),this.pendingAssistantText="",this.active.input.pushUserMessage(n.content);;){let i=await this.active.iterator.next();if(i.done){this.closed=!0;break}let s=i.value;if(this.observeEvent(s),yield s,s.type==="turn.completed"){this.commitShadowTurn();break}if(s.type==="error"){this.commitShadowTurn();break}}}}finally{await this.closeActive()}}async*driveUntilInit(t){for(;;){let n=await this.active.iterator.next();if(n.done)return yield{type:"error",error:new Error("provider ended before initialization")},this.closed=!0,!0;let r=n.value;if(r.type==="session.init")return t||(yield r),!1;if(r.type==="error")return yield r,this.closed=!0,!0;yield r}}async interrupt(){await this.active?.query.interrupt()}async setModel(t){typeof t=="string"&&t.length>0&&(this.currentModel=t,this.active&&this.resolveInner(t).signature===this.active.signature&&await this.active.query.setModel(t))}async setPermissionMode(t){this.currentPermissionMode=t,await this.active?.query.setPermissionMode(t)}setCwd(t){this.currentCwd=t,this.active?.query.setCwd?.(t)}async reauth(){return await this.active?.query.reauth?.()??null}async supportedCommands(){return await this.active?.query.supportedCommands()??[]}async supportedModels(){return await this.active?.query.supportedModels()??[]}async supportedAgents(){return await this.active?.query.supportedAgents()??[]}async getContextUsage(){return await this.active?.query.getContextUsage()??{}}async mcpServerStatus(){return await this.active?.query.mcpServerStatus()??[]}async accountInfo(){return await this.active?.query.accountInfo()??{}}async rewindFiles(t,n){let r=this.active;return r?r.query.rewindFiles(t,n):{canRewind:!1,error:"no active provider"}}async compact(){let t=this.active;return t?.query.compact?t.query.compact():{compacted:!1,reason:"provider does not support compaction",messagesBefore:0,messagesAfter:0}}async reloadPlugins(...t){let n=this.active?.query;if(n&&typeof n.reloadPlugins=="function")return n.reloadPlugins(...t)}async close(){this.closed=!0,await this.closeActive()}}});async function Om(e,t,n){if(!e)return;if(n.kind==="blocked"){await wn(e,{hookEvent:t,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await wn(e,{hookEvent:t,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function kM(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Om(n.traceWriter,"SessionStart",{kind:"decision",decision:r})}catch(r){throw r instanceof me&&await Om(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function EM(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Om(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof me&&await Om(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof me||r instanceof ut){W(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}W(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var TM=R(()=>{"use strict";ve();pt();xe()});function ci(e){return e==="abort"?vS:null}var vS,$m=R(()=>{"use strict";vS="Session ended via abort before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state, or re-run the task if the interruption was intentional."});function C5(e){return e==="max_tokens"||e==="length"}function xM(e){return e.maxTurnsHit?"max_turns_exceeded":e.hookBlocked?"hook_blocked":e.dispatchReason==="error"?"abort":e.abort!==null?e.abort:e.sawProviderError?"abort":e.lastStopReason==="tool_use_loop_capped"?"iteration_cap":C5(e.lastStopReason)?"truncated":"model_end_turn"}var RM=R(()=>{"use strict"});function A5(e){let t=null,n=e.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;r instanceof Lr?t="budget_exceeded":r instanceof tn?t="timeout":typeof r=="string"&&r.startsWith("Budget ")?t="budget_exceeded":typeof r=="string"&&r.includes("timed out")?t="timeout":t="abort"}return xM({dispatchReason:e.dispatchReason,maxTurnsHit:e.maxTurnsHit,hookBlocked:e.hookBlocked,abort:t,lastStopReason:e.lastStopReason,sawProviderError:e.sawProviderError})}function _5(e){if(e.dispatchReason==="error")return"failed";let t=e.signal;return t.aborted&&t.reason!=="closed"?"cancelled":e.sawProviderError?"failed":"succeeded"}async function CM(e,t){if(!e)return;let n=A5(t),r={},o=t.runningTokens;o.input>0&&(r.input=o.input),o.output>0&&(r.output=o.output),o.cacheRead>0&&(r.cacheRead=o.cacheRead),o.cacheCreation>0&&(r.cacheCreation=o.cacheCreation);let i=ci(n);await kT(e,{reason:n,finalTurnCount:t.finalTurnCount,finalCostUsd:t.finalCostUsd,finalTokens:r,...t.lastStopReason!==void 0?{lastStopReason:t.lastStopReason}:{},...i!==null?{guidance:i}:{}})}async function AM(e,t){if(!e)return;let n=_5(t),r=t.subagentCompletedCount>0?t.subagentCompletedCount:void 0,o=t.subagentRunningTokens,s=o.input>0||o.output>0||o.cacheRead>0||o.cacheCreation>0?{...o.input>0?{input:o.input}:{},...o.output>0?{output:o.output}:{},...o.cacheRead>0?{cacheRead:o.cacheRead}:{},...o.cacheCreation>0?{cacheCreation:o.cacheCreation}:{}}:void 0,a=t.subagentRunningCostUsd>0?t.subagentRunningCostUsd:void 0;await e.seal({status:n,finalCostUsd:t.finalCostUsd,finalTurnCount:t.finalTurnCount,closedAt:new Date().toISOString(),...r!==void 0?{subagentCount:r}:{},...s!==void 0?{subagentTokens:s}:{},...a!==void 0?{subagentCostUsd:a}:{}})}var _M=R(()=>{"use strict";pt();xe();$m();RM()});import*as Zs from"node:fs";import*as Qs from"node:fs/promises";import*as PM from"node:readline";function Dm(e,t){return e.length>t?`${e.slice(0,t)}\u2026 [truncated]`:e}function I5(e){switch(e.type){case"message":return e.message.role!=="assistant"||!e.message.content?null:{kind:"assistant",text:Dm(e.message.content,MM)};case"chunk":{let t=e.chunk;return t.type==="tool_use_detail"?{kind:"tool",toolName:t.toolName,input:Dm(t.toolInput,IM)}:t.type==="tool_result"&&t.isError===!0?{kind:"tool_error",content:Dm(t.content,IM)}:null}case"done":{let t=e.metadata?.totalCostUsd,n=e.metadata?.durationMs;return{kind:"done",...typeof t=="number"?{costUsd:t}:{},...typeof n=="number"?{durationMs:n}:{}}}case"error":return{kind:"error",message:e.error.message};case"paused":return{kind:"paused",...e.resetsAt?{resetsAt:e.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};default:return null}}function OM(e){let t=e.trim();if(!t)return null;try{let n=JSON.parse(t);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function*$M(e){if(!ll(e))return;let t;try{t=await Qs.open(Dd(e),"r")}catch(n){if(n.code==="ENOENT")return;throw n}try{let n=PM.createInterface({input:t.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let r of n){let o=OM(r);o&&(yield o)}}finally{await t.close()}}async function*kS(e,t){if(!ll(e))return;let n=Dd(e),r=cl(e),{fromStart:o=!1,signal:i}=t??{},s=0,a="",l=!1;async function*c(){let p=null;try{p=await Qs.open(n,"r");let g=await p.stat();if(g.size<=s)return;let h=g.size-s,y=Buffer.allocUnsafe(h),{bytesRead:b}=await p.read(y,0,h,s);if(b===0)return;s+=b,a+=y.toString("utf8",0,b);let w=a.split(`
1341
1341
  `);a=w.pop()??"";for(let v of w){let S=OM(v);if(S&&(S.kind==="closed"&&(l=!0),yield S,l))return}}catch(g){g.code!=="ENOENT"&&process.stderr.write(`[afk] session-ledger: tail read error for ${e}: ${String(g)}
@@ -1443,12 +1443,12 @@ ${S.map(A=>`> - ${A}`).join(`
1443
1443
  `)){let r=n.trim();if(r!=="")try{let o=JSON.parse(r);BX(o)&&t.push(o)}catch{}}return t}function BX(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.kind=="string"&&typeof t.ts=="string"&&"payload"in t}function CS(e){let t=OX($X(e)),n=Oh();return{label:t,jsonPath:w0(n,`${t}.json`),mdPath:w0(n,`${t}.md`)}}function UX(e,t){let n={},r={},o={},i=[],s=0,a=0,l=0,c=0,d={started:0,succeeded:0,failed:0,cancelled:0},u,m,p,g,h,y,b,w,v,S,E=!1;for(let B of e)switch(n[B.kind]=(n[B.kind]??0)+1,B.kind){case"tool_call":{let P=B.payload;if(P.phase!=="completed")break;if(P.circuitBreaker===!0){c++;break}s++;let M=r[P.name]??{total:0,errored:0};if(M.total++,P.isError===!0){l++,M.errored++;let O=P.failureClass,j=O??"unclassified";o[j]=(o[j]??0)+1,i.push({toolUseId:P.toolUseId,name:P.name,...O!==void 0?{failureClass:O}:{},durationMs:P.durationMs,ts:B.ts,truncated:P.truncated===!0,exempt:O!==void 0&&FX.has(O),...P.subagentId!==void 0?{subagentId:P.subagentId}:{}})}else a++;r[P.name]=M;break}case"subagent_lifecycle":{let P=B.payload.transition;P==="started"?d.started++:P==="succeeded"?d.succeeded++:P==="failed"?d.failed++:P==="cancelled"&&d.cancelled++;break}case"closure":{let P=B.payload;u=P.reason,m=P.lastStopReason,p=P.guidance,h=P.finalCostUsd,y=P.finalTurnCount,P.finalTokens!==void 0&&(g=P.finalTokens);break}case"session_sealed":{let P=B.payload;b=P.status,w=P.finalCostUsd,v=P.finalTurnCount,S=P.closedAt,P.incomplete===!0&&(E=!0);break}default:break}let x=i.filter(B=>!B.exempt).length,C=LX.reduce((B,P)=>B+(o[P]??0),0),A=b??"unknown",N=e[0]?.ts,$=S??(e.length>0?e[e.length-1]?.ts:void 0),I;if(N!==void 0&&$!==void 0){let B=Date.parse($)-Date.parse(N);Number.isFinite(B)&&B>=0&&(I=B)}let _=w??h,D=v??y,F=[];A==="failed"?F.push('Session sealed with status "failed".'):A==="cancelled"?F.push("Session was cancelled."):A==="unknown"&&F.push("No terminal session_sealed record found \u2014 the trace may be truncated or was read before the session sealed."),E&&F.push("Trace was sealed by the process-exit backstop, indicating an abnormal exit (crash, early EOF, or process.exit())."),u!==void 0&&u!=="model_end_turn"&&F.push(`Closure reason "${u}" is not a clean completion.`),x>0&&F.push(`${x} tool call(s) returned an error (excluding expected policy/permission refusals).`),c>0&&F.push(`Repeat-loop circuit breaker fired ${c} time(s).`),d.failed>0&&F.push(`${d.failed} subagent(s) failed.`);let U=["Sourced from witness-trace metadata only: raw tool output (stdout/stderr, file contents, error messages) is NOT recorded in the trace and is therefore absent here.","Failure entries list tool name, failure class, duration, and timestamp; inspect the trace at the path above for full per-call detail."];A==="unknown"&&U.push("No session_sealed record was present when this receipt was generated.");let H={..._!==void 0?{finalCostUsd:_}:{},...D!==void 0?{turnCount:D}:{},...g!==void 0?{tokens:g}:{}};return{schemaVersion:DX,generatedAt:(t.now??new Date).toISOString(),witnessLabel:t.witnessLabel,tracePath:t.tracePath,...t.sessionId!==void 0?{sessionId:t.sessionId}:{},...t.endReason!==void 0?{endReason:t.endReason}:{},status:A,...u!==void 0?{closureReason:u}:{},...m!==void 0?{lastStopReason:m}:{},...p!==void 0?{guidance:p}:{},incomplete:E,...N!==void 0?{startedAt:N}:{},...$!==void 0?{endedAt:$}:{},...I!==void 0?{durationMs:I}:{},toolCalls:{total:s,succeeded:a,errored:l,erroredNotable:x,refused:C,circuitBreakerHits:c,byTool:r,byFailureClass:o},events:{total:e.length,byKind:n},subagents:d,cost:H,failures:i,humanReviewRequired:F.length>0,humanReviewReasons:F,limitations:U}}function jX(e){if(e<1e3)return`${e}ms`;let t=e/1e3;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),r=Math.round(t%60);return`${n}m${r}s`}function HX(e){let t=[];t.push(`# Run receipt \u2014 ${e.witnessLabel}`),t.push(""),t.push(`**Status:** ${e.status} \xB7 **Review required:** ${e.humanReviewRequired?"\u26A0\uFE0F YES":"\u2713 no"}`);let n=[];if(e.sessionId!==void 0&&n.push(`**Session:** ${e.sessionId}`),e.endedAt!==void 0&&n.push(`**Ended:** ${e.endedAt}`),e.durationMs!==void 0&&n.push(`**Duration:** ${jX(e.durationMs)}`),n.length>0&&t.push(n.join(" \xB7 ")),t.push(`**Trace:** \`${e.tracePath}\``),t.push(""),e.humanReviewRequired){t.push("## Why review is required");for(let o of e.humanReviewReasons)t.push(`- ${o}`);t.push("")}if(t.push("## Summary"),t.push(""),t.push("| Metric | Value |"),t.push("| --- | --- |"),t.push(`| Tool calls | ${e.toolCalls.total} |`),t.push(`| Errored | ${e.toolCalls.errored} (${e.toolCalls.erroredNotable} notable) |`),e.toolCalls.refused>0){let o=e.toolCalls.total>0?(e.toolCalls.refused/e.toolCalls.total*100).toFixed(1):"0.0";t.push(`| Refused (denylisted) | ${e.toolCalls.refused} (${o}% of calls) |`)}e.toolCalls.circuitBreakerHits>0&&t.push(`| Circuit-breaker hits | ${e.toolCalls.circuitBreakerHits} |`),e.cost.turnCount!==void 0&&t.push(`| Turns | ${e.cost.turnCount} |`),e.cost.finalCostUsd!==void 0&&t.push(`| Cost (USD) | ${e.cost.finalCostUsd.toFixed(4)} |`),e.subagents.started>0&&t.push(`| Subagents | ${e.subagents.started} started \xB7 ${e.subagents.succeeded} ok \xB7 ${e.subagents.failed} failed \xB7 ${e.subagents.cancelled} cancelled |`),e.closureReason!==void 0&&t.push(`| Closure | ${e.closureReason} |`),t.push("");let r=Object.keys(e.toolCalls.byTool).sort();if(r.length>0){t.push("## Tool calls by name"),t.push(""),t.push("| Tool | Calls | Errored |"),t.push("| --- | --- | --- |");for(let o of r){let i=e.toolCalls.byTool[o];i!==void 0&&t.push(`| ${o} | ${i.total} | ${i.errored} |`)}t.push("")}if(e.failures.length>0){t.push("## Failures"),t.push(""),t.push("| Tool | Class | Duration | When | Exempt |"),t.push("| --- | --- | --- | --- | --- |");for(let o of e.failures)t.push(`| ${o.name} | ${o.failureClass??"unclassified"} | ${o.durationMs}ms | ${o.ts} | ${o.exempt?"yes":"no"} |`);t.push("")}else t.push("No tool failures recorded."),t.push("");t.push("## Limitations"),t.push("");for(let o of e.limitations)t.push(`- ${o}`);return t.push(""),t.push("---"),t.push(`_Generated ${e.generatedAt} by the AFK run-receipt writer (read-only; no agent behavior was modified)._`),t.push(""),t.join(`
1444
1444
  `)}async function WX(e){let t;try{t=await MX(e.tracePath,"utf8")}catch{return null}let n=NX(t);if(n.length===0)return null;let r=CS(e.tracePath),o=UX(n,{tracePath:e.tracePath,witnessLabel:r.label,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.reason!==void 0?{endReason:e.reason}:{},...e.now!==void 0?{now:e.now}:{}});return await PX(Oh(),{recursive:!0}),await b0(r.jsonPath,JSON.stringify(o,null,2)+`
1445
1445
  `,"utf8"),await b0(r.mdPath,HX(o),"utf8"),r}var S0=async e=>{if(e.event!=="SessionEnd")return{};if(e.parentSessionId!==void 0)return{};if(k.AFK_RUN_RECEIPT_DISABLED==="1")return{};if(e.tracePath===void 0)return{};try{await WX({tracePath:e.tracePath,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.reason!==void 0?{reason:e.reason}:{}})}catch{}return{}};q();mr();qr();G();import{existsSync as KX,mkdirSync as GX,readFileSync as qX,renameSync as zX,writeFileSync as JX}from"fs";import{dirname as VX,isAbsolute as YX}from"path";import{randomUUID as XX}from"node:crypto";var AS={version:1,grants:[]},v0="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ZX(e=Date.now()){let t=e,n=new Array(10).fill("0");for(let o=9;o>=0;o--)n[o]=v0[t%32],t=Math.floor(t/32);let r=new Array(16).fill("0");for(let o=0;o<16;o++)r[o]=v0[Math.floor(Math.random()*32)];return n.join("")+r.join("")}function E0(e=ol()){if(!KX(e))return AS;try{let t=qX(e,"utf8"),n=JSON.parse(t);return typeof n!="object"||n===null||!("version"in n)||n.version!==1||!("grants"in n)||!Array.isArray(n.grants)?AS:{version:1,grants:n.grants.filter(QX)}}catch(t){return console.warn(`[permissions] could not parse ${e} \u2014 treating as empty (persisted grants reset): `+(t instanceof Error?t.message:String(t))),AS}}function QX(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.id=="string"&&typeof t.path=="string"&&YX(t.path)&&(t.mode==="read"||t.mode==="write")&&(t.decision==="allow"||t.decision==="deny")&&typeof t.grantedAt=="string"&&(t.source==="elicit:repl"||t.source==="elicit:telegram"||t.source==="elicit:unknown"||t.source==="manual")}function T0(e,t=ol()){let n=E0(t),r={id:ZX(),grantedAt:e.grantedAt??new Date().toISOString(),path:e.path,mode:e.mode,decision:e.decision,source:e.source,...e.reason!==void 0?{reason:e.reason}:{},...e.expiresAt!==void 0?{expiresAt:e.expiresAt}:{}},o={version:1,grants:[...n.grants,r]};return e6(t,o),r}function k0(e,t=ol()){let n=E0(t),r=Date.now();return n.grants.filter(o=>o.decision==="allow").filter(o=>o.mode===e||e==="read"&&o.mode==="write").filter(o=>{if(o.expiresAt===void 0)return!0;let i=Date.parse(o.expiresAt);return Number.isFinite(i)?i>r:!0}).map(o=>o.path)}function x0(e,t=ol()){for(let n of k0("read",t))e.addReadRoot(n,"tool");for(let n of k0("write",t))e.addWriteRoot(n,"tool")}function e6(e,t){GX(VX(e),{recursive:!0});let n=`${e}.tmp-${process.pid}-${XX()}`;JX(n,JSON.stringify(t,null,2)+`
1446
- `,{encoding:"utf8",mode:384}),zX(n,e)}var R0=new Set(["read_file","write_file","edit_file","list_directory","glob","grep"]),C0=new Set(["write_file","edit_file"]);function _S(e,t){return`${e}:${t}`}function A0(e){let t={sessionApproved:new Set,onceApproved:new Map,inFlight:new Map};return{preToolUse:async(i,s)=>t6(e,t,i,s),postToolUse:i=>n6(e,t,i),sessionEnd:i=>r6(e,t,i)}}async function t6(e,t,n,r){if(n.event!=="PreToolUse")return{};if(!R0.has(n.toolName))return{};let o=n.input;if(!o)return{};let i=_0(n.toolName,o);if(i===void 0)return{};let s=C0.has(n.toolName)?"write":"read",a=e.getGrantManager();if(!a)return{};let l=a.getGrants(),c=e.getCwd(),d=ob(i,{cwd:c,resolveBase:l.resolveBase??c,readRoots:l.readRoots,writeRoots:l.writeRoots,...l.allowAll===!0?{allowAll:!0}:{}},s);if(!d.restricted)return{};if(n.parentSessionId!==void 0){console.error(`[path-approval] surface=${e.surface} tool=${n.toolName} path=${d.resolved} outcome=subagent-autodeny`);let g=s==="write"?`Writes are confined to this fork's granted write roots by design (worktree isolation). To allow it, the parent must re-dispatch you via the \`agent\` tool with \`writeRoots: [${JSON.stringify(d.resolved)}]\`, or perform the write itself. Return this exact path requirement to your parent.`:"Reads are confined to this fork's granted read roots. Return this exact path requirement to your parent, which owns the operator surface and can grant access (widen readRoots or re-dispatch with the path inside cwd).";return{decision:"block",reason:`Sub-agent path access denied: ${d.resolved} is outside the session's granted ${s} roots. ${g}`}}let u=_S(s,d.resolved);if(t.sessionApproved.has(u))return{};let m=t.inFlight.get(u);if(m)return m;let p=o6({toolName:n.toolName,resolvedPath:d.resolved,capturedCwd:c,mode:s,grantManager:a,state:t,surface:e.surface,...r!==void 0?{signal:r}:{}});t.inFlight.set(u,p);try{return await p}finally{t.inFlight.delete(u)}}function n6(e,t,n){if(n.event!=="PostToolUse")return{};if(!R0.has(n.toolName))return{};let r=n.input;if(!r)return{};let o=_0(n.toolName,r);if(o===void 0)return{};let i=C0.has(n.toolName)?"write":"read",s=e.getGrantManager();if(!s)return{};let a=s.getGrants(),l,c;for(let[d,u]of t.onceApproved){if(u.mode!==i)continue;let{resolved:m}=ob(o,{cwd:u.capturedCwd,resolveBase:a.resolveBase??u.capturedCwd,readRoots:a.readRoots,writeRoots:a.writeRoots},i);if(_S(i,m)===d){l=u,c=d;break}}return!l||c===void 0?{}:(s.revokeRoot(l.resolvedPath,"tool"),t.onceApproved.delete(c),{})}function r6(e,t,n){if(n.event!=="SessionEnd")return{};let r=e.getGrantManager();if(r)for(let{resolvedPath:o}of t.onceApproved.values())r.revokeRoot(o,"tool");return t.onceApproved.clear(),{}}function _0(e,t){if(e==="read_file"||e==="write_file"||e==="edit_file"){let n=t.file_path;return typeof n=="string"?n:void 0}if(e==="list_directory"){let n=t.path;return typeof n=="string"?n:void 0}if(e==="glob"||e==="grep"){let n=t.path;return typeof n=="string"?n:void 0}}async function o6(e){let{toolName:t,resolvedPath:n,capturedCwd:r,mode:o,grantManager:i,state:s,surface:a,signal:l}=e,c=bs(n),d=c!==n?`
1446
+ `,{encoding:"utf8",mode:384}),zX(n,e)}var R0=new Set(["read_file","write_file","edit_file","list_directory","glob","grep"]),C0=new Set(["write_file","edit_file"]);function _S(e,t){return`${e}:${t}`}function A0(e){let t={sessionApproved:new Set,onceApproved:new Map,inFlight:new Map};return{preToolUse:async(i,s)=>t6(e,t,i,s),postToolUse:i=>n6(e,t,i),sessionEnd:i=>r6(e,t,i)}}async function t6(e,t,n,r){if(n.event!=="PreToolUse")return{};if(!R0.has(n.toolName))return{};let o=n.input;if(!o)return{};let i=_0(n.toolName,o);if(i===void 0)return{};let s=C0.has(n.toolName)?"write":"read",a=n.grantManager??e.getGrantManager();if(!a)return{};let l=a.getGrants(),c=e.getCwd(),d=ob(i,{cwd:c,resolveBase:l.resolveBase??c,readRoots:l.readRoots,writeRoots:l.writeRoots,...l.allowAll===!0?{allowAll:!0}:{}},s);if(!d.restricted)return{};if(n.parentSessionId!==void 0){console.error(`[path-approval] surface=${e.surface} tool=${n.toolName} path=${d.resolved} outcome=subagent-autodeny`);let g=s==="write"?`Writes are confined to this fork's granted write roots by design (worktree isolation). To allow it, the parent must re-dispatch you via the \`agent\` tool with \`writeRoots: [${JSON.stringify(d.resolved)}]\`, or perform the write itself. Return this exact path requirement to your parent.`:"Reads are confined to this fork's granted read roots. Return this exact path requirement to your parent, which owns the operator surface and can grant access (widen readRoots or re-dispatch with the path inside cwd).";return{decision:"block",reason:`Sub-agent path access denied: ${d.resolved} is outside the session's granted ${s} roots. ${g}`}}let u=_S(s,d.resolved);if(t.sessionApproved.has(u))return{};let m=t.inFlight.get(u);if(m)return m;let p=o6({toolName:n.toolName,resolvedPath:d.resolved,capturedCwd:c,mode:s,grantManager:a,state:t,surface:e.surface,...r!==void 0?{signal:r}:{}});t.inFlight.set(u,p);try{return await p}finally{t.inFlight.delete(u)}}function n6(e,t,n){if(n.event!=="PostToolUse")return{};if(!R0.has(n.toolName))return{};let r=n.input;if(!r)return{};let o=_0(n.toolName,r);if(o===void 0)return{};let i=C0.has(n.toolName)?"write":"read",s=n.grantManager??e.getGrantManager();if(!s)return{};let a=s.getGrants(),l,c;for(let[d,u]of t.onceApproved){if(u.mode!==i)continue;let{resolved:m}=ob(o,{cwd:u.capturedCwd,resolveBase:a.resolveBase??u.capturedCwd,readRoots:a.readRoots,writeRoots:a.writeRoots},i);if(_S(i,m)===d){l=u,c=d;break}}return!l||c===void 0?{}:(s.revokeRoot(l.resolvedPath,"tool"),t.onceApproved.delete(c),{})}function r6(e,t,n){if(n.event!=="SessionEnd")return{};let r=e.getGrantManager();if(r)for(let{resolvedPath:o}of t.onceApproved.values())r.revokeRoot(o,"tool");return t.onceApproved.clear(),{}}function _0(e,t){if(e==="read_file"||e==="write_file"||e==="edit_file"){let n=t.file_path;return typeof n=="string"?n:void 0}if(e==="list_directory"){let n=t.path;return typeof n=="string"?n:void 0}if(e==="glob"||e==="grep"){let n=t.path;return typeof n=="string"?n:void 0}}async function o6(e){let{toolName:t,resolvedPath:n,capturedCwd:r,mode:o,grantManager:i,state:s,surface:a,signal:l}=e,c=bs(n),d=c!==n?`
1447
1447
  (resolves to: ${c})`:"",u=`Tool \`${t}\` wants to ${o==="write"?"WRITE to":"read"} a path outside this session's granted roots:
1448
1448
 
1449
1449
  ${n}${d}
1450
1450
 
1451
- Choose how to handle this and future requests for this path.`,m=await et.route({serverName:"agent-afk",message:u,mode:"form",title:"Path access approval",requestedSchema:{type:"object",properties:{choice:{type:"string",title:"Choose one",enum:["once","session","persist","deny"],description:"'once' allows this single call only. 'session' allows this path until the session ends. 'persist' writes a grant to ~/.afk/config/permissions.json so future sessions inherit it. 'deny' blocks this call and returns an error to the model."}},required:["choice"]}},{signal:l??new AbortController().signal});if(m.action!=="accept"){let h=m.action==="cancel"?"cancel":"block";return console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=${h}`),{decision:"block",reason:m.action==="cancel"?`User cancelled the access prompt for ${n}`:`User denied access to ${n}`}}let p=String(m.content?.choice??"").toLowerCase(),g=_S(o,n);switch(p){case"once":return o==="write"?i.addWriteRoot(n,"tool"):i.addReadRoot(n,"tool"),s.onceApproved.set(g,{resolvedPath:n,mode:o,capturedCwd:r}),console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=once`),{};case"session":return o==="write"?i.addWriteRoot(n,"tool"):i.addReadRoot(n,"tool"),s.sessionApproved.add(g),console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=session`),{};case"persist":o==="write"?i.addWriteRoot(n,"tool"):i.addReadRoot(n,"tool"),s.sessionApproved.add(g),console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=persist`);try{T0({path:n,mode:o,decision:"allow",source:a==="telegram"?"elicit:telegram":a==="repl"?"elicit:repl":"elicit:unknown",reason:`Approved via ${a} prompt for ${t}`})}catch(h){console.error(`path-approval: failed to persist grant for ${n}:`,h instanceof Error?h.message:String(h))}return{};default:return console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=deny`),{decision:"block",reason:`User denied access to ${n}`}}}import{homedir as I0}from"os";import go from"path";var i6=/\b(python|python3|node|ruby|perl|osascript|sh|bash|zsh|fish|lua)\s+-[cCeE](\s|$)/,s6=/\.ssh\b|\bid_rsa\b|\bid_ed25519\b|\.gnupg\b|\.aws\b|\.config\/gh\b|\.netrc\b|\.password-store\b|Library\/Application Support\b|\/etc\/shadow\b|\/etc\/sudoers\b/i;function P0(e){return t=>{if(t.event!=="PreToolUse")return{};if(t.toolName!=="bash")return{};let n=t.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=e.getGrantManager(),i=o!==void 0,s=I0(),a=a6(r,s),l=o?c6(o.getGrants()):[];if(!e.disableInterpreterGuard&&(i||e.forceInterpreterGuard===!0)&&i6.test(r)&&l6(a,r,l))return{decision:"block",reason:"Interpreter one-liner (python -c, node -e, sh -c, ...) referencing a sensitive path (SSH keys, cloud credentials, GPG, /etc/shadow, ...) is blocked by the path-approval policy \u2014 an interpreter can assemble a path the shell-substring check cannot see. Use the typed file tools (read_file, write_file, edit_file), which support per-call user approval, or ask the user to run the script themselves. To lift this block \u2014 e.g. headless automation that legitimately reads such paths \u2014 set AFK_DISABLE_BASH_INTERPRETER_GUARD=1, or disable all of path-approval with AFK_DISABLE_PATH_APPROVAL=1."};if(!o)return{};if(l.length===0)return{};for(let d of l)if(a.includes(d))return{decision:"block",reason:`Bash command references a restricted path (${d}). For sensitive paths, use read_file / write_file / edit_file \u2014 those tools support per-call user approval via an inline prompt. If you genuinely need a shell command for this path, ask the user to grant it via \`/allow-dir <path>\` first.`};return{}}}function a6(e,t){return e.replace(/\$HOME/g,t).replace(/(^|[\s/=:])~(?=$|[/\s])/g,`$1${t}`)}function l6(e,t,n){return n.some(r=>e.includes(r))?!0:s6.test(t)}function c6(e){let t=I0(),n=[go.join(t,".ssh"),go.join(t,".gnupg"),go.join(t,".aws"),go.join(t,".config","gh"),go.join(t,".netrc"),go.join(t,"Library","Application Support"),go.join(t,".password-store"),"/etc/shadow","/etc/sudoers","/private/etc/sudoers"],r=new Set([...e.resolveBase!==void 0?[e.resolveBase]:[],...e.readRoots,...e.writeRoots]);return n.filter(o=>{for(let i of r){let s=go.relative(i,o);if(s===""||!s.startsWith(".."))return!1}return!0})}G();wl();import{existsSync as $0,readFileSync as d6}from"node:fs";import{join as M0}from"node:path";var u6=3e4;function D0(e){if(e===void 0||e==="*")return()=>!0;let t=/^\/(.+)\/([gimsuy]*)$/.exec(e);if(t!==null){let n=t[1],r=t[2];try{let o=r.replace(/[gy]/g,""),i=new RegExp(n,o);return s=>i.test(s)}catch{}}return n=>n===e}function p6(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let t=e;if(t.type!=="command"||typeof t.command!="string"||t.command.length===0)return null;let n=typeof t.timeout_ms=="number"&&t.timeout_ms>0?t.timeout_ms:u6,r=Math.min(n,Ho);return{type:"command",command:t.command,timeoutMs:r}}function O0(e,t){let n=[],r=[],o={};if(!$0(e))return{hooks:o,enableShellHooks:!1,allowProjectHooks:!1,sources:r,warnings:n};r.push(e);let i;try{i=JSON.parse(d6(e,"utf-8"))}catch(m){let p=m instanceof Error?m.message:String(m);return n.push(`hooks config at ${e}: parse error \u2014 ${p}`),{hooks:o,enableShellHooks:!1,allowProjectHooks:!1,sources:r,warnings:n}}if(i===null||typeof i!="object"||Array.isArray(i))return n.push(`hooks config at ${e}: top-level must be an object`),{hooks:o,enableShellHooks:!1,allowProjectHooks:!1,sources:r,warnings:n};let s=i,a=s.enableShellHooks===!0,l=s.allowProjectHooks===!0,c=s.hooks;if(c==null)return{hooks:o,enableShellHooks:a,allowProjectHooks:l,sources:r,warnings:n};if(typeof c!="object"||Array.isArray(c))return n.push(`hooks config at ${e}: "hooks" must be an object`),{hooks:o,enableShellHooks:a,allowProjectHooks:l,sources:r,warnings:n};let d=c,u=["SessionStart","SessionEnd","SubagentStart","SubagentStop","PreToolUse","PostToolUse","PreCompact","PostToolUseFailure","Stop","UserPromptSubmit"];for(let m of u){let p=d[m];if(p===void 0)continue;if(!Array.isArray(p)){n.push(`hooks config at ${e}: hooks.${m} must be an array`);continue}let g=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===null||typeof y!="object"||Array.isArray(y)){n.push(`hooks config at ${e}: hooks.${m}[${h}] must be an object \u2014 skipping`);continue}let b=y,w=typeof b.matcher=="string"?b.matcher:void 0;if(!Array.isArray(b.hooks)){n.push(`hooks config at ${e}: hooks.${m}[${h}].hooks must be an array \u2014 skipping`);continue}let v=b.hooks,S=[];for(let E=0;E<v.length;E++){let x=p6(v[E]);if(x===null){n.push(`hooks config at ${e}: hooks.${m}[${h}].hooks[${E}] is malformed (must have type="command" and non-empty command) \u2014 skipping`);continue}S.push(x)}S.length>0&&g.push({...w!==void 0?{matcher:w}:{},hooks:S,tier:t})}g.length>0&&(o[m]=g)}return{hooks:o,enableShellHooks:a,allowProjectHooks:l,sources:r,warnings:n}}function ta(e={}){let t=e.cwd??process.cwd(),n=[],r=[],o={},i=!1,s=!1,a=[{path:en(),tier:"user-global"},{path:$h(),tier:"user-global"},{path:M0(t,"afk.config.json"),tier:"project-local"},{path:WE(t),tier:"project-local"}],l=new Set,c=a.filter(u=>l.has(u.path)?!1:(l.add(u.path),!0));try{let u=M0(_e(),"settings.json");!l.has(u)&&$0(u)&&r.push(`found ${u} but AFK does not read settings from the AFK-home root; user-global hooks/settings belong in ${$h()} \u2014 the root file is ignored`)}catch{}for(let u of c){if(u.tier!=="user-global")continue;let m=O0(u.path,u.tier);m.enableShellHooks&&(i=!0),m.allowProjectHooks&&(s=!0)}let d=["SessionStart","SessionEnd","SubagentStart","SubagentStop","PreToolUse","PostToolUse","PreCompact","PostToolUseFailure","Stop","UserPromptSubmit"];for(let u of c){let m=O0(u.path,u.tier);for(let p of m.sources)n.includes(p)||n.push(p);for(let p of m.warnings)r.push(p);if(!(u.tier==="project-local"&&!s))for(let p of d){let g=m.hooks[p];if(g===void 0||g.length===0)continue;let h=o[p];h===void 0?o[p]=[...g]:o[p]=[...h,...g]}}return{hooks:o,userGlobalEnabled:i,allowProjectHooks:s,sources:n,warnings:r}}import{spawn as m6}from"node:child_process";import{homedir as f6}from"node:os";import{StringDecoder as F0}from"node:string_decoder";async function L0(e){let{context:t,agentCwd:n,sessionId:r,timeoutMs:o}=e,i=e.command.replace(/^~\//,f6()+"/"),s={session_id:r,hook_event_name:t.event,cwd:n};(t.event==="PreToolUse"||t.event==="PostToolUse"||t.event==="PostToolUseFailure")&&(s.tool_name=t.toolName),t.event==="PreToolUse"&&(s.tool_input=t.input),t.event==="PostToolUse"&&t.output!==void 0&&(s.tool_output=typeof t.output=="string"?t.output:JSON.stringify(t.output)),t.event==="PostToolUseFailure"&&(s.error=t.error),t.event==="PreCompact"&&(s.trigger=t.trigger??null),t.event==="UserPromptSubmit"&&(s.prompt=t.prompt),s.transcript_path=null;let a=JSON.stringify(s),l=t.event==="PreToolUse"||t.event==="PostToolUse"||t.event==="PostToolUseFailure"?t.toolName:"",c=["PATH","HOME","SHELL","LANG","TERM","TMPDIR","TMP","TEMP","USER","LOGNAME"],d={};for(let m of c){let p=process.env[m];p!==void 0&&(d[m]=p)}let u=/_(KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|CREDENTIALS)$/i;for(let[m,p]of Object.entries(process.env))!m.startsWith("AFK_")||p===void 0||u.test(m)||(d[m]=p);return d.AFK_PROJECT_DIR=n,d.AFK_SESSION_ID=r??"",d.AFK_HOOK_EVENT=t.event,d.AFK_TOOL_NAME=l,new Promise(m=>{let p=!1;function g(A){p||(p=!0,m(A))}let h=m6("sh",["-c",i],{stdio:["pipe","pipe","pipe"],cwd:n,env:d,detached:!0});h.unref();let y=64e3,b="",w="",v=0,S=0,E=new F0("utf8"),x=new F0("utf8");h.stdout.on("data",A=>{if(v>=y)return;let N=y-v,$=A.length<=N?A:A.subarray(0,N);v+=$.length,b+=E.write($)}),h.stderr.on("data",A=>{if(S>=y)return;let N=y-S,$=A.length<=N?A:A.subarray(0,N);S+=$.length,w+=x.write($)});let C=setTimeout(()=>{if(!p){if(h.pid!==void 0)try{process.kill(-h.pid,"SIGKILL")}catch{}console.warn(`[hooks] command timed out after ${o}ms: ${i}`),g({decision:{}})}},o);C.unref(),h.stdin.on("error",()=>{});try{h.stdin.write(a),h.stdin.end()}catch{}h.on("close",A=>{if(!p){if(clearTimeout(C),b+=E.end(),w+=x.end(),A===0){let N=g6(b);g({decision:N});return}if(A===2){let N=w.trim().slice(0,500)||"hook blocked operation";g({decision:{decision:"block",reason:N}});return}console.warn(`[hooks] command exited with code ${String(A)}: ${i}${w.trim()?`
1451
+ Choose how to handle this and future requests for this path.`,m=await et.route({serverName:"agent-afk",message:u,mode:"form",title:"Path access approval",requestedSchema:{type:"object",properties:{choice:{type:"string",title:"Choose one",enum:["once","session","persist","deny"],description:"'once' allows this single call only. 'session' allows this path until the session ends. 'persist' writes a grant to ~/.afk/config/permissions.json so future sessions inherit it. 'deny' blocks this call and returns an error to the model."}},required:["choice"]}},{signal:l??new AbortController().signal});if(m.action!=="accept"){let h=m.action==="cancel"?"cancel":"block";return console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=${h}`),{decision:"block",reason:m.action==="cancel"?`User cancelled the access prompt for ${n}`:`User denied access to ${n}`}}let p=String(m.content?.choice??"").toLowerCase(),g=_S(o,n);switch(p){case"once":return o==="write"?i.addWriteRoot(n,"tool"):i.addReadRoot(n,"tool"),s.onceApproved.set(g,{resolvedPath:n,mode:o,capturedCwd:r}),console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=once`),{};case"session":return o==="write"?i.addWriteRoot(n,"tool"):i.addReadRoot(n,"tool"),s.sessionApproved.add(g),console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=session`),{};case"persist":o==="write"?i.addWriteRoot(n,"tool"):i.addReadRoot(n,"tool"),s.sessionApproved.add(g),console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=persist`);try{T0({path:n,mode:o,decision:"allow",source:a==="telegram"?"elicit:telegram":a==="repl"?"elicit:repl":"elicit:unknown",reason:`Approved via ${a} prompt for ${t}`})}catch(h){console.error(`path-approval: failed to persist grant for ${n}:`,h instanceof Error?h.message:String(h))}return{};default:return console.error(`[path-approval] surface=${a} tool=${t} path=${n} outcome=deny`),{decision:"block",reason:`User denied access to ${n}`}}}import{homedir as I0}from"os";import go from"path";var i6=/\b(python|python3|node|ruby|perl|osascript|sh|bash|zsh|fish|lua)\s+-[cCeE](\s|$)/,s6=/\.ssh\b|\bid_rsa\b|\bid_ed25519\b|\.gnupg\b|\.aws\b|\.config\/gh\b|\.netrc\b|\.password-store\b|Library\/Application Support\b|\/etc\/shadow\b|\/etc\/sudoers\b/i;function P0(e){return t=>{if(t.event!=="PreToolUse")return{};if(t.toolName!=="bash")return{};let n=t.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=t.grantManager??e.getGrantManager(),i=o!==void 0,s=I0(),a=a6(r,s),l=o?c6(o.getGrants()):[];if(!e.disableInterpreterGuard&&(i||e.forceInterpreterGuard===!0)&&i6.test(r)&&l6(a,r,l))return{decision:"block",reason:"Interpreter one-liner (python -c, node -e, sh -c, ...) referencing a sensitive path (SSH keys, cloud credentials, GPG, /etc/shadow, ...) is blocked by the path-approval policy \u2014 an interpreter can assemble a path the shell-substring check cannot see. Use the typed file tools (read_file, write_file, edit_file), which support per-call user approval, or ask the user to run the script themselves. To lift this block \u2014 e.g. headless automation that legitimately reads such paths \u2014 set AFK_DISABLE_BASH_INTERPRETER_GUARD=1, or disable all of path-approval with AFK_DISABLE_PATH_APPROVAL=1."};if(!o)return{};if(l.length===0)return{};for(let d of l)if(a.includes(d))return{decision:"block",reason:`Bash command references a restricted path (${d}). For sensitive paths, use read_file / write_file / edit_file \u2014 those tools support per-call user approval via an inline prompt. If you genuinely need a shell command for this path, ask the user to grant it via \`/allow-dir <path>\` first.`};return{}}}function a6(e,t){return e.replace(/\$HOME/g,t).replace(/(^|[\s/=:])~(?=$|[/\s])/g,`$1${t}`)}function l6(e,t,n){return n.some(r=>e.includes(r))?!0:s6.test(t)}function c6(e){let t=I0(),n=[go.join(t,".ssh"),go.join(t,".gnupg"),go.join(t,".aws"),go.join(t,".config","gh"),go.join(t,".netrc"),go.join(t,"Library","Application Support"),go.join(t,".password-store"),"/etc/shadow","/etc/sudoers","/private/etc/sudoers"],r=new Set([...e.resolveBase!==void 0?[e.resolveBase]:[],...e.readRoots,...e.writeRoots]);return n.filter(o=>{for(let i of r){let s=go.relative(i,o);if(s===""||!s.startsWith(".."))return!1}return!0})}G();wl();import{existsSync as $0,readFileSync as d6}from"node:fs";import{join as M0}from"node:path";var u6=3e4;function D0(e){if(e===void 0||e==="*")return()=>!0;let t=/^\/(.+)\/([gimsuy]*)$/.exec(e);if(t!==null){let n=t[1],r=t[2];try{let o=r.replace(/[gy]/g,""),i=new RegExp(n,o);return s=>i.test(s)}catch{}}return n=>n===e}function p6(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let t=e;if(t.type!=="command"||typeof t.command!="string"||t.command.length===0)return null;let n=typeof t.timeout_ms=="number"&&t.timeout_ms>0?t.timeout_ms:u6,r=Math.min(n,Ho);return{type:"command",command:t.command,timeoutMs:r}}function O0(e,t){let n=[],r=[],o={};if(!$0(e))return{hooks:o,enableShellHooks:!1,allowProjectHooks:!1,sources:r,warnings:n};r.push(e);let i;try{i=JSON.parse(d6(e,"utf-8"))}catch(m){let p=m instanceof Error?m.message:String(m);return n.push(`hooks config at ${e}: parse error \u2014 ${p}`),{hooks:o,enableShellHooks:!1,allowProjectHooks:!1,sources:r,warnings:n}}if(i===null||typeof i!="object"||Array.isArray(i))return n.push(`hooks config at ${e}: top-level must be an object`),{hooks:o,enableShellHooks:!1,allowProjectHooks:!1,sources:r,warnings:n};let s=i,a=s.enableShellHooks===!0,l=s.allowProjectHooks===!0,c=s.hooks;if(c==null)return{hooks:o,enableShellHooks:a,allowProjectHooks:l,sources:r,warnings:n};if(typeof c!="object"||Array.isArray(c))return n.push(`hooks config at ${e}: "hooks" must be an object`),{hooks:o,enableShellHooks:a,allowProjectHooks:l,sources:r,warnings:n};let d=c,u=["SessionStart","SessionEnd","SubagentStart","SubagentStop","PreToolUse","PostToolUse","PreCompact","PostToolUseFailure","Stop","UserPromptSubmit"];for(let m of u){let p=d[m];if(p===void 0)continue;if(!Array.isArray(p)){n.push(`hooks config at ${e}: hooks.${m} must be an array`);continue}let g=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===null||typeof y!="object"||Array.isArray(y)){n.push(`hooks config at ${e}: hooks.${m}[${h}] must be an object \u2014 skipping`);continue}let b=y,w=typeof b.matcher=="string"?b.matcher:void 0;if(!Array.isArray(b.hooks)){n.push(`hooks config at ${e}: hooks.${m}[${h}].hooks must be an array \u2014 skipping`);continue}let v=b.hooks,S=[];for(let E=0;E<v.length;E++){let x=p6(v[E]);if(x===null){n.push(`hooks config at ${e}: hooks.${m}[${h}].hooks[${E}] is malformed (must have type="command" and non-empty command) \u2014 skipping`);continue}S.push(x)}S.length>0&&g.push({...w!==void 0?{matcher:w}:{},hooks:S,tier:t})}g.length>0&&(o[m]=g)}return{hooks:o,enableShellHooks:a,allowProjectHooks:l,sources:r,warnings:n}}function ta(e={}){let t=e.cwd??process.cwd(),n=[],r=[],o={},i=!1,s=!1,a=[{path:en(),tier:"user-global"},{path:$h(),tier:"user-global"},{path:M0(t,"afk.config.json"),tier:"project-local"},{path:WE(t),tier:"project-local"}],l=new Set,c=a.filter(u=>l.has(u.path)?!1:(l.add(u.path),!0));try{let u=M0(_e(),"settings.json");!l.has(u)&&$0(u)&&r.push(`found ${u} but AFK does not read settings from the AFK-home root; user-global hooks/settings belong in ${$h()} \u2014 the root file is ignored`)}catch{}for(let u of c){if(u.tier!=="user-global")continue;let m=O0(u.path,u.tier);m.enableShellHooks&&(i=!0),m.allowProjectHooks&&(s=!0)}let d=["SessionStart","SessionEnd","SubagentStart","SubagentStop","PreToolUse","PostToolUse","PreCompact","PostToolUseFailure","Stop","UserPromptSubmit"];for(let u of c){let m=O0(u.path,u.tier);for(let p of m.sources)n.includes(p)||n.push(p);for(let p of m.warnings)r.push(p);if(!(u.tier==="project-local"&&!s))for(let p of d){let g=m.hooks[p];if(g===void 0||g.length===0)continue;let h=o[p];h===void 0?o[p]=[...g]:o[p]=[...h,...g]}}return{hooks:o,userGlobalEnabled:i,allowProjectHooks:s,sources:n,warnings:r}}import{spawn as m6}from"node:child_process";import{homedir as f6}from"node:os";import{StringDecoder as F0}from"node:string_decoder";async function L0(e){let{context:t,agentCwd:n,sessionId:r,timeoutMs:o}=e,i=e.command.replace(/^~\//,f6()+"/"),s={session_id:r,hook_event_name:t.event,cwd:n};(t.event==="PreToolUse"||t.event==="PostToolUse"||t.event==="PostToolUseFailure")&&(s.tool_name=t.toolName),t.event==="PreToolUse"&&(s.tool_input=t.input),t.event==="PostToolUse"&&t.output!==void 0&&(s.tool_output=typeof t.output=="string"?t.output:JSON.stringify(t.output)),t.event==="PostToolUseFailure"&&(s.error=t.error),t.event==="PreCompact"&&(s.trigger=t.trigger??null),t.event==="UserPromptSubmit"&&(s.prompt=t.prompt),s.transcript_path=null;let a=JSON.stringify(s),l=t.event==="PreToolUse"||t.event==="PostToolUse"||t.event==="PostToolUseFailure"?t.toolName:"",c=["PATH","HOME","SHELL","LANG","TERM","TMPDIR","TMP","TEMP","USER","LOGNAME"],d={};for(let m of c){let p=process.env[m];p!==void 0&&(d[m]=p)}let u=/_(KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|CREDENTIALS)$/i;for(let[m,p]of Object.entries(process.env))!m.startsWith("AFK_")||p===void 0||u.test(m)||(d[m]=p);return d.AFK_PROJECT_DIR=n,d.AFK_SESSION_ID=r??"",d.AFK_HOOK_EVENT=t.event,d.AFK_TOOL_NAME=l,new Promise(m=>{let p=!1;function g(A){p||(p=!0,m(A))}let h=m6("sh",["-c",i],{stdio:["pipe","pipe","pipe"],cwd:n,env:d,detached:!0});h.unref();let y=64e3,b="",w="",v=0,S=0,E=new F0("utf8"),x=new F0("utf8");h.stdout.on("data",A=>{if(v>=y)return;let N=y-v,$=A.length<=N?A:A.subarray(0,N);v+=$.length,b+=E.write($)}),h.stderr.on("data",A=>{if(S>=y)return;let N=y-S,$=A.length<=N?A:A.subarray(0,N);S+=$.length,w+=x.write($)});let C=setTimeout(()=>{if(!p){if(h.pid!==void 0)try{process.kill(-h.pid,"SIGKILL")}catch{}console.warn(`[hooks] command timed out after ${o}ms: ${i}`),g({decision:{}})}},o);C.unref(),h.stdin.on("error",()=>{});try{h.stdin.write(a),h.stdin.end()}catch{}h.on("close",A=>{if(!p){if(clearTimeout(C),b+=E.end(),w+=x.end(),A===0){let N=g6(b);g({decision:N});return}if(A===2){let N=w.trim().slice(0,500)||"hook blocked operation";g({decision:{decision:"block",reason:N}});return}console.warn(`[hooks] command exited with code ${String(A)}: ${i}${w.trim()?`
1452
1452
  ${w.trim()}`:""}`),g({decision:{}})}}),h.on("error",A=>{p||(clearTimeout(C),console.warn(`[hooks] command error: ${i} \u2014 ${A.message}`),g({decision:{}}))})})}function g6(e){let t=e.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{return{}}if(n===null||typeof n!="object"||Array.isArray(n))return{};let r=n,o={};r.continue===!1&&(o.continue=!1),r.decision==="block"?o.decision="block":r.decision==="approve"&&(o.decision="approve"),typeof r.reason=="string"&&(o.reason=r.reason);let i=r.hookSpecificOutput;if(i!==null&&typeof i=="object"&&!Array.isArray(i)){let s=i;typeof s.additionalContext=="string"&&(o.injectContext=s.additionalContext)}return o}function N0(e,t,n){if(!t.userGlobalEnabled){let s=[];for(let a of Object.keys(t.hooks)){let l=t.hooks[a];if(l!==void 0)for(let c of l)for(let d of c.hooks)s.push(`${a}: ${d.command}`)}s.length>0&&console.warn(`[hooks] shell hooks are disabled (enableShellHooks not set in user-global config).
1453
1453
  Skipped ${s.length} hook(s):
1454
1454
  `+s.map(a=>` - ${a}`).join(`
@@ -1769,7 +1769,7 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
1769
1769
  ${S}${w}
1770
1770
  ${v}
1771
1771
  ${S}`})}return{fileBlocks:a,warnings:l}}async function VN(e,t,n,r,o="summary",i,s){let a=WD(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,m=!1,p=!1,g,h=!1,y=!1,b={abort:null},w=0,v=3e3,S=[],E=new Map,x=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,C=()=>{let D=r.subagentControl;D?.hasPromotableForeground()&&D.promoteActiveForeground().then(F=>{for(let U of F)(i??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${U.jobId}: ${U.label}`))}).catch(()=>{})},A=r.getCompositor?r.getCompositor():null,N=()=>new Ia({out:Pa(i),thinkingMode:o,...x?{activeSkillName:x}:{},onCancel:()=>{t.interrupt().catch(D=>{We()&&console.error(" "+f.error("session.interrupt() failed:"),D)})},...r.subagentControl?{onBackground:C}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...A?{compositor:A}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),$=N(),I=async()=>{if(!m){m=!0;try{await $.dispose()}catch{}}},_=async()=>{await $.arm();let D=$.getCompositor();if(i&&D){let F=D;i.fn=U=>F.commitAbove(U),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(D),r.setInterruptNotifier?.(F=>$.setInterrupting(F)),r.rearmStatus?.()};try{A?A.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(M=>{We()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{We()&&console.error(" "+f.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{We()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),P)})}),await _(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(C);let{fileBlocks:D,warnings:F}=JN(e.text,{rootDir:process.cwd()});for(let P of F)(i??{fn:console.log}).fn(f.dim(` @-file: ${P}`));let U=D.length>0||e.attachments.length>0?qN(e.text,e.attachments,void 0,D):e.text,H=t.sendMessageStream(U);if(await us((P,M)=>{$.process(P,M)},async()=>{for await(let P of H){if(h||y)break;if(P.type==="chunk"&&P.chunk.type==="content"?(l+=P.chunk.content,d=!0):P.type==="message"&&!d&&(l=P.message.content),P.type==="stream_retry"&&(l=l.slice(0,c)),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let M=P.chunk,O={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};E.set(M.toolUseId,O),S.push(O)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let O=E.get(M.toolUseId);if(O&&(O.result=M.content,O.isError=M.isError,E.delete(M.toolUseId)),r.onContextProgress){let j=Date.now();if(j-w>=v){w=j;try{let X=r.onContextProgress();X instanceof Promise&&await X}catch(X){We()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),X)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await I(),A&&P.autoResume===!0){let M=new AbortController;b.abort=M;let O=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,j=O?`Keep waiting \u2014 auto-resumes at ${O}`:"Keep waiting \u2014 auto-resume in progress",X="Switch model / provider (type /model after)",ee="Stop waiting",te=[f.warning(" \u23F3 Usage limit reached.")+(O?f.dim(` Auto-resumes at ${O}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];$g(A,{header:te,options:[j,X,ee],signal:M.signal,initialIndex:0}).then(ce=>{if(b.abort=null,!ce)return;let K=ce[0];K===void 0||K===j||(y=!0,K===X&&(i??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Se=>{We()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),Se)}))}).catch(ce=>{We()&&console.error(" "+f.error("picker promise rejected:"),ce)})}else(i??{fn:console.log}).fn(mT({reason:P.reason,...P.resetsAt!==void 0?{resetsAt:P.resetsAt}:{},...P.accountId!==void 0?{accountId:P.accountId}:{},...P.autoResume!==void 0?{autoResume:P.autoResume}:{}}));continue}if(P.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,S.length=0,E.clear(),p=!1,g=void 0,u=!1,$=N(),m=!1,await _(),(i??{fn:console.log}).fn(f.success(M));continue}if(P.type==="error"){await I(),zi(Wi(P.error)),u=!0;continue}$.process(P),P.type==="done"&&(p=!0,g=P.metadata)}}),await I(),h){let P=i?i.fn:console.log;P(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(p&&!h&&!y){di(n,a,l,g,S),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),fa(process.stdout);let P=O=>{i?i.fn(O):console.log(O)},M=KN(l);if(M){if(P(GN(M)),P(""),r.onTerminalState)try{r.onTerminalState(M)}catch{}if(n.permissionMode==="autonomous"){let O=M.kind==="done"&&du().verifyDone===!0&&!g$(S);y$(M,void 0,{unverified:O})}}if(sre(g,n,P),r.onAfterTurn){let O=r.onAfterTurn();O instanceof Promise&&await O.catch(()=>{})}}}catch(D){await I(),u||zi(Wi(D))}finally{await I(),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function sre(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ge(e.durationMs)),e.totalCostUsd!==void 0&&r.push(lt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(se(o+i)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let s=GS(t),a=Gt(t.model);if(s>=1){let l=Math.round((s-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${se(l)} tok \u2014 model output may be silently truncated`))}else if(s>.5){let l=s>.8?f.error:f.warning;n(l(` context ${Math.round(s*100)}% used of ${se(a)}`))}n("")}var are=5e3,lre=3,cre="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function dre(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(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function YN(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,p=null,g=[];e.session.current.waitForInitialization().then(async v=>{We()&&(p=Ef(v)),await Zc(e.session.current),We()&&(g=ek())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y=!1,b=!1,w=0;for(m.onInjectable=()=>{w>=lre||!o.isAwaitingInput()||!o.bufferIsEmpty()||(w++,fa(process.stdout),h={text:cre,attachments:[]},o.abortPendingRead())};;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),g.length>0){for(let _ of g)e.replRenderer.writeLine(_);e.replRenderer.writeLine(""),g=[]}let v=u.drainNotifications();for(let{job:_,result:D}of v){let F=D.errorReason===void 0?"\u2713":"\u2717",U=D.errorReason==="abort"?"killed":D.errorReason==="timeout"?"timed out":D.errorReason==="signal-killed"?"killed by signal":`exit ${D.exitCode??0}`,H=Math.max(0,Math.round(D.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${F} [${_.id}] ${U} \xB7 ${H}s \xB7 `)+_.command)}let S=m.drainNotifications();for(let{job:_}of S){let D=_.status==="completed"?"\u2713":_.status==="failed"?"\u2717":"\u2298",F=_.endedAt!==void 0?Math.max(0,Math.round((_.endedAt-_.startedAt)/100)/10):0,U=_.label.length>60?`${_.label.slice(0,60)}\u2026`:_.label;e.replRenderer.writeLine(f.dim(` ${D} [${_.jobId}] subagent ${_.status} \xB7 ${F}s \xB7 `)+U)}let E=l.renderIfChanged(e.stats.sessionId);if(E.length>0){for(let _ of E)e.replRenderer.writeLine(_);e.replRenderer.writeLine("")}let x,C;if(h===void 0){let _=await e.session.current.takePendingPlanExitSeed();_!==void 0&&(e.stats.permissionMode=_.mode,h={text:_.message,attachments:[]})}if(h!==void 0){let _=h;h=void 0;let D=Da(e.stats.permissionMode),F=bi({buffer:_.text,promptText:D,isTTY:!!process.stdout.isTTY,attachmentSummary:va([..._.attachments])});e.replRenderer.writeLine(F),x=_.text.trim(),C=_.attachments}else{let _=await o.readLine({promptFn:()=>Da(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Dg(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});x=_.text.trim(),C=_.attachments}if(!x&&C.length===0)continue;if(x.startsWith("!")){let _=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!_&&(y||(y=!0,e.replRenderer.writeLine(f.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(x))){e.statusLine.rearm();continue}}let A=!1;if(x.startsWith("/")){let _=await s$(x,e.slashCtx,C);if(_.handled){if(_.result==="exit"){e.rl.close();return}if((x==="/clear"||x.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),d.reset()),_.result!==null&&typeof _.result=="object"&&"kind"in _.result&&_.result.kind==="submit"){h={text:_.result.message,attachments:C??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}A=!0}a.push(x),await dre(e,x);let N=x;if(A){let _=KS(x);if(_){let D=_.name.replace(/^\//,"").split(":").pop()??"";if(D&&Yv(D)){let F={skillName:D,rawArgs:_.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},U=e.session.current.sessionId,H=Ri(U),B=Date.now();W(`[afk trace] preflight.start commandName=${D}`);let P=!1,M=await xi(F,{cwd:e.stats.cwd??process.cwd(),artifactDir:H},O=>{We()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${D}) failed: `)+(O instanceof Error?O.message:String(O)))});P=M!==null,W(`[afk trace] preflight.end commandName=${D} durationMs=${Date.now()-B} success=${P}`),N=Zv(M?.manifestBlock,x)}}}let $=u.drainInjections();$.length>0&&(N=$+N);let I=m.drainInjections();if(I.length>0&&(N=I+N),e.hookRegistry)try{let _={event:"UserPromptSubmit",prompt:N,sessionId:e.stats.sessionId},D=await e.hookRegistry.dispatch(_);D.injectContext&&(N=D.injectContext+N)}catch(_){if(_ instanceof me){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(_.reason?f.dim(`: ${qo(_.reason)}`):"")),e.statusLine.rearm();continue}if(_ instanceof Ln){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${_.timeoutMs}ms`)),e.statusLine.rearm();continue}throw _}if(await VN({text:N,attachments:C},e.session.current,e.stats,{setInFlight(_){n.turnInFlight=_},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(_){await t.appendUser(_)},async onTurnComplete(_,D){if(await t.appendTurn(_,D),e.stats.sessionId)try{Xn(e.stats)}catch(F){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(F instanceof Error?F.message:String(F))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:_=>d?.push(_),setActiveCompositor:_=>{n.activeCompositor=_},setInterruptNotifier:_=>{n.notifyInterrupting=_},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:_=>o.setBackgroundHandler(_),setSoftStopHandler:i,setPausedState:_=>o.setPausedState(_),setPauseInterruptHandler:_=>o.setPauseInterruptHandler(_),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(er(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:_=>c.repaint(_)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Da(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,are)}catch(_){if(_ instanceof ut)throw _;_ instanceof Ln?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):_ instanceof me?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${qo(_.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(_))}}}function ure(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 XN(e,t,n,r){let o=await CN(),i=new Og({rl:e.rl,history:o,statusLine:e.statusLine}),s=ure(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await ON(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=WN(e,n),await YN(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.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)}}yl();ws();import{execFile as pre}from"node:child_process";import{dirname as mre,isAbsolute as fre,resolve as gre}from"node:path";import{promisify as hre}from"node:util";var ZN=hre(pre),yre=3e3,bre=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function wre(){let t=(await ZN("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=fre(t)?t:gre(process.cwd(),t);return mre(n)}async function QN(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await wre()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),yre)});try{let o=mn({execFile:ZN,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=>bre.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Xd();yl();import{promises as Sre}from"node:fs";import{dirname as vre,join as nB}from"node:path";import{randomBytes as kre}from"node:crypto";var Ere=["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(`
1772
- `),eB=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,kk=30,Tre=1024,xre=8e3,Rre="haiku";async function Cre(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=Pre(n,Tre),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??xre),s=t.signal?Mre([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await es({token:t.token,model:t.model??Rre,system:Ere,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Are(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=vre(t.worktreePath);return await _re(l,c)}function Are(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(eB.test(t)&&t.length<=kk)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>kk)break;o=s}return eB.test(o)?o:null}async function _re(e,t){if(!await Ire(nB(t,e)))return e;let n=kre(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,kk-5)}-${n}`}async function Ire(e){try{return await Sre.access(e),!0}catch{return!1}}function Pre(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 Mre(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 rB(e){let t,n,r=nB(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Cre(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=`${iu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return tB(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 tB(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 tB(e,t){e&&e.setCwd(t),Ore(t)}function Ore(e){try{process.chdir(e)}catch{}}Jt();jt();G();import{spawn as iB}from"child_process";import{existsSync as sB,mkdirSync as Nre,readFileSync as aB,unlinkSync as oB,writeFileSync as lB}from"fs";import{get as Bre}from"https";import{join as cB}from"path";import{readFileSync as $re}from"fs";import{dirname as Dre,join as Fre}from"path";import{fileURLToPath as Lre}from"url";function ir(){try{return"5.33.0"}catch{}try{let e=Dre(Lre(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse($re(Fre(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}q();var Ure=64*1024,jre=10800*1e3,Hre=800,Wre=3600*1e3,Kre="update-check.json",Gre="pending-update.json";function Ek(){return cB(Cd(),Kre)}function od(){return cB(Cd(),Gre)}function Tk(){let e=Cd();sB(e)||Nre(e,{recursive:!0})}function dB(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 uB(){try{let e=aB(Ek(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function pB(){try{Tk();let e=`
1772
+ `),eB=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,kk=30,Tre=1024,xre=8e3,Rre="haiku";async function Cre(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=Pre(n,Tre),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??xre),s=t.signal?Mre([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await es({token:t.token,model:t.model??Rre,system:Ere,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Are(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=vre(t.worktreePath);return await _re(l,c)}function Are(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(eB.test(t)&&t.length<=kk)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>kk)break;o=s}return eB.test(o)?o:null}async function _re(e,t){if(!await Ire(nB(t,e)))return e;let n=kre(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,kk-5)}-${n}`}async function Ire(e){try{return await Sre.access(e),!0}catch{return!1}}function Pre(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 Mre(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 rB(e){let t,n,r=nB(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Cre(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=`${iu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return tB(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 tB(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 tB(e,t){e&&e.setCwd(t),Ore(t)}function Ore(e){try{process.chdir(e)}catch{}}Jt();jt();G();import{spawn as iB}from"child_process";import{existsSync as sB,mkdirSync as Nre,readFileSync as aB,unlinkSync as oB,writeFileSync as lB}from"fs";import{get as Bre}from"https";import{join as cB}from"path";import{readFileSync as $re}from"fs";import{dirname as Dre,join as Fre}from"path";import{fileURLToPath as Lre}from"url";function ir(){try{return"5.33.1"}catch{}try{let e=Dre(Lre(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse($re(Fre(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}q();var Ure=64*1024,jre=10800*1e3,Hre=800,Wre=3600*1e3,Kre="update-check.json",Gre="pending-update.json";function Ek(){return cB(Cd(),Kre)}function od(){return cB(Cd(),Gre)}function Tk(){let e=Cd();sB(e)||Nre(e,{recursive:!0})}function dB(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 uB(){try{let e=aB(Ek(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function pB(){try{Tk();let e=`
1773
1773
  const https = require('https');
1774
1774
  const fs = require('fs');
1775
1775
  const url = 'https://registry.npmjs.org/agent-afk/latest';