agent-afk 3.76.0 → 3.77.0

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.
Files changed (2) hide show
  1. package/dist/cli.mjs +39 -39
  2. package/package.json +2 -1
package/dist/cli.mjs CHANGED
@@ -53,9 +53,9 @@ ${r.title}`)),n.push(this.separator());for(let o of r.items)n.push(` ${o}`)}ret
53
53
  `)}formatStreaming(t){return this.useColors,t}},DY=new Wu;G();var Ug=(()=>{let e=T.AFK_USER_CARD_MAX_ROWS,t=e?Number.parseInt(e,10):NaN;return Number.isFinite(t)&&t>0?t:24})(),$C={plan:m.plan,status:m.info,checkpoint:m.success,diagnosis:m.warning},DC={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"};function Mn(e){let t=Array.isArray(e.body)?e.body:e.body.split(`
54
54
  `);if(e.kind==="user")return LC(t);let n=e.title??DC[e.kind];return FC(e.kind,n,t)}function LC(e){let t=Z(),n=Math.max(20,t-4),r=[];for(let i of e)r.push(...de(Pn(i),n).split(`
55
55
  `));let o=r;if(r.length>Ug){let i=Ug-1,a=r.length-i;o=[...r.slice(0,i),m.dim(`\u2026(${a} lines collapsed)`)]}let s=m.user("\u2502");return o.map(i=>{let a=q(i),l=Math.max(0,t-a-2);return" ".repeat(l)+i+" "+s}).join(`
56
- `)}function FC(e,t,n){let r=$C[e],o=n.map(Pn),s=Math.max(q(t)+4,...o.map(l=>q(l))),i=Math.max(40,s)+4,a=Math.min(i,Math.min(Z()-4,100));return a=Math.min(a,gt()),Qr(o,{border:r,title:t,width:a,padding:2})}function ye(e){let t=Math.min(Z(),120);if(e===void 0)return m.dim("\u2500".repeat(t));let n=m.dim("\u2500\u2500")+" "+m.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-q(r));return n+m.dim("\u2500".repeat(o))}G();function je(){return T.AFK_DEBUG==="1"||T.DEBUG==="1"}function V(...e){je()&&console.log(...e)}function eo(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(ia(e.userMessage,e.hint)+`
56
+ `)}function FC(e,t,n){let r=$C[e],o=n.map(Pn),s=Math.max(q(t)+4,...o.map(l=>q(l))),i=Math.max(40,s)+4,a=Math.min(i,Math.min(Z()-4,100));return a=Math.min(a,gt()),Qr(o,{border:r,title:t,width:a,padding:2})}function ye(e){let t=Math.min(Z(),120);if(e===void 0)return m.dim("\u2500".repeat(t));let n=m.dim("\u2500\u2500")+" "+m.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-q(r));return n+m.dim("\u2500".repeat(o))}G();function We(){return T.AFK_DEBUG==="1"||T.DEBUG==="1"}function V(...e){We()&&console.log(...e)}function eo(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(ia(e.userMessage,e.hint)+`
57
57
  `);else{let o=e.hint?` (${e.hint})`:"";r(`afk: error: ${e.userMessage}${o}
58
- `)}je()&&e.raw instanceof Error&&e.raw.stack&&r(e.raw.stack+`
58
+ `)}We()&&e.raw instanceof Error&&e.raw.stack&&r(e.raw.stack+`
59
59
  `)}function z(e){let t=Xr(e);eo(t),process.exit(t.exitCode)}import*as ok from"node:os";import*as sk from"node:path";async function Hu(e,t){if(e)try{await e.write({kind:"tool_call",payload:t})}catch(n){V(`trace.emit tool_call failed: ${on(n)}`)}}async function to(e,t){if(e)try{await e.write({kind:"hook_decision",payload:t})}catch(n){V(`trace.emit hook_decision failed: ${on(n)}`)}}async function ir(e,t){if(e)try{await e.write({kind:"subagent_lifecycle",payload:t})}catch(n){V(`trace.emit subagent_lifecycle failed: ${on(n)}`)}}async function no(e,t){if(e)try{await e.write({kind:"background_agent",payload:t})}catch(n){V(`trace.emit background_agent failed: ${on(n)}`)}}async function jg(e,t){if(e)try{await e.write({kind:"budget",payload:t})}catch(n){V(`trace.emit budget failed: ${on(n)}`)}}async function Wg(e,t){if(e)try{await e.write({kind:"abort",payload:t})}catch(n){V(`trace.emit abort failed: ${on(n)}`)}}async function Hg(e,t){if(e)try{await e.write({kind:"compaction",payload:t})}catch(n){V(`trace.emit compaction failed: ${on(n)}`)}}async function Kg(e,t){if(e)try{await e.write({kind:"closure",payload:t})}catch(n){V(`trace.emit closure failed: ${on(n)}`)}}async function Je(e,t){if(e)try{await e.write({kind:"session_phase",payload:t})}catch(n){V(`trace.emit session_phase failed: ${on(n)}`)}}function on(e){return e instanceof Error?e.message:String(e)}import bp from"path";import{appendFileSync as pF,mkdirSync as mF}from"fs";import{dirname as fF}from"path";import cS from"@anthropic-ai/sdk";var Gg="claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,extended-cache-ttl-2025-04-11",NC="effort-2025-11-24",BC="claude-cli/1.0.0 (external, cli)",UC="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;";function la(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function _s(e,t,n){let r=t==="oauth"?{authToken:e}:{apiKey:e};return typeof n=="string"&&n.length>0?{...r,baseURL:n}:r}function Nt(e,t,n,r){return e!=="oauth"?{}:{"anthropic-beta":r?`${Gg},${NC}`:Gg,"x-app":"cli","User-Agent":BC,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function zg(e){return e!=="oauth"?null:[{type:"text",text:UC}]}import jC from"@anthropic-ai/sdk";var ca={opus:"claude-opus-4-8",opus_1m:"claude-opus-4-8",sonnet:"claude-sonnet-4-6",sonnet_1m:"claude-sonnet-4-6",haiku:"claude-haiku-4-5-20251001"};function ua(e){return e in ca}function qg(e){let t=ca[e];if(!t)throw new Error(`Invalid model: ${e}`);return t}function sn(e){if(e!==void 0)return typeof e=="string"&&ua(e)?qg(e):e}import{randomUUID as Jg}from"node:crypto";async function ro(e){let{token:t,model:n,system:r,user:o,maxTokens:s=64,signal:i,clientFactory:a}=e;if(!t)throw new Error("oneShotCompletion: token required");let l=la(t),c=_s(t,l),u=a?a(c):new jC(c),d=Jg(),p=Jg(),f=Nt(l,d,p),g=sn(n)??n,h={};Object.keys(f).length>0&&(h.headers=f),i&&(h.signal=i);let b=await u.messages.create({model:g,max_tokens:s,system:r,messages:[{role:"user",content:o}]},Object.keys(h).length>0?h:void 0),y=[];for(let v of b.content)v.type==="text"&&y.push(v.text);let w=y.join("").trim();return w.length===0&&console.warn("oneShotCompletion: response contained no text blocks \u2014 returning empty string"),w}import{execFileSync as Vg}from"child_process";import{existsSync as WC,readFileSync as HC,writeFileSync as KC}from"fs";import{homedir as Yg,userInfo as Xg}from"os";import{join as Zg}from"path";var GC="9d1c250a-e61b-44d9-88ed-5944d1962f5e",zC="https://platform.claude.com/v1/oauth/token",qC=300*1e3;function Ve(){let e=Qg();if(e===void 0)return;let t=eh(e);if(t!==void 0){if(t.expiresAt!==void 0&&t.expiresAt<=Date.now()){process.stderr.write("agent-afk: Claude Code OAuth token in keychain is expired. Run `claude login` to refresh.\n");return}return t.accessToken}}async function Ku(){let e=Qg();if(e===void 0)return;let t=eh(e);if(t===void 0)return;if(t.expiresAt!==void 0&&t.expiresAt>Date.now()+qC)return t.accessToken;if(!t.refreshToken){process.stderr.write("agent-afk: OAuth token expired and no refresh token available. Run `claude login` to refresh.\n");return}let n=await JC(t.refreshToken);if(!n){process.stderr.write("agent-afk: OAuth token refresh failed. Run `claude login` to refresh.\n");return}try{let r={};try{r=JSON.parse(e)}catch{}let o=r.claudeAiOauth??{};r.claudeAiOauth={...o,accessToken:n.accessToken,expiresAt:n.expiresAt,...n.refreshToken!==void 0?{refreshToken:n.refreshToken}:{}},VC(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
60
60
  `)}return n.accessToken}function Qg(){if(process.platform==="darwin")try{return Vg("security",["find-generic-password","-s","Claude Code-credentials","-a",Xg().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let e=Zg(Yg(),".claude",".credentials.json");if(!WC(e))return;try{return HC(e,"utf-8")}catch{return}}}function eh(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!="object"||t===null)return;let n=t.claudeAiOauth;if(typeof n!="object"||n===null)return;let r=n,o=r.accessToken;if(typeof o!="string"||o.length===0)return;let s={accessToken:o},i=r.refreshToken;typeof i=="string"&&i.length>0&&(s.refreshToken=i);let a=r.expiresAt;return typeof a=="number"&&(s.expiresAt=a),s}async function JC(e){try{let t=await fetch(zC,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:e,client_id:GC})});if(!t.ok)return;let n=await t.json(),r=n.access_token,o=n.expires_in;if(typeof r!="string"||typeof o!="number")return;let s=n.refresh_token;return{accessToken:r,expiresAt:Date.now()+o*1e3,...typeof s=="string"&&s.length>0?{refreshToken:s}:{}}}catch{return}}function On(e){if(!e||e.length<3)return"token:(unknown)";try{let n=e.split(".");if(n.length<2)throw new Error("not a JWT");let r=Buffer.from(n[1],"base64url").toString("utf-8"),o=JSON.parse(r),s=typeof o.email=="string"&&o.email||typeof o.sub=="string"&&o.sub||typeof o.account_id=="string"&&o.account_id||typeof o.preferred_username=="string"&&o.preferred_username;if(s)return s}catch{}return`token:${e.length>=8?e.slice(-8):e}`}function VC(e){if(process.platform==="darwin")Vg("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",Xg().username,"-w",e],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let t=Zg(Yg(),".claude",".credentials.json");YC(t,e)}}function YC(e,t){KC(e,t,{encoding:"utf-8",mode:384})}import{randomUUID as sS}from"node:crypto";G();var XC="1h";function da(e){if(typeof e?.baseUrl=="string"&&e.baseUrl.length>0)return!1;let t=T.AFK_DISABLE_PROMPT_CACHE;if(t===void 0||t.length===0)return!0;let n=t.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function pa(){let e=T.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":e==="1h"?"1h":XC}function th(e,t){if(e.length===0)return e;let n=e[e.length-1],r=rh(n,t);return r===n?e:[...e.slice(0,-1),r]}function nh(e,t){if(e.length===0)return e;let n=e[e.length-1],r=ZC(n,t);return r===n?e:[...e.slice(0,-1),r]}function ZC(e,t){let n=e.content;if(typeof n=="string")return n.length===0?e:{...e,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:t}}]};if(!Array.isArray(n)||n.length===0)return e;let r=n[n.length-1],o=rh(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function rh(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}var Gu=["## Plan mode is active","","Write-class tools (`write_file`, `edit_file`, write-intent `bash`) are refused at the hook layer.","The user has asked you to plan, not yet to act. Treat this turn as planning work.","","Traverse the shape that matches the work \u2014 skip steps the terrain already covers, do not skip steps the terrain hides:",""," unknown field \u2192 ground the current terrain \u2192 gather missing codebase context \u2192"," research missing external context \u2192 reveal chaos / constraints / risks \u2192"," name the failure geometry \u2192 form a candidate plan \u2192 apply adversarial pressure \u2192 embody the final plan","","Reach for these skills (invoke via the `skill` tool) when the cost of skipping exceeds the cost of dispatching:"," - `ground-state` \u2014 survey git, infra, memory before non-trivial work"," - `gather` \u2014 parallel context-gathering for a code area"," - `research` \u2014 parallel external + local context for the current task"," - `devils-advocate` \u2014 generate alternatives and rank them before committing"," - `shadow-verify` \u2014 independently re-derive load-bearing claims","","Do not declare readiness silently. When the plan is ready, state: chosen approach, risks named, and alternatives considered. The user will exit plan mode (`/plan off`) when satisfied."].join(`
61
61
  `);function oh(e){return e!=="plan"?null:{type:"text",text:Gu}}import{z as Ee}from"zod";import{mkdir as Db,appendFile as Lb}from"fs/promises";import{join as Kd}from"path";var sh={"audit-fit":{"01-skill-inspector.md":`# Skill Inspector
@@ -1117,7 +1117,7 @@ CREATE INDEX IF NOT EXISTS idx_facts_session_id ON facts(session_id);
1117
1117
  -- uniqueness check (SQLite treats NULLs as distinct in UNIQUE indexes).
1118
1118
  CREATE UNIQUE INDEX IF NOT EXISTS idx_facts_fingerprint
1119
1119
  ON facts(content, created_at, COALESCE(session_id, ''), category);
1120
- `;function By(e){return Math.ceil(e.length/3.5)}var We=class{dir;db;constructor(t){this.dir=t??Yi(),Cy(this.dir,{recursive:!0}),Cy(St(this.dir,Oa),{recursive:!0}),this.db=new FM(St(this.dir,$y)),this.db.pragma("journal_mode = WAL"),this.db.pragma("busy_timeout = 5000");let n=this.db.pragma("user_version",{simple:!0});if(n===0)this.db.exec(KM),this.db.pragma(`user_version = ${Ns}`);else if(n!==Ns)if(n<Ns)if(n===1)this.db.exec(`
1120
+ `;function By(e){return Math.ceil(e.length/3.5)}var He=class{dir;db;constructor(t){this.dir=t??Yi(),Cy(this.dir,{recursive:!0}),Cy(St(this.dir,Oa),{recursive:!0}),this.db=new FM(St(this.dir,$y)),this.db.pragma("journal_mode = WAL"),this.db.pragma("busy_timeout = 5000");let n=this.db.pragma("user_version",{simple:!0});if(n===0)this.db.exec(KM),this.db.pragma(`user_version = ${Ns}`);else if(n!==Ns)if(n<Ns)if(n===1)this.db.exec(`
1121
1121
  DELETE FROM facts
1122
1122
  WHERE id NOT IN (
1123
1123
  SELECT MIN(id)
@@ -1176,20 +1176,20 @@ ${s}`}}}return{...e,systemPrompt:r}}function Ed(e,t="cli"){return n=>{if(n.event
1176
1176
  `+Gu});let r=Ky(),o={model:this.currentModel,messages:n,stream:!0,stream_options:{include_usage:!0}};this.openAITools&&this.openAITools.length>0&&(o.tools=this.openAITools);let s;try{s=await this.client.chat.completions.create(o,{signal:t.signal})}catch(i){return t.signal.aborted||(yield{type:"error",error:i instanceof Error?i:new Error(String(i))}),null}try{for await(let i of s){if(this.closed)return null;for(let a of Gy(i,r,this.initSessionId))yield a}}catch(i){return t.signal.aborted||(yield{type:"error",error:i instanceof Error?i:new Error(String(i))}),null}return{state:r,events:[],text:r.assistantText,needsToolDispatch:qy(r)&&r.toolCallsByIndex.size>0}}async*dispatchAndAppend(t,n){if(!this.toolDispatcher)return;let r=_d(t),{calls:o,parseErrors:s}=Vy(r,n);for(let a of o)yield{type:"tool.use.start",toolUseId:a.id,toolName:a.name,toolInput:fO(a.input),sessionId:this.initSessionId};let i=[];if(n.aborted)for(let a of o){let l={content:"Tool call aborted",isError:!0};i.push({call:a,result:l}),yield{type:"tool.output",toolUseId:a.id,toolName:a.name,content:l.content,isError:!0,sessionId:this.initSessionId}}else{let a;try{if(this.toolDispatcher.executeBatch)a=await this.toolDispatcher.executeBatch(o);else{a=[];for(let l of o){if(n.aborted){a.push({content:"Tool call aborted",isError:!0});continue}try{a.push(await this.toolDispatcher.execute(l))}catch(c){let u=c instanceof Error?c.message:String(c);a.push({content:`Tool execution threw: ${u}`,isError:!0})}}}}catch(l){let c=l instanceof Error?l.message:String(l);a=o.map(()=>({content:`Tool batch execution failed: ${c}`,isError:!0}))}for(let l=0;l<o.length;l++){let c=o[l],u=a[l],d=s.get(c.id);d!==void 0&&(u={content:`${d}
1177
1177
  --
1178
1178
  ${u.content}`,isError:!0,...u.truncated===!0?{truncated:!0}:{}}),i.push({call:c,result:u}),yield{type:"tool.output",toolUseId:c.id,toolName:c.name,content:u.content,...u.isError===!0?{isError:!0}:{},...u.truncated===!0?{truncated:!0}:{},sessionId:this.initSessionId},u.render?.diff&&(yield{type:"tool.diff",toolUseId:c.id,diff:u.render.diff,sessionId:this.initSessionId})}}this.priorTurns.push(Yy(t.assistantText,r,t.reasoningText));for(let a of Xy(i))this.priorTurns.push(a)}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){t!==void 0&&(this.currentModel=t)}async setPermissionMode(t){this.currentPermissionMode=Qy(t)}setCwd(t){this.toolDispatcher?.setResolveBase?.(t)}async supportedCommands(){try{return mn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return[{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=lt(this.currentModel),r;if(t&&n>0){let i=uo(t);r=Math.min(100,Math.max(0,i/n*100))}let{totalTokens:o,apiUsage:s}=$a(t);return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:s,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(t,n){return{canRewind:!1,error:`${Cd} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),V(`\u{1F7E2} ${Cd}: closed`)}};function mO(e){let t={apiKey:e.apiKey};return e.baseURL!==void 0&&(t.baseURL=e.baseURL),new cO(t)}function fO(e){if(!e||typeof e!="object")return"";let t=e,n=t.file_path??t.path??t.filePath;if(typeof n=="string")return" "+n;let r=t.command??t.cmd;if(typeof r=="string"){let s=r.split(`
1179
- `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=t.query??t.pattern??t.url??t.description;return typeof o=="string"?" "+o:""}function eb(e,t,n={}){let r=gr(e.apiKey),o=e.resume??`openai-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s=typeof e.model=="string"?e.model:"gpt-4o-mini",i={auth:r,model:s,synthesizedSessionId:o,promptStream:t,config:e};return n.baseURL!==void 0&&(i.baseURL=n.baseURL),n.toolDispatcher!==void 0&&(i.toolDispatcher=n.toolDispatcher),n.mcpManager!==void 0&&(i.mcpManager=n.mcpManager),new Da(i)}import gO from"openai";var hO=null;async function tb(e){let{apiKey:t,baseURL:n,model:r,system:o,user:s,maxTokens:i=64,signal:a,clientFactory:l}=e,c=gr(t);if(c.apiKey===null)throw new Error("oneShotChatCompletion: no usable OpenAI auth (set OPENAI_API_KEY or pass apiKey)");let u={apiKey:c.apiKey};n!==void 0&&(u.baseURL=n);let d=l??hO,p=d?d(u):new gO(u),f=r.includes("/")?r.slice(r.lastIndexOf("/")+1):r,g=/^o[0-9]/.test(f)?{max_completion_tokens:i}:{max_tokens:i},b=(await p.chat.completions.create({model:r,...g,stream:!1,messages:[{role:"system",content:o},{role:"user",content:s}]},a?{signal:a}:void 0)).choices?.[0]?.message?.content;return typeof b=="string"?b.trim():""}var Pd="openai-compatible",_t=class{name=Pd;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_presenceSessionId=null;constructor(t={}){this.providerOpts=t,this.memoryStore=t.memoryStore??new We;let n=[...an];t.subagentExecutor&&n.push(lr),t.skillExecutor&&n.push(cr),t.composeExecutor&&n.push(ur),t.readOnlyMemory===!0?n.push(so):n.push(...Dn),n.push(Ut),this.schemas=n}query(t){let n=t.config,r=n.permissionMode??"default";this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,s=typeof n.model=="string"?n.model:String(n.model),i=Ps({surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),modelName:s,providerName:Pd,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof un?o.toolDefs.map(p=>p.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?Ms(this.providerOpts.tools,i):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:i,...n.isSkillDispatch?{isSkillDispatch:!0}:{}});let a={};if(this.providerOpts.baseURL!==void 0&&(a.baseURL=this.providerOpts.baseURL),a.toolDispatcher=o,this.providerOpts.mcpManager!==void 0&&(a.mcpManager=this.providerOpts.mcpManager),(n.depth===void 0||n.depth===0)&&n.parentSessionId===void 0&&n.sessionId!==void 0&&this._presenceSessionId===null){this._presenceSessionId=n.sessionId;let p=n.sessionId,f=i.getWorkspace();Os({sessionId:p,surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:Pd,name:s},workspace:f,pid:process.pid}),process.once("exit",()=>{cn(p)}),process.once("SIGINT",()=>{cn(p),process.exit(130)}),process.once("SIGTERM",()=>{cn(p),process.exit(143)})}let c=io({cwd:n.cwd??process.cwd(),...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:i.getWorkspace()}),u=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,d={...n,systemPrompt:u!==void 0?`${u}
1179
+ `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=t.query??t.pattern??t.url??t.description;return typeof o=="string"?" "+o:""}function eb(e,t,n={}){let r=gr(e.apiKey),o=e.resume??`openai-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s=typeof e.model=="string"?e.model:"gpt-4o-mini",i={auth:r,model:s,synthesizedSessionId:o,promptStream:t,config:e};return n.baseURL!==void 0&&(i.baseURL=n.baseURL),n.toolDispatcher!==void 0&&(i.toolDispatcher=n.toolDispatcher),n.mcpManager!==void 0&&(i.mcpManager=n.mcpManager),new Da(i)}import gO from"openai";var hO=null;async function tb(e){let{apiKey:t,baseURL:n,model:r,system:o,user:s,maxTokens:i=64,signal:a,clientFactory:l}=e,c=gr(t);if(c.apiKey===null)throw new Error("oneShotChatCompletion: no usable OpenAI auth (set OPENAI_API_KEY or pass apiKey)");let u={apiKey:c.apiKey};n!==void 0&&(u.baseURL=n);let d=l??hO,p=d?d(u):new gO(u),f=r.includes("/")?r.slice(r.lastIndexOf("/")+1):r,g=/^o[0-9]/.test(f)?{max_completion_tokens:i}:{max_tokens:i},b=(await p.chat.completions.create({model:r,...g,stream:!1,messages:[{role:"system",content:o},{role:"user",content:s}]},a?{signal:a}:void 0)).choices?.[0]?.message?.content;return typeof b=="string"?b.trim():""}var Pd="openai-compatible",_t=class{name=Pd;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_presenceSessionId=null;constructor(t={}){this.providerOpts=t,this.memoryStore=t.memoryStore??new He;let n=[...an];t.subagentExecutor&&n.push(lr),t.skillExecutor&&n.push(cr),t.composeExecutor&&n.push(ur),t.readOnlyMemory===!0?n.push(so):n.push(...Dn),n.push(Ut),this.schemas=n}query(t){let n=t.config,r=n.permissionMode??"default";this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,s=typeof n.model=="string"?n.model:String(n.model),i=Ps({surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),modelName:s,providerName:Pd,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof un?o.toolDefs.map(p=>p.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?Ms(this.providerOpts.tools,i):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:i,...n.isSkillDispatch?{isSkillDispatch:!0}:{}});let a={};if(this.providerOpts.baseURL!==void 0&&(a.baseURL=this.providerOpts.baseURL),a.toolDispatcher=o,this.providerOpts.mcpManager!==void 0&&(a.mcpManager=this.providerOpts.mcpManager),(n.depth===void 0||n.depth===0)&&n.parentSessionId===void 0&&n.sessionId!==void 0&&this._presenceSessionId===null){this._presenceSessionId=n.sessionId;let p=n.sessionId,f=i.getWorkspace();Os({sessionId:p,surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:Pd,name:s},workspace:f,pid:process.pid}),process.once("exit",()=>{cn(p)}),process.once("SIGINT",()=>{cn(p),process.exit(130)}),process.once("SIGTERM",()=>{cn(p),process.exit(143)})}let c=io({cwd:n.cwd??process.cwd(),...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:i.getWorkspace()}),u=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,d={...n,systemPrompt:u!==void 0?`${u}
1180
1180
 
1181
1181
  ${c}`:c};return eb(d,t.prompt,a)}buildDispatcher(t,n){let r=Ia(t,n.cwd),o=Is(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[l,c]of o)this.providerOpts.readOnlyMemory===!0&&l!=="memory_search"||r.set(l,c);n.runtimeStateSource&&r.set("get_runtime_state",ao(n.runtimeStateSource));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[l,c]of this.providerOpts.mcpManager.getMcpHandlers())r.set(l,c);let i=n.isSkillDispatch?this.schemas.filter(l=>l.name!=="ask_question"&&l.name!=="terminal_font_size"):this.schemas,a={handlers:r,schemas:[...i,...s]};return this.providerOpts.hookRegistry!==void 0&&(a.hookRegistry=this.providerOpts.hookRegistry),this.providerOpts.permissions!==void 0&&(a.permissions=this.providerOpts.permissions),this.providerOpts.subagentExecutor!==void 0&&(a.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(a.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(a.composeExecutor=this.providerOpts.composeExecutor),n.cwd!==void 0&&(a.cwd=n.cwd),n.readRoots!==void 0&&(a.readRoots=n.readRoots),n.writeRoots!==void 0&&(a.writeRoots=n.writeRoots),n.sessionId!==void 0&&(a.sessionId=n.sessionId),n.parentSessionId!==void 0&&(a.parentSessionId=n.parentSessionId),n.traceWriter!==void 0&&(a.traceWriter=n.traceWriter),new un(a)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=Id.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=Id.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=Id.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[]}}appendProviderAuditLog(t){try{let n=Vr();bO(wO(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});yO(n,r+`
1182
- `)}catch{}}close(){this.memoryStore.close()}async complete(t){let n={model:t.model??"gpt-4o-mini",system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.apiKey!==void 0&&(n.apiKey=t.apiKey);let r=t.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),t.signal&&(n.signal=t.signal),tb(n)}},SO=new _t;var kO=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","memory_search"]),vO=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size"]),TO=new Set(["Bash","BashOutput","KillBash","bash"]),po=new Set(["Agent","Task","agent"]),Md=new Set(["Skill","skill"]),Od=new Set(["Compose","compose"]),He=new Set([...po,...Od,...Md]),xO=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),EO=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),RO=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),AO=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);function Fn(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}var nb=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","memory_search",...at];function Nn(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":Fn(kO,e)?"read":Fn(vO,e)?"write":Fn(TO,e)?"shell":Fn(po,e)?"subagent":Fn(Md,e)?"skill":Fn(Od,e)?"dag":Fn(xO,e)?"web":EO.has(e)?"browser":Fn(RO,e)?"planning":AO.has(e)?"schedule":"other"}var _O={subagent:"subagent",skill:"skill",dag:"dag"};function $d(e){return _O[e]}import{isAbsolute as DO}from"node:path";import{EventEmitter as IO}from"node:events";import*as Bn from"node:fs/promises";import*as ib from"node:path";import{createHash as PO}from"node:crypto";H();import*as mo from"node:fs";import*as Le from"node:fs/promises";import*as rb from"node:readline";import{randomBytes as CO}from"node:crypto";var La=class{jobId;logPath;metaPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;metaWriteQueue=Promise.resolve();constructor(t){this.jobId=t,this.logPath=Qi(t),this.metaPath=Iu(t);try{mo.mkdirSync(or(t),{recursive:!0})}catch(n){process.stderr.write(`[afk] bg-job-log: mkdir failed for ${t}: ${String(n)}
1182
+ `)}catch{}}close(){this.memoryStore.close()}async complete(t){let n={model:t.model??"gpt-4o-mini",system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.apiKey!==void 0&&(n.apiKey=t.apiKey);let r=t.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),t.signal&&(n.signal=t.signal),tb(n)}},SO=new _t;var kO=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","memory_search"]),vO=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size"]),TO=new Set(["Bash","BashOutput","KillBash","bash"]),po=new Set(["Agent","Task","agent"]),Md=new Set(["Skill","skill"]),Od=new Set(["Compose","compose"]),Le=new Set([...po,...Od,...Md]),xO=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),EO=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),RO=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),AO=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);function Fn(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}var nb=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","memory_search",...at];function Nn(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":Fn(kO,e)?"read":Fn(vO,e)?"write":Fn(TO,e)?"shell":Fn(po,e)?"subagent":Fn(Md,e)?"skill":Fn(Od,e)?"dag":Fn(xO,e)?"web":EO.has(e)?"browser":Fn(RO,e)?"planning":AO.has(e)?"schedule":"other"}var _O={subagent:"subagent",skill:"skill",dag:"dag"};function $d(e){return _O[e]}import{isAbsolute as DO}from"node:path";import{EventEmitter as IO}from"node:events";import*as Bn from"node:fs/promises";import*as ib from"node:path";import{createHash as PO}from"node:crypto";H();import*as mo from"node:fs";import*as Fe from"node:fs/promises";import*as rb from"node:readline";import{randomBytes as CO}from"node:crypto";var La=class{jobId;logPath;metaPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;metaWriteQueue=Promise.resolve();constructor(t){this.jobId=t,this.logPath=Qi(t),this.metaPath=Iu(t);try{mo.mkdirSync(or(t),{recursive:!0})}catch(n){process.stderr.write(`[afk] bg-job-log: mkdir failed for ${t}: ${String(n)}
1183
1183
  `),this.errored=!0}}write(t){if(this.errored||this.closed)return;let n=JSON.stringify(t)+`
1184
1184
  `;if(!this.stream){this.pendingLines.push(n),this._openStream();return}if(!this.streamReady){this.pendingLines.push(n);return}this._writeLine(n)}_openStream(){if(!this.stream){this.readyPromise=new Promise(t=>{this.readyResolve=t});try{let t=mo.createWriteStream(this.logPath,{flags:"a",encoding:"utf8",mode:384});this.stream=t,t.once("open",()=>{this.streamReady=!0;for(let n of this.pendingLines)this._writeLine(n);this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null}),t.once("error",n=>{process.stderr.write(`[afk] bg-job-log: stream error for ${this.jobId}: ${String(n)}
1185
1185
  `),this.errored=!0,this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null})}catch(t){process.stderr.write(`[afk] bg-job-log: createWriteStream failed for ${this.jobId}: ${String(t)}
1186
1186
  `),this.errored=!0,this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null}}}_writeLine(t){if(!(!this.stream||this.errored))try{this.stream.write(t,n=>{n&&(process.stderr.write(`[afk] bg-job-log: write error for ${this.jobId}: ${String(n)}
1187
1187
  `),this.errored=!0)})}catch(n){process.stderr.write(`[afk] bg-job-log: write threw for ${this.jobId}: ${String(n)}
1188
- `),this.errored=!0}}async close(){if(!this.closed)return this.closed=!0,this.readyPromise&&await this.readyPromise,new Promise(t=>{if(!this.stream){t();return}this.stream.end(()=>{t()})})}async writeMeta(t){this.metaWriteQueue=this.metaWriteQueue.then(()=>this._writeMetaInner(t)),await this.metaWriteQueue}async _writeMetaInner(t){let n=`${this.metaPath}.${CO(4).toString("hex")}.tmp`;try{await Le.writeFile(n,JSON.stringify(t,null,2),{encoding:"utf8",mode:384}),await Le.rename(n,this.metaPath)}catch(r){process.stderr.write(`[afk] bg-job-log: writeMeta failed for ${this.jobId}: ${String(r)}
1189
- `);try{await Le.unlink(n)}catch{}}}},Ht=class e{static async listJobs(){let t=vs(),n;try{n=await Le.readdir(t)}catch{return[]}let r=[];for(let o of n.slice(0,1e3)){let s=await e.readMeta(o);s&&r.push(s)}return r.sort((o,s)=>s.startedAt-o.startedAt),r.slice(0,100)}static async readMeta(t){let n;try{n=Iu(t)}catch{return null}try{let r=await Le.readFile(n,"utf8"),o=JSON.parse(r);return o.schemaVersion!==1?null:o}catch(r){return r.code==="ENOENT"||process.stderr.write(`[afk] bg-job-log: readMeta parse error for ${t}: ${String(r)}
1190
- `),null}}static async*readEvents(t){let n=Qi(t),r;try{r=await Le.open(n,"r")}catch(o){if(o.code==="ENOENT")return;throw o}try{let o=rb.createInterface({input:r.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let s of o){let i=s.trim();if(i)try{yield JSON.parse(i)}catch{}}}finally{await r.close()}}static async*tailEvents(t,n){let r=Qi(t),{fromStart:o=!1}=n??{},s=or(t);try{await Le.access(s)}catch{return}let i=0,a="",l=null,c=250;async function*u(){let h=null;try{h=await Le.open(r,"r");let b=await h.stat();if(b.size<=i)return;let y=b.size-i,w=Buffer.allocUnsafe(y),{bytesRead:v}=await h.read(w,0,y,i);if(v===0)return;i+=v,a+=w.toString("utf8",0,v);let R=a.split(`
1188
+ `),this.errored=!0}}async close(){if(!this.closed)return this.closed=!0,this.readyPromise&&await this.readyPromise,new Promise(t=>{if(!this.stream){t();return}this.stream.end(()=>{t()})})}async writeMeta(t){this.metaWriteQueue=this.metaWriteQueue.then(()=>this._writeMetaInner(t)),await this.metaWriteQueue}async _writeMetaInner(t){let n=`${this.metaPath}.${CO(4).toString("hex")}.tmp`;try{await Fe.writeFile(n,JSON.stringify(t,null,2),{encoding:"utf8",mode:384}),await Fe.rename(n,this.metaPath)}catch(r){process.stderr.write(`[afk] bg-job-log: writeMeta failed for ${this.jobId}: ${String(r)}
1189
+ `);try{await Fe.unlink(n)}catch{}}}},Ht=class e{static async listJobs(){let t=vs(),n;try{n=await Fe.readdir(t)}catch{return[]}let r=[];for(let o of n.slice(0,1e3)){let s=await e.readMeta(o);s&&r.push(s)}return r.sort((o,s)=>s.startedAt-o.startedAt),r.slice(0,100)}static async readMeta(t){let n;try{n=Iu(t)}catch{return null}try{let r=await Fe.readFile(n,"utf8"),o=JSON.parse(r);return o.schemaVersion!==1?null:o}catch(r){return r.code==="ENOENT"||process.stderr.write(`[afk] bg-job-log: readMeta parse error for ${t}: ${String(r)}
1190
+ `),null}}static async*readEvents(t){let n=Qi(t),r;try{r=await Fe.open(n,"r")}catch(o){if(o.code==="ENOENT")return;throw o}try{let o=rb.createInterface({input:r.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let s of o){let i=s.trim();if(i)try{yield JSON.parse(i)}catch{}}}finally{await r.close()}}static async*tailEvents(t,n){let r=Qi(t),{fromStart:o=!1}=n??{},s=or(t);try{await Fe.access(s)}catch{return}let i=0,a="",l=null,c=250;async function*u(){let h=null;try{h=await Fe.open(r,"r");let b=await h.stat();if(b.size<=i)return;let y=b.size-i,w=Buffer.allocUnsafe(y),{bytesRead:v}=await h.read(w,0,y,i);if(v===0)return;i+=v,a+=w.toString("utf8",0,v);let R=a.split(`
1191
1191
  `);a=R.pop()??"";for(let S of R){let E=S.trim();if(E)try{yield JSON.parse(E)}catch{}}}catch(b){b.code!=="ENOENT"&&process.stderr.write(`[afk] bg-job-log: tailEvents read error for ${t}: ${String(b)}
1192
- `)}finally{h&&await h.close().catch(()=>{})}}async function d(){let h=await e.readMeta(t);if(!h||!(h.status!=="running"))return!1;try{let y=await Le.stat(r);return i>=y.size}catch{return!0}}if(o)yield*u();else try{i=(await Le.stat(r)).size}catch{}if(await d())return;let p=null,f=null,g=()=>new Promise(h=>{f=h;let b=setTimeout(()=>{f=null,h()},c);p=()=>{clearTimeout(b),f=null,h()}});try{l=mo.watch(s,{persistent:!1},()=>{p?.(),p=null})}catch{}try{for(;await g(),yield*u(),!await d(););}finally{f?.(),l?.close()}}};H();var MO=300*1e3,ob=4096;function Dd(e){_e(e).catch(()=>{})}var sb=5e3,OO=10,Ws=class extends Error{constructor(t,n){super(`Background job cap reached (${t}/${n} running). Wait for existing jobs to finish or cancel them before spawning more.`),this.name="BackgroundJobCapError"}},Fa=class extends IO{jobs=new Map;counter=Math.floor(Math.random()*65536);traceWriter;maxConcurrentJobs;constructor(t={}){super(),this.traceWriter=t.traceWriter,this.maxConcurrentJobs=t.maxConcurrentJobs??OO,setTimeout(()=>this._sweepOldJobs().catch(r=>process.stderr.write(`[afk] bg sweep error: ${String(r)}
1192
+ `)}finally{h&&await h.close().catch(()=>{})}}async function d(){let h=await e.readMeta(t);if(!h||!(h.status!=="running"))return!1;try{let y=await Fe.stat(r);return i>=y.size}catch{return!0}}if(o)yield*u();else try{i=(await Fe.stat(r)).size}catch{}if(await d())return;let p=null,f=null,g=()=>new Promise(h=>{f=h;let b=setTimeout(()=>{f=null,h()},c);p=()=>{clearTimeout(b),f=null,h()}});try{l=mo.watch(s,{persistent:!1},()=>{p?.(),p=null})}catch{}try{for(;await g(),yield*u(),!await d(););}finally{f?.(),l?.close()}}};H();var MO=300*1e3,ob=4096;function Dd(e){_e(e).catch(()=>{})}var sb=5e3,OO=10,Ws=class extends Error{constructor(t,n){super(`Background job cap reached (${t}/${n} running). Wait for existing jobs to finish or cancel them before spawning more.`),this.name="BackgroundJobCapError"}},Fa=class extends IO{jobs=new Map;counter=Math.floor(Math.random()*65536);traceWriter;maxConcurrentJobs;constructor(t={}){super(),this.traceWriter=t.traceWriter,this.maxConcurrentJobs=t.maxConcurrentJobs??OO,setTimeout(()=>this._sweepOldJobs().catch(r=>process.stderr.write(`[afk] bg sweep error: ${String(r)}
1193
1193
  `)),5e3).unref()}register(t){let n=[...this.jobs.values()].filter(d=>d.status==="running").length;if(n>=this.maxConcurrentJobs)throw new Ws(n,this.maxConcurrentJobs);let r=this.nextJobId(),o=t.prompt.trim().slice(0,80),s=Date.now(),i,a=new Promise(d=>{i=d}),l={jobId:r,subagentId:t.handle.id,label:o,model:t.model,startedAt:s,status:"running",handle:t.handle,joiners:[],terminalSettled:a,settle:i,transcriptTail:"",parentSessionId:t.parentSessionId};this.jobs.set(r,l),no(this.traceWriter,{transition:"started",jobId:r,subagentId:t.handle.id,label:o,model:t.model}),this.emit("started",this.snapshot(l));let c=new La(r),u={jobId:r,subagentId:t.handle.id,label:o,promptHash:PO("sha256").update(t.prompt).digest("hex"),model:t.model,startedAt:s,status:"running",...t.parentSessionId!==void 0?{parentSessionId:t.parentSessionId}:{},schemaVersion:1};return c.writeMeta(u),t.handle.runInBackground(t.prompt,d=>{this.markTerminal(r,d,c,u)},d=>{c.write(d),d.type==="chunk"&&d.chunk.type==="content"&&this.appendTranscript(r,d.chunk.content)}),this.snapshot(l)}get(t){let n=this.jobs.get(t);return n?this.snapshot(n):void 0}list(){return[...this.jobs.values()].map(t=>this.snapshot(t))}async join(t){let n=this.jobs.get(t);if(!n)throw new Error(`Background job not found: "${t}". Completed and cancelled jobs are evicted from the registry ~5 minutes after they settle. If the jobId looks correct, the job may have already been evicted.`);let r=await n.terminalSettled;return no(this.traceWriter,{transition:"joined",jobId:t,subagentId:n.subagentId,jobStatus:n.status}),this.emit("joined",this.snapshot(n)),r}async cancelJob(t){let n=this.jobs.get(t);return!n||n.status!=="running"?!1:(n.cancelSource="explicit",await n.handle.cancel(),!0)}async cancelAll(){let t=[...this.jobs.values()].filter(n=>n.status==="running");for(let n of t)n.cancelSource="cascade";await Promise.allSettled(t.map(n=>n.handle.cancel())),await Promise.allSettled(t.map(n=>{let r=new Promise(o=>setTimeout(()=>{console.warn(`[BackgroundAgentRegistry] cancelAll: job ${n.jobId} did not settle within ${sb}ms \u2014 continuing teardown`),o()},sb).unref());return Promise.race([n.terminalSettled,r])}))}appendTranscript(t,n){let r=this.jobs.get(t);if(!r)return;let o=r.transcriptTail+n;o.length<=ob?r.transcriptTail=o:r.transcriptTail=o.slice(o.length-ob)}getTranscript(t){return this.jobs.get(t)?.transcriptTail}nextJobId(){return this.counter+=1,`bg-${Date.now().toString(36)}-${this.counter}`}markTerminal(t,n,r,o){let s=this.jobs.get(t);if(!s||s.status!=="running")return;s.result=n,s.endedAt=Date.now();let i=s.endedAt-s.startedAt;if(s.status=this.statusFromResult(n.status),s.status==="completed"){let l=n.message?.content,c=typeof l=="string"?l:l!==void 0?JSON.stringify(l):"";no(this.traceWriter,{transition:"completed",jobId:t,subagentId:s.subagentId,durationMs:i,outputBytes:Buffer.byteLength(c,"utf8")}),Dd({event:"subagent.completed",subagent_id:s.subagentId,parent_session_id:s.parentSessionId,status:n.status,duration_ms:i,content_chars:c.length}),this.emit("settled",this.snapshot(s))}else if(s.status==="failed"){let l=n.error;no(this.traceWriter,{transition:"failed",jobId:t,subagentId:s.subagentId,durationMs:i,errorClass:l?.name??"Error",errorMessage:l?.message??"unknown"}),Dd({event:"subagent.failed",subagent_id:s.subagentId,parent_session_id:s.parentSessionId,status:n.status,duration_ms:i,error_message:l?.message}),this.emit("settled",this.snapshot(s))}else no(this.traceWriter,{transition:"cancelled",jobId:t,subagentId:s.subagentId,source:s.cancelSource??"explicit"}),Dd({event:"subagent.failed",subagent_id:s.subagentId,parent_session_id:s.parentSessionId,status:n.status,duration_ms:i}),this.emit("settled",this.snapshot(s));if(s.settle(n),r&&o){let l=s.status,c=s.endedAt;r.writeMeta({...o,status:l,...c!==void 0?{endedAt:c}:{}}).then(()=>r.close())}setTimeout(()=>{this.jobs.delete(t)},MO).unref()}async _sweepOldJobs(){let n=vs(),r;try{r=await Bn.readdir(n)}catch{return}for(let o of r){let s=or(o),i=ib.join(s,"meta.json");try{if(!(await Bn.lstat(s)).isDirectory()){process.stderr.write(`[afk] bg sweep: skipping non-directory entry ${o}
1194
1194
  `);continue}let l=await Bn.readFile(i,"utf8"),c=JSON.parse(l);if(c.status==="running"||c.endedAt===void 0||Date.now()-c.endedAt<6048e5)continue;await Bn.rm(s,{recursive:!0,force:!0})}catch(a){if(a.code==="ENOENT")continue;process.stderr.write(`[afk] bg sweep: error evicting ${o}: ${String(a)}
1195
1195
  `)}}}statusFromResult(t){return t==="succeeded"?"completed":t==="failed"?"failed":t==="cancelled"?"cancelled":"failed"}snapshot(t){return{jobId:t.jobId,subagentId:t.subagentId,label:t.label,model:t.model,startedAt:t.startedAt,status:t.status,...t.result!==void 0?{result:t.result}:{},...t.endedAt!==void 0?{endedAt:t.endedAt}:{}}}};function $O(e){return typeof e=="string"&&e.startsWith("sk-ant-")}function Hs(e){let{childModel:t,resolved:n,parentApiKey:r}=e;return n!==void 0&&n.length>0||fe(t)==="openai-compatible"?n:$O(r)?r:n}G();function Ld(){return T.ANTHROPIC_API_KEY||T.CLAUDE_CODE_OAUTH_TOKEN||Ve()}function Fd(){return T.OPENAI_API_KEY||T.CODEX_API_KEY||void 0}function hr(e){let t=fe(e);return t==="openai-compatible"||t==="openai-codex"?Fd():Ld()}function LO(e){if(typeof e!="object"||e===null)throw new Error("Agent tool input must be an object");let t=e,n=t.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=t.model;if(o!==void 0){if(typeof o!="string")throw new Error("Agent tool model must be a string");r=o}let s=10,i=t.max_turns;if(i!==void 0){if(typeof i!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(i)))}let a="agent-tool",l=t.id_prefix;if(l!==void 0){if(typeof l!="string")throw new Error("Agent tool id_prefix must be a string");a=l}let c="foreground",u=t.mode;if(u!==void 0){if(u!=="foreground"&&u!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(u)}`);c=u}let d,p=t.cwd;if(p!==void 0){if(typeof p!="string")throw new Error(`Agent tool cwd must be a string, got: ${JSON.stringify(p)}`);if(p.length===0)throw new Error("Agent tool cwd must be a non-empty string");if(!DO(p))throw new Error(`Agent tool cwd must be an absolute path, got: ${JSON.stringify(p)}`);if(p.split(/[/\\]/).includes(".."))throw new Error(`Agent tool cwd must not contain '..' segments, got: ${JSON.stringify(p)}`);d=p}return{prompt:n,model:r,max_turns:s,id_prefix:a,mode:c,...d!==void 0?{cwd:d}:{}}}function Na(e){try{return _e(e).catch(()=>{})}catch{return Promise.resolve()}}function fo(e,t=240){return e.length<=t?e:e.slice(0,t)+"\u2026"}function lb(e){if(e!=null){if(typeof e=="string")return e.length;try{return JSON.stringify(e).length}catch{return}}}var FO=4096,ab=1024;function NO(e){if(e==null)return;let t=lb(e);return t!==void 0&&t>FO?{truncated:!0,chars:t}:e}function BO(e){let t={status:e.status,error:fo(e.errorMessage,ab),subagent_id:e.subagentId};e.schemaErrorMessage&&(t.schemaError=fo(e.schemaErrorMessage,ab));let n=NO(e.partialOutput);return n!==void 0&&(t.partialOutput=n),t}var Kt=class e{constructor(t){this.ctx=t}ctx;getSubagentsLite(){let t=this.ctx.subagentManager.list().map(r=>({id:r.id,status:r.status})),n=this.ctx.backgroundRegistry?this.ctx.backgroundRegistry.list().map(r=>({jobId:r.jobId,status:r.status,startedAt:new Date(r.startedAt).toISOString(),label:r.label.length>0?r.label:null})):[];return{active:t,backgroundJobs:n}}async execute(t){if(t.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=LO(t.input)}catch(h){return{content:`Agent tool input validation failed: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let r=this.ctx.depth,o=this.ctx.maxDepth??go,s,i=n.model??this.ctx.defaultSubagentModel??"sonnet",a=fe(i)==="openai-compatible",l=Hs({childModel:i,resolved:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(i):hr(i),parentApiKey:this.ctx.defaultConfig.apiKey}),c={model:i,apiKey:a?void 0:l,systemPrompt:this.ctx.defaultConfig.systemPrompt,baseUrl:a?void 0:this.ctx.defaultConfig.baseUrl,maxTurns:n.max_turns,depth:r+1,maxDepth:o,...n.cwd!==void 0?{cwd:n.cwd}:{}},u;if(this.ctx.childProviderFactory&&r<o){s=new Q({parentAbortSignal:t.signal,...this.ctx.cwd!==void 0?{cwd:this.ctx.cwd}:{}}),u=yr(t.signal);let h=new e({subagentManager:s,parentSession:u,defaultConfig:this.ctx.defaultConfig,defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,...this.ctx.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:this.ctx.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...this.ctx.cwd!==void 0?{cwd:this.ctx.cwd}:{}}),b=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,t.signal):void 0;c.provider=this.ctx.childProviderFactory({childExecutor:h,...b!==void 0?{childSkillExecutor:b}:{},...c.model!==void 0?{model:c.model}:{}})}let d;try{d=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,parentId:t.id,config:c,idPrefix:n.id_prefix,agentType:n.id_prefix&&n.id_prefix!=="agent-tool"?dn(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":dn(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:n.mode==="background"}),u!==void 0&&(u.sessionId=d.id)}catch(h){let b=h instanceof Error?h.message:String(h);return Na({event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:fo(b),depth:r}),{content:`Failed to fork subagent: ${b}`,isError:!0}}if(n.mode==="background"){let h=this.ctx.backgroundRegistry;if(!h)return await d.teardown().catch(w=>V("subagent-executor: handle teardown failed: "+(w instanceof Error?w.message:String(w)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let b;try{b=h.register({handle:d,prompt:n.prompt,model:c.model??"sonnet",parentSessionId:this.ctx.parentSession.sessionId})}catch(w){if(w instanceof Ws)return await d.teardown().catch(v=>V("subagent-executor: handle teardown failed after cap error: "+(v instanceof Error?v.message:String(v)))),{content:w.message,isError:!0};throw w}let y={status:"running",jobId:b.jobId,subagentId:b.subagentId,label:b.label,message:`Background subagent started (jobId=${b.jobId}). It is running detached and its result will NOT auto-inject into this context. Retrieve it later via /bgsub:join ${b.jobId} or ask the user to join.`};return{content:JSON.stringify(y)}}let p=()=>{d.cancel()};t.signal.addEventListener("abort",p,{once:!0});let f=Date.now(),g=this.ctx.parentSession.sessionId;try{let h=await d.runToResult(n.prompt);if(h.status==="succeeded"&&h.message){let v=h.message.content,R=typeof v=="string"?v:JSON.stringify(v),S=h.trace;return Na({event:"subagent.completed",subagent_id:d.id,parent_session_id:g,status:h.status,duration_ms:Date.now()-f,content_chars:R.length,depth:r,tool_call_count:S?.toolCalls.length,thinking_present:S?.thinkingPresent,tool_names:S?.toolCalls.length?JSON.stringify([...new Set(S.toolCalls.map(E=>E.name))]):void 0}),{content:R}}let b=h.error?.message??"Subagent failed with no output",y=h.trace;Na({event:"subagent.failed",subagent_id:d.id,id_prefix:n.id_prefix,parent_session_id:g,status:h.status,duration_ms:Date.now()-f,error_message:fo(b),schema_error:h.schemaError?fo(h.schemaError.message):void 0,partial_output_chars:lb(h.partialOutput),depth:r,tool_call_count:y?.toolCalls.length,thinking_present:y?.thinkingPresent,tool_names:y?.toolCalls.length?JSON.stringify([...new Set(y.toolCalls.map(v=>v.name))]):void 0});let w=BO({status:h.status,errorMessage:b,schemaErrorMessage:h.schemaError?.message,partialOutput:h.partialOutput,subagentId:d.id});return{content:JSON.stringify(w),isError:!0}}catch(h){let b=h instanceof Error?h.message:String(h);throw Na({event:"subagent.failed",subagent_id:d.id,id_prefix:n.id_prefix,parent_session_id:g,status:"failed",duration_ms:Date.now()-f,error_message:fo(b),depth:r}),h}finally{t.signal.removeEventListener("abort",p),await s?.teardownAll(),await d.teardown()}}};var cb=new Set;function ub(e){cb.add(e)}function db(e){return cb.has(e)}var Nd=new Set,Bd=new Set;function pb(e){Nd.add(e)}function mb(e){Nd.delete(e)}function fb(e){Bd.add(e)}function gb(e){Bd.delete(e)}function hb(e){for(let t of Nd)t(e)}function yb(e){for(let t of Bd)t(e)}var UO=240;function jO(e,t=UO){return e.length<=t?e:e.slice(0,t)+"\u2026"}function WO(e){if(typeof e!="object"||e===null)return;let t=e.name;if(typeof t!="string")return;let n=t.trim();return n.length>0?n:void 0}function HO(e){if(typeof e!="object"||e===null)throw new Error("Skill tool input must be an object");let t=e,n=t.name;if(typeof n!="string"||n.trim().length===0)throw new Error('Skill tool input must have a non-empty "name" field');let r,o=t.arguments;if(o!==void 0){if(typeof o!="string")throw new Error('Skill tool "arguments" must be a string');r=o}return{name:n.trim(),arguments:r}}var Gt=class{constructor(t){this.ctx=t}ctx;pluginBodies=null;async execute(t){if(t.signal.aborted)return{content:"Skill tool call aborted",isError:!0};let n=this.ctx.depth??0,r=this.ctx.maxDepth??go;if(n>=r){let l=WO(t.input);return _e({event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:n,requested_name:l}).catch(()=>{}),{content:`Skill tool not available at nesting depth ${n} (max ${r})`,isError:!0}}let o;try{o=HO(t.input)}catch(l){return{content:`Skill tool input validation failed: ${l instanceof Error?l.message:String(l)}`,isError:!0}}try{let l=De(o.name);return await this.executeRegistrySkill(l,o.arguments,t)}catch{}let s=this.getPluginSkillBody(o.name);if(s){if(s.context==="load"){let l=s.body.replace(/\$\{?PLUGIN_ROOT\}?/g,()=>s.pluginPath);return this.executeLoadedPluginSkill(o.name,l,o.arguments,t)}return await this.executePluginSkill(o.name,s.body,s.pluginPath,o.arguments,t)}let a=mn(this.ctx.pluginConfigs).map(l=>l.name).join(", ");return{content:`Skill "${o.name}" not found. Available skills: ${a||"(none)"}`,isError:!0}}async executeRegistrySkill(t,n,r){if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};if(t.context==="fork")return this.executeForkedRegistrySkill(t,n,r);if(t.context==="load")return this.executeLoadedRegistrySkill(t,n,r);let o=db(t.name);o&&yb(t.name);let s=this.ctx.depth??0;_e({event:"skill.dispatched",requested_name:t.name,parent_session_id:this.ctx.parentSession.sessionId,depth:s,...t.model!==void 0?{model:t.model}:{}}).catch(()=>{});let i=Date.now(),a,l;try{l=await t.handler(n&&n.length>0?n:void 0,this.ctx.parentSession,{apiKey:this.ctx.apiKey,defaultModel:this.ctx.defaultModel,defaultSubagentModel:this.ctx.defaultSubagentModel,callId:r.id,dispatchSkill:this.createDispatchSkillCallback(r)})}catch(u){a=u}finally{let u=Date.now()-i;o&&hb({skillName:t.name,durationMs:u,...a!==void 0?{isError:!0}:{}});let d=a!==void 0?a instanceof Error?a.message:String(a):void 0,p=a===void 0?typeof l=="string"?l.length:l!=null?JSON.stringify(l).length:0:void 0;_e({event:"skill.completed",requested_name:t.name,parent_session_id:this.ctx.parentSession.sessionId,status:a!==void 0?"failed":"succeeded",duration_ms:u,depth:s,...p!==void 0?{content_chars:p}:{},...d!==void 0?{error_message:jO(d)}:{},...t.model!==void 0?{model:t.model}:{}}).catch(()=>{})}return a!==void 0?{content:`Skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}:{content:typeof l=="string"?l:l!=null?JSON.stringify(l):"Skill completed successfully."}}buildForkedChildConfig(t,n){let r=this.ctx.depth??0,o=this.ctx.maxDepth??go,s={...t};if(!this.ctx.childProviderFactory||r>=o)return{childConfig:s,childManager:void 0};let i=new Q({parentAbortSignal:n,...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},...this.ctx.cwd!==void 0?{cwd:this.ctx.cwd}:{}}),a=new Kt({subagentManager:i,parentSession:yr(n),defaultConfig:{model:s.model,apiKey:this.ctx.apiKey,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{}},defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,...this.ctx.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:this.ctx.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...this.ctx.cwd!==void 0?{cwd:this.ctx.cwd}:{},...this.ctx.backgroundRegistry!==void 0?{backgroundRegistry:this.ctx.backgroundRegistry}:{}}),l=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,n):void 0;return s.provider=this.ctx.childProviderFactory({childExecutor:a,...l!==void 0?{childSkillExecutor:l}:{},...s.model!==void 0?{model:s.model}:{}}),{childConfig:s,childManager:i}}async executeForkedRegistrySkill(t,n,r){if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};let o;try{if(o=ve(t.name)["system.md"],!o)return{content:`Skill "${t.name}" has context: "fork" but no prompts/system.md found`,isError:!0}}catch(d){return{content:`Failed to load skill prompts: ${d instanceof Error?d.message:String(d)}`,isError:!0}}let s=t.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",i=Hs({childModel:s,resolved:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(s):hr(s),parentApiKey:this.ctx.apiKey}),a=new Q({parentAbortSignal:r.signal,apiKey:i,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},progressSink:yt(),...this.ctx.cwd!==void 0?{cwd:this.ctx.cwd}:{}}),{childConfig:l,childManager:c}=this.buildForkedChildConfig({model:s,systemPrompt:o,isSkillDispatch:!0,...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{}},r.signal),u;try{u=await a.forkSubagent({parent:this.ctx.parentSession,config:l,idPrefix:`skill-fork-${t.name}`,parentId:r.id,agentType:t.name});let d=n&&n.length>0?n:`Run the ${t.name} skill now, following the instructions in your system prompt.`,p=await u.runToResult(d);return p.status==="succeeded"&&p.message?{content:p.message.content}:p.status==="cancelled"&&typeof p.partialOutput=="string"&&p.partialOutput.length>0?{content:`[skill cancelled mid-flight \u2014 partial output preserved below]
@@ -1202,7 +1202,7 @@ Arguments: ${o}`}
1202
1202
 
1203
1203
  ${n}`}}emitLoadTelemetry(t,n,r,o){let s=this.ctx.depth??0,i={requested_name:t,parent_session_id:this.ctx.parentSession.sessionId,depth:s,mode:"load",...o!==void 0?{model:o}:{}};_e({event:"skill.dispatched",...i}).catch(()=>{}),_e({event:"skill.completed",status:"succeeded",duration_ms:r,content_chars:n,...i}).catch(()=>{})}executeLoadedRegistrySkill(t,n,r){if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};let o=Date.now(),s;try{let l=ve(t.name)["system.md"];if(!l)return{content:`Skill "${t.name}" has context: "load" but no prompts/system.md found`,isError:!0};s=l}catch(a){return{content:`Failed to load skill prompts: ${a instanceof Error?a.message:String(a)}`,isError:!0}}let i=this.substituteSkillArgs(s,n);return this.emitLoadTelemetry(t.name,i.length,Date.now()-o,t.model),this.formatLoadedSkillResult(t.name,i,n)}executeLoadedPluginSkill(t,n,r,o){if(o.signal.aborted)return{content:"Skill call aborted",isError:!0};let s=Date.now(),i=this.substituteSkillArgs(n,r);return this.emitLoadTelemetry(t,i.length,Date.now()-s,void 0),this.formatLoadedSkillResult(t,i,r)}substituteSkillArgs(t,n){let r=n??"";return t.replace(/\$ARGUMENTS?\b/g,()=>r)}async executePluginSkill(t,n,r,o,s){if(s.signal.aborted)return{content:"Skill call aborted",isError:!0};let i=this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",a=Hs({childModel:i,resolved:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(i):hr(i),parentApiKey:this.ctx.apiKey}),l=new Q({parentAbortSignal:s.signal,apiKey:a,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},progressSink:yt(),...this.ctx.cwd!==void 0?{cwd:this.ctx.cwd}:{}}),{childConfig:c,childManager:u}=this.buildForkedChildConfig({model:i,systemPrompt:this.substituteSkillArgs(n,o),env:{PLUGIN_ROOT:r},isSkillDispatch:!0,...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{}},s.signal),d;try{d=await l.forkSubagent({parent:this.ctx.parentSession,config:c,idPrefix:`skill-${t}`,parentId:s.id,agentType:t});let p=o&&o.length>0?o:`Run the ${t} skill now, following the instructions in your system prompt.`,f=await d.runToResult(p);return f.status==="succeeded"&&f.message?{content:f.message.content}:f.status==="cancelled"&&typeof f.partialOutput=="string"&&f.partialOutput.length>0?{content:`[skill cancelled mid-flight \u2014 partial output preserved below]
1204
1204
 
1205
- ${f.partialOutput}`}:{content:f.error?.message??"Plugin skill failed with no output",isError:!0}}catch(p){return{content:`Plugin skill execution error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}finally{d&&await d.teardown().catch(V),await u?.teardownAll(),await l.teardownAll()}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=Ba(this.ctx.pluginConfigs)),this.pluginBodies.get(t)}createDispatchSkillCallback(t){return async(n,r)=>{let o={id:`${t.id}-dispatch-${n}`,name:"skill",input:{name:n,...r!==void 0?{arguments:r}:{}},signal:t.signal},s=await this.execute(o);if(s.isError)throw new Error(s.content);return s.content}}};var go=3;function yr(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}var KO=[...Bt,...at,"memory_search","agent","skill"];function ho(e={}){return({childExecutor:t,childSkillExecutor:n,model:r})=>{let o={permissions:{allowedTools:KO},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{}};return fe(typeof r=="string"?r:void 0)==="openai-compatible"?new _t({...o,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{},readOnlyMemory:!0}):new Fe({...o,readOnlyMemory:!0})}}function yo(e,t,n,r,o,s,i,a){let l=(c,u,d)=>new Gt({parentSession:yr(d),defaultModel:e,apiKey:t,...r!==void 0?{baseUrl:r}:{},depth:c,maxDepth:u,childProviderFactory:n,childSkillExecutorFactory:l,...o!==void 0?{traceWriter:o}:{},...s!==void 0?{backgroundRegistry:s}:{},...i!==void 0?{cwd:i}:{},...a!==void 0?{resolveApiKeyForModel:a}:{}});return l}function bb(e,t){let n={allowedTools:[...nb]};return fe(typeof t=="string"?t:void 0)==="openai-compatible"?new _t({permissions:n}):new Fe({permissions:n})}function wb(e){let t=GO(e);return t!==void 0?t:zO(e)}function GO(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return Sb(n.trim())}function zO(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=qO(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=Sb(r);if(o!==void 0)return o}}function qO(e,t){let n=0,r=!1,o=!1;for(let s=t;s>=0;s--){let i=e[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="}")n++;else if(i==="{"&&(n--,n===0))return s}return-1}function Sb(e){try{return JSON.parse(e)}catch{return}}function Ud(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function kb(e,t,n,r,o){if(!r)return{id:e,status:t,message:n,trace:o};let s=wb(n.content),i=r.safeParse(s);return i.success?{id:e,status:t,message:n,output:i.data,trace:o}:{id:e,status:"failed",message:n,error:new Error(`structured output did not match schema: ${i.error.message}`,{cause:i.error}),schemaError:i.error,trace:o}}function vb(e,t,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:e,status:t,error:o,trace:r}}function Ce(e){return`${e.status}${e.error?`: ${e.error.message}`:""}`}function Tb(e,t){let n=e;return t.partialOutput!==void 0&&t.partialOutput!==null&&(n.partialOutput=t.partialOutput),t.subagentId!==void 0&&(n.subagentId=t.subagentId),n}var Ua=class{constructor(t,n,r,o,s,i,a,l,c,u,d,p,f,g,h){this.id=t;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=i;this.hookRegistry=a;this.onTerminal=l;this.parentInputStreamRef=c;this.parentAbortSignal=u;this.agentType=d;this.traceWriter=g;this.onSubagentSucceeded=h;this.progressSink=p,this.parentId=f}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;onSubagentSucceeded;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;currentTrace=Ud();lastStreamedContent="";get status(){return this.currentStatus}async run(t,n){if(this.currentStatus==="running")throw new Error(`Subagent ${this.id} is already running`);if(this.currentStatus==="cancelled")throw new Error(`Subagent ${this.id} is cancelled`);this.currentStatus="running";let r=Date.now(),o=ha(this.streamToFinalMessage(t,n),this.timeoutMs,{controller:this.controller,label:this.id});this.inFlight=o;try{let s=await o;this.lastMessage=s.content,this.lastDurationMs=Date.now()-r,this.currentStatus="succeeded",this.latestTerminalStatus="succeeded",ir(this.traceWriter,{transition:"succeeded",subagentId:this.id,durationMs:this.lastDurationMs,turnCount:this.currentTrace.turnCount,outputBytes:Buffer.byteLength(this.lastMessage,"utf8")});let i=typeof s.metadata?.totalCostUsd=="number"?s.metadata.totalCostUsd:void 0;return this.onSubagentSucceeded?.(this.currentTrace.usage,i),this.onTerminal(),s}catch(s){throw this.lastDurationMs=Date.now()-r,this.currentStatus!=="cancelled"&&(this.controller.signal.aborted?(ir(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(ir(this.traceWriter,{transition:"failed",subagentId:this.id,errorClass:s instanceof Error?s.constructor.name:"Unknown",errorMessage:s instanceof Error?s.message:String(s),partialOutputBytes:Buffer.byteLength(this.lastStreamedContent,"utf8")}),this.currentStatus="failed",this.latestTerminalStatus="failed")),this.onTerminal(),s}finally{this.inFlight=null}}async streamToFinalMessage(t,n){let r,o;this.lastStreamedContent="",this.currentTrace=Ud();let s=n??this.progressSink??yt(),i={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let a of this.session.sendMessageStream(t)){if(s&&s(a,i),a.type==="chunk"){let l=a.chunk;l.type==="content"?this.lastStreamedContent+=l.content:l.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(a.type==="message")r=a.message,this.currentTrace.turnCount++;else if(a.type==="error"){o=a.error;break}else if(a.type==="done"){if(typeof a.metadata?.usage=="object"&&a.metadata.usage!==null){let l=a.metadata.usage;this.currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}if(o)throw o;if(r)return r;if(this.lastStreamedContent.length>0)return{role:"assistant",content:this.lastStreamedContent,timestamp:new Date};throw new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t,n){try{let r=await this.run(t,n);return kb(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace)}catch(r){let o=vb(this.id,this.currentStatus,r,this.currentTrace);return this.lastStreamedContent.length>0&&(o.partialOutput=this.lastStreamedContent),o}}runInBackground(t,n,r){let o;if(r){let s=this.progressSink??yt();o=(i,a)=>{r(i),s?.(i,a)}}this.runToResult(t,o).then(s=>{n?.(s)}).catch(s=>{V("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled",ir(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"explicit"});try{this.abortGraph.abort(this.id,"cancelled")}catch{}try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(t)}}async teardown(){if(this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(t)}}async dispatchStopAndRelease(t){if(this.stopDispatched){this.onTerminal();return}this.stopDispatched=!0;let n=await ch(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:t,lastMessage:this.lastMessage,agentType:this.agentType,durationMs:this.lastDurationMs,trace:this.currentTrace},this.traceWriter?{traceWriter:this.traceWriter}:{});if(n.injectContext&&this.parentInputStreamRef)if(this.parentAbortSignal?.aborted)V(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else try{this.parentInputStreamRef.pushUserMessage(n.injectContext)}catch(r){V(`Failed to inject context from SubagentStop handler: ${String(r)}`)}this.onTerminal()}};var JO=async(e,t)=>({action:"decline"}),Q=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentCwd;abortGraph;rootId;rootController;counter=0;onSubagentSucceededCb;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,this.parentBaseUrl=t.baseUrl,this.parentCwd=t.cwd,this.onSubagentSucceededCb=t.onSubagentSucceeded,this.abortGraph=new fa(t.traceWriter),this.rootId=`manager-root-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,this.rootController=new AbortController,this.abortGraph.register(this.rootId,this.rootController),t.parentAbortSignal){let n=t.parentAbortSignal;n.aborted?this.rootController.abort(n.reason):n.addEventListener("abort",()=>{this.rootController.signal.aborted||this.rootController.abort(n.reason)},{once:!0})}}list(){return[...this.active.values()].map(t=>({id:t.id,status:t.status}))}get(t){return this.active.get(t)}onChildAborted(t){return this.abortGraph.onChildAborted(this.rootId,t)}setOnSubagentSucceeded(t){this.onSubagentSucceededCb=t}abortAll(t,n="user_signal"){this.abortGraph.abort(this.rootId,t,n)}async forkSubagent(t){if(t.phaseRole!==void 0&&t.phaseRole!=="read-write"&&t.config.provider!==void 0)throw new Error(`SubagentManager.forkSubagent: phaseRole "${t.phaseRole}" is mutually exclusive with config.provider. Remove one \u2014 either let the manager construct the phase-restricted provider, or use config.provider with phaseRole: "read-write" (default).`);let n=`${t.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=t.parent.sessionId,o=t.config.hookRegistry??this.hookRegistry??t.parent.hookRegistry;o&&await lh(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal,...t.config.traceWriter?{traceWriter:t.config.traceWriter}:{}});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let i={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:t.config.apiKey||this.parentApiKey,baseUrl:t.config.baseUrl??this.parentBaseUrl,...t.config.parentSessionId===void 0&&t.parent.sessionId!==void 0?{parentSessionId:t.parent.sessionId}:{},...t.config.phaseRole===void 0&&t.phaseRole!==void 0?{phaseRole:t.phaseRole}:{},...t.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},hookRegistry:o,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...t.denyElicitations===!0?{onElicitation:JO}:{},...t.phaseRole==="read-only"?{provider:bb("read-only",t.config.model)}:{}},a;try{a=new Ye(i)}catch(h){throw this.abortGraph.dispose(n),h}let l=t.parent.getInputStreamRef?.(),c=t.parent.abortSignal,u=this.progressSink??yt(),d=t.agentType?.trim()||void 0,p=t.parentId?.trim()||void 0,f=new Ua(n,a,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??ga,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},l,c,d??t.idPrefix,u,p??t.parent.sessionId,t.config.traceWriter,this.onSubagentSucceededCb);this.active.set(n,f);let g=typeof t.config.model=="string"?t.config.model:JSON.stringify(t.config.model);return ir(t.config.traceWriter,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:g,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{}}),await _e({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:g,parent_session_id:t.parent.sessionId}),f}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}};async function ja(e,t={}){let{failFast:n=!0,teardown:r=!0}=t;if(e.length===0)return[];let o=new Array(e.length),s=new Set(e.map((a,l)=>l)),i=e.map((a,l)=>a.handle.runToResult(a.prompt).then(c=>{if(o[l]=c,s.delete(l),n&&c.status!=="succeeded")for(let u of s){let d=e[u];d&&d.handle.status==="running"&&d.handle.cancel().catch(()=>{})}}));return await Promise.all(i),r&&await Promise.allSettled(e.map(a=>a.handle.teardown())),o}import{fileURLToPath as VO}from"node:url";import{dirname as YO}from"node:path";var XO=VO(import.meta.url),G7=YO(XO),ct={name:"research-agent",systemPrompt:`---
1205
+ ${f.partialOutput}`}:{content:f.error?.message??"Plugin skill failed with no output",isError:!0}}catch(p){return{content:`Plugin skill execution error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}finally{d&&await d.teardown().catch(V),await u?.teardownAll(),await l.teardownAll()}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=Ba(this.ctx.pluginConfigs)),this.pluginBodies.get(t)}createDispatchSkillCallback(t){return async(n,r)=>{let o={id:`${t.id}-dispatch-${n}`,name:"skill",input:{name:n,...r!==void 0?{arguments:r}:{}},signal:t.signal},s=await this.execute(o);if(s.isError)throw new Error(s.content);return s.content}}};var go=3;function yr(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}var KO=[...Bt,...at,"memory_search","agent","skill"];function ho(e={}){return({childExecutor:t,childSkillExecutor:n,model:r})=>{let o={permissions:{allowedTools:KO},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{}};return fe(typeof r=="string"?r:void 0)==="openai-compatible"?new _t({...o,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{},readOnlyMemory:!0}):new Ne({...o,readOnlyMemory:!0})}}function yo(e,t,n,r,o,s,i,a){let l=(c,u,d)=>new Gt({parentSession:yr(d),defaultModel:e,apiKey:t,...r!==void 0?{baseUrl:r}:{},depth:c,maxDepth:u,childProviderFactory:n,childSkillExecutorFactory:l,...o!==void 0?{traceWriter:o}:{},...s!==void 0?{backgroundRegistry:s}:{},...i!==void 0?{cwd:i}:{},...a!==void 0?{resolveApiKeyForModel:a}:{}});return l}function bb(e,t){let n={allowedTools:[...nb]};return fe(typeof t=="string"?t:void 0)==="openai-compatible"?new _t({permissions:n}):new Ne({permissions:n})}function wb(e){let t=GO(e);return t!==void 0?t:zO(e)}function GO(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return Sb(n.trim())}function zO(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=qO(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=Sb(r);if(o!==void 0)return o}}function qO(e,t){let n=0,r=!1,o=!1;for(let s=t;s>=0;s--){let i=e[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="}")n++;else if(i==="{"&&(n--,n===0))return s}return-1}function Sb(e){try{return JSON.parse(e)}catch{return}}function Ud(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function kb(e,t,n,r,o){if(!r)return{id:e,status:t,message:n,trace:o};let s=wb(n.content),i=r.safeParse(s);return i.success?{id:e,status:t,message:n,output:i.data,trace:o}:{id:e,status:"failed",message:n,error:new Error(`structured output did not match schema: ${i.error.message}`,{cause:i.error}),schemaError:i.error,trace:o}}function vb(e,t,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:e,status:t,error:o,trace:r}}function Ce(e){return`${e.status}${e.error?`: ${e.error.message}`:""}`}function Tb(e,t){let n=e;return t.partialOutput!==void 0&&t.partialOutput!==null&&(n.partialOutput=t.partialOutput),t.subagentId!==void 0&&(n.subagentId=t.subagentId),n}var Ua=class{constructor(t,n,r,o,s,i,a,l,c,u,d,p,f,g,h){this.id=t;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=i;this.hookRegistry=a;this.onTerminal=l;this.parentInputStreamRef=c;this.parentAbortSignal=u;this.agentType=d;this.traceWriter=g;this.onSubagentSucceeded=h;this.progressSink=p,this.parentId=f}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;onSubagentSucceeded;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;currentTrace=Ud();lastStreamedContent="";get status(){return this.currentStatus}async run(t,n){if(this.currentStatus==="running")throw new Error(`Subagent ${this.id} is already running`);if(this.currentStatus==="cancelled")throw new Error(`Subagent ${this.id} is cancelled`);this.currentStatus="running";let r=Date.now(),o=ha(this.streamToFinalMessage(t,n),this.timeoutMs,{controller:this.controller,label:this.id});this.inFlight=o;try{let s=await o;this.lastMessage=s.content,this.lastDurationMs=Date.now()-r,this.currentStatus="succeeded",this.latestTerminalStatus="succeeded",ir(this.traceWriter,{transition:"succeeded",subagentId:this.id,durationMs:this.lastDurationMs,turnCount:this.currentTrace.turnCount,outputBytes:Buffer.byteLength(this.lastMessage,"utf8")});let i=typeof s.metadata?.totalCostUsd=="number"?s.metadata.totalCostUsd:void 0;return this.onSubagentSucceeded?.(this.currentTrace.usage,i),this.onTerminal(),s}catch(s){throw this.lastDurationMs=Date.now()-r,this.currentStatus!=="cancelled"&&(this.controller.signal.aborted?(ir(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(ir(this.traceWriter,{transition:"failed",subagentId:this.id,errorClass:s instanceof Error?s.constructor.name:"Unknown",errorMessage:s instanceof Error?s.message:String(s),partialOutputBytes:Buffer.byteLength(this.lastStreamedContent,"utf8")}),this.currentStatus="failed",this.latestTerminalStatus="failed")),this.onTerminal(),s}finally{this.inFlight=null}}async streamToFinalMessage(t,n){let r,o;this.lastStreamedContent="",this.currentTrace=Ud();let s=n??this.progressSink??yt(),i={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let a of this.session.sendMessageStream(t)){if(s&&s(a,i),a.type==="chunk"){let l=a.chunk;l.type==="content"?this.lastStreamedContent+=l.content:l.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(a.type==="message")r=a.message,this.currentTrace.turnCount++;else if(a.type==="error"){o=a.error;break}else if(a.type==="done"){if(typeof a.metadata?.usage=="object"&&a.metadata.usage!==null){let l=a.metadata.usage;this.currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}if(o)throw o;if(r)return r;if(this.lastStreamedContent.length>0)return{role:"assistant",content:this.lastStreamedContent,timestamp:new Date};throw new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t,n){try{let r=await this.run(t,n);return kb(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace)}catch(r){let o=vb(this.id,this.currentStatus,r,this.currentTrace);return this.lastStreamedContent.length>0&&(o.partialOutput=this.lastStreamedContent),o}}runInBackground(t,n,r){let o;if(r){let s=this.progressSink??yt();o=(i,a)=>{r(i),s?.(i,a)}}this.runToResult(t,o).then(s=>{n?.(s)}).catch(s=>{V("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled",ir(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"explicit"});try{this.abortGraph.abort(this.id,"cancelled")}catch{}try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(t)}}async teardown(){if(this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(t)}}async dispatchStopAndRelease(t){if(this.stopDispatched){this.onTerminal();return}this.stopDispatched=!0;let n=await ch(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:t,lastMessage:this.lastMessage,agentType:this.agentType,durationMs:this.lastDurationMs,trace:this.currentTrace},this.traceWriter?{traceWriter:this.traceWriter}:{});if(n.injectContext&&this.parentInputStreamRef)if(this.parentAbortSignal?.aborted)V(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else try{this.parentInputStreamRef.pushUserMessage(n.injectContext)}catch(r){V(`Failed to inject context from SubagentStop handler: ${String(r)}`)}this.onTerminal()}};var JO=async(e,t)=>({action:"decline"}),Q=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentCwd;abortGraph;rootId;rootController;counter=0;onSubagentSucceededCb;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,this.parentBaseUrl=t.baseUrl,this.parentCwd=t.cwd,this.onSubagentSucceededCb=t.onSubagentSucceeded,this.abortGraph=new fa(t.traceWriter),this.rootId=`manager-root-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,this.rootController=new AbortController,this.abortGraph.register(this.rootId,this.rootController),t.parentAbortSignal){let n=t.parentAbortSignal;n.aborted?this.rootController.abort(n.reason):n.addEventListener("abort",()=>{this.rootController.signal.aborted||this.rootController.abort(n.reason)},{once:!0})}}list(){return[...this.active.values()].map(t=>({id:t.id,status:t.status}))}get(t){return this.active.get(t)}onChildAborted(t){return this.abortGraph.onChildAborted(this.rootId,t)}setOnSubagentSucceeded(t){this.onSubagentSucceededCb=t}abortAll(t,n="user_signal"){this.abortGraph.abort(this.rootId,t,n)}async forkSubagent(t){if(t.phaseRole!==void 0&&t.phaseRole!=="read-write"&&t.config.provider!==void 0)throw new Error(`SubagentManager.forkSubagent: phaseRole "${t.phaseRole}" is mutually exclusive with config.provider. Remove one \u2014 either let the manager construct the phase-restricted provider, or use config.provider with phaseRole: "read-write" (default).`);let n=`${t.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=t.parent.sessionId,o=t.config.hookRegistry??this.hookRegistry??t.parent.hookRegistry;o&&await lh(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal,...t.config.traceWriter?{traceWriter:t.config.traceWriter}:{}});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let i={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:t.config.apiKey||this.parentApiKey,baseUrl:t.config.baseUrl??this.parentBaseUrl,...t.config.parentSessionId===void 0&&t.parent.sessionId!==void 0?{parentSessionId:t.parent.sessionId}:{},...t.config.phaseRole===void 0&&t.phaseRole!==void 0?{phaseRole:t.phaseRole}:{},...t.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},hookRegistry:o,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...t.denyElicitations===!0?{onElicitation:JO}:{},...t.phaseRole==="read-only"?{provider:bb("read-only",t.config.model)}:{}},a;try{a=new Ye(i)}catch(h){throw this.abortGraph.dispose(n),h}let l=t.parent.getInputStreamRef?.(),c=t.parent.abortSignal,u=this.progressSink??yt(),d=t.agentType?.trim()||void 0,p=t.parentId?.trim()||void 0,f=new Ua(n,a,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??ga,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},l,c,d??t.idPrefix,u,p??t.parent.sessionId,t.config.traceWriter,this.onSubagentSucceededCb);this.active.set(n,f);let g=typeof t.config.model=="string"?t.config.model:JSON.stringify(t.config.model);return ir(t.config.traceWriter,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:g,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{}}),await _e({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:g,parent_session_id:t.parent.sessionId}),f}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}};async function ja(e,t={}){let{failFast:n=!0,teardown:r=!0}=t;if(e.length===0)return[];let o=new Array(e.length),s=new Set(e.map((a,l)=>l)),i=e.map((a,l)=>a.handle.runToResult(a.prompt).then(c=>{if(o[l]=c,s.delete(l),n&&c.status!=="succeeded")for(let u of s){let d=e[u];d&&d.handle.status==="running"&&d.handle.cancel().catch(()=>{})}}));return await Promise.all(i),r&&await Promise.allSettled(e.map(a=>a.handle.teardown())),o}import{fileURLToPath as VO}from"node:url";import{dirname as YO}from"node:path";var XO=VO(import.meta.url),G7=YO(XO),ct={name:"research-agent",systemPrompt:`---
1206
1206
  name: research-agent
1207
1207
  description: Read-only sub-agent for research, validation, verification, and codebase inspection. Mechanically locked to Read, Grep, Glob, WebFetch, WebSearch \u2014 cannot Edit, Write, Bash, commit, or push. Delegates git queries to \`git-investigator\`. Use when the dispatched task is findings-only.
1208
1208
  model: sonnet
@@ -1816,7 +1816,7 @@ Ordered. Higher wins on conflict.
1816
1816
  ## End-of-turn protocol
1817
1817
 
1818
1818
  The end-of-turn terminal-state protocol is injected by \`assembleSystemPrompt()\` for interactive surfaces (REPL, Telegram) only \u2014 see \`src/agent/routing-directive.ts\`. It is intentionally absent here so non-interactive surfaces (one-shot \`chat\`, sub-agent threads) do not receive a directive that would corrupt their stdout consumers.
1819
- `}function vo(){return ot().systemPrompt}function pe(){let e=T.AFK_MODEL??T.CLAUDE_MODEL;return Ze(e)}function Ya(){return Fd()}function Ze(e){return hr(e)}function Qe(){let e=T.AFK_MODEL??T.CLAUDE_MODEL;return!e||e.length===0?"sonnet":e}function kt(e){let t=T.AFK_DEFAULT_SUBAGENT_MODEL;return t&&t.length>0?t:typeof e=="string"&&fe(e)==="openai-compatible"?e:"sonnet"}function Hn(e){if(e===void 0)return;if(e==="adaptive")return{type:"adaptive"};if(e==="disabled")return{type:"disabled"};if(e==="enabled:max")return{type:"enabled",budgetTokens:Number.POSITIVE_INFINITY};let t=/^enabled:(\d+)$/.exec(e);if(t){let n=parseInt(t[1],10);if(Number.isNaN(n))throw new Error(`Invalid thinking budget: ${e}`);return{type:"enabled",budgetTokens:n}}throw new Error(`Invalid --thinking value: ${e}. Expected 'adaptive' | 'disabled' | 'enabled:<N>' | 'enabled:max'`)}var Sw=["low","medium","high","xhigh","max"];function Kn(e){if(e!==void 0){if(Sw.includes(e))return e;throw new Error(`Invalid --effort value: ${e}. Expected one of: ${Sw.join(", ")}`)}}function To(){return Hn(T.AFK_THINKING)}function xo(){return Kn(T.AFK_EFFORT)}function Eo(e){if(e===void 0)return;if(e===""||e==="NaN")throw new Error(`Invalid --max-budget-usd value: ${JSON.stringify(e)}. Expected a non-negative number.`);let t=Number(e);if(!Number.isFinite(t))throw new Error(`Invalid --max-budget-usd value: ${JSON.stringify(e)}. Expected a non-negative number.`);if(t<0)throw new Error(`Invalid --max-budget-usd value: ${JSON.stringify(e)}. Must be non-negative.`);return t}function op(){return Eo(T.AFK_MAX_BUDGET_USD)}function sp(){return Eo(T.AFK_TASK_BUDGET)}function Ro(e){if(e===void 0)return;if(e==="max")return Number.POSITIVE_INFINITY;if(e===""||e==="NaN")throw new Error(`Invalid --max-output-tokens value: ${JSON.stringify(e)}. Expected a positive integer or 'max'.`);if(!/^\d+$/.test(e))throw new Error(`Invalid --max-output-tokens value: ${JSON.stringify(e)}. Expected a positive integer or 'max'.`);let t=Number(e);if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new Error(`Invalid --max-output-tokens value: ${JSON.stringify(e)}. Must be a positive integer.`);return t}function Js(){return Ro(T.AFK_MAX_OUTPUT_TOKENS)}var kw=["anthropic","anthropic-direct","openai-codex","openai","openai-compatible"];function Ao(e,t){let n=e;if(n===void 0&&t?.model!==void 0&&fe(t.model,{...t.openaiBaseUrl!==void 0?{openaiBaseUrl:t.openaiBaseUrl}:{}})==="openai-compatible"&&(n="openai-compatible"),n===void 0)return;if(!kw.includes(n))throw new Error(`Invalid --provider value: ${n}. Expected one of: ${kw.join(", ")}`);let r=()=>{let o=[...Bt,...ln,...at];return t?.subagentExecutor&&o.push("agent"),t?.skillExecutor&&o.push("skill"),t?.composeExecutor&&o.push("compose"),t?.mcpManager&&o.push(...t.mcpManager.getMcpToolWireNames()),o};if(n==="anthropic"||n==="anthropic-direct")return new Fe({permissions:{allowedTools:r()},subagentExecutor:t?.subagentExecutor,skillExecutor:t?.skillExecutor,composeExecutor:t?.composeExecutor,...t?.memoryStore!==void 0?{memoryStore:t.memoryStore}:{},...t?.mcpManager!==void 0?{mcpManager:t.mcpManager}:{}});if(n==="openai"||n==="openai-compatible")return new _t({permissions:{allowedTools:r()},...t?.subagentExecutor!==void 0?{subagentExecutor:t.subagentExecutor}:{},...t?.skillExecutor!==void 0?{skillExecutor:t.skillExecutor}:{},...t?.composeExecutor!==void 0?{composeExecutor:t.composeExecutor}:{},...t?.memoryStore!==void 0?{memoryStore:t.memoryStore}:{},...t?.mcpManager!==void 0?{mcpManager:t.mcpManager}:{},...t?.openaiBaseUrl!==void 0?{baseURL:t.openaiBaseUrl}:{}})}async function vw(e,t,n,r){let s=ve("mint")["spec.md"];if(!s)throw new Error("mint skill missing spec.md prompt");let l=await(await new Q(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:s,apiKey:pe()},idPrefix:"mint-spec",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Create a detailed specification for: ${e}`);if(l.status!=="succeeded"||!l.message)throw new Error(`spec phase failed: ${Ce(l)}`);return l.message.content}async function Tw(e,t,n,r){let s=ve("mint")["research.md"];if(!s)throw new Error("mint skill missing research.md prompt");let l=await(await new Q(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:s,apiKey:pe()},idPrefix:"mint-research",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Gather context and research for this specification:
1819
+ `}function vo(){return ot().systemPrompt}function pe(){let e=T.AFK_MODEL??T.CLAUDE_MODEL;return Ze(e)}function Ya(){return Fd()}function Ze(e){return hr(e)}function Qe(){let e=T.AFK_MODEL??T.CLAUDE_MODEL;return!e||e.length===0?"sonnet":e}function kt(e){let t=T.AFK_DEFAULT_SUBAGENT_MODEL;return t&&t.length>0?t:typeof e=="string"&&fe(e)==="openai-compatible"?e:"sonnet"}function Hn(e){if(e===void 0)return;if(e==="adaptive")return{type:"adaptive"};if(e==="disabled")return{type:"disabled"};if(e==="enabled:max")return{type:"enabled",budgetTokens:Number.POSITIVE_INFINITY};let t=/^enabled:(\d+)$/.exec(e);if(t){let n=parseInt(t[1],10);if(Number.isNaN(n))throw new Error(`Invalid thinking budget: ${e}`);return{type:"enabled",budgetTokens:n}}throw new Error(`Invalid --thinking value: ${e}. Expected 'adaptive' | 'disabled' | 'enabled:<N>' | 'enabled:max'`)}var Sw=["low","medium","high","xhigh","max"];function Kn(e){if(e!==void 0){if(Sw.includes(e))return e;throw new Error(`Invalid --effort value: ${e}. Expected one of: ${Sw.join(", ")}`)}}function To(){return Hn(T.AFK_THINKING)}function xo(){return Kn(T.AFK_EFFORT)}function Eo(e){if(e===void 0)return;if(e===""||e==="NaN")throw new Error(`Invalid --max-budget-usd value: ${JSON.stringify(e)}. Expected a non-negative number.`);let t=Number(e);if(!Number.isFinite(t))throw new Error(`Invalid --max-budget-usd value: ${JSON.stringify(e)}. Expected a non-negative number.`);if(t<0)throw new Error(`Invalid --max-budget-usd value: ${JSON.stringify(e)}. Must be non-negative.`);return t}function op(){return Eo(T.AFK_MAX_BUDGET_USD)}function sp(){return Eo(T.AFK_TASK_BUDGET)}function Ro(e){if(e===void 0)return;if(e==="max")return Number.POSITIVE_INFINITY;if(e===""||e==="NaN")throw new Error(`Invalid --max-output-tokens value: ${JSON.stringify(e)}. Expected a positive integer or 'max'.`);if(!/^\d+$/.test(e))throw new Error(`Invalid --max-output-tokens value: ${JSON.stringify(e)}. Expected a positive integer or 'max'.`);let t=Number(e);if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new Error(`Invalid --max-output-tokens value: ${JSON.stringify(e)}. Must be a positive integer.`);return t}function Js(){return Ro(T.AFK_MAX_OUTPUT_TOKENS)}var kw=["anthropic","anthropic-direct","openai-codex","openai","openai-compatible"];function Ao(e,t){let n=e;if(n===void 0&&t?.model!==void 0&&fe(t.model,{...t.openaiBaseUrl!==void 0?{openaiBaseUrl:t.openaiBaseUrl}:{}})==="openai-compatible"&&(n="openai-compatible"),n===void 0)return;if(!kw.includes(n))throw new Error(`Invalid --provider value: ${n}. Expected one of: ${kw.join(", ")}`);let r=()=>{let o=[...Bt,...ln,...at];return t?.subagentExecutor&&o.push("agent"),t?.skillExecutor&&o.push("skill"),t?.composeExecutor&&o.push("compose"),t?.mcpManager&&o.push(...t.mcpManager.getMcpToolWireNames()),o};if(n==="anthropic"||n==="anthropic-direct")return new Ne({permissions:{allowedTools:r()},subagentExecutor:t?.subagentExecutor,skillExecutor:t?.skillExecutor,composeExecutor:t?.composeExecutor,...t?.memoryStore!==void 0?{memoryStore:t.memoryStore}:{},...t?.mcpManager!==void 0?{mcpManager:t.mcpManager}:{}});if(n==="openai"||n==="openai-compatible")return new _t({permissions:{allowedTools:r()},...t?.subagentExecutor!==void 0?{subagentExecutor:t.subagentExecutor}:{},...t?.skillExecutor!==void 0?{skillExecutor:t.skillExecutor}:{},...t?.composeExecutor!==void 0?{composeExecutor:t.composeExecutor}:{},...t?.memoryStore!==void 0?{memoryStore:t.memoryStore}:{},...t?.mcpManager!==void 0?{mcpManager:t.mcpManager}:{},...t?.openaiBaseUrl!==void 0?{baseURL:t.openaiBaseUrl}:{}})}async function vw(e,t,n,r){let s=ve("mint")["spec.md"];if(!s)throw new Error("mint skill missing spec.md prompt");let l=await(await new Q(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:s,apiKey:pe()},idPrefix:"mint-spec",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Create a detailed specification for: ${e}`);if(l.status!=="succeeded"||!l.message)throw new Error(`spec phase failed: ${Ce(l)}`);return l.message.content}async function Tw(e,t,n,r){let s=ve("mint")["research.md"];if(!s)throw new Error("mint skill missing research.md prompt");let l=await(await new Q(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:s,apiKey:pe()},idPrefix:"mint-research",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Gather context and research for this specification:
1820
1820
 
1821
1821
  ${e}`);if(l.status!=="succeeded"||!l.message)throw new Error(`research phase failed: ${Ce(l)}`);return l.message.content}async function xw(e,t,n,r,o){let i=ve("mint")["plan.md"];if(!i)throw new Error("mint skill missing plan.md prompt");let l=await new Q(r!==void 0?{cwd:r}:{}).forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:i,apiKey:pe()},idPrefix:"mint-plan",phaseRole:"read-only",...o?{parentId:o}:{}}),c=`Specification:
1822
1822
  ${e}
@@ -1947,7 +1947,7 @@ Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`;G();import{mkdirSync
1947
1947
  `);let n=e.options,r=typeof n=="object"&&n!==null?n.systemPrompt:void 0,o=dF(r),s={timestamp:new Date().toISOString(),prompt:e.prompt,options:uF(e.options),provenance:e.provenance,resolution:o};if(t==="1"||t.toLowerCase()==="true"||t.toLowerCase()==="stderr"){let l=JSON.stringify(s,null,2)+`
1948
1948
  `;process.stderr.write(l);return}let i=sF(t),a=iF(i);try{nF(a,{recursive:!0});let c=(!oF(i)?aF:"")+JSON.stringify(s)+`
1949
1949
  `;rF(i,c)}catch(l){let c=`[prompt-dump] Failed to write to ${i}: ${String(l)}
1950
- `;process.stderr.write(c)}}H();G();var Ys="anthropic-direct",uS="claude-sonnet-4-5-20250929",gF=e=>/opus-4-(7|[89])/.test(e),wp=null;var Fe=class{name=Ys;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;subagentExecutor;composeExecutor;surface;readOnlyMemory;mcpManager;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_currentCwd;_mcpToolsCache=null;_mcpHandlersCache=null;_presenceSessionId=null;constructor(t={}){let n=[...an];if(t.subagentExecutor&&n.push(lr),t.skillExecutor&&n.push(cr),t.composeExecutor&&n.push(ur),t.readOnlyMemory===!0?n.push(so):n.push(...Dn),n.push(Ut),this.memoryStore=t.memoryStore??new We,this.externalTools=t.tools,this.skillExecutor=t.skillExecutor,this.schemas=n,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.composeExecutor=t.composeExecutor,this.surface=t.surface??"cli",this.readOnlyMemory=t.readOnlyMemory===!0,this.mcpManager=t.mcpManager,t.mcpManager){let r=t.mcpManager.onToolsRefreshed;t.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}t.clientFactory&&(this.providerFactory=t.clientFactory)}buildDispatcher(t,n){let r=Ia(t,n?.cwd),o=Is(this.memoryStore,void 0,this.surface);for(let[i,a]of o)this.readOnlyMemory&&i!=="memory_search"||r.set(i,a);if(n?.runtimeStateSource&&r.set("get_runtime_state",ao(n.runtimeStateSource)),this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[i,a]of this._mcpHandlersCache)r.set(i,a)}let s=this._mcpToolsCache??[];return new un({handlers:r,schemas:[...this.schemas,...s],hookRegistry:this.hookRegistry,permissions:this.permissions,subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,cwd:n?.cwd,readRoots:n?.readRoots,writeRoots:n?.writeRoots,...n?.env!==void 0?{env:n.env}:{},sessionId:n?.sessionId,parentSessionId:n?.parentSessionId,...n?.traceWriter?{traceWriter:n.traceWriter}:{}})}close(){this.memoryStore.close()}async complete(t){let n=t.apiKey&&t.apiKey.length>0?t.apiKey:T.ANTHROPIC_API_KEY||T.CLAUDE_CODE_OAUTH_TOKEN||"";if(!n)throw new Error(`${Ys} complete() requires an API key or OAuth token (config apiKey, ANTHROPIC_API_KEY, or CLAUDE_CODE_OAUTH_TOKEN)`);let r={token:n,model:t.model??uS,system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.signal&&(r.signal=t.signal);let o=this.providerFactory??wp;return o&&(r.clientFactory=o),ro(r)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t),t&&!this._currentCwd&&(this._currentCwd=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=bp.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=bp.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=bp.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[]}}appendProviderAuditLog(t){try{let n=Vr();mF(fF(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});pF(n,r+`
1950
+ `;process.stderr.write(c)}}H();G();var Ys="anthropic-direct",uS="claude-sonnet-4-5-20250929",gF=e=>/opus-4-(7|[89])/.test(e),wp=null;var Ne=class{name=Ys;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;subagentExecutor;composeExecutor;surface;readOnlyMemory;mcpManager;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_currentCwd;_mcpToolsCache=null;_mcpHandlersCache=null;_presenceSessionId=null;constructor(t={}){let n=[...an];if(t.subagentExecutor&&n.push(lr),t.skillExecutor&&n.push(cr),t.composeExecutor&&n.push(ur),t.readOnlyMemory===!0?n.push(so):n.push(...Dn),n.push(Ut),this.memoryStore=t.memoryStore??new He,this.externalTools=t.tools,this.skillExecutor=t.skillExecutor,this.schemas=n,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.composeExecutor=t.composeExecutor,this.surface=t.surface??"cli",this.readOnlyMemory=t.readOnlyMemory===!0,this.mcpManager=t.mcpManager,t.mcpManager){let r=t.mcpManager.onToolsRefreshed;t.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}t.clientFactory&&(this.providerFactory=t.clientFactory)}buildDispatcher(t,n){let r=Ia(t,n?.cwd),o=Is(this.memoryStore,void 0,this.surface);for(let[i,a]of o)this.readOnlyMemory&&i!=="memory_search"||r.set(i,a);if(n?.runtimeStateSource&&r.set("get_runtime_state",ao(n.runtimeStateSource)),this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[i,a]of this._mcpHandlersCache)r.set(i,a)}let s=this._mcpToolsCache??[];return new un({handlers:r,schemas:[...this.schemas,...s],hookRegistry:this.hookRegistry,permissions:this.permissions,subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,cwd:n?.cwd,readRoots:n?.readRoots,writeRoots:n?.writeRoots,...n?.env!==void 0?{env:n.env}:{},sessionId:n?.sessionId,parentSessionId:n?.parentSessionId,...n?.traceWriter?{traceWriter:n.traceWriter}:{}})}close(){this.memoryStore.close()}async complete(t){let n=t.apiKey&&t.apiKey.length>0?t.apiKey:T.ANTHROPIC_API_KEY||T.CLAUDE_CODE_OAUTH_TOKEN||"";if(!n)throw new Error(`${Ys} complete() requires an API key or OAuth token (config apiKey, ANTHROPIC_API_KEY, or CLAUDE_CODE_OAUTH_TOKEN)`);let r={token:n,model:t.model??uS,system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.signal&&(r.signal=t.signal);let o=this.providerFactory??wp;return o&&(r.clientFactory=o),ro(r)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t),t&&!this._currentCwd&&(this._currentCwd=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=bp.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=bp.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=bp.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[]}}appendProviderAuditLog(t){try{let n=Vr();mF(fF(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});pF(n,r+`
1951
1951
  `)}catch{}}query(t){let n=t.config,r=typeof n.baseUrl=="string"&&n.baseUrl.length>0,o=r?n.apiKey&&n.apiKey.length>0?n.apiKey:T.AFK_LOCAL_API_KEY||"local":n.apiKey&&n.apiKey.length>0?n.apiKey:T.ANTHROPIC_API_KEY||T.CLAUDE_CODE_OAUTH_TOKEN||"";if(!o||o.length===0)throw new Error(`${Ys} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let s=la(o),i=_s(o,s,n.baseUrl),a=this.providerFactory??wp,l=a?a(i):new cS(i),c=r?null:zg(s),u=hF(n.systemPrompt),d=typeof n.model=="string"&&n.model.length>0?sn(n.model)??n.model:uS,p=bF(n,d),f=n.permissionMode??"default";this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let g,h=Ps({surface:this.surface,cwd:n.cwd??process.cwd(),modelName:d,providerName:Ys,permissionMode:f,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>g instanceof un?g.toolDefs.map(B=>B.name):[],getMcpTools:()=>this.mcpManager?.getMcpTools()??[],getSubagents:()=>this.subagentExecutor?this.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});if((n.depth===void 0||n.depth===0)&&n.parentSessionId===void 0&&n.sessionId!==void 0&&this._presenceSessionId===null){this._presenceSessionId=n.sessionId;let B=n.sessionId,F=h.getWorkspace();Os({sessionId:B,surface:this.surface,cwd:n.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:Ys,name:d},workspace:F,pid:process.pid}),process.once("exit",()=>{cn(B)}),process.once("SIGINT",()=>{cn(B),process.exit(130)}),process.once("SIGTERM",()=>{cn(B),process.exit(143)})}g=this.externalTools?Ms(this.externalTools,h):this.buildDispatcher(f,{cwd:n.cwd,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,parentSessionId:n.parentSessionId,traceWriter:n.traceWriter,runtimeStateSource:h});let y=g instanceof un?[...g.toolDefs]:[...an,Ut],w=n.isSkillDispatch?y.filter(B=>B.name!=="ask_question"&&B.name!=="terminal_font_size"):y,v=this.skillExecutor?Ww():"",R=n.cwd||process.cwd(),S=n.isSkillDispatch?tl:`${tl}
1952
1952
 
1953
1953
  ${gp}
@@ -1956,7 +1956,7 @@ ${hp}`,E=this.readOnlyMemory?aS:iS,_=[S,E];_.push(io({cwd:R,...n.sessionId!==voi
1956
1956
 
1957
1957
  `),I=[S,E];v.length>0&&I.push(v),u&&I.push(u),lS({prompt:t.prompt,options:{model:d,maxTokens:p,system:C},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 B=this.providerFactory??wp;P=async()=>{let F=await Ku();if(!F)return null;let D=_s(F,"oauth",n.baseUrl);return B?B(D):new cS(D)}}let A=n.sessionId??n.resume,L=wF(n.resumeHistory),O=this.externalTools?void 0:B=>{let F=this._currentCwd;if(this._sharedReadRoots&&F!==void 0&&F!==B){let U=this._sharedReadRoots.indexOf(F);U!==-1?this._sharedReadRoots[U]=B:this._sharedReadRoots.includes(B)||this._sharedReadRoots.push(B)}if(this._sharedWriteRoots&&F!==void 0&&F!==B){let U=this._sharedWriteRoots.indexOf(F);U!==-1?this._sharedWriteRoots[U]=B:this._sharedWriteRoots.includes(B)||this._sharedWriteRoots.push(B)}this._currentCwd=B;let x=[I[0],I[1],io({cwd:B,...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()}),...I.slice(2)].join(`
1958
1958
 
1959
- `),M=this.buildDispatcher(f,{cwd:B,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,parentSessionId:n.parentSessionId,traceWriter:n.traceWriter,runtimeStateSource:h});return{userSystem:x,dispatcher:M}},j=kF(n.effort,d);return new el({client:l,authMode:r?"api-key":s,promptStream:t.prompt,toolDispatcher:g,...A!==void 0?{sessionId:A}:{},...L!==void 0?{initialMessages:L}:{},model:d,requestedModel:typeof n.model=="string"&&n.model.length>0?n.model:d,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:w,userSystem:C,systemPrefix:c,tokenRefresher:P,...n.thinking!==void 0?{thinking:SF(n.thinking,p,d)}:{},...j!==void 0?{effort:j}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...O!==void 0?{cwdDependentsFactory:O}:{},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...dS(n.autoCompact)!==void 0?{autoCompactThreshold:dS(n.autoCompact)}:{}})}};function hF(e){if(e===void 0)return null;if(typeof e=="string")return e.length>0?e:null;if(typeof e=="object"&&e!==null&&"append"in e){let t=e.append;return t&&t.length>0?t:null}return null}var yF=.9;function dS(e){if(e===void 0||e===!1)return;if(e===!0)return yF;let t=e.threshold;if(!(typeof t!="number"||!Number.isFinite(t)||t<=0||t>=1))return t}function bF(e,t){let n=e.maxOutputTokens;return typeof n=="number"&&Number.isFinite(n)&&n>0?Math.floor(n):Rd(t)}function wF(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 SF(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&gF(n))return{type:"adaptive",display:"summarized"};let r=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.min(e.budgetTokens,t-1):t-1;return{type:"enabled",budget_tokens:Math.max(r,1024),display:"summarized"}}}}function kF(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[678]/.test(n))return"max"}var vF=new Fe;G();var TF=new Set([...Object.keys(ca),"auto"]);function xF(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 fe(e,t){let n=t?.explicit??T.AFK_PROVIDER,r=t?.openaiBaseUrl??T.AFK_OPENAI_BASE_URL,o=xF(n);if(o)return o;let s=(e??"").trim().toLowerCase();return s&&(TF.has(s)||s.startsWith("claude-")||s.startsWith("claude_")||s.startsWith("local-")||s.startsWith("local_"))?"anthropic-direct":s&&(s.startsWith("gpt-")||s.startsWith("gpt_")||s.startsWith("o1")||s.startsWith("o3")||s.startsWith("o4")||s.startsWith("codex-")||s.startsWith("codex_")||s==="codex"||s.startsWith("deepseek-")||s.startsWith("deepseek_")||s.startsWith("mistral-")||s.startsWith("mistral_")||s.startsWith("mixtral-")||s.startsWith("mixtral_")||s.startsWith("llama-")||s.startsWith("llama_")||s.startsWith("qwen-")||s.startsWith("qwen_")||s.includes("/"))||r&&r.trim()?"openai-compatible":"anthropic-direct"}function nl(e,t){switch(fe(e,t)){case"openai-compatible":case"openai-codex":return new _t;default:return new Fe}}async function rl(e,t,n){if(!e)return;if(n.kind==="blocked"){await to(e,{hookEvent:t,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await to(e,{hookEvent:t,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function pS(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await rl(n.traceWriter,"SessionStart",{kind:"decision",decision:r})}catch(r){throw r instanceof Ie&&await rl(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function mS(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await rl(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof Ie&&await rl(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof Ie||r instanceof mt){V(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}V(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var ol=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 fS(e,t,n){e&&(e.aborted?t.abort(e.reason):e.addEventListener("abort",()=>{t.signal.aborted||t.abort(e.reason)},{once:!0})),t.signal.addEventListener("abort",n,{once:!0})}function gS(e,t){let n=e.permissionMode??"default",r=e.persistSession??!0,o={sessionId:e.sessionId,configuredSessionId:e.sessionId,resume:e.resume,resumeSessionAt:e.resumeSessionAt,continue:e.continue,forkSession:e.forkSession,persistSession:r},s={sessionId:e.sessionId,model:t,permissionMode:n};return{sessionIdentity:o,metadata:s}}var sl=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(t,n){this.sessionIdentity=t,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(t){t&&(this.sessionIdentity={...this.sessionIdentity,sessionId:t},this.sessionMetadata={...this.sessionMetadata,sessionId:t})}setSessionMetadata(t){this.sessionMetadata=t(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(t){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(t))}isInitializationSettled(){return this.initializationSettled}};function hS(e){try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=t.length;if(n===0)return"no results";let r=0,o=0;for(let a of t)if(a&&typeof a=="object"){let l=a.type;l==="fact"?r++:l==="procedure"&&o++}let s=`${n} result${n===1?"":"s"}`;if(r+o!==n)return s;let i=[];return r>0&&i.push(`${r} fact${r===1?"":"s"}`),o>0&&i.push(`${o} procedure${o===1?"":"s"}`),i.length===0?s:`${s} (${i.join(", ")})`}catch{return null}}function yS(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;if(n.target==="hot"&&n.saved===!0)return"hot memory saved";if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function bS(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}function Sp(e){let t=e.trim();if(t.length===0)return null;let n=t[0];if(n!=="{"&&n!=="[")return null;let r=t[t.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(t)}catch{return null}return Array.isArray(o)?wS(EF(o)):o!==null&&typeof o=="object"?wS(RF(o)):null}function EF(e){return e.length===0?"[empty array]":e.length===1?"[1 item]":`[${e.length} items]`}function RF(e){let t=Object.keys(e);if(t.length===0)return"{empty object}";let n=t.slice(0,4),r=t.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function wS(e){return e.length<=80?e:e.slice(0,79)+"\u2026"}var AF=new Map([["memory_search",hS],["memory_update",yS],["procedure_write",bS],["bash",Sp],["Bash",Sp]]);function SS(e,t){if(!e)return null;let n=AF.get(e);if(!n)return null;try{let r=n(t);if(r===null)return null;let o=hh(r);return o.length>0?o:null}catch{return null}}function _F(e){let t=/Output too large \((\d+(?:\.\d+)?)\s*(B|KB|MB|GB)\)\.\s*Full output saved to:\s*(\/[^\n]+)/,n=e.match(t);if(!n||!n[1]||!n[2]||!n[3])return null;let r=n[1],o=n[2],s=n[3],i=parseFloat(r),a=i;o==="KB"?a=i*1024:o==="MB"?a=i*1024*1024:o==="GB"&&(a=i*1024*1024*1024);let l=r;return i%1===0&&(l=String(Math.floor(i))),l+=o,{sizeLabel:l,sizeBytes:Math.round(a),absolutePath:s.trim()}}function CF(e){if(e<1024)return`${e}B`;let t=e/1024;if(t<1024)return t%1===0?`${Math.floor(t)}KB`:`${t.toFixed(1)}KB`;let n=t/1024;if(n<1024)return n%1===0?`${Math.floor(n)}MB`:`${n.toFixed(1)}MB`;let r=n/1024;return r%1===0?`${Math.floor(r)}GB`:`${r.toFixed(1)}GB`}function IF(e){let t=Buffer.byteLength(e,"utf8"),n=CF(t),r=e.split(`
1959
+ `),M=this.buildDispatcher(f,{cwd:B,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,parentSessionId:n.parentSessionId,traceWriter:n.traceWriter,runtimeStateSource:h});return{userSystem:x,dispatcher:M}},j=kF(n.effort,d);return new el({client:l,authMode:r?"api-key":s,promptStream:t.prompt,toolDispatcher:g,...A!==void 0?{sessionId:A}:{},...L!==void 0?{initialMessages:L}:{},model:d,requestedModel:typeof n.model=="string"&&n.model.length>0?n.model:d,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:w,userSystem:C,systemPrefix:c,tokenRefresher:P,...n.thinking!==void 0?{thinking:SF(n.thinking,p,d)}:{},...j!==void 0?{effort:j}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...O!==void 0?{cwdDependentsFactory:O}:{},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...dS(n.autoCompact)!==void 0?{autoCompactThreshold:dS(n.autoCompact)}:{}})}};function hF(e){if(e===void 0)return null;if(typeof e=="string")return e.length>0?e:null;if(typeof e=="object"&&e!==null&&"append"in e){let t=e.append;return t&&t.length>0?t:null}return null}var yF=.9;function dS(e){if(e===void 0||e===!1)return;if(e===!0)return yF;let t=e.threshold;if(!(typeof t!="number"||!Number.isFinite(t)||t<=0||t>=1))return t}function bF(e,t){let n=e.maxOutputTokens;return typeof n=="number"&&Number.isFinite(n)&&n>0?Math.floor(n):Rd(t)}function wF(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 SF(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&gF(n))return{type:"adaptive",display:"summarized"};let r=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.min(e.budgetTokens,t-1):t-1;return{type:"enabled",budget_tokens:Math.max(r,1024),display:"summarized"}}}}function kF(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[678]/.test(n))return"max"}var vF=new Ne;G();var TF=new Set([...Object.keys(ca),"auto"]);function xF(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 fe(e,t){let n=t?.explicit??T.AFK_PROVIDER,r=t?.openaiBaseUrl??T.AFK_OPENAI_BASE_URL,o=xF(n);if(o)return o;let s=(e??"").trim().toLowerCase();return s&&(TF.has(s)||s.startsWith("claude-")||s.startsWith("claude_")||s.startsWith("local-")||s.startsWith("local_"))?"anthropic-direct":s&&(s.startsWith("gpt-")||s.startsWith("gpt_")||s.startsWith("o1")||s.startsWith("o3")||s.startsWith("o4")||s.startsWith("codex-")||s.startsWith("codex_")||s==="codex"||s.startsWith("deepseek-")||s.startsWith("deepseek_")||s.startsWith("mistral-")||s.startsWith("mistral_")||s.startsWith("mixtral-")||s.startsWith("mixtral_")||s.startsWith("llama-")||s.startsWith("llama_")||s.startsWith("qwen-")||s.startsWith("qwen_")||s.includes("/"))||r&&r.trim()?"openai-compatible":"anthropic-direct"}function nl(e,t){switch(fe(e,t)){case"openai-compatible":case"openai-codex":return new _t;default:return new Ne}}async function rl(e,t,n){if(!e)return;if(n.kind==="blocked"){await to(e,{hookEvent:t,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await to(e,{hookEvent:t,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function pS(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await rl(n.traceWriter,"SessionStart",{kind:"decision",decision:r})}catch(r){throw r instanceof Ie&&await rl(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function mS(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await rl(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof Ie&&await rl(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof Ie||r instanceof mt){V(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}V(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var ol=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 fS(e,t,n){e&&(e.aborted?t.abort(e.reason):e.addEventListener("abort",()=>{t.signal.aborted||t.abort(e.reason)},{once:!0})),t.signal.addEventListener("abort",n,{once:!0})}function gS(e,t){let n=e.permissionMode??"default",r=e.persistSession??!0,o={sessionId:e.sessionId,configuredSessionId:e.sessionId,resume:e.resume,resumeSessionAt:e.resumeSessionAt,continue:e.continue,forkSession:e.forkSession,persistSession:r},s={sessionId:e.sessionId,model:t,permissionMode:n};return{sessionIdentity:o,metadata:s}}var sl=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(t,n){this.sessionIdentity=t,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(t){t&&(this.sessionIdentity={...this.sessionIdentity,sessionId:t},this.sessionMetadata={...this.sessionMetadata,sessionId:t})}setSessionMetadata(t){this.sessionMetadata=t(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(t){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(t))}isInitializationSettled(){return this.initializationSettled}};function hS(e){try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=t.length;if(n===0)return"no results";let r=0,o=0;for(let a of t)if(a&&typeof a=="object"){let l=a.type;l==="fact"?r++:l==="procedure"&&o++}let s=`${n} result${n===1?"":"s"}`;if(r+o!==n)return s;let i=[];return r>0&&i.push(`${r} fact${r===1?"":"s"}`),o>0&&i.push(`${o} procedure${o===1?"":"s"}`),i.length===0?s:`${s} (${i.join(", ")})`}catch{return null}}function yS(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;if(n.target==="hot"&&n.saved===!0)return"hot memory saved";if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function bS(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}function Sp(e){let t=e.trim();if(t.length===0)return null;let n=t[0];if(n!=="{"&&n!=="[")return null;let r=t[t.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(t)}catch{return null}return Array.isArray(o)?wS(EF(o)):o!==null&&typeof o=="object"?wS(RF(o)):null}function EF(e){return e.length===0?"[empty array]":e.length===1?"[1 item]":`[${e.length} items]`}function RF(e){let t=Object.keys(e);if(t.length===0)return"{empty object}";let n=t.slice(0,4),r=t.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function wS(e){return e.length<=80?e:e.slice(0,79)+"\u2026"}var AF=new Map([["memory_search",hS],["memory_update",yS],["procedure_write",bS],["bash",Sp],["Bash",Sp]]);function SS(e,t){if(!e)return null;let n=AF.get(e);if(!n)return null;try{let r=n(t);if(r===null)return null;let o=hh(r);return o.length>0?o:null}catch{return null}}function _F(e){let t=/Output too large \((\d+(?:\.\d+)?)\s*(B|KB|MB|GB)\)\.\s*Full output saved to:\s*(\/[^\n]+)/,n=e.match(t);if(!n||!n[1]||!n[2]||!n[3])return null;let r=n[1],o=n[2],s=n[3],i=parseFloat(r),a=i;o==="KB"?a=i*1024:o==="MB"?a=i*1024*1024:o==="GB"&&(a=i*1024*1024*1024);let l=r;return i%1===0&&(l=String(Math.floor(i))),l+=o,{sizeLabel:l,sizeBytes:Math.round(a),absolutePath:s.trim()}}function CF(e){if(e<1024)return`${e}B`;let t=e/1024;if(t<1024)return t%1===0?`${Math.floor(t)}KB`:`${t.toFixed(1)}KB`;let n=t/1024;if(n<1024)return n%1===0?`${Math.floor(n)}MB`:`${n.toFixed(1)}MB`;let r=n/1024;return r%1===0?`${Math.floor(r)}GB`:`${r.toFixed(1)}GB`}function IF(e){let t=Buffer.byteLength(e,"utf8"),n=CF(t),r=e.split(`
1960
1960
  `);if(r.length<=1&&e.length<=80)return{content:e,truncated:!1,sizeBytes:t,sizeLabel:n};if(r.length<=1)return e.length<=80?{content:e,truncated:!1,sizeBytes:t,sizeLabel:n}:{content:e.substring(0,80)+"\u2026",truncated:!0,sizeBytes:t,sizeLabel:n};if(e.length<=80)return{content:e,truncated:!1,sizeBytes:t,sizeLabel:n};let o=r[0]??"",s=o;return o.length>80&&(s=o.substring(0,80)+"\u2026"),{content:s+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:t,sizeLabel:n}}function PF(e,t){let n={...e.raw??{}};return e.inputTokens!==void 0&&(n.input_tokens=e.inputTokens),e.outputTokens!==void 0&&(n.output_tokens=e.outputTokens),e.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=e.cachedInputTokens),e.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=e.cacheCreationTokens),e.totalTokens!==void 0&&(n.total_tokens=e.totalTokens),e.contextWindowTokens!==void 0&&(n.context_window_tokens=e.contextWindowTokens),{sessionId:t,stopReason:e.stopReason??void 0,resultSubtype:e.resultSubtype,durationMs:e.durationMs,durationApiMs:e.durationApiMs,totalCostUsd:e.totalCostUsd,isError:e.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:e.modelUsage,permissionDenials:e.permissionDenials,errors:e.errors}}function MF(e){let t=e.isError===!0?null:SS(e.toolName,e.content),n=t!==null?{display:t}:{},r=_F(e.content);if(r)return{type:"chunk",chunk:{type:"tool_result",toolUseId:e.toolUseId,content:`Output persisted (${r.sizeLabel}) \u2192 ${r.absolutePath}`,isError:e.isError===!0,persistedPath:r.absolutePath,sizeBytes:r.sizeBytes,sizeLabel:r.sizeLabel,...n}};let{content:o,lineCount:s,sizeBytes:i,sizeLabel:a}=IF(e.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:e.toolUseId,content:o,isError:e.isError===!0,sizeBytes:i,sizeLabel:a,...e.truncated===!0&&{truncated:!0},...s!==void 0&&{lineCount:s},...n}}}function kp(e,t){switch(e.type){case"session.init":{let n=e.info;return t.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),t.updateSessionIdentity(n.sessionId),t.resolveInitialization(),null}case"session.status":return t.setSessionMetadata(n=>({...n,sessionId:e.sessionId,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{permissionMode:n.permissionMode},...e.status!==void 0?{status:e.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:e.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:e.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(e.sessionId&&t.updateSessionIdentity(e.sessionId),e.text){let n={role:"assistant",content:e.text,timestamp:new Date};return t.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:e.toolUseId,toolName:e.toolName,toolInput:e.toolInput}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:e.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:e.toolUseIds}}};case"tool.output":return MF(e);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:e.toolUseId,diff:e.diff}};case"progress":return{type:"progress",progress:{taskId:e.progress.taskId,description:e.progress.description,...e.progress.summary!==void 0?{summary:e.progress.summary}:{},...e.progress.lastToolName!==void 0?{lastToolName:e.progress.lastToolName}:{},totalTokens:e.progress.totalTokens,toolUses:e.progress.toolUses,durationMs:e.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:e.suggestion};case"turn.completed":{let n=PF(e.usage,e.sessionId??t.getSessionMetadata().sessionId);t.setLastResponseMetadata(n);for(let r=t.conversationHistory.length-1;r>=0;r--){let o=t.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(t.maxBudgetUsd!==void 0&&t.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(t._runningCostUsd=(t._runningCostUsd??0)+n.totalCostUsd,t._runningCostUsd>=t.maxBudgetUsd)){jg(t.traceWriter,{kind:"monetary",runningCostUsd:t._runningCostUsd,maxBudgetUsd:t.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new Cn(t._runningCostUsd,t.maxBudgetUsd);return t.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:e.error};case"paused":return{type:"paused",reason:e.reason,...e.resetsAt!==void 0?{resetsAt:e.resetsAt}:{},...e.accountId!==void 0?{accountId:e.accountId}:{},...e.autoResume!==void 0?{autoResume:e.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:e.hotSwapped,...e.accountId!==void 0?{accountId:e.accountId}:{}};default:return null}}var Ye=class{config;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;constructor(t){this.config=t,this.abortController=new AbortController,this._hookRegistry=t.hookRegistry,fS(t.abortSignal,this.abortController,()=>{this.onAbort()}),Je(t.traceWriter,{phase:"session_init_start"}),this.initSdkLifecycle()}initSdkLifecycle(){let t=sn(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=gS(this.config,t);this.stateManager=new sl(n,r),this.inputStream=new ol(()=>this.sessionId);let o=this.config.provider??nl(t);V(`\u{1F7E2} AgentSession: Creating query session via provider=${o.name}`),this.providerQuery=o.query({prompt:this.inputStream.createIterable(),config:this.config}),this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0;let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{for(await pS(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});;){let t=await this.providerIterator.next();if(t.done){this.stateManager.resolveInitializationIfNeeded();return}let n=t.value,r=kp(n,this.buildTransformDeps());if(n.type==="session.init"){await Je(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(r&&r.type==="error")return}}catch(t){let n=t instanceof Error?t:new Error(String(t));this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:t=>this.stateManager.setSessionMetadata(t),updateSessionIdentity:t=>this.stateManager.updateSessionIdentity(t),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:t=>{this.lastResponseMetadata=t,typeof t.totalCostUsd=="number"&&Number.isFinite(t.totalCostUsd)&&(this.sessionRunningCostUsd+=t.totalCostUsd);let n=t.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let a=r[s];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[i]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof t.stopReason=="string"&&(this.lastStopReason=t.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:t=>{this.abortController.signal.aborted||this.abortController.abort(t)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(t){if(t==="closed"||t.startsWith("Budget ")||t.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${t}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(t)}async sendMessage(t,n={}){this.assertCanSend();let r=this.config.timeoutMs??ga,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(t)){if(a.type==="chunk"&&a.chunk.type==="content"&&(i+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(s=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(s)return{...s,metadata:a.metadata};if(i)return{role:"assistant",content:i,metadata:a.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await ha(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async*sendMessageStream(t){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(t)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(t){this.initPromise&&await this.initPromise;let r={role:"user",content:typeof t=="string"?t:this.summarizeContentBlocks(t),timestamp:new Date};this.conversationHistory.push(r),this.inputStream.pushUserMessage(t);let o=this.buildTransformDeps();try{for(;;){let s=await this.providerIterator.next();if(s.done)break;let i=s.value,a=kp(i,o);if(a&&(a.type==="done"&&this.turnCount++,yield a,a.type==="done"||a.type==="error"))break}}finally{this.currentState==="streaming"&&(this.currentState="idle")}}summarizeContentBlocks(t){let n=[],r=0;for(let s of t)s.type==="text"?n.push(s.text):s.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new mt("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(t=>setTimeout(t,zu))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(t){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${t instanceof Error?t.message:String(t)}`,{cause:t})}}async onAbort(){try{await this.providerQuery.interrupt()}catch{}}async setModel(t){let n=sn(t);typeof t=="string"&&t.length>0&&await this.providerQuery.setModel(t),n&&this.stateManager.setSessionMetadata(r=>({...r,model:n}))}async setPermissionMode(t){await this.providerQuery.setPermissionMode(t),this.stateManager.setSessionMetadata(n=>({...n,permissionMode:t}))}setCwd(t){this.config={...this.config,cwd:t},this.providerQuery.setCwd?.(t)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(t,n){return this.providerQuery.rewindFiles(t,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let t=this.providerQuery.compact?.bind(this.providerQuery);if(!t)return{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0};this.currentState="compacting";try{return await t()}finally{this.currentState="idle"}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}getInputStreamRef(){return{pushUserMessage:t=>this.inputStream.pushUserMessage(t)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(t=>setTimeout(t,zu))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(t){this.sessionEndDispatched||(this.sessionEndDispatched=!0,await this.emitClosure(t).catch(()=>{}),await this.sealTraceWriter(t).catch(()=>{}),await mS(this._hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:t,parentSessionId:this.config.parentSessionId},this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}))}async emitClosure(t){let n=this.config.traceWriter;if(!n)return;let r=this.deriveClosureReason(t),o={};this.sessionRunningTokens.input>0&&(o.input=this.sessionRunningTokens.input),this.sessionRunningTokens.output>0&&(o.output=this.sessionRunningTokens.output),this.sessionRunningTokens.cacheRead>0&&(o.cacheRead=this.sessionRunningTokens.cacheRead),this.sessionRunningTokens.cacheCreation>0&&(o.cacheCreation=this.sessionRunningTokens.cacheCreation),await Kg(n,{reason:r,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,finalTokens:o,...this.lastStopReason!==void 0?{lastStopReason:this.lastStopReason}:{}})}deriveClosureReason(t){if(t==="error")return"abort";let n=this.abortController.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;if(r instanceof Cn)return"budget_exceeded";if(r instanceof ft)return"timeout";if(typeof r=="string"){if(r.startsWith("Budget "))return"budget_exceeded";if(r.includes("timed out"))return"timeout"}return"abort"}return"model_end_turn"}async sealTraceWriter(t){let n=this.config.traceWriter;if(!n)return;let r=this.deriveSealStatus(t),o=this.subagentCompletedCount>0?this.subagentCompletedCount:void 0,s=this.subagentRunningTokens,a=s.input>0||s.output>0||s.cacheRead>0||s.cacheCreation>0?{...s.input>0?{input:s.input}:{},...s.output>0?{output:s.output}:{},...s.cacheRead>0?{cacheRead:s.cacheRead}:{},...s.cacheCreation>0?{cacheCreation:s.cacheCreation}:{}}:void 0,l=this.subagentRunningCostUsd>0?this.subagentRunningCostUsd:void 0;await n.seal({status:r,finalCostUsd:this.sessionRunningCostUsd,finalTurnCount:this.turnCount,closedAt:new Date().toISOString(),...o!==void 0?{subagentCount:o}:{},...a!==void 0?{subagentTokens:a}:{},...l!==void 0?{subagentCostUsd:l}:{}})}recordSubagentCompletion(t,n){if(this.subagentCompletedCount++,t){let r=(o,s)=>{typeof o=="number"&&Number.isFinite(o)&&o>0&&(this.subagentRunningTokens[s]+=o)};r(t.inputTokens,"input"),r(t.outputTokens,"output"),r(t.cacheReadTokens,"cacheRead"),r(t.cacheCreationTokens,"cacheCreation")}typeof n=="number"&&Number.isFinite(n)&&n>0&&(this.subagentRunningCostUsd+=n)}deriveSealStatus(t){if(t==="error")return"failed";let n=this.abortController.signal;return n.aborted&&n.reason!=="closed"?"cancelled":"succeeded"}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new mt("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming"||this.currentState==="compacting")throw new Error("Cannot send message: session is busy");if(this.config.maxTurns&&this.turnCount>=this.config.maxTurns)throw new Error(`Maximum turns (${this.config.maxTurns}) exceeded`)}};function kS(){return ah()}var OF=["shadow-verify","shadow_verify","resolve","diagnose","appmap","qualify","mint","review"],$F=[/\bverdict(s)?\b/i,/\brecommend(ation)?s?\b/i,/\bshould\s+(delete|remove|rewrite|refactor|rename|reject|merge|revert|disable)\b/i,/\b(USELESS|KEEP|REJECT|APPROVE|SALVAGE|BLOCK|FAIL)\b/,/\b(redundant|duplicated|superseded|obsolete)\b/i,/\bvulnerab\w*\b/i,/\bunused\b/i,/\bbroken\b/i,/\bregress\w*\b/i,/\|\s*(status|verdict|decision|severity|risk|finding|priority|holds\??)\s*\|/i,/\bfound\s+\d+\s*(issue|problem|bug|error|finding|vulnerabilit)/i,/\b(critical|high|medium|low)\s+(severity|priority|risk)\b/i,/\bclaim(s)?\b[^\n]{0,80}\b(holds?|refuted|verified|partial|confirmed|disputed)\b/i,/\b(root\s*cause|incident)\b/i,/\brecommend\s+(removing|deleting|rewriting|refactoring|merging|reverting)\b/i,/\bI\s+(applied|committed|pushed|edited|wrote|fixed|patched|reset|restored|staged)\b/i,/\b(applied|committed|pushed|fixed|patched)\s+(the|these|those)\s+(change|commit|fix|patch|edit)/i],DF=[/\bverifier_verdict\b/i,/"\s*claim\s*"\s*:/i,/\bre-derived\b[^.\n]{0,80}\bindependent/i,/\bindependently\s+(re-derived|re-verified|verified|checked)\b/i,/\bverifier\s+(agrees|disagrees|confirms|refutes)\b/i],LF=`shadow-verify nudge:
1961
1961
 
1962
1962
  The sub-agent that just finished returned output that reads like **decision-driving findings** (verdicts, recommendations, audit conclusions, or claim-style results that could drive file edits, deletions, commits, or external side-effects).
@@ -1988,7 +1988,7 @@ ${P}`:_.prompt},model:_.model??this.ctx.defaultSubagentModel??this.ctx.defaultMo
1988
1988
  ${v.map(_=>`> - ${_}`).join(`
1989
1989
  `)}
1990
1990
 
1991
- `:"")+b,E=g.failed.length>0;return{content:S,isError:E}}catch(d){let p=d instanceof Error?d.message:String(d);return _e({event:"compose.failed",parent_session_id:this.ctx.parentSession.sessionId,error_message:p.slice(0,240),duration_ms:Date.now()-u}).catch(()=>{}),{content:`Compose execution error: ${p}`,isError:!0}}finally{await l.teardownAll()}}};function Po(e,t,n,r){let o=kS();o.register("SubagentStop",vS);let s=n??new We;return r!==void 0&&o.register("PreToolUse",TS(r)),o.register("SessionEnd",Ed(s,t)),o.register("SessionEnd",i=>i.event!=="SessionEnd"?{}:(i.sessionId&&PS(i.sessionId),{})),e&&o.register("SubagentStop",i=>i.event!=="SubagentStop"?{}:i.status==="idle"||i.status==="running"?{}:(e({subagentId:i.subagentId,status:i.status,durationMs:i.durationMs,agentType:i.agentType}),{})),{registry:o,memoryStore:s}}function ne(e){let t=Math.round(e/1e3);if(t<=0)return"0s";let n=Math.floor(t/86400),r=Math.floor(t%86400/3600),o=Math.floor(t%3600/60),s=t%60;return n>0?`${n}d ${r}h`:r>0?`${r}h ${o}m`:o>0?`${o}m ${s}s`:`${s}s`}function Ne(e){return e===0?"$0.00":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function re(e){if(!Number.isFinite(e))return"0";if(e<1e3)return String(e);if(e<1e6){let n=e/1e3;return n%1===0?`${n}k`:`${n.toFixed(1).replace(/\.0$/,"")}k`}let t=e/1e6;return t%1===0?`${t}m`:`${t.toFixed(1).replace(/\.0$/,"")}m`}var ZF="[skill-routing: active]\n\nRoute recurring work through registered skills instead of rolling ad-hoc solutions:\n\n- Before non-trivial implementation (multi-file edits, new features, config/build changes \u2014 anything that writes) \u2192 `/ground-state` first. Do NOT substitute inline `git status`/`get_runtime_state` \u2014 the skill triangulates git + infra + prior-session memory in parallel, which the inline checks miss. If `/ground-state` dispatch fails (depth limit, unavailable), fall back to inline checks AND note the coverage gap.\n- Bugs, failing tests, or regressions \u2192 `/diagnose`\n- High-stakes sub-agent output that will drive edits or commits \u2192 `/shadow-verify` before acting\n- Refactor needing parallel waves \u2192 `/parallelize`\n- Parallel or dependent multi-task work \u2192 `compose` tool (DAG of subagent nodes)\n- Greenfield feature where a written spec would genuinely help (novel scope, multi-day work, or external stakeholders involved) \u2192 `/mint`\n\nDo NOT reach for `/mint` for: bug fixes (use `/diagnose`), refactors with known shape, single-feature edits, work already spec'd in chat, or anything where the spec/approve pause would feel like ceremony. Implement directly in those cases.\n\nCommon composed sequences \u2014 reach for these when the task shape matches:\n\n- Bug with failing test and non-trivial fix \u2192 `/diagnose` \u2192 `/shadow-verify` on the proposed fix\n- Refactor needing parallel waves \u2192 plan \u2192 `/parallelize` \u2192 build waves\n- Diagnose + fix in parallel \u2192 `compose` with two independent nodes\n- Research \u2192 implement \u2192 verify pipeline \u2192 `compose` with edges: research\u2192implement\u2192verify\n- Multiple independent investigations \u2192 `compose` with N nodes, no edges\n\nReach for context-isolated investigators when the task is exploratory:\n\n- Map an unfamiliar module before editing \u2192 `/gather` or `/research`\n- Re-derive a load-bearing claim independently \u2192 `/shadow-verify`\n- Audit a diff before merge \u2192 `/review`\n- Generate alternatives before committing to a plan \u2192 `/devils-advocate`\n\nOr dispatch a raw `agent` call when no skill matches but the work is parallelizable, verification-heavy, or would otherwise consume substantial inline context.\n\nSkip orchestration for: single-line edits, trivial Q&A, and direct tool calls the user explicitly requested. The goal is leverage, not ceremony. If a skill would add overhead without adding value, don't invoke it.\n\nDefault to acting autonomously. `ask_question` is a last resort, not a first move \u2014 every question blocks on the operator, who is often away from keyboard.\n\nBefore you ask, you MUST exhaust the tools you have: read the files, check git, search the codebase and docs, inspect runtime state. If any tool can get you the answer, use the tool \u2014 never ask the operator for something you can discover yourself. When a wrong guess would be cheap or reversible, make a reasonable assumption, proceed, and state the assumption instead of asking.\n\nReserve `ask_question` for the narrow set of things no tool can resolve: a genuinely ambiguous requirement whose readings lead to materially different work, a decision with significant or irreversible consequences, or context that lives only in the operator's head (a preference, a secret, an external constraint):\n\n- Question types: `text` (open-ended), `confirm` (yes/no), `choice` (single pick from list), `multi_choice` (multi-pick), `number` (numeric with optional bounds).\n- Ask one focused question at a time. Do NOT ask multiple questions in a single call, and do NOT stack several ask_question calls across a turn \u2014 fold the genuine unknowns into the single most decision-relevant question.\n- Do NOT use when the user has already provided sufficient context \u2014 infer and proceed instead.\n- The result `action` will be `accept` (answered), `cancel` (user interrupted), `decline` (no handler), or `skip` (optional question skipped).\n- After a `cancel` or `decline`, stop and tell the user what information you need \u2014 do not loop and re-ask.",QF=`[end-of-turn protocol]
1991
+ `:"")+b,E=g.failed.length>0;return{content:S,isError:E}}catch(d){let p=d instanceof Error?d.message:String(d);return _e({event:"compose.failed",parent_session_id:this.ctx.parentSession.sessionId,error_message:p.slice(0,240),duration_ms:Date.now()-u}).catch(()=>{}),{content:`Compose execution error: ${p}`,isError:!0}}finally{await l.teardownAll()}}};function Po(e,t,n,r){let o=kS();o.register("SubagentStop",vS);let s=n??new He;return r!==void 0&&o.register("PreToolUse",TS(r)),o.register("SessionEnd",Ed(s,t)),o.register("SessionEnd",i=>i.event!=="SessionEnd"?{}:(i.sessionId&&PS(i.sessionId),{})),e&&o.register("SubagentStop",i=>i.event!=="SubagentStop"?{}:i.status==="idle"||i.status==="running"?{}:(e({subagentId:i.subagentId,status:i.status,durationMs:i.durationMs,agentType:i.agentType}),{})),{registry:o,memoryStore:s}}function ne(e){let t=Math.round(e/1e3);if(t<=0)return"0s";let n=Math.floor(t/86400),r=Math.floor(t%86400/3600),o=Math.floor(t%3600/60),s=t%60;return n>0?`${n}d ${r}h`:r>0?`${r}h ${o}m`:o>0?`${o}m ${s}s`:`${s}s`}function Be(e){return e===0?"$0.00":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function re(e){if(!Number.isFinite(e))return"0";if(e<1e3)return String(e);if(e<1e6){let n=e/1e3;return n%1===0?`${n}k`:`${n.toFixed(1).replace(/\.0$/,"")}k`}let t=e/1e6;return t%1===0?`${t}m`:`${t.toFixed(1).replace(/\.0$/,"")}m`}var ZF="[skill-routing: active]\n\nRoute recurring work through registered skills instead of rolling ad-hoc solutions:\n\n- Before non-trivial implementation (multi-file edits, new features, config/build changes \u2014 anything that writes) \u2192 `/ground-state` first. Do NOT substitute inline `git status`/`get_runtime_state` \u2014 the skill triangulates git + infra + prior-session memory in parallel, which the inline checks miss. If `/ground-state` dispatch fails (depth limit, unavailable), fall back to inline checks AND note the coverage gap.\n- Bugs, failing tests, or regressions \u2192 `/diagnose`\n- High-stakes sub-agent output that will drive edits or commits \u2192 `/shadow-verify` before acting\n- Refactor needing parallel waves \u2192 `/parallelize`\n- Parallel or dependent multi-task work \u2192 `compose` tool (DAG of subagent nodes)\n- Greenfield feature where a written spec would genuinely help (novel scope, multi-day work, or external stakeholders involved) \u2192 `/mint`\n\nDo NOT reach for `/mint` for: bug fixes (use `/diagnose`), refactors with known shape, single-feature edits, work already spec'd in chat, or anything where the spec/approve pause would feel like ceremony. Implement directly in those cases.\n\nCommon composed sequences \u2014 reach for these when the task shape matches:\n\n- Bug with failing test and non-trivial fix \u2192 `/diagnose` \u2192 `/shadow-verify` on the proposed fix\n- Refactor needing parallel waves \u2192 plan \u2192 `/parallelize` \u2192 build waves\n- Diagnose + fix in parallel \u2192 `compose` with two independent nodes\n- Research \u2192 implement \u2192 verify pipeline \u2192 `compose` with edges: research\u2192implement\u2192verify\n- Multiple independent investigations \u2192 `compose` with N nodes, no edges\n\nReach for context-isolated investigators when the task is exploratory:\n\n- Map an unfamiliar module before editing \u2192 `/gather` or `/research`\n- Re-derive a load-bearing claim independently \u2192 `/shadow-verify`\n- Audit a diff before merge \u2192 `/review`\n- Generate alternatives before committing to a plan \u2192 `/devils-advocate`\n\nOr dispatch a raw `agent` call when no skill matches but the work is parallelizable, verification-heavy, or would otherwise consume substantial inline context.\n\nSkip orchestration for: single-line edits, trivial Q&A, and direct tool calls the user explicitly requested. The goal is leverage, not ceremony. If a skill would add overhead without adding value, don't invoke it.\n\nDefault to acting autonomously. `ask_question` is a last resort, not a first move \u2014 every question blocks on the operator, who is often away from keyboard.\n\nBefore you ask, you MUST exhaust the tools you have: read the files, check git, search the codebase and docs, inspect runtime state. If any tool can get you the answer, use the tool \u2014 never ask the operator for something you can discover yourself. When a wrong guess would be cheap or reversible, make a reasonable assumption, proceed, and state the assumption instead of asking.\n\nReserve `ask_question` for the narrow set of things no tool can resolve: a genuinely ambiguous requirement whose readings lead to materially different work, a decision with significant or irreversible consequences, or context that lives only in the operator's head (a preference, a secret, an external constraint):\n\n- Question types: `text` (open-ended), `confirm` (yes/no), `choice` (single pick from list), `multi_choice` (multi-pick), `number` (numeric with optional bounds).\n- Ask one focused question at a time. Do NOT ask multiple questions in a single call, and do NOT stack several ask_question calls across a turn \u2014 fold the genuine unknowns into the single most decision-relevant question.\n- Do NOT use when the user has already provided sufficient context \u2014 infer and proceed instead.\n- The result `action` will be `accept` (answered), `cancel` (user interrupted), `decline` (no handler), or `skip` (optional question skipped).\n- After a `cancel` or `decline`, stop and tell the user what information you need \u2014 do not loop and re-ask.",QF=`[end-of-turn protocol]
1992
1992
 
1993
1993
  Every turn must end in one externally identifiable terminal state. AFK users need inspectable artifacts, not ceremony.
1994
1994
 
@@ -2025,9 +2025,9 @@ Never end a turn mid-loop without one of these. The terminal-state heading must
2025
2025
  `),process.exitCode=1;return}if(r.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
2026
2026
  `),process.exitCode=1;return}let s=LN("Initializing agent...").start(),i=null,a,l,c,u=!1,d,p=fl(n.model),f=!1;try{if(n.worktree!==void 0)try{l=await Ja(n.worktree,n.worktreeBase!==void 0?{baseRef:n.worktreeBase}:void 0),c=l.path,s.text=`Worktree ready at ${l.path} (branch: ${l.branch})`}catch(Y){s.fail("Failed to create worktree"),z(Y)}let g,h,b,y,w,v;try{g=Hn(n.thinking)??To(),h=Kn(n.effort)??xo(),b=Eo(n.maxBudgetUsd)??op(),y=Eo(n.taskBudget)??sp(),w=Ro(n.maxOutputTokens)??Js(),v=void 0}catch(Y){s.fail("Invalid options"),z(Y)}if(n.dumpPrompt!==void 0){let Y=n.dumpPrompt===!0?sk.join(ok.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=Y,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 R=pe(),S=vo()??ko(),E=ot(),_=E.systemPromptSource,C=E.autoRouting?.chat??!1,I=ll(S,C,"one-shot"),P={},A=Fo({resume:n.resume,continue:n.continue});if(n.resume&&A&&!A.stored){s.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
2027
2027
  Run \`afk i\` then \`/resume\` to list saved sessions.
2028
- `),process.exitCode=1;return}A&&(P=No(A),u=!0,d=A.id),n.sessionId!==void 0&&(P={sessionId:n.sessionId},u=!0,d=n.sessionId);let L=A?.stored?.model??n.model;p.model=L,A?.stored&&(p.totalTurns=A.stored.totalTurns,p.totalCostUsd=A.stored.totalCostUsd,p.totalTokens=A.stored.totalTokens,p.totalDurationMs=A.stored.totalDurationMs,p.turns=[...A.stored.turns],p.sessionId=A.stored.sessionId??A.resumeId,p.sessionStartTime=A.stored.startedAt??Date.now()),n.sessionId!==void 0&&(p.sessionId=n.sessionId);let O,j=Oo(),B=new Q({apiKey:R,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...c!==void 0?{cwd:c}:{}}),F=ho(E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}),D={get sessionId(){return O?.sessionId},getInputStreamRef(){return O?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return O?.abortSignal??new AbortController().signal},get hookRegistry(){return O?.hookRegistry}},x=yo(n.model,R,F,E.baseUrl,j?.writer,void 0,c,Ze),M=new Kt({subagentManager:B,parentSession:D,defaultConfig:{apiKey:R,systemPrompt:S,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{}},defaultSubagentModel:kt(n.model),childProviderFactory:F,childSkillExecutorFactory:x,resolveApiKeyForModel:Ze,depth:0,...c!==void 0?{cwd:c}:{}}),U=new Gt({parentSession:D,defaultModel:n.model,defaultSubagentModel:kt(n.model),apiKey:R,childProviderFactory:F,childSkillExecutorFactory:x,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},resolveApiKeyForModel:Ze,...j?.writer!==void 0?{traceWriter:j.writer}:{},...c!==void 0?{cwd:c}:{}}),J=new Gn({parentSession:D,defaultModel:n.model,defaultSubagentModel:kt(n.model),apiKey:R,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},systemPrompt:S??""});if(a=new We,v=Ao(n.provider,{subagentExecutor:M,skillExecutor:U,composeExecutor:J,memoryStore:a,model:String(n.model),...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}})??new Fe({permissions:{allowedTools:[...Bt,...ln,...at,"agent","skill","compose"]},subagentExecutor:M,skillExecutor:U,composeExecutor:J,memoryStore:a,surface:"cli"}),i=new Ye(pn({model:L,apiKey:R,maxTurns:parseInt(n.maxTurns,10),hookRegistry:Po(Y=>{console.log(dl(Y))},"cli",a).registry,...I!==void 0?{systemPrompt:I}:{},..._!==void 0?{systemPromptSource:_}:{},...g!==void 0?{thinking:g}:{},...h!==void 0?{effort:h}:{},...b!==void 0?{maxBudgetUsd:b}:{},...y!==void 0?{taskBudget:y}:{},...w!==void 0?{maxOutputTokens:w}:{},...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...j?{traceWriter:j.writer}:{},...E.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:E.autoResumeOnUsageLimit}:{},...c!==void 0?{cwd:c}:{},...P,provider:v})),O=i,s.text="Sending message...",n.format==="stream-json"){let Y=(we,pt)=>pt instanceof Date?pt.toISOString():pt instanceof Error?{message:pt.message,name:pt.name}:pt;s.stop();let be="",Be=i.sendMessageStream(r);for await(let we of Be)if(await rk(process.stdout,JSON.stringify(we,Y)+`
2028
+ `),process.exitCode=1;return}A&&(P=No(A),u=!0,d=A.id),n.sessionId!==void 0&&(P={sessionId:n.sessionId},u=!0,d=n.sessionId);let L=A?.stored?.model??n.model;p.model=L,A?.stored&&(p.totalTurns=A.stored.totalTurns,p.totalCostUsd=A.stored.totalCostUsd,p.totalTokens=A.stored.totalTokens,p.totalDurationMs=A.stored.totalDurationMs,p.turns=[...A.stored.turns],p.sessionId=A.stored.sessionId??A.resumeId,p.sessionStartTime=A.stored.startedAt??Date.now()),n.sessionId!==void 0&&(p.sessionId=n.sessionId);let O,j=Oo(),B=new Q({apiKey:R,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...c!==void 0?{cwd:c}:{}}),F=ho(E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}),D={get sessionId(){return O?.sessionId},getInputStreamRef(){return O?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return O?.abortSignal??new AbortController().signal},get hookRegistry(){return O?.hookRegistry}},x=yo(n.model,R,F,E.baseUrl,j?.writer,void 0,c,Ze),M=new Kt({subagentManager:B,parentSession:D,defaultConfig:{apiKey:R,systemPrompt:S,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{}},defaultSubagentModel:kt(n.model),childProviderFactory:F,childSkillExecutorFactory:x,resolveApiKeyForModel:Ze,depth:0,...c!==void 0?{cwd:c}:{}}),U=new Gt({parentSession:D,defaultModel:n.model,defaultSubagentModel:kt(n.model),apiKey:R,childProviderFactory:F,childSkillExecutorFactory:x,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},resolveApiKeyForModel:Ze,...j?.writer!==void 0?{traceWriter:j.writer}:{},...c!==void 0?{cwd:c}:{}}),J=new Gn({parentSession:D,defaultModel:n.model,defaultSubagentModel:kt(n.model),apiKey:R,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},systemPrompt:S??""});if(a=new He,v=Ao(n.provider,{subagentExecutor:M,skillExecutor:U,composeExecutor:J,memoryStore:a,model:String(n.model),...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}})??new Ne({permissions:{allowedTools:[...Bt,...ln,...at,"agent","skill","compose"]},subagentExecutor:M,skillExecutor:U,composeExecutor:J,memoryStore:a,surface:"cli"}),i=new Ye(pn({model:L,apiKey:R,maxTurns:parseInt(n.maxTurns,10),hookRegistry:Po(Y=>{console.log(dl(Y))},"cli",a).registry,...I!==void 0?{systemPrompt:I}:{},..._!==void 0?{systemPromptSource:_}:{},...g!==void 0?{thinking:g}:{},...h!==void 0?{effort:h}:{},...b!==void 0?{maxBudgetUsd:b}:{},...y!==void 0?{taskBudget:y}:{},...w!==void 0?{maxOutputTokens:w}:{},...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...j?{traceWriter:j.writer}:{},...E.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:E.autoResumeOnUsageLimit}:{},...c!==void 0?{cwd:c}:{},...P,provider:v})),O=i,s.text="Sending message...",n.format==="stream-json"){let Y=(we,pt)=>pt instanceof Date?pt.toISOString():pt instanceof Error?{message:pt.message,name:pt.name}:pt;s.stop();let be="",Ue=i.sendMessageStream(r);for await(let we of Ue)if(await rk(process.stdout,JSON.stringify(we,Y)+`
2029
2029
  `),we.type==="chunk"&&we.chunk.type==="content"&&(be+=we.chunk.content),we.type==="done"&&(wr(p,r,be,we.metadata),we.metadata?.sessionId&&!p.sessionId&&(p.sessionId=String(we.metadata.sessionId))),we.type==="error"){process.exitCode=1;break}return}let K=await i.sendMessage(r,{stream:n.stream});s.succeed("Response received");let N=i.getLastResponseMetadata();if(wr(p,r,K.content,N??void 0),N?.sessionId&&!p.sessionId&&(p.sessionId=String(N.sessionId)),n.format==="json"){let Y=N?Number(N.usage?.input_tokens??0):0,be=N?Number(N.usage?.output_tokens??0):0;console.log(JSON.stringify({success:!0,model:L,message:K.content,timestamp:K.timestamp,...N?.totalCostUsd!==void 0?{costUsd:N.totalCostUsd}:{},...N?.durationMs!==void 0?{durationMs:N.durationMs}:{},...Y>0?{inputTokens:Y}:{},...be>0?{outputTokens:be}:{}},null,2))}else{if(console.log(ek.cyan(`
2030
- \u{1F916} Claude:`)),console.log(Rt(K.content)),N){let Y=[];N.durationMs&&Y.push(ne(N.durationMs)),N.totalCostUsd!==void 0&&Y.push(Ne(N.totalCostUsd));let be=Number(N.usage?.input_tokens??0),Be=Number(N.usage?.output_tokens??0);be+Be>0&&Y.push(re(be+Be)+" tokens"),Y.length>0&&console.log(ek.dim(" \xB7 "+Y.join(" \xB7 ")))}console.log("")}}catch(g){if(f=!0,n.format==="stream-json"){let h=g instanceof Error?g:new Error(String(g));try{await rk(process.stdout,JSON.stringify({type:"error",error:{message:h.message,name:h.name}})+`
2030
+ \u{1F916} Claude:`)),console.log(Rt(K.content)),N){let Y=[];N.durationMs&&Y.push(ne(N.durationMs)),N.totalCostUsd!==void 0&&Y.push(Be(N.totalCostUsd));let be=Number(N.usage?.input_tokens??0),Ue=Number(N.usage?.output_tokens??0);be+Ue>0&&Y.push(re(be+Ue)+" tokens"),Y.length>0&&console.log(ek.dim(" \xB7 "+Y.join(" \xB7 ")))}console.log("")}}catch(g){if(f=!0,n.format==="stream-json"){let h=g instanceof Error?g:new Error(String(g));try{await rk(process.stdout,JSON.stringify({type:"error",error:{message:h.message,name:h.name}})+`
2031
2031
  `)}catch{}process.exitCode=1}s.fail("Failed to send message"),z(g)}finally{if(u&&p.totalTurns>0&&!f)try{let h=qt(p,d).replace(/\.json$/,"").split("/").pop()??d??p.sessionId??"unknown";process.stderr.write(`Continue with: afk chat <msg> --resume ${h}
2032
2032
  `)}catch{}i&&await i.close(),a?.close(),l!==void 0&&await l.cleanup()}})}G();import XE from"ora";import*as ZE from"node:os";import*as Ur from"node:path";import{execFileSync as $G}from"node:child_process";var gl=new Set;function Sr(e){return gl.add(e),()=>{gl.delete(e)}}async function hl(){await Promise.all([...gl].map(e=>e())),gl.clear()}var NN=/^[A-Za-z0-9_@%+=:,./-]+$/;function ei(e){return NN.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function Jt(e,t){let n=["afk","interactive"];return typeof t=="string"&&t.length>0&&n.push("--model",ei(t)),n.push("--resume",ei(e)),n.join(" ")}import{homedir as BN}from"node:os";import{sep as Vt}from"node:path";function ti(e,t={}){if(!e)return"";let n=t.homedir??BN(),r=UN(e,n),o=t.maxWidth;if(o===void 0||o<=0||q(r)<=o)return r;let s=r.split(Vt).filter(d=>d.length>0);if(s.length<=1)return se(r,o);let a=r.startsWith("~")?"~":s[0],l=1,c=s[s.length-1],u=[];for(let d=s.length-2;d>=l;d--){let p=s.slice(l,d+1),f=p.length>0?p.join(Vt)+Vt:"";u.push(`${a}${Vt}${f}\u2026${Vt}${c}`)}u.push(`${a}${Vt}\u2026${Vt}${c}`);for(let d of u)if(q(d)<=o)return d;return se(u[u.length-1],o)}function UN(e,t){if(!t)return e;if(e===t)return"~";let n=t.endsWith(Vt)?t:t+Vt;return e.startsWith(n)?"~"+Vt+e.slice(n.length):e}import*as cE from"node:readline";import{emitKeypressEvents as jN}from"readline";var WN=50;function kr(e){jN(e,{escapeCodeTimeout:WN})}var HN=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])|\x9B[0-?]*[ -/]*[@-~]|[\x80-\x9F]/g;function ue(e,t=128){let n=e.replace(HN,"");return n.length>t?n.slice(0,t)+"\u2026":n}function ak(e=process.env){return e.AFK_DEMO_CLEAN==="1"||typeof e.SCRIPT=="string"&&e.SCRIPT.length>0||e.ASCIINEMA_REC==="1"}function KN(e=process.env){return e.AFK_BELL==="1"}function lk(e=process.env){return e.AFK_REDUCED_MOTION==="1"}function yl(e,t=process.env){KN(t)&&e.isTTY&&e.write("\x07")}var Ep=64,xp=256,bl=20,Rp=new Set(["__proto__","constructor","prototype"]);async function GN(e,t){if(!process.stdout.isTTY||!process.stdin.isTTY||e.length===0)return null;let n=10,r=0,o=0;function s(){let u=o,d=Math.min(u+n,e.length);return{start:u,end:d}}function i(){let{start:u,end:d}=s(),p=[];for(let f=u;f<d;f++){let g=ue(e[f],80);f===r?p.push(` ${m.bold("\u25B6 "+g)}`):p.push(` ${m.dim(g)}`)}if(e.length>n){let{end:f}=s();p.push(m.dim(` (${o+1}\u2013${f} of ${e.length} \u2191/\u2193 to scroll)`))}else p.push(m.dim(" \u2191/\u2193 navigate Enter select Esc cancel"));return p}let a=i();process.stdout.write(a.join(`
2033
2033
  `)+`
@@ -2038,10 +2038,10 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
2038
2038
  `);let c=l.length;function u(){let d=a();process.stdout.write(`\x1B[${c}A\x1B[0J`+d.join(`
2039
2039
  `)+`
2040
2040
  `),c=d.length}return new Promise(d=>{process.stdin.setRawMode(!0),kr(process.stdin);let p=(g,h)=>{if(h)if(h.name==="up"||h.sequence==="\x1B[A")r>0&&(r--,r<o&&(o=r),u());else if(h.name==="down"||h.sequence==="\x1B[B"){if(r<e.length-1){r++;let{end:b}=i();r>=b&&o++,u()}}else h.name==="space"?(s.has(r)?s.delete(r):s.add(r),u()):h.name==="return"||h.name==="enter"?(f(),d([...s].sort((b,y)=>b-y))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(f(),d(":cancel"))};function f(){process.stdin.removeListener("keypress",p);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",p)})}var Uo={action:"decline"},ie={action:"cancel"},qN={action:"accept"};function JN(e){let t=e.properties,n={},r=0,o=!1;if(typeof t=="object"&&t!==null){let a=0;for(let[l,c]of Object.entries(t))if(!Rp.has(l)){if(r+=1,a>=Ep){o=!0;continue}n[l]=c,a+=1}}let s=e.required,i=new Set(Array.isArray(s)?s.slice(0,Ep*2).filter(a=>typeof a=="string").filter(a=>!Rp.has(a)):[]);return{properties:n,required:i,fieldsTruncated:o,originalFieldCount:r}}function VN(e,t){e.line(),e.line(m.warning("\u26A0 MCP form elicitation")),e.line(m.dim(" server: ")+m.bold(ue(t.serverName,64))),e.line(m.dim(" message: ")+ue(t.message,256)),t.elicitationId&&e.line(m.dim(" id: ")+ue(t.elicitationId,64)),e.line(m.dim(" Type :decline or :cancel at any prompt to exit.")),e.line()}async function YN(e,t,n,r,o,s){if(s.aborted)return{tag:"cancel"};let i=ue(t.description??t.title??e),a=ue(t.type??"string",32),l=ue(e,64),c;if(t.enum!==void 0){let d=t.enum.slice(0,bl).map(f=>ue(String(f),32)).join("|"),p=t.enum.length>bl?"|\u2026":"";c=` (enum: ${d}${p})`}else a==="boolean"?c=" (boolean: y/n)":a==="number"||a==="integer"?c=` (${a})`:a==="string"?c=" (string)":(c=` (${a} \u2014 treated as string)`,o.line(m.warning(` \u26A0 Unknown field type '${a}' for '${l}' \u2014 collecting as string.`)));let u=n?"":m.dim(" [optional, enter to skip]");for(o.line(m.dim(` [${l}]`)+m.dim(` ${i}`)+m.dim(c)+u),t.enum!==void 0&&t.enum.length>xp&&o.line(m.warning(` \u26A0 Field '${l}' has ${t.enum.length} enum values; only the first ${xp} are valid for input.`));;){let d;try{d=await r(m.dim(" > "))}catch{return{tag:"cancel"}}if(s.aborted)return{tag:"cancel"};let p=d.trim();if(p===":cancel")return{tag:"cancel"};if(p===":decline")return{tag:"decline"};if(p===""){if(n){o.line(m.warning(" (required \u2014 cannot be skipped)"));continue}return{tag:"value",value:t.default}}let f;if(a==="boolean"){let g=p.toLowerCase();if(g==="y"||g==="yes"||g==="true"||g==="1")f=!0;else if(g==="n"||g==="no"||g==="false"||g==="0")f=!1;else{o.line(m.warning(" Invalid boolean \u2014 enter y/yes/true/1 or n/no/false/0."));continue}}else if(a==="number"){let g=Number(p);if(!isFinite(g)){o.line(m.warning(" Invalid number \u2014 enter a numeric value."));continue}f=g}else if(a==="integer"){let g=parseInt(p,10);if(!isFinite(g)||String(g)!==p.replace(/\.0+$/,"")){o.line(m.warning(" Invalid integer \u2014 enter a whole number."));continue}f=g}else f=p;if(t.enum!==void 0){let g=t.enum.slice(0,xp),h=!1;for(let b of g)if(String(b)===String(f)){h=!0;break}if(!h){let b=ue(String(f),64),y=g.slice(0,bl).map(v=>ue(String(v),32)).join(", "),w=g.length>bl?", \u2026":"";o.line(m.warning(` '${b}' is not a valid choice. Valid: ${y}${w}`));continue}}return{tag:"value",value:f}}}function XN(e,t){e.line(),e.line(m.warning("\u26A0 MCP elicitation")),e.line(m.dim(" server: ")+m.bold(ue(t.serverName,64))),e.line(m.dim(" message: ")+ue(t.message,256)),t.url&&e.line(m.dim(" url: ")+m.brand(ue(t.url,512))),t.elicitationId&&e.line(m.dim(" id: ")+ue(t.elicitationId,64)),e.line()}var vr={action:"skip"};function Ap(e){let t=[];return t.push(m.warning(" \u{1F4AC} Agent question")),t.push(m.bold(" ? "+ue(e.message,512))),e.context&&t.push(m.dim(" "+ue(e.context,512))),t.push(""),t}async function ZN(e,t,n,r){let o=Ap(t),s=t.allowSkip===!0;if(e==="number"){let u=t.min,d=t.max,f=`enter to submit \xB7 esc to cancel${u!==void 0&&d!==void 0?` [${u}\u2013${d}]`:u!==void 0?` [\u2265${u}]`:d!==void 0?` [\u2264${d}]`:""}`,h=await n({header:o,help:f,validate:y=>{let w=y.trim();if(w==="")return s?null:"Please enter a number (or esc to cancel).";let v=Number(w);return Number.isFinite(v)?u!==void 0&&v<u?`Value must be \u2265 ${u}.`:d!==void 0&&v>d?`Value must be \u2264 ${d}.`:null:"Please enter a valid number."},signal:r});if(h===null)return null;let b=h.trim();return b===""&&s?{tag:"skip"}:{tag:"number",value:Number(b)}}let i=t.minLength,a=t.maxLength,c=await n({header:o,validate:u=>u===""?s?null:"Please enter a response (or esc to cancel).":i!==void 0&&u.length<i?`Response must be at least ${i} characters.`:a!==void 0&&u.length>a?`Response must be at most ${a} characters.`:null,signal:r});return c===null?null:c===""&&s?{tag:"skip"}:{tag:"text",value:c}}async function QN(e,t,n){if(n.aborted)return Uo;let{readLine:r,writer:o,pendingCount:s,pickFromList:i,readTextOverlay:a}=t,l=e.type??"text",c=s();if(c>1&&o.line(m.dim(` [${c} questions queued]`)),(l==="choice"||l==="multi_choice")&&i&&(e.choices?.length??0)>0){let p=(e.choices??[]).map(h=>ue(h,128)),f;try{f=await i({header:Ap(e),options:p,multi:l==="multi_choice",signal:n})}catch{return ie}if(n.aborted||f===null)return ie;if(f.length===0)return e.allowSkip?vr:ie;let g=f.length===1?ue(f[0]??"",128):f.map(h=>ue(h,128)).join(", ");return o.line(m.dim(" \u2713 ")+m.brand(g)),l==="choice"?{action:"accept",content:{value:f[0]}}:{action:"accept",content:{value:[...f]}}}if(l==="confirm"&&i){let f=e.questionDefault!==!1?["Yes","No"]:["No","Yes"],g;try{g=await i({header:Ap(e),options:f,multi:!1,signal:n})}catch{return ie}if(n.aborted||g===null)return ie;let h=g[0];if(h===void 0)return ie;let b=h==="Yes";return o.line(m.dim(" \u2713 ")+(b?m.success("Yes"):m.error("No"))),{action:"accept",content:{value:b}}}if((l==="text"||l==="number")&&a){let p=await ZN(l,e,a,n);if(p===null)return ie;if(p.tag==="skip")return vr;let f=p.tag==="text"?ue(p.value,256):String(p.value);return o.line(m.dim(" \u2713 ")+m.brand(f)),{action:"accept",content:{value:(p.tag==="text",p.value)}}}if(o.line(),o.line(m.warning("\u{1F4AC} Agent question")),e.context&&o.line(m.dim(" context: ")+ue(e.context,512)),o.line(m.bold(" "+ue(e.message,512))),o.line(m.dim(" Type :cancel to skip this question.")),o.line(),l==="confirm"){o.line("\x07");let p=e.questionDefault===!0?"Y/n":"y/N";for(;;){if(n.aborted)return ie;let f;try{f=(await r(m.dim(` Continue? [${p}] `))).trim().toLowerCase()}catch{return ie}if(n.aborted||f===":cancel")return ie;if(f==="")return{action:"accept",content:{value:e.questionDefault===!0}};if(f==="y"||f==="yes")return{action:"accept",content:{value:!0}};if(f==="n"||f==="no")return{action:"accept",content:{value:!1}};o.line(m.warning(" Please enter y or n."))}}if(l==="choice"){o.line("\x07");let p=e.choices??[],f=await GN(p,n);if(f!==null){if(f===":cancel")return ie;let g=p[f];return g!==void 0?(o.line(m.dim(` Selected: ${ue(g,128)}`)),{action:"accept",content:{value:g}}):ie}for(p.forEach((g,h)=>{o.line(` ${h+1}. ${ue(g,128)}`)});;){if(n.aborted)return ie;let g;try{g=(await r(m.dim(" Enter number: "))).trim()}catch{return ie}if(n.aborted||g===":cancel")return ie;if(g===""&&e.allowSkip)return vr;let h=parseInt(g,10);if(!isFinite(h)||String(h)!==g||h<1||h>p.length){o.line(m.warning(` Please enter a number between 1 and ${p.length}.`));continue}return{action:"accept",content:{value:p[h-1]}}}}if(l==="multi_choice"){let p=e.choices??[],f=await zN(p,n);if(f!==null){if(f===":cancel")return ie;if(f.length===0&&e.allowSkip)return vr;if(f.length>0){let g=f.map(h=>p[h]);return o.line(m.dim(` Selected: ${g.map(h=>ue(h,64)).join(", ")}`)),{action:"accept",content:{value:g}}}}for(p.forEach((g,h)=>{o.line(` ${h+1}. ${ue(g,128)}`)});;){if(n.aborted)return ie;let g;try{g=(await r(m.dim(" Enter numbers (comma-separated): "))).trim()}catch{return ie}if(n.aborted||g===":cancel")return ie;if(g===""&&e.allowSkip)return vr;if(g===""){o.line(m.warning(" Please enter at least one selection."));continue}let h=g.split(",").map(w=>w.trim()),b=[],y=!0;for(let w of h){let v=parseInt(w,10);if(!isFinite(v)||String(v)!==w||v<1||v>p.length){o.line(m.warning(` Invalid selection "${ue(w,32)}". Enter numbers between 1 and ${p.length}.`)),y=!1;break}b.push(p[v-1])}if(y)return{action:"accept",content:{value:b}}}}if(l==="number"){let p=e.min,f=e.max,g=p!==void 0&&f!==void 0?` [${p}\u2013${f}]`:p!==void 0?` [\u2265${p}]`:f!==void 0?` [\u2264${f}]`:"";for(;;){if(n.aborted)return ie;let h;try{h=(await r(m.dim(` Enter a number${g}: `))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;if(h===""&&e.allowSkip)return vr;if(h===""&&!e.allowSkip){o.line(m.warning(" Please enter a number (or :cancel to skip)."));continue}let b=Number(h);if(!isFinite(b)){o.line(m.warning(" Please enter a valid number."));continue}if(p!==void 0&&b<p){o.line(m.warning(` Value must be \u2265 ${p}.`));continue}if(f!==void 0&&b>f){o.line(m.warning(` Value must be \u2264 ${f}.`));continue}return{action:"accept",content:{value:b}}}}let u=e.minLength,d=e.maxLength;for(;;){if(n.aborted)return ie;let p;try{p=(await r(m.dim(" > "))).trim()}catch{return ie}if(n.aborted||p===":cancel")return ie;if(p===""&&e.allowSkip)return vr;if(p===""){o.line(m.warning(" Please enter a response (or type :cancel to skip)."));continue}if(u!==void 0&&p.length<u){o.line(m.warning(` Response must be at least ${u} characters.`));continue}if(d!==void 0&&p.length>d){o.line(m.warning(` Response must be at most ${d} characters.`));continue}return{action:"accept",content:{value:p}}}}function wl(e){return async(t,{signal:n})=>{if(n.aborted)return Uo;yl(process.stdout),e.suspendInput?.();try{if(t.origin==="agent")return await QN(t,e,n);if(t.mode==="form"){let o=t.requestedSchema,{properties:s,required:i,fieldsTruncated:a,originalFieldCount:l}=typeof o=="object"&&o!==null?JN(o):{properties:{},required:new Set,fieldsTruncated:!1,originalFieldCount:0};VN(e.writer,t),a&&e.writer.line(m.warning(` \u26A0 Schema has ${l} fields; only the first ${Ep} will be prompted (server may be malformed or compromised).`));let c=Object.create(null);if(Object.keys(s).length===0)return e.writer.line(m.warning(" \u26A0 Form schema has no usable fields \u2014 declining.")),Uo;for(let u of i)if(!(u in s))return e.writer.line(m.warning(` \u26A0 Required field '${ue(u,64)}' has no schema entry \u2014 declining.`)),Uo;for(let[u,d]of Object.entries(s)){if(n.aborted)return ie;let p=await YN(u,d,i.has(u),e.readLine,e.writer,n);if(p.tag==="cancel")return ie;if(p.tag==="decline")return Uo;p.value!==void 0&&!Rp.has(u)&&(c[u]=p.value)}return{action:"accept",content:{...c}}}XN(e.writer,t);let r=(await e.readLine(m.dim("Continue? [y/N] "))).trim().toLowerCase();return r===""?ie:r==="y"||r==="yes"?qN:Uo}finally{e.resumeInput?.()}}}function ck(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?m.error:t>.5?m.warning:m.meta,r=20,o=Math.round(t*r),s=r-o,i="["+"\u2588".repeat(o)+"\u2591".repeat(s)+"]",a=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=re(e.used)+"/"+re(e.limit));let c=l?`${i} ${a} ${l}`:`${i} ${a}`,u=`${i} ${a}`,d=`ctx ${a}`,p=e.sparkline?m.meta(e.sparkline)+" ":"",f=e.sparkline?q(e.sparkline)+1:0,g=Math.max(0,e.width-f);if(q(c)<=g&&g>90)return p+n(c);if(q(u)<=g&&g>32)return p+n(u);if(q(d)<=g)return p+n(d);if(e.width>0){let h=p+n(d);return se(h,e.width)}return n(a)}var Sl=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;lastPaintedRow=null;extraRows=0;afterScrollRestore=null;constructor(t={}){this.stream=t.stream??process.stdout,this.force=t.force??!1,this.throttleMs=t.throttleMs??100}get enabled(){return this.force||!!this.stream.isTTY}start(){if(this.started||!this.enabled)return;this.started=!0,this.lastRepaint=0;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.resizeUnsub===null&&(this.resizeUnsub=$e.subscribe(()=>{this.onResize()}))}onResize(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.lastPaintedRow!==null&&this.lastPaintedRow!==this.paintRow(t)&&(this.stream.write(`\x1B[${this.lastPaintedRow};1H`),this.stream.write("\x1B[2K")),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}repaint(t){if(!this.enabled||!this.started){this.lastFields=t;return}let n=Date.now();if(n-this.lastRepaint<this.throttleMs){this.lastFields=t;return}this.lastRepaint=n,this.lastFields=t;let r=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.paintRow(r)};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatLine(t)),this.stream.write("\x1B[u"),this.lastPaintedRow=this.paintRow(r)}flush(){this.lastRepaint=0,this.lastFields&&this.repaint(this.lastFields)}setExtraRows(t){if(this.extraRows=t,this.started&&this.enabled){let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}getExtraRows(){return this.extraRows}setAfterScrollRestore(t){this.afterScrollRestore=t}rearm(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}withFullScrollRegion(t){if(!this.started||!this.enabled)return t();this.stream.write("\x1B[s"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u");try{return t()}finally{let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush(),this.afterScrollRestore?.()}}stop(){if(this.resizeUnsub!==null&&(this.resizeUnsub(),this.resizeUnsub=null),!this.started||!this.enabled){this.started=!1;return}let t=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.lastPaintedRow??this.paintRow(t)};1H`),this.stream.write("\x1B[2K"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u"),this.started=!1,this.lastRepaint=0,this.lastPaintedRow=null}formatLine(t){let n=[],r=Math.max(4,(this.stream.columns??80)-2);if(t.cwd){let a=Math.max(8,Math.floor(r*.4)),l=ti(t.cwd,{maxWidth:a});l&&n.push({text:m.dim(l)})}if(n.push({text:m.brand(t.model)}),t.planMode&&n.push({text:m.warning("\u25CF plan")}),t.contextPct!==void 0){let a=ck({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push({text:a,droppablePriority:1})}t.cost!==void 0&&n.push({text:m.meta(`$${t.cost.toFixed(2)}`),droppablePriority:2}),t.tokens!==void 0&&n.push({text:m.meta(`${eB(t.tokens)} tok`),droppablePriority:3});let o=m.dim(" \xB7 "),s=n.map(a=>a.text).join(o);if(q(s)<=r)return s;let i=n.filter(a=>a.droppablePriority!==void 0);for(;i.length>0&&q(s)>r;){let a=Math.max(...i.map(l=>l.droppablePriority));n=n.filter(l=>l.droppablePriority===void 0||l.droppablePriority!==a),s=n.map(l=>l.text).join(o),i=n.filter(l=>l.droppablePriority!==void 0)}return se(s,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){let n=1+this.extraRows;if(t>n){this.stream.write(`\x1B[1;${t-n}r`);return}this.stream.write("\x1B[r")}};function eB(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}var ut=new Map,Tr=new Map;function le(e){if(ut.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);ut.set(e.name,e);for(let t of e.aliases??[]){if(Tr.has(t)||ut.has(t))throw new Error(`Slash alias collides: ${t}`);Tr.set(t,e.name)}}function zn(e){if(ut.has(e.name)){for(let[t,n]of Tr.entries())n===e.name&&Tr.delete(t);ut.delete(e.name)}le(e)}function uk(e){ut.has(e.name)||le(e)}function dk(){ut.clear(),Tr.clear()}function et(){return[...ut.values()].sort((e,t)=>e.name.localeCompare(t.name))}function pk(){let e=[];for(let[t,n]of Tr.entries()){let r=ut.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function tB(e){if(ut.has(e))return ut.get(e);let t=Tr.get(e);return t?ut.get(t):void 0}function nB(e,t){let n=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(0));for(let r=0;r<=e.length;r++)n[r][0]=r;for(let r=0;r<=t.length;r++)n[0][r]=r;for(let r=1;r<=e.length;r++)for(let o=1;o<=t.length;o++){let s=e[r-1]===t[o-1]?0:1;n[r][o]=Math.min(n[r-1][o]+1,n[r][o-1]+1,n[r-1][o-1]+s)}return n[e.length][t.length]}function rB(e,t=3){let n;for(let r of ut.keys()){let o=nB(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function _p(e){let t=e.trim();if(!t.startsWith("/"))return null;let n=t.indexOf(" ");return n===-1?{name:t,args:""}:{name:t.slice(0,n),args:t.slice(n+1).trim()}}async function mk(e,t,n){let r=_p(e);if(r===null)return{handled:!1};let o=tB(r.name);if(!o){let a=rB(r.name);return a?t.out.warn(`Unknown command: ${r.name} (did you mean ${a}?)`):t.out.warn(`Unknown command: ${r.name} (type /help for commands)`),{handled:!0,result:"continue"}}let s=n??[];s.length>0&&o.acceptsAttachments!==!0&&t.out.warn(`\u26A0 Image attachments are ignored by ${r.name} (images only reach the model on skill commands like /forge, /mint).`);let i=await o.handler(t,r.args,o.acceptsAttachments===!0?s:void 0);return i==="forward"?{handled:!1}:{handled:!0,result:i}}import aB from"ora";function fk(e,t=5){if(e.length===0)return"";let n=e.slice(-t),r=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];return n.map(o=>{let s=Math.max(0,Math.min(1,o)),i=Math.min(7,Math.floor(s*8));return r[i]}).join("")}function kl(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.name=t.name,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}function vl(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=hk(gk(r.user),80),s=hk(iB(gk(r.assistant)),120);o.length>0&&t.fn(m.dim(` Last: ${o}`)),s.length>0&&t.fn(m.dim(` \u21B3 ${s}`)),t.fn(m.dim(" \u21AA /history for full review"))}function gk(e){return e.replace(sB,"").replace(/\s+/g," ").trim()}var sB=/\u001B\][\s\S]*?(?:\u0007|\u001B\\|\u009C)|\u001B[PX^_][\s\S]*?(?:\u0007|\u001B\\|\u009C)|\u001B[@-OQ-WY-Z\\`6-9=]|[\u001B\u009B][[\]()#;?]*(?:\d{1,4}(?:[;:]\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]/g;function iB(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function hk(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}var ni={stream:process.stdout,hideCursor:!1,discardStdin:!1};function Cp(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];return n?(n.footprint??n.input+n.output+n.cache)/lt(e.model):0}function xr(e,t){let n=Cp(e,t),r=lt(e.model),o,s=t?.getDetail();if(s!==void 0)o=s.used;else{let a=e.turnTokens[e.turnTokens.length-1];a&&(o=a.footprint??a.input+a.output+a.cache)}let i;if(e.turnTokens.length>=2){let a=e.turnTokens.map(c=>(c.footprint??c.input+c.output+c.cache)/r),l=fk(a,5);l.length>0&&(i=l)}return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:n,contextLimit:r,contextUsedTokens:o,contextSparkline:i,planMode:e.planMode,...e.cwd!==void 0?{cwd:e.cwd}:{}}}var lB={name:"/exit",aliases:["/quit"],summary:"Exit the session",hint:"When you want to tear down the REPL \u2014 Ctrl+D on an empty prompt does the same.",async handler(){return"exit"}},cB={name:"/clear",summary:"Clear conversation history",hint:"When the current thread has drifted off-topic or you want a clean slate without restarting the session.",async handler(e){try{await e.session.current.reset(),e.ui.clearScreen(),QS(e.stats),e.ledger?.clear(),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},uB={name:"/compact",summary:"Compact history (summarize older messages)",hint:"When context is filling up but you want to keep the thread \u2014 summarizes old turns and keeps the recent ones intact.",async handler(e){let t=aB({text:m.meta("Summarizing earlier turns..."),...ni}).start();try{let n=await e.session.current.compact();if(t.stop(),n.compacted){let r=n.tokensSavedEstimate?` (~${n.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${n.messagesBefore} \u2192 ${n.messagesAfter} messages${r}.`)}else{let r=n.reason??"unknown";r==="aborted"?e.out.info("Compaction cancelled."):r.startsWith("summarization-failed")?e.out.error(`Compaction failed: ${r}. History unchanged.`):r==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):r==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):e.out.info(`Nothing to compact (${r}).`)}}catch(n){t.stop(),e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},dB={name:"/help",summary:"Show this help",hint:"When you want the full command list with usage strings \u2014 broader than this inline dropdown.",async handler(e){let t=et(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(m.bold(m.brand("Commands"))),e.out.line(ye());for(let r of t){let o=r.usage??r.name,s=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${m.warning(o)}${s} ${m.dim(r.summary)}`)}return e.out.line(),e.out.line(m.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(),"continue"}},yk=[lB,cB,uB,dB];function Ip(e,t=30){return!e||e.length===0?m.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${m.dim(`+${e.length-t} more`)}`}function vt(e,t){return` ${m.label(e.padEnd(16))} ${t}`}function Tl(e){let t=[];t.push(" "+ye("Session Debug")),e.sessionId&&t.push(vt("session",e.sessionId)),e.model&&t.push(vt("model",e.model)),e.permissionMode&&t.push(vt("permission",e.permissionMode)),e.cwd&&t.push(vt("cwd",e.cwd)),e.claudeCodeVersion&&t.push(vt("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(vt("api key",e.apiKeySource)),e.outputStyle&&t.push(vt("output style",e.outputStyle));let n=e.tools?.length??0;t.push(vt(`tools (${n})`,Ip(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):m.dim("(none)");t.push(vt(`mcp (${r.length})`,o));let s=e.skills?.length??0;t.push(vt(`skills (${s})`,Ip(e.skills)));let i=e.plugins?.length??0,a=i?(e.plugins??[]).map(c=>c.name).join(", "):m.dim("(none)");t.push(vt(`plugins (${i})`,a));let l=e.slashCommands?.length??0;return t.push(vt(`slash (${l})`,Ip(e.slashCommands))),t.push(" "+ye()),t.join(`
2041
- `)}var Op=["opus","opus_1m","sonnet","sonnet_1m","haiku"],gB={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(ye()),n.line(` total ${m.success(Ne(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(Ne(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(Ne).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function hB(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,s=n?.cache_read_input_tokens??0,i=n?.cache_creation_input_tokens??0,a=r+o+s+i;e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(ye()),e.line(` total ${m.success(re(t.totalTokens))} of ${m.meta(re(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(re(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(re(r))}`),e.line(` output ${m.meta(re(o))}`),e.line(` cache read ${m.meta(re(s))}`),e.line(` cache creat ${m.meta(re(i))}`),e.line(` total ${m.meta(re(a))}`);let l=t.categories??[];if(l.length>0){let p=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let f of p)e.line(` ${m.warning(f.name.padEnd(18))} ${m.meta(re(f.tokens))}`)}let c=t.systemTools??[],u=t.mcpTools??[];if(c.length>0||u.length>0){e.line();let p=c.reduce((g,h)=>g+h.tokens,0),f=u.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(m.dim(` system tools ${c.length} tools, ${re(p)} tokens`)),u.length>0&&e.line(m.dim(` MCP tools ${u.length} tools, ${re(f)} tokens`))}let d=t.agents??[];if(d.length>0){let p=d.reduce((f,g)=>f+g.tokens,0);e.line(m.dim(` agents ${d.length} loaded, ${re(p)} tokens`))}if(t.skills){let p=t.skills;e.line(m.dim(` skills ${p.includedSkills}/${p.totalSkills} included, ${re(p.tokens)} tokens`))}if(t.slashCommands){let p=t.slashCommands;e.line(m.dim(` slash cmds ${p.includedCommands}/${p.totalCommands} included, ${re(p.tokens)} tokens`))}e.line()}function yB(e,t){let n=t.turnTokens.reduce((u,d)=>u+d.input,0),r=t.turnTokens.reduce((u,d)=>u+d.output,0),o=t.turnTokens.reduce((u,d)=>u+d.cache,0),s=n+r,i=lt(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=i>0?Math.round(l/i*100):0;e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(ye()),e.line(` input ${m.meta(re(n))}`),e.line(` output ${m.meta(re(r))}`),e.line(` cache read ${m.meta(re(o))}`),e.line(` total ${m.success(re(s))}`),e.line(` context ${m.meta(`${c}% of ${re(i)} (${t.model})`)}`),e.line()}var bB={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();hB(e.out,t)}catch{yB(e.out,e.stats)}return"continue"}},wB={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(ye()),t.turns.forEach((r,o)=>{let s=m.meta(`#${o+1}`),i=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${s} ${m.user("\u25B6")} ${i}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}},SB={name:"/reset",summary:"Clear screen, history, and session stats",async handler(e){let{stats:t,ui:n,out:r}=e;try{await e.session.current.sendMessage("/clear")}catch{}return t.totalTurns=0,t.totalCostUsd=0,t.totalTokens=0,t.totalDurationMs=0,t.turnCosts.length=0,t.turnTokens.length=0,t.turns.length=0,t.sessionStartTime=Date.now(),n.clearScreen(),r.success("Session reset."),"continue"}},kB={name:"/model",usage:"/model <opus|opus_1m|sonnet|sonnet_1m|haiku|org/model>",summary:"Switch the active model mid-session",hint:"When you want to upgrade to opus for a hard problem or downshift to haiku for cheap iteration \u2014 context carries over. Also accepts full HuggingFace-style IDs (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(!n)return e.out.info(`Current model: ${m.brand(e.stats.model)}`),e.out.line(m.dim(` Aliases: ${Op.join(", ")} (or any org/model HF id)`)),"continue";let r=Op.includes(n),o=fe(n)==="openai-compatible";if(!r&&!o)return e.out.warn(`Unknown model: ${n}. Aliases: ${Op.join(", ")} (or org/model for local/OpenAI-compatible)`),"continue";try{await e.session.current.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(n)}`)}catch(s){e.out.error(`Failed to switch model: ${s instanceof Error?s.message:String(s)}`)}return"continue"}},vB={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(ye());let r=3,o=Math.ceil(n.length/r),s=Math.max(...n.map(i=>i.length))+2;for(let i=0;i<o;i++){let a=[];for(let l=0;l<r;l++){let c=l*o+i;c<n.length&&a.push(n[c].padEnd(s))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},TB={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(Rl(),Ek)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(ye());for(let[s,i]of Object.entries(o)){let a=Date.now()-i.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${s} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(i.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),s=o.indexOf(" ");if(s===-1||o.slice(0,s).length===0||o.slice(s+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let i=o.slice(0,s).trim(),a=o.slice(s+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${i}"\u2026`),await e.mcpManager.completeAuth(i,a),e.out.success(`OAuth complete for "${i}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${i}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(ye());let s=0;for(let i of o){let a=typeof i=="string"?i:i.name??JSON.stringify(i),l=typeof i=="object"&&i!==null&&"status"in i?String(i.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&s++}e.out.line(),s>0&&(e.out.line(m.dim(` ${s} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},xB={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(ye());for(let[t,n]of Object.entries(Us)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(re(n))}${r}`)}return e.out.line(),"continue"}},EB={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(Tl(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},Rk=[gB,bB,wB,SB,kB,vB,TB,xB,EB];var $p=!1;async function Pt(e,t,n={}){let r=e.stats.planMode,o=t!==void 0?t:!r;try{if(await e.session.current.setPermissionMode(o?"plan":"default"),e.stats.planMode=o,e.ui.repaintStatusLine(),o){let s=$p?"":m.dim(" Shift+Tab or /plan to exit.");$p||($p=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 write_file, edit_file, and write-intent bash are refused.")+s)}else n.closureSummarySkipped?e.out.success(m.success("\u25CB plan mode OFF")+m.dim(" \u2014 force-exit (closure summary skipped). Default permissions restored.")):e.out.success(m.success("\u25CB plan mode OFF")+m.dim(" \u2014 default permissions restored"))}catch(s){e.out.error(`Could not toggle plan mode: ${s instanceof Error?s.message:String(s)}`)}}async function Ak(e){e.stats.pendingPlanExit&&(await Pt(e,!1),e.stats.planMode||(e.stats.pendingPlanExit=!1))}var RB=["You are about to exit plan mode. Before I flip permissions back to default on the next turn, emit your final plan in three sections:",""," - **Chosen approach** \u2014 the plan you recommend, in one to three sentences."," - **Risks named** \u2014 the concrete failure modes, constraints, or unknowns this plan does not eliminate."," - **Alternatives considered** \u2014 the options you weighed and why you rejected them.","","This is the record. Be specific. Do not propose write actions in this turn \u2014 writes are still refused until the mode flips."].join(`
2041
+ `)}var Op=["opus","opus_1m","sonnet","sonnet_1m","haiku"],gB={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(ye()),n.line(` total ${m.success(Be(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(Be(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(Be).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function hB(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,s=n?.cache_read_input_tokens??0,i=n?.cache_creation_input_tokens??0,a=r+o+s+i;e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(ye()),e.line(` total ${m.success(re(t.totalTokens))} of ${m.meta(re(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(re(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(re(r))}`),e.line(` output ${m.meta(re(o))}`),e.line(` cache read ${m.meta(re(s))}`),e.line(` cache creat ${m.meta(re(i))}`),e.line(` total ${m.meta(re(a))}`);let l=t.categories??[];if(l.length>0){let p=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let f of p)e.line(` ${m.warning(f.name.padEnd(18))} ${m.meta(re(f.tokens))}`)}let c=t.systemTools??[],u=t.mcpTools??[];if(c.length>0||u.length>0){e.line();let p=c.reduce((g,h)=>g+h.tokens,0),f=u.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(m.dim(` system tools ${c.length} tools, ${re(p)} tokens`)),u.length>0&&e.line(m.dim(` MCP tools ${u.length} tools, ${re(f)} tokens`))}let d=t.agents??[];if(d.length>0){let p=d.reduce((f,g)=>f+g.tokens,0);e.line(m.dim(` agents ${d.length} loaded, ${re(p)} tokens`))}if(t.skills){let p=t.skills;e.line(m.dim(` skills ${p.includedSkills}/${p.totalSkills} included, ${re(p.tokens)} tokens`))}if(t.slashCommands){let p=t.slashCommands;e.line(m.dim(` slash cmds ${p.includedCommands}/${p.totalCommands} included, ${re(p.tokens)} tokens`))}e.line()}function yB(e,t){let n=t.turnTokens.reduce((u,d)=>u+d.input,0),r=t.turnTokens.reduce((u,d)=>u+d.output,0),o=t.turnTokens.reduce((u,d)=>u+d.cache,0),s=n+r,i=lt(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=i>0?Math.round(l/i*100):0;e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(ye()),e.line(` input ${m.meta(re(n))}`),e.line(` output ${m.meta(re(r))}`),e.line(` cache read ${m.meta(re(o))}`),e.line(` total ${m.success(re(s))}`),e.line(` context ${m.meta(`${c}% of ${re(i)} (${t.model})`)}`),e.line()}var bB={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();hB(e.out,t)}catch{yB(e.out,e.stats)}return"continue"}},wB={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(ye()),t.turns.forEach((r,o)=>{let s=m.meta(`#${o+1}`),i=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${s} ${m.user("\u25B6")} ${i}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}},SB={name:"/reset",summary:"Clear screen, history, and session stats",async handler(e){let{stats:t,ui:n,out:r}=e;try{await e.session.current.sendMessage("/clear")}catch{}return t.totalTurns=0,t.totalCostUsd=0,t.totalTokens=0,t.totalDurationMs=0,t.turnCosts.length=0,t.turnTokens.length=0,t.turns.length=0,t.sessionStartTime=Date.now(),n.clearScreen(),r.success("Session reset."),"continue"}},kB={name:"/model",usage:"/model <opus|opus_1m|sonnet|sonnet_1m|haiku|org/model>",summary:"Switch the active model mid-session",hint:"When you want to upgrade to opus for a hard problem or downshift to haiku for cheap iteration \u2014 context carries over. Also accepts full HuggingFace-style IDs (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(!n)return e.out.info(`Current model: ${m.brand(e.stats.model)}`),e.out.line(m.dim(` Aliases: ${Op.join(", ")} (or any org/model HF id)`)),"continue";let r=Op.includes(n),o=fe(n)==="openai-compatible";if(!r&&!o)return e.out.warn(`Unknown model: ${n}. Aliases: ${Op.join(", ")} (or org/model for local/OpenAI-compatible)`),"continue";try{await e.session.current.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(n)}`)}catch(s){e.out.error(`Failed to switch model: ${s instanceof Error?s.message:String(s)}`)}return"continue"}},vB={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(ye());let r=3,o=Math.ceil(n.length/r),s=Math.max(...n.map(i=>i.length))+2;for(let i=0;i<o;i++){let a=[];for(let l=0;l<r;l++){let c=l*o+i;c<n.length&&a.push(n[c].padEnd(s))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},TB={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(Rl(),Ek)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(ye());for(let[s,i]of Object.entries(o)){let a=Date.now()-i.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${s} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(i.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),s=o.indexOf(" ");if(s===-1||o.slice(0,s).length===0||o.slice(s+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let i=o.slice(0,s).trim(),a=o.slice(s+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${i}"\u2026`),await e.mcpManager.completeAuth(i,a),e.out.success(`OAuth complete for "${i}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${i}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(ye());let s=0;for(let i of o){let a=typeof i=="string"?i:i.name??JSON.stringify(i),l=typeof i=="object"&&i!==null&&"status"in i?String(i.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&s++}e.out.line(),s>0&&(e.out.line(m.dim(` ${s} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},xB={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(ye());for(let[t,n]of Object.entries(Us)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(re(n))}${r}`)}return e.out.line(),"continue"}},EB={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(Tl(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},Rk=[gB,bB,wB,SB,kB,vB,TB,xB,EB];var $p=!1;async function Pt(e,t,n={}){let r=e.stats.planMode,o=t!==void 0?t:!r;try{if(await e.session.current.setPermissionMode(o?"plan":"default"),e.stats.planMode=o,e.ui.repaintStatusLine(),o){let s=$p?"":m.dim(" Shift+Tab or /plan to exit.");$p||($p=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 write_file, edit_file, and write-intent bash are refused.")+s)}else n.closureSummarySkipped?e.out.success(m.success("\u25CB plan mode OFF")+m.dim(" \u2014 force-exit (closure summary skipped). Default permissions restored.")):e.out.success(m.success("\u25CB plan mode OFF")+m.dim(" \u2014 default permissions restored"))}catch(s){e.out.error(`Could not toggle plan mode: ${s instanceof Error?s.message:String(s)}`)}}async function Ak(e){e.stats.pendingPlanExit&&(await Pt(e,!1),e.stats.planMode||(e.stats.pendingPlanExit=!1))}var RB=["You are about to exit plan mode. Before I flip permissions back to default on the next turn, emit your final plan in three sections:",""," - **Chosen approach** \u2014 the plan you recommend, in one to three sentences."," - **Risks named** \u2014 the concrete failure modes, constraints, or unknowns this plan does not eliminate."," - **Alternatives considered** \u2014 the options you weighed and why you rejected them.","","This is the record. Be specific. Do not propose write actions in this turn \u2014 writes are still refused until the mode flips."].join(`
2042
2042
  `);async function AB(e){return e.stats.pendingPlanExit=!0,e.ui.repaintStatusLine(),e.out.success(m.warning("\u25CF plan exit queued")+m.dim(" \u2014 plan mode still ON; writes still refused. Submitting closure summary (chosen approach, risks, alternatives); mode flips after the model responds. Force-exit now: /plan off again or Shift+Tab.")),{kind:"submit",message:RB}}async function _B(e){return e.stats.pendingPlanExit=!1,await Pt(e,!1,{closureSummarySkipped:!0}),"continue"}async function CB(e){return e.stats.pendingPlanExit=!1,e.ui.repaintStatusLine(),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 plan exit cancelled, staying in plan mode.")),"continue"}function IB(e){e.out.info(m.dim("(plan exit cancelled \u2014 submitting your prompt instead.)"))}var _k={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode (write_file, edit_file, and write-intent bash refused)",hint:"When you want the model to think through an approach without touching files \u2014 refuses writes until you flip back. Shift+Tab toggles too.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();if(n!==""&&r!=="on"&&r!=="off"){let s=!!e.stats.pendingPlanExit;return e.stats.planMode||await Pt(e,!0),s&&(e.stats.pendingPlanExit=!1,IB(e)),{kind:"submit",message:n}}return(r==="on"?!0:r==="off"?!1:!e.stats.planMode)===!0?e.stats.pendingPlanExit?CB(e):(e.stats.planMode||await Pt(e,!0),"continue"):e.stats.planMode?e.stats.pendingPlanExit?_B(e):AB(e):(await Pt(e,!1),"continue")}};H();import{readFileSync as PB,writeFileSync as MB,existsSync as Ck,mkdirSync as OB}from"fs";import{join as $B}from"path";function Ik(){return gg(),Au()}function Pk(e){return $B(Ik(),`${e}.json`)}function Al(e){let t=Pk(e);if(!Ck(t))return{sessionId:e,items:[]};try{let n=PB(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function ri(e){let t=Ik();Ck(t)||OB(t,{recursive:!0}),MB(Pk(e.sessionId),JSON.stringify(e,null,2))}function Mk(e,t){let r={id:e.items.reduce((o,s)=>Math.max(o,s.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function Ok(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function $k(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function Dk(e){e.items.length=0}function _l(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,Z());{let r=m.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+m.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?m.success("[x]"):m.dim("[ ]"),s=r.done?m.dim(r.text):Pn(r.text),a=` ${m.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-q(a)),c=de(s,l).split(`
2043
2043
  `);t.push(a+(c[0]??""));let u=" ".repeat(q(a));for(let d of c.slice(1))t.push(u+d)}{let r=Math.max(0,Math.min(n-1,120));t.push(m.dim("\u2514"+"\u2500".repeat(r)))}return t}function Lk(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
2044
- `)}function Fk(e){let t=e.stats.sessionId??"unbound";return Al(t)}function DB(e){let t=Fk(e),n=_l(t);if(n.length===0){e.out.info("No todos yet. Try /todo add buy milk");return}for(let r of n)e.out.line(r)}var Nk={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",hint:"When you want a durable checklist the model and you both see \u2014 survives across turns and shows above each prompt.",async handler(e,t){let n=t.trim();if(!n||n==="list")return DB(e),"continue";let[r,...o]=n.split(/\s+/),s=o.join(" "),i=Fk(e);switch(r){case"add":{if(!s)return e.out.warn("Usage: /todo add <text>"),"continue";let a=Mk(i,s);return ri(i),e.out.success(`Added ${m.meta(`#${a.id}`)} ${a.text}`),"continue"}case"done":{let a=parseInt(s,10);if(!Number.isFinite(a))return e.out.warn("Usage: /todo done <id>"),"continue";let l=Ok(i,a);return l?(ri(i),e.out.success(`Marked done ${m.meta(`#${a}`)} ${l.text}`)):e.out.warn(`No todo with id ${a}`),"continue"}case"rm":case"remove":{let a=parseInt(s,10);return Number.isFinite(a)?($k(i,a)?(ri(i),e.out.success(`Removed ${m.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return Dk(i),ri(i),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}};var Bk={name:"/save",usage:"/save [name]",hint:"Checkpoint now (sessions already autosave each turn). Pass a name to label it \u2014 /name is the primary rename command.",summary:"Save this session to disk (for /resume)",async handler(e,t){if(e.stats.totalTurns===0)return e.out.warn("Nothing to save \u2014 no turns in this session yet."),"continue";let n=t.trim();if(n){let r=Bo(n);r?e.stats.name=r:e.out.warn("Ignoring invalid name \u2014 use letters, numbers, spaces, or hyphens.")}try{let r=qt(e.stats);e.out.success(m.success("Saved")+m.dim(` ${r}`));let o=e.stats.name??e.stats.sessionId;o&&e.out.line(m.dim(` Resume: ${Jt(o,e.stats.model)}`))}catch(r){e.out.error(`Could not save: ${r instanceof Error?r.message:String(r)}`)}return"continue"}};var Uk={name:"/name",usage:"/name [name]",hint:"When you want a memorable handle for this session so /resume and --resume can find it by name instead of a UUID.",summary:"Show or set this session\u2019s name",async handler(e,t){let n=t.trim();if(!n)return e.stats.name?e.out.line(m.dim(" name ")+m.warning(e.stats.name)):e.out.info("No name set. Use /name <name> to set one."),"continue";let r=Bo(n);if(!r)return e.out.warn("Invalid name \u2014 use letters, numbers, spaces, or hyphens."),"continue";if(e.stats.name=r,e.stats.totalTurns>0)try{qt(e.stats),e.out.success(m.success("Named")+m.dim(` ${r}`)),e.out.line(m.dim(` Resume: ${Jt(r,e.stats.model)}`))}catch(o){e.out.error(`Named "${r}" but save failed: ${o instanceof Error?o.message:String(o)}`)}else e.out.success(m.success("Named")+m.dim(` ${r} (saves on first turn)`));return"continue"}};function LB(e){if(typeof e!="number"||!Number.isFinite(e))return" \u2014 ";let t=new Date(e);return Number.isNaN(t.getTime())?" \u2014 ":t.toISOString().replace("T"," ").slice(0,16)}function FB(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}var jk={name:"/resume",usage:"/resume [id]",hint:"When you want to continue a previously /saved session \u2014 runs interactively to pick one if no id is given.",summary:"List saved sessions, or swap the active session for a stored one",async handler(e,t){let n=t.trim();if(n){let o=Lo(n);if(!o)return e.out.warn(`No saved session: ${n}`),"continue";let s=o.data.name??o.id;if(typeof e.requestResume=="function"){let l=e.session.current.sessionId,c=o.data.sessionId;if(l!==void 0&&c!==void 0&&l===c||l!==void 0&&l===o.id)return e.out.warn(`Already on session ${s}.`),"continue";e.out.info(`Resuming session ${s} \u2026`);let d=await e.requestResume(FB(o));return d.ok?e.out.success(`Resumed ${s} (sdk id: ${d.sessionId})`):e.out.warn(d.reason),"continue"}let i=o.data,a=i.name??i.sessionId??o.id;return e.out.line(),e.out.line(m.bold(`Session ${i.name??o.id}`)),e.out.line(ye()),e.out.line(` name ${m.brand(i.name??"\u2014")}`),e.out.line(` source ${m.brand(i.source??"cli")}`),e.out.line(` model ${m.brand(i.model)}`),e.out.line(` turns ${m.meta(String(i.totalTurns))}`),e.out.line(` cost ${m.meta(Ne(i.totalCostUsd))}`),e.out.line(` sdk id ${m.meta(i.sessionId??"\u2014")}`),e.out.line(),e.out.line(m.dim(" Resume with:")),e.out.line(m.brand(` ${Jt(a,i.model)}`)),e.out.line(),"continue"}let r=Qs();if(r.length===0)return e.out.info("No saved sessions found. Use /save first."),"continue";e.out.line(),e.out.line(m.bold(`Saved sessions (${r.length})`)),e.out.line(ye());for(let o of r.slice(0,20)){let s=LB(o.savedAt),i=m.brand(o.model.padEnd(7)),a=m.meta(`${o.totalTurns} turn${o.totalTurns===1?"":"s"}`.padEnd(9)),l=m.meta(Ne(o.totalCostUsd).padStart(8)),c=o.source==="telegram"?m.brand("tg"):" ",u=m.warning(o.name??o.id);e.out.line(` ${s} ${i} ${a} ${l} ${c} ${u}`)}return e.out.line(),e.out.line(m.dim(" Resume with: /resume <name>")),e.out.line(),"continue"}};import{spawnSync as NB}from"node:child_process";function BB(e){switch(e){case"darwin":return[{cmd:"pbcopy",args:[]}];case"win32":return[{cmd:"clip",args:[]}];default:return[{cmd:"wl-copy",args:[]},{cmd:"xclip",args:["-selection","clipboard"]},{cmd:"xsel",args:["--clipboard","--input"]}]}}function Wk(e,t=process.platform){for(let n of BB(t))try{let r=NB(n.cmd,n.args,{input:e});if(!r.error&&r.status===0)return!0}catch{}return!1}import{spawnSync as KB}from"node:child_process";function Dp(e=process.env){if(e.TMUX)return"tmux";if(e.KITTY_WINDOW_ID)return"kitty";if(e.WEZTERM_PANE)return"wezterm";if(e.WT_SESSION)return"windows-terminal";if(e.KONSOLE_DBUS_SERVICE)return"konsole";if(e.GNOME_TERMINAL_SCREEN)return"gnome-terminal";let t=e.TERM_PROGRAM;if(t==="iTerm.app")return"iterm2";if(t==="Apple_Terminal")return"apple-terminal";if(t==="vscode")return"vscode";if(t==="Hyper")return"hyper";let n=e.TERM;return n==="xterm-ghostty"||e.GHOSTTY_RESOURCES_DIR?"ghostty":n==="alacritty"?"alacritty":e.VTE_VERSION?"gnome-terminal":"unknown"}import{resolve as UB}from"node:path";function Lp(e,t,n){let r=UB(process.argv[1]??""),o=[process.execPath,r,"interactive"];typeof t=="string"&&t.length>0&&o.push("--model",t),o.push("--resume",e);let s=o.map(ei).join(" "),i=r.length>0&&!r.endsWith(".ts");return{argv:o,shellCommand:s,cwd:n,spawnable:i}}function Cl(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function Hk(e){return`cd ${ei(e.cwd)} && ${e.shellCommand}`}function jB(e){return`tell application "iTerm" to tell current window to create tab with default profile command "${Cl(Hk(e))}"`}function WB(e){return`tell application "Terminal" to do script "${Cl(Hk(e))}"`}function HB(e){return['tell application "Ghostty"',"set cfg to new surface configuration",`set command of cfg to "${Cl(e.shellCommand)}"`,`set initial working directory of cfg to "${Cl(e.cwd)}"`,"new tab in (front window) with configuration cfg","end tell"].join(`
2044
+ `)}function Fk(e){let t=e.stats.sessionId??"unbound";return Al(t)}function DB(e){let t=Fk(e),n=_l(t);if(n.length===0){e.out.info("No todos yet. Try /todo add buy milk");return}for(let r of n)e.out.line(r)}var Nk={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",hint:"When you want a durable checklist the model and you both see \u2014 survives across turns and shows above each prompt.",async handler(e,t){let n=t.trim();if(!n||n==="list")return DB(e),"continue";let[r,...o]=n.split(/\s+/),s=o.join(" "),i=Fk(e);switch(r){case"add":{if(!s)return e.out.warn("Usage: /todo add <text>"),"continue";let a=Mk(i,s);return ri(i),e.out.success(`Added ${m.meta(`#${a.id}`)} ${a.text}`),"continue"}case"done":{let a=parseInt(s,10);if(!Number.isFinite(a))return e.out.warn("Usage: /todo done <id>"),"continue";let l=Ok(i,a);return l?(ri(i),e.out.success(`Marked done ${m.meta(`#${a}`)} ${l.text}`)):e.out.warn(`No todo with id ${a}`),"continue"}case"rm":case"remove":{let a=parseInt(s,10);return Number.isFinite(a)?($k(i,a)?(ri(i),e.out.success(`Removed ${m.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return Dk(i),ri(i),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}};var Bk={name:"/save",usage:"/save [name]",hint:"Checkpoint now (sessions already autosave each turn). Pass a name to label it \u2014 /name is the primary rename command.",summary:"Save this session to disk (for /resume)",async handler(e,t){if(e.stats.totalTurns===0)return e.out.warn("Nothing to save \u2014 no turns in this session yet."),"continue";let n=t.trim();if(n){let r=Bo(n);r?e.stats.name=r:e.out.warn("Ignoring invalid name \u2014 use letters, numbers, spaces, or hyphens.")}try{let r=qt(e.stats);e.out.success(m.success("Saved")+m.dim(` ${r}`));let o=e.stats.name??e.stats.sessionId;o&&e.out.line(m.dim(` Resume: ${Jt(o,e.stats.model)}`))}catch(r){e.out.error(`Could not save: ${r instanceof Error?r.message:String(r)}`)}return"continue"}};var Uk={name:"/name",usage:"/name [name]",hint:"When you want a memorable handle for this session so /resume and --resume can find it by name instead of a UUID.",summary:"Show or set this session\u2019s name",async handler(e,t){let n=t.trim();if(!n)return e.stats.name?e.out.line(m.dim(" name ")+m.warning(e.stats.name)):e.out.info("No name set. Use /name <name> to set one."),"continue";let r=Bo(n);if(!r)return e.out.warn("Invalid name \u2014 use letters, numbers, spaces, or hyphens."),"continue";if(e.stats.name=r,e.stats.totalTurns>0)try{qt(e.stats),e.out.success(m.success("Named")+m.dim(` ${r}`)),e.out.line(m.dim(` Resume: ${Jt(r,e.stats.model)}`))}catch(o){e.out.error(`Named "${r}" but save failed: ${o instanceof Error?o.message:String(o)}`)}else e.out.success(m.success("Named")+m.dim(` ${r} (saves on first turn)`));return"continue"}};function LB(e){if(typeof e!="number"||!Number.isFinite(e))return" \u2014 ";let t=new Date(e);return Number.isNaN(t.getTime())?" \u2014 ":t.toISOString().replace("T"," ").slice(0,16)}function FB(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}var jk={name:"/resume",usage:"/resume [id]",hint:"When you want to continue a previously /saved session \u2014 runs interactively to pick one if no id is given.",summary:"List saved sessions, or swap the active session for a stored one",async handler(e,t){let n=t.trim();if(n){let o=Lo(n);if(!o)return e.out.warn(`No saved session: ${n}`),"continue";let s=o.data.name??o.id;if(typeof e.requestResume=="function"){let l=e.session.current.sessionId,c=o.data.sessionId;if(l!==void 0&&c!==void 0&&l===c||l!==void 0&&l===o.id)return e.out.warn(`Already on session ${s}.`),"continue";e.out.info(`Resuming session ${s} \u2026`);let d=await e.requestResume(FB(o));return d.ok?e.out.success(`Resumed ${s} (sdk id: ${d.sessionId})`):e.out.warn(d.reason),"continue"}let i=o.data,a=i.name??i.sessionId??o.id;return e.out.line(),e.out.line(m.bold(`Session ${i.name??o.id}`)),e.out.line(ye()),e.out.line(` name ${m.brand(i.name??"\u2014")}`),e.out.line(` source ${m.brand(i.source??"cli")}`),e.out.line(` model ${m.brand(i.model)}`),e.out.line(` turns ${m.meta(String(i.totalTurns))}`),e.out.line(` cost ${m.meta(Be(i.totalCostUsd))}`),e.out.line(` sdk id ${m.meta(i.sessionId??"\u2014")}`),e.out.line(),e.out.line(m.dim(" Resume with:")),e.out.line(m.brand(` ${Jt(a,i.model)}`)),e.out.line(),"continue"}let r=Qs();if(r.length===0)return e.out.info("No saved sessions found. Use /save first."),"continue";e.out.line(),e.out.line(m.bold(`Saved sessions (${r.length})`)),e.out.line(ye());for(let o of r.slice(0,20)){let s=LB(o.savedAt),i=m.brand(o.model.padEnd(7)),a=m.meta(`${o.totalTurns} turn${o.totalTurns===1?"":"s"}`.padEnd(9)),l=m.meta(Be(o.totalCostUsd).padStart(8)),c=o.source==="telegram"?m.brand("tg"):" ",u=m.warning(o.name??o.id);e.out.line(` ${s} ${i} ${a} ${l} ${c} ${u}`)}return e.out.line(),e.out.line(m.dim(" Resume with: /resume <name>")),e.out.line(),"continue"}};import{spawnSync as NB}from"node:child_process";function BB(e){switch(e){case"darwin":return[{cmd:"pbcopy",args:[]}];case"win32":return[{cmd:"clip",args:[]}];default:return[{cmd:"wl-copy",args:[]},{cmd:"xclip",args:["-selection","clipboard"]},{cmd:"xsel",args:["--clipboard","--input"]}]}}function Wk(e,t=process.platform){for(let n of BB(t))try{let r=NB(n.cmd,n.args,{input:e});if(!r.error&&r.status===0)return!0}catch{}return!1}import{spawnSync as KB}from"node:child_process";function Dp(e=process.env){if(e.TMUX)return"tmux";if(e.KITTY_WINDOW_ID)return"kitty";if(e.WEZTERM_PANE)return"wezterm";if(e.WT_SESSION)return"windows-terminal";if(e.KONSOLE_DBUS_SERVICE)return"konsole";if(e.GNOME_TERMINAL_SCREEN)return"gnome-terminal";let t=e.TERM_PROGRAM;if(t==="iTerm.app")return"iterm2";if(t==="Apple_Terminal")return"apple-terminal";if(t==="vscode")return"vscode";if(t==="Hyper")return"hyper";let n=e.TERM;return n==="xterm-ghostty"||e.GHOSTTY_RESOURCES_DIR?"ghostty":n==="alacritty"?"alacritty":e.VTE_VERSION?"gnome-terminal":"unknown"}import{resolve as UB}from"node:path";function Lp(e,t,n){let r=UB(process.argv[1]??""),o=[process.execPath,r,"interactive"];typeof t=="string"&&t.length>0&&o.push("--model",t),o.push("--resume",e);let s=o.map(ei).join(" "),i=r.length>0&&!r.endsWith(".ts");return{argv:o,shellCommand:s,cwd:n,spawnable:i}}function Cl(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function Hk(e){return`cd ${ei(e.cwd)} && ${e.shellCommand}`}function jB(e){return`tell application "iTerm" to tell current window to create tab with default profile command "${Cl(Hk(e))}"`}function WB(e){return`tell application "Terminal" to do script "${Cl(Hk(e))}"`}function HB(e){return['tell application "Ghostty"',"set cfg to new surface configuration",`set command of cfg to "${Cl(e.shellCommand)}"`,`set initial working directory of cfg to "${Cl(e.cwd)}"`,"new tab in (front window) with configuration cfg","end tell"].join(`
2045
2045
  `)}function Fp(e,t,n=process.platform){switch(e){case"tmux":return{kind:e,capability:"tab",exec:{cmd:"tmux",args:["new-window","-c",t.cwd,t.shellCommand]}};case"wezterm":return{kind:e,capability:"tab",exec:{cmd:"wezterm",args:["cli","spawn","--cwd",t.cwd,"--",...t.argv]}};case"kitty":return{kind:e,capability:"tab",exec:{cmd:"kitten",args:["@","launch","--type=tab",`--cwd=${t.cwd}`,...t.argv]}};case"windows-terminal":return{kind:e,capability:"tab",exec:{cmd:"wt",args:["-w","0","new-tab","-d",t.cwd,...t.argv]}};case"iterm2":return{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",jB(t)]}};case"apple-terminal":return{kind:e,capability:"window",exec:{cmd:"osascript",args:["-e",WB(t)]}};case"ghostty":return n==="darwin"?{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",HB(t)]}}:{kind:e,capability:"none"};case"gnome-terminal":return{kind:e,capability:"tab",exec:{cmd:"gnome-terminal",args:["--tab",`--working-directory=${t.cwd}`,"--",...t.argv]}};case"konsole":return{kind:e,capability:"tab",exec:{cmd:"konsole",args:["--new-tab","--workdir",t.cwd,"-e",...t.argv]}};case"vscode":case"alacritty":case"hyper":case"unknown":return{kind:e,capability:"none"}}}var GB=5e3,zB=(e,t,n)=>{let r=KB(e,t,n);return{status:r.status,...r.error?{error:r.error}:{}}};function Kk(e){let t=e.env??process.env,n=e.platform??process.platform,r=e.run??zB,o=Dp(t);if(!e.interactive)return{spawned:!1,kind:o,capability:"none",reason:"non-interactive-surface"};let s=Lp(e.forkId,e.model,e.cwd);if(!s.spawnable)return{spawned:!1,kind:o,capability:"none",reason:"dev-entrypoint"};let i=Fp(o,s,n);if(i.capability==="none"||!i.exec)return{spawned:!1,kind:o,capability:i.capability,reason:"no-tab-mechanism"};try{let a=r(i.exec.cmd,i.exec.args,{stdio:"ignore",timeout:GB});if(a.error||a.status!==0){let l=a.error?a.error.message:`exited ${a.status}`;return{spawned:!1,kind:o,capability:i.capability,reason:l}}return{spawned:!0,kind:o,capability:i.capability}}catch(a){return{spawned:!1,kind:o,capability:i.capability,reason:a instanceof Error?a.message:String(a)}}}var qB={tmux:"tmux",wezterm:"WezTerm",kitty:"kitty",iterm2:"iTerm","apple-terminal":"Terminal",ghostty:"Ghostty","windows-terminal":"Windows Terminal","gnome-terminal":"GNOME Terminal",konsole:"Konsole",vscode:"VS Code",alacritty:"Alacritty",hyper:"Hyper",unknown:"this terminal"};function JB(e,t,n){let r=[];if(e.spawned){let o=e.capability==="window"?"window":"tab";r.push(m.info(` \u2197 Continuing in a new ${qB[e.kind]} ${o}.`)),r.push(m.dim(" Or run it yourself:"))}else e.kind==="vscode"&&e.reason==="no-tab-mechanism"?r.push(m.dim(" VS Code's integrated terminal can't be opened from outside \u2014 run this in a new terminal:")):r.push(m.dim(" Continue the fork with:"));return r.push(m.brand(` ${t}`)),n&&r.push(m.dim(" (copied to clipboard)")),r.push(""),r.push(m.meta(" This session continues here, untouched. The fork carries the")),r.push(m.meta(" conversation only \u2014 live subagents and background jobs are not forked.")),r}var Gk={name:"/fork",aliases:["/branch"],usage:"/fork",hint:"When you want to explore a divergent path without losing this thread \u2014 duplicates the conversation into a new resumable session you can continue in parallel.",summary:"Duplicate this conversation into a new, independent session",async handler(e){if(e.stats.totalTurns===0)return e.out.warn("Nothing to fork yet \u2014 no turns in this session."),"continue";let t,n;try{({id:t,path:n}=ZS(e.stats))}catch(l){return e.out.error(`Could not fork: ${l instanceof Error?l.message:String(l)}`),"continue"}let r=Jt(t,e.stats.model),o=e.stats.cwd??process.cwd(),s=typeof e.requestResume=="function"&&process.stdout.isTTY===!0,i=Kk({forkId:t,model:e.stats.model,cwd:o,interactive:s}),a=!i.spawned&&Wk(r);e.out.success(m.success("Forked")+m.dim(` ${n}`)),e.out.line();for(let l of JB(i,r,a))e.out.line(l);return e.out.line(),"continue"}};import{existsSync as tU,readFileSync as nU}from"node:fs";import{resolve as Yk}from"node:path";import{execFileSync as zk}from"node:child_process";import{readFileSync as VB,writeFileSync as YB}from"node:fs";import{resolve as XB}from"node:path";var ZB={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},QB=["Added","Fixed","Changed","Deprecated","Removed","Security"];function qk(e){let t;try{t=zk("git",["describe","--tags","--abbrev=0"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{t=""}let n=t?["log",`${t}..HEAD`,"--format=%h %s"]:["log","-50","--format=%h %s"],r=zk("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
2046
2046
  `).map(o=>{let s=o.indexOf(" "),i=o.slice(0,s),a=o.slice(s+1),l=a.match(/^(\w+(?:\+\w+)?)(?:\([^)]*\))?!?:\s*(.+)/);if(l){let c=l[1].toLowerCase(),u=ZB[c]??"Changed";return{hash:i,subject:l[2],category:u}}return{hash:i,subject:a,category:"Changed"}}):[]}function Jk(e,t={}){let n=t.includeHash??!1,r=new Map;for(let s of e){let i=r.get(s.category)??[];i.push(s),r.set(s.category,i)}let o=[];for(let s of QB){let i=r.get(s);if(i?.length){o.push(`### ${s}`);for(let a of i)o.push(n?`- ${a.subject} (${a.hash})`:`- ${a.subject}`);o.push("")}}return o.join(`
2047
2047
  `)}function Np(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function eU(e){let t=new Set;for(let n of e.split(`
@@ -2109,12 +2109,12 @@ ${u}`}function Wp(e,t){let n=nv[t.status];e.out.line(` ${n} ${m.bold(t.jobId)}
2109
2109
  `),w),this.repositionCommittedBand(R,S,w)}preserveRowsBeforeFrameRender(t){let n=this.logUpdate?.topRow??0;if(!(this.anchorRow!==void 0&&this.anchorRow>1)){let a=this.hasCommitted&&n>1&&t<n,l=this.committedBand.length;if(!a||l===0)return;let c=Math.max(0,t-1),u=l-c;if(u<=0)return;let d="";for(let p=Math.max(1,this.committedBandTopRow);p<=this.committedBandBottomRow;p++)d+=`\x1B[${p};1H\x1B[2K`;for(let p=0;p<l;p++)d+=`\x1B[${1+p};1H\x1B[2K${this.committedBand[p]??""}`;try{this.stdout.write(d)}catch{}this.evictRowsToScrollback(u),this.committedBand=this.committedBand.slice(u),this.committedBandTopRow=1,this.committedBandBottomRow=c;return}let o=this.hasCommitted&&n>1?Math.max(0,n-t):0,s=t<this.anchorRow?this.anchorRow-t:0,i=Math.max(o,s);if(i>0&&(this.evictRowsToScrollback(i),this.anchorRow!==void 0&&this.anchorRow>1&&(this.anchorRow=Math.max(1,this.anchorRow-i)),this.committedBand.length>0)){this.committedBandTopRow-=i,this.committedBandBottomRow-=i;let a=Math.max(this.anchorRow??1,1);if(this.committedBandTopRow<a){let l=a-this.committedBandTopRow;this.committedBand=this.committedBand.slice(l),this.committedBandTopRow=a}(this.committedBand.length===0||this.committedBandBottomRow<a)&&this.clearCommittedBand()}}evictRowsToScrollback(t){if(t<=0)return;this.debugLog("evict:enter",{rows:t,anchorRow:this.anchorRow??null});let r=`\x1B[${Math.max(1,this.stdout.rows??24)};1H${`
2110
2110
  `.repeat(t)}`,o=()=>{try{this.stdout.write(r)}catch(s){this.debugLog("evict:error",{msg:s?.message??String(s)})}};this.scrollRegion!==void 0?this.scrollRegion.withFullScrollRegion(o):o()}repaintPickerFrame(){if(!this.logUpdate||!this.pickerController)return;let t=[...this.pickerController.renderRows()],n=this.overlay?this.overlay.split(`
2111
2111
  `):[],r=this.spinnerController.renderSpinnerRow(),o=this.spinnerController.renderTipRow(this.stdout.columns??80),s=null;this.attachments.length>0?s=ai(this.attachments):this.clipboardFailureMsg!==null&&(s=m.dim(this.clipboardFailureMsg),this.clipboardFailureMsg=null);let i=!!r||!!o||!!s,a=i||n.length>0,l=this.scrollRegion?.getExtraRows()??0,c=Math.max(1,(this.stdout.rows??24)-1-l),u=a?1:0,d=(r?1:0)+(o?1:0)+(s?1:0)+u+t.length,p=Math.max(0,c-d),f=n.length>p?n.slice(-p):n,g=i||f.length>0,h=[];if(h.push(...f),r&&h.push(r),o&&h.push(o),s&&h.push(s),g&&h.push(""),h.push(...t),h.length===0)return;let b=Math.max(1,(this.stdout.rows??24)-1-l),y=h.length,w=Math.max(1,b-y+1);this.preserveRowsBeforeFrameRender(w);let v=this.logUpdate.topRow??0;this.logUpdate.render(h.join(`
2112
- `),b),this.repositionCommittedBand(w,v,b)}resetState(){this.overlay="",this.input=W.seed(""),this.queued=!1,this.canceled=!1,this.backgrounded=!1,this.softStopped=!1,this.activeGhost=null,this.anchorRow=void 0,this.hasCommitted=!1,this.clearCommittedBand(),this.commitInFlight=!1,this.pendingResizeErase=null,this.lastKnownRows=0,this.pickerController=null,this.inputMode="streaming",this.attachments=[],this.pasting=!1,this.pasteStartBufferLen=0,this.pasteStartCursor=0,this.pasteRegistry.clear(),this.clipboardFailureMsg=null,this.autocompleteState?.reset(),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null)}applyEdit(t){return t===this.input?!1:(this.input=t,this.queued=!1,this.pasting||(this.updateAutocomplete(),this.updateGhost(),this.repaint()),!0)}applyDropdownSelection(){return Bv(this)}applyGhostAccept(){return Uv(this)}dispatchKey(t,n){Qv(this,t,n)}};import s1 from"chalk";var i1=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,a1=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,l1=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,eT={mint:m.mint};function c1(e){let t=eT[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=eT[r];if(o)return o}return null}function Vn(e,t){return s1.level===0?e:e.replace(i1,o=>{let s=o.slice(1);return t.has(s)?(c1(s)??m.brand)(o):m.meta(o)}).replace(a1,o=>m.fileRef(o)).replace(l1,o=>m.meta(o))}G();var tT=/[\x00-\x1F\x7F-\x9F]/g;function Ke(e){return Ae(e).replace(tT," ").replace(/ {2,}/g," ").trim()}function tm(e){return Ae(e).replace(tT," ")}function pi(e){let t=/[a-z][a-z0-9+.-]*:\/\/[^\s<>\"`]+/gi,n="",r=0;for(let o of e.matchAll(t)){let s=o[0]??"",i=o.index??r;n+=nT(e.slice(r,i)),n+=s,r=i+s.length}return n+=nT(e.slice(r)),n}function nT(e){return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,"$1")}function u1(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}var rT=60;function nm(e,t){let n=e.trim().replace(/^\((.*)\)$/s,"$1"),r;try{r=JSON.parse(n)}catch{return e}if(!r||typeof r!="object")return e;let o=r;for(let s of t){let i=o[s];if(typeof i=="string"&&i.length>0){let a=Ke(i);if(a.length===0)continue;return`(${a.length>rT?se(a,rT,"\u2026"):a})`}}return e}function oT(e,t){if(e==="bash"||e==="Bash")return u1(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,s=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let i=`${o} node${o===1?"":"s"}`,a=s>0?`, ${s} edge${s===1?"":"s"}`:"";return`(${i}${a})`}}}catch{}}return e==="agent"||e==="Agent"?nm(t,["id_prefix","prompt"]):e==="Task"?nm(t,["description","prompt"]):e==="skill"||e==="Skill"?nm(t,["name","arguments"]):e==="ask_question"?d1(t):t}function d1(e){let t=e.trim().replace(/^\((.*)\)$/s,"$1");try{let n=JSON.parse(t);if(!n||typeof n!="object")return e;let r=n,o=typeof r.type=="string"?r.type:"text";if(o==="choice"||o==="multi_choice"){let s=r.choices,i=Array.isArray(s)?s.length:0;return i>0?`(${o}: ${i} option${i===1?"":"s"})`:`(${o})`}return`(${o})`}catch{return e}}function p1(e){return e.replace(/[\r\n]+/g," ")}var m1={"(":")","{":"}","[":"]"};function sT(e,t,n="\u2026"){let r=e.charAt(0),o=m1[r];return!(o&&e.endsWith(o)&&e.length>=2)||q(e)<=t?se(e,t,n):t<3?t>=2?r+o:se(e,t,n):se(e,t-1,n)+o}function wn(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=pi(oT(r,n[2]??"")),s=Nn(r),{color:i,glyph:a}=Mo(r),l=$d(s),c=l?` [${l}]`:"";if(t!==void 0){let d=(a+" ").length+r.length+c.length,p=Math.max(1,t-d);o=sT(o,p)}o=p1(o);let u=i(a+" ")+i.bold(r)+m.toolArg(o);return l?u+m.dim(c):u}return m.chrome("\u25CF ")+m.toolArg(e)}G();var iT=8,Vl=30;function f1(){let e=T.AFK_DIFF_LINES;if(e===void 0)return Vl;let t=e.trim();if(!/^\d+$/.test(t))return Vl;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Vl}function g1(){let e=T.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}function h1(e){let t=m.diffAdd(`+${e.addedLines}`),n=m.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=m.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var y1=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function b1(e){let t=Ae(e.text).replace(y1,"");return e.kind==="+"?m.diffAdd("+ "+t):e.kind==="-"?m.diffRemove("- "+t):m.dim(" "+t)}var om=new WeakMap;function Sn(e,t,n){if(g1())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?iT:f1(),o=t+"|"+n+"|"+r,s=om.get(e);if(s!==void 0){let f=s.get(o);if(f!==void 0)return f}let i=[];i.push(n+h1(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:m.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:b1(h)})}if(r===0){for(let f of a)i.push(n+f.text);return rm(e,o,i),i}let l=0;for(let f of a)f.kind==="body"&&l++;if(l<=r){for(let f of a)i.push(n+f.text);return rm(e,o,i),i}let c=0;for(let f of a)f.kind==="header"?i.push(n+f.text):c<r&&(i.push(n+f.text),c++);let u=l-r,d=`line${u===1?"":"s"}`,p=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return i.push(n+m.dim(`\u2026 +${u} more diff ${d}${p}`)),rm(e,o,i),i}function rm(e,t,n){let r=om.get(e);r===void 0&&(r=new Map,om.set(e,r)),r.set(t,n)}var w1=m.success("\u2713"),S1=m.error("\u2717");function Yn(e){return e?S1:w1}var mi=3,aT=2,lT=3;function cT(e){switch(Nn(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function k1(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function kn(e,t,n=60,r){let o=e.isError?m.error:m.dim,s=t??T.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(s)?"~"+e.persistedPath.slice(s.length):e.persistedPath;return o(`saved \u2192 ${a}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${k1(r,e.lineCount)}`);let i=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(Ke(i))}G();function fi(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=e.slice(t),o=dT(r);return[...n,{kind:"overflow",count:r.length,text:o}]}function v1(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var T1=5,uT=60;function dT(e){let t=new Map,n=0;for(let s of e)s.kind==="group"?(t.set(s.toolName,(t.get(s.toolName)??0)+s.entries.length),n+=s.entries.length):(t.set(s.toolName,(t.get(s.toolName)??0)+1),n+=1);if(n===0)return"";if(e.length>0&&e.every(s=>He.has(s.toolName))&&new Set(e.map(s=>s.toolName)).size===1){let s=[],i=!1;for(let a of e){let c=(a.kind==="group"?a.label:a.toolInput).trim();if(!c.startsWith("(")||!c.endsWith(")")){i=!0;break}let u=c.slice(1,-1),d=Ke(u);if(!d){i=!0;break}let p=d.length>uT?d.slice(0,uT-1)+"\u2026":d,f=a.kind==="group"?a.entries.length:1;s.push({display:p,entries:f})}if(!i&&s.length>0){let a=s.slice(0,T1),l=a.map(({display:p,entries:f})=>f>1?`${p} \xD7${f}`:p),c=a.reduce((p,f)=>p+f.entries,0),u=n-c,d=l.join(", ")+(u>0?` (+${u})`:"");return`\u2026 +${n} more: ${d}`}}let o=[];for(let[s,i]of t)o.push(`${i} ${v1(s,i)}`);return`\u2026 +${n} (${o.join(", ")})`}function Yl(e,t=Mt()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function sm(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function im(e){if(e.length===0)return[];let t=new Map;for(let o of e){let s=pT(o),i=t.get(s);i||(i=[],t.set(s,i)),i.push(o)}let n=[],r=new Set;for(let o of e){let s=pT(o),i=t.get(s);i.length>=x1(o.toolName)?r.has(s)||(n.push({kind:"group",toolName:o.toolName,label:He.has(o.toolName)?o.toolInput:"",entries:i}),r.add(s)):n.push(o)}return n}function am(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,s;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),s=l.join(", ")}else o===t?s=`${t} done`:o===0?s=`${t} running`:s=`${o}/${t} done`;return wn(e.toolName+e.label)+m.dim(` \xD7${t} \u2014 ${s}`)}function pT(e){return He.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function x1(e){return He.has(e)?aT:lT}function mT(e,t,n,r){return e>0||t?zo([...n,!0],r):zo(n,r)}function fT(e,t){return!He.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&fT(r,t))}function Xl(e,t,n,r=Z(),o=[],s=Mt()){let i=zo(o,s),a=gi(i,s),l=e.filter(g=>g.kind==="text"),c=e.filter(g=>g.kind==="tool").filter(g=>!fT(g,t)),u=im(c),d=fi(u,mi),p=Yl(d,s);for(let{sibling:g,connector:h}of p){let b=m.dim(h),y=h===s.lastConnector;if(g.kind==="overflow")n.push(Me(a+b+m.dim(g.text),r));else if(g.kind==="group")n.push(Me(a+b+am(g),r));else if(g.kind==="resultSummary")n.push(Me(a+b+m.dim(g.summary),r));else{let w=g,v=t.get(w.toolUseId);if(He.has(w.toolName)&&v&&v.length>0){if(w.headerEmitted?n.push(Me(a+b,r)):n.push(Me(a+b+w.prefix,r)),Xl(v,t,n,r,[...o,y],s),w.thinkingTail){let R=gi(zo([...o,y],s),s);n.push(Me(R+m.thinking("\u2307 "+Ke(w.thinkingTail)),r))}}else if(w.result){if(n.push(Me(a+b+w.prefix+m.dim(" \u2014 ")+Yn(w.result.isError)+" "+kn(w.result,void 0,60,w.toolName),r)),w.diff&&!w.result.isError){let R=a+(y?s.spineClosed:m.dim(s.spine))+" ";for(let S of Sn(w.diff,"overlay",R))n.push(S)}}else{n.push(Me(a+b+w.prefix,r));let R=a+(y?s.spineClosed:m.dim(s.spine))+" ";w.thinkingTail?n.push(Me(R+m.thinking("\u2307 "+Ke(w.thinkingTail)),r)):n.push(Me(R+m.dim(cT(w.toolName)),r))}}}let f=mT(c.length,!1,o,s);for(let g of l)for(let h of lm(g.text,f,s))n.push(Me(h,r))}function hi(e,t,n,r,o=Z(),s=[],i=Mt()){let a=zo(s,i),l=gi(a,i),c=[],u=e.filter(y=>y.kind==="text"),d=e.filter(y=>y.kind==="tool"),p=im(d),f=fi(p,mi),g=sm(f,r),h=Yl(g,i);for(let{sibling:y,connector:w}of h){let v=m.dim(w),R=w===i.lastConnector;if(y.kind==="overflow")c.push(Me(l+v+m.dim(y.text),o));else if(y.kind==="resultSummary")c.push(Me(l+v+m.dim(y.summary),o));else if(y.kind==="group")c.push(Me(l+v+am(y),o));else{let S=y,E=t.get(S.toolUseId);if(He.has(S.toolName)&&E&&E.length>0){if(S.headerEmitted){let _=S.toolInput?`${S.toolName} ${Ke(S.toolInput)}`:S.toolName;c.push(Me(l+v+m.dim("\u21B3 "+_),o))}else c.push(Me(l+v+S.prefix,o));c.push(...hi(E,t,n,void 0,o,[...s,R],i))}else if(S.result){if(c.push(Me(l+v+S.prefix+m.dim(" \u2014 ")+Yn(S.result.isError)+" "+kn(S.result,n,60,S.toolName),o)),S.diff&&!S.result.isError){let _=l+(R?i.spineClosed:m.dim(i.spine))+" ";for(let C of Sn(S.diff,"flush",_))c.push(C)}}else c.push(Me(l+v+S.prefix,o))}}let b=mT(d.length,r!=null,s,i);for(let y of u)for(let w of lm(y.text,b,i))c.push(Me(w,o));return c}function yi(e,t,n,r,o=0){let s=Mt(),i=t.filter(h=>h.kind==="tool"),l=i.filter(h=>h.result).reduce((h,b)=>h+(b.result.lineCount??0),0),c=[];i.length>mi&&(c.push(`${i.length} tools`),l>0&&c.push(`${l} lines`));let u=m.dim(s.spine.repeat(o)),d=Array.from({length:o},()=>!1),p=m.dim(s.turnRoot),f=c.length>0?u+p+e.prefix+m.dim(" \u2014 "+c.join(" \xB7 ")):u+p+e.prefix,g=hi(t,n,r,e.agentResultSummary,Z(),d,s);return[f,...g].join(`
2113
- `)}function cm(e,t=0){let n=Mt(),r=m.dim(n.spine.repeat(t)),o=m.dim(n.turnRoot);return r+o+e.prefix}function bi(e,t,n,r,o=0){let s=Mt(),i=Array.from({length:o},()=>!1);return hi(t,n,r,e.agentResultSummary,Z(),i,s)}function qo(e,t,n){let r=[];for(let o of t){let s=e.get(o);if(s.length===1){let i=s[0];if(i.result){if(r.push(" "+i.prefix+m.dim(" \u2014 ")+Yn(i.result.isError)+" "+kn(i.result,n,60,i.toolName)),i.diff&&!i.result.isError)for(let a of Sn(i.diff,"flush"," "))r.push(a)}else r.push(" "+i.prefix)}else{r.push(gT(o,s,n));let i=s.filter(l=>l.diff&&l.result&&!l.result.isError),a=i.length>1;for(let l of i){if(a){let c=Ke(pi(l.toolInput).trim()||l.toolInput.trim());r.push(" "+m.dim(`\u2500\u2500 ${c} \u2500\u2500`))}for(let c of Sn(l.diff,"flush"," "))r.push(c)}}}return r}function gT(e,t,n){let{color:r,glyph:o}=Mo(e),s=t.map(u=>Ke(pi(u.toolInput).trim())),i=r(o+" ")+r.bold(e)+m.dim(` \xD7${t.length}`)+" "+m.toolArg(s.join(", ")),a=t.filter(u=>u.result),l=a.filter(u=>u.result.isError);if(l.length>0){let u=a.length-l.length,p=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return p>0&&f.push(`${p} lines`),u>0&&f.push(`${u} ok`),f.push(m.error(`${l.length} error${l.length>1?"s":""}`))," "+i+m.dim(" \u2014 ")+f.join(m.dim(", "))}let c=a.map(u=>u.result?.lineCount).filter(u=>u!==void 0);if(c.length===a.length&&c.length>0){if(c.every(p=>p===c[0]))return" "+i+m.dim(` \u2014 ${c[0]} lines each`);let d=c.reduce((p,f)=>p+f,0);return" "+i+m.dim(` \u2014 ${d} lines total`)}if(a.length>0){let u=a.map(d=>kn(d.result,n,60,d.toolName));return" "+i+m.dim(" \u2014 ")+u.join(m.dim(", "))}return" "+i}function Me(e,t){return se(e,t)}var um=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),E1=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),vue=um.midConnector,Tue=um.lastConnector;function Mt(){let e=T.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?E1:um}function zo(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function gi(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?m.dim(o):o}return n}function lm(e,t,n){if(!e||!e.trim())return[];let r=m.dim(n.textPrefix),o=Math.max(1,Z()-t.length-2-2),s=gi(t,n),i=[];for(let a of e.split(`
2112
+ `),b),this.repositionCommittedBand(w,v,b)}resetState(){this.overlay="",this.input=W.seed(""),this.queued=!1,this.canceled=!1,this.backgrounded=!1,this.softStopped=!1,this.activeGhost=null,this.anchorRow=void 0,this.hasCommitted=!1,this.clearCommittedBand(),this.commitInFlight=!1,this.pendingResizeErase=null,this.lastKnownRows=0,this.pickerController=null,this.inputMode="streaming",this.attachments=[],this.pasting=!1,this.pasteStartBufferLen=0,this.pasteStartCursor=0,this.pasteRegistry.clear(),this.clipboardFailureMsg=null,this.autocompleteState?.reset(),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null)}applyEdit(t){return t===this.input?!1:(this.input=t,this.queued=!1,this.pasting||(this.updateAutocomplete(),this.updateGhost(),this.repaint()),!0)}applyDropdownSelection(){return Bv(this)}applyGhostAccept(){return Uv(this)}dispatchKey(t,n){Qv(this,t,n)}};import s1 from"chalk";var i1=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,a1=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,l1=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,eT={mint:m.mint};function c1(e){let t=eT[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=eT[r];if(o)return o}return null}function Vn(e,t){return s1.level===0?e:e.replace(i1,o=>{let s=o.slice(1);return t.has(s)?(c1(s)??m.brand)(o):m.meta(o)}).replace(a1,o=>m.fileRef(o)).replace(l1,o=>m.meta(o))}G();var tT=/[\x00-\x1F\x7F-\x9F]/g;function Ke(e){return Ae(e).replace(tT," ").replace(/ {2,}/g," ").trim()}function tm(e){return Ae(e).replace(tT," ")}function pi(e){let t=/[a-z][a-z0-9+.-]*:\/\/[^\s<>\"`]+/gi,n="",r=0;for(let o of e.matchAll(t)){let s=o[0]??"",i=o.index??r;n+=nT(e.slice(r,i)),n+=s,r=i+s.length}return n+=nT(e.slice(r)),n}function nT(e){return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,"$1")}function u1(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}var rT=60;function nm(e,t){let n=e.trim().replace(/^\((.*)\)$/s,"$1"),r;try{r=JSON.parse(n)}catch{return e}if(!r||typeof r!="object")return e;let o=r;for(let s of t){let i=o[s];if(typeof i=="string"&&i.length>0){let a=Ke(i);if(a.length===0)continue;return`(${a.length>rT?se(a,rT,"\u2026"):a})`}}return e}function oT(e,t){if(e==="bash"||e==="Bash")return u1(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,s=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let i=`${o} node${o===1?"":"s"}`,a=s>0?`, ${s} edge${s===1?"":"s"}`:"";return`(${i}${a})`}}}catch{}}return e==="agent"||e==="Agent"?nm(t,["id_prefix","prompt"]):e==="Task"?nm(t,["description","prompt"]):e==="skill"||e==="Skill"?nm(t,["name","arguments"]):e==="ask_question"?d1(t):t}function d1(e){let t=e.trim().replace(/^\((.*)\)$/s,"$1");try{let n=JSON.parse(t);if(!n||typeof n!="object")return e;let r=n,o=typeof r.type=="string"?r.type:"text";if(o==="choice"||o==="multi_choice"){let s=r.choices,i=Array.isArray(s)?s.length:0;return i>0?`(${o}: ${i} option${i===1?"":"s"})`:`(${o})`}return`(${o})`}catch{return e}}function p1(e){return e.replace(/[\r\n]+/g," ")}var m1={"(":")","{":"}","[":"]"};function sT(e,t,n="\u2026"){let r=e.charAt(0),o=m1[r];return!(o&&e.endsWith(o)&&e.length>=2)||q(e)<=t?se(e,t,n):t<3?t>=2?r+o:se(e,t,n):se(e,t-1,n)+o}function wn(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=pi(oT(r,n[2]??"")),s=Nn(r),{color:i,glyph:a}=Mo(r),l=$d(s),c=l?` [${l}]`:"";if(t!==void 0){let d=(a+" ").length+r.length+c.length,p=Math.max(1,t-d);o=sT(o,p)}o=p1(o);let u=i(a+" ")+i.bold(r)+m.toolArg(o);return l?u+m.dim(c):u}return m.chrome("\u25CF ")+m.toolArg(e)}G();var iT=8,Vl=30;function f1(){let e=T.AFK_DIFF_LINES;if(e===void 0)return Vl;let t=e.trim();if(!/^\d+$/.test(t))return Vl;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Vl}function g1(){let e=T.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}function h1(e){let t=m.diffAdd(`+${e.addedLines}`),n=m.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=m.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var y1=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function b1(e){let t=Ae(e.text).replace(y1,"");return e.kind==="+"?m.diffAdd("+ "+t):e.kind==="-"?m.diffRemove("- "+t):m.dim(" "+t)}var om=new WeakMap;function Sn(e,t,n){if(g1())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?iT:f1(),o=t+"|"+n+"|"+r,s=om.get(e);if(s!==void 0){let f=s.get(o);if(f!==void 0)return f}let i=[];i.push(n+h1(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:m.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:b1(h)})}if(r===0){for(let f of a)i.push(n+f.text);return rm(e,o,i),i}let l=0;for(let f of a)f.kind==="body"&&l++;if(l<=r){for(let f of a)i.push(n+f.text);return rm(e,o,i),i}let c=0;for(let f of a)f.kind==="header"?i.push(n+f.text):c<r&&(i.push(n+f.text),c++);let u=l-r,d=`line${u===1?"":"s"}`,p=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return i.push(n+m.dim(`\u2026 +${u} more diff ${d}${p}`)),rm(e,o,i),i}function rm(e,t,n){let r=om.get(e);r===void 0&&(r=new Map,om.set(e,r)),r.set(t,n)}var w1=m.success("\u2713"),S1=m.error("\u2717");function Yn(e){return e?S1:w1}var mi=3,aT=2,lT=3;function cT(e){switch(Nn(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function k1(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function kn(e,t,n=60,r){let o=e.isError?m.error:m.dim,s=t??T.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(s)?"~"+e.persistedPath.slice(s.length):e.persistedPath;return o(`saved \u2192 ${a}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${k1(r,e.lineCount)}`);let i=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(Ke(i))}G();function fi(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=e.slice(t),o=dT(r);return[...n,{kind:"overflow",count:r.length,text:o}]}function v1(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var T1=5,uT=60;function dT(e){let t=new Map,n=0;for(let s of e)s.kind==="group"?(t.set(s.toolName,(t.get(s.toolName)??0)+s.entries.length),n+=s.entries.length):(t.set(s.toolName,(t.get(s.toolName)??0)+1),n+=1);if(n===0)return"";if(e.length>0&&e.every(s=>Le.has(s.toolName))&&new Set(e.map(s=>s.toolName)).size===1){let s=[],i=!1;for(let a of e){let c=(a.kind==="group"?a.label:a.toolInput).trim();if(!c.startsWith("(")||!c.endsWith(")")){i=!0;break}let u=c.slice(1,-1),d=Ke(u);if(!d){i=!0;break}let p=d.length>uT?d.slice(0,uT-1)+"\u2026":d,f=a.kind==="group"?a.entries.length:1;s.push({display:p,entries:f})}if(!i&&s.length>0){let a=s.slice(0,T1),l=a.map(({display:p,entries:f})=>f>1?`${p} \xD7${f}`:p),c=a.reduce((p,f)=>p+f.entries,0),u=n-c,d=l.join(", ")+(u>0?` (+${u})`:"");return`\u2026 +${n} more: ${d}`}}let o=[];for(let[s,i]of t)o.push(`${i} ${v1(s,i)}`);return`\u2026 +${n} (${o.join(", ")})`}function Yl(e,t=Mt()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function sm(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function im(e){if(e.length===0)return[];let t=new Map;for(let o of e){let s=pT(o),i=t.get(s);i||(i=[],t.set(s,i)),i.push(o)}let n=[],r=new Set;for(let o of e){let s=pT(o),i=t.get(s);i.length>=x1(o.toolName)?r.has(s)||(n.push({kind:"group",toolName:o.toolName,label:Le.has(o.toolName)?o.toolInput:"",entries:i}),r.add(s)):n.push(o)}return n}function am(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,s;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),s=l.join(", ")}else o===t?s=`${t} done`:o===0?s=`${t} running`:s=`${o}/${t} done`;return wn(e.toolName+e.label)+m.dim(` \xD7${t} \u2014 ${s}`)}function pT(e){return Le.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function x1(e){return Le.has(e)?aT:lT}function mT(e,t,n,r){return e>0||t?zo([...n,!0],r):zo(n,r)}function fT(e,t){return!Le.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&fT(r,t))}function Xl(e,t,n,r=Z(),o=[],s=Mt()){let i=zo(o,s),a=gi(i,s),l=e.filter(g=>g.kind==="text"),c=e.filter(g=>g.kind==="tool").filter(g=>!fT(g,t)),u=im(c),d=fi(u,mi),p=Yl(d,s);for(let{sibling:g,connector:h}of p){let b=m.dim(h),y=h===s.lastConnector;if(g.kind==="overflow")n.push(Me(a+b+m.dim(g.text),r));else if(g.kind==="group")n.push(Me(a+b+am(g),r));else if(g.kind==="resultSummary")n.push(Me(a+b+m.dim(g.summary),r));else{let w=g,v=t.get(w.toolUseId);if(Le.has(w.toolName)&&v&&v.length>0){if(w.headerEmitted?n.push(Me(a+b,r)):n.push(Me(a+b+w.prefix,r)),Xl(v,t,n,r,[...o,y],s),w.thinkingTail){let R=gi(zo([...o,y],s),s);n.push(Me(R+m.thinking("\u2307 "+Ke(w.thinkingTail)),r))}}else if(!(Le.has(w.toolName)&&w.headerEmitted))if(w.result){if(n.push(Me(a+b+w.prefix+m.dim(" \u2014 ")+Yn(w.result.isError)+" "+kn(w.result,void 0,60,w.toolName),r)),w.diff&&!w.result.isError){let R=a+(y?s.spineClosed:m.dim(s.spine))+" ";for(let S of Sn(w.diff,"overlay",R))n.push(S)}}else{n.push(Me(a+b+w.prefix,r));let R=a+(y?s.spineClosed:m.dim(s.spine))+" ";w.thinkingTail?n.push(Me(R+m.thinking("\u2307 "+Ke(w.thinkingTail)),r)):n.push(Me(R+m.dim(cT(w.toolName)),r))}}}let f=mT(c.length,!1,o,s);for(let g of l)for(let h of lm(g.text,f,s))n.push(Me(h,r))}function hi(e,t,n,r,o=Z(),s=[],i=Mt()){let a=zo(s,i),l=gi(a,i),c=[],u=e.filter(y=>y.kind==="text"),d=e.filter(y=>y.kind==="tool"),p=im(d),f=fi(p,mi),g=sm(f,r),h=Yl(g,i);for(let{sibling:y,connector:w}of h){let v=m.dim(w),R=w===i.lastConnector;if(y.kind==="overflow")c.push(Me(l+v+m.dim(y.text),o));else if(y.kind==="resultSummary")c.push(Me(l+v+m.dim(y.summary),o));else if(y.kind==="group")c.push(Me(l+v+am(y),o));else{let S=y,E=t.get(S.toolUseId);if(Le.has(S.toolName)&&E&&E.length>0){if(S.headerEmitted){let _=S.toolInput?`${S.toolName} ${Ke(S.toolInput)}`:S.toolName;c.push(Me(l+v+m.dim("\u21B3 "+_),o))}else c.push(Me(l+v+S.prefix,o));c.push(...hi(E,t,n,void 0,o,[...s,R],i))}else if(S.result){if(c.push(Me(l+v+S.prefix+m.dim(" \u2014 ")+Yn(S.result.isError)+" "+kn(S.result,n,60,S.toolName),o)),S.diff&&!S.result.isError){let _=l+(R?i.spineClosed:m.dim(i.spine))+" ";for(let C of Sn(S.diff,"flush",_))c.push(C)}}else c.push(Me(l+v+S.prefix,o))}}let b=mT(d.length,r!=null,s,i);for(let y of u)for(let w of lm(y.text,b,i))c.push(Me(w,o));return c}function yi(e,t,n,r,o=[]){let s=Mt(),i=t.filter(h=>h.kind==="tool"),l=i.filter(h=>h.result).reduce((h,b)=>h+(b.result.lineCount??0),0),c=[];i.length>mi&&(c.push(`${i.length} tools`),l>0&&c.push(`${l} lines`));let u=m.dim(s.spine.repeat(o.length)),d=o,p=m.dim(s.turnRoot),f=c.length>0?u+p+e.prefix+m.dim(" \u2014 "+c.join(" \xB7 ")):u+p+e.prefix,g=hi(t,n,r,e.agentResultSummary,Z(),d,s);return[f,...g].join(`
2113
+ `)}function cm(e,t=[]){let n=Mt(),r=m.dim(n.spine.repeat(t.length)),o=m.dim(n.turnRoot);return r+o+e.prefix}function bi(e,t,n,r,o=[]){let s=Mt(),i=o;return hi(t,n,r,e.agentResultSummary,Z(),i,s)}function qo(e,t,n){let r=[];for(let o of t){let s=e.get(o);if(s.length===1){let i=s[0];if(i.result){if(r.push(" "+i.prefix+m.dim(" \u2014 ")+Yn(i.result.isError)+" "+kn(i.result,n,60,i.toolName)),i.diff&&!i.result.isError)for(let a of Sn(i.diff,"flush"," "))r.push(a)}else r.push(" "+i.prefix)}else{r.push(gT(o,s,n));let i=s.filter(l=>l.diff&&l.result&&!l.result.isError),a=i.length>1;for(let l of i){if(a){let c=Ke(pi(l.toolInput).trim()||l.toolInput.trim());r.push(" "+m.dim(`\u2500\u2500 ${c} \u2500\u2500`))}for(let c of Sn(l.diff,"flush"," "))r.push(c)}}}return r}function gT(e,t,n){let{color:r,glyph:o}=Mo(e),s=t.map(u=>Ke(pi(u.toolInput).trim())),i=r(o+" ")+r.bold(e)+m.dim(` \xD7${t.length}`)+" "+m.toolArg(s.join(", ")),a=t.filter(u=>u.result),l=a.filter(u=>u.result.isError);if(l.length>0){let u=a.length-l.length,p=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return p>0&&f.push(`${p} lines`),u>0&&f.push(`${u} ok`),f.push(m.error(`${l.length} error${l.length>1?"s":""}`))," "+i+m.dim(" \u2014 ")+f.join(m.dim(", "))}let c=a.map(u=>u.result?.lineCount).filter(u=>u!==void 0);if(c.length===a.length&&c.length>0){if(c.every(p=>p===c[0]))return" "+i+m.dim(` \u2014 ${c[0]} lines each`);let d=c.reduce((p,f)=>p+f,0);return" "+i+m.dim(` \u2014 ${d} lines total`)}if(a.length>0){let u=a.map(d=>kn(d.result,n,60,d.toolName));return" "+i+m.dim(" \u2014 ")+u.join(m.dim(", "))}return" "+i}function Me(e,t){return se(e,t)}var um=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),E1=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),vue=um.midConnector,Tue=um.lastConnector;function Mt(){let e=T.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?E1:um}function zo(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function gi(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?m.dim(o):o}return n}function lm(e,t,n){if(!e||!e.trim())return[];let r=m.dim(n.textPrefix),o=Math.max(1,Z()-t.length-2-2),s=gi(t,n),i=[];for(let a of e.split(`
2114
2114
  `)){let l=tm(a),c=de(l,o);for(let u of c.split(`
2115
- `))i.push(s+r+u)}return i}var hT=6,wi=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=Ae(r),s=wn(n+o),i=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:o,prefix:s,...i!==void 0?{agentContext:i}:{}};this.entries.set(t,a),this.order.push(t),po.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,s){let i=Ae(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=i,a.prefix=wn(n+i,s),o!==void 0&&(a.agentContext=o);return}let l=wn(n+i,s),c={kind:"tool",toolUseId:t,toolName:n,toolInput:i,prefix:l,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,c),this.order.push(t)}mergeAgentLabel(t,n,r){let o=this.entries.get(t);if(o?.kind!=="tool"||!po.has(o.toolName)||o.toolName==="Agent")return!1;let i=`(${Ae(n)})`;return o.toolName="Agent",o.toolInput=i,o.prefix=wn("Agent"+i,r),!0}setAgentContext(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.agentContext:r.agentContext=n)}setAgentResultSummary(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.agentResultSummary=n)}setThinkingTail(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.thinkingTail:r.thinkingTail=n)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}addDiff(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.diff=n)}upsertTextChild(t,n,r){let o=this.entries.get(t);if(o?.kind==="text"){o.text=r,o.agentContext=n;return}let s={kind:"text",toolUseId:t,text:r,agentContext:n};this.entries.set(t,s),this.order.push(t)}removeTextChildrenUnder(t){let n=[];for(let[r,o]of this.entries)o.kind==="text"&&o.agentContext===t&&n.push(r);for(let r of n)this.entries.delete(r);if(n.length>0){let r=new Set(n);this.order=this.order.filter(o=>!r.has(o))}}hasPending(){return this.entries.size>0}hasEntry(t){return this.entries.get(t)?.kind==="tool"}getOverlay(){let t=this.buildChildMap(),n=[],r=Mt(),o=Z(),s=c=>se(c,o),i=[];for(let c of this.order){let u=this.entries.get(c);!u||u.kind!=="tool"||u.agentContext||i.push(u)}let a=i,l=0;if(i.length>hT){let c=i.filter(f=>!f.result),u=i.filter(f=>f.result),d=Math.max(0,hT-c.length),p=new Set(u.slice(-d));l=u.length-p.size,a=i.filter(f=>!f.result||p.has(f))}for(let c of a){let u=t.get(c.toolUseId);if(He.has(c.toolName)&&u&&u.length>0)c.headerEmitted?n.push(s(m.dim(r.turnRoot))):n.push(s(m.dim(r.turnRoot)+c.prefix)),Xl(u,t,n,o,void 0,r),c.thinkingTail&&n.push(s(m.dim(r.spine)+m.thinking("\u2307 "+Ke(c.thinkingTail))));else if(!(He.has(c.toolName)&&c.headerEmitted))if(He.has(c.toolName))c.result?n.push(s(m.dim(r.turnRoot)+c.prefix+m.dim(" \u2014 ")+Yn(c.result.isError)+" "+kn(c.result,void 0,60,c.toolName))):n.push(s(m.dim(r.turnRoot)+c.prefix+m.dim(" \u2026"))),c.thinkingTail&&n.push(s(m.dim(r.spine)+m.thinking("\u2307 "+Ke(c.thinkingTail))));else if(c.result){if(n.push(s(" "+c.prefix+m.dim(" \u2014 ")+Yn(c.result.isError)+" "+kn(c.result,void 0,60,c.toolName))),c.diff&&!c.result.isError)for(let d of Sn(c.diff,"overlay"," "))n.push(s(d))}else n.push(s(" "+c.prefix+m.dim(" \u2026"))),c.thinkingTail&&n.push(s(m.dim(r.spine)+m.thinking("\u2307 "+Ke(c.thinkingTail))))}return l>0&&n.push(s(" "+m.dim(`\u2026 +${l} done`))),n.join(`
2116
- `)}ancestorDepthOf(t){let n=new Set([t]),r=0,o=t,s=32;for(;o!==void 0&&r<s;){let i=this.entries.get(o);if(!i||i.kind!=="tool")break;let a=i.agentContext;if(a===void 0||n.has(a))break;n.add(a);let l=this.entries.get(a);if(!l||l.kind!=="tool")break;r+=1,o=a}return r}flushSource(t,n){let r=this.entries.get(t);if(!r||r.kind!=="tool")return[];let o=this.ancestorDepthOf(t),s=[];{let p=[],f=new Set([t]),g=r.agentContext;for(;g!==void 0&&!f.has(g);){f.add(g);let h=this.entries.get(g);if(!h||h.kind!=="tool")break;p.push({entry:h,depth:this.ancestorDepthOf(h.toolUseId)}),g=h.agentContext}p.reverse();for(let{entry:h,depth:b}of p)h.headerEmitted||(s.push(cm(h,b)),h.headerEmitted=!0)}let i=new Set([t]),a=[t];for(;a.length>0;){let p=a.shift();for(let[f,g]of this.entries){if(i.has(f))continue;(g.kind==="tool",g.agentContext)===p&&(i.add(f),g.kind==="tool"&&a.push(f))}}let l=new Map;for(let p of this.order){if(!i.has(p))continue;let f=this.entries.get(p);if(!f)continue;let g=(f.kind==="tool",f.agentContext);if(!g)continue;let h=l.get(g);h||(h=[],l.set(g,h)),h.push(f)}let c=l.get(r.toolUseId)??[],u=r.headerEmitted?bi(r,c,l,n,o).join(`
2117
- `):yi(r,c,l,n,o);for(let p of i)this.entries.delete(p);this.order=this.order.filter(p=>!i.has(p));let d=u===""?[]:[u];return[...s,...d]}flushCompletedRoots(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let c of this.order){let u=this.entries.get(c);!u||u.kind!=="tool"||u.agentContext||u.result!==void 0&&r.push(c)}if(r.length===0)return[];let o=[],s=new Map,i=[];for(let c of r){let u=this.entries.get(c);if(!u||u.kind!=="tool")continue;let d=n.get(u.toolUseId);if(He.has(u.toolName))if(o.push(...qo(s,i,t)),s.clear(),i.length=0,u.headerEmitted){let p=bi(u,d??[],n,t,0);o.push(...p)}else o.push(yi(u,d??[],n,t));else s.has(u.toolName)||(s.set(u.toolName,[]),i.push(u.toolName)),s.get(u.toolName).push(u)}o.push(...qo(s,i,t));let a=new Set(r),l=[...r];for(;l.length>0;){let c=l.shift();for(let[u,d]of this.entries){if(a.has(u))continue;(d.kind==="tool",d.agentContext)===c&&(a.add(u),d.kind==="tool"&&l.push(u))}}for(let c of a)this.entries.delete(c);return this.order=this.order.filter(c=>!a.has(c)),o}flush(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let a of this.order){let l=this.entries.get(a);!l||l.kind!=="tool"||l.agentContext||r.push(a)}let o=[],s=new Map,i=[];for(let a of r){let l=this.entries.get(a);if(!l||l.kind!=="tool")continue;let c=n.get(l.toolUseId);if(He.has(l.toolName))if(o.push(...qo(s,i,t)),s.clear(),i.length=0,l.headerEmitted){let u=bi(l,c??[],n,t,0);o.push(...u)}else o.push(yi(l,c??[],n,t));else s.has(l.toolName)||(s.set(l.toolName,[]),i.push(l.toolName)),s.get(l.toolName).push(l)}return o.push(...qo(s,i,t)),this.entries.clear(),this.order=[],this.agentIdStack=[],o}buildChildMap(){let t=new Map;for(let n of this.order){let r=this.entries.get(n);if(!r)continue;let o=(r.kind==="tool",r.agentContext);if(!o)continue;let s=t.get(o);s||(s=[],t.set(o,s)),s.push(r)}return t}};function dm(e,t){let n=Math.max(0,e),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(t/4);return` ${m.thinking("\u25C6 thought for "+r+" \xB7 "+o+" tok")}`}var Jo=class{buffer="";startedAt=null;endedAt=null;hasEmitted=!1;committedUpTo=0;push(t){this.hasEmitted||(this.buffer+=t,this.startedAt||(this.startedAt=Date.now()))}markEnded(){this.endedAt===null&&this.startedAt!==null&&(this.endedAt=Date.now())}isActive(){return!this.hasEmitted}hasBufferedContent(){return this.buffer.trim().length>0}peek(){return this.buffer}consume(){return this.hasEmitted=!0,this.buffer}peekPhase(){return this.buffer.slice(this.committedUpTo)}drainPhase(){let t=this.buffer.slice(this.committedUpTo);return this.committedUpTo=this.buffer.length,t}collapse(){if(this.hasEmitted||!this.startedAt)return!this.startedAt&&!this.hasEmitted&&je()&&console.error("[afk:thinking] collapse() short-circuited: no thinking chunks received this turn. Model may not support extended thinking, or API ignored the thinking parameter."),null;this.hasEmitted=!0;let t=this.endedAt??Date.now();return dm(t-this.startedAt,this.buffer.length)}inlineSummary(){if(!this.startedAt||!this.hasBufferedContent())return null;let t=this.endedAt??Date.now(),n=Math.max(0,t-this.startedAt),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(this.buffer.length/4);return`thought ${r} \xB7 ${o} tok`}};var pm="__main__";function bT(e){let t={startedAt:Date.now(),lastEventAt:Date.now(),stats:{tokens:0,toolUses:0},contentBuffer:"",done:!1,errored:!1,stalledTicks:0};return e!==void 0&&(t.agentType=e),t}function Vo(e,t){return{type:"tool_result",toolUseId:"synthetic",content:e,isError:t}}function wT(e){let t=["Done"],n=[];e.stats.toolUses&&n.push(`${e.stats.toolUses} tool${e.stats.toolUses===1?"":"s"}`),e.stats.tokens&&n.push(`${re(e.stats.tokens)} tok`);let r=e.responseMetadata?.durationMs,o=Date.now()-e.startedAt;typeof r=="number"&&(n.push(ne(r)),o>r*1.5&&o-r>=1e3&&n.push(`${ne(o)} wall`)),n.length===0&&o>0&&n.push(ne(o));let s=e.thinkingLane?.inlineSummary();return s&&n.push(s),n.length>0&&t.push(`(${n.join(" \xB7 ")})`),t.join(" ")}function mm(e){let t=Math.max(1,Z()-2);return Math.max(1,t-e)}function ST(e,t){return R1(e)?Rt(e,{maxWidth:t}):de(e,t)}function kT(e,t,n){if(!n||!e.trim())return"";let r;return TT(e)?r=`
2115
+ `))i.push(s+r+u)}return i}var hT=6,wi=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=Ae(r),s=wn(n+o),i=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:o,prefix:s,...i!==void 0?{agentContext:i}:{}};this.entries.set(t,a),this.order.push(t),po.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,s){let i=Ae(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=i,a.prefix=wn(n+i,s),o!==void 0&&(a.agentContext=o);return}let l=wn(n+i,s),c={kind:"tool",toolUseId:t,toolName:n,toolInput:i,prefix:l,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,c),this.order.push(t)}mergeAgentLabel(t,n,r){let o=this.entries.get(t);if(o?.kind!=="tool"||!po.has(o.toolName)||o.toolName==="Agent")return!1;let i=`(${Ae(n)})`;return o.toolName="Agent",o.toolInput=i,o.prefix=wn("Agent"+i,r),!0}setAgentContext(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.agentContext:r.agentContext=n)}setAgentResultSummary(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.agentResultSummary=n)}setThinkingTail(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.thinkingTail:r.thinkingTail=n)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}addDiff(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.diff=n)}upsertTextChild(t,n,r){let o=this.entries.get(t);if(o?.kind==="text"){o.text=r,o.agentContext=n;return}let s={kind:"text",toolUseId:t,text:r,agentContext:n};this.entries.set(t,s),this.order.push(t)}removeTextChildrenUnder(t){let n=[];for(let[r,o]of this.entries)o.kind==="text"&&o.agentContext===t&&n.push(r);for(let r of n)this.entries.delete(r);if(n.length>0){let r=new Set(n);this.order=this.order.filter(o=>!r.has(o))}}hasPending(){return this.entries.size>0}hasEntry(t){return this.entries.get(t)?.kind==="tool"}getOverlay(){let t=this.buildChildMap(),n=[],r=Mt(),o=Z(),s=c=>se(c,o),i=[];for(let c of this.order){let u=this.entries.get(c);!u||u.kind!=="tool"||u.agentContext||i.push(u)}let a=i,l=0;if(i.length>hT){let c=i.filter(f=>!f.result),u=i.filter(f=>f.result),d=Math.max(0,hT-c.length),p=new Set(u.slice(-d));l=u.length-p.size,a=i.filter(f=>!f.result||p.has(f))}for(let c of a){let u=t.get(c.toolUseId);if(Le.has(c.toolName)&&u&&u.length>0)c.headerEmitted?n.push(s(m.dim(r.turnRoot))):n.push(s(m.dim(r.turnRoot)+c.prefix)),Xl(u,t,n,o,void 0,r),c.thinkingTail&&n.push(s(m.dim(r.spine)+m.thinking("\u2307 "+Ke(c.thinkingTail))));else if(!(Le.has(c.toolName)&&c.headerEmitted))if(Le.has(c.toolName))c.result?n.push(s(m.dim(r.turnRoot)+c.prefix+m.dim(" \u2014 ")+Yn(c.result.isError)+" "+kn(c.result,void 0,60,c.toolName))):n.push(s(m.dim(r.turnRoot)+c.prefix+m.dim(" \u2026"))),c.thinkingTail&&n.push(s(m.dim(r.spine)+m.thinking("\u2307 "+Ke(c.thinkingTail))));else if(c.result){if(n.push(s(" "+c.prefix+m.dim(" \u2014 ")+Yn(c.result.isError)+" "+kn(c.result,void 0,60,c.toolName))),c.diff&&!c.result.isError)for(let d of Sn(c.diff,"overlay"," "))n.push(s(d))}else n.push(s(" "+c.prefix+m.dim(" \u2026"))),c.thinkingTail&&n.push(s(m.dim(r.spine)+m.thinking("\u2307 "+Ke(c.thinkingTail))))}return l>0&&n.push(s(" "+m.dim(`\u2026 +${l} done`))),n.join(`
2116
+ `)}ancestorDepthOf(t){let n=new Set([t]),r=0,o=t,s=32;for(;o!==void 0&&r<s;){let i=this.entries.get(o);if(!i||i.kind!=="tool")break;let a=i.agentContext;if(a===void 0||n.has(a))break;n.add(a);let l=this.entries.get(a);if(!l||l.kind!=="tool")break;r+=1,o=a}return r}flushSource(t,n){let r=this.entries.get(t);if(!r||r.kind!=="tool")return[];let o=Array.from({length:this.ancestorDepthOf(t)},()=>!1),s=[];{let p=[],f=new Set([t]),g=r.agentContext;for(;g!==void 0&&!f.has(g);){f.add(g);let h=this.entries.get(g);if(!h||h.kind!=="tool")break;p.push({entry:h,depth:this.ancestorDepthOf(h.toolUseId)}),g=h.agentContext}p.reverse();for(let{entry:h,depth:b}of p)h.headerEmitted||(s.push(cm(h,Array.from({length:b},()=>!1))),h.headerEmitted=!0)}let i=new Set([t]),a=[t];for(;a.length>0;){let p=a.shift();for(let[f,g]of this.entries){if(i.has(f))continue;(g.kind==="tool",g.agentContext)===p&&(i.add(f),g.kind==="tool"&&a.push(f))}}let l=new Map;for(let p of this.order){if(!i.has(p))continue;let f=this.entries.get(p);if(!f)continue;let g=(f.kind==="tool",f.agentContext);if(!g)continue;let h=l.get(g);h||(h=[],l.set(g,h)),h.push(f)}let c=l.get(r.toolUseId)??[],u=r.headerEmitted?bi(r,c,l,n,o).join(`
2117
+ `):yi(r,c,l,n,o);for(let p of i)this.entries.delete(p);this.order=this.order.filter(p=>!i.has(p));let d=u===""?[]:[u];return[...s,...d]}flushCompletedRoots(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let c of this.order){let u=this.entries.get(c);!u||u.kind!=="tool"||u.agentContext||u.result!==void 0&&r.push(c)}if(r.length===0)return[];let o=[],s=new Map,i=[];for(let c of r){let u=this.entries.get(c);if(!u||u.kind!=="tool")continue;let d=n.get(u.toolUseId);if(Le.has(u.toolName))if(o.push(...qo(s,i,t)),s.clear(),i.length=0,u.headerEmitted){let p=bi(u,d??[],n,t,[]);o.push(...p)}else o.push(yi(u,d??[],n,t));else s.has(u.toolName)||(s.set(u.toolName,[]),i.push(u.toolName)),s.get(u.toolName).push(u)}o.push(...qo(s,i,t));let a=new Set(r),l=[...r];for(;l.length>0;){let c=l.shift();for(let[u,d]of this.entries){if(a.has(u))continue;(d.kind==="tool",d.agentContext)===c&&(a.add(u),d.kind==="tool"&&l.push(u))}}for(let c of a)this.entries.delete(c);return this.order=this.order.filter(c=>!a.has(c)),o}flush(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let a of this.order){let l=this.entries.get(a);!l||l.kind!=="tool"||l.agentContext||r.push(a)}let o=[],s=new Map,i=[];for(let a of r){let l=this.entries.get(a);if(!l||l.kind!=="tool")continue;let c=n.get(l.toolUseId);if(Le.has(l.toolName))if(o.push(...qo(s,i,t)),s.clear(),i.length=0,l.headerEmitted){let u=bi(l,c??[],n,t,[]);o.push(...u)}else o.push(yi(l,c??[],n,t));else s.has(l.toolName)||(s.set(l.toolName,[]),i.push(l.toolName)),s.get(l.toolName).push(l)}return o.push(...qo(s,i,t)),this.entries.clear(),this.order=[],this.agentIdStack=[],o}buildChildMap(){let t=new Map;for(let n of this.order){let r=this.entries.get(n);if(!r)continue;let o=(r.kind==="tool",r.agentContext);if(!o)continue;let s=t.get(o);s||(s=[],t.set(o,s)),s.push(r)}return t}};function dm(e,t){let n=Math.max(0,e),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(t/4);return` ${m.thinking("\u25C6 thought for "+r+" \xB7 "+o+" tok")}`}var Jo=class{buffer="";startedAt=null;endedAt=null;hasEmitted=!1;committedUpTo=0;push(t){this.hasEmitted||(this.buffer+=t,this.startedAt||(this.startedAt=Date.now()))}markEnded(){this.endedAt===null&&this.startedAt!==null&&(this.endedAt=Date.now())}isActive(){return!this.hasEmitted}hasBufferedContent(){return this.buffer.trim().length>0}peek(){return this.buffer}consume(){return this.hasEmitted=!0,this.buffer}peekPhase(){return this.buffer.slice(this.committedUpTo)}drainPhase(){let t=this.buffer.slice(this.committedUpTo);return this.committedUpTo=this.buffer.length,t}collapse(){if(this.hasEmitted||!this.startedAt)return!this.startedAt&&!this.hasEmitted&&We()&&console.error("[afk:thinking] collapse() short-circuited: no thinking chunks received this turn. Model may not support extended thinking, or API ignored the thinking parameter."),null;this.hasEmitted=!0;let t=this.endedAt??Date.now();return dm(t-this.startedAt,this.buffer.length)}inlineSummary(){if(!this.startedAt||!this.hasBufferedContent())return null;let t=this.endedAt??Date.now(),n=Math.max(0,t-this.startedAt),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(this.buffer.length/4);return`thought ${r} \xB7 ${o} tok`}};var pm="__main__";function bT(e){let t={startedAt:Date.now(),lastEventAt:Date.now(),stats:{tokens:0,toolUses:0},contentBuffer:"",done:!1,errored:!1,stalledTicks:0};return e!==void 0&&(t.agentType=e),t}function Vo(e,t){return{type:"tool_result",toolUseId:"synthetic",content:e,isError:t}}function wT(e){let t=["Done"],n=[];e.stats.toolUses&&n.push(`${e.stats.toolUses} tool${e.stats.toolUses===1?"":"s"}`),e.stats.tokens&&n.push(`${re(e.stats.tokens)} tok`);let r=e.responseMetadata?.durationMs,o=Date.now()-e.startedAt;typeof r=="number"&&(n.push(ne(r)),o>r*1.5&&o-r>=1e3&&n.push(`${ne(o)} wall`)),n.length===0&&o>0&&n.push(ne(o));let s=e.thinkingLane?.inlineSummary();return s&&n.push(s),n.length>0&&t.push(`(${n.join(" \xB7 ")})`),t.join(" ")}function mm(e){let t=Math.max(1,Z()-2);return Math.max(1,t-e)}function ST(e,t){return R1(e)?Rt(e,{maxWidth:t}):de(e,t)}function kT(e,t,n){if(!n||!e.trim())return"";let r;return TT(e)?r=`
2118
2118
  \u258D streaming code\u2026
2119
2119
  `:r=ST(e,t),de(r,t)}function fm(e,t){return e.split(`
2120
2120
  `).map(n=>n?t+n:"").join(`
@@ -2139,8 +2139,8 @@ ${u}`}function Wp(e,t){let n=nv[t.status];e.out.line(` ${n} ${m.bold(t.jobId)}
2139
2139
  `))r.isTTY&&r.compositor?r.compositor.commitAbove(s):r.out.line(s);r.isTTY&&r.compositor?r.compositor.commitAbove(""):r.out.line("")}function km(e,t,n,r){if(t.syntheticAgentToolUseId)return;let o=t.agentType?.trim()||"agent",s=process.stdout.columns??100,i=Math.max(20,s-14);if(r!==void 0&&n.toolLane.mergeAgentLabel(r,o,i)){t.syntheticAgentToolUseId=r;return}let a=`__synth_agent_${e}`;n.toolLane.addStartWithAgentContext(a,"Agent",`(${o})`,r,i),t.syntheticAgentToolUseId=a}function OT(e,t,n,r,o){let s=t.syntheticAgentToolUseId;if(!s||t.errored)return;if(!n.isTTY&&t.contentBuffer&&oc(t.contentBuffer,n),t.contentBuffer="",!n.isTTY&&t.thinkingLane?.hasBufferedContent()){let a=t.thinkingLane.collapse();a&&(n.out.line(a),n.out.line(""))}n.toolLane.setThinkingTail(s,void 0),r.delete(s),o.delete(s);let i=wT(t);n.toolLane.setAgentResultSummary(s,i),n.toolLane.addResult(s,Vo(i,!1)),n.isTTY&&n.compositor&&n.compositor.setOverlay(n.toolLane.getOverlay())}var sc=new Map,Xo=new Map;function $T(e,t,n,r){let o=n.syntheticAgentToolUseId;if(o)switch(e.type){case"progress":e.progress.totalTokens&&(n.stats.tokens=e.progress.totalTokens),e.progress.toolUses!==void 0&&(n.stats.progressReportedToolUses=e.progress.toolUses);return;case"chunk":{let s=e.chunk;if(s.type==="tool_use_detail"){n.thinkingLane?.markEnded(),n.currentTextEntryId=void 0;let i=r.streamingMarkdown.get(t);i&&i.commitPending(),r.toolLane.setThinkingTail(o,void 0);let a=process.stdout.columns??100,l=Math.max(20,a-14);r.toolLane.addStartWithAgentContext(s.toolUseId,s.toolName,s.toolInput,o,l),n.stats.toolUses+=1,r.isTTY&&(r.overlayComposer?(r.overlayComposer.markDirty("tool-lane"),r.overlayComposer.flush()):r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay()))}else if(s.type==="tool_result"){let i=r.streamingMarkdown.get(t);i&&i.commitPending(),r.toolLane.addResult(s.toolUseId,s),r.isTTY&&(r.overlayComposer?(r.overlayComposer.markDirty("tool-lane"),r.overlayComposer.flush()):r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay()))}else if(s.type==="tool_diff")r.toolLane.addDiff(s.toolUseId,s.diff),r.isTTY&&(r.overlayComposer?(r.overlayComposer.markDirty("tool-lane"),r.overlayComposer.flush()):r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay()));else if(s.type==="content")if(n.thinkingLane?.markEnded(),n.currentTextEntryId||(n.currentTextEntryId="__in_text_block__"),n.contentBuffer+=s.content,r.isTTY&&r.compositor){if(s.content.trim()){let i=process.stdout.columns??100,a=Math.max(20,i-14),l=Sm(n.contentBuffer,a),c=Date.now(),u=sc.get(o)??0,d=l?/[.!?…]$/.test(l):!1;l&&(c-u>=1500||d)&&(sc.set(o,c),r.toolLane.setThinkingTail(o,l))}{let i=Date.now(),a=Xo.get(o)??0;i-a>=1500&&(Xo.set(o,i),r.compositor.setOverlay(r.toolLane.getOverlay()))}}else{let i=n.contentBuffer.lastIndexOf(`
2140
2140
  `);if(i!==-1){let a=n.contentBuffer.slice(0,i);n.contentBuffer=n.contentBuffer.slice(i+1),oc(a,r)}}else if(s.type==="thinking"){if(r.thinkingMode==="off")return;if(n.thinkingLane||(n.thinkingLane=new Jo),n.thinkingLane.push(s.content),r.thinkingMode==="live"&&r.isTTY&&r.compositor){let i=process.stdout.columns??100,a=Math.max(20,i-14),l=Sm(n.thinkingLane.peek(),a);l&&r.toolLane.setThinkingTail(o,l);{let c=Date.now(),u=Xo.get(o)??0;c-u>=1500&&(Xo.set(o,c),r.compositor.setOverlay(r.toolLane.getOverlay()))}}}return}case"message":return;case"error":n.errored=!0,r.toolLane.setThinkingTail(o,void 0),sc.delete(o),Xo.delete(o);{let s=`error \u2014 ${e.error.message}`;r.toolLane.setAgentResultSummary(o,s),r.toolLane.addResult(o,Vo(s,!0))}r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay());return;case"done":n.done=!0,e.metadata&&(n.responseMetadata=e.metadata),OT(t,n,r,sc,Xo);return;case"suggestion":return;case"panel":MT(e.spec,t,n,r);return}}var ic=class{sink;order;slots=new Map;dirty=!1;constructor(t,n){this.sink=t,this.order=[...n]}register(t){this.slots.set(t.key,t),this.dirty=!0}markDirty(t){this.slots.has(t)&&(this.dirty=!0)}flush(){if(!this.dirty)return;this.dirty=!1;let t=[];for(let n of this.order){let r=this.slots.get(n);if(r===void 0)continue;let o=r.render();o.length>0&&t.push(o)}this.sink.setOverlay(t.join(`
2141
2141
  `))}invalidate(){this.dirty=!0}};function DT(e,t=2){if(t<1||!Number.isInteger(t))throw new RangeError(`makeDedupingLineWriter: maxRepeat must be a positive integer, got ${t}`);let n=null,r=0,o=()=>{if(n!==null&&r>t){let s=r-t;e.line(` \u2026 (line repeated ${s} more time${s===1?"":"s"})`)}};return{line(s){let i=s??"";i===n?(r++,r<=t&&e.line(i)):(o(),n=i,r=1,e.line(i))},raw(s){o(),n=null,r=0,e.raw(s)},success(s){o(),n=null,r=0,e.success(s)},info(s){o(),n=null,r=0,e.info(s)},warn(s){o(),n=null,r=0,e.warn(s)},error(s){o(),n=null,r=0,e.error(s)},flush(){o(),n=null,r=0}}}var D1=3e4,L1=" \xB7 waiting ",F1=375;function LT(e,t){e.register({key:"thinking-live",render:()=>t.thinkingMode!=="live"||!t.thinkingLane.isActive()||!t.thinkingLane.hasBufferedContent()?"":tc(t.thinkingLane.peekPhase(),{cols:Z()})??""}),e.register({key:"markdown-pending",render:()=>{let n=t.streamingMarkdownRef.current;return n?n.renderPending():""}}),e.register({key:"tool-lane",render:()=>t.toolLane.hasPending()?t.toolLane.getOverlay():""}),e.register({key:"progress-banner",render:()=>{let n=[];for(let r of t.lastProgressByTask.values())n.push(...ul(r));return n.length>0?n.join(`
2142
- `):""}}),e.register({key:"interrupt",render:()=>N1(t.getInterrupting())})}function N1(e){return e?" "+m.warning("\u26A0 interrupting\u2026 (Ctrl+C again to exit)"):""}function FT(e,t){return $e.subscribe(()=>{t||!e||(e.invalidate(),e.flush())})}function NT(e){if(e.disposed)return!1;let t=!1,n=Date.now();for(let[r,o]of e.sources){if(o.done||o.errored||!o.syntheticAgentToolUseId)continue;let s=n-o.lastEventAt;if(s>D1)if(o.stalledTicks+=1,o.stalledTicks>=F1*2)je()&&process.stderr.write(`[stream-renderer] auto_settle_timeout ${JSON.stringify({sourceId:r,elapsedMs:s,syntheticAgentToolUseId:o.syntheticAgentToolUseId})}
2143
- `),e.toolLane.addResult(o.syntheticAgentToolUseId,Vo("[no-result \u2014 timed out]",!1)),o.done=!0,t=!0;else{let i=o.agentType??r,a=L1+ne(s);o.pauseAnnotation!==a&&(o.pauseAnnotation=a,e.toolLane.addStartWithAgentContext(o.syntheticAgentToolUseId,"Agent",`(${i})${a}`,void 0),t=!0)}}return t&&e.isTTY&&e.overlayComposer&&(e.overlayComposer.markDirty("tool-lane"),e.overlayComposer.flush()),t}function vm(e){return{out:e.out,isTTY:e.isTTY,compositor:e.compositor,overlayComposer:e.overlayComposer,toolLane:e.toolLane,thinkingLane:e.thinkingLane,thinkingMode:e.thinkingMode,streamingMarkdown:e.streamingMarkdown,coordinator:e.coordinator,...e.isTTY&&e.stageTracker?{stageTracker:e.stageTracker}:{},...e.activeSkillName?{activeSkillName:e.activeSkillName}:{}}}function Tm(e){return{isTTY:e.isTTY,compositor:e.compositor,overlayComposer:e.overlayComposer,toolLane:e.toolLane,out:e.out,streamingMarkdown:e.streamingMarkdown,thinkingMode:e.thinkingMode}}function BT(e){if(e.parentId===void 0)return;let t=e.sources.get(e.parentId);if(t!==void 0)return t.syntheticAgentToolUseId;if(e.toolLane.hasEntry(e.parentId))return e.parentId;je()&&process.stderr.write(`[stream-renderer] parentId_fallback_unresolved ${JSON.stringify({parentId:e.parentId,sourceId:e.sourceId})}
2142
+ `):""}}),e.register({key:"interrupt",render:()=>N1(t.getInterrupting())})}function N1(e){return e?" "+m.warning("\u26A0 interrupting\u2026 (Ctrl+C again to exit)"):""}function FT(e,t){return $e.subscribe(()=>{t||!e||(e.invalidate(),e.flush())})}function NT(e){if(e.disposed)return!1;let t=!1,n=Date.now();for(let[r,o]of e.sources){if(o.done||o.errored||!o.syntheticAgentToolUseId)continue;let s=n-o.lastEventAt;if(s>D1)if(o.stalledTicks+=1,o.stalledTicks>=F1*2)We()&&process.stderr.write(`[stream-renderer] auto_settle_timeout ${JSON.stringify({sourceId:r,elapsedMs:s,syntheticAgentToolUseId:o.syntheticAgentToolUseId})}
2143
+ `),e.toolLane.addResult(o.syntheticAgentToolUseId,Vo("[no-result \u2014 timed out]",!1)),o.done=!0,t=!0;else{let i=o.agentType??r,a=L1+ne(s);o.pauseAnnotation!==a&&(o.pauseAnnotation=a,e.toolLane.addStartWithAgentContext(o.syntheticAgentToolUseId,"Agent",`(${i})${a}`,void 0),t=!0)}}return t&&e.isTTY&&e.overlayComposer&&(e.overlayComposer.markDirty("tool-lane"),e.overlayComposer.flush()),t}function vm(e){return{out:e.out,isTTY:e.isTTY,compositor:e.compositor,overlayComposer:e.overlayComposer,toolLane:e.toolLane,thinkingLane:e.thinkingLane,thinkingMode:e.thinkingMode,streamingMarkdown:e.streamingMarkdown,coordinator:e.coordinator,...e.isTTY&&e.stageTracker?{stageTracker:e.stageTracker}:{},...e.activeSkillName?{activeSkillName:e.activeSkillName}:{}}}function Tm(e){return{isTTY:e.isTTY,compositor:e.compositor,overlayComposer:e.overlayComposer,toolLane:e.toolLane,out:e.out,streamingMarkdown:e.streamingMarkdown,thinkingMode:e.thinkingMode}}function BT(e){if(e.parentId===void 0)return;let t=e.sources.get(e.parentId);if(t!==void 0)return t.syntheticAgentToolUseId;if(e.toolLane.hasEntry(e.parentId))return e.parentId;We()&&process.stderr.write(`[stream-renderer] parentId_fallback_unresolved ${JSON.stringify({parentId:e.parentId,sourceId:e.sourceId})}
2144
2144
  `)}var Zo=class{out;thinkingMode;isTTY;captureMode;reducedMotion;onCancel;onBackground;activeSkillName;history;autocompleteState;promptText;scrollRegion;onStageChange;ownsCompositor=!0;borrowedCompositor=null;priorOnCancel=void 0;interrupting=!1;coordinator=new rc;compositor=null;overlayComposer=null;streamingMarkdownRef={current:null};toolLane=new wi;thinkingLane=new Jo;stageTracker=_T();sources=new Map;subagentMarkdown=new Map;lastProgressByTask=new Map;disposed=!1;pauseTickInterval=null;resizeUnsub=null;sink;constructor(t){this.captureMode=t.captureMode??ak(),this.reducedMotion=t.reducedMotion??lk(),this.out=this.captureMode?DT(t.out,2):t.out;let n=t.thinkingMode??(t.verbose===!0?"live":"summary");this.thinkingMode=this.captureMode&&n==="live"?"summary":n,this.onCancel=t.onCancel,this.onBackground=t.onBackground,this.isTTY=!(t.forceNonTty??!1)&&!!process.stdout.isTTY&&!!process.stdin.isTTY,this.activeSkillName=t.activeSkillName,this.history=t.history,this.autocompleteState=t.autocompleteState,this.promptText=t.promptText,this.scrollRegion=t.scrollRegion,this.onStageChange=t.onStageChange,t.compositor&&(this.borrowedCompositor=t.compositor,this.ownsCompositor=!1),this.sink=(r,o)=>this.process(r,o)}async arm(){if(this.disposed||!this.isTTY||this.compositor)return;let t;if(this.borrowedCompositor)t=this.borrowedCompositor,t.setInputMode("streaming"),this.priorOnCancel=t.getOnCancel(),this.onCancel&&t.setOnCancel(this.onCancel);else{let n={has:r=>et().some(o=>o.name===`/${r}`)};t=new Go({stdout:process.stdout,stdin:process.stdin,...this.onCancel?{onCancel:this.onCancel}:{},...this.onBackground?{onBackground:this.onBackground}:{},...this.history?{history:this.history}:{},...this.autocompleteState?{autocompleteState:this.autocompleteState}:{},...this.promptText!==void 0?{promptText:this.promptText}:{},formatInputBuffer:r=>Vn(r,n),...this.scrollRegion?{scrollRegion:this.scrollRegion}:{},captureMode:this.captureMode}),await t.arm()}this.compositor=t,this.overlayComposer=new ic(t,["thinking-live","markdown-pending","tool-lane","progress-banner","interrupt"]),LT(this.overlayComposer,{stageTracker:this.stageTracker,thinkingMode:this.thinkingMode,thinkingLane:this.thinkingLane,streamingMarkdownRef:this.streamingMarkdownRef,toolLane:this.toolLane,lastProgressByTask:this.lastProgressByTask,getInterrupting:()=>this.interrupting}),t.setSpinner({enabled:!this.reducedMotion,rotateVerbEveryMs:3500}),this.pauseTickInterval=setInterval(()=>this.checkPauseAnnotations(),80),this.resizeUnsub=FT(this.overlayComposer,!1)}getCompositor(){return this.compositor}setInterrupting(t){this.disposed||(this.interrupting=t,this.overlayComposer&&(this.overlayComposer.markDirty("interrupt"),this.overlayComposer.flush()))}process(t,n){if(this.disposed)return;let r=n?.subagentId??pm,o=r===pm,s=this.sources.get(r);if(!s&&(s=bT(n?.agentType),this.sources.set(r,s),!o)){let i=BT({parentId:n?.parentId,sources:this.sources,toolLane:this.toolLane,sourceId:r});km(r,s,Tm({isTTY:this.isTTY,compositor:this.compositor,overlayComposer:this.overlayComposer,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown,thinkingMode:this.thinkingMode}),i)}if(o){let i=this.stageTracker.stage;if(PT(t,s,vm({out:this.out,isTTY:this.isTTY,compositor:this.compositor,overlayComposer:this.overlayComposer,toolLane:this.toolLane,thinkingLane:this.thinkingLane,thinkingMode:this.thinkingMode,streamingMarkdown:this.streamingMarkdownRef,coordinator:this.coordinator,...this.isTTY?{stageTracker:this.stageTracker}:{},...this.activeSkillName?{activeSkillName:this.activeSkillName}:{}}),this.lastProgressByTask),this.onStageChange&&this.stageTracker.stage!==i)try{this.onStageChange(this.stageTracker.stage)}catch{}}else{if($T(t,r,s,Tm({isTTY:this.isTTY,compositor:this.compositor,overlayComposer:this.overlayComposer,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown,thinkingMode:this.thinkingMode})),s.lastEventAt=Date.now(),s.pauseAnnotation!==void 0&&s.syntheticAgentToolUseId){s.pauseAnnotation=void 0,s.stalledTicks=0;let a=s.agentType??r;this.toolLane.addStartWithAgentContext(s.syntheticAgentToolUseId,"Agent",`(${a})`,void 0)}if((t.type==="done"||t.type==="error")&&this.isTTY){let a=s.syntheticAgentToolUseId;if(a&&this.toolLane.hasEntry(a)){let c=this.toolLane.flushSource(a),u=this.compositor,d=this.overlayComposer,p=this.toolLane,f=this.out;this.coordinator.schedule({anchor:`after-subagent:${r}`,commits:[()=>{if(u){for(let g of c)u.commitAbove(g);u.commitAbove(""),d?(d.markDirty("tool-lane"),d.flush()):u.setOverlay(p.getOverlay())}else{for(let g of c)f.line(g);f.line("")}}]});try{this.streamingMarkdownRef.current&&this.streamingMarkdownRef.current.commitPending()}finally{this.coordinator.drainSubagent(r)}}let l=vm({out:this.out,isTTY:this.isTTY,compositor:this.compositor,overlayComposer:this.overlayComposer,toolLane:this.toolLane,thinkingLane:this.thinkingLane,thinkingMode:this.thinkingMode,streamingMarkdown:this.streamingMarkdownRef,coordinator:this.coordinator,...this.isTTY?{stageTracker:this.stageTracker}:{},...this.activeSkillName?{activeSkillName:this.activeSkillName}:{}});Pr(l,this.lastProgressByTask)}}}async dispose(){if(this.disposed)return;this.disposed=!0,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null);let t=this.streamingMarkdownRef.current?()=>this.streamingMarkdownRef.current.flush():void 0;await this.coordinator.flushAll(t),this.streamingMarkdownRef.current&&(this.streamingMarkdownRef.current.dispose(),this.streamingMarkdownRef.current=null);for(let r of this.subagentMarkdown.values()){try{await r.flush()}catch{}r.dispose()}if(this.subagentMarkdown.clear(),this.toolLane.hasPending()){let r=this.toolLane.flush();if(this.isTTY&&this.compositor){for(let o of r)this.compositor.commitAbove(o);this.compositor.commitAbove(""),this.overlayComposer?(this.overlayComposer.markDirty("tool-lane"),this.overlayComposer.flush()):this.compositor.setOverlay(this.toolLane.getOverlay())}else{for(let o of r)this.out.line(o);this.out.line("")}}if(this.pauseTickInterval&&(clearInterval(this.pauseTickInterval),this.pauseTickInterval=null),this.compositor){if(this.ownsCompositor)try{this.compositor.disarm()}catch{}else{try{this.compositor.setSpinner({enabled:!1})}catch(r){V("[stream-renderer] borrow-dispose setSpinner: "+String(r))}try{this.overlayComposer?(this.overlayComposer.invalidate(),this.overlayComposer.flush()):this.compositor.setOverlay("")}catch(r){V("[stream-renderer] borrow-dispose setOverlay: "+String(r))}try{this.compositor.setInputMode("idle")}catch(r){V("[stream-renderer] borrow-dispose setInputMode: "+String(r))}try{this.compositor.setOnCancel(this.priorOnCancel??null)}catch(r){V("[stream-renderer] borrow-dispose setOnCancel: "+String(r))}this.priorOnCancel=void 0}this.compositor=null,this.borrowedCompositor=null}let n=this.out;if(typeof n.flush=="function")try{n.flush()}catch{}}checkPauseAnnotations(){NT({compositor:this.compositor,disposed:this.disposed,sources:this.sources,toolLane:this.toolLane,isTTY:this.isTTY,overlayComposer:this.overlayComposer,stageTracker:this.stageTracker,thinkingMode:this.thinkingMode,thinkingLane:this.thinkingLane,streamingMarkdownRef:this.streamingMarkdownRef,lastProgressByTask:this.lastProgressByTask,out:this.out,pauseTickInterval:this.pauseTickInterval,resizeUnsub:this.resizeUnsub})}};function ac(e,t){let n=t.verbose??T.AFK_SKILL_STREAM_VERBOSE==="1",r=t.out??e.out,o=e.getCompositor?.()??null;return new Zo({out:r,verbose:n,activeSkillName:t.skillName,onCancel:t.onCancel??(()=>{}),...o?{compositor:o}:{}})}function Qo(e){let t=e!==void 0?r=>{e.fn(r)}:r=>{console.log(r)},n=e!==void 0&&e.rawFn!==void 0?r=>{e.rawFn(r)}:r=>{process.stdout.write(r)};return{line(r=""){t(r)},raw(r){n(r)},success(r){t(m.success("\u2713 ")+r)},info(r){t(m.info("\u2139 ")+r)},warn(r){t(m.warning("\u26A0 ")+r)},error(r){t(m.error("\u2717 ")+r)}}}var B1="You are initializing this project for use with AFK (an AI agent CLI).\n\nYour job: scan this project and generate an `AFK.md` file in the project root. AFK.md is a plain markdown file (no YAML frontmatter) that serves as the system prompt for all AFK sessions in this project.\n\n## Steps\n\n1. **Discover project metadata** \u2014 read these files if they exist:\n - `package.json`, `tsconfig.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Makefile`, `CMakeLists.txt`\n - `.github/workflows/` (CI config)\n - `docker-compose.yml`, `Dockerfile`\n - `README.md` or `README`\n - Any existing `CLAUDE.md` or `AGENTS.md` (borrow relevant context)\n\n2. **Scan directory structure** \u2014 list top-level directories and key subdirectories to understand the project layout.\n\n3. **Generate AFK.md** with these sections:\n - **What This Is** \u2014 one-paragraph description of the project (language, framework, purpose)\n - **Commands** \u2014 build, test, lint, dev commands (extracted from package.json scripts, Makefile targets, etc.)\n - **Architecture** \u2014 key directories and their purpose, entry points, major subsystems\n - **Conventions** \u2014 coding style, naming patterns, anything notable from config files (strictness levels, linting rules)\n - Only include sections where you found real content. Skip empty sections.\n\n4. **Write the file** \u2014 write AFK.md to the project root. Keep it concise \u2014 under 150 lines. This file is loaded into every session, so brevity matters.\n\n## Format rules\n- Plain markdown, no YAML frontmatter\n- Use code blocks for commands\n- Use tables for directory layouts\n- Don't include boilerplate or filler \u2014 every line should earn its place",WT={name:"/init",summary:"Scan project and generate AFK.md",hint:"When you're in a fresh repo and want the model to bootstrap an AFK.md system prompt that captures conventions, commands, and architecture.",async handler(e,t){let n=jT(process.cwd(),"AFK.md"),r=jT(process.cwd(),"CLAUDE.md"),o=[];o.push({type:"text",text:Ul("init",t)});let s=B1;if(UT(n)&&!t.includes("--force")&&(s+=`
2145
2145
 
2146
2146
  ## Existing AFK.md detected
@@ -2153,10 +2153,10 @@ A CLAUDE.md exists at \`${r}\`. Read it and incorporate relevant context (comman
2153
2153
  ${a}`)}o.push({type:"text",text:s});let i=ac(e,{skillName:"init",out:Qo(),onCancel:()=>{e.session.current.interrupt().catch(()=>{})}});try{await i.arm(),await oo(i.sink,async()=>{for await(let a of e.session.current.sendMessageStream(o))i.sink(a)})}catch(a){e.out.line(),e.out.error(`init failed: ${a instanceof Error?a.message:String(a)}`)}finally{await i.dispose()}return"continue"}};import HT from"chalk";var xm=new Map;function KT(e,t){let n=xm.get(e);if(n){if(n.glyph===t.glyph&&n.color===t.color&&n.inFlightVerb===t.inFlightVerb)return;throw new Error(`Trusted skill "${e}" already registered with different config`)}xm.set(e,t),ub(e)}function lc(e){return xm.get(e)}function U1(e){return(e/1e3).toFixed(1)+"s"}function GT(e,t){let n=lc(e.skillName),r=U1(e.durationMs);if(!n){let s=`[${e.skillName} \xB7 ${r}]`;return es(s,t?.columns)}if(t?.isTTY!==!1){let s;if(e.claimsTotal!==void 0){let a=e.claimsTotal===e.claimsConfirmed&&e.claimsRefuted===void 0&&e.claimsInconclusive===void 0,l;if(a)l=`${e.claimsTotal} claims \xB7 all confirmed`;else{let c=`${e.claimsTotal} claims`;e.claimsConfirmed!==void 0&&(c+=` \xB7 ${e.claimsConfirmed} confirmed`),e.claimsRefuted!==void 0&&(c+=` \xB7 ${e.claimsRefuted} refuted`),e.claimsInconclusive!==void 0&&(c+=` \xB7 ${e.claimsInconclusive} inconclusive`),l=c}s=`${n.glyph} ${e.skillName} \xB7 ${l} \xB7 ${r}`}else s=`${n.glyph} ${e.skillName} \xB7 ${r}`;let i=HT.hex(n.color)(s);return es(i,t?.columns)}else{let s;if(e.claimsTotal!==void 0){let i=e.claimsConfirmed??0;s=`[${e.skillName} \xB7 ${i}/${e.claimsTotal} confirmed \xB7 ${r}]`}else s=`[${e.skillName} \xB7 ${r}]`;return es(s,t?.columns)}}function es(e,t){return t!==void 0&&q(e)>t?se(e,t):e}function zT(e,t){let n=lc(e);if(!n){let s=`[${e} \xB7 running\u2026]`;return es(s,t?.columns)}if(t?.isTTY!==!1){let s=`${n.glyph} ${e} \xB7 ${n.inFlightVerb}`,i=HT.hex(n.color)(s);return es(i,t?.columns)}let o=`[${e} \xB7 ${n.inFlightVerb}]`;return es(o,t?.columns)}var qT={name:"/stats",summary:"Show session statistics including skill runs",async handler(e){let t=e.ledger;if(!t)return e.out.info("No skill stats available."),"continue";let n=t.summary();if(!n)return e.out.info("No skill runs recorded this session."),"continue";e.out.line(),e.out.line(m.bold("Skill runs"));for(let[r,o]of n){let s=lc(r)?.glyph??"",i=s?`${s} `:"",a=`${(o.totalDurationMs/1e3).toFixed(1)}s total`,l=`${o.runs} run${o.runs!==1?"s":""}`,c="";o.totalClaims!==void 0&&(c=` \xB7 ${o.totalClaims} claims`,o.totalConfirmed!==void 0&&(c+=` \xB7 ${o.totalConfirmed} confirmed`),o.totalRefuted!==void 0&&(c+=` \xB7 ${o.totalRefuted} refuted`),o.totalInconclusive!==void 0&&(c+=` \xB7 ${o.totalInconclusive} inconclusive`)),e.out.line(` ${i}${r} ${l}${c} \xB7 ${a}`)}return e.out.line(),"continue"}};function j1(e=Td){return{name:"/font-size",summary:"Get or set the terminal font size in Cursor / VS Code",usage:"/font-size [size] [editor]",hint:"Direct shortcut to the terminal_font_size tool \u2014 bypasses the LLM and the first-write permission prompt. Examples: `/font-size` (read all), `/font-size 18` (set all), `/font-size 14 cursor` (set Cursor only).",async handler(t,n){let r=n.split(/\s+/).filter(Boolean),o=new AbortController;if(r.length===0){let u=await e({action:"get"},o.signal);return u.isError?t.out.error(u.content):t.out.line(u.content),"continue"}let s=r[0],i=Number(s);if(!Number.isFinite(i))return t.out.error(`Invalid size: "${s}". Usage: /font-size [size] [editor]`),"continue";let a=r[1],l={action:"set",size:i};a!==void 0&&(l.editor=a);let c=await e(l,o.signal);return c.isError?t.out.error(c.content):t.out.success(c.content),"continue"}}}var JT=j1();import W1 from"path";import{statSync as H1}from"fs";var Mr;function VT(e){Mr=e}var YT={name:"/allow-dir",summary:"Manage per-session directory access grants for tool handlers",usage:"/allow-dir [--rw | --revoke] [<path>]",flags:["--rw","--revoke"],async handler(e,t){if(!Mr)return e.out.error("Directory grants not available in this session."),"continue";let n=t.trim();if(!n){let a=Mr.getGrants();return e.out.line(" Session directory grants:"),e.out.line(` resolveBase : ${a.resolveBase??"(none)"}`),e.out.line(` readRoots : ${a.readRoots.length>0?a.readRoots.join(", "):"(none)"}`),e.out.line(` writeRoots : ${a.writeRoots.length>0?a.writeRoots.join(", "):"(none)"}`),"continue"}let r="read",o=n;if(o.startsWith("--rw ")||o==="--rw"?(r="write",o=o.slice(5).trim()):(o.startsWith("--revoke ")||o==="--revoke")&&(r="revoke",o=o.slice(9).trim()),!o)return e.out.error("Usage: /allow-dir [--rw | --revoke] <path>"),"continue";let s=W1.resolve(process.cwd(),o);if(r!=="revoke")try{H1(s)}catch{return e.out.error(`Path does not exist: ${s}`),"continue"}let i=e.stats.sessionId;if(r==="revoke"){let a=Mr.getGrants();Mr.revokeRoot(s,"slash",i),a.resolveBase&&s===a.resolveBase?e.out.warn(`Cannot revoke the session's initial resolveBase: ${s}`):e.out.line(`\u2713 Revoked: ${s}`)}else r==="write"?(Mr.addWriteRoot(s,"slash",i),e.out.line(`\u2713 Read+write grant: ${s}`)):(Mr.addReadRoot(s,"slash",i),e.out.line(`\u2713 Read-only grant: ${s}`));return"continue"}};var XT=[{group:"Navigation",rows:[["ctrl+a","Move to start of current line"],["ctrl+e","Move to end of current line"],["ctrl+b","Move one character backward (input mode) / Run turn in background (streaming mode)"],["ctrl+f","Move one character forward"],["alt+b","Move one word backward"],["alt+f","Move one word forward"],["\u2190 / \u2192","Character left / right"],["home / end","Buffer start / end"]]},{group:"Editing",rows:[["ctrl+u","Delete to start of current line"],["ctrl+k","Delete to end of current line"],["ctrl+w","Delete previous word"],["backspace","Delete previous character"],["delete","Delete next character"],["alt+backspace","Delete previous word (Option+Delete on macOS)"],["alt+delete","Delete next word (Option+Fn-Delete on macOS)"]]},{group:"History",rows:[["ctrl+p / \u2191","Previous history entry (or move up in multi-line draft)"],["ctrl+n / \u2193","Next history entry (or move down in multi-line draft)"]]},{group:"Multi-line",rows:[["shift+enter","Insert newline (no submit)"],["alt+enter","Insert newline (no submit)"],["<text>\\","Trailing \\ + Enter inserts newline (backwards-compat)"]]},{group:"Misc",rows:[["ctrl+l","Clear screen and repaint"],["ctrl+v","Paste image from clipboard"],["ctrl+x","Remove last attached image"],["ctrl+c","Interrupt running turn / exit (second press)"],["ctrl+d","EOF / exit (when buffer is empty)"],["tab","Accept autocomplete suggestion"],["enter","Submit prompt"]]}],ZT={name:"/keys",summary:"Show keybinding reference",async handler(e){e.out.line(),e.out.line(m.bold(m.brand("Keybindings"))),e.out.line(ye());let n=XT.flatMap(r=>r.rows).reduce((r,[o])=>Math.max(r,o.length),0);for(let{group:r,rows:o}of XT){e.out.line(),e.out.line(m.bold(r));for(let[s,i]of o){let a=" ".repeat(Math.max(0,n-s.length));e.out.line(` ${m.warning(s)}${a} ${m.dim(i)}`)}}return e.out.line(),"continue"}};import{execFile as Q1}from"node:child_process";import{promises as ej}from"node:fs";import{dirname as tj,isAbsolute as nj,join as rj,resolve as oj}from"node:path";import{promisify as sj}from"node:util";H();import{promises as Ot,existsSync as QT,createReadStream as K1}from"node:fs";import{join as cc}from"node:path";import{createInterface as G1}from"node:readline";var z1=36e5,q1=30*864e5;function J1(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function V1(e){let t=e.trim().split(/\n\n+/),n=[];for(let r of t){let o=r.split(`
2154
2154
  `),s="",i="",a="",l=!1,c=!1,u=!1;for(let d of o)d.startsWith("worktree ")?s=d.slice(9).trim():d.startsWith("HEAD ")?i=d.slice(5).trim():d.startsWith("branch ")?a=d.slice(7).trim():d.trim()==="locked"?l=!0:d.trim()==="prunable"?c=!0:d.trim()==="bare"&&(u=!0);s&&n.push({path:s,head:i,branch:a,locked:l,prunable:c,isBare:u})}return n}function Y1(e,t,n){if(e.locked)return"locked";let r=864e5,o=t*r,s=n*r;return e.ownerLiveness==="dead"&&!e.isDirty&&e.commitsAhead===0?"dead-owner":e.commitsAhead===0&&!e.isDirty&&e.ageMs>=z1?"empty":e.isDirty&&e.ageMs>s?"stale-dirty":!e.isDirty&&e.ageMs>o?"stale-clean":"active"}async function X1(e){if(!QT(e))return 0;let t=0;try{let n=G1({input:K1(e),crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let s=JSON.parse(o);s.taskId==="worktree-prune"&&(s.status==="success"||s.status==="error")&&t++}catch{}}}catch{}return t}var uc=class extends Error{constructor(t){super(`Worktree sweep lock contested: ${t} \u2014 another sweep may be running.`),this.name="LockContestedError"}};async function Z1(e){let t=cc(e,"..");await Ot.mkdir(t,{recursive:!0}).catch(()=>{});let r=await(async()=>{try{return await Ot.open(e,"wx")}catch(o){if(o.code!=="EEXIST")throw o;let i=null;try{let a=await Ot.readFile(e,"utf-8");i=parseInt(a.trim(),10)}catch{}if(i!==null&&!Number.isNaN(i)){let a=!1;try{process.kill(i,0),a=!0}catch{}if(!a)return await Ot.unlink(e).catch(()=>{}),await Ot.open(e,"wx")}throw new uc(e)}})();return await r.writeFile(String(process.pid),"utf-8"),await r.close(),async()=>{await Ot.unlink(e).catch(()=>{})}}async function Xt(e){let{execFile:t,repoRoot:n,maxAgeDaysClean:r=14,maxAgeDaysDirty:o=30,scope:s="all",telemetryPath:i}=e,a=i??Lt(),l=e.lockPath??ug(),c={removed:[],warnings:[],dryRun:e.dryRun??!1,candidates:[]},u=e.bypassSoftLaunch?Number.POSITIVE_INFINITY:await X1(a),d=e.dryRun===!0||u<3;c.dryRun=d;let p=null;try{p=await Z1(l)}catch(f){if(f instanceof uc)return c.warnings.push(`[WARN] ${f.message}`),c;throw f}try{let f=await t("git",["-C",n,"worktree","list","--porcelain"]),g=V1(f.stdout),h=cc(n,".afk-worktrees"),b=new Set(g.map(S=>S.path)),y=[];try{y=(await Ot.readdir(h,{withFileTypes:!0})).filter(E=>E.isDirectory()).map(E=>cc(h,E.name))}catch{}let w=y.filter(S=>!b.has(S));if(s==="all"||s==="interactive")for(let S of w){let E=0;try{let _=await Ot.stat(S);E=Date.now()-_.birthtimeMs}catch{}if(c.candidates.push({path:S,verdict:"orphaned-dir",owner:"interactive",ageMs:E}),!d)try{await Ot.rm(S,{recursive:!0,force:!0}),c.removed.push(S)}catch(_){c.warnings.push(`[ERROR] Failed to remove orphaned dir ${S}: ${_ instanceof Error?_.message:String(_)}`)}}let v=!1,R=g[0]?.path;for(let S of g){if(S.path===R||S.isBare||!S.path.startsWith(h))continue;let E;try{let B=await Ot.readFile(cc(S.path,".afk-worktree-meta.json"),"utf-8");E=JSON.parse(B)}catch{}if(s!=="all"&&E?.owner!==s)continue;let _=E?.owner==="interactive"||E?.owner==="diagnose"?E.owner:"unknown";if(!QT(S.path)){c.candidates.push({path:S.path,verdict:"orphaned-registration",owner:_,ageMs:0}),d||(v=!0);continue}let C=0,I=E?.createdAt;if(I)C=Date.now()-new Date(I).getTime();else try{let B=await Ot.stat(S.path);C=Date.now()-B.birthtimeMs}catch{}let P=!1,A=0;try{P=(await t("git",["-C",S.path,"status","--porcelain"])).stdout.trim().length>0}catch{P=!0}if(!P&&S.head){let B=E?.baseSha??S.head;try{let F=await t("git",["-C",n,"rev-list",`${B}..${S.head}`,"--count"]);A=parseInt(F.stdout.trim(),10)||0}catch{A=0}}let L="unknown";typeof E?.pid=="number"&&Number.isInteger(E.pid)&&E.pid>0&&C<=q1&&(L=J1(E.pid)?"alive":"dead");let O={path:S.path,head:S.head,branch:S.branch,locked:S.locked,prunable:S.prunable,meta:E,ageMs:C,isDirty:P,commitsAhead:A,ownerLiveness:L},j=Y1(O,r,o);if(c.candidates.push({path:S.path,verdict:j,owner:_,ageMs:C}),!d)try{j==="empty"?(await t("git",["-C",n,"worktree","remove","--force",S.path]),S.branch&&await t("git",["-C",n,"branch","-d",S.branch]).catch(()=>{}),c.removed.push(S.path)):j==="dead-owner"?(await t("git",["-C",n,"worktree","remove","--force",S.path]),S.branch&&await t("git",["-C",n,"branch","-d",S.branch]).catch(()=>{}),c.removed.push(S.path)):j==="stale-clean"?(await t("git",["-C",n,"worktree","remove","--force",S.path]),c.removed.push(S.path)):j==="stale-dirty"&&c.warnings.push(`[WARN] stale-dirty worktree preserved (uncommitted changes): ${S.path}`)}catch(B){c.warnings.push(`[ERROR] Failed to process ${S.path} (${j}): ${B instanceof Error?B.message:String(B)}`)}}if(v&&!d)try{await t("git",["-C",n,"worktree","prune"])}catch(S){c.warnings.push(`[ERROR] git worktree prune failed: ${S instanceof Error?S.message:String(S)}`)}}finally{p&&await p()}return c}var Em=sj(Q1),ex=["interactive","diagnose","all"],dc=new Set(["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"]);async function tx(){let t=(await Em("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=nj(t)?t:oj(process.cwd(),t);return tj(n)}function ij(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function aj(e,t){return dc.has(e)?m.error(t):e==="stale-dirty"?m.warning(t):e==="locked"?m.dim(t):m.dim(t)}function nx(e,t){let n=e.split(/\s+/).map(o=>o.trim()).filter(o=>o.length>0),r={scope:t,apply:!1,unknown:[]};for(let o=0;o<n.length;o++){let s=n[o];if(s==="--apply")r.apply=!0;else if(s==="--scope"&&o+1<n.length){let i=n[o+1];o++,ex.includes(i)?r.scope=i:r.unknown.push(`--scope=${i}`)}else if(s.startsWith("--scope=")){let i=s.slice(8);ex.includes(i)?r.scope=i:r.unknown.push(s)}else r.unknown.push(s)}return r}async function lj(e){try{let t=await ej.readFile(rj(e,".afk-worktree-meta.json"),"utf-8"),n=JSON.parse(t);if(typeof n.pid=="number"&&Number.isInteger(n.pid)&&n.pid>0)return n.pid}catch{}}async function cj(e,t,n){if(t.length===0){e.info("No afk-managed worktrees found.");return}let r=process.pid;e.line(),e.line(m.bold("Worktrees")),e.line(m.dim(" "+"PATH".padEnd(45)+" "+"OWNER".padEnd(12)+" "+"AGE".padEnd(5)+" "+"VERDICT".padEnd(22)+" PRUNE?"));for(let o of t){let a=n.get(o.path)===r?m.brand("\u2192 "):" ",l=o.path.slice(-44).padEnd(45),c=o.owner.padEnd(12),u=ij(o.ageMs).padEnd(5),d=o.verdict.padEnd(22),p=dc.has(o.verdict)?m.error("yes"):o.verdict==="stale-dirty"?m.warning("warn"):m.dim("no"),f=aj(o.verdict,d);e.line(`${a}${l} ${c} ${u} ${f} ${p}`)}e.line(),e.line(m.dim(" \u2192 this session")),e.line()}async function uj(e){let t=new Map;for(let n of e)t.set(n.path,await lj(n.path));return t}async function dj(e,t){let n=nx(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await tx()}catch(i){return e.out.error(`Not in a git repository: ${i.message}`),"continue"}let o;try{let i={execFile:Em,repoRoot:r,dryRun:!0,scope:n.scope};o=await Xt(i)}catch(i){return e.out.error(`Sweep failed: ${i.message}`),"continue"}let s=await uj(o.candidates);await cj(e.out,o.candidates,s);for(let i of o.warnings)e.out.warn(i);return"continue"}async function pj(e,t){let n=nx(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await tx()}catch(a){return e.out.error(`Not in a git repository: ${a.message}`),"continue"}let o;try{let a={execFile:Em,repoRoot:r,dryRun:!n.apply,scope:n.scope};o=await Xt(a)}catch(a){return e.out.error(`Sweep failed: ${a.message}`),"continue"}let s={};for(let a of o.candidates)s[a.verdict]=(s[a.verdict]??0)+1;let i=Object.entries(s).sort(([a],[l])=>a.localeCompare(l)).map(([a,l])=>`${a}=${l}`);if(o.dryRun){let a=o.candidates.filter(l=>dc.has(l.verdict)).length;e.out.line(),e.out.line(m.warning("\u{1F50D} Dry-run \u2014 pass --apply to actually remove.")+` Would prune ${a} worktree(s).`+(i.length>0?` [${i.join(" ")}]`:""))}else{let a=o.warnings.filter(c=>c.startsWith("[WARN]")).length,l=o.warnings.filter(c=>c.startsWith("[ERROR]")).length;e.out.line(),e.out.success(`Removed ${o.removed.length}, warned ${a}, errors ${l}`+(i.length>0?` [${i.join(" ")}]`:""))}for(let a of o.candidates){let c=o.removed.includes(a.path)?m.error("\u2717"):dc.has(a.verdict)?m.warning("\u2022"):m.dim("\xB7");e.out.line(` ${c} [${a.verdict.padEnd(22)}] ${a.path}`)}for(let a of o.warnings)a.startsWith("[ERROR]")?e.out.error(a):e.out.warn(a);return e.out.line(),"continue"}var rx={name:"/worktree",summary:"List or prune afk-managed git worktrees",usage:"/worktree list | /worktree prune [--apply] [--scope <interactive|diagnose|all>]",async handler(e,t){let n=t.trim();return n.length===0||n.startsWith("list")?dj(e,n.replace(/^list\s*/,"")):n.startsWith("prune")?pj(e,n.replace(/^prune\s*/,"")):(e.out.error(`Unknown /worktree subcommand. Usage:
2155
2155
  /worktree list
2156
- /worktree prune [--apply] [--scope <interactive|diagnose|all>]`),"continue")}};var ox={name:"/reauth",summary:"Re-read keychain credentials and swap the running session's client",usage:"/reauth [--check]",hint:"Force the running session to pick up a new keychain token (e.g. after `claude /login` in another terminal)",async handler(e,t){if(t.trim()==="--check"){let s=Ve();if(!s)return e.out.warn("No OAuth token found. Run `claude login` in a terminal to authenticate."),"continue";let i=On(s);return e.out.success(`Active keychain account: ${i}`),e.out.info("Note: --check only inspects the keychain. The running SDK client may still hold an older token \u2014 run `/reauth` (no args) to actually swap."),"continue"}let r=Ve();if(r){let s=On(r);e.out.info(`Current keychain account: ${s}`)}e.out.info("Rebuilding session client from keychain credentials\u2026");let o;try{o=await e.session.current.reauth()}catch(s){return e.out.error(`Client refresh failed: ${s instanceof Error?s.message:String(s)}`),e.out.warn("Run `claude login` in a terminal to re-authenticate."),"continue"}return o?(o.swapped?(e.out.success(`\u2713 Client swapped. Session now authenticated as: ${o.accountId}`),e.out.info("Next turn will use the new credential. If a usage-limit pause is active, it will resume automatically within ~30s (or send a message to retry immediately).")):e.out.success(`\u2713 Client refreshed. Authenticated as: ${o.accountId} (token unchanged)`),"continue"):(Ve()?e.out.warn("This session is not using OAuth (probably api-key mode) \u2014 nothing to refresh. The active credential is whatever ANTHROPIC_API_KEY held at session start."):e.out.warn("No OAuth credentials found in the keychain. Run `claude login` in a terminal to authenticate."),"continue")}};G();import{spawn as mj}from"node:child_process";import{promises as Rm}from"node:fs";import*as sx from"node:os";import*as ix from"node:path";function fj(e){return new Date(e).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function gj(e,t){let n=[m.meta(`#${t+1}`),m.dim(fj(e.timestamp))];if(e.durationMs!==void 0&&e.durationMs>0&&n.push(m.dim(ne(e.durationMs))),e.costUsd!==void 0&&e.costUsd>0&&n.push(m.dim(Ne(e.costUsd))),e.inputTokens!==void 0||e.outputTokens!==void 0){let r=e.inputTokens??0,o=e.outputTokens??0;n.push(m.dim(`${Math.round((r+o)/1e3)}k tok`))}return n.join(" ")}function hj(e){if(!e.toolEvents||e.toolEvents.length===0)return"";let t=[];for(let n of e.toolEvents){let r=n.isError?m.error("\u2717"):m.dim("\u25CF"),o=m.chrome(n.toolName),s="";if(n.result){let i=n.result.trim().split(`
2156
+ /worktree prune [--apply] [--scope <interactive|diagnose|all>]`),"continue")}};var ox={name:"/reauth",summary:"Re-read keychain credentials and swap the running session's client",usage:"/reauth [--check]",hint:"Force the running session to pick up a new keychain token (e.g. after `claude /login` in another terminal)",async handler(e,t){if(t.trim()==="--check"){let s=Ve();if(!s)return e.out.warn("No OAuth token found. Run `claude login` in a terminal to authenticate."),"continue";let i=On(s);return e.out.success(`Active keychain account: ${i}`),e.out.info("Note: --check only inspects the keychain. The running SDK client may still hold an older token \u2014 run `/reauth` (no args) to actually swap."),"continue"}let r=Ve();if(r){let s=On(r);e.out.info(`Current keychain account: ${s}`)}e.out.info("Rebuilding session client from keychain credentials\u2026");let o;try{o=await e.session.current.reauth()}catch(s){return e.out.error(`Client refresh failed: ${s instanceof Error?s.message:String(s)}`),e.out.warn("Run `claude login` in a terminal to re-authenticate."),"continue"}return o?(o.swapped?(e.out.success(`\u2713 Client swapped. Session now authenticated as: ${o.accountId}`),e.out.info("Next turn will use the new credential. If a usage-limit pause is active, it will resume automatically within ~30s (or send a message to retry immediately).")):e.out.success(`\u2713 Client refreshed. Authenticated as: ${o.accountId} (token unchanged)`),"continue"):(Ve()?e.out.warn("This session is not using OAuth (probably api-key mode) \u2014 nothing to refresh. The active credential is whatever ANTHROPIC_API_KEY held at session start."):e.out.warn("No OAuth credentials found in the keychain. Run `claude login` in a terminal to authenticate."),"continue")}};G();import{spawn as mj}from"node:child_process";import{promises as Rm}from"node:fs";import*as sx from"node:os";import*as ix from"node:path";function fj(e){return new Date(e).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function gj(e,t){let n=[m.meta(`#${t+1}`),m.dim(fj(e.timestamp))];if(e.durationMs!==void 0&&e.durationMs>0&&n.push(m.dim(ne(e.durationMs))),e.costUsd!==void 0&&e.costUsd>0&&n.push(m.dim(Be(e.costUsd))),e.inputTokens!==void 0||e.outputTokens!==void 0){let r=e.inputTokens??0,o=e.outputTokens??0;n.push(m.dim(`${Math.round((r+o)/1e3)}k tok`))}return n.join(" ")}function hj(e){if(!e.toolEvents||e.toolEvents.length===0)return"";let t=[];for(let n of e.toolEvents){let r=n.isError?m.error("\u2717"):m.dim("\u25CF"),o=m.chrome(n.toolName),s="";if(n.result){let i=n.result.trim().split(`
2157
2157
  `)[0]??"";s=i.length>80?i.slice(0,77)+"...":i}t.push(` ${r} ${o}${s?m.dim(` ${s}`):""}`)}return t.join(`
2158
2158
  `)+`
2159
- `}function yj(e,t,n,r){let o=[];o.push(ye("Session Transcript"));let s=[m.dim(`Started ${new Date(n).toLocaleString()}`),m.dim(`model: ${t}`),m.dim(`${e.length} turn${e.length===1?"":"s"}`)];r>0&&s.push(m.dim(Ne(r))),o.push(s.join(" \xB7 ")),o.push("");for(let i=0;i<e.length;i++){let a=e[i];o.push(gj(a,i)),o.push(""),o.push(` ${m.user("\u25B6")} ${m.user("User")}`),o.push("");let l=a.user.split(`
2159
+ `}function yj(e,t,n,r){let o=[];o.push(ye("Session Transcript"));let s=[m.dim(`Started ${new Date(n).toLocaleString()}`),m.dim(`model: ${t}`),m.dim(`${e.length} turn${e.length===1?"":"s"}`)];r>0&&s.push(m.dim(Be(r))),o.push(s.join(" \xB7 ")),o.push("");for(let i=0;i<e.length;i++){let a=e[i];o.push(gj(a,i)),o.push(""),o.push(` ${m.user("\u25B6")} ${m.user("User")}`),o.push("");let l=a.user.split(`
2160
2160
  `).map(p=>` ${p}`);o.push(l.join(`
2161
2161
  `)),o.push("");let c=hj(a);c&&(o.push(` ${m.chrome("Tools")}`),o.push(c)),o.push(` ${m.brand("\u25C6")} ${m.brand("Assistant")}`),o.push("");let d=Rt(a.assistant).split(`
2162
2162
  `).map(p=>` ${p}`);o.push(d.join(`
@@ -2184,8 +2184,8 @@ ${MH(i)}
2184
2184
  `),this.client=a,this.connected=!0,this.pendingAuthTransport=void 0;let l=await Dc(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??Km;return(await Dc(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??Km,s;try{s=await this.client.callTool({name:t,arguments:n??{}},BH,{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 UH(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 UH(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(`
2185
2185
  `);return{content:n.length===0?"(empty tool result)":n,...e.isError?{isError:!0}:{}}}function jH(e,t,n){let r=t.type??(t.command?"stdio":"streamable-http");return{primary:$c(e,t,n),fallback:r==="streamable-http"?()=>$c(e,{...t,type:"sse"},n):null}}function WH(e){return e instanceof tE&&(e.code===404||e.code===405)}function HH(e){return e instanceof tE?e.code:void 0}function Dc(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 KH}from"node:crypto";var nE="mcp__",rE="__",zm=64,GH=6;function vi(e){if(e.length===0)return"_";let n=e.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_{2,}/g,"_");return n.length===0?"_":n}function zH(e){return KH("sha256").update(e).digest("hex").slice(0,GH)}function oE(e,t){let n=vi(e),r=vi(t),o=`${nE}${n}${rE}${r}`;if(o.length<=zm)return o;let i=`${`${nE}${zH(e)}${rE}`}${r}`;return i.length<=zm?i:i.slice(0,zm)}function Ti(e){let t=new Map,n=new Map;for(let{serverName:o,toolNames:s}of e)for(let i of s){let a=oE(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}}var xi=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=Ti(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):
2186
2186
  ${o.join(`
2187
- `)}`)}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=vi(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 ss(c,u);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=Lc(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();Je(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let y="error",w=0;try{let{tools:v,serverInfo:R}=await g.connect();f.tools=v,f.state.status="connected",f.state.toolCount=v.length,f.state.lastListedAt=Date.now(),y="connected",w=v.length;let S=R?`${R.name}@${R.version}`:"unknown";console.log(`[mcp:${c}] connected (${S}) \u2014 ${v.length} tool(s)`)}catch(v){if(v instanceof Gm){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=v instanceof Error?v.message:String(v);if(f.state.status="error",f.state.error=Lc(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{Je(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-b,metadata:{server:c,status:y,toolCount:w}})}})();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(qH(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=Ti([{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 ss(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=Lc(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=Lc(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=Ti([{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 qH(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Lc(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}G();H();import{existsSync as Ai,lstatSync as JH,readFileSync as VH,readdirSync as YH}from"node:fs";import{join as Ri}from"node:path";function Fc(){return Ri(nn(),"mcp.json")}function sE(e=process.cwd()){return Ri(e,".mcp.json")}var XH=5;function qm(e=Oe()){if(!Ai(e))return[];let t=[];return iE(e,e,0,t,new Set),t}function iE(e,t,n,r,o){if(n>XH||o.has(t))return;o.add(t);let s=Ri(t,".claude-plugin","plugin.json");if(Ai(s)){let a=Ri(t,".claude-plugin","mcp.json");Ai(a)&&r.push(a);return}let i;try{i=YH(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=Ri(t,a),c;try{c=JH(l)}catch{continue}c.isDirectory()&&iE(e,l,n+1,r,o)}}function ZH(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 Ei(e){if(!Ai(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(VH(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=ZH(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 Jm(e={}){let t=[],n=[];if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?qm(a):qm();for(let c of l)t.push({path:c,loaded:Ei(c)})}if(!e.skipUserGlobal){let a=Fc();t.push({path:a,loaded:Ei(a)})}if(!e.skipProjectLocal&&T.AFK_ALLOW_PROJECT_MCP!=="0"){let a=sE(e.cwd);Ai(a)&&(t.push({path:a,loaded:Ei(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:Ei(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}}Rl();function Vm(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 _i(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${Vm(r)}`))}async function aE(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: ${Vm(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=Vm(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{_i(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=>{_i(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{_i(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(kl(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.planMode=!1,delete t.stats.pendingPlanExit;try{t.onSwapped(e)}catch(i){_i(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await hc(n).catch(i=>{_i(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(Ne(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(re(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),vl(t.stats,t.completionWriter),t.statusLine.repaint(xr(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function lE(e){return new Ye(pn({model:e.model,apiKey:pe(),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...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}:{},provider:e.provider}))}async function uE(e,t){let n=Date.now(),r=Fo(e),o=No(r),s=r?.stored?.model??e.model,i,a,l;i=Hn(e.thinking)??To(),a=Kn(e.effort)??xo(),l=Ro(e.maxOutputTokens)??Js();let c=vo()??ko(),u=ot(),d=u.systemPromptSource,p=u.autoRouting?.interactive??!0,f=ll(c,p,"repl"),g={current:null},h=pe(),b=new Q({apiKey:h,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),y=r?.stored?.sessionId,w=Oo(y?{sessionLabel:y}:{});Je(w?.writer,{phase:"bootstrap_start"});let v=new Fa(w?{traceWriter:w.writer}:{});ev(v);let S=u.bgSummaries===!0&&h?new Mc({registry:v,apiKey:h,maxCallsPerSession:u.maxSummaryCallsPerSession??200}):void 0;S?.start(),tv(S);let E=ho(u.openaiBaseUrl!==void 0?{openaiBaseUrl:u.openaiBaseUrl}:{}),_={get sessionId(){return g.current?.sessionId},getInputStreamRef(){return g.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return g.current?.abortSignal??new AbortController().signal},get hookRegistry(){return g.current?.hookRegistry}},C=yo(s,h,E,u.baseUrl,w?.writer,v,t?.cwd,Ze),I=new Kt({subagentManager:b,parentSession:_,defaultConfig:{apiKey:h,systemPrompt:c,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{}},defaultSubagentModel:kt(s),childProviderFactory:E,childSkillExecutorFactory:C,backgroundRegistry:v,resolveApiKeyForModel:Ze,depth:0,...t?.cwd!==void 0?{cwd:t.cwd}:{}}),P=new Gt({parentSession:_,defaultModel:s,defaultSubagentModel:kt(s),apiKey:h,childProviderFactory:E,childSkillExecutorFactory:C,backgroundRegistry:v,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},resolveApiKeyForModel:Ze,...w?.writer!==void 0?{traceWriter:w.writer}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),A=new Gn({parentSession:_,defaultModel:s,defaultSubagentModel:kt(s),apiKey:h,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},systemPrompt:c??""}),L=new We,O;{let xe=t?.cwd??process.cwd(),Ue=Jm({cwd:xe,...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),Jr=Object.values(Ue.mcpServers).filter(bs=>!bs.disabled).length;if(Jr>0){let bs=Ue.sources.length===1?Ue.sources[0]:`${Ue.sources.length} source(s)`;console.log(m.dim(` mcp: ${Jr} server(s) from ${bs??Fc()}`));let L_=Date.now();Je(w?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Jr}});try{O=await xi.fromConfig(Ue.mcpServers,{warnings:Ue.warnings,...w?.writer!==void 0?{traceWriter:w.writer}:{}})}finally{Je(w?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-L_,metadata:{serverCount:Jr}})}}else if(Ue.warnings.length>0)for(let bs of Ue.warnings)console.warn(`[mcp] ${bs}`)}let j=Ao(e.provider,{subagentExecutor:I,skillExecutor:P,composeExecutor:A,memoryStore:L,model:String(s),...u.openaiBaseUrl!==void 0?{openaiBaseUrl:u.openaiBaseUrl}:{},...O!==void 0?{mcpManager:O}:{}})??new Fe({permissions:{allowedTools:[...Bt,...ln,...at,"agent","skill","compose",...O?.getMcpToolWireNames()??[]]},subagentExecutor:I,skillExecutor:P,composeExecutor:A,memoryStore:L,surface:"cli",...O!==void 0?{mcpManager:O}:{}}),B=fl(s);r?.stored&&kl(B,r.stored,r.resumeId),B.cwd=t?.cwd??process.cwd(),w&&console.log(m.dim(` trace: ${w.tracePath}`));let F={fn:xe=>console.log(xe),idleFn:xe=>console.log(xe)},D=new Sl,x=Yx(process.stdout,{statusLine:D}),M=Po(xe=>{F.fn(dl(xe))},"cli",L,()=>B.planMode?"plan":"default").registry,U={model:s,resumeConfig:o,systemPrompt:f,systemPromptSource:d,thinking:i,effort:a,maxOutputTokens:l,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},provider:j,hookRegistry:M,traceWriter:w?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:u.autoResumeOnUsageLimit},J=lE(U);g.current=J,b.setOnSubagentSucceeded((xe,Ue)=>{g.current?.recordSubagentCompletion(xe,Ue)});let K=new Ic,N=Qo(F),Y=new Pc(J),be={session:g,stats:B,out:N,ui:{clearScreen:()=>{let xe=be.getCompositor?.();xe?.setOverlay(""),xe?.resetCommittedBand(),D.stop(),Y.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),D.start(),D.repaint(xr(B,Y))},repaintStatusLine:()=>D.repaint(xr(B,Y))},ledger:K,...O!==void 0?{mcpManager:O}:{}},Be=xe=>(K.clear(),aE(xe,{sessionRef:g,stats:B,contextSampler:Y,statusLine:D,backgroundRegistry:v,completionWriter:F,isInFlight:()=>we.getInFlight?.()??!1,onSwapped:Ue=>{we.resumeTarget=Ue,we.clearVerdictLedger?.()},buildSession:Ue=>lE({...U,model:Ue.stored?.model??U.model,resumeConfig:No(Ue)})})),we={session:g,memoryStore:L,stats:B,statusLine:D,contextSampler:Y,completionWriter:F,replRenderer:x,slashCtx:be,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:v,...S!==void 0?{bgSummarizer:S}:{},requestResume:Be,getInFlight:()=>!1,...O!==void 0?{mcpManager:O}:{},suggestApiKey:h,...u.openaiBaseUrl!==void 0?{suggestBaseUrl:u.openaiBaseUrl}:{},...u.interactive?.suggestGhost!==void 0?{suggestGhostConfig:u.interactive.suggestGhost}:{}},pt=xe=>{F.fn(zT(xe,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},hs=xe=>{F.fn(GT(xe,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),K.record(xe)};fb(pt),pb(hs),we.teardownTrustedSkillEvents=()=>{gb(pt),mb(hs)},Vx(),j instanceof Fe&&VT(j);let ys=cE.createInterface({input:process.stdin,output:process.stdout,terminal:!1});we.rl=ys;let Tu={current:null};return we.inputSurfaceRef=Tu,Wt.install(wl({readLine:xe=>new Promise((Ue,Jr)=>{ys.question(xe,Ue),ys.once("close",()=>Jr(new Error("readline closed")))}),writer:{line:(xe="")=>process.stdout.write(xe+`
2188
- `)},pendingCount:()=>Wt.pendingCount(),suspendInput:()=>Tu.current?.suspendForElicitation(),resumeInput:()=>Tu.current?.resumeAfterElicitation()})),be.requestResume=Be,Je(w?.writer,{phase:"bootstrap_done",durationMs:Date.now()-n}),we}G();import{promises as Ci}from"node:fs";import*as pE from"node:os";import*as Nc from"node:path";async function dE(e,t,n=!1){await Ci.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=Nc.join(e,`${r}.md`),s=n?" (continued)":"";return await Ci.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
2187
+ `)}`)}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=vi(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 ss(c,u);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=Lc(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();Je(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let y="error",w=0;try{let{tools:v,serverInfo:R}=await g.connect();f.tools=v,f.state.status="connected",f.state.toolCount=v.length,f.state.lastListedAt=Date.now(),y="connected",w=v.length;let S=R?`${R.name}@${R.version}`:"unknown";console.log(`[mcp:${c}] connected (${S}) \u2014 ${v.length} tool(s)`)}catch(v){if(v instanceof Gm){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=v instanceof Error?v.message:String(v);if(f.state.status="error",f.state.error=Lc(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{Je(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-b,metadata:{server:c,status:y,toolCount:w}})}})();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(qH(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=Ti([{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 ss(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=Lc(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=Lc(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=Ti([{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 qH(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Lc(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}G();H();import{existsSync as Ai,lstatSync as JH,readFileSync as VH,readdirSync as YH}from"node:fs";import{join as Ri}from"node:path";function Fc(){return Ri(nn(),"mcp.json")}function sE(e=process.cwd()){return Ri(e,".mcp.json")}var XH=5;function qm(e=Oe()){if(!Ai(e))return[];let t=[];return iE(e,e,0,t,new Set),t}function iE(e,t,n,r,o){if(n>XH||o.has(t))return;o.add(t);let s=Ri(t,".claude-plugin","plugin.json");if(Ai(s)){let a=Ri(t,".claude-plugin","mcp.json");Ai(a)&&r.push(a);return}let i;try{i=YH(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=Ri(t,a),c;try{c=JH(l)}catch{continue}c.isDirectory()&&iE(e,l,n+1,r,o)}}function ZH(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 Ei(e){if(!Ai(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(VH(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=ZH(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 Jm(e={}){let t=[],n=[];if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?qm(a):qm();for(let c of l)t.push({path:c,loaded:Ei(c)})}if(!e.skipUserGlobal){let a=Fc();t.push({path:a,loaded:Ei(a)})}if(!e.skipProjectLocal&&T.AFK_ALLOW_PROJECT_MCP!=="0"){let a=sE(e.cwd);Ai(a)&&(t.push({path:a,loaded:Ei(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:Ei(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}}Rl();function Vm(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 _i(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${Vm(r)}`))}async function aE(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: ${Vm(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=Vm(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{_i(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=>{_i(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{_i(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(kl(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.planMode=!1,delete t.stats.pendingPlanExit;try{t.onSwapped(e)}catch(i){_i(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await hc(n).catch(i=>{_i(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(Be(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(re(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),vl(t.stats,t.completionWriter),t.statusLine.repaint(xr(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function lE(e){return new Ye(pn({model:e.model,apiKey:pe(),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...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}:{},provider:e.provider}))}async function uE(e,t){let n=Date.now(),r=Fo(e),o=No(r),s=r?.stored?.model??e.model,i,a,l;i=Hn(e.thinking)??To(),a=Kn(e.effort)??xo(),l=Ro(e.maxOutputTokens)??Js();let c=vo()??ko(),u=ot(),d=u.systemPromptSource,p=u.autoRouting?.interactive??!0,f=ll(c,p,"repl"),g={current:null},h=pe(),b=new Q({apiKey:h,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),y=r?.stored?.sessionId,w=Oo(y?{sessionLabel:y}:{});Je(w?.writer,{phase:"bootstrap_start"});let v=new Fa(w?{traceWriter:w.writer}:{});ev(v);let S=u.bgSummaries===!0&&h?new Mc({registry:v,apiKey:h,maxCallsPerSession:u.maxSummaryCallsPerSession??200}):void 0;S?.start(),tv(S);let E=ho(u.openaiBaseUrl!==void 0?{openaiBaseUrl:u.openaiBaseUrl}:{}),_={get sessionId(){return g.current?.sessionId},getInputStreamRef(){return g.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return g.current?.abortSignal??new AbortController().signal},get hookRegistry(){return g.current?.hookRegistry}},C=yo(s,h,E,u.baseUrl,w?.writer,v,t?.cwd,Ze),I=new Kt({subagentManager:b,parentSession:_,defaultConfig:{apiKey:h,systemPrompt:c,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{}},defaultSubagentModel:kt(s),childProviderFactory:E,childSkillExecutorFactory:C,backgroundRegistry:v,resolveApiKeyForModel:Ze,depth:0,...t?.cwd!==void 0?{cwd:t.cwd}:{}}),P=new Gt({parentSession:_,defaultModel:s,defaultSubagentModel:kt(s),apiKey:h,childProviderFactory:E,childSkillExecutorFactory:C,backgroundRegistry:v,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},resolveApiKeyForModel:Ze,...w?.writer!==void 0?{traceWriter:w.writer}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),A=new Gn({parentSession:_,defaultModel:s,defaultSubagentModel:kt(s),apiKey:h,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},systemPrompt:c??""}),L=new He,O;{let xe=t?.cwd??process.cwd(),je=Jm({cwd:xe,...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),Jr=Object.values(je.mcpServers).filter(bs=>!bs.disabled).length;if(Jr>0){let bs=je.sources.length===1?je.sources[0]:`${je.sources.length} source(s)`;console.log(m.dim(` mcp: ${Jr} server(s) from ${bs??Fc()}`));let L_=Date.now();Je(w?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Jr}});try{O=await xi.fromConfig(je.mcpServers,{warnings:je.warnings,...w?.writer!==void 0?{traceWriter:w.writer}:{}})}finally{Je(w?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-L_,metadata:{serverCount:Jr}})}}else if(je.warnings.length>0)for(let bs of je.warnings)console.warn(`[mcp] ${bs}`)}let j=Ao(e.provider,{subagentExecutor:I,skillExecutor:P,composeExecutor:A,memoryStore:L,model:String(s),...u.openaiBaseUrl!==void 0?{openaiBaseUrl:u.openaiBaseUrl}:{},...O!==void 0?{mcpManager:O}:{}})??new Ne({permissions:{allowedTools:[...Bt,...ln,...at,"agent","skill","compose",...O?.getMcpToolWireNames()??[]]},subagentExecutor:I,skillExecutor:P,composeExecutor:A,memoryStore:L,surface:"cli",...O!==void 0?{mcpManager:O}:{}}),B=fl(s);r?.stored&&kl(B,r.stored,r.resumeId),B.cwd=t?.cwd??process.cwd(),w&&console.log(m.dim(` trace: ${w.tracePath}`));let F={fn:xe=>console.log(xe),idleFn:xe=>console.log(xe)},D=new Sl,x=Yx(process.stdout,{statusLine:D}),M=Po(xe=>{F.fn(dl(xe))},"cli",L,()=>B.planMode?"plan":"default").registry,U={model:s,resumeConfig:o,systemPrompt:f,systemPromptSource:d,thinking:i,effort:a,maxOutputTokens:l,...u.baseUrl!==void 0?{baseUrl:u.baseUrl}:{},provider:j,hookRegistry:M,traceWriter:w?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:u.autoResumeOnUsageLimit},J=lE(U);g.current=J,b.setOnSubagentSucceeded((xe,je)=>{g.current?.recordSubagentCompletion(xe,je)});let K=new Ic,N=Qo(F),Y=new Pc(J),be={session:g,stats:B,out:N,ui:{clearScreen:()=>{let xe=be.getCompositor?.();xe?.setOverlay(""),xe?.resetCommittedBand(),D.stop(),Y.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),D.start(),D.repaint(xr(B,Y))},repaintStatusLine:()=>D.repaint(xr(B,Y))},ledger:K,...O!==void 0?{mcpManager:O}:{}},Ue=xe=>(K.clear(),aE(xe,{sessionRef:g,stats:B,contextSampler:Y,statusLine:D,backgroundRegistry:v,completionWriter:F,isInFlight:()=>we.getInFlight?.()??!1,onSwapped:je=>{we.resumeTarget=je,we.clearVerdictLedger?.()},buildSession:je=>lE({...U,model:je.stored?.model??U.model,resumeConfig:No(je)})})),we={session:g,memoryStore:L,stats:B,statusLine:D,contextSampler:Y,completionWriter:F,replRenderer:x,slashCtx:be,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:v,...S!==void 0?{bgSummarizer:S}:{},requestResume:Ue,getInFlight:()=>!1,...O!==void 0?{mcpManager:O}:{},suggestApiKey:h,...u.openaiBaseUrl!==void 0?{suggestBaseUrl:u.openaiBaseUrl}:{},...u.interactive?.suggestGhost!==void 0?{suggestGhostConfig:u.interactive.suggestGhost}:{}},pt=xe=>{F.fn(zT(xe,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},hs=xe=>{F.fn(GT(xe,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),K.record(xe)};fb(pt),pb(hs),we.teardownTrustedSkillEvents=()=>{gb(pt),mb(hs)},Vx(),j instanceof Ne&&VT(j);let ys=cE.createInterface({input:process.stdin,output:process.stdout,terminal:!1});we.rl=ys;let Tu={current:null};return we.inputSurfaceRef=Tu,Wt.install(wl({readLine:xe=>new Promise((je,Jr)=>{ys.question(xe,je),ys.once("close",()=>Jr(new Error("readline closed")))}),writer:{line:(xe="")=>process.stdout.write(xe+`
2188
+ `)},pendingCount:()=>Wt.pendingCount(),suspendInput:()=>Tu.current?.suspendForElicitation(),resumeInput:()=>Tu.current?.resumeAfterElicitation()})),be.requestResume=Ue,Je(w?.writer,{phase:"bootstrap_done",durationMs:Date.now()-n}),we}G();import{promises as Ci}from"node:fs";import*as pE from"node:os";import*as Nc from"node:path";async function dE(e,t,n=!1){await Ci.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=Nc.join(e,`${r}.md`),s=n?" (continued)":"";return await Ci.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
2189
2189
 
2190
2190
  - model: ${t}
2191
2191
 
@@ -2218,14 +2218,14 @@ _ended: ${new Date().toISOString()}_
2218
2218
  `,l=await Ym(t,Xm|Zm|nK|Qm,384);try{await l.writeFile(a)}finally{await l.close()}Br=Ii}})}async function bE(e){if(e.initialBuffer!==void 0&&e.initialBuffer.length>0)return{text:e.initialBuffer,attachments:[]};let t=null;if(e.onSigint){let n=e.onSigint;t=()=>n(),process.on("SIGINT",t)}try{return{text:await Mv({rl:e.rl,promptFn:e.promptFn}),attachments:[]}}finally{t&&process.removeListener("SIGINT",t)}}import*as dt from"ansi-escapes";import ef from"string-width";var aK="\x1B[?2004h",lK="\x1B[?2004l";function wE(e,t){let n=e.isRaw;e.setRawMode(!0),e.resume(),t.write(aK);let r=!1;return{restore(){if(!r){r=!0;try{t.write(lK)}catch{}try{e.setRawMode(n)}catch{}}}}}function Uc(){let e={dropdownOpen:!1,candidates:[],selectedIndex:0,viewportStart:0,suppressedSignature:null,trigger:null,reset(){e.dropdownOpen=!1,e.candidates=[],e.selectedIndex=0,e.viewportStart=0,e.suppressedSignature=null,e.trigger=null}};return e}async function SE(e){let t=process.stdin,n=process.stdout,r=e.compositor?.isArmed()?{restore:()=>{}}:wE(t,n),o=e.statusLine?.getExtraRows()??0;kr(t);let s=e.promptFn(),i=ef(Ae(s)),a=null,l=null;try{return e.statusLine?.setExtraRows(o+1),await new Promise((c,u)=>{let d=W.seed(e.initialBuffer??""),p=e.autocompleteState??Uc();p.reset();let f=0,g=!1,h=!1,b=0,y=0,w=0,v=null,R=[],S=6,E=0,_=!1,C=8,I={has:D=>et().some(x=>x.name===`/${D}`)},P=()=>{if((w>0||y>0)&&n.write(dt.cursorUp(w+y)),n.write("\r"),n.write(dt.eraseDown),R.length>0)n.write(ai(R)+`
2219
2219
  `),w=1;else if(v!==null){let N=v;v=null,n.write(N+`
2220
2220
  `),w=1}else w=0;n.write(s+Vn(d.buffer,I)),p.trigger=ci(d.buffer,d.cursor);let D=`${d.cursor}:${d.buffer}`;p.suppressedSignature!==null&&p.suppressedSignature!==D&&(p.suppressedSignature=null),p.trigger&&p.suppressedSignature===null?(p.trigger.kind==="slash"?p.candidates=Kl(p.trigger.query).slice(0,12):p.trigger.kind==="file"?p.candidates=Gl(p.trigger.query):p.candidates=ui(p.trigger.command,p.trigger.query),p.dropdownOpen=p.candidates.length>0):(p.dropdownOpen=!1,p.candidates=[]),p.selectedIndex>=p.candidates.length&&(p.selectedIndex=Math.max(0,p.candidates.length-1)),p.viewportStart>p.selectedIndex&&(p.viewportStart=p.selectedIndex),p.selectedIndex>=p.viewportStart+S&&(p.viewportStart=p.selectedIndex-S+1);let x=n.columns||80;if(f=0,p.dropdownOpen&&x>40){let N=Math.min(x-4,60),Y=Math.min(p.candidates.length-p.viewportStart,S);for(let we=0;we<Y;we++){let pt=p.viewportStart+we,hs=ql(p.candidates[pt],pt===p.selectedIndex,N,p.trigger?.kind);n.write(`
2221
- `+hs);let ys=ef(Ae(hs));f+=Math.max(1,Math.ceil(ys/x))}let be=Math.min(x-4,80),Be=Jl(p.candidates[p.selectedIndex]?.hint,be);if(Be!==null){n.write(`
2222
- `+Be);let we=ef(Ae(Be));f+=Math.max(1,Math.ceil(we/x))}}let M=Vp(d.buffer,i,x),{row:U,col:J}=qn(d.buffer,d.cursor,i,x),K=Math.max(0,M-U+f);K>0&&n.write(dt.cursorUp(K)),n.write("\r"),J>0&&n.write(dt.cursorForward(J)),y=M},A=!1,L=()=>{_||(_=!0,setImmediate(()=>{_&&!A&&(_=!1,P())}))};P();let O=()=>{let D=p.candidates[p.selectedIndex];if(!D)return!1;let x=d.buffer.slice(0,d.cursor),M=d.buffer.slice(d.cursor),U,J;if(p.trigger?.kind==="slash"){let K=/\/[A-Za-z_-]*$/.exec(x);U=K?x.length-K[0].length:d.cursor,J=D.value+(M.startsWith(" ")?"":" ")}else if(p.trigger?.kind==="flag"){let K=/--[a-z0-9-]*$/.exec(x);U=K?x.length-K[0].length:d.cursor,J=D.value+(M.startsWith(" ")?"":" ")}else{let K=x.search(/[^\s]*$/);U=K>=0?K:d.cursor,J=D.value}return d=W.replaceRange(d,{start:U,end:d.cursor},J),p.dropdownOpen=!1,p.viewportStart=0,p.selectedIndex=0,P(),!0},j=()=>{(w>0||y>0)&&n.write(dt.cursorUp(w+y)),n.write("\r"),n.write(dt.eraseDown),f=0;let D=Er({buffer:Vn(d.buffer,I),promptText:s,isTTY:!!n.isTTY,attachmentSummary:Ho(R)}),x=()=>n.write(D+`
2221
+ `+hs);let ys=ef(Ae(hs));f+=Math.max(1,Math.ceil(ys/x))}let be=Math.min(x-4,80),Ue=Jl(p.candidates[p.selectedIndex]?.hint,be);if(Ue!==null){n.write(`
2222
+ `+Ue);let we=ef(Ae(Ue));f+=Math.max(1,Math.ceil(we/x))}}let M=Vp(d.buffer,i,x),{row:U,col:J}=qn(d.buffer,d.cursor,i,x),K=Math.max(0,M-U+f);K>0&&n.write(dt.cursorUp(K)),n.write("\r"),J>0&&n.write(dt.cursorForward(J)),y=M},A=!1,L=()=>{_||(_=!0,setImmediate(()=>{_&&!A&&(_=!1,P())}))};P();let O=()=>{let D=p.candidates[p.selectedIndex];if(!D)return!1;let x=d.buffer.slice(0,d.cursor),M=d.buffer.slice(d.cursor),U,J;if(p.trigger?.kind==="slash"){let K=/\/[A-Za-z_-]*$/.exec(x);U=K?x.length-K[0].length:d.cursor,J=D.value+(M.startsWith(" ")?"":" ")}else if(p.trigger?.kind==="flag"){let K=/--[a-z0-9-]*$/.exec(x);U=K?x.length-K[0].length:d.cursor,J=D.value+(M.startsWith(" ")?"":" ")}else{let K=x.search(/[^\s]*$/);U=K>=0?K:d.cursor,J=D.value}return d=W.replaceRange(d,{start:U,end:d.cursor},J),p.dropdownOpen=!1,p.viewportStart=0,p.selectedIndex=0,P(),!0},j=()=>{(w>0||y>0)&&n.write(dt.cursorUp(w+y)),n.write("\r"),n.write(dt.eraseDown),f=0;let D=Er({buffer:Vn(d.buffer,I),promptText:s,isTTY:!!n.isTTY,attachmentSummary:Ho(R)}),x=()=>n.write(D+`
2223
2223
  `);e.statusLine?.withFullScrollRegion?e.statusLine.withFullScrollRegion(x):x(),F(),c({text:d.buffer,attachments:[...R]}),y=0},B=D=>{y>0&&n.write(dt.cursorUp(y)),f>0&&(n.write(dt.eraseDown),f=0),n.write(`
2224
2224
  `),F(),u(D),y=0},F=()=>{A=!0,a&&t.removeListener("keypress",a),l&&l(),a=null,l=null};a=(D,x)=>{let M=Date.now(),U=M-E<C;E=M;let J=x?.sequence||"";if(J==="\x1B[200~"){g=!0,b=d.buffer.length;return}if(J==="\x1B[201~"){g=!1,d.buffer.length===b?h||(h=!0,Ir().then(N=>{N?(v=null,R.push(N)):v="[clipboard: no image found]",L()}).catch(()=>{}).finally(()=>{h=!1})):(P(),h||(h=!0,Ir().then(N=>{N&&(v=null,R.push(N),L())}).catch(()=>{}).finally(()=>{h=!1})));return}if(x?.ctrl&&x?.name==="c"){e.onSigint?e.onSigint():B(new Error("SIGINT"));return}if(x?.ctrl&&x?.name==="d"){d.buffer.length===0&&((w>0||y>0)&&n.write(dt.cursorUp(w+y)),f>0&&(n.write(dt.eraseDown),f=0),n.write(`
2225
2225
  `),F(),c({text:"",attachments:[...R]}),y=0);return}if(x?.ctrl&&x?.name==="v"){h||(h=!0,Ir().then(N=>{N?(v=null,R.push(N)):v="[clipboard: no image found]",L()}).catch(()=>{}).finally(()=>{h=!1}));return}if(x?.name==="escape"){p.dropdownOpen&&(p.suppressedSignature=`${d.cursor}:${d.buffer}`,p.dropdownOpen=!1,p.candidates=[],P());return}if(x?.ctrl&&x?.name==="a"){let N=W.moveLineStart(d);N!==d&&(d=N,P());return}if(x?.ctrl&&x?.name==="e"){let N=W.moveLineEnd(d);N!==d&&(d=N,P());return}if(x?.ctrl&&x?.name==="b"){let N=W.moveLeft(d);N!==d&&(d=N,P());return}if(x?.ctrl&&x?.name==="f"){let N=W.moveRight(d);N!==d&&(d=N,P());return}if(x?.meta&&x?.name==="b"){let N=W.moveWordBackward(d);N!==d&&(d=N,P());return}if(x?.meta&&x?.name==="f"){let N=W.moveWordForward(d);N!==d&&(d=N,P());return}if(x?.ctrl&&x?.name==="w"){let N=W.deleteWordBackward(d);N!==d&&(d=N,e.history?.resetRecall(),P());return}if(x?.ctrl&&x?.name==="l"){y=0,w=0,n.write("\x1B[H\x1B[2J"),P();return}if(x?.ctrl&&x?.name==="p"||x?.name==="up"){if(p.dropdownOpen){p.selectedIndex>0&&(p.selectedIndex--,p.selectedIndex<p.viewportStart&&(p.viewportStart=p.selectedIndex),P());return}let N=n.columns||80,Y=W.moveUpLine(d,N,i);if(Y.moved)d=Y.state,e.history?.resetRecall(),P();else if(e.history){let be=e.history.back(d.buffer);be!==null&&(d=W.seed(be),P())}return}if(x?.ctrl&&x?.name==="n"||x?.name==="down"){if(p.dropdownOpen){p.selectedIndex<p.candidates.length-1&&(p.selectedIndex++,p.selectedIndex>=p.viewportStart+S&&(p.viewportStart=p.selectedIndex-S+1),P());return}let N=n.columns||80,Y=W.moveDownLine(d,N,i);if(Y.moved)d=Y.state,e.history?.resetRecall(),P();else if(e.history){let be=e.history.forward();be!==null&&(d=W.seed(be),P())}return}if(x?.name==="left"){let N=W.moveLeft(d);N!==d&&(d=N,P());return}if(x?.name==="right"){let N=W.moveRight(d);N!==d&&(d=N,P());return}if(x?.name==="home"){let N=W.moveHome(d);N!==d&&(d=N,P());return}if(x?.name==="end"){let N=W.moveEnd(d);N!==d&&(d=N,P());return}if(x?.ctrl&&x?.name==="u"){let N=W.deleteToLineStart(d);N!==d&&(d=N,e.history?.resetRecall(),P());return}if(x?.ctrl&&x?.name==="k"){let N=W.deleteToLineEnd(d);N!==d&&(d=N,e.history?.resetRecall(),P());return}if(x?.ctrl&&x?.name==="x"){R.length>0&&(R.pop(),P());return}if(x?.name==="backspace"){if(x?.meta){let Y=W.deleteWordBackward(d);Y!==d&&(d=Y,e.history?.resetRecall(),P());return}let N=W.backspace(d);N!==d?(d=N,e.history?.resetRecall(),P()):R.length>0&&(R.pop(),P());return}if(x?.name==="delete"){if(x?.meta){let Y=W.deleteWordForward(d);Y!==d&&(d=Y,e.history?.resetRecall(),P());return}let N=W.deleteForward(d);N!==d&&(d=N,e.history?.resetRecall(),P());return}if(x?.name==="return"){let N=x?.shift===!0||J==="\x1B[13;2u",Y=x?.meta===!0;if(N||Y){d=W.insert(d,`
2226
2226
  `),e.history?.resetRecall(),P();return}if(g){d=W.insert(d,`
2227
2227
  `);return}if(U){d=W.insert(d,`
2228
- `),L();return}if(p.dropdownOpen){let be=p.trigger?.kind,Be=O();be==="slash"&&Be&&j()}else d.buffer.endsWith("\\")?(d=W.replaceRange(d,{start:d.buffer.length-1,end:d.buffer.length},`
2228
+ `),L();return}if(p.dropdownOpen){let be=p.trigger?.kind,Ue=O();be==="slash"&&Ue&&j()}else d.buffer.endsWith("\\")?(d=W.replaceRange(d,{start:d.buffer.length-1,end:d.buffer.length},`
2229
2229
  `),P()):j();return}if(x?.shift&&x?.name==="tab"||x?.sequence==="\x1B[Z"){e.onShiftTab?.();return}if(x?.name==="tab"){p.dropdownOpen&&O();return}let K=typeof D=="string"&&D.length===1&&D>=" "&&!x?.ctrl&&!x?.meta?D:typeof x?.sequence=="string"&&x.sequence.length===1&&x.sequence>=" "&&!x?.ctrl&&!x?.meta?x.sequence:null;K!==null&&(d=W.insert(d,K),e.history?.resetRecall(),g||(U?L():P()))},l=$e.subscribe(()=>{y=0,w=0,f=0,P()}),t.on("keypress",a)})}finally{e.statusLine?.setExtraRows(o),r.restore()}}async function kE(e){return!process.stdout.isTTY||!process.stdin.isTTY?bE(e):SE(e)}var jc=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;softStopHandler=null;pendingReadReject=null;slashRegistryView={has:t=>et().some(n=>n.name===`/${t}`)};constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=Uc()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY)return;let o=new Go({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onSoftStop:()=>{this.softStopHandler?.()},onBackground:()=>{this.backgroundHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:s=>Vn(s,this.slashRegistryView),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{},...t.anchorRow!==void 0?{anchorRow:t.anchorRow}:{},...t.suggest?{suggest:t.suggest}:{}});await o.arm(),o.setInputMode("idle"),this.compositor=o,this.armedStdout=n}async dispose(){if(this.compositor){if(this.pendingReadReject){this.compositor.setOnSubmit(null);let t=this.pendingReadReject;this.pendingReadReject=null,t(new Error("InputSurface disposed while readLine was in progress"))}try{this.compositor.disarm()}catch{}this.compositor=null,this.armedStdout=null,this.backgroundHandler=null,this.softStopHandler=null}}getCompositor(){return this.compositor}setBackgroundHandler(t){this.backgroundHandler=t}setSoftStopHandler(t){this.softStopHandler=t}suspendForElicitation(){this.compositor?.suspendInput()}resumeAfterElicitation(){this.compositor?.resumeInput()}async readLine(t){if(this.compositor&&this.compositor.isArmed()){let n=this.compositor;return new Promise((r,o)=>{this.pendingReadReject=o;let s=i=>{n.setOnSubmit(null),this.pendingReadReject=null;let a=this.armedStdout??process.stdout,l=i.displayText??i.text,c=Er({buffer:Vn(l,this.slashRegistryView),promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:Ho([...i.attachments])});for(let u of c.split(`
2230
2230
  `))n.commitAbove(u);r({text:i.text,attachments:[...i.attachments]})};n.setOnSubmit(s),n.setInputMode("idle")})}return kE({rl:this.rl,promptFn:t.promptFn,...t.onSigint?{onSigint:t.onSigint}:{},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.compositor?{compositor:t.compositor}:{},history:this.history,autocompleteState:this.autocompleteState,...this.statusLine?{statusLine:this.statusLine}:{}})}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};var cK="\u25B8",uK=" ",dK="\u25C9",pK="\u25EF",mK="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",fK="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel";function vE(e,t){return new Promise(n=>{let{header:r,options:o,multi:s=!1,signal:i,initialIndex:a=0}=t;if(o.length===0){n(null);return}if(i?.aborted){n(null);return}let l=gK(a,0,o.length-1),c=new Set(t.initialSelected??[]),u=!1,d=b=>{u||(u=!0,i&&i.removeEventListener("abort",p),e.exitPickerMode(),n(b))},p=()=>d(null);i&&i.addEventListener("abort",p,{once:!0});let h={renderRows:()=>{let b=[];for(let y of r)b.push(y);for(let y=0;y<o.length;y++){let w=o[y]??"",v=y===l,R=v?m.brand(cK):uK,S;if(s){let E=c.has(y),_=E?m.success(dK):m.dim(pK),C=v&&!E?m.bold(w):w;S=` ${R} ${_} ${C}`}else{let E=v?m.bold(w):m.dim(w);S=` ${R} ${E}`}b.push(S)}return b.push(m.dim(" "+(s?fK:mK))),b},onKey:(b,y)=>{if(!u){if(y.name==="escape"||y.ctrl&&y.name==="c"){d(null);return}if(y.name==="up"||y.ctrl&&y.name==="p"){l=l===0?o.length-1:l-1,e.repaintPicker();return}if(y.name==="down"||y.ctrl&&y.name==="n"){l=l===o.length-1?0:l+1,e.repaintPicker();return}if(y.name==="return"){if(s){let w=[];for(let v=0;v<o.length;v++)if(c.has(v)){let R=o[v];R!==void 0&&w.push(R)}d(w)}else{let w=o[l];d(w!==void 0?[w]:[])}return}if(s&&(y.name==="space"||b===" ")){c.has(l)?c.delete(l):c.add(l),e.repaintPicker();return}if(y.name==="home"){l=0,e.repaintPicker();return}if(y.name==="end"){l=o.length-1,e.repaintPicker();return}}}};e.enterPickerMode(h)})}function gK(e,t,n){return n<t||e<t?t:e>n?n:e}var hK="enter to submit \xB7 esc to cancel",yK=">";function TE(e,t){return new Promise(n=>{let{header:r,initial:o="",help:s=hK,validate:i,signal:a}=t;if(a?.aborted){n(null);return}let l=W.seed(o),c=null,u=!1,d=b=>{u||(u=!0,a&&a.removeEventListener("abort",p),e.exitPickerMode(),n(b))},p=()=>d(null);a&&a.addEventListener("abort",p,{once:!0});let h={renderRows:()=>{let b=[];for(let y of r)b.push(y);return b.push(bK(l)),c!==null&&b.push(m.warning(" "+c)),b.push(m.dim(" "+s)),b},onKey:(b,y)=>{if(u)return;if(y.name==="escape"||y.ctrl&&y.name==="c"){d(null);return}if(y.name==="return"){if(i){let v=i(l.buffer);if(v!==null){c=v,e.repaintPicker();return}}d(l.buffer);return}let w=c!==null;if(y.name==="left"||y.ctrl&&y.name==="b"){l=W.moveLeft(l),c=null,e.repaintPicker();return}if(y.name==="right"||y.ctrl&&y.name==="f"){l=W.moveRight(l),c=null,e.repaintPicker();return}if(y.name==="home"||y.ctrl&&y.name==="a"){l=W.moveHome(l),c=null,e.repaintPicker();return}if(y.name==="end"||y.ctrl&&y.name==="e"){l=W.moveEnd(l),c=null,e.repaintPicker();return}if(y.name==="backspace"){l=W.backspace(l),c=null,e.repaintPicker();return}if(y.name==="delete"){l=W.deleteForward(l),c=null,e.repaintPicker();return}if(y.ctrl&&y.name==="w"){l=W.deleteWordBackward(l),c=null,e.repaintPicker();return}if(y.ctrl&&y.name==="u"){l=W.deleteToLineStart(l),c=null,e.repaintPicker();return}if(y.ctrl&&y.name==="k"){l=W.deleteToLineEnd(l),c=null,e.repaintPicker();return}if(b!==void 0&&b.length>0&&!wK(b)){l=W.insert(l,b),c=null,e.repaintPicker();return}w&&(c=null,e.repaintPicker())}};e.enterPickerMode(h)})}function bK(e){let{buffer:t,cursor:n}=e,r=t.slice(0,n),o=n<t.length?t.charAt(n):" ",s=n<t.length?t.slice(n+1):"",i=m.user.inverse(o);return` ${m.dim(yK)} ${r}${i}${s}`}function wK(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t<32||t===127}G();function xE(e){if(!e)return null;let t=e.split(`
2231
2231
  `),n=t.slice(Math.max(0,t.length-40)),r=-1,o=null;for(let l=n.length-1;l>=0;l--){let c=n[l]??"",u=SK(c);if(u){r=l,o=u;break}}if(o===null||r<0)return null;let s=n.slice(r+1).map(l=>l.trim());for(;s.length>0&&s[0]==="";)s.shift();for(;s.length>0&&s[s.length-1]==="";)s.pop();let i=kK(s),a=s.join(`
@@ -2236,14 +2236,14 @@ _ended: ${new Date().toISOString()}_
2236
2236
  `)}function xK(e){let t=[],n=(r,o)=>{o&&o.trim().length>0&&t.push({label:r,value:o.trim()})};switch(e.kind){case"done":n("done",e.whatWasDone),n("evidence",e.evidence),n("deferred",e.deferred);break;case"blocked":n("blocks",e.whatBlocks),n("unblock",e.unblockCondition),n("progress",e.alreadyDone);break;case"asking":n("question",e.question),n("resolves",e.assumption),n("after",e.followup);break;case"interrupted":n("was doing",e.whatWasInProgress),n("saved at",e.stateLocation),n("resume",e.resumeRequires);break}return t}function RE(e,t,n,r){let o=[];return n&&n.trim().length>0&&o.push({type:"text",text:n}),r&&r.length>0&&o.push(...r),e&&o.push({type:"text",text:e}),pc(o,t),o}import{readFileSync as EK,statSync as RK}from"fs";import{extname as AK,join as AE}from"path";import{homedir as _K}from"os";var CK=100*1024,IK=400*1024,PK=/(?<=\s|^)@([~\w./-]+)(?=\s|$)/g,MK=/(^|\/)\.(ssh|aws|gnupg|kube|docker)(\/|$)|(^|\/)[^/]*\.env(\.[^/]+)?$|(^|\/)\.(netrc|npmrc|pypirc)$|(^|\/)id_(rsa|ed25519|ecdsa|dsa)(\.pub)?$|\.(pem|key|p12|pfx)$|(^|\/)credentials$|(^|\/)\.git\/config$|(^|\/)\.git-credentials$|(^|\/)\.(bash|zsh|fish|sh)_history$/i,OK=[".afk/config",".afk/state",".config/gcloud",".config/gh"];function $K(e){let t=0,n=e.match(/`+/g);if(n)for(let r of n)r.length>t&&(t=r.length);return"`".repeat(Math.max(3,t+1))}function DK(e,t){if(MK.test(e))return!0;for(let n of t)if(e===n||e.startsWith(n+"/"))return!0;return!1}var LK={".ts":"typescript",".tsx":"tsx",".js":"javascript",".jsx":"jsx",".mjs":"javascript",".cjs":"javascript",".json":"json",".md":"markdown",".py":"python",".sh":"bash",".bash":"bash",".zsh":"bash",".yaml":"yaml",".yml":"yaml",".toml":"toml",".rs":"rust",".go":"go",".rb":"ruby",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cs":"csharp",".html":"html",".css":"css",".scss":"scss",".sql":"sql",".xml":"xml",".txt":""};function FK(e){return LK[e.toLowerCase()]??""}function NK(e=process.env){return e.AFK_AT_FILE_INJECT!=="0"}function _E(e,t={}){let n={fileBlocks:[],warnings:[]};if(!NK(t.env))return n;let r=[];for(let d of e.matchAll(PK)){let p=d[1];p&&r.push(p)}if(r.length===0)return n;let o=t.rootDir??process.cwd(),s=t.homeDir??_K(),i=OK.map(d=>lo(AE(s,d))),a=[],l=[],c=new Set,u=0;for(let d of r){let{scanDir:p,leafPrefix:f}=Hl(d,o,s),g=f?AE(p,f):p,h=lo(g);if(c.has(h))continue;if(c.add(h),DK(h,i)){l.push(`@${d}: sensitive path, not injected`);continue}let b;try{b=RK(h)}catch{l.push(`@${d}: not found, left as text`);continue}if(b.isDirectory()){l.push(`@${d}: is a directory, skipped`);continue}if(!b.isFile()){l.push(`@${d}: not a regular file, skipped`);continue}if(b.size>CK){l.push(`@${d}: too large (${Math.round(b.size/1024)} KB > 100 KB), skipped`);continue}if(u+b.size>IK){l.push(`@${d}: 400 KB total injection budget exceeded, skipped`);continue}let y;try{y=EK(h)}catch{l.push(`@${d}: could not read, skipped`);continue}if(y.includes(0)){l.push(`@${d}: binary file, skipped`);continue}u+=b.size;let w=FK(AK(h)),v=y.toString("utf8"),R=$K(v);a.push({type:"text",text:`Contents of ${d}:
2237
2237
  ${R}${w}
2238
2238
  ${v}
2239
- ${R}`})}return{fileBlocks:a,warnings:l}}async function CE(e,t,n,r,o="summary",s,i,a){let l=Sv(e.text,e.attachments);r.setInFlight(!0);let c="",u=!1,d=!1,p=!1,f=!1,g,h=!1,b=!1,y=0,w=15e3,v=[],R=new Map,S=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,E=r.getCompositor?r.getCompositor():null,_=()=>new Zo({out:Qo(s),thinkingMode:o,...S?{activeSkillName:S}:{},onCancel:()=>{t.interrupt().catch(A=>{je()&&console.error(" "+m.error("session.interrupt() failed:"),A)})},...i?{onBackground:()=>{h=!0}}:{},...a?.history?{history:a.history}:{},...a?.autocompleteState?{autocompleteState:a.autocompleteState}:{},...a?.promptText!==void 0?{promptText:a.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...E?{compositor:E}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),C=_(),I=async()=>{if(!p){p=!0;try{await C.dispose()}catch{}}},P=async()=>{await C.arm();let A=C.getCompositor();if(s&&A){let L=A;s.fn=O=>L.commitAbove(O)}r.setActiveCompositor?.(A),r.setInterruptNotifier?.(L=>C.setInterrupting(L)),r.rearmStatus?.()};try{E?E.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{b=!0}),await P(),i&&r.setBackgroundHandler&&r.setBackgroundHandler(()=>{h=!0});let{fileBlocks:A,warnings:L}=_E(e.text,{rootDir:process.cwd()});for(let F of L)(s??{fn:console.log}).fn(m.dim(` @-file: ${F}`));let O=A.length>0||e.attachments.length>0?RE(e.text,e.attachments,void 0,A):e.text,j=t.sendMessageStream(O);if(await oo((F,D)=>{C.process(F,D)},async()=>{for await(let F of j){if(b){t.interrupt().catch(D=>{je()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),D)});break}if(h&&i){let D=S??e.text.slice(0,40),x=i.register(D),M=Pl(x,i);Ml(j,c,l,x,i,M,n,r.onTurnComplete,t.abortSignal),await I(),(s??{fn:console.log}).fn(m.dim(` \u2192 backgrounded as ${x.id}: ${x.label}`)),r.setInFlight(!1),r.rearmStatus?.();return}if(F.type==="chunk"&&F.chunk.type==="content"?(c+=F.chunk.content,u=!0):F.type==="message"&&!u&&(c=F.message.content),F.type==="chunk"&&F.chunk.type==="tool_use_detail"){let D=F.chunk,x={toolName:D.toolName,toolUseId:D.toolUseId,input:D.toolInput};R.set(D.toolUseId,x),v.push(x)}else if(F.type==="chunk"&&F.chunk.type==="tool_result"){let D=F.chunk,x=R.get(D.toolUseId);if(x&&(x.result=D.content,x.isError=D.isError,R.delete(D.toolUseId)),r.onContextProgress){let M=Date.now();if(M-y>=w){y=M;try{let U=r.onContextProgress();U instanceof Promise&&await U}catch(U){je()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),U)}}}}if(F.type==="paused"){await I(),(s??{fn:console.log}).fn($g({reason:F.reason,...F.resetsAt!==void 0?{resetsAt:F.resetsAt}:{},...F.accountId!==void 0?{accountId:F.accountId}:{},...F.autoResume!==void 0?{autoResume:F.autoResume}:{}}));continue}if(F.type==="resumed"){let D=F.hotSwapped&&F.accountId?`\u25B6 Resumed on ${F.accountId}`:"\u25B6 Resumed";c="",u=!1,v.length=0,R.clear(),f=!1,g=void 0,d=!1,h=!1,C=_(),p=!1,await P(),(s??{fn:console.log}).fn(m.success(D));continue}if(F.type==="error"){await I(),eo(Xr(F.error)),d=!0;continue}C.process(F),F.type==="done"&&(f=!0,g=F.metadata)}}),await I(),b){let F=s?s.fn:console.log;F(m.warning("\u23F8 Stopped \u2014 work so far kept.")+m.dim(" Use /resume or --resume to continue.")),F("")}if(f&&!b){wr(n,l,c,g,v),r.onTurnComplete&&await r.onTurnComplete(l,c).catch(()=>{}),yl(process.stdout);let F=x=>{s?s.fn(x):console.log(x)},D=xE(c);if(D&&(F(EE(D)),F(""),r.onTerminalState))try{r.onTerminalState(D)}catch{}if(BK(g,n,F),r.onAfterTurn){let x=r.onAfterTurn();x instanceof Promise&&await x.catch(()=>{})}}}catch(A){await I(),d||eo(Xr(A))}finally{await I(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setInFlight(!1),r.rearmStatus?.()}}function BK(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ne(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Ne(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(re(o+s)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Cp(t),a=lt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);console.log(m.error(` context OVER ${c}k tok by ~${re(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 ${re(a)}`))}n("")}function IE(e={}){let t=e.load??Al,n=e.onResize??(i=>$e.subscribe(i)),r="",o,s=n(()=>{r=""});return{renderIfChanged(i){let a=i??"unbound",l=t(a),c=Lk(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:_l(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var tf={done:{glyph:"\u2713",color:m.success,label:"done"},blocked:{glyph:"\u2298",color:m.error,label:"blocked"},asking:{glyph:"?",color:m.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:m.meta,label:"interrupted"}};function PE(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,s=!1,i=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function u(g){let h=o();return Math.max(1,g-1-h)}function d(){if(!s||!r?.isTTY)return;let g=f(),h=c(),b=g!==null&&h>1?1:0;if(b!==i&&(i>0&&p(),i=b,a?.(i)),b===0)return;let y=u(h);r.write("\x1B[s"),r.write(`\x1B[${y};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function p(){if(!r?.isTTY)return;let g=c(),h=u(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=m.dim(" ledger "),h=m.dim(" \xB7 "),b=n.map(S=>{let E=tf[S];return E.color(`${E.glyph} ${E.label}`)}),y=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+b.join(h)+y,v=Math.max(20,Z()-2);if(q(w)<=v)return w;let R=g+n.map(S=>tf[S].color(tf[S].glyph)).join(m.dim(" "))+y;return se(R,v)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),d()},reset(){n=[],s&&i>0&&(p(),i=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){s||(s=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),i=0,l=$e.subscribe(()=>d()),d())},stop(){s&&(s=!1,l!==null&&(l(),l=null),i>0&&(p(),i=0,a?.(0)),r=null)},repaint(){d()}}}var nf=["\u25D0","\u25D1","\u25D2","\u25D3"],Wc=class{stream;manager;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;updateHandler=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;onRowCountChange;getAdjacentRows;constructor(t,n,r={}){this.manager=t,this.registry=n,this.stream=r.stream??process.stdout,this.throttleMs=r.throttleMs??200,this.getAdjacentRows=r.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||(this.started=!0,this.updateHandler=()=>this.scheduleRepaint(),this.manager.on("update",this.updateHandler),this.manager.on("complete",this.updateHandler),this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=$e.subscribe(()=>this.repaint()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%nf.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.updateHandler&&(this.manager.removeListener("update",this.updateHandler),this.manager.removeListener("complete",this.updateHandler),this.updateHandler=null),this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=[...this.manager.running().map(i=>({kind:"turn",task:i})),...(this.registry?.list()??[]).filter(i=>i.status==="running").map(i=>({kind:"subagent",job:i}))],n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let s=Math.max(1,n-o-r);this.stream.write("\x1B[s");for(let i=0;i<o;i++){let a=t[i],l=s+i;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let s=0;s<r;s++)this.stream.write(`\x1B[${o+s};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}formatItemLine(t){return t.kind==="turn"?this.formatTaskLine(t.task):this.formatJobLine(t.job)}formatTaskLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nf[this.spinnerIndex]),o=m.dim(t.id),s=m.bold(t.label),i=[r,o,s];t.progressDescription&&i.push(m.dim(t.progressDescription));let a=[];t.stats.toolUses>0&&a.push(`${t.stats.toolUses} tool${t.stats.toolUses===1?"":"s"}`),t.stats.tokens>0&&a.push(`${re(t.stats.tokens)} tok`);let l=Date.now()-t.startedAt;return a.push(ne(l)),a.length>0&&i.push(m.dim(a.join(" \xB7 "))),se(" "+i.join(" "),n)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nf[this.spinnerIndex]),o=m.dim(t.jobId),s=m.bold(t.label||t.jobId),i=[r,o,s],a=Date.now()-t.startedAt;return i.push(m.dim(ne(a))),se(" "+i.join(" "),n)}};import{spawn as UK}from"node:child_process";var jK=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function WK(){let e="";return{strip(t){let r=(e+t).replace(jK,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function ME(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var OE=12e4,$E=1e5;function rf(e){let t=Date.now(),n=e.timeoutMs??OE,r=e.maxBytes??$E,o=WK(),s;try{s=UK(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(S){let E=S instanceof Error?S.message:String(S);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${E}`})}}s.unref();let i,a=!1,l=new Promise(S=>{i=E=>{a||(a=!0,S(E))}}),c="",u="",d=0,p=0,f=!1,g=!1,h=!1;function b(S){let E=r-d;if(E>0){let _=S.length<=E?S:ME(S,E);d+=_.length,c+=_.toString("utf8"),S.length>E&&(f=!0)}else S.length>0&&(f=!0);if(p<r){let _=o.strip(S.toString("utf8")),C=Buffer.byteLength(_,"utf8"),I=r-p;if(C<=I)u+=_,p+=C;else{let P=Buffer.from(_,"utf8");u+=ME(P,I).toString("utf8"),p=r,f=!0}}}function y(){if(s.pid!==void 0&&s.pid!==0&&!s.killed)try{process.kill(-s.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{y(),e.abort.removeEventListener("abort",v),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),v=()=>{y(),clearTimeout(w),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",v);function R(){g||a||d<r&&p<r||(g=!0,y(),clearTimeout(w),e.abort.removeEventListener("abort",v),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return s.stdout?.on("data",S=>{b(S);try{e.onChunk?.(S,"stdout")}catch{}R()}),s.stderr?.on("data",S=>{b(S);try{e.onChunk?.(S,"stderr")}catch{}R()}),s.on("error",S=>{clearTimeout(w),e.abort.removeEventListener("abort",v),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${S.message}`})}),s.on("close",(S,E)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",v),!(g||a)){if(o.flush(),h){i({exitCode:S,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(S!==null&&S!==0){i({exitCode:S,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${S}`});return}if(S===null){i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"signal-killed",errorMessage:E?`Command killed by signal ${E}`:"Command killed by signal"});return}i({exitCode:S,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f})}}),{pid:s.pid,promise:l,kill:(S="SIGKILL")=>{if(!(s.pid===void 0||s.pid===0||s.killed)){h=!0;try{process.kill(-s.pid,S)}catch{}}}}}import{EventEmitter as HK}from"node:events";var DE=200,Pi=class extends HK{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=rf({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),s={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,s),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(i=>{s.result=i,s.status=KK(i),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",s)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:s,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=DE))for(let[t,n]of this.jobs){if(this.jobs.size<=DE)break;n.status!=="running"&&this.jobs.delete(t)}}};function KK(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function GK(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function zK(e,t){let n=ne(t.durationMs);return t.errorReason==="abort"?m.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?m.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?m.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?m.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?m.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?m.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):m.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function LE(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function qK(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${ne(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${LE(e)}</command>`),r.push("<output>"),r.push(LE(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
2239
+ ${R}`})}return{fileBlocks:a,warnings:l}}async function CE(e,t,n,r,o="summary",s,i,a){let l=Sv(e.text,e.attachments);r.setInFlight(!0);let c="",u=!1,d=!1,p=!1,f=!1,g,h=!1,b=!1,y=0,w=15e3,v=[],R=new Map,S=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,E=r.getCompositor?r.getCompositor():null,_=()=>new Zo({out:Qo(s),thinkingMode:o,...S?{activeSkillName:S}:{},onCancel:()=>{t.interrupt().catch(A=>{We()&&console.error(" "+m.error("session.interrupt() failed:"),A)})},...i?{onBackground:()=>{h=!0}}:{},...a?.history?{history:a.history}:{},...a?.autocompleteState?{autocompleteState:a.autocompleteState}:{},...a?.promptText!==void 0?{promptText:a.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...E?{compositor:E}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),C=_(),I=async()=>{if(!p){p=!0;try{await C.dispose()}catch{}}},P=async()=>{await C.arm();let A=C.getCompositor();if(s&&A){let L=A;s.fn=O=>L.commitAbove(O)}r.setActiveCompositor?.(A),r.setInterruptNotifier?.(L=>C.setInterrupting(L)),r.rearmStatus?.()};try{E?E.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{b=!0}),await P(),i&&r.setBackgroundHandler&&r.setBackgroundHandler(()=>{h=!0});let{fileBlocks:A,warnings:L}=_E(e.text,{rootDir:process.cwd()});for(let F of L)(s??{fn:console.log}).fn(m.dim(` @-file: ${F}`));let O=A.length>0||e.attachments.length>0?RE(e.text,e.attachments,void 0,A):e.text,j=t.sendMessageStream(O);if(await oo((F,D)=>{C.process(F,D)},async()=>{for await(let F of j){if(b){t.interrupt().catch(D=>{We()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),D)});break}if(h&&i){let D=S??e.text.slice(0,40),x=i.register(D),M=Pl(x,i);Ml(j,c,l,x,i,M,n,r.onTurnComplete,t.abortSignal),await I(),(s??{fn:console.log}).fn(m.dim(` \u2192 backgrounded as ${x.id}: ${x.label}`)),r.setInFlight(!1),r.rearmStatus?.();return}if(F.type==="chunk"&&F.chunk.type==="content"?(c+=F.chunk.content,u=!0):F.type==="message"&&!u&&(c=F.message.content),F.type==="chunk"&&F.chunk.type==="tool_use_detail"){let D=F.chunk,x={toolName:D.toolName,toolUseId:D.toolUseId,input:D.toolInput};R.set(D.toolUseId,x),v.push(x)}else if(F.type==="chunk"&&F.chunk.type==="tool_result"){let D=F.chunk,x=R.get(D.toolUseId);if(x&&(x.result=D.content,x.isError=D.isError,R.delete(D.toolUseId)),r.onContextProgress){let M=Date.now();if(M-y>=w){y=M;try{let U=r.onContextProgress();U instanceof Promise&&await U}catch(U){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),U)}}}}if(F.type==="paused"){await I(),(s??{fn:console.log}).fn($g({reason:F.reason,...F.resetsAt!==void 0?{resetsAt:F.resetsAt}:{},...F.accountId!==void 0?{accountId:F.accountId}:{},...F.autoResume!==void 0?{autoResume:F.autoResume}:{}}));continue}if(F.type==="resumed"){let D=F.hotSwapped&&F.accountId?`\u25B6 Resumed on ${F.accountId}`:"\u25B6 Resumed";c="",u=!1,v.length=0,R.clear(),f=!1,g=void 0,d=!1,h=!1,C=_(),p=!1,await P(),(s??{fn:console.log}).fn(m.success(D));continue}if(F.type==="error"){await I(),eo(Xr(F.error)),d=!0;continue}C.process(F),F.type==="done"&&(f=!0,g=F.metadata)}}),await I(),b){let F=s?s.fn:console.log;F(m.warning("\u23F8 Stopped \u2014 work so far kept.")+m.dim(" Use /resume or --resume to continue.")),F("")}if(f&&!b){wr(n,l,c,g,v),r.onTurnComplete&&await r.onTurnComplete(l,c).catch(()=>{}),yl(process.stdout);let F=x=>{s?s.fn(x):console.log(x)},D=xE(c);if(D&&(F(EE(D)),F(""),r.onTerminalState))try{r.onTerminalState(D)}catch{}if(BK(g,n,F),r.onAfterTurn){let x=r.onAfterTurn();x instanceof Promise&&await x.catch(()=>{})}}}catch(A){await I(),d||eo(Xr(A))}finally{await I(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setInFlight(!1),r.rearmStatus?.()}}function BK(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ne(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Be(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(re(o+s)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Cp(t),a=lt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);console.log(m.error(` context OVER ${c}k tok by ~${re(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 ${re(a)}`))}n("")}function IE(e={}){let t=e.load??Al,n=e.onResize??(i=>$e.subscribe(i)),r="",o,s=n(()=>{r=""});return{renderIfChanged(i){let a=i??"unbound",l=t(a),c=Lk(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:_l(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var tf={done:{glyph:"\u2713",color:m.success,label:"done"},blocked:{glyph:"\u2298",color:m.error,label:"blocked"},asking:{glyph:"?",color:m.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:m.meta,label:"interrupted"}};function PE(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,s=!1,i=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function u(g){let h=o();return Math.max(1,g-1-h)}function d(){if(!s||!r?.isTTY)return;let g=f(),h=c(),b=g!==null&&h>1?1:0;if(b!==i&&(i>0&&p(),i=b,a?.(i)),b===0)return;let y=u(h);r.write("\x1B[s"),r.write(`\x1B[${y};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function p(){if(!r?.isTTY)return;let g=c(),h=u(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=m.dim(" ledger "),h=m.dim(" \xB7 "),b=n.map(S=>{let E=tf[S];return E.color(`${E.glyph} ${E.label}`)}),y=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+b.join(h)+y,v=Math.max(20,Z()-2);if(q(w)<=v)return w;let R=g+n.map(S=>tf[S].color(tf[S].glyph)).join(m.dim(" "))+y;return se(R,v)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),d()},reset(){n=[],s&&i>0&&(p(),i=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){s||(s=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),i=0,l=$e.subscribe(()=>d()),d())},stop(){s&&(s=!1,l!==null&&(l(),l=null),i>0&&(p(),i=0,a?.(0)),r=null)},repaint(){d()}}}var nf=["\u25D0","\u25D1","\u25D2","\u25D3"],Wc=class{stream;manager;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;updateHandler=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;onRowCountChange;getAdjacentRows;constructor(t,n,r={}){this.manager=t,this.registry=n,this.stream=r.stream??process.stdout,this.throttleMs=r.throttleMs??200,this.getAdjacentRows=r.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||(this.started=!0,this.updateHandler=()=>this.scheduleRepaint(),this.manager.on("update",this.updateHandler),this.manager.on("complete",this.updateHandler),this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=$e.subscribe(()=>this.repaint()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%nf.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.updateHandler&&(this.manager.removeListener("update",this.updateHandler),this.manager.removeListener("complete",this.updateHandler),this.updateHandler=null),this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=[...this.manager.running().map(i=>({kind:"turn",task:i})),...(this.registry?.list()??[]).filter(i=>i.status==="running").map(i=>({kind:"subagent",job:i}))],n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let s=Math.max(1,n-o-r);this.stream.write("\x1B[s");for(let i=0;i<o;i++){let a=t[i],l=s+i;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let s=0;s<r;s++)this.stream.write(`\x1B[${o+s};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}formatItemLine(t){return t.kind==="turn"?this.formatTaskLine(t.task):this.formatJobLine(t.job)}formatTaskLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nf[this.spinnerIndex]),o=m.dim(t.id),s=m.bold(t.label),i=[r,o,s];t.progressDescription&&i.push(m.dim(t.progressDescription));let a=[];t.stats.toolUses>0&&a.push(`${t.stats.toolUses} tool${t.stats.toolUses===1?"":"s"}`),t.stats.tokens>0&&a.push(`${re(t.stats.tokens)} tok`);let l=Date.now()-t.startedAt;return a.push(ne(l)),a.length>0&&i.push(m.dim(a.join(" \xB7 "))),se(" "+i.join(" "),n)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nf[this.spinnerIndex]),o=m.dim(t.jobId),s=m.bold(t.label||t.jobId),i=[r,o,s],a=Date.now()-t.startedAt;return i.push(m.dim(ne(a))),se(" "+i.join(" "),n)}};import{spawn as UK}from"node:child_process";var jK=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function WK(){let e="";return{strip(t){let r=(e+t).replace(jK,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function ME(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var OE=12e4,$E=1e5;function rf(e){let t=Date.now(),n=e.timeoutMs??OE,r=e.maxBytes??$E,o=WK(),s;try{s=UK(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(S){let E=S instanceof Error?S.message:String(S);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${E}`})}}s.unref();let i,a=!1,l=new Promise(S=>{i=E=>{a||(a=!0,S(E))}}),c="",u="",d=0,p=0,f=!1,g=!1,h=!1;function b(S){let E=r-d;if(E>0){let _=S.length<=E?S:ME(S,E);d+=_.length,c+=_.toString("utf8"),S.length>E&&(f=!0)}else S.length>0&&(f=!0);if(p<r){let _=o.strip(S.toString("utf8")),C=Buffer.byteLength(_,"utf8"),I=r-p;if(C<=I)u+=_,p+=C;else{let P=Buffer.from(_,"utf8");u+=ME(P,I).toString("utf8"),p=r,f=!0}}}function y(){if(s.pid!==void 0&&s.pid!==0&&!s.killed)try{process.kill(-s.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{y(),e.abort.removeEventListener("abort",v),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),v=()=>{y(),clearTimeout(w),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",v);function R(){g||a||d<r&&p<r||(g=!0,y(),clearTimeout(w),e.abort.removeEventListener("abort",v),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return s.stdout?.on("data",S=>{b(S);try{e.onChunk?.(S,"stdout")}catch{}R()}),s.stderr?.on("data",S=>{b(S);try{e.onChunk?.(S,"stderr")}catch{}R()}),s.on("error",S=>{clearTimeout(w),e.abort.removeEventListener("abort",v),i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${S.message}`})}),s.on("close",(S,E)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",v),!(g||a)){if(o.flush(),h){i({exitCode:S,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(S!==null&&S!==0){i({exitCode:S,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${S}`});return}if(S===null){i({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"signal-killed",errorMessage:E?`Command killed by signal ${E}`:"Command killed by signal"});return}i({exitCode:S,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f})}}),{pid:s.pid,promise:l,kill:(S="SIGKILL")=>{if(!(s.pid===void 0||s.pid===0||s.killed)){h=!0;try{process.kill(-s.pid,S)}catch{}}}}}import{EventEmitter as HK}from"node:events";var DE=200,Pi=class extends HK{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=rf({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),s={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,s),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(i=>{s.result=i,s.status=KK(i),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",s)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:s,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=DE))for(let[t,n]of this.jobs){if(this.jobs.size<=DE)break;n.status!=="running"&&this.jobs.delete(t)}}};function KK(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function GK(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function zK(e,t){let n=ne(t.durationMs);return t.errorReason==="abort"?m.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?m.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?m.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?m.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?m.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?m.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):m.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function LE(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function qK(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${ne(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${LE(e)}</command>`),r.push("<output>"),r.push(LE(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
2240
2240
  `)}var Hc=class e{constructor(t){this.opts=t;this.registry.on("complete",n=>{if(n.mode!=="background")return;let r=n.result;r&&(this.queueInjection({command:n.command,mode:"background",result:r}),this.pendingNotifications.push({job:n,result:r}),this.pendingNotifications.length>e.MAX_PENDING_NOTIFICATIONS&&this.pendingNotifications.shift())})}opts;registry=new Pi;pendingInjections=[];pendingNotifications=[];activeFgJobId=null;static MAX_PENDING_INJECTIONS=25;static MAX_PENDING_NOTIFICATIONS=50;async dispatch(t){let n=GK(t);return n===null?t==="!"||t==="!&"||t.startsWith("! ")||t.startsWith("!& ")?(this.opts.writeLine(m.dim(" usage: !<cmd> (foreground) !&<cmd> (background)")),!0):!1:(n.mode==="foreground"?await this.runForeground(n.command):this.startBackground(n.command),!0)}drainInjections(){if(this.pendingInjections.length===0)return"";let t=this.pendingInjections.map(n=>qK(n.command,n.mode,n.result));return this.pendingInjections=[],t.join(`
2241
2241
  `)+`
2242
2242
  `}drainNotifications(){if(this.pendingNotifications.length===0)return[];let t=this.pendingNotifications;return this.pendingNotifications=[],t}abortActiveForeground(){return this.activeFgJobId===null?!1:(this.registry.kill(this.activeFgJobId),!0)}hasActiveForeground(){return this.activeFgJobId!==null}drainOnExit(){let t=this.registry.killAll();t.length>0&&this.opts.writeLine(m.dim(` Killing ${t.length} background shell job${t.length===1?"":"s"} on exit.`))}async runForeground(t){this.opts.writeLine(m.dim(`$ ${t}`));let n="",r=!1,o=()=>{let c;for(;(c=n.indexOf(`
2243
- `))!==-1;){let u=n.slice(0,c);n=n.slice(c+1),this.opts.writeLine(u)}},s={command:t,mode:"foreground",onChunk:c=>{r||(n+=c.toString("utf8"),o())}},i=this.opts.getCwd();i!==void 0&&(s.cwd=i);let{job:a,handle:l}=this.registry.start(s);this.activeFgJobId=a.id;try{let c=await l.promise;r=!0,n.length>0&&(this.opts.writeLine(n),n=""),this.opts.writeLine(zK(a,c)),this.queueInjection({command:t,mode:"foreground",result:c})}finally{this.activeFgJobId=null}}startBackground(t){let n={command:t,mode:"background"},r=this.opts.getCwd();r!==void 0&&(n.cwd=r);let{job:o}=this.registry.start(n);this.opts.writeLine(m.dim(` [${o.id}] background: `)+t)}queueInjection(t){this.pendingInjections.push(t),this.pendingInjections.length>e.MAX_PENDING_INJECTIONS&&this.pendingInjections.shift()}};function JK(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 VK(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)))}}}function Kc(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function FE(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async v=>{je()&&(o=Tl(v)),await hc(e.session.current),je()&&(s=Ax())}).catch(()=>{});let i=await yE(),a=new jc({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,p,f,g,h=!1,b=!1,y=Fv({onError:v=>V("[afk suggest] Tier-2 completion failed:",v)}),w=JK(T.AFK_SUGGEST_GHOST,e.suggestGhostConfig);try{await a.armCompositor({promptFn:()=>Kc(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let A=e.slashCtx;A.stats.planMode&&A.stats.pendingPlanExit?(A.stats.pendingPlanExit=!1,Pt(A,!1,{closureSummarySkipped:!0}).catch(()=>{})):Pt(A).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...w?{suggest:{engine:y,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let A=a.history;return A.getEntries?[...A.getEntries()]:[]},getDropdownTopCandidate:A=>{let O=a.autocompleteState.candidates[0];return O&&O.value.startsWith(A)&&O.value.length>A.length?O.value:null},getTranscriptTail:()=>"",getRecentCommands:()=>[],llmEnabled:()=>/^(1|true|yes|on)$/i.test(T.AFK_SUGGEST_ENABLED??"")})}}:{}});let v=a.getCompositor();Wt.install(wl({readLine:A=>a.readLine({promptFn:()=>A}).then(L=>L.text),writer:{line:(A="")=>{let L=a.getCompositor();L?L.commitAbove(A):process.stdout.write(A+`
2243
+ `))!==-1;){let u=n.slice(0,c);n=n.slice(c+1),this.opts.writeLine(u)}},s={command:t,mode:"foreground",onChunk:c=>{r||(n+=c.toString("utf8"),o())}},i=this.opts.getCwd();i!==void 0&&(s.cwd=i);let{job:a,handle:l}=this.registry.start(s);this.activeFgJobId=a.id;try{let c=await l.promise;r=!0,n.length>0&&(this.opts.writeLine(n),n=""),this.opts.writeLine(zK(a,c)),this.queueInjection({command:t,mode:"foreground",result:c})}finally{this.activeFgJobId=null}}startBackground(t){let n={command:t,mode:"background"},r=this.opts.getCwd();r!==void 0&&(n.cwd=r);let{job:o}=this.registry.start(n);this.opts.writeLine(m.dim(` [${o.id}] background: `)+t)}queueInjection(t){this.pendingInjections.push(t),this.pendingInjections.length>e.MAX_PENDING_INJECTIONS&&this.pendingInjections.shift()}};function JK(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 VK(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)))}}}function Kc(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function FE(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async v=>{We()&&(o=Tl(v)),await hc(e.session.current),We()&&(s=Ax())}).catch(()=>{});let i=await yE(),a=new jc({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,p,f,g,h=!1,b=!1,y=Fv({onError:v=>V("[afk suggest] Tier-2 completion failed:",v)}),w=JK(T.AFK_SUGGEST_GHOST,e.suggestGhostConfig);try{await a.armCompositor({promptFn:()=>Kc(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let A=e.slashCtx;A.stats.planMode&&A.stats.pendingPlanExit?(A.stats.pendingPlanExit=!1,Pt(A,!1,{closureSummarySkipped:!0}).catch(()=>{})):Pt(A).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...w?{suggest:{engine:y,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let A=a.history;return A.getEntries?[...A.getEntries()]:[]},getDropdownTopCandidate:A=>{let O=a.autocompleteState.candidates[0];return O&&O.value.startsWith(A)&&O.value.length>A.length?O.value:null},getTranscriptTail:()=>"",getRecentCommands:()=>[],llmEnabled:()=>/^(1|true|yes|on)$/i.test(T.AFK_SUGGEST_ENABLED??"")})}}:{}});let v=a.getCompositor();Wt.install(wl({readLine:A=>a.readLine({promptFn:()=>A}).then(L=>L.text),writer:{line:(A="")=>{let L=a.getCompositor();L?L.commitAbove(A):process.stdout.write(A+`
2244
2244
  `)}},pendingCount:()=>Wt.pendingCount(),...v?{pickFromList:A=>vE(v,A),readTextOverlay:A=>TE(v,A)}:{}})),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor();let R=a.getCompositor();if(R){let A=L=>R.commitAbove(L);e.completionWriter.fn=A,e.completionWriter.idleFn=A}e.slashCtx.setSoftStopHandler=A=>a.setSoftStopHandler(A),e.inputSurfaceRef&&(e.inputSurfaceRef.current=a),c=IE(),g=PE(),e.clearVerdictLedger=()=>g?.reset(),u=new Il,Zk(u),av(u),uv(u),lv(e.backgroundRegistry);let S=0,E=0,_=1,C=()=>e.statusLine.setExtraRows(_+S+E);g.setRowCountChangeHandler(A=>{E=A,C(),d?.redraw(),p?.redraw()}),d=new Wc(u,e.backgroundRegistry,{getAdjacentRows:()=>E}),d.setRowCountChangeHandler(A=>{S=A,C()}),p=new Ql({getExtraRows:()=>e.statusLine.getExtraRows()}),p.setRowCountChangeHandler(A=>{C()}),e.statusLine.setAfterScrollRestore(()=>{g?.repaint(),d?.redraw(),p?.redraw()}),d.start(),p.start(),g.start({stream:process.stdout});let I=50,P=[];for(u.on("complete",A=>{P.length>=I&&P.shift(),P.push(A)}),f=new Hc({writeLine:A=>e.replRenderer.writeLine(A),getCwd:()=>e.stats.cwd}),sv(f),n.tryAbortShellForeground=()=>f.abortActiveForeground();;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let x of s)e.replRenderer.writeLine(x);e.replRenderer.writeLine(""),s=[]}for(;P.length>0;){let x=P.shift(),M=x.status==="succeeded"?"\u2713":"\u2717",U=[];if(x.resultText){let K=x.resultText.trim().split(`
2245
- `)[0]?.slice(0,80)??"";K&&U.push(K)}x.error&&U.push(x.error.message);let J=[x.stats.toolUses>0?`${x.stats.toolUses} tools`:"",x.stats.tokens>0?`${Math.round(x.stats.tokens/1e3)}k tok`:"",x.stats.durationMs>0?`${Math.round(x.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");J&&U.push(J),e.replRenderer.writeLine(Mn({kind:x.status==="succeeded"?"checkpoint":"diagnosis",title:`${M} ${x.id} ${x.label}`,body:U})),e.replRenderer.writeLine("")}let A=f.drainNotifications();for(let{job:x,result:M}of A){let U=M.errorReason===void 0?"\u2713":"\u2717",J=M.errorReason==="abort"?"killed":M.errorReason==="timeout"?"timed out":M.errorReason==="signal-killed"?"killed by signal":`exit ${M.exitCode??0}`,K=Math.max(0,Math.round(M.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${U} [${x.id}] ${J} \xB7 ${K}s \xB7 `)+x.command)}let L=c.renderIfChanged(e.stats.sessionId);if(L.length>0){for(let x of L)e.replRenderer.writeLine(x);e.replRenderer.writeLine("")}let O,j;if(l!==void 0){let x=l;l=void 0;let M=Kc(e.stats.model,e.stats.planMode),U=Er({buffer:x.text,promptText:M,isTTY:!!process.stdout.isTTY,attachmentSummary:Ho([...x.attachments])});e.replRenderer.writeLine(U),O=x.text.trim(),j=x.attachments}else{let x=await a.readLine({promptFn:()=>Kc(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{let M=e.slashCtx;M.stats.planMode&&M.stats.pendingPlanExit?(M.stats.pendingPlanExit=!1,Pt(M,!1,{closureSummarySkipped:!0}).catch(()=>{})):Pt(M).catch(()=>{}),e.statusLine.rearm()}});O=x.text.trim(),j=x.attachments}if(!O&&j.length===0)continue;if(O.startsWith("!")){let x=/^(0|false|off|no)$/i.test(T.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!x&&(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 f.dispatch(O))){e.statusLine.rearm();continue}}let B=!1;if(O.startsWith("/")){let x=await mk(O,e.slashCtx,j);if(x.handled){if(x.result==="exit"){e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),g.reset()),x.result!==null&&typeof x.result=="object"&&"kind"in x.result&&x.result.kind==="submit"){l={text:x.result.message,attachments:j??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}i.push(O),await VK(e,O);let F=O;if(B){let x=_p(O);if(x){let M=x.name.replace(/^\//,"").split(":").pop()??"";if(M&&Im(M)){let U={skillName:M,rawArgs:x.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},J=e.session.current.sessionId,K=Dr(J),N=Date.now();V(`[afk trace] preflight.start commandName=${M}`);let Y=!1,be=await $r(U,{cwd:e.stats.cwd??process.cwd(),artifactDir:K},Be=>{je()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${M}) failed: `)+(Be instanceof Error?Be.message:String(Be)))});Y=be!==null,V(`[afk trace] preflight.end commandName=${M} durationMs=${Date.now()-N} success=${Y}`),F=Om(be?.manifestBlock,O)}}}let D=f.drainInjections();D.length>0&&(F=D+F),await CE({text:F,attachments:j},e.session.current,e.stats,{setInFlight(x){n.turnInFlight=x},async onTurnComplete(x,M){if(await t.appendTurn(x,M),e.stats.sessionId)try{qt(e.stats)}catch(U){b||(b=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(U instanceof Error?U.message:String(U))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await Ak(e.slashCtx),e.statusLine.rearm(),p?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:x=>g?.push(x),setActiveCompositor:x=>{n.activeCompositor=x},setInterruptNotifier:x=>{n.notifyInterrupting=x},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:x=>a.setBackgroundHandler(x),setSoftStopHandler:x=>a.setSoftStopHandler(x),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(xr(e.stats,e.contextSampler))},...p?{onStageChange:x=>p.repaint(x)}:{}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(Kc(e.stats.model,e.stats.planMode)))}}finally{if(u!==void 0)for(let R of u.running())u.cancel(R.id);n.tryAbortShellForeground=null,f?.drainOnExit(),p?.stop(),d?.stop(),g?.stop(),c?.dispose();let v=R=>console.log(R);e.completionWriter.fn=v,e.completionWriter.idleFn=v,await a.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}import{execFile as YK}from"node:child_process";import{dirname as XK,isAbsolute as ZK,resolve as QK}from"node:path";import{promisify as eG}from"node:util";var NE=eG(YK),tG=3e3,nG=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function rG(){let t=(await NE("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=ZK(t)?t:QK(process.cwd(),t);return XK(n)}async function BE(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await rG()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),tG)});try{let o=Xt({execFile:NE,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=>nG.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as oG}from"node:fs";import{dirname as sG,join as WE}from"node:path";import{randomBytes as iG}from"node:crypto";var aG=["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(`
2246
- `),UE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,of=30,lG=1024,cG=8e3,uG="haiku";async function dG(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=gG(n,lG),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??cG),i=t.signal?hG([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await ro({token:t.token,model:t.model??uG,system:aG,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=pG(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=sG(t.worktreePath);return await mG(l,c)}function pG(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(UE.test(t)&&t.length<=of)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>of)break;o=i}return UE.test(o)?o:null}async function mG(e,t){if(!await fG(WE(t,e)))return e;let n=iG(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,of-5)}-${n}`}async function fG(e){try{return await oG.access(e),!0}catch{return!1}}function gG(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 hG(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 HE(e){let t,n,r=WE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await dG(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=`${qa(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return jE(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 jE(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 jE(e,t){e&&e.setCwd(t),yG(t)}function yG(e){try{process.chdir(e)}catch{}}H();import{spawn as KE}from"child_process";import{existsSync as vG,mkdirSync as TG,readFileSync as GE,unlinkSync as xG,writeFileSync as EG}from"fs";import{get as RG}from"https";import{join as zE}from"path";import{readFileSync as bG}from"fs";import{dirname as wG,join as SG}from"path";import{fileURLToPath as kG}from"url";function xn(){try{return"3.76.0"}catch{}try{let e=wG(kG(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(bG(SG(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var AG=64*1024,_G=1440*60*1e3,CG="update-check.json",IG="pending-update.json";function qE(){return zE(Vi(),CG)}function sf(){return zE(Vi(),IG)}function JE(){let e=Vi();vG(e)||TG(e,{recursive:!0})}function PG(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function MG(){try{let e=GE(qE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function OG(){try{JE();let e=`
2245
+ `)[0]?.slice(0,80)??"";K&&U.push(K)}x.error&&U.push(x.error.message);let J=[x.stats.toolUses>0?`${x.stats.toolUses} tools`:"",x.stats.tokens>0?`${Math.round(x.stats.tokens/1e3)}k tok`:"",x.stats.durationMs>0?`${Math.round(x.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");J&&U.push(J),e.replRenderer.writeLine(Mn({kind:x.status==="succeeded"?"checkpoint":"diagnosis",title:`${M} ${x.id} ${x.label}`,body:U})),e.replRenderer.writeLine("")}let A=f.drainNotifications();for(let{job:x,result:M}of A){let U=M.errorReason===void 0?"\u2713":"\u2717",J=M.errorReason==="abort"?"killed":M.errorReason==="timeout"?"timed out":M.errorReason==="signal-killed"?"killed by signal":`exit ${M.exitCode??0}`,K=Math.max(0,Math.round(M.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${U} [${x.id}] ${J} \xB7 ${K}s \xB7 `)+x.command)}let L=c.renderIfChanged(e.stats.sessionId);if(L.length>0){for(let x of L)e.replRenderer.writeLine(x);e.replRenderer.writeLine("")}let O,j;if(l!==void 0){let x=l;l=void 0;let M=Kc(e.stats.model,e.stats.planMode),U=Er({buffer:x.text,promptText:M,isTTY:!!process.stdout.isTTY,attachmentSummary:Ho([...x.attachments])});e.replRenderer.writeLine(U),O=x.text.trim(),j=x.attachments}else{let x=await a.readLine({promptFn:()=>Kc(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{let M=e.slashCtx;M.stats.planMode&&M.stats.pendingPlanExit?(M.stats.pendingPlanExit=!1,Pt(M,!1,{closureSummarySkipped:!0}).catch(()=>{})):Pt(M).catch(()=>{}),e.statusLine.rearm()}});O=x.text.trim(),j=x.attachments}if(!O&&j.length===0)continue;if(O.startsWith("!")){let x=/^(0|false|off|no)$/i.test(T.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!x&&(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 f.dispatch(O))){e.statusLine.rearm();continue}}let B=!1;if(O.startsWith("/")){let x=await mk(O,e.slashCtx,j);if(x.handled){if(x.result==="exit"){e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),g.reset()),x.result!==null&&typeof x.result=="object"&&"kind"in x.result&&x.result.kind==="submit"){l={text:x.result.message,attachments:j??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}i.push(O),await VK(e,O);let F=O;if(B){let x=_p(O);if(x){let M=x.name.replace(/^\//,"").split(":").pop()??"";if(M&&Im(M)){let U={skillName:M,rawArgs:x.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},J=e.session.current.sessionId,K=Dr(J),N=Date.now();V(`[afk trace] preflight.start commandName=${M}`);let Y=!1,be=await $r(U,{cwd:e.stats.cwd??process.cwd(),artifactDir:K},Ue=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${M}) failed: `)+(Ue instanceof Error?Ue.message:String(Ue)))});Y=be!==null,V(`[afk trace] preflight.end commandName=${M} durationMs=${Date.now()-N} success=${Y}`),F=Om(be?.manifestBlock,O)}}}let D=f.drainInjections();D.length>0&&(F=D+F),await CE({text:F,attachments:j},e.session.current,e.stats,{setInFlight(x){n.turnInFlight=x},async onTurnComplete(x,M){if(await t.appendTurn(x,M),e.stats.sessionId)try{qt(e.stats)}catch(U){b||(b=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(U instanceof Error?U.message:String(U))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await Ak(e.slashCtx),e.statusLine.rearm(),p?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:x=>g?.push(x),setActiveCompositor:x=>{n.activeCompositor=x},setInterruptNotifier:x=>{n.notifyInterrupting=x},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:x=>a.setBackgroundHandler(x),setSoftStopHandler:x=>a.setSoftStopHandler(x),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(xr(e.stats,e.contextSampler))},...p?{onStageChange:x=>p.repaint(x)}:{}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(Kc(e.stats.model,e.stats.planMode)))}}finally{if(u!==void 0)for(let R of u.running())u.cancel(R.id);n.tryAbortShellForeground=null,f?.drainOnExit(),p?.stop(),d?.stop(),g?.stop(),c?.dispose();let v=R=>console.log(R);e.completionWriter.fn=v,e.completionWriter.idleFn=v,await a.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}import{execFile as YK}from"node:child_process";import{dirname as XK,isAbsolute as ZK,resolve as QK}from"node:path";import{promisify as eG}from"node:util";var NE=eG(YK),tG=3e3,nG=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function rG(){let t=(await NE("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=ZK(t)?t:QK(process.cwd(),t);return XK(n)}async function BE(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await rG()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),tG)});try{let o=Xt({execFile:NE,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=>nG.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as oG}from"node:fs";import{dirname as sG,join as WE}from"node:path";import{randomBytes as iG}from"node:crypto";var aG=["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(`
2246
+ `),UE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,of=30,lG=1024,cG=8e3,uG="haiku";async function dG(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=gG(n,lG),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??cG),i=t.signal?hG([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await ro({token:t.token,model:t.model??uG,system:aG,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=pG(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=sG(t.worktreePath);return await mG(l,c)}function pG(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(UE.test(t)&&t.length<=of)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>of)break;o=i}return UE.test(o)?o:null}async function mG(e,t){if(!await fG(WE(t,e)))return e;let n=iG(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,of-5)}-${n}`}async function fG(e){try{return await oG.access(e),!0}catch{return!1}}function gG(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 hG(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 HE(e){let t,n,r=WE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await dG(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=`${qa(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return jE(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 jE(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 jE(e,t){e&&e.setCwd(t),yG(t)}function yG(e){try{process.chdir(e)}catch{}}H();import{spawn as KE}from"child_process";import{existsSync as vG,mkdirSync as TG,readFileSync as GE,unlinkSync as xG,writeFileSync as EG}from"fs";import{get as RG}from"https";import{join as zE}from"path";import{readFileSync as bG}from"fs";import{dirname as wG,join as SG}from"path";import{fileURLToPath as kG}from"url";function xn(){try{return"3.77.0"}catch{}try{let e=wG(kG(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(bG(SG(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var AG=64*1024,_G=1440*60*1e3,CG="update-check.json",IG="pending-update.json";function qE(){return zE(Vi(),CG)}function sf(){return zE(Vi(),IG)}function JE(){let e=Vi();vG(e)||TG(e,{recursive:!0})}function PG(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function MG(){try{let e=GE(qE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function OG(){try{JE();let e=`
2247
2247
  const https = require('https');
2248
2248
  const fs = require('fs');
2249
2249
  const url = 'https://registry.npmjs.org/agent-afk/latest';
@@ -2273,13 +2273,13 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
2273
2273
  `),process.exitCode=1;return}let r=ot(),o=T.AFK_WORKTREE_BRANCH_PREFIX??r.interactive?.worktreeBranchPrefix,s=t.worktreeBase??T.AFK_WORKTREE_BASE??r.interactive?.worktreeBase,i={};o!==void 0&&(i.branchPrefix=o),s!==void 0&&(i.baseRef=s);let a=Object.keys(i).length>0?i:void 0,l=T.AFK_WORKTREE_BOOT_PRUNE==="0",c=await BE({disabled:l}),u=FG(t,r),d=pe(),p=t.worktree===!0&&u&&d!==void 0,f,g,h;if(t.worktree!==void 0)try{p?(h=await pw(a),n.text="Worktree will be named from your first message"):(g=await Ja(t.worktree,a),f=g.path,n.text=`Worktree ready at ${g.path} (branch: ${g.branch})`)}catch(D){n.fail("Worktree setup failed"),z(D)}let b=c.ran&&c.removedCount>0?`Pruned ${c.removedCount} stale worktree(s). Run /worktree list for details.`:void 0,y;try{y=await uE(t,f!==void 0?{cwd:f}:void 0)}catch(D){n.fail("Invalid options"),z(D)}if(h!==void 0&&d!==void 0){let D=h,x=d;y.firstTurnHook=async M=>{let U=XE({text:"Naming & creating worktree\u2026",...ni}).start(),J=await HE({deferred:D,message:M,token:x,session:y.session.current,...o!==void 0?{branchPrefix:o}:{}}).finally(()=>U.stop());if(J.status==="created"||J.status==="created-fallback"){g=D.handle(),y.stats.cwd=J.path;let K=Ur.relative(process.cwd(),J.path)||J.path;if(J.status==="created")console.log(m.dim(" \u21AA worktree: ")+`${K} `+m.dim(`(branch: ${J.branch})`));else{let N=LG(J.reason,J.detail),Y=N!==void 0?m.dim(` \u2014 ${N}`):"";console.log(m.dim(" \u21AA worktree: ")+`${K} `+m.dim(`(branch: ${J.branch})`)+Y)}}else console.warn(m.warning("\u26A0 ")+`Worktree creation failed: ${J.reason}. `+m.dim(`Continuing in ${ti(process.cwd(),{maxWidth:60})} (no isolation).`))}}Sr(async()=>{y.teardownTrustedSkillEvents?.(),Wt.uninstall(),y.bgSummarizer?.stop(),await y.backgroundRegistry.cancelAll().catch(()=>{}),await y.session.current.close(),y.mcpManager&&await y.mcpManager.disconnectAll(),y.memoryStore.close(),g!==void 0&&await g.cleanup({force:y.stats.totalTurns===0})}),n.succeed("Session ready"),g!==void 0?console.log(m.dim(" \u21AA worktree: ")+m.dim(ti(g.path,{maxWidth:60}))+m.dim(` (branch: ${g.branch})`)):h!==void 0&&console.log(m.dim(" \u21AA worktree: named & created from your first message"));let w=await mE(()=>y.stats.model);console.log(m.dim(` transcript: ${w.path()}`)),Sr(async()=>{await w.appendEnded()});let v=!1,R=()=>{if(y.stats.totalTurns===0)return;let D=qt(y.stats);return v=!0,D};Sr(async()=>{if(!v)try{R()}catch{}});let S={turnInFlight:!1,lastSigintAt:0};y.getInFlight=()=>S.turnInFlight;let E=1500,_=()=>{let D=Date.now();if(S.tryAbortShellForeground&&S.tryAbortShellForeground()){S.lastSigintAt=D;return}if(S.turnInFlight){y.session.current.interrupt().catch(()=>{}),S.lastSigintAt=D,S.notifyInterrupting?.(!0);let x=`
2274
2274
  `+m.warning("\u26A0 Interrupted. Press Ctrl+C again to exit."),M=S.activeCompositor;if(M&&M.isArmed())try{M.commitAbove(x)}catch{console.log(x)}else console.log(x);return}if(D-S.lastSigintAt<E){y.session.current?.abort("sigint"),y.rl.close();return}S.lastSigintAt=D,console.log(`
2275
2275
  `+m.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",_),Sr(async()=>{process.removeListener("SIGINT",_)});let C=!1,I=()=>{if(C)return;C=!0,y.session.current?.abort("sigterm");try{y.rl.close()}catch{}setTimeout(()=>{hl().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGTERM",I),Sr(async()=>{process.removeListener("SIGTERM",I)});let P=!1,A=()=>{if(P)return;P=!0,y.session.current?.abort("sighup");try{y.rl.close()}catch{}setTimeout(()=>{hl().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGHUP",A),Sr(async()=>{process.removeListener("SIGHUP",A)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H");let L=1,O=process.stdout.write.bind(process.stdout),j=process.stderr.write.bind(process.stderr),B=D=>(typeof D=="string"?D:D instanceof Uint8Array?Buffer.from(D).toString("utf8"):String(D)).match(/\n/g)?.length??0,F=D=>((x,...M)=>(L+=B(x),D(x,...M)));process.stdout.write=F(O),process.stderr.write=F(j);try{if(zc!==null){let{updateInfo:x,pendingMessage:M}=zc;zc=null,M!==null&&process.stderr.write(M),x!==null&&Gc(x)}let D=y.resumeTarget?`Resuming ${y.resumeTarget.id} \xB7 ${y.stats.totalTurns} prior turn${y.stats.totalTurns===1?"":"s"}`:void 0;console.log(`
2276
- `+Pg({mode:"Interactive Mode",model:y.stats.model,version:xn(),...g!==void 0?{worktree:g.branch}:{},cwd:f??process.cwd(),...D!==void 0?{metaLine:D}:{},hintLine:"/help \xB7 /model \xB7 /resume \xB7 Esc to interrupt \xB7 /exit to quit"})),b!==void 0&&console.log(m.dim(` ${b}`)),y.resumeTarget&&vl(y.stats,y.completionWriter),console.log()}finally{process.stdout.write=O,process.stderr.write=j}y.preArmAnchorRow=L,y.statusLine.start(),y.slashCtx.ui.repaintStatusLine(),y.rl.on("close",async()=>{y.statusLine.stop(),NG(y,g,R),console.log(m.info("\u2139 ")+"Goodbye!"),await hl(),process.exit(0)}),await FE(y,w,S,_)})}function NG(e,t,n){if(e.stats.totalTurns===0)return;console.log(ye("Session Summary"));let r=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,ne(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&r.push(Ne(e.stats.totalCostUsd)),e.stats.totalTokens>0&&r.push(re(e.stats.totalTokens)+" tokens"),console.log(m.dim(" "+r.join(" \xB7 ")));let o=t?Ur.basename(t.path):"none";console.log(m.dim(` model: ${e.stats.model} \xB7 worktree: ${o}`));try{let i=e.stats.cwd??process.cwd(),l=$G("git",["diff","--shortstat","HEAD"],{cwd:i,encoding:"utf8",timeout:2e3}).trim();console.log(m.dim(` edits: ${l||"no files changed"}`))}catch{}let s=e.stats.sessionId;try{let i=n();!s&&i&&(s=Ur.basename(i,".json"))}catch{}s&&console.log(m.dim(" Continue with: ")+m.brand(Jt(s,e.stats.model))),console.log()}G();import BG from"ora";function tR(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=BG("Checking status...").start();try{let r=Qe(),o=fe(r),s=Ze(r),i=o==="openai-compatible"||o==="openai-codex";if(await new Ye({model:i?"gpt-4o-mini":"haiku",...s!==void 0?{apiKey:s}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`),t.format==="json"){let l=pe(),c=Ya(),u=l?T.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,d=c?T.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!l,source:u},codex:{ok:!!c,source:d}},model:String(r),bypass:!0},null,2))}else console.log(`
2276
+ `+Pg({mode:"Interactive Mode",model:y.stats.model,version:xn(),...g!==void 0?{worktree:g.branch}:{},cwd:f??process.cwd(),...D!==void 0?{metaLine:D}:{},hintLine:"/help \xB7 /model \xB7 /resume \xB7 Esc to interrupt \xB7 /exit to quit"})),b!==void 0&&console.log(m.dim(` ${b}`)),y.resumeTarget&&vl(y.stats,y.completionWriter),console.log()}finally{process.stdout.write=O,process.stderr.write=j}y.preArmAnchorRow=L,y.statusLine.start(),y.slashCtx.ui.repaintStatusLine(),y.rl.on("close",async()=>{y.statusLine.stop(),NG(y,g,R),console.log(m.info("\u2139 ")+"Goodbye!"),await hl(),process.exit(0)}),await FE(y,w,S,_)})}function NG(e,t,n){if(e.stats.totalTurns===0)return;console.log(ye("Session Summary"));let r=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,ne(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&r.push(Be(e.stats.totalCostUsd)),e.stats.totalTokens>0&&r.push(re(e.stats.totalTokens)+" tokens"),console.log(m.dim(" "+r.join(" \xB7 ")));let o=t?Ur.basename(t.path):"none";console.log(m.dim(` model: ${e.stats.model} \xB7 worktree: ${o}`));try{let i=e.stats.cwd??process.cwd(),l=$G("git",["diff","--shortstat","HEAD"],{cwd:i,encoding:"utf8",timeout:2e3}).trim();console.log(m.dim(` edits: ${l||"no files changed"}`))}catch{}let s=e.stats.sessionId;try{let i=n();!s&&i&&(s=Ur.basename(i,".json"))}catch{}s&&console.log(m.dim(" Continue with: ")+m.brand(Jt(s,e.stats.model))),console.log()}G();import BG from"ora";function tR(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=BG("Checking status...").start();try{let r=Qe(),o=fe(r),s=Ze(r),i=o==="openai-compatible"||o==="openai-codex";if(await new Ye({model:i?"gpt-4o-mini":"haiku",...s!==void 0?{apiKey:s}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`),t.format==="json"){let l=pe(),c=Ya(),u=l?T.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,d=c?T.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!l,source:u},codex:{ok:!!c,source:d}},model:String(r),bypass:!0},null,2))}else console.log(`
2277
2277
  `+Rg("Agent AFK \xB7 Status",[{label:"Provider",value:o,kind:"info"},{label:"Auth",value:i?s?"Found (OPENAI_API_KEY / CODEX_API_KEY)":"Reading ~/.codex/auth.json (run `afk provider auth diagnose`)":s?"Found (ANTHROPIC_API_KEY)":"Falling back to Claude OAuth",kind:s?"ok":"warn"},{label:"Model",value:String(r),kind:"info"},{label:"Bypass",value:"Permissions disabled",kind:"warn"}])+`
2278
2278
  `)}catch(r){n.fail("Connection failed"),z(r)}})}G();function nR(e){e.command("config").description("View current configuration").option("-f, --format <format>","Output format (text|json)","text").action(t=>{let n=T.AFK_MODEL??T.CLAUDE_MODEL,r=n??"sonnet",o=fe(n),s=T.ANTHROPIC_API_KEY||T.CLAUDE_CODE_OAUTH_TOKEN,i=T.OPENAI_API_KEY||T.CODEX_API_KEY,a=o==="anthropic"?s:i,l=s?T.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,c=i?T.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;if(t.format==="json")console.log(JSON.stringify({model:r,provider:o,apiKey:{present:!!a,source:o==="anthropic"?l:c},thinking:T.AFK_THINKING||null,effort:T.AFK_EFFORT||null,bypass:!0,raw_env:{AFK_MODEL:T.AFK_MODEL??null,AFK_THINKING:T.AFK_THINKING??null,AFK_EFFORT:T.AFK_EFFORT??null,ANTHROPIC_API_KEY:T.ANTHROPIC_API_KEY?"set":"unset",CLAUDE_CODE_OAUTH_TOKEN:T.CLAUDE_CODE_OAUTH_TOKEN?"set":"unset",OPENAI_API_KEY:T.OPENAI_API_KEY?"set":"unset",CODEX_API_KEY:T.CODEX_API_KEY?"set":"unset"}},null,2));else{console.log(m.info(`\u{1F4CB} Current Configuration:
2279
2279
  `)),console.log(` Model: ${m.info(n?r:r+" (default)")}`),console.log(` Provider: ${m.plan(o)}`),console.log(o==="anthropic"?` API Key: ${a?m.success("\u2713 Set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):m.warning("\u26A0 Not set \u2014 subprocess will fall back to OAuth / keychain")}`:` API Key: ${a?m.success("\u2713 Set (OPENAI_API_KEY / CODEX_API_KEY)"):m.warning("\u26A0 Not set \u2014 falling back to `codex login` state")}`);let u=T.AFK_THINKING||"(unset \u2014 SDK default)";console.log(` Thinking: ${m.info(u)}`);let d=T.AFK_EFFORT||"(unset \u2014 SDK default)";console.log(` Effort: ${m.info(d)}`),console.log(` Bypass Permissions: ${m.warning("true (enabled)")}`),console.log(m.meta(`
2280
2280
  Environment variables:`)),console.log(m.meta(" AFK_MODEL - Default model id (canonical; accepts short aliases or full ids)")),console.log(m.meta(" CLAUDE_MODEL - Legacy alias for AFK_MODEL (Claude-only deployments)")),console.log(m.meta(" ANTHROPIC_API_KEY - Anthropic API key (Claude models)")),console.log(m.meta(" CLAUDE_CODE_OAUTH_TOKEN - Anthropic OAuth token (Claude models)")),console.log(m.meta(" OPENAI_API_KEY / CODEX_API_KEY - OpenAI API key (Codex models)")),console.log(m.meta(" AFK_THINKING - Thinking mode (Claude only: adaptive|disabled|enabled:<N>)")),console.log(m.meta(" AFK_EFFORT - Effort level (low|medium|high|xhigh|max)")),console.log(m.meta(" AFK_TIMEOUT_MS - Per-tick daemon session timeout in ms")),console.log(m.meta(" AFK_SESSIONSTART_COOLDOWN_MS - Phase 6 cooldown between sessionstart fires (default 6h)")),console.log("")}})}G();import m2 from"path";import f2 from"os";import{createServer as t2}from"node:http";import{writeFileSync as n2,unlinkSync as r2,mkdirSync as o2}from"node:fs";import{dirname as s2,join as i2}from"node:path";G();import{mkdirSync as qG,appendFileSync as JG}from"node:fs";import{dirname as VG}from"node:path";import{execFile as YG}from"node:child_process";import{promisify as XG}from"node:util";import{randomUUID as ZG}from"node:crypto";import*as fR from"node-cron";var qc=class{_count=0;increment(){this._count++}decrement(){this._count>0&&this._count--}isIdle(){return this._count===0}count(){return this._count}};H();import{mkdirSync as oR,readdirSync as sR,readFileSync as UG,renameSync as jG,unlinkSync as iR,writeFileSync as WG}from"node:fs";import{randomBytes as rR}from"node:crypto";import{join as df}from"node:path";function aR(e,t={},n=Ft()){oR(n,{recursive:!0});let o=sR(n).filter(f=>f.endsWith(".json")).length+1,s=`q-${Date.now()}-${rR(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=df(n,c),d=rR(4).toString("hex"),p=df(n,`.tmp-${d}.json`);try{WG(p,JSON.stringify(a),"utf-8"),jG(p,u)}catch(f){try{iR(p)}catch{}throw f}return a}function lR(e=Ft()){oR(e,{recursive:!0});let n=sR(e).filter(i=>i.endsWith(".json")&&!i.startsWith(".tmp-")).sort()[0];if(n===void 0)return null;let r=df(e,n),o=UG(r,"utf-8"),s=JSON.parse(o);return iR(r),s}H();H();function cR(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`)}H();import{existsSync as uR,readFileSync as HG,readdirSync as KG}from"node:fs";var dR=360*60*1e3;function pR(){return Rn()}function GG(e,t){if(!uR(t))return null;let n;try{n=HG(t,"utf-8")}catch{return null}let r=n.split(`
2281
2281
  `);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 zG(e){if(!uR(e))return 0;try{return KG(e).filter(t=>!t.startsWith(".")).length}catch{return 0}}function mR(e){let t=GG(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=zG(e.briefsDir);return n>0?{fire:!1,skipReason:"briefs_pending",pendingBriefCount:n,...t!==null?{lastFiredAtMs:t}:{}}:{fire:!0,...t!==null?{lastFiredAtMs:t}:{}}}var QG=XG(YG);function e2(e){return`${e.replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"task"}-${ZG()}`}var Jc=class{registry=new Map;options;defaultCooldownMs;briefsDir;now;idleDetector=new qc;pullPollTimer;isDequeuing=!1;queueDir;constructor(t={}){this.options=t,this.defaultCooldownMs=t.cooldownMs??dR,this.briefsDir=t.briefsDir??pR(),this.now=t.now??Date.now,this.queueDir=t.queueDir??Ft(),this.ensureTelemetrySink()}register(t){if(cR(t),this.registry.has(t.taskId))throw new Error(`task ${t.taskId} is already registered`);let n;(t.trigger==="cron"||t.trigger==="both")&&(n=fR.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=mR({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=lR(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:Io(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={...s,durationMs:this.now()-o,status:"success",responseExcerpt:Io(c.content.slice(0,280))};return this.writeTelemetry(u,t),u}catch(l){let c={...s,durationMs:this.now()-o,status:"error",errorMessage:Io(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=T.AFK_WORKTREE_SWEEP_ROOT??process.cwd(),a=parseInt(T.AFK_WORKTREE_MAX_AGE_CLEAN??"",10)||14,l=parseInt(T.AFK_WORKTREE_MAX_AGE_DIRTY??"",10)||30,c=await Xt({execFile:QG,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:Io(i instanceof Error?i.message:String(i))};return this.writeTelemetry(a,t),a}}spawnSession(t){let{registry:n,memoryStore:r}=Po(void 0,"daemon"),o=Oo({sessionLabel:e2(t)}),s={model:"sonnet",permissionMode:"bypassPermissions",hookRegistry:n,...o?{traceWriter:o.writer}:{},...this.options.sessionConfig};return{session:this.options.sessionFactory?this.options.sessionFactory(s):new Ye(pn(s)),memoryStore:r}}telemetryPath(){return this.options.telemetryPath??Lt()}ensureTelemetrySink(){try{qG(VG(this.telemetryPath()),{recursive:!0})}catch{}}writeTelemetry(t,n){try{JG(this.telemetryPath(),`${JSON.stringify(t)}
2282
- `,"utf-8"),this.fireOnTaskComplete(t,n)}catch(r){let o=r instanceof Error?r.message:String(r);console.error(`[daemon] telemetry write failed: ${o}`)}}fireOnTaskComplete(t,n){let r=this.options.onTaskComplete;if(r&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let o=r(t);o instanceof Promise&&o.catch(s=>{let i=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${i}`)})}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`[daemon] onTaskComplete callback failed: ${s}`)}}};H();var a2=7777;async function gR(e={}){let t=new Jc({...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 s of e.tasks??[])t.register(s);let n=i2(Yr("default"),"port");o2(s2(n),{recursive:!0});let r=t2((s,i)=>c2(s,i,t)),o=await d2(r,e.port??a2);try{n2(n,String(o),"utf-8")}catch{}return{port:o,scheduler:t,registerTask(s){t.register(s)},unregisterTask(s){t.unregister(s)},tickOnce(s){return t.tick(s)},fireOnStart(){return t.fireOnStart()},async stop(){await t.stop();try{r2(n)}catch{}await p2(r)}}}function l2(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 c2(e,t,n){u2(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 u2(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 l2(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;if(typeof i.taskId!="string"||typeof i.command!="string"||typeof i.cron!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron are required strings"}));return}let a={taskId:i.taskId,command:i.command,trigger:i.trigger??"cron",cronExpression:i.cron,...i.notifyOn!==void 0?{notifyOn:i.notifyOn}:{}};try{n.register(a)}catch(l){let c=l instanceof Error?l.message:String(l),u=c.includes("already registered")?409:400;t.writeHead(u,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:c}));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 d2(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,()=>{e.removeListener("error",r);let o=e.address();n(typeof o=="object"&&o?o.port:t)})})}function p2(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}H();$s();function hR(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 yR(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 bR(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 pf="/forge-friction --auto",mf="default";function is(e){if(e!==void 0&&e.trim()!=="")return e}function wR(e,t,n){return is(e)??is(t)??is(n)??pf}function SR(e,t,n){return is(e)??is(t)??is(n)??mf}function g2(e){let t;return n=>{let r=new AbortController,o=yr(r.signal),s=new Q({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),i=ho(e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}),a=yo(e.model,e.apiKey,i,e.baseUrl,void 0,void 0,e.cwd,Ze),l=new Kt({subagentManager:s,parentSession:o,defaultConfig:{...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{}},defaultSubagentModel:kt(e.model),childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:Ze,depth:0,...e.cwd!==void 0?{cwd:e.cwd}:{}}),c=new Gt({parentSession:o,defaultModel:e.model,defaultSubagentModel:kt(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:Ze,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),u=new Gn({parentSession:o,defaultModel:e.model,defaultSubagentModel:kt(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},systemPrompt:""});t??=new We;let d=Ao(void 0,{subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,model:String(e.model),...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}})??new Fe({permissions:{allowedTools:[...Bt,...ln,...at,"agent","skill","compose"]},subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,surface:"daemon"});return new Ye(pn({...n,provider:d}))}}function h2(e){let t=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",n=(e.durationMs/1e3).toFixed(1),r=[`${t} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${n}s`];return e.skipReason&&r.push(`skipReason=${e.skipReason}`),e.errorMessage&&r.push(`error: ${e.errorMessage.slice(0,400)}`),e.responseExcerpt&&r.push("",e.responseExcerpt.slice(0,600)),r.join(`
2282
+ `,"utf-8"),this.fireOnTaskComplete(t,n)}catch(r){let o=r instanceof Error?r.message:String(r);console.error(`[daemon] telemetry write failed: ${o}`)}}fireOnTaskComplete(t,n){let r=this.options.onTaskComplete;if(r&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let o=r(t);o instanceof Promise&&o.catch(s=>{let i=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${i}`)})}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`[daemon] onTaskComplete callback failed: ${s}`)}}};H();var a2=7777;async function gR(e={}){let t=new Jc({...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 s of e.tasks??[])t.register(s);let n=i2(Yr("default"),"port");o2(s2(n),{recursive:!0});let r=t2((s,i)=>c2(s,i,t)),o=await d2(r,e.port??a2);try{n2(n,String(o),"utf-8")}catch{}return{port:o,scheduler:t,registerTask(s){t.register(s)},unregisterTask(s){t.unregister(s)},tickOnce(s){return t.tick(s)},fireOnStart(){return t.fireOnStart()},async stop(){await t.stop();try{r2(n)}catch{}await p2(r)}}}function l2(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 c2(e,t,n){u2(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 u2(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 l2(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;if(typeof i.taskId!="string"||typeof i.command!="string"||typeof i.cron!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron are required strings"}));return}let a={taskId:i.taskId,command:i.command,trigger:i.trigger??"cron",cronExpression:i.cron,...i.notifyOn!==void 0?{notifyOn:i.notifyOn}:{}};try{n.register(a)}catch(l){let c=l instanceof Error?l.message:String(l),u=c.includes("already registered")?409:400;t.writeHead(u,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:c}));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 d2(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,()=>{e.removeListener("error",r);let o=e.address();n(typeof o=="object"&&o?o.port:t)})})}function p2(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}H();$s();function hR(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 yR(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 bR(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 pf="/forge-friction --auto",mf="default";function is(e){if(e!==void 0&&e.trim()!=="")return e}function wR(e,t,n){return is(e)??is(t)??is(n)??pf}function SR(e,t,n){return is(e)??is(t)??is(n)??mf}function g2(e){let t;return n=>{let r=new AbortController,o=yr(r.signal),s=new Q({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),i=ho(e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}),a=yo(e.model,e.apiKey,i,e.baseUrl,void 0,void 0,e.cwd,Ze),l=new Kt({subagentManager:s,parentSession:o,defaultConfig:{...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{}},defaultSubagentModel:kt(e.model),childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:Ze,depth:0,...e.cwd!==void 0?{cwd:e.cwd}:{}}),c=new Gt({parentSession:o,defaultModel:e.model,defaultSubagentModel:kt(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},childProviderFactory:i,childSkillExecutorFactory:a,resolveApiKeyForModel:Ze,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),u=new Gn({parentSession:o,defaultModel:e.model,defaultSubagentModel:kt(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},systemPrompt:""});t??=new He;let d=Ao(void 0,{subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,model:String(e.model),...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}})??new Ne({permissions:{allowedTools:[...Bt,...ln,...at,"agent","skill","compose"]},subagentExecutor:l,skillExecutor:c,composeExecutor:u,memoryStore:t,surface:"daemon"});return new Ye(pn({...n,provider:d}))}}function h2(e){let t=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",n=(e.durationMs/1e3).toFixed(1),r=[`${t} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${n}s`];return e.skipReason&&r.push(`skipReason=${e.skipReason}`),e.errorMessage&&r.push(`error: ${e.errorMessage.slice(0,400)}`),e.responseExcerpt&&r.push("",e.responseExcerpt.slice(0,600)),r.join(`
2283
2283
  `)}function kR(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("-t, --task <command>",`Command to fire on each tick (default: ${pf})`).option("-c, --cron <expression>",'Cron expression (e.g. "0 */6 * * *"). Required when --trigger includes cron.').option("-i, --task-id <id>",`Task identifier (default: ${mf})`).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.").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)&&z(new Error(`Invalid port: ${t.port}`));let r=ot(),o=wR(t.task,T.AFK_DAEMON_TASK,r.daemon?.task),s=SR(t.taskId,T.AFK_DAEMON_TASK_ID,r.daemon?.taskId),i,a,l;try{i=hR(t.timeoutMs,T.AFK_TIMEOUT_MS),a=yR(t.sessionstartCooldownMs,T.AFK_SESSIONSTART_COOLDOWN_MS),l=bR(t.trigger,t.cron)}catch(I){z(I)}(l==="cron"||l==="both")&&!t.cron&&z(new Error(`--cron is required when --trigger is '${l}'.`));let c,u;try{c=Hn(t.thinking)??To(),u=Kn(t.effort)??xo()}catch(I){z(I)}let d=r.daemon?.worktreePrune,p=T.AFK_WORKTREE_PRUNE_DISABLE==="1",f=d?.cron??"0 4 * * *",g={taskId:"worktree-prune",command:"__BUILTIN_WORKTREE_PRUNE__",trigger:"cron",cronExpression:f},h=l==="pull"?[]:[{taskId:s,command:o,trigger:l,...t.cron!==void 0?{cronExpression:t.cron}:{}}];!p&&d?.enabled!==!1&&h.push(g);let b=wt();for(let I of b)I.enabled&&h.push(uy(I));if(t.dumpPrompt!==void 0&&t.dumpPrompt!==!1){let I=t.dumpPrompt===!0?m2.join(f2.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):t.dumpPrompt;process.env.AFK_DUMP_PROMPT=I}let y=0,w=6e4,v=(I,P)=>{let A=Date.now();if(A-y<w)return;y=A;let L=P instanceof Error?`${P.name}: ${P.message}`:String(P);xa(`\u{1F6D1} agent-afk daemon ${I}
2284
2284
  ${L.slice(0,500)}`).catch(O=>{console.error("[daemon] crash notification push failed:",O instanceof Error?O.message:String(O))})};process.on("uncaughtException",I=>{v("uncaughtException",I),process.exit(1)}),process.on("unhandledRejection",I=>{v("unhandledRejection",I),process.exit(1)});let R=T.AFK_DAEMON_CWD,S=Qe(),E=pe(),_=R!==void 0&&R.length>0?R:void 0,C=g2({model:S,...E!==void 0?{apiKey:E}:{},...r.baseUrl!==void 0?{baseUrl:r.baseUrl}:{},...r.openaiBaseUrl!==void 0?{openaiBaseUrl:r.openaiBaseUrl}:{},..._!==void 0?{cwd:_}:{}});try{let I=await gR({port:n,sessionConfig:{model:S,...E!==void 0?{apiKey:E}:{},...r.baseUrl!==void 0?{baseUrl:r.baseUrl}:{},...i!==void 0?{timeoutMs:i}:{},...c!==void 0?{thinking:c}:{},...u!==void 0?{effort:u}:{},..._!==void 0?{cwd:_}:{}},sessionFactory:C,...a!==void 0?{cooldownMs:a}:{},...t.briefsDir!==void 0?{briefsDir:t.briefsDir}:{},...l==="pull"?{pullPollIntervalMs:3e4,queueDir:Ft()}:{},tasks:h,onTaskComplete:A=>{xa(h2(A)).catch(()=>{})}});if(t.once){console.log(m.info(`\u25B6 Firing task '${s}' once...`));let A=await I.tickOnce(s);console.log(JSON.stringify(A,null,2)),await I.stop(),process.exit(A.status==="success"?0:1)}if(l==="sessionstart"||l==="both"){let A=await I.fireOnStart();for(let L of A){let O=L.status==="success"?"\u2714":L.status==="skipped"?"\u23ED":"\u2717";console.log(m.info(`${O} sessionstart: ${JSON.stringify(L)}`))}}console.log(m.success(`\u2714 Daemon listening on http://localhost:${I.port}`)),l==="pull"?(console.log(m.success("\u2714 Daemon in pull mode")),console.log(m.dim(` polling queue: ${Ft()} every 30s`))):console.log(m.dim(` task='${s}' command='${o}' trigger='${l}'${t.cron?` cron='${t.cron}'`:""}`)),h.length>1&&console.log(m.meta(` + built-in: worktree-prune (cron: ${f})`)),console.log(m.dim(" Press Ctrl+C to stop."));let P=async()=>{console.log(m.dim(`
2285
2285
  \xB7 Shutting down daemon...`)),await I.stop(),process.exit(0)};process.on("SIGINT",P),process.on("SIGTERM",P)}catch(I){z(I)}})}import{mkdirSync as y2}from"node:fs";import{join as b2}from"node:path";H();function vR(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=Ft();y2(o,{recursive:!0});let s=r.notifyOn,i=aR(n,{notifyOn:s},o),a=String(i.sequence).padStart(4,"0"),l=b2(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){z(o)}})}import as from"chalk";import ER from"chalk";H();import{existsSync as w2,readFileSync as S2,writeFileSync as k2,mkdirSync as v2}from"fs";import{dirname as T2}from"path";function En(e,t,n,r=[]){v2(T2(e),{recursive:!0});let o="";w2(e)&&(o=S2(e,"utf-8"));for(let a of r){let l=new RegExp(`^${a}=.*$
@@ -2409,7 +2409,7 @@ Multiple chats found:`)),o.forEach((l,c)=>{let u=l.username?`@${l.username}`:l.f
2409
2409
  `))}),t.command("test-fetch").description("One-shot: GET /me/mentions, print payload (verifies token + filtering, no agent dispatch)").option("--limit <n>","Max events to fetch","5").option("--no-filter","Skip allowlist + self-loop filter (dump every event)").action(async n=>{let r=VR();r.kind==="missing"&&(console.error(te.red("\u2717 "+r.reason)),process.exit(1));let o=r.token;console.log(te.gray(`Token: ${r.kind==="file"?r.path:"THREADS_ACCESS_TOKEN env"}`));let s;try{s=await XR(o)}catch(p){p instanceof Tt?console.error(te.red(`\u2717 /me failed (${p.detail.kind}): ${p.detail.message}`)):console.error(te.red(`\u2717 /me failed: ${p.message}`)),process.exit(1)}console.log(te.gray(`Identity: @${s.username} (id ${s.id})`));let i=QR(T.AFK_THREADS_ALLOWED_USERNAMES),a=n.filter!==!1;a?i.size===0?(console.log(te.yellow("\u26A0 AFK_THREADS_ALLOWED_USERNAMES is empty \u2014 all events will be filtered out.")),console.log(te.gray(" Re-run with --no-filter to see raw payload."))):console.log(te.gray(`Allowlist: ${[...i].map(p=>"@"+p).join(", ")}`)):console.log(te.gray("Filter: OFF (dumping raw payload)")),console.log("");let l=Number.parseInt(n.limit??"5",10),c;try{c=await ZR({accessToken:o,limit:l})}catch(p){p instanceof Tt?console.error(te.red(`\u2717 /me/mentions failed (${p.detail.kind}): ${p.detail.message}`)):console.error(te.red(`\u2717 /me/mentions failed: ${p.message}`)),process.exit(1)}if(c.length===0){console.log(te.gray("No mentions returned.")),console.log(te.gray("Tag your account in a post (or have someone in the allowlist do it), then re-run."));return}let u=0,d=0;for(let p of c){let f=p.username.toLowerCase()===s.username.toLowerCase(),g=eA(i,p.username),h=!a||!f&&g,b=h?te.green("\u2713 KEEP "):te.gray("\u2717 FILTER "),y=h?"":f?" (self-loop)":g?"":" (not allowlisted)";console.log(`${b}@${p.username} ${te.gray("\u2022")} ${p.timestamp}${te.gray(y)}`),console.log(te.gray(` id=${p.id}`)),console.log(` ${p.text.slice(0,200)}${p.text.length>200?"\u2026":""}`),p.permalink&&console.log(te.gray(` ${p.permalink}`)),console.log(""),h?u++:d++}console.log(te.bold(`Summary: ${u} kept, ${d} filtered (of ${c.length} fetched)`))})}function Fz(e){if(console.log(te.bold("\u{1F4CA} Threads Poller Status")),console.log(""),e.running?(console.log(` ${te.green("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${Nz(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${te.red("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(te.bold("Recent log entries:"));for(let t of e.logTail)console.log(te.gray(` ${t}`))}}function Nz(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m ${e%60}s`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}import{execFile as mq}from"node:child_process";import{promisify as fq}from"node:util";import me from"chalk";H();import{execFile as Bz}from"node:child_process";import{randomBytes as Uz}from"node:crypto";import{promises as ps}from"node:fs";import{join as nu}from"node:path";import{promisify as jz}from"node:util";var Wz=jz(Bz),nA=16;var tt=class extends Error{cause;code;constructor(t,n,r){super(t),this.name="WorktreeError",this.cause=n,this.code=r}};function $f(e,t=40){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||"task"}function Hz(){return Uz(4).toString("hex").slice(0,4)}function Kz(e){let t=n=>String(n).padStart(2,"0");return`${e.getUTCFullYear()}${t(e.getUTCMonth()+1)}${t(e.getUTCDate())}T${t(e.getUTCHours())}${t(e.getUTCMinutes())}${t(e.getUTCSeconds())}`}function Gz(e,t={}){let n=(t.now??(()=>new Date))(),r=(t.randomSuffix??Hz)();return`${Kz(n)}-${$f(e,32)}-${r}`}async function jr(e,t){try{let n=await Wz("git",t,{cwd:e,maxBuffer:4194304});return{stdout:n.stdout.trim(),stderr:n.stderr.trim()}}catch(n){let r=n,o=(r.stderr??r.stdout??r.message??"").toString().trim();throw new tt(`git ${t.join(" ")} failed: ${o}`,n)}}async function zz(e){let{stdout:t}=await jr(e,["rev-parse","--show-toplevel"]);if(!t)throw new tt(`not a git repository: ${e}`);return t}async function qz(e,t){if(t){let{stdout:o}=await jr(e,["rev-parse",t]);return{sha:o}}let{stdout:n}=await jr(e,["rev-parse","HEAD"]),r;try{let{stdout:o}=await jr(e,["symbolic-ref","--quiet","HEAD"]);o&&(r=o)}catch{}return{sha:n,branch:r}}function Jz(e,t,n){let r=n?$f(n,32):`branch-${t}`;return`afk/farm/${e}/${t}-${r}`}function Vz(e,t){return nu(e,`branch-${t}`)}async function Yz(e,t){try{await jr(e,["worktree","remove","--force",t])}catch{}}async function Xz(e,t){try{await jr(e,["branch","-D",t])}catch{}}async function rA(e){if(e.count<1||e.count>nA)throw new tt(`count must be between 1 and ${nA}, got ${e.count}`);if(e.labels&&e.labels.length!==e.count)throw new tt(`labels.length (${e.labels.length}) must equal count (${e.count})`);let t=e.cwd??process.cwd(),n=await zz(t),{sha:r,branch:o}=await qz(n,e.baseRef),s=(e.now??(()=>new Date))(),i=e.taskSlug??Gz(e.taskName,{now:()=>s,randomSuffix:e.randomSuffix}),a=e.taskSlug??i,l=_u(i);try{throw await ps.access(l),new tt(`farm directory already exists: ${l}`)}catch(d){if(d.code!=="ENOENT")throw d instanceof tt?d:new tt(`failed to check farm dir ${l}`,d)}await ps.mkdir(l,{recursive:!0});let c=[];try{for(let d=1;d<=e.count;d++){let p=e.labels?.[d-1],f=Jz(i,d,p),g=Vz(l,d);await jr(n,["worktree","add","-b",f,g,r]),c.push({index:d,label:p?$f(p,32):void 0,path:g,branch:f})}}catch(d){for(let p of c.slice().reverse())await Yz(n,p.path),await Xz(n,p.branch);throw await ps.rm(l,{recursive:!0,force:!0}).catch(()=>{}),d instanceof tt?d:new tt("farm creation failed",d)}let u={schemaVersion:3,taskId:a,taskSlug:i,taskName:e.taskName,repoRoot:n,baseRef:r,baseBranch:o,farmDir:l,createdAt:s.toISOString(),branches:c};return await ps.writeFile(nu(l,"farm.json"),JSON.stringify(u,null,2)+`
2410
2410
  `,"utf8"),u}function Zz(e){let t=e;return t.respawnedAt===void 0&&(t.respawnedAt=void 0),t.respawnedAs===void 0&&(t.respawnedAs=void 0),t.prUrl===void 0&&(t.prUrl=void 0),t.prCreatedAt===void 0&&(t.prCreatedAt=void 0),t}async function Qz(e){let t=nu(_u(e),"farm.json");try{let n=await ps.readFile(t,"utf8"),r=JSON.parse(n);if(r.schemaVersion!==1&&r.schemaVersion!==2&&r.schemaVersion!==3)throw new tt(`unsupported farm manifest schema: ${r.schemaVersion} (expected 1, 2, or 3)`,void 0,"unsupported-schema");return Zz(r)}catch(n){if(n.code==="ENOENT")return null;throw n instanceof tt?n:new tt(`failed to load farm manifest ${t}`,n,"invalid")}}async function oA(e,t){let n=await Qz(e);if(!n)throw new tt(`farm not found: ${e}`);return n.memoryFactId=t,n.schemaVersion=3,await ps.writeFile(nu(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
2411
2411
  `,"utf8"),n}import{spawn as eq}from"child_process";import{promises as ru}from"fs";import{join as $i,dirname as xxe}from"path";var tq=1,ou=12e4;async function lA(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=ou,_spawn:s=eq,_readPackageJson:i=nq,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await rq(t,i),u=0,d=0,p=0,f;if(c){let y=await uA(c,t,o,s,a);p=y.durationMs,y.timedOut?(d=1,f=`tests timed out after ${o}ms`):y.crashed?(d=1,f=`test runner crashed: ${iq(y.stderr,200)}`):y.exitCode===0?u=1:d=1}else f="no test command found (no package.json scripts.test)";let g=await oq(t,o,s,a),h=await sq(t,n,s),b={schemaVersion:tq,pass:u,fail:d,loc_delta:h,lint_ok:g,duration_ms:p,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(b.error=f),c!==void 0&&(b.testCmd=c),b}async function cA(e,t,n){let r=$i(e,"scores");await ru.mkdir(r,{recursive:!0});let o=$i(r,`branch-${t}.json`);return await ru.writeFile(o,JSON.stringify(n,null,2)+`
2412
- `,"utf8"),o}function Di(e){let t=e.filter(r=>r.score!==null),n=e.filter(r=>r.score===null).map(r=>r.index).sort((r,o)=>r-o);return t.sort((r,o)=>{let s=r.score,i=o.score,a=sA(s),l=sA(i);if(a!==l)return l-a;let c=iA(s.lint_ok),u=iA(i.lint_ok);return c!==u?u-c:s.loc_delta!==i.loc_delta?s.loc_delta-i.loc_delta:r.index-o.index}),[...t.map(r=>r.index),...n]}async function nq(e){try{let t=await ru.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function rq(e,t){let n=await t($i(e,"package.json"));if(!aA(n))return;let r=n.scripts;return!aA(r)||typeof r.test!="string"?void 0:await dA($i(e,"pnpm-lock.yaml"))?"pnpm test":"npm test"}async function uA(e,t,n,r,o){let s=o();return new Promise(i=>{let a;try{a=r(e,{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],env:{...process.env,CI:"1"}})}catch(p){i({exitCode:null,durationMs:o()-s,stderr:p instanceof Error?p.message:String(p),timedOut:!1,crashed:!0});return}let l="",c=!1,u=!1,d=setTimeout(()=>{c=!0,a.kill("SIGKILL")},n);a.stderr?.on("data",p=>{l+=String(p),l.length>64e3&&(l=l.slice(-32e3))}),a.on("error",p=>{u||(u=!0,clearTimeout(d),i({exitCode:null,durationMs:o()-s,stderr:p.message,timedOut:!1,crashed:!0}))}),a.on("close",p=>{u||(u=!0,clearTimeout(d),i({exitCode:p,durationMs:o()-s,stderr:l,timedOut:c,crashed:!1}))})})}async function oq(e,t,n,r){if(!await dA($i(e,"tsconfig.json")))return null;let o=await uA("npx --no-install tsc --noEmit",e,t,n,r);return o.crashed||o.timedOut?null:o.exitCode===0}async function sq(e,t,n){return new Promise(r=>{let o;try{o=n("git",["diff","--shortstat",`${t}..HEAD`],{cwd:e,stdio:["ignore","pipe","pipe"]})}catch{r(0);return}let s="";o.stdout?.on("data",i=>{s+=String(i)}),o.on("error",()=>r(0)),o.on("close",()=>{let i=/(\d+) insertions?\(\+\)/.exec(s),a=/(\d+) deletions?\(-\)/.exec(s),l=i?Number(i[1]):0,c=a?Number(a[1]):0;r(l-c)})})}function sA(e){let t=e.pass+e.fail;return t===0?0:e.pass/t}function iA(e){return e===!0?2:e===!1?1:0}function iq(e,t){return e.length<=t?e:e.slice(0,t)+"\u2026"}function aA(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function dA(e){try{return await ru.access(e),!0}catch{return!1}}function pA(e,t){let n;try{n=t?._store??new We}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r=aq(e);return{factId:n.storeFact({category:"learning",content:JSON.stringify(r),source_surface:"afk"})}}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}}function aq(e){let t=lq(e.branches),n=e.winner??null,r=cq(e,t);return{type:"farm-run",task:e.taskName,taskSlug:e.taskSlug,winner:n,why:r,scores:t,human_decision:e.human_decision??null,baseSha:e.baseSha,completedAt:e.completedAt}}function lq(e){return e.map(t=>{let n=t.score??null;return{index:t.index,branch:t.branch,pass:n?.pass??0,fail:n?.fail??0,loc_delta:n?.loc_delta??0,lint_ok:n?.lint_ok??null,duration_ms:n?.duration_ms??0}})}function cq(e,t){let{winner:n,branches:r}=e;if(n==null)return r.some(p=>p.score!=null)?`no winner: all ${r.length} branches failed tests`:"no winner: scoring data unavailable";let o=t.find(d=>d.index===n);if(!o)return`branch-${n} wins`;let s=o.pass>0?"\u2713":"\u2717",i=o.lint_ok===!0?"\u2713":o.lint_ok===!1?"\u2717":"?",a=o.loc_delta>=0?`+${o.loc_delta}`:String(o.loc_delta),c=t.filter(d=>d.index!==n).map(d=>d.loc_delta>=0?`+${d.loc_delta}`:String(d.loc_delta)),u=c.length>0?` (vs ${c.join(", ")} LoC)`:"";return`branch-${n} wins: tests${s}, lint${i}, ${a} LoC${u}`}var uq="afk:f:";var dq=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function Li(e,t){if(!dq.test(t))throw new Error(`buildFarmCallback: invalid taskSlug ${JSON.stringify(t)}`);let n=`${uq}${e}:${t}`,r=Buffer.byteLength(n,"utf8");if(r>64)throw new Error(`buildFarmCallback: payload ${r} bytes exceeds Telegram's 64-byte limit (slug=${t})`);return n}function mA(e){return{inline_keyboard:[[{text:"\u2705 Open PR",callback_data:Li("p",e)},{text:"\u{1F501} Respawn from winner",callback_data:Li("r",e)}],[{text:"\u{1F50D} Full diff",callback_data:Li("d",e)},{text:"\u274C Discard all",callback_data:Li("x",e)}]]}}function pq(e){let{taskName:t,taskSlug:n,baseSha:r,branches:o,winner:s}=e,i=o.filter(y=>y.ok),a=o.filter(y=>!y.ok),l=o.length,c=i.length,u=i.map(y=>({index:y.index,score:y.score??null})),d=Di(u),p=new Map(o.map(y=>[y.index,y])),f=[];f.push(`\u{1F331} Farm complete: ${c}/${l} branches \u2014 ${t}`),f.push("");let g=1;for(let y of d){let w=p.get(y);if(!w)continue;let v=s!==void 0&&s===w.index,R=w.label?` (${w.label})`:"",S=w.score??null,E=S===null?"\u2014":S.pass>0?"\u2713":"\u2717",_=S===null?"\u2014":S.lint_ok===!0?"\u2713":S.lint_ok===!1?"\u2717":"?",C=S===null?"?":S.loc_delta>0?`+${S.loc_delta}`:S.loc_delta<0?`${S.loc_delta}`:"0",I=v?" \u2190 winner":"";f.push(`#${g} ${w.branch}${R} tests${E} lint${_} ${C} LoC${I}`),g++}let h=[...a].sort((y,w)=>y.index-w.index);for(let y of h){let w=y.label?` (${y.label})`:"",v=y.error??"unknown error";f.push(`#${g} ${y.branch}${w} failed: ${v}`),g++}f.push(""),s===void 0&&(f.push("\u26A0 no branch won (no successful + scored branches)"),f.push(""));let b=r.slice(0,7);return f.push(`base: ${b}`),f.push(`farm: ~/.afk/farms/${n}/`),f.join(`
2412
+ `,"utf8"),o}function Di(e){let t=e.filter(r=>r.score!==null),n=e.filter(r=>r.score===null).map(r=>r.index).sort((r,o)=>r-o);return t.sort((r,o)=>{let s=r.score,i=o.score,a=sA(s),l=sA(i);if(a!==l)return l-a;let c=iA(s.lint_ok),u=iA(i.lint_ok);return c!==u?u-c:s.loc_delta!==i.loc_delta?s.loc_delta-i.loc_delta:r.index-o.index}),[...t.map(r=>r.index),...n]}async function nq(e){try{let t=await ru.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function rq(e,t){let n=await t($i(e,"package.json"));if(!aA(n))return;let r=n.scripts;return!aA(r)||typeof r.test!="string"?void 0:await dA($i(e,"pnpm-lock.yaml"))?"pnpm test":"npm test"}async function uA(e,t,n,r,o){let s=o();return new Promise(i=>{let a;try{a=r(e,{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],env:{...process.env,CI:"1"}})}catch(p){i({exitCode:null,durationMs:o()-s,stderr:p instanceof Error?p.message:String(p),timedOut:!1,crashed:!0});return}let l="",c=!1,u=!1,d=setTimeout(()=>{c=!0,a.kill("SIGKILL")},n);a.stderr?.on("data",p=>{l+=String(p),l.length>64e3&&(l=l.slice(-32e3))}),a.on("error",p=>{u||(u=!0,clearTimeout(d),i({exitCode:null,durationMs:o()-s,stderr:p.message,timedOut:!1,crashed:!0}))}),a.on("close",p=>{u||(u=!0,clearTimeout(d),i({exitCode:p,durationMs:o()-s,stderr:l,timedOut:c,crashed:!1}))})})}async function oq(e,t,n,r){if(!await dA($i(e,"tsconfig.json")))return null;let o=await uA("npx --no-install tsc --noEmit",e,t,n,r);return o.crashed||o.timedOut?null:o.exitCode===0}async function sq(e,t,n){return new Promise(r=>{let o;try{o=n("git",["diff","--shortstat",`${t}..HEAD`],{cwd:e,stdio:["ignore","pipe","pipe"]})}catch{r(0);return}let s="";o.stdout?.on("data",i=>{s+=String(i)}),o.on("error",()=>r(0)),o.on("close",()=>{let i=/(\d+) insertions?\(\+\)/.exec(s),a=/(\d+) deletions?\(-\)/.exec(s),l=i?Number(i[1]):0,c=a?Number(a[1]):0;r(l-c)})})}function sA(e){let t=e.pass+e.fail;return t===0?0:e.pass/t}function iA(e){return e===!0?2:e===!1?1:0}function iq(e,t){return e.length<=t?e:e.slice(0,t)+"\u2026"}function aA(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function dA(e){try{return await ru.access(e),!0}catch{return!1}}function pA(e,t){let n;try{n=t?._store??new He}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r=aq(e);return{factId:n.storeFact({category:"learning",content:JSON.stringify(r),source_surface:"afk"})}}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}}function aq(e){let t=lq(e.branches),n=e.winner??null,r=cq(e,t);return{type:"farm-run",task:e.taskName,taskSlug:e.taskSlug,winner:n,why:r,scores:t,human_decision:e.human_decision??null,baseSha:e.baseSha,completedAt:e.completedAt}}function lq(e){return e.map(t=>{let n=t.score??null;return{index:t.index,branch:t.branch,pass:n?.pass??0,fail:n?.fail??0,loc_delta:n?.loc_delta??0,lint_ok:n?.lint_ok??null,duration_ms:n?.duration_ms??0}})}function cq(e,t){let{winner:n,branches:r}=e;if(n==null)return r.some(p=>p.score!=null)?`no winner: all ${r.length} branches failed tests`:"no winner: scoring data unavailable";let o=t.find(d=>d.index===n);if(!o)return`branch-${n} wins`;let s=o.pass>0?"\u2713":"\u2717",i=o.lint_ok===!0?"\u2713":o.lint_ok===!1?"\u2717":"?",a=o.loc_delta>=0?`+${o.loc_delta}`:String(o.loc_delta),c=t.filter(d=>d.index!==n).map(d=>d.loc_delta>=0?`+${d.loc_delta}`:String(d.loc_delta)),u=c.length>0?` (vs ${c.join(", ")} LoC)`:"";return`branch-${n} wins: tests${s}, lint${i}, ${a} LoC${u}`}var uq="afk:f:";var dq=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function Li(e,t){if(!dq.test(t))throw new Error(`buildFarmCallback: invalid taskSlug ${JSON.stringify(t)}`);let n=`${uq}${e}:${t}`,r=Buffer.byteLength(n,"utf8");if(r>64)throw new Error(`buildFarmCallback: payload ${r} bytes exceeds Telegram's 64-byte limit (slug=${t})`);return n}function mA(e){return{inline_keyboard:[[{text:"\u2705 Open PR",callback_data:Li("p",e)},{text:"\u{1F501} Respawn from winner",callback_data:Li("r",e)}],[{text:"\u{1F50D} Full diff",callback_data:Li("d",e)},{text:"\u274C Discard all",callback_data:Li("x",e)}]]}}function pq(e){let{taskName:t,taskSlug:n,baseSha:r,branches:o,winner:s}=e,i=o.filter(y=>y.ok),a=o.filter(y=>!y.ok),l=o.length,c=i.length,u=i.map(y=>({index:y.index,score:y.score??null})),d=Di(u),p=new Map(o.map(y=>[y.index,y])),f=[];f.push(`\u{1F331} Farm complete: ${c}/${l} branches \u2014 ${t}`),f.push("");let g=1;for(let y of d){let w=p.get(y);if(!w)continue;let v=s!==void 0&&s===w.index,R=w.label?` (${w.label})`:"",S=w.score??null,E=S===null?"\u2014":S.pass>0?"\u2713":"\u2717",_=S===null?"\u2014":S.lint_ok===!0?"\u2713":S.lint_ok===!1?"\u2717":"?",C=S===null?"?":S.loc_delta>0?`+${S.loc_delta}`:S.loc_delta<0?`${S.loc_delta}`:"0",I=v?" \u2190 winner":"";f.push(`#${g} ${w.branch}${R} tests${E} lint${_} ${C} LoC${I}`),g++}let h=[...a].sort((y,w)=>y.index-w.index);for(let y of h){let w=y.label?` (${y.label})`:"",v=y.error??"unknown error";f.push(`#${g} ${y.branch}${w} failed: ${v}`),g++}f.push(""),s===void 0&&(f.push("\u26A0 no branch won (no successful + scored branches)"),f.push(""));let b=r.slice(0,7);return f.push(`base: ${b}`),f.push(`farm: ~/.afk/farms/${n}/`),f.join(`
2413
2413
  `)}async function fA(e,t){let n=pq(e),r=mA(e.taskSlug),o=t?._push??await Promise.resolve().then(()=>($s(),id)).then(s=>s.pushIfConfigured);try{let s=await o(n,{replyMarkup:r});return s===null?{sent:!1,reason:"telegram unconfigured"}:{sent:!0,chatCount:s.length}}catch(s){return{sent:!1,reason:s instanceof Error?s.message:String(s)}}}var gA=fq(mq);async function gq(e,t){try{let{stdout:n}=await gA("git",["-C",e,"rev-list",`${t}..HEAD`,"--count"],{maxBuffer:4194304});return parseInt(n.trim(),10)||0}catch{return 0}}async function hq(e){try{let{stdout:t}=await gA("git",["-C",e,"status","--porcelain"],{maxBuffer:4194304});return t.trim()?t.trim().split(`
2414
2414
  `).filter(Boolean):[]}catch{return[]}}var Df=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
2415
2415
  ${t.map(n=>` ${n}`).join(`