agent-afk 4.27.0 → 4.27.2
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 +9 -9
- package/dist/index.mjs +4 -4
- package/dist/telegram.mjs +6 -6
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -989,7 +989,7 @@ ${wf}
|
|
|
989
989
|
`,"utf-8")}catch(r){V("WAL append failed (non-fatal):",String(r))}}};_B=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;IB=new Set(["fact","session_start","session_end","supersede"]),PB=new Set(["preference","convention","decision","learning"])});function oa(e,t,n){let r=async i=>{try{let a=OB(i),l=e.search(a.query,{category:a.category,since:a.since,limit:a.limit??10});return{content:JSON.stringify(l)}}catch(a){return{content:`memory_search error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}},o=async i=>{try{let a=$B(i);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>=dv*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=e.storeFact({session_id:t,category:a.category,content:a.content,source_surface:n??"cli"});return{content:JSON.stringify({id:l,action:"set",target:"fact"})}}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.supersedeFact(a.supersedes,a.content,a.category??void 0);return{content:JSON.stringify({id:l,action:"supersede",target:"fact",supersedes:a.supersedes})}}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}}},s=async i=>{try{let a=DB(i);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",s]])}function OB(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 $B(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 s=["preference","convention","decision","learning"];if(!s.includes(t.category))throw new Error(`category must be one of: ${s.join(", ")}`);o.category=t.category}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 DB(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 vs,mv,fv,gr,jn,Sf=C(()=>{"use strict";_c();vs={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"]}},mv={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"},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"]}},fv={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=[vs,mv,fv],jn=gr.map(e=>e.name)});function vf(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 kf(e){return e==="self"||e==="tools"||e==="subagents"||e==="workspace"||e==="all"?e:"all"}function ks(e){let n=[`- Working directory: ${e.cwd.replace(/[\r\n]/g," ")}`],r=typeof e.sessionId=="string"&&e.sessionId.length>0?e.sessionId.slice(0,8):null,o=e.surface&&e.surface!=="unknown"?e.surface:null,s=typeof e.depth=="number"?typeof e.maxDepth=="number"?`depth ${e.depth}/${e.maxDepth}`:`depth ${e.depth}`:null,i=[o,s].filter(a=>typeof a=="string");if(r!==null||i.length>0){let a=["- Session:"];r!==null&&a.push(r),i.length>0&&a.push(`(${i.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}`:"",u;a.dirty===null?u="":a.dirty?u=` (${a.dirtyCount!==null?a.dirtyCount:"?"} dirty)`:u=" (clean)",n.push(`- Workspace: ${l}${c}${u}`)}}return`# Environment
|
|
990
990
|
${n.join(`
|
|
991
991
|
`)}`}var Ef=C(()=>{"use strict"});import{spawnSync as LB}from"child_process";function Ic(e,t){try{let n=LB("git",t,{cwd:e,encoding:"utf8",maxBuffer:4096,shell:!1});if(n.status!==0||n.signal!==null||n.error!==void 0)return null;let r=typeof n.stdout=="string"?n.stdout.trim():null;return r!==null&&r.length>0?r:null}catch{return null}}function xf(e){let t=Ic(e,["rev-parse","--short","HEAD"]);if(t===null)return{...FB};let n=Ic(e,["symbolic-ref","--short","HEAD"]),r=Ic(e,["status","--porcelain"]),o=!1,s=0;if(r!==null){let a=r.split(`
|
|
992
|
-
`).filter(l=>l.trim().length>0);o=a.length>0,s=a.length}r===null&&(o=null,s=null);let i=Ic(e,["remote","get-url","origin"]);return{branch:n,headSha:t,dirty:o,dirtyCount:s,remoteUrl:i}}var FB,Tf=C(()=>{"use strict";FB={branch:null,headSha:null,dirty:null,dirtyCount:null,remoteUrl:null}});function sa(e){return{getSelf(){return{sessionId:e.sessionId??null,surface:BB(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:NB(e.permissionMode)}},getTools(){return{enabled:e.getEnabledToolNames(),mcpServers:jB(e.getMcpTools())}},getSubagents(){return e.getSubagents()},getWorkspace(){return xf(e.cwd)}}}function NB(e){switch(e){case"bypassPermissions":case"acceptEdits":case"dontAsk":case"auto":return"elevated";default:return"default"}}function BB(e){switch(e){case"cli":case"repl":case"daemon":case"telegram":case"subagent":return e;default:return"unknown"}}function jB(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 gv=C(()=>{"use strict";Tf()});function Es(e){return async(t,n)=>{let r=t&&typeof t=="object"?kf(t.view):"all",o=vf(e,r);return{content:JSON.stringify(o)}}}function ia(e,t){let n=Es(t),r=e,o=Array.isArray(r.toolDefs)?r.toolDefs:null,s={async execute(i){return i.name==="get_runtime_state"?n(i.input,i.signal):e.execute(i)}};if(o!==null){let i=o.some(a=>a.name==="get_runtime_state");s.toolDefs=i?o:[...o,un]}return s}var un,rt,Rf=C(()=>{"use strict";Ef();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:[]}},rt=[un.name]});import{mkdir as UB,writeFile as Af,unlink as hse,readdir as HB,readFile as Cf}from"fs/promises";import{unlinkSync as KB,existsSync as WB}from"fs";import{join as hv}from"path";function Pc(e){return hv(Kl(),`${e}.json`)}async function GB(){try{return await UB(Kl(),{recursive:!0}),!0}catch{return!1}}async function aa(e){try{if(!await GB())return;let n=Pc(e.sessionId);await Af(n,JSON.stringify(e,null,2),"utf8")}catch{}}async function _f(e,t){try{let n=Pc(e),r=await Cf(n,"utf8"),o=JSON.parse(r);o.afk=t,await Af(n,JSON.stringify(o,null,2),"utf8")}catch{}}async function yv(e,t){try{let n=Pc(e),r=await Cf(n,"utf8"),o=JSON.parse(r);o.cwd=t,await Af(n,JSON.stringify(o,null,2),"utf8")}catch{}}function Un(e){try{let t=Pc(e);WB(t)&&KB(t)}catch{}}async function If(){let e=Kl(),t;try{t=await HB(e)}catch{return[]}let n=[];for(let r of t){if(!r.endsWith(".json"))continue;let o=hv(e,r);try{let s=await Cf(o,"utf8"),i=JSON.parse(s);i!==null&&typeof i=="object"&&"sessionId"in i&&typeof i.sessionId=="string"&&n.push({...i,path:o})}catch{}}return n}var la=C(()=>{"use strict";W()});var dn=C(()=>{"use strict";Ef();gv();Rf();Tf();la()});import Pf from"path";import{appendFileSync as qB,mkdirSync as zB}from"fs";import{dirname as JB}from"path";import{createHash as VB}from"node:crypto";function XB(e){return YB.has(e)}function QB(e){let t;try{t=JSON.stringify(e.input)??"null"}catch{t=String(e.input)}return VB("sha256").update(e.name).update("\0").update(t).digest("hex")}function ej(e,t){return e.reduce((n,r,o)=>{let s=t(r.name,r.input),i=n[n.length-1];return i&&s&&i.isConcurrencySafe?i.indices.push(o):n.push({isConcurrencySafe:s,indices:[o]}),n},[])}var YB,Mf,ZB,Xt,Mc=C(()=>{"use strict";Mt();yc();vc();bf();W();cn();Sf();dn();YB=new Set([...Bn,ao,lo,co,...gr,un].filter(e=>e.concurrencySafe===!0).map(e=>e.name));Mf=8,ZB=new Set;Xt=class{handlers;schemas;hookRegistry;permissions;subagentExecutor;skillExecutor;composeExecutor;classifier;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;traceWriter;readOnlyBash;repeatBreaker=null;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.composeExecutor=t.composeExecutor,this.classifier=t.concurrencyClassifier??XB,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()}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}:{}}}addReadRoot(t,n="slash"){let r=Pf.resolve(t);this._readRoots.includes(r)||this._readRoots.push(r),this.appendAuditLog({action:"grant-read",path:r,source:n})}addWriteRoot(t,n="slash"){let r=Pf.resolve(t);this._readRoots.includes(r)||this._readRoots.push(r),this._writeRoots.includes(r)||this._writeRoots.push(r),this.appendAuditLog({action:"grant-write",path:r,source:n})}revokeRoot(t,n="slash"){let r=Pf.resolve(t);if(r===this.resolveBase)return;let o=this._readRoots.indexOf(r);o!==-1&&this._readRoots.splice(o,1);let s=this._writeRoots.indexOf(r);s!==-1&&this._writeRoots.splice(s,1),this.appendAuditLog({action:"revoke",path:r,source:n})}getGrants(){return{resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),allowAll:this._allowAll}}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)}}appendAuditLog(t){try{let n=ss();zB(JB(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:this.sessionId??null,action:t.action,path:t.path,source:t.source});qB(n,r+`
|
|
992
|
+
`).filter(l=>l.trim().length>0);o=a.length>0,s=a.length}r===null&&(o=null,s=null);let i=Ic(e,["remote","get-url","origin"]);return{branch:n,headSha:t,dirty:o,dirtyCount:s,remoteUrl:i}}var FB,Tf=C(()=>{"use strict";FB={branch:null,headSha:null,dirty:null,dirtyCount:null,remoteUrl:null}});function sa(e){return{getSelf(){return{sessionId:e.sessionId??null,surface:BB(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:NB(e.permissionMode)}},getTools(){return{enabled:e.getEnabledToolNames(),mcpServers:jB(e.getMcpTools())}},getSubagents(){return e.getSubagents()},getWorkspace(){return xf(e.cwd)}}}function NB(e){switch(e){case"bypassPermissions":case"acceptEdits":case"dontAsk":case"auto":return"elevated";default:return"default"}}function BB(e){switch(e){case"cli":case"repl":case"daemon":case"telegram":case"subagent":return e;default:return"unknown"}}function jB(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 gv=C(()=>{"use strict";Tf()});function Es(e){return async(t,n)=>{let r=t&&typeof t=="object"?kf(t.view):"all",o=vf(e,r);return{content:JSON.stringify(o)}}}function ia(e,t){let n=Es(t),r=e,o=Array.isArray(r.toolDefs)?r.toolDefs:null,s={async execute(i){return i.name==="get_runtime_state"?n(i.input,i.signal):e.execute(i)}};if(o!==null){let i=o.some(a=>a.name==="get_runtime_state");s.toolDefs=i?o:[...o,un]}return s}var un,rt,Rf=C(()=>{"use strict";Ef();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:[]}},rt=[un.name]});import{mkdir as UB,writeFile as Af,unlink as hse,readdir as HB,readFile as Cf}from"fs/promises";import{unlinkSync as KB,existsSync as WB}from"fs";import{join as hv}from"path";function Pc(e){return hv(Kl(),`${e}.json`)}async function GB(){try{return await UB(Kl(),{recursive:!0}),!0}catch{return!1}}async function aa(e){try{if(!await GB())return;let n=Pc(e.sessionId);await Af(n,JSON.stringify(e,null,2),"utf8")}catch{}}async function _f(e,t){try{let n=Pc(e),r=await Cf(n,"utf8"),o=JSON.parse(r);o.afk=t,await Af(n,JSON.stringify(o,null,2),"utf8")}catch{}}async function yv(e,t){try{let n=Pc(e),r=await Cf(n,"utf8"),o=JSON.parse(r);o.cwd=t,await Af(n,JSON.stringify(o,null,2),"utf8")}catch{}}function Un(e){try{let t=Pc(e);WB(t)&&KB(t)}catch{}}async function If(){let e=Kl(),t;try{t=await HB(e)}catch{return[]}let n=[];for(let r of t){if(!r.endsWith(".json"))continue;let o=hv(e,r);try{let s=await Cf(o,"utf8"),i=JSON.parse(s);i!==null&&typeof i=="object"&&"sessionId"in i&&typeof i.sessionId=="string"&&n.push({...i,path:o})}catch{}}return n}var la=C(()=>{"use strict";W()});var dn=C(()=>{"use strict";Ef();gv();Rf();Tf();la()});import Pf from"path";import{appendFileSync as qB,mkdirSync as zB}from"fs";import{dirname as JB}from"path";import{createHash as VB}from"node:crypto";function XB(e){return YB.has(e)}function QB(e){let t;try{t=JSON.stringify(e.input)??"null"}catch{t=String(e.input)}return VB("sha256").update(e.name).update("\0").update(t).digest("hex")}function ej(e,t){return e.reduce((n,r,o)=>{let s=t(r.name,r.input),i=n[n.length-1];return i&&s&&i.isConcurrencySafe?i.indices.push(o):n.push({isConcurrencySafe:s,indices:[o]}),n},[])}var YB,Mf,ZB,Xt,Mc=C(()=>{"use strict";Mt();yc();vc();bf();W();cn();Sf();dn();YB=new Set([...Bn,ao,lo,co,...gr,un].filter(e=>e.concurrencySafe===!0).map(e=>e.name));Mf=8,ZB=new Set;Xt=class{handlers;schemas;hookRegistry;permissions;subagentExecutor;skillExecutor;composeExecutor;classifier;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;traceWriter;readOnlyBash;repeatBreaker=null;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.composeExecutor=t.composeExecutor,this.classifier=t.concurrencyClassifier??XB,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()}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}:{}}}addReadRoot(t,n="slash"){let r=Pf.resolve(t);this._readRoots.includes(r)||this._readRoots.push(r),this.appendAuditLog({action:"grant-read",path:r,source:n})}addWriteRoot(t,n="slash"){let r=Pf.resolve(t);this._readRoots.includes(r)||this._readRoots.push(r),this._writeRoots.includes(r)||this._writeRoots.push(r),this.appendAuditLog({action:"grant-write",path:r,source:n})}revokeRoot(t,n="slash"){let r=Pf.resolve(t);if(r===this.resolveBase)return;let o=this._readRoots.indexOf(r);o!==-1&&this._readRoots.splice(o,1);let s=this._writeRoots.indexOf(r);s!==-1&&this._writeRoots.splice(s,1),this.appendAuditLog({action:"revoke",path:r,source:n})}getGrants(){return{resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),allowAll:this._allowAll}}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)}}appendAuditLog(t){try{let n=ss();zB(JB(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:this.sessionId??null,action:t.action,path:t.path,source:t.source});qB(n,r+`
|
|
993
993
|
`)}catch{}}get toolDefs(){return this.schemas}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=Ec(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(ZB.has(t.name))return null;let n=QB(t);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<Mf?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 execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0,failureClass:"abort"};if(this.hookRegistry){let a={event:"PreToolUse",toolName:t.name,input:t.input,...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};try{await hf(this.hookRegistry,a,{signal:t.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(l){if(l instanceof _e)return{content:`Tool "${t.name}" blocked by PreToolUse hook: ${l.message}`,isError:!0,failureClass:"hook-block"};throw l}}let n=yf(t.name,this.permissions);if(!n.allowed)return{content:n.reason??`Tool "${t.name}" is not permitted`,isError:!0,failureClass:"permission-denied"};let r=this.checkReadOnlyBash(t);if(r)return r;let o=this.checkRepeatCircuitBreaker(t);if(o)return o;if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let a;try{a=await this.subagentExecutor.execute(t)}catch(l){a={content:`Agent tool error: ${l instanceof Error?l.message:String(l)}`,isError:!0}}return this.firePostToolUse(t.name,a.content,t.signal,t.input),a}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let a;try{a=await this.skillExecutor.execute(t)}catch(l){a={content:`Skill tool error: ${l instanceof Error?l.message:String(l)}`,isError:!0}}return this.firePostToolUse(t.name,a.content,t.signal,t.input),a}if(t.name==="compose"){let a=await this.executeCompose(t);return this.firePostToolUse(t.name,a.content,t.signal,t.input),a}let s=this.handlers.get(t.name);if(!s)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let i;try{i=await s(t.input,t.signal,this.handlerContext)}catch(a){i={content:`Tool execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}return this.firePostToolUse(t.name,i.content,t.signal,t.input),i}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 i=0;i<t.length;i++){let a=t[i];if(a.signal.aborted){n[i]={content:"Tool call aborted",isError:!0,failureClass:"abort"},r.add(i);continue}if(this.hookRegistry){let d={event:"PreToolUse",toolName:a.name,input:a.input,...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};try{await hf(this.hookRegistry,d,{signal:a.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(p){if(p instanceof _e){n[i]={content:`Tool "${a.name}" blocked by PreToolUse hook: ${p.message}`,isError:!0,failureClass:"hook-block"},r.add(i);continue}throw p}}let l=yf(a.name,this.permissions);if(!l.allowed){n[i]={content:l.reason??`Tool "${a.name}" is not permitted`,isError:!0,failureClass:"permission-denied"},r.add(i);continue}let c=this.checkReadOnlyBash(a);if(c){n[i]=c,r.add(i);continue}let u=this.checkRepeatCircuitBreaker(a);if(u){n[i]=u,r.add(i);continue}}let o=t.map((i,a)=>({call:i,originalIndex:a})).filter((i,a)=>!r.has(a));if(o.length===0)return n;let s=ej(o.map(i=>i.call),this.classifier);for(let i of s)if(i.isConcurrencySafe){let a=await Promise.allSettled(i.indices.map(async l=>{let{call:c,originalIndex:u}=o[l];return c.signal.aborted?{result:{content:"Tool call aborted",isError:!0,failureClass:"abort"},originalIndex:u}:{result:await this.executeCore(c),originalIndex:u}}));for(let l of a)if(l.status==="fulfilled")n[l.value.originalIndex]=l.value.result;else{let c=l.reason instanceof Error?l.reason.message:String(l.reason),u=i.indices[a.indexOf(l)];n[o[u].originalIndex]={content:`Tool execution error: ${c}`,isError:!0}}}else for(let a of i.indices){let{call:l,originalIndex:c}=o[a];if(l.signal.aborted){n[c]={content:"Tool call aborted",isError:!0,failureClass:"abort"};continue}n[c]=await this.executeCore(l)}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 o;try{o=await this.subagentExecutor.execute(t)}catch(s){o={content:`Agent tool error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}return this.firePostToolUse(t.name,o.content,t.signal,t.input),o}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let o;try{o=await this.skillExecutor.execute(t)}catch(s){o={content:`Skill tool error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}return this.firePostToolUse(t.name,o.content,t.signal,t.input),o}if(t.name==="compose"){let o=await this.executeCompose(t);return this.firePostToolUse(t.name,o.content,t.signal,t.input),o}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;try{r=await n(t.input,t.signal,this.handlerContext)}catch(o){r={content:`Tool execution error: ${o instanceof Error?o.message:String(o)}`,isError:!0}}return 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 s={event:"PostToolUse",toolName:t,output:n,...o!==void 0?{input:o}:{}};QS(this.hookRegistry,s,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(()=>{})}}});function dj(e){let t=e.match(tj);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 pj(e){let t=e.match(nj);if(!t)return null;let n=parseInt(t[1]??"0",10);return{runner:"jest",passed:parseInt(t[2]??"0",10),failed:n}}function mj(e){let t=e.match(rj);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 fj(e){let t=e.match(oj);if(!t)return null;let n=parseInt(t[1]??"0",10),r=e.match(sj),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function gj(e){let t=[...e.matchAll(ij)];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 hj(e){let t=e.match(aj);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 yj(e){let t=e.match(lj);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 bj(e){let t=e.match(cj);if(t)return{runner:"phpunit",passed:parseInt(t[1]??"0",10),failed:0};let n=e.match(uj);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 Of(e){return dj(e)??pj(e)??mj(e)??fj(e)??gj(e)??hj(e)??yj(e)??bj(e)??null}var tj,nj,rj,oj,sj,ij,aj,lj,cj,uj,bv=C(()=>{"use strict";tj=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,nj=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,rj=/={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,}/,oj=/(\d+)\s+passing/,sj=/(\d+)\s+failing/,ij=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,aj=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,lj=/(\d+) examples?, (\d+) failures?/,cj=/OK \((\d+) tests?/,uj=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});function Oc(e){return e.replace(wv,"").replace(wj," ").trim()}function Hn(e){return e.replace(wv,"")}var wv,wj,xs=C(()=>{"use strict";wv=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B[P^_X][^\x1B]*\x1B\\|\x1B\[[0-?]*[ -/]*[@-~]|\x9B[0-?]*[ -/]*[@-~]|\x1B[@-_]/g,wj=/[\x00-\x1F\x7F-\x9F]/g});import{spawn as Sj}from"child_process";function vj(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.command!="string")throw new Error('Input must have a "command" field of type string');let n=12e4;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number")throw new Error("timeout_ms must be a number");if(t.timeout_ms<0||t.timeout_ms>6e5)throw new Error("timeout_ms must be between 0 and 600000");n=t.timeout_ms}return{command:t.command,timeout_ms:n}}function $c(e,t){let n=!1;function r(){n||e==="bypassPermissions"&&(n=!0,console.warn("[security] bash handler: shell=true with bypassPermissions \u2014 all shell metacharacters are interpreted without confirmation. Migrate to execFile to eliminate this risk (tracked: C4)."))}return async(o,s,i)=>{let{command:a,timeout_ms:l}=vj(o);return s.aborted?{content:"Command aborted",isError:!0}:(r(),new Promise(c=>{let u=!1;function d(x){u||(u=!0,clearTimeout(f),s.removeEventListener("abort",R),c(x))}let p=Sj(a,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...(i?.resolveBase??i?.cwd??t)!==void 0?{cwd:i?.resolveBase??i?.cwd??t}:{},...i?.env!==void 0?{env:{...process.env,...i.env}}:{}});p.unref();let f=setTimeout(()=>{p.pid!==void 0&&process.kill(-p.pid,"SIGKILL"),d({content:`Command timed out after ${l}ms`,isError:!0})},l),g="",h="",b=1e5,y=0,S=!1;function w(x){if(S||u||y<b)return;S=!0,console.warn(`[bash] overflow kill: stream=${x} totalBytes=${y} command="${a}"`),De({event:"tool.overflow_kill",tool:"bash",total_bytes:y,stream:x}),p.kill("SIGKILL");let A=(g+h).trimEnd();A=Hn(A);let T=Of(A)??void 0;A.length>b&&(A=A.slice(0,b)),A+=`
|
|
994
994
|
[output truncated \u2014 exceeded 100KB]`,d({content:A,truncated:!0,...T!==void 0?{testResult:T}:{}})}p.stdout.on("data",x=>{let A=b-y,T=x.length<=A?x:x.subarray(0,Math.max(0,A));y+=T.length,g+=T.toString("utf8"),w("stdout")}),p.stderr.on("data",x=>{let A=b-y,T=x.length<=A?x:x.subarray(0,Math.max(0,A));y+=T.length,h+=T.toString("utf8"),w("stderr")});let R=()=>{p.pid!==void 0&&process.kill(-p.pid,"SIGKILL"),d({content:"Command aborted",isError:!0})};s.addEventListener("abort",R),p.on("close",x=>{if(s.aborted){d({content:"Command aborted",isError:!0});return}if(x!==null&&x!==0){let _=h.trimEnd()||g.trimEnd();d({content:`Command exited with code ${x}${_?`
|
|
995
995
|
`+_:""}`,isError:!0});return}if(S)return;let A=(g+h).trimEnd();A=Hn(A);let T=Of(A)??void 0,k=!1;A.length>b&&(A=A.slice(0,b)+`
|
|
@@ -1073,7 +1073,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
|
|
|
1073
1073
|
Effective base URL: ${r}`)),r}return t}function TU(){if(Vf!==void 0)return Vf;if(!ok){let o=[ma(process.cwd(),".env"),at(),Zw()];for(let s of o)Yf(s)&&EU({path:s,override:!1});ok=!0}let e={},t=v.AFK_MODEL??v.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=of(o)?o:t}if(re(t)==="anthropic-direct"){let o=Xf();o!==void 0&&(e.apiKey=o)}let r=v.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=v.AFK_LOCAL_API_KEY||"local"),v.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(v.AFK_MAX_TOKENS,10)),v.AFK_TEMPERATURE&&(e.temperature=parseFloat(v.AFK_TEMPERATURE)),v.AFK_SYSTEM_PROMPT&&(e.systemPrompt=v.AFK_SYSTEM_PROMPT),v.AFK_AUTO_ROUTING){let o=v.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return v.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=xU(v.AFK_OPENAI_BASE_URL)),Vf=e,e}function Zf(){if(Cs!==void 0)return Cs;let e=[ma(process.cwd(),"afk.config.json"),_t(),ql()];for(let t of e)if(Yf(t))try{let n=ik(t,"utf-8"),r=JSON.parse(n),o={},s=DS(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=of(i)?i:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),typeof r.permissionMode=="string"){let i=r.permissionMode;(i==="default"||i==="plan"||i==="autonomous"||i==="bypassPermissions")&&(o.permissionMode=i)}if(r.autoRouting&&typeof r.autoRouting=="object"){let i={};typeof r.autoRouting.interactive=="boolean"&&(i.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(i.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(i.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(i.daemon=r.autoRouting.daemon),o.autoRouting=i}if(r.daemon&&typeof r.daemon=="object"){let i={};typeof r.daemon.task=="string"&&(i.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(i.taskId=r.daemon.taskId);let a=r.daemon.worktreePrune;a&&typeof a=="object"&&(i.worktreePrune={enabled:typeof a.enabled=="boolean"?a.enabled:!0,cron:typeof a.cron=="string"?a.cron:"0 4 * * *",maxAgeDaysClean:typeof a.maxAgeDaysClean=="number"?a.maxAgeDaysClean:14,maxAgeDaysDirty:typeof a.maxAgeDaysDirty=="number"?a.maxAgeDaysDirty:30,scope:typeof a.scope=="string"?a.scope:"all"}),o.daemon=i}if(r.telegram&&typeof r.telegram=="object"){let i={},a=r.telegram.notify;if(a&&typeof a=="object"){let l={};if((a.mode==="primary"||a.mode==="broadcast"||a.mode==="custom")&&(l.mode=a.mode),typeof a.primaryChatId=="number"&&Number.isFinite(a.primaryChatId)&&(l.primaryChatId=a.primaryChatId),Array.isArray(a.targets)){let c=a.targets.filter(u=>typeof u=="number"&&Number.isFinite(u));c.length>0&&(l.targets=c)}i.notify=l}o.telegram=i}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.hooks!==null&&typeof r.hooks=="object"&&!Array.isArray(r.hooks)&&(o.hooks=r.hooks),typeof r.enableShellHooks=="boolean"&&(o.enableShellHooks=r.enableShellHooks),t!==ma(process.cwd(),"afk.config.json")){let i=da(r.importFrom);i!==void 0&&(o.importFrom=i)}if(r.interactive&&typeof r.interactive=="object"){let i={};typeof r.interactive.worktreeAutoname=="boolean"&&(i.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(i.worktreeBranchPrefix=Gf(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(qf(r.interactive.worktreeBase,`${t}#/interactive/worktreeBase`),i.worktreeBase=r.interactive.worktreeBase),typeof r.interactive.suggestGhost=="boolean"&&(i.suggestGhost=r.interactive.suggestGhost),Object.keys(i).length>0&&(o.interactive=i)}return Cs={config:o,sourcePath:t,modelsPartial:s},Cs}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return Cs={config:{},sourcePath:void 0,modelsPartial:{}},Cs}function RU(){if(_s!==void 0)return _s.value;let e=[ma(process.cwd(),"AFK.md"),ma(Ce(),"AFK.md")];for(let t of e)if(Yf(t))try{let n=ik(t,"utf-8").trim();if(n.length>0)return _s={value:{content:n,path:t}},_s.value}catch{}return _s={value:null},_s.value}function lk(){return Zf().config.telegram??{}}function Is(){return Zf().config.permissionMode??ak}function bt(e){let t=TU(),{config:n,sourcePath:r,modelsPartial:o}=Zf(),s={...pa,...t,...n,...e},i;if(t.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=RU();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??pa.model,maxTokens:s.maxTokens??pa.maxTokens,temperature:s.temperature??pa.temperature,updatePolicy:s.updatePolicy??pa.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??ak,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=e?.models??tf(o);if(ac(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var pa,ak,ok,Vf,sk,Cs,_s,Nt=C(()=>{"use strict";Dn();Jt();Ve();W();Rs();ua();G();po();pa={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},ak="bypassPermissions",ok=!1;sk=new Set});function AU(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function CU(e,t={}){let n=[...e],r=t.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(t.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=AU(n,t.primaryChatId);return o!==void 0?[o]:[]}function _U(e){if(!e)return;let t=e.trim();if(!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isFinite(n)&&n!==0?n:void 0}function IU(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function PU(){let e=lk().notify??{},t=e.mode??IU(v.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??_U(v.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function Ps(){let e=jv(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return CU(e,PU())}var Hc=C(()=>{"use strict";Uv();Nt();G()});function ck(e,t=4096){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let o=t,s=r.lastIndexOf(`
|
|
1074
1074
|
`,t);if(s>t-500&&s>0)o=s+1;else{let i=r.slice(0,t).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let l=r.lastIndexOf(a,t);l>t-200&&l>0&&(o=l+2)}}else{let a=r.lastIndexOf(" ",t);a>t-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}var uk=C(()=>{"use strict"});var Qf={};Nl(Qf,{push:()=>Kc,pushIfConfigured:()=>wr});async function Kc(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??MU}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function wr(e,t={}){let n=v.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=Ps();if(r.length===0)return null;let o=ck(e),s=[];for(let i of r)for(let a=0;a<o.length;a++)s.push(await Kc({token:n,chatId:i,text:o[a]??"",...t.parseMode!==void 0?{parseMode:t.parseMode}:{},...t.replyMarkup!==void 0&&a===0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}}));return s}var MU,mo=C(()=>{"use strict";Hc();uk();G();MU="https://api.telegram.org"});function OU(e=Kc){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>dk)return{content:`Invalid input: message exceeds Telegram's ${dk}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=Ps();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await e({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var dk,pk,mk=C(()=>{"use strict";G();mo();Hc();dk=4096;pk=OU()});import{JSDOM as $U}from"jsdom";import{Readability as DU}from"@mozilla/readability";import LU from"turndown";function fk(e){return e.replace(/\n{3,}/g,`
|
|
1075
1075
|
|
|
1076
|
-
`).trim()}function FU(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function hk(e,t){let r=new $U(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new DU(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=fk(eg.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=fk(eg.turndown(a));return{title:o,markdown:l,textLength:FU(i),usedFallback:!0}}var gk,eg,yk=C(()=>{"use strict";gk=200,eg=new LU({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});eg.remove(["script","style","noscript","iframe"])});import{readFileSync as NU}from"node:fs";import{join as BU}from"path";function jU(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function bk(e,t){return jU(t).test(e)}function KU(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(UU.has(t))return!0;if(HU.has(t))return!1}return!1}function wk(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function WU(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 GU(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function qU(e){try{return NU(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function zU(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 n}function Sk(e){let t=e?.env??v,n=e?.readFileSync??qU,r=e?.surface??t.AGENT_SURFACE,o=KU(t.AFK_BROWSER_HEADLESS,r),s=wk(t.AFK_BROWSER_ALLOWED_DOMAINS),i=wk(t.AFK_BROWSER_BLOCKED_DOMAINS),a=GU(t.AFK_BROWSER_DOM_SNAPSHOTS),l=WU(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():BU(zt(),"browser.json"),p=n(d);if(p===void 0)return c;let f;try{f=JSON.parse(p)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof f!="object"||f===null||Array.isArray(f))throw new Error(`Browser config at ${d} must be a JSON object`);let g=zU(c,f);return g.configPath=d,g}function tg(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(bk(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>bk(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var UU,HU,ng=C(()=>{"use strict";G();W();UU=new Set(["daemon","subagent","telegram","afk"]),HU=new Set(["repl","interactive","cli"])});import JU from"node:fs";import VU from"node:path";import{chromium as YU}from"playwright";function XU(){try{return"4.27.0"}catch{}try{let e=VU.resolve(import.meta.dirname,"../../../package.json"),t=JU.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ZU,Wc,vk=C(()=>{"use strict";ZU=XU(),Wc=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=YU.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 o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}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",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),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/${ZU}`}}}});import{createHash as QU}from"crypto";function rg(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of e1)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function kk(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&t1.test(e.label))}function Ek(e){return QU("sha256").update(e,"utf8").digest("hex").slice(0,8)}function xk(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var e1,t1,fa=C(()=>{"use strict";e1=[{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}];t1=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as n1}from"node:crypto";function r1(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function o1(e,t,n){return`el_${n1("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function s1(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function Tk(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Ak(e,t){let n=e.role??"",r=e.name??"";Rk.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])Ak(s,t)}async function i1(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Ck).catch(()=>[])}async function a1(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 s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},Ck).catch(()=>[])}function l1(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Gc(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=l1(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=i1(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],Ak(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await a1(e)).filter(F=>Rk.has(F.role??"")));let S=new Map;for(let $ of p){let F=Tk($.name),I=S.get(F);(!I||I.bbox.w===0&&$.bbox.w>0)&&S.set(F,$)}let w=b.map($=>({ax:$,dom:S.get(Tk($.name??""))})),R=r?w:w.filter($=>$.dom?$.dom.bbox.w>0||$.dom.bbox.h>0:!0);R.sort(($,F)=>{let I=$.dom?.bbox.y??0,B=F.dom?.bbox.y??0;if(I!==B)return I-B;let U=$.dom?.bbox.x??0,j=F.dom?.bbox.x??0;return U-j}),R.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=R.slice(0,n).map(($,F)=>{let I=$.ax.role??"generic",B=$.ax.name??"",U=o1(I,B,F),j=$.dom?.bbox??{x:0,y:0,w:0,h:0},L=$.dom?.type??null,N=null;$.ax.value!==void 0&&$.ax.value!==null&&(N=String($.ax.value)),$.ax.checked!==void 0&&(N=String($.ax.checked)),kk({role:I,kind:L})&&(N="[redacted]");let D={disabled:$.ax.disabled??!1};$.ax.checked!==void 0&&(D.checked=$.ax.checked===!0||$.ax.checked==="mixed"),$.ax.selected!==void 0&&(D.selected=$.ax.selected),$.ax.expanded!==void 0&&(D.expanded=$.ax.expanded);let M;$.dom?.testId?M=`[data-testid="${$.dom.testId}"]`:$.dom?.id&&(M=`#${$.dom.id}`);let z={id:U,role:I,label:r1(B),kind:L,value:N,state:D,bbox:j};return M!==void 0&&(z.selector=M),z}),T="idle";try{let $=await e.evaluate(()=>document.readyState);$==="loading"?T="loading":$==="interactive"?T="navigating":T="idle"}catch{T="navigating"}T!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let k=s1(f),_=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:_,url:g,title:h,textSummary:k,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:T,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var Rk,Ck,_k=C(()=>{"use strict";fa();Rk=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Ck="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Ik(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function og(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>Ik(e,s)))).filter(o=>o!==null)}async function c1(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function sg(e,t,n){switch(t.kind){case"element_id":return u1(e,t,n);case"selector":return d1(e,t);case"semantic":return p1(e,t)}}async function u1(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}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await og(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function d1(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 og(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function p1(e,t){return t.role!==void 0?m1(e,t.text,t.role):f1(e,t.text,t)}async function m1(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 s=await og(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function f1(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await c1(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await Ik(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let R=0;R<S.length;R++)w=w*31+S.charCodeAt(R)>>>0;f.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var Pk=C(()=>{"use strict"});import{randomBytes as g1}from"crypto";import{mkdir as h1,stat as y1,writeFile as b1}from"fs/promises";import{join as ig}from"path";import{gzip as w1}from"zlib";import{promisify as S1}from"util";function v1(e){return ig(is(e),"browser")}function k1(e){return ig(v1(e),"screenshots")}function E1(){return new Date().toISOString().replace(/[:.]/g,"-")}function x1(){return g1(3).toString("hex")}async function ag(e,t,n){if(t.length>Mk)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Mk} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=k1(e);await h1(r,{recursive:!0});let o=`${E1()}-${x1()}-${n}.png`,s=ig(r,o);await b1(s,t);let{size:i}=await y1(s);return{path:s,bytes:i}}var Zae,Mk,Ok=C(()=>{"use strict";W();fa();Zae=S1(w1);Mk=5*1024*1024});var Dk={};Nl(Dk,{PlaywrightProvider:()=>lg});function $k(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 lg,Lk=C(()=>{"use strict";vk();_k();Pk();ng();fa();Ok();lg=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Wc(t)}async open(t){let n=tg(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),s=this.ensureSessionState(r),i=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)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Gc(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,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),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Gc(r,{observationCounter:o.observationCounter,screenshotPath:s,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,i.interactive,i.url,i.title,"browser_observe"),i}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),s=r.url(),i=t.timeoutMs??3e4,a=await sg(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${$k(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=rg(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:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=tg(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Gc(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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),s;if(t.target!==void 0){let u=await sg(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${$k(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await ag(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.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,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await ag(n,o,r);return s}catch{return null}}}});var go={};Nl(go,{__resetBrowserRegistryForTests:()=>_1,browserProviderActive:()=>A1,closeBrowserProvider:()=>cg,getBrowserProvider:()=>R1,peekBrowserProvider:()=>C1});function Fk(){Promise.resolve(cg()).then(()=>{process.exit(130)})}function Nk(){Promise.resolve(cg()).then(()=>{process.exit(143)})}function Bk(){pn=null}function T1(){qc||(process.on("SIGINT",Fk),process.on("SIGTERM",Nk),process.on("exit",Bk),qc=!0)}function jk(){qc&&(process.removeListener("SIGINT",Fk),process.removeListener("SIGTERM",Nk),process.removeListener("exit",Bk),qc=!1)}async function R1(e){return pn!==null?pn:(fo!==null||(fo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(Lk(),Dk)),n=Sk(e),r=new t(n);return T1(),pn=r,fo=null,r})()),fo)}async function cg(){if(pn===null)return;let e=pn;pn=null,fo=null,jk(),await e.shutdown()}function A1(){return pn!==null}function C1(){return pn}function _1(){pn=null,fo=null,jk()}var pn,fo,qc,ho=C(()=>{"use strict";ng();pn=null,fo=null,qc=!1});function Uk(e,t){try{return hk(e,t)}catch(n){return V("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function $1(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ho(),go));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function Hk(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??$1,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:O1,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(M1.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(P1.test(u)&&!I1.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=Uk(d,s)}}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<gk)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=Uk(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var I1,P1,M1,O1,Kk=C(()=>{"use strict";yk();Ie();I1=/(text\/html|application\/xhtml\+xml)/i,P1=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,M1=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,O1={"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 F1(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(D1,{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),L1),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=Oc(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function Wk(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?F1({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 Gk(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1076
|
+
`).trim()}function FU(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function hk(e,t){let r=new $U(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new DU(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=fk(eg.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=fk(eg.turndown(a));return{title:o,markdown:l,textLength:FU(i),usedFallback:!0}}var gk,eg,yk=C(()=>{"use strict";gk=200,eg=new LU({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});eg.remove(["script","style","noscript","iframe"])});import{readFileSync as NU}from"node:fs";import{join as BU}from"path";function jU(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function bk(e,t){return jU(t).test(e)}function KU(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(UU.has(t))return!0;if(HU.has(t))return!1}return!1}function wk(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function WU(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 GU(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function qU(e){try{return NU(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function zU(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 n}function Sk(e){let t=e?.env??v,n=e?.readFileSync??qU,r=e?.surface??t.AGENT_SURFACE,o=KU(t.AFK_BROWSER_HEADLESS,r),s=wk(t.AFK_BROWSER_ALLOWED_DOMAINS),i=wk(t.AFK_BROWSER_BLOCKED_DOMAINS),a=GU(t.AFK_BROWSER_DOM_SNAPSHOTS),l=WU(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():BU(zt(),"browser.json"),p=n(d);if(p===void 0)return c;let f;try{f=JSON.parse(p)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof f!="object"||f===null||Array.isArray(f))throw new Error(`Browser config at ${d} must be a JSON object`);let g=zU(c,f);return g.configPath=d,g}function tg(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(bk(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>bk(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var UU,HU,ng=C(()=>{"use strict";G();W();UU=new Set(["daemon","subagent","telegram","afk"]),HU=new Set(["repl","interactive","cli"])});import JU from"node:fs";import VU from"node:path";import{chromium as YU}from"playwright";function XU(){try{return"4.27.2"}catch{}try{let e=VU.resolve(import.meta.dirname,"../../../package.json"),t=JU.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ZU,Wc,vk=C(()=>{"use strict";ZU=XU(),Wc=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=YU.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 o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}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",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),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/${ZU}`}}}});import{createHash as QU}from"crypto";function rg(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of e1)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function kk(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&t1.test(e.label))}function Ek(e){return QU("sha256").update(e,"utf8").digest("hex").slice(0,8)}function xk(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var e1,t1,fa=C(()=>{"use strict";e1=[{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}];t1=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as n1}from"node:crypto";function r1(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function o1(e,t,n){return`el_${n1("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function s1(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function Tk(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Ak(e,t){let n=e.role??"",r=e.name??"";Rk.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])Ak(s,t)}async function i1(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Ck).catch(()=>[])}async function a1(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 s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},Ck).catch(()=>[])}function l1(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Gc(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=l1(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=i1(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],Ak(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await a1(e)).filter(F=>Rk.has(F.role??"")));let S=new Map;for(let $ of p){let F=Tk($.name),I=S.get(F);(!I||I.bbox.w===0&&$.bbox.w>0)&&S.set(F,$)}let w=b.map($=>({ax:$,dom:S.get(Tk($.name??""))})),R=r?w:w.filter($=>$.dom?$.dom.bbox.w>0||$.dom.bbox.h>0:!0);R.sort(($,F)=>{let I=$.dom?.bbox.y??0,B=F.dom?.bbox.y??0;if(I!==B)return I-B;let U=$.dom?.bbox.x??0,j=F.dom?.bbox.x??0;return U-j}),R.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=R.slice(0,n).map(($,F)=>{let I=$.ax.role??"generic",B=$.ax.name??"",U=o1(I,B,F),j=$.dom?.bbox??{x:0,y:0,w:0,h:0},L=$.dom?.type??null,N=null;$.ax.value!==void 0&&$.ax.value!==null&&(N=String($.ax.value)),$.ax.checked!==void 0&&(N=String($.ax.checked)),kk({role:I,kind:L})&&(N="[redacted]");let D={disabled:$.ax.disabled??!1};$.ax.checked!==void 0&&(D.checked=$.ax.checked===!0||$.ax.checked==="mixed"),$.ax.selected!==void 0&&(D.selected=$.ax.selected),$.ax.expanded!==void 0&&(D.expanded=$.ax.expanded);let M;$.dom?.testId?M=`[data-testid="${$.dom.testId}"]`:$.dom?.id&&(M=`#${$.dom.id}`);let z={id:U,role:I,label:r1(B),kind:L,value:N,state:D,bbox:j};return M!==void 0&&(z.selector=M),z}),T="idle";try{let $=await e.evaluate(()=>document.readyState);$==="loading"?T="loading":$==="interactive"?T="navigating":T="idle"}catch{T="navigating"}T!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let k=s1(f),_=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:_,url:g,title:h,textSummary:k,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:T,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var Rk,Ck,_k=C(()=>{"use strict";fa();Rk=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Ck="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Ik(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function og(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>Ik(e,s)))).filter(o=>o!==null)}async function c1(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function sg(e,t,n){switch(t.kind){case"element_id":return u1(e,t,n);case"selector":return d1(e,t);case"semantic":return p1(e,t)}}async function u1(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}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await og(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function d1(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 og(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function p1(e,t){return t.role!==void 0?m1(e,t.text,t.role):f1(e,t.text,t)}async function m1(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 s=await og(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function f1(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await c1(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await Ik(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let R=0;R<S.length;R++)w=w*31+S.charCodeAt(R)>>>0;f.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var Pk=C(()=>{"use strict"});import{randomBytes as g1}from"crypto";import{mkdir as h1,stat as y1,writeFile as b1}from"fs/promises";import{join as ig}from"path";import{gzip as w1}from"zlib";import{promisify as S1}from"util";function v1(e){return ig(is(e),"browser")}function k1(e){return ig(v1(e),"screenshots")}function E1(){return new Date().toISOString().replace(/[:.]/g,"-")}function x1(){return g1(3).toString("hex")}async function ag(e,t,n){if(t.length>Mk)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Mk} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=k1(e);await h1(r,{recursive:!0});let o=`${E1()}-${x1()}-${n}.png`,s=ig(r,o);await b1(s,t);let{size:i}=await y1(s);return{path:s,bytes:i}}var Zae,Mk,Ok=C(()=>{"use strict";W();fa();Zae=S1(w1);Mk=5*1024*1024});var Dk={};Nl(Dk,{PlaywrightProvider:()=>lg});function $k(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 lg,Lk=C(()=>{"use strict";vk();_k();Pk();ng();fa();Ok();lg=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Wc(t)}async open(t){let n=tg(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),s=this.ensureSessionState(r),i=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)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Gc(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,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),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Gc(r,{observationCounter:o.observationCounter,screenshotPath:s,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,i.interactive,i.url,i.title,"browser_observe"),i}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),s=r.url(),i=t.timeoutMs??3e4,a=await sg(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${$k(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=rg(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:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=tg(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Gc(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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),s;if(t.target!==void 0){let u=await sg(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${$k(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await ag(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.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,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await ag(n,o,r);return s}catch{return null}}}});var go={};Nl(go,{__resetBrowserRegistryForTests:()=>_1,browserProviderActive:()=>A1,closeBrowserProvider:()=>cg,getBrowserProvider:()=>R1,peekBrowserProvider:()=>C1});function Fk(){Promise.resolve(cg()).then(()=>{process.exit(130)})}function Nk(){Promise.resolve(cg()).then(()=>{process.exit(143)})}function Bk(){pn=null}function T1(){qc||(process.on("SIGINT",Fk),process.on("SIGTERM",Nk),process.on("exit",Bk),qc=!0)}function jk(){qc&&(process.removeListener("SIGINT",Fk),process.removeListener("SIGTERM",Nk),process.removeListener("exit",Bk),qc=!1)}async function R1(e){return pn!==null?pn:(fo!==null||(fo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(Lk(),Dk)),n=Sk(e),r=new t(n);return T1(),pn=r,fo=null,r})()),fo)}async function cg(){if(pn===null)return;let e=pn;pn=null,fo=null,jk(),await e.shutdown()}function A1(){return pn!==null}function C1(){return pn}function _1(){pn=null,fo=null,jk()}var pn,fo,qc,ho=C(()=>{"use strict";ng();pn=null,fo=null,qc=!1});function Uk(e,t){try{return hk(e,t)}catch(n){return V("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function $1(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ho(),go));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function Hk(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??$1,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:O1,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(M1.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(P1.test(u)&&!I1.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=Uk(d,s)}}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<gk)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=Uk(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var I1,P1,M1,O1,Kk=C(()=>{"use strict";yk();Ie();I1=/(text\/html|application\/xhtml\+xml)/i,P1=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,M1=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,O1={"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 F1(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(D1,{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),L1),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=Oc(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function Wk(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?F1({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 Gk(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1077
1077
|
|
|
1078
1078
|
(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(`
|
|
1079
1079
|
`).trimEnd()}var D1,L1,qk=C(()=>{"use strict";xs();D1="https://api.exa.ai/search",L1=10});function G1(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,s;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=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 i=N1;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"};i=Math.min(t.timeout_ms,B1)}let a=j1;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,U1)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function ug(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+H1}function q1(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 W1.some(o=>r.includes(o))}function z1(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 s=G1(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let u=i.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let d;try{d=await t(s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(f){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await d.text()}catch(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:ug(p,s.maxBytes)}}if(s.mode==="markdown")try{let d=await Hk(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return d.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:ug(d.markdown,s.maxBytes)}}catch(d){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=d instanceof Error?d.message:String(d),f=q1(d)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${f}`,isError:!0}}let u=Wk({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let d=await u.search(s.query,{limit:K1,timeoutMs:s.timeoutMs,signal:i.signal});return{content:ug(Gk(s.query,d),s.maxBytes)}}catch(d){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${d instanceof Error?d.message:String(d)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var N1,B1,j1,U1,H1,K1,W1,zk,Jk=C(()=>{"use strict";Kk();qk();N1=3e4,B1=12e4,j1=1e6,U1=1e7,H1=`
|
|
@@ -1512,7 +1512,7 @@ ${t.body}`)}var EG,wh=C(()=>{"use strict";EG=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9
|
|
|
1512
1512
|
|
|
1513
1513
|
`+n},{role:"assistant",content:BR},...e.slice(t)]}function KR(e,t,n){let r=r2(e.slice(0,t)),o=NR.length+2+n.length+BR.length,s=Math.max(0,r-o);return Math.round(s/4)}function n2(e){let t=[];for(let n of e){let r=n.role==="user"?"User":"Assistant";if(t.push(r+":"),typeof n.content=="string")t.push(n.content);else if(Array.isArray(n.content))for(let o of n.content){let s=o.type;if(s==="text"&&"text"in o)t.push(o.text);else if(s==="tool_use"){let i=o.name??"unknown",a=WR(o.input);t.push(`[tool call: ${i} ${a}]`)}else if(s==="tool_result"){let i=o.content;t.push(`[tool result: ${GR(i)}]`)}else s==="image"?t.push("[image]"):s==="document"&&t.push("[document]")}t.push("")}return t.join(`
|
|
1514
1514
|
`).trim()}function WR(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function GR(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function r2(e){let t=0;for(let n of e)if(typeof n.content=="string")t+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?t+=r.text.length:o==="tool_use"?t+=WR(r.input).length:o==="tool_result"&&(t+=GR(r.content).length)}return t}var e2,NR,BR,qR=C(()=>{"use strict";e2=["You are a conversation-summarization assistant. The user will paste a","prior conversation between a user and an AI assistant that includes tool","calls and tool results. Produce a concise but complete summary that lets","the AI continue the conversation without losing track.","","Preserve, in this priority order:","1. The user's original intent, explicit asks, constraints, corrections,"," and preferences stated during the conversation.","2. Tool decisions and their outcomes \u2014 file paths read or written, shell"," commands run, search queries, URLs fetched, code edits made, tests"," run, errors observed, and whether each action succeeded or failed.","3. Current state: what has been completed, what remains unresolved, and"," the safest next action.","4. Open questions, pending decisions, blockers, and assumptions.","5. Key facts the assistant discovered (function locations, schemas,"," observed behaviors, important external findings).","","Drop prose narration, conversational filler, and exploratory dead-ends.","Drop verbatim tool output unless an exact snippet, error, path, command,","or result is needed for continuation.","Do not invent details. If something is uncertain, mark it explicitly.","Output plain text, no markdown headers. Aim for ~250 words; use up to","~400 only when needed to preserve tool state or unresolved tasks."].join(`
|
|
1515
|
-
`),NR="[Compacted summary of earlier conversation]",BR="Acknowledged. Continuing from the summary above."});import{randomUUID as o2}from"node:crypto";async function zR(e){let{state:t,abort:n,retry:r,initSessionId:o,traceWriter:s}=e,i=t.messages.length;if(t.closed)return{compacted:!1,reason:"session-closed",messagesBefore:i,messagesAfter:i};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:i,messagesAfter:i};let a=l2(),l=jR(t.messages,a);if(l<0)return{compacted:!1,reason:"history-too-short",messagesBefore:i,messagesAfter:i};if(l===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:i,messagesAfter:i};let c=t.messages.slice(0,l),u=c2(),d=UR(c,u,a2),p=n.begin(),f;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let y=ln(r.authMode,o,o2()),S=r.client,w=await Promise.resolve(S.messages.create(d,{headers:y,signal:p.signal}));f=await u2(w)}catch(y){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(y instanceof Error?y.message:String(y)),messagesBefore:i,messagesAfter:i}}finally{n.clear(p)}if(f.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let g=KR(t.messages,l,f),h=HR(t.messages,l,f);t.messages.splice(0,t.messages.length,...h);let b=t.messages.length;return PS(s,{trigger:"manual",preCompactionMessages:c,summary:f,keptTailCount:i-l,keepLastNConfig:a,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}}function l2(){let e=v.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return s2}function c2(){let e=v.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?ht(e)??e:i2}async function u2(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}var s2,i2,a2,JR=C(()=>{"use strict";fs();qR();wt();Dn();G();s2=2,i2="claude-haiku-4-5-20251001",a2=1024});import{randomUUID as VR}from"node:crypto";var d2,zu,YR=C(()=>{"use strict";fs();af();cf();df();So();Sa();Dn();SR();kR();ER();FR();JR();Lg();d2=[{value:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],zu=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;traceWriter;state;abort;retry;cwdDependentsFactory;onPermissionMode;mcpManager;constructor(t){this.initSessionId=t.sessionId??VR(),this.promptStream=t.promptStream,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.thinking=t.thinking,t.effort!==void 0&&(this.effort=t.effort),t.baseUrl!==void 0&&(this.baseUrl=t.baseUrl),this.traceWriter=t.traceWriter,this.cwdDependentsFactory=t.cwdDependentsFactory,this.onPermissionMode=t.onPermissionMode,this.mcpManager=t.mcpManager,this.retry=new qu({client:t.client,authMode:t.authMode,initSessionId:this.initSessionId,...t.tokenRefresher?{tokenRefresher:t.tokenRefresher}:{},autoResumeOnUsageLimit:t.autoResumeOnUsageLimit??!0}),this.state=vR({model:t.model,...t.requestedModel!==void 0?{requestedModel:t.requestedModel}:{},permissionMode:t.permissionMode??"default",userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,...t.initialMessages?{initialMessages:t.initialMessages}:{},...t.autoCompactThreshold!==void 0?{autoCompactThreshold:t.autoCompactThreshold}:{}}),this.abort=new Gu}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.state.currentModel,permissionMode:this.state.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:this.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.retry.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.state.closed;){let r=await Promise.race([n.next(),this.abort.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,i=this.abort.begin();if(i.signal.aborted){this.abort.clear(i);return}wR(this.state.messages),this.state.messages.push({role:"user",content:s.content});let a=this.composeSystem(),l=ln(this.retry.authMode,this.initSessionId,VR(),this.effort!==void 0),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.tools,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:i.signal,ctx:{sessionId:this.initSessionId},...this.thinking!==void 0?{thinking:this.thinking}:{},...this.effort!==void 0?{effort:this.effort}:{},...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{},onUsageProgress:u=>{this.state.lastUsage=u}};try{for await(let u of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;u.type==="turn.completed"&&(this.state.lastUsage=u.usage,this.abort.clear(i)),yield u}}catch(u){if(i.signal.aborted)return;yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abort.clear(i)}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let u=this.state.lastUsage,d=kt(this.state.requestedModel);if(u!==null&&d>0){let p=Ns(u);hx(p,d,this.state.autoCompactThreshold)&&await this.compact()}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let t=this.systemPrefix,n=this.state.userSystem,r=[];t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n});let o=qS(this.state.currentPermissionMode);o!==null&&r.push(o);let s=zS(this.state.currentPermissionMode);return s!==null&&r.push(s),r.length===0?null:cc({baseUrl:this.baseUrl})?KS(r,uc()):r}async interrupt(){this.abort.requestAbort("interrupted")}async setModel(t){t!==void 0&&t.length>0&&(this.state.requestedModel=t,this.state.currentModel=ht(t)??t)}async setPermissionMode(t){this.state.currentPermissionMode=t;let n=t==="bypassPermissions";this.state.toolDispatcher.setAllowAll?.(n),this.onPermissionMode?.(t)}setCwd(t){if(this.state.toolDispatcher.setResolveBase?.(t),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(t);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){try{return Yn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return d2.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.state.lastUsage,n=kt(this.state.requestedModel),r;if(t&&n>0){let i=Ns(t);r=Math.min(100,Math.max(0,i/n*100))}let{totalTokens:o,apiUsage:s}=bu(t);return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:s,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return zR({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}}});function Ch(e){if(e===void 0||e===!1)return;if(e===!0)return m2;let t=e.threshold;if(!(typeof t!="number"||!Number.isFinite(t)||t<=0||t>=1))return t}function _h(e,t){let n=wa(t),r=e.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let s=`max:${t}:${o}`;return Ju.has(s)||(Ju.add(s),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${t} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function XR(e){if(!e||e.length===0)return;let t=[];for(let n of e)n.user.length>0&&t.push({role:"user",content:n.user}),n.assistant.length>0&&t.push({role:"assistant",content:n.assistant});return t.length>0?t:void 0}function Ih(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&p2(n))return{type:"adaptive",display:"summarized"};let r=Math.floor(t*f2),o=Math.max(1024,t-1-r),s=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.floor(e.budgetTokens):void 0,i=Math.min(Math.max(s??o,1024),o);if(s!==void 0&&s>o){let a=`think:${n??"default"}:${s}:${t}`;Ju.has(a)||(Ju.add(a),console.warn(`[afk] thinking budgetTokens ${s} leaves too little of max_tokens ${t} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:i,display:"summarized"}}}}function Ph(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[678]/.test(n))return"max"}var p2,m2,Ju,f2,Mh=C(()=>{"use strict";Sa();p2=e=>/opus-4-(7|[89])/.test(e),m2=.9;Ju=new Set,f2=.25});var Vu,Oh,$h,Uhe,ZR,QR,eA=C(()=>{"use strict";Vu=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
|
|
1515
|
+
`),NR="[Compacted summary of earlier conversation]",BR="Acknowledged. Continuing from the summary above."});import{randomUUID as o2}from"node:crypto";async function zR(e){let{state:t,abort:n,retry:r,initSessionId:o,traceWriter:s}=e,i=t.messages.length;if(t.closed)return{compacted:!1,reason:"session-closed",messagesBefore:i,messagesAfter:i};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:i,messagesAfter:i};let a=l2(),l=jR(t.messages,a);if(l<0)return{compacted:!1,reason:"history-too-short",messagesBefore:i,messagesAfter:i};if(l===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:i,messagesAfter:i};let c=t.messages.slice(0,l),u=c2(),d=UR(c,u,a2),p=n.begin(),f;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let y=ln(r.authMode,o,o2()),S=r.client,w=await Promise.resolve(S.messages.create(d,{headers:y,signal:p.signal}));f=await u2(w)}catch(y){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(y instanceof Error?y.message:String(y)),messagesBefore:i,messagesAfter:i}}finally{n.clear(p)}if(f.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let g=KR(t.messages,l,f),h=HR(t.messages,l,f);t.messages.splice(0,t.messages.length,...h);let b=t.messages.length;return PS(s,{trigger:"manual",preCompactionMessages:c,summary:f,keptTailCount:i-l,keepLastNConfig:a,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}}function l2(){let e=v.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return s2}function c2(){let e=v.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?ht(e)??e:i2}async function u2(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}var s2,i2,a2,JR=C(()=>{"use strict";fs();qR();wt();Dn();G();s2=2,i2="claude-haiku-4-5-20251001",a2=1024});import{randomUUID as VR}from"node:crypto";var d2,zu,YR=C(()=>{"use strict";fs();af();cf();df();So();Sa();Dn();SR();kR();ER();FR();JR();Lg();d2=[{value:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],zu=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;traceWriter;state;abort;retry;cwdDependentsFactory;onPermissionMode;mcpManager;constructor(t){this.initSessionId=t.sessionId??VR(),this.promptStream=t.promptStream,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.thinking=t.thinking,t.effort!==void 0&&(this.effort=t.effort),t.baseUrl!==void 0&&(this.baseUrl=t.baseUrl),this.traceWriter=t.traceWriter,this.cwdDependentsFactory=t.cwdDependentsFactory,this.onPermissionMode=t.onPermissionMode,this.mcpManager=t.mcpManager,this.retry=new qu({client:t.client,authMode:t.authMode,initSessionId:this.initSessionId,...t.tokenRefresher?{tokenRefresher:t.tokenRefresher}:{},autoResumeOnUsageLimit:t.autoResumeOnUsageLimit??!0}),this.state=vR({model:t.model,...t.requestedModel!==void 0?{requestedModel:t.requestedModel}:{},permissionMode:t.permissionMode??"default",userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,...t.initialMessages?{initialMessages:t.initialMessages}:{},...t.autoCompactThreshold!==void 0?{autoCompactThreshold:t.autoCompactThreshold}:{}}),this.abort=new Gu}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.state.currentModel,permissionMode:this.state.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:this.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.retry.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.state.closed;){let r=await Promise.race([n.next(),this.abort.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,i=this.abort.begin();if(i.signal.aborted){this.abort.clear(i);return}wR(this.state.messages),this.state.messages.push({role:"user",content:s.content});let a=this.composeSystem(),l=ln(this.retry.authMode,this.initSessionId,VR(),this.effort!==void 0),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.tools,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:i.signal,ctx:{sessionId:this.initSessionId},...this.thinking!==void 0?{thinking:this.thinking}:{},...this.effort!==void 0?{effort:this.effort}:{},...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{},onUsageProgress:u=>{this.state.lastUsage=u}};try{for await(let u of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;u.type==="turn.completed"&&(this.state.lastUsage=u.usage,this.abort.clear(i)),yield u}}catch(u){if(i.signal.aborted)return;yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abort.clear(i)}if(i.signal.aborted)return;if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let u=this.state.lastUsage,d=kt(this.state.requestedModel);if(u!==null&&d>0){let p=Ns(u);hx(p,d,this.state.autoCompactThreshold)&&await this.compact()}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let t=this.systemPrefix,n=this.state.userSystem,r=[];t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n});let o=qS(this.state.currentPermissionMode);o!==null&&r.push(o);let s=zS(this.state.currentPermissionMode);return s!==null&&r.push(s),r.length===0?null:cc({baseUrl:this.baseUrl})?KS(r,uc()):r}async interrupt(){this.abort.requestAbort("interrupted")}async setModel(t){t!==void 0&&t.length>0&&(this.state.requestedModel=t,this.state.currentModel=ht(t)??t)}async setPermissionMode(t){this.state.currentPermissionMode=t;let n=t==="bypassPermissions";this.state.toolDispatcher.setAllowAll?.(n),this.onPermissionMode?.(t)}setCwd(t){if(this.state.toolDispatcher.setResolveBase?.(t),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(t);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){try{return Yn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return d2.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.state.lastUsage,n=kt(this.state.requestedModel),r;if(t&&n>0){let i=Ns(t);r=Math.min(100,Math.max(0,i/n*100))}let{totalTokens:o,apiUsage:s}=bu(t);return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:s,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return zR({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}}});function Ch(e){if(e===void 0||e===!1)return;if(e===!0)return m2;let t=e.threshold;if(!(typeof t!="number"||!Number.isFinite(t)||t<=0||t>=1))return t}function _h(e,t){let n=wa(t),r=e.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let s=`max:${t}:${o}`;return Ju.has(s)||(Ju.add(s),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${t} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function XR(e){if(!e||e.length===0)return;let t=[];for(let n of e)n.user.length>0&&t.push({role:"user",content:n.user}),n.assistant.length>0&&t.push({role:"assistant",content:n.assistant});return t.length>0?t:void 0}function Ih(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&p2(n))return{type:"adaptive",display:"summarized"};let r=Math.floor(t*f2),o=Math.max(1024,t-1-r),s=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.floor(e.budgetTokens):void 0,i=Math.min(Math.max(s??o,1024),o);if(s!==void 0&&s>o){let a=`think:${n??"default"}:${s}:${t}`;Ju.has(a)||(Ju.add(a),console.warn(`[afk] thinking budgetTokens ${s} leaves too little of max_tokens ${t} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:i,display:"summarized"}}}}function Ph(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[678]/.test(n))return"max"}var p2,m2,Ju,f2,Mh=C(()=>{"use strict";Sa();p2=e=>/opus-4-(7|[89])/.test(e),m2=.9;Ju=new Set,f2=.25});var Vu,Oh,$h,Uhe,ZR,QR,eA=C(()=>{"use strict";Vu=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
|
|
1516
1516
|
|
|
1517
1517
|
- Use read_file before editing to verify the exact content you want to change.
|
|
1518
1518
|
- Prefer edit_file over write_file for modifying existing files \u2014 write_file is for new files or complete rewrites.
|
|
@@ -1576,7 +1576,7 @@ ${Oh}
|
|
|
1576
1576
|
|
|
1577
1577
|
${$h}`,A=this.readOnlyMemory?QR:ZR,T=[x,A];T.push(ks({cwd:R,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:h.getWorkspace()})),w.length>0&&T.push(w),u&&T.push(u);let k=T.join(`
|
|
1578
1578
|
|
|
1579
|
-
`),_=[x,A];w.length>0&&_.push(w),u&&_.push(u),tA({prompt:t.prompt,options:{model:d,maxTokens:p,system:k},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 P;if(s==="oauth"&&!r){let U=this.providerFactory??Fh;P=async()=>{let j=await sf();if(!j)return null;let L=na(j,"oauth",n.baseUrl);return U?U(L):new nA(L)}}let $=n.sessionId??n.resume,F=XR(n.resumeHistory),I=this.externalTools?void 0:U=>{let j=this._currentCwd;if(this._sharedReadRoots&&j!==void 0&&j!==U){let M=this._sharedReadRoots.indexOf(j);M!==-1?this._sharedReadRoots[M]=U:this._sharedReadRoots.includes(U)||this._sharedReadRoots.push(U)}if(this._sharedWriteRoots&&j!==void 0&&j!==U){let M=this._sharedWriteRoots.indexOf(j);M!==-1?this._sharedWriteRoots[M]=U:this._sharedWriteRoots.includes(U)||this._sharedWriteRoots.push(U)}this._currentCwd=U,this.subagentExecutor?.setCwd(U),this.skillExecutor?.setCwd(U);let N=[_[0],_[1],ks({cwd:U,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:h.getWorkspace()}),..._.slice(2)].join(`
|
|
1579
|
+
`),_=[x,A];w.length>0&&_.push(w),u&&_.push(u),tA({prompt:t.prompt,options:{model:d,maxTokens:p,system:k},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 P;if(s==="oauth"&&!r){let U=this.providerFactory??Fh;P=async()=>{let j=await sf();if(!j)return null;let L=na(j,"oauth",n.baseUrl);return U?U(L):new nA(L)}}let $=n.sessionId??n.resume,F=XR(n.resumeHistory),I=this.externalTools?void 0:U=>{let j=this._currentCwd;if(this._sharedReadRoots&&j!==void 0&&j!==U){let M=this._sharedReadRoots.indexOf(j);M!==-1?this._sharedReadRoots[M]=U:this._sharedReadRoots.includes(U)||this._sharedReadRoots.push(U)}if(this._sharedWriteRoots&&j!==void 0&&j!==U){let M=this._sharedWriteRoots.indexOf(j);M!==-1?this._sharedWriteRoots[M]=U:this._sharedWriteRoots.includes(U)||this._sharedWriteRoots.push(U)}this._currentCwd=U,this.subagentExecutor?.setCwd(U),this.skillExecutor?.setCwd(U),this.composeExecutor?.setCwd(U);let N=[_[0],_[1],ks({cwd:U,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:h.getWorkspace()}),..._.slice(2)].join(`
|
|
1580
1580
|
|
|
1581
1581
|
`),D=this.buildDispatcher(this._currentPermissionMode,{cwd:U,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});return{userSystem:N,dispatcher:D}},B=Ph(n.effort,d);return new zu({client:l,authMode:r?"api-key":s,promptStream:t.prompt,toolDispatcher:g,...$!==void 0?{sessionId:$}:{},...F!==void 0?{initialMessages:F}:{},model:d,requestedModel:typeof n.model=="string"&&n.model.length>0?n.model:d,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:S,userSystem:k,systemPrefix:c,tokenRefresher:P,...n.thinking!==void 0?{thinking:Ih(n.thinking,p,d)}:{},...B!==void 0?{effort:B}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...I!==void 0?{cwdDependentsFactory:I}:{},onPermissionMode:U=>{this._currentPermissionMode=U},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...Ch(n.autoCompact)!==void 0?{autoCompactThreshold:Ch(n.autoCompact)}:{}})}};_2=new Ue});function P2(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??v.AFK_PROVIDER,r=t?.openaiBaseUrl??v.AFK_OPENAI_BASE_URL,o=P2(n);if(o)return o;let s=nf(e,t?.slots);if(s.provider==="anthropic")return"anthropic-direct";if(s.provider==="openai")return"openai-compatible";let i=s.id.trim().toLowerCase();return i&&(I2.has(i)||i.startsWith("claude-")||i.startsWith("claude_")||i.startsWith("local-")||i.startsWith("local_"))?"anthropic-direct":i&&(i.startsWith("gpt-")||i.startsWith("gpt_")||i.startsWith("o1")||i.startsWith("o3")||i.startsWith("o4")||i.startsWith("codex-")||i.startsWith("codex_")||i==="codex"||i.startsWith("deepseek-")||i.startsWith("deepseek_")||i.startsWith("mistral-")||i.startsWith("mistral_")||i.startsWith("mixtral-")||i.startsWith("mixtral_")||i.startsWith("llama-")||i.startsWith("llama_")||i.startsWith("qwen-")||i.startsWith("qwen_")||i.includes("/"))||s.baseUrl&&s.baseUrl.trim()||r&&r.trim()?"openai-compatible":"anthropic-direct"}function Xu(e,t){switch(re(e,t)){case"openai-compatible":case"openai-codex":return new Et;default:return new Ue}}var I2,Ve=C(()=>{"use strict";ko();xa();Dn();Jt();G();ko();xa();I2=new Set([...Object.keys(rf),"auto"])});var ti,Nh=C(()=>{"use strict";ti=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 Zu(e,t){let n=t??gs(),r=hs(e.model,n);if(!r)return;let o=n[r],s=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:(s==="openai-compatible"||o.baseUrl!==void 0)&&(e.apiKey=void 0),o.baseUrl!==void 0&&(s==="openai-compatible"?e.openaiBaseUrl=o.baseUrl:e.baseUrl=o.baseUrl)}var Bh=C(()=>{"use strict";Ve();Jt()});function M2(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(`
|
|
1582
1582
|
`)}var Qu,oA=C(()=>{"use strict";Nh();Bh();Ie();Qu=class{outerIterator;baseConfig;deps;currentModel;currentPermissionMode;currentCwd;startupFamily;active;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??[]]}buildInner(t,n){let r=this.deps.resolveProvider(t),o=new ti(()=>this.lastSessionId),s={...this.baseConfig};s.model=t??this.baseConfig.model;let i=r.name===this.startupFamily&&this.baseConfig.apiKey!==void 0?this.baseConfig.apiKey:this.deps.resolveApiKey(t);i!==void 0?s.apiKey=i:delete s.apiKey,Zu(s),this.currentPermissionMode!==void 0&&(s.permissionMode=this.currentPermissionMode),this.currentCwd!==void 0&&(s.cwd=this.currentCwd),n&&(s.resumeHistory=[...this.shadowHistory]);let a=r.query({prompt:o.createIterable(),config:s});return{family:r.name,query:a,iterator:a[Symbol.asyncIterator](),input:o}}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?`
|
|
@@ -1658,7 +1658,7 @@ ${i}`:s;n.push(`## ${o.id} [FAILED]
|
|
|
1658
1658
|
${a}`)}return e.skipped.length>0&&n.push(`## Skipped
|
|
1659
1659
|
${e.skipped.join(", ")}`),{content:n.join(`
|
|
1660
1660
|
|
|
1661
|
-
`),truncations:r}}function FA(e){if(e)try{let t=zh(Pn(),e,"compose");cq(t,{recursive:!0,force:!0})}catch{}}function gq(e){let t=`node "${e.nodeId}" output truncated: emitted ${e.emittedChars} of ${e.totalChars} chars`;return e.spillPath!==void 0?`${t}; full output at ${e.spillPath} (use read_file to retrieve)`:`${t}; full output unavailable (spill write failed)`}var Or=class{constructor(t){this.ctx=t}ctx;async execute(t){if(t.signal.aborted)return{content:"Compose tool call aborted",isError:!0};let n,r;try{({parsed:n,warnings:r}=dq(t.input))}catch(d){return{content:`Compose tool input validation failed: ${d instanceof Error?d.message:String(d)}`,isError:!0}}if(!this.ctx.resolveApiKeyForModel&&(!this.ctx.apiKey||this.ctx.apiKey.length===0))return{content:"Compose tool requires an API key (ctx.apiKey is missing or empty)",isError:!0};let o=n.max_tool_calls_per_node,s=new Map,i=new Set,a=$t(),l,c=(d,p)=>{if(a!==void 0)try{a(d,p)}catch{}if(!l||o===void 0||d.type!=="chunk"||d.chunk.type!=="tool_use_detail")return;let f=(s.get(p.subagentId)??0)+1;s.set(p.subagentId,f),f>o&&!i.has(p.subagentId)&&(i.add(p.subagentId),l.kill(p.subagentId).catch(()=>{}))};l=new oe({parentAbortSignal:t.signal,apiKey:this.ctx.apiKey,progressSink:c,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{}});let u=Date.now();De({event:"compose.started",parent_session_id:this.ctx.parentSession.sessionId,node_count:n.nodes.length,edge_count:n.edges?.length??0}).catch(()=>{});try{let d=t.id,p=n.nodes.length,f=n.nodes.map((T,k)=>{let _=T.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",P=re(typeof _=="string"?_:void 0),$=re(typeof this.ctx.defaultModel=="string"?this.ctx.defaultModel:void 0),F=P==="openai-compatible",I=this.ctx.apiKey!==void 0&&P===$,B=F?void 0:I?this.ctx.apiKey:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(_):this.ctx.apiKey;return{id:T.id,agentType:`${T.id} [${k+1}/${p}]`,parentId:d,systemPrompt:this.ctx.systemPrompt,promptBuilder:U=>{let j=Object.entries(U).map(([L,N])=>{let D=typeof N=="string"?N:JSON.stringify(N);return`<<<UPSTREAM_OUTPUT_BEGIN node="${L}">>>
|
|
1661
|
+
`),truncations:r}}function FA(e){if(e)try{let t=zh(Pn(),e,"compose");cq(t,{recursive:!0,force:!0})}catch{}}function gq(e){let t=`node "${e.nodeId}" output truncated: emitted ${e.emittedChars} of ${e.totalChars} chars`;return e.spillPath!==void 0?`${t}; full output at ${e.spillPath} (use read_file to retrieve)`:`${t}; full output unavailable (spill write failed)`}var Or=class{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;currentCwd;setCwd(t){this.currentCwd=t}async execute(t){if(t.signal.aborted)return{content:"Compose tool call aborted",isError:!0};let n,r;try{({parsed:n,warnings:r}=dq(t.input))}catch(d){return{content:`Compose tool input validation failed: ${d instanceof Error?d.message:String(d)}`,isError:!0}}if(!this.ctx.resolveApiKeyForModel&&(!this.ctx.apiKey||this.ctx.apiKey.length===0))return{content:"Compose tool requires an API key (ctx.apiKey is missing or empty)",isError:!0};let o=n.max_tool_calls_per_node,s=new Map,i=new Set,a=$t(),l,c=(d,p)=>{if(a!==void 0)try{a(d,p)}catch{}if(!l||o===void 0||d.type!=="chunk"||d.chunk.type!=="tool_use_detail")return;let f=(s.get(p.subagentId)??0)+1;s.set(p.subagentId,f),f>o&&!i.has(p.subagentId)&&(i.add(p.subagentId),l.kill(p.subagentId).catch(()=>{}))};l=new oe({parentAbortSignal:t.signal,apiKey:this.ctx.apiKey,progressSink:c,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.currentCwd!==void 0?{cwd:this.currentCwd}:{}});let u=Date.now();De({event:"compose.started",parent_session_id:this.ctx.parentSession.sessionId,node_count:n.nodes.length,edge_count:n.edges?.length??0}).catch(()=>{});try{let d=t.id,p=n.nodes.length,f=n.nodes.map((T,k)=>{let _=T.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",P=re(typeof _=="string"?_:void 0),$=re(typeof this.ctx.defaultModel=="string"?this.ctx.defaultModel:void 0),F=P==="openai-compatible",I=this.ctx.apiKey!==void 0&&P===$,B=F?void 0:I?this.ctx.apiKey:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(_):this.ctx.apiKey;return{id:T.id,agentType:`${T.id} [${k+1}/${p}]`,parentId:d,systemPrompt:this.ctx.systemPrompt,promptBuilder:U=>{let j=Object.entries(U).map(([L,N])=>{let D=typeof N=="string"?N:JSON.stringify(N);return`<<<UPSTREAM_OUTPUT_BEGIN node="${L}">>>
|
|
1662
1662
|
${D}
|
|
1663
1663
|
<<<UPSTREAM_OUTPUT_END node="${L}">>>`}).join(`
|
|
1664
1664
|
|
|
@@ -1739,7 +1739,7 @@ ${l}`):s,a=!1;for(let l of i){let c=await n.pushIfConfigured(l);if(c===null){e.w
|
|
|
1739
1739
|
`),process.exitCode=1;return}if(o.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
|
|
1740
1740
|
`),process.exitCode=1;return}let i=oJ("Initializing agent...").start(),a=null,l,c,u,d=!1,p,f=md(n.model),g=!1,h;try{if(n.worktree!==void 0)try{c=await Bc(n.worktree,n.worktreeBase!==void 0?{baseRef:n.worktreeBase}:void 0),u=c.path,i.text=`Worktree ready at ${c.path} (branch: ${c.branch})`}catch(ge){i.fail("Failed to create worktree"),q(ge)}let b,y,S,w,R,x;try{b=Ir(n.thinking)??Js(),y=Pr(n.effort)??Vs(),S=Ys(n.maxBudgetUsd)??ph(),w=Ys(n.taskBudget)??mh(),R=Xs(n.maxOutputTokens)??La(),x=void 0}catch(ge){i.fail("Invalid options"),q(ge)}if(n.dumpPrompt!==void 0){let ge=n.dumpPrompt===!0?KC.join(HC.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=ge,n.provider!==void 0&&n.provider!=="anthropic"&&n.provider!=="anthropic-direct"&&console.error(`[--dump-prompt] WARNING: active provider (${n.provider}) does not support prompt dumping. No file will be written.`)}let A=Ee(),{prompt:T,source:k}=zs(),_=bt(),P=_.autoRouting?.chat??!1,$=id(T,P,"one-shot"),F={},I=ui({resume:n.resume,continue:n.continue});if(n.resume&&I&&!I.stored){i.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
|
|
1741
1741
|
Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
1742
|
-
`),process.exitCode=1;return}I&&(F=di(I),d=!0,p=I.id),n.sessionId!==void 0&&(F={sessionId:n.sessionId},d=!0,p=n.sessionId);let B=I?.stored?.model??n.model,U=ys(B);if(U)throw new Error(U);f.model=B,I?.stored&&(f.totalTurns=I.stored.totalTurns,f.totalCostUsd=I.stored.totalCostUsd,f.totalTokens=I.stored.totalTokens,f.totalDurationMs=I.stored.totalDurationMs,f.turns=[...I.stored.turns],f.sessionId=I.stored.sessionId??I.resumeId,f.sessionStartTime=I.stored.startedAt??Date.now()),n.sessionId!==void 0&&(f.sessionId=n.sessionId);let j,L=ii();h=L?.tracePath;let N=new oe({apiKey:A,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},...u!==void 0?{cwd:u}:{}}),D=Ks(_.openaiBaseUrl!==void 0?{openaiBaseUrl:_.openaiBaseUrl}:{}),M={get sessionId(){return j?.sessionId},getInputStreamRef(){return j?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return j?.abortSignal??new AbortController().signal},get hookRegistry(){return j?.hookRegistry}},z=Ws(n.model,A,D,_.baseUrl,L?.writer,void 0,u,He),Y=new yn({subagentManager:N,parentSession:M,surface:"cli",defaultConfig:{apiKey:A,systemPrompt:T,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{}},defaultSubagentModel:Ht(n.model),childProviderFactory:D,childSkillExecutorFactory:z,resolveApiKeyForModel:He,depth:0,...u!==void 0?{cwd:u}:{}}),ne=new bn({parentSession:M,surface:"cli",defaultModel:n.model,defaultSubagentModel:Ht(n.model),apiKey:A,childProviderFactory:D,childSkillExecutorFactory:z,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},resolveApiKeyForModel:He,...L?.writer!==void 0?{traceWriter:L.writer}:{},...u!==void 0?{cwd:u}:{}}),X=new Or({parentSession:M,defaultModel:n.model,defaultSubagentModel:Ht(n.model),apiKey:A,resolveApiKeyForModel:He,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},systemPrompt:T??""});l=new Qe,x=Zs(n.provider,{subagentExecutor:Y,skillExecutor:ne,composeExecutor:X,memoryStore:l,model:String(n.model),..._.openaiBaseUrl!==void 0?{openaiBaseUrl:_.openaiBaseUrl}:{}})??new Ue({permissions:{allowedTools:[...Dt,...jn,...rt,"agent","skill","compose"]},subagentExecutor:Y,skillExecutor:ne,composeExecutor:X,memoryStore:l,surface:"cli"}),a=new dt(Vn({model:B,surface:"cli",apiKey:He(B),maxTurns:parseInt(n.maxTurns,10),isNonInteractive:!0,...n.dangerouslySkipPermissions?{permissionMode:"bypassPermissions"}:_.permissionMode!==void 0?{permissionMode:_.permissionMode}:{},hookRegistry:oi(ge=>{console.log(cd(ge))},"cli",l,void 0,ri({cwd:u}),{cwd:u}).registry,...$!==void 0?{systemPrompt:$}:{},...k!==void 0?{systemPromptSource:k}:{},...b!==void 0?{thinking:b}:{},...y!==void 0?{effort:y}:{},...S!==void 0?{maxBudgetUsd:S}:{},...w!==void 0?{taskBudget:w}:{},...R!==void 0?{maxOutputTokens:R}:{},..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},...L?{traceWriter:L.writer}:{},..._.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:_.autoResumeOnUsageLimit}:{},...u!==void 0?{cwd:u}:{},...F,provider:x})),j=a,i.text="Sending message...";let H=async(ge,Oe)=>{if(r.length===0||Oe)return;let it={line:le=>{process.stderr.write(`${le??""}
|
|
1742
|
+
`),process.exitCode=1;return}I&&(F=di(I),d=!0,p=I.id),n.sessionId!==void 0&&(F={sessionId:n.sessionId},d=!0,p=n.sessionId);let B=I?.stored?.model??n.model,U=ys(B);if(U)throw new Error(U);f.model=B,I?.stored&&(f.totalTurns=I.stored.totalTurns,f.totalCostUsd=I.stored.totalCostUsd,f.totalTokens=I.stored.totalTokens,f.totalDurationMs=I.stored.totalDurationMs,f.turns=[...I.stored.turns],f.sessionId=I.stored.sessionId??I.resumeId,f.sessionStartTime=I.stored.startedAt??Date.now()),n.sessionId!==void 0&&(f.sessionId=n.sessionId);let j,L=ii();h=L?.tracePath;let N=new oe({apiKey:A,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},...u!==void 0?{cwd:u}:{}}),D=Ks(_.openaiBaseUrl!==void 0?{openaiBaseUrl:_.openaiBaseUrl}:{}),M={get sessionId(){return j?.sessionId},getInputStreamRef(){return j?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return j?.abortSignal??new AbortController().signal},get hookRegistry(){return j?.hookRegistry}},z=Ws(n.model,A,D,_.baseUrl,L?.writer,void 0,u,He),Y=new yn({subagentManager:N,parentSession:M,surface:"cli",defaultConfig:{apiKey:A,systemPrompt:T,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{}},defaultSubagentModel:Ht(n.model),childProviderFactory:D,childSkillExecutorFactory:z,resolveApiKeyForModel:He,depth:0,...u!==void 0?{cwd:u}:{}}),ne=new bn({parentSession:M,surface:"cli",defaultModel:n.model,defaultSubagentModel:Ht(n.model),apiKey:A,childProviderFactory:D,childSkillExecutorFactory:z,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},resolveApiKeyForModel:He,...L?.writer!==void 0?{traceWriter:L.writer}:{},...u!==void 0?{cwd:u}:{}}),X=new Or({parentSession:M,defaultModel:n.model,defaultSubagentModel:Ht(n.model),apiKey:A,resolveApiKeyForModel:He,..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},...u!==void 0?{cwd:u}:{},systemPrompt:T??""});l=new Qe,x=Zs(n.provider,{subagentExecutor:Y,skillExecutor:ne,composeExecutor:X,memoryStore:l,model:String(n.model),..._.openaiBaseUrl!==void 0?{openaiBaseUrl:_.openaiBaseUrl}:{}})??new Ue({permissions:{allowedTools:[...Dt,...jn,...rt,"agent","skill","compose"]},subagentExecutor:Y,skillExecutor:ne,composeExecutor:X,memoryStore:l,surface:"cli"}),a=new dt(Vn({model:B,surface:"cli",apiKey:He(B),maxTurns:parseInt(n.maxTurns,10),isNonInteractive:!0,...n.dangerouslySkipPermissions?{permissionMode:"bypassPermissions"}:_.permissionMode!==void 0?{permissionMode:_.permissionMode}:{},hookRegistry:oi(ge=>{console.log(cd(ge))},"cli",l,void 0,ri({cwd:u}),{cwd:u}).registry,...$!==void 0?{systemPrompt:$}:{},...k!==void 0?{systemPromptSource:k}:{},...b!==void 0?{thinking:b}:{},...y!==void 0?{effort:y}:{},...S!==void 0?{maxBudgetUsd:S}:{},...w!==void 0?{taskBudget:w}:{},...R!==void 0?{maxOutputTokens:R}:{},..._.baseUrl!==void 0?{baseUrl:_.baseUrl}:{},...L?{traceWriter:L.writer}:{},..._.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:_.autoResumeOnUsageLimit}:{},...u!==void 0?{cwd:u}:{},...F,provider:x})),j=a,i.text="Sending message...";let H=async(ge,Oe)=>{if(r.length===0||Oe)return;let it={line:le=>{process.stderr.write(`${le??""}
|
|
1743
1743
|
`)},raw:le=>{process.stderr.write(le)},success:le=>{process.stderr.write(`\u2714 ${le}
|
|
1744
1744
|
`)},info:le=>{process.stderr.write(`\u2139 ${le}
|
|
1745
1745
|
`)},warn:le=>{process.stderr.write(`\u26A0 ${le}
|
|
@@ -1918,7 +1918,7 @@ ${K3(i)}
|
|
|
1918
1918
|
`),this.client=a,this.connected=!0,this.pendingAuthTransport=void 0;let l=await Fp(this.client.listTools(),s,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${s}ms`),()=>a.close().catch(()=>{})),c=this.client.getServerVersion();return{tools:l.tools,serverInfo:c?{name:c.name,version:c.version}:void 0}}async listTools(){if(!this.client)throw new Error(`McpClient(${this.serverName}): not connected`);let t=this.config.timeout??Tb;return(await Fp(this.client.listTools(),t,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${t}ms`))).tools}async refreshTools(){return this.listTools()}async callTool(t,n,r){if(!this.client)return{content:`MCP server "${this.serverName}" is not connected`,isError:!0};if(r.aborted)return{content:"Tool call aborted",isError:!0};let o=this.config.timeout??Tb,s;try{s=await this.client.callTool({name:t,arguments:n??{}},Y3,{signal:r,timeout:o})}catch(i){let a=i instanceof Error?i.message:String(i);return{content:`MCP tool "${this.serverName}.${t}" failed: ${a}`,isError:!0}}return X3(s)}async finishAuth(t){if(!this.pendingAuthTransport)throw new Error(`McpClient(${this.serverName}): no pending OAuth transport \u2014 server is not in oauth_pending state`);await this.pendingAuthTransport.finishAuth(t)}async disconnect(){if(this.pendingAuthTransport=void 0,!this.client)return;let t=this.client;this.client=void 0,this.connected=!1;try{await t.close()}catch{}}};function X3(e){let t=[];for(let r of e.content??[])if(r.type==="text")t.push(r.text);else if(r.type==="image")t.push(`[image block: mimeType=${r.mimeType}, ${r.data.length} bytes base64]`);else if(r.type==="resource"){let o="resource"in r&&typeof r.resource=="object"?r.resource.uri??"(unknown)":"(unknown)";t.push(`[resource block: ${o}]`)}else t.push(`[unknown block: ${JSON.stringify(r)}]`);let n=t.join(`
|
|
1919
1919
|
`);return{content:n.length===0?"(empty tool result)":n,...e.isError?{isError:!0}:{}}}function Z3(e,t,n){let r=t.type??(t.command?"stdio":"streamable-http");return{primary:Lp(e,t,n),fallback:r==="streamable-http"?()=>Lp(e,{...t,type:"sse"},n):null}}function Q3(e){return e instanceof k0&&(e.code===404||e.code===405)}function e6(e){return e instanceof k0?e.code:void 0}function Fp(e,t,n,r){let o=null,s=new Promise((i,a)=>{o=setTimeout(()=>{if(r!==void 0)try{let l=r();l&&typeof l.then=="function"&&l.catch(()=>{})}catch{}a(n())},t)});return Promise.race([e,s]).finally(()=>{o!==null&&clearTimeout(o)})}import{createHash as t6}from"node:crypto";var E0="mcp__",x0="__",Ab=64,n6=6;function hl(e){if(e.length===0)return"_";let n=e.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_{2,}/g,"_");return n.length===0?"_":n}function r6(e){return t6("sha256").update(e).digest("hex").slice(0,n6)}function T0(e,t){let n=hl(e),r=hl(t),o=`${E0}${n}${x0}${r}`;if(o.length<=Ab)return o;let i=`${`${E0}${r6(e)}${x0}`}${r}`;return i.length<=Ab?i:i.slice(0,Ab)}function yl(e){let t=new Map,n=new Map;for(let{serverName:o,toolNames:s}of e)for(let i of s){let a=T0(o,i),l={serverName:o,originalToolName:i},c=t.get(a);if(c===void 0){t.set(a,l);continue}if(c.serverName===o&&c.originalToolName===i)continue;let u=n.get(a)??[c];u.push(l),n.set(a,u)}let r=[];for(let[o,s]of n)r.push({wireName:o,pairs:s});return{tools:t,conflicts:r}}wt();var bl=class e{records;nameRegistry;onToolsRefreshed;constructor(t){this.records=t;let n=[];for(let[o,s]of t)s.state.status==="connected"&&n.push({serverName:o,toolNames:s.tools.map(i=>i.name)});let r=yl(n);if(r.conflicts.length>0){let o=r.conflicts.map(s=>{let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");return` ${s.wireName} \u2190 ${i}`});throw new Error(`MCP tool name conflicts (rename one of the servers in mcp.json):
|
|
1920
1920
|
${o.join(`
|
|
1921
|
-
`)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],s={manager:void 0};for(let[c,u]of Object.entries(t)){let d=hl(c);if(d!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${d}" for wire encoding`),u.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:u,status:"disabled",toolCount:0}});continue}let f={client:void 0,tools:[],state:{serverName:c,config:u,status:"connecting",toolCount:0}};r.set(c,f);let g=new Pi(c,u);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=Np(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{s.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{let b=Date.now();lt(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let y="error",S=0;try{let{tools:w,serverInfo:R}=await g.connect();f.tools=w,f.state.status="connected",f.state.toolCount=w.length,f.state.lastListedAt=Date.now(),y="connected",S=w.length;let x=R?`${R.name}@${R.version}`:"unknown";console.log(`[mcp:${c}] connected (${x}) \u2014 ${w.length} tool(s)`)}catch(w){if(w instanceof Rb){f.state.status="oauth_pending",y="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let R=w instanceof Error?w.message:String(w);if(f.state.status="error",f.state.error=Np(R,200),u.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${R}`);console.warn(`[mcp:${c}] connect failed: ${R}`)}finally{lt(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-b,metadata:{server:c,status:y,toolCount:S}})}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return s.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);if(!s||s.state.status!=="connected")continue;let i=s.tools.find(a=>a.name===o);i&&t.push(o6(n,i))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);!s||s.state.status!=="connected"||t.set(n,async(i,a)=>s.client?s.client.callTool(o,i,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[s,i]of this.nameRegistry)i.serverName===t&&this.nameRegistry.delete(s);let o=yl([{serverName:t,toolNames:r.map(s=>s.name)}]);if(o.conflicts.length>0)for(let s of o.conflicts){let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${s.wireName} \u2190 ${i}`)}for(let[s,i]of o.tools)this.nameRegistry.set(s,i);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new Pi(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=Np(i.message,200),console.warn(`[mcp:${t}] transport error: ${i.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:i,serverInfo:a}=await o.connect();r.tools=i,r.state.status="connected",r.state.toolCount=i.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${i.length} tool(s)`)}catch(i){let a=i instanceof Error?i.message:String(i);throw r.state.status="error",r.state.error=Np(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[i,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(i);let s=yl([{serverName:t,toolNames:r.tools.map(i=>i.name)}]);for(let[i,a]of s.tools)this.nameRegistry.set(i,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let s=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${s}`)}));await Promise.all(t)}};function o6(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Np(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}G();W();import{existsSync as Sl,lstatSync as s6,readFileSync as i6,readdirSync as a6}from"node:fs";import{join as wl}from"node:path";function Ko(){return wl(zt(),"mcp.json")}function R0(e=process.cwd()){return wl(e,".mcp.json")}var l6=5;function Cb(e=We()){if(!Sl(e))return[];let t=[];return A0(e,e,0,t,new Set),t}function A0(e,t,n,r,o){if(n>l6||o.has(t))return;o.add(t);let s=wl(t,".claude-plugin","plugin.json");if(Sl(s)){let a=wl(t,".claude-plugin","mcp.json");Sl(a)&&r.push(a);return}let i;try{i=a6(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=wl(t,a),c;try{c=s6(l)}catch{continue}c.isDirectory()&&A0(e,l,n+1,r,o)}}function c6(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(s=>typeof s=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let s={};for(let[i,a]of Object.entries(n.env))typeof a=="string"&&(s[i]=a);o.env=s}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let s={};for(let[i,a]of Object.entries(n.headers))typeof a=="string"&&(s[i]=a);o.headers=s}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),{ok:!0,config:o}}function Mi(e){if(!Sl(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(i6(e,"utf-8"))}catch(i){let a=i instanceof Error?i.message:String(i);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let s={};for(let[i,a]of Object.entries(o)){let l=c6(i,a);l.ok?s[i]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:s,sources:[e],warnings:t}}function _b(e={}){let t=[],n=[];if(e.importedMcpConfigs&&e.importedMcpConfigs.length>0)for(let a of e.importedMcpConfigs)t.push({path:a,loaded:Mi(a)});if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?Cb(a):Cb();for(let c of l)t.push({path:c,loaded:Mi(c)})}if(!e.skipUserGlobal){let a=Ko();t.push({path:a,loaded:Mi(a)})}if(!e.skipProjectLocal&&v.AFK_ALLOW_PROJECT_MCP!=="0"){let a=R0(e.cwd);Sl(a)&&(t.push({path:a,loaded:Mi(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:Mi(e.cliOverride)});let r=new Map,o=[...n],s=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)s.includes(l)||s.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let u=r.get(l);u&&o.push(`mcp: server "${l}" defined in ${u.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let i={};for(let[a,l]of r)i[a]=l.config;return{mcpServers:i,sources:s,warnings:o}}_d();po();wt();function Ib(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function vl(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${Ib(r)}`))}async function C0(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(i){let a=i instanceof Error?i.message:String(i);return{ok:!1,reason:`buildSession failed: ${Ib(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=Ib(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{vl(t.completionWriter,"new session close after init failure",a)});let i=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(m.warning(`\u26A0 ${i}`)),{ok:!1,reason:i}}await t.backgroundRegistry.cancelAll().catch(i=>{vl(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{vl(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(xd(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.permissionMode="default";try{t.onSwapped(e)}catch(i){vl(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await bp(n).catch(i=>{vl(t.completionWriter,"autoRegisterPluginPassthroughs failed",i)});let s=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&s.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&s.push(Xe(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(ie(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),Td(t.stats,t.completionWriter),t.statusLine.repaint(nr(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function _0(e){return new dt(Vn({model:e.model,surface:"cli",apiKey:He(e.model),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory}))}async function P0(e,t){let n=Date.now(),r=ui(e),o=di(r),s=r?.stored?.model??e.model,i=ys(s);if(i)throw new Error(i);let a,l,c;a=Ir(e.thinking)??Js(),l=Pr(e.effort)??Vs(),c=Xs(e.maxOutputTokens)??La();let{prompt:u,source:d}=zs(),p=bt(),f=p.autoRouting?.interactive??!0,g=id(u,f,"repl",oC()),h={current:null},b=Ee(),y=new oe({apiKey:b,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),S=r?.stored?.sessionId,w=ii(S?{sessionLabel:S}:{});lt(w?.writer,{phase:"bootstrap_start"});let R=new Tu(w?{traceWriter:w.writer}:{});nI(R);let A=p.bgSummaries===!0&&b?new $p({registry:R,apiKey:b,maxCallsPerSession:p.maxSummaryCallsPerSession??200}):void 0;A?.start(),rI(A);let T=Ks(p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{}),k={get sessionId(){return h.current?.sessionId},getInputStreamRef(){return h.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return h.current?.abortSignal??new AbortController().signal},get hookRegistry(){return h.current?.hookRegistry}},_=Ws(s,b,T,p.baseUrl,w?.writer,R,t?.cwd,He),P=new yn({subagentManager:y,parentSession:k,surface:"cli",defaultConfig:{apiKey:b,systemPrompt:u,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{}},defaultSubagentModel:Ht(s),childProviderFactory:T,childSkillExecutorFactory:_,backgroundRegistry:R,resolveApiKeyForModel:He,depth:0,...t?.cwd!==void 0?{cwd:t.cwd}:{}}),$=new bn({parentSession:k,surface:"cli",defaultModel:s,defaultSubagentModel:Ht(s),apiKey:b,childProviderFactory:T,childSkillExecutorFactory:_,backgroundRegistry:R,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},resolveApiKeyForModel:He,...w?.writer!==void 0?{traceWriter:w.writer}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),F=new Or({parentSession:k,defaultModel:s,defaultSubagentModel:Ht(s),apiKey:b,resolveApiKeyForModel:He,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},systemPrompt:u??""}),I=new Qe,B;{let Se=t?.cwd??process.cwd(),qt=uo(zn()).mcpConfigs.filter(_n=>_n.format==="json").map(_n=>_n.source),sn=_b({cwd:Se,...qt.length>0?{importedMcpConfigs:qt}:{},...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),Fl=Object.values(sn.mcpServers).filter(_n=>!_n.disabled).length;if(Fl>0){let _n=sn.sources.length===1?sn.sources[0]:`${sn.sources.length} source(s)`;console.log(m.dim(` mcp: ${Fl} server(s) from ${_n??Ko()}`));let _L=Date.now();lt(w?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Fl}});try{B=await bl.fromConfig(sn.mcpServers,{warnings:sn.warnings,...w?.writer!==void 0?{traceWriter:w.writer}:{}})}finally{lt(w?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-_L,metadata:{serverCount:Fl}})}}else if(sn.warnings.length>0)for(let _n of sn.warnings)console.warn(`[mcp] ${_n}`)}let U=B?.getMcpToolWireNames()??[],L=y0(Se=>Zs(e.provider,{subagentExecutor:P,skillExecutor:$,composeExecutor:F,memoryStore:I,model:Se!==void 0?Se:String(s),...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{},...B!==void 0?{mcpManager:B}:{}})??new Ue({permissions:{allowedTools:[...Dt,...jn,...rt,"agent","skill","compose",...U]},subagentExecutor:P,skillExecutor:$,composeExecutor:F,memoryStore:I,surface:"cli",...B!==void 0?{mcpManager:B}:{}}),Se=>e.provider??re(Se!==void 0?Se:String(s),p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:void 0)),N=L(String(s)),D=md(s);r?.stored&&xd(D,r.stored,r.resumeId);let M=e.dangerouslySkipPermissions?"bypassPermissions":p.permissionMode;M!==void 0&&(D.permissionMode=M),D.cwd=t?.cwd??process.cwd(),w&&console.log(m.dim(` trace: ${w.tracePath}`));let z={fn:Se=>console.log(Se),idleFn:Se=>console.log(Se)},Y=new Ed,ne=h0(process.stdout,{statusLine:Y}),X=oi(Se=>{z.fn(cd(Se))},"cli",I,()=>D.permissionMode,ri({cwd:t?.cwd}),{cwd:t?.cwd},()=>t?.cwd??process.cwd()),H=X.registry,fe=X.pathApprovalGrantRef,ce={model:s,resumeConfig:o,systemPrompt:g,systemPromptSource:d,thinking:a,effort:l,maxOutputTokens:c,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},providerFactory:L,hookRegistry:H,traceWriter:w?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:p.autoResumeOnUsageLimit,...M!==void 0?{permissionMode:M}:{}},ge=_0(ce);h.current=ge,y.setOnSubagentSucceeded((Se,qt)=>{h.current?.recordSubagentCompletion(Se,qt)});let Oe=new Mp,it=Ai(z),le=new Op(ge),Ne={session:h,stats:D,out:it,ui:{clearScreen:()=>{let Se=Ne.getCompositor?.();Se?.setOverlay(""),Se?.resetCommittedBand(),Y.stop(),le.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),Y.start(),Y.repaint(nr(D,le))},repaintStatusLine:()=>Y.repaint(nr(D,le))},ledger:Oe,...B!==void 0?{mcpManager:B}:{}},Gt=Se=>(Oe.clear(),C0(Se,{sessionRef:h,stats:D,contextSampler:le,statusLine:Y,backgroundRegistry:R,completionWriter:z,isInFlight:()=>Xr.getInFlight?.()??!1,onSwapped:qt=>{Xr.resumeTarget=qt,Xr.clearVerdictLedger?.()},buildSession:qt=>_0({...ce,model:qt.stored?.model??ce.model,resumeConfig:di(qt),permissionMode:D.permissionMode})})),Xr={session:h,memoryStore:I,stats:D,statusLine:Y,contextSampler:le,completionWriter:z,replRenderer:ne,slashCtx:Ne,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:R,subagentControl:P,...A!==void 0?{bgSummarizer:A}:{},requestResume:Gt,getInFlight:()=>!1,...B!==void 0?{mcpManager:B}:{},suggestApiKey:b,...p.openaiBaseUrl!==void 0?{suggestBaseUrl:p.openaiBaseUrl}:{},...p.interactive?.suggestGhost!==void 0?{suggestGhostConfig:p.interactive.suggestGhost}:{}},Bw=Se=>{z.fn(rM(Se,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},jw=Se=>{z.fn(nM(Se,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),Oe.record(Se)};Jx(Bw),qx(jw),Xr.teardownTrustedSkillEvents=()=>{Vx(Bw),zx(jw)},g0(),N instanceof Ue&&(iM(N),fe.current=N,GA(N));let xm=I0.createInterface({input:process.stdin,output:process.stdout,terminal:!1});Xr.rl=xm;let Tm={current:null};return Xr.inputSurfaceRef=Tm,vt.install(kd({readLine:Se=>new Promise((qt,sn)=>{xm.question(Se,qt),xm.once("close",()=>sn(new Error("readline closed")))}),writer:{line:(Se="")=>process.stdout.write(Se+`
|
|
1921
|
+
`)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],s={manager:void 0};for(let[c,u]of Object.entries(t)){let d=hl(c);if(d!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${d}" for wire encoding`),u.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:u,status:"disabled",toolCount:0}});continue}let f={client:void 0,tools:[],state:{serverName:c,config:u,status:"connecting",toolCount:0}};r.set(c,f);let g=new Pi(c,u);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=Np(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{s.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{let b=Date.now();lt(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let y="error",S=0;try{let{tools:w,serverInfo:R}=await g.connect();f.tools=w,f.state.status="connected",f.state.toolCount=w.length,f.state.lastListedAt=Date.now(),y="connected",S=w.length;let x=R?`${R.name}@${R.version}`:"unknown";console.log(`[mcp:${c}] connected (${x}) \u2014 ${w.length} tool(s)`)}catch(w){if(w instanceof Rb){f.state.status="oauth_pending",y="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let R=w instanceof Error?w.message:String(w);if(f.state.status="error",f.state.error=Np(R,200),u.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${R}`);console.warn(`[mcp:${c}] connect failed: ${R}`)}finally{lt(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-b,metadata:{server:c,status:y,toolCount:S}})}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return s.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);if(!s||s.state.status!=="connected")continue;let i=s.tools.find(a=>a.name===o);i&&t.push(o6(n,i))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);!s||s.state.status!=="connected"||t.set(n,async(i,a)=>s.client?s.client.callTool(o,i,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[s,i]of this.nameRegistry)i.serverName===t&&this.nameRegistry.delete(s);let o=yl([{serverName:t,toolNames:r.map(s=>s.name)}]);if(o.conflicts.length>0)for(let s of o.conflicts){let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${s.wireName} \u2190 ${i}`)}for(let[s,i]of o.tools)this.nameRegistry.set(s,i);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new Pi(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=Np(i.message,200),console.warn(`[mcp:${t}] transport error: ${i.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:i,serverInfo:a}=await o.connect();r.tools=i,r.state.status="connected",r.state.toolCount=i.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${i.length} tool(s)`)}catch(i){let a=i instanceof Error?i.message:String(i);throw r.state.status="error",r.state.error=Np(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[i,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(i);let s=yl([{serverName:t,toolNames:r.tools.map(i=>i.name)}]);for(let[i,a]of s.tools)this.nameRegistry.set(i,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let s=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${s}`)}));await Promise.all(t)}};function o6(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Np(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}G();W();import{existsSync as Sl,lstatSync as s6,readFileSync as i6,readdirSync as a6}from"node:fs";import{join as wl}from"node:path";function Ko(){return wl(zt(),"mcp.json")}function R0(e=process.cwd()){return wl(e,".mcp.json")}var l6=5;function Cb(e=We()){if(!Sl(e))return[];let t=[];return A0(e,e,0,t,new Set),t}function A0(e,t,n,r,o){if(n>l6||o.has(t))return;o.add(t);let s=wl(t,".claude-plugin","plugin.json");if(Sl(s)){let a=wl(t,".claude-plugin","mcp.json");Sl(a)&&r.push(a);return}let i;try{i=a6(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=wl(t,a),c;try{c=s6(l)}catch{continue}c.isDirectory()&&A0(e,l,n+1,r,o)}}function c6(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(s=>typeof s=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let s={};for(let[i,a]of Object.entries(n.env))typeof a=="string"&&(s[i]=a);o.env=s}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let s={};for(let[i,a]of Object.entries(n.headers))typeof a=="string"&&(s[i]=a);o.headers=s}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),{ok:!0,config:o}}function Mi(e){if(!Sl(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(i6(e,"utf-8"))}catch(i){let a=i instanceof Error?i.message:String(i);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let s={};for(let[i,a]of Object.entries(o)){let l=c6(i,a);l.ok?s[i]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:s,sources:[e],warnings:t}}function _b(e={}){let t=[],n=[];if(e.importedMcpConfigs&&e.importedMcpConfigs.length>0)for(let a of e.importedMcpConfigs)t.push({path:a,loaded:Mi(a)});if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?Cb(a):Cb();for(let c of l)t.push({path:c,loaded:Mi(c)})}if(!e.skipUserGlobal){let a=Ko();t.push({path:a,loaded:Mi(a)})}if(!e.skipProjectLocal&&v.AFK_ALLOW_PROJECT_MCP!=="0"){let a=R0(e.cwd);Sl(a)&&(t.push({path:a,loaded:Mi(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:Mi(e.cliOverride)});let r=new Map,o=[...n],s=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)s.includes(l)||s.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let u=r.get(l);u&&o.push(`mcp: server "${l}" defined in ${u.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let i={};for(let[a,l]of r)i[a]=l.config;return{mcpServers:i,sources:s,warnings:o}}_d();po();wt();function Ib(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function vl(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${Ib(r)}`))}async function C0(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(i){let a=i instanceof Error?i.message:String(i);return{ok:!1,reason:`buildSession failed: ${Ib(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=Ib(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{vl(t.completionWriter,"new session close after init failure",a)});let i=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(m.warning(`\u26A0 ${i}`)),{ok:!1,reason:i}}await t.backgroundRegistry.cancelAll().catch(i=>{vl(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{vl(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(xd(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.permissionMode="default";try{t.onSwapped(e)}catch(i){vl(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await bp(n).catch(i=>{vl(t.completionWriter,"autoRegisterPluginPassthroughs failed",i)});let s=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&s.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&s.push(Xe(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(ie(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),Td(t.stats,t.completionWriter),t.statusLine.repaint(nr(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function _0(e){return new dt(Vn({model:e.model,surface:"cli",apiKey:He(e.model),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory}))}async function P0(e,t){let n=Date.now(),r=ui(e),o=di(r),s=r?.stored?.model??e.model,i=ys(s);if(i)throw new Error(i);let a,l,c;a=Ir(e.thinking)??Js(),l=Pr(e.effort)??Vs(),c=Xs(e.maxOutputTokens)??La();let{prompt:u,source:d}=zs(),p=bt(),f=p.autoRouting?.interactive??!0,g=id(u,f,"repl",oC()),h={current:null},b=Ee(),y=new oe({apiKey:b,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),S=r?.stored?.sessionId,w=ii(S?{sessionLabel:S}:{});lt(w?.writer,{phase:"bootstrap_start"});let R=new Tu(w?{traceWriter:w.writer}:{});nI(R);let A=p.bgSummaries===!0&&b?new $p({registry:R,apiKey:b,maxCallsPerSession:p.maxSummaryCallsPerSession??200}):void 0;A?.start(),rI(A);let T=Ks(p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{}),k={get sessionId(){return h.current?.sessionId},getInputStreamRef(){return h.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return h.current?.abortSignal??new AbortController().signal},get hookRegistry(){return h.current?.hookRegistry}},_=Ws(s,b,T,p.baseUrl,w?.writer,R,t?.cwd,He),P=new yn({subagentManager:y,parentSession:k,surface:"cli",defaultConfig:{apiKey:b,systemPrompt:u,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{}},defaultSubagentModel:Ht(s),childProviderFactory:T,childSkillExecutorFactory:_,backgroundRegistry:R,resolveApiKeyForModel:He,depth:0,...t?.cwd!==void 0?{cwd:t.cwd}:{}}),$=new bn({parentSession:k,surface:"cli",defaultModel:s,defaultSubagentModel:Ht(s),apiKey:b,childProviderFactory:T,childSkillExecutorFactory:_,backgroundRegistry:R,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},resolveApiKeyForModel:He,...w?.writer!==void 0?{traceWriter:w.writer}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),F=new Or({parentSession:k,defaultModel:s,defaultSubagentModel:Ht(s),apiKey:b,resolveApiKeyForModel:He,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},systemPrompt:u??""}),I=new Qe,B;{let Se=t?.cwd??process.cwd(),qt=uo(zn()).mcpConfigs.filter(_n=>_n.format==="json").map(_n=>_n.source),sn=_b({cwd:Se,...qt.length>0?{importedMcpConfigs:qt}:{},...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),Fl=Object.values(sn.mcpServers).filter(_n=>!_n.disabled).length;if(Fl>0){let _n=sn.sources.length===1?sn.sources[0]:`${sn.sources.length} source(s)`;console.log(m.dim(` mcp: ${Fl} server(s) from ${_n??Ko()}`));let _L=Date.now();lt(w?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Fl}});try{B=await bl.fromConfig(sn.mcpServers,{warnings:sn.warnings,...w?.writer!==void 0?{traceWriter:w.writer}:{}})}finally{lt(w?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-_L,metadata:{serverCount:Fl}})}}else if(sn.warnings.length>0)for(let _n of sn.warnings)console.warn(`[mcp] ${_n}`)}let U=B?.getMcpToolWireNames()??[],L=y0(Se=>Zs(e.provider,{subagentExecutor:P,skillExecutor:$,composeExecutor:F,memoryStore:I,model:Se!==void 0?Se:String(s),...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{},...B!==void 0?{mcpManager:B}:{}})??new Ue({permissions:{allowedTools:[...Dt,...jn,...rt,"agent","skill","compose",...U]},subagentExecutor:P,skillExecutor:$,composeExecutor:F,memoryStore:I,surface:"cli",...B!==void 0?{mcpManager:B}:{}}),Se=>e.provider??re(Se!==void 0?Se:String(s),p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:void 0)),N=L(String(s)),D=md(s);r?.stored&&xd(D,r.stored,r.resumeId);let M=e.dangerouslySkipPermissions?"bypassPermissions":p.permissionMode;M!==void 0&&(D.permissionMode=M),D.cwd=t?.cwd??process.cwd(),w&&console.log(m.dim(` trace: ${w.tracePath}`));let z={fn:Se=>console.log(Se),idleFn:Se=>console.log(Se)},Y=new Ed,ne=h0(process.stdout,{statusLine:Y}),X=oi(Se=>{z.fn(cd(Se))},"cli",I,()=>D.permissionMode,ri({cwd:t?.cwd}),{cwd:t?.cwd},()=>t?.cwd??process.cwd()),H=X.registry,fe=X.pathApprovalGrantRef,ce={model:s,resumeConfig:o,systemPrompt:g,systemPromptSource:d,thinking:a,effort:l,maxOutputTokens:c,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},providerFactory:L,hookRegistry:H,traceWriter:w?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:p.autoResumeOnUsageLimit,...M!==void 0?{permissionMode:M}:{}},ge=_0(ce);h.current=ge,y.setOnSubagentSucceeded((Se,qt)=>{h.current?.recordSubagentCompletion(Se,qt)});let Oe=new Mp,it=Ai(z),le=new Op(ge),Ne={session:h,stats:D,out:it,ui:{clearScreen:()=>{let Se=Ne.getCompositor?.();Se?.setOverlay(""),Se?.resetCommittedBand(),Y.stop(),le.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),Y.start(),Y.repaint(nr(D,le))},repaintStatusLine:()=>Y.repaint(nr(D,le))},ledger:Oe,...B!==void 0?{mcpManager:B}:{}},Gt=Se=>(Oe.clear(),C0(Se,{sessionRef:h,stats:D,contextSampler:le,statusLine:Y,backgroundRegistry:R,completionWriter:z,isInFlight:()=>Xr.getInFlight?.()??!1,onSwapped:qt=>{Xr.resumeTarget=qt,Xr.clearVerdictLedger?.()},buildSession:qt=>_0({...ce,model:qt.stored?.model??ce.model,resumeConfig:di(qt),permissionMode:D.permissionMode})})),Xr={session:h,memoryStore:I,stats:D,statusLine:Y,contextSampler:le,completionWriter:z,replRenderer:ne,slashCtx:Ne,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:R,subagentControl:P,...A!==void 0?{bgSummarizer:A}:{},requestResume:Gt,getInFlight:()=>!1,...B!==void 0?{mcpManager:B}:{},suggestApiKey:b,...p.openaiBaseUrl!==void 0?{suggestBaseUrl:p.openaiBaseUrl}:{},...p.interactive?.suggestGhost!==void 0?{suggestGhostConfig:p.interactive.suggestGhost}:{}},Bw=Se=>{z.fn(rM(Se,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},jw=Se=>{z.fn(nM(Se,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),Oe.record(Se)};Jx(Bw),qx(jw),Xr.teardownTrustedSkillEvents=()=>{Vx(Bw),zx(jw)},g0(),N instanceof Ue&&(iM(N),fe.current=N,GA(N));let xm=I0.createInterface({input:process.stdin,output:process.stdout,terminal:!1});Xr.rl=xm;let Tm={current:null};return Xr.inputSurfaceRef=Tm,vt.install(kd({readLine:Se=>new Promise((qt,sn)=>{xm.question(Se,qt),xm.once("close",()=>sn(new Error("readline closed")))}),writer:{line:(Se="")=>process.stdout.write(Se+`
|
|
1922
1922
|
`)},pendingCount:()=>vt.pendingCount(),suspendInput:()=>Tm.current?.suspendForElicitation(),resumeInput:()=>Tm.current?.resumeAfterElicitation()})),Ne.requestResume=Gt,lt(w?.writer,{phase:"bootstrap_done",durationMs:Date.now()-n}),Xr}$s();W();import{promises as Pb}from"node:fs";import*as O0 from"node:path";async function M0(e,t,n=!1){await Pb.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=O0.join(e,`${r}.md`),s=n?" (continued)":"";return await Pb.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
|
|
1923
1923
|
|
|
1924
1924
|
- model: ${t}
|
|
@@ -1994,7 +1994,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
1994
1994
|
${R}${S}
|
|
1995
1995
|
${w}
|
|
1996
1996
|
${R}`})}return{fileBlocks:a,warnings:l}}async function sO(e,t,n,r,o="summary",s,i){let a=WI(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,u=!1,d=!1,p=!1,f=!1,g,h=!1,b=!1,y={abort:null},S=0,w=3e3,R=[],x=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,T=()=>{let I=r.subagentControl;I?.hasPromotableForeground()&&I.promoteActiveForeground().then(B=>{for(let U of B)(s??{fn:console.log}).fn(m.dim(` \u2192 subagent backgrounded as ${U.jobId}: ${U.label}`))}).catch(()=>{})},k=r.getCompositor?r.getCompositor():null,_=()=>new Ri({out:Ai(s),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(I=>{Be()&&console.error(" "+m.error("session.interrupt() failed:"),I)})},...r.subagentControl?{onBackground:T}:{},...i?.history?{history:i.history}:{},...i?.autocompleteState?{autocompleteState:i.autocompleteState}:{},...i?.promptText!==void 0?{promptText:i.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...k?{compositor:k}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=_(),$=async()=>{if(!p){p=!0;try{await P.dispose()}catch{}}},F=async()=>{await P.arm();let I=P.getCompositor();if(s&&I){let B=I;s.fn=U=>B.commitAbove(U)}r.setActiveCompositor?.(I),r.setInterruptNotifier?.(B=>P.setInterrupting(B)),r.rearmStatus?.()};try{k?k.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(N=>{Be()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),N)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(N=>{Be()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),N)})}),await F(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(T);let{fileBlocks:I,warnings:B}=oO(e.text,{rootDir:process.cwd()});for(let N of B)(s??{fn:console.log}).fn(m.dim(` @-file: ${N}`));let U=I.length>0||e.attachments.length>0?nO(e.text,e.attachments,void 0,I):e.text,j=t.sendMessageStream(U);if(await Ss((N,D)=>{P.process(N,D)},async()=>{for await(let N of j){if(h||b)break;if(N.type==="chunk"&&N.chunk.type==="content"?(l+=N.chunk.content,u=!0):N.type==="message"&&!u&&(l=N.message.content),N.type==="stream_retry"&&(l=l.slice(0,c)),N.type==="chunk"&&N.chunk.type==="tool_use_detail"){let D=N.chunk,M={toolName:D.toolName,toolUseId:D.toolUseId,input:D.toolInput,...D.toolInputRaw!==void 0&&{inputRaw:D.toolInputRaw}};x.set(D.toolUseId,M),R.push(M)}else if(N.type==="chunk"&&N.chunk.type==="tool_result"){let D=N.chunk;c=l.length;let M=x.get(D.toolUseId);if(M&&(M.result=D.content,M.isError=D.isError,x.delete(D.toolUseId)),r.onContextProgress){let z=Date.now();if(z-S>=w){S=z;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){Be()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),Y)}}}}if(N.type==="paused"){if(r.setPausedState?.(!0),await $(),k&&N.autoResume===!0){let D=new AbortController;y.abort=D;let M=N.resetsAt?N.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,z=M?`Keep waiting \u2014 auto-resumes at ${M}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",ne="Stop waiting",X=[m.warning(" \u23F3 Usage limit reached.")+(M?m.dim(` Auto-resumes at ${M}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Hp(k,{header:X,options:[z,Y,ne],signal:D.signal,initialIndex:0}).then(H=>{if(y.abort=null,!H)return;let fe=H[0];fe===void 0||fe===z||(b=!0,fe===Y&&(s??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(ce=>{Be()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),ce)}))}).catch(H=>{Be()&&console.error(" "+m.error("picker promise rejected:"),H)})}else(s??{fn:console.log}).fn(kS({reason:N.reason,...N.resetsAt!==void 0?{resetsAt:N.resetsAt}:{},...N.accountId!==void 0?{accountId:N.accountId}:{},...N.autoResume!==void 0?{autoResume:N.autoResume}:{}}));continue}if(N.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let D=N.hotSwapped&&N.accountId?`\u25B6 Resumed on ${N.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,R.length=0,x.clear(),f=!1,g=void 0,d=!1,P=_(),p=!1,await F(),(s??{fn:console.log}).fn(m.success(D));continue}if(N.type==="error"){await $(),ds(as(N.error)),d=!0;continue}P.process(N),N.type==="done"&&(f=!0,g=N.metadata)}}),await $(),h){let N=s?s.fn:console.log;N(m.warning("\u23F8 Stopped \u2014 work so far kept.")+m.dim(" Send a message to continue.")),N("")}if(b){let N=s?s.fn:console.log;N(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),N("")}if(f&&!h&&!b){Eo(n,a,l,g,R),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),bd(process.stdout);let N=M=>{s?s.fn(M):console.log(M)},D=eO(l);if(D){if(N(tO(D)),N(""),r.onTerminalState)try{r.onTerminalState(D)}catch{}n.permissionMode==="autonomous"&&h_(D)}if(sX(g,n,N),r.onAfterTurn){let M=r.onAfterTurn();M instanceof Promise&&await M.catch(()=>{})}}}catch(I){await $(),d||ds(as(I))}finally{await $(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function sX(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ye(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Xe(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(ie(o+s)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let i=ny(t),a=kt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);n(m.error(` context OVER ${c}k tok by ~${ie(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?m.error:m.warning;n(l(` context ${Math.round(i*100)}% used of ${ie(a)}`))}n("")}async function iX(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function iO(e,t,n,r,o,s,i,a){let{contextPane:l,loopStageBar:c,verdictLedger:u,shellPassthrough:d}=i,p=null,f=[];e.session.current.waitForInitialization().then(async y=>{Be()&&(p=Rd(y)),await bp(e.session.current),Be()&&(f=WM())}).catch(()=>{});let g,h=!1,b=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),f.length>0){for(let k of f)e.replRenderer.writeLine(k);e.replRenderer.writeLine(""),f=[]}let y=d.drainNotifications();for(let{job:k,result:_}of y){let P=_.errorReason===void 0?"\u2713":"\u2717",$=_.errorReason==="abort"?"killed":_.errorReason==="timeout"?"timed out":_.errorReason==="signal-killed"?"killed by signal":`exit ${_.exitCode??0}`,F=Math.max(0,Math.round(_.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${P} [${k.id}] ${$} \xB7 ${F}s \xB7 `)+k.command)}let S=l.renderIfChanged(e.stats.sessionId);if(S.length>0){for(let k of S)e.replRenderer.writeLine(k);e.replRenderer.writeLine("")}let w,R;if(g!==void 0){let k=g;g=void 0;let _=Oi(e.stats.model,e.stats.permissionMode),P=_o({buffer:k.text,promptText:_,isTTY:!!process.stdout.isTTY,attachmentSummary:wi([...k.attachments])});e.replRenderer.writeLine(P),w=k.text.trim(),R=k.attachments}else{let k=await o.readLine({promptFn:()=>Oi(e.stats.model,e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Kp(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});w=k.text.trim(),R=k.attachments}if(!w&&R.length===0)continue;if(w.startsWith("!")){let k=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!k&&(h||(h=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await d.dispatch(w))){e.statusLine.rearm();continue}}let x=!1;if(w.startsWith("/")){let k=await QC(w,e.slashCtx,R);if(k.handled){if(k.result==="exit"){e.rl.close();return}if((w==="/clear"||w.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),u.reset()),k.result!==null&&typeof k.result=="object"&&"kind"in k.result&&k.result.kind==="submit"){g={text:k.result.message,attachments:R??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}x=!0}a.push(w),await iX(e,w);let A=w;if(x){let k=ty(w);if(k){let _=k.name.replace(/^\//,"").split(":").pop()??"";if(_&&ub(_)){let P={skillName:_,rawArgs:k.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},$=e.session.current.sessionId,F=No($),I=Date.now();V(`[afk trace] preflight.start commandName=${_}`);let B=!1,U=await Fo(P,{cwd:e.stats.cwd??process.cwd(),artifactDir:F},j=>{Be()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${_}) failed: `)+(j instanceof Error?j.message:String(j)))});B=U!==null,V(`[afk trace] preflight.end commandName=${_} durationMs=${Date.now()-I} success=${B}`),A=pb(U?.manifestBlock,w)}}}let T=d.drainInjections();T.length>0&&(A=T+A),await sO({text:A,attachments:R},e.session.current,e.stats,{setInFlight(k){n.turnInFlight=k},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(k){await t.appendUser(k)},async onTurnComplete(k,_){if(await t.appendTurn(k,_),e.stats.sessionId)try{Sn(e.stats)}catch(P){b||(b=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(P instanceof Error?P.message:String(P))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:k=>u?.push(k),setActiveCompositor:k=>{n.activeCompositor=k},setInterruptNotifier:k=>{n.notifyInterrupting=k},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:k=>o.setBackgroundHandler(k),setSoftStopHandler:s,setPausedState:k=>o.setPausedState(k),setPauseInterruptHandler:k=>o.setPauseInterruptHandler(k),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(nr(e.stats,e.contextSampler))},...c?{onStageChange:k=>c.repaint(k)}:{}},e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Oi(e.stats.model,e.stats.permissionMode)))}}function aX(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 aO(e,t,n,r){let o=await N0(),s=new Up({rl:e.rl,history:o,statusLine:e.statusLine}),i=aX(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await W0(e,s,n,t,r,i,{getLoopStageBar:()=>a?.loopStageBar});a=Q0(e,n),await iO(e,t,n,r,s,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),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 s.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}ua();import{execFile as lX}from"node:child_process";import{dirname as cX,isAbsolute as uX,resolve as dX}from"node:path";import{promisify as pX}from"node:util";var lO=pX(lX),mX=3e3,fX=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function gX(){let t=(await lO("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=uX(t)?t:dX(process.cwd(),t);return cX(n)}async function cO(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await gX()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),mX)});try{let o=xn({execFile:lO,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>fX.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}lc();ua();import{promises as hX}from"node:fs";import{dirname as yX,join as pO}from"node:path";import{randomBytes as bX}from"node:crypto";var wX=["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(`
|
|
1997
|
-
`),uO=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,jb=30,SX=1024,vX=8e3,kX="haiku";async function EX(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=AX(n,SX),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??vX),i=t.signal?CX([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await bs({token:t.token,model:t.model??kX,system:wX,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=xX(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=yX(t.worktreePath);return await TX(l,c)}function xX(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(uO.test(t)&&t.length<=jb)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>jb)break;o=i}return uO.test(o)?o:null}async function TX(e,t){if(!await RX(pO(t,e)))return e;let n=bX(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,jb-5)}-${n}`}async function RX(e){try{return await hX.access(e),!0}catch{return!1}}function AX(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 CX(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 mO(e){let t,n,r=pO(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await EX(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}}),s=t??"unknown",i=n;if(o!==null){let l=`${Nc(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return dO(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return dO(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function dO(e,t){e&&e.setCwd(t),_X(t)}function _X(e){try{process.chdir(e)}catch{}}Ke();Nt();W();import{spawn as gO}from"child_process";import{existsSync as hO,mkdirSync as $X,readFileSync as yO,unlinkSync as fO,writeFileSync as DX}from"fs";import{get as LX}from"https";import{join as bO}from"path";import{readFileSync as IX}from"fs";import{dirname as PX,join as MX}from"path";import{fileURLToPath as OX}from"url";function lr(){try{return"4.27.
|
|
1997
|
+
`),uO=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,jb=30,SX=1024,vX=8e3,kX="haiku";async function EX(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=AX(n,SX),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??vX),i=t.signal?CX([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await bs({token:t.token,model:t.model??kX,system:wX,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=xX(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=yX(t.worktreePath);return await TX(l,c)}function xX(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(uO.test(t)&&t.length<=jb)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>jb)break;o=i}return uO.test(o)?o:null}async function TX(e,t){if(!await RX(pO(t,e)))return e;let n=bX(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,jb-5)}-${n}`}async function RX(e){try{return await hX.access(e),!0}catch{return!1}}function AX(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 CX(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 mO(e){let t,n,r=pO(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await EX(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}}),s=t??"unknown",i=n;if(o!==null){let l=`${Nc(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return dO(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return dO(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function dO(e,t){e&&e.setCwd(t),_X(t)}function _X(e){try{process.chdir(e)}catch{}}Ke();Nt();W();import{spawn as gO}from"child_process";import{existsSync as hO,mkdirSync as $X,readFileSync as yO,unlinkSync as fO,writeFileSync as DX}from"fs";import{get as LX}from"https";import{join as bO}from"path";import{readFileSync as IX}from"fs";import{dirname as PX,join as MX}from"path";import{fileURLToPath as OX}from"url";function lr(){try{return"4.27.2"}catch{}try{let e=PX(OX(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(IX(MX(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var FX=64*1024,NX=1440*60*1e3,BX=3600*1e3,jX="update-check.json",UX="pending-update.json";function wO(){return bO(Hl(),jX)}function xl(){return bO(Hl(),UX)}function SO(){let e=Hl();hO(e)||$X(e,{recursive:!0})}function HX(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),s=n(t).split(".").map(Number),i=Math.max(o.length,s.length);for(let a=0;a<i;a++){let l=o[a]??0,c=s[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function KX(){try{let e=yO(wO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function WX(){try{SO();let e=`
|
|
1998
1998
|
const https = require('https');
|
|
1999
1999
|
const fs = require('fs');
|
|
2000
2000
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|
|
@@ -2035,7 +2035,7 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
|
2035
2035
|
${vr}.`))}catch(i){qo(i.message)}}),t.command("unset <key>").description("Remove an afk.config.json key").option("--json","Output JSON").action((r,o)=>{try{let s=uu(r,{allowHumanOnly:!0});o.json?console.log(JSON.stringify({ok:!0,...s})):console.log(s.removed?m.success(`\u2713 removed ${s.path} \u2192 ${s.persistedTo}`):m.meta(`(${s.path} was not set)`))}catch(s){qo(s.message)}});let n=t.command("env").description("View or edit afk.env environment variables");n.command("get [key]").description("Read afk.env \u2014 one var or all present (secrets masked)").option("--all","Include every known var, not just those set").option("--json","Output JSON").action((r,o)=>{try{if(r){let s=su(r);o.json?console.log(JSON.stringify(s)):console.log(`${s.key} [${s.class}]: ${s.persisted??m.meta("(unset)")}`)}else{let s=iu({all:o.all});if(o.json)console.log(JSON.stringify(s,null,2));else for(let i of s)console.log(`${i.key} [${i.class}]: ${i.persisted??m.meta("(unset)")}`)}}catch(s){qo(s.message)}}),n.command("set <key> [value]").description("Set an afk.env var. Secret vars are prompted (masked) unless --stdin is given.").option("--stdin","Read the value from stdin (for scripted secret entry)").option("--json","Output JSON").action(async(r,o,s)=>{try{let i=Ms(r),a=o;if(i==="secret")s.stdin?a=_O():a=await Jp(`${r} (input hidden): `),o!==void 0&&console.error(m.warning(" note: positional value ignored for a secret var \u2014 use the prompt or --stdin"));else if(a===void 0)if(s.stdin)a=_O();else{qo(`${r} requires a value`);return}let l=ru(r,a??"",{allowSecret:!0,allowProtected:!0});s.json?console.log(JSON.stringify({ok:!0,...l})):console.log(m.success(`\u2713 ${l.key} = ${l.display} \u2192 ${l.persistedTo}
|
|
2036
2036
|
${vr}.`))}catch(i){qo(i.message)}}),n.command("unset <key>").description("Remove an afk.env var").option("--json","Output JSON").action((r,o)=>{try{let s=ou(r,{allowSecret:!0,allowProtected:!0});o.json?console.log(JSON.stringify({ok:!0,...s})):console.log(s.removed?m.success(`\u2713 removed ${s.key} \u2192 ${s.persistedTo}`):m.meta(`(${s.key} was not set)`))}catch(s){qo(s.message)}})}G();import C9 from"path";import _9 from"os";import{createServer as m9}from"node:http";import{writeFileSync as f9,unlinkSync as g9,mkdirSync as h9,readFileSync as y9}from"node:fs";import{dirname as b9,join as w9}from"node:path";G();import{mkdirSync as i9,appendFileSync as a9}from"node:fs";import{dirname as l9}from"node:path";import{execFile as c9}from"node:child_process";import{promisify as u9}from"node:util";import{randomUUID as d9}from"node:crypto";import*as WO from"node-cron";var Vp=class{_count=0;increment(){this._count++}decrement(){this._count>0&&this._count--}isIdle(){return this._count===0}count(){return this._count}};W();import{mkdirSync as MO,readdirSync as OO,readFileSync as QX,renameSync as e9,unlinkSync as $O,writeFileSync as t9}from"node:fs";import{randomBytes as PO}from"node:crypto";import{join as Gb}from"node:path";function DO(e,t={},n=an()){MO(n,{recursive:!0});let o=OO(n).filter(f=>f.endsWith(".json")).length+1,s=`q-${Date.now()}-${PO(3).toString("hex")}`,i=new Date().toISOString(),a={id:s,command:e,enqueuedAt:i,sequence:o,...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}},c=`${String(o).padStart(4,"0")}-${s}.json`,u=Gb(n,c),d=PO(4).toString("hex"),p=Gb(n,`.tmp-${d}.json`);try{t9(p,JSON.stringify(a),"utf-8"),e9(p,u)}catch(f){try{$O(p)}catch{}throw f}return a}function LO(e=an()){MO(e,{recursive:!0});let n=OO(e).filter(i=>i.endsWith(".json")&&!i.startsWith(".tmp-")).sort()[0];if(n===void 0)return null;let r=Gb(e,n),o=QX(r,"utf-8"),s=JSON.parse(o);return $O(r),s}W();qh();en();W();Yu();function FO(e){if(!e.taskId)throw new Error("ScheduledTask.taskId is required");if(!e.command)throw new Error(`task ${e.taskId}: command is required`);if((e.trigger==="cron"||e.trigger==="both")&&!e.cronExpression)throw new Error(`task ${e.taskId}: cronExpression required for trigger=${e.trigger}`);if(e.trigger==="pull"&&e.cronExpression!==void 0)throw new Error(`task ${e.taskId}: cronExpression must not be set when trigger='pull' \u2014 pull tasks are dequeued from the queue directory, not scheduled via cron`)}W();import{existsSync as NO,readFileSync as n9,readdirSync as r9}from"node:fs";var BO=360*60*1e3;function jO(){return rs()}function o9(e,t){if(!NO(t))return null;let n;try{n=n9(t,"utf-8")}catch{return null}let r=n.split(`
|
|
2037
2037
|
`);for(let o=r.length-1;o>=0;o-=1){let s=r[o];if(s)try{let i=JSON.parse(s);if(i.taskId!==e||typeof i.triggeredAt!="string")continue;let a=Date.parse(i.triggeredAt);if(Number.isNaN(a))continue;return a}catch{continue}}return null}function s9(e){if(!NO(e))return 0;try{return r9(e).filter(t=>!t.startsWith(".")).length}catch{return 0}}function UO(e){let t=o9(e.taskId,e.telemetryPath);if(t!==null&&e.cooldownMs>0){let r=e.nowMs-t;if(r<e.cooldownMs)return{fire:!1,skipReason:"cooldown",lastFiredAtMs:t,cooldownRemainingMs:e.cooldownMs-r}}let n=s9(e.briefsDir);return n>0?{fire:!1,skipReason:"briefs_pending",pendingBriefCount:n,...t!==null?{lastFiredAtMs:t}:{}}:{fire:!0,...t!==null?{lastFiredAtMs:t}:{}}}var HO=u9(c9);async function p9(e,t,n){if(n!==void 0&&n.length>0)return n;try{let o=(await e("git",["rev-parse","--show-toplevel"],{cwd:t})).stdout.trim();return o.length>0?o:null}catch{return null}}function KO(e){return`${e.replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"task"}-${d9()}`}var Yp=class{registry=new Map;options;defaultCooldownMs;briefsDir;now;idleDetector=new Vp;pullPollTimer;isDequeuing=!1;queueDir;constructor(t={}){this.options=t,this.defaultCooldownMs=t.cooldownMs??BO,this.briefsDir=t.briefsDir??jO(),this.now=t.now??Date.now,this.queueDir=t.queueDir??an(),this.ensureTelemetrySink()}register(t){if(FO(t),this.registry.has(t.taskId))throw new Error(`task ${t.taskId} is already registered`);let n;(t.trigger==="cron"||t.trigger==="both")&&(n=WO.schedule(t.cronExpression,()=>{this.runOnce(t,"cron").catch(()=>{})},{name:t.taskId})),this.registry.set(t.taskId,{task:t,cronTask:n})}unregister(t){let n=this.registry.get(t);n&&(n.cronTask&&(Promise.resolve(n.cronTask.stop()).catch(()=>{}),Promise.resolve(n.cronTask.destroy()).catch(()=>{})),this.registry.delete(t))}list(){return Array.from(this.registry.values()).map(t=>t.task)}async tick(t){let n=this.registry.get(t);if(!n)throw new Error(`task ${t} is not registered`);return this.runOnce(n.task,"cron")}async fireOnStart(){let t=Array.from(this.registry.values()).map(r=>r.task).filter(r=>r.trigger==="sessionstart"||r.trigger==="both"),n=[];for(let r of t){let o=r.debounceMs??this.defaultCooldownMs,s=UO({taskId:r.taskId,cooldownMs:o,nowMs:this.now(),telemetryPath:this.telemetryPath(),briefsDir:this.briefsDir});s.fire?n.push(await this.runOnce(r,"sessionstart")):n.push(this.recordSkip(r,s))}return n}async stop(){this.pullPollTimer!==void 0&&(clearInterval(this.pullPollTimer),this.pullPollTimer=void 0);for(let t of Array.from(this.registry.keys()))this.unregister(t)}startPullLoop(){if(this.pullPollTimer!==void 0)return;let t=this.options.pullPollIntervalMs;!t||t<=0||(this.pullPollTimer=setInterval(()=>{this.pullTick()},t).unref())}async pullTick(){if(this.idleDetector.isIdle()&&!this.isDequeuing){this.isDequeuing=!0;try{let t=LO(this.queueDir);if(t===null)return;let n={taskId:t.id,command:t.command,trigger:"pull",...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}};await this.runOnce(n,"pull")}catch{}finally{this.isDequeuing=!1}}}async runOnce(t,n){if(t.command==="__BUILTIN_WORKTREE_PRUNE__")return this.runBuiltinWorktreePrune(t,n);let r=new Date(this.now()),o=this.now(),s={taskId:t.taskId,command:Mr(t.command),trigger:n,...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString()},i=null,a=null;this.idleDetector.increment();try{let l=this.spawnSession(t.taskId);i=l.session,a=l.memoryStore;let c=await i.sendMessage(t.command),u=Mr(c.content),d={...s,durationMs:this.now()-o,status:"success",responseExcerpt:u.slice(0,280)};return this.writeTelemetry(d,t,{responseText:u}),d}catch(l){let c={...s,durationMs:this.now()-o,status:"error",errorMessage:Mr(l instanceof Error?l.message:String(l))};return this.writeTelemetry(c,t),c}finally{if(this.idleDetector.decrement(),i)try{await i.close()}catch{}a?.close()}}recordSkip(t,n){let r=new Date(this.now()),o={taskId:t.taskId,command:t.command,trigger:"sessionstart",...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString(),durationMs:0,status:"skipped",...n.skipReason!==void 0?{skipReason:n.skipReason}:{}};return this.writeTelemetry(o,t),o}async runBuiltinWorktreePrune(t,n){let r=new Date(this.now()),o=this.now(),s={taskId:t.taskId,command:t.command,trigger:n,...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString()};try{let i=await p9(HO,process.cwd(),v.AFK_WORKTREE_SWEEP_ROOT);if(i===null){let f={...s,durationMs:this.now()-o,status:"skipped",responseExcerpt:"worktree-prune skipped: daemon cwd is not inside a git repository (set AFK_WORKTREE_SWEEP_ROOT to target a repo)"};return this.writeTelemetry(f,t),f}let a=parseInt(v.AFK_WORKTREE_MAX_AGE_CLEAN??"",10)||14,l=parseInt(v.AFK_WORKTREE_MAX_AGE_DIRTY??"",10)||30,c=await xn({execFile:HO,repoRoot:i,dryRun:!1,maxAgeDaysClean:a,maxAgeDaysDirty:l,scope:"all",telemetryPath:this.telemetryPath()}),u=new Set(["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"]),d=c.dryRun?`\u{1F50D} worktree-prune (dry-run): would remove ${c.candidates.filter(f=>u.has(f.verdict)).length} worktree(s)`:`\u2702\uFE0F worktree-prune: removed ${c.removed.length}, warned ${c.warnings.length}`,p={...s,durationMs:this.now()-o,status:"success",responseExcerpt:d};return this.writeTelemetry(p,t),p}catch(i){let a={...s,durationMs:this.now()-o,status:"error",errorMessage:Mr(i instanceof Error?i.message:String(i))};return this.writeTelemetry(a,t),a}}spawnSession(t){let n=KO(t),r=this.options.sessionConfig?.cwd??process.cwd(),{registry:o,memoryStore:s}=oi(void 0,"daemon",void 0,void 0,ri({cwd:r}),{cwd:r,sessionId:n}),i=ii({sessionLabel:KO(t)}),a={model:"sonnet",permissionMode:"bypassPermissions",hookRegistry:o,isNonInteractive:!0,...i?{traceWriter:i.writer}:{},...this.options.sessionConfig};return{session:this.options.sessionFactory?this.options.sessionFactory(a):new dt(Vn(a)),memoryStore:s}}telemetryPath(){return this.options.telemetryPath??cr()}ensureTelemetrySink(){try{i9(l9(this.telemetryPath()),{recursive:!0})}catch{}}writeTelemetry(t,n,r){try{a9(this.telemetryPath(),`${JSON.stringify(t)}
|
|
2038
|
-
`,"utf-8"),this.fireOnTaskComplete(t,n,r)}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`[daemon] telemetry write failed: ${s}`)}}fireOnTaskComplete(t,n,r){let o=this.options.onTaskComplete;if(o&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let s=o(t,r);s instanceof Promise&&s.catch(i=>{let a=i instanceof Error?i.message:String(i);console.error(`[daemon] onTaskComplete callback failed: ${a}`)})}catch(s){let i=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${i}`)}}};W();var S9=7777,v9="127.0.0.1";async function GO(e={}){let t=new Yp({...e.sessionConfig!==void 0?{sessionConfig:e.sessionConfig}:{},...e.telemetryPath!==void 0?{telemetryPath:e.telemetryPath}:{},...e.sessionFactory!==void 0?{sessionFactory:e.sessionFactory}:{},...e.cooldownMs!==void 0?{cooldownMs:e.cooldownMs}:{},...e.briefsDir!==void 0?{briefsDir:e.briefsDir}:{},...e.now!==void 0?{now:e.now}:{},...e.onTaskComplete!==void 0?{onTaskComplete:e.onTaskComplete}:{},...e.pullPollIntervalMs!==void 0?{pullPollIntervalMs:e.pullPollIntervalMs}:{},...e.queueDir!==void 0?{queueDir:e.queueDir}:{}});e.pullPollIntervalMs!==void 0&&e.pullPollIntervalMs>0&&t.startPullLoop();for(let a of e.tasks??[])t.register(a);let n=e.writePortFile!==!1,r=w9(Gl("default"),"port"),o=m9((a,l)=>E9(a,l,t)),{port:s,address:i}=await T9(o,e.port??S9,e.host??v9);if(n)try{h9(b9(r),{recursive:!0}),f9(r,String(s),"utf-8")}catch{}return{port:s,host:i,scheduler:t,registerTask(a){t.register(a)},unregisterTask(a){t.unregister(a)},tickOnce(a){return t.tick(a)},fireOnStart(){return t.fireOnStart()},async stop(){if(await t.stop(),n)try{y9(r,"utf-8").trim()===String(s)&&g9(r)}catch{}await R9(o)}}}function k9(e){return new Promise((t,n)=>{let r=[];e.on("data",o=>r.push(o)),e.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),e.on("error",n)})}function E9(e,t,n){x9(e,t,n).catch(r=>{let o=r instanceof Error?r.message:String(r);t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:o}))})}async function x9(e,t,n){let r=e.url??"/";if(e.method==="GET"&&r==="/health"){let o=JSON.stringify({status:"ok",tasks:n.list().length});t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);return}if(e.method==="GET"&&r==="/tasks"){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(n.list()));return}if(e.method==="POST"&&r==="/tasks"){let o=await k9(e),s;try{s=JSON.parse(o)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"invalid JSON body"}));return}if(!s||typeof s!="object"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"body must be an object"}));return}let i=s,a=i.cron??i.cronExpression;if(typeof i.taskId!="string"||typeof i.command!="string"||typeof a!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron (or cronExpression) are required strings"}));return}let l={taskId:i.taskId,command:i.command,trigger:i.trigger??"cron",cronExpression:a,...i.notifyOn!==void 0?{notifyOn:i.notifyOn}:{}};try{n.register(l)}catch(c){let u=c instanceof Error?c.message:String(c),d=u.includes("already registered")?409:400;t.writeHead(d,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:u}));return}t.writeHead(201,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}if(e.method==="DELETE"&&r.startsWith("/tasks/")){let o=r.slice(7);if(!o){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId required in URL"}));return}if(!n.list().some(i=>i.taskId===o)){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}));return}n.unregister(o),t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function T9(e,t,n){return new Promise((r,o)=>{e.once("error",o),e.listen(t,n,()=>{e.removeListener("error",o);let s=e.address();r(typeof s=="object"&&s?{port:s.port,address:s.address}:{port:t,address:n})})})}function R9(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}W();mo();function qO(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<=0)throw new Error(`Invalid timeout-ms: '${n}' \u2014 must be a positive integer (milliseconds).`);return r}function zO(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<0)throw new Error(`Invalid sessionstart-cooldown-ms: '${n}' \u2014 must be a non-negative integer (milliseconds).`);return r}function JO(e,t){if(e!==void 0&&e!==""){if(e==="cron"||e==="sessionstart"||e==="both"||e==="pull")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both | pull.`)}return t!==void 0&&t!==""?"cron":"sessionstart"}var qb="/forge-friction --auto",zb="default";function Wr(e){if(e!==void 0&&e.trim()!=="")return e}function VO(e,t,n){return Wr(e)??Wr(t)??Wr(n)??qb}function YO(e,t,n){return Wr(e)??Wr(t)??Wr(n)??zb}var A9="127.0.0.1";function XO(e,t){return Wr(e)??Wr(t)??A9}function ZO(e){let t=e.trim().toLowerCase();return t==="127.0.0.1"||t==="localhost"||t==="::1"}Nt();Ke();Vc();Gs();en();qe();Pa();Ma();Rr();ko();cn();en();dn();function I9(e){let t;return n=>{let r=new AbortController,o=vo(r.signal),s=new oe({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),i=Ks(e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}),a=Ws(e.model,e.apiKey,i,e.baseUrl,void 0,void 0,e.cwd,He),l=new yn({subagentManager:s,parentSession:o,surface:"daemon",defaultConfig:{...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{}},defaultSubagentModel:Ht(e.model),childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:He,depth:0,...e.cwd!==void 0?{cwd:e.cwd}:{}}),c=new bn({parentSession:o,surface:"daemon",defaultModel:e.model,defaultSubagentModel:Ht(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:He,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),u=new Or({parentSession:o,defaultModel:e.model,defaultSubagentModel:Ht(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},resolveApiKeyForModel:He,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},systemPrompt:""});t??=new Qe;let d=Zs(void 0,{subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,model:String(e.model),...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}})??new Ue({permissions:{allowedTools:[...Dt,...jn,...rt,"agent","skill","compose"]},subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,surface:"daemon"});return new dt(Vn({...n,provider:d,isNonInteractive:!0,surface:"daemon"}))}}function P9(e,t={}){let n=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",r=(e.durationMs/1e3).toFixed(1),o=[`${n} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${r}s`];e.skipReason&&o.push(`skipReason=${e.skipReason}`),e.errorMessage&&o.push(`error: ${e.errorMessage.slice(0,400)}`);let s=t.responseText??e.responseExcerpt;return s&&o.push("",s),o.join(`
|
|
2038
|
+
`,"utf-8"),this.fireOnTaskComplete(t,n,r)}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`[daemon] telemetry write failed: ${s}`)}}fireOnTaskComplete(t,n,r){let o=this.options.onTaskComplete;if(o&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let s=o(t,r);s instanceof Promise&&s.catch(i=>{let a=i instanceof Error?i.message:String(i);console.error(`[daemon] onTaskComplete callback failed: ${a}`)})}catch(s){let i=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${i}`)}}};W();var S9=7777,v9="127.0.0.1";async function GO(e={}){let t=new Yp({...e.sessionConfig!==void 0?{sessionConfig:e.sessionConfig}:{},...e.telemetryPath!==void 0?{telemetryPath:e.telemetryPath}:{},...e.sessionFactory!==void 0?{sessionFactory:e.sessionFactory}:{},...e.cooldownMs!==void 0?{cooldownMs:e.cooldownMs}:{},...e.briefsDir!==void 0?{briefsDir:e.briefsDir}:{},...e.now!==void 0?{now:e.now}:{},...e.onTaskComplete!==void 0?{onTaskComplete:e.onTaskComplete}:{},...e.pullPollIntervalMs!==void 0?{pullPollIntervalMs:e.pullPollIntervalMs}:{},...e.queueDir!==void 0?{queueDir:e.queueDir}:{}});e.pullPollIntervalMs!==void 0&&e.pullPollIntervalMs>0&&t.startPullLoop();for(let a of e.tasks??[])t.register(a);let n=e.writePortFile!==!1,r=w9(Gl("default"),"port"),o=m9((a,l)=>E9(a,l,t)),{port:s,address:i}=await T9(o,e.port??S9,e.host??v9);if(n)try{h9(b9(r),{recursive:!0}),f9(r,String(s),"utf-8")}catch{}return{port:s,host:i,scheduler:t,registerTask(a){t.register(a)},unregisterTask(a){t.unregister(a)},tickOnce(a){return t.tick(a)},fireOnStart(){return t.fireOnStart()},async stop(){if(await t.stop(),n)try{y9(r,"utf-8").trim()===String(s)&&g9(r)}catch{}await R9(o)}}}function k9(e){return new Promise((t,n)=>{let r=[];e.on("data",o=>r.push(o)),e.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),e.on("error",n)})}function E9(e,t,n){x9(e,t,n).catch(r=>{let o=r instanceof Error?r.message:String(r);t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:o}))})}async function x9(e,t,n){let r=e.url??"/";if(e.method==="GET"&&r==="/health"){let o=JSON.stringify({status:"ok",tasks:n.list().length});t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);return}if(e.method==="GET"&&r==="/tasks"){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(n.list()));return}if(e.method==="POST"&&r==="/tasks"){let o=await k9(e),s;try{s=JSON.parse(o)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"invalid JSON body"}));return}if(!s||typeof s!="object"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"body must be an object"}));return}let i=s,a=i.cron??i.cronExpression;if(typeof i.taskId!="string"||typeof i.command!="string"||typeof a!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron (or cronExpression) are required strings"}));return}let l={taskId:i.taskId,command:i.command,trigger:i.trigger??"cron",cronExpression:a,...i.notifyOn!==void 0?{notifyOn:i.notifyOn}:{}};try{n.register(l)}catch(c){let u=c instanceof Error?c.message:String(c),d=u.includes("already registered")?409:400;t.writeHead(d,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:u}));return}t.writeHead(201,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}if(e.method==="DELETE"&&r.startsWith("/tasks/")){let o=r.slice(7);if(!o){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId required in URL"}));return}if(!n.list().some(i=>i.taskId===o)){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}));return}n.unregister(o),t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function T9(e,t,n){return new Promise((r,o)=>{e.once("error",o),e.listen(t,n,()=>{e.removeListener("error",o);let s=e.address();r(typeof s=="object"&&s?{port:s.port,address:s.address}:{port:t,address:n})})})}function R9(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}W();mo();function qO(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<=0)throw new Error(`Invalid timeout-ms: '${n}' \u2014 must be a positive integer (milliseconds).`);return r}function zO(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<0)throw new Error(`Invalid sessionstart-cooldown-ms: '${n}' \u2014 must be a non-negative integer (milliseconds).`);return r}function JO(e,t){if(e!==void 0&&e!==""){if(e==="cron"||e==="sessionstart"||e==="both"||e==="pull")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both | pull.`)}return t!==void 0&&t!==""?"cron":"sessionstart"}var qb="/forge-friction --auto",zb="default";function Wr(e){if(e!==void 0&&e.trim()!=="")return e}function VO(e,t,n){return Wr(e)??Wr(t)??Wr(n)??qb}function YO(e,t,n){return Wr(e)??Wr(t)??Wr(n)??zb}var A9="127.0.0.1";function XO(e,t){return Wr(e)??Wr(t)??A9}function ZO(e){let t=e.trim().toLowerCase();return t==="127.0.0.1"||t==="localhost"||t==="::1"}Nt();Ke();Vc();Gs();en();qe();Pa();Ma();Rr();ko();cn();en();dn();function I9(e){let t;return n=>{let r=new AbortController,o=vo(r.signal),s=new oe({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),i=Ks(e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}),a=Ws(e.model,e.apiKey,i,e.baseUrl,void 0,void 0,e.cwd,He),l=new yn({subagentManager:s,parentSession:o,surface:"daemon",defaultConfig:{...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{}},defaultSubagentModel:Ht(e.model),childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:He,depth:0,...e.cwd!==void 0?{cwd:e.cwd}:{}}),c=new bn({parentSession:o,surface:"daemon",defaultModel:e.model,defaultSubagentModel:Ht(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:He,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),u=new Or({parentSession:o,defaultModel:e.model,defaultSubagentModel:Ht(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},resolveApiKeyForModel:He,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},systemPrompt:""});t??=new Qe;let d=Zs(void 0,{subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,model:String(e.model),...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}})??new Ue({permissions:{allowedTools:[...Dt,...jn,...rt,"agent","skill","compose"]},subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,surface:"daemon"});return new dt(Vn({...n,provider:d,isNonInteractive:!0,surface:"daemon"}))}}function P9(e,t={}){let n=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",r=(e.durationMs/1e3).toFixed(1),o=[`${n} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${r}s`];e.skipReason&&o.push(`skipReason=${e.skipReason}`),e.errorMessage&&o.push(`error: ${e.errorMessage.slice(0,400)}`);let s=t.responseText??e.responseExcerpt;return s&&o.push("",s),o.join(`
|
|
2039
2039
|
`)}function QO(e){e.command("daemon").description("Run agent-afk as a daemon that fires scheduled tasks (e.g. /forge-friction --auto)").option("-p, --port <number>","Control HTTP port","7777").option("--host <address>","Bind address for the control HTTP surface. Overrides AFK_DAEMON_HOST. Defaults to 127.0.0.1 (loopback only). The control surface is UNAUTHENTICATED \u2014 bind a non-loopback address (e.g. 0.0.0.0) only on a trusted or firewalled network.").option("-t, --task <command>",`Command to fire on each tick (default: ${qb})`).option("-c, --cron <expression>",'Cron expression (e.g. "0 */6 * * *"). Required when --trigger includes cron.').option("-i, --task-id <id>",`Task identifier (default: ${zb})`).option("--once","Fire one tick and exit (for testing)",!1).option("--timeout-ms <ms>","Per-tick session timeout in ms. Overrides AFK_TIMEOUT_MS. Defaults to the session default (120000).").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--trigger <mode>","Trigger mode: cron | sessionstart | both | pull. Defaults to 'cron' when --cron is set, else 'sessionstart'.").option("--sessionstart-cooldown-ms <ms>","Cooldown between Phase 6 sessionstart fires. Overrides AFK_SESSIONSTART_COOLDOWN_MS. Defaults to 6h.").option("--briefs-dir <path>","Override directory scanned for pending briefs (defaults to ~/.afk/agent-framework/briefs).").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').action(async t=>{let n=parseInt(t.port,10);(Number.isNaN(n)||n<=0)&&q(new Error(`Invalid port: ${t.port}`));let r=bt(),o=VO(t.task,v.AFK_DAEMON_TASK,r.daemon?.task),s=YO(t.taskId,v.AFK_DAEMON_TASK_ID,r.daemon?.taskId),i=XO(t.host,v.AFK_DAEMON_HOST),a,l,c;try{a=qO(t.timeoutMs,v.AFK_TIMEOUT_MS),l=zO(t.sessionstartCooldownMs,v.AFK_SESSIONSTART_COOLDOWN_MS),c=JO(t.trigger,t.cron)}catch(P){q(P)}(c==="cron"||c==="both")&&!t.cron&&q(new Error(`--cron is required when --trigger is '${c}'.`));let u,d;try{u=Ir(t.thinking)??Js(),d=Pr(t.effort)??Vs()}catch(P){q(P)}let p=r.daemon?.worktreePrune,f=v.AFK_WORKTREE_PRUNE_DISABLE==="1",g=p?.cron??"0 4 * * *",h={taskId:"worktree-prune",command:"__BUILTIN_WORKTREE_PRUNE__",trigger:"cron",cronExpression:g},b=c==="pull"?[]:[{taskId:s,command:o,trigger:c,...t.cron!==void 0?{cronExpression:t.cron}:{}}];!f&&p?.enabled!==!1&&b.push(h);let y=Bt();for(let P of y)P.enabled&&b.push(Xk(P));if(t.dumpPrompt!==void 0&&t.dumpPrompt!==!1){let P=t.dumpPrompt===!0?C9.join(_9.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):t.dumpPrompt;process.env.AFK_DUMP_PROMPT=P}let S=0,w=6e4,R=(P,$)=>{let F=Date.now();if(F-S<w)return;S=F;let I=$ instanceof Error?`${$.name}: ${$.message}`:String($);wr(`\u{1F6D1} agent-afk daemon ${P}
|
|
2040
2040
|
${I.slice(0,500)}`).catch(B=>{console.error("[daemon] crash notification push failed:",B instanceof Error?B.message:String(B))})};process.on("uncaughtException",P=>{R("uncaughtException",P),process.exit(1)}),process.on("unhandledRejection",P=>{R("unhandledRejection",P),process.exit(1)});let x=v.AFK_DAEMON_CWD,A=pt(),T=Ee(),k=x!==void 0&&x.length>0?x:void 0,_=I9({model:A,...T!==void 0?{apiKey:T}:{},...r.baseUrl!==void 0?{baseUrl:r.baseUrl}:{},...r.openaiBaseUrl!==void 0?{openaiBaseUrl:r.openaiBaseUrl}:{},...k!==void 0?{cwd:k}:{}});try{let P=await GO({port:n,host:i,...t.once?{writePortFile:!1}:{},sessionConfig:{model:A,...T!==void 0?{apiKey:T}:{},...r.baseUrl!==void 0?{baseUrl:r.baseUrl}:{},...a!==void 0?{timeoutMs:a}:{},...u!==void 0?{thinking:u}:{},...d!==void 0?{effort:d}:{},...k!==void 0?{cwd:k}:{}},sessionFactory:_,...l!==void 0?{cooldownMs:l}:{},...t.briefsDir!==void 0?{briefsDir:t.briefsDir}:{},...c==="pull"?{pullPollIntervalMs:3e4,queueDir:an()}:{},tasks:b,onTaskComplete:(F,I)=>{wr(P9(F,I)).catch(()=>{})}});if(t.once){console.log(m.info(`\u25B6 Firing task '${s}' once...`));let F=await P.tickOnce(s);console.log(JSON.stringify(F,null,2)),await P.stop(),process.exit(F.status==="success"?0:1)}if(c==="sessionstart"||c==="both"){let F=await P.fireOnStart();for(let I of F){let B=I.status==="success"?"\u2714":I.status==="skipped"?"\u23ED":"\u2717";console.log(m.info(`${B} sessionstart: ${JSON.stringify(I)}`))}}console.log(m.success(`\u2714 Daemon listening on http://${P.host}:${P.port}`)),ZO(P.host)||console.log(m.warning(`\u26A0 Control surface bound to ${P.host} (non-loopback) and is UNAUTHENTICATED \u2014 anyone who can reach this port can schedule commands the daemon will run. Ensure the port is firewalled / on a trusted network.`)),c==="pull"?(console.log(m.success("\u2714 Daemon in pull mode")),console.log(m.dim(` polling queue: ${an()} every 30s`))):console.log(m.dim(` task='${s}' command='${o}' trigger='${c}'${t.cron?` cron='${t.cron}'`:""}`)),b.length>1&&console.log(m.meta(` + built-in: worktree-prune (cron: ${g})`)),console.log(m.dim(" Press Ctrl+C to stop."));let $=async()=>{console.log(m.dim(`
|
|
2041
2041
|
\xB7 Shutting down daemon...`)),await P.stop(),process.exit(0)};process.on("SIGINT",$),process.on("SIGTERM",$)}catch(P){q(P)}})}import{mkdirSync as M9}from"node:fs";import{join as O9}from"node:path";W();function e$(e){e.command("queue").description("Manage the pull-trigger task queue (used with `afk daemon --trigger pull`)").command("add <command>").description("Enqueue a command for the pull-trigger daemon to execute").option("--notify-on <mode>","When to send a notification: failure | always | never").action((n,r)=>{try{let o=an();M9(o,{recursive:!0});let s=r.notifyOn,i=DO(n,{notifyOn:s},o),a=String(i.sequence).padStart(4,"0"),l=O9(o,`${a}-${i.id}.json`);console.log(m.success(`\u2714 Queued task #${a} (id: ${i.id})`)),console.log(m.dim(` command: ${n}`)),console.log(m.dim(` file: ${l}`))}catch(o){q(o)}})}Ve();Ke();import $i from"chalk";import t$ from"chalk";W();Qc();function n$(){return Jp("Anthropic API key or OAuth token: ")}async function Xp(e){let t=e??await n$();t||(console.error(t$.red("No token provided. Nothing saved.")),process.exit(1));let n=at(),r,o;t.startsWith("sk-ant-oat")?(r="CLAUDE_CODE_OAUTH_TOKEN",o=["ANTHROPIC_API_KEY"]):(r="ANTHROPIC_API_KEY",o=["CLAUDE_CODE_OAUTH_TOKEN"]),Qt(n,r,t,o),console.log(t$.green(`\u2713 Saved ${r} to ${n}`)),console.log(m.meta("Restart any running afk daemon to pick up the new token."))}function r$(e){e.command("login [token]").description("Save an Anthropic API key or OAuth token for afk to use").action(async t=>{let n=re(pt());if(n==="openai-compatible"||n==="openai-codex"){console.log($i.yellow("`afk login` is Anthropic-only.")),console.log(""),console.log("For OpenAI-backed models (gpt-*, o1*, o3*, o4*, codex-*), authenticate with one of:"),console.log($i.cyan(" export OPENAI_API_KEY=sk-proj-...")),console.log($i.cyan(" # or: export CODEX_API_KEY=...")),console.log($i.cyan(" codex login --api-key sk-proj-...")),console.log(""),console.log($i.gray("Run `afk provider auth diagnose` to see which auth source AFK will use.")),console.log($i.gray("To save an Anthropic key for Claude models instead, re-run with AFK_MODEL=sonnet (or similar) first."));return}await Xp(t)})}import be from"chalk";import Zp from"ora";W();import{existsSync as $9}from"fs";import{join as D9}from"path";xt();Cr();async function Jb(e,t={},n={}){let r=n.pluginsDir??We(),o=n.indexPath??ue(),s=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},l=ke(o).plugins[e];if(!l)throw new Error(`plugin "${e}" is not installed`);let c=D9(r,e);if(!$9(c))return{name:e,status:"missing-dir",dir:c};if(Xn(),l.sourceType==="local")return{name:e,status:"skipped-local"};await vp(c,i);let u,d=!1;if(t.ref)u=t.ref;else{let x=await jr(c,i),A=Hr(x);A!==null?(u=A,d=!0):u=l.ref??await An(c,i)}let p=`refs/remotes/origin/${u}`,f=d?null:await kp(c,p,i),g=f!==null,h=await Rn(c,i);if(g?f===h:u===l.ref)return{name:e,status:"up-to-date",ref:u,commit:h,version:Lo(c).version};await Ur(c,g?p:d?`refs/tags/${u}`:u,{...i,force:!0});let y=await Rn(c,i),S=Lo(c).version,w=s().toISOString(),R={...l,ref:u,commit:y,updatedAt:w};return Ar(e,R,o),{name:e,status:"updated",fromRef:l.ref,toRef:u,commit:y,version:S}}async function o$(e={}){let t=e.indexPath??ue(),n=ke(t),r=[];for(let o of Object.keys(n.plugins))try{r.push(await Jb(o,{},e))}catch(s){let i=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:i})}return r}W();xt();import{existsSync as L9,lstatSync as F9,rmSync as N9,unlinkSync as B9}from"fs";import{join as j9}from"path";Cr();function s$(e,t={}){ir(e);let n=t.pluginsDir??We(),r=t.indexPath??ue(),o=j9(n,e),s=!1;U9(o)?(B9(o),s=!0):L9(o)&&(N9(o,{recursive:!0,force:!0}),s=!0);let i=ke(r),a=Object.prototype.hasOwnProperty.call(i.plugins,e);return a&&oT(e,r),Xn(),{name:e,removedDir:s,removedIndexEntry:a}}function U9(e){try{return F9(e).isSymbolicLink()}catch{return!1}}xt();W();function i$(e,t={}){let n=t.logger??console,r=t.pluginsDir??We(),o=t.indexPath??ue(),s={...t,pluginsDir:r,indexPath:o},i=e.command("plugin").description("Manage AFK plugins (install / update / list / remove / enable / disable)");i.command("install <source> [name]").description("Install a plugin from a git URL, owner/repo shorthand, local path, or <marketplace>:<plugin>").option("-r, --ref <ref>","Install a specific tag, branch, or SHA").option("-f, --force","Replace an existing plugin with the same name").option("-y, --yes","Skip the install warning and countdown (non-interactive / CI)").action(async(a,l,c)=>{let u;try{u=_i(a)}catch(f){Zp(`Installing ${a}\u2026`).start().fail("Failed"),q(f)}let d=process.stderr.isTTY===!0&&!c.yes;if(u.type==="marketplace-ref"){let f=Zp(`Installing ${u.marketplace}:${u.plugin}\u2026`).start();try{let g=await Ii(u.marketplace,u.plugin,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},{...s,confirm:d});f.succeed(be.green(`Installed ${be.bold(g.key)}`)+be.gray(` at ${g.dir}`))}catch(g){f.fail("Failed"),q(g)}return}let p=Zp(`Installing ${a}\u2026`).start();try{let f={...l?{name:l}:{},...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},g=await Tp(a,f,{...s,confirm:d});p.succeed(be.green(`Installed ${be.bold(g.name)}`)+be.gray(` at ${g.dir}${g.entry.ref?` (ref: ${g.entry.ref})`:""}`))}catch(f){p.fail("Failed"),q(f)}}),i.command("update [name]").description("Update one plugin, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(a,l)=>{try{if(a){let c=Zp(`Updating ${a}\u2026`).start(),u=await Jb(a,l.ref?{ref:l.ref}:{},s);K9(u,c)}else{n.log(be.cyan("Updating all plugins\u2026"));let c=await o$(s);if(c.length===0){n.log(be.gray(" (nothing installed)"));return}for(let u of c)n.log(" "+a$(u))}}catch(c){q(c)}}),i.command("list").description("List installed plugins with their source, version, and enabled state").option("-f, --format <format>","Output format (text|json)","text").action(a=>{let l=ke(o);if(a.format==="json"){let c=Object.entries(l.plugins).map(([u,d])=>({name:u,enabled:d.enabled,...d.ref?{ref:d.ref}:{},source:d.source}));n.log(JSON.stringify({plugins:c},null,2))}else H9(l,n)}),i.command("remove <name>").description("Remove a plugin (directory + index entry)").action(a=>{let l=s$(a,{pluginsDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry){n.log(be.gray(`No plugin named "${a}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null].filter(Boolean);n.log(be.green(`Removed ${a}: ${c.join(" + ")}`))}),i.command("enable <name>").description("Re-enable a previously disabled plugin").action(a=>{try{Qg(a,!0,o),n.log(be.green(`Enabled ${a}`))}catch(l){q(l)}}),i.command("disable <name>").description("Keep the plugin on disk but skip it from SDK init").action(a=>{try{Qg(a,!1,o),n.log(be.yellow(`Disabled ${a} (dir preserved at ${r}/${a})`))}catch(l){q(l)}})}function H9(e,t){let n=Object.keys(e.plugins).sort();if(n.length===0){t.log(be.gray("No plugins installed.")),t.log(be.gray(" Try: afk plugin install anthropics/claude-plugins-official"));return}t.log(be.cyan.bold(`
|