agent-afk 1.2.0 → 1.8.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.
package/dist/cli.mjs CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import{config as es}from"dotenv";import{existsSync as ts,mkdirSync as du,renameSync as pu}from"fs";import{join as G,dirname as ns}from"path";import{homedir as Or}from"os";import{fileURLToPath as mu}from"url";function ue(){return process.env.AFK_HOME||G(Or(),".afk")}function rt(){return G(ue(),"agent-framework")}function un(){return G(rt(),"forge-telemetry.jsonl")}function je(){return G(rt(),"briefs")}function dn(){return G(rt(),"ceiling-ledger")}function pn(){return G(ue(),"skills")}function le(){return G(ue(),"plugins")}function rs(){return G(process.cwd(),".afk")}function os(){return G(rs(),"skills")}function Nt(){return G(rs(),"plugins")}function j(){return G(le(),".index.json")}function _e(){return G(le(),"cache")}function Ut(e){return G(_e(),e)}function Dr(){let e=mu(import.meta.url),t=ns(e);return G(t,"bundled-plugins")}function mn(){return G(ue(),"config")}function fn(){return G(ue(),"state")}function ss(){return G(ue(),"logs")}function jt(){return G(fn(),"sessions")}function Lr(){return G(fn(),"todos")}function ot(){return G(mn(),"afk.env")}function mt(){return G(mn(),"afk.config.json")}function is(){return G(Or(),".afk.env")}function gn(){return G(Or(),".afk.config.json")}function fu(){return G(ue(),"sessions")}function gu(){return G(ue(),"todos")}function as(e,t){if(e!==t&&ts(e)&&!ts(t))try{du(ns(t),{recursive:!0}),pu(e,t)}catch{}}function ls(){as(fu(),jt())}function cs(){as(gu(),Lr())}import{Command as eb}from"commander";import Fr from"chalk";function us(){let e=process.env.FORCE_COLOR;if(e&&e.length>0)return;let t=process.env.NO_COLOR;if(t&&t.length>0){Fr.level=0;return}let n=process.env.CI;if(n&&n.length>0){Fr.level=0;return}process.stdout.isTTY||(Fr.level=0)}import tn from"chalk";import _f from"ora";function ft(){return process.env.AFK_DEBUG==="1"||process.env.DEBUG==="1"}function V(...e){ft()&&console.log(...e)}var Ee=class extends Error{constructor(t){super(t),this.name="AbortError"}},hn=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},he=class extends Error{constructor(n,r,o,s){super(n);this.event=r;this.reason=o;this.name="HookBlockedError",s?.cause!==void 0&&(this.cause=s.cause)}event;reason;cause};var Bt=class extends Error{constructor(n,r,o){super(o??`${n} provider does not support AgentConfig.${r}.`);this.provider=n;this.field=r;this.name="UnsupportedProviderConfigError"}provider;field};var yn=class{queue=[];waiters=[];closed=!1;error=null;push(t){if(this.closed)throw new Error("Cannot push to closed queue");if(process.env.AFK_CODEX_DEBUG&&console.log("[queue] push:",t.type),V("\u{1F4E6} MessageQueue.push: event type=",t.type,"waiters=",this.waiters.length,"queue size=",this.queue.length),this.waiters.length>0){let n=this.waiters.shift();V("\u{1F4E6} MessageQueue.push: Resolving waiter immediately"),n?.({value:t,done:!1})}else this.queue.push(t),V("\u{1F4E6} MessageQueue.push: Added to queue, new size=",this.queue.length)}complete(){for(this.closed=!0;this.waiters.length>0;)this.waiters.shift()?.({value:void 0,done:!0})}fail(t){this.error=t,this.closed=!0;let n={type:"error",error:t};if(this.waiters.length>0)for(this.waiters.shift()?.({value:n,done:!1});this.waiters.length>0;)this.waiters.shift()?.({value:void 0,done:!0});else this.queue.push(n)}isClosed(){return this.closed}hasError(){return this.error}size(){return this.queue.length}async*[Symbol.asyncIterator](){for(V("\u{1F4E6} MessageQueue: Iterator started");;){if(this.queue.length>0){let n=this.queue.shift();if(V("\u{1F4E6} MessageQueue: Yielding queued event, type=",n?.type),n&&(yield n,n.type==="error")){V("\u{1F4E6} MessageQueue: Stopping after error");return}continue}if(this.closed){V("\u{1F4E6} MessageQueue: Closed and empty, stopping");return}V("\u{1F4E6} MessageQueue: Waiting for next event...");let t=await new Promise(n=>{this.waiters.push(n)});if(V("\u{1F4E6} MessageQueue: Got result, done=",t.done,"type=",t.value?.type),t.done)return;if(yield t.value,t.value.type==="error"){V("\u{1F4E6} MessageQueue: Stopping after error");return}}}};import ia from"@anthropic-ai/sdk";var hu="claude-code-20250219,oauth-2025-04-20",yu="claude-cli/1.0.0 (external, cli)",ku="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;";function ds(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function Nr(e,t){return t==="oauth"?{authToken:e}:{apiKey:e}}function kn(e,t,n){return e!=="oauth"?{}:{"anthropic-beta":hu,"x-app":"cli","User-Agent":yu,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function ps(e){return e!=="oauth"?null:[{type:"text",text:ku}]}import{execFileSync as ms}from"child_process";import{existsSync as bu,readFileSync as wu,writeFileSync as Su}from"fs";import{homedir as fs,userInfo as gs}from"os";import{join as hs}from"path";var vu="9d1c250a-e61b-44d9-88ed-5944d1962f5e",xu="https://platform.claude.com/v1/oauth/token",Tu=300*1e3;function ys(){let e=bs();if(e===void 0)return;let t=ws(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 ks(){let e=bs();if(e===void 0)return;let t=ws(e);if(t===void 0)return;if(t.expiresAt!==void 0&&t.expiresAt>Date.now()+Tu)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 Eu(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}:{}},Pu(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
3
- `)}return n.accessToken}function bs(){if(process.platform==="darwin")try{return ms("security",["find-generic-password","-s","Claude Code-credentials","-a",gs().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let e=hs(fs(),".claude",".credentials.json");if(!bu(e))return;try{return wu(e,"utf-8")}catch{return}}}function ws(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},a=r.refreshToken;typeof a=="string"&&a.length>0&&(s.refreshToken=a);let i=r.expiresAt;return typeof i=="number"&&(s.expiresAt=i),s}async function Eu(e){try{let t=await fetch(xu,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:e,client_id:vu})});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 Pu(e){if(process.platform==="darwin")ms("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",gs().username,"-w",e],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let t=hs(fs(),".claude",".credentials.json");Su(t,e,"utf-8")}}import{randomUUID as jn}from"node:crypto";function bn(){let e=process.env.AFK_DISABLE_PROMPT_CACHE;if(e===void 0||e.length===0)return!0;let t=e.toLowerCase();return!(t==="1"||t==="true"||t==="yes"||t==="on")}function wn(){let e=process.env.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":"1h"}function Ss(e,t){if(e.length===0)return e;let n=e[e.length-1],r=xs(n,t);return r===n?e:[...e.slice(0,-1),r]}function vs(e,t){if(e.length===0)return e;let n=e[e.length-1],r=Cu(n,t);return r===n?e:[...e.slice(0,-1),r]}function Cu(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=xs(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function xs(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}import{randomUUID as Mu}from"node:crypto";function Ts(e,t){if(!e)return{stopReason:t??null};let n={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};return e.cache_read_input_tokens!=null&&(n.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(n.cacheCreationTokens=e.cache_creation_input_tokens),n.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n}function Es(e,t){let n=(c,u)=>{if(!(c==null&&u==null))return(c??0)+(u??0)},r={stopReason:t.stopReason??e.stopReason??null},o=n(e.inputTokens,t.inputTokens);o!==void 0&&(r.inputTokens=o);let s=n(e.outputTokens,t.outputTokens);s!==void 0&&(r.outputTokens=s);let a=n(e.cachedInputTokens,t.cachedInputTokens);a!==void 0&&(r.cachedInputTokens=a);let i=n(e.cacheCreationTokens,t.cacheCreationTokens);i!==void 0&&(r.cacheCreationTokens=i);let l=n(e.totalTokens,t.totalTokens);return l!==void 0&&(r.totalTokens=l),r}function Au(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function Iu(e,t,n){let r=[],o=[];for(let i of e)i&&(i.kind==="text"?(r.push({type:"text",text:i.text}),o.push(i.text)):i.kind==="thinking"?r.push({type:"thinking",thinking:i.thinking,signature:i.signature}):r.push({type:"tool_use",id:i.id,name:i.name,input:Au(i.partialJson)}));let s=i=>i.type==="tool_use",a=r.filter(s);return{stopReason:t,assistantBlocks:r,toolUseBlocks:a,usage:n,text:o.join("")}}async function*Ps(e,t){let n=[],r=null,o=null,s=!1;try{for await(let a of e){switch(a.type){case"message_start":{let i=a.message?.usage;i&&(o={...i});break}case"content_block_start":{let i=a.content_block;i.type==="text"?n[a.index]={kind:"text",text:""}:i.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:i.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:i.id,name:i.name,partialJson:""});break}case"content_block_delta":{let i=n[a.index],l=a.delta;l.type==="text_delta"?(i&&i.kind==="text"&&(i.text+=l.text),yield{kind:"event",event:{type:"delta.text",text:l.text,sessionId:t.sessionId}}):l.type==="input_json_delta"?i&&i.kind==="tool_use"&&(i.partialJson+=l.partial_json):l.type==="thinking_delta"?(i&&i.kind==="thinking"&&(i.thinking+=l.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:l.thinking,sessionId:t.sessionId}}):l.type==="signature_delta"&&i&&i.kind==="thinking"&&(i.signature=l.signature);break}case"content_block_stop":{let i=n[a.index];i&&i.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:i.name,toolUseIds:[i.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let i=a.usage;i&&(o!==null?(o.output_tokens=i.output_tokens,i.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=i.cache_creation_input_tokens),i.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=i.cache_read_input_tokens),i.input_tokens!=null&&(o.input_tokens=i.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:i.cache_creation_input_tokens??null,cache_read_input_tokens:i.cache_read_input_tokens??null,inference_geo:null,input_tokens:i.input_tokens??0,output_tokens:i.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}}catch(a){yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}yield{kind:"turn-result",result:Iu(n,r,o)}}var Ru=0;function _u(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(`
4
- `)[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:""}async function*Ur(e){let t=e.maxToolUseIterations??Ru,n={stopReason:null},r=0,o=Mu(),s=Date.now();for(;;){if(e.signal.aborted)return;let a=bn()?vs(e.messages,wn()):e.messages,i={model:e.model,max_tokens:e.maxTokens,messages:a,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0?{tools:e.tools}:{}},l;try{l=await Promise.resolve(e.client.messages.create(i,{headers:e.headers,signal:e.signal}))}catch(h){if(e.signal.aborted)return;yield{type:"error",error:h instanceof Error?h:new Error(String(h))};return}let c=null,u=!1;try{for await(let h of Ps(l,e.ctx))if(h.kind==="event"){if(h.event.type==="error"){yield h.event,u=!0;break}yield h.event}else{c=h.result;break}}catch(h){if(e.signal.aborted)return;yield{type:"error",error:h instanceof Error?h:new Error(String(h))};return}if(u)return;if(c===null){yield{type:"turn.completed",usage:n,sessionId:e.ctx.sessionId};return}if(n=Es(n,Ts(c.usage,c.stopReason)),c.stopReason!=="tool_use"){c.text.length>0&&(yield{type:"assistant.message",text:c.text,sessionId:e.ctx.sessionId},c.text.length<=200&&(yield{type:"suggestion",suggestion:c.text,sessionId:e.ctx.sessionId})),e.messages.push({role:"assistant",content:c.assistantBlocks}),yield{type:"turn.completed",usage:n,sessionId:e.ctx.sessionId};return}e.messages.push({role:"assistant",content:c.assistantBlocks});let p=[];for(let h of c.toolUseBlocks)p.push({id:h.id,name:h.name,input:h.input,signal:e.signal}),yield{type:"tool.use.start",toolUseId:h.id,toolName:h.name,toolInput:_u(h.input),sessionId:e.ctx.sessionId};if(e.signal.aborted)return;let m;if(e.toolDispatcher.executeBatch)m=await e.toolDispatcher.executeBatch(p);else{m=[];for(let h of p){if(e.signal.aborted){m.push({content:"Tool call aborted",isError:!0});continue}try{m.push(await e.toolDispatcher.execute(h))}catch(k){let S=k instanceof Error?k.message:String(k);m.push({content:`Tool execution threw: ${S}`,isError:!0})}}}let f=[];for(let h=0;h<p.length;h++){let k=p[h],S=m[h];yield{type:"tool.output",toolUseId:k.id,content:S.content,...S.isError===!0?{isError:!0}:{},sessionId:e.ctx.sessionId},f.push({type:"tool_result",tool_use_id:k.id,content:S.content,...S.isError===!0?{is_error:!0}:{}})}let g={role:"user",content:f};e.messages.push(g),r+=1;let y=c.toolUseBlocks[c.toolUseBlocks.length-1];if(yield{type:"progress",progress:{taskId:o,description:"Tool-use loop",summary:`Iteration ${r}: used ${y?.name??"unknown"}`,lastToolName:y?.name,totalTokens:n.totalTokens??0,toolUses:r,durationMs:Date.now()-s},sessionId:e.ctx.sessionId},t>0&&r>=t){yield{type:"turn.completed",usage:{...n,stopReason:"tool_use_loop_capped"},sessionId:e.ctx.sessionId};return}}}var $u=["You are a conversation-summarization assistant. The user will paste a","prior conversation between a user and an AI assistant that includes tool","calls and tool results. Produce a concise but complete summary that lets","the AI continue the conversation without losing track.","","Preserve, in this priority order:","1. The user's original intent, explicit asks, constraints, corrections,"," and preferences stated during the conversation.","2. Tool decisions and their outcomes \u2014 file paths read or written, shell"," commands run, search queries, URLs fetched, code edits made, tests"," run, errors observed, and whether each action succeeded or failed.","3. Current state: what has been completed, what remains unresolved, and"," the safest next action.","4. Open questions, pending decisions, blockers, and assumptions.","5. Key facts the assistant discovered (function locations, schemas,"," observed behaviors, important external findings).","","Drop prose narration, conversational filler, and exploratory dead-ends.","Drop verbatim tool output unless an exact snippet, error, path, command,","or result is needed for continuation.","Do not invent details. If something is uncertain, mark it explicitly.","Output plain text, no markdown headers. Aim for ~250 words; use up to","~400 only when needed to preserve tool state or unresolved tasks."].join(`
5
- `),Cs="[Compacted summary of earlier conversation]",As="Acknowledged. Continuing from the summary above.";function Ou(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function Is(e,t){if(t<=0)return e.length;let n=0;for(let r=e.length-1;r>=0;r--){let o=e[r];if(o&&Ou(o)&&(n+=1,n===t))return r}return-1}function Ms(e,t,n){let r=Du(e);return{model:t,max_tokens:n,system:$u,messages:[{role:"user",content:`Summarize the following conversation transcript. Follow the system instructions exactly.
2
+ var kd=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{config as Ns}from"dotenv";import{existsSync as Us,mkdirSync as wd,renameSync as Sd}from"fs";import{join as G,dirname as js}from"path";import{homedir as oo}from"os";import{fileURLToPath as vd}from"url";function pe(){return process.env.AFK_HOME||G(oo(),".afk")}function ut(){return G(pe(),"agent-framework")}function Pn(){return G(ut(),"forge-telemetry.jsonl")}function Ve(){return G(ut(),"briefs")}function Cn(){return G(ut(),"ceiling-ledger")}function An(){return G(pe(),"skills")}function ue(){return G(pe(),"plugins")}function Hs(){return G(process.cwd(),".afk")}function Bs(){return G(Hs(),"skills")}function so(){return G(Hs(),"plugins")}function U(){return G(ue(),".index.json")}function Fe(){return G(ue(),"cache")}function qt(e){return G(Fe(),e)}function io(){let e=vd(import.meta.url),t=js(e);return G(t,"bundled-plugins")}function In(){return G(pe(),"config")}function dt(){return G(pe(),"state")}function _n(){return G(pe(),"logs")}function Yt(){return G(dt(),"sessions")}function ao(){return G(dt(),"todos")}function Rn(){return G(dt(),"memory")}function Ne(){return G(In(),"afk.env")}function St(){return G(In(),"afk.config.json")}function Ws(){return G(oo(),".afk.env")}function Mn(){return G(oo(),".afk.config.json")}function xd(){return G(pe(),"sessions")}function Td(){return G(pe(),"todos")}function Ks(e,t){if(e!==t&&Us(e)&&!Us(t))try{wd(js(t),{recursive:!0}),Sd(e,t)}catch{}}function Gs(){Ks(xd(),Yt())}function zs(){Ks(Td(),ao())}import{Command as cS}from"commander";import lo from"chalk";function Vs(){let e=process.env.FORCE_COLOR;if(e&&e.length>0)return;let t=process.env.NO_COLOR;if(t&&t.length>0){lo.level=0;return}let n=process.env.CI;if(n&&n.length>0){lo.level=0;return}process.stdout.isTTY||(lo.level=0)}import fn from"chalk";import vh from"ora";import*as Ol from"node:os";import*as Dl from"node:path";function vt(){return process.env.AFK_DEBUG==="1"||process.env.DEBUG==="1"}function H(...e){vt()&&console.log(...e)}var Ce=class extends Error{constructor(t){super(t),this.name="AbortError"}},$n=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},be=class extends Error{constructor(n,r,o,s){super(n);this.event=r;this.reason=o;this.name="HookBlockedError",s?.cause!==void 0&&(this.cause=s.cause)}event;reason;cause};var Jt=class extends Error{constructor(n,r,o){super(o??`${n} provider does not support AgentConfig.${r}.`);this.provider=n;this.field=r;this.name="UnsupportedProviderConfigError"}provider;field};var On=class{queue=[];waiters=[];closed=!1;error=null;push(t){if(this.closed)throw new Error("Cannot push to closed queue");if(process.env.AFK_CODEX_DEBUG&&console.log("[queue] push:",t.type),H("\u{1F4E6} MessageQueue.push: event type=",t.type,"waiters=",this.waiters.length,"queue size=",this.queue.length),this.waiters.length>0){let n=this.waiters.shift();H("\u{1F4E6} MessageQueue.push: Resolving waiter immediately"),n?.({value:t,done:!1})}else this.queue.push(t),H("\u{1F4E6} MessageQueue.push: Added to queue, new size=",this.queue.length)}complete(){for(this.closed=!0;this.waiters.length>0;)this.waiters.shift()?.({value:void 0,done:!0})}fail(t){this.error=t,this.closed=!0;let n={type:"error",error:t};if(this.waiters.length>0)for(this.waiters.shift()?.({value:n,done:!1});this.waiters.length>0;)this.waiters.shift()?.({value:void 0,done:!0});else this.queue.push(n)}isClosed(){return this.closed}hasError(){return this.error}size(){return this.queue.length}async*[Symbol.asyncIterator](){for(H("\u{1F4E6} MessageQueue: Iterator started");;){if(this.queue.length>0){let n=this.queue.shift();if(H("\u{1F4E6} MessageQueue: Yielding queued event, type=",n?.type),n&&(yield n,n.type==="error")){H("\u{1F4E6} MessageQueue: Stopping after error");return}continue}if(this.closed){H("\u{1F4E6} MessageQueue: Closed and empty, stopping");return}H("\u{1F4E6} MessageQueue: Waiting for next event...");let t=await new Promise(n=>{this.waiters.push(n)});if(H("\u{1F4E6} MessageQueue: Got result, done=",t.done,"type=",t.value?.type),t.done)return;if(yield t.value,t.value.type==="error"){H("\u{1F4E6} MessageQueue: Stopping after error");return}}}};import sl from"@anthropic-ai/sdk";var Ed="claude-code-20250219,oauth-2025-04-20",Pd="claude-cli/1.0.0 (external, cli)",Cd="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;";function qs(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function co(e,t){return t==="oauth"?{authToken:e}:{apiKey:e}}function Dn(e,t,n){return e!=="oauth"?{}:{"anthropic-beta":Ed,"x-app":"cli","User-Agent":Pd,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function Ys(e){return e!=="oauth"?null:[{type:"text",text:Cd}]}import{execFileSync as Js}from"child_process";import{existsSync as Ad,readFileSync as Id,writeFileSync as _d}from"fs";import{homedir as Xs,userInfo as Qs}from"os";import{join as Zs}from"path";var Rd="9d1c250a-e61b-44d9-88ed-5944d1962f5e",Md="https://platform.claude.com/v1/oauth/token",$d=300*1e3;function ei(){let e=ni();if(e===void 0)return;let t=ri(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 ti(){let e=ni();if(e===void 0)return;let t=ri(e);if(t===void 0)return;if(t.expiresAt!==void 0&&t.expiresAt>Date.now()+$d)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 Od(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}:{}},Dd(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
3
+ `)}return n.accessToken}function ni(){if(process.platform==="darwin")try{return Js("security",["find-generic-password","-s","Claude Code-credentials","-a",Qs().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let e=Zs(Xs(),".claude",".credentials.json");if(!Ad(e))return;try{return Id(e,"utf-8")}catch{return}}}function ri(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},a=r.refreshToken;typeof a=="string"&&a.length>0&&(s.refreshToken=a);let i=r.expiresAt;return typeof i=="number"&&(s.expiresAt=i),s}async function Od(e){try{let t=await fetch(Md,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:e,client_id:Rd})});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 Dd(e){if(process.platform==="darwin")Js("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",Qs().username,"-w",e],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let t=Zs(Xs(),".claude",".credentials.json");_d(t,e,"utf-8")}}import{randomUUID as or}from"node:crypto";function Ln(){let e=process.env.AFK_DISABLE_PROMPT_CACHE;if(e===void 0||e.length===0)return!0;let t=e.toLowerCase();return!(t==="1"||t==="true"||t==="yes"||t==="on")}function Fn(){let e=process.env.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":"1h"}function oi(e,t){if(e.length===0)return e;let n=e[e.length-1],r=ii(n,t);return r===n?e:[...e.slice(0,-1),r]}function si(e,t){if(e.length===0)return e;let n=e[e.length-1],r=Ld(n,t);return r===n?e:[...e.slice(0,-1),r]}function Ld(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=ii(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function ii(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}import{randomUUID as Ud}from"node:crypto";function ai(e,t){if(!e)return{stopReason:t??null};let n={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};return e.cache_read_input_tokens!=null&&(n.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(n.cacheCreationTokens=e.cache_creation_input_tokens),n.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n}function li(e,t){let n=(u,p)=>{if(!(u==null&&p==null))return(u??0)+(p??0)},r=(u,p)=>p!==void 0?p:u,o={stopReason:t.stopReason??e.stopReason??null},s=n(e.inputTokens,t.inputTokens);s!==void 0&&(o.inputTokens=s);let a=n(e.outputTokens,t.outputTokens);a!==void 0&&(o.outputTokens=a);let i=r(e.cachedInputTokens,t.cachedInputTokens);i!==void 0&&(o.cachedInputTokens=i);let l=r(e.cacheCreationTokens,t.cacheCreationTokens);l!==void 0&&(o.cacheCreationTokens=l);let c=n(e.totalTokens,t.totalTokens);return c!==void 0&&(o.totalTokens=c),o}function Fd(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function Nd(e,t,n){let r=[],o=[];for(let i of e)i&&(i.kind==="text"?(r.push({type:"text",text:i.text}),o.push(i.text)):i.kind==="thinking"?r.push({type:"thinking",thinking:i.thinking,signature:i.signature}):r.push({type:"tool_use",id:i.id,name:i.name,input:Fd(i.partialJson)}));let s=i=>i.type==="tool_use",a=r.filter(s);return{stopReason:t,assistantBlocks:r,toolUseBlocks:a,usage:n,text:o.join("")}}async function*ci(e,t){let n=[],r=null,o=null,s=!1;try{process.env.AFK_TELEGRAM_TRACE&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(process.env.AFK_TELEGRAM_TRACE&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let i=a.message?.usage;i&&(o={...i});break}case"content_block_start":{let i=a.content_block;i.type==="text"?n[a.index]={kind:"text",text:""}:i.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:i.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:i.id,name:i.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:i.id,toolName:i.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let i=n[a.index],l=a.delta;l.type==="text_delta"?(i&&i.kind==="text"&&(i.text+=l.text),yield{kind:"event",event:{type:"delta.text",text:l.text,sessionId:t.sessionId}}):l.type==="input_json_delta"?i&&i.kind==="tool_use"&&(i.partialJson+=l.partial_json):l.type==="thinking_delta"?(i&&i.kind==="thinking"&&(i.thinking+=l.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:l.thinking,sessionId:t.sessionId}}):l.type==="signature_delta"&&i&&i.kind==="thinking"&&(i.signature=l.signature);break}case"content_block_stop":{let i=n[a.index];i&&i.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:i.name,toolUseIds:[i.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let i=a.usage;i&&(o!==null?(o.output_tokens=i.output_tokens,i.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=i.cache_creation_input_tokens),i.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=i.cache_read_input_tokens),i.input_tokens!=null&&(o.input_tokens=i.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:i.cache_creation_input_tokens??null,cache_read_input_tokens:i.cache_read_input_tokens??null,inference_geo:null,input_tokens:i.input_tokens??0,output_tokens:i.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}process.env.AFK_TELEGRAM_TRACE&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){process.env.AFK_TELEGRAM_TRACE&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}process.env.AFK_TELEGRAM_TRACE&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:Nd(n,r,o)}}var jd=0;function Hd(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(`
4
+ `)[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:""}async function*uo(e){let t=e.maxToolUseIterations??jd,n={stopReason:null},r=0,o=Ud(),s=Date.now();for(;;){if(e.signal.aborted)return;let a=Ln()?si(e.messages,Fn()):e.messages,i={model:e.model,max_tokens:e.maxTokens,messages:a,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0?{tools:e.tools}:{}},l;try{l=await Promise.resolve(e.client.messages.create(i,{headers:e.headers,signal:e.signal}))}catch(h){if(e.signal.aborted)return;yield{type:"error",error:h instanceof Error?h:new Error(String(h))};return}let c=null,u=!1;try{process.env.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let h of ci(l,e.ctx))if(process.env.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",h.kind,h.kind==="event"?h.event.type:""),h.kind==="event"){if(h.event.type==="error"){yield h.event,u=!0;break}yield h.event}else{c=h.result;break}process.env.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",c?"set":"null")}catch(h){if(e.signal.aborted)return;yield{type:"error",error:h instanceof Error?h:new Error(String(h))};return}if(u)return;if(c===null){yield{type:"turn.completed",usage:n,sessionId:e.ctx.sessionId};return}if(n=li(n,ai(c.usage,c.stopReason)),c.stopReason!=="tool_use"){c.text.length>0&&(yield{type:"assistant.message",text:c.text,sessionId:e.ctx.sessionId},c.text.length<=200&&(yield{type:"suggestion",suggestion:c.text,sessionId:e.ctx.sessionId})),e.messages.push({role:"assistant",content:c.assistantBlocks}),yield{type:"turn.completed",usage:n,sessionId:e.ctx.sessionId};return}e.messages.push({role:"assistant",content:c.assistantBlocks});let p=[];for(let h of c.toolUseBlocks)p.push({id:h.id,name:h.name,input:h.input,signal:e.signal}),yield{type:"tool.use.start",toolUseId:h.id,toolName:h.name,toolInput:Hd(h.input),sessionId:e.ctx.sessionId};if(e.signal.aborted)return;let m;if(e.toolDispatcher.executeBatch)m=await e.toolDispatcher.executeBatch(p);else{m=[];for(let h of p){if(e.signal.aborted){m.push({content:"Tool call aborted",isError:!0});continue}try{m.push(await e.toolDispatcher.execute(h))}catch(k){let v=k instanceof Error?k.message:String(k);m.push({content:`Tool execution threw: ${v}`,isError:!0})}}}let f=[];for(let h=0;h<p.length;h++){let k=p[h],v=m[h];yield{type:"tool.output",toolUseId:k.id,content:v.content,...v.isError===!0?{isError:!0}:{},sessionId:e.ctx.sessionId},f.push({type:"tool_result",tool_use_id:k.id,content:v.content,...v.isError===!0?{is_error:!0}:{}})}let g={role:"user",content:f};e.messages.push(g),r+=1;let y=c.toolUseBlocks[c.toolUseBlocks.length-1];if(yield{type:"progress",progress:{taskId:o,description:"Tool-use loop",summary:`Iteration ${r}: used ${y?.name??"unknown"}`,lastToolName:y?.name,totalTokens:n.totalTokens??0,toolUses:r,durationMs:Date.now()-s},sessionId:e.ctx.sessionId},t>0&&r>=t){yield{type:"turn.completed",usage:{...n,stopReason:"tool_use_loop_capped"},sessionId:e.ctx.sessionId};return}}}var Bd=["You are a conversation-summarization assistant. The user will paste a","prior conversation between a user and an AI assistant that includes tool","calls and tool results. Produce a concise but complete summary that lets","the AI continue the conversation without losing track.","","Preserve, in this priority order:","1. The user's original intent, explicit asks, constraints, corrections,"," and preferences stated during the conversation.","2. Tool decisions and their outcomes \u2014 file paths read or written, shell"," commands run, search queries, URLs fetched, code edits made, tests"," run, errors observed, and whether each action succeeded or failed.","3. Current state: what has been completed, what remains unresolved, and"," the safest next action.","4. Open questions, pending decisions, blockers, and assumptions.","5. Key facts the assistant discovered (function locations, schemas,"," observed behaviors, important external findings).","","Drop prose narration, conversational filler, and exploratory dead-ends.","Drop verbatim tool output unless an exact snippet, error, path, command,","or result is needed for continuation.","Do not invent details. If something is uncertain, mark it explicitly.","Output plain text, no markdown headers. Aim for ~250 words; use up to","~400 only when needed to preserve tool state or unresolved tasks."].join(`
5
+ `),ui="[Compacted summary of earlier conversation]",di="Acknowledged. Continuing from the summary above.";function Wd(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function pi(e,t){if(t<=0)return e.length;let n=0;for(let r=e.length-1;r>=0;r--){let o=e[r];if(o&&Wd(o)&&(n+=1,n===t))return r}return-1}function mi(e,t,n){let r=Kd(e);return{model:t,max_tokens:n,system:Bd,messages:[{role:"user",content:`Summarize the following conversation transcript. Follow the system instructions exactly.
6
6
 
7
7
  <transcript>
8
8
  `+r+`
9
- </transcript>`}],stream:!0}}function Rs(e,t,n){return[{role:"user",content:Cs+`
9
+ </transcript>`}],stream:!0}}function fi(e,t,n){return[{role:"user",content:ui+`
10
10
 
11
- `+n},{role:"assistant",content:As},...e.slice(t)]}function _s(e,t,n){let r=Lu(e.slice(0,t)),o=Cs.length+2+n.length+As.length,s=Math.max(0,r-o);return Math.round(s/4)}function Du(e){let t=[];for(let n of e){let r=n.role==="user"?"User":"Assistant";if(t.push(r+":"),typeof n.content=="string")t.push(n.content);else if(Array.isArray(n.content))for(let o of n.content){let s=o.type;if(s==="text"&&"text"in o)t.push(o.text);else if(s==="tool_use"){let a=o.name??"unknown",i=$s(o.input);t.push(`[tool call: ${a} ${i}]`)}else if(s==="tool_result"){let a=o.content;t.push(`[tool result: ${Os(a)}]`)}else s==="image"?t.push("[image]"):s==="document"&&t.push("[document]")}t.push("")}return t.join(`
12
- `).trim()}function $s(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function Os(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function Lu(e){let t=0;for(let n of e)if(typeof n.content=="string")t+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?t+=r.text.length:o==="tool_use"?t+=$s(r.input).length:o==="tool_result"&&(t+=Os(r.content).length)}return t}import{z as q}from"zod";import{mkdir as ti,appendFile as ni}from"fs/promises";import{join as Kr}from"path";var Ds={"audit-fit":{"01-skill-inspector.md":`# Skill Inspector
11
+ `+n},{role:"assistant",content:di},...e.slice(t)]}function gi(e,t,n){let r=Gd(e.slice(0,t)),o=ui.length+2+n.length+di.length,s=Math.max(0,r-o);return Math.round(s/4)}function Kd(e){let t=[];for(let n of e){let r=n.role==="user"?"User":"Assistant";if(t.push(r+":"),typeof n.content=="string")t.push(n.content);else if(Array.isArray(n.content))for(let o of n.content){let s=o.type;if(s==="text"&&"text"in o)t.push(o.text);else if(s==="tool_use"){let a=o.name??"unknown",i=hi(o.input);t.push(`[tool call: ${a} ${i}]`)}else if(s==="tool_result"){let a=o.content;t.push(`[tool result: ${yi(a)}]`)}else s==="image"?t.push("[image]"):s==="document"&&t.push("[document]")}t.push("")}return t.join(`
12
+ `).trim()}function hi(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function yi(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function Gd(e){let t=0;for(let n of e)if(typeof n.content=="string")t+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?t+=r.text.length:o==="tool_use"?t+=hi(r.input).length:o==="tool_result"&&(t+=yi(r.content).length)}return t}import{z as J}from"zod";import{mkdir as Fi,appendFile as Ni}from"fs/promises";import{join as ho}from"path";var bi={"audit-fit":{"01-skill-inspector.md":`# Skill Inspector
13
13
 
14
14
  You are an inspector auditing skills for correct type categorization. Skills come from two sources:
15
15
  - **User-scope** \u2014 authored directly by the user under \`~/.afk/skills/<name>/SKILL.md\`
@@ -801,9 +801,9 @@ Field semantics:
801
801
  - \`status_reason\` \u2014 short reason when \`FAIL\`; omit when \`PASS\`.
802
802
  - \`issues\` \u2014 concrete blockers with file:line citations where possible. Empty array when \`PASS\`.
803
803
  - \`summary\` \u2014 optional narrative; the orchestrator may surface it to the user. Keep it concise.
804
- `}};function Y(e){let t=Ds[e];if(!t){let n=Object.keys(Ds).sort(),r=n.length>0?"Available: "+n.join(", "):"";throw new Error("Unknown skill: "+e+". "+r)}return t}var Sn=new Map;function Ie(e){Sn.set(e.name,e)}function se(e){let t=Sn.get(e);if(t)return t;let n=Array.from(Sn.keys()).sort(),r=n.length>0?`
805
- Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${e}${r}`)}function st(){return Array.from(Sn.keys()).sort()}var vn=class{nodes=new Map;register(t,n){this.nodes.has(t)||this.nodes.set(t,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(t){return this.nodes.has(t)}getController(t){return this.nodes.get(t)?.controller}linkChild(t,n){let r=this.nodes.get(t),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${t} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=t,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==t||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==t||s.cascading)return;let a=this.nodes.get(t);if(!a)return;let i={parentId:t,childId:n,reason:s.controller.signal.reason};for(let l of a.listeners)try{l(i)}catch{}},{once:!0})}onChildAborted(t,n){let r=this.nodes.get(t);if(!r)throw new Error(`AbortGraph: ${t} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(t,n){let r=this.nodes.get(t);if(!r||r.controller.signal.aborted)return;let o=[],s=[...r.children],a=new Set;for(;s.length;){let i=s.shift();if(a.has(i))continue;a.add(i);let l=this.nodes.get(i);if(l){l.cascading=!0,o.push(i);for(let c of l.children)s.push(c)}}r.controller.abort(n);for(let i of o){let l=this.nodes.get(i);l&&!l.controller.signal.aborted&&l.controller.abort(n)}}dispose(t){let n=this.nodes.get(t);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(t);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(t)}}};var xn=0,jr=5e3;async function Tn(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((s,a)=>{r=setTimeout(()=>{let i=n.label?` (${n.label})`:"",l=new hn(`Operation timed out after ${t}ms${i}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),a(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}async function Ls(e,t,n={}){e&&await e.dispatch(t,n.signal)}async function Fs(e,t,n={}){if(!e)return{};try{return await e.dispatch(t,n.signal)}catch(r){return r instanceof he||r instanceof Ee?(V(`SubagentStop hook swallowed ${r.name}: ${r.message}`),n.onError?.(r),{}):(V(`SubagentStop hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r))),{})}}import{mkdir as Fu,writeFile as Nu}from"fs/promises";import{dirname as Uu,join as ju}from"path";function Bu(){return ju(rt(),"routing-decisions.jsonl")}async function Ns(e){if(!(process.env.VITEST||process.env.NODE_ENV==="test"))try{let t=Bu();await Fu(Uu(t),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r=JSON.stringify({ts:n,surface:"afk",...e})+`
806
- `;await Nu(t,r,{flag:"a"})}catch{}}import{AsyncLocalStorage as Hu}from"node:async_hooks";var Us=new Hu;function En(e,t){return Us.run(e,t)}function $e(){return Us.getStore()}function js(e){let t=Wu(e);return t!==void 0?t:Ku(e)}function Wu(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return Bs(n.trim())}function Ku(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=Gu(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=Bs(r);if(o!==void 0)return o}}function Gu(e,t){let n=0,r=!1,o=!1;for(let s=t;s>=0;s--){let a=e[s];if(o){o=!1;continue}if(r){if(a==="\\"){o=!0;continue}a==='"'&&(r=!1);continue}if(a==='"'){r=!0;continue}if(a==="}")n++;else if(a==="{"&&(n--,n===0))return s}return-1}function Bs(e){try{return JSON.parse(e)}catch{return}}function Hs(e,t,n,r){if(!r)return{id:e,status:t,message:n};let o=js(n.content),s=r.safeParse(o);return s.success?{id:e,status:t,message:n,output:s.data}:{id:e,status:"failed",message:n,error:new Error(`structured output did not match schema: ${s.error.message}`,{cause:s.error}),schemaError:s.error}}function Ws(e,t,n){let r=n instanceof Error?n:new Error(String(n));return{id:e,status:t,error:r}}function Z(e){return`${e.status}${e.error?`: ${e.error.message}`:""}`}var Pn=class{constructor(t,n,r,o,s,a,i,l,c,u,p,m,f){this.id=t;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=a;this.hookRegistry=i;this.onTerminal=l;this.parentInputStreamRef=c;this.parentAbortSignal=u;this.agentType=p;this.progressSink=m,this.parentId=f}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;get status(){return this.currentStatus}async run(t){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 n=Date.now(),r=Tn(this.streamToFinalMessage(t),this.timeoutMs,{controller:this.controller,label:this.id});this.inFlight=r;try{let o=await r;return this.lastMessage=o.content,this.lastDurationMs=Date.now()-n,this.currentStatus="succeeded",this.latestTerminalStatus="succeeded",this.onTerminal(),o}catch(o){throw this.lastDurationMs=Date.now()-n,this.currentStatus!=="cancelled"&&(this.currentStatus="failed",this.latestTerminalStatus="failed"),this.onTerminal(),o}finally{this.inFlight=null}}async streamToFinalMessage(t){let n,r="",o,s=this.progressSink??$e(),a={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let i of this.session.sendMessageStream(t))if(s&&s(i,a),i.type==="chunk"&&i.chunk.type==="content"&&(r+=i.chunk.content),i.type==="message")n=i.message;else if(i.type==="error"){o=i.error;break}else if(i.type==="done")break;if(o)throw o;if(n)return n;if(r.length>0)return{role:"assistant",content:r,timestamp:new Date};throw new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t){try{let n=await this.run(t);return Hs(this.id,this.currentStatus,n,this.outputSchema)}catch(n){return Ws(this.id,this.currentStatus,n)}}runInBackground(t,n){this.runToResult(t).then(r=>{n?.(r)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled";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 Fs(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:t,lastMessage:this.lastMessage,agentType:this.agentType,durationMs:this.lastDurationMs});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 _=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;abortGraph=new vn;rootId;rootController;counter=0;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,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)}abortAll(t){this.abortGraph.abort(this.rootId,t)}async forkSubagent(t){let n=`${t.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=t.parent.sessionId,o=t.config.hookRegistry??this.hookRegistry;o&&await Ls(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let a={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:t.config.apiKey||this.parentApiKey,hookRegistry:t.config.hookRegistry??this.hookRegistry,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0)},i=new de(a),l=t.parent.getInputStreamRef?.(),c=t.parent.abortSignal,u=this.progressSink??$e(),p=new Pn(n,i,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??xn,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},l,c,t.idPrefix,u,t.parent.sessionId);return this.active.set(n,p),await Ns({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,parent_session_id:t.parent.sessionId}),p}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 Cn(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((i,l)=>l)),a=e.map((i,l)=>i.handle.runToResult(i.prompt).then(c=>{if(o[l]=c,s.delete(l),n&&c.status!=="succeeded")for(let u of s){let p=e[u];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}));return await Promise.all(a),r&&await Promise.allSettled(e.map(i=>i.handle.teardown())),o}import{fileURLToPath as zu}from"node:url";import{dirname as Vu}from"node:path";var Yu=zu(import.meta.url),dw=Vu(Yu),pe={name:"research-agent",systemPrompt:`---
804
+ `}};function Y(e){let t=bi[e];if(!t){let n=Object.keys(bi).sort(),r=n.length>0?"Available: "+n.join(", "):"";throw new Error("Unknown skill: "+e+". "+r)}return t}var Nn=new Map;function Me(e){Nn.set(e.name,e)}function le(e){let t=Nn.get(e);if(t)return t;let n=Array.from(Nn.keys()).sort(),r=n.length>0?`
805
+ Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${e}${r}`)}function pt(){return Array.from(Nn.keys()).sort()}var Un=class{nodes=new Map;register(t,n){this.nodes.has(t)||this.nodes.set(t,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(t){return this.nodes.has(t)}getController(t){return this.nodes.get(t)?.controller}linkChild(t,n){let r=this.nodes.get(t),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${t} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=t,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==t||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==t||s.cascading)return;let a=this.nodes.get(t);if(!a)return;let i={parentId:t,childId:n,reason:s.controller.signal.reason};for(let l of a.listeners)try{l(i)}catch{}},{once:!0})}onChildAborted(t,n){let r=this.nodes.get(t);if(!r)throw new Error(`AbortGraph: ${t} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(t,n){let r=this.nodes.get(t);if(!r||r.controller.signal.aborted)return;let o=[],s=[...r.children],a=new Set;for(;s.length;){let i=s.shift();if(a.has(i))continue;a.add(i);let l=this.nodes.get(i);if(l){l.cascading=!0,o.push(i);for(let c of l.children)s.push(c)}}r.controller.abort(n);for(let i of o){let l=this.nodes.get(i);l&&!l.controller.signal.aborted&&l.controller.abort(n)}}dispose(t){let n=this.nodes.get(t);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(t);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(t)}}};var jn=0,po=5e3;async function Hn(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((s,a)=>{r=setTimeout(()=>{let i=n.label?` (${n.label})`:"",l=new $n(`Operation timed out after ${t}ms${i}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),a(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}async function ki(e,t,n={}){e&&await e.dispatch(t,n.signal)}async function wi(e,t,n={}){if(!e)return{};try{return await e.dispatch(t,n.signal)}catch(r){return r instanceof be||r instanceof Ce?(H(`SubagentStop hook swallowed ${r.name}: ${r.message}`),n.onError?.(r),{}):(H(`SubagentStop hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r))),{})}}import{mkdir as zd,writeFile as Vd}from"fs/promises";import{dirname as qd,join as Yd}from"path";function Jd(){return Yd(ut(),"routing-decisions.jsonl")}async function qe(e){if(!(process.env.VITEST||process.env.NODE_ENV==="test"))try{let t=Jd();await zd(qd(t),{recursive:!0});let r={ts:new Date().toISOString().split(".")[0]+"Z",surface:"afk"};for(let[s,a]of Object.entries(e))a!==void 0&&(r[s]=a);let o=JSON.stringify(r)+`
806
+ `;await Vd(t,o,{flag:"a"})}catch{}}import{AsyncLocalStorage as Xd}from"node:async_hooks";var Si=new Xd;function Bn(e,t){return Si.run(e,t)}function Ue(){return Si.getStore()}function vi(e){let t=Qd(e);return t!==void 0?t:Zd(e)}function Qd(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return xi(n.trim())}function Zd(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=ep(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=xi(r);if(o!==void 0)return o}}function ep(e,t){let n=0,r=!1,o=!1;for(let s=t;s>=0;s--){let a=e[s];if(o){o=!1;continue}if(r){if(a==="\\"){o=!0;continue}a==='"'&&(r=!1);continue}if(a==='"'){r=!0;continue}if(a==="}")n++;else if(a==="{"&&(n--,n===0))return s}return-1}function xi(e){try{return JSON.parse(e)}catch{return}}function Ti(e,t,n,r){if(!r)return{id:e,status:t,message:n};let o=vi(n.content),s=r.safeParse(o);return s.success?{id:e,status:t,message:n,output:s.data}:{id:e,status:"failed",message:n,error:new Error(`structured output did not match schema: ${s.error.message}`,{cause:s.error}),schemaError:s.error}}function Ei(e,t,n){let r=n instanceof Error?n:new Error(String(n));return{id:e,status:t,error:r}}function ee(e){return`${e.status}${e.error?`: ${e.error.message}`:""}`}var Wn=class{constructor(t,n,r,o,s,a,i,l,c,u,p,m,f){this.id=t;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=a;this.hookRegistry=i;this.onTerminal=l;this.parentInputStreamRef=c;this.parentAbortSignal=u;this.agentType=p;this.progressSink=m,this.parentId=f}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;get status(){return this.currentStatus}async run(t){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 n=Date.now(),r=Hn(this.streamToFinalMessage(t),this.timeoutMs,{controller:this.controller,label:this.id});this.inFlight=r;try{let o=await r;return this.lastMessage=o.content,this.lastDurationMs=Date.now()-n,this.currentStatus="succeeded",this.latestTerminalStatus="succeeded",this.onTerminal(),o}catch(o){throw this.lastDurationMs=Date.now()-n,this.currentStatus!=="cancelled"&&(this.currentStatus="failed",this.latestTerminalStatus="failed"),this.onTerminal(),o}finally{this.inFlight=null}}async streamToFinalMessage(t){let n,r="",o,s=this.progressSink??Ue(),a={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let i of this.session.sendMessageStream(t))if(s&&s(i,a),i.type==="chunk"&&i.chunk.type==="content"&&(r+=i.chunk.content),i.type==="message")n=i.message;else if(i.type==="error"){o=i.error;break}else if(i.type==="done")break;if(o)throw o;if(n)return n;if(r.length>0)return{role:"assistant",content:r,timestamp:new Date};throw new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t){try{let n=await this.run(t);return Ti(this.id,this.currentStatus,n,this.outputSchema)}catch(n){return Ei(this.id,this.currentStatus,n)}}runInBackground(t,n){this.runToResult(t).then(r=>{n?.(r)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled";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 wi(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:t,lastMessage:this.lastMessage,agentType:this.agentType,durationMs:this.lastDurationMs});if(n.injectContext&&this.parentInputStreamRef)if(this.parentAbortSignal?.aborted)H(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else try{this.parentInputStreamRef.pushUserMessage(n.injectContext)}catch(r){H(`Failed to inject context from SubagentStop handler: ${String(r)}`)}this.onTerminal()}};var M=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;abortGraph=new Un;rootId;rootController;counter=0;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,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)}abortAll(t){this.abortGraph.abort(this.rootId,t)}async forkSubagent(t){let n=`${t.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=t.parent.sessionId,o=t.config.hookRegistry??this.hookRegistry;o&&await ki(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let a={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:t.config.apiKey||this.parentApiKey,hookRegistry:t.config.hookRegistry??this.hookRegistry,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0)},i=new me(a),l=t.parent.getInputStreamRef?.(),c=t.parent.abortSignal,u=this.progressSink??Ue(),p=new Wn(n,i,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??jn,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},l,c,t.idPrefix,u,t.parent.sessionId);return this.active.set(n,p),await qe({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,parent_session_id:t.parent.sessionId}),p}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 Kn(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((i,l)=>l)),a=e.map((i,l)=>i.handle.runToResult(i.prompt).then(c=>{if(o[l]=c,s.delete(l),n&&c.status!=="succeeded")for(let u of s){let p=e[u];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}));return await Promise.all(a),r&&await Promise.allSettled(e.map(i=>i.handle.teardown())),o}import{fileURLToPath as tp}from"node:url";import{dirname as np}from"node:path";var rp=tp(import.meta.url),Sv=np(rp),fe={name:"research-agent",systemPrompt:`---
807
807
  name: research-agent
808
808
  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.
809
809
  model: sonnet
@@ -853,45 +853,45 @@ Unless the dispatcher specifies a different schema, return:
853
853
  \`\`\`
854
854
 
855
855
  If \`scope_check\` flags implementation (non-git), the orchestrator should dispatch a different sub-agent type for follow-up. Do not re-dispatch the same task through \`research-agent\`.
856
- `,sourcePath:"agent-framework-private/agents/research-agent.md",allowedTools:["Read","Grep","Glob","WebFetch","WebSearch"],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."};import{existsSync as He,readdirSync as ad,readFileSync as ld}from"fs";import{join as Oe}from"path";import{existsSync as Hr,readFileSync as nd,readdirSync as rd,statSync as od}from"fs";import{join as Kt,resolve as Ys}from"path";import{existsSync as Gs,mkdirSync as qu,readFileSync as Ju,renameSync as Qu,writeFileSync as Xu,unlinkSync as Zu}from"fs";import{dirname as Ks,join as ed}from"path";import{randomBytes as td}from"crypto";function K(e=j()){if(!Gs(e))return An();try{let t=Ju(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return An();let r=n,o=r.plugins&&typeof r.plugins=="object"?r.plugins:{};if(r.version===1)return{version:2,plugins:o,marketplaces:{}};if(r.version===2){let s=r.marketplaces&&typeof r.marketplaces=="object"?r.marketplaces:{};return{version:2,plugins:o,marketplaces:s}}return An()}catch{return An()}}function Ht(e,t=j()){qu(Ks(t),{recursive:!0});let n=ed(Ks(t),`.index.json.${process.pid}.${td(4).toString("hex")}.tmp`),r=JSON.stringify(e,null,2);try{Xu(n,r,"utf8"),Qu(n,t)}catch(o){try{Gs(n)&&Zu(n)}catch{}throw o}}function Be(e,t,n=j()){let r=K(n);return r.plugins[e]=t,Ht(r,n),r}function zs(e,t=j()){let n=K(t);return e in n.plugins&&(delete n.plugins[e],Ht(n,t)),n}function Br(e,t,n=j()){let r=K(n),o=r.plugins[e];if(!o)throw new Error(`plugin "${e}" is not in the index`);return o.enabled=t,o.updatedAt=new Date().toISOString(),Ht(r,n),r}function Wt(e,t,n=j()){let r=K(n);return r.marketplaces[e]=t,Ht(r,n),r}function Vs(e,t=j()){let n=K(t),r=!1;e in n.marketplaces&&(delete n.marketplaces[e],r=!0);for(let[o,s]of Object.entries(n.plugins))s.marketplace===e&&(delete n.plugins[o],r=!0);return r&&Ht(n,t),n}function An(){return{version:2,plugins:{},marketplaces:{}}}var sd=5,qs="cache";function ye(e=le()){if(!Hr(e))return[];let t=e===le()?j():Kt(e,".index.json"),n=K(t),r=[];return Js(e,e,0,r,new Set,n.plugins),r}function Js(e,t,n,r,o,s){if(n>sd||o.has(t))return;if(o.add(t),Hr(Kt(t,".claude-plugin","plugin.json"))){let i=Wr(e,t);if(i===null){r.push({type:"local",path:t});return}if(i.layout==="cache"){let c=s[i.key];if(!c||c.enabled===!1)return;r.push({type:"local",path:t});return}let l=s[i.key];if(l&&l.enabled===!1)return;r.push({type:"local",path:t});return}let a;try{a=rd(t)}catch{return}for(let i of a){if(i.startsWith("."))continue;let l=Kt(t,i),c;try{c=od(l)}catch{continue}c.isDirectory()&&Js(e,l,n+1,r,o,s)}}function Wr(e,t){if(!t.startsWith(e))return null;let n=t.slice(e.length).replace(/^\/+/,"");if(!n)return null;let r=n.split("/").filter(s=>s.length>0);if(r.length===0)return null;if(r[0]===qs&&r.length>=3){let s=r[1];if(s){let a=Kt(e,qs,s),l=id(a,t)??r[2];if(l)return{layout:"cache",key:`${s}:${l}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function id(e,t){let n=Kt(e,".claude-plugin","marketplace.json");if(!Hr(n))return null;let r;try{r=JSON.parse(nd(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let s=Ys(t);for(let a of o){if(!a||typeof a!="object")continue;let i=a;if(!(typeof i.name!="string"||typeof i.source!="string")&&!(!i.source.startsWith("./")&&!i.source.startsWith("../"))&&Ys(e,i.source)===s)return i.name}return null}var Qs=["command","agent"];function Xs(e=ue()){let t=[],n=Oe(e,"skills");if(He(n))for(let r of In(n)){let o=Oe(n,r,"SKILL.md");He(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of Qs){let o=Oe(e,`${r}s`);if(He(o))for(let s of In(o))s.endsWith(".md")&&t.push({path:Oe(o,s),type:r,source:"user"})}return t}function Zs(e=le()){if(!He(e))return[];let t=[],n=ye(e);for(let r of n){let s=Wr(e,r.path)?.key,a=Oe(r.path,"skills");if(He(a))for(let i of In(a)){let l=Oe(a,i,"SKILL.md");if(!He(l))continue;let c={path:l,type:"skill",source:"plugin"};s&&(c.plugin_key=s),t.push(c)}for(let i of Qs){let l=Oe(r.path,`${i}s`);if(He(l))for(let c of In(l)){if(!c.endsWith(".md"))continue;let u={path:Oe(l,c),type:i,source:"plugin"};s&&(u.plugin_key=s),t.push(u)}}}return t}function ei(e=Oe(ue(),"settings.json")){if(!He(e))return[];try{let t=ld(e,"utf8"),r=JSON.parse(t).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[s,a]of Object.entries(r))if(Array.isArray(a))for(let i=0;i<a.length;i++)o.push({event:s,index:i,raw:a[i]});return o}catch{return[]}}function In(e){try{return ad(e).filter(t=>!t.startsWith("."))}catch{return[]}}var oi=q.object({path:q.string(),type:q.enum(["skill","command","agent","hook"]),source:q.enum(["user","plugin"]),plugin_key:q.string().optional(),verdict:q.enum(["correct","misfit","outlier"]),recommended_type:q.string(),rationale:q.string(),confidence:q.enum(["high","med","low"])}),ri=q.record(q.string(),q.record(q.string(),q.number())),Nw=q.object({inventory:q.object({user:ri,plugin:ri}),misfits:q.array(oi),briefs_written:q.number(),total_artifacts:q.number()}),cd=q.object({writeBriefs:q.boolean().optional(),scope:q.enum(["user","plugin","all"]).optional()}),ud=["skill","command","agent"],si=["skill","command","agent","hook"];function dd(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function pd(e){let t=()=>{let s={};for(let a of si)s[a]={correct:0,misfit:0,outlier:0};return s},n={user:t(),plugin:t()};for(let s of e)n[s.source][s.type][s.verdict]+=1;let r={high:0,med:1,low:2},o=e.filter(s=>s.verdict==="misfit").slice().sort((s,a)=>r[s.confidence]-r[a.confidence]);return{inventory:n,misfits:o}}function md(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function fd(e){let t=e.filter(o=>o.source==="user"),n=e.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),t.length===0)r.push("(none discovered)");else for(let o of t)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let s=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${s})`)}return r.join(`
857
- `)}function gd(e,t){let n=["","## Discovered hooks (audit only these)",""];if(n.push(`Settings file (use this absolute path verbatim in each verdict's \`path\` field): \`${e}\``),n.push(""),t.length===0)return n.push("(no hooks discovered)"),n.join(`
856
+ `,sourcePath:"agent-framework-private/agents/research-agent.md",allowedTools:["Read","Grep","Glob","WebFetch","WebSearch"],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."};import{existsSync as Je,readdirSync as hp,readFileSync as yp}from"fs";import{join as He}from"path";import{existsSync as fo,readFileSync as dp,readdirSync as pp,statSync as mp}from"fs";import{join as Zt,resolve as _i}from"path";import{existsSync as Ci,mkdirSync as op,readFileSync as sp,renameSync as ip,writeFileSync as ap,unlinkSync as lp}from"fs";import{dirname as Pi,join as cp}from"path";import{randomBytes as up}from"crypto";function z(e=U()){if(!Ci(e))return Gn();try{let t=sp(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return Gn();let r=n,o=r.plugins&&typeof r.plugins=="object"?r.plugins:{};if(r.version===1)return{version:2,plugins:o,marketplaces:{}};if(r.version===2){let s=r.marketplaces&&typeof r.marketplaces=="object"?r.marketplaces:{};return{version:2,plugins:o,marketplaces:s}}return Gn()}catch{return Gn()}}function Xt(e,t=U()){op(Pi(t),{recursive:!0});let n=cp(Pi(t),`.index.json.${process.pid}.${up(4).toString("hex")}.tmp`),r=JSON.stringify(e,null,2);try{ap(n,r,"utf8"),ip(n,t)}catch(o){try{Ci(n)&&lp(n)}catch{}throw o}}function Ye(e,t,n=U()){let r=z(n);return r.plugins[e]=t,Xt(r,n),r}function Ai(e,t=U()){let n=z(t);return e in n.plugins&&(delete n.plugins[e],Xt(n,t)),n}function mo(e,t,n=U()){let r=z(n),o=r.plugins[e];if(!o)throw new Error(`plugin "${e}" is not in the index`);return o.enabled=t,o.updatedAt=new Date().toISOString(),Xt(r,n),r}function Qt(e,t,n=U()){let r=z(n);return r.marketplaces[e]=t,Xt(r,n),r}function Ii(e,t=U()){let n=z(t),r=!1;e in n.marketplaces&&(delete n.marketplaces[e],r=!0);for(let[o,s]of Object.entries(n.plugins))s.marketplace===e&&(delete n.plugins[o],r=!0);return r&&Xt(n,t),n}function Gn(){return{version:2,plugins:{},marketplaces:{}}}var fp=5,Ri="cache";function je(e=ue()){if(!fo(e))return[];let t=e===ue()?U():Zt(e,".index.json"),n=z(t),r=[];return Mi(e,e,0,r,new Set,n.plugins),r}function Mi(e,t,n,r,o,s){if(n>fp||o.has(t))return;if(o.add(t),fo(Zt(t,".claude-plugin","plugin.json"))){let i=go(e,t);if(i===null){r.push({type:"local",path:t});return}if(i.layout==="cache"){let c=s[i.key];if(!c||c.enabled===!1)return;r.push({type:"local",path:t});return}let l=s[i.key];if(l&&l.enabled===!1)return;r.push({type:"local",path:t});return}let a;try{a=pp(t)}catch{return}for(let i of a){if(i.startsWith("."))continue;let l=Zt(t,i),c;try{c=mp(l)}catch{continue}c.isDirectory()&&Mi(e,l,n+1,r,o,s)}}function go(e,t){if(!t.startsWith(e))return null;let n=t.slice(e.length).replace(/^\/+/,"");if(!n)return null;let r=n.split("/").filter(s=>s.length>0);if(r.length===0)return null;if(r[0]===Ri&&r.length>=3){let s=r[1];if(s){let a=Zt(e,Ri,s),l=gp(a,t)??r[2];if(l)return{layout:"cache",key:`${s}:${l}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function gp(e,t){let n=Zt(e,".claude-plugin","marketplace.json");if(!fo(n))return null;let r;try{r=JSON.parse(dp(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let s=_i(t);for(let a of o){if(!a||typeof a!="object")continue;let i=a;if(!(typeof i.name!="string"||typeof i.source!="string")&&!(!i.source.startsWith("./")&&!i.source.startsWith("../"))&&_i(e,i.source)===s)return i.name}return null}var $i=["command","agent"];function Oi(e=pe()){let t=[],n=He(e,"skills");if(Je(n))for(let r of zn(n)){let o=He(n,r,"SKILL.md");Je(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of $i){let o=He(e,`${r}s`);if(Je(o))for(let s of zn(o))s.endsWith(".md")&&t.push({path:He(o,s),type:r,source:"user"})}return t}function Di(e=ue()){if(!Je(e))return[];let t=[],n=je(e);for(let r of n){let s=go(e,r.path)?.key,a=He(r.path,"skills");if(Je(a))for(let i of zn(a)){let l=He(a,i,"SKILL.md");if(!Je(l))continue;let c={path:l,type:"skill",source:"plugin"};s&&(c.plugin_key=s),t.push(c)}for(let i of $i){let l=He(r.path,`${i}s`);if(Je(l))for(let c of zn(l)){if(!c.endsWith(".md"))continue;let u={path:He(l,c),type:i,source:"plugin"};s&&(u.plugin_key=s),t.push(u)}}}return t}function Li(e=He(pe(),"settings.json")){if(!Je(e))return[];try{let t=yp(e,"utf8"),r=JSON.parse(t).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[s,a]of Object.entries(r))if(Array.isArray(a))for(let i=0;i<a.length;i++)o.push({event:s,index:i,raw:a[i]});return o}catch{return[]}}function zn(e){try{return hp(e).filter(t=>!t.startsWith("."))}catch{return[]}}var ji=J.object({path:J.string(),type:J.enum(["skill","command","agent","hook"]),source:J.enum(["user","plugin"]),plugin_key:J.string().optional(),verdict:J.enum(["correct","misfit","outlier"]),recommended_type:J.string(),rationale:J.string(),confidence:J.enum(["high","med","low"])}),Ui=J.record(J.string(),J.record(J.string(),J.number())),qv=J.object({inventory:J.object({user:Ui,plugin:Ui}),misfits:J.array(ji),briefs_written:J.number(),total_artifacts:J.number()}),bp=J.object({writeBriefs:J.boolean().optional(),scope:J.enum(["user","plugin","all"]).optional()}),kp=["skill","command","agent"],Hi=["skill","command","agent","hook"];function wp(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function Sp(e){let t=()=>{let s={};for(let a of Hi)s[a]={correct:0,misfit:0,outlier:0};return s},n={user:t(),plugin:t()};for(let s of e)n[s.source][s.type][s.verdict]+=1;let r={high:0,med:1,low:2},o=e.filter(s=>s.verdict==="misfit").slice().sort((s,a)=>r[s.confidence]-r[a.confidence]);return{inventory:n,misfits:o}}function vp(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function xp(e){let t=e.filter(o=>o.source==="user"),n=e.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),t.length===0)r.push("(none discovered)");else for(let o of t)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let s=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${s})`)}return r.join(`
857
+ `)}function Tp(e,t){let n=["","## Discovered hooks (audit only these)",""];if(n.push(`Settings file (use this absolute path verbatim in each verdict's \`path\` field): \`${e}\``),n.push(""),t.length===0)return n.push("(no hooks discovered)"),n.join(`
858
858
  `);for(let r of t){let o=`${r.event}-${r.index}`;n.push(`### Hook \`${o}\``),n.push(""),n.push("```json"),n.push(JSON.stringify(r.raw,null,2)),n.push("```"),n.push("")}return n.join(`
859
- `)}function hd(e,t){if(!t)return{kind:"failure",message:`${e}: no result`};if(t.schemaError)return{kind:"failure",message:`${e}: schema mismatch \u2014 ${t.schemaError.message}`};if(t.status!=="succeeded"){let n=t.error?` \u2014 ${t.error.message}`:"";return{kind:"failure",message:`${e}: ${t.status}${n}`}}return t.output?{kind:"success",output:t.output}:{kind:"failure",message:`${e}: no output`}}async function yd(e,t,n){let r=n?.apiKey,o=typeof e=="object"&&e!==null?e:{},s=cd.parse(o),a=s.writeBriefs??!0,i=s.scope??"all",l=dd(i);if(!t?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let c=t.sessionId,u=Y("audit-fit"),p={skill:u["01-skill-inspector.md"],command:u["02-command-inspector.md"],agent:u["03-agent-inspector.md"],hook:u["04-hook-inspector.md"]};for(let E of si)if(!p[E])throw new Error(`audit-fit skill missing inspector prompt for ${E}`);let m=l.runUserDiscovery?Xs():[],f=l.runPluginDiscovery?Zs():[],g={skill:[],command:[],agent:[]};for(let E of[...m,...f])g[E.type].push(E);let y=new _({apiKey:r}),h=()=>async E=>pe.allowedTools.includes(E)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${E} not allowed for audit-fit inspectors. Allowed tools: ${pe.allowedTools.join(", ")}`},k=[];for(let E of ud){let P=g[E];if(P.length===0)continue;let C=p[E];C&&k.push({type:E,prompt:`${C}
860
- ${fd(P)}`,artifacts:P,runPrompt:`Inspect every ${E} listed in the artifact section.`})}if(l.runHookInspector){let E=p.hook;if(E){let P=Kr(ue(),"settings.json"),C=ei(P);k.push({type:"hook",prompt:`${E}
861
- ${gd(P,C)}`,artifacts:[],runPrompt:`Inspect every hook listed in the Discovered hooks section. Settings file: ${P}.`})}}let S=[];if(k.length>0){let E=await Promise.all(k.map(M=>y.forkSubagent({parent:{sessionId:c},config:{model:"sonnet",systemPrompt:`${pe.systemPrompt}
859
+ `)}function Ep(e,t){if(!t)return{kind:"failure",message:`${e}: no result`};if(t.schemaError)return{kind:"failure",message:`${e}: schema mismatch \u2014 ${t.schemaError.message}`};if(t.status!=="succeeded"){let n=t.error?` \u2014 ${t.error.message}`:"";return{kind:"failure",message:`${e}: ${t.status}${n}`}}return t.output?{kind:"success",output:t.output}:{kind:"failure",message:`${e}: no output`}}async function Pp(e,t,n){let r=n?.apiKey,o=typeof e=="object"&&e!==null?e:{},s=bp.parse(o),a=s.writeBriefs??!0,i=s.scope??"all",l=wp(i);if(!t?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let c=t.sessionId,u=Y("audit-fit"),p={skill:u["01-skill-inspector.md"],command:u["02-command-inspector.md"],agent:u["03-agent-inspector.md"],hook:u["04-hook-inspector.md"]};for(let E of Hi)if(!p[E])throw new Error(`audit-fit skill missing inspector prompt for ${E}`);let m=l.runUserDiscovery?Oi():[],f=l.runPluginDiscovery?Di():[],g={skill:[],command:[],agent:[]};for(let E of[...m,...f])g[E.type].push(E);let y=new M({apiKey:r}),h=()=>async E=>fe.allowedTools.includes(E)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${E} not allowed for audit-fit inspectors. Allowed tools: ${fe.allowedTools.join(", ")}`},k=[];for(let E of kp){let A=g[E];if(A.length===0)continue;let I=p[E];I&&k.push({type:E,prompt:`${I}
860
+ ${xp(A)}`,artifacts:A,runPrompt:`Inspect every ${E} listed in the artifact section.`})}if(l.runHookInspector){let E=p.hook;if(E){let A=ho(pe(),"settings.json"),I=Li(A);k.push({type:"hook",prompt:`${E}
861
+ ${Tp(A,I)}`,artifacts:[],runPrompt:`Inspect every hook listed in the Discovered hooks section. Settings file: ${A}.`})}}let v=[];if(k.length>0){let E=await Promise.all(k.map(_=>y.forkSubagent({parent:{sessionId:c},config:{model:"sonnet",systemPrompt:`${fe.systemPrompt}
862
862
 
863
- ${M.prompt}`,canUseTool:h()},idPrefix:`inspector-${M.type}`,outputSchema:q.array(oi)}))),P=await Cn(k.map((M,Q)=>{let O=E[Q];if(!O)throw new Error(`audit-fit: missing handle for ${M.type} inspector`);return{handle:O,prompt:M.runPrompt}}),{failFast:!1}),C=[];for(let M=0;M<P.length;M++){let Q=P[M],O=k[M];if(!O)continue;let T=hd(O.type,Q);if(T.kind==="failure"){C.push(T.message);continue}let ge=new Map;for(let X of O.artifacts)ge.set(X.path,X.source);for(let X of T.output){if(O.type==="hook"){if(X.source!=="user"){C.push(`${O.type}: hook verdict has source=${X.source} (must be 'user')`);continue}}else{let oe=ge.get(X.path);if(oe===void 0){C.push(`${O.type}: verdict for unknown path ${X.path} (not in discovered list)`);continue}if(X.source!==oe){C.push(`${O.type}: verdict source mismatch for ${X.path} (expected ${oe}, got ${X.source})`);continue}}S.push(X)}}if(C.length>0){let M=C.map(Q=>` - ${Q}`).join(`
864
- `);throw new Error(`audit-fit: ${C.length} inspector failure(s):
865
- ${M}`)}}let{inventory:b,misfits:A}=pd(S),N=0;if(a){let E=je();await ti(E,{recursive:!0});for(let P of A.filter(md)){let C=P.path.replace(/[^a-z0-9]+/gi,"-").toLowerCase().slice(0,30),M=Kr(E,`audit-fit-${C}.md`),Q=`---
863
+ ${_.prompt}`,canUseTool:h()},idPrefix:`inspector-${_.type}`,outputSchema:J.array(ji)}))),A=await Kn(k.map((_,Q)=>{let $=E[Q];if(!$)throw new Error(`audit-fit: missing handle for ${_.type} inspector`);return{handle:$,prompt:_.runPrompt}}),{failFast:!1}),I=[];for(let _=0;_<A.length;_++){let Q=A[_],$=k[_];if(!$)continue;let x=Ep($.type,Q);if(x.kind==="failure"){I.push(x.message);continue}let ye=new Map;for(let Z of $.artifacts)ye.set(Z.path,Z.source);for(let Z of x.output){if($.type==="hook"){if(Z.source!=="user"){I.push(`${$.type}: hook verdict has source=${Z.source} (must be 'user')`);continue}}else{let ae=ye.get(Z.path);if(ae===void 0){I.push(`${$.type}: verdict for unknown path ${Z.path} (not in discovered list)`);continue}if(Z.source!==ae){I.push(`${$.type}: verdict source mismatch for ${Z.path} (expected ${ae}, got ${Z.source})`);continue}}v.push(Z)}}if(I.length>0){let _=I.map(Q=>` - ${Q}`).join(`
864
+ `);throw new Error(`audit-fit: ${I.length} inspector failure(s):
865
+ ${_}`)}}let{inventory:w,misfits:P}=Sp(v),K=0;if(a){let E=Ve();await Fi(E,{recursive:!0});for(let A of P.filter(vp)){let I=A.path.replace(/[^a-z0-9]+/gi,"-").toLowerCase().slice(0,30),_=ho(E,`audit-fit-${I}.md`),Q=`---
866
866
  theme: audit-fit
867
867
  session_count: 1
868
868
  ---
869
869
 
870
- # Audit: ${P.path}
870
+ # Audit: ${A.path}
871
871
 
872
- **Current type:** ${P.type}
873
- **Recommended type:** ${P.recommended_type}
872
+ **Current type:** ${A.type}
873
+ **Recommended type:** ${A.recommended_type}
874
874
 
875
875
  ## Rationale
876
876
 
877
- ${P.rationale}
877
+ ${A.rationale}
878
878
 
879
879
  ## Migration Steps
880
880
 
881
- 1. Review the artifact in \`${P.path}\`
882
- 2. Evaluate the recommended change to \`${P.recommended_type}\`
881
+ 1. Review the artifact in \`${A.path}\`
882
+ 2. Evaluate the recommended change to \`${A.recommended_type}\`
883
883
  3. If appropriate, refactor using the patterns in \`/forge\` or the public plugin
884
884
 
885
885
  ---
886
886
  Generated by audit-fit on ${new Date().toISOString().split(".")[0]}Z
887
- `;await ni(M,Q),N++}}let $=rt();await ti($,{recursive:!0});let v=E=>{let P=0;for(let C of Object.values(E))for(let M of Object.values(C))P+=M;return P},w=E=>{let P=b.user[E]??{},C=b.plugin[E]??{},M=Q=>Object.values(Q).reduce((O,T)=>O+T,0);return M(P)+M(C)},I={timestamp:new Date().toISOString(),surface:"afk",scope:i,total_artifacts:S.length,misfits_count:A.length,briefs_written:N,by_source:{user:v(b.user),plugin:v(b.plugin)},by_type:{skill:w("skill"),command:w("command"),agent:w("agent"),hook:w("hook")}},x=Kr($,"audit-fit-telemetry.jsonl");return await ni(x,JSON.stringify(I)+`
888
- `),{inventory:b,misfits:A,briefs_written:N,total_artifacts:S.length}}var kd={name:"audit-fit",description:"Audit ~/.afk artifacts (skills, commands, agents, hooks) for correct type categorization. Walks user-scope dirs (~/.afk/{skills,commands,agents}/) and every plugin installed under ~/.afk/plugins/ (flat and marketplace-cache layouts), plus ~/.afk/settings.json for hooks. Dispatches per-type inspectors in parallel, applies decision heuristics (progressive-disclosure value, isolation need, deterministic vs. reasoning), flags misfits. Generates migration briefs only for user-scope misfits (plugin misfits are inventory-only \u2014 refactoring vendored plugin code is the maintainer's job). Optional `scope` input filters to `user`, `plugin`, or `all` (default). Use for inventory audits after bulk authoring, imports, or periodic hygiene.",handler:yd,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"]};Ie(kd);import{z as D}from"zod";import{execFile as vd}from"node:child_process";import{promisify as xd}from"node:util";import{tmpdir as Td}from"node:os";import{join as Ed}from"node:path";function ii(e){return e.confidence<.5?{verify:!0,reason:`low confidence (${e.confidence.toFixed(2)} < ${.5})`}:e.boundary_flag&&e.boundary_flag.length>0?{verify:!0,reason:`boundary flag set: ${e.boundary_flag}`}:e.coverage_gaps&&e.coverage_gaps.length>0?{verify:!0,reason:`coverage gap${e.coverage_gaps.length===1?"":"s"}: ${e.coverage_gaps.length} unresolved`}:{verify:!1,reason:`confidence ${e.confidence.toFixed(2)} with no gaps or boundary`}}import{fileURLToPath as bd}from"node:url";import{dirname as wd}from"node:path";var Sd=bd(import.meta.url),Kw=wd(Sd),Gr={name:"git-investigator",systemPrompt:'---\nname: git-investigator\ndescription: Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.\nmodel: sonnet\ntools: Bash, Read, Grep, Glob\n---\n\nYou are `git-investigator`, a leaf sub-agent specialized for read-only git queries.\n\nYou have Bash, Read, Grep, and Glob. You do not dispatch other sub-agents. You do not Edit or Write. Your Bash surface is restricted **by this prompt** to `git ...` invocations and benign output-shaping pipes.\n\n## Allowed commands\n\nRead-only git only:\n\n- `git status`, `git log`, `git diff`, `git show`\n- `git rev-parse`, `git rev-list`, `git reflog`\n- `git branch -v / -vv / -a` (list only)\n- `git remote -v`, `git ls-remote`\n- `git ls-files`, `git blame`\n- `git merge-base`, `git for-each-ref`, `git describe`\n- `git cat-file`, `git shortlog`\n- `git tag` (list/show only)\n- `git stash list`, `git stash show`\n- `git config --get`, `git config --get-all`, `git config --list`\n- `git worktree list` (read only)\n\nOutput-shaping pipes are fine: `| head`, `| tail`, `| wc`, `| grep`, `| jq`, `| awk \'NR==...\'` (for formatting only \u2014 no mutations).\n\n## Forbidden\n\nAnything that mutates repo or working tree state:\n\n- `commit`, `push`, `pull`, `fetch --prune`\n- `reset`, `revert`, `rebase`, `merge`, `cherry-pick`\n- `checkout` (except `checkout -- <path>` file-restore, and even that is mutation \u2014 avoid it, just report the need)\n- `restore`, `switch`\n- `branch -d / -D / -m / -M`, `branch <new>`\n- `stash push / pop / drop / apply / clear`\n- `tag -d`, creating a new tag\n- `remote add / remove / set-url`\n- `config --set`, `config --unset`\n- `gc`, `fsck`, `prune`, `reflog delete`, `reflog expire`\n- `filter-branch`, `filter-repo`\n- `worktree add / remove / move`\n- `hooks install`, `submodule add / update`\n- Any non-`git` command that mutates: `rm`, `mv`, `cp` (writes), `sed -i`, `> file`, `>> file`, `tee`, `curl`, `wget`, `pip install`, shell builtins that change state.\n\nIf the caller asks for any of the above, do not run it. Return `scope_check: "requires mutation: <reason>"` and stop.\n\n## Behavior\n\n- Run the minimum set of commands needed. Prefer `git log -n 5 --oneline -- <path>` over `git log -- <path>` when a count is fine.\n- Cite concrete evidence: commit SHAs (short form OK), ref names, `path:line` references from blame, diff hunks trimmed to the relevant range.\n- Use `Read`/`Grep`/`Glob` for follow-up inspection of files the git output identifies (e.g., `git show SHA:path | head` then `Read` the current file to diff mentally).\n- Do not speculate beyond what the commands show. If a question needs history the commands don\'t surface (deleted-file recovery, ancient reflog that has expired), say so in `caveats`.\n- Keep output compact \u2014 dispatchers merge your findings into a larger response. No preamble, no ceremony.\n\n## Return shape\n\n```\n{\n "findings": "<summary of what the git data shows>",\n "evidence": ["<SHA>", "<ref>", "<path:line>", ...],\n "git_commands_run": ["git log ...", "git diff ...", ...],\n "caveats": "<gaps, ambiguity, or \'none\'>",\n "scope_check": "pure git research" | "requires mutation: <reason>"\n}\n```\n\nBegin your response with the first schema field. No preamble.\n',sourcePath:"agent-framework-private/agents/git-investigator.md",allowedTools:["Bash","Read","Grep","Glob"],description:"Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.",model:"sonnet"};function zr(e){let t={description:e.description,prompt:e.systemPrompt};return e.allowedTools&&(t.tools=[...e.allowedTools]),e.model&&(t.model=e.model),t}var ai=xd(vd),ui=D.object({id:D.string(),claim:D.string(),confidence:D.number().min(0).max(1),evidence_sources:D.array(D.string()),location:D.string().optional(),proposed_fix:D.string().optional(),coverage_gaps:D.array(D.string()).optional(),boundary_flag:D.string().optional()}),Pd=D.object({hypothesis_id:D.string(),claim:D.string(),verdict:D.enum(["VERIFIED","REFUTED","INCONCLUSIVE"]),evidence:D.string(),gate_reason:D.string()}),di=D.object({hypothesis_id:D.string(),reproducer_passed:D.boolean(),regressions:D.array(D.string()),confidence:D.number().min(0).max(1),verification_log:D.string()}),aS=D.object({reproducer:D.string().optional(),hypotheses:D.array(ui),premise_verifications:D.array(Pd).optional(),winner:D.object({hypothesis_id:D.string(),verification_log:D.string(),proposed_fix:D.string()}).optional(),verification_results:D.array(di).optional()});async function Cd(e,t){let n=e.map(l=>({hypothesis:l,decision:ii(l)})).filter(l=>l.decision.verify);if(n.length===0)return{premise_verifications:[],hypotheses_to_test:e};let r=[],o;try{r=await t(n.map(l=>l.hypothesis.claim))}catch(l){o=l instanceof Error?l.message:String(l)}let s=n.map((l,c)=>{let u=r[c];return o!==void 0?{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:`shadow-verify dispatch failed: ${o}`,gate_reason:l.decision.reason}:u?{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:u.verdict,evidence:u.evidence,gate_reason:l.decision.reason}:{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:"no verifier result for this claim",gate_reason:l.decision.reason}}),a=new Set(s.filter(l=>l.verdict==="REFUTED").map(l=>l.hypothesis_id)),i=a.size===0?e:e.filter(l=>!a.has(l.id));return{premise_verifications:s,hypotheses_to_test:i}}async function Ad(e,t,n){let r=n?.apiKey,o=(()=>{if(typeof e=="string")return{failure:e,repoPath:process.cwd(),context:"",maxHypotheses:4};if(typeof e=="object"&&e!==null){let M=e;if(typeof M.failure=="string")return{failure:M.failure,repoPath:M.repoPath||process.cwd(),context:M.context||"",maxHypotheses:Math.min(M.maxHypotheses||4,4)}}throw new Error("diagnose handler requires input.failure (string) or a string argument")})();if(!t?.sessionId)throw new Error("diagnose requires a parent session with sessionId");let s=t.sessionId,a=Y("diagnose"),i=a["system.md"],l=a["research.md"],c=a["hypothesis.md"],u=a["verify.md"];if(!i||!l||!c||!u)throw new Error("diagnose skill missing required prompts (system.md, research.md, hypothesis.md, verify.md)");let p=new _({apiKey:r}),m=Id(o.context),f=`${pe.systemPrompt}
887
+ `;await Ni(_,Q),K++}}let F=ut();await Fi(F,{recursive:!0});let T=E=>{let A=0;for(let I of Object.values(E))for(let _ of Object.values(I))A+=_;return A},b=E=>{let A=w.user[E]??{},I=w.plugin[E]??{},_=Q=>Object.values(Q).reduce(($,x)=>$+x,0);return _(A)+_(I)},C={timestamp:new Date().toISOString(),surface:"afk",scope:i,total_artifacts:v.length,misfits_count:P.length,briefs_written:K,by_source:{user:T(w.user),plugin:T(w.plugin)},by_type:{skill:b("skill"),command:b("command"),agent:b("agent"),hook:b("hook")}},S=ho(F,"audit-fit-telemetry.jsonl");return await Ni(S,JSON.stringify(C)+`
888
+ `),{inventory:w,misfits:P,briefs_written:K,total_artifacts:v.length}}var Cp={name:"audit-fit",description:"Audit ~/.afk artifacts (skills, commands, agents, hooks) for correct type categorization. Walks user-scope dirs (~/.afk/{skills,commands,agents}/) and every plugin installed under ~/.afk/plugins/ (flat and marketplace-cache layouts), plus ~/.afk/settings.json for hooks. Dispatches per-type inspectors in parallel, applies decision heuristics (progressive-disclosure value, isolation need, deterministic vs. reasoning), flags misfits. Generates migration briefs only for user-scope misfits (plugin misfits are inventory-only \u2014 refactoring vendored plugin code is the maintainer's job). Optional `scope` input filters to `user`, `plugin`, or `all` (default). Use for inventory audits after bulk authoring, imports, or periodic hygiene.",handler:Pp,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"]};Me(Cp);import{z as O}from"zod";import{execFile as Rp}from"node:child_process";import{promisify as Mp}from"node:util";import{tmpdir as $p}from"node:os";import{join as Op}from"node:path";function Bi(e){return e.confidence<.5?{verify:!0,reason:`low confidence (${e.confidence.toFixed(2)} < ${.5})`}:e.boundary_flag&&e.boundary_flag.length>0?{verify:!0,reason:`boundary flag set: ${e.boundary_flag}`}:e.coverage_gaps&&e.coverage_gaps.length>0?{verify:!0,reason:`coverage gap${e.coverage_gaps.length===1?"":"s"}: ${e.coverage_gaps.length} unresolved`}:{verify:!1,reason:`confidence ${e.confidence.toFixed(2)} with no gaps or boundary`}}import{fileURLToPath as Ap}from"node:url";import{dirname as Ip}from"node:path";var _p=Ap(import.meta.url),ex=Ip(_p),yo={name:"git-investigator",systemPrompt:'---\nname: git-investigator\ndescription: Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.\nmodel: sonnet\ntools: Bash, Read, Grep, Glob\n---\n\nYou are `git-investigator`, a leaf sub-agent specialized for read-only git queries.\n\nYou have Bash, Read, Grep, and Glob. You do not dispatch other sub-agents. You do not Edit or Write. Your Bash surface is restricted **by this prompt** to `git ...` invocations and benign output-shaping pipes.\n\n## Allowed commands\n\nRead-only git only:\n\n- `git status`, `git log`, `git diff`, `git show`\n- `git rev-parse`, `git rev-list`, `git reflog`\n- `git branch -v / -vv / -a` (list only)\n- `git remote -v`, `git ls-remote`\n- `git ls-files`, `git blame`\n- `git merge-base`, `git for-each-ref`, `git describe`\n- `git cat-file`, `git shortlog`\n- `git tag` (list/show only)\n- `git stash list`, `git stash show`\n- `git config --get`, `git config --get-all`, `git config --list`\n- `git worktree list` (read only)\n\nOutput-shaping pipes are fine: `| head`, `| tail`, `| wc`, `| grep`, `| jq`, `| awk \'NR==...\'` (for formatting only \u2014 no mutations).\n\n## Forbidden\n\nAnything that mutates repo or working tree state:\n\n- `commit`, `push`, `pull`, `fetch --prune`\n- `reset`, `revert`, `rebase`, `merge`, `cherry-pick`\n- `checkout` (except `checkout -- <path>` file-restore, and even that is mutation \u2014 avoid it, just report the need)\n- `restore`, `switch`\n- `branch -d / -D / -m / -M`, `branch <new>`\n- `stash push / pop / drop / apply / clear`\n- `tag -d`, creating a new tag\n- `remote add / remove / set-url`\n- `config --set`, `config --unset`\n- `gc`, `fsck`, `prune`, `reflog delete`, `reflog expire`\n- `filter-branch`, `filter-repo`\n- `worktree add / remove / move`\n- `hooks install`, `submodule add / update`\n- Any non-`git` command that mutates: `rm`, `mv`, `cp` (writes), `sed -i`, `> file`, `>> file`, `tee`, `curl`, `wget`, `pip install`, shell builtins that change state.\n\nIf the caller asks for any of the above, do not run it. Return `scope_check: "requires mutation: <reason>"` and stop.\n\n## Behavior\n\n- Run the minimum set of commands needed. Prefer `git log -n 5 --oneline -- <path>` over `git log -- <path>` when a count is fine.\n- Cite concrete evidence: commit SHAs (short form OK), ref names, `path:line` references from blame, diff hunks trimmed to the relevant range.\n- Use `Read`/`Grep`/`Glob` for follow-up inspection of files the git output identifies (e.g., `git show SHA:path | head` then `Read` the current file to diff mentally).\n- Do not speculate beyond what the commands show. If a question needs history the commands don\'t surface (deleted-file recovery, ancient reflog that has expired), say so in `caveats`.\n- Keep output compact \u2014 dispatchers merge your findings into a larger response. No preamble, no ceremony.\n\n## Return shape\n\n```\n{\n "findings": "<summary of what the git data shows>",\n "evidence": ["<SHA>", "<ref>", "<path:line>", ...],\n "git_commands_run": ["git log ...", "git diff ...", ...],\n "caveats": "<gaps, ambiguity, or \'none\'>",\n "scope_check": "pure git research" | "requires mutation: <reason>"\n}\n```\n\nBegin your response with the first schema field. No preamble.\n',sourcePath:"agent-framework-private/agents/git-investigator.md",allowedTools:["Bash","Read","Grep","Glob"],description:"Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.",model:"sonnet"};function bo(e){let t={description:e.description,prompt:e.systemPrompt};return e.allowedTools&&(t.tools=[...e.allowedTools]),e.model&&(t.model=e.model),t}var Wi=Mp(Rp),zi=O.object({id:O.string(),claim:O.string(),confidence:O.number().min(0).max(1),evidence_sources:O.array(O.string()),location:O.string().optional(),proposed_fix:O.string().optional(),coverage_gaps:O.array(O.string()).optional(),boundary_flag:O.string().optional()}),Dp=O.object({hypothesis_id:O.string(),claim:O.string(),verdict:O.enum(["VERIFIED","REFUTED","INCONCLUSIVE"]),evidence:O.string(),gate_reason:O.string()}),Vi=O.object({hypothesis_id:O.string(),reproducer_passed:O.boolean(),regressions:O.array(O.string()),confidence:O.number().min(0).max(1),verification_log:O.string()}),yx=O.object({reproducer:O.string().optional(),hypotheses:O.array(zi),premise_verifications:O.array(Dp).optional(),winner:O.object({hypothesis_id:O.string(),verification_log:O.string(),proposed_fix:O.string()}).optional(),verification_results:O.array(Vi).optional()});async function Lp(e,t){let n=e.map(l=>({hypothesis:l,decision:Bi(l)})).filter(l=>l.decision.verify);if(n.length===0)return{premise_verifications:[],hypotheses_to_test:e};let r=[],o;try{r=await t(n.map(l=>l.hypothesis.claim))}catch(l){o=l instanceof Error?l.message:String(l)}let s=n.map((l,c)=>{let u=r[c];return o!==void 0?{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:`shadow-verify dispatch failed: ${o}`,gate_reason:l.decision.reason}:u?{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:u.verdict,evidence:u.evidence,gate_reason:l.decision.reason}:{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:"no verifier result for this claim",gate_reason:l.decision.reason}}),a=new Set(s.filter(l=>l.verdict==="REFUTED").map(l=>l.hypothesis_id)),i=a.size===0?e:e.filter(l=>!a.has(l.id));return{premise_verifications:s,hypotheses_to_test:i}}async function Fp(e,t,n){let r=n?.apiKey,o=(()=>{if(typeof e=="string")return{failure:e,repoPath:process.cwd(),context:"",maxHypotheses:4};if(typeof e=="object"&&e!==null){let _=e;if(typeof _.failure=="string")return{failure:_.failure,repoPath:_.repoPath||process.cwd(),context:_.context||"",maxHypotheses:Math.min(_.maxHypotheses||4,4)}}throw new Error("diagnose handler requires input.failure (string) or a string argument")})();if(!t?.sessionId)throw new Error("diagnose requires a parent session with sessionId");let s=t.sessionId,a=Y("diagnose"),i=a["system.md"],l=a["research.md"],c=a["hypothesis.md"],u=a["verify.md"];if(!i||!l||!c||!u)throw new Error("diagnose skill missing required prompts (system.md, research.md, hypothesis.md, verify.md)");let p=new M({apiKey:r}),m=Np(o.context),f=`${fe.systemPrompt}
889
889
 
890
890
  ${l}
891
891
 
892
892
  Focus: CODEBASE
893
893
  Failure: ${o.failure}${o.context?`
894
- Context: ${o.context}`:""}`,g=`${pe.systemPrompt}
894
+ Context: ${o.context}`:""}`,g=`${fe.systemPrompt}
895
895
 
896
896
  ${l}
897
897
 
@@ -899,26 +899,26 @@ Focus: GIT HISTORY
899
899
  Failure: ${o.failure}${o.context?`
900
900
  Context: ${o.context}`:""}
901
901
 
902
- Repo: ${o.repoPath}`,y=await p.forkSubagent({parent:{sessionId:s},config:{model:"sonnet",systemPrompt:f,canUseTool:li()},idPrefix:"diagnose-codebase-research"}),h=await p.forkSubagent({parent:{sessionId:s},config:{model:"sonnet",systemPrompt:g,cwd:o.repoPath,agents:{"git-investigator":zr(Gr)},canUseTool:Md()},idPrefix:"diagnose-git-research"}),[k,S]=await Cn([{handle:y,prompt:"Analyze the codebase for potential causes of this failure."},{handle:h,prompt:"Analyze git history for recent changes that could cause this failure."}],{failFast:!1}),b={codebase:k?.output||k?.message||"No output",git:S?.output||S?.message||"No output"},A=await p.forkSubagent({parent:{sessionId:s},config:{model:"sonnet",systemPrompt:`${i}
902
+ Repo: ${o.repoPath}`,y=await p.forkSubagent({parent:{sessionId:s},config:{model:"sonnet",systemPrompt:f,canUseTool:Ki()},idPrefix:"diagnose-codebase-research"}),h=await p.forkSubagent({parent:{sessionId:s},config:{model:"sonnet",systemPrompt:g,cwd:o.repoPath,agents:{"git-investigator":bo(yo)},canUseTool:Up()},idPrefix:"diagnose-git-research"}),[k,v]=await Kn([{handle:y,prompt:"Analyze the codebase for potential causes of this failure."},{handle:h,prompt:"Analyze git history for recent changes that could cause this failure."}],{failFast:!1}),w={codebase:k?.output||k?.message||"No output",git:v?.output||v?.message||"No output"},P=await p.forkSubagent({parent:{sessionId:s},config:{model:"sonnet",systemPrompt:`${i}
903
903
 
904
- ${c}`,canUseTool:li()},idPrefix:"diagnose-hypothesis-synthesis",outputSchema:D.object({hypotheses:D.array(ui)})}),N=`Given these research findings, synthesize 2\u20134 hypotheses (max 4):
904
+ ${c}`,canUseTool:Ki()},idPrefix:"diagnose-hypothesis-synthesis",outputSchema:O.object({hypotheses:O.array(zi)})}),K=`Given these research findings, synthesize 2\u20134 hypotheses (max 4):
905
905
 
906
906
  CODEBASE RESEARCH:
907
- ${JSON.stringify(b.codebase,null,2)}
907
+ ${JSON.stringify(w.codebase,null,2)}
908
908
 
909
909
  GIT RESEARCH:
910
- ${JSON.stringify(b.git,null,2)}
910
+ ${JSON.stringify(w.git,null,2)}
911
911
 
912
- Original failure: ${o.failure}`,$;try{$=await A.runToResult(N)}finally{await A.teardown().catch(()=>{})}if($.status!=="succeeded"||!$.output)throw new Error(`hypothesis synthesis failed: ${Z($)}`);let v=$.output.hypotheses.slice(0,o.maxHypotheses);if(v.length===0)return{reproducer:m,hypotheses:[],verification_results:[]};let{premise_verifications:w,hypotheses_to_test:I}=await Cd(v,async M=>{let Q=se("shadow-verify");if(!Q)throw new Error("shadow-verify skill not registered");return(await Q.handler({claims:M,context:`Original failure: ${o.failure}`},t)).verifications});if(I.length===0)return{reproducer:m,hypotheses:v,premise_verifications:w,verification_results:[]};let x=m||o.failure,E=I.map(M=>Rd(M,x,o.repoPath,s,u,p)),P=await Promise.all(E),C=P.find(M=>M.reproducer_passed);return{reproducer:m,hypotheses:v,premise_verifications:w.length>0?w:void 0,winner:C?{hypothesis_id:C.hypothesis_id,verification_log:C.verification_log,proposed_fix:v.find(M=>M.id===C.hypothesis_id)?.proposed_fix||""}:void 0,verification_results:P}}function Id(e){if(!e)return;let t=[/test:\s*(.+)/i,/command:\s*(.+)/i,/reproducer:\s*(.+)/i,/failing test:\s*(.+)/i];for(let n of t){let r=e.match(n);if(r)return r[1]}}function li(){return async e=>pe.allowedTools.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed. Allowed tools: ${pe.allowedTools.join(", ")}`}}var ci=[...pe.allowedTools,"Agent"];function Md(){return async e=>ci.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed for git orchestrator. Allowed tools: ${ci.join(", ")}`}}async function Rd(e,t,n,r,o,s){let a=Ed(Td(),`diagnose-hyp-${e.id}-${Date.now()}`),i;try{await ai("git",["worktree","add","--detach",a,"HEAD"],{cwd:n}),i=await s.forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:`${o}
912
+ Original failure: ${o.failure}`,F;try{F=await P.runToResult(K)}finally{await P.teardown().catch(()=>{})}if(F.status!=="succeeded"||!F.output)throw new Error(`hypothesis synthesis failed: ${ee(F)}`);let T=F.output.hypotheses.slice(0,o.maxHypotheses);if(T.length===0)return{reproducer:m,hypotheses:[],verification_results:[]};let{premise_verifications:b,hypotheses_to_test:C}=await Lp(T,async _=>{let Q=le("shadow-verify");if(!Q)throw new Error("shadow-verify skill not registered");return(await Q.handler({claims:_,context:`Original failure: ${o.failure}`},t)).verifications});if(C.length===0)return{reproducer:m,hypotheses:T,premise_verifications:b,verification_results:[]};let S=m||o.failure,E=C.map(_=>jp(_,S,o.repoPath,s,u,p)),A=await Promise.all(E),I=A.find(_=>_.reproducer_passed);return{reproducer:m,hypotheses:T,premise_verifications:b.length>0?b:void 0,winner:I?{hypothesis_id:I.hypothesis_id,verification_log:I.verification_log,proposed_fix:T.find(_=>_.id===I.hypothesis_id)?.proposed_fix||""}:void 0,verification_results:A}}function Np(e){if(!e)return;let t=[/test:\s*(.+)/i,/command:\s*(.+)/i,/reproducer:\s*(.+)/i,/failing test:\s*(.+)/i];for(let n of t){let r=e.match(n);if(r)return r[1]}}function Ki(){return async e=>fe.allowedTools.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed. Allowed tools: ${fe.allowedTools.join(", ")}`}}var Gi=[...fe.allowedTools,"Agent"];function Up(){return async e=>Gi.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed for git orchestrator. Allowed tools: ${Gi.join(", ")}`}}async function jp(e,t,n,r,o,s){let a=Op($p(),`diagnose-hyp-${e.id}-${Date.now()}`),i;try{await Wi("git",["worktree","add","--detach",a,"HEAD"],{cwd:n}),i=await s.forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:`${o}
913
913
 
914
- You are testing in an isolated worktree at: ${a}`,canUseTool:_d()},idPrefix:`diagnose-verifier-${e.id}`,outputSchema:di});let l=`Test this hypothesis:
914
+ You are testing in an isolated worktree at: ${a}`,canUseTool:Hp()},idPrefix:`diagnose-verifier-${e.id}`,outputSchema:Vi});let l=`Test this hypothesis:
915
915
 
916
916
  Claim: ${e.claim}
917
917
  Location: ${e.location||"unknown"}
918
918
  Proposed fix: ${e.proposed_fix||"unknown"}
919
919
  Reproducer: ${t}
920
920
 
921
- Working directory (isolated): ${a}`,c=await i.runToResult(l);return c.status!=="succeeded"||!c.output?{hypothesis_id:e.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Verification failed: ${Z(c)}`}:c.output}catch(l){return{hypothesis_id:e.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Error during verification: ${l instanceof Error?l.message:String(l)}`}}finally{if(i)try{await i.teardown()}catch{}try{await ai("git",["worktree","remove","--force",a],{cwd:n})}catch{}}}function _d(){let e=["Edit","Write","Bash","Agent","Task"];return async t=>e.includes(t)?{behavior:"deny",message:`Tool ${t} not allowed in worktree verification. Verification is read-only.`}:pe.allowedTools.includes(t)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${t} not allowed. Allowed tools: ${pe.allowedTools.join(", ")}`}}var $d={name:"diagnose",description:"Parallel root-cause analysis for bugs and failing tests \u2014 forks research subagents, synthesizes hypotheses, and validates each in isolated worktrees",handler:Ad,argumentHint:"<bug-or-failing-test>",whenToUse:"When a test is failing, a bug is reported, or behavior is unexplained \u2014 runs parallel root-cause analysis with hypothesis sub-agents."};Ie($d);import{z as Pe}from"zod";import{execFile as Vd}from"child_process";import{promisify as Yd}from"util";import{mkdir as wi,writeFile as Si}from"fs/promises";import{existsSync as bi}from"fs";import{join as it}from"path";import{fileURLToPath as qd}from"url";import{fileURLToPath as Od}from"node:url";import{dirname as Dd}from"node:path";var Ld=Od(import.meta.url),pS=Dd(Ld),Vr={name:"qualify",systemPrompt:`---
921
+ Working directory (isolated): ${a}`,c=await i.runToResult(l);return c.status!=="succeeded"||!c.output?{hypothesis_id:e.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Verification failed: ${ee(c)}`}:c.output}catch(l){return{hypothesis_id:e.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Error during verification: ${l instanceof Error?l.message:String(l)}`}}finally{if(i)try{await i.teardown()}catch{}try{await Wi("git",["worktree","remove","--force",a],{cwd:n})}catch{}}}function Hp(){let e=["Edit","Write","Bash","Agent","Task"];return async t=>e.includes(t)?{behavior:"deny",message:`Tool ${t} not allowed in worktree verification. Verification is read-only.`}:fe.allowedTools.includes(t)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${t} not allowed. Allowed tools: ${fe.allowedTools.join(", ")}`}}var Bp={name:"diagnose",description:"Parallel root-cause analysis for bugs and failing tests \u2014 forks research subagents, synthesizes hypotheses, and validates each in isolated worktrees",handler:Fp,argumentHint:"<bug-or-failing-test>",whenToUse:"When a test is failing, a bug is reported, or behavior is unexplained \u2014 runs parallel root-cause analysis with hypothesis sub-agents."};Me(Bp);import{z as Ae}from"zod";import{execFile as nm}from"child_process";import{promisify as rm}from"util";import{mkdir as na,writeFile as ra}from"fs/promises";import{existsSync as ta}from"fs";import{join as mt}from"path";import{fileURLToPath as om}from"url";import{fileURLToPath as Wp}from"node:url";import{dirname as Kp}from"node:path";var Gp=Wp(import.meta.url),vx=Kp(Gp),ko={name:"qualify",systemPrompt:`---
922
922
  name: qualify
923
923
  description: Gate proposed plugin skills. Approve only real force multipliers. Reject reminders, checklists, best-practice nudges, and generic execution advice. Invoke when evaluating whether a proposed skill deserves top-level status in this plugin.
924
924
  model: sonnet
@@ -1151,17 +1151,25 @@ If the append fails (permissions, disk full, unwritable path), do not retry and
1151
1151
  - Stage 1 alone would land at SALVAGE (rule 8). Rule 6 fires because Stage 2 \u22648 \u2192 downgrade one tier \u2192 **REJECT**. Rewrite target: raise Bounded Damage (dry-run/draft-PR instead of push), Default Reversibility (require confirmation), Assumption Exposure (surface what tests assume before acting).
1152
1152
 
1153
1153
  Be skeptical. Protect the plugin from fluff. Stage 2 catches patterns that are strong when they work and catastrophic when they don't.
1154
- `,sourcePath:"agent-framework-local/agents/qualify.md"};import{fileURLToPath as Fd}from"node:url";import{dirname as Nd}from"node:path";var Ud=Fd(import.meta.url),yS=Nd(Ud);import{mkdir as pi,writeFile as mi}from"fs/promises";import{dirname as jd,join as Bd}from"path";async function De(e){let t=un();await pi(jd(t),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r={timestamp:n,surface:"afk",...e},o=JSON.stringify(r)+`
1155
- `;return await mi(t,o,{flag:"a"}),n}async function fi(){let e=dn(),t=Bd(e,"forge-thaw-history.jsonl");await pi(e,{recursive:!0});let r={timestamp:new Date().toISOString().split(".")[0]+"Z",surface:"afk",event:"forge.thaw_override",thaw_triggered:!0},o=JSON.stringify(r)+`
1156
- `;await mi(t,o,{flag:"a"})}import{readFile as gi,readdir as Hd,writeFile as Wd,mkdir as Kd,unlink as Gd}from"fs/promises";import{join as Mn}from"path";import{existsSync as zd}from"fs";async function hi(e){let t=Mn(je(),e+".md"),n=await gi(t,"utf-8");return{id:e,content:n}}async function yi(){let e=je();return zd(e)?(await Hd(e,{withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".md")).map(r=>r.name.slice(0,-3)):[]}async function Yr(e,t){let n=je(),r=Mn(n,e+".md"),o=Mn(n,t),s=Mn(o,e+".md");await Kd(o,{recursive:!0});let a=await gi(r,"utf-8");await Wd(s,a,"utf-8"),await Gd(r)}function ki(e){let t=/^\*{0,2}(APPROVE|SALVAGE|REJECT)\*{0,2}/,n=e.split(`
1154
+ `,sourcePath:"agent-framework-local/agents/qualify.md"};import{fileURLToPath as zp}from"node:url";import{dirname as Vp}from"node:path";var qp=zp(import.meta.url),Cx=Vp(qp);import{mkdir as qi,writeFile as Yi}from"fs/promises";import{dirname as Yp,join as Jp}from"path";async function Be(e){let t=Pn();await qi(Yp(t),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r={timestamp:n,surface:"afk",...e},o=JSON.stringify(r)+`
1155
+ `;return await Yi(t,o,{flag:"a"}),n}async function Ji(){let e=Cn(),t=Jp(e,"forge-thaw-history.jsonl");await qi(e,{recursive:!0});let r={timestamp:new Date().toISOString().split(".")[0]+"Z",surface:"afk",event:"forge.thaw_override",thaw_triggered:!0},o=JSON.stringify(r)+`
1156
+ `;await Yi(t,o,{flag:"a"})}import{readFile as Xi,readdir as Xp,writeFile as Qp,mkdir as Zp,unlink as em}from"fs/promises";import{join as Vn}from"path";import{existsSync as tm}from"fs";async function Qi(e){let t=Vn(Ve(),e+".md"),n=await Xi(t,"utf-8");return{id:e,content:n}}async function Zi(){let e=Ve();return tm(e)?(await Xp(e,{withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".md")).map(r=>r.name.slice(0,-3)):[]}async function wo(e,t){let n=Ve(),r=Vn(n,e+".md"),o=Vn(n,t),s=Vn(o,e+".md");await Zp(o,{recursive:!0});let a=await Xi(r,"utf-8");await Qp(s,a,"utf-8"),await em(r)}function ea(e){let t=/^\*{0,2}(APPROVE|SALVAGE|REJECT)\*{0,2}/,n=e.split(`
1157
1157
  `).map(c=>c.trim()).filter(c=>c),r=n.find(c=>t.test(c));if(!r)return{verdict:"REJECT",feedback:e};let o=r.match(t)?.[1];if(!o)return{verdict:"REJECT",feedback:e};let s=e.match(/score:\s*(\d+)/i),a=s&&s[1]?parseInt(s[1],10):void 0,i=n.indexOf(r),l=n.slice(i+1).join(`
1158
- `).trim();return{verdict:o,score:a,feedback:l||r}}var Jd=Yd(Vd);function Qd(){let e=process.env.AFK_EVAL_HARNESS_ROOT;if(e){let o=it(e,"scripts","eval-harness","runner.py");if(bi(o))return o}let t=qd(import.meta.url),n=it(t,"../../../.."),r=it(n,"..","awa-private","scripts","eval-harness","runner.py");if(bi(r))return r;throw new Error(`Could not find eval-harness runner.py. Tried: ${r}`)}function Xd(e){return it(e,"..","..","..","plugins","awa-private")}function Zd(){return dn()}function ep(e){let t=e.split(`
1159
- `),n=[],r=/^\s+✗\s+(\S+):/;for(let o of t){let s=o.match(r);s&&s[1]&&n.push(s[1])}return n}async function tp(e){let t=Zd(),n=it(t,"qualifications.jsonl");await wi(t,{recursive:!0});let o=new Date().toISOString().split(".")[0]+"Z",a=JSON.stringify({timestamp:o,surface:"afk",refers_to_run_id:e,source:"forge-gate-check-ts"})+`
1160
- `;return await Si(n,a,{flag:"a"}),o}async function np(){let e;try{e=Qd()}catch(l){throw new Error(`Failed to resolve eval-harness runner.py: ${l instanceof Error?l.message:String(l)}`)}let t=Xd(e),n="",r="",o=0;try{let l=await Jd("python3",[e,"--plugin-root",t],{timeout:6e4});n=l.stdout||"",r=l.stderr||"",o=0}catch(l){let c=l;if(n=c.stdout||"",r=c.stderr||"",o=typeof c.code=="number"?c.code:1,c.code==="ENOENT"||r&&r.includes("No such file"))throw new Error(`eval-harness runner.py not found at ${e}.`)}let s=o===0?"OPEN":"CLOSED",a=s==="CLOSED"?ep(n):void 0,i;if(s==="OPEN"){let l=new Date().toISOString().split(".")[0]+"Z";i=await tp(l)}return{gate_status:s,exit_code:o,stdout:n,stderr:r||void 0,tasks_failed:a,ledger_entry_ref:i}}var rp=Pe.object({iteration:Pe.number().int().positive(),verdict:Pe.enum(["APPROVE","SALVAGE","REJECT"]),score:Pe.number().optional(),feedback:Pe.string()}),XS=Pe.object({status:Pe.enum(["APPROVED","REJECTED","GATE_CLOSED","MAX_ITERATIONS"]),skill_path:Pe.string().optional(),qualify_verdicts:Pe.array(rp),brief_id:Pe.string().optional(),telemetry_ref:Pe.string()});async function op(e,t,n){let r=n?.apiKey,o=typeof e=="string"?{brief:e}:typeof e=="object"&&e!==null?e:{},s=o.brief,a=o.forceThaw??!1,i=o.maxIterations??3,l="",c=[],u="REJECTED",p,m;try{let f=await np();if(f.gate_status==="CLOSED"&&!a)return l=await De({event:"forge.gate_check",gate_status:"CLOSED"}),{status:"GATE_CLOSED",qualify_verdicts:[],telemetry_ref:l};a&&f.gate_status==="CLOSED"&&(await fi(),l=await De({event:"forge.thaw_override",gate_status:"CLOSED"})),l=await De({event:"forge.gate_check",gate_status:"OPEN"});let g="",y=!1;if(s)g=s,y=!0;else{let v=await yi();if(v.length>0){let w=v[0],I=await hi(w);g=I.content,m=I.id,y=!0}else{if(!t?.sessionId)throw new Error("forge requires parent session for gap discovery");let I=Y("forge")["gap-discovery.md"];if(!I)throw new Error("forge skill missing gap-discovery.md prompt");let P=await(await new _({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:I},idPrefix:"forge-gap-discovery"})).runToResult("Identify the most impactful skill gap.");if(P.status!=="succeeded")throw new Error(`gap discovery failed: ${Z(P)}`);if(g=P.message?.content||"",!g)throw new Error("gap discovery returned no concept")}}if(l=await De({event:"forge.brief_loaded",used_brief:y,brief_id:m||null}),!t?.sessionId)throw new Error("forge requires parent session for skill generation");let h=Y("forge"),k=h["generate.md"],S=h["system.md"];if(!k)throw new Error("forge skill missing generate.md prompt");if(!S)throw new Error("forge skill missing system.md prompt");let N=await(await new _({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:S},idPrefix:"forge-generate"})).runToResult(`Generate a new amplifier skill based on this concept:
1158
+ `).trim();return{verdict:o,score:a,feedback:l||r}}var sm=rm(nm);function im(){let e=process.env.AFK_EVAL_HARNESS_ROOT;if(e){let o=mt(e,"scripts","eval-harness","runner.py");if(ta(o))return o}let t=om(import.meta.url),n=mt(t,"../../../.."),r=mt(n,"..","awa-private","scripts","eval-harness","runner.py");if(ta(r))return r;throw new Error(`Could not find eval-harness runner.py. Tried: ${r}`)}function am(e){return mt(e,"..","..","..","plugins","awa-private")}function lm(){return Cn()}function cm(e){let t=e.split(`
1159
+ `),n=[],r=/^\s+✗\s+(\S+):/;for(let o of t){let s=o.match(r);s&&s[1]&&n.push(s[1])}return n}async function um(e){let t=lm(),n=mt(t,"qualifications.jsonl");await na(t,{recursive:!0});let o=new Date().toISOString().split(".")[0]+"Z",a=JSON.stringify({timestamp:o,surface:"afk",refers_to_run_id:e,source:"forge-gate-check-ts"})+`
1160
+ `;return await ra(n,a,{flag:"a"}),o}async function dm(){let e;try{e=im()}catch(l){throw new Error(`Failed to resolve eval-harness runner.py: ${l instanceof Error?l.message:String(l)}`)}let t=am(e),n="",r="",o=0;try{let l=await sm("python3",[e,"--plugin-root",t],{timeout:6e4});n=l.stdout||"",r=l.stderr||"",o=0}catch(l){let c=l;if(n=c.stdout||"",r=c.stderr||"",o=typeof c.code=="number"?c.code:1,c.code==="ENOENT"||r&&r.includes("No such file"))throw new Error(`eval-harness runner.py not found at ${e}.`)}let s=o===0?"OPEN":"CLOSED",a=s==="CLOSED"?cm(n):void 0,i;if(s==="OPEN"){let l=new Date().toISOString().split(".")[0]+"Z";i=await um(l)}return{gate_status:s,exit_code:o,stdout:n,stderr:r||void 0,tasks_failed:a,ledger_entry_ref:i}}var pm=Ae.object({iteration:Ae.number().int().positive(),verdict:Ae.enum(["APPROVE","SALVAGE","REJECT"]),score:Ae.number().optional(),feedback:Ae.string()}),lT=Ae.object({status:Ae.enum(["APPROVED","REJECTED","GATE_CLOSED","MAX_ITERATIONS"]),skill_path:Ae.string().optional(),qualify_verdicts:Ae.array(pm),brief_id:Ae.string().optional(),telemetry_ref:Ae.string()});async function mm(e,t,n){let r=n?.apiKey,o=typeof e=="string"?{brief:e}:typeof e=="object"&&e!==null?e:{},s=o.brief,a=o.forceThaw??!1,i=o.maxIterations??3,l="",c=[],u="REJECTED",p,m;try{let f=await dm();if(f.gate_status==="CLOSED"&&!a)return l=await Be({event:"forge.gate_check",gate_status:"CLOSED"}),{status:"GATE_CLOSED",qualify_verdicts:[],telemetry_ref:l};a&&f.gate_status==="CLOSED"&&(await Ji(),l=await Be({event:"forge.thaw_override",gate_status:"CLOSED"})),l=await Be({event:"forge.gate_check",gate_status:"OPEN"});let g="",y=!1;if(s)g=s,y=!0;else{let T=await Zi();if(T.length>0){let b=T[0],C=await Qi(b);g=C.content,m=C.id,y=!0}else{if(!t?.sessionId)throw new Error("forge requires parent session for gap discovery");let C=Y("forge")["gap-discovery.md"];if(!C)throw new Error("forge skill missing gap-discovery.md prompt");let A=await(await new M({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:C},idPrefix:"forge-gap-discovery"})).runToResult("Identify the most impactful skill gap.");if(A.status!=="succeeded")throw new Error(`gap discovery failed: ${ee(A)}`);if(g=A.message?.content||"",!g)throw new Error("gap discovery returned no concept")}}if(l=await Be({event:"forge.brief_loaded",used_brief:y,brief_id:m||null}),!t?.sessionId)throw new Error("forge requires parent session for skill generation");let h=Y("forge"),k=h["generate.md"],v=h["system.md"];if(!k)throw new Error("forge skill missing generate.md prompt");if(!v)throw new Error("forge skill missing system.md prompt");let K=await(await new M({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:v},idPrefix:"forge-generate"})).runToResult(`Generate a new amplifier skill based on this concept:
1161
1161
 
1162
- ${g}`);if(N.status!=="succeeded")throw new Error(`skill generation failed: ${Z(N)}`);let $=N.message?.content||"";if(!$)throw new Error("skill generation returned no output");for(let v=1;v<=i;v++){let w=Vr.systemPrompt;if(!w)throw new Error("qualify agent missing system prompt");let E=await(await new _({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:w},idPrefix:`forge-qualify-${v}`})).runToResult(`Evaluate this amplifier skill against the force-multiplier criteria:
1162
+ ${g}`);if(K.status!=="succeeded")throw new Error(`skill generation failed: ${ee(K)}`);let F=K.message?.content||"";if(!F)throw new Error("skill generation returned no output");for(let T=1;T<=i;T++){let b=ko.systemPrompt;if(!b)throw new Error("qualify agent missing system prompt");let E=await(await new M({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:b},idPrefix:`forge-qualify-${T}`})).runToResult(`Evaluate this amplifier skill against the force-multiplier criteria:
1163
1163
 
1164
- ${$}`);if(E.status!=="succeeded")throw new Error(`qualify iteration ${v} failed: ${Z(E)}`);let P=E.message?.content||"",{verdict:C,score:M,feedback:Q}=ki(P),O={iteration:v,verdict:C,score:M,feedback:Q};if(c.push(O),l=await De({event:"forge.qualify_iteration",iteration:v,verdict:C,score:M||null}),C==="APPROVE"){u="APPROVED";break}else if(C==="SALVAGE"&&v<i){let T=h["qualify-rework.md"];if(!T)throw new Error("forge skill missing qualify-rework.md prompt");let ge=T.replace("{feedback}",Q).replace("{original_skill}",$),ne=await(await new _({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:ge},idPrefix:`forge-rework-${v}`})).runToResult("Refine the skill based on the feedback.");if(ne.status!=="succeeded")throw new Error(`rework iteration ${v} failed: ${Z(ne)}`);if($=ne.message?.content||"",!$)throw new Error(`rework iteration ${v} returned no output`)}else C==="REJECT"&&v>=i&&(u="MAX_ITERATIONS")}if(u==="APPROVED"){let v=$.match(/^name:\s*([^\n]+)/m),w=v&&v[1]?v[1].trim().replace(/^["']|["']$/g,""):"unknown",I=it(pn(),w);await wi(I,{recursive:!0});let x=it(I,"SKILL.md");await Si(x,$,"utf-8"),p=x,y&&m&&await Yr(m,"consumed"),l=await De({event:"forge.complete",status:"APPROVED",skill_name:w,iterations:c.length})}else u==="MAX_ITERATIONS"&&(y&&m&&await Yr(m,"failed"),l=await De({event:"forge.complete",status:"MAX_ITERATIONS",iterations:c.length}))}catch(f){throw l=await De({event:"forge.error",error:f instanceof Error?f.message:String(f)}),f}return{status:u,skill_path:p,qualify_verdicts:c,brief_id:m,telemetry_ref:l}}var sp={name:"forge",description:'Creates new amplifier skills gated by forge-gate-check, with autonomous gap discovery, skill generation, and qualify iteration loop \u22643\xD7. Writes approved skills and appends telemetry to shared JSONL with surface: "atlas".',handler:op,argumentHint:"[--brief <path>]",whenToUse:"When the user wants to grow the plugin with a new amplifier skill \u2014 autonomously generates and validates one.",flags:["--brief"]};Ie(sp);import{readFileSync as yp,existsSync as kp}from"fs";import{join as bp}from"path";var ip={name:"bash",description:"Execute a shell command and return its stdout and stderr. Use for running programs, installing packages, git operations, and any task that requires a shell. Commands run in the user's default shell. Long-running commands should use timeout_ms. Output is capped at ~100KB; excess is truncated with a notice.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute."},timeout_ms:{type:"number",description:"Optional timeout in milliseconds (default 120000, max 600000). The command is killed if it exceeds this duration."}},required:["command"]}},ap={name:"read_file",description:"Read a file from the filesystem. Returns the file content with line numbers. Use offset and limit to read specific sections of large files. When the read returns a partial view, the response ends with a `... (showing lines X-Y of Z [\u2014 pass offset=N to continue])` annotation indicating the full file size and how to continue. Binary files are detected and rejected. Missing files return an error.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-based). Defaults to 1."},limit:{type:"number",description:"Maximum number of lines to read. Defaults to 2000."}},required:["file_path"]}},lp={name:"write_file",description:"Write content to a file, creating it if it does not exist or overwriting if it does. Parent directories are created automatically. Prefer edit_file for modifying existing files \u2014 use write_file only for new files or complete rewrites.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"The full content to write to the file."}},required:["file_path","content"]}},cp={name:"edit_file",description:"Perform an exact string replacement in a file. Finds old_string and replaces it with new_string. The edit fails if old_string is not found or matches multiple locations (unless replace_all is true). Always use read_file first to verify the exact content before editing.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to edit."},old_string:{type:"string",description:"The exact string to find and replace. Must match file content exactly."},new_string:{type:"string",description:"The replacement string."},replace_all:{type:"boolean",description:"If true, replace all occurrences. If false (default), fail when multiple matches exist."}},required:["file_path","old_string","new_string"]}},up={name:"glob",description:'Find files matching a glob pattern. Returns matching file paths, capped at 500 results. Use for discovering files before reading them. Patterns follow standard glob syntax (e.g., "src/**/*.ts", "*.json").',input_schema:{type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match (e.g., "src/**/*.ts").'},path:{type:"string",description:"Base directory to search from. Defaults to the current working directory."}},required:["pattern"]}},dp={name:"grep",description:"Search file contents for lines matching a pattern. Returns matches in file:line:content format. Uses grep -rn (or ripgrep if available). Output is capped to prevent overflow. Use for finding symbols, strings, or patterns across the codebase.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Search pattern (basic regex by default)."},path:{type:"string",description:"Directory or file to search. Defaults to current working directory."},include:{type:"string",description:'File glob to restrict search (e.g., "*.ts"). Passed as --include to grep.'}},required:["pattern"]}},pp={name:"list_directory",description:"List the contents of a directory. Returns file and subdirectory names with type annotations (directories end with /). Use for exploring project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Absolute path to the directory to list."}},required:["path"]}},vi={name:"agent",description:"Dispatch a subtask to an independent agent session. The agent runs with its own conversation context and tool access. Use for tasks that benefit from isolated context (research, parallel work, specialized focus). The agent runs to completion and returns its final response.",input_schema:{type:"object",properties:{prompt:{type:"string",description:"The task for the agent to perform."},model:{type:"string",description:"Model for the agent. Defaults to parent session model. Override per-call to right-size cost vs. capability \u2014 `haiku` (cheapest/fastest), `sonnet` (general-use), `opus` (most capable). Append `_1m` (e.g. `sonnet_1m`) for 1M-context variants. Full model IDs are also accepted."},max_turns:{type:"number",description:"Maximum conversation turns (default 10, max 50)."},id_prefix:{type:"string",description:"Label prefix for log correlation."}},required:["prompt"]}},xi={name:"skill",description:"Invoke a registered skill by name. Skills are specialized capabilities that dispatch subagents with domain-specific prompts. Check the system prompt for the list of available skills and their descriptions.",input_schema:{type:"object",properties:{name:{type:"string",description:'Skill name (e.g., "mint", "diagnose", "shadow-verify").'},arguments:{type:"string",description:"Arguments to pass to the skill."}},required:["name"]}},Rn=[ip,ap,lp,cp,up,dp,pp],We=Rn.map(e=>e.name);import{readFileSync as mp,existsSync as Ci}from"fs";import{join as Ai}from"path";import{config as fp}from"dotenv";var Ti={opus:"claude-opus-4-7",opus_1m:"claude-opus-4-7",sonnet:"claude-sonnet-4-6",sonnet_1m:"claude-sonnet-4-6",haiku:"claude-haiku-4-5-20251001"};function _n(e){return e in Ti}function Ei(e){let t=Ti[e];if(!t)throw new Error(`Invalid model: ${e}`);return t}function Gt(e){if(e!==void 0)return typeof e=="string"&&_n(e)?Ei(e):e}var $n={model:"sonnet",maxTokens:4096,temperature:1},Pi=!1;function zt(){return process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_CODE_OAUTH_TOKEN||ys()}function gp(){if(!Pi){let r=[Ai(process.cwd(),".env"),ot(),is()];for(let o of r)if(Ci(o)){fp({path:o});break}Pi=!0}let e={},t=zt();t!==void 0&&(e.apiKey=t);let n=process.env.AFK_MODEL??process.env.CLAUDE_MODEL;if(n){let r=n.toLowerCase();e.model=_n(r)?r:n}if(process.env.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(process.env.AFK_MAX_TOKENS,10)),process.env.AFK_TEMPERATURE&&(e.temperature=parseFloat(process.env.AFK_TEMPERATURE)),process.env.AFK_SYSTEM_PROMPT&&(e.systemPrompt=process.env.AFK_SYSTEM_PROMPT),process.env.AFK_AUTO_ROUTING){let r=process.env.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:r,chat:r,telegram:r,daemon:r}}return e}function hp(){let e=[Ai(process.cwd(),"afk.config.json"),mt(),gn()];for(let t of e)if(Ci(t))try{let n=mp(t,"utf-8"),r=JSON.parse(n),o={};if(typeof r.model=="string"&&r.model.length>0&&(o.model=(_n(r.model),r.model)),typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),r.autoRouting&&typeof r.autoRouting=="object"){let s={};typeof r.autoRouting.interactive=="boolean"&&(s.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(s.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(s.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(s.daemon=r.autoRouting.daemon),o.autoRouting=s}if(r.daemon&&typeof r.daemon=="object"){let s={};typeof r.daemon.task=="string"&&(s.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(s.taskId=r.daemon.taskId),o.daemon=s}return o}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return{}}function gt(e){let t=gp(),n=hp(),r={...$n,...t,...n,...e};return{model:r.model??$n.model,maxTokens:r.maxTokens??$n.maxTokens,temperature:r.temperature??$n.temperature,...r.apiKey!==void 0?{apiKey:r.apiKey}:{},...r.systemPrompt!==void 0?{systemPrompt:r.systemPrompt}:{},...r.autoRouting!==void 0?{autoRouting:r.autoRouting}:{},...r.daemon!==void 0?{daemon:r.daemon}:{}}}function On(){return`# Agent AFK
1164
+ ${F}`);if(E.status!=="succeeded")throw new Error(`qualify iteration ${T} failed: ${ee(E)}`);let A=E.message?.content||"",{verdict:I,score:_,feedback:Q}=ea(A),$={iteration:T,verdict:I,score:_,feedback:Q};if(c.push($),l=await Be({event:"forge.qualify_iteration",iteration:T,verdict:I,score:_||null}),I==="APPROVE"){u="APPROVED";break}else if(I==="SALVAGE"&&T<i){let x=h["qualify-rework.md"];if(!x)throw new Error("forge skill missing qualify-rework.md prompt");let ye=x.replace("{feedback}",Q).replace("{original_skill}",F),oe=await(await new M({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:ye},idPrefix:`forge-rework-${T}`})).runToResult("Refine the skill based on the feedback.");if(oe.status!=="succeeded")throw new Error(`rework iteration ${T} failed: ${ee(oe)}`);if(F=oe.message?.content||"",!F)throw new Error(`rework iteration ${T} returned no output`)}else I==="REJECT"&&T>=i&&(u="MAX_ITERATIONS")}if(u==="APPROVED"){let T=F.match(/^name:\s*([^\n]+)/m),b=T&&T[1]?T[1].trim().replace(/^["']|["']$/g,""):"unknown",C=mt(An(),b);await na(C,{recursive:!0});let S=mt(C,"SKILL.md");await ra(S,F,"utf-8"),p=S,y&&m&&await wo(m,"consumed"),l=await Be({event:"forge.complete",status:"APPROVED",skill_name:b,iterations:c.length})}else u==="MAX_ITERATIONS"&&(y&&m&&await wo(m,"failed"),l=await Be({event:"forge.complete",status:"MAX_ITERATIONS",iterations:c.length}))}catch(f){throw l=await Be({event:"forge.error",error:f instanceof Error?f.message:String(f)}),f}return{status:u,skill_path:p,qualify_verdicts:c,brief_id:m,telemetry_ref:l}}var fm={name:"forge",description:'Creates new amplifier skills gated by forge-gate-check, with autonomous gap discovery, skill generation, and qualify iteration loop \u22643\xD7. Writes approved skills and appends telemetry to shared JSONL with surface: "atlas".',handler:mm,argumentHint:"[--brief <path>]",whenToUse:"When the user wants to grow the plugin with a new amplifier skill \u2014 autonomously generates and validates one.",flags:["--brief"]};Me(fm);import{readFileSync as Pm,existsSync as Cm}from"fs";import{join as Am}from"path";var gm={name:"bash",description:"Execute a shell command and return its stdout and stderr. Use for running programs, installing packages, git operations, and any task that requires a shell. Commands run in the user's default shell. Long-running commands should use timeout_ms. Output is capped at ~100KB; excess is truncated with a notice.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute."},timeout_ms:{type:"number",description:"Optional timeout in milliseconds (default 120000, max 600000). The command is killed if it exceeds this duration."}},required:["command"]}},hm={name:"read_file",description:"Read a file from the filesystem. Returns the file content with line numbers. Use offset and limit to read specific sections of large files. When the read returns a partial view, the response ends with a `... (showing lines X-Y of Z [\u2014 pass offset=N to continue])` annotation indicating the full file size and how to continue. Binary files are detected and rejected. Missing files return an error.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-based). Defaults to 1."},limit:{type:"number",description:"Maximum number of lines to read. Defaults to 2000."}},required:["file_path"]}},ym={name:"write_file",description:"Write content to a file, creating it if it does not exist or overwriting if it does. Parent directories are created automatically. Prefer edit_file for modifying existing files \u2014 use write_file only for new files or complete rewrites.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"The full content to write to the file."}},required:["file_path","content"]}},bm={name:"edit_file",description:"Perform an exact string replacement in a file. Finds old_string and replaces it with new_string. The edit fails if old_string is not found or matches multiple locations (unless replace_all is true). Always use read_file first to verify the exact content before editing.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to edit."},old_string:{type:"string",description:"The exact string to find and replace. Must match file content exactly."},new_string:{type:"string",description:"The replacement string."},replace_all:{type:"boolean",description:"If true, replace all occurrences. If false (default), fail when multiple matches exist."}},required:["file_path","old_string","new_string"]}},km={name:"glob",description:'Find files matching a glob pattern. Returns matching file paths, capped at 500 results. Use for discovering files before reading them. Patterns follow standard glob syntax (e.g., "src/**/*.ts", "*.json").',input_schema:{type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match (e.g., "src/**/*.ts").'},path:{type:"string",description:"Base directory to search from. Defaults to the current working directory."}},required:["pattern"]}},wm={name:"grep",description:"Search file contents for lines matching a pattern. Returns matches in file:line:content format. Uses grep -rn (or ripgrep if available). Output is capped to prevent overflow. Use for finding symbols, strings, or patterns across the codebase.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Search pattern (basic regex by default)."},path:{type:"string",description:"Directory or file to search. Defaults to current working directory."},include:{type:"string",description:'File glob to restrict search (e.g., "*.ts"). Passed as --include to grep.'}},required:["pattern"]}},Sm={name:"list_directory",description:"List the contents of a directory. Returns file and subdirectory names with type annotations (directories end with /). Use for exploring project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Absolute path to the directory to list."}},required:["path"]}},oa={name:"agent",description:`Dispatch an independent subagent with its own context window and tool access. Use for tasks that protect the main session's context: codebase exploration, multi-file inspection, repo search, verification, debugging, failing-test investigation, PR review, parallel hypothesis testing, independent re-derivation of a claim, audit work, stale-path detection, feature-wiring checks, and any research-shaped investigation.
1165
+
1166
+ Parallelize: dispatch multiple \`agent\` calls in a single tool-use turn to run independent investigations concurrently.
1167
+
1168
+ Nest: a subagent may itself dispatch further subagents (depth limit 3) when it discovers a separable sub-investigation.
1169
+
1170
+ Subagents return their final assistant message verbatim \u2014 instruct them explicitly to compress their findings into: answer, evidence with file:line citations, confidence, risks, recommended next action, unresolved questions, and what was not checked. Specify expected response length.
1171
+
1172
+ Do not use this tool for: trivial one-file edits, conversational answers, direct tool calls the user explicitly requested, or tasks where dispatch overhead exceeds the work.`,input_schema:{type:"object",properties:{prompt:{type:"string",description:"The task for the agent to perform."},model:{type:"string",description:"Model for the agent. Defaults to parent session model. Override per-call to right-size cost vs. capability \u2014 `haiku` (cheapest/fastest), `sonnet` (general-use), `opus` (most capable). Append `_1m` (e.g. `sonnet_1m`) for 1M-context variants. Full model IDs are also accepted."},max_turns:{type:"number",description:"Maximum conversation turns (default 10, max 50)."},id_prefix:{type:"string",description:"Label prefix for log correlation."}},required:["prompt"]}},sa={name:"skill",description:"Invoke a registered skill by name. Skills are specialized capabilities that dispatch subagents with domain-specific prompts. Check the system prompt for the list of available skills and their descriptions.",input_schema:{type:"object",properties:{name:{type:"string",description:'Skill name (e.g., "mint", "diagnose", "shadow-verify").'},arguments:{type:"string",description:"Arguments to pass to the skill."}},required:["name"]}},qn=[gm,hm,ym,bm,km,wm,Sm],Xe=qn.map(e=>e.name);import{readFileSync as vm,existsSync as ca}from"fs";import{join as ua}from"path";import{config as xm}from"dotenv";var ia={opus:"claude-opus-4-7",opus_1m:"claude-opus-4-7",sonnet:"claude-sonnet-4-6",sonnet_1m:"claude-sonnet-4-6",haiku:"claude-haiku-4-5-20251001"};function Yn(e){return e in ia}function aa(e){let t=ia[e];if(!t)throw new Error(`Invalid model: ${e}`);return t}function en(e){if(e!==void 0)return typeof e=="string"&&Yn(e)?aa(e):e}var Jn={model:"sonnet",maxTokens:4096,temperature:1},la=!1;function tn(){return process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_CODE_OAUTH_TOKEN||ei()}function Tm(){if(!la){let r=[ua(process.cwd(),".env"),Ne(),Ws()];for(let o of r)ca(o)&&xm({path:o,override:!1});la=!0}let e={},t=tn();t!==void 0&&(e.apiKey=t);let n=process.env.AFK_MODEL??process.env.CLAUDE_MODEL;if(n){let r=n.toLowerCase();e.model=Yn(r)?r:n}if(process.env.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(process.env.AFK_MAX_TOKENS,10)),process.env.AFK_TEMPERATURE&&(e.temperature=parseFloat(process.env.AFK_TEMPERATURE)),process.env.AFK_SYSTEM_PROMPT&&(e.systemPrompt=process.env.AFK_SYSTEM_PROMPT),process.env.AFK_AUTO_ROUTING){let r=process.env.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:r,chat:r,telegram:r,daemon:r}}return e}function Em(){let e=[ua(process.cwd(),"afk.config.json"),St(),Mn()];for(let t of e)if(ca(t))try{let n=vm(t,"utf-8"),r=JSON.parse(n),o={};if(typeof r.model=="string"&&r.model.length>0&&(o.model=(Yn(r.model),r.model)),typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),r.autoRouting&&typeof r.autoRouting=="object"){let s={};typeof r.autoRouting.interactive=="boolean"&&(s.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(s.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(s.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(s.daemon=r.autoRouting.daemon),o.autoRouting=s}if(r.daemon&&typeof r.daemon=="object"){let s={};typeof r.daemon.task=="string"&&(s.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(s.taskId=r.daemon.taskId),o.daemon=s}return o}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return{}}function xt(e){let t=Tm(),n=Em(),r={...Jn,...t,...n,...e};return{model:r.model??Jn.model,maxTokens:r.maxTokens??Jn.maxTokens,temperature:r.temperature??Jn.temperature,...r.apiKey!==void 0?{apiKey:r.apiKey}:{},...r.systemPrompt!==void 0?{systemPrompt:r.systemPrompt}:{},...r.autoRouting!==void 0?{autoRouting:r.autoRouting}:{},...r.daemon!==void 0?{daemon:r.daemon}:{}}}function Xn(){return`# Agent AFK
1165
1173
 
1166
1174
  ## What this process is
1167
1175
 
@@ -1196,6 +1204,25 @@ Do not drift into open-ended exploration when the objective is concrete.
1196
1204
 
1197
1205
  Rule: agentic on reversible actions, cautious on irreversible ones.
1198
1206
 
1207
+ ## Coordinator default
1208
+
1209
+ The main session is the coordinator. Subagents are investigators.
1210
+
1211
+ Default to delegation for any task that would otherwise:
1212
+ - read or grep more than 3 files inline,
1213
+ - verify a claim independently from the chain that produced it,
1214
+ - investigate a failing test or unexplained behavior,
1215
+ - run two or more independent investigations that could happen in parallel,
1216
+ - consume more main-session context than the subagent's compressed answer would.
1217
+
1218
+ Stay inline for: single-file edits, localized fixes visible in <2 reads, conversational answers, explicit user requests for a direct tool call, and tasks where dispatch overhead exceeds the work.
1219
+
1220
+ Parallelize independent subagents in one wave. Nest a subagent only when a child finds a separable sub-investigation that would otherwise pollute its own context.
1221
+
1222
+ Subagents return compressed findings, not raw exploration. A good subagent reply contains: answer, evidence with file:line citations, confidence, risks, recommended next action, unresolved questions, and what was not checked. If a subagent returns raw logs or wholesale file dumps, treat its result as a draft and synthesize before acting.
1223
+
1224
+ Never silently fall back to inline work after a delegation failure. State the failure and the chosen fallback before proceeding.
1225
+
1199
1226
  ## Decision commitment
1200
1227
 
1201
1228
  When diagnosing and fixing code:
@@ -1272,6 +1299,7 @@ Ordered. Higher wins on conflict.
1272
1299
  - **Unexpected state.** Your model is wrong. Re-observe from durable sources.
1273
1300
  - **Ambiguity you cannot resolve from context.** Ask one precise question.
1274
1301
  - **Your own mistake.** State it, correct it, proceed.
1302
+ - **Delegation failure.** If a subagent fails (error, schema mismatch, timeout, depth limit), do not silently inline the work. State the failure, the chosen fallback, and proceed only if the fallback is acceptable for the task.
1275
1303
 
1276
1304
  ## What to cut
1277
1305
 
@@ -1307,21 +1335,21 @@ Every turn must end in one externally identifiable terminal state. AFK users nee
1307
1335
  - What resumption requires
1308
1336
 
1309
1337
  Never end a turn mid-loop without one of these.
1310
- `}function Dn(){if(process.env.AFK_SYSTEM_PROMPT)return process.env.AFK_SYSTEM_PROMPT;let e=[bp(process.cwd(),"afk.config.json"),mt(),gn()];for(let t of e)if(kp(t))try{let n=JSON.parse(yp(t,"utf-8"));if(typeof n.systemPrompt=="string"&&n.systemPrompt.length>0)return n.systemPrompt}catch{}}function H(){return zt()}function Vt(){return process.env.OPENAI_API_KEY||process.env.CODEX_API_KEY||void 0}function Ri(e){return ke(e)==="openai-codex"?Vt():H()}function be(){let e=process.env.AFK_MODEL??process.env.CLAUDE_MODEL;return!e||e.length===0?"sonnet":e}function ht(){let e=process.env.AFK_DEFAULT_SUBAGENT_MODEL;return!e||e.length===0?"sonnet":e}function Ke(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 Ii=["low","medium","high","xhigh","max"];function Ge(e){if(e!==void 0){if(Ii.includes(e))return e;throw new Error(`Invalid --effort value: ${e}. Expected one of: ${Ii.join(", ")}`)}}function yt(){return Ke(process.env.AFK_THINKING)}function kt(){return Ge(process.env.AFK_EFFORT)}function bt(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 qr(){return bt(process.env.AFK_MAX_BUDGET_USD)}function Jr(){return bt(process.env.AFK_TASK_BUDGET)}function wt(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 Yt(){return wt(process.env.AFK_MAX_OUTPUT_TOKENS)}var Mi=["anthropic","anthropic-direct","openai-codex"];function Ln(e,t){if(e!==void 0){if(!Mi.includes(e))throw new Error(`Invalid --provider value: ${e}. Expected one of: ${Mi.join(", ")}`);if(e==="anthropic"||e==="anthropic-direct"){let n=[...We];return t?.subagentExecutor&&n.push("agent"),t?.skillExecutor&&n.push("skill"),new we({permissions:{allowedTools:n},subagentExecutor:t?.subagentExecutor,skillExecutor:t?.skillExecutor})}}}async function _i(e,t){let r=Y("mint")["spec.md"];if(!r)throw new Error("mint skill missing spec.md prompt");let a=await(await new _().forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:r,apiKey:H()},idPrefix:"mint-spec"})).runToResult(`Create a detailed specification for: ${e}`);if(a.status!=="succeeded"||!a.message)throw new Error(`spec phase failed: ${Z(a)}`);return a.message.content}async function $i(e,t){let r=Y("mint")["research.md"];if(!r)throw new Error("mint skill missing research.md prompt");let a=await(await new _().forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:r,apiKey:H()},idPrefix:"mint-research"})).runToResult(`Gather context and research for this specification:
1338
+ `}function Qn(){if(process.env.AFK_SYSTEM_PROMPT)return process.env.AFK_SYSTEM_PROMPT;let e=[Am(process.cwd(),"afk.config.json"),St(),Mn()];for(let t of e)if(Cm(t))try{let n=JSON.parse(Pm(t,"utf-8"));if(typeof n.systemPrompt=="string"&&n.systemPrompt.length>0)return n.systemPrompt}catch{}}function B(){return tn()}function nn(){return process.env.OPENAI_API_KEY||process.env.CODEX_API_KEY||void 0}function ma(e){return ke(e)==="openai-codex"?nn():B()}function we(){let e=process.env.AFK_MODEL??process.env.CLAUDE_MODEL;return!e||e.length===0?"sonnet":e}function Tt(){let e=process.env.AFK_DEFAULT_SUBAGENT_MODEL;return!e||e.length===0?"sonnet":e}function Qe(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 da=["low","medium","high","xhigh","max"];function Ze(e){if(e!==void 0){if(da.includes(e))return e;throw new Error(`Invalid --effort value: ${e}. Expected one of: ${da.join(", ")}`)}}function Et(){return Qe(process.env.AFK_THINKING)}function Pt(){return Ze(process.env.AFK_EFFORT)}function Ct(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 So(){return Ct(process.env.AFK_MAX_BUDGET_USD)}function vo(){return Ct(process.env.AFK_TASK_BUDGET)}function At(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 rn(){return At(process.env.AFK_MAX_OUTPUT_TOKENS)}var pa=["anthropic","anthropic-direct","openai-codex"];function Zn(e,t){if(e!==void 0){if(!pa.includes(e))throw new Error(`Invalid --provider value: ${e}. Expected one of: ${pa.join(", ")}`);if(e==="anthropic"||e==="anthropic-direct"){let n=[...Xe];return t?.subagentExecutor&&n.push("agent"),t?.skillExecutor&&n.push("skill"),new Se({permissions:{allowedTools:n},subagentExecutor:t?.subagentExecutor,skillExecutor:t?.skillExecutor})}}}async function fa(e,t){let r=Y("mint")["spec.md"];if(!r)throw new Error("mint skill missing spec.md prompt");let a=await(await new M().forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:r,apiKey:B()},idPrefix:"mint-spec"})).runToResult(`Create a detailed specification for: ${e}`);if(a.status!=="succeeded"||!a.message)throw new Error(`spec phase failed: ${ee(a)}`);return a.message.content}async function ga(e,t){let r=Y("mint")["research.md"];if(!r)throw new Error("mint skill missing research.md prompt");let a=await(await new M().forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:r,apiKey:B()},idPrefix:"mint-research"})).runToResult(`Gather context and research for this specification:
1311
1339
 
1312
- ${e}`);if(a.status!=="succeeded"||!a.message)throw new Error(`research phase failed: ${Z(a)}`);return a.message.content}async function Oi(e,t,n){let o=Y("mint")["plan.md"];if(!o)throw new Error("mint skill missing plan.md prompt");let a=await new _().forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:o,apiKey:H()},idPrefix:"mint-plan"}),i=`Specification:
1340
+ ${e}`);if(a.status!=="succeeded"||!a.message)throw new Error(`research phase failed: ${ee(a)}`);return a.message.content}async function ha(e,t,n){let o=Y("mint")["plan.md"];if(!o)throw new Error("mint skill missing plan.md prompt");let a=await new M().forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:o,apiKey:B()},idPrefix:"mint-plan"}),i=`Specification:
1313
1341
  ${e}
1314
1342
 
1315
1343
  Research findings:
1316
1344
  ${t}
1317
1345
 
1318
- Create a detailed implementation plan based on the spec and research.`,l=await a.runToResult(i);if(l.status!=="succeeded"||!l.message)throw new Error(`plan phase failed: ${Z(l)}`);return l.message.content}function wp(e){let t=e.match(/\.\w+\s/g)||[],n=e.match(/Files?:\s*(.+?)(?:\n|$)/gi)||[],r=t.length;for(let o of n){let s=o.replace(/Files?:\s*/i,"").split(/[,;]/g).filter(a=>a.trim().length>0);r+=s.length}return r}async function Di(e,t){if(wp(e)<3)return null;try{return await se("parallelize").handler({plan:e})}catch{}try{let o=Fn().get("parallelize");if(!o)return null;let s=new _({parentAbortSignal:t.abortSignal,apiKey:H()});try{let i=await(await s.forkSubagent({parent:t,config:{model:"sonnet",systemPrompt:o},idPrefix:"mint-parallelize"})).runToResult(JSON.stringify({plan:e}));return i.status==="succeeded"&&i.message?i.message.content:null}finally{await s.teardownAll()}}catch(r){return console.warn(`Parallelize dispatch failed: ${r instanceof Error?r.message:String(r)}`),null}}import{z as Le}from"zod";function St(e){let t=$e();t&&t({type:"panel",spec:e},{subagentId:"__main__"})}var Sp=Le.object({status:Le.enum(["PASS","FAIL"]),status_reason:Le.string().optional(),files_changed:Le.array(Le.string()),tests_passed:Le.boolean(),build_passed:Le.boolean().optional(),verification_passed:Le.boolean().optional(),notes:Le.string()});async function Li(e,t,n){let o=Y("mint")["build.md"];if(!o)throw new Error("mint skill missing build.md prompt");let a=await new _().forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:o,apiKey:H()},idPrefix:"mint-build",outputSchema:Sp}),i=`Implementation plan:
1346
+ Create a detailed implementation plan based on the spec and research.`,l=await a.runToResult(i);if(l.status!=="succeeded"||!l.message)throw new Error(`plan phase failed: ${ee(l)}`);return l.message.content}function Im(e){let t=/[\w./@-]*\.(?:ts|tsx|js|jsx|mjs|cjs|py|md|json|yaml|yml|toml|sh)\b/gi,n=new Set;for(let r of e.matchAll(t))n.add(r[0].toLowerCase());return n.size}async function ya(e,t){if(Im(e)<3)return{kind:"skipped",reason:"too-few-files"};let r=!1;try{let o=le("parallelize");return r=!0,{kind:"plan",plan:await o.handler({plan:e})}}catch(o){if(r)return{kind:"failed",error:`parallelize skill handler threw: ${o instanceof Error?o.message:String(o)}`}}try{let s=er().get("parallelize");if(!s)return{kind:"skipped",reason:"skill-body-missing"};let a=new M({parentAbortSignal:t.abortSignal,apiKey:B()});try{let l=await(await a.forkSubagent({parent:t,config:{model:"sonnet",systemPrompt:s},idPrefix:"mint-parallelize"})).runToResult(JSON.stringify({plan:e}));return l.status==="succeeded"&&l.message?{kind:"plan",plan:l.message.content}:l.status!=="succeeded"?{kind:"failed",error:`parallelize subagent status=${l.status}${l.error?.message?`: ${l.error.message}`:""}`}:{kind:"failed",error:"parallelize subagent returned no message"}}finally{await a.teardownAll()}}catch(o){return{kind:"failed",error:`parallelize dispatch threw: ${o instanceof Error?o.message:String(o)}`}}}import{z as We}from"zod";function It(e){let t=Ue();t&&t({type:"panel",spec:e},{subagentId:"__main__"})}var _m=We.object({status:We.enum(["PASS","FAIL"]),status_reason:We.string().optional(),files_changed:We.array(We.string()),tests_passed:We.boolean(),build_passed:We.boolean().optional(),verification_passed:We.boolean().optional(),notes:We.string()});async function ba(e,t,n){let o=Y("mint")["build.md"];if(!o)throw new Error("mint skill missing build.md prompt");let a=await new M().forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:o,apiKey:B()},idPrefix:"mint-build",outputSchema:_m}),i=`Implementation plan:
1319
1347
  ${e}
1320
1348
 
1321
1349
  `+(t?`Wave orchestration plan:
1322
1350
  ${JSON.stringify(t,null,2)}
1323
1351
 
1324
- `:"")+"Execute the implementation plan following TDD (test-first) principles.",l=await a.runToResult(i);if(l.status!=="succeeded"||!l.output)throw new Error(`build phase failed: ${Z(l)}`);let c=l.output,u={filesChanged:c.files_changed,testsPassed:c.tests_passed,notes:c.notes};return St({kind:"checkpoint",title:"build",body:[`Files changed: ${u.filesChanged.length}`,`Tests: ${u.testsPassed?"passed":"failed"}`,"Next: verify"]}),u}import{z as vt}from"zod";var vp=vt.object({status:vt.enum(["PASS","FAIL"]),status_reason:vt.string().optional(),issues:vt.array(vt.string()).default([]),summary:vt.string().optional()});async function Qr(e,t,n,r,o){let a=await new _().forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:o,apiKey:H()},idPrefix:`mint-verify-${e}`,outputSchema:vp}),i=`Plan:
1352
+ `:"")+"Execute the implementation plan following TDD (test-first) principles.",l=await a.runToResult(i);if(l.status!=="succeeded"||!l.output)throw new Error(`build phase failed: ${ee(l)}`);let c=l.output,u={filesChanged:c.files_changed,testsPassed:c.tests_passed,notes:c.notes};return It({kind:"checkpoint",title:"build",body:[`Files changed: ${u.filesChanged.length}`,`Tests: ${u.testsPassed?"passed":"failed"}`,"Next: verify"]}),u}import{z as _t}from"zod";var Rm=_t.object({status:_t.enum(["PASS","FAIL"]),status_reason:_t.string().optional(),issues:_t.array(_t.string()).default([]),summary:_t.string().optional()});async function xo(e,t,n,r,o){let a=await new M().forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:o,apiKey:B()},idPrefix:`mint-verify-${e}`,outputSchema:Rm}),i=`Plan:
1325
1353
  ${t}
1326
1354
 
1327
1355
  Build results:
@@ -1329,12 +1357,12 @@ ${JSON.stringify(n,null,2)}
1329
1357
 
1330
1358
  Mode: ${e}
1331
1359
 
1332
- Run ${e} verification on the implementation.`,l;try{l=await a.runToResult(i)}finally{await a.teardown().catch(()=>{})}if(l.status!=="succeeded"||!l.output)return{passed:!1,issues:[`${e} verification failed: ${Z(l)}`]};let c=l.output,u=c.status==="PASS";return{passed:u,issues:u?void 0:c.issues}}async function Nn(e,t,n){let o=Y("mint")["verify.md"];if(!o)throw new Error("mint skill missing verify.md prompt");let[s,a,i]=await Promise.all([Qr("test",e,t,n,o),Qr("lint",e,t,n,o),Qr("design-review",e,t,n,o)]),l=[];s.issues&&l.push(...s.issues),a.issues&&l.push(...a.issues),i.issues&&l.push(...i.issues);let c={testsPassed:s.passed,lintPassed:a.passed,designReviewPassed:i.passed,...l.length>0?{issues:l}:{}},u=c.testsPassed&&c.lintPassed&&c.designReviewPassed,p=m=>m?"passed":"failed";return St({kind:u?"checkpoint":"diagnosis",title:"verify",body:[`Tests: ${p(c.testsPassed)} \xB7 Lint: ${p(c.lintPassed)}`,`Design review: ${p(c.designReviewPassed)}`,...u?["Next: ship"]:[`Issues: ${l.length} (heal loop will retry)`]]}),c}async function Fi(e,t,n,r,o){if(n.testsPassed&&n.lintPassed&&n.designReviewPassed)return{healed:!0,newHealIterations:r,newVerifyResults:n};if(r>=2)return{healed:!1,newHealIterations:r,newVerifyResults:n};try{let s=se("diagnose"),a=`Verification failures:
1360
+ Run ${e} verification on the implementation.`,l;try{l=await a.runToResult(i)}finally{await a.teardown().catch(()=>{})}if(l.status!=="succeeded"||!l.output)return{passed:!1,issues:[`${e} verification failed: ${ee(l)}`]};let c=l.output,u=c.status==="PASS";return{passed:u,issues:u?void 0:c.issues}}async function tr(e,t,n){let o=Y("mint")["verify.md"];if(!o)throw new Error("mint skill missing verify.md prompt");let[s,a,i]=await Promise.all([xo("test",e,t,n,o),xo("lint",e,t,n,o),xo("design-review",e,t,n,o)]),l=[];s.issues&&l.push(...s.issues),a.issues&&l.push(...a.issues),i.issues&&l.push(...i.issues);let c={testsPassed:s.passed,lintPassed:a.passed,designReviewPassed:i.passed,...l.length>0?{issues:l}:{}},u=c.testsPassed&&c.lintPassed&&c.designReviewPassed,p=m=>m?"passed":"failed";return It({kind:u?"checkpoint":"diagnosis",title:"verify",body:[`Tests: ${p(c.testsPassed)} \xB7 Lint: ${p(c.lintPassed)}`,`Design review: ${p(c.designReviewPassed)}`,...u?["Next: ship"]:[`Issues: ${l.length} (heal loop will retry)`]]}),c}async function ka(e,t,n,r,o){if(n.testsPassed&&n.lintPassed&&n.designReviewPassed)return{healed:!0,newHealIterations:r,newVerifyResults:n};if(r>=2)return{healed:!1,newHealIterations:r,newVerifyResults:n};try{let s=le("diagnose"),a=`Verification failures:
1333
1361
  Tests: ${n.testsPassed?"PASS":"FAIL"}
1334
1362
  Lint: ${n.lintPassed?"PASS":"FAIL"}
1335
1363
  Design: ${n.designReviewPassed?"PASS":"FAIL"}
1336
1364
  Issues: ${n.issues?.join(`
1337
- `)||"none"}`,i=await s.handler({failure:a,repoPath:process.cwd(),context:e}),l="";if(typeof i=="object"&&i!==null&&"winner"in i&&typeof i.winner=="object"&&i.winner!==null){let b=i.winner;typeof b.proposed_fix=="string"&&(l=b.proposed_fix)}let u=Y("mint")["heal.md"];if(!u)throw new Error("mint skill missing heal.md prompt");let m=await new _().forkSubagent({parent:{sessionId:o.sessionId},config:{model:"sonnet",systemPrompt:u,apiKey:H()},idPrefix:"mint-heal"}),f=n.issues?.join(`
1365
+ `)||"none"}`,i=await s.handler({failure:a,repoPath:process.cwd(),context:e}),l="";if(typeof i=="object"&&i!==null&&"winner"in i&&typeof i.winner=="object"&&i.winner!==null){let w=i.winner;typeof w.proposed_fix=="string"&&(l=w.proposed_fix)}let u=Y("mint")["heal.md"];if(!u)throw new Error("mint skill missing heal.md prompt");let m=await new M().forkSubagent({parent:{sessionId:o.sessionId},config:{model:"sonnet",systemPrompt:u,apiKey:B()},idPrefix:"mint-heal"}),f=n.issues?.join(`
1338
1366
  `)??"none",g=`Plan:
1339
1367
  ${e}
1340
1368
 
@@ -1344,7 +1372,7 @@ ${l}
1344
1372
  Verification issues:
1345
1373
  ${f}
1346
1374
 
1347
- Apply the fix and update the implementation.`,y=await m.runToResult(g);if(y.status!=="succeeded"||!y.message)throw new Error(`heal phase failed: ${Z(y)}`);let h=/^\s*FIX_APPLIED:\s*(true|false)/im.exec(y.message.content)?.[1]?.toLowerCase()==="true",k=r+1;if(!h)return{healed:!1,newHealIterations:k,newVerifyResults:n};if(!o.sessionId)throw new Error("Parent session ID required for verification");let S=await Nn(e,t,o.sessionId);return{healed:S.testsPassed&&S.lintPassed&&S.designReviewPassed,newHealIterations:k,newVerifyResults:S}}catch{return{healed:!1,newHealIterations:r+1,newVerifyResults:n}}}async function Ni(e,t){let r=Y("mint")["ship.md"];if(!r)throw new Error("mint skill missing ship.md prompt");let s=await new _().forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:r,apiKey:H()},idPrefix:"mint-ship"}),a=`Idea: ${e.idea}
1375
+ Apply the fix and update the implementation.`,y=await m.runToResult(g);if(y.status!=="succeeded"||!y.message)throw new Error(`heal phase failed: ${ee(y)}`);let h=/^\s*FIX_APPLIED:\s*(true|false)/im.exec(y.message.content)?.[1]?.toLowerCase()==="true",k=r+1;if(!h)return{healed:!1,newHealIterations:k,newVerifyResults:n};if(!o.sessionId)throw new Error("Parent session ID required for verification");let v=await tr(e,t,o.sessionId);return{healed:v.testsPassed&&v.lintPassed&&v.designReviewPassed,newHealIterations:k,newVerifyResults:v}}catch{return{healed:!1,newHealIterations:r+1,newVerifyResults:n}}}async function wa(e,t){let r=Y("mint")["ship.md"];if(!r)throw new Error("mint skill missing ship.md prompt");let s=await new M().forkSubagent({parent:{sessionId:t},config:{model:"sonnet",systemPrompt:r,apiKey:B()},idPrefix:"mint-ship"}),a=`Idea: ${e.idea}
1348
1376
 
1349
1377
  Specification:
1350
1378
  ${e.spec}
@@ -1358,27 +1386,27 @@ ${JSON.stringify(e.buildResults,null,2)}
1358
1386
  Verification results:
1359
1387
  ${JSON.stringify(e.verifyResults,null,2)}
1360
1388
 
1361
- Create a ship-ready summary with next steps.`,i=await s.runToResult(a);if(i.status!=="succeeded"||!i.message)throw new Error(`ship phase failed: ${Z(i)}`);let l=e.buildResults?.filesChanged.length??0,c=e.healIterations;return St({kind:"checkpoint",title:"ship \u2014 done",body:[`Files changed: ${l}`,`Heal iterations: ${c}`,`Idea: ${e.idea}`]}),i.message.content}import{existsSync as Ui,mkdirSync as xp,readFileSync as Tp,unlinkSync as Ep,writeFileSync as Pp}from"fs";import{dirname as Cp,join as Ap}from"path";function Xr(e){return Ap(jt(),e,"mint-state.json")}function ji(e,t){let n=Xr(e);xp(Cp(n),{recursive:!0}),Pp(n,JSON.stringify(t,null,2),"utf-8")}function Ip(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.currentPhase=="string"&&typeof t.idea=="string"&&typeof t.spec=="string"&&typeof t.healIterations=="number"&&Array.isArray(t.history)}function Bi(e){let t=Xr(e);if(!Ui(t))return null;try{let n=JSON.parse(Tp(t,"utf-8"));return Ip(n)?n:null}catch{return null}}function Zr(e){let t=Xr(e);if(Ui(t))try{Ep(t)}catch{}}var Mp=2,Hi=/^\s*--continue(?:\s+(?:approved|yes|y))?\s*$/i,Rp="To approve and run the rest of the pipeline, invoke /mint --continue approved (or call mint with {userApproved: true} \u2014 no idea field needed). The handler will reload the spec state from disk.";function ze(e,t,n){e.history.push({phase:t,output:n,timestamp:Date.now()})}function _p(e){if(typeof e=="string")return Hi.test(e)?{userApproved:!0}:{idea:e};if(typeof e=="object"&&e!==null){let t=e,n=typeof t.idea=="string"?t.idea:void 0;if(n!==void 0&&Hi.test(n))return{userApproved:!0};if("idea"in t||"resumeFrom"in t||t.userApproved===!0)return t}throw new Error("mint handler requires input.idea (string), input as string, or {userApproved: true} to resume")}async function Wi(e,t){if(!t.sessionId)throw new Error("runPhasesAfterSpec requires parentSession.sessionId");let n=t.sessionId;try{e.currentPhase="research",e.research=await $i(e.spec,n),ze(e,"research",e.research),e.currentPhase="plan",e.plan=await Oi(e.spec,e.research,n),ze(e,"plan",e.plan),e.currentPhase="parallelize",e.waveOrchestrationPlan=await Di(e.plan,t),ze(e,"parallelize",JSON.stringify(e.waveOrchestrationPlan||"skipped")),e.currentPhase="build",e.buildResults=await Li(e.plan,e.waveOrchestrationPlan,n),ze(e,"build",JSON.stringify(e.buildResults)),e.currentPhase="verify",e.verifyResults=await Nn(e.plan,e.buildResults,n),ze(e,"verify",JSON.stringify(e.verifyResults)),e.currentPhase="heal";let r=e.verifyResults.testsPassed&&e.verifyResults.lintPassed&&e.verifyResults.designReviewPassed;for(;!r&&e.healIterations<Mp;){let s=await Fi(e.plan,e.buildResults,e.verifyResults,e.healIterations,t);e.healIterations=s.newHealIterations,e.verifyResults=s.newVerifyResults,r=s.healed,ze(e,"heal",`Iterations: ${e.healIterations}, Success: ${r}`)}if(!r)return{paused:!0,phase:"heal-failed",reason:`Heal capped at ${e.healIterations} iterations; still have failures`,state:e,nextStep:"Heal loop exhausted. Inspect verifyResults, fix manually, then re-invoke /mint with a fresh idea \u2014 resume is not supported from heal-failed."};e.currentPhase="ship";let o=await Ni(e,n);return ze(e,"ship",o),{completed:!0,artifact:o,state:e}}catch(r){throw new Error(`mint failed at ${e.currentPhase}: ${r}`)}}function Ki(e,t){return("completed"in t||t.phase==="heal-failed")&&Zr(e),t}async function $p(e,t){let n=_p(e);if(!t?.sessionId)throw new Error("mint handler requires a parent session to fork subagents");let r=t.sessionId;if(n.userApproved){let a=n.resumeFrom??Bi(r);if(!a)throw new Error("mint: no paused spec found for this session to continue. Run /mint <idea> first, then /mint --continue approved.");let i=await Wi(a,t);return Ki(r,i)}if(!n.idea)throw new Error("mint: no idea provided. Run /mint <idea> to start, or /mint --continue approved to resume a paused spec.");Zr(r);let o={currentPhase:"spec",idea:n.idea,healIterations:0,history:[]};try{o.spec=await _i(n.idea,r),ze(o,"spec",o.spec)}catch(a){throw new Error(`mint failed at spec: ${a}`)}if(!n.autoApprove)return ji(r,o),{paused:!0,phase:"spec",spec:o.spec,state:o,nextStep:Rp};let s=await Wi(o,t);return Ki(r,s)}var Op={name:"mint",description:"Takes a feature idea or refactor scope and delivers a ship-ready, verified implementation end-to-end",handler:$p,argumentHint:"<idea> | --continue [approved]",whenToUse:"When the user wants a feature or refactor delivered end-to-end (spec \u2192 research \u2192 build \u2192 verify) in one ship-ready pass. After the spec phase pauses for approval, invoke `/mint --continue approved` (or call mint with `{userApproved: true}`) to resume \u2014 the handler reloads the spec state from disk.",flags:["--continue"]};Ie(Op);import{readdirSync as Lp,readFileSync as Fp}from"fs";import{join as Np}from"path";var Dp=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9-]*)(?![a-zA-Z0-9_-])/g;function Gi(e){return e.startsWith("--")?e:`--${e}`}function eo(e){let t=new Set;for(let n of e.matchAll(Dp))n[1]&&t.add(`--${n[1]}`);return Array.from(t).sort()}function qt(e){if(!e.startsWith(`---
1389
+ Create a ship-ready summary with next steps.`,i=await s.runToResult(a);if(i.status!=="succeeded"||!i.message)throw new Error(`ship phase failed: ${ee(i)}`);let l=e.buildResults?.filesChanged.length??0,c=e.healIterations;return It({kind:"checkpoint",title:"ship \u2014 done",body:[`Files changed: ${l}`,`Heal iterations: ${c}`,`Idea: ${e.idea}`]}),i.message.content}import{existsSync as Sa,mkdirSync as Mm,readFileSync as $m,unlinkSync as Om,writeFileSync as Dm}from"fs";import{dirname as Lm,join as Fm}from"path";function To(e){return Fm(Yt(),e,"mint-state.json")}function va(e,t){let n=To(e);Mm(Lm(n),{recursive:!0}),Dm(n,JSON.stringify(t,null,2),"utf-8")}function Nm(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.currentPhase=="string"&&typeof t.idea=="string"&&typeof t.spec=="string"&&typeof t.healIterations=="number"&&Array.isArray(t.history)}function xa(e){let t=To(e);if(!Sa(t))return null;try{let n=JSON.parse($m(t,"utf-8"));return Nm(n)?n:null}catch{return null}}function Eo(e){let t=To(e);if(Sa(t))try{Om(t)}catch{}}var Um=2,Ta=/^\s*(?:--continue(?:\s+(?:approved|yes|y))?|approved?|yes|y|lgtm)\s*$/i,jm='To approve and run the rest of the pipeline, say "approve", "yes", or "lgtm" \u2014 or invoke /mint --continue approved. The handler will reload the spec state from disk.';function $e(e,t,n){e.history.push({phase:t,output:n,timestamp:Date.now()})}var Ea=240;function Hm(e){return e.length<=Ea?e:e.slice(0,Ea)+"\u2026"}function Bm(e){if(typeof e=="string")return Ta.test(e)?{userApproved:!0}:{idea:e};if(typeof e=="object"&&e!==null){let t=e,n=typeof t.idea=="string"?t.idea:void 0;if(n!==void 0&&Ta.test(n))return{userApproved:!0};if("idea"in t||"resumeFrom"in t||t.userApproved===!0)return t}throw new Error("mint handler requires input.idea (string), input as string, or {userApproved: true} to resume")}async function Pa(e,t){if(!t.sessionId)throw new Error("runPhasesAfterSpec requires parentSession.sessionId");let n=t.sessionId;try{e.currentPhase="research",e.research=await ga(e.spec,n),$e(e,"research",e.research),e.currentPhase="plan",e.plan=await ha(e.spec,e.research,n),$e(e,"plan",e.plan),e.currentPhase="parallelize";let r=await ya(e.plan,t);if(r.kind==="plan")e.waveOrchestrationPlan=r.plan,$e(e,"parallelize",JSON.stringify(r.plan));else if(r.kind==="skipped")e.waveOrchestrationPlan=void 0,$e(e,"parallelize",`skipped: ${r.reason}`);else if(r.kind==="failed"){e.waveOrchestrationPlan=void 0;let a=Hm(r.error);$e(e,"parallelize",`failed: ${a}`),qe({event:"fallback.inline",parent_session_id:n,reason:"parallelize-dispatch-failed",error_message:a}),console.warn(`[mint] parallelize dispatch failed (single-lane fallback): ${a}`)}else{let a=r}e.currentPhase="build",e.buildResults=await ba(e.plan,e.waveOrchestrationPlan,n),$e(e,"build",JSON.stringify(e.buildResults)),e.currentPhase="verify",e.verifyResults=await tr(e.plan,e.buildResults,n),$e(e,"verify",JSON.stringify(e.verifyResults)),e.currentPhase="heal";let o=e.verifyResults.testsPassed&&e.verifyResults.lintPassed&&e.verifyResults.designReviewPassed;for(;!o&&e.healIterations<Um;){let a=await ka(e.plan,e.buildResults,e.verifyResults,e.healIterations,t);e.healIterations=a.newHealIterations,e.verifyResults=a.newVerifyResults,o=a.healed,$e(e,"heal",`Iterations: ${e.healIterations}, Success: ${o}`)}if(!o)return{paused:!0,phase:"heal-failed",reason:`Heal capped at ${e.healIterations} iterations; still have failures`,state:e,nextStep:"Heal loop exhausted. Inspect verifyResults, fix manually, then re-invoke /mint with a fresh idea \u2014 resume is not supported from heal-failed."};e.currentPhase="ship";let s=await wa(e,n);return $e(e,"ship",s),{completed:!0,artifact:s,state:e}}catch(r){throw new Error(`mint failed at ${e.currentPhase}: ${r}`)}}function Ca(e,t){return("completed"in t||t.phase==="heal-failed")&&Eo(e),t}async function Wm(e,t){let n=Bm(e);if(!t?.sessionId)throw new Error("mint handler requires a parent session to fork subagents");let r=t.sessionId;if(n.userApproved){let a=n.resumeFrom??xa(r);if(!a)throw new Error("mint: no paused spec found for this session to continue. Run /mint <idea> first, then /mint --continue approved.");let i=await Pa(a,t);return Ca(r,i)}if(!n.idea)throw new Error("mint: no idea provided. Run /mint <idea> to start, or /mint --continue approved to resume a paused spec.");Eo(r);let o={currentPhase:"spec",idea:n.idea,healIterations:0,history:[]};try{o.spec=await fa(n.idea,r),$e(o,"spec",o.spec)}catch(a){throw new Error(`mint failed at spec: ${a}`)}if(!n.autoApprove)return va(r,o),{paused:!0,phase:"spec",spec:o.spec,state:o,nextStep:jm};let s=await Pa(o,t);return Ca(r,s)}var Km={name:"mint",description:"Takes a feature idea or refactor scope and delivers a ship-ready, verified implementation end-to-end",handler:Wm,argumentHint:"<idea> | --continue [approved]",whenToUse:"When the user wants a feature or refactor delivered end-to-end (spec \u2192 research \u2192 build \u2192 verify) in one ship-ready pass. After the spec phase pauses for approval, invoke `/mint --continue approved` (or call mint with `{userApproved: true}`) to resume \u2014 the handler reloads the spec state from disk.",flags:["--continue"]};Me(Km);import{readdirSync as zm,readFileSync as Vm}from"fs";import{join as qm}from"path";var Gm=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9-]*)(?![a-zA-Z0-9_-])/g;function Aa(e){return e.startsWith("--")?e:`--${e}`}function Po(e){let t=new Set;for(let n of e.matchAll(Gm))n[1]&&t.add(`--${n[1]}`);return Array.from(t).sort()}function on(e){if(!e.startsWith(`---
1362
1390
  `))return{frontmatter:null,frontmatterFlags:null,body:e};let t=e.indexOf(`
1363
1391
  ---
1364
1392
  `,4);if(t===-1)return{frontmatter:null,frontmatterFlags:null,body:e};let n=e.slice(4,t),r=e.slice(t+5),o={},s=null,a=n.split(`
1365
- `);for(let i=0;i<a.length;i++){let l=a[i];if(!l||!l.trim()||l.trimStart().startsWith("#"))continue;if(l.startsWith("flags:")){let u=l.slice(6).trim();if(u.startsWith("[")){let p=u.match(/\[(.*?)\]/);if(p?.[1]){let m=p[1].split(",").map(f=>f.trim()).filter(f=>f.length>0);m.length>0&&(s=m.map(Gi).sort())}continue}if(u===""||u==="null"){let p=[];for(let m=i+1;m<a.length;m++){let f=a[m];if(!f||!f.match(/^\s+-\s/))break;let g=f.match(/^\s+-\s+(.+)/);g?.[1]&&p.push(g[1].trim())}p.length>0&&(s=p.map(Gi).sort());continue}}let c=l.match(/^([a-zA-Z][a-zA-Z0-9_-]*):\s*(.*)$/);if(c&&c[1]!==void 0&&c[2]!==void 0){let u=c[2].trim().replace(/^['"]|['"]$/g,"");u.length>0&&(o[c[1]]=u)}}return{frontmatter:o,frontmatterFlags:s,body:r}}function zi(e){let t=qt(e);return t.frontmatterFlags&&t.frontmatterFlags.length>0?t.frontmatterFlags:eo(t.body)}function Up(e){let t=qt(e);if(!t.frontmatter)return null;let n=t.frontmatter.name,r=t.frontmatter.description,o=t.body.trim();if(!n||!r||o.length===0)return null;let s=t.frontmatter["argument-hint"]??t.frontmatter.argumentHint,a=zi(e),i={name:n,description:r,body:o};return s&&s.length>0&&(i.argumentHint=s),a.length>0&&(i.flags=a),i}function jp(e){return async(t,n)=>{let r=typeof t=="string"&&t.length>0?t:"Run the skill.";return await(await new _({parentAbortSignal:n?.abortSignal}).forkSubagent({parent:{sessionId:n?.sessionId,getInputStreamRef:n?.getInputStreamRef?.bind(n),abortSignal:n?.abortSignal},config:{model:"sonnet",systemPrompt:e.body},idPrefix:`user-skill-${e.name}`})).runToResult(r)}}function Bp(e,t){try{return se(e),`${t}:${e}`}catch{return e}}function Un(e,t){let n;try{n=Lp(e,{withFileTypes:!0})}catch{return 0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let s;try{s=Fp(Np(e,o.name,"SKILL.md"),"utf-8")}catch{continue}let a=Up(s);if(!a)continue;let l={name:Bp(a.name,t),description:a.description,handler:jp(a),origin:t};a.argumentHint&&(l.argumentHint=a.argumentHint),a.flags&&a.flags.length>0&&(l.flags=a.flags),Ie(l),r++}return r}function to(){return Un(pn(),"user")}import{existsSync as Hp,readdirSync as Wp,readFileSync as Kp,statSync as Gp}from"fs";import{join as zp}from"path";function no(e){let t=[];function n(r,o=0){if(o>10||!Hp(r))return;let s;try{s=Wp(r)}catch{return}for(let a of s){if(a.startsWith("."))continue;let i=zp(r,a),l;try{l=Gp(i)}catch{continue}if(l.isFile()&&a==="SKILL.md"){let c=Vp(i);c.name&&t.push(c)}else l.isDirectory()&&n(i,o+1)}}return n(e),t}function Vp(e){try{let t=Kp(e,"utf-8");if(!t.startsWith(`---
1393
+ `);for(let i=0;i<a.length;i++){let l=a[i];if(!l||!l.trim()||l.trimStart().startsWith("#"))continue;if(l.startsWith("flags:")){let u=l.slice(6).trim();if(u.startsWith("[")){let p=u.match(/\[(.*?)\]/);if(p?.[1]){let m=p[1].split(",").map(f=>f.trim()).filter(f=>f.length>0);m.length>0&&(s=m.map(Aa).sort())}continue}if(u===""||u==="null"){let p=[];for(let m=i+1;m<a.length;m++){let f=a[m];if(!f||!f.match(/^\s+-\s/))break;let g=f.match(/^\s+-\s+(.+)/);g?.[1]&&p.push(g[1].trim())}p.length>0&&(s=p.map(Aa).sort());continue}}let c=l.match(/^([a-zA-Z][a-zA-Z0-9_-]*):\s*(.*)$/);if(c&&c[1]!==void 0&&c[2]!==void 0){let u=c[2].trim().replace(/^['"]|['"]$/g,"");u.length>0&&(o[c[1]]=u)}}return{frontmatter:o,frontmatterFlags:s,body:r}}function Ia(e){let t=on(e);return t.frontmatterFlags&&t.frontmatterFlags.length>0?t.frontmatterFlags:Po(t.body)}function Ym(e){let t=on(e);if(!t.frontmatter)return null;let n=t.frontmatter.name,r=t.frontmatter.description,o=t.body.trim();if(!n||!r||o.length===0)return null;let s=t.frontmatter["argument-hint"]??t.frontmatter.argumentHint,a=Ia(e),i={name:n,description:r,body:o};return s&&s.length>0&&(i.argumentHint=s),a.length>0&&(i.flags=a),i}function Jm(e){return async(t,n)=>{let r=typeof t=="string"&&t.length>0?t:"Run the skill.";return await(await new M({parentAbortSignal:n?.abortSignal}).forkSubagent({parent:{sessionId:n?.sessionId,getInputStreamRef:n?.getInputStreamRef?.bind(n),abortSignal:n?.abortSignal},config:{model:"sonnet",systemPrompt:e.body},idPrefix:`user-skill-${e.name}`})).runToResult(r)}}function Xm(e,t){try{return le(e),`${t}:${e}`}catch{return e}}function nr(e,t){let n;try{n=zm(e,{withFileTypes:!0})}catch{return 0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let s;try{s=Vm(qm(e,o.name,"SKILL.md"),"utf-8")}catch{continue}let a=Ym(s);if(!a)continue;let l={name:Xm(a.name,t),description:a.description,handler:Jm(a),origin:t};a.argumentHint&&(l.argumentHint=a.argumentHint),a.flags&&a.flags.length>0&&(l.flags=a.flags),Me(l),r++}return r}function Co(){return nr(An(),"user")}import{existsSync as Qm,readdirSync as Zm,readFileSync as ef,statSync as tf}from"fs";import{join as nf}from"path";function Ao(e){let t=[];function n(r,o=0){if(o>10||!Qm(r))return;let s;try{s=Zm(r)}catch{return}for(let a of s){if(a.startsWith("."))continue;let i=nf(r,a),l;try{l=tf(i)}catch{continue}if(l.isFile()&&a==="SKILL.md"){let c=rf(i);c.name&&t.push(c)}else l.isDirectory()&&n(i,o+1)}}return n(e),t}function rf(e){try{let t=ef(e,"utf-8");if(!t.startsWith(`---
1366
1394
  `))return{};let n=t.slice(4),r=n.indexOf(`
1367
1395
  ---`);if(r===-1)return{};let o=n.slice(0,r),s=n.slice(r+4).trim(),a={},i=o.split(`
1368
- `);for(let l of i){if(!l)continue;let c=l.indexOf(":");if(c===-1)continue;let u=l.slice(0,c).trim(),p=l.slice(c+1).trim();u==="name"?a.name=p.replace(/^["']|["']$/g,""):u==="description"?a.description=p.replace(/^["']|["']$/g,""):u==="argumentHint"&&(a.argumentHint=p.replace(/^["']|["']$/g,""))}return s.length>0&&(a.body=s),a}catch{return{}}}function Vi(e){let t=Jt(e);if(t.length===0)return"";let n=[];for(let r of t){let o=r.argumentHint?`${r.argumentHint}`:"",s=o?`- \`${r.name} ${o}\`: ${r.description}`:`- ${r.name}: ${r.description}`;n.push(s),r.whenToUse&&n.push(` When to use: ${r.whenToUse}`)}return["Available skills (invoke via the `skill` tool):",...n].join(`
1369
- `)}function Jt(e){let t=[],n=new Set;for(let o of st()){let s=se(o);t.push({name:o,description:s.description,source:s.origin==="user"?"user":s.origin==="project"?"project":"builtin",argumentHint:s.argumentHint,whenToUse:s.whenToUse}),n.add(o)}let r=e??[...ye(Nt()),...ye(),...ye(Dr())];for(let o of r){if(o.type!=="local")continue;let s=no(o.path);for(let a of s)!a.name||n.has(a.name)||(t.push({name:a.name,description:a.description??`Skill from plugin at ${o.path}`,source:"plugin"}),n.add(a.name))}return t}function Fn(e){let t=new Map,n=e??[...ye(Nt()),...ye(),...ye(Dr())];for(let r of n){if(r.type!=="local")continue;let o=no(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&t.set(s.name,s.body)}return t}var Yp=3,qp="claude-haiku-4-5-20251001",Jp=1024,Qp=[{value:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],Bn=class{client;authMode;initSessionId;promptStream;toolDispatcher;maxTokens;tools;systemPrefix;userSystem;tokenRefresher;currentModel;currentPermissionMode;messages=[];closed=!1;abortController=null;pendingAbortReason=null;closedPromise;closeResolve=null;lastUsage=null;refreshPromise=null;constructor(t){this.client=t.client,this.authMode=t.authMode,this.initSessionId=jn(),this.promptStream=t.promptStream,this.toolDispatcher=t.toolDispatcher,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.userSystem=t.userSystem,this.currentModel=t.model,this.currentPermissionMode=t.permissionMode??"default",this.tokenRefresher=t.tokenRefresher,this.closedPromise=new Promise(n=>{this.closeResolve=()=>n("__closed__")})}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.currentModel,permissionMode:this.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:[],apiKeySource:this.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.closed;){let r=await Promise.race([n.next(),this.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,a=new AbortController;if(this.abortController=a,this.pendingAbortReason!==null&&!a.signal.aborted&&(a.abort(this.pendingAbortReason),this.pendingAbortReason=null),a.signal.aborted)return;this.messages.push({role:"user",content:s.content});let i=this.composeSystem(),l=kn(this.authMode,this.initSessionId,jn()),c={client:this.client,messages:this.messages,system:i,tools:this.tools,toolDispatcher:this.toolDispatcher,model:this.currentModel,maxTokens:this.maxTokens,headers:l,signal:a.signal,ctx:{sessionId:this.initSessionId}};try{for await(let u of this.turnWithAuthRetry(c)){if(this.closed)return;u.type==="turn.completed"&&(this.lastUsage=u.usage),yield u}}catch(u){if(a.signal.aborted)return;yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abortController===a&&(this.abortController=null)}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}async*turnWithAuthRetry(t){let n=null;for await(let o of Ur(t)){if(this.closed)return;if(o.type==="error"&&this.isRetryableAuth(o.error)){n=o;break}yield o}if(!n)return;let r=null;try{if(this.refreshPromise)r=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{r=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{this.refreshPromise=null}if(!r){yield n;return}this.client=r,t.client=this.client,t.headers=kn(this.authMode,this.initSessionId,jn()),yield*Ur(t)}isRetryableAuth(t){return this.authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}composeSystem(){let t=this.systemPrefix,n=this.userSystem,r=[];return t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n}),r.length===0?null:bn()?Ss(r,wn()):r}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){t!==void 0&&t.length>0&&(this.currentModel=t)}async setPermissionMode(t){this.currentPermissionMode=t}async supportedCommands(){try{return Jt().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return Qp.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:this.lastUsage}}async mcpServerStatus(){return[]}async accountInfo(){return{subscriptionType:this.authMode==="oauth"?"claude-subscription":"api-key"}}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){let t=this.messages.length;if(this.closed)return{compacted:!1,reason:"session-closed",messagesBefore:t,messagesAfter:t};if(this.abortController!==null)return{compacted:!1,reason:"turn-in-flight",messagesBefore:t,messagesAfter:t};let n=Xp(),r=Is(this.messages,n);if(r<=0)return{compacted:!1,reason:"history-too-short",messagesBefore:t,messagesAfter:t};let o=this.messages.slice(0,r),s=Zp(),a=Ms(o,s,Jp),i=new AbortController;this.abortController=i,this.pendingAbortReason!==null&&!i.signal.aborted&&(i.abort(this.pendingAbortReason),this.pendingAbortReason=null);let l;try{if(i.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:t,messagesAfter:t};let p=kn(this.authMode,this.initSessionId,jn()),m=this.client,f=await Promise.resolve(m.messages.create(a,{headers:p,signal:i.signal}));l=await em(f)}catch(p){return i.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:t,messagesAfter:t}:{compacted:!1,reason:"summarization-failed: "+(p instanceof Error?p.message:String(p)),messagesBefore:t,messagesAfter:t}}finally{this.abortController===i&&(this.abortController=null)}if(l.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:t,messagesAfter:t};let c=_s(this.messages,r,l),u=Rs(this.messages,r,l);return this.messages.splice(0,this.messages.length,...u),{compacted:!0,messagesBefore:t,messagesAfter:this.messages.length,tokensSavedEstimate:c}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.()}};function Xp(){let e=process.env.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return Yp}function Zp(){let e=process.env.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?e:qp}async function em(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}function ro(e,t){return t?.allowedTools?t.allowedTools.includes(e)?{allowed:!0}:{allowed:!1,reason:`Tool "${e}" is not in the configured allowlist`}:{allowed:!0}}var tm=new Set(["agent","read_file","glob","grep","list_directory"]);function nm(e){return tm.has(e)}function rm(e,t){return e.reduce((n,r,o)=>{let s=t(r.name,r.input),a=n[n.length-1];return a&&s&&a.isConcurrencySafe?a.indices.push(o):n.push({isConcurrencySafe:s,indices:[o]}),n},[])}var Qt=class{handlers;schemas;hookRegistry;permissions;subagentExecutor;skillExecutor;classifier;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.classifier=t.concurrencyClassifier??nm}get toolDefs(){return this.schemas}async execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0};if(this.hookRegistry){let s={event:"PreToolUse",toolName:t.name,input:t.input};try{await this.hookRegistry.dispatch(s,t.signal)}catch(a){if(a instanceof he)return{content:`Tool "${t.name}" blocked by PreToolUse hook: ${a.message}`,isError:!0};throw a}}let n=ro(t.name,this.permissions);if(!n.allowed)return{content:n.reason??`Tool "${t.name}" is not permitted`,isError:!0};if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let s;try{s=await this.subagentExecutor.execute(t)}catch(a){s={content:`Agent tool error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}if(this.hookRegistry){let a={event:"PostToolUse",toolName:t.name,output:s.content};try{await this.hookRegistry.dispatch(a,t.signal)}catch{}}return s}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let s;try{s=await this.skillExecutor.execute(t)}catch(a){s={content:`Skill tool error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}if(this.hookRegistry){let a={event:"PostToolUse",toolName:t.name,output:s.content};try{await this.hookRegistry.dispatch(a,t.signal)}catch{}}return s}let r=this.handlers.get(t.name);if(!r)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let o;try{o=await r(t.input,t.signal)}catch(s){o={content:`Tool execution error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}if(this.hookRegistry){let s={event:"PostToolUse",toolName:t.name,output:o.content};try{await this.hookRegistry.dispatch(s,t.signal)}catch{}}return o}async executeBatch(t){if(t.length===0)return[];if(t.length===1)return[await this.execute(t[0])];let n=new Array(t.length),r=new Set;for(let a=0;a<t.length;a++){let i=t[a];if(i.signal.aborted){n[a]={content:"Tool call aborted",isError:!0},r.add(a);continue}if(this.hookRegistry){let c={event:"PreToolUse",toolName:i.name,input:i.input};try{await this.hookRegistry.dispatch(c,i.signal)}catch(u){if(u instanceof he){n[a]={content:`Tool "${i.name}" blocked by PreToolUse hook: ${u.message}`,isError:!0},r.add(a);continue}throw u}}let l=ro(i.name,this.permissions);l.allowed||(n[a]={content:l.reason??`Tool "${i.name}" is not permitted`,isError:!0},r.add(a))}let o=t.map((a,i)=>({call:a,originalIndex:i})).filter((a,i)=>!r.has(i));if(o.length===0)return n;let s=rm(o.map(a=>a.call),this.classifier);for(let a of s){if(t[0].signal.aborted){for(let i of a.indices){let l=o[i].originalIndex;n[l]={content:"Tool call aborted",isError:!0}}continue}if(a.isConcurrencySafe){let i=await Promise.allSettled(a.indices.map(async l=>{let{call:c,originalIndex:u}=o[l];return{result:await this.executeCore(c),originalIndex:u}}));for(let l of i)if(l.status==="fulfilled")n[l.value.originalIndex]=l.value.result;else{let c=l.reason instanceof Error?l.reason.message:String(l.reason),u=a.indices[i.indexOf(l)];n[o[u].originalIndex]={content:`Tool execution error: ${c}`,isError:!0}}}else for(let i of a.indices){let{call:l,originalIndex:c}=o[i];if(l.signal.aborted){n[c]={content:"Tool call aborted",isError:!0};continue}n[c]=await this.executeCore(l)}}return n}async executeCore(t){if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let o;try{o=await this.subagentExecutor.execute(t)}catch(s){o={content:`Agent tool error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}return this.firePostToolUse(t.name,o.content,t.signal),o}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let o;try{o=await this.skillExecutor.execute(t)}catch(s){o={content:`Skill tool error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}return this.firePostToolUse(t.name,o.content,t.signal),o}let n=this.handlers.get(t.name);if(!n)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let r;try{r=await n(t.input,t.signal)}catch(o){r={content:`Tool execution error: ${o instanceof Error?o.message:String(o)}`,isError:!0}}return this.firePostToolUse(t.name,r.content,t.signal),r}firePostToolUse(t,n,r){if(!this.hookRegistry)return;let o={event:"PostToolUse",toolName:t,output:n};this.hookRegistry.dispatch(o,r).catch(()=>{})}};import{spawn as om}from"child_process";function sm(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.command!="string")throw new Error('Input must have a "command" field of type string');let n=12e4;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number")throw new Error("timeout_ms must be a number");if(t.timeout_ms<0||t.timeout_ms>6e5)throw new Error("timeout_ms must be between 0 and 600000");n=t.timeout_ms}return{command:t.command,timeout_ms:n}}function im(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Yi=async(e,t)=>{let{command:n,timeout_ms:r}=sm(e);return t.aborted?{content:"Command aborted",isError:!0}:new Promise(o=>{let s=!1;function a(m){s||(s=!0,clearTimeout(l),t.removeEventListener("abort",p),o(m))}let i=om(n,{shell:!0,stdio:["ignore","pipe","pipe"]}),l=setTimeout(()=>{i.kill(),a({content:`Command timed out after ${r}ms`,isError:!0})},r),c="",u="";i.stdout.on("data",m=>{c+=m.toString()}),i.stderr.on("data",m=>{u+=m.toString()});let p=()=>{i.kill(),a({content:"Command aborted",isError:!0})};t.addEventListener("abort",p),i.on("close",()=>{let m=(c+u).trimEnd();m=im(m);let f=1e5;m.length>f&&(m=m.slice(0,f)+`
1370
- [output truncated \u2014 exceeded 100KB]`),a({content:m})}),i.on("error",m=>{a({content:`Failed to execute: ${m.message}`,isError:!0})})})};import{promises as am}from"fs";var qi=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let n=e,r=n.file_path,o=n.offset??1,s=n.limit??2e3;if(typeof r!="string")return{content:"Invalid input: file_path must be a string",isError:!0};if(typeof o!="number"||o<1)return{content:"Invalid input: offset must be a positive number",isError:!0};if(typeof s!="number"||s<1)return{content:"Invalid input: limit must be a positive number",isError:!0};try{let a=await am.readFile(r),i=Math.min(8192,a.length);for(let h=0;h<i;h++)if(a[h]===0)return{content:`File appears to be binary: ${r}`,isError:!0};let l=a.toString("utf-8");if(l.length===0)return{content:""};let c=l.split(`
1371
- `),u=Math.max(0,o-1),p=Math.min(c.length,u+s),m=c.slice(u,p),f=c.length;if(m.length===0)return{content:`... (offset ${o} is past end of file \u2014 file has ${f} lines)`};let g=String(f).length,y=m.map((h,k)=>{let S=u+k+1;return`${String(S).padStart(g," ")} ${h}`}).join(`
1372
- `);if(m.length<f){let h=u+1,k=u+m.length,S=k<f?` \u2014 pass offset=${k+1} to continue`:"";return{content:`${y}
1373
- ... (showing lines ${h}-${k} of ${f}${S})`}}return{content:y}}catch(a){if(a instanceof Error){let i=a;return i.code==="ENOENT"?{content:`File not found: ${r}`,isError:!0}:i.code==="EACCES"?{content:`Permission denied: ${r}`,isError:!0}:{content:`Error reading file: ${a.message}`,isError:!0}}return{content:"Unknown error reading file",isError:!0}}};import{writeFile as lm}from"fs/promises";import{mkdir as cm}from"fs/promises";import{dirname as um}from"path";function dm(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.content!="string")throw new Error('Input must have a "content" field of type string');return{file_path:t.file_path,content:t.content}}var Ji=async(e,t)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:n,content:r}=dm(e);try{let o=um(n);return await cm(o,{recursive:!0}),await lm(n,r,{signal:t}),{content:`Wrote ${Buffer.byteLength(r,"utf8")} bytes to ${n}`}}catch(o){return o instanceof Error?"code"in o&&o.code==="EACCES"?{content:`Permission denied: ${n}`,isError:!0}:{content:`Error writing file: ${o.message}`,isError:!0}:{content:"Unknown error writing file",isError:!0}}};import{readFile as pm,writeFile as mm}from"fs/promises";function fm(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.old_string!="string")throw new Error('Input must have an "old_string" field of type string');if(typeof t.new_string!="string")throw new Error('Input must have a "new_string" field of type string');let n=!1;if(t.replace_all!==void 0){if(typeof t.replace_all!="boolean")throw new Error("replace_all must be a boolean");n=t.replace_all}return{file_path:t.file_path,old_string:t.old_string,new_string:t.new_string,replace_all:n}}function gm(e,t){if(t.length===0)return 0;let n=0,r=0;for(;(r=e.indexOf(t,r))!==-1;)n++,r+=t.length;return n}function hm(e,t,n){let r=e.split(`
1396
+ `);for(let l of i){if(!l)continue;let c=l.indexOf(":");if(c===-1)continue;let u=l.slice(0,c).trim(),p=l.slice(c+1).trim();u==="name"?a.name=p.replace(/^["']|["']$/g,""):u==="description"?a.description=p.replace(/^["']|["']$/g,""):u==="argumentHint"&&(a.argumentHint=p.replace(/^["']|["']$/g,""))}return s.length>0&&(a.body=s),a}catch{return{}}}function _a(e){let t=sn(e);if(t.length===0)return"";let n=[];for(let r of t){let o=r.argumentHint?`${r.argumentHint}`:"",s=o?`- \`${r.name} ${o}\`: ${r.description}`:`- ${r.name}: ${r.description}`;n.push(s),r.whenToUse&&n.push(` When to use: ${r.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill dispatches one or more context-isolated subagents internally. Calling `skill` is a delegation primitive \u2014 it preserves the main session's context. Prefer a skill over inline investigation when the task shape matches.","",...n].join(`
1397
+ `)}function sn(e){let t=[],n=new Set;for(let o of pt()){let s=le(o);t.push({name:o,description:s.description,source:s.origin==="user"?"user":s.origin==="project"?"project":"builtin",argumentHint:s.argumentHint,whenToUse:s.whenToUse}),n.add(o)}let r=e??[...je(so()),...je(),...je(io())];for(let o of r){if(o.type!=="local")continue;let s=Ao(o.path);for(let a of s)!a.name||n.has(a.name)||(t.push({name:a.name,description:a.description??`Skill from plugin at ${o.path}`,source:"plugin"}),n.add(a.name))}return t}function er(e){let t=new Map,n=e??[...je(so()),...je(),...je(io())];for(let r of n){if(r.type!=="local")continue;let o=Ao(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&t.set(s.name,s.body)}return t}var Ra={opus:128e3,opus_1m:128e3,sonnet:64e3,sonnet_1m:64e3,haiku:64e3,"claude-opus-4-7":128e3,"claude-opus-4-6":128e3,"claude-sonnet-4-6":64e3,"claude-haiku-4-5-20251001":64e3},of=64e3;function Io(e){return Ra[e]??of}var rr={opus:2e5,opus_1m:1e6,sonnet:2e5,sonnet_1m:1e6,haiku:2e5},sf=2e5;function Oe(e){return rr[e]??sf}var af=3,lf="claude-haiku-4-5-20251001",cf=1024,uf=[{value:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],sr=class{client;authMode;initSessionId;promptStream;toolDispatcher;maxTokens;tools;systemPrefix;userSystem;tokenRefresher;currentModel;currentPermissionMode;messages=[];closed=!1;abortController=null;pendingAbortReason=null;closedPromise;closeResolve=null;lastUsage=null;refreshPromise=null;constructor(t){this.client=t.client,this.authMode=t.authMode,this.initSessionId=or(),this.promptStream=t.promptStream,this.toolDispatcher=t.toolDispatcher,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.userSystem=t.userSystem,this.currentModel=t.model,this.currentPermissionMode=t.permissionMode??"default",this.tokenRefresher=t.tokenRefresher,this.closedPromise=new Promise(n=>{this.closeResolve=()=>n("__closed__")})}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.currentModel,permissionMode:this.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:[],apiKeySource:this.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.closed;){let r=await Promise.race([n.next(),this.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,a=new AbortController;if(this.abortController=a,this.pendingAbortReason!==null&&!a.signal.aborted&&(a.abort(this.pendingAbortReason),this.pendingAbortReason=null),a.signal.aborted)return;this.messages.push({role:"user",content:s.content});let i=this.composeSystem(),l=Dn(this.authMode,this.initSessionId,or()),c={client:this.client,messages:this.messages,system:i,tools:this.tools,toolDispatcher:this.toolDispatcher,model:this.currentModel,maxTokens:this.maxTokens,headers:l,signal:a.signal,ctx:{sessionId:this.initSessionId}};try{for await(let u of this.turnWithAuthRetry(c)){if(this.closed)return;u.type==="turn.completed"&&(this.lastUsage=u.usage),yield u}}catch(u){if(a.signal.aborted)return;yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abortController===a&&(this.abortController=null)}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}async*turnWithAuthRetry(t){let n=null;for await(let o of uo(t)){if(this.closed)return;if(o.type==="error"&&this.isRetryableAuth(o.error)){n=o;break}yield o}if(!n)return;let r=null;try{if(this.refreshPromise)r=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{r=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{this.refreshPromise=null}if(!r){yield n;return}this.client=r,t.client=this.client,t.headers=Dn(this.authMode,this.initSessionId,or()),yield*uo(t)}isRetryableAuth(t){return this.authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}composeSystem(){let t=this.systemPrefix,n=this.userSystem,r=[];return t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n}),r.length===0?null:Ln()?oi(r,Fn()):r}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){t!==void 0&&t.length>0&&(this.currentModel=t)}async setPermissionMode(t){this.currentPermissionMode=t}async supportedCommands(){try{return sn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return uf.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=Oe(this.currentModel),r;if(t&&n>0){let o=(t.inputTokens??0)+(t.outputTokens??0)+(t.cachedInputTokens??0)+(t.cacheCreationTokens??0);r=Math.min(100,Math.max(0,o/n*100))}return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:this.lastUsage,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return[]}async accountInfo(){return{subscriptionType:this.authMode==="oauth"?"claude-subscription":"api-key"}}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){let t=this.messages.length;if(this.closed)return{compacted:!1,reason:"session-closed",messagesBefore:t,messagesAfter:t};if(this.abortController!==null)return{compacted:!1,reason:"turn-in-flight",messagesBefore:t,messagesAfter:t};let n=df(),r=pi(this.messages,n);if(r<=0)return{compacted:!1,reason:"history-too-short",messagesBefore:t,messagesAfter:t};let o=this.messages.slice(0,r),s=pf(),a=mi(o,s,cf),i=new AbortController;this.abortController=i,this.pendingAbortReason!==null&&!i.signal.aborted&&(i.abort(this.pendingAbortReason),this.pendingAbortReason=null);let l;try{if(i.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:t,messagesAfter:t};let p=Dn(this.authMode,this.initSessionId,or()),m=this.client,f=await Promise.resolve(m.messages.create(a,{headers:p,signal:i.signal}));l=await mf(f)}catch(p){return i.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:t,messagesAfter:t}:{compacted:!1,reason:"summarization-failed: "+(p instanceof Error?p.message:String(p)),messagesBefore:t,messagesAfter:t}}finally{this.abortController===i&&(this.abortController=null)}if(l.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:t,messagesAfter:t};let c=gi(this.messages,r,l),u=fi(this.messages,r,l);return this.messages.splice(0,this.messages.length,...u),{compacted:!0,messagesBefore:t,messagesAfter:this.messages.length,tokensSavedEstimate:c}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.()}};function df(){let e=process.env.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return af}function pf(){let e=process.env.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?e:lf}async function mf(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}function _o(e,t){return t?.allowedTools?t.allowedTools.includes(e)?{allowed:!0}:{allowed:!1,reason:`Tool "${e}" is not in the configured allowlist`}:{allowed:!0}}var ff=new Set(["agent","read_file","glob","grep","list_directory","memory_search"]);function gf(e){return ff.has(e)}function hf(e,t){return e.reduce((n,r,o)=>{let s=t(r.name,r.input),a=n[n.length-1];return a&&s&&a.isConcurrencySafe?a.indices.push(o):n.push({isConcurrencySafe:s,indices:[o]}),n},[])}var an=class{handlers;schemas;hookRegistry;permissions;subagentExecutor;skillExecutor;classifier;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.classifier=t.concurrencyClassifier??gf}get toolDefs(){return this.schemas}async execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0};if(this.hookRegistry){let s={event:"PreToolUse",toolName:t.name,input:t.input};try{await this.hookRegistry.dispatch(s,t.signal)}catch(a){if(a instanceof be)return{content:`Tool "${t.name}" blocked by PreToolUse hook: ${a.message}`,isError:!0};throw a}}let n=_o(t.name,this.permissions);if(!n.allowed)return{content:n.reason??`Tool "${t.name}" is not permitted`,isError:!0};if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let s;try{s=await this.subagentExecutor.execute(t)}catch(a){s={content:`Agent tool error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}if(this.hookRegistry){let a={event:"PostToolUse",toolName:t.name,output:s.content};try{await this.hookRegistry.dispatch(a,t.signal)}catch{}}return s}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let s;try{s=await this.skillExecutor.execute(t)}catch(a){s={content:`Skill tool error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}if(this.hookRegistry){let a={event:"PostToolUse",toolName:t.name,output:s.content};try{await this.hookRegistry.dispatch(a,t.signal)}catch{}}return s}let r=this.handlers.get(t.name);if(!r)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let o;try{o=await r(t.input,t.signal)}catch(s){o={content:`Tool execution error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}if(this.hookRegistry){let s={event:"PostToolUse",toolName:t.name,output:o.content};try{await this.hookRegistry.dispatch(s,t.signal)}catch{}}return o}async executeBatch(t){if(t.length===0)return[];if(t.length===1)return[await this.execute(t[0])];let n=new Array(t.length),r=new Set;for(let a=0;a<t.length;a++){let i=t[a];if(i.signal.aborted){n[a]={content:"Tool call aborted",isError:!0},r.add(a);continue}if(this.hookRegistry){let c={event:"PreToolUse",toolName:i.name,input:i.input};try{await this.hookRegistry.dispatch(c,i.signal)}catch(u){if(u instanceof be){n[a]={content:`Tool "${i.name}" blocked by PreToolUse hook: ${u.message}`,isError:!0},r.add(a);continue}throw u}}let l=_o(i.name,this.permissions);l.allowed||(n[a]={content:l.reason??`Tool "${i.name}" is not permitted`,isError:!0},r.add(a))}let o=t.map((a,i)=>({call:a,originalIndex:i})).filter((a,i)=>!r.has(i));if(o.length===0)return n;let s=hf(o.map(a=>a.call),this.classifier);for(let a of s){if(t[0].signal.aborted){for(let i of a.indices){let l=o[i].originalIndex;n[l]={content:"Tool call aborted",isError:!0}}continue}if(a.isConcurrencySafe){let i=await Promise.allSettled(a.indices.map(async l=>{let{call:c,originalIndex:u}=o[l];return{result:await this.executeCore(c),originalIndex:u}}));for(let l of i)if(l.status==="fulfilled")n[l.value.originalIndex]=l.value.result;else{let c=l.reason instanceof Error?l.reason.message:String(l.reason),u=a.indices[i.indexOf(l)];n[o[u].originalIndex]={content:`Tool execution error: ${c}`,isError:!0}}}else for(let i of a.indices){let{call:l,originalIndex:c}=o[i];if(l.signal.aborted){n[c]={content:"Tool call aborted",isError:!0};continue}n[c]=await this.executeCore(l)}}return n}async executeCore(t){if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let o;try{o=await this.subagentExecutor.execute(t)}catch(s){o={content:`Agent tool error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}return this.firePostToolUse(t.name,o.content,t.signal),o}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let o;try{o=await this.skillExecutor.execute(t)}catch(s){o={content:`Skill tool error: ${s instanceof Error?s.message:String(s)}`,isError:!0}}return this.firePostToolUse(t.name,o.content,t.signal),o}let n=this.handlers.get(t.name);if(!n)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let r;try{r=await n(t.input,t.signal)}catch(o){r={content:`Tool execution error: ${o instanceof Error?o.message:String(o)}`,isError:!0}}return this.firePostToolUse(t.name,r.content,t.signal),r}firePostToolUse(t,n,r){if(!this.hookRegistry)return;let o={event:"PostToolUse",toolName:t,output:n};this.hookRegistry.dispatch(o,r).catch(()=>{})}};import{spawn as yf}from"child_process";function bf(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.command!="string")throw new Error('Input must have a "command" field of type string');let n=12e4;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number")throw new Error("timeout_ms must be a number");if(t.timeout_ms<0||t.timeout_ms>6e5)throw new Error("timeout_ms must be between 0 and 600000");n=t.timeout_ms}return{command:t.command,timeout_ms:n}}function kf(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Ma=async(e,t)=>{let{command:n,timeout_ms:r}=bf(e);return t.aborted?{content:"Command aborted",isError:!0}:new Promise(o=>{let s=!1;function a(m){s||(s=!0,clearTimeout(l),t.removeEventListener("abort",p),o(m))}let i=yf(n,{shell:!0,stdio:["ignore","pipe","pipe"]}),l=setTimeout(()=>{i.kill(),a({content:`Command timed out after ${r}ms`,isError:!0})},r),c="",u="";i.stdout.on("data",m=>{c+=m.toString()}),i.stderr.on("data",m=>{u+=m.toString()});let p=()=>{i.kill(),a({content:"Command aborted",isError:!0})};t.addEventListener("abort",p),i.on("close",()=>{let m=(c+u).trimEnd();m=kf(m);let f=1e5;m.length>f&&(m=m.slice(0,f)+`
1398
+ [output truncated \u2014 exceeded 100KB]`),a({content:m})}),i.on("error",m=>{a({content:`Failed to execute: ${m.message}`,isError:!0})})})};import{promises as wf}from"fs";var $a=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let n=e,r=n.file_path,o=n.offset??1,s=n.limit??2e3;if(typeof r!="string")return{content:"Invalid input: file_path must be a string",isError:!0};if(typeof o!="number"||o<1)return{content:"Invalid input: offset must be a positive number",isError:!0};if(typeof s!="number"||s<1)return{content:"Invalid input: limit must be a positive number",isError:!0};try{let a=await wf.readFile(r),i=Math.min(8192,a.length);for(let h=0;h<i;h++)if(a[h]===0)return{content:`File appears to be binary: ${r}`,isError:!0};let l=a.toString("utf-8");if(l.length===0)return{content:""};let c=l.split(`
1399
+ `),u=Math.max(0,o-1),p=Math.min(c.length,u+s),m=c.slice(u,p),f=c.length;if(m.length===0)return{content:`... (offset ${o} is past end of file \u2014 file has ${f} lines)`};let g=String(f).length,y=m.map((h,k)=>{let v=u+k+1;return`${String(v).padStart(g," ")} ${h}`}).join(`
1400
+ `);if(m.length<f){let h=u+1,k=u+m.length,v=k<f?` \u2014 pass offset=${k+1} to continue`:"";return{content:`${y}
1401
+ ... (showing lines ${h}-${k} of ${f}${v})`}}return{content:y}}catch(a){if(a instanceof Error){let i=a;return i.code==="ENOENT"?{content:`File not found: ${r}`,isError:!0}:i.code==="EACCES"?{content:`Permission denied: ${r}`,isError:!0}:{content:`Error reading file: ${a.message}`,isError:!0}}return{content:"Unknown error reading file",isError:!0}}};import{writeFile as Sf}from"fs/promises";import{mkdir as vf}from"fs/promises";import{dirname as xf}from"path";function Tf(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.content!="string")throw new Error('Input must have a "content" field of type string');return{file_path:t.file_path,content:t.content}}var Oa=async(e,t)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:n,content:r}=Tf(e);try{let o=xf(n);return await vf(o,{recursive:!0}),await Sf(n,r,{signal:t}),{content:`Wrote ${Buffer.byteLength(r,"utf8")} bytes to ${n}`}}catch(o){return o instanceof Error?"code"in o&&o.code==="EACCES"?{content:`Permission denied: ${n}`,isError:!0}:{content:`Error writing file: ${o.message}`,isError:!0}:{content:"Unknown error writing file",isError:!0}}};import{readFile as Ef,writeFile as Pf}from"fs/promises";function Cf(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.old_string!="string")throw new Error('Input must have an "old_string" field of type string');if(typeof t.new_string!="string")throw new Error('Input must have a "new_string" field of type string');let n=!1;if(t.replace_all!==void 0){if(typeof t.replace_all!="boolean")throw new Error("replace_all must be a boolean");n=t.replace_all}return{file_path:t.file_path,old_string:t.old_string,new_string:t.new_string,replace_all:n}}function Af(e,t){if(t.length===0)return 0;let n=0,r=0;for(;(r=e.indexOf(t,r))!==-1;)n++,r+=t.length;return n}function If(e,t,n){let r=e.split(`
1374
1402
  `),o=0,s=0;for(let c=0;c<r.length;c++){let u=r[c]?.length??0,p=o+u+1;if(o+u>=n+t.length){s=c;break}o=p}let a=Math.max(0,s-2),i=Math.min(r.length,s+3);return`...${r.slice(a,i).join(`
1375
- `)}...`}var Qi=async(e,t)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:n,old_string:r,new_string:o,replace_all:s}=fm(e);try{let a=await pm(n,"utf-8"),i=gm(a,r);if(i===0)return{content:`old_string not found in ${n}`,isError:!0};if(i>1&&!s)return{content:`old_string matches ${i} locations in ${n}. Use replace_all: true or provide more context.`,isError:!0};let l,c;s?(l=a.split(r).join(o),c=a.indexOf(r)):(c=a.indexOf(r),l=a.slice(0,c)+o+a.slice(c+r.length)),await mm(n,l,"utf-8");let u=hm(a,r,c);return{content:`${i===1?`Replaced 1 occurrence in ${n}`:`Replaced ${i} occurrences in ${n}`}
1403
+ `)}...`}var Da=async(e,t)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:n,old_string:r,new_string:o,replace_all:s}=Cf(e);try{let a=await Ef(n,"utf-8"),i=Af(a,r);if(i===0)return{content:`old_string not found in ${n}`,isError:!0};if(i>1&&!s)return{content:`old_string matches ${i} locations in ${n}. Use replace_all: true or provide more context.`,isError:!0};let l,c;s?(l=a.split(r).join(o),c=a.indexOf(r)):(c=a.indexOf(r),l=a.slice(0,c)+o+a.slice(c+r.length)),await Pf(n,l,"utf-8");let u=If(a,r,c);return{content:`${i===1?`Replaced 1 occurrence in ${n}`:`Replaced ${i} occurrences in ${n}`}
1376
1404
 
1377
- ${u}`}}catch(a){return{content:`Error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}};import{promises as Zi}from"fs";import ym from"path";function km(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");if(r.includes("**")){let s=r.split("**"),a=0;for(let i=0;i<s.length;i++){let l=s[i]??"",c=Xi(l);if(i===0){let u=n.match(new RegExp(`^${c}`));if(!u)return!1;a=u[0].length}else if(i===s.length-1){let u=new RegExp(`${c}$`);if(!n.slice(a).match(u))return!1}else{let u=new RegExp(c),p=n.slice(a).match(u);if(!p)return!1;let m=p.index??0;a+=m+p[0].length}}return!0}return new RegExp(`^${Xi(r)}$`).test(n)}function Xi(e){return e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")}async function bm(e,t){let n=[];async function o(s,a){if(n.length>=500)return!0;try{let i=await Zi.readdir(s,{withFileTypes:!0});for(let l of i){if(n.length>=500)return!0;let c=ym.join(s,l.name),u=a?`${a}/${l.name}`:l.name;if(km(u,t)&&n.push(u),l.isDirectory()&&await o(c,u))return!0}}catch{}return!1}return await o(e,""),n}var ea=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let n=e,r=n.pattern,o=n.path??process.cwd();if(typeof r!="string")return{content:"Invalid input: pattern must be a string",isError:!0};if(r.trim()==="")return{content:"Invalid input: pattern cannot be empty",isError:!0};if(typeof o!="string")return{content:"Invalid input: path must be a string",isError:!0};try{if(!(await Zi.stat(o)).isDirectory())return{content:`Invalid input: path is not a directory: ${o}`,isError:!0};let a=await bm(o,r);if(a.length===0)return{content:`No files matched pattern '${r}' in ${o}`};let i=a.join(`
1405
+ ${u}`}}catch(a){return{content:`Error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}};import{promises as Fa}from"fs";import _f from"path";function Rf(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");if(r.includes("**")){let s=r.split("**"),a=0;for(let i=0;i<s.length;i++){let l=s[i]??"",c=La(l);if(i===0){let u=n.match(new RegExp(`^${c}`));if(!u)return!1;a=u[0].length}else if(i===s.length-1){let u=new RegExp(`${c}$`);if(!n.slice(a).match(u))return!1}else{let u=new RegExp(c),p=n.slice(a).match(u);if(!p)return!1;let m=p.index??0;a+=m+p[0].length}}return!0}return new RegExp(`^${La(r)}$`).test(n)}function La(e){return e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")}async function Mf(e,t){let n=[];async function o(s,a){if(n.length>=500)return!0;try{let i=await Fa.readdir(s,{withFileTypes:!0});for(let l of i){if(n.length>=500)return!0;let c=_f.join(s,l.name),u=a?`${a}/${l.name}`:l.name;if(Rf(u,t)&&n.push(u),l.isDirectory()&&await o(c,u))return!0}}catch{}return!1}return await o(e,""),n}var Na=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let n=e,r=n.pattern,o=n.path??process.cwd();if(typeof r!="string")return{content:"Invalid input: pattern must be a string",isError:!0};if(r.trim()==="")return{content:"Invalid input: pattern cannot be empty",isError:!0};if(typeof o!="string")return{content:"Invalid input: path must be a string",isError:!0};try{if(!(await Fa.stat(o)).isDirectory())return{content:`Invalid input: path is not a directory: ${o}`,isError:!0};let a=await Mf(o,r);if(a.length===0)return{content:`No files matched pattern '${r}' in ${o}`};let i=a.join(`
1378
1406
  `);return a.length>=500&&(i+=`
1379
- [results capped at 500 entries]`),{content:i}}catch(s){return s instanceof Error?"code"in s&&s.code==="ENOENT"?{content:`Path not found: ${o}`,isError:!0}:"code"in s&&s.code==="EACCES"?{content:`Permission denied: ${o}`,isError:!0}:{content:`Error scanning directory: ${s.message}`,isError:!0}:{content:"Unknown error scanning directory",isError:!0}}};import{spawn as wm}from"child_process";function Sm(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.pattern!="string")throw new Error('Input must have a "pattern" field of type string');let n=typeof t.path=="string"?t.path:process.cwd(),r;if(t.include!==void 0){if(typeof t.include!="string")throw new Error("include must be a string");r=t.include}return{pattern:t.pattern,path:n,include:r}}function vm(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var ta=async(e,t)=>{let{pattern:n,path:r,include:o}=Sm(e);return t.aborted?{content:"Search aborted",isError:!0}:new Promise(s=>{let a=!1;function i(f){a||(a=!0,t.removeEventListener("abort",m),s(f))}let l=["-rn"];o&&l.push(`--include=${o}`),l.push(n,r);let c=wm("grep",l),u="",p="";c.stdout.on("data",f=>{u+=f.toString()}),c.stderr.on("data",f=>{p+=f.toString()});let m=()=>{c.kill(),i({content:"Search aborted",isError:!0})};t.addEventListener("abort",m),c.on("close",f=>{if(f===1){i({content:`No matches found for '${n}' in ${r}`});return}if(f===2){i({content:`grep error: ${p.trim()}`,isError:!0});return}let g=u.trimEnd();g=vm(g);let y=1e5;g.length>y&&(g=g.slice(0,y)+`
1380
- [output truncated]`),i({content:g})}),c.on("error",f=>{i({content:`Failed to execute grep: ${f.message}`,isError:!0})})})};import{promises as xm}from"fs";var na=async(e,t)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let r=e.path;if(typeof r!="string")throw new Error("Invalid input: path must be a string");try{let o=await xm.readdir(r,{withFileTypes:!0}),s=o.filter(c=>c.isDirectory()).map(c=>`${c.name}/`),a=o.filter(c=>!c.isDirectory()).map(c=>c.name);s.sort(),a.sort();let i=[...s,...a];return i.length===0?{content:"(empty directory)"}:{content:i.join(`
1381
- `)}}catch(o){if(o instanceof Error){let s=o;return s.code==="ENOENT"?{content:`Directory not found: ${r}`,isError:!0}:s.code==="ENOTDIR"?{content:`Not a directory: ${r}`,isError:!0}:s.code==="EACCES"?{content:`Permission denied: ${r}`,isError:!0}:{content:`Error listing directory: ${o.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};function ra(){return new Map([["bash",Yi],["read_file",qi],["write_file",Ji],["edit_file",Qi],["glob",ea],["grep",ta],["list_directory",na]])}var oa=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1407
+ [results capped at 500 entries]`),{content:i}}catch(s){return s instanceof Error?"code"in s&&s.code==="ENOENT"?{content:`Path not found: ${o}`,isError:!0}:"code"in s&&s.code==="EACCES"?{content:`Permission denied: ${o}`,isError:!0}:{content:`Error scanning directory: ${s.message}`,isError:!0}:{content:"Unknown error scanning directory",isError:!0}}};import{spawn as $f}from"child_process";function Of(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.pattern!="string")throw new Error('Input must have a "pattern" field of type string');let n=typeof t.path=="string"?t.path:process.cwd(),r;if(t.include!==void 0){if(typeof t.include!="string")throw new Error("include must be a string");r=t.include}return{pattern:t.pattern,path:n,include:r}}function Df(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Ua=async(e,t)=>{let{pattern:n,path:r,include:o}=Of(e);return t.aborted?{content:"Search aborted",isError:!0}:new Promise(s=>{let a=!1;function i(f){a||(a=!0,t.removeEventListener("abort",m),s(f))}let l=["-rn"];o&&l.push(`--include=${o}`),l.push(n,r);let c=$f("grep",l),u="",p="";c.stdout.on("data",f=>{u+=f.toString()}),c.stderr.on("data",f=>{p+=f.toString()});let m=()=>{c.kill(),i({content:"Search aborted",isError:!0})};t.addEventListener("abort",m),c.on("close",f=>{if(f===1){i({content:`No matches found for '${n}' in ${r}`});return}if(f===2){i({content:`grep error: ${p.trim()}`,isError:!0});return}let g=u.trimEnd();g=Df(g);let y=1e5;g.length>y&&(g=g.slice(0,y)+`
1408
+ [output truncated]`),i({content:g})}),c.on("error",f=>{i({content:`Failed to execute grep: ${f.message}`,isError:!0})})})};import{promises as Lf}from"fs";var ja=async(e,t)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let r=e.path;if(typeof r!="string")throw new Error("Invalid input: path must be a string");try{let o=await Lf.readdir(r,{withFileTypes:!0}),s=o.filter(c=>c.isDirectory()).map(c=>`${c.name}/`),a=o.filter(c=>!c.isDirectory()).map(c=>c.name);s.sort(),a.sort();let i=[...s,...a];return i.length===0?{content:"(empty directory)"}:{content:i.join(`
1409
+ `)}}catch(o){if(o instanceof Error){let s=o;return s.code==="ENOENT"?{content:`Directory not found: ${r}`,isError:!0}:s.code==="ENOTDIR"?{content:`Not a directory: ${r}`,isError:!0}:s.code==="EACCES"?{content:`Permission denied: ${r}`,isError:!0}:{content:`Error listing directory: ${o.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};function Ha(){return new Map([["bash",Ma],["read_file",$a],["write_file",Oa],["edit_file",Da],["glob",Na],["grep",Ua],["list_directory",ja]])}var Ba=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1382
1410
 
1383
1411
  - Use read_file before editing to verify the exact content you want to change.
1384
1412
  - Prefer edit_file over write_file for modifying existing files \u2014 write_file is for new files or complete rewrites.
@@ -1387,28 +1415,121 @@ ${u}`}}catch(a){return{content:`Error: ${a instanceof Error?a.message:String(a)}
1387
1415
  - Use glob and grep to discover files before reading individual files.
1388
1416
  - When bash output is very long, it may be truncated. If you need the full output, redirect to a file and read it.
1389
1417
  - Use absolute paths for file operations.
1390
-
1391
- When you see a \`<command-name>\` tag in the current conversation turn, the skill has ALREADY been loaded by the user typing a slash command. Do NOT re-invoke the skill tool to dispatch the same skill again. Instead, treat the \`<command-message>\` as the skill name and \`<command-args>\` as its arguments, then follow the instructions in the body block immediately following the tag.`;var sa={opus:128e3,opus_1m:128e3,sonnet:64e3,sonnet_1m:64e3,haiku:64e3,"claude-opus-4-7":128e3,"claude-opus-4-6":128e3,"claude-sonnet-4-6":64e3,"claude-haiku-4-5-20251001":64e3},Tm=64e3;function oo(e){return sa[e]??Tm}var aa="anthropic-direct",Em="claude-sonnet-4-5-20250929",la=null;var we=class{name=aa;tools;providerFactory;skillExecutor;constructor(t={}){let n=[...Rn];t.subagentExecutor&&n.push(vi),t.skillExecutor&&n.push(xi),this.tools=t.tools??new Qt({handlers:ra(),schemas:n,hookRegistry:t.hookRegistry,permissions:t.permissions,subagentExecutor:t.subagentExecutor,skillExecutor:t.skillExecutor}),this.skillExecutor=t.skillExecutor,t.clientFactory&&(this.providerFactory=t.clientFactory)}query(t){let n=t.config,r=n.apiKey&&n.apiKey.length>0?n.apiKey:process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_CODE_OAUTH_TOKEN||"";if(!r||r.length===0)throw new Error(`${aa} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let o=ds(r),s=Nr(r,o),a=this.providerFactory??la,i=a?a(s):new ia(s),l=ps(o),c=Pm(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?Gt(n.model)??n.model:Em,p=Cm(n,u),m=this.tools instanceof Qt?[...this.tools.toolDefs]:[...Rn],f=[...ye(Nt()),...ye()],g=n.plugins??[],y=[...f,...g],h=this.skillExecutor?Vi(y):"",k=n.cwd||process.cwd(),S=[oa];S.push(`# Environment
1392
- - Working directory: ${k}`),h.length>0&&S.push(h),c&&S.push(c);let b=S.join(`
1393
-
1394
- `),A;if(o==="oauth"){let N=this.providerFactory??la;A=async()=>{let $=await ks();if(!$)return null;let v=Nr($,"oauth");return N?N(v):new ia(v)}}return new Bn({client:i,authMode:o,promptStream:t.prompt,toolDispatcher:this.tools,model:u,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:m,userSystem:b,systemPrefix:l,tokenRefresher:A})}};function Pm(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}function Cm(e,t){let n=e.maxOutputTokens;return typeof n=="number"&&Number.isFinite(n)&&n>0?Math.floor(n):oo(t)}var ca=new we;import{Codex as da}from"@openai/codex-sdk";import{mkdtempSync as Am,rmSync as Im,writeFileSync as Mm}from"node:fs";import{tmpdir as Rm}from"node:os";import{join as ua}from"node:path";var Xt="openai-codex",_m=[{value:"gpt-5.4",displayName:"GPT-5.4",description:"Codex default"},{value:"gpt-5.4-mini",displayName:"GPT-5.4 mini",description:"Faster, cheaper Codex variant"}];function $m(e){let t=[];if(e.continue&&t.push("continue"),e.resumeSessionAt!==void 0&&t.push("resumeSessionAt"),e.forkSession&&t.push("forkSession"),e.persistSession===!1&&t.push("persistSession=false"),e.enableFileCheckpointing&&t.push("enableFileCheckpointing"),e.thinking!==void 0&&t.push("thinking"),e.maxBudgetUsd!==void 0&&t.push("maxBudgetUsd"),e.taskBudget!==void 0&&t.push("taskBudget"),e.plugins&&e.plugins.length>0&&t.push("plugins"),e.agents&&t.push("agents"),e.agent!==void 0&&t.push("agent"),e.onElicitation&&t.push("onElicitation"),e.hooks&&t.push("hooks"),e.canUseTool&&t.push("canUseTool"),e.mcpServers&&t.push("mcpServers"),e.includeHookEvents&&t.push("includeHookEvents"),e.agentProgressSummaries&&t.push("agentProgressSummaries"),e.includePartialMessages&&t.push("includePartialMessages"),t.length>0)throw new Bt(Xt,t.join(", "),`${Xt} provider does not support AgentConfig fields: ${t.join(", ")}`)}function pa(e){return e==="plan"?{sandboxMode:"read-only",approvalPolicy:"untrusted"}:{sandboxMode:"workspace-write",approvalPolicy:"never"}}function Om(e){if(e)switch(e){case"minimal":case"low":case"medium":case"high":case"xhigh":return e;case"max":return"xhigh";default:return}}function Dm(e){let t=e.systemPrompt;if(t!==void 0){if(typeof t=="string")return t.length>0?t:void 0;if(typeof t=="object"&&t!==null&&"append"in t){let n=t.append;return n&&n.length>0?n:void 0}}}function Lm(e){let t=Am(ua(Rm(),"afk-codex-instr-")),n=ua(t,"instructions.md");return Mm(n,e,"utf-8"),{path:n,dispose:()=>{try{Im(t,{recursive:!0,force:!0})}catch{}}}}function Fm(e){if(e.apiKey)return e.apiKey;let t=process.env.OPENAI_API_KEY??process.env.CODEX_API_KEY;return t&&t.length>0?t:void 0}function*Nm(e,t,n,r){if(e.type!=="thread.started"&&e.type!=="turn.started"){if(e.type==="turn.completed"){let o=e.usage;yield{type:"turn.completed",usage:{inputTokens:o.input_tokens,outputTokens:o.output_tokens,cachedInputTokens:o.cached_input_tokens,totalTokens:o.input_tokens+o.output_tokens+o.cached_input_tokens,resultSubtype:"success",isError:!1,raw:{input_tokens:o.input_tokens,output_tokens:o.output_tokens,cached_input_tokens:o.cached_input_tokens}},...t!==void 0?{sessionId:t}:{}};return}if(e.type==="turn.failed"){yield{type:"error",error:new Error(e.error.message)};return}if(e.type==="error"){yield{type:"error",error:new Error(e.message)};return}(e.type==="item.started"||e.type==="item.updated"||e.type==="item.completed")&&(yield*Um(e.item,e.type==="item.completed",t,n,r))}}function*Um(e,t,n,r,o){if(e.type==="agent_message"){let s=r.get(e.id)??"";if(e.text!==s){let a=e.text.startsWith(s)?e.text.slice(s.length):e.text;r.set(e.id,e.text),a.length>0&&(yield{type:"delta.text",text:a,...n!==void 0?{sessionId:n}:{}})}t&&(yield{type:"assistant.message",text:e.text,...n!==void 0?{sessionId:n}:{}},r.delete(e.id));return}if(e.type==="reasoning"){let s=o.get(e.id)??"";if(e.text!==s){let a=e.text.startsWith(s)?e.text.slice(s.length):e.text;o.set(e.id,e.text),a.length>0&&(yield{type:"delta.reasoning",text:a,...n!==void 0?{sessionId:n}:{}})}t&&o.delete(e.id);return}if(e.type==="command_execution"){if(t){let s=e.status==="failed",a=e.exit_code!==void 0?` (exit ${e.exit_code})`:"",i=`$ ${e.command}${a}
1418
+ - Prefer \`agent\` (and \`skill\`) for multi-file investigation, verification, parallel hypotheses, and any work that would otherwise consume large amounts of inline context. The main session is the coordinator; subagents are the investigators.
1419
+
1420
+ When you see a \`<command-name>\` tag in the current conversation turn, the skill has ALREADY been loaded by the user typing a slash command. Do NOT re-invoke the skill tool to dispatch the same skill again. Instead, treat the \`<command-message>\` as the skill name and \`<command-args>\` as its arguments, then follow the instructions in the body block immediately following the tag.`;import Ff from"better-sqlite3";import{existsSync as ln,mkdirSync as Wa,readFileSync as ir,writeFileSync as Ka,readdirSync as Nf,appendFileSync as Uf,unlinkSync as Ga,copyFileSync as jf}from"fs";import{join as ve,basename as za,resolve as ar,relative as Hf}from"path";var Va="HOT.md",Bf="HOT.md.bak",qa="memory.db",Ya="memory-wal.jsonl",lr="procedures",Wf=5250,cn=1,Kf=`
1421
+ CREATE TABLE IF NOT EXISTS sessions (
1422
+ session_id TEXT PRIMARY KEY,
1423
+ surface TEXT NOT NULL,
1424
+ started_at TEXT NOT NULL,
1425
+ ended_at TEXT,
1426
+ summary TEXT,
1427
+ tools_used TEXT NOT NULL DEFAULT '[]',
1428
+ outcome TEXT,
1429
+ token_count INTEGER,
1430
+ cost_usd REAL
1431
+ );
1432
+
1433
+ CREATE TABLE IF NOT EXISTS facts (
1434
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1435
+ session_id TEXT,
1436
+ created_at TEXT NOT NULL,
1437
+ category TEXT NOT NULL CHECK(category IN ('preference', 'convention', 'decision', 'learning')),
1438
+ content TEXT NOT NULL,
1439
+ source_surface TEXT NOT NULL DEFAULT 'cli',
1440
+ superseded_by INTEGER REFERENCES facts(id),
1441
+ confidence REAL NOT NULL DEFAULT 1.0,
1442
+ access_count INTEGER NOT NULL DEFAULT 0,
1443
+ last_accessed TEXT
1444
+ );
1445
+
1446
+ CREATE VIRTUAL TABLE IF NOT EXISTS facts_fts USING fts5(
1447
+ content,
1448
+ category,
1449
+ content=facts,
1450
+ content_rowid=id,
1451
+ tokenize='porter'
1452
+ );
1453
+
1454
+ CREATE TRIGGER IF NOT EXISTS facts_ai AFTER INSERT ON facts BEGIN
1455
+ INSERT INTO facts_fts(rowid, content, category) VALUES (new.id, new.content, new.category);
1456
+ END;
1457
+
1458
+ CREATE TRIGGER IF NOT EXISTS facts_ad AFTER DELETE ON facts BEGIN
1459
+ INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', old.id, old.content, old.category);
1460
+ END;
1461
+
1462
+ CREATE TRIGGER IF NOT EXISTS facts_au AFTER UPDATE ON facts BEGIN
1463
+ INSERT INTO facts_fts(facts_fts, rowid, content, category) VALUES ('delete', old.id, old.content, old.category);
1464
+ INSERT INTO facts_fts(rowid, content, category) VALUES (new.id, new.content, new.category);
1465
+ END;
1466
+
1467
+ CREATE INDEX IF NOT EXISTS idx_sessions_started_at ON sessions(started_at DESC);
1468
+ CREATE INDEX IF NOT EXISTS idx_facts_session_id ON facts(session_id);
1469
+ `;function Za(e){return Math.ceil(e.length/3.5)}var Ie=class{dir;db;constructor(t){this.dir=t??Rn(),Wa(this.dir,{recursive:!0}),Wa(ve(this.dir,lr),{recursive:!0}),this.db=new Ff(ve(this.dir,qa)),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(Kf),this.db.pragma(`user_version = ${cn}`);else if(n!==cn)throw n<cn?(this.db.close(),new Error(`memory.db schema version ${n} is older than the current version ${cn}. Delete ${ve(this.dir,qa)} to start fresh (your stored facts will be lost).`)):(this.db.close(),new Error(`memory.db schema version ${n} is newer than this build supports (${cn}). Upgrade agent-afk to a version that understands schema v${n}.`));this.replayWAL()}loadHot(){let t=ve(this.dir,Va);if(!ln(t))return null;try{return ir(t,"utf-8")}catch{return null}}saveHot(t){if(t.length>Wf)throw new Error(`HOT.md exceeds ~1,500 token cap (${Za(t)} estimated tokens, ${t.length} chars). Trim before saving.`);let n=ve(this.dir,Va);ln(n)&&jf(n,ve(this.dir,Bf)),Ka(n,t,"utf-8")}storeFact(t){let n=new Date().toISOString();this.appendWAL({type:"fact",timestamp:n,data:{...t,created_at:n}});let o=this.db.prepare(`
1470
+ INSERT INTO facts (session_id, created_at, category, content, source_surface)
1471
+ VALUES (?, ?, ?, ?, ?)
1472
+ `).run(t.session_id??null,n,t.category,t.content,t.source_surface);return Number(o.lastInsertRowid)}supersedeFact(t,n,r){let o=this.db.prepare("SELECT * FROM facts WHERE id = ?").get(t);if(!o)throw new Error(`Fact ${t} not found`);let s=new Date().toISOString(),a=r??o.category;this.appendWAL({type:"fact",timestamp:s,data:{session_id:o.session_id,created_at:s,category:a,content:n,source_surface:o.source_surface}});let l=this.db.prepare(`
1473
+ INSERT INTO facts (session_id, created_at, category, content, source_surface, confidence)
1474
+ VALUES (?, ?, ?, ?, ?, ?)
1475
+ `).run(o.session_id,s,a,n,o.source_surface,1),c=Number(l.lastInsertRowid);return this.db.prepare("UPDATE facts SET superseded_by = ? WHERE id = ?").run(c,t),this.appendWAL({type:"supersede",timestamp:s,data:{old_fact_id:t,new_fact_id:c}}),c}removeFact(t){return this.db.prepare("DELETE FROM facts WHERE id = ?").run(t).changes>0}getFact(t){return this.db.prepare("SELECT * FROM facts WHERE id = ?").get(t)??null}searchFacts(t,n){let r=n?.limit??10,o=["facts_fts MATCH ?"],s=[t];n?.category&&(o.push("f.category = ?"),s.push(n.category)),n?.since&&(o.push("f.created_at >= ?"),s.push(n.since)),o.push("f.superseded_by IS NULL");let a=`
1476
+ SELECT f.*, facts_fts.rank
1477
+ FROM facts f
1478
+ JOIN facts_fts ON facts_fts.rowid = f.id
1479
+ WHERE ${o.join(" AND ")}
1480
+ ORDER BY facts_fts.rank
1481
+ LIMIT ?
1482
+ `;return s.push(r),this.db.prepare(a).all(...s)}startSession(t){let n=new Date().toISOString();this.appendWAL({type:"session_start",timestamp:n,data:{...t,started_at:n}}),this.db.prepare(`
1483
+ INSERT OR IGNORE INTO sessions (session_id, surface, started_at)
1484
+ VALUES (?, ?, ?)
1485
+ `).run(t.session_id,t.surface,n)}endSession(t,n,r,o,s){let a=new Date().toISOString();this.appendWAL({type:"session_end",timestamp:a,data:{session_id:t,summary:n,outcome:r,ended_at:a}}),this.db.prepare(`
1486
+ UPDATE sessions
1487
+ SET ended_at = ?, summary = ?, outcome = ?, token_count = ?, cost_usd = ?
1488
+ WHERE session_id = ?
1489
+ `).run(a,n,r,o??null,s??null,t)}getSession(t){return this.db.prepare("SELECT * FROM sessions WHERE session_id = ?").get(t)??null}recentSessions(t=5){return this.db.prepare("SELECT * FROM sessions ORDER BY started_at DESC LIMIT ?").all(t)}writeProcedure(t,n,r){let o=Ja(t),s=ar(ve(this.dir,lr)),a=ar(s,`${o}.md`);Xa(a,s);let i=["---",`name: ${o}`,`created: ${new Date().toISOString()}`,`source_session: ${r??"unknown"}`,"access_count: 0","---",""].join(`
1490
+ `);Ka(a,i+n,"utf-8")}loadProcedure(t){let n=Ja(t),r=ar(ve(this.dir,lr)),o=ar(r,`${n}.md`);if(Xa(o,r),!ln(o))return null;try{return Qa(o,ir(o,"utf-8"))}catch{return null}}searchProcedures(t){let n=ve(this.dir,lr);if(!ln(n))return[];let r=t.toLowerCase().split(/\s+/),o=[];for(let s of Nf(n)){if(!s.endsWith(".md"))continue;let a=ir(ve(n,s),"utf-8"),i=a.toLowerCase();if(r.some(l=>i.includes(l))){let l=Qa(s,a);l&&o.push(l)}}return o}search(t,n){let r=[];try{let s=this.searchFacts(t,n);for(let a of s)r.push({type:"fact",content:a.content,category:a.category,created_at:a.created_at,source_session:a.session_id,confidence:a.confidence})}catch{}if(!n?.category){let s=this.searchProcedures(t);for(let a of s)r.push({type:"procedure",content:a.content,created_at:a.created,source_session:a.source_session,confidence:1})}let o=n?.limit??10;return r.slice(0,o)}replayWAL(){let t=ve(this.dir,Ya);if(!ln(t))return 0;let n=0;try{let r=ir(t,"utf-8").trim();if(!r)return Ga(t),0;let o=r.split(`
1491
+ `);for(let s of o)if(s.trim())try{let a=JSON.parse(s);if(!qf(a)){H("WAL replay: skipping invalid entry:",s.slice(0,200));continue}let i=a;if(i.type==="session_start"){let l=i.data;this.db.prepare(`
1492
+ INSERT OR IGNORE INTO sessions (session_id, surface, started_at)
1493
+ VALUES (?, ?, ?)
1494
+ `).run(l.session_id,l.surface,l.started_at),n++}else if(i.type==="session_end"){let l=i.data;this.db.prepare(`
1495
+ UPDATE sessions SET ended_at = ?, summary = ?, outcome = ?
1496
+ WHERE session_id = ? AND ended_at IS NULL
1497
+ `).run(l.ended_at,l.summary,l.outcome,l.session_id),n++}else if(i.type==="fact"){let l=i.data;this.db.prepare("SELECT id FROM facts WHERE content = ? AND created_at = ?").get(l.content,l.created_at)||(this.db.prepare(`
1498
+ INSERT INTO facts (session_id, created_at, category, content, source_surface)
1499
+ VALUES (?, ?, ?, ?, ?)
1500
+ `).run(l.session_id??null,l.created_at,l.category,l.content,l.source_surface??"cli"),n++)}else if(i.type==="supersede"){let l=i.data,c=l.old_fact_id,u=l.new_fact_id;typeof c=="number"&&typeof u=="number"&&(this.db.prepare("UPDATE facts SET superseded_by = ? WHERE id = ? AND superseded_by IS NULL").run(u,c),n++)}}catch(a){H("WAL replay: skipping malformed line:",String(a))}Ga(t)}catch(r){H("WAL file unreadable, skipping recovery:",String(r))}return n}close(){this.db.close()}appendWAL(t){let n=ve(this.dir,Ya);try{Uf(n,JSON.stringify(t)+`
1501
+ `,"utf-8")}catch(r){H("WAL append failed (non-fatal):",String(r))}}},Gf=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;function Ja(e){if(!e||e.length>100||!Gf.test(e))throw new Error(`Invalid procedure name "${e}": must be 1-100 chars, alphanumeric/hyphens/underscores only`);return e}var zf=new Set(["fact","session_start","session_end","supersede"]),Vf=new Set(["preference","convention","decision","learning"]);function qf(e){if(!e||typeof e!="object")return!1;let t=e;if(typeof t.type!="string"||!zf.has(t.type)||typeof t.timestamp!="string"||!t.data||typeof t.data!="object")return!1;if(t.type==="fact"){let n=t.data;if(typeof n.category!="string"||!Vf.has(n.category))return!1}return!0}function Xa(e,t){let n=Hf(t,e);if(n.startsWith("..")||n.startsWith("/"))throw new Error("Path traversal detected")}function Qa(e,t){let n=t.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!n)return{name:za(e,".md"),content:t,created:"",source_session:null,access_count:0};let r=n[1]??"",o=n[2]??"",s=c=>c.match(/^name:\s*(.+)$/m)?.[1]?.trim()??za(e,".md"),a=c=>c.match(/^created:\s*(.+)$/m)?.[1]?.trim()??"",i=c=>c.match(/^source_session:\s*(.+)$/m)?.[1]?.trim()??null,l=c=>{let u=c.match(/^access_count:\s*(\d+)$/m);return u?parseInt(u[1],10):0};return{name:s(r),content:o.trim(),created:a(r),source_session:i(r),access_count:l(r)}}import{existsSync as Yf,readFileSync as Jf}from"fs";import{join as Xf}from"path";function el(){let e=Xf(Rn(),"HOT.md");if(!Yf(e))return null;try{let t=Jf(e,"utf-8");return t.trim().length>0?t:null}catch{return null}}function ft(e){let t=el();if(!t)return e;let r=`<cross-session-memory>
1502
+ ${t.replace(/<\/?cross-session-memory\b[^>]*>/gi,"")}
1503
+ </cross-session-memory>`,o=e.systemPrompt;if(typeof o=="string")return{...e,systemPrompt:`${r}
1504
+
1505
+ ${o}`};if(o&&typeof o=="object"&&"type"in o&&o.type==="preset"){let s=o.append??"";return{...e,systemPrompt:{...o,append:`${r}
1506
+
1507
+ ${s}`}}}return{...e,systemPrompt:r}}function Ro(e,t="cli"){return n=>{if(n.event!=="SessionEnd")return{};try{let r=n.sessionId;r&&(e.startSession({session_id:r,surface:t}),e.endSession(r,n.reason??"session ended","completed"))}catch{}return{}}}var tl={name:"memory_search",description:'Search cross-session memory for facts and procedures. Returns results ranked by relevance. Use this to recall information from prior sessions. Supports FTS5 match syntax: AND, OR, NOT, "exact phrase", prefix*',input_schema:{type:"object",properties:{query:{type:"string",description:'Search query (supports FTS5 match syntax: AND, OR, NOT, "exact phrase", prefix*)'},category:{type:"string",enum:["preference","convention","decision","learning"],description:"Optional: filter by fact category"},since:{type:"string",description:"Optional: ISO date \u2014 only return facts created after this date"},limit:{type:"number",description:"Max results (default 10)"}},required:["query"]}},nl={name:"memory_update",description:'Store a fact in cross-session memory or update hot memory. Hot memory (target: "hot") persists in the system prompt across all future sessions. Facts (target: "fact") are stored in the searchable archive.',input_schema:{type:"object",properties:{target:{type:"string",enum:["hot","fact"],description:'"hot" writes to HOT.md (system prompt), "fact" writes to the searchable archive'},action:{type:"string",enum:["set","supersede","remove"],description:"Operation: set (create/overwrite), supersede (replace while keeping history), remove (delete)"},content:{type:"string",description:"The content to store (for set/supersede)"},category:{type:"string",enum:["preference","convention","decision","learning"],description:"Required for fact target"},supersedes:{type:"number",description:"Fact ID being superseded (for supersede action)"},id:{type:"number",description:"Fact ID to remove (for remove action)"}},required:["target","action"]}},rl={name:"procedure_write",description:"Write a reusable procedure to memory. Procedures are markdown files describing how to perform recurring tasks. They persist across sessions and are searchable via memory_search.",input_schema:{type:"object",properties:{name:{type:"string",description:"Procedure name (kebab-case, becomes the filename)"},content:{type:"string",description:"Procedure content (markdown)"}},required:["name","content"]}},Mo=[tl,nl,rl];function $o(e,t,n){let r=async a=>{try{let i=Qf(a),l=e.search(i.query,{category:i.category,since:i.since,limit:i.limit??10});return{content:JSON.stringify(l)}}catch(i){return{content:`memory_search error: ${i instanceof Error?i.message:String(i)}`,isError:!0}}},o=async a=>{try{let i=Zf(a);if(i.target==="hot")return i.action!=="set"?{content:'Hot memory only supports action: "set". Use supersede/remove only for facts.',isError:!0}:i.content?(e.saveHot(i.content),{content:JSON.stringify({saved:!0,target:"hot"})}):{content:'content is required for action: "set"',isError:!0};if(i.action==="set"){if(!i.category)return{content:"category is required for fact storage",isError:!0};if(!i.content)return{content:'content is required for action: "set"',isError:!0};let l=e.storeFact({session_id:t,category:i.category,content:i.content,source_surface:n??"cli"});return{content:JSON.stringify({id:l,action:"set",target:"fact"})}}if(i.action==="supersede"){if(!i.supersedes)return{content:'supersedes (fact ID) is required for action: "supersede"',isError:!0};if(!i.content)return{content:'content is required for action: "supersede"',isError:!0};let l=e.supersedeFact(i.supersedes,i.content,i.category??void 0);return{content:JSON.stringify({id:l,action:"supersede",target:"fact",supersedes:i.supersedes})}}if(i.action==="remove"){if(!i.id)return{content:'id (fact ID) is required for action: "remove"',isError:!0};let l=e.removeFact(i.id);return{content:JSON.stringify({removed:l,action:"remove",target:"fact"})}}return{content:`Unknown action: ${i.action}`,isError:!0}}catch(i){return{content:`memory_update error: ${i instanceof Error?i.message:String(i)}`,isError:!0}}},s=async a=>{try{let i=eg(a);return e.writeProcedure(i.name,i.content,t),{content:JSON.stringify({name:i.name,written:!0})}}catch(i){return{content:`procedure_write error: ${i instanceof Error?i.message:String(i)}`,isError:!0}}};return new Map([["memory_search",r],["memory_update",o],["procedure_write",s]])}function Qf(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.query!="string")throw new Error("query (string) is required");let n={query:t.query};if(t.category!==void 0){if(typeof t.category!="string")throw new Error("category must be a string");let r=["preference","convention","decision","learning"];if(!r.includes(t.category))throw new Error(`category must be one of: ${r.join(", ")}`);n.category=t.category}if(t.since!==void 0){if(typeof t.since!="string")throw new Error("since must be a string (ISO date)");n.since=t.since}if(t.limit!==void 0){if(typeof t.limit!="number"||t.limit<=0)throw new Error("limit must be a positive number");n.limit=t.limit}return n}function Zf(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e,n=["hot","fact"];if(typeof t.target!="string"||!n.includes(t.target))throw new Error(`target must be one of: ${n.join(", ")}`);let r=["set","supersede","remove"];if(typeof t.action!="string"||!r.includes(t.action))throw new Error(`action must be one of: ${r.join(", ")}`);let o={target:t.target,action:t.action};if(t.content!==void 0){if(typeof t.content!="string")throw new Error("content must be a string");o.content=t.content}if(t.category!==void 0){if(typeof t.category!="string")throw new Error("category must be a string");let s=["preference","convention","decision","learning"];if(!s.includes(t.category))throw new Error(`category must be one of: ${s.join(", ")}`);o.category=t.category}if(t.supersedes!==void 0){if(typeof t.supersedes!="number"||t.supersedes<=0)throw new Error("supersedes must be a positive fact ID");o.supersedes=t.supersedes}if(t.id!==void 0){if(typeof t.id!="number"||t.id<=0)throw new Error("id must be a positive fact ID");o.id=t.id}return o}function eg(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.name!="string")throw new Error("name (string) is required");if(typeof t.content!="string")throw new Error("content (string) is required");return{name:t.name,content:t.content}}import{mkdirSync as tg,appendFileSync as ng,existsSync as rg}from"fs";import{resolve as og}from"path";import{dirname as sg}from"path";var ig=`# AFK PROMPT DUMP \u2014 May contain secrets. Inspect before sharing.
1508
+ `,ag=/key|token|secret|password|credential|auth/i,lg=[[/sk-ant-[A-Za-z0-9_\-]{8,200}/g,e=>`<REDACTED sk-ant length=${e[0].length}>`],[/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,e=>`<REDACTED Bearer length=${e[0].length}>`],[/AKIA[A-Z0-9]{16}/g,e=>`<REDACTED AKIA length=${e[0].length}>`],[/xox[baprs]-[A-Za-z0-9\-]{10,200}/g,e=>`<REDACTED xox token length=${e[0].length}>`],[/([A-Z_]{3,}(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*)=([^\s]{16,})/g,e=>`${e[1]??""}=<REDACTED length=${(e[2]??"").length}>`]];function cg(e){let t=e;for(let[n,r]of lg)t=t.replace(n,(...o)=>{let s=o.slice(0,o.length-2);return r(s)});return t}function Oo(e){return typeof e=="string"?cg(e):Array.isArray(e)?e.map(Oo):e}function ug(e){if(e===null||typeof e!="object")return e;let t=e,n={...t},r=t.env;if(r&&typeof r=="object"){let o={};for(let[s,a]of Object.entries(r))ag.test(s)&&typeof a=="string"?o[s]=`<REDACTED length=${a.length}>`:o[s]=a;n.env=o}return"system"in t&&(n.system=Oo(t.system)),"systemPrompt"in t&&(n.systemPrompt=Oo(t.systemPrompt)),n}function dg(e){if(e==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof e=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(e))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof e=="object"){let t=e;if(t.type==="preset"&&t.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof t.append=="string"&&(n.append={length:t.append.length}),t.excludeDynamicSections===!0&&(n.excludeDynamicSections=!0),n}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}function ol(e){let t=process.env.AFK_DUMP_PROMPT;if(!t||t===""||t==="0"||t.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
1509
+ `);let n=e.options,r=typeof n=="object"&&n!==null?n.systemPrompt:void 0,o=dg(r),s={timestamp:new Date().toISOString(),prompt:e.prompt,options:ug(e.options),provenance:e.provenance,resolution:o};if(t==="1"||t.toLowerCase()==="true"||t.toLowerCase()==="stderr"){let l=JSON.stringify(s,null,2)+`
1510
+ `;process.stderr.write(l);return}let a=og(t),i=sg(a);try{tg(i,{recursive:!0});let c=(!rg(a)?ig:"")+JSON.stringify(s)+`
1511
+ `;ng(a,c)}catch(l){let c=`[prompt-dump] Failed to write to ${a}: ${String(l)}
1512
+ `;process.stderr.write(c)}}var il="anthropic-direct",pg="claude-sonnet-4-5-20250929",al=null;var Se=class{name=il;tools;memoryStore;providerFactory;skillExecutor;constructor(t={}){let n=[...qn];t.subagentExecutor&&n.push(oa),t.skillExecutor&&n.push(sa),n.push(...Mo);let r=Ha();this.memoryStore=t.memoryStore??new Ie;let o=$o(this.memoryStore,void 0,t.surface??"cli");for(let[s,a]of o)r.set(s,a);this.tools=t.tools??new an({handlers:r,schemas:n,hookRegistry:t.hookRegistry,permissions:t.permissions,subagentExecutor:t.subagentExecutor,skillExecutor:t.skillExecutor}),this.skillExecutor=t.skillExecutor,t.clientFactory&&(this.providerFactory=t.clientFactory)}close(){this.memoryStore.close()}query(t){let n=t.config,r=n.apiKey&&n.apiKey.length>0?n.apiKey:process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_CODE_OAUTH_TOKEN||"";if(!r||r.length===0)throw new Error(`${il} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let o=qs(r),s=co(r,o),a=this.providerFactory??al,i=a?a(s):new sl(s),l=Ys(o),c=mg(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?en(n.model)??n.model:pg,p=fg(n,u),m=this.tools instanceof an?[...this.tools.toolDefs]:[...qn],f=this.skillExecutor?_a():"",g=n.cwd||process.cwd(),y=[Ba];y.push(`# Environment
1513
+ - Working directory: ${g}`),f.length>0&&y.push(f),c&&y.push(c);let h=y.join(`
1514
+
1515
+ `);ol({prompt:t.prompt,options:{model:u,maxTokens:p,system:h},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 k;if(o==="oauth"){let v=this.providerFactory??al;k=async()=>{let w=await ti();if(!w)return null;let P=co(w,"oauth");return v?v(P):new sl(P)}}return new sr({client:i,authMode:o,promptStream:t.prompt,toolDispatcher:this.tools,model:u,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:m,userSystem:h,systemPrefix:l,tokenRefresher:k})}};function mg(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}function fg(e,t){let n=e.maxOutputTokens;return typeof n=="number"&&Number.isFinite(n)&&n>0?Math.floor(n):Io(t)}var ll=new Se;import{Codex as ul}from"@openai/codex-sdk";import{mkdtempSync as gg,rmSync as hg,writeFileSync as yg}from"node:fs";import{tmpdir as bg}from"node:os";import{join as cl}from"node:path";var un="openai-codex",kg=[{value:"gpt-5.4",displayName:"GPT-5.4",description:"Codex default"},{value:"gpt-5.4-mini",displayName:"GPT-5.4 mini",description:"Faster, cheaper Codex variant"}];function wg(e){let t=[];if(e.continue&&t.push("continue"),e.resumeSessionAt!==void 0&&t.push("resumeSessionAt"),e.forkSession&&t.push("forkSession"),e.persistSession===!1&&t.push("persistSession=false"),e.enableFileCheckpointing&&t.push("enableFileCheckpointing"),e.thinking!==void 0&&t.push("thinking"),e.maxBudgetUsd!==void 0&&t.push("maxBudgetUsd"),e.taskBudget!==void 0&&t.push("taskBudget"),e.plugins&&e.plugins.length>0&&t.push("plugins"),e.agents&&t.push("agents"),e.agent!==void 0&&t.push("agent"),e.onElicitation&&t.push("onElicitation"),e.hooks&&t.push("hooks"),e.canUseTool&&t.push("canUseTool"),e.mcpServers&&t.push("mcpServers"),e.includeHookEvents&&t.push("includeHookEvents"),e.agentProgressSummaries&&t.push("agentProgressSummaries"),e.includePartialMessages&&t.push("includePartialMessages"),t.length>0)throw new Jt(un,t.join(", "),`${un} provider does not support AgentConfig fields: ${t.join(", ")}`)}function dl(e){return e==="plan"?{sandboxMode:"read-only",approvalPolicy:"untrusted"}:{sandboxMode:"workspace-write",approvalPolicy:"never"}}function Sg(e){if(e)switch(e){case"minimal":case"low":case"medium":case"high":case"xhigh":return e;case"max":return"xhigh";default:return}}function vg(e){let t=e.systemPrompt;if(t!==void 0){if(typeof t=="string")return t.length>0?t:void 0;if(typeof t=="object"&&t!==null&&"append"in t){let n=t.append;return n&&n.length>0?n:void 0}}}function xg(e){let t=gg(cl(bg(),"afk-codex-instr-")),n=cl(t,"instructions.md");return yg(n,e,"utf-8"),{path:n,dispose:()=>{try{hg(t,{recursive:!0,force:!0})}catch{}}}}function Tg(e){if(e.apiKey)return e.apiKey;let t=process.env.OPENAI_API_KEY??process.env.CODEX_API_KEY;return t&&t.length>0?t:void 0}function*Eg(e,t,n,r){if(e.type!=="thread.started"&&e.type!=="turn.started"){if(e.type==="turn.completed"){let o=e.usage;yield{type:"turn.completed",usage:{inputTokens:o.input_tokens,outputTokens:o.output_tokens,cachedInputTokens:o.cached_input_tokens,totalTokens:o.input_tokens+o.output_tokens+o.cached_input_tokens,resultSubtype:"success",isError:!1,raw:{input_tokens:o.input_tokens,output_tokens:o.output_tokens,cached_input_tokens:o.cached_input_tokens}},...t!==void 0?{sessionId:t}:{}};return}if(e.type==="turn.failed"){yield{type:"error",error:new Error(e.error.message)};return}if(e.type==="error"){yield{type:"error",error:new Error(e.message)};return}(e.type==="item.started"||e.type==="item.updated"||e.type==="item.completed")&&(yield*Pg(e.item,e.type==="item.completed",t,n,r))}}function*Pg(e,t,n,r,o){if(e.type==="agent_message"){let s=r.get(e.id)??"";if(e.text!==s){let a=e.text.startsWith(s)?e.text.slice(s.length):e.text;r.set(e.id,e.text),a.length>0&&(yield{type:"delta.text",text:a,...n!==void 0?{sessionId:n}:{}})}t&&(yield{type:"assistant.message",text:e.text,...n!==void 0?{sessionId:n}:{}},r.delete(e.id));return}if(e.type==="reasoning"){let s=o.get(e.id)??"";if(e.text!==s){let a=e.text.startsWith(s)?e.text.slice(s.length):e.text;o.set(e.id,e.text),a.length>0&&(yield{type:"delta.reasoning",text:a,...n!==void 0?{sessionId:n}:{}})}t&&o.delete(e.id);return}if(e.type==="command_execution"){if(t){let s=e.status==="failed",a=e.exit_code!==void 0?` (exit ${e.exit_code})`:"",i=`$ ${e.command}${a}
1395
1516
  `+(e.aggregated_output??"");yield{type:"tool.output",toolUseId:e.id,content:i,isError:s,...n!==void 0?{sessionId:n}:{}}}return}if(e.type==="file_change"){if(t){let s=e.changes.map(a=>`${a.kind} ${a.path}`).join(`
1396
- `);yield{type:"tool.output",toolUseId:e.id,content:s,isError:e.status==="failed",...n!==void 0?{sessionId:n}:{}}}return}if(e.type==="mcp_tool_call"){if(t){let s=e.status==="failed",a;e.error?a=e.error.message:e.result?a=JSON.stringify(e.result,null,2):a="",yield{type:"tool.output",toolUseId:e.id,content:a,isError:s,...n!==void 0?{sessionId:n}:{}}}return}if(e.type==="web_search"){t&&(yield{type:"tool.output",toolUseId:e.id,content:`web_search: ${e.query}`,...n!==void 0?{sessionId:n}:{}});return}if(e.type!=="todo_list"&&e.type==="error"){t&&(yield{type:"error",error:new Error(e.message)});return}}var so=class{startOpts;promptStream;codex;thread;currentModel;currentSandbox;currentApproval;abortController=null;pendingAbortReason=null;closed=!1;initSessionId;dispose;closeResolve=null;closedPromise;constructor(t,n,r){this.startOpts=t,this.promptStream=n,this.initSessionId=r,this.codex=new da(t.codexOptions),this.thread=t.resumeId?this.codex.resumeThread(t.resumeId,t.threadOptions):this.codex.startThread(t.threadOptions),this.currentModel=t.threadOptions.model,this.currentSandbox=t.threadOptions.sandboxMode??"workspace-write",this.currentApproval=t.threadOptions.approvalPolicy??"never",t.instructionsDispose!==void 0&&(this.dispose=t.instructionsDispose),this.closedPromise=new Promise(o=>{this.closeResolve=()=>o("__closed__")})}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,...this.currentModel!==void 0?{model:this.currentModel}:{},permissionMode:this.sandboxToPermissionMode(),cwd:this.startOpts.threadOptions.workingDirectory??process.cwd(),tools:["Bash","Read","Write","Edit"],slashCommands:[],skills:[],plugins:[],mcpServers:[],apiKeySource:this.startOpts.codexOptions.apiKey!==void 0?"apiKey":"codex-cli",version:"codex-sdk"}};let n=new Map,r=new Map,o=this.initSessionId,s=this.promptStream[Symbol.asyncIterator]();try{for(;!this.closed;){let a=await Promise.race([s.next(),this.closedPromise]);if(a==="__closed__")break;let i=a;if(i.done)break;let l=i.value,c=new AbortController;if(this.abortController=c,this.pendingAbortReason!==null&&!c.signal.aborted&&(c.abort(this.pendingAbortReason),this.pendingAbortReason=null),c.signal.aborted)return;let u;try{let p=typeof l.content=="string"?l.content:l.content.map(m=>{if(typeof m=="object"&&m&&"type"in m){if(m.type==="text")return m.text;if(m.type==="image")return"[image omitted]"}return""}).join(`
1397
- `);u=await this.thread.runStreamed(p,{signal:c.signal})}catch(p){if(c.signal.aborted)return;yield{type:"error",error:p instanceof Error?p:new Error(String(p))};return}try{for await(let p of u.events){if(this.closed)return;p.type==="thread.started"&&(o=p.thread_id),yield*Nm(p,o,n,r)}}catch(p){if(c.signal.aborted)return;yield{type:"error",error:p instanceof Error?p:new Error(String(p))};return}finally{this.abortController===c&&(this.abortController=null)}}}catch(a){yield{type:"error",error:a instanceof Error?a:new Error(String(a))}}finally{try{await s.return?.()}catch{}}}sandboxToPermissionMode(){return this.currentSandbox==="read-only"||this.currentApproval==="untrusted"?"plan":"bypassPermissions"}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){this.currentModel=t;let n={...this.startOpts.threadOptions,...t!==void 0?{model:t}:{},sandboxMode:this.currentSandbox,approvalPolicy:this.currentApproval},r=this.thread.id;this.thread=r?this.codex.resumeThread(r,n):this.codex.startThread(n),this.startOpts.threadOptions=n}async setPermissionMode(t){let{sandboxMode:n,approvalPolicy:r}=pa(t);this.currentSandbox=n,this.currentApproval=r;let o={...this.startOpts.threadOptions,sandboxMode:n,approvalPolicy:r},s=this.thread.id;this.thread=s?this.codex.resumeThread(s,o):this.codex.startThread(o),this.startOpts.threadOptions=o}async supportedCommands(){return[]}async supportedModels(){return _m.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:null}}async mcpServerStatus(){return[]}async accountInfo(){return{}}async rewindFiles(t,n){throw new Bt(Xt,"rewindFiles",`${Xt} provider does not support file checkpoint rewind.`)}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),this.dispose?.()}getThread(){return this.thread}},jm=null;var Hn=class{name=Xt;query(t){$m(t.config);let n=Fm(t.config),r=Om(t.config.effort),{sandboxMode:o,approvalPolicy:s}=pa(t.config.permissionMode),a={...t.config.model!==void 0?{model:t.config.model}:{},sandboxMode:o,approvalPolicy:s,...r!==void 0?{modelReasoningEffort:r}:{},skipGitRepoCheck:!0,workingDirectory:process.cwd()},i=Dm(t.config),l={};n!==void 0&&(l.apiKey=n);let c;if(i!==void 0){let{path:g,dispose:y}=Lm(i);l.config={...l.config??{},model_instructions_file:g},c=y}V(`\u{1F7E2} OpenAICodexProvider: creating Codex thread (model=${String(t.config.model)}, sandbox=${o}, approval=${s})`);let u=jm,p=u??(g=>new da(g)),m=`codex-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,f=new so({threadOptions:a,codexOptions:l,...t.config.resume!==void 0?{resumeId:t.config.resume}:{},...c!==void 0?{instructionsDispose:c}:{}},t.prompt,m);if(u){let g=p(l);f.codex=g,f.thread=t.config.resume?g.resumeThread(t.config.resume,a):g.startThread(a)}return f}},ma=new Hn;var Bm=new Set(["opus","opus_1m","sonnet","sonnet_1m","haiku","auto"]);function ke(e){if(!e)return"anthropic-direct";let t=e.trim().toLowerCase();return!t||Bm.has(t)||t.startsWith("claude-")||t.startsWith("claude_")?"anthropic-direct":t.startsWith("gpt-")||t.startsWith("gpt_")||t.startsWith("o1")||t.startsWith("o3")||t.startsWith("o4")||t.startsWith("codex-")||t.startsWith("codex_")||t==="codex"?"openai-codex":"anthropic-direct"}function fa(e){return ke(e)==="openai-codex"?ma:ca}async function ga(e,t,n={}){e&&await e.dispatch(t,n.signal)}async function ha(e,t,n={}){if(e)try{await e.dispatch(t,n.signal)}catch(r){if(r instanceof he||r instanceof Ee){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 Wn=class{pendingResolve=null;bufferedMessage=null;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.bufferedMessage=t}createIterable(){let t=this;return{[Symbol.asyncIterator](){return{next(){if(t.bufferedMessage!==null){let n=t.bufferedMessage;t.bufferedMessage=null;let 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 Hm(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],a=parseFloat(r),i=a;o==="KB"?i=a*1024:o==="MB"?i=a*1024*1024:o==="GB"&&(i=a*1024*1024*1024);let l=r;return a%1===0&&(l=String(Math.floor(a))),l+=o,{sizeLabel:l,sizeBytes:Math.round(i),absolutePath:s.trim()}}function Wm(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 Km(e){let t=Buffer.byteLength(e,"utf8"),n=Wm(t),r=e.split(`
1398
- `);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 Gm(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),{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 zm(e,t){let n=t.info;e.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}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization()}function Vm(e,t){e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}}))}function Ym(e,t){let n=Hm(t.content);if(n){e.push({type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${n.sizeLabel}) \u2192 ${n.absolutePath}`,isError:t.isError===!0,persistedPath:n.absolutePath,sizeBytes:n.sizeBytes,sizeLabel:n.sizeLabel}});return}let{content:r,truncated:o,lineCount:s,sizeBytes:a,sizeLabel:i}=Km(t.content);e.push({type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:r,isError:t.isError===!0,sizeBytes:a,sizeLabel:i,...o&&{truncated:o},...s!==void 0&&{lineCount:s}}})}function qm(e,t){if(!t)return;let n={role:"assistant",content:t,timestamp:new Date};e.conversationHistory.push(n),e.messageQueue.push({type:"message",message:n})}async function ya(e){try{for await(let t of e.providerStream)switch(t.type){case"session.init":zm(e,t);break;case"session.status":Vm(e,t);break;case"delta.text":e.messageQueue.push({type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}});break;case"delta.reasoning":e.messageQueue.push({type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}});break;case"assistant.message":t.sessionId&&e.updateSessionIdentity(t.sessionId),qm(e,t.text);break;case"tool.use.start":e.messageQueue.push({type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput}});break;case"tool.use":e.messageQueue.push({type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}});break;case"tool.output":Ym(e.messageQueue,t);break;case"progress":e.messageQueue.push({type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}});break;case"suggestion":e.messageQueue.push({type:"suggestion",suggestion:t.suggestion});break;case"turn.completed":let n=Gm(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}e.messageQueue.push({type:"done",metadata:n});break;case"error":throw t.error}e.resolveInitializationIfNeeded(),e.messageQueue.complete()}catch(t){let n=t instanceof Error?t:new Error(String(t));throw e.resolveInitializationIfNeeded(),e.messageQueue.fail(n),n}}function ka(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 ba(e,t){let n=e.permissionMode??"bypassPermissions",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}}async function wa(e){try{await ga(e.hookRegistry,{event:"SessionStart",sessionId:e.sessionId()},{signal:e.abortSignal}),await ya({providerStream:e.providerQuery,messageQueue:e.messageQueue,conversationHistory:e.conversationHistory,getSessionMetadata:()=>e.stateManager.getSessionMetadata(),setSessionMetadata:t=>e.stateManager.setSessionMetadata(t),updateSessionIdentity:t=>e.stateManager.updateSessionIdentity(t),resolveInitialization:()=>e.stateManager.resolveInitializationOnce(),resolveInitializationIfNeeded:()=>e.stateManager.resolveInitializationIfNeeded(),setLastResponseMetadata:e.setLastResponseMetadata})}catch(t){let n=t instanceof Error?t:new Error(String(t));e.stateManager.isInitializationSettled()||e.stateManager.rejectInitializationOnce(n),await e.dispatchEnd("error").catch(()=>{})}}var Kn=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}};async function Sa(e,t){return await new Promise((n,r)=>{let o=null,s="",a=!1,i=c=>{a||(a=!0,clearTimeout(l),c())},l=Number.isFinite(t)&&t>0?setTimeout(()=>{i(()=>r(new Error("Response timeout")))},t):void 0;(async()=>{try{for await(let c of e){if(process.env.AFK_CODEX_DEBUG&&console.log("[wait] got event:",c.type),c.type==="error"){i(()=>r(c.error));return}if(c.type==="chunk"&&c.chunk.type==="content"&&(s+=c.chunk.content),c.type==="message"&&c.message.role==="assistant"&&(o=c.message),c.type==="done"){if(process.env.AFK_CODEX_DEBUG&&console.log("[wait] settling with done; assistantMessage=",!!o,"streamedContent=",s.length),o){let u=o;i(()=>n({...u,metadata:c.metadata}));return}if(s){i(()=>n({role:"assistant",content:s,metadata:c.metadata,timestamp:new Date}));return}}}i(o?()=>n(o):s?()=>n({role:"assistant",content:s,timestamp:new Date}):()=>r(new Error("No assistant response received")))}catch(c){i(()=>r(c instanceof Error?c:new Error(String(c))))}})()})}var de=class{config;currentState="idle";messageQueue;providerQuery;conversationHistory=[];turnCount=0;lastResponseMetadata=null;processingPromise=null;inputStream;abortController;hookRegistry;sessionEndDispatched=!1;stateManager;constructor(t){this.config=t,this.abortController=new AbortController,this.hookRegistry=t.hookRegistry,ka(t.abortSignal,this.abortController,()=>{this.onAbort()}),this.initSdkLifecycle()}initSdkLifecycle(){this.messageQueue=new yn;let t=Gt(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=ba(this.config,t);this.stateManager=new Kn(n,r),this.inputStream=new Wn(()=>this.sessionId);let o=this.config.provider??fa(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.sessionEndDispatched=!1,this.currentState="idle",this.processingPromise=wa({providerQuery:this.providerQuery,messageQueue:this.messageQueue,conversationHistory:this.conversationHistory,stateManager:this.stateManager,hookRegistry:this.hookRegistry,abortSignal:this.abortController.signal,sessionId:()=>this.sessionId,setLastResponseMetadata:s=>this.lastResponseMetadata=s,dispatchEnd:s=>this.dispatchSessionEndOnce(s)})}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get abortSignal(){return this.abortController.signal}async sendMessage(t,n={}){this.assertCanSend(),this.currentState=n.stream?"streaming":"processing";let r={role:"user",content:t,timestamp:new Date};this.conversationHistory.push(r);let o=this.config.timeoutMs??xn;try{this.inputStream.pushUserMessage(t);let s=await Tn(Sa(this.messageQueue,o),o,{controller:this.abortController,label:this.sessionId??"session"});return this.turnCount++,s}finally{this.state!=="closed"&&(this.currentState="idle")}}async*sendMessageStream(t){this.assertCanSend(),this.currentState="streaming";let r={role:"user",content:typeof t=="string"?t:this.summarizeContentBlocks(t),timestamp:new Date};this.conversationHistory.push(r),this.inputStream.pushUserMessage(t);try{for await(let o of this.messageQueue)if(o.type==="done"&&this.turnCount++,yield o,o.type==="done"||o.type==="error")break}finally{this.state!=="closed"&&(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 Ee("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{}this.processingPromise&&await Promise.race([this.processingPromise,new Promise(t=>setTimeout(t,jr))]).catch(()=>{}),this.messageQueue.complete(),this.stateManager.resolveInitializationIfNeeded();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=Gt(t),r=this.stateManager.getSessionMetadata();await this.providerQuery.setModel(n??r.model??""),n&&this.stateManager.setSessionMetadata(o=>({...o,model:n}))}async setPermissionMode(t){await this.providerQuery.setPermissionMode(t),this.stateManager.setSessionMetadata(n=>({...n,permissionMode:t}))}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);return t?t():{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){return this.messageQueue}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{this.providerQuery.close()}catch{}if(this.processingPromise)try{await Promise.race([this.processingPromise,new Promise(t=>setTimeout(t,jr))])}catch{}this.messageQueue.complete(),await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(t){this.sessionEndDispatched||(this.sessionEndDispatched=!0,await ha(this.hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:t}))}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new Ee("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")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`)}};var ao=class{handlers=new Map;register(t,n){let r=this.handlers.get(t);return r||(r=[],this.handlers.set(t,r)),r.push(n),()=>{let o=this.handlers.get(t);if(!o)return;let s=o.indexOf(n);s>=0&&o.splice(s,1)}}count(t){return this.handlers.get(t)?.length??0}async dispatch(t,n){io(n,t.event);let r=this.handlers.get(t.event);if(!r||r.length===0)return{};let o=r.slice(),s={};for(let a of o){io(n,t.event);let i;try{i=await a(t)}catch(l){throw new he(`hook handler threw during ${t.event}`,t.event,l instanceof Error?l.message:String(l),{cause:l})}if(io(n,t.event),Jm(i))throw new he(`hook handler blocked ${t.event}${i.reason?`: ${i.reason}`:""}`,t.event,i.reason);s=i}return s}};function Jm(e){return e.continue===!1||e.decision==="block"}function io(e,t){if(e?.aborted){let n=e.reason,r=`aborted during ${t}${n?`: ${String(n)}`:""}`;throw new Ee(r)}}function va(){return new ao}function xa(){return va()}var Qm=["shadow-verify","shadow_verify","resolve","diagnose","appmap","qualify","mint"],Xm=[/\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],Zm=[/\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],ef=`shadow-verify nudge:
1517
+ `);yield{type:"tool.output",toolUseId:e.id,content:s,isError:e.status==="failed",...n!==void 0?{sessionId:n}:{}}}return}if(e.type==="mcp_tool_call"){if(t){let s=e.status==="failed",a;e.error?a=e.error.message:e.result?a=JSON.stringify(e.result,null,2):a="",yield{type:"tool.output",toolUseId:e.id,content:a,isError:s,...n!==void 0?{sessionId:n}:{}}}return}if(e.type==="web_search"){t&&(yield{type:"tool.output",toolUseId:e.id,content:`web_search: ${e.query}`,...n!==void 0?{sessionId:n}:{}});return}if(e.type!=="todo_list"&&e.type==="error"){t&&(yield{type:"error",error:new Error(e.message)});return}}var Do=class{startOpts;promptStream;codex;thread;currentModel;currentSandbox;currentApproval;abortController=null;pendingAbortReason=null;closed=!1;initSessionId;dispose;closeResolve=null;closedPromise;constructor(t,n,r){this.startOpts=t,this.promptStream=n,this.initSessionId=r,this.codex=new ul(t.codexOptions),this.thread=t.resumeId?this.codex.resumeThread(t.resumeId,t.threadOptions):this.codex.startThread(t.threadOptions),this.currentModel=t.threadOptions.model,this.currentSandbox=t.threadOptions.sandboxMode??"workspace-write",this.currentApproval=t.threadOptions.approvalPolicy??"never",t.instructionsDispose!==void 0&&(this.dispose=t.instructionsDispose),this.closedPromise=new Promise(o=>{this.closeResolve=()=>o("__closed__")})}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,...this.currentModel!==void 0?{model:this.currentModel}:{},permissionMode:this.sandboxToPermissionMode(),cwd:this.startOpts.threadOptions.workingDirectory??process.cwd(),tools:["Bash","Read","Write","Edit"],slashCommands:[],skills:[],plugins:[],mcpServers:[],apiKeySource:this.startOpts.codexOptions.apiKey!==void 0?"apiKey":"codex-cli",version:"codex-sdk"}};let n=new Map,r=new Map,o=this.initSessionId,s=this.promptStream[Symbol.asyncIterator]();try{for(;!this.closed;){let a=await Promise.race([s.next(),this.closedPromise]);if(a==="__closed__")break;let i=a;if(i.done)break;let l=i.value,c=new AbortController;if(this.abortController=c,this.pendingAbortReason!==null&&!c.signal.aborted&&(c.abort(this.pendingAbortReason),this.pendingAbortReason=null),c.signal.aborted)return;let u;try{let p=typeof l.content=="string"?l.content:l.content.map(m=>{if(typeof m=="object"&&m&&"type"in m){if(m.type==="text")return m.text;if(m.type==="image")return"[image omitted]"}return""}).join(`
1518
+ `);u=await this.thread.runStreamed(p,{signal:c.signal})}catch(p){if(c.signal.aborted)return;yield{type:"error",error:p instanceof Error?p:new Error(String(p))};return}try{for await(let p of u.events){if(this.closed)return;p.type==="thread.started"&&(o=p.thread_id),yield*Eg(p,o,n,r)}}catch(p){if(c.signal.aborted)return;yield{type:"error",error:p instanceof Error?p:new Error(String(p))};return}finally{this.abortController===c&&(this.abortController=null)}}}catch(a){yield{type:"error",error:a instanceof Error?a:new Error(String(a))}}finally{try{await s.return?.()}catch{}}}sandboxToPermissionMode(){return this.currentSandbox==="read-only"||this.currentApproval==="untrusted"?"plan":"bypassPermissions"}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){this.currentModel=t;let n={...this.startOpts.threadOptions,...t!==void 0?{model:t}:{},sandboxMode:this.currentSandbox,approvalPolicy:this.currentApproval},r=this.thread.id;this.thread=r?this.codex.resumeThread(r,n):this.codex.startThread(n),this.startOpts.threadOptions=n}async setPermissionMode(t){let{sandboxMode:n,approvalPolicy:r}=dl(t);this.currentSandbox=n,this.currentApproval=r;let o={...this.startOpts.threadOptions,sandboxMode:n,approvalPolicy:r},s=this.thread.id;this.thread=s?this.codex.resumeThread(s,o):this.codex.startThread(o),this.startOpts.threadOptions=o}async supportedCommands(){return[]}async supportedModels(){return kg.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:null}}async mcpServerStatus(){return[]}async accountInfo(){return{}}async rewindFiles(t,n){throw new Jt(un,"rewindFiles",`${un} provider does not support file checkpoint rewind.`)}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),this.dispose?.()}getThread(){return this.thread}},Cg=null;var cr=class{name=un;query(t){wg(t.config);let n=Tg(t.config),r=Sg(t.config.effort),{sandboxMode:o,approvalPolicy:s}=dl(t.config.permissionMode),a={...t.config.model!==void 0?{model:t.config.model}:{},sandboxMode:o,approvalPolicy:s,...r!==void 0?{modelReasoningEffort:r}:{},skipGitRepoCheck:!0,workingDirectory:process.cwd()},i=vg(t.config),l={};n!==void 0&&(l.apiKey=n);let c;if(i!==void 0){let{path:g,dispose:y}=xg(i);l.config={...l.config??{},model_instructions_file:g},c=y}H(`\u{1F7E2} OpenAICodexProvider: creating Codex thread (model=${String(t.config.model)}, sandbox=${o}, approval=${s})`);let u=Cg,p=u??(g=>new ul(g)),m=`codex-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,f=new Do({threadOptions:a,codexOptions:l,...t.config.resume!==void 0?{resumeId:t.config.resume}:{},...c!==void 0?{instructionsDispose:c}:{}},t.prompt,m);if(u){let g=p(l);f.codex=g,f.thread=t.config.resume?g.resumeThread(t.config.resume,a):g.startThread(a)}return f}},pl=new cr;var Ag=new Set(["opus","opus_1m","sonnet","sonnet_1m","haiku","auto"]);function ke(e){if(!e)return"anthropic-direct";let t=e.trim().toLowerCase();return!t||Ag.has(t)||t.startsWith("claude-")||t.startsWith("claude_")?"anthropic-direct":t.startsWith("gpt-")||t.startsWith("gpt_")||t.startsWith("o1")||t.startsWith("o3")||t.startsWith("o4")||t.startsWith("codex-")||t.startsWith("codex_")||t==="codex"?"openai-codex":"anthropic-direct"}function ml(e){return ke(e)==="openai-codex"?pl:ll}async function fl(e,t,n={}){e&&await e.dispatch(t,n.signal)}async function gl(e,t,n={}){if(e)try{await e.dispatch(t,n.signal)}catch(r){if(r instanceof be||r instanceof Ce){H(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}H(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var ur=class{pendingResolve=null;bufferedMessage=null;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.bufferedMessage=t}createIterable(){let t=this;return{[Symbol.asyncIterator](){return{next(){if(t.bufferedMessage!==null){let n=t.bufferedMessage;t.bufferedMessage=null;let 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 Ig(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],a=parseFloat(r),i=a;o==="KB"?i=a*1024:o==="MB"?i=a*1024*1024:o==="GB"&&(i=a*1024*1024*1024);let l=r;return a%1===0&&(l=String(Math.floor(a))),l+=o,{sizeLabel:l,sizeBytes:Math.round(i),absolutePath:s.trim()}}function _g(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 Rg(e){let t=Buffer.byteLength(e,"utf8"),n=_g(t),r=e.split(`
1519
+ `);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 Mg(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),{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 $g(e,t){let n=t.info;e.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}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization()}function Og(e,t){e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}}))}function Dg(e,t){let n=Ig(t.content);if(n){e.push({type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${n.sizeLabel}) \u2192 ${n.absolutePath}`,isError:t.isError===!0,persistedPath:n.absolutePath,sizeBytes:n.sizeBytes,sizeLabel:n.sizeLabel}});return}let{content:r,truncated:o,lineCount:s,sizeBytes:a,sizeLabel:i}=Rg(t.content);e.push({type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:r,isError:t.isError===!0,sizeBytes:a,sizeLabel:i,...o&&{truncated:o},...s!==void 0&&{lineCount:s}}})}function Lg(e,t){if(!t)return;let n={role:"assistant",content:t,timestamp:new Date};e.conversationHistory.push(n),e.messageQueue.push({type:"message",message:n})}async function hl(e){try{for await(let t of e.providerStream)switch(t.type){case"session.init":$g(e,t);break;case"session.status":Og(e,t);break;case"delta.text":e.messageQueue.push({type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}});break;case"delta.reasoning":e.messageQueue.push({type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}});break;case"assistant.message":t.sessionId&&e.updateSessionIdentity(t.sessionId),Lg(e,t.text);break;case"tool.use.start":e.messageQueue.push({type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput}});break;case"tool.use":e.messageQueue.push({type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}});break;case"tool.output":Dg(e.messageQueue,t);break;case"progress":e.messageQueue.push({type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}});break;case"suggestion":e.messageQueue.push({type:"suggestion",suggestion:t.suggestion});break;case"turn.completed":let n=Mg(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}e.messageQueue.push({type:"done",metadata:n});break;case"error":throw t.error}e.resolveInitializationIfNeeded(),e.messageQueue.complete()}catch(t){let n=t instanceof Error?t:new Error(String(t));throw e.resolveInitializationIfNeeded(),e.messageQueue.fail(n),n}}function yl(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 bl(e,t){let n=e.permissionMode??"bypassPermissions",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}}async function kl(e){try{await fl(e.hookRegistry,{event:"SessionStart",sessionId:e.sessionId()},{signal:e.abortSignal}),await hl({providerStream:e.providerQuery,messageQueue:e.messageQueue,conversationHistory:e.conversationHistory,getSessionMetadata:()=>e.stateManager.getSessionMetadata(),setSessionMetadata:t=>e.stateManager.setSessionMetadata(t),updateSessionIdentity:t=>e.stateManager.updateSessionIdentity(t),resolveInitialization:()=>e.stateManager.resolveInitializationOnce(),resolveInitializationIfNeeded:()=>e.stateManager.resolveInitializationIfNeeded(),setLastResponseMetadata:e.setLastResponseMetadata})}catch(t){let n=t instanceof Error?t:new Error(String(t));e.stateManager.isInitializationSettled()||e.stateManager.rejectInitializationOnce(n),await e.dispatchEnd("error").catch(()=>{})}}var dr=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}};async function wl(e,t){return await new Promise((n,r)=>{let o=null,s="",a=!1,i=c=>{a||(a=!0,clearTimeout(l),c())},l=Number.isFinite(t)&&t>0?setTimeout(()=>{i(()=>r(new Error("Response timeout")))},t):void 0;(async()=>{try{for await(let c of e){if(process.env.AFK_CODEX_DEBUG&&console.log("[wait] got event:",c.type),c.type==="error"){i(()=>r(c.error));return}if(c.type==="chunk"&&c.chunk.type==="content"&&(s+=c.chunk.content),c.type==="message"&&c.message.role==="assistant"&&(o=c.message),c.type==="done"){if(process.env.AFK_CODEX_DEBUG&&console.log("[wait] settling with done; assistantMessage=",!!o,"streamedContent=",s.length),o){let u=o;i(()=>n({...u,metadata:c.metadata}));return}if(s){i(()=>n({role:"assistant",content:s,metadata:c.metadata,timestamp:new Date}));return}}}i(o?()=>n(o):s?()=>n({role:"assistant",content:s,timestamp:new Date}):()=>r(new Error("No assistant response received")))}catch(c){i(()=>r(c instanceof Error?c:new Error(String(c))))}})()})}var me=class{config;currentState="idle";messageQueue;providerQuery;conversationHistory=[];turnCount=0;lastResponseMetadata=null;processingPromise=null;inputStream;abortController;hookRegistry;sessionEndDispatched=!1;stateManager;constructor(t){this.config=t,this.abortController=new AbortController,this.hookRegistry=t.hookRegistry,yl(t.abortSignal,this.abortController,()=>{this.onAbort()}),this.initSdkLifecycle()}initSdkLifecycle(){this.messageQueue=new On;let t=en(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=bl(this.config,t);this.stateManager=new dr(n,r),this.inputStream=new ur(()=>this.sessionId);let o=this.config.provider??ml(t);H(`\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.sessionEndDispatched=!1,this.currentState="idle",this.processingPromise=kl({providerQuery:this.providerQuery,messageQueue:this.messageQueue,conversationHistory:this.conversationHistory,stateManager:this.stateManager,hookRegistry:this.hookRegistry,abortSignal:this.abortController.signal,sessionId:()=>this.sessionId,setLastResponseMetadata:s=>this.lastResponseMetadata=s,dispatchEnd:s=>this.dispatchSessionEndOnce(s)})}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get abortSignal(){return this.abortController.signal}async sendMessage(t,n={}){this.assertCanSend(),this.currentState=n.stream?"streaming":"processing";let r={role:"user",content:t,timestamp:new Date};this.conversationHistory.push(r);let o=this.config.timeoutMs??jn;try{this.inputStream.pushUserMessage(t);let s=await Hn(wl(this.messageQueue,o),o,{controller:this.abortController,label:this.sessionId??"session"});return this.turnCount++,s}finally{this.state!=="closed"&&(this.currentState="idle")}}async*sendMessageStream(t){this.assertCanSend(),this.currentState="streaming";let r={role:"user",content:typeof t=="string"?t:this.summarizeContentBlocks(t),timestamp:new Date};this.conversationHistory.push(r),this.inputStream.pushUserMessage(t);try{for await(let o of this.messageQueue)if(o.type==="done"&&this.turnCount++,yield o,o.type==="done"||o.type==="error")break}finally{this.state!=="closed"&&(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 Ce("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{}this.processingPromise&&await Promise.race([this.processingPromise,new Promise(t=>setTimeout(t,po))]).catch(()=>{}),this.messageQueue.complete(),this.stateManager.resolveInitializationIfNeeded();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=en(t),r=this.stateManager.getSessionMetadata();await this.providerQuery.setModel(n??r.model??""),n&&this.stateManager.setSessionMetadata(o=>({...o,model:n}))}async setPermissionMode(t){await this.providerQuery.setPermissionMode(t),this.stateManager.setSessionMetadata(n=>({...n,permissionMode:t}))}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);return t?t():{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){return this.messageQueue}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{this.providerQuery.close()}catch{}if(this.processingPromise)try{await Promise.race([this.processingPromise,new Promise(t=>setTimeout(t,po))])}catch{}this.messageQueue.complete(),await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(t){this.sessionEndDispatched||(this.sessionEndDispatched=!0,await gl(this.hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:t}))}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new Ce("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")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`)}};var Fo=class{handlers=new Map;register(t,n){let r=this.handlers.get(t);return r||(r=[],this.handlers.set(t,r)),r.push(n),()=>{let o=this.handlers.get(t);if(!o)return;let s=o.indexOf(n);s>=0&&o.splice(s,1)}}count(t){return this.handlers.get(t)?.length??0}async dispatch(t,n){Lo(n,t.event);let r=this.handlers.get(t.event);if(!r||r.length===0)return{};let o=r.slice(),s={};for(let a of o){Lo(n,t.event);let i;try{i=await a(t)}catch(l){throw new be(`hook handler threw during ${t.event}`,t.event,l instanceof Error?l.message:String(l),{cause:l})}if(Lo(n,t.event),Fg(i))throw new be(`hook handler blocked ${t.event}${i.reason?`: ${i.reason}`:""}`,t.event,i.reason);s=i}return s}};function Fg(e){return e.continue===!1||e.decision==="block"}function Lo(e,t){if(e?.aborted){let n=e.reason,r=`aborted during ${t}${n?`: ${String(n)}`:""}`;throw new Ce(r)}}function Sl(){return new Fo}function vl(){return Sl()}var Ng=["shadow-verify","shadow_verify","resolve","diagnose","appmap","qualify","mint"],Ug=[/\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],jg=[/\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],Hg=`shadow-verify nudge:
1399
1520
 
1400
1521
  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).
1401
1522
 
1402
1523
  Single-pass sub-agent reports are prone to confident hallucination \u2014 polished output that falls apart on re-derivation. Before acting on these conclusions, consider dispatching \`/shadow-verify\`. Independent verifiers will re-derive the 2\u20133 most load-bearing claims from scratch (without seeing the original reasoning) and flag any that don't hold up.
1403
1524
 
1404
- Skip when: the findings are purely exploratory, the sub-agent ran inside an already-verifying orchestrator, the user is about to dismiss the report, or the stakes are low (read-only Q&A).`;function tf(e){if(!e)return!1;let t=e.toLowerCase();return Qm.some(n=>t.includes(n))}function nf(e){return Zm.some(t=>t.test(e))}function rf(e){let t=0;for(let n of Xm)n.test(e)&&t++;return t}function Ta(e){if(e.event!=="SubagentStop")return{};let t=e.lastMessage??"";return t.length<600?{}:tf(e.agentType)?{}:nf(t)?{}:rf(t)<2?{}:{injectContext:ef}}function xt(e){let t=xa();return t.register("SubagentStop",Ta),e&&t.register("SubagentStop",n=>n.event!=="SubagentStop"?{}:n.status==="idle"||n.status==="running"?{}:(e({subagentId:n.subagentId,status:n.status,durationMs:n.durationMs,agentType:n.agentType}),{})),t}function Se(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 me(e){return e===0?"$0.00":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function L(e){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 of="[skill-routing: active]\n\nRoute recurring work through registered skills instead of rolling ad-hoc solutions:\n\n- Multi-file implementation or new features \u2192 `/mint`\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\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\nSkip orchestration for: single-line edits, trivial Q&A, and direct tool calls the user explicitly requested. The goal is leverage, not ceremony \u2014 if a skill would add overhead without adding value, don't invoke it.";function Gn(e,t){return!e||!t?e:`${e}
1525
+ Skip when: the findings are purely exploratory, the sub-agent ran inside an already-verifying orchestrator, the user is about to dismiss the report, or the stakes are low (read-only Q&A).`;function Bg(e){if(!e)return!1;let t=e.toLowerCase();return Ng.some(n=>t.includes(n))}function Wg(e){return jg.some(t=>t.test(e))}function Kg(e){let t=0;for(let n of Ug)n.test(e)&&t++;return t}function xl(e){if(e.event!=="SubagentStop")return{};let t=e.lastMessage??"";return t.length<600?{}:Bg(e.agentType)?{}:Wg(t)?{}:Kg(t)<2?{}:{injectContext:Hg}}function Rt(e,t,n){let r=vl();r.register("SubagentStop",xl);let o=n??new Ie;return r.register("SessionEnd",Ro(o,t)),e&&r.register("SubagentStop",s=>s.event!=="SubagentStop"?{}:s.status==="idle"||s.status==="running"?{}:(e({subagentId:s.subagentId,status:s.status,durationMs:s.durationMs,agentType:s.agentType}),{})),{registry:r,memoryStore:o}}function xe(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 ge(e){return e===0?"$0.00":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function D(e){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 Gg="[skill-routing: active]\n\nRoute recurring work through registered skills instead of rolling ad-hoc solutions:\n\n- Multi-file implementation or new features \u2192 `/mint`\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\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\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- Survey git + infra + memory before non-trivial work \u2192 `/ground-state`\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 \u2014 if a skill would add overhead without adding value, don't invoke it.";function pr(e,t){return!e||!t?e:`${e}
1405
1526
 
1406
- ${of}`}import Vn from"chalk";import{Lexer as kf}from"marked";import sf from"string-width";var lo=/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,Ea=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function at(e){return e.replace(lo,"")}function U(e){return sf(e)}function zn(e){return e.length===0?[]:Ea?Array.from(Ea.segment(e),t=>t.segment):Array.from(e)}function af(e){let t=[],n=0,r;for(lo.lastIndex=0;(r=lo.exec(e))!==null;){if(r.index>n)for(let o of zn(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of zn(e.slice(n)))t.push({type:"text",value:o});return t}function ce(e,t){let n=Math.max(0,t-U(e));return e+" ".repeat(n)}function lf(e,t){let n=Math.max(0,t-U(e));return" ".repeat(n)+e}function Pa(e,t,n="left"){let r=Math.max(0,t-U(e));if(r===0)return e;if(n==="right")return lf(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return ce(e,t)}function ve(e,t,n="\u2026"){if(t<=0)return"";if(U(e)<=t)return e;let r=U(n),o=Math.max(0,t-r),s=0,a="",i=!1;for(let l of af(e)){if(l.type==="ansi"){a+=l.value,i=!0;continue}let c=s+U(l.value);if(c>o)break;a+=l.value,s=c}return a+n+(i?"\x1B[0m":"")}function Ca(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function co(e,t){let n=Ca(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of zn(e)){let s=r+o.length;if(s>=n)return r;r=s}return r}function Zt(e,t){let n=Ca(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of zn(e)){let s=r+o.length;if(r>=n||n>r&&n<s)return s;r=s}return e.length}import cf from"chalk";import{createEmphasize as uf,common as df}from"emphasize";import ie from"chalk";var d={brand:ie.hex("#E67E4C"),user:ie.cyan,tool:ie.hex("#7FB3D5"),toolArg:ie.dim.white,thinking:ie.italic.hex("#9B8FB5"),success:ie.green,error:ie.red,warning:ie.yellow,plan:ie.hex("#9F7CE0"),meta:ie.blackBright,info:ie.hex("#5BA8FF"),heading:ie.bold.cyan,label:ie.dim,dim:ie.dim,bold:ie.bold,italic:ie.italic};var Aa={keyword:d.brand,built_in:d.brand,literal:d.brand,tag:d.brand,string:d.user,regexp:d.user,attr:d.user,comment:d.meta,meta:d.meta,quote:d.meta,number:d.warning,function:d.tool,title:d.tool,class:d.tool,"selector-tag":d.tool};var Ia=uf(df),pf=2048,mf=512,ff=32,Fe=new Map;function gf(e){let t=Fe.get(e);if(t!==void 0)return Fe.delete(e),Fe.set(e,t),t}function hf(e,t){if(Fe.has(e)&&Fe.delete(e),Fe.set(e,t),Fe.size>ff){let n=Fe.keys().next().value;n!==void 0&&Fe.delete(n)}}function Ma(e,t){if(cf.level===0||e.length>pf)return e;let n=e.length<mf,r=n?`${t} ${e}`:"";if(n){let s=gf(r);if(s!==void 0)return s}let o;try{if(!t||!Ia.registered(t))o=e;else{let s=Ia.highlight(t,e,Aa);o=typeof s?.value=="string"?s.value:e}}catch{o=e}return n&&hf(r,o),o}import yf from"wrap-ansi";function J(e,t){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let n=Math.floor(t);return yf(e,n,{hard:!1,trim:!1,wordWrap:!0})}function Ra(e){return U(e)}function bf(e,t,n){return Pa(e,t,n??"left")}function Ve(e,t={}){let n=kf.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(a){return a?a.map(i=>{switch(i.type){case"codespan":return d.user(i.text);case"strong":{let l=i;return d.bold(l.tokens?o(l.tokens):l.text)}case"em":{let l=i;return d.italic(l.tokens?o(l.tokens):l.text)}case"text":return i.text;case"link":{let l=i;return(l.tokens?o(l.tokens):l.text)+d.dim(` (${l.href})`)}default:return i.raw}}).join(""):""}function s(a){return a.map(i=>{switch(i.type){case"heading":{let l=i,c=l.tokens?o(l.tokens):l.text;return l.depth===1?d.bold(d.info(`
1527
+ ${Gg}`}import fr from"chalk";import{Lexer as oh}from"marked";import zg from"string-width";var No=/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,Tl=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function gt(e){return e.replace(No,"")}function N(e){return zg(e)}function mr(e){return e.length===0?[]:Tl?Array.from(Tl.segment(e),t=>t.segment):Array.from(e)}function Vg(e){let t=[],n=0,r;for(No.lastIndex=0;(r=No.exec(e))!==null;){if(r.index>n)for(let o of mr(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of mr(e.slice(n)))t.push({type:"text",value:o});return t}function de(e,t){let n=Math.max(0,t-N(e));return e+" ".repeat(n)}function qg(e,t){let n=Math.max(0,t-N(e));return" ".repeat(n)+e}function El(e,t,n="left"){let r=Math.max(0,t-N(e));if(r===0)return e;if(n==="right")return qg(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return de(e,t)}function Te(e,t,n="\u2026"){if(t<=0)return"";if(N(e)<=t)return e;let r=N(n),o=Math.max(0,t-r),s=0,a="",i=!1;for(let l of Vg(e)){if(l.type==="ansi"){a+=l.value,i=!0;continue}let c=s+N(l.value);if(c>o)break;a+=l.value,s=c}return a+n+(i?"\x1B[0m":"")}function Pl(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Uo(e,t){let n=Pl(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of mr(e)){let s=r+o.length;if(s>=n)return r;r=s}return r}function dn(e,t){let n=Pl(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of mr(e)){let s=r+o.length;if(r>=n||n>r&&n<s)return s;r=s}return e.length}import Yg from"chalk";import{createEmphasize as Jg,common as Xg}from"emphasize";import ce from"chalk";var d={brand:ce.hex("#E67E4C"),user:ce.cyan,tool:ce.hex("#7FB3D5"),toolArg:ce.dim.white,thinking:ce.italic.hex("#9B8FB5"),success:ce.green,error:ce.red,warning:ce.yellow,plan:ce.hex("#9F7CE0"),meta:ce.blackBright,info:ce.hex("#5BA8FF"),heading:ce.bold.cyan,label:ce.dim,dim:ce.dim,bold:ce.bold,italic:ce.italic};var Cl={keyword:d.brand,built_in:d.brand,literal:d.brand,tag:d.brand,string:d.user,regexp:d.user,attr:d.user,comment:d.meta,meta:d.meta,quote:d.meta,number:d.warning,function:d.tool,title:d.tool,class:d.tool,"selector-tag":d.tool};var Al=Jg(Xg),Qg=2048,Zg=512,eh=32,Ke=new Map;function th(e){let t=Ke.get(e);if(t!==void 0)return Ke.delete(e),Ke.set(e,t),t}function nh(e,t){if(Ke.has(e)&&Ke.delete(e),Ke.set(e,t),Ke.size>eh){let n=Ke.keys().next().value;n!==void 0&&Ke.delete(n)}}function Il(e,t){if(Yg.level===0||e.length>Qg)return e;let n=e.length<Zg,r=n?`${t} ${e}`:"";if(n){let s=th(r);if(s!==void 0)return s}let o;try{if(!t||!Al.registered(t))o=e;else{let s=Al.highlight(t,e,Cl);o=typeof s?.value=="string"?s.value:e}}catch{o=e}return n&&nh(r,o),o}import rh from"wrap-ansi";function q(e,t){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let n=Math.floor(t);return rh(e,n,{hard:!1,trim:!1,wordWrap:!0})}function _l(e){return N(e)}function sh(e,t,n){return El(e,t,n??"left")}function et(e,t={}){let n=oh.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(a){return a?a.map(i=>{switch(i.type){case"codespan":return d.user(i.text);case"strong":{let l=i;return d.bold(l.tokens?o(l.tokens):l.text)}case"em":{let l=i;return d.italic(l.tokens?o(l.tokens):l.text)}case"text":return i.text;case"link":{let l=i;return(l.tokens?o(l.tokens):l.text)+d.dim(` (${l.href})`)}default:return i.raw}}).join(""):""}function s(a){return a.map(i=>{switch(i.type){case"heading":{let l=i,c=l.tokens?o(l.tokens):l.text;return l.depth===1?d.bold(d.info(`
1407
1528
  `+c+`
1408
1529
  `)):l.depth===2?d.bold(d.user(`
1409
1530
  `+c+`
1410
1531
  `)):d.bold(c)}case"paragraph":return o(i.tokens)+`
1411
- `;case"code":{let l=i,c=l.lang||"text",p=Ma(l.text,c).split(`
1532
+ `;case"code":{let l=i,c=l.lang||"text",p=Il(l.text,c).split(`
1412
1533
  `);p.length>0&&p[p.length-1]===""&&p.pop();let m=d.dim("\u2502 "),f=p.map(y=>m+y).join(`
1413
1534
  `);return(l.lang?d.dim(`\u2502 ${l.lang}`)+`
1414
1535
  `:"")+f+`
@@ -1416,78 +1537,86 @@ ${of}`}import Vn from"chalk";import{Lexer as kf}from"marked";import sf from"stri
1416
1537
  `)}case"space":return`
1417
1538
  `;case"hr":return d.dim("\u2500".repeat(40));case"blockquote":{let l=i;return(l.tokens?s(l.tokens):l.text).split(`
1418
1539
  `).map(u=>d.dim(" \u2502 ")+u).join(`
1419
- `)}case"table":{let l=i,c=w=>w.tokens?o(w.tokens):w.text,u=l.header.map(c),p=l.rows.map(w=>w.map(c)),m=u.length,f=new Array(m).fill(0);for(let w=0;w<m;w++){let I=Ra(u[w]??"");for(let x of p)I=Math.max(I,Ra(x[w]??""));f[w]=I}let g=r??Number.POSITIVE_INFINITY,y=3*m+1,h=g>=y+m?1:0,k=Math.max(m*h,g-y),S=f.reduce((w,I)=>w+I,0);if(Number.isFinite(g)&&S>k){let w=f.slice(),I=w.reduce((x,E)=>x+Math.max(0,E-h),0);if(I>0){let x=S-k,E=Math.min(1,x/I);for(let P=0;P<w.length;P++){let C=Math.max(0,w[P]-h);w[P]=Math.max(h,w[P]-Math.round(C*E))}}for(let x=0;x<w.length;x++)f[x]=w[x]??f[x]??0}let b=l.align,A=(w,I,x)=>d.dim(w+f.map(E=>"\u2500".repeat(E+2)).join(I)+x),N=(w,I)=>I<=0?[""]:J(w,I).split(`
1420
- `).map(E=>ve(E,I)),$=(w,I=!1)=>{let x=w.map((C,M)=>N(I?d.bold(C):C,f[M]??0)),E=Math.max(1,...x.map(C=>C.length)),P=[];for(let C=0;C<E;C++)P.push(d.dim("\u2502")+x.map((M,Q)=>" "+bf(M[C]??"",f[Q]??0,b[Q]??null)+" ").join(d.dim("\u2502"))+d.dim("\u2502"));return P},v=[A("\u250C","\u252C","\u2510")];v.push(...$(u,!0)),v.push(A("\u251C","\u253C","\u2524"));for(let w=0;w<p.length;w++)v.push(...$(p[w])),w<p.length-1&&v.push(A("\u251C","\u253C","\u2524"));return v.push(A("\u2514","\u2534","\u2518")),v.join(`
1540
+ `)}case"table":{let l=i,c=b=>b.tokens?o(b.tokens):b.text,u=l.header.map(c),p=l.rows.map(b=>b.map(c)),m=u.length,f=new Array(m).fill(0);for(let b=0;b<m;b++){let C=_l(u[b]??"");for(let S of p)C=Math.max(C,_l(S[b]??""));f[b]=C}let g=r??Number.POSITIVE_INFINITY,y=3*m+1,h=g>=y+m?1:0,k=Math.max(m*h,g-y),v=f.reduce((b,C)=>b+C,0);if(Number.isFinite(g)&&v>k){let b=f.slice(),C=b.reduce((S,E)=>S+Math.max(0,E-h),0);if(C>0){let S=v-k,E=Math.min(1,S/C);for(let A=0;A<b.length;A++){let I=Math.max(0,b[A]-h);b[A]=Math.max(h,b[A]-Math.round(I*E))}}for(let S=0;S<b.length;S++)f[S]=b[S]??f[S]??0}let w=l.align,P=(b,C,S)=>d.dim(b+f.map(E=>"\u2500".repeat(E+2)).join(C)+S),K=(b,C)=>C<=0?[""]:q(b,C).split(`
1541
+ `).map(E=>Te(E,C)),F=(b,C=!1)=>{let S=b.map((I,_)=>K(C?d.bold(I):I,f[_]??0)),E=Math.max(1,...S.map(I=>I.length)),A=[];for(let I=0;I<E;I++)A.push(d.dim("\u2502")+S.map((_,Q)=>" "+sh(_[I]??"",f[Q]??0,w[Q]??null)+" ").join(d.dim("\u2502"))+d.dim("\u2502"));return A},T=[P("\u250C","\u252C","\u2510")];T.push(...F(u,!0)),T.push(P("\u251C","\u253C","\u2524"));for(let b=0;b<p.length;b++)T.push(...F(p[b])),b<p.length-1&&T.push(P("\u251C","\u253C","\u2524"));return T.push(P("\u2514","\u2534","\u2518")),T.join(`
1421
1542
  `)+`
1422
- `}default:return i.raw}}).join("")}return s(n)}var uo=class{useColors;constructor(t=!0){this.useColors=t&&!!Vn.level}formatMarkdown(t){return this.useColors?Ve(t):t}formatError(t,n){let r=d.error("\u2717 Error: ")+t;return n&&n.message&&(r+=`
1543
+ `}default:return i.raw}}).join("")}return s(n)}var jo=class{useColors;constructor(t=!0){this.useColors=t&&!!fr.level}formatMarkdown(t){return this.useColors?et(t):t}formatError(t,n){let r=d.error("\u2717 Error: ")+t;return n&&n.message&&(r+=`
1423
1544
  `+d.error(n.message)),n&&n.stack&&process.env.DEBUG&&(r+=`
1424
- `+d.dim(n.stack)),r}formatSuccess(t){return d.success("\u2713 ")+t}formatInfo(t){return d.info("\u2139 ")+t}formatWarning(t){return d.warning("\u26A0 ")+t}formatCommand(t){return d.dim(t)}formatPrompt(t){return d.bold(d.plan(`afk (${t})`))+d.dim(" \u203A ")}formatModelInfo(t,n,r){return d.dim(`Model: ${Vn.white(t)} | Max tokens: ${Vn.white(n)} | Temperature: ${Vn.white(r)}`)}separator(t="\u2500",n=50){return d.dim(t.repeat(n))}formatHelp(t){let n=[];for(let r of t){n.push(d.heading(`
1545
+ `+d.dim(n.stack)),r}formatSuccess(t){return d.success("\u2713 ")+t}formatInfo(t){return d.info("\u2139 ")+t}formatWarning(t){return d.warning("\u26A0 ")+t}formatCommand(t){return d.dim(t)}formatPrompt(t){return d.bold(d.plan(`afk (${t})`))+d.dim(" \u203A ")}formatModelInfo(t,n,r){return d.dim(`Model: ${fr.white(t)} | Max tokens: ${fr.white(n)} | Temperature: ${fr.white(r)}`)}separator(t="\u2500",n=50){return d.dim(t.repeat(n))}formatHelp(t){let n=[];for(let r of t){n.push(d.heading(`
1425
1546
  ${r.title}`)),n.push(this.separator());for(let o of r.items)n.push(` ${o}`)}return n.join(`
1426
- `)}formatStreaming(t){return this.useColors,t}},iP=new uo;import Tt from"chalk";var wf=new Set(["Read","Glob","Grep","NotebookRead","LS"]),Sf=new Set(["Write","Edit","NotebookEdit","MultiEdit"]),vf=new Set(["Bash","BashOutput","KillBash"]),Ye=new Set(["Agent","Task"]),xf=new Set(["Skill"]),Tf=new Set(["WebFetch","WebSearch"]),Ef=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]);function po(e){return e.startsWith("mcp__")?"mcp":wf.has(e)?"read":Sf.has(e)?"write":vf.has(e)?"shell":Ye.has(e)?"subagent":xf.has(e)?"skill":Tf.has(e)?"web":Ef.has(e)?"planning":"other"}var Pf={read:Tt.hex("#9CC4D6"),write:Tt.hex("#E8A33D"),shell:Tt.hex("#A8E060"),subagent:d.plan,skill:Tt.hex("#F08AC4"),mcp:Tt.hex("#5FE0C0"),web:Tt.hex("#7FCDC0"),planning:d.meta,other:d.info},Cf={read:"\u25CF",write:"\u270E",shell:"$",subagent:"\u2192",skill:"\u25C6",mcp:"\u22A1",web:"\u2316",planning:"\u25B1",other:"\u25CF"};function Af(e){return{color:Pf[e],glyph:Cf[e]}}function Et(e){return Af(po(e))}function _a(e){let{description:t,summary:n,lastToolName:r,totalTokens:o,toolUses:s,durationMs:a}=e,i=[];if(r){let{color:c,glyph:u}=Et(r);i.push(`via ${c(`${u} ${r}`)}`)}s&&i.push(`${s} tool${s===1?"":"s"}`),o&&i.push(`${L(o)} tok`),a&&i.push(Se(a));let l=i.length>0?` (${i.join(" \xB7 ")})`:"";return n?[d.dim(` \u25E6 ${t}`),d.dim(` ${n}${l}`)]:[d.dim(` \u25E6 ${t}${l}`)]}function Yn(e){let t=e.status==="succeeded"?"\u2713":e.status==="failed"?"\u2717":"\u2298",n=e.agentType??e.subagentId,r=[t,n];return e.durationMs!==void 0&&r.push(`\xB7 ${Se(e.durationMs)}`),d.dim(` ${r.join(" ")}`)}function If(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 qe=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??en;if(n>=r)return{content:`Skill tool not available at nesting depth ${n} (max ${r})`,isError:!0};let o;try{o=If(t.input)}catch(l){return{content:`Skill tool input validation failed: ${l instanceof Error?l.message:String(l)}`,isError:!0}}try{let l=se(o.name);return await this.executeRegistrySkill(l,o.arguments,t.signal)}catch{}let s=this.getPluginSkillBody(o.name);if(s)return await this.executePluginSkill(o.name,s,o.arguments,t.signal);let i=Jt(this.ctx.pluginConfigs).map(l=>l.name).join(", ");return{content:`Skill "${o.name}" not found. Available skills: ${i||"(none)"}`,isError:!0}}async executeRegistrySkill(t,n,r){if(r.aborted)return{content:"Skill call aborted",isError:!0};if(t.context==="fork")return this.executeForkedRegistrySkill(t,n,r);try{let o=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});return{content:typeof o=="string"?o:o!=null?JSON.stringify(o):"Skill completed successfully."}}catch(o){return{content:`Skill execution error: ${o instanceof Error?o.message:String(o)}`,isError:!0}}}async executeForkedRegistrySkill(t,n,r){if(r.aborted)return{content:"Skill call aborted",isError:!0};let o;try{if(o=Y(t.name)["system.md"],!o)return{content:`Skill "${t.name}" has context: "fork" but no prompts/system.md found`,isError:!0}}catch(a){return{content:`Failed to load skill prompts: ${a instanceof Error?a.message:String(a)}`,isError:!0}}let s=new _({parentAbortSignal:r,apiKey:this.ctx.apiKey,progressSink:$e()});try{let a=await s.forkSubagent({parent:this.ctx.parentSession,config:{model:t.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",systemPrompt:o},idPrefix:`skill-fork-${t.name}`}),i=n&&n.length>0?n:"Run the skill.",l=await a.runToResult(i);return l.status==="succeeded"&&l.message?{content:l.message.content}:{content:l.error?.message??"Forked skill failed with no output",isError:!0}}catch(a){return{content:`Forked skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}finally{await s.teardownAll()}}async executePluginSkill(t,n,r,o){if(o.aborted)return{content:"Skill call aborted",isError:!0};let s=new _({parentAbortSignal:o,apiKey:this.ctx.apiKey,progressSink:$e()});try{let a=await s.forkSubagent({parent:this.ctx.parentSession,config:{model:this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",systemPrompt:n},idPrefix:`skill-${t}`}),i=r&&r.length>0?r:"Run the skill.",l=await a.runToResult(i);return l.status==="succeeded"&&l.message?{content:l.message.content}:{content:l.error?.message??"Plugin skill failed with no output",isError:!0}}catch(a){return{content:`Plugin skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}finally{await s.teardownAll()}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=Fn(this.ctx.pluginConfigs)),this.pluginBodies.get(t)}};var en=3;function mo(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}var Mf=[...We,"agent","skill"];function qn(){return({childExecutor:e,childSkillExecutor:t})=>new we({permissions:{allowedTools:Mf},subagentExecutor:e,skillExecutor:t})}function Jn(e,t){return(n,r,o)=>new qe({parentSession:mo(o),defaultModel:e,apiKey:t,depth:n,maxDepth:r})}function Rf(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,a=t.max_turns;if(a!==void 0){if(typeof a!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(a)))}let i="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");i=l}return{prompt:n,model:r,max_turns:s,id_prefix:i}}var Pt=class e{constructor(t){this.ctx=t}ctx;async execute(t){if(t.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=Rf(t.input)}catch(c){return{content:`Agent tool input validation failed: ${c instanceof Error?c.message:String(c)}`,isError:!0}}let r=this.ctx.depth??0,o=this.ctx.maxDepth??en,s,a={model:n.model??this.ctx.defaultSubagentModel??"sonnet",apiKey:this.ctx.defaultConfig.apiKey,systemPrompt:this.ctx.defaultConfig.systemPrompt,maxTurns:n.max_turns};if(this.ctx.childProviderFactory&&r<o){s=new _({parentAbortSignal:t.signal});let c=new e({subagentManager:s,parentSession:mo(t.signal),defaultConfig:this.ctx.defaultConfig,defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,depth:r+1,maxDepth:o}),u=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,t.signal):void 0;a.provider=this.ctx.childProviderFactory({childExecutor:c,childSkillExecutor:u})}let i;try{i=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,config:a,idPrefix:n.id_prefix})}catch(c){return{content:`Failed to fork subagent: ${c instanceof Error?c.message:String(c)}`,isError:!0}}let l=()=>{i.cancel()};t.signal.addEventListener("abort",l,{once:!0});try{let c=await i.runToResult(n.prompt);return c.status==="succeeded"&&c.message?{content:c.message.content}:{content:c.error?.message??"Subagent failed with no output",isError:!0}}finally{t.signal.removeEventListener("abort",l),await s?.teardownAll(),await i.teardown()}}};function $a(e){e.command("chat").description("Send a message to the agent").argument("<message>","Message to send").option("-m, --model <model>","Model to use. Short aliases: opus|opus_1m|sonnet|sonnet_1m|haiku. Any other value (e.g. `auto` for cursor-api-proxy, or a full `claude-*` ID) passes through to the SDK/proxy untouched.",be()).option("-s, --stream","Stream the response",!1).option("-f, --format <format>","Output format (text|json)","text").option("--max-turns <number>","Maximum conversation turns","10").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'","adaptive").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-budget-usd <usd>","Hard session cost ceiling in USD. Env: AFK_MAX_BUDGET_USD").option("--task-budget <tokens>","Soft per-task token budget. Env: AFK_TASK_BUDGET").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai-codex. Default: auto-selected by model").action(async(t,n)=>{let r=_f("Initializing agent...").start(),o=null;try{let s,a,i,l,c,u;try{s=Ke(n.thinking)??yt(),a=Ge(n.effort)??kt(),i=bt(n.maxBudgetUsd)??qr(),l=bt(n.taskBudget)??Jr(),c=wt(n.maxOutputTokens)??Yt(),u=void 0}catch(v){r.fail("Invalid options"),console.error(tn.red(v instanceof Error?v.message:String(v))),process.exit(1)}let p=H(),m=Dn()??On(),g=gt().autoRouting?.chat??!1,y=Gn(m,g),h,k=new _({apiKey:p}),S=qn(),b={get sessionId(){return h?.sessionId},getInputStreamRef(){return h?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return h?.abortSignal??new AbortController().signal}},A=new Pt({subagentManager:k,parentSession:b,defaultConfig:{apiKey:p,systemPrompt:m},defaultSubagentModel:ht(),childProviderFactory:S,childSkillExecutorFactory:Jn(n.model,p)}),N=new qe({parentSession:b,defaultModel:n.model,defaultSubagentModel:ht(),apiKey:p});u=Ln(n.provider,{subagentExecutor:A,skillExecutor:N})??new we({permissions:{allowedTools:[...We,"agent","skill"]},subagentExecutor:A,skillExecutor:N}),o=new de({model:n.model,apiKey:p,maxTurns:parseInt(n.maxTurns,10),hookRegistry:xt(v=>{console.log(Yn(v))}),...y!==void 0?{systemPrompt:y}:{},...s!==void 0?{thinking:s}:{},...a!==void 0?{effort:a}:{},...i!==void 0?{maxBudgetUsd:i}:{},...l!==void 0?{taskBudget:l}:{},...c!==void 0?{maxOutputTokens:c}:{},provider:u}),h=o,r.text="Sending message...";let $=await o.sendMessage(t,{stream:n.stream});if(r.succeed("Response received"),n.format==="json")console.log(JSON.stringify({success:!0,model:n.model,message:$.content,timestamp:$.timestamp},null,2));else{console.log(tn.cyan(`
1427
- \u{1F916} Claude:`)),console.log(Ve($.content));let v=o.getLastResponseMetadata();if(v){let w=[];v.durationMs&&w.push(Se(v.durationMs)),v.totalCostUsd!==void 0&&w.push(me(v.totalCostUsd));let I=Number(v.usage?.input_tokens??0),x=Number(v.usage?.output_tokens??0);I+x>0&&w.push(L(I+x)+" tokens"),w.length>0&&console.log(tn.dim(" \xB7 "+w.join(" \xB7 ")))}console.log("")}}catch(s){r.fail("Failed to send message"),console.error(tn.red(s instanceof Error?s.message:"Unknown error")),s instanceof Error&&s.stack&&console.error(tn.gray(s.stack)),process.exit(1)}finally{o&&await o.close()}})}import tk from"ora";function z(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var Xn=new Set,Qn=!1,lt=null;function $f(){for(let e of Xn)try{e()}catch{}}function Of(){lt!==null&&clearTimeout(lt),lt=setTimeout(()=>{lt=null,$f()},150)}function Oa(){Of()}function Df(e){return Xn.add(e),Qn||(process.stdout.on("resize",Oa),Qn=!0),()=>{Xn.delete(e),Xn.size===0&&(Qn&&(process.stdout.off("resize",Oa),Qn=!1),lt!==null&&(clearTimeout(lt),lt=null))}}var Ct={subscribe:Df};function Zn(){return Math.max(22,z()-6)}function Da(e,t){return ve(e,t)}var Lf={ok:d.success("\u25CF"),warn:d.warning("\u25CF"),error:d.error("\u25CF"),info:d.info("\u25C6")};function La(e,t){let o=t.reduce((b,A)=>Math.max(b,U(A.label)),0),s=t.reduce((b,A)=>Math.max(b,U(A.value)),0),a=o+4+2+s,i=Math.min(z()-4,100),l=Math.max(44,U(e),a,i);l=Math.min(l,Zn());let c=l+4,u=d.dim,p=u("\u256D"+"\u2500".repeat(c)+"\u256E"),m=u("\u251C"+"\u2500".repeat(c)+"\u2524"),f=u("\u2570"+"\u2500".repeat(c)+"\u256F"),g=u("\u2502"),h=J(e,l).split(`
1428
- `).map(b=>g+" "+ce(b,l)+" "+g),k=Math.max(1,l-o-4-2),S=t.map(b=>{let A=b.kind?Lf[b.kind]+" ":" ",N=d.dim(ce(Da(b.label,o),o)),$=" ".repeat(4),v=Da(b.value,k),w=ce(v,k),I=N+$+A+w;return g+" "+I+" "+g});return[p,...h,m,...S,f].join(`
1429
- `)}function Fa(e){let t="Agent AFK",n=" \xB7 ",r=d.bold(t)+d.dim(n)+e.mode,o=t+n+e.mode,s=Math.min(z()-4,120),a=Math.max(54,U(o)+4,s);a=Math.min(a,Zn());let i=a+4,l=d.dim,c=l("\u256D"+"\u2500".repeat(i)+"\u256E"),p=J(r,a).split(`
1430
- `).map(g=>l("\u2502")+" "+ce(g,a)+" "+l("\u2502")),m=l("\u2570"+"\u2500".repeat(i)+"\u256F"),f=[c,...p,m];return e.metaLine!==void 0&&f.push(...J(d.dim(" "+e.metaLine),z()).split(`
1431
- `)),e.hintLine!==void 0&&f.push(...J(d.dim(" "+e.hintLine),z()).split(`
1547
+ `)}formatStreaming(t){return this.useColors,t}},jA=new jo;import Mt from"chalk";var ih=new Set(["Read","Glob","Grep","NotebookRead","LS"]),ah=new Set(["Write","Edit","NotebookEdit","MultiEdit"]),lh=new Set(["Bash","BashOutput","KillBash"]),tt=new Set(["Agent","Task"]),ch=new Set(["Skill"]),uh=new Set(["WebFetch","WebSearch"]),dh=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]);function Ho(e){return e.startsWith("mcp__")?"mcp":ih.has(e)?"read":ah.has(e)?"write":lh.has(e)?"shell":tt.has(e)?"subagent":ch.has(e)?"skill":uh.has(e)?"web":dh.has(e)?"planning":"other"}var ph={read:Mt.hex("#9CC4D6"),write:Mt.hex("#E8A33D"),shell:Mt.hex("#A8E060"),subagent:d.plan,skill:Mt.hex("#F08AC4"),mcp:Mt.hex("#5FE0C0"),web:Mt.hex("#7FCDC0"),planning:d.meta,other:d.info},mh={read:"\u25CF",write:"\u270E",shell:"$",subagent:"\u2192",skill:"\u25C6",mcp:"\u22A1",web:"\u2316",planning:"\u25B1",other:"\u25CF"};function fh(e){return{color:ph[e],glyph:mh[e]}}function $t(e){return fh(Ho(e))}function Rl(e){let{description:t,summary:n,lastToolName:r,totalTokens:o,toolUses:s,durationMs:a}=e,i=[];if(r){let{color:c,glyph:u}=$t(r);i.push(`via ${c(`${u} ${r}`)}`)}s&&i.push(`${s} tool${s===1?"":"s"}`),o&&i.push(`${D(o)} tok`),a&&i.push(xe(a));let l=i.length>0?` (${i.join(" \xB7 ")})`:"";return n?[d.dim(` \u25E6 ${t}`),d.dim(` ${n}${l}`)]:[d.dim(` \u25E6 ${t}${l}`)]}function gr(e){let t=e.status==="succeeded"?"\u2713":e.status==="failed"?"\u2717":"\u2298",n=e.agentType??e.subagentId,r=[t,n];return e.durationMs!==void 0&&r.push(`\xB7 ${xe(e.durationMs)}`),d.dim(` ${r.join(" ")}`)}function gh(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 hh(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 nt=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??pn;if(n>=r){let l=gh(t.input);return qe({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=hh(t.input)}catch(l){return{content:`Skill tool input validation failed: ${l instanceof Error?l.message:String(l)}`,isError:!0}}try{let l=le(o.name);return await this.executeRegistrySkill(l,o.arguments,t.signal)}catch{}let s=this.getPluginSkillBody(o.name);if(s)return await this.executePluginSkill(o.name,s,o.arguments,t.signal);let i=sn(this.ctx.pluginConfigs).map(l=>l.name).join(", ");return{content:`Skill "${o.name}" not found. Available skills: ${i||"(none)"}`,isError:!0}}async executeRegistrySkill(t,n,r){if(r.aborted)return{content:"Skill call aborted",isError:!0};if(t.context==="fork")return this.executeForkedRegistrySkill(t,n,r);try{let o=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});return{content:typeof o=="string"?o:o!=null?JSON.stringify(o):"Skill completed successfully."}}catch(o){return{content:`Skill execution error: ${o instanceof Error?o.message:String(o)}`,isError:!0}}}async executeForkedRegistrySkill(t,n,r){if(r.aborted)return{content:"Skill call aborted",isError:!0};let o;try{if(o=Y(t.name)["system.md"],!o)return{content:`Skill "${t.name}" has context: "fork" but no prompts/system.md found`,isError:!0}}catch(a){return{content:`Failed to load skill prompts: ${a instanceof Error?a.message:String(a)}`,isError:!0}}let s=new M({parentAbortSignal:r,apiKey:this.ctx.apiKey,progressSink:Ue()});try{let a=await s.forkSubagent({parent:this.ctx.parentSession,config:{model:t.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",systemPrompt:o},idPrefix:`skill-fork-${t.name}`}),i=n&&n.length>0?n:"Run the skill.",l=await a.runToResult(i);return l.status==="succeeded"&&l.message?{content:l.message.content}:{content:l.error?.message??"Forked skill failed with no output",isError:!0}}catch(a){return{content:`Forked skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}finally{await s.teardownAll()}}async executePluginSkill(t,n,r,o){if(o.aborted)return{content:"Skill call aborted",isError:!0};let s=new M({parentAbortSignal:o,apiKey:this.ctx.apiKey,progressSink:Ue()});try{let a=await s.forkSubagent({parent:this.ctx.parentSession,config:{model:this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",systemPrompt:n},idPrefix:`skill-${t}`}),i=r&&r.length>0?r:"Run the skill.",l=await a.runToResult(i);return l.status==="succeeded"&&l.message?{content:l.message.content}:{content:l.error?.message??"Plugin skill failed with no output",isError:!0}}catch(a){return{content:`Plugin skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}finally{await s.teardownAll()}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=er(this.ctx.pluginConfigs)),this.pluginBodies.get(t)}};var pn=3;function Bo(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}var yh=[...Xe,"agent","skill"];function hr(){return({childExecutor:e,childSkillExecutor:t})=>new Se({permissions:{allowedTools:yh},subagentExecutor:e,skillExecutor:t})}function yr(e,t){return(n,r,o)=>new nt({parentSession:Bo(o),defaultModel:e,apiKey:t,depth:n,maxDepth:r})}function bh(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,a=t.max_turns;if(a!==void 0){if(typeof a!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(a)))}let i="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");i=l}return{prompt:n,model:r,max_turns:s,id_prefix:i}}function Wo(e){try{return qe(e).catch(()=>{})}catch{return Promise.resolve()}}function mn(e,t=240){return e.length<=t?e:e.slice(0,t)+"\u2026"}function $l(e){if(e!=null){if(typeof e=="string")return e.length;try{return JSON.stringify(e).length}catch{return}}}var kh=4096,Ml=1024;function wh(e){if(e==null)return;let t=$l(e);return t!==void 0&&t>kh?{truncated:!0,chars:t}:e}function Sh(e){let t={status:e.status,error:mn(e.errorMessage,Ml),subagent_id:e.subagentId};e.schemaErrorMessage&&(t.schemaError=mn(e.schemaErrorMessage,Ml));let n=wh(e.partialOutput);return n!==void 0&&(t.partialOutput=n),t}var Ot=class e{constructor(t){this.ctx=t}ctx;async execute(t){if(t.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=bh(t.input)}catch(p){return{content:`Agent tool input validation failed: ${p instanceof Error?p.message:String(p)}`,isError:!0}}let r=this.ctx.depth??0,o=this.ctx.maxDepth??pn,s,a={model:n.model??this.ctx.defaultSubagentModel??"sonnet",apiKey:this.ctx.defaultConfig.apiKey,systemPrompt:this.ctx.defaultConfig.systemPrompt,maxTurns:n.max_turns};if(this.ctx.childProviderFactory&&r<o){s=new M({parentAbortSignal:t.signal});let p=new e({subagentManager:s,parentSession:Bo(t.signal),defaultConfig:this.ctx.defaultConfig,defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,depth:r+1,maxDepth:o}),m=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,t.signal):void 0;a.provider=this.ctx.childProviderFactory({childExecutor:p,childSkillExecutor:m})}let i;try{i=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,config:a,idPrefix:n.id_prefix})}catch(p){return{content:`Failed to fork subagent: ${p instanceof Error?p.message:String(p)}`,isError:!0}}let l=()=>{i.cancel()};t.signal.addEventListener("abort",l,{once:!0});let c=Date.now(),u=this.ctx.parentSession.sessionId;try{let p=await i.runToResult(n.prompt);if(p.status==="succeeded"&&p.message){let g=p.message.content;return Wo({event:"subagent.completed",subagent_id:i.id,parent_session_id:u,status:p.status,duration_ms:Date.now()-c,content_chars:typeof g=="string"?g.length:void 0,depth:r}),{content:g}}let m=p.error?.message??"Subagent failed with no output";Wo({event:"subagent.failed",subagent_id:i.id,parent_session_id:u,status:p.status,duration_ms:Date.now()-c,error_message:mn(m),schema_error:p.schemaError?mn(p.schemaError.message):void 0,partial_output_chars:$l(p.partialOutput),depth:r});let f=Sh({status:p.status,errorMessage:m,schemaErrorMessage:p.schemaError?.message,partialOutput:p.partialOutput,subagentId:i.id});return{content:JSON.stringify(f),isError:!0}}catch(p){let m=p instanceof Error?p.message:String(p);throw Wo({event:"subagent.failed",subagent_id:i.id,parent_session_id:u,status:"failed",duration_ms:Date.now()-c,error_message:mn(m),depth:r}),p}finally{t.signal.removeEventListener("abort",l),await s?.teardownAll(),await i.teardown()}}};function Ll(e){e.command("chat").description("Send a message to the agent").argument("<message>","Message to send").option("-m, --model <model>","Model to use. Short aliases: opus|opus_1m|sonnet|sonnet_1m|haiku. Any other value (e.g. `auto` for cursor-api-proxy, or a full `claude-*` ID) passes through to the SDK/proxy untouched.",we()).option("-s, --stream","Stream the response",!1).option("-f, --format <format>","Output format (text|json)","text").option("--max-turns <number>","Maximum conversation turns","10").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'","adaptive").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-budget-usd <usd>","Hard session cost ceiling in USD. Env: AFK_MAX_BUDGET_USD").option("--task-budget <tokens>","Soft per-task token budget. Env: AFK_TASK_BUDGET").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai-codex. Default: auto-selected by model").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').action(async(t,n)=>{let r=vh("Initializing agent...").start(),o=null,s;try{let a,i,l,c,u,p;try{a=Qe(n.thinking)??Et(),i=Ze(n.effort)??Pt(),l=Ct(n.maxBudgetUsd)??So(),c=Ct(n.taskBudget)??vo(),u=At(n.maxOutputTokens)??rn(),p=void 0}catch(b){r.fail("Invalid options"),console.error(fn.red(b instanceof Error?b.message:String(b))),process.exit(1)}if(n.dumpPrompt!==void 0){let b=n.dumpPrompt===!0?Dl.join(Ol.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=b,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 m=B(),f=Qn()??Xn(),y=xt().autoRouting?.chat??!1,h=pr(f,y),k,v=new M({apiKey:m}),w=hr(),P={get sessionId(){return k?.sessionId},getInputStreamRef(){return k?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return k?.abortSignal??new AbortController().signal}},K=new Ot({subagentManager:v,parentSession:P,defaultConfig:{apiKey:m,systemPrompt:f},defaultSubagentModel:Tt(),childProviderFactory:w,childSkillExecutorFactory:yr(n.model,m)}),F=new nt({parentSession:P,defaultModel:n.model,defaultSubagentModel:Tt(),apiKey:m});s=new Ie,p=Zn(n.provider,{subagentExecutor:K,skillExecutor:F})??new Se({permissions:{allowedTools:[...Xe,"agent","skill"]},subagentExecutor:K,skillExecutor:F,memoryStore:s,surface:"cli"}),o=new me(ft({model:n.model,apiKey:m,maxTurns:parseInt(n.maxTurns,10),hookRegistry:Rt(b=>{console.log(gr(b))},"cli",s).registry,...h!==void 0?{systemPrompt:h}:{},...a!==void 0?{thinking:a}:{},...i!==void 0?{effort:i}:{},...l!==void 0?{maxBudgetUsd:l}:{},...c!==void 0?{taskBudget:c}:{},...u!==void 0?{maxOutputTokens:u}:{},provider:p})),k=o,r.text="Sending message...";let T=await o.sendMessage(t,{stream:n.stream});if(r.succeed("Response received"),n.format==="json")console.log(JSON.stringify({success:!0,model:n.model,message:T.content,timestamp:T.timestamp},null,2));else{console.log(fn.cyan(`
1548
+ \u{1F916} Claude:`)),console.log(et(T.content));let b=o.getLastResponseMetadata();if(b){let C=[];b.durationMs&&C.push(xe(b.durationMs)),b.totalCostUsd!==void 0&&C.push(ge(b.totalCostUsd));let S=Number(b.usage?.input_tokens??0),E=Number(b.usage?.output_tokens??0);S+E>0&&C.push(D(S+E)+" tokens"),C.length>0&&console.log(fn.dim(" \xB7 "+C.join(" \xB7 ")))}console.log("")}}catch(a){r.fail("Failed to send message"),console.error(fn.red(a instanceof Error?a.message:"Unknown error")),a instanceof Error&&a.stack&&console.error(fn.gray(a.stack)),process.exit(1)}finally{o&&await o.close(),s?.close()}})}import zk from"ora";import*as Fu from"node:os";import*as Nu from"node:path";function V(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var kr=new Set,br=!1,ht=null;function xh(){for(let e of kr)try{e()}catch{}}function Th(){ht!==null&&clearTimeout(ht),ht=setTimeout(()=>{ht=null,xh()},150)}function Fl(){Th()}function Eh(e){return kr.add(e),br||(process.stdout.on("resize",Fl),br=!0),()=>{kr.delete(e),kr.size===0&&(br&&(process.stdout.off("resize",Fl),br=!1),ht!==null&&(clearTimeout(ht),ht=null))}}var Dt={subscribe:Eh};function wr(){return Math.max(22,V()-6)}function Nl(e,t){return Te(e,t)}var Ph={ok:d.success("\u25CF"),warn:d.warning("\u25CF"),error:d.error("\u25CF"),info:d.info("\u25C6")};function Ul(e,t){let o=t.reduce((w,P)=>Math.max(w,N(P.label)),0),s=t.reduce((w,P)=>Math.max(w,N(P.value)),0),a=o+4+2+s,i=Math.min(V()-4,100),l=Math.max(44,N(e),a,i);l=Math.min(l,wr());let c=l+4,u=d.dim,p=u("\u256D"+"\u2500".repeat(c)+"\u256E"),m=u("\u251C"+"\u2500".repeat(c)+"\u2524"),f=u("\u2570"+"\u2500".repeat(c)+"\u256F"),g=u("\u2502"),h=q(e,l).split(`
1549
+ `).map(w=>g+" "+de(w,l)+" "+g),k=Math.max(1,l-o-4-2),v=t.map(w=>{let P=w.kind?Ph[w.kind]+" ":" ",K=d.dim(de(Nl(w.label,o),o)),F=" ".repeat(4),T=Nl(w.value,k),b=de(T,k),C=K+F+P+b;return g+" "+C+" "+g});return[p,...h,m,...v,f].join(`
1550
+ `)}function jl(e){let t="Agent AFK",n=" \xB7 ",r=d.bold(t)+d.dim(n)+e.mode,o=t+n+e.mode,s=Math.min(V()-4,120),a=Math.max(54,N(o)+4,s);a=Math.min(a,wr());let i=a+4,l=d.dim,c=l("\u256D"+"\u2500".repeat(i)+"\u256E"),p=q(r,a).split(`
1551
+ `).map(g=>l("\u2502")+" "+de(g,a)+" "+l("\u2502")),m=l("\u2570"+"\u2500".repeat(i)+"\u256F"),f=[c,...p,m];return e.metaLine!==void 0&&f.push(...q(d.dim(" "+e.metaLine),V()).split(`
1552
+ `)),e.hintLine!==void 0&&f.push(...q(d.dim(" "+e.hintLine),V()).split(`
1432
1553
  `)),f.join(`
1433
- `)}function nn(e,t){let n=Math.max(40,U(e),U(t??""))+4,r=Math.min(n,Math.min(z()-4,100));r=Math.min(r,Zn());let o=d.error,s=d.bold(d.error(" Error ")),i="\u2500".repeat(r+4-1-U(" Error ")-1),l=o("\u256D\u2500")+s+o(i+"\u256E"),c=o("\u2570"+"\u2500".repeat(r+4)+"\u256F"),u=o("\u2502"),p=J(e,r).split(`
1434
- `),m=[l];for(let f of p)m.push(u+" "+ce(f,r)+" "+u);if(t!==void 0){let f=J(d.dim(t),r).split(`
1435
- `);for(let g of f)m.push(u+" "+ce(g,r)+" "+u)}return m.push(c),m.join(`
1436
- `)}var Ff={plan:d.plan,status:d.info,checkpoint:d.success,diagnosis:d.warning},Nf={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"};function At(e){let t=Array.isArray(e.body)?e.body:e.body.split(`
1437
- `);if(e.kind==="user")return Uf(t);let n=e.title??Nf[e.kind];return jf(e.kind,n,t)}function Uf(e){let t=Math.max(20,z()-4),n=[];for(let o of e)n.push(...J(o,t).split(`
1554
+ `)}function gn(e,t){let n=Math.max(40,N(e),N(t??""))+4,r=Math.min(n,Math.min(V()-4,100));r=Math.min(r,wr());let o=d.error,s=d.bold(d.error(" Error ")),i="\u2500".repeat(r+4-1-N(" Error ")-1),l=o("\u256D\u2500")+s+o(i+"\u256E"),c=o("\u2570"+"\u2500".repeat(r+4)+"\u256F"),u=o("\u2502"),p=q(e,r).split(`
1555
+ `),m=[l];for(let f of p)m.push(u+" "+de(f,r)+" "+u);if(t!==void 0){let f=q(d.dim(t),r).split(`
1556
+ `);for(let g of f)m.push(u+" "+de(g,r)+" "+u)}return m.push(c),m.join(`
1557
+ `)}var Ch={plan:d.plan,status:d.info,checkpoint:d.success,diagnosis:d.warning},Ah={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"};function Lt(e){let t=Array.isArray(e.body)?e.body:e.body.split(`
1558
+ `);if(e.kind==="user")return Ih(t);let n=e.title??Ah[e.kind];return _h(e.kind,n,t)}function Ih(e){let t=Math.max(20,V()-4),n=[];for(let o of e)n.push(...q(o,t).split(`
1438
1559
  `));let r=d.user("\u2502");return n.map(o=>r+" "+o).join(`
1439
- `)}function jf(e,t,n){let r=Ff[e],o=` ${t} `,s=r.bold(o),a=Math.max(U(t)+4,...n.map(g=>U(g))),i=Math.max(40,a)+4,l=Math.min(i,Math.min(z()-4,100));l=Math.min(l,Zn());let c="\u2500".repeat(l+4-1-U(o)-1),u=r("\u256D\u2500")+s+r(c+"\u256E"),p=r("\u2570"+"\u2500".repeat(l+4)+"\u256F"),m=r("\u2502"),f=[u];for(let g of n){let y=J(g,l).split(`
1440
- `);for(let h of y)f.push(m+" "+ce(h,l)+" "+m)}return f.push(p),f.join(`
1441
- `)}function ee(e){let t=Math.min(z(),120);if(e===void 0)return d.dim("\u2500".repeat(t));let n=d.dim("\u2500\u2500")+" "+d.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-U(r));return n+d.dim("\u2500".repeat(o))}var er=new Set;function rn(e){return er.add(e),()=>{er.delete(e)}}async function Na(){await Promise.all([...er].map(e=>e())),er.clear()}import{readFileSync as Bf,writeFileSync as Hf,existsSync as fo,mkdirSync as Wf,readdirSync as Kf,statSync as Gf}from"fs";import{join as Ua,basename as zf}from"path";function go(){return ls(),jt()}function ja(e){return Ua(go(),`${e}.json`)}function tr(e,t){let n=go();fo(n)||Wf(n,{recursive:!0});let r=t??e.sessionId??`session-${Date.now()}`,o={sessionId:e.sessionId,model:e.model,startedAt:e.sessionStartTime,savedAt:Date.now(),totalTurns:e.totalTurns,totalCostUsd:e.totalCostUsd,totalTokens:e.totalTokens,totalDurationMs:e.totalDurationMs,turns:e.turns},s=ja(r);return Hf(s,JSON.stringify(o,null,2)),s}function ho(e){let t=e.includes("/")?e:ja(e);if(fo(t))try{let n=Bf(t,"utf-8");return JSON.parse(n)}catch{return}}function Ba(){let e=go();if(!fo(e))return[];let t=[];for(let n of Kf(e)){if(!n.endsWith(".json"))continue;let r=Ua(e,n);try{if(!Gf(r).isFile())continue;let s=ho(r);if(!s||typeof s.savedAt!="number"||typeof s.model!="string")continue;t.push({path:r,id:zf(n,".json"),sessionId:s.sessionId,model:s.model,startedAt:s.startedAt,savedAt:s.savedAt,totalTurns:s.totalTurns,totalCostUsd:s.totalCostUsd})}catch{}}return t.sort((n,r)=>r.savedAt-n.savedAt),t}import*as ac from"node:readline";function Ha(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?d.error:t>.5?d.warning:d.meta,r=20,o=Math.round(t*r),s=r-o,a="["+"\u2588".repeat(o)+"\u2591".repeat(s)+"]",i=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=L(e.used)+"/"+L(e.limit));let c=l?`${a} ${i} ${l}`:`${a} ${i}`,u=`${a} ${i}`,p=`ctx ${i}`,m=e.sparkline?d.meta(e.sparkline)+" ":"",f=e.sparkline?U(e.sparkline)+1:0,g=Math.max(0,e.width-f);if(U(c)<=g&&g>90)return m+n(c);if(U(u)<=g&&g>32)return m+n(u);if(U(p)<=g)return m+n(p);if(e.width>0){let y=m+n(p);return ve(y,e.width)}return n(i)}var nr=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;lastPaintedRow=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=Ct.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)}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()}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(n.push(d.brand(t.model)),t.planMode&&n.push(d.warning("\u25CF plan")),t.contextPct!==void 0){let s=Ha({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push(s)}t.cost!==void 0&&n.push(d.meta(`$${t.cost.toFixed(2)}`)),t.tokens!==void 0&&n.push(d.meta(`${Vf(t.tokens)} tok`));let o=n.join(d.dim(" \xB7 "));return ve(o,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){if(t>1){this.stream.write(`\x1B[1;${t-1}r`);return}this.stream.write("\x1B[r")}};function Vf(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}var xe=new Map,ct=new Map;function re(e){if(xe.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);xe.set(e.name,e);for(let t of e.aliases??[]){if(ct.has(t)||xe.has(t))throw new Error(`Slash alias collides: ${t}`);ct.set(t,e.name)}}function Je(e){if(xe.has(e.name)){for(let[t,n]of ct.entries())n===e.name&&ct.delete(t);xe.delete(e.name)}re(e)}function Wa(){xe.clear(),ct.clear()}function Ne(){return[...xe.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Ka(){let e=[];for(let[t,n]of ct.entries()){let r=xe.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function Yf(e){if(xe.has(e))return xe.get(e);let t=ct.get(e);return t?xe.get(t):void 0}function qf(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 Jf(e,t=3){let n;for(let r of xe.keys()){let o=qf(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function Qf(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 Ga(e,t){let n=Qf(e);if(n===null)return{handled:!1};let r=Yf(n.name);if(!r){let s=Jf(n.name);return s?t.out.warn(`Unknown command: ${n.name} (did you mean ${s}?)`):t.out.warn(`Unknown command: ${n.name} (type /help for commands)`),{handled:!0,result:"continue"}}let o=await r.handler(t,n.args);return o==="forward"?{handled:!1}:{handled:!0,result:o}}import eg from"ora";function za(e){return{totalTurns:0,totalCostUsd:0,totalTokens:0,totalDurationMs:0,sessionStartTime:Date.now(),turnCosts:[],turnTokens:[],turns:[],model:e,planMode:!1}}function Va(e){e.totalTurns=0,e.totalCostUsd=0,e.totalTokens=0,e.totalDurationMs=0,e.sessionStartTime=Date.now(),e.turnCosts.length=0,e.turnTokens.length=0,e.turns.length=0,delete e.sessionId}function Ya(e,t,n,r){let o=r?.totalCostUsd??0,s=r?.durationMs??0,a=Number(r?.usage?.input_tokens??0),i=Number(r?.usage?.output_tokens??0),l=a,c=i,u=Number(r?.usage?.cache_read_input_tokens??0)+Number(r?.usage?.cache_creation_input_tokens??0),p=r?.usage?.iterations;if(Array.isArray(p)&&p.length>0){let f=p[p.length-1];if(f&&typeof f=="object"){let g=f;l=Number(g.input_tokens??0),c=Number(g.output_tokens??0),u=Number(g.cache_read_input_tokens??0)+Number(g.cache_creation_input_tokens??0)}}e.totalTurns+=1,e.totalCostUsd+=o,e.totalDurationMs+=s,e.totalTokens+=a+i,e.turnCosts.push(o),e.turnTokens.push({input:l,output:c,cache:u}),r?.sessionId&&!e.sessionId&&(e.sessionId=String(r.sessionId));let m={user:t,assistant:n,timestamp:Date.now(),costUsd:o,durationMs:s,inputTokens:a,outputTokens:i};return e.turns.push(m),m}var yo={opus:2e5,opus_1m:1e6,sonnet:2e5,sonnet_1m:1e6,haiku:2e5},Zf=2e5;function ut(e){return yo[e]??Zf}function qa(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)),a=Math.min(7,Math.floor(s*8));return r[a]}).join("")}var rr={stream:process.stdout,hideCursor:!1,discardStdin:!1};function ko(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];if(!n)return 0;let r=n.input+n.output+n.cache;return Math.min(1,r/ut(e.model))}function bo(e,t){let n=ko(e,t),r=ut(e.model),o,s=t?.getDetail();if(s!==void 0)o=s.used;else{let i=e.turnTokens[e.turnTokens.length-1];i&&(o=i.input+i.output+i.cache)}let a;if(e.turnTokens.length>=2){let i=e.turnTokens.map(c=>(c.input+c.output+c.cache)/r),l=qa(i,5);l.length>0&&(a=l)}return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:n,contextLimit:r,contextUsedTokens:o,contextSparkline:a,planMode:e.planMode}}var tg={name:"/exit",aliases:["/quit"],summary:"Exit the session",async handler(){return"exit"}},ng={name:"/clear",summary:"Clear conversation history",async handler(e){try{await e.session.reset(),e.ui.clearScreen(),Va(e.stats),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},rg={name:"/compact",summary:"Compact history (summarize older messages)",async handler(e){let t=eg({text:d.meta("Summarizing earlier turns..."),...rr}).start();try{let n=await e.session.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.`):e.out.info(`Nothing to compact (${r}).`)}}catch(n){t.stop(),e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},og={name:"/help",summary:"Show this help",async handler(e){let t=Ne(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(d.bold(d.brand("Commands"))),e.out.line(ee());for(let r of t){let o=r.usage??r.name,s=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${d.warning(o)}${s} ${d.dim(r.summary)}`)}return e.out.line(),e.out.line(d.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(),"continue"}},Ja=[tg,ng,rg,og];function wo(e,t=30){return!e||e.length===0?d.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${d.dim(`+${e.length-t} more`)}`}function Te(e,t){return` ${d.label(e.padEnd(16))} ${t}`}function or(e){let t=[];t.push(" "+ee("Session Debug")),e.sessionId&&t.push(Te("session",e.sessionId)),e.model&&t.push(Te("model",e.model)),e.permissionMode&&t.push(Te("permission",e.permissionMode)),e.cwd&&t.push(Te("cwd",e.cwd)),e.claudeCodeVersion&&t.push(Te("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(Te("api key",e.apiKeySource)),e.outputStyle&&t.push(Te("output style",e.outputStyle));let n=e.tools?.length??0;t.push(Te(`tools (${n})`,wo(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):d.dim("(none)");t.push(Te(`mcp (${r.length})`,o));let s=e.skills?.length??0;t.push(Te(`skills (${s})`,wo(e.skills)));let a=e.plugins?.length??0,i=a?(e.plugins??[]).map(c=>c.name).join(", "):d.dim("(none)");t.push(Te(`plugins (${a})`,i));let l=e.slashCommands?.length??0;return t.push(Te(`slash (${l})`,wo(e.slashCommands))),t.push(" "+ee()),t.join(`
1442
- `)}var So=["opus","opus_1m","sonnet","sonnet_1m","haiku"],sg={name:"/cost",summary:"Show total and per-turn cost",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(d.bold("Session cost")),n.line(ee()),n.line(` total ${d.success(me(t.totalCostUsd))}`),n.line(` turns ${d.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${d.meta(me(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(me).join(d.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function ig(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,s=n?.cache_read_input_tokens??0,a=n?.cache_creation_input_tokens??0,i=r+o+s+a;e.line(),e.line(d.bold("Token usage")+d.dim(" (SDK breakdown)")),e.line(ee()),e.line(` total ${d.success(L(t.totalTokens))} of ${d.meta(L(t.maxTokens))} (${d.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${d.meta(L(t.autoCompactThreshold))}`),e.line(),e.line(d.dim(" Last turn (API):")),e.line(` input ${d.meta(L(r))}`),e.line(` output ${d.meta(L(o))}`),e.line(` cache read ${d.meta(L(s))}`),e.line(` cache creat ${d.meta(L(a))}`),e.line(` total ${d.meta(L(i))}`);let l=t.categories??[];if(l.length>0){let m=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(d.dim(" Top categories:"));for(let f of m)e.line(` ${d.warning(f.name.padEnd(18))} ${d.meta(L(f.tokens))}`)}let c=t.systemTools??[],u=t.mcpTools??[];if(c.length>0||u.length>0){e.line();let m=c.reduce((g,y)=>g+y.tokens,0),f=u.reduce((g,y)=>g+y.tokens,0);c.length>0&&e.line(d.dim(` system tools ${c.length} tools, ${L(m)} tokens`)),u.length>0&&e.line(d.dim(` MCP tools ${u.length} tools, ${L(f)} tokens`))}let p=t.agents??[];if(p.length>0){let m=p.reduce((f,g)=>f+g.tokens,0);e.line(d.dim(` agents ${p.length} loaded, ${L(m)} tokens`))}if(t.skills){let m=t.skills;e.line(d.dim(` skills ${m.includedSkills}/${m.totalSkills} included, ${L(m.tokens)} tokens`))}if(t.slashCommands){let m=t.slashCommands;e.line(d.dim(` slash cmds ${m.includedCommands}/${m.totalCommands} included, ${L(m.tokens)} tokens`))}e.line()}function ag(e,t){let n=t.turnTokens.reduce((c,u)=>c+u.input,0),r=t.turnTokens.reduce((c,u)=>c+u.output,0),o=t.turnTokens.reduce((c,u)=>c+u.cache,0),s=n+r,a=ut(t.model),i=n+r+o,l=Math.round(i/a*100);e.line(),e.line(d.bold("Token usage")+d.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(ee()),e.line(` input ${d.meta(L(n))}`),e.line(` output ${d.meta(L(r))}`),e.line(` cache read ${d.meta(L(o))}`),e.line(` total ${d.success(L(s))}`),e.line(` context ${d.meta(`${l}% of ${L(a)} (${t.model})`)}`),e.line()}var lg={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",async handler(e){try{let t=await e.session.getContextUsage();ig(e.out,t)}catch{ag(e.out,e.stats)}return"continue"}},cg={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(d.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(ee()),t.turns.forEach((r,o)=>{let s=d.meta(`#${o+1}`),a=r.user.length>100?r.user.slice(0,97)+"...":r.user,i=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${s} ${d.user("\u25B6")} ${a}`),n.line(` ${d.brand("\u25C6")} ${d.dim(i)}`)}),n.line(),"continue")}},ug={name:"/reset",summary:"Clear screen, history, and session stats",async handler(e){let{stats:t,session:n,ui:r,out:o}=e;try{await n.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(),r.clearScreen(),o.success("Session reset."),"continue"}},dg={name:"/model",usage:"/model <opus|opus_1m|sonnet|sonnet_1m|haiku>",summary:"Switch the active model mid-session",async handler(e,t){let n=t.trim().toLowerCase();if(!n)return e.out.info(`Current model: ${d.brand(e.stats.model)}`),e.out.line(d.dim(` Valid: ${So.join(", ")}`)),"continue";if(!So.includes(n))return e.out.warn(`Unknown model: ${n}. Valid: ${So.join(", ")}`),"continue";try{await e.session.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${d.brand(n)}`)}catch(r){e.out.error(`Failed to switch model: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},pg={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(d.bold(`Tools (${n.length})`)),e.out.line(ee());let r=3,o=Math.ceil(n.length/r),s=Math.max(...n.map(a=>a.length))+2;for(let a=0;a<o;a++){let i=[];for(let l=0;l<r;l++){let c=l*o+a;c<n.length&&i.push(n[c].padEnd(s))}e.out.line(" "+i.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},mg={name:"/mcp",summary:"List MCP servers connected to the session",async handler(e){try{let n=(await e.session.waitForInitialization()).mcpServers??[];if(n.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(d.bold(`MCP servers (${n.length})`)),e.out.line(ee());for(let r of n){let o=typeof r=="string"?r:r.name??JSON.stringify(r),s=typeof r=="object"&&r!==null&&"status"in r?String(r.status):"",a=s==="connected"?d.success("\u25CF"):d.warning("\u25CF");e.out.line(` ${a} ${o}${s?d.dim(` (${s})`):""}`)}e.out.line()}catch(t){e.out.error(`Could not read MCP servers: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},fg={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(d.bold("Context-window limits")),e.out.line(ee());for(let[t,n]of Object.entries(yo)){let r=t===e.stats.model?d.brand(" \u2190 active"):"";e.out.line(` ${d.warning(t.padEnd(12))} ${d.meta(L(n))}${r}`)}return e.out.line(),"continue"}},gg={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",async handler(e){try{let t=await e.session.waitForInitialization();e.out.line(),e.out.line(or(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},Qa=[sg,lg,cg,ug,dg,pg,mg,fg,gg];var Xa={name:"/plan",usage:"/plan [on|off]",summary:"Toggle plan mode (read-only tools)",async handler(e,t){let n=t.trim().toLowerCase(),r=n==="on"?!0:n==="off"?!1:!e.stats.planMode;try{await e.session.setPermissionMode(r?"plan":"default"),e.stats.planMode=r,e.ui.repaintStatusLine(),r?e.out.success(d.warning("\u25CF plan mode ON")+d.dim(" \u2014 writes and commits are refused")):e.out.success(d.success("\u25CB plan mode OFF")+d.dim(" \u2014 default permissions restored"))}catch(o){e.out.error(`Could not toggle plan mode: ${o instanceof Error?o.message:String(o)}`)}return"continue"}};import{readFileSync as hg,writeFileSync as yg,existsSync as Za,mkdirSync as kg}from"fs";import{join as bg}from"path";function el(){return cs(),Lr()}function tl(e){return bg(el(),`${e}.json`)}function sr(e){let t=tl(e);if(!Za(t))return{sessionId:e,items:[]};try{let n=hg(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function on(e){let t=el();Za(t)||kg(t,{recursive:!0}),yg(tl(e.sessionId),JSON.stringify(e,null,2))}function nl(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 rl(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function ol(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function sl(e){e.items.length=0}function ir(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,z());{let r=d.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+d.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?d.success("[x]"):d.dim("[ ]"),s=r.done?d.dim(r.text):r.text,i=` ${d.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-U(i)),c=J(s,l).split(`
1443
- `);t.push(i+(c[0]??""));let u=" ".repeat(U(i));for(let p of c.slice(1))t.push(u+p)}{let r=Math.max(0,Math.min(n-1,120));t.push(d.dim("\u2514"+"\u2500".repeat(r)))}return t}function il(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
1444
- `)}function al(e){let t=e.stats.sessionId??"unbound";return sr(t)}function wg(e){let t=al(e),n=ir(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 ll={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",async handler(e,t){let n=t.trim();if(!n||n==="list")return wg(e),"continue";let[r,...o]=n.split(/\s+/),s=o.join(" "),a=al(e);switch(r){case"add":{if(!s)return e.out.warn("Usage: /todo add <text>"),"continue";let i=nl(a,s);return on(a),e.out.success(`Added ${d.meta(`#${i.id}`)} ${i.text}`),"continue"}case"done":{let i=parseInt(s,10);if(!Number.isFinite(i))return e.out.warn("Usage: /todo done <id>"),"continue";let l=rl(a,i);return l?(on(a),e.out.success(`Marked done ${d.meta(`#${i}`)} ${l.text}`)):e.out.warn(`No todo with id ${i}`),"continue"}case"rm":case"remove":{let i=parseInt(s,10);return Number.isFinite(i)?(ol(a,i)?(on(a),e.out.success(`Removed ${d.meta(`#${i}`)}`)):e.out.warn(`No todo with id ${i}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return sl(a),on(a),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}};var cl={name:"/save",usage:"/save [name]",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";try{let n=t.trim()||void 0,r=tr(e.stats,n);e.out.success(d.success("Saved")+d.dim(` ${r}`)),e.stats.sessionId&&e.out.line(d.dim(` Resume: afk interactive --resume ${e.stats.sessionId}`))}catch(n){e.out.error(`Could not save: ${n instanceof Error?n.message:String(n)}`)}return"continue"}};function Sg(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)}var ul={name:"/resume",usage:"/resume [id]",summary:"List saved sessions (resume happens at launch via --resume)",async handler(e,t){let n=t.trim();if(n){let o=ho(n);return o?(e.out.line(),e.out.line(d.bold(`Session ${n}`)),e.out.line(ee()),e.out.line(` model ${d.brand(o.model)}`),e.out.line(` turns ${d.meta(String(o.totalTurns))}`),e.out.line(` cost ${d.meta(me(o.totalCostUsd))}`),e.out.line(` sdk id ${d.meta(o.sessionId??"\u2014")}`),e.out.line(),o.sessionId?(e.out.line(d.dim(" To resume:")),e.out.line(d.brand(` afk interactive --resume ${o.sessionId}`))):e.out.line(d.dim(" No SDK session id recorded; resume not available.")),e.out.line(),"continue"):(e.out.warn(`No saved session: ${n}`),"continue")}let r=Ba();if(r.length===0)return e.out.info("No saved sessions found. Use /save first."),"continue";e.out.line(),e.out.line(d.bold(`Saved sessions (${r.length})`)),e.out.line(ee());for(let o of r.slice(0,20)){let s=Sg(o.savedAt),a=d.brand(o.model.padEnd(7)),i=d.meta(`${o.totalTurns} turn${o.totalTurns===1?"":"s"}`.padEnd(9)),l=d.meta(me(o.totalCostUsd).padStart(8)),c=d.warning(o.id);e.out.line(` ${s} ${a} ${i} ${l} ${c}`)}return e.out.line(),e.out.line(d.dim(" Resume with: /resume <id> (then re-launch with --resume <id>)")),e.out.line(),"continue"}};import{execFileSync as dl}from"node:child_process";import{existsSync as vg,readFileSync as pl,writeFileSync as xg}from"node:fs";import{resolve as vo}from"node:path";var Tg={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},Eg=["Added","Fixed","Changed","Deprecated","Removed","Security"];function Pg(e){let t;try{t=dl("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=dl("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
1445
- `).map(o=>{let s=o.indexOf(" "),a=o.slice(0,s),i=o.slice(s+1),l=i.match(/^(\w+(?:\+\w+)?)(?:\([^)]*\))?!?:\s*(.+)/);if(l){let c=l[1].toLowerCase(),u=Tg[c]??"Changed";return{hash:a,subject:l[2],category:u}}return{hash:a,subject:i,category:"Changed"}}):[]}function Cg(e){let t=new Map;for(let r of e){let o=t.get(r.category)??[];o.push(r),t.set(r.category,o)}let n=[];for(let r of Eg){let o=t.get(r);if(o?.length){n.push(`### ${r}`);for(let s of o)n.push(`- ${s.subject}`);n.push("")}}return n.join(`
1446
- `)}function ml(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function Ag(e,t){let n=vo(e,"CHANGELOG.md"),r=pl(n,"utf8"),o=ml(r),s;o?s=o+`
1447
-
1448
- `+t:s=t;let a=r.replace(/## \[Unreleased\][^\n]*\n[\s\S]*?(?=\n## \[|$)/,`## [Unreleased]
1449
-
1450
- ${s}
1451
- `);if(a===r)throw new Error("No ## [Unreleased] section found");xg(n,a)}var fl={name:"/changelog",aliases:["/cl"],usage:"/changelog [--dry-run]",summary:"Generate CHANGELOG entries from commits since last tag",async handler(e,t){let n=t.split(/\s+/).includes("--dry-run"),r=process.cwd(),o;try{o=Pg(r)}catch(i){return e.out.error(`Failed to read git log: ${i instanceof Error?i.message:String(i)}`),"continue"}if(o.length===0)return e.out.warn("No commits found since the last tag."),"continue";let s=Cg(o),a=(()=>{try{let i=pl(vo(r,"CHANGELOG.md"),"utf8");return ml(i)}catch{return""}})();e.out.line(),e.out.info(`${o.length} commits since last tag`),e.out.line(),a&&(e.out.warn("Existing [Unreleased] entries will be preserved above new entries."),e.out.line()),e.out.line(d.heading("Preview:")),e.out.line(d.dim("\u2500".repeat(60)));for(let i of s.split(`
1452
- `))i.startsWith("### ")?e.out.line(d.bold(i)):i.startsWith("- ")?e.out.line(d.dim(" ")+i):e.out.line(i);if(e.out.line(d.dim("\u2500".repeat(60))),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!vg(vo(r,"CHANGELOG.md")))return e.out.error("CHANGELOG.md not found. Create one with a ## [Unreleased] section first."),"continue";Ag(r,s),e.out.success("Wrote entries to CHANGELOG.md [Unreleased] section."),e.out.line(d.dim(" Review with: git diff CHANGELOG.md"))}catch(i){e.out.error(`Failed to update CHANGELOG.md: ${i instanceof Error?i.message:String(i)}`)}return"continue"}};import{readdirSync as Rg,readFileSync as _g,statSync as hl}from"fs";import{join as $g}from"path";var xo=[],Ig={name:"/agents",summary:"List plugin-provided subagents (loads after session init)",async handler(e){return e.out.line(),e.out.line(d.dim(" Plugin agents are still loading \u2014 try again after the session is ready.")),e.out.line(),"continue"}};function Mg(e){return{name:"/agents",summary:"List Task-tool subagents loaded by the SDK (plugin + user + project)",async handler(t){if(t.out.line(),e.length===0)return t.out.line(d.dim(" No plugin agents loaded. Agents come from `agents:` entries in plugin.json or from ~/.afk/agents/.")),t.out.line(),"continue";t.out.line(d.bold("Plugin agents")+d.dim(` (${e.length} loaded)`)),t.out.line(d.dim("\u2500".repeat(60)));let n=e.reduce((r,o)=>Math.max(r,o.name.length),0)+2;for(let r of e){let o=d.warning(r.name.padEnd(n)),s=r.model?d.dim(`[${r.model}]`):"",a=r.description?d.dim(` ${r.description}`):"";t.out.line(` ${o} ${s}${a}`)}return t.out.line(),t.out.line(d.dim(" Agents are dispatched by the model via the Task tool \u2014 not user-invoked.")),t.out.line(),"continue"}}}async function To(e){let t;try{t=await e.supportedAgents()}catch(n){return console.error(d.dim(" \u26A0 Plugin-agent discovery failed: ")+(n instanceof Error?n.message:String(n))),null}return xo=t.map(n=>{let r={name:n.name,description:n.description};return n.model&&(r.model=n.model),r}),Je(Mg(xo)),xo.length}function gl(){re(Ig)}var Og=new Set(["/exit","/quit","/clear","/compact","/help"]),ar={discovered:[],collisions:[],shadowedBareNames:new Set};function lr(e){return e.includes(":")?e.split(":").pop():e}function Dg(e){let t=e??_e(),n=new Map;try{hl(t)}catch{return n}let r=(o,s)=>{if(s>8)return;let a;try{a=Rg(o)}catch{return}for(let i of a){let l=$g(o,i),c;try{c=hl(l)}catch{continue}if(c.isDirectory()){r(l,s+1);continue}if(i!=="SKILL.md"||!c.isFile())continue;let u;try{u=_g(l,"utf-8")}catch{continue}let p=l.split("/"),m=p[p.length-2];if(!m)continue;let f=qt(u),g=f.frontmatterFlags&&f.frontmatterFlags.length>0?f.frontmatterFlags:eo(f.body);if(g.length===0)continue;let y=n.get(m)??[],h=new Set([...y,...g]);n.set(m,Array.from(h).sort())}};return r(t,0),n}function yl(e,t){let n=`/${e.name}`,r=e.argumentHint?`${n} ${e.argumentHint}`:void 0;return{name:n,summary:e.description,...r!==void 0?{usage:r}:{},...t&&t.length>0?{flags:t}:{},async handler(o,s){return"forward"}}}function Lg(e){let t=new Map,n=o=>{let s=lr(o.slashName.replace(/^\//,"")),a=t.get(s);a?a.alts.push(o):t.set(s,{main:o,alts:[]})};for(let o of st()){let s=se(o),a=`/${o}`,i=s.argumentHint?`${a} ${s.argumentHint}`:a,l={slashName:a,display:i,description:s.description};s.origin==="user"&&(l.sourceLabel="user"),n(l)}let r=new Map(ar.collisions.map(o=>[o.bare,o.altSlash]));for(let o of e){let s=lr(o.name),i=r.get(s)??`/${o.name}`,l=o.argumentHint?`${i} ${o.argumentHint}`:i;n({slashName:i,display:l,description:o.description,sourceLabel:"plugin"})}return t}function Fg(e,t,n){let r=t.main,o=d.warning(r.display.padEnd(n)),s=r.sourceLabel?d.dim(`(${r.sourceLabel}) `):"";e.out.line(` ${o} ${s}${d.dim(r.description)}`);for(let a of t.alts){let i=d.warning(a.display.padEnd(Math.max(0,n-4))),l=a.sourceLabel?d.dim(`(${a.sourceLabel} alt) `):d.dim("(alt) ");e.out.line(` ${d.dim("\u2514")} ${i} ${l}${d.dim(a.description)}`)}}function kl(e,t){let n=Lg(t),r=Array.from(n.values()).reduce((a,i)=>a+1+i.alts.length,0);if(e.out.line(),n.size===0){e.out.line(d.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}e.out.line(d.bold("Skills")+d.dim(` (${r} loaded)`)),e.out.line(ee());let o=Array.from(n.keys()).sort(),s=o.reduce((a,i)=>{let l=n.get(i);return Math.max(a,l.main.display.length)},0)+2;for(let a of o)Fg(e,n.get(a),s);e.out.line(),e.out.line(d.dim(" Source: vendored (no badge), (user), (plugin). Shadowed entries listed under their winner.")),e.out.line()}var Ng={name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",async handler(e){return kl(e,[]),"continue"}};function Ug(e){return{name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",async handler(t){return kl(t,e),"continue"}}}async function bl(e){let t;try{t=await e.supportedCommands()}catch(i){return console.error(d.dim(" \u26A0 Plugin-skill discovery failed: ")+(i instanceof Error?i.message:String(i))),null}let n=t.map(i=>({name:i.name,description:i.description,...i.argumentHint?{argumentHint:i.argumentHint}:{}})),r=Dg(),o=new Set(st().map(lr)),s=[],a=new Set;for(let i of n){let l=`/${i.name}`;if(Og.has(l))continue;let c=lr(i.name),u=r.get(c);if(o.has(c)){let p=i.name.includes(":")?i.name:`plugin:${i.name}`,m={...i,name:p};Je(yl(m,u)),s.push({bare:c,altSlash:`/${p}`,altDescription:i.description}),a.add(c);continue}Je(yl(i,u))}return ar={discovered:n,collisions:s,shadowedBareNames:a},Je(Ug(n)),n.length}function wl(){return ar.collisions.length===0?[]:ar.collisions.map(e=>d.dim(` /${e.bare}: vendored or user skill wins; plugin form ${e.altSlash} stays reachable.`))}async function Sl(e){let[t,n]=await Promise.all([bl(e),To(e)]);return{skillCount:t,agentCount:n}}var jg={name:"/reload-plugins",summary:"Reload plugin skills from disk and refresh the slash registry",async handler(e){e.out.line(),e.out.info("Reloading plugins\u2026");try{let r=e.session.getQuery();typeof r.reloadPlugins=="function"&&await r.reloadPlugins()}catch(r){e.out.warn(`Plugin reload failed: ${r instanceof Error?r.message:String(r)}`)}let[t,n]=await Promise.all([bl(e.session),To(e.session)]);if(t===null&&n===null)e.out.error("Could not refresh plugin skills or agents.");else{let r=[];t!==null&&r.push(`${t} skill${t===1?"":"s"}`),n!==null&&r.push(`${n} agent${n===1?"":"s"}`),e.out.success(`Reloaded ${r.join(" + ")}.`)}return e.out.line(),"continue"}};function vl(){re(Ng),re(jg)}import{emitKeypressEvents as Gg}from"readline";import{createLogUpdate as zg}from"log-update";function dt(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function cr(e,t){let n=dt(t,e.buffer.length);return n===e.cursor?e:{buffer:e.buffer,cursor:n}}function Bg(e,t){let n=dt(t,e.length);for(;n>0&&/\s/.test(e.charAt(n-1));)n--;for(;n>0&&!/\s/.test(e.charAt(n-1));)n--;return n}function Hg(e,t){let n=e.length,r=dt(t,n);for(;r<n&&/\s/.test(e.charAt(r));)r++;for(;r<n&&!/\s/.test(e.charAt(r));)r++;return r}function Wg(e,t){let n=dt(t,e.length),r=e.lastIndexOf(`
1453
- `,n-1);return r<0?0:r+1}function Kg(e,t){let n=dt(t,e.length),r=e.indexOf(`
1454
- `,n);return r<0?e.length:r}function Qe(e,t,n){let r=dt(t.start,e.buffer.length),o=dt(t.end,e.buffer.length),s=Math.min(r,o),a=Math.max(r,o);if(s===a&&n.length===0)return e;let i=e.buffer.slice(0,s)+n+e.buffer.slice(a),l=s+n.length;return i===e.buffer&&l===e.cursor?e:{buffer:i,cursor:l}}var W={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:Qe,insert(e,t){return t.length===0?e:Qe(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=co(e.buffer,e.cursor);return Qe(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=Zt(e.buffer,e.cursor);return Qe(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=Bg(e.buffer,e.cursor);return t===e.cursor?e:Qe(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=Hg(e.buffer,e.cursor);return t===e.cursor?e:Qe(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=Wg(e.buffer,e.cursor);return t===e.cursor?e:Qe(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=Kg(e.buffer,e.cursor);return t===e.cursor?e:Qe(e,{start:e.cursor,end:t},"")},moveLeft(e){return cr(e,co(e.buffer,e.cursor))},moveRight(e){return cr(e,Zt(e.buffer,e.cursor))},moveHome(e){return cr(e,0)},moveEnd(e){return cr(e,e.buffer.length)}};var xl=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"];function Eo(){return xl[Math.floor(Math.random()*xl.length)]}var Tl=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ur=class{stdout;stdin;onCancel;promptText;armed=!1;canceled=!1;wasRaw=!1;logUpdate=null;overlay="";input=W.seed("");queued=!1;handleKeypress=null;resizeUnsub=null;spinner=null;spinnerInterval=null;committing=!1;constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.promptText=t.promptText??" "+d.dim("\u23AF")+" "}isArmed(){return this.armed}async arm(){if(!this.armed&&!(!this.stdout.isTTY||!this.stdin.isTTY)){this.logUpdate||(this.logUpdate=zg(this.stdout)),this.wasRaw=this.stdin.isRaw??!1;try{this.stdin.setRawMode(!0)}catch{this.logUpdate=null,this.wasRaw=!1;return}this.stdin.resume(),Gg(this.stdin),this.handleKeypress=(t,n)=>this.dispatchKey(t,n),this.stdin.on("keypress",this.handleKeypress),this.resizeUnsub=Ct.subscribe(()=>{this.repaint()}),this.armed=!0,this.canceled=!1,this.repaint()}}disarm(){if(this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner=null,!this.armed){this.resetState();return}if(this.handleKeypress&&(this.stdin.removeListener("keypress",this.handleKeypress),this.handleKeypress=null),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.logUpdate)try{this.logUpdate.clear()}catch{}if(this.stdout.isTTY&&this.stdin.isTTY)try{this.stdin.setRawMode(this.wasRaw)}catch{}this.armed=!1,this.resetState()}setOverlay(t){this.overlay=t,this.repaint()}setSpinner(t){if(!this.stdout.isTTY)return;if(!t.enabled){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner&&(this.spinner=null,this.repaint());return}if(this.spinner)return;let n=t.rotateVerbEveryMs??3500;this.spinner={frameIndex:0,verb:Eo(),nextVerbRotateAt:Date.now()+n},this.spinnerInterval=setInterval(()=>this.tickSpinner(n),80),this.repaint()}tickSpinner(t){if(!this.spinner)return;this.spinner.frameIndex=(this.spinner.frameIndex+1)%Tl.length;let n=Date.now();n>=this.spinner.nextVerbRotateAt&&(this.spinner.verb=Eo(),this.spinner.nextVerbRotateAt=n+t),this.repaint()}commitAbove(t){if(!this.armed||!this.logUpdate){this.stdout.write(t+`
1560
+ `)}function _h(e,t,n){let r=Ch[e],o=` ${t} `,s=r.bold(o),a=Math.max(N(t)+4,...n.map(g=>N(g))),i=Math.max(40,a)+4,l=Math.min(i,Math.min(V()-4,100));l=Math.min(l,wr());let c="\u2500".repeat(l+4-1-N(o)-1),u=r("\u256D\u2500")+s+r(c+"\u256E"),p=r("\u2570"+"\u2500".repeat(l+4)+"\u256F"),m=r("\u2502"),f=[u];for(let g of n){let y=q(g,l).split(`
1561
+ `);for(let h of y)f.push(m+" "+de(h,l)+" "+m)}return f.push(p),f.join(`
1562
+ `)}function ne(e){let t=Math.min(V(),120);if(e===void 0)return d.dim("\u2500".repeat(t));let n=d.dim("\u2500\u2500")+" "+d.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-N(r));return n+d.dim("\u2500".repeat(o))}var Sr=new Set;function hn(e){return Sr.add(e),()=>{Sr.delete(e)}}async function Hl(){await Promise.all([...Sr].map(e=>e())),Sr.clear()}import{readFileSync as Rh,writeFileSync as Mh,existsSync as Ko,mkdirSync as $h,readdirSync as Oh,statSync as Dh}from"fs";import{join as Bl,basename as Lh}from"path";function Go(){return Gs(),Yt()}function Wl(e){return Bl(Go(),`${e}.json`)}function vr(e,t){let n=Go();Ko(n)||$h(n,{recursive:!0});let r=t??e.sessionId??`session-${Date.now()}`,o={sessionId:e.sessionId,model:e.model,startedAt:e.sessionStartTime,savedAt:Date.now(),totalTurns:e.totalTurns,totalCostUsd:e.totalCostUsd,totalTokens:e.totalTokens,totalDurationMs:e.totalDurationMs,turns:e.turns},s=Wl(r);return Mh(s,JSON.stringify(o,null,2)),s}function zo(e){let t=e.includes("/")?e:Wl(e);if(Ko(t))try{let n=Rh(t,"utf-8");return JSON.parse(n)}catch{return}}function Kl(){let e=Go();if(!Ko(e))return[];let t=[];for(let n of Oh(e)){if(!n.endsWith(".json"))continue;let r=Bl(e,n);try{if(!Dh(r).isFile())continue;let s=zo(r);if(!s||typeof s.savedAt!="number"||typeof s.model!="string")continue;t.push({path:r,id:Lh(n,".json"),sessionId:s.sessionId,model:s.model,startedAt:s.startedAt,savedAt:s.savedAt,totalTurns:s.totalTurns,totalCostUsd:s.totalCostUsd})}catch{}}return t.sort((n,r)=>r.savedAt-n.savedAt),t}import*as cu from"node:readline";function Gl(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?d.error:t>.5?d.warning:d.meta,r=20,o=Math.round(t*r),s=r-o,a="["+"\u2588".repeat(o)+"\u2591".repeat(s)+"]",i=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=D(e.used)+"/"+D(e.limit));let c=l?`${a} ${i} ${l}`:`${a} ${i}`,u=`${a} ${i}`,p=`ctx ${i}`,m=e.sparkline?d.meta(e.sparkline)+" ":"",f=e.sparkline?N(e.sparkline)+1:0,g=Math.max(0,e.width-f);if(N(c)<=g&&g>90)return m+n(c);if(N(u)<=g&&g>32)return m+n(u);if(N(p)<=g)return m+n(p);if(e.width>0){let y=m+n(p);return Te(y,e.width)}return n(i)}var xr=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;lastPaintedRow=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=Dt.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)}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()}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(n.push(d.brand(t.model)),t.planMode&&n.push(d.warning("\u25CF plan")),t.contextPct!==void 0){let s=Gl({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push(s)}t.cost!==void 0&&n.push(d.meta(`$${t.cost.toFixed(2)}`)),t.tokens!==void 0&&n.push(d.meta(`${Fh(t.tokens)} tok`));let o=n.join(d.dim(" \xB7 "));return Te(o,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){if(t>1){this.stream.write(`\x1B[1;${t-1}r`);return}this.stream.write("\x1B[r")}};function Fh(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}var Ee=new Map,yt=new Map;function se(e){if(Ee.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);Ee.set(e.name,e);for(let t of e.aliases??[]){if(yt.has(t)||Ee.has(t))throw new Error(`Slash alias collides: ${t}`);yt.set(t,e.name)}}function rt(e){if(Ee.has(e.name)){for(let[t,n]of yt.entries())n===e.name&&yt.delete(t);Ee.delete(e.name)}se(e)}function zl(){Ee.clear(),yt.clear()}function Ge(){return[...Ee.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Vl(){let e=[];for(let[t,n]of yt.entries()){let r=Ee.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function Nh(e){if(Ee.has(e))return Ee.get(e);let t=yt.get(e);return t?Ee.get(t):void 0}function Uh(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 jh(e,t=3){let n;for(let r of Ee.keys()){let o=Uh(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function Hh(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 ql(e,t){let n=Hh(e);if(n===null)return{handled:!1};let r=Nh(n.name);if(!r){let s=jh(n.name);return s?t.out.warn(`Unknown command: ${n.name} (did you mean ${s}?)`):t.out.warn(`Unknown command: ${n.name} (type /help for commands)`),{handled:!0,result:"continue"}}let o=await r.handler(t,n.args);return o==="forward"?{handled:!1}:{handled:!0,result:o}}import Wh from"ora";function Yl(e){return{totalTurns:0,totalCostUsd:0,totalTokens:0,totalDurationMs:0,sessionStartTime:Date.now(),turnCosts:[],turnTokens:[],turns:[],model:e,planMode:!1}}function Jl(e){e.totalTurns=0,e.totalCostUsd=0,e.totalTokens=0,e.totalDurationMs=0,e.sessionStartTime=Date.now(),e.turnCosts.length=0,e.turnTokens.length=0,e.turns.length=0,delete e.sessionId}function Xl(e,t,n,r){let o=r?.totalCostUsd??0,s=r?.durationMs??0,a=Number(r?.usage?.input_tokens??0),i=Number(r?.usage?.output_tokens??0),l=a,c=i,u=Number(r?.usage?.cache_read_input_tokens??0)+Number(r?.usage?.cache_creation_input_tokens??0),p=r?.usage?.iterations;if(Array.isArray(p)&&p.length>0){let f=p[p.length-1];if(f&&typeof f=="object"){let g=f;l=Number(g.input_tokens??0),c=Number(g.output_tokens??0),u=Number(g.cache_read_input_tokens??0)+Number(g.cache_creation_input_tokens??0)}}e.totalTurns+=1,e.totalCostUsd+=o,e.totalDurationMs+=s,e.totalTokens+=a+i,e.turnCosts.push(o),e.turnTokens.push({input:l,output:c,cache:u}),r?.sessionId&&!e.sessionId&&(e.sessionId=String(r.sessionId));let m={user:t,assistant:n,timestamp:Date.now(),costUsd:o,durationMs:s,inputTokens:a,outputTokens:i};return e.turns.push(m),m}function Ql(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)),a=Math.min(7,Math.floor(s*8));return r[a]}).join("")}var Tr={stream:process.stdout,hideCursor:!1,discardStdin:!1};function Vo(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];if(!n)return 0;let r=n.input+n.output+n.cache;return Math.min(1,r/Oe(e.model))}function qo(e,t){let n=Vo(e,t),r=Oe(e.model),o,s=t?.getDetail();if(s!==void 0)o=s.used;else{let i=e.turnTokens[e.turnTokens.length-1];i&&(o=i.input+i.output+i.cache)}let a;if(e.turnTokens.length>=2){let i=e.turnTokens.map(c=>(c.input+c.output+c.cache)/r),l=Ql(i,5);l.length>0&&(a=l)}return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:n,contextLimit:r,contextUsedTokens:o,contextSparkline:a,planMode:e.planMode}}var Kh={name:"/exit",aliases:["/quit"],summary:"Exit the session",async handler(){return"exit"}},Gh={name:"/clear",summary:"Clear conversation history",async handler(e){try{await e.session.reset(),e.ui.clearScreen(),Jl(e.stats),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},zh={name:"/compact",summary:"Compact history (summarize older messages)",async handler(e){let t=Wh({text:d.meta("Summarizing earlier turns..."),...Tr}).start();try{let n=await e.session.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.`):e.out.info(`Nothing to compact (${r}).`)}}catch(n){t.stop(),e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},Vh={name:"/help",summary:"Show this help",async handler(e){let t=Ge(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(d.bold(d.brand("Commands"))),e.out.line(ne());for(let r of t){let o=r.usage??r.name,s=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${d.warning(o)}${s} ${d.dim(r.summary)}`)}return e.out.line(),e.out.line(d.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(),"continue"}},Zl=[Kh,Gh,zh,Vh];function Yo(e,t=30){return!e||e.length===0?d.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${d.dim(`+${e.length-t} more`)}`}function Pe(e,t){return` ${d.label(e.padEnd(16))} ${t}`}function Er(e){let t=[];t.push(" "+ne("Session Debug")),e.sessionId&&t.push(Pe("session",e.sessionId)),e.model&&t.push(Pe("model",e.model)),e.permissionMode&&t.push(Pe("permission",e.permissionMode)),e.cwd&&t.push(Pe("cwd",e.cwd)),e.claudeCodeVersion&&t.push(Pe("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(Pe("api key",e.apiKeySource)),e.outputStyle&&t.push(Pe("output style",e.outputStyle));let n=e.tools?.length??0;t.push(Pe(`tools (${n})`,Yo(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):d.dim("(none)");t.push(Pe(`mcp (${r.length})`,o));let s=e.skills?.length??0;t.push(Pe(`skills (${s})`,Yo(e.skills)));let a=e.plugins?.length??0,i=a?(e.plugins??[]).map(c=>c.name).join(", "):d.dim("(none)");t.push(Pe(`plugins (${a})`,i));let l=e.slashCommands?.length??0;return t.push(Pe(`slash (${l})`,Yo(e.slashCommands))),t.push(" "+ne()),t.join(`
1563
+ `)}var Jo=["opus","opus_1m","sonnet","sonnet_1m","haiku"],qh={name:"/cost",summary:"Show total and per-turn cost",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(d.bold("Session cost")),n.line(ne()),n.line(` total ${d.success(ge(t.totalCostUsd))}`),n.line(` turns ${d.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${d.meta(ge(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(ge).join(d.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function Yh(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,s=n?.cache_read_input_tokens??0,a=n?.cache_creation_input_tokens??0,i=r+o+s+a;e.line(),e.line(d.bold("Token usage")+d.dim(" (SDK breakdown)")),e.line(ne()),e.line(` total ${d.success(D(t.totalTokens))} of ${d.meta(D(t.maxTokens))} (${d.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${d.meta(D(t.autoCompactThreshold))}`),e.line(),e.line(d.dim(" Last turn (API):")),e.line(` input ${d.meta(D(r))}`),e.line(` output ${d.meta(D(o))}`),e.line(` cache read ${d.meta(D(s))}`),e.line(` cache creat ${d.meta(D(a))}`),e.line(` total ${d.meta(D(i))}`);let l=t.categories??[];if(l.length>0){let m=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(d.dim(" Top categories:"));for(let f of m)e.line(` ${d.warning(f.name.padEnd(18))} ${d.meta(D(f.tokens))}`)}let c=t.systemTools??[],u=t.mcpTools??[];if(c.length>0||u.length>0){e.line();let m=c.reduce((g,y)=>g+y.tokens,0),f=u.reduce((g,y)=>g+y.tokens,0);c.length>0&&e.line(d.dim(` system tools ${c.length} tools, ${D(m)} tokens`)),u.length>0&&e.line(d.dim(` MCP tools ${u.length} tools, ${D(f)} tokens`))}let p=t.agents??[];if(p.length>0){let m=p.reduce((f,g)=>f+g.tokens,0);e.line(d.dim(` agents ${p.length} loaded, ${D(m)} tokens`))}if(t.skills){let m=t.skills;e.line(d.dim(` skills ${m.includedSkills}/${m.totalSkills} included, ${D(m.tokens)} tokens`))}if(t.slashCommands){let m=t.slashCommands;e.line(d.dim(` slash cmds ${m.includedCommands}/${m.totalCommands} included, ${D(m.tokens)} tokens`))}e.line()}function Jh(e,t){let n=t.turnTokens.reduce((c,u)=>c+u.input,0),r=t.turnTokens.reduce((c,u)=>c+u.output,0),o=t.turnTokens.reduce((c,u)=>c+u.cache,0),s=n+r,a=Oe(t.model),i=n+r+o,l=Math.round(i/a*100);e.line(),e.line(d.bold("Token usage")+d.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(ne()),e.line(` input ${d.meta(D(n))}`),e.line(` output ${d.meta(D(r))}`),e.line(` cache read ${d.meta(D(o))}`),e.line(` total ${d.success(D(s))}`),e.line(` context ${d.meta(`${l}% of ${D(a)} (${t.model})`)}`),e.line()}var Xh={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",async handler(e){try{let t=await e.session.getContextUsage();Yh(e.out,t)}catch{Jh(e.out,e.stats)}return"continue"}},Qh={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(d.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(ne()),t.turns.forEach((r,o)=>{let s=d.meta(`#${o+1}`),a=r.user.length>100?r.user.slice(0,97)+"...":r.user,i=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${s} ${d.user("\u25B6")} ${a}`),n.line(` ${d.brand("\u25C6")} ${d.dim(i)}`)}),n.line(),"continue")}},Zh={name:"/reset",summary:"Clear screen, history, and session stats",async handler(e){let{stats:t,session:n,ui:r,out:o}=e;try{await n.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(),r.clearScreen(),o.success("Session reset."),"continue"}},ey={name:"/model",usage:"/model <opus|opus_1m|sonnet|sonnet_1m|haiku>",summary:"Switch the active model mid-session",async handler(e,t){let n=t.trim().toLowerCase();if(!n)return e.out.info(`Current model: ${d.brand(e.stats.model)}`),e.out.line(d.dim(` Valid: ${Jo.join(", ")}`)),"continue";if(!Jo.includes(n))return e.out.warn(`Unknown model: ${n}. Valid: ${Jo.join(", ")}`),"continue";try{await e.session.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${d.brand(n)}`)}catch(r){e.out.error(`Failed to switch model: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},ty={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(d.bold(`Tools (${n.length})`)),e.out.line(ne());let r=3,o=Math.ceil(n.length/r),s=Math.max(...n.map(a=>a.length))+2;for(let a=0;a<o;a++){let i=[];for(let l=0;l<r;l++){let c=l*o+a;c<n.length&&i.push(n[c].padEnd(s))}e.out.line(" "+i.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},ny={name:"/mcp",summary:"List MCP servers connected to the session",async handler(e){try{let n=(await e.session.waitForInitialization()).mcpServers??[];if(n.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(d.bold(`MCP servers (${n.length})`)),e.out.line(ne());for(let r of n){let o=typeof r=="string"?r:r.name??JSON.stringify(r),s=typeof r=="object"&&r!==null&&"status"in r?String(r.status):"",a=s==="connected"?d.success("\u25CF"):d.warning("\u25CF");e.out.line(` ${a} ${o}${s?d.dim(` (${s})`):""}`)}e.out.line()}catch(t){e.out.error(`Could not read MCP servers: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},ry={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(d.bold("Context-window limits")),e.out.line(ne());for(let[t,n]of Object.entries(rr)){let r=t===e.stats.model?d.brand(" \u2190 active"):"";e.out.line(` ${d.warning(t.padEnd(12))} ${d.meta(D(n))}${r}`)}return e.out.line(),"continue"}},oy={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",async handler(e){try{let t=await e.session.waitForInitialization();e.out.line(),e.out.line(Er(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},ec=[qh,Xh,Qh,Zh,ey,ty,ny,ry,oy];var tc={name:"/plan",usage:"/plan [on|off]",summary:"Toggle plan mode (read-only tools)",async handler(e,t){let n=t.trim().toLowerCase(),r=n==="on"?!0:n==="off"?!1:!e.stats.planMode;try{await e.session.setPermissionMode(r?"plan":"default"),e.stats.planMode=r,e.ui.repaintStatusLine(),r?e.out.success(d.warning("\u25CF plan mode ON")+d.dim(" \u2014 writes and commits are refused")):e.out.success(d.success("\u25CB plan mode OFF")+d.dim(" \u2014 default permissions restored"))}catch(o){e.out.error(`Could not toggle plan mode: ${o instanceof Error?o.message:String(o)}`)}return"continue"}};import{readFileSync as sy,writeFileSync as iy,existsSync as nc,mkdirSync as ay}from"fs";import{join as ly}from"path";function rc(){return zs(),ao()}function oc(e){return ly(rc(),`${e}.json`)}function Pr(e){let t=oc(e);if(!nc(t))return{sessionId:e,items:[]};try{let n=sy(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function yn(e){let t=rc();nc(t)||ay(t,{recursive:!0}),iy(oc(e.sessionId),JSON.stringify(e,null,2))}function sc(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 ic(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function ac(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function lc(e){e.items.length=0}function Cr(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,V());{let r=d.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+d.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?d.success("[x]"):d.dim("[ ]"),s=r.done?d.dim(r.text):r.text,i=` ${d.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-N(i)),c=q(s,l).split(`
1564
+ `);t.push(i+(c[0]??""));let u=" ".repeat(N(i));for(let p of c.slice(1))t.push(u+p)}{let r=Math.max(0,Math.min(n-1,120));t.push(d.dim("\u2514"+"\u2500".repeat(r)))}return t}function cc(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
1565
+ `)}function uc(e){let t=e.stats.sessionId??"unbound";return Pr(t)}function cy(e){let t=uc(e),n=Cr(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 dc={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",async handler(e,t){let n=t.trim();if(!n||n==="list")return cy(e),"continue";let[r,...o]=n.split(/\s+/),s=o.join(" "),a=uc(e);switch(r){case"add":{if(!s)return e.out.warn("Usage: /todo add <text>"),"continue";let i=sc(a,s);return yn(a),e.out.success(`Added ${d.meta(`#${i.id}`)} ${i.text}`),"continue"}case"done":{let i=parseInt(s,10);if(!Number.isFinite(i))return e.out.warn("Usage: /todo done <id>"),"continue";let l=ic(a,i);return l?(yn(a),e.out.success(`Marked done ${d.meta(`#${i}`)} ${l.text}`)):e.out.warn(`No todo with id ${i}`),"continue"}case"rm":case"remove":{let i=parseInt(s,10);return Number.isFinite(i)?(ac(a,i)?(yn(a),e.out.success(`Removed ${d.meta(`#${i}`)}`)):e.out.warn(`No todo with id ${i}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return lc(a),yn(a),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}};var pc={name:"/save",usage:"/save [name]",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";try{let n=t.trim()||void 0,r=vr(e.stats,n);e.out.success(d.success("Saved")+d.dim(` ${r}`)),e.stats.sessionId&&e.out.line(d.dim(` Resume: afk interactive --resume ${e.stats.sessionId}`))}catch(n){e.out.error(`Could not save: ${n instanceof Error?n.message:String(n)}`)}return"continue"}};function uy(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)}var mc={name:"/resume",usage:"/resume [id]",summary:"List saved sessions (resume happens at launch via --resume)",async handler(e,t){let n=t.trim();if(n){let o=zo(n);return o?(e.out.line(),e.out.line(d.bold(`Session ${n}`)),e.out.line(ne()),e.out.line(` model ${d.brand(o.model)}`),e.out.line(` turns ${d.meta(String(o.totalTurns))}`),e.out.line(` cost ${d.meta(ge(o.totalCostUsd))}`),e.out.line(` sdk id ${d.meta(o.sessionId??"\u2014")}`),e.out.line(),o.sessionId?(e.out.line(d.dim(" To resume:")),e.out.line(d.brand(` afk interactive --resume ${o.sessionId}`))):e.out.line(d.dim(" No SDK session id recorded; resume not available.")),e.out.line(),"continue"):(e.out.warn(`No saved session: ${n}`),"continue")}let r=Kl();if(r.length===0)return e.out.info("No saved sessions found. Use /save first."),"continue";e.out.line(),e.out.line(d.bold(`Saved sessions (${r.length})`)),e.out.line(ne());for(let o of r.slice(0,20)){let s=uy(o.savedAt),a=d.brand(o.model.padEnd(7)),i=d.meta(`${o.totalTurns} turn${o.totalTurns===1?"":"s"}`.padEnd(9)),l=d.meta(ge(o.totalCostUsd).padStart(8)),c=d.warning(o.id);e.out.line(` ${s} ${a} ${i} ${l} ${c}`)}return e.out.line(),e.out.line(d.dim(" Resume with: /resume <id> (then re-launch with --resume <id>)")),e.out.line(),"continue"}};import{existsSync as yy,readFileSync as by}from"node:fs";import{resolve as bc}from"node:path";import{execFileSync as fc}from"node:child_process";import{readFileSync as dy,writeFileSync as py}from"node:fs";import{resolve as my}from"node:path";var fy={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},gy=["Added","Fixed","Changed","Deprecated","Removed","Security"];function gc(e){let t;try{t=fc("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=fc("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
1566
+ `).map(o=>{let s=o.indexOf(" "),a=o.slice(0,s),i=o.slice(s+1),l=i.match(/^(\w+(?:\+\w+)?)(?:\([^)]*\))?!?:\s*(.+)/);if(l){let c=l[1].toLowerCase(),u=fy[c]??"Changed";return{hash:a,subject:l[2],category:u}}return{hash:a,subject:i,category:"Changed"}}):[]}function hc(e,t={}){let n=t.includeHash??!1,r=new Map;for(let s of e){let a=r.get(s.category)??[];a.push(s),r.set(s.category,a)}let o=[];for(let s of gy){let a=r.get(s);if(a?.length){o.push(`### ${s}`);for(let i of a)o.push(n?`- ${i.subject} (${i.hash})`:`- ${i.subject}`);o.push("")}}return o.join(`
1567
+ `)}function Xo(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function hy(e){let t=new Set;for(let n of e.split(`
1568
+ `)){let r=n.match(/\(([0-9a-f]{7,})\)\s*$/);r?.[1]&&t.add(r[1])}return t}function yc(e,t){let n=my(e,"CHANGELOG.md"),r=dy(n,"utf8"),o=Xo(r),s=hy(o),a=t.split(`
1569
+ `).filter(c=>{let u=c.match(/\(([0-9a-f]{7,})\)\s*$/);return!(u?.[1]&&s.has(u[1]))}).join(`
1570
+ `).replace(/\n{3,}/g,`
1571
+
1572
+ `).trim(),i=o&&a?o+`
1573
+
1574
+ `+a:o||a,l=r.replace(/## \[Unreleased\][^\n]*\n[\s\S]*?(?=\n## \[|$)/,`## [Unreleased]
1575
+
1576
+ ${i}
1577
+ `);if(l===r)throw new Error("No ## [Unreleased] section found");py(n,l)}var kc={name:"/changelog",aliases:["/cl"],usage:"/changelog [--dry-run]",summary:"Generate CHANGELOG entries from commits since last tag",async handler(e,t){let n=t.split(/\s+/).includes("--dry-run"),r=process.cwd(),o;try{o=gc(r)}catch(i){return e.out.error(`Failed to read git log: ${i instanceof Error?i.message:String(i)}`),"continue"}if(o.length===0)return e.out.warn("No commits found since the last tag."),"continue";let s=hc(o),a=(()=>{try{let i=by(bc(r,"CHANGELOG.md"),"utf8");return Xo(i)}catch{return""}})();e.out.line(),e.out.info(`${o.length} commits since last tag`),e.out.line(),a&&(e.out.warn("Existing [Unreleased] entries will be preserved above new entries."),e.out.line()),e.out.line(d.heading("Preview:")),e.out.line(d.dim("\u2500".repeat(60)));for(let i of s.split(`
1578
+ `))i.startsWith("### ")?e.out.line(d.bold(i)):i.startsWith("- ")?e.out.line(d.dim(" ")+i):e.out.line(i);if(e.out.line(d.dim("\u2500".repeat(60))),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!yy(bc(r,"CHANGELOG.md")))return e.out.error("CHANGELOG.md not found. Create one with a ## [Unreleased] section first."),"continue";yc(r,s),e.out.success("Wrote entries to CHANGELOG.md [Unreleased] section."),e.out.line(d.dim(" Review with: git diff CHANGELOG.md"))}catch(i){e.out.error(`Failed to update CHANGELOG.md: ${i instanceof Error?i.message:String(i)}`)}return"continue"}};import{readdirSync as Sy,readFileSync as vy,statSync as Sc}from"fs";import{join as xy}from"path";var Qo=[],ky={name:"/agents",summary:"List plugin-provided subagents (loads after session init)",async handler(e){return e.out.line(),e.out.line(d.dim(" Plugin agents are still loading \u2014 try again after the session is ready.")),e.out.line(),"continue"}};function wy(e){return{name:"/agents",summary:"List Task-tool subagents loaded by the SDK (plugin + user + project)",async handler(t){if(t.out.line(),e.length===0)return t.out.line(d.dim(" No plugin agents loaded. Agents come from `agents:` entries in plugin.json or from ~/.afk/agents/.")),t.out.line(),"continue";t.out.line(d.bold("Plugin agents")+d.dim(` (${e.length} loaded)`)),t.out.line(d.dim("\u2500".repeat(60)));let n=e.reduce((r,o)=>Math.max(r,o.name.length),0)+2;for(let r of e){let o=d.warning(r.name.padEnd(n)),s=r.model?d.dim(`[${r.model}]`):"",a=r.description?d.dim(` ${r.description}`):"";t.out.line(` ${o} ${s}${a}`)}return t.out.line(),t.out.line(d.dim(" Agents are dispatched by the model via the Task tool \u2014 not user-invoked.")),t.out.line(),"continue"}}}async function Zo(e){let t;try{t=await e.supportedAgents()}catch(n){return console.error(d.dim(" \u26A0 Plugin-agent discovery failed: ")+(n instanceof Error?n.message:String(n))),null}return Qo=t.map(n=>{let r={name:n.name,description:n.description};return n.model&&(r.model=n.model),r}),rt(wy(Qo)),Qo.length}function wc(){se(ky)}var Ty=new Set(["/exit","/quit","/clear","/compact","/help"]),Ar={discovered:[],collisions:[],shadowedBareNames:new Set};function Ir(e){return e.includes(":")?e.split(":").pop():e}function Ey(e){let t=e??Fe(),n=new Map;try{Sc(t)}catch{return n}let r=(o,s)=>{if(s>8)return;let a;try{a=Sy(o)}catch{return}for(let i of a){let l=xy(o,i),c;try{c=Sc(l)}catch{continue}if(c.isDirectory()){r(l,s+1);continue}if(i!=="SKILL.md"||!c.isFile())continue;let u;try{u=vy(l,"utf-8")}catch{continue}let p=l.split("/"),m=p[p.length-2];if(!m)continue;let f=on(u),g=f.frontmatterFlags&&f.frontmatterFlags.length>0?f.frontmatterFlags:Po(f.body);if(g.length===0)continue;let y=n.get(m)??[],h=new Set([...y,...g]);n.set(m,Array.from(h).sort())}};return r(t,0),n}function vc(e,t){let n=`/${e.name}`,r=e.argumentHint?`${n} ${e.argumentHint}`:void 0;return{name:n,summary:e.description,...r!==void 0?{usage:r}:{},...t&&t.length>0?{flags:t}:{},async handler(o,s){return"forward"}}}function Py(e){let t=new Map,n=o=>{let s=Ir(o.slashName.replace(/^\//,"")),a=t.get(s);a?a.alts.push(o):t.set(s,{main:o,alts:[]})};for(let o of pt()){let s=le(o),a=`/${o}`,i=s.argumentHint?`${a} ${s.argumentHint}`:a,l={slashName:a,display:i,description:s.description};s.origin==="user"&&(l.sourceLabel="user"),n(l)}let r=new Map(Ar.collisions.map(o=>[o.bare,o.altSlash]));for(let o of e){let s=Ir(o.name),i=r.get(s)??`/${o.name}`,l=o.argumentHint?`${i} ${o.argumentHint}`:i;n({slashName:i,display:l,description:o.description,sourceLabel:"plugin"})}return t}function Cy(e,t,n){let r=t.main,o=d.warning(r.display.padEnd(n)),s=r.sourceLabel?d.dim(`(${r.sourceLabel}) `):"";e.out.line(` ${o} ${s}${d.dim(r.description)}`);for(let a of t.alts){let i=d.warning(a.display.padEnd(Math.max(0,n-4))),l=a.sourceLabel?d.dim(`(${a.sourceLabel} alt) `):d.dim("(alt) ");e.out.line(` ${d.dim("\u2514")} ${i} ${l}${d.dim(a.description)}`)}}function xc(e,t){let n=Py(t),r=Array.from(n.values()).reduce((a,i)=>a+1+i.alts.length,0);if(e.out.line(),n.size===0){e.out.line(d.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}e.out.line(d.bold("Skills")+d.dim(` (${r} loaded)`)),e.out.line(ne());let o=Array.from(n.keys()).sort(),s=o.reduce((a,i)=>{let l=n.get(i);return Math.max(a,l.main.display.length)},0)+2;for(let a of o)Cy(e,n.get(a),s);e.out.line(),e.out.line(d.dim(" Source: vendored (no badge), (user), (plugin). Shadowed entries listed under their winner.")),e.out.line()}var Ay={name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",async handler(e){return xc(e,[]),"continue"}};function Iy(e){return{name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",async handler(t){return xc(t,e),"continue"}}}async function Tc(e){let t;try{t=await e.supportedCommands()}catch(i){return console.error(d.dim(" \u26A0 Plugin-skill discovery failed: ")+(i instanceof Error?i.message:String(i))),null}let n=t.map(i=>({name:i.name,description:i.description,...i.argumentHint?{argumentHint:i.argumentHint}:{}})),r=Ey(),o=new Set(pt().map(Ir)),s=[],a=new Set;for(let i of n){let l=`/${i.name}`;if(Ty.has(l))continue;let c=Ir(i.name),u=r.get(c);if(o.has(c)){let p=i.name.includes(":")?i.name:`plugin:${i.name}`,m={...i,name:p};rt(vc(m,u)),s.push({bare:c,altSlash:`/${p}`,altDescription:i.description}),a.add(c);continue}rt(vc(i,u))}return Ar={discovered:n,collisions:s,shadowedBareNames:a},rt(Iy(n)),n.length}function Ec(){return Ar.collisions.length===0?[]:Ar.collisions.map(e=>d.dim(` /${e.bare}: vendored or user skill wins; plugin form ${e.altSlash} stays reachable.`))}async function Pc(e){let[t,n]=await Promise.all([Tc(e),Zo(e)]);return{skillCount:t,agentCount:n}}var _y={name:"/reload-plugins",summary:"Reload plugin skills from disk and refresh the slash registry",async handler(e){e.out.line(),e.out.info("Reloading plugins\u2026");try{let r=e.session.getQuery();typeof r.reloadPlugins=="function"&&await r.reloadPlugins()}catch(r){e.out.warn(`Plugin reload failed: ${r instanceof Error?r.message:String(r)}`)}let[t,n]=await Promise.all([Tc(e.session),Zo(e.session)]);if(t===null&&n===null)e.out.error("Could not refresh plugin skills or agents.");else{let r=[];t!==null&&r.push(`${t} skill${t===1?"":"s"}`),n!==null&&r.push(`${n} agent${n===1?"":"s"}`),e.out.success(`Reloaded ${r.join(" + ")}.`)}return e.out.line(),"continue"}};function Cc(){se(Ay),se(_y)}import{emitKeypressEvents as Dy}from"readline";import{createLogUpdate as Ly}from"log-update";function bt(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function _r(e,t){let n=bt(t,e.buffer.length);return n===e.cursor?e:{buffer:e.buffer,cursor:n}}function Ry(e,t){let n=bt(t,e.length);for(;n>0&&/\s/.test(e.charAt(n-1));)n--;for(;n>0&&!/\s/.test(e.charAt(n-1));)n--;return n}function My(e,t){let n=e.length,r=bt(t,n);for(;r<n&&/\s/.test(e.charAt(r));)r++;for(;r<n&&!/\s/.test(e.charAt(r));)r++;return r}function $y(e,t){let n=bt(t,e.length),r=e.lastIndexOf(`
1579
+ `,n-1);return r<0?0:r+1}function Oy(e,t){let n=bt(t,e.length),r=e.indexOf(`
1580
+ `,n);return r<0?e.length:r}function ot(e,t,n){let r=bt(t.start,e.buffer.length),o=bt(t.end,e.buffer.length),s=Math.min(r,o),a=Math.max(r,o);if(s===a&&n.length===0)return e;let i=e.buffer.slice(0,s)+n+e.buffer.slice(a),l=s+n.length;return i===e.buffer&&l===e.cursor?e:{buffer:i,cursor:l}}var W={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:ot,insert(e,t){return t.length===0?e:ot(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=Uo(e.buffer,e.cursor);return ot(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=dn(e.buffer,e.cursor);return ot(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=Ry(e.buffer,e.cursor);return t===e.cursor?e:ot(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=My(e.buffer,e.cursor);return t===e.cursor?e:ot(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=$y(e.buffer,e.cursor);return t===e.cursor?e:ot(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=Oy(e.buffer,e.cursor);return t===e.cursor?e:ot(e,{start:e.cursor,end:t},"")},moveLeft(e){return _r(e,Uo(e.buffer,e.cursor))},moveRight(e){return _r(e,dn(e.buffer,e.cursor))},moveHome(e){return _r(e,0)},moveEnd(e){return _r(e,e.buffer.length)}};var Ac=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"];function es(){return Ac[Math.floor(Math.random()*Ac.length)]}var Ic=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Rr=class{stdout;stdin;onCancel;promptText;armed=!1;canceled=!1;wasRaw=!1;logUpdate=null;overlay="";input=W.seed("");queued=!1;handleKeypress=null;resizeUnsub=null;spinner=null;spinnerInterval=null;committing=!1;constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.promptText=t.promptText??" "+d.dim("\u23AF")+" "}isArmed(){return this.armed}async arm(){if(!this.armed&&!(!this.stdout.isTTY||!this.stdin.isTTY)){this.logUpdate||(this.logUpdate=Ly(this.stdout)),this.wasRaw=this.stdin.isRaw??!1;try{this.stdin.setRawMode(!0)}catch{this.logUpdate=null,this.wasRaw=!1;return}this.stdin.resume(),Dy(this.stdin),this.handleKeypress=(t,n)=>this.dispatchKey(t,n),this.stdin.on("keypress",this.handleKeypress),this.resizeUnsub=Dt.subscribe(()=>{this.repaint()}),this.armed=!0,this.canceled=!1,this.repaint()}}disarm(){if(this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner=null,!this.armed){this.resetState();return}if(this.handleKeypress&&(this.stdin.removeListener("keypress",this.handleKeypress),this.handleKeypress=null),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.logUpdate)try{this.logUpdate.clear()}catch{}if(this.stdout.isTTY&&this.stdin.isTTY)try{this.stdin.setRawMode(this.wasRaw)}catch{}this.armed=!1,this.resetState()}setOverlay(t){this.overlay=t,this.repaint()}setSpinner(t){if(!this.stdout.isTTY)return;if(!t.enabled){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner&&(this.spinner=null,this.repaint());return}if(this.spinner)return;let n=t.rotateVerbEveryMs??3500;this.spinner={frameIndex:0,verb:es(),nextVerbRotateAt:Date.now()+n},this.spinnerInterval=setInterval(()=>this.tickSpinner(n),80),this.repaint()}tickSpinner(t){if(!this.spinner)return;this.spinner.frameIndex=(this.spinner.frameIndex+1)%Ic.length;let n=Date.now();n>=this.spinner.nextVerbRotateAt&&(this.spinner.verb=es(),this.spinner.nextVerbRotateAt=n+t),this.repaint()}commitAbove(t){if(!this.armed||!this.logUpdate){this.stdout.write(t+`
1455
1581
  `);return}this.committing=!0;try{this.logUpdate.clear(),this.stdout.write(t+`
1456
- `)}finally{this.committing=!1}this.repaint()}getBuffer(){return{text:this.input.buffer,queued:this.queued}}renderInputLine(){let t=this.queued?" "+d.dim("[queued]"):"",n=this.input.buffer.slice(0,this.input.cursor),r=Zt(this.input.buffer,this.input.cursor),o=this.input.cursor<this.input.buffer.length?this.input.buffer.slice(this.input.cursor,r):" ",s=this.input.cursor<this.input.buffer.length?this.input.buffer.slice(r):"",a=this.input.buffer.length===0&&!this.queued?"":d.user.inverse(o);return this.promptText+n+a+s+t}repaint(){if(!this.armed||!this.logUpdate||this.committing)return;let t=this.renderInputLine(),n=this.overlay?this.overlay.split(`
1457
- `):[],r=this.spinner?d.meta(`${Tl[this.spinner.frameIndex]} ${this.spinner.verb}...`):null,o=Math.max(1,(this.stdout.rows??24)-1),s=(r?1:0)+1,a=Math.max(0,o-s),i=n.length>a?n.slice(-a):n,l=[];l.push(...i),r&&l.push(r),l.push(t),this.logUpdate(l.join(`
1458
- `))}resetState(){this.overlay="",this.input=W.seed(""),this.queued=!1,this.canceled=!1,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null)}applyEdit(t){return t===this.input?!1:(this.input=t,this.queued=!1,this.repaint(),!0)}dispatchKey(t,n){if(!this.armed)return;if(n?.name==="escape"||n?.ctrl&&n?.name==="c"){if(this.canceled)return;this.canceled=!0,this.onCancel&&this.onCancel();return}if(n?.name==="return"){this.input.buffer.length>0&&!this.queued&&(this.queued=!0,this.repaint());return}if(n?.name==="backspace"){let s=W.backspace(this.input);s!==this.input?this.applyEdit(s):this.queued&&(this.queued=!1,this.repaint());return}if(n?.name==="left"){this.applyEdit(W.moveLeft(this.input));return}if(n?.name==="right"){this.applyEdit(W.moveRight(this.input));return}if(n?.name==="home"){this.applyEdit(W.moveHome(this.input));return}if(n?.name==="end"){this.applyEdit(W.moveEnd(this.input));return}if(n?.name==="delete"){this.applyEdit(W.deleteForward(this.input));return}let r=["up","down","tab","pageup","pagedown"];if(n?.name&&r.includes(n.name)||n?.ctrl||n?.meta)return;let o=typeof t=="string"&&t.length===1&&t>=" "?t:typeof n?.sequence=="string"&&n.sequence.length===1&&n.sequence>=" "?n.sequence:null;o!==null&&this.applyEdit(W.insert(this.input,o))}};var dr=3;function El(e){switch(po(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 Po(e){return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,"$1")}function pr(e){let t=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(t){let n=t[1],r=Po(t[2]??""),{color:o,glyph:s}=Et(n);return o(s+" ")+o.bold(n)+d.toolArg(r)}return d.tool("\u25CF ")+d.toolArg(e)}function pt(e,t,n=60){let r=e.isError?d.error:d.dim,o=t??process.env.HOME??"___NOHOME___";if(e.persistedPath){let a=e.persistedPath.startsWith(o)?"~"+e.persistedPath.slice(o.length):e.persistedPath;return r(`saved \u2192 ${a}`)}if(e.lineCount!==void 0&&e.lineCount>1)return r(`${e.lineCount} lines`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return r(s)}function Pl(e,t){if(!e||!e.trim())return[];let n=d.dim("\u2502 "),r=Math.max(1,z()-t.length-2-2),o=[];for(let s of e.split(`
1459
- `)){let a=J(s,r);for(let i of a.split(`
1460
- `))o.push(t+n+i)}return o}function Co(e,t,n,r){let o=" ".repeat(n+1),s=e.filter(c=>c.kind==="text"),a=e.filter(c=>c.kind==="tool");for(let c of s)r.push(...Pl(c.text,o));let i=a.slice(0,dr),l=a.length-i.length;for(let c=0;c<i.length;c++){let u=i[c],p=c===i.length-1&&l<=0,m=d.dim(p?"\u2514 ":"\u251C "),f=t.get(u.toolUseId);Ye.has(u.toolName)&&f&&f.length>0?(r.push(o+m+u.prefix),Co(f,t,n+1,r)):u.result?r.push(o+m+u.prefix+d.dim(" \u2014 ")+pt(u.result)):(r.push(o+m+u.prefix),r.push(o+" "+d.dim(El(u.toolName))))}l>0&&r.push(o+d.dim(`\u2026 +${l} tool uses`))}function Cl(e,t,n,r){let o=" ".repeat(n+1),s=[],a=e.filter(u=>u.kind==="text"),i=e.filter(u=>u.kind==="tool");for(let u of a)s.push(...Pl(u.text,o));let l=i.slice(0,dr),c=i.length-l.length;for(let u=0;u<l.length;u++){let p=l[u],m=u===l.length-1&&c<=0,f=d.dim(m?"\u2514 ":"\u251C "),g=t.get(p.toolUseId);Ye.has(p.toolName)&&g&&g.length>0?(s.push(o+f+p.prefix),s.push(...Cl(g,t,n+1,r))):p.result?s.push(o+f+p.prefix+d.dim(" \u2014 ")+pt(p.result,r)):s.push(o+f+p.prefix)}return c>0&&s.push(o+d.dim(`\u2026 +${c} tool uses`)),s}function Al(e,t,n,r){let o=t.filter(u=>u.kind==="tool"),a=o.filter(u=>u.result).reduce((u,p)=>u+(p.result.lineCount??0),0),i=[];o.length>dr&&(i.push(`${o.length} tools`),a>0&&i.push(`${a} lines`));let l=i.length>0?" "+e.prefix+d.dim(" \u2014 "+i.join(" \xB7 ")):" "+e.prefix,c=Cl(t,n,1,r);return e.agentResultSummary&&c.push(" "+d.dim("\u23BF "+e.agentResultSummary)),[l,...c].join(`
1461
- `)}function Ao(e,t,n){let r=[];for(let o of t){let s=e.get(o);if(s.length===1){let a=s[0];a.result?r.push(" "+a.prefix+d.dim(" \u2014 ")+pt(a.result,n)):r.push(" "+a.prefix)}else r.push(Vg(o,s,n))}return r}function Vg(e,t,n){let{color:r,glyph:o}=Et(e),s=t.map(u=>Po(u.toolInput).trim()),a=r(o+" ")+r.bold(e)+d.dim(` \xD7${t.length}`)+" "+d.toolArg(s.join(", ")),i=t.filter(u=>u.result),l=i.filter(u=>u.result.isError);if(l.length>0){let u=i.length-l.length,m=i.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,y)=>g+y,0),f=[];return m>0&&f.push(`${m} lines`),u>0&&f.push(`${u} ok`),f.push(d.error(`${l.length} error${l.length>1?"s":""}`))," "+a+d.dim(" \u2014 ")+f.join(d.dim(", "))}let c=i.map(u=>u.result?.lineCount).filter(u=>u!==void 0);if(c.length===i.length&&c.length>0){if(c.every(m=>m===c[0]))return" "+a+d.dim(` \u2014 ${c[0]} lines each`);let p=c.reduce((m,f)=>m+f,0);return" "+a+d.dim(` \u2014 ${p} lines total`)}if(i.length>0){let u=i.map(p=>pt(p.result,n));return" "+a+d.dim(" \u2014 ")+u.join(d.dim(", "))}return" "+a}var sn=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=pr(n+r),s=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:r,prefix:o,...s!==void 0?{agentContext:s}:{}};this.entries.set(t,a),this.order.push(t),Ye.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o){let s=pr(n+r),a={kind:"tool",toolUseId:t,toolName:n,toolInput:r,prefix:s,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,a),this.order.push(t)}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)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}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}getOverlay(){let t=this.buildChildMap(),n=[];for(let r of this.order){let o=this.entries.get(r);if(!o||o.kind!=="tool"||o.agentContext)continue;let s=t.get(o.toolUseId);Ye.has(o.toolName)&&s&&s.length>0?(n.push(" "+o.prefix),Co(s,t,1,n)):o.result?n.push(" "+o.prefix+d.dim(" \u2014 ")+pt(o.result)):n.push(" "+o.prefix+d.dim(" \u2026"))}return n.join(`
1462
- `)}flush(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let i of this.order){let l=this.entries.get(i);!l||l.kind!=="tool"||l.agentContext||r.push(i)}let o=[],s=new Map,a=[];for(let i of r){let l=this.entries.get(i);if(!l||l.kind!=="tool")continue;let c=n.get(l.toolUseId);Ye.has(l.toolName)&&c&&c.length>0?(o.push(...Ao(s,a,t)),s.clear(),a.length=0,o.push(Al(l,c,n,t))):(s.has(l.toolName)||(s.set(l.toolName,[]),a.push(l.toolName)),s.get(l.toolName).push(l))}return o.push(...Ao(s,a,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}};var mr=class{buffer="";startedAt=null;hasEmitted=!1;push(t){this.hasEmitted||(this.buffer+=t,this.startedAt||(this.startedAt=Date.now()))}isActive(){return!this.hasEmitted}hasBufferedContent(){return this.buffer.trim().length>0}peek(){return this.buffer}consume(){return this.hasEmitted=!0,this.buffer}collapse(){if(this.hasEmitted||!this.startedAt)return null;this.hasEmitted=!0;let t=Date.now()-this.startedAt,n=t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`,r=Math.ceil(this.buffer.length/4);return` ${d.thinking("\u25C6 thought for "+n+" \xB7 "+r+" tok")}`}};var Io="__main__";function Ml(e){let t={startedAt:Date.now(),stats:{tokens:0,toolUses:0},contentBuffer:"",done:!1,errored:!1};return e!==void 0&&(t.agentType=e),t}function Mo(e,t){return{type:"tool_result",toolUseId:"synthetic",content:e,isError:t}}function Rl(e){let t=["Done"],n=[];e.stats.toolUses&&n.push(`${e.stats.toolUses} tool${e.stats.toolUses===1?"":"s"}`),e.stats.tokens&&n.push(`${L(e.stats.tokens)} tok`);let r=e.responseMetadata?.durationMs;if(typeof r=="number"&&n.push(Se(r)),n.length===0){let o=Date.now()-e.startedAt;o>0&&n.push(Se(o))}return n.length>0&&t.push(`(${n.join(" \xB7 ")})`),t.join(" ")}var It=class{out;throttleMs;indent;buffer="";committed="";throttleTimer=null;logUpdate=null;isTTY;flushing=!1;compositor;constructor(t){this.out=t?.out??process.stdout,this.throttleMs=t?.throttleMs??33,this.indent=t?.indent??" ",this.isTTY=this.out.isTTY??!1,this.compositor=t?.compositor??null,this.logUpdate=null}async initLogUpdate(){if(!(!this.isTTY||this.logUpdate!==null))try{let n=(await import("log-update")).default,r=(o=>{n(o)});r.clear=()=>n.clear(),this.logUpdate=r}catch{this.logUpdate=null}}hasMarkdownContent(t){return/[#*_\-\`>\[\|~]/.test(t)}findBlockBoundary(t){let n=t.indexOf(`
1582
+ `)}finally{this.committing=!1}this.repaint()}getBuffer(){return{text:this.input.buffer,queued:this.queued}}renderInputLine(){let t=this.queued?" "+d.dim("[queued]"):"",n=this.input.buffer.slice(0,this.input.cursor),r=dn(this.input.buffer,this.input.cursor),o=this.input.cursor<this.input.buffer.length?this.input.buffer.slice(this.input.cursor,r):" ",s=this.input.cursor<this.input.buffer.length?this.input.buffer.slice(r):"",a=this.input.buffer.length===0&&!this.queued?"":d.user.inverse(o);return this.promptText+n+a+s+t}repaint(){if(!this.armed||!this.logUpdate||this.committing)return;let t=this.renderInputLine(),n=this.overlay?this.overlay.split(`
1583
+ `):[],r=this.spinner?d.meta(`${Ic[this.spinner.frameIndex]} ${this.spinner.verb}...`):null,o=Math.max(1,(this.stdout.rows??24)-1),s=(r?1:0)+1,a=Math.max(0,o-s),i=n.length>a?n.slice(-a):n,l=[];l.push(...i),r&&l.push(r),l.push(t),this.logUpdate(l.join(`
1584
+ `))}resetState(){this.overlay="",this.input=W.seed(""),this.queued=!1,this.canceled=!1,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null)}applyEdit(t){return t===this.input?!1:(this.input=t,this.queued=!1,this.repaint(),!0)}dispatchKey(t,n){if(!this.armed)return;if(n?.name==="escape"||n?.ctrl&&n?.name==="c"){if(this.canceled)return;this.canceled=!0,this.onCancel&&this.onCancel();return}if(n?.name==="return"){this.input.buffer.length>0&&!this.queued&&(this.queued=!0,this.repaint());return}if(n?.name==="backspace"){let s=W.backspace(this.input);s!==this.input?this.applyEdit(s):this.queued&&(this.queued=!1,this.repaint());return}if(n?.name==="left"){this.applyEdit(W.moveLeft(this.input));return}if(n?.name==="right"){this.applyEdit(W.moveRight(this.input));return}if(n?.name==="home"){this.applyEdit(W.moveHome(this.input));return}if(n?.name==="end"){this.applyEdit(W.moveEnd(this.input));return}if(n?.name==="delete"){this.applyEdit(W.deleteForward(this.input));return}let r=["up","down","tab","pageup","pagedown"];if(n?.name&&r.includes(n.name)||n?.ctrl||n?.meta)return;let o=typeof t=="string"&&t.length===1&&t>=" "?t:typeof n?.sequence=="string"&&n.sequence.length===1&&n.sequence>=" "?n.sequence:null;o!==null&&this.applyEdit(W.insert(this.input,o))}};var Mr=3;function _c(e){switch(Ho(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 ts(e){return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,"$1")}function bn(e){let t=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(t){let n=t[1],r=ts(t[2]??""),{color:o,glyph:s}=$t(n);return o(s+" ")+o.bold(n)+d.toolArg(r)}return d.tool("\u25CF ")+d.toolArg(e)}function kt(e,t,n=60){let r=e.isError?d.error:d.dim,o=t??process.env.HOME??"___NOHOME___";if(e.persistedPath){let a=e.persistedPath.startsWith(o)?"~"+e.persistedPath.slice(o.length):e.persistedPath;return r(`saved \u2192 ${a}`)}if(e.lineCount!==void 0&&e.lineCount>1)return r(`${e.lineCount} lines`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return r(s)}function Rc(e,t){if(!e||!e.trim())return[];let n=d.dim("\u2502 "),r=Math.max(1,V()-t.length-2-2),o=[];for(let s of e.split(`
1585
+ `)){let a=q(s,r);for(let i of a.split(`
1586
+ `))o.push(t+n+i)}return o}function ns(e,t,n,r){let o=" ".repeat(n+1),s=e.filter(c=>c.kind==="text"),a=e.filter(c=>c.kind==="tool");for(let c of s)r.push(...Rc(c.text,o));let i=a.slice(0,Mr),l=a.length-i.length;for(let c=0;c<i.length;c++){let u=i[c],p=c===i.length-1&&l<=0,m=d.dim(p?"\u2514 ":"\u251C "),f=t.get(u.toolUseId);tt.has(u.toolName)&&f&&f.length>0?(r.push(o+m+u.prefix),ns(f,t,n+1,r)):u.result?r.push(o+m+u.prefix+d.dim(" \u2014 ")+kt(u.result)):(r.push(o+m+u.prefix),r.push(o+" "+d.dim(_c(u.toolName))))}l>0&&r.push(o+d.dim(`\u2026 +${l} tool uses`))}function Mc(e,t,n,r){let o=" ".repeat(n+1),s=[],a=e.filter(u=>u.kind==="text"),i=e.filter(u=>u.kind==="tool");for(let u of a)s.push(...Rc(u.text,o));let l=i.slice(0,Mr),c=i.length-l.length;for(let u=0;u<l.length;u++){let p=l[u],m=u===l.length-1&&c<=0,f=d.dim(m?"\u2514 ":"\u251C "),g=t.get(p.toolUseId);tt.has(p.toolName)&&g&&g.length>0?(s.push(o+f+p.prefix),s.push(...Mc(g,t,n+1,r))):p.result?s.push(o+f+p.prefix+d.dim(" \u2014 ")+kt(p.result,r)):s.push(o+f+p.prefix)}return c>0&&s.push(o+d.dim(`\u2026 +${c} tool uses`)),s}function $c(e,t,n,r){let o=t.filter(u=>u.kind==="tool"),a=o.filter(u=>u.result).reduce((u,p)=>u+(p.result.lineCount??0),0),i=[];o.length>Mr&&(i.push(`${o.length} tools`),a>0&&i.push(`${a} lines`));let l=i.length>0?" "+e.prefix+d.dim(" \u2014 "+i.join(" \xB7 ")):" "+e.prefix,c=Mc(t,n,1,r);return e.agentResultSummary&&c.push(" "+d.dim("\u23BF "+e.agentResultSummary)),[l,...c].join(`
1587
+ `)}function rs(e,t,n){let r=[];for(let o of t){let s=e.get(o);if(s.length===1){let a=s[0];a.result?r.push(" "+a.prefix+d.dim(" \u2014 ")+kt(a.result,n)):r.push(" "+a.prefix)}else r.push(Fy(o,s,n))}return r}function Fy(e,t,n){let{color:r,glyph:o}=$t(e),s=t.map(u=>ts(u.toolInput).trim()),a=r(o+" ")+r.bold(e)+d.dim(` \xD7${t.length}`)+" "+d.toolArg(s.join(", ")),i=t.filter(u=>u.result),l=i.filter(u=>u.result.isError);if(l.length>0){let u=i.length-l.length,m=i.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,y)=>g+y,0),f=[];return m>0&&f.push(`${m} lines`),u>0&&f.push(`${u} ok`),f.push(d.error(`${l.length} error${l.length>1?"s":""}`))," "+a+d.dim(" \u2014 ")+f.join(d.dim(", "))}let c=i.map(u=>u.result?.lineCount).filter(u=>u!==void 0);if(c.length===i.length&&c.length>0){if(c.every(m=>m===c[0]))return" "+a+d.dim(` \u2014 ${c[0]} lines each`);let p=c.reduce((m,f)=>m+f,0);return" "+a+d.dim(` \u2014 ${p} lines total`)}if(i.length>0){let u=i.map(p=>kt(p.result,n));return" "+a+d.dim(" \u2014 ")+u.join(d.dim(", "))}return" "+a}var kn=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=bn(n+r),s=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:r,prefix:o,...s!==void 0?{agentContext:s}:{}};this.entries.set(t,a),this.order.push(t),tt.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o){let s=this.entries.get(t);if(s?.kind==="tool"){s.toolInput=r,s.prefix=bn(n+r),o!==void 0&&(s.agentContext=o);return}let a=bn(n+r),i={kind:"tool",toolUseId:t,toolName:n,toolInput:r,prefix:a,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,i),this.order.push(t)}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)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}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}getOverlay(){let t=this.buildChildMap(),n=[];for(let r of this.order){let o=this.entries.get(r);if(!o||o.kind!=="tool"||o.agentContext)continue;let s=t.get(o.toolUseId);tt.has(o.toolName)&&s&&s.length>0?(n.push(" "+o.prefix),ns(s,t,1,n)):o.result?n.push(" "+o.prefix+d.dim(" \u2014 ")+kt(o.result)):n.push(" "+o.prefix+d.dim(" \u2026"))}return n.join(`
1588
+ `)}flush(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let i of this.order){let l=this.entries.get(i);!l||l.kind!=="tool"||l.agentContext||r.push(i)}let o=[],s=new Map,a=[];for(let i of r){let l=this.entries.get(i);if(!l||l.kind!=="tool")continue;let c=n.get(l.toolUseId);tt.has(l.toolName)&&c&&c.length>0?(o.push(...rs(s,a,t)),s.clear(),a.length=0,o.push($c(l,c,n,t))):(s.has(l.toolName)||(s.set(l.toolName,[]),a.push(l.toolName)),s.get(l.toolName).push(l))}return o.push(...rs(s,a,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}};var $r=class{buffer="";startedAt=null;hasEmitted=!1;push(t){this.hasEmitted||(this.buffer+=t,this.startedAt||(this.startedAt=Date.now()))}isActive(){return!this.hasEmitted}hasBufferedContent(){return this.buffer.trim().length>0}peek(){return this.buffer}consume(){return this.hasEmitted=!0,this.buffer}collapse(){if(this.hasEmitted||!this.startedAt)return null;this.hasEmitted=!0;let t=Date.now()-this.startedAt,n=t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`,r=Math.ceil(this.buffer.length/4);return` ${d.thinking("\u25C6 thought for "+n+" \xB7 "+r+" tok")}`}};var os="__main__";function Dc(e){let t={startedAt:Date.now(),stats:{tokens:0,toolUses:0},contentBuffer:"",done:!1,errored:!1};return e!==void 0&&(t.agentType=e),t}function ss(e,t){return{type:"tool_result",toolUseId:"synthetic",content:e,isError:t}}function Lc(e){let t=["Done"],n=[];e.stats.toolUses&&n.push(`${e.stats.toolUses} tool${e.stats.toolUses===1?"":"s"}`),e.stats.tokens&&n.push(`${D(e.stats.tokens)} tok`);let r=e.responseMetadata?.durationMs;if(typeof r=="number"&&n.push(xe(r)),n.length===0){let o=Date.now()-e.startedAt;o>0&&n.push(xe(o))}return n.length>0&&t.push(`(${n.join(" \xB7 ")})`),t.join(" ")}var Ft=class{out;throttleMs;indent;buffer="";committed="";throttleTimer=null;logUpdate=null;isTTY;flushing=!1;compositor;constructor(t){this.out=t?.out??process.stdout,this.throttleMs=t?.throttleMs??33,this.indent=t?.indent??" ",this.isTTY=this.out.isTTY??!1,this.compositor=t?.compositor??null,this.logUpdate=null}async initLogUpdate(){if(!(!this.isTTY||this.logUpdate!==null))try{let n=(await import("log-update")).default,r=(o=>{n(o)});r.clear=()=>n.clear(),this.logUpdate=r}catch{this.logUpdate=null}}hasMarkdownContent(t){return/[#*_\-\`>\[\|~]/.test(t)}findBlockBoundary(t){let n=t.indexOf(`
1463
1589
 
1464
1590
  `);if(n!==-1)return n+2;let r=t.match(/\n[ \t]*```[ \t]*\n/);if(r&&r.index!==void 0)return r.index+r[0].length;let o=t.match(/```[a-z]*\n/);return o&&o.index!==void 0&&!t.slice(o.index+o[0].length).includes("\n```"),-1}applyIndent(t){return t.split(`
1465
1591
  `).map(n=>n?this.indent+n:"").join(`
1466
- `)}isInOpenCodeFence(t){return(t.match(/```/g)??[]).length%2===1}commitBlock(t){if(!t.trim())return;let n=this.hasMarkdownContent(t),r=Math.max(1,z()-2),o;n?o=Ve(t,{maxWidth:r}):o=t;let s=this.applyIndent(o),a=J(s,r);this.compositor&&this.compositor.commitAbove(a),this.committed?this.committed+=`
1467
- `+a:this.committed+=a}scheduleRepaint(){this.isTTY&&(this.flushing||(this.throttleTimer&&clearTimeout(this.throttleTimer),this.throttleTimer=setTimeout(()=>{this.throttleTimer=null,this.repaint()},this.throttleMs)))}async repaint(){if(this.flushing||!this.isTTY||!this.buffer.trim())return;let t,n=Math.max(1,z()-2);this.isInOpenCodeFence(this.buffer)?t=`
1592
+ `)}isInOpenCodeFence(t){return(t.match(/```/g)??[]).length%2===1}commitBlock(t){if(!t.trim())return;let n=this.hasMarkdownContent(t),r=this.indent.length,o=Math.max(1,V()-2),s=Math.max(1,o-r),a;n?a=et(t,{maxWidth:s}):a=q(t,s);let i=q(this.applyIndent(a),o);this.compositor&&this.compositor.commitAbove(i),this.committed?this.committed+=`
1593
+
1594
+ `+i:this.committed+=i}scheduleRepaint(){this.isTTY&&(this.flushing||(this.throttleTimer&&clearTimeout(this.throttleTimer),this.throttleTimer=setTimeout(()=>{this.throttleTimer=null,this.repaint()},this.throttleMs)))}async repaint(){if(this.flushing||!this.isTTY||!this.buffer.trim())return;let t,n=this.indent.length,r=Math.max(1,V()-2),o=Math.max(1,r-n);this.isInOpenCodeFence(this.buffer)?t=`
1468
1595
  \u258D streaming code\u2026
1469
- `:this.hasMarkdownContent(this.buffer)?t=Ve(this.buffer,{maxWidth:n}):t=this.buffer;let r=this.applyIndent(t),o=J(r,n);if(this.compositor){this.compositor.setOverlay(o);return}this.logUpdate||await this.initLogUpdate(),this.logUpdate&&(this.flushing||this.logUpdate(o))}push(t){if(this.flushing)return;this.buffer+=t;let n=this.findBlockBoundary(this.buffer);for(;n!==-1;){let r=this.buffer.slice(0,n);this.commitBlock(r),this.buffer=this.buffer.slice(n),n=this.findBlockBoundary(this.buffer)}this.scheduleRepaint()}async flush(){this.throttleTimer&&(clearTimeout(this.throttleTimer),this.throttleTimer=null),this.flushing=!0,this.compositor&&this.compositor.setOverlay(""),this.buffer.trim()&&(this.commitBlock(this.buffer),this.buffer=""),!this.compositor&&(this.isTTY&&this.logUpdate?(this.logUpdate.clear(),this.out.write(this.committed+`
1596
+ `:this.hasMarkdownContent(this.buffer)?t=et(this.buffer,{maxWidth:o}):t=this.buffer;let s=q(this.applyIndent(t),r);if(this.compositor){this.compositor.setOverlay(s);return}this.logUpdate||await this.initLogUpdate(),this.logUpdate&&(this.flushing||this.logUpdate(s))}push(t){if(this.flushing)return;this.buffer+=t;let n=this.findBlockBoundary(this.buffer);for(;n!==-1;){let r=this.buffer.slice(0,n);this.commitBlock(r),this.buffer=this.buffer.slice(n),n=this.findBlockBoundary(this.buffer)}this.scheduleRepaint()}async flush(){this.throttleTimer&&(clearTimeout(this.throttleTimer),this.throttleTimer=null),this.flushing=!0,this.compositor&&this.compositor.setOverlay(""),this.buffer.trim()&&(this.commitBlock(this.buffer),this.buffer=""),!this.compositor&&(this.isTTY&&this.logUpdate?(this.logUpdate.clear(),this.out.write(this.committed+`
1470
1597
  `)):this.committed&&this.out.write(this.committed+`
1471
- `))}getCommittedOutput(){return this.committed}getPendingBuffer(){return this.buffer}commitPending(){this.buffer.trim()&&(this.commitBlock(this.buffer),this.buffer="",this.compositor&&this.compositor.setOverlay(""))}dispose(){this.throttleTimer&&(clearTimeout(this.throttleTimer),this.throttleTimer=null),this.logUpdate&&(this.logUpdate.clear(),this.logUpdate=null),this.buffer="",this.committed=""}};var Yg=["observing","modeling","choosing","acting","updating"],qg={observing:"observe",modeling:"model",choosing:"choose",acting:"act",updating:"update"};function _l(){return{stage:"observing",pendingTools:new Set}}function $l(e,t){let n=e.stage;switch(t.type){case"chunk":{let r=t.chunk;r.type==="tool_use_detail"?(e.pendingTools.add(r.toolUseId),e.stage="acting"):r.type==="tool_result"?(e.pendingTools.delete(r.toolUseId),e.stage=e.pendingTools.size>0?"acting":"updating"):r.type==="thinking"?e.pendingTools.size===0&&(e.stage="modeling"):r.type==="content"&&e.pendingTools.size===0&&(e.stage="choosing");break}case"done":e.pendingTools.clear();break;default:break}return e.stage!==n}function Ol(e,t){return Yg.map(r=>{let o=r===e,s=o?"\u25C6":"\u25C7",a=qg[r],i=`${s} ${a}`;return o?t.accent(t.bold(i)):t.dim(i)}).join(t.dim(" \xB7 "))}function Dl(e,t,n,r){switch(n.stageTracker&&$l(n.stageTracker,e),e.type){case"progress":r.set(e.progress.taskId,e.progress),n.isTTY&&fr(n,r);return;case"chunk":{let o=e.chunk;if(o.type==="tool_use_detail")n.streamingMarkdown.current?.commitPending(),n.toolLane.addStartWithAgentContext(o.toolUseId,o.toolName,o.toolInput,void 0),t.stats.toolUses+=1,n.isTTY&&fr(n,r);else if(o.type==="tool_result")n.streamingMarkdown.current?.commitPending(),n.toolLane.addResult(o.toolUseId,o),n.isTTY&&fr(n,r);else if(o.type==="content")t.contentBuffer+=o.content,n.isTTY&&(Ro(n),n.streamingMarkdown.current||(n.streamingMarkdown.current=new It({...n.compositor?{compositor:n.compositor}:{}})),n.streamingMarkdown.current.push(o.content));else if(o.type==="thinking"){if(n.thinkingMode==="off")return;n.thinkingLane.push(o.content),n.thinkingMode==="live"&&n.isTTY&&fr(n,r)}return}case"message":t.contentBuffer||(t.contentBuffer=e.message.content);return;case"error":t.errored=!0,Xg(e.error,n.out);return;case"done":t.done=!0,e.metadata&&(t.responseMetadata=e.metadata),Qg(t,n);return;case"suggestion":return;case"panel":Jg(e.spec,t,n);return}}function Jg(e,t,n){n.streamingMarkdown.current?n.streamingMarkdown.current.commitPending():t.contentBuffer.trim()&&(Ll(t.contentBuffer,n.out),t.contentBuffer=""),Ro(n);let o=At(e).split(`
1472
- `);if(n.isTTY&&n.compositor)for(let s of o)n.compositor.commitAbove(s);else for(let s of o)n.out.line(s)}async function Qg(e,t){if(t.streamingMarkdown.current){try{await t.streamingMarkdown.current.flush()}catch{}t.streamingMarkdown.current.dispose(),t.streamingMarkdown.current=null}else e.contentBuffer.trim()&&Ll(e.contentBuffer,t.out);if(e.contentBuffer="",Ro(t),t.thinkingMode!=="off"){let n=t.thinkingLane.collapse();n&&t.out.line(n)}}function Ll(e,t){let n=Ve(e);for(let r of n.split(`
1473
- `))t.line(r)}function Xg(e,t){let n=nn(e.message,e.stack);for(let r of n.split(`
1474
- `))t.line(r)}function Ro(e){if(!e.toolLane.hasPending())return;let t=e.toolLane.flush();if(e.isTTY&&e.compositor){for(let n of t)e.compositor.commitAbove(n);e.compositor.setOverlay("")}else for(let n of t)e.out.line(n)}function fr(e,t){if(!e.compositor)return;let n=[];e.stageTracker&&n.push(" "+Ol(e.stageTracker.stage,{dim:d.dim,accent:d.brand,bold:d.bold})),e.toolLane.hasPending()&&n.push(e.toolLane.getOverlay());let r=[];for(let o of t.values())r.push(..._a(o));r.length>0&&n.push(r.join(`
1598
+ `))}getCommittedOutput(){return this.committed}getPendingBuffer(){return this.buffer}commitPending(){this.buffer.trim()&&(this.commitBlock(this.buffer),this.buffer="",this.compositor&&this.compositor.setOverlay(""))}dispose(){this.throttleTimer&&(clearTimeout(this.throttleTimer),this.throttleTimer=null),this.logUpdate&&(this.logUpdate.clear(),this.logUpdate=null),this.buffer="",this.committed=""}};var Ny=["observing","modeling","choosing","acting","updating"],Uy={observing:"observe",modeling:"model",choosing:"choose",acting:"act",updating:"update"};function Fc(){return{stage:"observing",pendingTools:new Set}}function Nc(e,t){let n=e.stage;switch(t.type){case"chunk":{let r=t.chunk;r.type==="tool_use_detail"?(e.pendingTools.add(r.toolUseId),e.stage="acting"):r.type==="tool_result"?(e.pendingTools.delete(r.toolUseId),e.stage=e.pendingTools.size>0?"acting":"updating"):r.type==="thinking"?e.pendingTools.size===0&&(e.stage="modeling"):r.type==="content"&&e.pendingTools.size===0&&(e.stage="choosing");break}case"done":e.pendingTools.clear();break;default:break}return e.stage!==n}function Uc(e,t){return Ny.map(r=>{let o=r===e,s=o?"\u25C6":"\u25C7",a=Uy[r],i=`${s} ${a}`;return o?t.accent(t.bold(i)):t.dim(i)}).join(t.dim(" \xB7 "))}var Or="command-name",Dr="command-message",Lr="command-args";function jc(e,t){return`<${Or}>/${e}</${Or}>
1599
+ <${Dr}>${e}</${Dr}>
1600
+ <${Lr}>${t}</${Lr}>`}var jy=new RegExp(`<(?:${Or}|${Dr}|${Lr})>[\\s\\S]*?</(?:${Or}|${Dr}|${Lr})>`,"g");function is(e){return e.replace(jy,"").split(`
1601
+ `).filter(n=>n.trim()!=="").join(`
1602
+ `)}function Hc(e,t,n,r){switch(n.stageTracker&&Nc(n.stageTracker,e),e.type){case"progress":r.set(e.progress.taskId,e.progress),n.isTTY&&Nt(n,r);return;case"chunk":{let o=e.chunk;if(o.type==="tool_use_detail")n.streamingMarkdown.current?.commitPending(),n.toolLane.addStartWithAgentContext(o.toolUseId,o.toolName,o.toolInput,void 0),t.stats.toolUses+=1,n.isTTY&&Nt(n,r);else if(o.type==="tool_result")n.streamingMarkdown.current?.commitPending(),n.toolLane.addResult(o.toolUseId,o),n.isTTY&&Nt(n,r);else if(o.type==="content"){let s=is(o.content);if(!s)return;t.contentBuffer+=s,n.isTTY&&(wn(n,{afterContent:!!n.streamingMarkdown.current}),n.streamingMarkdown.current||(n.streamingMarkdown.current=new Ft({...n.compositor?{compositor:n.compositor}:{}})),n.streamingMarkdown.current.push(s))}else if(o.type==="thinking"){if(n.thinkingMode==="off")return;n.thinkingLane.push(o.content),n.thinkingMode==="live"&&n.isTTY&&Nt(n,r)}return}case"message":t.contentBuffer||(t.contentBuffer=is(e.message.content));return;case"error":t.errored=!0,Wy(e.error,n.out);return;case"done":t.done=!0,e.metadata&&(t.responseMetadata=e.metadata),By(t,n);return;case"suggestion":return;case"panel":Hy(e.spec,t,n);return}}function Hy(e,t,n){n.streamingMarkdown.current?n.streamingMarkdown.current.commitPending():t.contentBuffer.trim()&&(Bc(t.contentBuffer,n.out),t.contentBuffer=""),wn(n,{afterContent:!0});let o=Lt(e).split(`
1603
+ `);if(n.isTTY&&n.compositor)for(let s of o)n.compositor.commitAbove(s);else for(let s of o)n.out.line(s)}async function By(e,t){if(t.streamingMarkdown.current){try{await t.streamingMarkdown.current.flush()}catch{}t.streamingMarkdown.current.dispose(),t.streamingMarkdown.current=null}else e.contentBuffer.trim()&&Bc(e.contentBuffer,t.out);if(e.contentBuffer="",wn(t,{afterContent:!0}),t.thinkingMode!=="off"){let n=t.thinkingLane.collapse();n&&t.out.line(n)}}function Bc(e,t){let n=et(e);for(let r of n.split(`
1604
+ `))t.line(r)}function Wy(e,t){let n=gn(e.message,e.stack);for(let r of n.split(`
1605
+ `))t.line(r)}function wn(e,t){if(!e.toolLane.hasPending())return;let n=e.toolLane.flush(),r=t?.afterContent??!1;if(e.isTTY&&e.compositor){r&&e.compositor.commitAbove("");for(let o of n)e.compositor.commitAbove(o);e.compositor.commitAbove(""),e.compositor.setOverlay("")}else{r&&e.out.line("");for(let o of n)e.out.line(o);e.out.line("")}}function Nt(e,t){if(!e.compositor)return;let n=[];e.stageTracker&&n.push(" "+Uc(e.stageTracker.stage,{dim:d.dim,accent:d.brand,bold:d.bold})),e.toolLane.hasPending()&&n.push(e.toolLane.getOverlay());let r=[];for(let o of t.values())r.push(...Rl(o));r.length>0&&n.push(r.join(`
1475
1606
  `)),e.compositor.setOverlay(n.join(`
1476
- `))}function _o(e,t){if(!(!e||!e.trim()))for(let n of Zg(e))t.isTTY&&t.compositor?t.compositor.commitAbove(n):t.out.line(n)}function Zg(e){if(!e)return[];let t=d.dim("\u2502 "),n=" ",r=Math.max(1,z()-n.length-2-2),o=[];for(let s of e.split(`
1477
- `)){let a=J(s,r);for(let i of a.split(`
1478
- `))o.push(n+t+i)}return o}function eh(e,t){return{commitAbove:n=>e.commitAbove(n),setOverlay:n=>{let r=t.getOverlay();r&&n?e.setOverlay(r+`
1479
- `+n):e.setOverlay(r||n)}}}function th(e,t){if(!t.isTTY||!t.compositor)return null;let n=t.streamingMarkdown.get(e);if(!n){let r=eh(t.compositor,t.toolLane);n=new It({compositor:r}),t.streamingMarkdown.set(e,n)}return n}function Fl(e,t,n){if(t.syntheticAgentToolUseId)return;let r=`__synth_agent_${e}`,o=t.agentType??e;n.toolLane.addStartWithAgentContext(r,"Agent",`(${o})`,void 0),t.syntheticAgentToolUseId=r}function Nl(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&&(n.stats.toolUses=e.progress.toolUses);return;case"chunk":{let s=e.chunk;if(s.type==="tool_use_detail"){n.currentTextEntryId=void 0;let a=r.streamingMarkdown.get(t);a&&a.commitPending(),r.toolLane.addStartWithAgentContext(s.toolUseId,s.toolName,s.toolInput,o),n.stats.toolUses+=1,r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay())}else if(s.type==="tool_result"){let a=r.streamingMarkdown.get(t);a&&a.commitPending(),r.toolLane.addResult(s.toolUseId,s),r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay())}else if(s.type==="content"){n.currentTextEntryId||(n.currentTextEntryId="__in_text_block__"),n.contentBuffer+=s.content;let a=th(t,r);if(a)a.push(s.content);else{let i=n.contentBuffer.lastIndexOf(`
1480
- `);if(i!==-1){let l=n.contentBuffer.slice(0,i);n.contentBuffer=n.contentBuffer.slice(i+1),_o(l,r)}}}return}case"message":return;case"error":n.errored=!0,r.toolLane.addResult(o,Mo(`error \u2014 ${e.error.message}`,!0)),r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay());return;case"done":n.done=!0,e.metadata&&(n.responseMetadata=e.metadata),rh(t,n,r);return;case"suggestion":return;case"panel":nh(e.spec,t,n,r);return}}function nh(e,t,n,r){let o=r.streamingMarkdown.get(t);o?o.commitPending():n.contentBuffer.trim()&&(_o(n.contentBuffer,r),n.contentBuffer="");let s=At(e);for(let a of s.split(`
1481
- `))r.isTTY&&r.compositor?r.compositor.commitAbove(a):r.out.line(a)}function rh(e,t,n){let r=t.syntheticAgentToolUseId;if(!r||t.errored)return;let o=n.streamingMarkdown.get(e);if(o){try{o.flush()}catch{}o.dispose(),n.streamingMarkdown.delete(e)}else t.contentBuffer&&_o(t.contentBuffer,n);t.contentBuffer="";let s=Rl(t);n.toolLane.setAgentResultSummary(r,s),n.toolLane.addResult(r,Mo(s,!1)),n.isTTY&&n.compositor&&n.compositor.setOverlay(n.toolLane.getOverlay())}var Mt=class{out;thinkingMode;isTTY;onCancel;compositor=null;streamingMarkdownRef={current:null};toolLane=new sn;thinkingLane=new mr;stageTracker=_l();sources=new Map;subagentMarkdown=new Map;lastProgressByTask=new Map;disposed=!1;sink;constructor(t){this.out=t.out,this.thinkingMode=t.thinkingMode??(t.verbose===!0?"live":"summary"),this.onCancel=t.onCancel,this.isTTY=!(t.forceNonTty??!1)&&!!process.stdout.isTTY&&!!process.stdin.isTTY,this.sink=(n,r)=>this.process(n,r)}async arm(){if(this.disposed||!this.isTTY||this.compositor)return;let t=new ur({stdout:process.stdout,stdin:process.stdin,...this.onCancel?{onCancel:this.onCancel}:{}});await t.arm(),this.compositor=t,t.setSpinner({enabled:!0,rotateVerbEveryMs:3500})}makeOrchestratorCtx(){return{out:this.out,isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,thinkingLane:this.thinkingLane,thinkingMode:this.thinkingMode,streamingMarkdown:this.streamingMarkdownRef,...this.isTTY?{stageTracker:this.stageTracker}:{}}}getCompositor(){return this.compositor}makeSubagentCtx(){return{isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown}}process(t,n){if(this.disposed)return;let r=n?.subagentId??Io,o=r===Io,s=this.sources.get(r);s||(s=Ml(n?.agentType),this.sources.set(r,s),o||Fl(r,s,this.makeSubagentCtx())),o?Dl(t,s,this.makeOrchestratorCtx(),this.lastProgressByTask):Nl(t,r,s,this.makeSubagentCtx())}async dispose(){if(!this.disposed){if(this.disposed=!0,this.streamingMarkdownRef.current){try{await this.streamingMarkdownRef.current.flush()}catch{}this.streamingMarkdownRef.current.dispose(),this.streamingMarkdownRef.current=null}for(let t of this.subagentMarkdown.values()){try{await t.flush()}catch{}t.dispose()}if(this.subagentMarkdown.clear(),this.toolLane.hasPending()){let t=this.toolLane.flush();if(this.isTTY&&this.compositor){for(let n of t)this.compositor.commitAbove(n);this.compositor.setOverlay("")}else for(let n of t)this.out.line(n)}if(this.compositor){try{this.compositor.disarm()}catch{}this.compositor=null}}}};var Ul="command-name",jl="command-message",Bl="command-args";function Hl(e,t){return`<${Ul}>/${e}</${Ul}>
1482
- <${jl}>${e}</${jl}>
1483
- <${Bl}>${t}</${Bl}>`}function Wl(e,t){let n=Hl(e.name,t),r=e.context==="fork"?" This skill runs with context: 'fork' \u2014 the executor will fork a subagent.":"",o=`Use the \`skill\` tool with {"name": "${e.name}", "arguments": "${t}"} to dispatch this skill.${r}`;return[{type:"text",text:n},{type:"text",text:o}]}function oh(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,...n!==void 0?{usage:n}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o){let s=process.env.AFK_SKILL_STREAM_VERBOSE==="1",a=new Mt({out:r.out,verbose:s,onCancel:()=>{r.session.interrupt().catch(()=>{})}});try{await a.arm();let i=Wl(e,o);await En(a.sink,async()=>{for await(let l of r.session.sendMessageStream(i))a.sink(l)})}catch(i){r.out.line(),r.out.error(`${e.name} failed: ${i instanceof Error?i.message:String(i)}`)}finally{await a.dispose()}return"continue"}}}function Kl(){to(),Un(os(),"project");for(let e of st())Je(oh(se(e)))}import{existsSync as an,mkdirSync as xh,renameSync as Th,rmSync as Eh,symlinkSync as Ph,lstatSync as Ch,unlinkSync as Ah}from"fs";import{basename as Ih,join as Oo}from"path";import{existsSync as Gl}from"fs";import{isAbsolute as sh,resolve as Yl}from"path";import{homedir as zl}from"os";var ih=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|git@[^:]+:)/,ah=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,lh=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/;function ch(e){return e==="~"?zl():e.startsWith("~/")?Yl(zl(),e.slice(2)):e}function Rt(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(uh(t)){let o=Vl(t);if(!Gl(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(ih.test(t))return{type:"git",url:t};let n=lh.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=ah.exec(t);if(r&&r[1]&&r[2]){let o=r[1],s=r[2];return{type:"github",owner:o,repo:s,url:`https://github.com/${o}/${s}.git`}}if(Gl(t))return{type:"local",path:Vl(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function uh(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function Vl(e){let t=ch(e);return sh(t)?t:Yl(process.cwd(),t)}import{execFile as dh}from"child_process";import{promisify as ph}from"util";var mh=ph(dh),_t=async(e,t)=>{try{let{stdout:n,stderr:r}=await mh("git",Array.from(e),{cwd:t,maxBuffer:20971520});return{stdout:n,stderr:r}}catch(n){throw fh(n)&&n.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):n}};function fh(e){return typeof e=="object"&&e!==null&&"code"in e}async function gr(e,t,n={}){await(n.runner??_t)(["clone","--",e,t])}async function hr(e,t={}){await(t.runner??_t)(["fetch","--tags","--prune"],e)}async function Xe(e,t={}){let n=t.runner??_t,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e);return r.split(`
1484
- `).map(o=>o.trim()).filter(Boolean)}async function Ze(e,t,n={}){await(n.runner??_t)(["checkout","--detach",t],e)}async function Me(e,t={}){let n=t.runner??_t,{stdout:r}=await n(["rev-parse","HEAD"],e);return r.trim()}async function Re(e,t={}){let n=t.runner??_t;try{let{stdout:r}=await n(["symbolic-ref","refs/remotes/origin/HEAD","--short"],e);return r.trim().replace(/^origin\//,"")||"main"}catch{return"main"}}var gh=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function hh(e){let t=gh.exec(e);if(!t)return null;let[,n,r,o,s]=t;return{raw:e,major:Number(n),minor:Number(r),patch:Number(o),prerelease:s??null}}function yh(e,t){if(e===null&&t===null)return 0;if(e===null)return 1;if(t===null)return-1;let n=e.split("."),r=t.split("."),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let a=n[s],i=r[s];if(a===void 0)return-1;if(i===void 0)return 1;let l=/^\d+$/.test(a),c=/^\d+$/.test(i);if(l&&c){let u=Number(a)-Number(i);if(u!==0)return u}else{if(l)return-1;if(c)return 1;if(a<i)return-1;if(a>i)return 1}}return 0}function kh(e,t){return e.major!==t.major?e.major-t.major:e.minor!==t.minor?e.minor-t.minor:e.patch!==t.patch?e.patch-t.patch:yh(e.prerelease,t.prerelease)}function et(e){let t=e.map(n=>hh(n.trim())).filter(n=>n!==null);return t.length===0?null:(t.sort((n,r)=>kh(r,n)),t[0]?.raw??null)}import{existsSync as Jl,readFileSync as bh}from"fs";import{join as wh}from"path";var Sh=".claude-plugin/marketplace.json";function Ql(e){return wh(e,Sh)}function $o(e){return Jl(Ql(e))}function Ue(e){let t=Ql(e);if(!Jl(t))throw new Error(`marketplace manifest not found: ${t}`);let n;try{n=bh(t,"utf8")}catch(o){throw new Error(`could not read marketplace manifest at ${t}: ${ql(o)}`)}let r;try{r=JSON.parse(n)}catch(o){throw new Error(`marketplace manifest at ${t} is not valid JSON: ${ql(o)}`)}return vh(r,t)}function Xl(e){try{return Ue(e)}catch{return null}}function vh(e,t){if(!e||typeof e!="object")throw new Error(`marketplace manifest at ${t} must be a JSON object`);let n=e,r=n.name;if(typeof r!="string"||!r.trim())throw new Error(`marketplace manifest at ${t} is missing required "name" field`);let o=n.plugins;if(!Array.isArray(o))throw new Error(`marketplace manifest at ${t} is missing required "plugins" array`);let s=new Set,a=o.map((u,p)=>{if(!u||typeof u!="object")throw new Error(`marketplace manifest at ${t}: plugins[${p}] must be an object`);let m=u,f=m.name,g=m.source;if(typeof f!="string"||!f.trim())throw new Error(`marketplace manifest at ${t}: plugins[${p}] missing required "name"`);if(typeof g!="string"||!g.trim())throw new Error(`marketplace manifest at ${t}: plugins[${p}] missing required "source"`);let y=f.trim();if(s.has(y))throw new Error(`marketplace manifest at ${t}: duplicate plugin name "${y}"`);s.add(y);let h={name:y,source:g.trim()},k=m.description;return typeof k=="string"&&(h.description=k),h}),i={name:r.trim(),plugins:a},l=n.metadata;if(l&&typeof l=="object"){let u=l,p={};typeof u.description=="string"&&(p.description=u.description),Object.keys(p).length>0&&(i.metadata=p)}let c=n.owner;if(c&&typeof c=="object"){let u=c,p={};typeof u.name=="string"&&(p.name=u.name),typeof u.email=="string"&&(p.email=u.email),Object.keys(p).length>0&&(i.owner=p)}return i}function ql(e){return e instanceof Error?e.message:String(e)}async function br(e,t={},n={}){let r=n.cacheDir??_e(),o=n.indexPath??j(),s=n.now??(()=>new Date),a=n.gitRunner?{runner:n.gitRunner}:{},i=Rt(e);if(i.type==="marketplace-ref")throw new Error(`marketplace source cannot itself be a marketplace reference ("${e}")`);return xh(r,{recursive:!0}),i.type==="local"?Mh(i,t,r,o,s):Rh(i,t,r,o,s,a)}function Mh(e,t,n,r,o){let s=Ue(e.path),a=t.name??s.name,i=Oo(n,a);Do(i,t.force??!1),(an(i)||Lo(i))&&kr(i),Ph(e.path,i,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,installedAt:l,updatedAt:l};return Wt(a,c,r),{name:a,dir:i,entry:c,plugins:s.plugins.map(Zl)}}async function Rh(e,t,n,r,o,s){let a=t.name??$h(e),i=Oo(n,a);Do(i,t.force??!1),an(i)&&kr(i);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await gr(e.url,i,s);try{let c;if(t.ref)c=t.ref;else{let h=await Xe(i,s);c=et(h)??await Re(i,s)}(t.ref||await _h(i,c,s))&&await Ze(i,c,s);let u=await Me(i,s),p=Ue(i),m=a,f=i;if(!t.name&&p.name!==a){let h=Oo(n,p.name);Do(h,t.force??!1),an(h)&&kr(h),Th(i,h),m=p.name,f=h}let g=o().toISOString(),y={source:l,sourceType:e.type,ref:c,commit:u,installedAt:g,updatedAt:g};return Wt(m,y,r),{name:m,dir:f,entry:y,plugins:p.plugins.map(Zl)}}catch(c){try{an(i)&&kr(i)}catch{}throw c}}async function _h(e,t,n){let r=await Re(e,n);return t!==r}function $h(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):Ih(t)}function Do(e,t){if(!(!an(e)&&!Lo(e))&&!t)throw new Error(`marketplace directory already exists: ${e} (re-run with --force to replace)`)}function Lo(e){try{return Ch(e).isSymbolicLink()}catch{return!1}}function kr(e){if(Lo(e)){Ah(e);return}Eh(e,{recursive:!0,force:!0})}function Zl(e){return e.description?{name:e.name,description:e.description}:{name:e.name}}import{existsSync as Oh,lstatSync as Dh,rmSync as Lh,unlinkSync as Fh}from"fs";import{join as Nh}from"path";function wr(e,t={}){let n=t.cacheDir??_e(),r=t.indexPath??j(),o=Nh(n,e),s=!1;Uh(o)?(Fh(o),s=!0):Oh(o)&&(Lh(o,{recursive:!0,force:!0}),s=!0);let a=K(r),i=Object.prototype.hasOwnProperty.call(a.marketplaces,e),l=Object.entries(a.plugins).filter(([,c])=>c.marketplace===e).map(([c])=>c);return(i||l.length>0)&&Vs(e,r),{name:e,removedDir:s,removedIndexEntry:i,removedPluginEntries:l}}function Uh(e){try{return Dh(e).isSymbolicLink()}catch{return!1}}import{existsSync as jh}from"fs";import{join as Bh}from"path";async function ln(e,t={},n={}){let r=n.indexPath??j(),o=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},i=K(r).marketplaces[e];if(!i)throw new Error(`marketplace "${e}" is not installed`);let l=n.cacheDir?Bh(n.cacheDir,e):Ut(e);if(!jh(l))return{name:e,status:"missing-dir",dir:l};if(i.sourceType==="local")return{name:e,status:"skipped-local"};let c=new Set((Xl(l)?.plugins??[]).map(k=>k.name));await hr(l,s);let u;if(t.ref)u=t.ref;else{let k=await Xe(l,s);u=et(k)??i.ref??await Re(l,s)}if(u===i.ref){let k=await Me(l,s);return{name:e,status:"up-to-date",ref:u,commit:k}}await Ze(l,u,s);let p=await Me(l,s),m=o().toISOString(),f={...i,ref:u,commit:p,updatedAt:m};Wt(e,f,r);let g=new Set(Ue(l).plugins.map(k=>k.name)),y=[...g].filter(k=>!c.has(k)),h=[...c].filter(k=>!g.has(k));return{name:e,status:"updated",fromRef:i.ref,toRef:u,commit:p,addedPlugins:y,removedPlugins:h}}async function ec(e={}){let t=e.indexPath??j(),n=K(t),r=[];for(let o of Object.keys(n.marketplaces))try{r.push(await ln(o,{},e))}catch(s){let a=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:a})}return r}import{existsSync as xr,statSync as ey}from"fs";import{isAbsolute as ty,join as ny,resolve as rc}from"path";import{existsSync as tt,mkdirSync as Hh,readFileSync as Wh,renameSync as Kh,rmSync as Gh,symlinkSync as zh,lstatSync as Vh,unlinkSync as Yh}from"fs";import{basename as qh,join as $t}from"path";async function vr(e,t={},n={}){let r=n.pluginsDir??le(),o=n.indexPath??j(),s=n.now??(()=>new Date),a=n.gitRunner?{runner:n.gitRunner}:{},i=Rt(e);if(Hh(r,{recursive:!0}),i.type==="local")return Jh(i,t,r,o,s);if(i.type==="marketplace-ref")throw new Error(`marketplace-ref source "${i.marketplace}:${i.plugin}" must be installed via the marketplace resolver, not installPlugin directly`);return Qh(i,t,r,o,s,a)}function Jh(e,t,n,r,o){tc(e.path);let s=nc(e.path),a=t.name??s??qh(e.path),i=$t(n,a);Fo(i,t.force??!1),(tt(i)||No(i))&&Sr(i),zh(e.path,i,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,enabled:!0,installedAt:l,updatedAt:l,...s&&s!==a?{manifestName:s}:{}};return Be(a,c,r),{name:a,dir:i,entry:c}}async function Qh(e,t,n,r,o,s){let a=t.name??Zh(e),i=$t(n,a);Fo(i,t.force??!1),tt(i)&&Sr(i);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await gr(e.url,i,s);try{let c;if(t.ref)c=t.ref;else{let h=await Xe(i,s);c=et(h)??await Re(i,s)}(t.ref||await Xh(i,c,s))&&await Ze(i,c,s);let u=await Me(i,s);tc(i);let p=nc(i),m=a,f=i;if(!t.name&&p&&p!==a){let h=$t(n,p);Fo(h,t.force??!1),tt(h)&&Sr(h),Kh(i,h),m=p,f=h}let g=o().toISOString(),y={source:l,sourceType:e.type,ref:c,commit:u,enabled:!0,installedAt:g,updatedAt:g,...p&&p!==m?{manifestName:p}:{}};return Be(m,y,r),{name:m,dir:f,entry:y}}catch(c){try{tt(i)&&Sr(i)}catch{}throw c}}async function Xh(e,t,n){let r=await Re(e,n);return t!==r}function Zh(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):t}function tc(e){let t=$t(e,".claude-plugin","plugin.json");if(tt(t))return;let n=$t(e,".claude-plugin","marketplace.json");if(tt(n))throw new Error(`${e} contains .claude-plugin/marketplace.json instead of plugin.json. Use \`afk marketplace install <source>\` to install a marketplace, then \`afk plugin install <marketplace>:<plugin>\` to install a plugin from it.`)}function nc(e){let t=$t(e,".claude-plugin","plugin.json");if(!tt(t))return null;try{let n=JSON.parse(Wh(t,"utf8"));return typeof n.name=="string"&&n.name.trim()?n.name.trim():null}catch{return null}}function Fo(e,t){if(!(!tt(e)&&!No(e))&&!t)throw new Error(`plugin directory already exists: ${e} (re-run with --force to replace)`)}function No(e){try{return Vh(e).isSymbolicLink()}catch{return!1}}function Sr(e){if(No(e)){Yh(e);return}Gh(e,{recursive:!0,force:!0})}async function Ot(e,t,n={},r={}){let o=r.marketplaceDirFor??Ut,s=r.indexPath??j(),a=r.now??(()=>new Date),i=o(e);if(!xr(i)||!$o(i))throw new Error(`marketplace "${e}" is not installed (looked for manifest under ${i})`);let l=Ue(i),c=l.plugins.find(u=>u.name===t);if(!c){let u=l.plugins.map(p=>p.name).join(", ")||"(none)";throw new Error(`marketplace "${e}" does not list a plugin named "${t}". Available: ${u}`)}return ry(c.source)?oy(e,c,i,s,a,n):sy(e,c,n,r)}function Tr(e,t={}){let n=t.marketplaceDirFor??Ut,r=t.indexPath??j(),o=n(e);if(!xr(o)||!$o(o))throw new Error(`marketplace "${e}" is not installed`);let s=Ue(o),a=K(r);return s.plugins.map(i=>{let l=`${e}:${i.name}`,c=l in a.plugins||i.name in a.plugins&&a.plugins[i.name]?.marketplace===e,u={name:i.name,installed:c,key:l};return i.description&&(u.description=i.description),u})}function ry(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.startsWith("~")}function oy(e,t,n,r,o,s){let a=t.source,i=ty(a)||a.startsWith("~")?iy(a):rc(n,a);if(!xr(i))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${i}, but that path does not exist on disk`);if(!ey(i).isDirectory())throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${i}, but that path is not a directory`);let c=ny(i,".claude-plugin","plugin.json");if(!xr(c))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${i}, but no .claude-plugin/plugin.json was found`);let u=`${e}:${t.name}`,p=K(r);if(!s.force&&u in p.plugins&&p.plugins[u]?.enabled)throw new Error(`plugin "${u}" is already installed (re-run with --force to overwrite)`);let m=o().toISOString(),f={source:`${e}:${t.name}`,sourceType:"marketplace",ref:null,commit:null,enabled:!0,installedAt:m,updatedAt:m,marketplace:e};return Be(u,f,r),{key:u,name:t.name,dir:i,entry:f}}async function sy(e,t,n,r){let o={name:t.name,...n.ref?{ref:n.ref}:{},...n.force?{force:!0}:{}},s=await vr(t.source,o,r),a=r.indexPath??j(),i={...s.entry,marketplace:e};return Be(s.name,i,a),{key:s.name,name:s.name,dir:s.dir,entry:i}}function iy(e){if(e.startsWith("~")){let t=process.env.HOME??"";if(e==="~")return t;if(e.startsWith("~/"))return rc(t,e.slice(2))}return e}var oc=["add","plugins","install","remove","update"],ay={name:"/marketplaces",summary:"List installed plugin marketplaces",async handler(e){return cy(e),"continue"}},ly={name:"/marketplace",summary:"Manage plugin marketplaces (add | plugins | install | remove | update)",usage:"/marketplace <add|plugins|install|remove|update> [args]",async handler(e,t){let n=t.trim();if(!n)return uy(e),"continue";let[r,...o]=n.split(/\s+/);if(!r||!oc.includes(r))return e.out.error(`Unknown subcommand "${r??""}". Try one of: ${oc.join(", ")}.`),"continue";switch(r){case"add":return dy(e,o);case"plugins":return py(e,o);case"install":return my(e,o);case"remove":return fy(e,o);case"update":return gy(e,o);default:return"continue"}}};function sc(){re(ay),re(ly)}function cy(e){let t=K(),n=Object.entries(t.marketplaces).sort(([r],[o])=>r.localeCompare(o));if(e.out.line(),n.length===0){e.out.line(d.dim(" No marketplaces installed.")),e.out.line(d.dim(" Try: /marketplace add anthropics/claude-plugins-official")),e.out.line();return}e.out.line(d.bold("Installed marketplaces:"));for(let[r,o]of n){let s=o.ref?d.brand(o.ref):d.dim("(local)");e.out.line(` ${d.bold(r.padEnd(28))} ${s.padEnd(12)} ${d.dim(o.source)}`)}e.out.line()}function uy(e){e.out.line(),e.out.line(d.bold("/marketplace usage:")),e.out.line(` ${d.brand("/marketplace add")} <git-url|owner/repo|local-path>`),e.out.line(` ${d.brand("/marketplace plugins")} <marketplace>`),e.out.line(` ${d.brand("/marketplace install")} <marketplace> <plugin>`),e.out.line(` ${d.brand("/marketplace remove")} <marketplace>`),e.out.line(` ${d.brand("/marketplace update")} [<marketplace>]`),e.out.line()}async function dy(e,t){if(t.length===0)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let[n,r,...o]=t;if(!n)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let s=hy(o);e.out.info(`Installing marketplace ${n}\u2026`);try{let a=await br(n,{...r&&!r.startsWith("-")?{name:r}:{},...s.ref?{ref:s.ref}:{},...s.force?{force:!0}:{}});e.out.success(`Installed marketplace ${a.name} (${a.plugins.length} plugin(s) available).`),e.out.line(d.dim(` Next: /marketplace plugins ${a.name}`))}catch(a){e.out.error(`Install failed: ${Er(a)}`)}return"continue"}function py(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace plugins <marketplace>"),"continue";try{let r=Tr(n);if(e.out.line(),r.length===0)return e.out.line(d.dim(` Marketplace "${n}" lists no plugins.`)),e.out.line(),"continue";e.out.line(d.bold(`Plugins in ${n}:`)),r.forEach((o,s)=>{let a=o.installed?d.brand("[\u2713]"):d.dim("[ ]"),i=o.description?d.dim(` \u2014 ${o.description}`):"";e.out.line(` ${a} ${d.bold(String(s+1).padStart(2))}. ${d.bold(o.name)}${i}`)}),e.out.line(),e.out.line(d.dim(` Install one: /marketplace install ${n} <plugin>`)),e.out.line()}catch(r){e.out.error(`List failed: ${Er(r)}`)}return"continue"}async function my(e,t){let n,r;if(t.length===1&&t[0]?.includes(":")){let o=t[0].split(":");o.length===2&&([n,r]=o)}else[n,r]=t;if(!n||!r)return e.out.error("Usage: /marketplace install <marketplace> <plugin>"),"continue";e.out.info(`Installing ${n}:${r}\u2026`);try{let o=await Ot(n,r);e.out.success(`Installed ${o.key}.`),e.out.line(d.dim(" Run /reload-plugins to refresh this session's slash commands."))}catch(o){e.out.error(`Install failed: ${Er(o)}`)}return"continue"}function fy(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace remove <marketplace>"),"continue";let r=wr(n);if(!r.removedDir&&!r.removedIndexEntry&&r.removedPluginEntries.length===0)return e.out.line(d.dim(` No marketplace named "${n}" to remove.`)),"continue";let o=r.removedPluginEntries.length>0?` + ${r.removedPluginEntries.length} plugin(s)`:"";return e.out.success(`Removed marketplace ${n}${o}.`),"continue"}async function gy(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace update <marketplace>"),"continue";e.out.info(`Updating ${n}\u2026`);try{let r=await ln(n);switch(r.status){case"updated":{let o=r.addedPlugins.length>0?` +${r.addedPlugins.join(", ")}`:"",s=r.removedPlugins.length>0?` -${r.removedPlugins.join(", ")}`:"";e.out.success(`Updated ${n}: ${r.fromRef??"(none)"} \u2192 ${r.toRef}${o}${s}`);break}case"up-to-date":e.out.info(`${n} is up-to-date (${r.ref}).`);break;case"skipped-local":e.out.info(`${n} skipped (local source).`);break;case"missing-dir":e.out.warn(`${n}: marketplace dir missing (${r.dir}).`);break}}catch(r){e.out.error(`Update failed: ${Er(r)}`)}return"continue"}function hy(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];r==="-f"||r==="--force"?t.force=!0:(r==="-r"||r==="--ref")&&e[n+1]&&(t.ref=e[n+1],n+=1)}return t}function Er(e){return e instanceof Error?e.message:String(e)}function ic(){Wa();for(let e of Ja)re(e);for(let e of Qa)re(e);re(Xa),re(ll),re(cl),re(ul),re(fl),Kl(),vl(),gl(),sc()}function Pr(){return{line(e=""){console.log(e)},raw(e){process.stdout.write(e)},success(e){console.log(d.success("\u2713 ")+e)},info(e){console.log(d.info("\u2139 ")+e)},warn(e){console.log(d.warning("\u26A0 ")+e)},error(e){console.log(d.error("\u2717 ")+e)}}}var Cr=class{source;sampleEveryNTurns;cachedRatio;cachedDetail;inFlight=null;disposed=!1;constructor(t,n={}){this.source=t,this.sampleEveryNTurns=n.sampleEveryNTurns??3}attach(t){return this}getRatio(){return this.cachedRatio}getDetail(){return this.cachedDetail}async refresh(){if(this.disposed)return;if(this.inFlight)return this.inFlight;let t=this.doFetch().finally(()=>{this.inFlight=null});return this.inFlight=t,t}async onTurn(t){this.disposed||t%this.sampleEveryNTurns===1&&await this.refresh()}dispose(){this.disposed=!0}async doFetch(){try{let t=await this.source.getContextUsage(),n=yy(t.apiUsage),r=t.maxTokens??0,o=t.percentage;typeof o=="number"&&(this.cachedRatio=Math.min(1,Math.max(0,o/100)),this.cachedDetail={used:n,limit:r,percentage:o})}catch{}}};function yy(e){return e?e.input_tokens+e.output_tokens+e.cache_creation_input_tokens+e.cache_read_input_tokens:0}async function lc(e,t){let n,r,o;n=Ke(e.thinking)??yt(),r=Ge(e.effort)??kt(),o=wt(e.maxOutputTokens)??Yt();let s=Dn()??On(),i=gt().autoRouting?.interactive??!0,l=Gn(s,i),c,u=H(),p=new _({apiKey:u}),m=qn(),f={get sessionId(){return c?.sessionId},getInputStreamRef(){return c?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return c?.abortSignal??new AbortController().signal}},g=new Pt({subagentManager:p,parentSession:f,defaultConfig:{apiKey:u,systemPrompt:s},defaultSubagentModel:ht(),childProviderFactory:m,childSkillExecutorFactory:Jn(e.model,u)}),y=new qe({parentSession:f,defaultModel:e.model,defaultSubagentModel:ht(),apiKey:u}),h=Ln(e.provider,{subagentExecutor:g,skillExecutor:y})??new we({permissions:{allowedTools:[...We,"agent","skill"]},subagentExecutor:g,skillExecutor:y}),k={fn:I=>console.log(I)},S=new de({model:e.model,apiKey:H(),maxTurns:parseInt(e.maxTurns,10),hookRegistry:xt(I=>{k.fn(Yn(I))}),...l!==void 0?{systemPrompt:l}:{},...n!==void 0?{thinking:n}:{},...r!==void 0?{effort:r}:{},...o!==void 0?{maxOutputTokens:o}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},provider:h});c=S;let b=za(e.model),A=Pr(),N=new nr,$=new Cr(S);$.attach(S);let v={session:S,stats:b,out:A,ui:{clearScreen:()=>{N.stop(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),N.start(),N.repaint(bo(b,$))},repaintStatusLine:()=>N.repaint(bo(b,$))}};ic();let w=ac.createInterface({input:process.stdin,output:process.stdout,terminal:!1});return{session:S,stats:b,statusLine:N,contextSampler:$,completionWriter:k,slashCtx:v,rl:w,options:e}}import{promises as cn}from"node:fs";import*as uc from"node:os";import*as Ar from"node:path";async function cc(e,t,n=!1){await cn.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=Ar.join(e,`${r}.md`),s=n?" (continued)":"";return await cn.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
1607
+ `))}function as(e,t){if(!(!e||!e.trim()))for(let n of Ky(e))t.isTTY&&t.compositor?t.compositor.commitAbove(n):t.out.line(n)}function Ky(e){if(!e)return[];let t=d.dim("\u2502 "),n=" ",r=Math.max(1,V()-n.length-2-2),o=[];for(let s of e.split(`
1608
+ `)){let a=q(s,r);for(let i of a.split(`
1609
+ `))o.push(n+t+i)}return o}function Gy(e,t){return{commitAbove:n=>e.commitAbove(n),setOverlay:n=>{let r=t.getOverlay();r&&n?e.setOverlay(r+`
1610
+ `+n):e.setOverlay(r||n)}}}function zy(e,t){if(!t.isTTY||!t.compositor)return null;let n=t.streamingMarkdown.get(e);if(!n){let r=Gy(t.compositor,t.toolLane);n=new Ft({compositor:r}),t.streamingMarkdown.set(e,n)}return n}function Wc(e,t,n){if(t.syntheticAgentToolUseId)return;let r=`__synth_agent_${e}`,o=t.agentType??e;n.toolLane.addStartWithAgentContext(r,"Agent",`(${o})`,void 0),t.syntheticAgentToolUseId=r}function Kc(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&&(n.stats.toolUses=e.progress.toolUses);return;case"chunk":{let s=e.chunk;if(s.type==="tool_use_detail"){n.currentTextEntryId=void 0;let a=r.streamingMarkdown.get(t);a&&a.commitPending(),r.toolLane.addStartWithAgentContext(s.toolUseId,s.toolName,s.toolInput,o),n.stats.toolUses+=1,r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay())}else if(s.type==="tool_result"){let a=r.streamingMarkdown.get(t);a&&a.commitPending(),r.toolLane.addResult(s.toolUseId,s),r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay())}else if(s.type==="content"){n.currentTextEntryId||(n.currentTextEntryId="__in_text_block__"),n.contentBuffer+=s.content;let a=zy(t,r);if(a)a.push(s.content);else{let i=n.contentBuffer.lastIndexOf(`
1611
+ `);if(i!==-1){let l=n.contentBuffer.slice(0,i);n.contentBuffer=n.contentBuffer.slice(i+1),as(l,r)}}}return}case"message":return;case"error":n.errored=!0,r.toolLane.addResult(o,ss(`error \u2014 ${e.error.message}`,!0)),r.isTTY&&r.compositor&&r.compositor.setOverlay(r.toolLane.getOverlay());return;case"done":n.done=!0,e.metadata&&(n.responseMetadata=e.metadata),qy(t,n,r);return;case"suggestion":return;case"panel":Vy(e.spec,t,n,r);return}}function Vy(e,t,n,r){let o=r.streamingMarkdown.get(t);o?o.commitPending():n.contentBuffer.trim()&&(as(n.contentBuffer,r),n.contentBuffer="");let s=Lt(e);for(let a of s.split(`
1612
+ `))r.isTTY&&r.compositor?r.compositor.commitAbove(a):r.out.line(a)}function qy(e,t,n){let r=t.syntheticAgentToolUseId;if(!r||t.errored)return;let o=n.streamingMarkdown.get(e);if(o){try{o.flush()}catch{}o.dispose(),n.streamingMarkdown.delete(e)}else t.contentBuffer&&as(t.contentBuffer,n);t.contentBuffer="";let s=Lc(t);n.toolLane.setAgentResultSummary(r,s),n.toolLane.addResult(r,ss(s,!1)),n.isTTY&&n.compositor&&n.compositor.setOverlay(n.toolLane.getOverlay())}var Ut=class{out;thinkingMode;isTTY;onCancel;compositor=null;streamingMarkdownRef={current:null};toolLane=new kn;thinkingLane=new $r;stageTracker=Fc();sources=new Map;subagentMarkdown=new Map;lastProgressByTask=new Map;disposed=!1;sink;constructor(t){this.out=t.out,this.thinkingMode=t.thinkingMode??(t.verbose===!0?"live":"summary"),this.onCancel=t.onCancel,this.isTTY=!(t.forceNonTty??!1)&&!!process.stdout.isTTY&&!!process.stdin.isTTY,this.sink=(n,r)=>this.process(n,r)}async arm(){if(this.disposed||!this.isTTY||this.compositor)return;let t=new Rr({stdout:process.stdout,stdin:process.stdin,...this.onCancel?{onCancel:this.onCancel}:{}});await t.arm(),this.compositor=t,t.setSpinner({enabled:!0,rotateVerbEveryMs:3500})}makeOrchestratorCtx(){return{out:this.out,isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,thinkingLane:this.thinkingLane,thinkingMode:this.thinkingMode,streamingMarkdown:this.streamingMarkdownRef,...this.isTTY?{stageTracker:this.stageTracker}:{}}}getCompositor(){return this.compositor}makeSubagentCtx(){return{isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown}}process(t,n){if(this.disposed)return;let r=n?.subagentId??os,o=r===os,s=this.sources.get(r);if(s||(s=Dc(n?.agentType),this.sources.set(r,s),o||Wc(r,s,this.makeSubagentCtx())),o)Hc(t,s,this.makeOrchestratorCtx(),this.lastProgressByTask);else if(Kc(t,r,s,this.makeSubagentCtx()),t.type==="done"&&this.isTTY){let a=this.makeOrchestratorCtx();wn(a),Nt(a,this.lastProgressByTask)}}async dispose(){if(!this.disposed){if(this.disposed=!0,this.streamingMarkdownRef.current){try{await this.streamingMarkdownRef.current.flush()}catch{}this.streamingMarkdownRef.current.dispose(),this.streamingMarkdownRef.current=null}for(let t of this.subagentMarkdown.values()){try{await t.flush()}catch{}t.dispose()}if(this.subagentMarkdown.clear(),this.toolLane.hasPending()){let t=this.toolLane.flush();if(this.isTTY&&this.compositor){for(let n of t)this.compositor.commitAbove(n);this.compositor.setOverlay("")}else for(let n of t)this.out.line(n)}if(this.compositor){try{this.compositor.disarm()}catch{}this.compositor=null}}}};function Gc(e,t){let n=jc(e.name,t),r=e.context==="fork"?" This skill runs with context: 'fork' \u2014 the executor will fork a subagent.":"",o=`Use the \`skill\` tool with {"name": "${e.name}", "arguments": "${t}"} to dispatch this skill.${r}`;return[{type:"text",text:n},{type:"text",text:o}]}function Yy(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,...n!==void 0?{usage:n}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o){let s=process.env.AFK_SKILL_STREAM_VERBOSE==="1",a=new Ut({out:r.out,verbose:s,onCancel:()=>{r.session.interrupt().catch(()=>{})}});try{await a.arm();let i=Gc(e,o);await Bn(a.sink,async()=>{for await(let l of r.session.sendMessageStream(i))a.sink(l)})}catch(i){r.out.line(),r.out.error(`${e.name} failed: ${i instanceof Error?i.message:String(i)}`)}finally{await a.dispose()}return"continue"}}}function zc(){Co(),nr(Bs(),"project");for(let e of pt())rt(Yy(le(e)))}import{existsSync as Sn,mkdirSync as fb,renameSync as gb,rmSync as hb,symlinkSync as yb,lstatSync as bb,unlinkSync as kb}from"fs";import{basename as wb,join as cs}from"path";import{existsSync as Vc}from"fs";import{isAbsolute as Jy,resolve as Jc}from"path";import{homedir as qc}from"os";var Xy=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|git@[^:]+:)/,Qy=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,Zy=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/;function eb(e){return e==="~"?qc():e.startsWith("~/")?Jc(qc(),e.slice(2)):e}function jt(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(tb(t)){let o=Yc(t);if(!Vc(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(Xy.test(t))return{type:"git",url:t};let n=Zy.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=Qy.exec(t);if(r&&r[1]&&r[2]){let o=r[1],s=r[2];return{type:"github",owner:o,repo:s,url:`https://github.com/${o}/${s}.git`}}if(Vc(t))return{type:"local",path:Yc(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function tb(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function Yc(e){let t=eb(e);return Jy(t)?t:Jc(process.cwd(),t)}import{execFile as nb}from"child_process";import{promisify as rb}from"util";var ob=rb(nb),Ht=async(e,t)=>{try{let{stdout:n,stderr:r}=await ob("git",Array.from(e),{cwd:t,maxBuffer:20971520});return{stdout:n,stderr:r}}catch(n){throw sb(n)&&n.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):n}};function sb(e){return typeof e=="object"&&e!==null&&"code"in e}async function Fr(e,t,n={}){await(n.runner??Ht)(["clone","--",e,t])}async function Nr(e,t={}){await(t.runner??Ht)(["fetch","--tags","--prune"],e)}async function st(e,t={}){let n=t.runner??Ht,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e);return r.split(`
1613
+ `).map(o=>o.trim()).filter(Boolean)}async function it(e,t,n={}){await(n.runner??Ht)(["checkout","--detach",t],e)}async function De(e,t={}){let n=t.runner??Ht,{stdout:r}=await n(["rev-parse","HEAD"],e);return r.trim()}async function Le(e,t={}){let n=t.runner??Ht;try{let{stdout:r}=await n(["symbolic-ref","refs/remotes/origin/HEAD","--short"],e);return r.trim().replace(/^origin\//,"")||"main"}catch{return"main"}}var ib=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function ab(e){let t=ib.exec(e);if(!t)return null;let[,n,r,o,s]=t;return{raw:e,major:Number(n),minor:Number(r),patch:Number(o),prerelease:s??null}}function lb(e,t){if(e===null&&t===null)return 0;if(e===null)return 1;if(t===null)return-1;let n=e.split("."),r=t.split("."),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let a=n[s],i=r[s];if(a===void 0)return-1;if(i===void 0)return 1;let l=/^\d+$/.test(a),c=/^\d+$/.test(i);if(l&&c){let u=Number(a)-Number(i);if(u!==0)return u}else{if(l)return-1;if(c)return 1;if(a<i)return-1;if(a>i)return 1}}return 0}function cb(e,t){return e.major!==t.major?e.major-t.major:e.minor!==t.minor?e.minor-t.minor:e.patch!==t.patch?e.patch-t.patch:lb(e.prerelease,t.prerelease)}function at(e){let t=e.map(n=>ab(n.trim())).filter(n=>n!==null);return t.length===0?null:(t.sort((n,r)=>cb(r,n)),t[0]?.raw??null)}import{existsSync as Qc,readFileSync as ub}from"fs";import{join as db}from"path";var pb=".claude-plugin/marketplace.json";function Zc(e){return db(e,pb)}function ls(e){return Qc(Zc(e))}function ze(e){let t=Zc(e);if(!Qc(t))throw new Error(`marketplace manifest not found: ${t}`);let n;try{n=ub(t,"utf8")}catch(o){throw new Error(`could not read marketplace manifest at ${t}: ${Xc(o)}`)}let r;try{r=JSON.parse(n)}catch(o){throw new Error(`marketplace manifest at ${t} is not valid JSON: ${Xc(o)}`)}return mb(r,t)}function eu(e){try{return ze(e)}catch{return null}}function mb(e,t){if(!e||typeof e!="object")throw new Error(`marketplace manifest at ${t} must be a JSON object`);let n=e,r=n.name;if(typeof r!="string"||!r.trim())throw new Error(`marketplace manifest at ${t} is missing required "name" field`);let o=n.plugins;if(!Array.isArray(o))throw new Error(`marketplace manifest at ${t} is missing required "plugins" array`);let s=new Set,a=o.map((u,p)=>{if(!u||typeof u!="object")throw new Error(`marketplace manifest at ${t}: plugins[${p}] must be an object`);let m=u,f=m.name,g=m.source;if(typeof f!="string"||!f.trim())throw new Error(`marketplace manifest at ${t}: plugins[${p}] missing required "name"`);if(typeof g!="string"||!g.trim())throw new Error(`marketplace manifest at ${t}: plugins[${p}] missing required "source"`);let y=f.trim();if(s.has(y))throw new Error(`marketplace manifest at ${t}: duplicate plugin name "${y}"`);s.add(y);let h={name:y,source:g.trim()},k=m.description;return typeof k=="string"&&(h.description=k),h}),i={name:r.trim(),plugins:a},l=n.metadata;if(l&&typeof l=="object"){let u=l,p={};typeof u.description=="string"&&(p.description=u.description),Object.keys(p).length>0&&(i.metadata=p)}let c=n.owner;if(c&&typeof c=="object"){let u=c,p={};typeof u.name=="string"&&(p.name=u.name),typeof u.email=="string"&&(p.email=u.email),Object.keys(p).length>0&&(i.owner=p)}return i}function Xc(e){return e instanceof Error?e.message:String(e)}async function Hr(e,t={},n={}){let r=n.cacheDir??Fe(),o=n.indexPath??U(),s=n.now??(()=>new Date),a=n.gitRunner?{runner:n.gitRunner}:{},i=jt(e);if(i.type==="marketplace-ref")throw new Error(`marketplace source cannot itself be a marketplace reference ("${e}")`);return fb(r,{recursive:!0}),i.type==="local"?Sb(i,t,r,o,s):vb(i,t,r,o,s,a)}function Sb(e,t,n,r,o){let s=ze(e.path),a=t.name??s.name,i=cs(n,a);us(i,t.force??!1),(Sn(i)||ds(i))&&jr(i),yb(e.path,i,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,installedAt:l,updatedAt:l};return Qt(a,c,r),{name:a,dir:i,entry:c,plugins:s.plugins.map(tu)}}async function vb(e,t,n,r,o,s){let a=t.name??Tb(e),i=cs(n,a);us(i,t.force??!1),Sn(i)&&jr(i);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await Fr(e.url,i,s);try{let c;if(t.ref)c=t.ref;else{let h=await st(i,s);c=at(h)??await Le(i,s)}(t.ref||await xb(i,c,s))&&await it(i,c,s);let u=await De(i,s),p=ze(i),m=a,f=i;if(!t.name&&p.name!==a){let h=cs(n,p.name);us(h,t.force??!1),Sn(h)&&jr(h),gb(i,h),m=p.name,f=h}let g=o().toISOString(),y={source:l,sourceType:e.type,ref:c,commit:u,installedAt:g,updatedAt:g};return Qt(m,y,r),{name:m,dir:f,entry:y,plugins:p.plugins.map(tu)}}catch(c){try{Sn(i)&&jr(i)}catch{}throw c}}async function xb(e,t,n){let r=await Le(e,n);return t!==r}function Tb(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):wb(t)}function us(e,t){if(!(!Sn(e)&&!ds(e))&&!t)throw new Error(`marketplace directory already exists: ${e} (re-run with --force to replace)`)}function ds(e){try{return bb(e).isSymbolicLink()}catch{return!1}}function jr(e){if(ds(e)){kb(e);return}hb(e,{recursive:!0,force:!0})}function tu(e){return e.description?{name:e.name,description:e.description}:{name:e.name}}import{existsSync as Eb,lstatSync as Pb,rmSync as Cb,unlinkSync as Ab}from"fs";import{join as Ib}from"path";function Br(e,t={}){let n=t.cacheDir??Fe(),r=t.indexPath??U(),o=Ib(n,e),s=!1;_b(o)?(Ab(o),s=!0):Eb(o)&&(Cb(o,{recursive:!0,force:!0}),s=!0);let a=z(r),i=Object.prototype.hasOwnProperty.call(a.marketplaces,e),l=Object.entries(a.plugins).filter(([,c])=>c.marketplace===e).map(([c])=>c);return(i||l.length>0)&&Ii(e,r),{name:e,removedDir:s,removedIndexEntry:i,removedPluginEntries:l}}function _b(e){try{return Pb(e).isSymbolicLink()}catch{return!1}}import{existsSync as Rb}from"fs";import{join as Mb}from"path";async function vn(e,t={},n={}){let r=n.indexPath??U(),o=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},i=z(r).marketplaces[e];if(!i)throw new Error(`marketplace "${e}" is not installed`);let l=n.cacheDir?Mb(n.cacheDir,e):qt(e);if(!Rb(l))return{name:e,status:"missing-dir",dir:l};if(i.sourceType==="local")return{name:e,status:"skipped-local"};let c=new Set((eu(l)?.plugins??[]).map(k=>k.name));await Nr(l,s);let u;if(t.ref)u=t.ref;else{let k=await st(l,s);u=at(k)??i.ref??await Le(l,s)}if(u===i.ref){let k=await De(l,s);return{name:e,status:"up-to-date",ref:u,commit:k}}await it(l,u,s);let p=await De(l,s),m=o().toISOString(),f={...i,ref:u,commit:p,updatedAt:m};Qt(e,f,r);let g=new Set(ze(l).plugins.map(k=>k.name)),y=[...g].filter(k=>!c.has(k)),h=[...c].filter(k=>!g.has(k));return{name:e,status:"updated",fromRef:i.ref,toRef:u,commit:p,addedPlugins:y,removedPlugins:h}}async function nu(e={}){let t=e.indexPath??U(),n=z(t),r=[];for(let o of Object.keys(n.marketplaces))try{r.push(await vn(o,{},e))}catch(s){let a=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:a})}return r}import{existsSync as Gr,statSync as Gb}from"fs";import{isAbsolute as zb,join as Vb,resolve as su}from"path";import{existsSync as lt,mkdirSync as $b,readFileSync as Ob,renameSync as Db,rmSync as Lb,symlinkSync as Fb,lstatSync as Nb,unlinkSync as Ub}from"fs";import{basename as jb,join as Bt}from"path";async function Kr(e,t={},n={}){let r=n.pluginsDir??ue(),o=n.indexPath??U(),s=n.now??(()=>new Date),a=n.gitRunner?{runner:n.gitRunner}:{},i=jt(e);if($b(r,{recursive:!0}),i.type==="local")return Hb(i,t,r,o,s);if(i.type==="marketplace-ref")throw new Error(`marketplace-ref source "${i.marketplace}:${i.plugin}" must be installed via the marketplace resolver, not installPlugin directly`);return Bb(i,t,r,o,s,a)}function Hb(e,t,n,r,o){ru(e.path);let s=ou(e.path),a=t.name??s??jb(e.path),i=Bt(n,a);ps(i,t.force??!1),(lt(i)||ms(i))&&Wr(i),Fb(e.path,i,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,enabled:!0,installedAt:l,updatedAt:l,...s&&s!==a?{manifestName:s}:{}};return Ye(a,c,r),{name:a,dir:i,entry:c}}async function Bb(e,t,n,r,o,s){let a=t.name??Kb(e),i=Bt(n,a);ps(i,t.force??!1),lt(i)&&Wr(i);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await Fr(e.url,i,s);try{let c;if(t.ref)c=t.ref;else{let h=await st(i,s);c=at(h)??await Le(i,s)}(t.ref||await Wb(i,c,s))&&await it(i,c,s);let u=await De(i,s);ru(i);let p=ou(i),m=a,f=i;if(!t.name&&p&&p!==a){let h=Bt(n,p);ps(h,t.force??!1),lt(h)&&Wr(h),Db(i,h),m=p,f=h}let g=o().toISOString(),y={source:l,sourceType:e.type,ref:c,commit:u,enabled:!0,installedAt:g,updatedAt:g,...p&&p!==m?{manifestName:p}:{}};return Ye(m,y,r),{name:m,dir:f,entry:y}}catch(c){try{lt(i)&&Wr(i)}catch{}throw c}}async function Wb(e,t,n){let r=await Le(e,n);return t!==r}function Kb(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):t}function ru(e){let t=Bt(e,".claude-plugin","plugin.json");if(lt(t))return;let n=Bt(e,".claude-plugin","marketplace.json");if(lt(n))throw new Error(`${e} contains .claude-plugin/marketplace.json instead of plugin.json. Use \`afk marketplace install <source>\` to install a marketplace, then \`afk plugin install <marketplace>:<plugin>\` to install a plugin from it.`)}function ou(e){let t=Bt(e,".claude-plugin","plugin.json");if(!lt(t))return null;try{let n=JSON.parse(Ob(t,"utf8"));return typeof n.name=="string"&&n.name.trim()?n.name.trim():null}catch{return null}}function ps(e,t){if(!(!lt(e)&&!ms(e))&&!t)throw new Error(`plugin directory already exists: ${e} (re-run with --force to replace)`)}function ms(e){try{return Nb(e).isSymbolicLink()}catch{return!1}}function Wr(e){if(ms(e)){Ub(e);return}Lb(e,{recursive:!0,force:!0})}async function Wt(e,t,n={},r={}){let o=r.marketplaceDirFor??qt,s=r.indexPath??U(),a=r.now??(()=>new Date),i=o(e);if(!Gr(i)||!ls(i))throw new Error(`marketplace "${e}" is not installed (looked for manifest under ${i})`);let l=ze(i),c=l.plugins.find(u=>u.name===t);if(!c){let u=l.plugins.map(p=>p.name).join(", ")||"(none)";throw new Error(`marketplace "${e}" does not list a plugin named "${t}". Available: ${u}`)}return qb(c.source)?Yb(e,c,i,s,a,n):Jb(e,c,n,r)}function zr(e,t={}){let n=t.marketplaceDirFor??qt,r=t.indexPath??U(),o=n(e);if(!Gr(o)||!ls(o))throw new Error(`marketplace "${e}" is not installed`);let s=ze(o),a=z(r);return s.plugins.map(i=>{let l=`${e}:${i.name}`,c=l in a.plugins||i.name in a.plugins&&a.plugins[i.name]?.marketplace===e,u={name:i.name,installed:c,key:l};return i.description&&(u.description=i.description),u})}function qb(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.startsWith("~")}function Yb(e,t,n,r,o,s){let a=t.source,i=zb(a)||a.startsWith("~")?Xb(a):su(n,a);if(!Gr(i))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${i}, but that path does not exist on disk`);if(!Gb(i).isDirectory())throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${i}, but that path is not a directory`);let c=Vb(i,".claude-plugin","plugin.json");if(!Gr(c))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${i}, but no .claude-plugin/plugin.json was found`);let u=`${e}:${t.name}`,p=z(r);if(!s.force&&u in p.plugins&&p.plugins[u]?.enabled)throw new Error(`plugin "${u}" is already installed (re-run with --force to overwrite)`);let m=o().toISOString(),f={source:`${e}:${t.name}`,sourceType:"marketplace",ref:null,commit:null,enabled:!0,installedAt:m,updatedAt:m,marketplace:e};return Ye(u,f,r),{key:u,name:t.name,dir:i,entry:f}}async function Jb(e,t,n,r){let o={name:t.name,...n.ref?{ref:n.ref}:{},...n.force?{force:!0}:{}},s=await Kr(t.source,o,r),a=r.indexPath??U(),i={...s.entry,marketplace:e};return Ye(s.name,i,a),{key:s.name,name:s.name,dir:s.dir,entry:i}}function Xb(e){if(e.startsWith("~")){let t=process.env.HOME??"";if(e==="~")return t;if(e.startsWith("~/"))return su(t,e.slice(2))}return e}var iu=["add","plugins","install","remove","update"],Qb={name:"/marketplaces",summary:"List installed plugin marketplaces",async handler(e){return ek(e),"continue"}},Zb={name:"/marketplace",summary:"Manage plugin marketplaces (add | plugins | install | remove | update)",usage:"/marketplace <add|plugins|install|remove|update> [args]",async handler(e,t){let n=t.trim();if(!n)return tk(e),"continue";let[r,...o]=n.split(/\s+/);if(!r||!iu.includes(r))return e.out.error(`Unknown subcommand "${r??""}". Try one of: ${iu.join(", ")}.`),"continue";switch(r){case"add":return nk(e,o);case"plugins":return rk(e,o);case"install":return ok(e,o);case"remove":return sk(e,o);case"update":return ik(e,o);default:return"continue"}}};function au(){se(Qb),se(Zb)}function ek(e){let t=z(),n=Object.entries(t.marketplaces).sort(([r],[o])=>r.localeCompare(o));if(e.out.line(),n.length===0){e.out.line(d.dim(" No marketplaces installed.")),e.out.line(d.dim(" Try: /marketplace add anthropics/claude-plugins-official")),e.out.line();return}e.out.line(d.bold("Installed marketplaces:"));for(let[r,o]of n){let s=o.ref?d.brand(o.ref):d.dim("(local)");e.out.line(` ${d.bold(r.padEnd(28))} ${s.padEnd(12)} ${d.dim(o.source)}`)}e.out.line()}function tk(e){e.out.line(),e.out.line(d.bold("/marketplace usage:")),e.out.line(` ${d.brand("/marketplace add")} <git-url|owner/repo|local-path>`),e.out.line(` ${d.brand("/marketplace plugins")} <marketplace>`),e.out.line(` ${d.brand("/marketplace install")} <marketplace> <plugin>`),e.out.line(` ${d.brand("/marketplace remove")} <marketplace>`),e.out.line(` ${d.brand("/marketplace update")} [<marketplace>]`),e.out.line()}async function nk(e,t){if(t.length===0)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let[n,r,...o]=t;if(!n)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let s=ak(o);e.out.info(`Installing marketplace ${n}\u2026`);try{let a=await Hr(n,{...r&&!r.startsWith("-")?{name:r}:{},...s.ref?{ref:s.ref}:{},...s.force?{force:!0}:{}});e.out.success(`Installed marketplace ${a.name} (${a.plugins.length} plugin(s) available).`),e.out.line(d.dim(` Next: /marketplace plugins ${a.name}`))}catch(a){e.out.error(`Install failed: ${Vr(a)}`)}return"continue"}function rk(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace plugins <marketplace>"),"continue";try{let r=zr(n);if(e.out.line(),r.length===0)return e.out.line(d.dim(` Marketplace "${n}" lists no plugins.`)),e.out.line(),"continue";e.out.line(d.bold(`Plugins in ${n}:`)),r.forEach((o,s)=>{let a=o.installed?d.brand("[\u2713]"):d.dim("[ ]"),i=o.description?d.dim(` \u2014 ${o.description}`):"";e.out.line(` ${a} ${d.bold(String(s+1).padStart(2))}. ${d.bold(o.name)}${i}`)}),e.out.line(),e.out.line(d.dim(` Install one: /marketplace install ${n} <plugin>`)),e.out.line()}catch(r){e.out.error(`List failed: ${Vr(r)}`)}return"continue"}async function ok(e,t){let n,r;if(t.length===1&&t[0]?.includes(":")){let o=t[0].split(":");o.length===2&&([n,r]=o)}else[n,r]=t;if(!n||!r)return e.out.error("Usage: /marketplace install <marketplace> <plugin>"),"continue";e.out.info(`Installing ${n}:${r}\u2026`);try{let o=await Wt(n,r);e.out.success(`Installed ${o.key}.`),e.out.line(d.dim(" Run /reload-plugins to refresh this session's slash commands."))}catch(o){e.out.error(`Install failed: ${Vr(o)}`)}return"continue"}function sk(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace remove <marketplace>"),"continue";let r=Br(n);if(!r.removedDir&&!r.removedIndexEntry&&r.removedPluginEntries.length===0)return e.out.line(d.dim(` No marketplace named "${n}" to remove.`)),"continue";let o=r.removedPluginEntries.length>0?` + ${r.removedPluginEntries.length} plugin(s)`:"";return e.out.success(`Removed marketplace ${n}${o}.`),"continue"}async function ik(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace update <marketplace>"),"continue";e.out.info(`Updating ${n}\u2026`);try{let r=await vn(n);switch(r.status){case"updated":{let o=r.addedPlugins.length>0?` +${r.addedPlugins.join(", ")}`:"",s=r.removedPlugins.length>0?` -${r.removedPlugins.join(", ")}`:"";e.out.success(`Updated ${n}: ${r.fromRef??"(none)"} \u2192 ${r.toRef}${o}${s}`);break}case"up-to-date":e.out.info(`${n} is up-to-date (${r.ref}).`);break;case"skipped-local":e.out.info(`${n} skipped (local source).`);break;case"missing-dir":e.out.warn(`${n}: marketplace dir missing (${r.dir}).`);break}}catch(r){e.out.error(`Update failed: ${Vr(r)}`)}return"continue"}function ak(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];r==="-f"||r==="--force"?t.force=!0:(r==="-r"||r==="--ref")&&e[n+1]&&(t.ref=e[n+1],n+=1)}return t}function Vr(e){return e instanceof Error?e.message:String(e)}function lu(){zl();for(let e of Zl)se(e);for(let e of ec)se(e);se(tc),se(dc),se(pc),se(mc),se(kc),zc(),Cc(),wc(),au()}function qr(){return{line(e=""){console.log(e)},raw(e){process.stdout.write(e)},success(e){console.log(d.success("\u2713 ")+e)},info(e){console.log(d.info("\u2139 ")+e)},warn(e){console.log(d.warning("\u26A0 ")+e)},error(e){console.log(d.error("\u2717 ")+e)}}}var Yr=class{source;sampleEveryNTurns;cachedRatio;cachedDetail;inFlight=null;disposed=!1;constructor(t,n={}){this.source=t,this.sampleEveryNTurns=n.sampleEveryNTurns??3}attach(t){return this}getRatio(){return this.cachedRatio}getDetail(){return this.cachedDetail}async refresh(){if(this.disposed)return;if(this.inFlight)return this.inFlight;let t=this.doFetch().finally(()=>{this.inFlight=null});return this.inFlight=t,t}async onTurn(t){this.disposed||t%this.sampleEveryNTurns===1&&await this.refresh()}reset(){this.cachedRatio=void 0,this.cachedDetail=void 0,this.inFlight=null}dispose(){this.disposed=!0}async doFetch(){try{let t=await this.source.getContextUsage(),n=lk(t.apiUsage),r=t.maxTokens??0,o=t.percentage;typeof o=="number"&&(this.cachedRatio=Math.min(1,Math.max(0,o/100)),this.cachedDetail={used:n,limit:r,percentage:o})}catch{}}};function lk(e){return e?e.input_tokens+e.output_tokens+e.cache_creation_input_tokens+e.cache_read_input_tokens:0}async function uu(e,t){let n,r,o;n=Qe(e.thinking)??Et(),r=Ze(e.effort)??Pt(),o=At(e.maxOutputTokens)??rn();let s=Qn()??Xn(),i=xt().autoRouting?.interactive??!0,l=pr(s,i),c,u=B(),p=new M({apiKey:u}),m=hr(),f={get sessionId(){return c?.sessionId},getInputStreamRef(){return c?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return c?.abortSignal??new AbortController().signal}},g=new Ot({subagentManager:p,parentSession:f,defaultConfig:{apiKey:u,systemPrompt:s},defaultSubagentModel:Tt(),childProviderFactory:m,childSkillExecutorFactory:yr(e.model,u)}),y=new nt({parentSession:f,defaultModel:e.model,defaultSubagentModel:Tt(),apiKey:u}),h=new Ie,k=Zn(e.provider,{subagentExecutor:g,skillExecutor:y})??new Se({permissions:{allowedTools:[...Xe,"agent","skill"]},subagentExecutor:g,skillExecutor:y,memoryStore:h,surface:"cli"}),v={fn:S=>console.log(S)},w=new me(ft({model:e.model,apiKey:B(),maxTurns:parseInt(e.maxTurns,10),hookRegistry:Rt(S=>{v.fn(gr(S))},"cli",h).registry,...l!==void 0?{systemPrompt:l}:{},...n!==void 0?{thinking:n}:{},...r!==void 0?{effort:r}:{},...o!==void 0?{maxOutputTokens:o}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},provider:k}));c=w;let P=Yl(e.model),K=qr(),F=new xr,T=new Yr(w);T.attach(w);let b={session:w,stats:P,out:K,ui:{clearScreen:()=>{F.stop(),T.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),F.start(),F.repaint(qo(P,T))},repaintStatusLine:()=>F.repaint(qo(P,T))}};lu();let C=cu.createInterface({input:process.stdin,output:process.stdout,terminal:!1});return{session:w,memoryStore:h,stats:P,statusLine:F,contextSampler:T,completionWriter:v,slashCtx:b,rl:C,options:e}}import{promises as xn}from"node:fs";import*as pu from"node:os";import*as Jr from"node:path";async function du(e,t,n=!1){await xn.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=Jr.join(e,`${r}.md`),s=n?" (continued)":"";return await xn.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
1485
1614
 
1486
1615
  - model: ${t}
1487
1616
 
1488
1617
  ---
1489
1618
 
1490
- `),o}async function dc(e){let t=Ar.join(process.env.AFK_STATE_DIR??Ar.join(uc.homedir(),".afk"),"transcripts"),n=await cc(t,e());return{path:()=>n,async appendTurn(r,o){o&&await cn.appendFile(n,`_${new Date().toISOString()} \xB7 model: ${e()}_
1619
+ `),o}async function mu(e){let t=Jr.join(process.env.AFK_STATE_DIR??Jr.join(pu.homedir(),".afk"),"transcripts"),n=await du(t,e());return{path:()=>n,async appendTurn(r,o){o&&await xn.appendFile(n,`_${new Date().toISOString()} \xB7 model: ${e()}_
1491
1620
 
1492
1621
  ## User
1493
1622
 
@@ -1499,54 +1628,54 @@ ${o}
1499
1628
 
1500
1629
  ---
1501
1630
 
1502
- `).catch(()=>{})},async rotateOnClear(){await cn.appendFile(n,`
1631
+ `).catch(()=>{})},async rotateOnClear(){await xn.appendFile(n,`
1503
1632
  _cleared_
1504
- `).catch(()=>{}),n=await cc(t,e(),!0)},async appendEnded(){await cn.appendFile(n,`
1633
+ `).catch(()=>{}),n=await du(t,e(),!0)},async appendEnded(){await xn.appendFile(n,`
1505
1634
  _ended: ${new Date().toISOString()}_
1506
- `).catch(()=>{})}}}import{readdirSync as ky,statSync as by}from"fs";import{join as pc}from"path";function mc(e,t=process.cwd()){try{let n=e.lastIndexOf("/"),r=n===-1?"":e.slice(0,n),o=n===-1?e:e.slice(n+1),s=r?pc(t,r):t,a=ky(s),i=[];for(let l of a){if(!l.startsWith(o)||l.startsWith(".")&&!o.startsWith("."))continue;let c=r?`${r}/${l}`:l;try{by(pc(s,l)).isDirectory()&&(c+="/")}catch{}if(i.push(c),i.length>=30)break}return i.sort()}catch{return[]}}async function fc(e){let t="",n=e.promptFn(),r=e.continuationPrompt??" \u203A ";for(;;){e.rl.setPrompt(n),e.rl.prompt();let o=await new Promise(s=>{e.rl.once("line",a=>s(a))});if(o.endsWith("\\")){t+=o.slice(0,-1)+`
1507
- `,n=r;continue}return t+=o,t}}async function gc(e){let t=null;if(e.onSigint){let n=e.onSigint;t=()=>n(),process.on("SIGINT",t)}try{return{text:await fc({rl:e.rl,promptFn:e.promptFn}),attachments:[]}}finally{t&&process.removeListener("SIGINT",t)}}import{emitKeypressEvents as $y}from"readline";import*as fe from"ansi-escapes";import Tc from"string-width";import wy from"chalk";var Sy=/^(\/[A-Za-z][\w:-]*)(?=\s|$)/;function hc(e,t){if(wy.level===0)return e;let n=Sy.exec(e);if(!n)return e;let r=n[1],o=r.slice(1);return(t.has(o)?d.brand(r):d.meta(r))+e.slice(r.length)}var vy={"image/png":"PNG","image/jpeg":"JPEG","image/gif":"GIF","image/webp":"WEBP"};function xy(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}function yc(e){if(e.length===0)return"";let t=e.reduce((i,l)=>i+l.sizeBytes,0),n=xy(t),r=e.length===1?"image":"images",o=new Set,s=[];for(let i of e){let l=vy[i.mediaType];o.has(l)||(o.add(l),s.push(l))}let a=s.join(", ");return`[${e.length} ${r} attached \xB7 ${n} \xB7 ${a}]`}function kc(e,t){if(t.length===0)return e;if(e){let n=t.length===1?"image":"images";return`${e} [+ ${t.length} ${n}]`}return t.length===1?"[image attached]":`[${t.length} images attached]`}import{spawn as Ty}from"child_process";import{randomUUID as Ey}from"crypto";async function bc(){if(process.platform!=="darwin")return null;try{let e=await Py();if(e.length===0)return null;let t=Cy(e);return t?{id:Ey(),mediaType:t,bytes:e,sizeBytes:e.byteLength}:null}catch{return null}}async function Py(){return new Promise((e,t)=>{let n=Ty("pbpaste",["-Prefer","image"],{stdio:["ignore","pipe","pipe"]}),r=[];n.stdout?.on("data",o=>{r.push(o)}),n.on("error",o=>{t(o)}),n.on("close",o=>{o!==0?t(new Error(`pbpaste exited with code ${o}`)):e(Buffer.concat(r))})})}function Cy(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=4&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?"image/gif":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"image/webp":null}import Ay from"chalk";import Iy from"string-width";function My(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=Iy(e[r]),n>t)return e.slice(0,r)+d.dim("\u2026");return e}function wc(e,t,n,r){let o=t?">":" ",s=e.value,a=e.summary?` ${e.summary}`:"",i=`${s}${a}`,l=My(i,n-4),c=` ${o} ${l}`,u=r==="flag"?d.warning:d.meta;return t?Ay.inverse(d.user(c)):u(c)}import Uo from"string-width";function jo(e){let{buffer:t,promptText:n,isTTY:r}=e;if(!r)return n+t;let o=e.terminalWidth??z(),s=t.includes(`
1508
- `),i=Uo(at(n))+Uo(at(t))>=o-2;return!s&&!i?n+t:At({kind:"user",body:t})}function Bo(e,t,n){let r=n||80,o=e.split(`
1509
- `),s=0;for(let a=0;a<o.length;a++){let i=at(o[a]),l=(a===0?t:0)+Uo(i);s+=Math.max(1,Math.ceil(l/r))}return Math.max(0,s-1)}var Ry="\x1B[?2004h",_y="\x1B[?2004l";function Sc(e,t){let n=e.isRaw;e.setRawMode(!0),e.resume(),t.write(Ry);let r=!1;return{restore(){if(!r){r=!0;try{t.write(_y)}catch{}try{e.setRawMode(n)}catch{}}}}}function Ho(e,t){let n=e.slice(0,t);if(/^\/[A-Za-z_-]*$/.test(n))return{kind:"slash",query:n.slice(1)};let r=n.split(/\s+/),o=r[r.length-1]??"";if(o.startsWith("@")&&/^@[^\s]*$/.test(o))return{kind:"file",query:o.slice(1)};let s=/^\/([A-Za-z][A-Za-z0-9_:-]*)\s+(?:.*\s)?--([a-z0-9-]*)$/.exec(n);if(s){let a=s[1],i=s[2],l=Ne().find(c=>c.name===`/${a}`);if(l?.flags&&l.flags.length>0)return{kind:"flag",command:a,query:i}}return null}function vc(e){let n=Ne().filter(s=>s.name.slice(1).startsWith(e)).map(s=>({value:s.name,summary:s.summary})),r=Ka().filter(s=>s.alias.slice(1).startsWith(e)).map(s=>({value:s.alias,summary:s.summary}));return[...n,...r].sort((s,a)=>s.value.localeCompare(a.value)).slice(0,20)}function xc(e,t=process.cwd()){return mc(e,t).slice(0,20).map(n=>({value:n}))}function Wo(e,t){let n=Ne().find(s=>s.name===`/${e}`);if(!n?.flags||n.flags.length===0)return[];let r=t.startsWith("--")?t.slice(2):t;return n.flags.filter(s=>(s.startsWith("--")?s.slice(2):s).startsWith(r)).map(s=>({value:s})).sort((s,a)=>s.value.localeCompare(a.value)).slice(0,20)}async function Ec(e){let t=process.stdin,n=process.stdout,r=Sc(t,n);$y(t);let o=e.promptFn(),s=Tc(at(o)),a=null,i=null;try{return await new Promise((l,c)=>{let u=W.seed(e.initialBuffer??""),p=!1,m=[],f=0,g=null,y=0,h=0,k=!1,S=0,b=0,A=[],N=6,$=0,v=!1,w=8,I={has:O=>Ne().some(T=>T.name===`/${O}`)},x=()=>{(b>0||S>0)&&n.write(fe.cursorUp(b+S)),n.write("\r"),n.write(fe.eraseDown),A.length>0?(n.write(yc(A)+`
1510
- `),b=1):b=0,n.write(o+hc(u.buffer,I)),g=Ho(u.buffer,u.cursor),g?(g.kind==="slash"?m=vc(g.query):g.kind==="file"?m=xc(g.query):m=Wo(g.command,g.query),p=m.length>0):(p=!1,m=[]),f>=m.length&&(f=Math.max(0,m.length-1)),h>f&&(h=f),f>=h+N&&(h=f-N+1);let O=n.columns||80;if(y=0,p&&O>40){let ge=Math.min(O-4,60),X=Math.min(m.length-h,N);for(let oe=0;oe<X;oe++){let ne=h+oe,B=wc(m[ne],ne===f,ge,g?.kind);n.write(`
1511
- `+B);let nt=Tc(at(B));y+=Math.max(1,Math.ceil(nt/O))}}y>0&&n.write(fe.cursorUp(y)),n.write("\r");let T=s+u.cursor;T>0&&n.write(fe.cursorForward(T)),S=Bo(u.buffer,s,O)},E=()=>{v||(v=!0,setImmediate(()=>{v&&(v=!1,x())}))};x();let P=()=>{let O=m[f];if(!O)return;let T=u.buffer.slice(0,u.cursor),ge=u.buffer.slice(u.cursor),X,oe;if(g?.kind==="slash"){let ne=/\/[A-Za-z_-]*$/.exec(T);X=ne?T.length-ne[0].length:u.cursor,oe=O.value+(ge.startsWith(" ")?"":" ")}else if(g?.kind==="flag"){let ne=/--[a-z0-9-]*$/.exec(T);X=ne?T.length-ne[0].length:u.cursor,oe=O.value+(ge.startsWith(" ")?"":" ")}else{let ne=T.search(/[^\s]*$/);X=ne>=0?ne:u.cursor,oe=O.value}u=W.replaceRange(u,{start:X,end:u.cursor},oe),p=!1,h=0,f=0,x()},C=()=>{(b>0||S>0)&&n.write(fe.cursorUp(b+S)),n.write("\r"),n.write(fe.eraseDown),y=0;let O=jo({buffer:u.buffer,promptText:o,isTTY:!!n.isTTY});n.write(O+`
1512
- `),Q(),l({text:u.buffer,attachments:[...A]}),S=0},M=O=>{S>0&&n.write(fe.cursorUp(S)),y>0&&(n.write(fe.eraseDown),y=0),n.write(`
1513
- `),Q(),c(O),S=0},Q=()=>{a&&t.removeListener("keypress",a),i&&n.removeListener("resize",i),a=null,i=null};a=(O,T)=>{let ge=Date.now(),X=ge-$<w;$=ge;let oe=T?.sequence||"";if(oe==="\x1B[200~"){k=!0;return}if(oe==="\x1B[201~"){k=!1,x();return}if(T?.ctrl&&T?.name==="c"){e.onSigint?e.onSigint():M(new Error("SIGINT"));return}if(T?.ctrl&&T?.name==="d"){u.buffer.length===0&&((b>0||S>0)&&n.write(fe.cursorUp(b+S)),y>0&&(n.write(fe.eraseDown),y=0),n.write(`
1514
- `),Q(),l({text:"",attachments:[...A]}),S=0);return}if(T?.ctrl&&T?.name==="v"){bc().then(B=>{B&&(A.push(B),x())}).catch(()=>{});return}if(T?.name==="escape"){p&&(p=!1,m=[],x());return}if(T?.name==="up"){p&&f>0&&(f--,f<h&&(h=f),x());return}if(T?.name==="down"){p&&f<m.length-1&&(f++,f>=h+N&&(h=f-N+1),x());return}if(T?.name==="left"){let B=W.moveLeft(u);B!==u&&(u=B,x());return}if(T?.name==="right"){let B=W.moveRight(u);B!==u&&(u=B,x());return}if(T?.name==="home"){let B=W.moveHome(u);B!==u&&(u=B,x());return}if(T?.name==="end"){let B=W.moveEnd(u);B!==u&&(u=B,x());return}if(T?.ctrl&&T?.name==="u"){let B=W.deleteToLineStart(u);B!==u&&(u=B,x());return}if(T?.ctrl&&T?.name==="k"){let B=W.deleteToLineEnd(u);B!==u&&(u=B,x());return}if(T?.name==="backspace"){if(T?.meta){let nt=W.deleteWordBackward(u);nt!==u&&(u=nt,x());return}let B=W.backspace(u);B!==u?(u=B,x()):A.length>0&&(A.pop(),x());return}if(T?.name==="delete"){if(T?.meta){let nt=W.deleteWordForward(u);nt!==u&&(u=nt,x());return}let B=W.deleteForward(u);B!==u&&(u=B,x());return}if(T?.name==="return"){if(k){u=W.insert(u,`
1515
- `);return}if(X){u=W.insert(u,`
1516
- `),E();return}if(p){let B=g?.kind;P(),B==="slash"&&C()}else u.buffer.endsWith("\\")?(u=W.replaceRange(u,{start:u.buffer.length-1,end:u.buffer.length},`
1517
- `),x()):C();return}if(T?.name==="tab"){p&&P();return}let ne=typeof O=="string"&&O.length===1&&O>=" "&&!T?.ctrl&&!T?.meta?O:typeof T?.sequence=="string"&&T.sequence.length===1&&T.sequence>=" "&&!T?.ctrl&&!T?.meta?T.sequence:null;ne!==null&&(u=W.insert(u,ne),k||(X?E():x()))},i=()=>x(),t.on("keypress",a),n.on("resize",i)})}finally{r.restore()}}async function Pc(e){return!process.stdout.isTTY||!process.stdin.isTTY?gc(e):Ec(e)}function Cc(e){if(!e)return null;let t=e.split(`
1518
- `),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=Oy(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 a=Dy(s),i=s.join(`
1519
- `).trim();return{kind:o,rawBody:i,...Ly(o,a)}}function Oy(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function Dy(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),s=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let i=t[t.length-1];i.value=`${i.value} ${r}`.trim();continue}let a=s.indexOf(":");if(a>0&&a<60){let i=s.slice(0,a).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").toLowerCase(),l=s.slice(a+1).trim();t.push({label:i,value:l})}else t.push({label:"",value:s})}return t}function Ly(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let s of r)if(o.label.includes(s))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let s=n("evidence","what changed","change","artifact","output");s!==void 0&&(r.evidence=s);let a=n("pending","deferred","follow-up","followup","next");return a!==void 0&&(r.deferred=a),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let s=n("unblock","must change","to unblock","condition");s!==void 0&&(r.unblockCondition=s);let a=n("already done","what has been done","progress");return a!==void 0&&(r.alreadyDone=a),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let s=n("assumption","resolves");s!==void 0&&(r.assumption=s);let a=n("once answered","follow-up","next","will do","after");return a!==void 0&&(r.followup=a),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let s=n("state was saved","state","saved","where");s!==void 0&&(r.stateLocation=s);let a=n("resumption","resume","requires");return a!==void 0&&(r.resumeRequires=a),r}}}var Fy={done:{color:d.success,chip:"\u2713 Done",affordance:"Objective satisfied \u2014 review evidence and close."},blocked:{color:d.error,chip:"\u2298 Blocked",affordance:"External dependency \u2014 unblock above to resume."},asking:{color:d.warning,chip:"? Asking",affordance:"Waiting on you \u2014 answer above to continue."},interrupted:{color:d.info,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved \u2014 resume when ready."}};function Ac(e){let t=Fy[e.kind],n=Math.max(40,Math.min(z()-4,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-U(` ${t.chip} `)-1))+"\u256E"),s=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),a=t.color("\u2502"),i=a+" ".repeat(n+4)+a,l=Ny(e),c=l.reduce((f,g)=>Math.max(f,U(g.label)),0),u=Math.max(8,n-c-2),p=[o,i];if(l.length===0){let f=e.rawBody.split(`
1520
- `)[0]?.trim()??"";if(f.length>0){let g=J(f,n).split(`
1521
- `);for(let y of g)p.push(a+" "+ce(y,n)+" "+a)}}else for(let f of l){let g=d.dim(ce(f.label,c)),y=J(f.value,u).split(`
1522
- `),h=y[0]??"";p.push(a+" "+g+" "+ce(h,u)+" "+a);for(let k of y.slice(1))p.push(a+" "+" ".repeat(c)+" "+ce(k,u)+" "+a)}p.push(i);let m=d.dim(ve(t.affordance,n));return p.push(a+" "+ce(m,n)+" "+a),p.push(s),p.join(`
1523
- `)}function Ny(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 Uy(e,t){let n=[];e&&n.push({type:"text",text:e});for(let r of t)n.push({type:"image",source:{type:"base64",media_type:r.mediaType,data:r.bytes.toString("base64")}});return n}async function Ic(e,t,n,r,o="summary",s){let a=kc(e.text,e.attachments);r.setInFlight(!0);let i="",l=!1,c,u=!1,p=!1,m=!1,f,g=new Mt({out:Pr(),thinkingMode:o,onCancel:()=>{t.interrupt().catch(h=>{ft()&&console.error(" "+d.error("session.interrupt() failed:"),h)})}}),y=async()=>{if(!p){p=!0;try{await g.dispose()}catch{}}};try{await g.arm();let h=g.getCompositor();if(s&&h){let b=h;s.fn=A=>b.commitAbove(A)}r.rearmStatus?.();let k=e.attachments.length===0?e.text:Uy(e.text,e.attachments),S=t.sendMessageStream(k);if(await En(g.sink,async()=>{for await(let b of S){if(b.type==="chunk"&&b.chunk.type==="content"?(i+=b.chunk.content,l=!0):b.type==="message"&&!l&&(i=b.message.content),b.type==="error"){await y(),console.error(nn(b.error.message,b.error.stack)),u=!0;continue}g.process(b),b.type==="done"&&(m=!0,f=b.metadata)}}),!p){let b=g.getCompositor();if(b)try{let{text:A,queued:N}=b.getBuffer();N&&A.length>0&&(c=A)}catch{}}if(await y(),m){Ya(n,a,i,f),r.onTurnComplete&&await r.onTurnComplete(a,i).catch(()=>{}),l&&console.log(`
1524
- `);let b=Cc(i);if(b&&(console.log(Ac(b)),console.log(),r.onTerminalState))try{r.onTerminalState(b)}catch{}if(jy(f,n),r.onAfterTurn){let A=r.onAfterTurn();A instanceof Promise&&await A.catch(()=>{})}}}catch(h){await y(),u||console.error(nn(h instanceof Error?h.message:"Unknown error",h instanceof Error&&h.stack?h.stack:void 0))}finally{await y(),s&&(s.fn=h=>console.log(h)),r.setInFlight(!1),r.rearmStatus?.()}return c}function jy(e,t){if(!e)return;let n=[];e.durationMs&&n.push(Se(e.durationMs)),e.totalCostUsd!==void 0&&n.push(me(e.totalCostUsd));let r=Number(e.usage?.input_tokens??0),o=Number(e.usage?.output_tokens??0);r+o>0&&n.push(L(r+o)+" tok"),n.length>0&&console.log(d.dim(" \u25E6 "+n.join(" \xB7 ")));let s=ko(t);if(s>.5){let a=s>.8?d.error:d.warning;console.log(a(` context ${Math.round(s*100)}% used of ${L(ut(t.model))}`))}console.log()}function Mc(e={}){let t=e.load??sr,n=e.onResize??(a=>Ct.subscribe(a)),r="",o,s=n(()=>{r=""});return{renderIfChanged(a){let i=a??"unbound",l=t(i),c=il(l);return i===o&&c===r?[]:(o=i,r=c,c===""?[]:ir(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var Ko={done:{glyph:"\u2713",color:d.success,label:"done"},blocked:{glyph:"\u2298",color:d.error,label:"blocked"},asking:{glyph:"?",color:d.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:d.info,label:"interrupted"}};function Rc(e={}){let t=Math.max(2,e.capacity??8),n=[];return{push(r){n.push(r.kind),n.length>t&&(n=n.slice(n.length-t))},reset(){n=[]},entries(){return n},render(){if(n.length===0)return null;let r=d.dim(" ledger "),o=d.dim(" \xB7 "),s=n.map(u=>{let p=Ko[u];return p.color(`${p.glyph} ${p.label}`)}),a=d.dim(` (${n.length} turn${n.length===1?"":"s"})`),i=r+s.join(o)+a,l=Math.max(20,z()-2);if(U(i)<=l)return i;let c=r+n.map(u=>Ko[u].color(Ko[u].glyph)).join(d.dim(" "))+a;return ve(c,l)}}}function By(e,t){let n=d.brand("afk")+d.dim(` (${e})`),r=t?d.warning(" \u25CF plan"):"";return n+r+d.dim(" \u203A ")}async function _c(e,t,n,r){let o=null,s=[];e.session.waitForInitialization().then(async c=>{ft()&&(o=or(c)),await Sl(e.session),ft()&&(s=wl())}).catch(()=>{});let a,i=Mc(),l=Rc();try{for(;;){if(o&&(console.log(o),console.log(),o=null),s.length>0){for(let g of s)console.log(g);console.log(),s=[]}let c=i.renderIfChanged(e.stats.sessionId);if(c.length>0){for(let g of c)console.log(g);console.log()}let u=l.render();u&&console.log(u);let p=await Pc({rl:e.rl,promptFn:()=>By(e.stats.model,e.stats.planMode),onSigint:r,...a!==void 0?{initialBuffer:a}:{}});a=void 0;let m=p.text.trim(),f=p.attachments;if(!(!m&&f.length===0)){if(m.startsWith("/")){let g=await Ga(m,e.slashCtx);if(g.handled){if(g.result==="exit"){e.rl.close();return}(m==="/clear"||m.startsWith("/clear "))&&(await t.rotateOnClear(),console.log(d.dim(` transcript: ${t.path()}`)),l.reset()),e.statusLine.rearm();continue}}a=await Ic({text:m,attachments:f},e.session,e.stats,{setInFlight(g){n.turnInFlight=g},async onTurnComplete(g,y){await t.appendTurn(g,y)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:g=>l.push(g)},e.options.thinkingUi,e.completionWriter)}}}finally{i.dispose()}}import{execFile as Hy}from"node:child_process";import{promisify as Wy}from"node:util";import{promises as $c}from"node:fs";import{dirname as Ky,isAbsolute as Gy,join as Oc,resolve as zy}from"node:path";import{randomBytes as Vy}from"node:crypto";var Yy=Wy(Hy);function Ir(e){return e instanceof Error}function qy(e){let t=l=>String(l).padStart(2,"0"),n=String(e.getFullYear()),r=t(e.getMonth()+1),o=t(e.getDate()),s=t(e.getHours()),a=t(e.getMinutes()),i=t(e.getSeconds());return`${n}${r}${o}-${s}${a}${i}`}function Jy(){let e=qy(new Date),t=Vy(3).toString("hex");return`afk/${e}-${t}`}function Qy(e){if(e.trim().length===0)throw new Error("Invalid branch name: '' \u2014 branch name cannot be empty.");if(e.startsWith("-"))throw new Error(`Invalid branch name: '${e}' \u2014 must not start with '-' (would be parsed by git as a flag).`);if(e==="HEAD")throw new Error("Invalid branch name: 'HEAD' \u2014 reserved by git.");if(e.includes(".."))throw new Error(`Invalid branch name: '${e}' \u2014 must not contain '..'.`);let n=[{char:"~",label:"'~'"},{char:"^",label:"'^'"},{char:":",label:"':'"},{char:"?",label:"'?'"},{char:"*",label:"'*'"},{char:"[",label:"'['"},{char:"\\",label:"'\\'"},{char:"\0",label:"NUL byte"}];for(let{char:r,label:o}of n)if(e.includes(r))throw new Error(`Invalid branch name: '${e}' \u2014 must not contain ${o}.`);if(/\s/.test(e))throw new Error(`Invalid branch name: '${e}' \u2014 must not contain whitespace.`)}async function Xy(e){let t;try{t=(await e("git",["rev-parse","--git-common-dir"])).stdout.trim()}catch{throw new Error("Not in a git repository (run from inside a git checkout).")}if(!t)throw new Error("Not in a git repository (run from inside a git checkout).");let n=Gy(t)?t:zy(process.cwd(),t);return Ky(n)}async function Zy(e){let t=Oc(e,".gitignore"),n=".afk-worktrees/",r="";try{r=await $c.readFile(t,"utf8")}catch(a){if(a.code!=="ENOENT")throw a;r=""}if(r.split(`
1635
+ `).catch(()=>{})}}}import{readdirSync as ck,statSync as uk}from"fs";import{join as fu}from"path";function gu(e,t=process.cwd()){try{let n=e.lastIndexOf("/"),r=n===-1?"":e.slice(0,n),o=n===-1?e:e.slice(n+1),s=r?fu(t,r):t,a=ck(s),i=[];for(let l of a){if(!l.startsWith(o)||l.startsWith(".")&&!o.startsWith("."))continue;let c=r?`${r}/${l}`:l;try{uk(fu(s,l)).isDirectory()&&(c+="/")}catch{}if(i.push(c),i.length>=30)break}return i.sort()}catch{return[]}}async function hu(e){let t="",n=e.promptFn(),r=e.continuationPrompt??" \u203A ";for(;;){e.rl.setPrompt(n),e.rl.prompt();let o=await new Promise(s=>{e.rl.once("line",a=>s(a))});if(o.endsWith("\\")){t+=o.slice(0,-1)+`
1636
+ `,n=r;continue}return t+=o,t}}async function yu(e){let t=null;if(e.onSigint){let n=e.onSigint;t=()=>n(),process.on("SIGINT",t)}try{return{text:await hu({rl:e.rl,promptFn:e.promptFn}),attachments:[]}}finally{t&&process.removeListener("SIGINT",t)}}import{emitKeypressEvents as Tk}from"readline";import*as he from"ansi-escapes";import Eu from"string-width";import dk from"chalk";var pk=/^(\/[A-Za-z][\w:-]*)(?=\s|$)/;function fs(e,t){if(dk.level===0)return e;let n=pk.exec(e);if(!n)return e;let r=n[1],o=r.slice(1);return(t.has(o)?d.brand(r):d.meta(r))+e.slice(r.length)}var mk={"image/png":"PNG","image/jpeg":"JPEG","image/gif":"GIF","image/webp":"WEBP"};function fk(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}function bu(e){if(e.length===0)return"";let t=e.reduce((i,l)=>i+l.sizeBytes,0),n=fk(t),r=e.length===1?"image":"images",o=new Set,s=[];for(let i of e){let l=mk[i.mediaType];o.has(l)||(o.add(l),s.push(l))}let a=s.join(", ");return`[${e.length} ${r} attached \xB7 ${n} \xB7 ${a}]`}function ku(e,t){if(t.length===0)return e;if(e){let n=t.length===1?"image":"images";return`${e} [+ ${t.length} ${n}]`}return t.length===1?"[image attached]":`[${t.length} images attached]`}import{spawn as gk}from"child_process";import{randomUUID as hk}from"crypto";async function wu(){if(process.platform!=="darwin")return null;try{let e=await yk();if(e.length===0)return null;let t=bk(e);return t?{id:hk(),mediaType:t,bytes:e,sizeBytes:e.byteLength}:null}catch{return null}}async function yk(){return new Promise((e,t)=>{let n=gk("pbpaste",["-Prefer","image"],{stdio:["ignore","pipe","pipe"]}),r=[];n.stdout?.on("data",o=>{r.push(o)}),n.on("error",o=>{t(o)}),n.on("close",o=>{o!==0?t(new Error(`pbpaste exited with code ${o}`)):e(Buffer.concat(r))})})}function bk(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=4&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?"image/gif":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"image/webp":null}import kk from"chalk";import wk from"string-width";function Sk(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=wk(e[r]),n>t)return e.slice(0,r)+d.dim("\u2026");return e}function Su(e,t,n,r){let o=t?">":" ",s=e.value,a=e.summary?` ${e.summary}`:"",i=`${s}${a}`,l=Sk(i,n-4),c=` ${o} ${l}`,u=r==="flag"?d.warning:d.meta;return t?kk.inverse(d.user(c)):u(c)}import gs from"string-width";function hs(e){let{buffer:t,promptText:n,isTTY:r}=e;if(!r)return n+t;let o=e.terminalWidth??V(),s=t.includes(`
1637
+ `),i=gs(gt(n))+gs(gt(t))>=o-2;return!s&&!i?n+t:Lt({kind:"user",body:t})}function ys(e,t,n){let r=n||80,o=e.split(`
1638
+ `),s=0;for(let a=0;a<o.length;a++){let i=gt(o[a]),l=(a===0?t:0)+gs(i);s+=Math.max(1,Math.ceil(l/r))}return Math.max(0,s-1)}var vk="\x1B[?2004h",xk="\x1B[?2004l";function vu(e,t){let n=e.isRaw;e.setRawMode(!0),e.resume(),t.write(vk);let r=!1;return{restore(){if(!r){r=!0;try{t.write(xk)}catch{}try{e.setRawMode(n)}catch{}}}}}function bs(e,t){let n=e.slice(0,t);if(/^\/[A-Za-z_-]*$/.test(n))return{kind:"slash",query:n.slice(1)};let r=n.split(/\s+/),o=r[r.length-1]??"";if(o.startsWith("@")&&/^@[^\s]*$/.test(o))return{kind:"file",query:o.slice(1)};let s=/^\/([A-Za-z][A-Za-z0-9_:-]*)\s+(?:.*\s)?--([a-z0-9-]*)$/.exec(n);if(s){let a=s[1],i=s[2],l=Ge().find(c=>c.name===`/${a}`);if(l?.flags&&l.flags.length>0)return{kind:"flag",command:a,query:i}}return null}function xu(e){let n=Ge().filter(s=>s.name.slice(1).startsWith(e)).map(s=>({value:s.name,summary:s.summary})),r=Vl().filter(s=>s.alias.slice(1).startsWith(e)).map(s=>({value:s.alias,summary:s.summary}));return[...n,...r].sort((s,a)=>s.value.localeCompare(a.value)).slice(0,20)}function Tu(e,t=process.cwd()){return gu(e,t).slice(0,20).map(n=>({value:n}))}function ks(e,t){let n=Ge().find(s=>s.name===`/${e}`);if(!n?.flags||n.flags.length===0)return[];let r=t.startsWith("--")?t.slice(2):t;return n.flags.filter(s=>(s.startsWith("--")?s.slice(2):s).startsWith(r)).map(s=>({value:s})).sort((s,a)=>s.value.localeCompare(a.value)).slice(0,20)}async function Pu(e){let t=process.stdin,n=process.stdout,r=vu(t,n);Tk(t);let o=e.promptFn(),s=Eu(gt(o)),a=null,i=null;try{return await new Promise((l,c)=>{let u=W.seed(e.initialBuffer??""),p=!1,m=[],f=0,g=null,y=0,h=0,k=!1,v=0,w=0,P=[],K=6,F=0,T=!1,b=8,C={has:$=>Ge().some(x=>x.name===`/${$}`)},S=()=>{(w>0||v>0)&&n.write(he.cursorUp(w+v)),n.write("\r"),n.write(he.eraseDown),P.length>0?(n.write(bu(P)+`
1639
+ `),w=1):w=0,n.write(o+fs(u.buffer,C)),g=bs(u.buffer,u.cursor),g?(g.kind==="slash"?m=xu(g.query):g.kind==="file"?m=Tu(g.query):m=ks(g.command,g.query),p=m.length>0):(p=!1,m=[]),f>=m.length&&(f=Math.max(0,m.length-1)),h>f&&(h=f),f>=h+K&&(h=f-K+1);let $=n.columns||80;if(y=0,p&&$>40){let ye=Math.min($-4,60),Z=Math.min(m.length-h,K);for(let ae=0;ae<Z;ae++){let oe=h+ae,j=Su(m[oe],oe===f,ye,g?.kind);n.write(`
1640
+ `+j);let ct=Eu(gt(j));y+=Math.max(1,Math.ceil(ct/$))}}y>0&&n.write(he.cursorUp(y)),n.write("\r");let x=s+u.cursor;x>0&&n.write(he.cursorForward(x)),v=ys(u.buffer,s,$)},E=()=>{T||(T=!0,setImmediate(()=>{T&&(T=!1,S())}))};S();let A=()=>{let $=m[f];if(!$)return;let x=u.buffer.slice(0,u.cursor),ye=u.buffer.slice(u.cursor),Z,ae;if(g?.kind==="slash"){let oe=/\/[A-Za-z_-]*$/.exec(x);Z=oe?x.length-oe[0].length:u.cursor,ae=$.value+(ye.startsWith(" ")?"":" ")}else if(g?.kind==="flag"){let oe=/--[a-z0-9-]*$/.exec(x);Z=oe?x.length-oe[0].length:u.cursor,ae=$.value+(ye.startsWith(" ")?"":" ")}else{let oe=x.search(/[^\s]*$/);Z=oe>=0?oe:u.cursor,ae=$.value}u=W.replaceRange(u,{start:Z,end:u.cursor},ae),p=!1,h=0,f=0,S()},I=()=>{(w>0||v>0)&&n.write(he.cursorUp(w+v)),n.write("\r"),n.write(he.eraseDown),y=0;let $=hs({buffer:fs(u.buffer,C),promptText:o,isTTY:!!n.isTTY});n.write($+`
1641
+ `),Q(),l({text:u.buffer,attachments:[...P]}),v=0},_=$=>{v>0&&n.write(he.cursorUp(v)),y>0&&(n.write(he.eraseDown),y=0),n.write(`
1642
+ `),Q(),c($),v=0},Q=()=>{a&&t.removeListener("keypress",a),i&&n.removeListener("resize",i),a=null,i=null};a=($,x)=>{let ye=Date.now(),Z=ye-F<b;F=ye;let ae=x?.sequence||"";if(ae==="\x1B[200~"){k=!0;return}if(ae==="\x1B[201~"){k=!1,S();return}if(x?.ctrl&&x?.name==="c"){e.onSigint?e.onSigint():_(new Error("SIGINT"));return}if(x?.ctrl&&x?.name==="d"){u.buffer.length===0&&((w>0||v>0)&&n.write(he.cursorUp(w+v)),y>0&&(n.write(he.eraseDown),y=0),n.write(`
1643
+ `),Q(),l({text:"",attachments:[...P]}),v=0);return}if(x?.ctrl&&x?.name==="v"){wu().then(j=>{j&&(P.push(j),S())}).catch(()=>{});return}if(x?.name==="escape"){p&&(p=!1,m=[],S());return}if(x?.name==="up"){p&&f>0&&(f--,f<h&&(h=f),S());return}if(x?.name==="down"){p&&f<m.length-1&&(f++,f>=h+K&&(h=f-K+1),S());return}if(x?.name==="left"){let j=W.moveLeft(u);j!==u&&(u=j,S());return}if(x?.name==="right"){let j=W.moveRight(u);j!==u&&(u=j,S());return}if(x?.name==="home"){let j=W.moveHome(u);j!==u&&(u=j,S());return}if(x?.name==="end"){let j=W.moveEnd(u);j!==u&&(u=j,S());return}if(x?.ctrl&&x?.name==="u"){let j=W.deleteToLineStart(u);j!==u&&(u=j,S());return}if(x?.ctrl&&x?.name==="k"){let j=W.deleteToLineEnd(u);j!==u&&(u=j,S());return}if(x?.name==="backspace"){if(x?.meta){let ct=W.deleteWordBackward(u);ct!==u&&(u=ct,S());return}let j=W.backspace(u);j!==u?(u=j,S()):P.length>0&&(P.pop(),S());return}if(x?.name==="delete"){if(x?.meta){let ct=W.deleteWordForward(u);ct!==u&&(u=ct,S());return}let j=W.deleteForward(u);j!==u&&(u=j,S());return}if(x?.name==="return"){if(k){u=W.insert(u,`
1644
+ `);return}if(Z){u=W.insert(u,`
1645
+ `),E();return}if(p){let j=g?.kind;A(),j==="slash"&&I()}else u.buffer.endsWith("\\")?(u=W.replaceRange(u,{start:u.buffer.length-1,end:u.buffer.length},`
1646
+ `),S()):I();return}if(x?.name==="tab"){p&&A();return}let oe=typeof $=="string"&&$.length===1&&$>=" "&&!x?.ctrl&&!x?.meta?$:typeof x?.sequence=="string"&&x.sequence.length===1&&x.sequence>=" "&&!x?.ctrl&&!x?.meta?x.sequence:null;oe!==null&&(u=W.insert(u,oe),k||(Z?E():S()))},i=()=>S(),t.on("keypress",a),n.on("resize",i)})}finally{r.restore()}}async function Cu(e){return!process.stdout.isTTY||!process.stdin.isTTY?yu(e):Pu(e)}function Au(e){if(!e)return null;let t=e.split(`
1647
+ `),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=Ek(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 a=Pk(s),i=s.join(`
1648
+ `).trim();return{kind:o,rawBody:i,...Ck(o,a)}}function Ek(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function Pk(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),s=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let i=t[t.length-1];i.value=`${i.value} ${r}`.trim();continue}let a=s.indexOf(":");if(a>0&&a<60){let i=s.slice(0,a).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").toLowerCase(),l=s.slice(a+1).trim();t.push({label:i,value:l})}else t.push({label:"",value:s})}return t}function Ck(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let s of r)if(o.label.includes(s))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let s=n("evidence","what changed","change","artifact","output");s!==void 0&&(r.evidence=s);let a=n("pending","deferred","follow-up","followup","next");return a!==void 0&&(r.deferred=a),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let s=n("unblock","must change","to unblock","condition");s!==void 0&&(r.unblockCondition=s);let a=n("already done","what has been done","progress");return a!==void 0&&(r.alreadyDone=a),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let s=n("assumption","resolves");s!==void 0&&(r.assumption=s);let a=n("once answered","follow-up","next","will do","after");return a!==void 0&&(r.followup=a),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let s=n("state was saved","state","saved","where");s!==void 0&&(r.stateLocation=s);let a=n("resumption","resume","requires");return a!==void 0&&(r.resumeRequires=a),r}}}var Ak={done:{color:d.success,chip:"\u2713 Done",affordance:"Objective satisfied \u2014 review evidence and close."},blocked:{color:d.error,chip:"\u2298 Blocked",affordance:"External dependency \u2014 unblock above to resume."},asking:{color:d.warning,chip:"? Asking",affordance:"Waiting on you \u2014 answer above to continue."},interrupted:{color:d.info,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved \u2014 resume when ready."}};function Iu(e){let t=Ak[e.kind],n=Math.max(40,Math.min(V()-4,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-N(` ${t.chip} `)-1))+"\u256E"),s=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),a=t.color("\u2502"),i=a+" ".repeat(n+4)+a,l=Ik(e),c=l.reduce((f,g)=>Math.max(f,N(g.label)),0),u=Math.max(8,n-c-2),p=[o,i];if(l.length===0){let f=e.rawBody.split(`
1649
+ `)[0]?.trim()??"";if(f.length>0){let g=q(f,n).split(`
1650
+ `);for(let y of g)p.push(a+" "+de(y,n)+" "+a)}}else for(let f of l){let g=d.dim(de(f.label,c)),y=q(f.value,u).split(`
1651
+ `),h=y[0]??"";p.push(a+" "+g+" "+de(h,u)+" "+a);for(let k of y.slice(1))p.push(a+" "+" ".repeat(c)+" "+de(k,u)+" "+a)}p.push(i);let m=d.dim(Te(t.affordance,n));return p.push(a+" "+de(m,n)+" "+a),p.push(s),p.join(`
1652
+ `)}function Ik(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 _k(e,t){let n=[];e&&n.push({type:"text",text:e});for(let r of t)n.push({type:"image",source:{type:"base64",media_type:r.mediaType,data:r.bytes.toString("base64")}});return n}async function _u(e,t,n,r,o="summary",s){let a=ku(e.text,e.attachments);r.setInFlight(!0);let i="",l=!1,c,u=!1,p=!1,m=!1,f,g=new Ut({out:qr(),thinkingMode:o,onCancel:()=>{t.interrupt().catch(h=>{vt()&&console.error(" "+d.error("session.interrupt() failed:"),h)})}}),y=async()=>{if(!p){p=!0;try{await g.dispose()}catch{}}};try{await g.arm();let h=g.getCompositor();if(s&&h){let w=h;s.fn=P=>w.commitAbove(P)}r.rearmStatus?.();let k=e.attachments.length===0?e.text:_k(e.text,e.attachments),v=t.sendMessageStream(k);if(await Bn(g.sink,async()=>{for await(let w of v){if(w.type==="chunk"&&w.chunk.type==="content"?(i+=w.chunk.content,l=!0):w.type==="message"&&!l&&(i=w.message.content),w.type==="error"){await y(),console.error(gn(w.error.message,w.error.stack)),u=!0;continue}g.process(w),w.type==="done"&&(m=!0,f=w.metadata)}}),!p){let w=g.getCompositor();if(w)try{let{text:P,queued:K}=w.getBuffer();K&&P.length>0&&(c=P)}catch{}}if(await y(),m){Xl(n,a,i,f),r.onTurnComplete&&await r.onTurnComplete(a,i).catch(()=>{}),l&&console.log(`
1653
+ `);let w=Au(i);if(w&&(console.log(Iu(w)),console.log(),r.onTerminalState))try{r.onTerminalState(w)}catch{}if(Rk(f,n),r.onAfterTurn){let P=r.onAfterTurn();P instanceof Promise&&await P.catch(()=>{})}}}catch(h){await y(),u||console.error(gn(h instanceof Error?h.message:"Unknown error",h instanceof Error&&h.stack?h.stack:void 0))}finally{await y(),s&&(s.fn=h=>console.log(h)),r.setInFlight(!1),r.rearmStatus?.()}return c}function Rk(e,t){if(!e)return;let n=[];e.durationMs&&n.push(xe(e.durationMs)),e.totalCostUsd!==void 0&&n.push(ge(e.totalCostUsd));let r=Number(e.usage?.input_tokens??0),o=Number(e.usage?.output_tokens??0);r+o>0&&n.push(D(r+o)+" tok"),n.length>0&&console.log(d.dim(" \u25E6 "+n.join(" \xB7 ")));let s=Vo(t);if(s>.5){let a=s>.8?d.error:d.warning;console.log(a(` context ${Math.round(s*100)}% used of ${D(Oe(t.model))}`))}console.log()}function Ru(e={}){let t=e.load??Pr,n=e.onResize??(a=>Dt.subscribe(a)),r="",o,s=n(()=>{r=""});return{renderIfChanged(a){let i=a??"unbound",l=t(i),c=cc(l);return i===o&&c===r?[]:(o=i,r=c,c===""?[]:Cr(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var ws={done:{glyph:"\u2713",color:d.success,label:"done"},blocked:{glyph:"\u2298",color:d.error,label:"blocked"},asking:{glyph:"?",color:d.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:d.info,label:"interrupted"}};function Mu(e={}){let t=Math.max(2,e.capacity??8),n=[];return{push(r){n.push(r.kind),n.length>t&&(n=n.slice(n.length-t))},reset(){n=[]},entries(){return n},render(){if(n.length===0)return null;let r=d.dim(" ledger "),o=d.dim(" \xB7 "),s=n.map(u=>{let p=ws[u];return p.color(`${p.glyph} ${p.label}`)}),a=d.dim(` (${n.length} turn${n.length===1?"":"s"})`),i=r+s.join(o)+a,l=Math.max(20,V()-2);if(N(i)<=l)return i;let c=r+n.map(u=>ws[u].color(ws[u].glyph)).join(d.dim(" "))+a;return Te(c,l)}}}function Mk(e,t){let n=d.brand("afk")+d.dim(` (${e})`),r=t?d.warning(" \u25CF plan"):"";return n+r+d.dim(" \u203A ")}async function $u(e,t,n,r){let o=null,s=[];e.session.waitForInitialization().then(async c=>{vt()&&(o=Er(c)),await Pc(e.session),vt()&&(s=Ec())}).catch(()=>{});let a,i=Ru(),l=Mu();try{for(;;){if(o&&(console.log(o),console.log(),o=null),s.length>0){for(let g of s)console.log(g);console.log(),s=[]}let c=i.renderIfChanged(e.stats.sessionId);if(c.length>0){for(let g of c)console.log(g);console.log()}let u=l.render();u&&console.log(u);let p=await Cu({rl:e.rl,promptFn:()=>Mk(e.stats.model,e.stats.planMode),onSigint:r,...a!==void 0?{initialBuffer:a}:{}});a=void 0;let m=p.text.trim(),f=p.attachments;if(!(!m&&f.length===0)){if(m.startsWith("/")){let g=await ql(m,e.slashCtx);if(g.handled){if(g.result==="exit"){e.rl.close();return}(m==="/clear"||m.startsWith("/clear "))&&(await t.rotateOnClear(),console.log(d.dim(` transcript: ${t.path()}`)),l.reset()),e.statusLine.rearm();continue}}a=await _u({text:m,attachments:f},e.session,e.stats,{setInFlight(g){n.turnInFlight=g},async onTurnComplete(g,y){await t.appendTurn(g,y)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:g=>l.push(g)},e.options.thinkingUi,e.completionWriter)}}}finally{i.dispose()}}import{execFile as $k}from"node:child_process";import{promisify as Ok}from"node:util";import{promises as Ou}from"node:fs";import{dirname as Dk,isAbsolute as Lk,join as Du,resolve as Fk}from"node:path";import{randomBytes as Nk}from"node:crypto";var Uk=Ok($k);function Xr(e){return e instanceof Error}function jk(e){let t=l=>String(l).padStart(2,"0"),n=String(e.getFullYear()),r=t(e.getMonth()+1),o=t(e.getDate()),s=t(e.getHours()),a=t(e.getMinutes()),i=t(e.getSeconds());return`${n}${r}${o}-${s}${a}${i}`}function Hk(){let e=jk(new Date),t=Nk(3).toString("hex");return`afk/${e}-${t}`}function Bk(e){if(e.trim().length===0)throw new Error("Invalid branch name: '' \u2014 branch name cannot be empty.");if(e.startsWith("-"))throw new Error(`Invalid branch name: '${e}' \u2014 must not start with '-' (would be parsed by git as a flag).`);if(e==="HEAD")throw new Error("Invalid branch name: 'HEAD' \u2014 reserved by git.");if(e.includes(".."))throw new Error(`Invalid branch name: '${e}' \u2014 must not contain '..'.`);let n=[{char:"~",label:"'~'"},{char:"^",label:"'^'"},{char:":",label:"':'"},{char:"?",label:"'?'"},{char:"*",label:"'*'"},{char:"[",label:"'['"},{char:"\\",label:"'\\'"},{char:"\0",label:"NUL byte"}];for(let{char:r,label:o}of n)if(e.includes(r))throw new Error(`Invalid branch name: '${e}' \u2014 must not contain ${o}.`);if(/\s/.test(e))throw new Error(`Invalid branch name: '${e}' \u2014 must not contain whitespace.`)}async function Wk(e){let t;try{t=(await e("git",["rev-parse","--git-common-dir"])).stdout.trim()}catch{throw new Error("Not in a git repository (run from inside a git checkout).")}if(!t)throw new Error("Not in a git repository (run from inside a git checkout).");let n=Lk(t)?t:Fk(process.cwd(),t);return Dk(n)}async function Kk(e){let t=Du(e,".gitignore"),n=".afk-worktrees/",r="";try{r=await Ou.readFile(t,"utf8")}catch(a){if(a.code!=="ENOENT")throw a;r=""}if(r.split(`
1525
1654
  `).some(a=>a.trim()===n))return;let s=r;s.length>0&&!s.endsWith(`
1526
1655
  `)&&(s+=`
1527
1656
  `),s+=`${n}
1528
- `,await $c.writeFile(t,s,"utf8")}function ek(e,t,n){if(!Ir(e))return new Error(`git worktree add failed: ${String(e)}`);let r=e.stderr??"",o=e.message??"",s=`${r}
1529
- ${o}`;return s.includes("already checked out")||s.includes("is already used by worktree")?new Error(`Branch '${t}' is already checked out in another worktree. Pick a different name.`):s.includes("already exists")?new Error(`Worktree path '${n}' already exists. Remove it or pick a different branch name.`):new Error(o||r||"git worktree add failed")}async function Dc(e,t){let n=t?.execFile??Yy,r=await Xy(n),o=e===!0?Jy():e;Qy(o);let s=o.replaceAll("/","-"),a=Oc(r,".afk-worktrees",s);await Zy(r);try{await n("git",["-C",r,"worktree","add","-b",o,a])}catch(l){throw ek(l,o,a)}return{path:a,branch:o,cleanup:async()=>{let l;try{l=await n("git",["-C",a,"status","--porcelain"])}catch(c){let u=Ir(c)?c.message||c.stderr||"":String(c);console.warn(`Worktree cleanup: could not check status at ${a} (${u}). Skipping removal \u2014 manual cleanup may be needed.`);return}if(l.stdout.trim().length>0){console.log(`Worktree preserved at ${a} (branch: ${o}) \u2014 uncommitted changes.`);return}try{await n("git",["-C",r,"worktree","remove","--force",a])}catch(c){let u=Ir(c)?c.message||c.stderr||"":String(c);console.warn(`Worktree cleanup: 'git worktree remove --force ${a}' failed (${u}). Manual removal may be needed.`);return}try{await n("git",["-C",r,"branch","-d",o])}catch(c){let u=Ir(c)?c.message||c.stderr||"":String(c);console.warn(`Could not delete branch '${o}': ${u}`)}}}}function nk(e){if(e==="summary"||e==="live"||e==="off")return e;throw new Error(`Invalid --thinking-ui value: ${e}. Expected summary|live|off`)}function Lc(e){e.command("interactive",{isDefault:!0}).description("Start interactive chat session").option("-m, --model <model>","Model to use. Short aliases: opus|opus_1m|sonnet|sonnet_1m|haiku. Any other value (e.g. `auto` for cursor-api-proxy, or a full `claude-*` ID) passes through to the SDK/proxy untouched.",be()).option("--max-turns <number>","Maximum conversation turns","100").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'","adaptive").option("--thinking-ui <mode>","Thinking display mode: summary|live|off",nk,"live").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--resume <id>","Resume a persisted SDK session by id").option("--continue","Continue the most recent persisted session in cwd").option("--debug","Show SDK init metadata on startup; enables /debug command",!1).option("-w, --worktree [branch]","Create a git worktree for an isolated session. Optional value sets the branch name; otherwise auto-named. On clean exit (no uncommitted changes) the worktree and branch are auto-removed; on dirty exit the worktree is preserved.").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai-codex. Default: auto-selected by model").action(async t=>{t.debug&&(process.env.AFK_DEBUG="1");let n=tk({text:"Initializing interactive session...",...rr}).start(),r,o;if(t.worktree!==void 0)try{o=await Dc(t.worktree),r=o.path,n.text=`Worktree ready at ${o.path} (branch: ${o.branch})`}catch(u){n.fail("Worktree setup failed"),console.error(d.error(u instanceof Error?u.message:String(u))),process.exit(1)}let s;try{s=await lc(t,r!==void 0?{cwd:r}:void 0)}catch(u){n.fail("Invalid options"),console.error(d.error(u instanceof Error?u.message:String(u))),process.exit(1)}rn(async()=>{await s.session.close(),o!==void 0&&await o.cleanup()}),n.succeed("Session ready");let a=await dc(()=>s.stats.model);console.log(d.dim(` transcript: ${a.path()}`)),rn(async()=>{await a.appendEnded()}),rn(async()=>{if(s.stats.totalTurns!==0)try{tr(s.stats)}catch{}});let i={turnInFlight:!1,lastSigintAt:0},l=1500,c=()=>{let u=Date.now();if(i.turnInFlight){s.session.interrupt().catch(()=>{}),i.lastSigintAt=u,console.log(`
1657
+ `,await Ou.writeFile(t,s,"utf8")}function Gk(e,t,n){if(!Xr(e))return new Error(`git worktree add failed: ${String(e)}`);let r=e.stderr??"",o=e.message??"",s=`${r}
1658
+ ${o}`;return s.includes("already checked out")||s.includes("is already used by worktree")?new Error(`Branch '${t}' is already checked out in another worktree. Pick a different name.`):s.includes("already exists")?new Error(`Worktree path '${n}' already exists. Remove it or pick a different branch name.`):new Error(o||r||"git worktree add failed")}async function Lu(e,t){let n=t?.execFile??Uk,r=await Wk(n),o=e===!0?Hk():e;Bk(o);let s=o.replaceAll("/","-"),a=Du(r,".afk-worktrees",s);await Kk(r);try{await n("git",["-C",r,"worktree","add","-b",o,a])}catch(l){throw Gk(l,o,a)}return{path:a,branch:o,cleanup:async()=>{let l;try{l=await n("git",["-C",a,"status","--porcelain"])}catch(c){let u=Xr(c)?c.message||c.stderr||"":String(c);console.warn(`Worktree cleanup: could not check status at ${a} (${u}). Skipping removal \u2014 manual cleanup may be needed.`);return}if(l.stdout.trim().length>0){console.log(`Worktree preserved at ${a} (branch: ${o}) \u2014 uncommitted changes.`);return}try{await n("git",["-C",r,"worktree","remove","--force",a])}catch(c){let u=Xr(c)?c.message||c.stderr||"":String(c);console.warn(`Worktree cleanup: 'git worktree remove --force ${a}' failed (${u}). Manual removal may be needed.`);return}try{await n("git",["-C",r,"branch","-d",o])}catch(c){let u=Xr(c)?c.message||c.stderr||"":String(c);console.warn(`Could not delete branch '${o}': ${u}`)}}}}function Vk(e){if(e==="summary"||e==="live"||e==="off")return e;throw new Error(`Invalid --thinking-ui value: ${e}. Expected summary|live|off`)}function Uu(e){e.command("interactive",{isDefault:!0}).description("Start interactive chat session").option("-m, --model <model>","Model to use. Short aliases: opus|opus_1m|sonnet|sonnet_1m|haiku. Any other value (e.g. `auto` for cursor-api-proxy, or a full `claude-*` ID) passes through to the SDK/proxy untouched.",we()).option("--max-turns <number>","Maximum conversation turns","100").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'","adaptive").option("--thinking-ui <mode>","Thinking display mode: summary|live|off",Vk,"live").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--resume <id>","Resume a persisted SDK session by id").option("--continue","Continue the most recent persisted session in cwd").option("--debug","Show SDK init metadata on startup; enables /debug command",!1).option("-w, --worktree [branch]","Create a git worktree for an isolated session. Optional value sets the branch name; otherwise auto-named. On clean exit (no uncommitted changes) the worktree and branch are auto-removed; on dirty exit the worktree is preserved.").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai-codex. Default: auto-selected by model").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').action(async t=>{if(t.debug&&(process.env.AFK_DEBUG="1"),t.dumpPrompt!==void 0){let u=t.dumpPrompt===!0?Nu.join(Fu.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(t.dumpPrompt);process.env.AFK_DUMP_PROMPT=u,t.provider!==void 0&&t.provider!=="anthropic"&&t.provider!=="anthropic-direct"&&console.error(`[--dump-prompt] WARNING: active provider (${t.provider}) does not support prompt dumping. No file will be written.`)}let n=zk({text:"Initializing interactive session...",...Tr}).start(),r,o;if(t.worktree!==void 0)try{o=await Lu(t.worktree),r=o.path,n.text=`Worktree ready at ${o.path} (branch: ${o.branch})`}catch(u){n.fail("Worktree setup failed"),console.error(d.error(u instanceof Error?u.message:String(u))),process.exit(1)}let s;try{s=await uu(t,r!==void 0?{cwd:r}:void 0)}catch(u){n.fail("Invalid options"),console.error(d.error(u instanceof Error?u.message:String(u))),process.exit(1)}hn(async()=>{await s.session.close(),s.memoryStore.close(),o!==void 0&&await o.cleanup()}),n.succeed("Session ready");let a=await mu(()=>s.stats.model);console.log(d.dim(` transcript: ${a.path()}`)),hn(async()=>{await a.appendEnded()}),hn(async()=>{if(s.stats.totalTurns!==0)try{vr(s.stats)}catch{}});let i={turnInFlight:!1,lastSigintAt:0},l=1500,c=()=>{let u=Date.now();if(i.turnInFlight){s.session.interrupt().catch(()=>{}),i.lastSigintAt=u,console.log(`
1530
1659
  `+d.warning("\u26A0 Interrupted. Press Ctrl+C again to exit."));return}if(u-i.lastSigintAt<l){s.rl.close();return}i.lastSigintAt=u,console.log(`
1531
- `+d.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",c),rn(async()=>{process.removeListener("SIGINT",c)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),console.log(`
1532
- `+Fa({mode:`Interactive Mode (${t.model})`,hintLine:"Type /help for commands \xB7 Ctrl+C to interrupt \xB7 /exit to quit"})),console.log(),s.statusLine.start(),s.slashCtx.ui.repaintStatusLine(),s.rl.on("close",async()=>{s.statusLine.stop(),rk(s),console.log(d.info("\u2139 ")+"Goodbye!"),await Na(),process.exit(0)}),await _c(s,a,i,c)})}function rk(e){if(e.stats.totalTurns===0)return;console.log(`
1533
- `+ee("Session Summary"));let t=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,Se(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&t.push(me(e.stats.totalCostUsd)),e.stats.totalTokens>0&&t.push(L(e.stats.totalTokens)+" tokens"),console.log(d.dim(" "+t.join(" \xB7 "))),console.log()}import ok from"chalk";import sk from"ora";function Fc(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=sk("Checking status...").start();try{let r=be(),o=ke(r),s=Ri(r);if(await new de({model:o==="openai-codex"?"gpt-5.4-mini":"haiku",...s!==void 0?{apiKey:s}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`),t.format==="json"){let i=H(),l=Vt(),c=i?process.env.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,u=l?process.env.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!i,source:c},codex:{ok:!!l,source:u}},model:String(r),bypass:!0},null,2))}else console.log(`
1534
- `+La("Agent AFK \xB7 Status",[{label:"Provider",value:o,kind:"info"},{label:"Auth",value:o==="openai-codex"?s?"Found (OPENAI_API_KEY / CODEX_API_KEY)":"Using `codex login` state on disk":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"}])+`
1535
- `)}catch(r){n.fail("Connection failed"),console.error(ok.red(r instanceof Error?r.message:"Unknown error")),process.exit(1)}})}import te from"chalk";function Nc(e){e.command("config").description("View current configuration").option("-f, --format <format>","Output format (text|json)","text").action(t=>{let n=process.env.AFK_MODEL??process.env.CLAUDE_MODEL,r=n??"sonnet",o=ke(n),s=process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_CODE_OAUTH_TOKEN,a=process.env.OPENAI_API_KEY||process.env.CODEX_API_KEY,i=o==="anthropic"?s:a,l=s?process.env.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,c=a?process.env.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;if(t.format==="json")console.log(JSON.stringify({model:r,provider:o,apiKey:{present:!!i,source:o==="anthropic"?l:c},thinking:process.env.AFK_THINKING||null,effort:process.env.AFK_EFFORT||null,bypass:!0,raw_env:{AFK_MODEL:process.env.AFK_MODEL??null,AFK_THINKING:process.env.AFK_THINKING??null,AFK_EFFORT:process.env.AFK_EFFORT??null,ANTHROPIC_API_KEY:process.env.ANTHROPIC_API_KEY?"set":"unset",CLAUDE_CODE_OAUTH_TOKEN:process.env.CLAUDE_CODE_OAUTH_TOKEN?"set":"unset",OPENAI_API_KEY:process.env.OPENAI_API_KEY?"set":"unset",CODEX_API_KEY:process.env.CODEX_API_KEY?"set":"unset"}},null,2));else{console.log(te.cyan(`\u{1F4CB} Current Configuration:
1536
- `)),console.log(` Model: ${te.blue(n?r:r+" (default)")}`),console.log(` Provider: ${te.magenta(o)}`),console.log(o==="anthropic"?` API Key: ${i?te.green("\u2713 Set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):te.yellow("\u26A0 Not set \u2014 subprocess will fall back to OAuth / keychain")}`:` API Key: ${i?te.green("\u2713 Set (OPENAI_API_KEY / CODEX_API_KEY)"):te.yellow("\u26A0 Not set \u2014 falling back to `codex login` state")}`);let u=process.env.AFK_THINKING||"(unset \u2014 SDK default)";console.log(` Thinking: ${te.blue(u)}`);let p=process.env.AFK_EFFORT||"(unset \u2014 SDK default)";console.log(` Effort: ${te.blue(p)}`),console.log(` Bypass Permissions: ${te.yellow("true (enabled)")}`),console.log(te.gray(`
1537
- Environment variables:`)),console.log(te.gray(" AFK_MODEL - Default model id (canonical; accepts short aliases or full ids)")),console.log(te.gray(" CLAUDE_MODEL - Legacy alias for AFK_MODEL (Claude-only deployments)")),console.log(te.gray(" ANTHROPIC_API_KEY - Anthropic API key (Claude models)")),console.log(te.gray(" CLAUDE_CODE_OAUTH_TOKEN - Anthropic OAuth token (Claude models)")),console.log(te.gray(" OPENAI_API_KEY / CODEX_API_KEY - OpenAI API key (Codex models)")),console.log(te.gray(" AFK_THINKING - Thinking mode (Claude only: adaptive|disabled|enabled:<N>)")),console.log(te.gray(" AFK_EFFORT - Effort level (low|medium|high|xhigh|max)")),console.log(te.gray(" AFK_TIMEOUT_MS - Per-tick daemon session timeout in ms")),console.log(te.gray(" AFK_SESSIONSTART_COOLDOWN_MS - Phase 6 cooldown between sessionstart fires (default 6h)")),console.log("")}})}import Ce from"chalk";import{createServer as mk}from"node:http";import{mkdirSync as uk,appendFileSync as dk}from"node:fs";import{dirname as pk}from"node:path";import*as Kc from"node-cron";function Uc(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}`)}import{existsSync as jc,readFileSync as ik,readdirSync as ak}from"node:fs";var Bc=360*60*1e3;function Hc(){return je()}function lk(e,t){if(!jc(t))return null;let n;try{n=ik(t,"utf-8")}catch{return null}let r=n.split(`
1538
- `);for(let o=r.length-1;o>=0;o-=1){let s=r[o];if(s)try{let a=JSON.parse(s);if(a.taskId!==e||typeof a.triggeredAt!="string")continue;let i=Date.parse(a.triggeredAt);if(Number.isNaN(i))continue;return i}catch{continue}}return null}function ck(e){if(!jc(e))return 0;try{return ak(e).filter(t=>!t.startsWith(".")).length}catch{return 0}}function Wc(e){let t=lk(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=ck(e.briefsDir);return n>0?{fire:!1,skipReason:"briefs_pending",pendingBriefCount:n,...t!==null?{lastFiredAtMs:t}:{}}:{fire:!0,...t!==null?{lastFiredAtMs:t}:{}}}var Mr=class{registry=new Map;options;defaultCooldownMs;briefsDir;now;constructor(t={}){this.options=t,this.defaultCooldownMs=t.cooldownMs??Bc,this.briefsDir=t.briefsDir??Hc(),this.now=t.now??Date.now,this.ensureTelemetrySink()}register(t){if(Uc(t),this.registry.has(t.taskId))throw new Error(`task ${t.taskId} is already registered`);let n;(t.trigger==="cron"||t.trigger==="both")&&(n=Kc.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=Wc({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(){for(let t of Array.from(this.registry.keys()))this.unregister(t)}async runOnce(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()},a=null;try{a=this.spawnSession();let i=await a.sendMessage(t.command),l={...s,durationMs:this.now()-o,status:"success",responseExcerpt:i.content.slice(0,280)};return this.writeTelemetry(l),l}catch(i){let l=i instanceof Error?i.message:String(i),c={...s,durationMs:this.now()-o,status:"error",errorMessage:l};return this.writeTelemetry(c),c}finally{if(a)try{await a.close()}catch{}}}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),o}spawnSession(){let t={model:"sonnet",hookRegistry:xt(),...this.options.sessionConfig};return this.options.sessionFactory?this.options.sessionFactory(t):new de(t)}telemetryPath(){return this.options.telemetryPath??un()}ensureTelemetrySink(){try{uk(pk(this.telemetryPath()),{recursive:!0})}catch{}}writeTelemetry(t){try{dk(this.telemetryPath(),`${JSON.stringify(t)}
1539
- `,"utf-8")}catch(n){let r=n instanceof Error?n.message:String(n);console.error(`[daemon] telemetry write failed: ${r}`)}}};var fk=7777;async function Gc(e={}){let t=new Mr({...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}:{}});for(let o of e.tasks??[])t.register(o);let n=mk((o,s)=>gk(o,s,t));return{port:await hk(n,e.port??fk),scheduler:t,registerTask(o){t.register(o)},unregisterTask(o){t.unregister(o)},tickOnce(o){return t.tick(o)},fireOnStart(){return t.fireOnStart()},async stop(){await t.stop(),await yk(n)}}}function gk(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}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function hk(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 yk(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}function zc(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 Vc(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 Yc(e){if(e===void 0||e==="")return"cron";if(e==="cron"||e==="sessionstart"||e==="both")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both.`)}var Go="/forge-friction --auto",zo="default";function Dt(e){if(e!==void 0&&e.trim()!=="")return e}function qc(e,t,n){return Dt(e)??Dt(t)??Dt(n)??Go}function Jc(e,t,n){return Dt(e)??Dt(t)??Dt(n)??zo}function Qc(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: ${Go})`).option("-c, --cron <expression>",'Cron expression (e.g. "0 */6 * * *"). Required when --trigger includes cron.').option("-i, --task-id <id>",`Task identifier (default: ${zo})`).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. 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).").action(async t=>{let n=parseInt(t.port,10);(Number.isNaN(n)||n<=0)&&(console.error(Ce.red(`Invalid port: ${t.port}`)),process.exit(1));let r=gt(),o=qc(t.task,process.env.AFK_DAEMON_TASK,r.daemon?.task),s=Jc(t.taskId,process.env.AFK_DAEMON_TASK_ID,r.daemon?.taskId),a,i,l;try{a=zc(t.timeoutMs,process.env.AFK_TIMEOUT_MS),i=Vc(t.sessionstartCooldownMs,process.env.AFK_SESSIONSTART_COOLDOWN_MS),l=Yc(t.trigger)}catch(m){console.error(Ce.red(m instanceof Error?m.message:String(m))),process.exit(1)}(l==="cron"||l==="both")&&!t.cron&&(console.error(Ce.red(`--cron is required when --trigger is '${l}'.`)),process.exit(1));let c,u;try{c=Ke(t.thinking)??yt(),u=Ge(t.effort)??kt()}catch(m){console.error(Ce.red(m instanceof Error?m.message:String(m))),process.exit(1)}let p={taskId:s,command:o,trigger:l,...t.cron!==void 0?{cronExpression:t.cron}:{}};try{let m=await Gc({port:n,sessionConfig:{model:be(),...H()!==void 0?{apiKey:H()}:{},...a!==void 0?{timeoutMs:a}:{},...c!==void 0?{thinking:c}:{},...u!==void 0?{effort:u}:{}},...i!==void 0?{cooldownMs:i}:{},...t.briefsDir!==void 0?{briefsDir:t.briefsDir}:{},tasks:[p]});if(t.once){console.log(Ce.cyan(`\u25B6 Firing task '${s}' once...`));let g=await m.tickOnce(s);console.log(JSON.stringify(g,null,2)),await m.stop(),process.exit(g.status==="success"?0:1)}if(l==="sessionstart"||l==="both"){let g=await m.fireOnStart();for(let y of g){let h=y.status==="success"?"\u2714":y.status==="skipped"?"\u23ED":"\u2717";console.log(Ce.cyan(`${h} sessionstart: ${JSON.stringify(y)}`))}}console.log(Ce.green(`\u2714 Daemon listening on http://localhost:${m.port}`)),console.log(Ce.dim(` task='${s}' command='${o}' trigger='${l}'${t.cron?` cron='${t.cron}'`:""}`)),console.log(Ce.dim(" Press Ctrl+C to stop."));let f=async()=>{console.log(Ce.dim(`
1540
- \xB7 Shutting down daemon...`)),await m.stop(),process.exit(0)};process.on("SIGINT",f),process.on("SIGTERM",f)}catch(m){console.error(Ce.red(m instanceof Error?m.message:String(m))),process.exit(1)}})}import Lt from"chalk";import{existsSync as kk,readFileSync as bk,writeFileSync as wk,mkdirSync as Sk}from"fs";import{dirname as vk}from"path";import{createInterface as xk}from"readline";import Vo from"chalk";function Xc(e,t,n,r=[]){Sk(vk(e),{recursive:!0});let o="";kk(e)&&(o=bk(e,"utf-8"));for(let i of r){let l=new RegExp(`^${i}=.*$
1660
+ `+d.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",c),hn(async()=>{process.removeListener("SIGINT",c)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),console.log(`
1661
+ `+jl({mode:`Interactive Mode (${t.model})`,hintLine:"Type /help for commands \xB7 Ctrl+C to interrupt \xB7 /exit to quit"})),console.log(),s.statusLine.start(),s.slashCtx.ui.repaintStatusLine(),s.rl.on("close",async()=>{s.statusLine.stop(),qk(s),console.log(d.info("\u2139 ")+"Goodbye!"),await Hl(),process.exit(0)}),await $u(s,a,i,c)})}function qk(e){if(e.stats.totalTurns===0)return;console.log(`
1662
+ `+ne("Session Summary"));let t=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,xe(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&t.push(ge(e.stats.totalCostUsd)),e.stats.totalTokens>0&&t.push(D(e.stats.totalTokens)+" tokens"),console.log(d.dim(" "+t.join(" \xB7 "))),console.log()}import Yk from"chalk";import Jk from"ora";function ju(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=Jk("Checking status...").start();try{let r=we(),o=ke(r),s=ma(r);if(await new me({model:o==="openai-codex"?"gpt-5.4-mini":"haiku",...s!==void 0?{apiKey:s}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`),t.format==="json"){let i=B(),l=nn(),c=i?process.env.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,u=l?process.env.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!i,source:c},codex:{ok:!!l,source:u}},model:String(r),bypass:!0},null,2))}else console.log(`
1663
+ `+Ul("Agent AFK \xB7 Status",[{label:"Provider",value:o,kind:"info"},{label:"Auth",value:o==="openai-codex"?s?"Found (OPENAI_API_KEY / CODEX_API_KEY)":"Using `codex login` state on disk":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"}])+`
1664
+ `)}catch(r){n.fail("Connection failed"),console.error(Yk.red(r instanceof Error?r.message:"Unknown error")),process.exit(1)}})}import re from"chalk";function Hu(e){e.command("config").description("View current configuration").option("-f, --format <format>","Output format (text|json)","text").action(t=>{let n=process.env.AFK_MODEL??process.env.CLAUDE_MODEL,r=n??"sonnet",o=ke(n),s=process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_CODE_OAUTH_TOKEN,a=process.env.OPENAI_API_KEY||process.env.CODEX_API_KEY,i=o==="anthropic"?s:a,l=s?process.env.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,c=a?process.env.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;if(t.format==="json")console.log(JSON.stringify({model:r,provider:o,apiKey:{present:!!i,source:o==="anthropic"?l:c},thinking:process.env.AFK_THINKING||null,effort:process.env.AFK_EFFORT||null,bypass:!0,raw_env:{AFK_MODEL:process.env.AFK_MODEL??null,AFK_THINKING:process.env.AFK_THINKING??null,AFK_EFFORT:process.env.AFK_EFFORT??null,ANTHROPIC_API_KEY:process.env.ANTHROPIC_API_KEY?"set":"unset",CLAUDE_CODE_OAUTH_TOKEN:process.env.CLAUDE_CODE_OAUTH_TOKEN?"set":"unset",OPENAI_API_KEY:process.env.OPENAI_API_KEY?"set":"unset",CODEX_API_KEY:process.env.CODEX_API_KEY?"set":"unset"}},null,2));else{console.log(re.cyan(`\u{1F4CB} Current Configuration:
1665
+ `)),console.log(` Model: ${re.blue(n?r:r+" (default)")}`),console.log(` Provider: ${re.magenta(o)}`),console.log(o==="anthropic"?` API Key: ${i?re.green("\u2713 Set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):re.yellow("\u26A0 Not set \u2014 subprocess will fall back to OAuth / keychain")}`:` API Key: ${i?re.green("\u2713 Set (OPENAI_API_KEY / CODEX_API_KEY)"):re.yellow("\u26A0 Not set \u2014 falling back to `codex login` state")}`);let u=process.env.AFK_THINKING||"(unset \u2014 SDK default)";console.log(` Thinking: ${re.blue(u)}`);let p=process.env.AFK_EFFORT||"(unset \u2014 SDK default)";console.log(` Effort: ${re.blue(p)}`),console.log(` Bypass Permissions: ${re.yellow("true (enabled)")}`),console.log(re.gray(`
1666
+ Environment variables:`)),console.log(re.gray(" AFK_MODEL - Default model id (canonical; accepts short aliases or full ids)")),console.log(re.gray(" CLAUDE_MODEL - Legacy alias for AFK_MODEL (Claude-only deployments)")),console.log(re.gray(" ANTHROPIC_API_KEY - Anthropic API key (Claude models)")),console.log(re.gray(" CLAUDE_CODE_OAUTH_TOKEN - Anthropic OAuth token (Claude models)")),console.log(re.gray(" OPENAI_API_KEY / CODEX_API_KEY - OpenAI API key (Codex models)")),console.log(re.gray(" AFK_THINKING - Thinking mode (Claude only: adaptive|disabled|enabled:<N>)")),console.log(re.gray(" AFK_EFFORT - Effort level (low|medium|high|xhigh|max)")),console.log(re.gray(" AFK_TIMEOUT_MS - Per-tick daemon session timeout in ms")),console.log(re.gray(" AFK_SESSIONSTART_COOLDOWN_MS - Phase 6 cooldown between sessionstart fires (default 6h)")),console.log("")}})}import _e from"chalk";import cw from"path";import uw from"os";import{createServer as ow}from"node:http";import{mkdirSync as tw,appendFileSync as nw}from"node:fs";import{dirname as rw}from"node:path";import*as Vu from"node-cron";function Bu(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}`)}import{existsSync as Wu,readFileSync as Xk,readdirSync as Qk}from"node:fs";var Ku=360*60*1e3;function Gu(){return Ve()}function Zk(e,t){if(!Wu(t))return null;let n;try{n=Xk(t,"utf-8")}catch{return null}let r=n.split(`
1667
+ `);for(let o=r.length-1;o>=0;o-=1){let s=r[o];if(s)try{let a=JSON.parse(s);if(a.taskId!==e||typeof a.triggeredAt!="string")continue;let i=Date.parse(a.triggeredAt);if(Number.isNaN(i))continue;return i}catch{continue}}return null}function ew(e){if(!Wu(e))return 0;try{return Qk(e).filter(t=>!t.startsWith(".")).length}catch{return 0}}function zu(e){let t=Zk(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=ew(e.briefsDir);return n>0?{fire:!1,skipReason:"briefs_pending",pendingBriefCount:n,...t!==null?{lastFiredAtMs:t}:{}}:{fire:!0,...t!==null?{lastFiredAtMs:t}:{}}}var Qr=class{registry=new Map;options;defaultCooldownMs;briefsDir;now;constructor(t={}){this.options=t,this.defaultCooldownMs=t.cooldownMs??Ku,this.briefsDir=t.briefsDir??Gu(),this.now=t.now??Date.now,this.ensureTelemetrySink()}register(t){if(Bu(t),this.registry.has(t.taskId))throw new Error(`task ${t.taskId} is already registered`);let n;(t.trigger==="cron"||t.trigger==="both")&&(n=Vu.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=zu({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(){for(let t of Array.from(this.registry.keys()))this.unregister(t)}async runOnce(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()},a=null,i=null;try{let l=this.spawnSession();a=l.session,i=l.memoryStore;let c=await a.sendMessage(t.command),u={...s,durationMs:this.now()-o,status:"success",responseExcerpt:c.content.slice(0,280)};return this.writeTelemetry(u),u}catch(l){let c=l instanceof Error?l.message:String(l),u={...s,durationMs:this.now()-o,status:"error",errorMessage:c};return this.writeTelemetry(u),u}finally{if(a)try{await a.close()}catch{}i?.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),o}spawnSession(){let{registry:t,memoryStore:n}=Rt(void 0,"daemon"),r={model:"sonnet",hookRegistry:t,...this.options.sessionConfig};return{session:this.options.sessionFactory?this.options.sessionFactory(r):new me(ft(r)),memoryStore:n}}telemetryPath(){return this.options.telemetryPath??Pn()}ensureTelemetrySink(){try{tw(rw(this.telemetryPath()),{recursive:!0})}catch{}}writeTelemetry(t){try{nw(this.telemetryPath(),`${JSON.stringify(t)}
1668
+ `,"utf-8")}catch(n){let r=n instanceof Error?n.message:String(n);console.error(`[daemon] telemetry write failed: ${r}`)}}};var sw=7777;async function qu(e={}){let t=new Qr({...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}:{}});for(let o of e.tasks??[])t.register(o);let n=ow((o,s)=>iw(o,s,t));return{port:await aw(n,e.port??sw),scheduler:t,registerTask(o){t.register(o)},unregisterTask(o){t.unregister(o)},tickOnce(o){return t.tick(o)},fireOnStart(){return t.fireOnStart()},async stop(){await t.stop(),await lw(n)}}}function iw(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}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function aw(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 lw(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}function Yu(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 Ju(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 Xu(e){if(e===void 0||e==="")return"cron";if(e==="cron"||e==="sessionstart"||e==="both")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both.`)}var Ss="/forge-friction --auto",vs="default";function Kt(e){if(e!==void 0&&e.trim()!=="")return e}function Qu(e,t,n){return Kt(e)??Kt(t)??Kt(n)??Ss}function Zu(e,t,n){return Kt(e)??Kt(t)??Kt(n)??vs}function ed(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: ${Ss})`).option("-c, --cron <expression>",'Cron expression (e.g. "0 */6 * * *"). Required when --trigger includes cron.').option("-i, --task-id <id>",`Task identifier (default: ${vs})`).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. 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)&&(console.error(_e.red(`Invalid port: ${t.port}`)),process.exit(1));let r=xt(),o=Qu(t.task,process.env.AFK_DAEMON_TASK,r.daemon?.task),s=Zu(t.taskId,process.env.AFK_DAEMON_TASK_ID,r.daemon?.taskId),a,i,l;try{a=Yu(t.timeoutMs,process.env.AFK_TIMEOUT_MS),i=Ju(t.sessionstartCooldownMs,process.env.AFK_SESSIONSTART_COOLDOWN_MS),l=Xu(t.trigger)}catch(m){console.error(_e.red(m instanceof Error?m.message:String(m))),process.exit(1)}(l==="cron"||l==="both")&&!t.cron&&(console.error(_e.red(`--cron is required when --trigger is '${l}'.`)),process.exit(1));let c,u;try{c=Qe(t.thinking)??Et(),u=Ze(t.effort)??Pt()}catch(m){console.error(_e.red(m instanceof Error?m.message:String(m))),process.exit(1)}let p={taskId:s,command:o,trigger:l,...t.cron!==void 0?{cronExpression:t.cron}:{}};if(t.dumpPrompt!==void 0&&t.dumpPrompt!==!1){let m=t.dumpPrompt===!0?cw.join(uw.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):t.dumpPrompt;process.env.AFK_DUMP_PROMPT=m}try{let m=await qu({port:n,sessionConfig:{model:we(),...B()!==void 0?{apiKey:B()}:{},...a!==void 0?{timeoutMs:a}:{},...c!==void 0?{thinking:c}:{},...u!==void 0?{effort:u}:{}},...i!==void 0?{cooldownMs:i}:{},...t.briefsDir!==void 0?{briefsDir:t.briefsDir}:{},tasks:[p]});if(t.once){console.log(_e.cyan(`\u25B6 Firing task '${s}' once...`));let g=await m.tickOnce(s);console.log(JSON.stringify(g,null,2)),await m.stop(),process.exit(g.status==="success"?0:1)}if(l==="sessionstart"||l==="both"){let g=await m.fireOnStart();for(let y of g){let h=y.status==="success"?"\u2714":y.status==="skipped"?"\u23ED":"\u2717";console.log(_e.cyan(`${h} sessionstart: ${JSON.stringify(y)}`))}}console.log(_e.green(`\u2714 Daemon listening on http://localhost:${m.port}`)),console.log(_e.dim(` task='${s}' command='${o}' trigger='${l}'${t.cron?` cron='${t.cron}'`:""}`)),console.log(_e.dim(" Press Ctrl+C to stop."));let f=async()=>{console.log(_e.dim(`
1669
+ \xB7 Shutting down daemon...`)),await m.stop(),process.exit(0)};process.on("SIGINT",f),process.on("SIGTERM",f)}catch(m){console.error(_e.red(m instanceof Error?m.message:String(m))),process.exit(1)}})}import zt from"chalk";import{existsSync as dw,readFileSync as pw,writeFileSync as mw,mkdirSync as fw}from"fs";import{dirname as gw}from"path";import{createInterface as hw}from"readline";import xs from"chalk";function Gt(e,t,n,r=[]){fw(gw(e),{recursive:!0});let o="";dw(e)&&(o=pw(e,"utf-8"));for(let i of r){let l=new RegExp(`^${i}=.*$
1541
1670
  ?`,"m");o=o.replace(l,"")}let s=`${t}=${n}`,a=new RegExp(`^${t}=.*$`,"m");a.test(o)?o=o.replace(a,s):(o&&!o.endsWith(`
1542
1671
  `)&&(o+=`
1543
1672
  `),o+=s+`
1544
- `),wk(e,o,{mode:384})}function Zc(){let e=xk({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question("Anthropic API key or OAuth token: ",n=>{e.close(),t(n.trim())})})}async function Rr(e){let t=e??await Zc();t||(console.error(Vo.red("No token provided. Nothing saved.")),process.exit(1));let n=ot(),r,o;t.startsWith("sk-ant-oat")?(r="CLAUDE_CODE_OAUTH_TOKEN",o=["ANTHROPIC_API_KEY"]):(r="ANTHROPIC_API_KEY",o=["CLAUDE_CODE_OAUTH_TOKEN"]),Xc(n,r,t,o),console.log(Vo.green(`\u2713 Saved ${r} to ${n}`)),console.log(Vo.gray("Restart any running afk daemon to pick up the new token."))}function eu(e){e.command("login [token]").description("Save an Anthropic API key or OAuth token for afk to use").action(async t=>{if(ke(be())==="openai-codex"){console.log(Lt.yellow("`afk login` is Anthropic-only.")),console.log(""),console.log("For Codex-backed models (gpt-*, o1*, o3*, o4*, codex-*), authenticate with one of:"),console.log(Lt.cyan(" codex login")),console.log(Lt.cyan(" codex login --device-auth")),console.log("or export an API key before running afk:"),console.log(Lt.cyan(" export OPENAI_API_KEY=sk-proj-...")),console.log(Lt.cyan(" # or: export CODEX_API_KEY=...")),console.log(""),console.log(Lt.gray("To save an Anthropic key for Claude models instead, re-run with AFK_MODEL=sonnet (or similar) first."));return}await Rr(t)})}import F from"chalk";import _r from"ora";import{existsSync as Tk}from"fs";import{join as Ek}from"path";async function Yo(e,t={},n={}){let r=n.pluginsDir??le(),o=n.indexPath??j(),s=n.now??(()=>new Date),a=n.gitRunner?{runner:n.gitRunner}:{},l=K(o).plugins[e];if(!l)throw new Error(`plugin "${e}" is not installed`);let c=Ek(r,e);if(!Tk(c))return{name:e,status:"missing-dir",dir:c};if(l.sourceType==="local")return{name:e,status:"skipped-local"};await hr(c,a);let u;if(t.ref)u=t.ref;else{let g=await Xe(c,a);u=et(g)??l.ref??await Re(c,a)}if(u===l.ref){let g=await Me(c,a);return{name:e,status:"up-to-date",ref:u,commit:g}}await Ze(c,u,a);let p=await Me(c,a),m=s().toISOString(),f={...l,ref:u,commit:p,updatedAt:m};return Be(e,f,o),{name:e,status:"updated",fromRef:l.ref,toRef:u,commit:p}}async function tu(e={}){let t=e.indexPath??j(),n=K(t),r=[];for(let o of Object.keys(n.plugins))try{r.push(await Yo(o,{},e))}catch(s){let a=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:a})}return r}import{existsSync as Pk,lstatSync as Ck,rmSync as Ak,unlinkSync as Ik}from"fs";import{join as Mk}from"path";function nu(e,t={}){let n=t.pluginsDir??le(),r=t.indexPath??j(),o=Mk(n,e),s=!1;Rk(o)?(Ik(o),s=!0):Pk(o)&&(Ak(o,{recursive:!0,force:!0}),s=!0);let a=K(r),i=Object.prototype.hasOwnProperty.call(a.plugins,e);return i&&zs(e,r),{name:e,removedDir:s,removedIndexEntry:i}}function Rk(e){try{return Ck(e).isSymbolicLink()}catch{return!1}}function ru(e,t={}){let n=t.logger??console,r=t.pluginsDir??le(),o=t.indexPath??j(),s={...t,pluginsDir:r,indexPath:o},a=e.command("plugin").description("Manage AFK plugins (install / update / list / remove / enable / disable)");a.command("install <source> [name]").description("Install a plugin from a git URL, owner/repo shorthand, local path, or <marketplace>:<plugin>").option("-r, --ref <ref>","Install a specific tag, branch, or SHA").option("-f, --force","Replace an existing plugin with the same name").action(async(i,l,c)=>{let u;try{u=Rt(i)}catch(m){_r(`Installing ${i}\u2026`).start().fail(F.red(`Install failed: ${Ft(m)}`)),process.exitCode=1;return}if(u.type==="marketplace-ref"){let m=_r(`Installing ${u.marketplace}:${u.plugin}\u2026`).start();try{let f=await Ot(u.marketplace,u.plugin,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},s);m.succeed(F.green(`Installed ${F.bold(f.key)}`)+F.gray(` at ${f.dir}`))}catch(f){m.fail(F.red(`Install failed: ${Ft(f)}`)),process.exitCode=1}return}let p=_r(`Installing ${i}\u2026`).start();try{let m={...l?{name:l}:{},...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},f=await vr(i,m,s);p.succeed(F.green(`Installed ${F.bold(f.name)}`)+F.gray(` at ${f.dir}${f.entry.ref?` (ref: ${f.entry.ref})`:""}`))}catch(m){p.fail(F.red(`Install failed: ${Ft(m)}`)),process.exitCode=1}}),a.command("update [name]").description("Update one plugin, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(i,l)=>{try{if(i){let c=_r(`Updating ${i}\u2026`).start(),u=await Yo(i,l.ref?{ref:l.ref}:{},s);$k(u,c)}else{n.log(F.cyan("Updating all plugins\u2026"));let c=await tu(s);if(c.length===0){n.log(F.gray(" (nothing installed)"));return}for(let u of c)n.log(" "+ou(u))}}catch(c){n.error(F.red(`Update failed: ${Ft(c)}`)),process.exitCode=1}}),a.command("list").description("List installed plugins with their source, version, and enabled state").option("-f, --format <format>","Output format (text|json)","text").action(i=>{let l=K(o);if(i.format==="json"){let c=Object.entries(l.plugins).map(([u,p])=>({name:u,enabled:p.enabled,...p.ref?{ref:p.ref}:{},source:p.source}));n.log(JSON.stringify({plugins:c},null,2))}else _k(l,n)}),a.command("remove <name>").description("Remove a plugin (directory + index entry)").action(i=>{let l=nu(i,{pluginsDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry){n.log(F.gray(`No plugin named "${i}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null].filter(Boolean);n.log(F.green(`Removed ${i}: ${c.join(" + ")}`))}),a.command("enable <name>").description("Re-enable a previously disabled plugin").action(i=>{try{Br(i,!0,o),n.log(F.green(`Enabled ${i}`))}catch(l){n.error(F.red(`Enable failed: ${Ft(l)}`)),process.exitCode=1}}),a.command("disable <name>").description("Keep the plugin on disk but skip it from SDK init").action(i=>{try{Br(i,!1,o),n.log(F.yellow(`Disabled ${i} (dir preserved at ${r}/${i})`))}catch(l){n.error(F.red(`Disable failed: ${Ft(l)}`)),process.exitCode=1}})}function Ft(e){return e instanceof Error?e.message:String(e)}function _k(e,t){let n=Object.keys(e.plugins).sort();if(n.length===0){t.log(F.gray("No plugins installed.")),t.log(F.gray(" Try: afk plugin install anthropics/claude-plugins-official"));return}t.log(F.cyan.bold(`
1545
- Installed plugins:`));for(let r of n){let o=e.plugins[r];if(!o)continue;let s=o.enabled?F.green("enabled "):F.yellow("disabled"),a=o.ref?F.blue(o.ref):F.gray("(local)"),i=F.gray(o.source);t.log(` ${F.bold(r.padEnd(30))} ${s} ${a.padEnd(12)} ${i}`)}t.log("")}function ou(e){switch(e.status){case"updated":return`${F.green("\u2713")} ${F.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}`;case"up-to-date":return`${F.gray("\xB7")} ${F.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${F.gray("\xB7")} ${F.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${F.yellow("!")} ${F.bold(e.name)}: plugin dir missing (${e.dir})`}}function $k(e,t){let n=ou(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}import R from"chalk";import qo from"ora";function su(e,t={}){let n=t.logger??console,r=t.cacheDir??_e(),o=t.indexPath??j(),s={...t,cacheDir:r,indexPath:o},a=e.command("marketplace").description("Manage AFK plugin marketplaces (install / list / plugins / install-plugin / remove / update)");a.command("install <source> [name]").description("Clone or symlink a marketplace into the local plugin cache").option("-r, --ref <ref>","Install a specific tag, branch, or SHA").option("-f, --force","Replace an existing marketplace with the same name").action(async(i,l,c)=>{let u=qo(`Installing marketplace ${i}\u2026`).start();try{let p={...l?{name:l}:{},...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},m=await br(i,p,s),f=m.entry.ref?` (ref: ${m.entry.ref})`:"";u.succeed(R.green(`Installed marketplace ${R.bold(m.name)}`)+R.gray(`${f} at ${m.dir}`)),n.log(R.gray(` ${m.plugins.length} plugin(s) available \u2014 run \`afk marketplace plugins ${m.name}\` to list.`))}catch(p){u.fail(R.red(`Marketplace install failed: ${$r(p)}`)),process.exitCode=1}}),a.command("list").description("List installed marketplaces with their source and ref").option("-f, --format <format>","Output format (text|json)","text").action(i=>{let l=K(o),c=Object.entries(l.marketplaces);if(i.format==="json"){n.log(JSON.stringify({marketplaces:c.map(([u,p])=>({name:u,source:p.source,sourceType:p.sourceType,...p.ref?{ref:p.ref}:{}}))},null,2));return}if(c.length===0){n.log(R.gray("No marketplaces installed.")),n.log(R.gray(" Try: afk marketplace install griffinwork40/awa-private"));return}n.log(R.cyan.bold(`
1546
- Installed marketplaces:`));for(let[u,p]of c.sort()){let m=p.ref?R.blue(p.ref):R.gray("(local)"),f=R.gray(p.source);n.log(` ${R.bold(u.padEnd(30))} ${m.padEnd(12)} ${f}`)}n.log("")}),a.command("plugins <name>").description("List plugins inside a marketplace, with [installed] / [available] markers").option("-f, --format <format>","Output format (text|json)","text").action((i,l)=>{try{let c=Tr(i,s);if(l.format==="json"){n.log(JSON.stringify({marketplace:i,plugins:c},null,2));return}if(c.length===0){n.log(R.gray(`Marketplace "${i}" lists no plugins.`));return}n.log(R.cyan.bold(`
1673
+ `),mw(e,o,{mode:384})}function td(){let e=hw({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question("Anthropic API key or OAuth token: ",n=>{e.close(),t(n.trim())})})}async function Zr(e){let t=e??await td();t||(console.error(xs.red("No token provided. Nothing saved.")),process.exit(1));let n=Ne(),r,o;t.startsWith("sk-ant-oat")?(r="CLAUDE_CODE_OAUTH_TOKEN",o=["ANTHROPIC_API_KEY"]):(r="ANTHROPIC_API_KEY",o=["CLAUDE_CODE_OAUTH_TOKEN"]),Gt(n,r,t,o),console.log(xs.green(`\u2713 Saved ${r} to ${n}`)),console.log(xs.gray("Restart any running afk daemon to pick up the new token."))}function nd(e){e.command("login [token]").description("Save an Anthropic API key or OAuth token for afk to use").action(async t=>{if(ke(we())==="openai-codex"){console.log(zt.yellow("`afk login` is Anthropic-only.")),console.log(""),console.log("For Codex-backed models (gpt-*, o1*, o3*, o4*, codex-*), authenticate with one of:"),console.log(zt.cyan(" codex login")),console.log(zt.cyan(" codex login --device-auth")),console.log("or export an API key before running afk:"),console.log(zt.cyan(" export OPENAI_API_KEY=sk-proj-...")),console.log(zt.cyan(" # or: export CODEX_API_KEY=...")),console.log(""),console.log(zt.gray("To save an Anthropic key for Claude models instead, re-run with AFK_MODEL=sonnet (or similar) first."));return}await Zr(t)})}import L from"chalk";import eo from"ora";import{existsSync as yw}from"fs";import{join as bw}from"path";async function Ts(e,t={},n={}){let r=n.pluginsDir??ue(),o=n.indexPath??U(),s=n.now??(()=>new Date),a=n.gitRunner?{runner:n.gitRunner}:{},l=z(o).plugins[e];if(!l)throw new Error(`plugin "${e}" is not installed`);let c=bw(r,e);if(!yw(c))return{name:e,status:"missing-dir",dir:c};if(l.sourceType==="local")return{name:e,status:"skipped-local"};await Nr(c,a);let u;if(t.ref)u=t.ref;else{let g=await st(c,a);u=at(g)??l.ref??await Le(c,a)}if(u===l.ref){let g=await De(c,a);return{name:e,status:"up-to-date",ref:u,commit:g}}await it(c,u,a);let p=await De(c,a),m=s().toISOString(),f={...l,ref:u,commit:p,updatedAt:m};return Ye(e,f,o),{name:e,status:"updated",fromRef:l.ref,toRef:u,commit:p}}async function rd(e={}){let t=e.indexPath??U(),n=z(t),r=[];for(let o of Object.keys(n.plugins))try{r.push(await Ts(o,{},e))}catch(s){let a=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:a})}return r}import{existsSync as kw,lstatSync as ww,rmSync as Sw,unlinkSync as vw}from"fs";import{join as xw}from"path";function od(e,t={}){let n=t.pluginsDir??ue(),r=t.indexPath??U(),o=xw(n,e),s=!1;Tw(o)?(vw(o),s=!0):kw(o)&&(Sw(o,{recursive:!0,force:!0}),s=!0);let a=z(r),i=Object.prototype.hasOwnProperty.call(a.plugins,e);return i&&Ai(e,r),{name:e,removedDir:s,removedIndexEntry:i}}function Tw(e){try{return ww(e).isSymbolicLink()}catch{return!1}}function sd(e,t={}){let n=t.logger??console,r=t.pluginsDir??ue(),o=t.indexPath??U(),s={...t,pluginsDir:r,indexPath:o},a=e.command("plugin").description("Manage AFK plugins (install / update / list / remove / enable / disable)");a.command("install <source> [name]").description("Install a plugin from a git URL, owner/repo shorthand, local path, or <marketplace>:<plugin>").option("-r, --ref <ref>","Install a specific tag, branch, or SHA").option("-f, --force","Replace an existing plugin with the same name").action(async(i,l,c)=>{let u;try{u=jt(i)}catch(m){eo(`Installing ${i}\u2026`).start().fail(L.red(`Install failed: ${Vt(m)}`)),process.exitCode=1;return}if(u.type==="marketplace-ref"){let m=eo(`Installing ${u.marketplace}:${u.plugin}\u2026`).start();try{let f=await Wt(u.marketplace,u.plugin,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},s);m.succeed(L.green(`Installed ${L.bold(f.key)}`)+L.gray(` at ${f.dir}`))}catch(f){m.fail(L.red(`Install failed: ${Vt(f)}`)),process.exitCode=1}return}let p=eo(`Installing ${i}\u2026`).start();try{let m={...l?{name:l}:{},...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},f=await Kr(i,m,s);p.succeed(L.green(`Installed ${L.bold(f.name)}`)+L.gray(` at ${f.dir}${f.entry.ref?` (ref: ${f.entry.ref})`:""}`))}catch(m){p.fail(L.red(`Install failed: ${Vt(m)}`)),process.exitCode=1}}),a.command("update [name]").description("Update one plugin, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(i,l)=>{try{if(i){let c=eo(`Updating ${i}\u2026`).start(),u=await Ts(i,l.ref?{ref:l.ref}:{},s);Pw(u,c)}else{n.log(L.cyan("Updating all plugins\u2026"));let c=await rd(s);if(c.length===0){n.log(L.gray(" (nothing installed)"));return}for(let u of c)n.log(" "+id(u))}}catch(c){n.error(L.red(`Update failed: ${Vt(c)}`)),process.exitCode=1}}),a.command("list").description("List installed plugins with their source, version, and enabled state").option("-f, --format <format>","Output format (text|json)","text").action(i=>{let l=z(o);if(i.format==="json"){let c=Object.entries(l.plugins).map(([u,p])=>({name:u,enabled:p.enabled,...p.ref?{ref:p.ref}:{},source:p.source}));n.log(JSON.stringify({plugins:c},null,2))}else Ew(l,n)}),a.command("remove <name>").description("Remove a plugin (directory + index entry)").action(i=>{let l=od(i,{pluginsDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry){n.log(L.gray(`No plugin named "${i}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null].filter(Boolean);n.log(L.green(`Removed ${i}: ${c.join(" + ")}`))}),a.command("enable <name>").description("Re-enable a previously disabled plugin").action(i=>{try{mo(i,!0,o),n.log(L.green(`Enabled ${i}`))}catch(l){n.error(L.red(`Enable failed: ${Vt(l)}`)),process.exitCode=1}}),a.command("disable <name>").description("Keep the plugin on disk but skip it from SDK init").action(i=>{try{mo(i,!1,o),n.log(L.yellow(`Disabled ${i} (dir preserved at ${r}/${i})`))}catch(l){n.error(L.red(`Disable failed: ${Vt(l)}`)),process.exitCode=1}})}function Vt(e){return e instanceof Error?e.message:String(e)}function Ew(e,t){let n=Object.keys(e.plugins).sort();if(n.length===0){t.log(L.gray("No plugins installed.")),t.log(L.gray(" Try: afk plugin install anthropics/claude-plugins-official"));return}t.log(L.cyan.bold(`
1674
+ Installed plugins:`));for(let r of n){let o=e.plugins[r];if(!o)continue;let s=o.enabled?L.green("enabled "):L.yellow("disabled"),a=o.ref?L.blue(o.ref):L.gray("(local)"),i=L.gray(o.source);t.log(` ${L.bold(r.padEnd(30))} ${s} ${a.padEnd(12)} ${i}`)}t.log("")}function id(e){switch(e.status){case"updated":return`${L.green("\u2713")} ${L.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}`;case"up-to-date":return`${L.gray("\xB7")} ${L.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${L.gray("\xB7")} ${L.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${L.yellow("!")} ${L.bold(e.name)}: plugin dir missing (${e.dir})`}}function Pw(e,t){let n=id(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}import R from"chalk";import Es from"ora";function ad(e,t={}){let n=t.logger??console,r=t.cacheDir??Fe(),o=t.indexPath??U(),s={...t,cacheDir:r,indexPath:o},a=e.command("marketplace").description("Manage AFK plugin marketplaces (install / list / plugins / install-plugin / remove / update)");a.command("install <source> [name]").description("Clone or symlink a marketplace into the local plugin cache").option("-r, --ref <ref>","Install a specific tag, branch, or SHA").option("-f, --force","Replace an existing marketplace with the same name").action(async(i,l,c)=>{let u=Es(`Installing marketplace ${i}\u2026`).start();try{let p={...l?{name:l}:{},...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},m=await Hr(i,p,s),f=m.entry.ref?` (ref: ${m.entry.ref})`:"";u.succeed(R.green(`Installed marketplace ${R.bold(m.name)}`)+R.gray(`${f} at ${m.dir}`)),n.log(R.gray(` ${m.plugins.length} plugin(s) available \u2014 run \`afk marketplace plugins ${m.name}\` to list.`))}catch(p){u.fail(R.red(`Marketplace install failed: ${to(p)}`)),process.exitCode=1}}),a.command("list").description("List installed marketplaces with their source and ref").option("-f, --format <format>","Output format (text|json)","text").action(i=>{let l=z(o),c=Object.entries(l.marketplaces);if(i.format==="json"){n.log(JSON.stringify({marketplaces:c.map(([u,p])=>({name:u,source:p.source,sourceType:p.sourceType,...p.ref?{ref:p.ref}:{}}))},null,2));return}if(c.length===0){n.log(R.gray("No marketplaces installed.")),n.log(R.gray(" Try: afk marketplace install griffinwork40/awa-private"));return}n.log(R.cyan.bold(`
1675
+ Installed marketplaces:`));for(let[u,p]of c.sort()){let m=p.ref?R.blue(p.ref):R.gray("(local)"),f=R.gray(p.source);n.log(` ${R.bold(u.padEnd(30))} ${m.padEnd(12)} ${f}`)}n.log("")}),a.command("plugins <name>").description("List plugins inside a marketplace, with [installed] / [available] markers").option("-f, --format <format>","Output format (text|json)","text").action((i,l)=>{try{let c=zr(i,s);if(l.format==="json"){n.log(JSON.stringify({marketplace:i,plugins:c},null,2));return}if(c.length===0){n.log(R.gray(`Marketplace "${i}" lists no plugins.`));return}n.log(R.cyan.bold(`
1547
1676
  Plugins in ${i}:`)),c.forEach((u,p)=>{let m=u.installed?R.green("[\u2713]"):R.gray("[ ]"),f=u.description?R.gray(` \u2014 ${u.description}`):"";n.log(` ${m} ${R.bold((p+1).toString().padStart(2))}. ${R.bold(u.name)}${f}`)}),n.log(R.gray(`
1548
- Install one: afk plugin install ${i}:<plugin>`))}catch(c){n.error(R.red(`List failed: ${$r(c)}`)),process.exitCode=1}}),a.command("install-plugin <marketplace> <plugin>").description("Install a single plugin from a marketplace").option("-r, --ref <ref>","For git-sourced plugins, pin to a specific tag/branch/SHA").option("-f, --force","Replace an existing plugin with the same key").action(async(i,l,c)=>{let u=qo(`Installing ${i}:${l}\u2026`).start();try{let p=await Ot(i,l,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},s);u.succeed(R.green(`Installed ${R.bold(p.key)}`)+R.gray(` at ${p.dir}`))}catch(p){u.fail(R.red(`Install failed: ${$r(p)}`)),process.exitCode=1}}),a.command("remove <name>").description("Remove a marketplace and cascade-delete its installed plugins").action(i=>{let l=wr(i,{cacheDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry&&l.removedPluginEntries.length===0){n.log(R.gray(`No marketplace named "${i}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null,l.removedPluginEntries.length>0?`${l.removedPluginEntries.length} plugin entry`:null].filter(Boolean);if(n.log(R.green(`Removed ${i}: ${c.join(" + ")}`)),l.removedPluginEntries.length>0)for(let u of l.removedPluginEntries)n.log(R.gray(` - ${u}`))}),a.command("update [name]").description("Update one marketplace, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(i,l)=>{try{if(i){let c=qo(`Updating ${i}\u2026`).start(),u=await ln(i,l.ref?{ref:l.ref}:{},s);Ok(u,c)}else{n.log(R.cyan("Updating all marketplaces\u2026"));let c=await ec(s);if(c.length===0){n.log(R.gray(" (no marketplaces installed)"));return}for(let u of c)n.log(" "+iu(u))}}catch(c){n.error(R.red(`Update failed: ${$r(c)}`)),process.exitCode=1}})}function $r(e){return e instanceof Error?e.message:String(e)}function iu(e){switch(e.status){case"updated":{let t=e.addedPlugins.length>0?` +${e.addedPlugins.join(", ")}`:"",n=e.removedPlugins.length>0?` -${e.removedPlugins.join(", ")}`:"";return`${R.green("\u2713")} ${R.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}${R.gray(t+n)}`}case"up-to-date":return`${R.gray("\xB7")} ${R.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${R.gray("\xB7")} ${R.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${R.yellow("!")} ${R.bold(e.name)}: marketplace dir missing (${e.dir})`}}function Ok(e,t){let n=iu(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}import{access as Dk,constants as Lk,mkdir as Fk,readFile as Nk}from"fs/promises";import{execSync as Uk}from"child_process";async function jk(){return H()?{name:"Anthropic API Key",state:"pass",detail:"ANTHROPIC_API_KEY set"}:{name:"Anthropic API Key",state:"fail",fix:"Set ANTHROPIC_API_KEY or run `afk login`"}}async function Bk(){return Vt()?{name:"Codex/OpenAI API Key",state:"pass",detail:"OPENAI_API_KEY or CODEX_API_KEY set"}:{name:"Codex/OpenAI API Key",state:"warn",fix:"Set OPENAI_API_KEY or CODEX_API_KEY to use Codex models"}}async function Hk(){try{let t=`${Uk("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(process.env.PATH??"").split(":").map(r=>r.replace(/\/$/,"")).includes(t)?{name:"npm bin on PATH",state:"pass",detail:t}:{name:"npm bin on PATH",state:"fail",detail:t,fix:`Add ${t} to PATH: echo 'export PATH="${t}:$PATH"' >> ~/.zshrc`}}catch{return{name:"npm bin on PATH",state:"warn",detail:"could not query npm prefix"}}}async function Jo(e,t){let n=t();try{return await Dk(n,Lk.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await Fk(n,{recursive:!0}),{name:e,state:"pass",detail:`${n} (created)`}}catch{return{name:e,state:"fail",detail:n,fix:`Unable to create or write to ${n}`}}}}async function Wk(){let e=mt();try{let t=await Nk(e,"utf-8");return JSON.parse(t),{name:"Config File",state:"pass",detail:`${e} (valid JSON)`}}catch(t){return t.code==="ENOENT"?{name:"Config File",state:"pass",detail:"no config file (using defaults)"}:{name:"Config File",state:"fail",detail:e,fix:`Unable to parse config file: ${t instanceof Error?t.message:"unknown error"}`}}}async function Kk(){let e=process.env.AFK_TELEGRAM_BOT_TOKEN;if(!e)return null;try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://api.telegram.org/bot${e}/getMe`,{signal:t.signal});if(clearTimeout(n),r.ok){let s=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:s?`@${s}`:"connected"}}return{name:"Telegram Bot",state:"fail",fix:`Telegram API returned ${r.status}. Check AFK_TELEGRAM_BOT_TOKEN.`}}catch(t){return t.name==="AbortError"?{name:"Telegram Bot",state:"warn",detail:"connection timeout"}:{name:"Telegram Bot",state:"warn",detail:`network error: ${t instanceof Error?t.message:"unknown"}`}}}function au(e){e.command("doctor").description("Check system health and configuration").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=[];n.push(await jk()),n.push(await Bk()),n.push(await Hk()),n.push(await Jo("Config Directory",mn)),n.push(await Jo("State Directory",fn)),n.push(await Jo("Logs Directory",ss)),n.push(await Wk());let r=await Kk();r!==null&&n.push(r);let o={passed:n.filter(s=>s.state==="pass").length,warned:n.filter(s=>s.state==="warn").length,failed:n.filter(s=>s.state==="fail").length};t.format==="json"?console.log(JSON.stringify({checks:n,summary:o},null,2)):(n.forEach(s=>{let a;s.state==="pass"?a=d.success("\u2713"):s.state==="warn"?a=d.warning("\u26A0"):a=d.error("\u2717");let i=`${a} ${s.name}`;s.detail&&(i+=` \u2014 ${s.detail}`),console.log(i),s.state==="fail"&&s.fix&&console.log(` Fix: ${s.fix}`)}),console.log(`
1549
- Summary: ${o.passed} passed, ${o.warned} warned, ${o.failed} failed`)),process.exit(o.failed>0?1:0)})}var Gk=["chat","interactive","status","config","daemon","login","plugin","doctor","completion"],zk=["install","update","list","remove","enable","disable"],Qo=["sonnet","opus","haiku"],Xo=["json","text"],Zo=["cron","sessionstart","both"];function Ae(e){return e.join(" ")}function Vk(){let e=Ae(Qo),t=Ae(Xo),n=Ae(Zo);return`#compdef afk
1677
+ Install one: afk plugin install ${i}:<plugin>`))}catch(c){n.error(R.red(`List failed: ${to(c)}`)),process.exitCode=1}}),a.command("install-plugin <marketplace> <plugin>").description("Install a single plugin from a marketplace").option("-r, --ref <ref>","For git-sourced plugins, pin to a specific tag/branch/SHA").option("-f, --force","Replace an existing plugin with the same key").action(async(i,l,c)=>{let u=Es(`Installing ${i}:${l}\u2026`).start();try{let p=await Wt(i,l,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},s);u.succeed(R.green(`Installed ${R.bold(p.key)}`)+R.gray(` at ${p.dir}`))}catch(p){u.fail(R.red(`Install failed: ${to(p)}`)),process.exitCode=1}}),a.command("remove <name>").description("Remove a marketplace and cascade-delete its installed plugins").action(i=>{let l=Br(i,{cacheDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry&&l.removedPluginEntries.length===0){n.log(R.gray(`No marketplace named "${i}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null,l.removedPluginEntries.length>0?`${l.removedPluginEntries.length} plugin entry`:null].filter(Boolean);if(n.log(R.green(`Removed ${i}: ${c.join(" + ")}`)),l.removedPluginEntries.length>0)for(let u of l.removedPluginEntries)n.log(R.gray(` - ${u}`))}),a.command("update [name]").description("Update one marketplace, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(i,l)=>{try{if(i){let c=Es(`Updating ${i}\u2026`).start(),u=await vn(i,l.ref?{ref:l.ref}:{},s);Cw(u,c)}else{n.log(R.cyan("Updating all marketplaces\u2026"));let c=await nu(s);if(c.length===0){n.log(R.gray(" (no marketplaces installed)"));return}for(let u of c)n.log(" "+ld(u))}}catch(c){n.error(R.red(`Update failed: ${to(c)}`)),process.exitCode=1}})}function to(e){return e instanceof Error?e.message:String(e)}function ld(e){switch(e.status){case"updated":{let t=e.addedPlugins.length>0?` +${e.addedPlugins.join(", ")}`:"",n=e.removedPlugins.length>0?` -${e.removedPlugins.join(", ")}`:"";return`${R.green("\u2713")} ${R.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}${R.gray(t+n)}`}case"up-to-date":return`${R.gray("\xB7")} ${R.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${R.gray("\xB7")} ${R.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${R.yellow("!")} ${R.bold(e.name)}: marketplace dir missing (${e.dir})`}}function Cw(e,t){let n=ld(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}import{access as Aw,constants as Iw,mkdir as _w,readFile as Rw}from"fs/promises";import{execSync as Mw}from"child_process";async function $w(){return B()?{name:"Anthropic API Key",state:"pass",detail:"ANTHROPIC_API_KEY set"}:{name:"Anthropic API Key",state:"fail",fix:"Set ANTHROPIC_API_KEY or run `afk login`"}}async function Ow(){return nn()?{name:"Codex/OpenAI API Key",state:"pass",detail:"OPENAI_API_KEY or CODEX_API_KEY set"}:{name:"Codex/OpenAI API Key",state:"warn",fix:"Set OPENAI_API_KEY or CODEX_API_KEY to use Codex models"}}async function Dw(){try{let t=`${Mw("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(process.env.PATH??"").split(":").map(r=>r.replace(/\/$/,"")).includes(t)?{name:"npm bin on PATH",state:"pass",detail:t}:{name:"npm bin on PATH",state:"fail",detail:t,fix:`Add ${t} to PATH: echo 'export PATH="${t}:$PATH"' >> ~/.zshrc`}}catch{return{name:"npm bin on PATH",state:"warn",detail:"could not query npm prefix"}}}async function Ps(e,t){let n=t();try{return await Aw(n,Iw.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await _w(n,{recursive:!0}),{name:e,state:"pass",detail:`${n} (created)`}}catch{return{name:e,state:"fail",detail:n,fix:`Unable to create or write to ${n}`}}}}async function Lw(){let e=St();try{let t=await Rw(e,"utf-8");return JSON.parse(t),{name:"Config File",state:"pass",detail:`${e} (valid JSON)`}}catch(t){return t.code==="ENOENT"?{name:"Config File",state:"pass",detail:"no config file (using defaults)"}:{name:"Config File",state:"fail",detail:e,fix:`Unable to parse config file: ${t instanceof Error?t.message:"unknown error"}`}}}async function Fw(){let e=process.env.AFK_TELEGRAM_BOT_TOKEN;if(!e)return null;try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://api.telegram.org/bot${e}/getMe`,{signal:t.signal});if(clearTimeout(n),r.ok){let s=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:s?`@${s}`:"connected"}}return{name:"Telegram Bot",state:"fail",fix:`Telegram API returned ${r.status}. Check AFK_TELEGRAM_BOT_TOKEN.`}}catch(t){return t.name==="AbortError"?{name:"Telegram Bot",state:"warn",detail:"connection timeout"}:{name:"Telegram Bot",state:"warn",detail:`network error: ${t instanceof Error?t.message:"unknown"}`}}}function cd(e){e.command("doctor").description("Check system health and configuration").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=[];n.push(await $w()),n.push(await Ow()),n.push(await Dw()),n.push(await Ps("Config Directory",In)),n.push(await Ps("State Directory",dt)),n.push(await Ps("Logs Directory",_n)),n.push(await Lw());let r=await Fw();r!==null&&n.push(r);let o={passed:n.filter(s=>s.state==="pass").length,warned:n.filter(s=>s.state==="warn").length,failed:n.filter(s=>s.state==="fail").length};t.format==="json"?console.log(JSON.stringify({checks:n,summary:o},null,2)):(n.forEach(s=>{let a;s.state==="pass"?a=d.success("\u2713"):s.state==="warn"?a=d.warning("\u26A0"):a=d.error("\u2717");let i=`${a} ${s.name}`;s.detail&&(i+=` \u2014 ${s.detail}`),console.log(i),s.state==="fail"&&s.fix&&console.log(` Fix: ${s.fix}`)}),console.log(`
1678
+ Summary: ${o.passed} passed, ${o.warned} warned, ${o.failed} failed`)),process.exit(o.failed>0?1:0)})}var Nw=["chat","interactive","status","config","daemon","login","plugin","doctor","completion"],Uw=["install","update","list","remove","enable","disable"],Cs=["sonnet","opus","haiku"],As=["json","text"],Is=["cron","sessionstart","both"];function Re(e){return e.join(" ")}function jw(){let e=Re(Cs),t=Re(As),n=Re(Is);return`#compdef afk
1550
1679
 
1551
1680
  _afk() {
1552
1681
  local -a commands
@@ -1593,7 +1722,7 @@ _afk() {
1593
1722
  esac
1594
1723
  }
1595
1724
 
1596
- compdef _afk afk`}function Yk(){let e=Ae(Gk),t=Ae(zk),n=Ae(Qo),r=Ae(Xo),o=Ae(Zo);return`_afk_complete() {
1725
+ compdef _afk afk`}function Hw(){let e=Re(Nw),t=Re(Uw),n=Re(Cs),r=Re(As),o=Re(Is);return`_afk_complete() {
1597
1726
  local cur prev
1598
1727
  cur="\${COMP_WORDS[COMP_CWORD]}"
1599
1728
  prev="\${COMP_WORDS[COMP_CWORD-1]}"
@@ -1620,7 +1749,7 @@ compdef _afk afk`}function Yk(){let e=Ae(Gk),t=Ae(zk),n=Ae(Qo),r=Ae(Xo),o=Ae(Zo)
1620
1749
  esac
1621
1750
  }
1622
1751
 
1623
- complete -F _afk_complete afk`}function qk(){let e=Ae(Qo),t=Ae(Xo),n=Ae(Zo);return`complete -c afk -f
1752
+ complete -F _afk_complete afk`}function Bw(){let e=Re(Cs),t=Re(As),n=Re(Is);return`complete -c afk -f
1624
1753
  # afk subcommands
1625
1754
  complete -c afk -n '__fish_use_subcommand' -a 'chat' -d 'Send a single chat message'
1626
1755
  complete -c afk -n '__fish_use_subcommand' -a 'interactive' -d 'Start an interactive REPL'
@@ -1643,9 +1772,13 @@ complete -c afk -n '__fish_seen_subcommand_from plugin' -a 'disable' -d 'Disable
1643
1772
  # flags: --model, --format, --trigger
1644
1773
  complete -c afk -l model -s m -x -a '${e}' -d 'Model to use'
1645
1774
  complete -c afk -l format -s f -x -a '${t}' -d 'Output format'
1646
- complete -c afk -l trigger -x -a '${n}' -d 'Trigger type'`}function lu(e){e.command("completion <shell>").description("Emit shell completion script (zsh|bash|fish)").action(t=>{let n=["zsh","bash","fish"];if(!n.includes(t)){e.error(`unknown shell: ${t}. Choose from: ${n.join(", ")}`);return}let r="";switch(t){case"zsh":r=Vk();break;case"bash":r=Yk();break;case"fish":r=qk();break}console.log(r)})}import{readFileSync as Jk}from"fs";import{dirname as Qk,join as Xk}from"path";import{fileURLToPath as Zk}from"url";function cu(){try{return"1.2.0"}catch{}try{let e=Qk(Zk(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Jk(Xk(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}import{realpathSync as nb}from"fs";es();es({path:ot(),override:!1});us();var ae=new eb;ae.name("afk").description("AI agent CLI. Starts interactive REPL by default; use `afk chat` for one-shot.").version(cu());$a(ae);Nc(ae);Qc(ae);Lc(ae);eu(ae);ru(ae);su(ae);Fc(ae);au(ae);lu(ae);ae.commands.find(e=>e.name()==="chat")?.alias("c");ae.commands.find(e=>e.name()==="interactive")?.alias("i");ae.commands.find(e=>e.name()==="status")?.alias("s");ae.addHelpText("after",`
1775
+ complete -c afk -l trigger -x -a '${n}' -d 'Trigger type'`}function ud(e){e.command("completion <shell>").description("Emit shell completion script (zsh|bash|fish)").action(t=>{let n=["zsh","bash","fish"];if(!n.includes(t)){e.error(`unknown shell: ${t}. Choose from: ${n.join(", ")}`);return}let r="";switch(t){case"zsh":r=jw();break;case"bash":r=Hw();break;case"fish":r=Bw();break}console.log(r)})}import X from"chalk";import{spawn as eS}from"child_process";import{existsSync as tS,readFileSync as nS}from"fs";import{spawn as Ww}from"child_process";import{existsSync as wt,mkdirSync as dd,readFileSync as no,statSync as Kw,unlinkSync as ro,writeFileSync as Gw,openSync as pd}from"fs";import{join as Tn,dirname as Rs}from"path";import{fileURLToPath as zw}from"url";var _s=Rs(zw(import.meta.url));function $s(){let e=Tn(dt(),"telegram");return{pidFile:Tn(e,"bot.pid"),logFile:Tn(_n(),"telegram.log")}}function En(e){if(!wt(e))return null;let t=no(e,"utf-8").trim(),n=Number.parseInt(t,10);if(!Number.isFinite(n)||n<=0)return ro(e),null;try{return process.kill(n,0),n}catch{return ro(e),null}}function Vw(){let e=Tn(_s,"..","telegram.js");if(wt(e))return e;let t=Tn(_s,"..","telegram.ts");if(wt(t))return t;throw new Error(`Telegram entrypoint not found near ${_s}`)}async function Os(){let{pidFile:e,logFile:t}=$s(),n=En(e);if(n!==null)return{kind:"already-running",pid:n,message:`Bot already running (PID ${n}). Use 'afk telegram stop' first.`};dd(Rs(e),{recursive:!0}),dd(Rs(t),{recursive:!0});let r=Vw(),o=pd(t,"a"),s=pd(t,"a"),a;try{a=Ww(process.execPath,[r],{detached:!0,stdio:["ignore",o,s],env:process.env})}catch(i){return{kind:"spawn-failed",message:`Failed to spawn bot: ${i.message}`}}return a.pid===void 0?{kind:"spawn-failed",message:"Spawned child has no PID"}:(Gw(e,String(a.pid),{mode:420}),a.unref(),await new Promise(i=>setTimeout(i,1500)),En(e)===null?{kind:"exited-immediately",logTail:Ms(t,20),message:"Bot exited immediately after launch. Check the log for details."}:{kind:"started",pid:a.pid,logFile:t})}async function Ds(){let{pidFile:e}=$s(),t=En(e);if(t===null)return{kind:"not-running"};try{process.kill(t,"SIGTERM")}catch{return wt(e)&&ro(e),{kind:"stopped",pid:t}}for(let n=0;n<50;n++)if(await new Promise(r=>setTimeout(r,100)),En(e)===null)return{kind:"stopped",pid:t};try{process.kill(t,"SIGKILL")}catch{}return wt(e)&&ro(e),{kind:"force-killed",pid:t}}function Ls(){let{pidFile:e,logFile:t}=$s(),n=En(e),r={running:n!==null,pidFile:e,logFile:t};if(n===null)return{...r,logTail:Ms(t,10)};let o=qw(n);return{...r,pid:n,...o,logTail:Ms(t,10)}}function Ms(e,t){if(!wt(e))return[];try{let r=no(e,"utf-8").split(`
1776
+ `);return r.length>0&&r[r.length-1]===""&&r.pop(),r.slice(-t)}catch{return[]}}function qw(e){try{if(process.platform==="linux"){let t=`/proc/${e}/stat`;if(!wt(t))return{};let r=no(t,"utf-8").split(" "),o=Number.parseInt(r[21]??"0",10),l=Kw("/proc/1").mtimeMs/1e3+o/100,c=Math.floor(Date.now()/1e3-l),p=no(`/proc/${e}/status`,"utf-8").match(/VmRSS:\s+(\d+)\s+kB/),m=p?Math.round(Number.parseInt(p[1]??"0",10)/1024):void 0;return{uptimeSec:c,memoryMb:m}}if(process.platform==="darwin"){let{execFileSync:t}=kd("child_process"),n=t("ps",["-p",String(e),"-o","etime=,rss="],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim(),[r,o]=n.split(/\s+/);return{uptimeSec:Yw(r??""),memoryMb:o?Math.round(Number.parseInt(o,10)/1024):void 0}}}catch{}return{}}function Yw(e){if(!e)return;let t=e.split("-"),n=0,r=e;t.length===2&&(n=Number.parseInt(t[0]??"0",10),r=t[1]??"");let o=r.split(":").map(l=>Number.parseInt(l,10));if(o.some(l=>!Number.isFinite(l)))return;let s=0,a=0,i=0;if(o.length===3)[s,a,i]=o;else if(o.length===2)[a,i]=o;else if(o.length===1)[i]=o;else return;return n*86400+s*3600+a*60+i}import{createInterface as Jw}from"readline";import te from"chalk";var fd="https://api.telegram.org";async function md(e){try{let t=await fetch(`${fd}/bot${e}/getMe`);if(!t.ok)return null;let n=await t.json();return!n.ok||!n.result?.id||!n.result?.first_name?null:{id:n.result.id,...n.result.username!==void 0?{username:n.result.username}:{},firstName:n.result.first_name}}catch{return null}}function Xw(e){let t=new Map;for(let n of e){let o=(n.message??n.edited_message)?.chat;!o||typeof o.id!="number"||t.set(o.id,{chatId:o.id,type:o.type??"unknown",...o.username!==void 0?{username:o.username}:{},...o.first_name!==void 0?{firstName:o.first_name}:{}})}return[...t.values()].reverse()}async function Qw(e){try{let t=await fetch(`${fd}/bot${e}/getUpdates`);if(!t.ok)return[];let n=await t.json();return!n.ok||!Array.isArray(n.result)?[]:n.result}catch{return[]}}async function Zw(e,t={}){let n=t.maxAttempts??30,r=t.intervalMs??2e3;for(let o=0;o<n;o++){let s=await Qw(e),a=Xw(s);if(a.length>0)return a;o<n-1&&await new Promise(i=>setTimeout(i,r))}return[]}function Fs(e){let t=Jw({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,r=>{t.close(),n(r.trim())})})}async function gd(){let e=Ne();console.log(""),console.log(te.bold("\u{1F916} Telegram bot setup")),console.log(""),console.log(te.gray(`Config will be written to ${e}`)),console.log("");let t=process.env.TELEGRAM_BOT_TOKEN?.trim()??"",n=null;for(t&&(console.log(te.gray("Validating existing TELEGRAM_BOT_TOKEN...")),n=await md(t),n?console.log(te.green(`\u2713 Token valid for @${n.username??n.firstName} (id ${n.id})`)):(console.log(te.yellow("\u26A0 Existing TELEGRAM_BOT_TOKEN is invalid; prompting for a new one")),t=""));!n;)t=await Fs("Paste your bot token (from @BotFather): "),t||(console.error(te.red("No token provided. Aborting.")),process.exit(1)),n=await md(t),n||console.log(te.red("\u2717 Token rejected by getMe. Try again or Ctrl-C to abort."));Gt(e,"TELEGRAM_BOT_TOKEN",t),console.log(te.green(`\u2713 Saved TELEGRAM_BOT_TOKEN \u2192 ${e}`)),console.log(""),console.log(te.bold("Now DM your bot to authorize your account."));let r=n.username?`@${n.username}`:`"${n.firstName}"`;console.log(` 1. Open Telegram and find ${te.cyan(r)}`),console.log(' 2. Send any message (e.g. "hi")'),console.log(""),console.log(te.gray("Polling for your chat ID (up to 60s)..."));let o=await Zw(t);if(o.length===0){console.error(te.red("\u2717 No chats found after 60s.")),console.error(te.gray(" Send a message to the bot and run `afk telegram setup` again,")),console.error(te.gray(" or paste your chat ID manually:"));let a=await Fs("Chat ID: "),i=Number.parseInt(a,10);return Number.isFinite(i)||(console.error(te.red("Invalid chat ID. Aborting.")),process.exit(1)),Gt(e,"AFK_TELEGRAM_ALLOWED_CHAT_IDS",String(i)),console.log(te.green(`\u2713 Saved AFK_TELEGRAM_ALLOWED_CHAT_IDS=${i}`)),{envPath:e,bot:n,chatId:i}}let s=o[0];if(o.length>1){console.log(te.bold(`
1777
+ Multiple chats found:`)),o.forEach((l,c)=>{let u=l.username?`@${l.username}`:l.firstName??l.type;console.log(` [${c+1}] ${u} (id ${l.chatId}, ${l.type})`)});let a=await Fs("Which chat should be allowed? [1]: "),i=Number.parseInt(a||"1",10)-1;Number.isFinite(i)&&i>=0&&i<o.length&&(s=o[i])}else{let a=s.username?`@${s.username}`:s.firstName??s.type;console.log(te.green(`\u2713 Found chat with ${a} (id ${s.chatId})`))}return Gt(e,"AFK_TELEGRAM_ALLOWED_CHAT_IDS",String(s.chatId)),console.log(te.green(`\u2713 Saved AFK_TELEGRAM_ALLOWED_CHAT_IDS=${s.chatId} \u2192 ${e}`)),console.log(""),console.log(te.bold("Setup complete. Start the bot with:")),console.log(te.cyan(" afk telegram start")),console.log(""),{envPath:e,bot:n,chatId:s.chatId}}function hd(e){let t=e.command("telegram").description("Manage the Agent AFK Telegram bot (setup, start, stop, status)");t.command("setup").description("Interactive setup: validate bot token, discover chat ID, persist to ~/.afk/config/afk.env").action(async()=>{try{await gd()}catch(n){console.error(X.red(`Setup failed: ${n.message}`)),process.exit(1)}}),t.command("start").description("Start the bot as a background daemon").action(async()=>{let n=await Os();if(n.kind==="started"){console.log(X.green(`\u2713 Bot started (PID ${n.pid})`)),console.log(X.gray(` Logs: ${n.logFile}`)),console.log(X.gray(" Tail with: afk telegram logs --follow"));return}if(n.kind==="already-running"&&(console.log(X.yellow(`\u26A0 ${n.message}`)),process.exit(1)),n.kind==="exited-immediately"){if(console.error(X.red(`\u2717 ${n.message}`)),n.logTail&&n.logTail.length>0){console.error(""),console.error(X.bold("Last log entries:"));for(let r of n.logTail)console.error(X.gray(` ${r}`))}process.exit(1)}console.error(X.red(`\u2717 ${n.message}`)),process.exit(1)}),t.command("stop").description("Stop the bot (SIGTERM, then SIGKILL after 5s)").action(async()=>{let n=await Ds();if(n.kind==="not-running"){console.log(X.yellow("\u26A0 Bot is not running"));return}if(n.kind==="stopped"){console.log(X.green(`\u2713 Bot stopped (PID ${n.pid})`));return}console.log(X.yellow(`\u26A0 Bot force-killed (PID ${n.pid}); graceful shutdown timed out`))}),t.command("restart").description("Stop and restart the bot").action(async()=>{let n=await Ds();(n.kind==="stopped"||n.kind==="force-killed")&&console.log(X.gray(`Stopped (PID ${n.pid})`));let r=await Os();if(r.kind==="started"){console.log(X.green(`\u2713 Bot restarted (PID ${r.pid})`));return}console.error(X.red(`\u2717 Restart failed: ${r.message}`)),process.exit(1)}),t.command("status").description("Show running state, uptime, memory, and recent log entries").action(()=>{let n=Ls();rS(n)}),t.command("logs").description("Show or follow the bot log").option("-f, --follow","Stream new log entries (like tail -f)",!1).option("-n, --lines <count>","Number of trailing lines to show","50").action(n=>{let{logFile:r}=Ls();if(!tS(r)){console.log(X.yellow(`No log file at ${r}`)),console.log(X.gray("Start the bot first: afk telegram start"));return}let o=Number.parseInt(n.lines??"50",10);if(n.follow){eS("tail",["-n",String(o),"-f",r],{stdio:"inherit"}).on("error",i=>{console.error(X.red(`Failed to spawn tail: ${i.message}`))});return}let s=nS(r,"utf-8").split(`
1778
+ `).slice(-o-1);console.log(s.join(`
1779
+ `))})}function rS(e){if(console.log(X.bold("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${X.green("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${oS(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${X.red("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(X.bold("Recent log entries:"));for(let t of e.logTail)console.log(X.gray(` ${t}`))}}function oS(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{readFileSync as sS}from"fs";import{dirname as iS,join as aS}from"path";import{fileURLToPath as lS}from"url";function yd(){try{return"1.8.0"}catch{}try{let e=iS(lS(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(sS(aS(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}import{realpathSync as dS}from"fs";Ns();Ns({path:Ne(),override:!1});Vs();var ie=new cS;ie.name("afk").description("AI agent CLI. Starts interactive REPL by default; use `afk chat` for one-shot.").version(yd());Ll(ie);Hu(ie);ed(ie);Uu(ie);nd(ie);sd(ie);ad(ie);ju(ie);cd(ie);ud(ie);hd(ie);ie.commands.find(e=>e.name()==="chat")?.alias("c");ie.commands.find(e=>e.name()==="interactive")?.alias("i");ie.commands.find(e=>e.name()==="status")?.alias("s");ie.addHelpText("after",`
1647
1780
  Examples:
1648
1781
  $ afk # start interactive REPL
1649
1782
  $ afk --model opus # REPL with specific model
1650
1783
  $ afk chat "What is 2+2?" # one-shot message
1651
- $ afk status --format json`);async function tb(){let e=zt(),t=ke(be());if(!e&&t==="anthropic-direct"){if(!process.stdin.isTTY){process.stderr.write("agent-afk: No Anthropic credential found. Run `afk login` to authenticate.\n"),process.exit(1);return}try{await Rr(),es({path:ot(),override:!0})}catch{}}}var uu=process.argv[1]??"",rb=import.meta.url===`file://${uu}`||import.meta.url===`file://${nb(uu)}`;rb&&(async()=>(await tb(),ae.parse()))();export{qr as getMaxBudgetUsd,Yt as getMaxOutputTokens,Jr as getTaskBudget,bt as parseBudget,Ge as parseEffort,wt as parseMaxOutputTokens,Ke as parseThinking,tb as runFirstRunDetector};
1784
+ $ afk status --format json`);async function uS(){let e=tn(),t=ke(we());if(!e&&t==="anthropic-direct"){if(!process.stdin.isTTY){process.stderr.write("agent-afk: No Anthropic credential found. Run `afk login` to authenticate.\n"),process.exit(1);return}try{await Zr(),Ns({path:Ne(),override:!0})}catch{}}}var bd=process.argv[1]??"",pS=import.meta.url===`file://${bd}`||import.meta.url===`file://${dS(bd)}`;pS&&(async()=>(await uS(),ie.parse()))();export{So as getMaxBudgetUsd,rn as getMaxOutputTokens,vo as getTaskBudget,Ct as parseBudget,Ze as parseEffort,At as parseMaxOutputTokens,Qe as parseThinking,uS as runFirstRunDetector};