agent-afk 5.191.3 → 5.191.4
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
|
@@ -47,11 +47,11 @@ var Qpe=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var Pn=(e,t)=>{
|
|
|
47
47
|
`);if(e.kind==="user")return bfe(t);let n=e.title??yfe[e.kind];return wfe(e.kind,n,t)}function bfe(e){let t=ne(),n=Math.max(20,Math.min(t-4,Math.floor(t*.75),100)),r=[];for(let f of e)r.push(...pe(cm(f),n).split(`
|
|
48
48
|
`));let o=r;if(r.length>dU){let f=dU-1,g=r.length-f;o=[...r.slice(0,f),m.dim(`\u2026(${g} lines collapsed)`)]}let i=m.user.bold("\u2502"),s=t-1,a=Math.min(Math.max(0,...o.map(f=>G(f))),Math.max(0,s-2)),l=Math.min(Math.max(1,s),Math.max(12,a+2)),c=Math.max(0,s-l),u=" ".repeat(c)+m.dim("\u2500".repeat(l)),d=Math.max(0,s-a-2),p=o.map(f=>{let g=G(f)>a?Z(f,a):f,h=Math.max(0,a-G(g));return" ".repeat(d)+g+" ".repeat(h)+" "+i}).join(`
|
|
49
49
|
`);return u+`
|
|
50
|
-
`+p}function wfe(e,t,n){let r=hfe(e),o=n.map(cm),i=Math.max(G(t)+4,...o.map(l=>G(l))),s=Math.max(40,i)+4,a=Math.min(s,Math.min(ne()-4,100));return a=Math.min(a,Yr()),Ai(o,{border:r,title:t,width:a,padding:2})}var dU,yfe,pU=b(()=>{"use strict";de();we();tt();L();_i();Qr();Ec();F();dU=(()=>{let e=k.AFK_USER_CARD_MAX_ROWS,t=e?Number.parseInt(e,10):NaN;return Number.isFinite(t)&&t>0?t:24})();yfe={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"}});function
|
|
50
|
+
`+p}function wfe(e,t,n){let r=hfe(e),o=n.map(cm),i=Math.max(G(t)+4,...o.map(l=>G(l))),s=Math.max(40,i)+4,a=Math.min(s,Math.min(ne()-4,100));return a=Math.min(a,Yr()),Ai(o,{border:r,title:t,width:a,padding:2})}var dU,yfe,pU=b(()=>{"use strict";de();we();tt();L();_i();Qr();Ec();F();dU=(()=>{let e=k.AFK_USER_CARD_MAX_ROWS,t=e?Number.parseInt(e,10):NaN;return Number.isFinite(t)&&t>0?t:24})();yfe={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"}});function ae(e,t){let n=Math.min(ne(),t??120);if(e===void 0)return m.dim("\u2500".repeat(n));let r=m.dim("\u2500\u2500")+" "+m.bold(e)+" ",o="\u2500\u2500 "+e+" ",i=Math.max(0,n-G(o));return r+m.dim("\u2500".repeat(i))}var aa=b(()=>{"use strict";de();we();L()});function Sfe(e){let t=Math.min(ne(),120),n=1,r=kc(e.elapsedMs),o=e.phase??"",i=e.batchIndex!=null&&e.batchSize!=null?`\u2225${e.batchIndex}/${e.batchSize}`:"",s=n+1+2+(o?G(o)+2:0)+G(r)+(i?2+G(i):0),a=Math.max(3,t-s),l=Z(e.label,a),c=m.chrome("\u25C9"),u=m.tool(l),d=`${c} ${u}`,p=`\u25C9 ${l}`,f=r,g=o?m.dim(o):"",h=o,y=i?m.dim(i):"",w=i,S=G(p)+2+(h?G(h)+2:0)+G(f)+(w?2+G(w):0),v=Math.max(0,t-S),x=m.dim("\u2500".repeat(Math.min(v,20))),T=[d,x,...g?[g]:[],m.dim(f)];return y&&T.push(y),T.join(" ")}function mU(e,t=3){if(e.length===0)return"";let n=e.length>t,r=e.slice(0,n?t-1:t),o=e.length-r.length,i=r.map(s=>Sfe(s));return o>0&&i.push(m.dim(` \u2026 +${o} more running`)),i.join(`
|
|
51
51
|
`)}var fU=b(()=>{"use strict";de();we();L();Qr()});var gU=b(()=>{"use strict";L();Qr()});function Ky(e){let t=e.title??"ERROR",r=[...Array.isArray(e.body)?e.body:[e.body]];if(e.hint&&(r.push(""),r.push(m.dim(m.italic(e.hint)))),e.stack){r.push("");for(let o of e.stack.split(`
|
|
52
|
-
`))r.push(m.dim(o))}return Ai(r,{border:m.error,title:t})}var hU=b(()=>{"use strict";Ec();L()});function Pi(e){switch(e){case"running":return m.chrome("\u25CF");case"done":return m.success("\u2713");case"error":return m.error("\u2717");case"blocked":return m.warning("\u2298");case"warn":return m.warning("\u26A0")}}var um=b(()=>{"use strict";L()});function
|
|
53
|
-
`)}function kfe(e,t){let n=Pi(e.status),r=2,o=e.elapsed!=null?" "+m.dim(kc(e.elapsed)):"",i=e.elapsed!=null?" "+kc(e.elapsed):"",s=G(i),a=
|
|
54
|
-
`)}var ZA=b(()=>{"use strict";de();L()});function SU(e){return ve(e).replace(Efe,"")}function Rfe(e){let t=SU(e);return t.startsWith("+")?m.diffAdd(t):t.startsWith("-")?m.diffRemove(t):m.dim(t)}function Afe(e){let t=m.fileRef(
|
|
52
|
+
`))r.push(m.dim(o))}return Ai(r,{border:m.error,title:t})}var hU=b(()=>{"use strict";Ec();L()});function Pi(e){switch(e){case"running":return m.chrome("\u25CF");case"done":return m.success("\u2713");case"error":return m.error("\u2717");case"blocked":return m.warning("\u2298");case"warn":return m.warning("\u26A0")}}var um=b(()=>{"use strict";L()});function le(e){return e.replace(yU,"").replace(vfe," ").trim()}function ve(e){return e.replace(yU,"")}var yU,vfe,We=b(()=>{"use strict";yU=/\x1B\][^\x07\x1B\x9C]*(?:\x07|\x1B\\|\x9C)|\x1B[P^_X][^\x1B\x9C]*(?:\x1B\\|\x9C)|\x1B\[[0-?]*[ -/]*[@-~]|\x9B[0-?]*[ -/]*[@-~]|\x1B[6-_]/g,vfe=/[\x00-\x1F\x7F-\x9F]/g});function bU(e){let t=Math.max(1,e.width??80),n=e.collapsed??!1,r=kfe(e,t);if(n)return r;let o=[],i=Math.max(1,t-G(Gy));if(e.inputSummary!=null&&e.inputSummary.length>0){let s=le(e.inputSummary),a=Z(s,i);o.push(Gy+m.dim(a))}if(e.outputPreview!=null&&e.outputPreview.length>0){let s=le(e.outputPreview),a=Z(s,i);o.push(Gy+m.dim(a))}return e.diff!=null&&o.push(Gy+Tfe(e.diff,i)),o.length===0?r:[r,...o].join(`
|
|
53
|
+
`)}function kfe(e,t){let n=Pi(e.status),r=2,o=e.elapsed!=null?" "+m.dim(kc(e.elapsed)):"",i=e.elapsed!=null?" "+kc(e.elapsed):"",s=G(i),a=le(e.batchBadge??""),l=G(Ie(a)),c=Math.max(1,t-r-s-l),u=le(e.toolName),d=Z(u,c),p=m.tool(d);return`${n} ${p}${o}${a}`}function Tfe(e,t){let n=m.diffAdd(`+${e.added}`),r=m.diffRemove(`-${e.removed}`),o=`+${e.added} -${e.removed} `,i=G(o),s=Math.max(1,t-i),a=Z(le(e.file),s),l=m.dim(a);return`${n} ${r} ${l}`}var Gy,QA=b(()=>{"use strict";We();de();L();um();Qr();Gy=" "});function xfe(e){if(e<1e3)return"<1s";let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60),r=t%60;return r>0?`${n}m ${r}s`:`${n}m`}function wU(e){let n=e.width??80,r=Math.max(1,n-2),o=[],i=e.status==="interrupting"?"interrupting\u2026":"interrupted";if(o.push(" "+Z(m.warning(`\u26A0 ${i}`),r)),e.activeSubagent){let{name:a,currentTool:l,elapsed:c}=e.activeSubagent,u=l??"thinking",d=c!=null?` (${xfe(c)})`:"",p=`\u25B8 ${a} \u2014 ${u}${d}`;o.push(" "+Z(m.meta(p),r))}let s=e.hint??"Ctrl+C again to exit";return o.push(" "+Z(m.dim(s),r)),o.join(`
|
|
54
|
+
`)}var ZA=b(()=>{"use strict";de();L()});function SU(e){return ve(e).replace(Efe,"")}function Rfe(e){let t=SU(e);return t.startsWith("+")?m.diffAdd(t):t.startsWith("-")?m.diffRemove(t):m.dim(t)}function Afe(e){let t=m.fileRef(le(e.filePath)),n=m.diffAdd(`+${e.stats.added}`),r=m.diffRemove(`-${e.stats.removed}`);return`${t} ${n} ${r}`}function vU(e){let t=e.maxLines??20,n=Afe(e);if(e.collapsed===!0||e.hunks.length===0)return n;let r=[];for(let d of e.hunks){let p=SU(d.header);r.push({kind:"header",text:m.diffHunk(p)});for(let f of d.lines)r.push({kind:"body",text:Rfe(f)})}let o=0;for(let d of r)d.kind==="body"&&o++;let i=t>0&&o>t,s=[];if(i){let d=0,p=null;for(let h of r)h.kind==="header"?p=h.text:d<t&&(p!==null&&(s.push(p),p=null),s.push(h.text),d++);let f=o-t,g=f===1?"line":"lines";s.push(m.dim(`... and ${f} more ${g}`))}else for(let d of r)s.push(d.text);let a=6,l=e.width??80,c=Math.max(20,l-a),u=Ai(s,{width:c});return[n,u].join(`
|
|
55
55
|
`)}var Efe,eC=b(()=>{"use strict";L();Ec();We();Efe=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g});function kU(e,t={}){let n={filePath:t.filePath??"preview",hunks:e.hunks.map(r=>({header:`@@ -${r.oldStart},${r.oldLines} +${r.newStart},${r.newLines} @@`,lines:r.lines.map(o=>`${o.kind===" "?" ":o.kind} ${o.text}`)})),stats:{added:e.addedLines,removed:e.removedLines},...t.maxLines!==void 0?{maxLines:t.maxLines}:{},...t.width!==void 0?{width:t.width}:{}};return m.dim("\u27F3 Proposed")+`
|
|
56
56
|
`+vU(n)}var tC=b(()=>{"use strict";L();eC()});function he(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),i=t%60;return n>0?`${n}d ${r}h`:r>0?`${r}h ${o}m`:o>0?`${o}m ${i}s`:`${i}s`}function nn(e){return e===0?"$0.00":e<.01?`$${e.toFixed(4)}`:`$${e.toFixed(2)}`}function Ii(e){return`${e} tool call${e===1?"":"s"}`}function Ae(e){if(!Number.isFinite(e))return"0";if(e<1e3)return String(e);if(e<1e6){let n=e/1e3;return n%1===0?`${n}k`:`${n.toFixed(1).replace(/\.0$/,"")}k`}let t=e/1e6;return t%1===0?`${t}m`:`${t.toFixed(1).replace(/\.0$/,"")}m`}var nt=b(()=>{"use strict"});function TU(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?m.error:t>.5?m.warning:m.chrome,r=m.meta,o=20,i=Math.round(t*o),s=o-i,a=r("[")+n("\u2588".repeat(i))+r("\u2591".repeat(s))+r("]"),l=Math.round(t*100)+"%",c=n(l),u="";e.used!==void 0&&e.limit!==void 0&&(u=Ae(e.used)+"/"+Ae(e.limit));let d=m.meta(u),p="["+"\u2588".repeat(i)+"\u2591".repeat(s)+"]",f=u?`${p} ${l} ${u}`:`${p} ${l}`,g=`${p} ${l}`,h=`ctx ${l}`,y=u?`${a} ${c} ${d}`:`${a} ${c}`,w=`${a} ${c}`,S=m.meta("ctx ")+c,v=e.sparkline?m.meta(e.sparkline)+" ":"",x=e.sparkline?G(e.sparkline)+1:0,T=Math.max(0,e.width-x);if(G(f)<=T&&T>90)return v+y;if(G(g)<=T&&T>32)return v+w;if(G(h)<=T)return v+S;if(e.width>0){let E=v+S;return Z(E,e.width)}return c}var nC=b(()=>{"use strict";L();nt();de()});function xU(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 i=Math.max(0,Math.min(1,o)),s=Math.min(7,Math.floor(i*8));return r[s]}).join("")}var rC=b(()=>{"use strict"});function Mi(e){let t=[],{costUsd:n,tokens:r,includeZeroCost:o=!1}=e;n!==void 0&&Number.isFinite(n)&&(n>0||o)&&t.push(nn(n));let i=r??0;return Number.isFinite(i)&&i>0&&t.push(Ae(i)+" tokens"),t}var Cc=b(()=>{"use strict";nt()});var EU=b(()=>{"use strict";L();de()});var RU=b(()=>{"use strict";jA();GB();qB();JB();pU();aa();Ec();fU();gU();hU();um();Qr();QA();ZA();eC();tC();nC();rC();Cc();EU()});var ht=b(()=>{"use strict";RU()});function ze(){return k.AFK_DEBUG==="1"||k.DEBUG==="1"}function B(...e){ze()&&console.log(...e)}var me=b(()=>{"use strict";F()});function _fe(e){return e instanceof Error?e.message:String(e)}function Pfe(e,t){if(typeof t=="object"&&t!==null){let r=AU.get(t);return r||(r=new Set,AU.set(t,r)),r.has(e)?!1:(r.add(e),!0)}let n=`${e}\0${String(t)}`;if(dm.has(n))return!1;if(dm.set(n,!0),dm.size>Cfe){let r=dm.keys().next().value;r!==void 0&&dm.delete(r)}return!0}function Et(e,t,n,r){try{let o=`[afk] ${e} artifact write failed (${n}): ${_fe(r)}`;if(!Pfe(e,t)){B(o);return}console.error(`${o} \u2014 further failures in this subsystem for this session are logged only under AFK_DEBUG=1.`)}catch{}}var Cfe,AU,dm,qy=b(()=>{"use strict";me();Cfe=256,AU=new WeakMap,dm=new Map});function dt(e){return e.replace(/\bauthorization:\s*bearer\s+\S+/gi,"Authorization: Bearer [REDACTED]").replace(/\bsk-ant-[A-Za-z0-9_-]{20,}/g,"[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,"[REDACTED]").replace(/\b(?:AKIA|ASIA|AROA|AIDA|AGPA|AIPA|ANPA|ANVA|APKA|ABIA|ACCA)[A-Z0-9]{16}\b/g,"[REDACTED]").replace(/(?<![/.\w])[A-Za-z0-9+/=_-]{32,}(?![/.\w])/g,t=>oC(t)||Ife(t)?t:"[REDACTED]")}function oC(e){if(!e.includes("/")||/[+=]/.test(e))return!1;let t=n=>n.length>=32&&!n.includes(".")&&/[A-Za-z]/.test(n)&&/[0-9]/.test(n);return!e.split("/").some(t)}function Ife(e){if(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(e))return!0;let t=/^([A-Za-z_][A-Za-z0-9_]*)=(?:[0-9a-f]{40}|[0-9a-f]{64})$/.exec(e);return t!==null&&/^(?:ref|sha|commit|base)$/i.test(t[1]??"")}var vr=b(()=>{"use strict"});import{mkdirSync as Mfe,appendFileSync as Ofe,existsSync as $fe}from"fs";import{resolve as Dfe}from"path";import{dirname as Lfe}from"path";function CU(e){let t=e[1],n=e[2],r=n[0],o=(r==='"'||r==="'")&&n.at(-1)===r?n.slice(1,-1):n,i=/(?:^|_)(?:PATH|FILE)(?:_|$)/i.test(t),s=o.startsWith("/")||o.startsWith("~/"),l=o.split("/").filter(Boolean).some(c=>/[A-Z0-9.\-]/.test(c));return i&&s&&l&&oC(o)?`${t}=${n}`:`${t}=<REDACTED length=${n.length}>`}function Ke(e){let t=e;for(let[n,r]of Bfe)t=t.replace(n,(...o)=>{let i=o.slice(0,o.length-2);return r(i)});return t}function iC(e){return typeof e=="string"?Ke(e):Array.isArray(e)?e.map(iC):e}function Ufe(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[i,s]of Object.entries(r))Nfe.test(i)&&typeof s=="string"?o[i]=`<REDACTED length=${s.length}>`:o[i]=s;n.env=o}return"system"in t&&(n.system=iC(t.system)),"systemPrompt"in t&&(n.systemPrompt=iC(t.systemPrompt)),n}function jfe(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 _U(e){let t=k.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.
|
|
57
57
|
`);let n=e.options,r=typeof n=="object"&&n!==null?n.systemPrompt:void 0,o=jfe(r),i={timestamp:new Date().toISOString(),prompt:e.prompt,options:Ufe(e.options),provenance:e.provenance,resolution:o};if(t==="1"||t.toLowerCase()==="true"||t.toLowerCase()==="stderr"){let l=JSON.stringify(i,null,2)+`
|
|
@@ -430,7 +430,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
430
430
|
|
|
431
431
|
${t}`}var Yve,W_=b(()=>{"use strict";Yve=new Set(["script","style","noscript","template","svg"])});function Zve(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function VW(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function eke(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function YW(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Zve,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!Qve.has(d.status)||u===o)return d;let p=eke(d,s)??VW(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=VW(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Qve,XW=b(()=>{"use strict";me();Qve=new Set([429,502,503,504])});import{BlockList as tke,isIP as G_}from"node:net";import{lookup as nke}from"node:dns/promises";import{Agent as rke}from"undici";function ZW(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function ake(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function K_(e){let t=G_(e);return t===0?!1:ske.check(e,t===4?"ipv4":"ipv6")}async function eK(e){return nke(e,{all:!0,verbatim:!0})}async function Pa(e,t={}){if(t.allowPrivateHosts??ZW())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=ake(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(G_(r)!==0)return K_(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??eK,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(K_(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function sf(e,t={}){let n=await Pa(e,t);if(!n.allowed)throw new Vt(n.reason)}async function Ki(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=QW;s++){await sf(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??ZW())?{dispatcher:lke}:{}},l=await YW(e,i,a,r.retry??{});if(!cke.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new Vt(`too many redirects (>${QW}) starting from ${t}`)}var oke,ike,ske,Vt,lke,QW,cke,Ia=b(()=>{"use strict";F();XW();oke=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],ike=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],ske=(()=>{let e=new tke;for(let[t,n]of oke)e.addSubnet(t,n,"ipv4");for(let[t,n]of ike)e.addSubnet(t,n,"ipv6");return e})(),Vt=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};lke=new rke({connect:{lookup(e,t,n){eK(e).then(r=>{let o=r.find(s=>K_(s.address));if(o!==void 0){n(new Vt(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,G_(i.address))},r=>n(r,"",0))}}});QW=20,cke=new Set([301,302,303,307,308])});var z_={};Pn(z_,{enforceDomainPolicy:()=>Cr,loadBrowserConfig:()=>q_});import{readFileSync as uke}from"node:fs";import{join as dke}from"path";function pke(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function tK(e,t){return pke(t).test(e)}function gke(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(mke.has(t))return!0;if(fke.has(t))return!1}return!1}function nK(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function hke(e){if(e===void 0||e==="")return"auto";if(e==="playwright"||e==="agent-browser"||e==="auto")return e;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${e}`)}function rK(e){let t=e===void 0||e.trim()===""?"default":e.trim();return fc(t),t}function yke(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function bke(e){try{return uke(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function wke(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright"||t.backend==="agent-browser"||t.backend==="auto")n.backend=t.backend;else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=rK(t.defaultProfile)),n}function q_(e){let t=e?.env??k,n=e?.readFileSync??bke,r=e?.surface??t.AGENT_SURFACE,o=gke(t.AFK_BROWSER_HEADLESS,r),i=nK(t.AFK_BROWSER_ALLOWED_DOMAINS),s=nK(t.AFK_BROWSER_BLOCKED_DOMAINS),a=yke(t.AFK_BROWSER_DOM_SNAPSHOTS),l=hke(t.AFK_BROWSER_BACKEND),c=rK(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():dke(zn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=wke(u,g);return h.configPath=p,h}function Cr(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(tK(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>tK(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var mke,fke,Gi=b(()=>{"use strict";F();U();mke=new Set(["daemon","subagent","telegram","afk"]),fke=new Set(["repl","interactive","cli"])});import{readFileSync as Ske}from"node:fs";import{join as vke}from"node:path";import{homedir as kke}from"node:os";function xke(e){let t=e??Tke,n;try{n=Ske(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let i;try{i=new URL(o.url)}catch{return null}let{hostname:s,protocol:a}=i;if(!(s==="127.0.0.1"||s==="localhost"||s==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function Eke(e){try{return process.kill(e,0),!0}catch{return!1}}async function Rke(e,t,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),i=await fetch(`${e}/health`,{method:"GET",headers:{Authorization:`Bearer ${t}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),i.ok}catch{return!1}}async function J_(e){let t=xke(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:Eke(t.pid)?await Rke(t.url,t.token)?{available:!0,connection:t,reason:null}:{available:!1,connection:t,reason:`health probe failed at ${t.url}`}:{available:!1,connection:t,reason:`stale connection file: PID ${t.pid} not alive`}}var Tke,oK=b(()=>{"use strict";Tke=vke(kke(),".config","agent-browser","connection.json")});async function iK(e){let{config:t,surface:n}=e;if(t.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(t.backend==="agent-browser"){let s=Date.now(),a=await J_(),l=Date.now()-s;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:l,availability:a}}if(n&&Ake.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(t.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await J_(),i=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:i,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:i,availability:o}}var Ake,sK=b(()=>{"use strict";oK();Ake=new Set(["daemon","subagent"])});import{createHash as Cke}from"crypto";function aK(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&_ke.test(e.label))}function lK(e){return Cke("sha256").update(e,"utf8").digest("hex").slice(0,8)}function cK(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var _ke,yw=b(()=>{"use strict";_ke=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as Pke}from"crypto";import{mkdir as Ike,stat as Mke,writeFile as Oke}from"fs/promises";import{join as V_}from"path";import{gzip as $ke}from"zlib";import{promisify as Dke}from"util";function Lke(e){return V_(qt(e),"browser")}function Fke(e){return V_(Lke(e),"screenshots")}function Nke(){return new Date().toISOString().replace(/[:.]/g,"-")}function Bke(){return Pke(3).toString("hex")}async function au(e,t,n){if(t.length>uK)throw new Error(`writeScreenshotSidecar: buffer exceeds ${uK} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Fke(e);await Ike(r,{recursive:!0});let o=`${Nke()}-${Bke()}-${n}.png`,i=V_(r,o);await Oke(i,t);let{size:s}=await Mke(i);return{path:i,bytes:s}}var hst,uK,Y_=b(()=>{"use strict";U();yw();hst=Dke($ke);uK=5*1024*1024});var bw,dK=b(()=>{"use strict";bw=class{baseUrl;token;constructor(t){this.baseUrl=t.url,this.token=t.token}async call(t,n,r=3e4){let o={version:1,method:t,params:n},i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:i.signal});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Agent Browser ${t} failed (HTTP ${a.status}): ${l}`)}return await a.json()}finally{clearTimeout(s)}}async listTabs(){return(await this.call("tabs.list",null)).tabs}async openTab(t){return{tabId:(await this.call("tabs.open",{url:t},6e4)).tab_id}}async closeTab(t){await this.call("tabs.close",{tab_id:t})}async read(t,n){return this.call("page.read",{tab_id:t,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(t,n){return this.call("page.inspect",{tab_id:t,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(t,n){await this.call("page.click",{tab_id:t,element_id:n})}async fill(t,n,r){await this.call("page.fill",{tab_id:t,element_id:n,value:r})}async press(t,n,r){await this.call("page.press",{tab_id:t,key:n,...r?{element_id:r}:{}})}async select(t,n,r){await this.call("page.select",{tab_id:t,element_id:n,value:r})}async waitFor(t,n,r){await this.call("page.wait",{tab_id:t,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(t,n){return this.call("page.eval",{tab_id:t,script:n})}async screenshot(t){return this.call("page.screenshot",{tab_id:t})}}});function X_(e){return{id:e.id,role:e.role,label:e.label,kind:e.kind,value:e.value,state:{disabled:e.disabled,...e.checked!==void 0?{checked:e.checked}:{},...e.selected!==void 0?{selected:e.selected}:{},...e.expanded!==void 0?{expanded:e.expanded}:{}},bbox:e.bbox,...e.selector?{selector:e.selector}:{}}}function pK(e,t){switch(t.kind){case"element_id":if(e.has(t.elementId))return t.elementId;throw new Error(`Element ${t.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function Q_(e,t,n,r,o,i){switch(n){case"click":await e.click(t,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await e.fill(t,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await e.press(t,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await e.select(t,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let s=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await e.evalScript(t,`document.querySelector('[data-element-id="${s}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await e.waitFor(t,"element",{value:r,timeout:i??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function mK(e,t){if(t.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await e.client.inspect(e.tabId,{mode:"interactive",query:t.target.text,limit:10}),r=n;if(t.target.role){let l=t.target.role.toLowerCase();r=n.filter(c=>c.role.toLowerCase()===l)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${t.target.text}"`+(t.target.role?`, role="${t.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:t.target.text,...t.target.role?{role:t.target.role}:{}},candidates:r.slice(0,5).map(X_)};let i=r[0].id;await Q_(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=Cr(s.url,e.config);return a.allowed?{elementId:i}:{outcome:"blocked_by_policy",url:s.url,reason:`action navigated to blocked domain: ${a.reason}`}}var fK=b(()=>{"use strict";Gi()});var gK={};Pn(gK,{AgentBrowserProvider:()=>Z_});var Z_,hK=b(()=>{"use strict";Gi();Y_();dK();fK();Z_=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new bw(n)}async open(t){let n=Cr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let r=this.sessions.get(t.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(t.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:t.timeoutMs??3e4});else{let{tabId:s}=await this.client.openTab(t.url);await this.client.waitFor(s,"load",{timeout:t.timeoutMs??3e4}),r={tabId:s,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(t.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),i=Cr(o.url,this.config);return i.allowed?this.buildObservation(r,t.sessionId,t.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${i.reason}`})}async observe(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);return this.buildObservation(n,t.sessionId,t.screenshot,t.maxElements,"browser_observe")}async act(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);let r=pK(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await mK({client:this.client,config:this.config,tabId:n.tabId},t);return"outcome"in s?s:(n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"))}throw t.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(t.target)}`)}await Q_(this.client,n.tabId,t.action,r,t.value,t.timeoutMs),n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),i=Cr(o.url,this.config);return i.allowed?this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${i.reason}`})}async render(t){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);if(t.target!==void 0||t.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),i=o.length>=24?o.readUInt32BE(16):0,s=o.length>=24?o.readUInt32BE(20):0;return{path:(await au(t.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:i,height:s,dataBase64:r.data,mediaType:"image/png"}}async extract(t){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(t){let n=this.sessions.get(t.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(t.sessionId)}}describe(t){let n=this.sessions.get(t);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let t=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(t),this.sessions.clear()}async buildObservation(t,n,r,o,i="browser_open"){let[s,a]=await Promise.all([this.client.read(t.tabId,{mode:"main",budget:4e3}),this.client.inspect(t.tabId,{mode:"interactive",limit:o??80})]),l=a.elements.map(X_),c=o??80,u=l.slice(0,c);t.observationCounter+=1,t.knownElements=new Map(u.map(h=>[h.id,h])),t.currentUrl=s.url,t.currentTitle=s.title;let d=[];l.length>c&&d.push(`page has ${l.length} interactive elements; showing first ${c}`);let p=null;if(r)try{let h=await this.client.screenshot(t.tabId),y=Buffer.from(h.data,"base64");p=(await au(n,y,i)).path}catch{d.push("screenshot capture failed")}let f=`obs_${t.observationCounter.toString(36)}`,g={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:s.url,title:s.title,textSummary:s.content.slice(0,4e3),interactive:u,status:g,warnings:d,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as Uke,readFileSync as jke}from"node:fs";import{createRequire as Hke}from"node:module";import{dirname as Wke,join as Kke}from"node:path";function wK(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<qke&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function wn(e){let t=wK(e);return bK.some(n=>t.includes(n))}function zke(){try{let t=Hke(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(jke(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=Kke(Wke(t),o);return Uke(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function af(){return yK??=zke()??Gke,yK}function eP(e){return e.includes("install chromium")}function nr(e,t){let n=wK(e),r=t?.latched===!0?` ${Jke}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${af()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${af()}). Or pick a different tool.${r}`}function lu(e,t,n=!1){if(!wn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
432
432
|
|
|
433
|
-
${nr(e,{headless:t,latched:n})}`,{cause:e})}var bK,Gke,qke,yK,Jke,ww=b(()=>{"use strict";bK=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Gke="pnpm exec playwright install chromium",qke=4;Jke="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Ma from"node:fs";import Sw from"node:path";import{randomBytes as Vke}from"node:crypto";function Yke(){try{return"5.191.3"}catch{}try{let e=Sw.resolve(import.meta.dirname,"../../../package.json"),t=Ma.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Xke,vw,SK=b(()=>{"use strict";ww();U();me();Xke=Yke(),vw=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let t;try{({chromium:t}=await import("playwright"))}catch(n){let r=lu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=lu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${Xke}`}}loadStorageState(t){let n=gc(t);try{if(!Ma.existsSync(n))return;let r=JSON.parse(Ma.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=gc(t);if(!Ma.existsSync(r))return;let o=await n.storageState(),i=Sw.join(Sw.dirname(r),`.${Sw.basename(r)}.${process.pid}.${Vke(4).toString("hex")}.tmp`);Ma.writeFileSync(i,JSON.stringify(o),{mode:384}),Ma.chmodSync(i,384),Ma.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Qke}from"node:crypto";function Zke(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function eTe(e,t,n){return`el_${Qke("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function tTe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function vK(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function TK(e,t){let n=e.role??"",r=e.name??"";kK.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])TK(i,t)}async function nTe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},xK).catch(()=>[])}async function rTe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},xK).catch(()=>[])}function oTe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function kw(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=oTe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=nTe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),y,w=!1;d!==null?(y=[],TK(d,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await rTe(e)).filter($=>kK.has($.role??"")));let S=new Map;for(let I of p){let $=vK(I.name),j=S.get($);(!j||j.bbox.w===0&&I.bbox.w>0)&&S.set($,I)}let v=y.map(I=>({ax:I,dom:S.get(vK(I.name??""))})),x=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);x.sort((I,$)=>{let j=I.dom?.bbox.y??0,O=$.dom?.bbox.y??0;if(j!==O)return j-O;let W=I.dom?.bbox.x??0,q=$.dom?.bbox.x??0;return W-q}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let E=x.slice(0,n).map((I,$)=>{let j=I.ax.role??"generic",O=I.ax.name??"",W=eTe(j,O,$),q=I.dom?.bbox??{x:0,y:0,w:0,h:0},K=I.dom?.type??null,H=null;I.ax.value!==void 0&&I.ax.value!==null&&(H=String(I.ax.value)),I.ax.checked!==void 0&&(H=String(I.ax.checked)),aK({role:j,kind:K})&&(H="[redacted]");let Y={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(Y.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(Y.selected=I.ax.selected),I.ax.expanded!==void 0&&(Y.expanded=I.ax.expanded);let le;I.dom?.testId?le=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(le=`#${I.dom.id}`);let M={id:W,role:j,label:Zke(O),kind:K,value:H,state:Y,bbox:q};return le!==void 0&&(M.selector=le),M}),C="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let _=tTe(f),R=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:R,url:g,title:h,textSummary:_,interactive:E,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var kK,xK,EK=b(()=>{"use strict";yw();kK=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);xK="a[href], button, input, select, textarea, [role], [tabindex], label"});async function RK(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function tP(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>RK(e,i)))).filter(o=>o!==null)}async function iTe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function nP(e,t,n){switch(t.kind){case"element_id":return sTe(e,t,n);case"selector":return aTe(e,t);case"semantic":return lTe(e,t)}}async function sTe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await tP(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function aTe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await tP(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function lTe(e,t){return t.role!==void 0?cTe(e,t.text,t.role):uTe(e,t.text,t)}async function cTe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await tP(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function uTe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await iTe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let w=await RK(y.locator,y.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let x=0;x<S.length;x++)v=v*31+S.charCodeAt(x)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var AK=b(()=>{"use strict"});async function rP(e,t,n,r){let o=e.url();if(o===n)return null;let i=Cr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var CK=b(()=>{"use strict";Gi()});var iP={};Pn(iP,{PlaywrightProvider:()=>oP});function _K(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var oP,sP=b(()=>{"use strict";SK();EK();AK();Gi();CK();Y_();oP=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new vw(t)}async open(t){let n=Cr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await rP(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await kw(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await kw(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await nP(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${_K(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(y){c=y}else c=h}let d=await rP(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await kw(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await nP(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${_K(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await au(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await au(n,o,r);return i}catch{return null}}}});var $a={};Pn($a,{__resetBrowserRegistryForTests:()=>hTe,browserProviderActive:()=>mTe,closeBrowserProvider:()=>lP,getBrowserProvider:()=>pTe,getLastRoutingDecision:()=>gTe,peekBrowserProvider:()=>fTe});function PK(){Promise.resolve(lP()).then(()=>{process.exit(130)})}function IK(){Promise.resolve(lP()).then(()=>{process.exit(143)})}function MK(){po=null}function dTe(){Tw||(process.on("SIGINT",PK),process.on("SIGTERM",IK),process.on("exit",MK),Tw=!0)}function OK(){Tw&&(process.removeListener("SIGINT",PK),process.removeListener("SIGTERM",IK),process.removeListener("exit",MK),Tw=!1)}async function pTe(e){return po!==null?po:(Oa!==null||(Oa=(async()=>{let t=q_(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await iK({config:t,surface:n});aP=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(hK(),gK)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sP(),iP));o=new i(t)}return dTe(),po=o,Oa=null,o})()),Oa)}async function lP(){if(po===null)return;let e=po;po=null,Oa=null,OK(),await e.shutdown()}function mTe(){return po!==null}function fTe(){return po}function gTe(){return aP}function hTe(){po=null,Oa=null,aP=null,OK()}var po,Oa,Tw,aP,Da=b(()=>{"use strict";Gi();sK();F();po=null,Oa=null,Tw=!1,aP=null});async function $K(e,t){try{return await qW(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function kTe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Da(),$a)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sP(),iP)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(Gi(),z_)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function DK(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??kTe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Ki(n,e,{headers:vTe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(STe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(wTe.test(p)&&!bTe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await $K(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof Vt||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=H_({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await sf(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>sf(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await sf(d.finalUrl,o);let p=await $K(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=H_({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof Vt)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var bTe,wTe,STe,vTe,LK=b(()=>{"use strict";zW();W_();Ia();me();bTe=/(text\/html|application\/xhtml\+xml)/i,wTe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,STe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,vTe={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function ETe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(TTe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),xTe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function FK(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?ETe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function NK(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
433
|
+
${nr(e,{headless:t,latched:n})}`,{cause:e})}var bK,Gke,qke,yK,Jke,ww=b(()=>{"use strict";bK=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Gke="pnpm exec playwright install chromium",qke=4;Jke="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Ma from"node:fs";import Sw from"node:path";import{randomBytes as Vke}from"node:crypto";function Yke(){try{return"5.191.4"}catch{}try{let e=Sw.resolve(import.meta.dirname,"../../../package.json"),t=Ma.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Xke,vw,SK=b(()=>{"use strict";ww();U();me();Xke=Yke(),vw=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let t;try{({chromium:t}=await import("playwright"))}catch(n){let r=lu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=lu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${Xke}`}}loadStorageState(t){let n=gc(t);try{if(!Ma.existsSync(n))return;let r=JSON.parse(Ma.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=gc(t);if(!Ma.existsSync(r))return;let o=await n.storageState(),i=Sw.join(Sw.dirname(r),`.${Sw.basename(r)}.${process.pid}.${Vke(4).toString("hex")}.tmp`);Ma.writeFileSync(i,JSON.stringify(o),{mode:384}),Ma.chmodSync(i,384),Ma.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as Qke}from"node:crypto";function Zke(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function eTe(e,t,n){return`el_${Qke("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function tTe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function vK(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function TK(e,t){let n=e.role??"",r=e.name??"";kK.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])TK(i,t)}async function nTe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},xK).catch(()=>[])}async function rTe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},xK).catch(()=>[])}function oTe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function kw(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=oTe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=nTe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),y,w=!1;d!==null?(y=[],TK(d,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await rTe(e)).filter($=>kK.has($.role??"")));let S=new Map;for(let I of p){let $=vK(I.name),j=S.get($);(!j||j.bbox.w===0&&I.bbox.w>0)&&S.set($,I)}let v=y.map(I=>({ax:I,dom:S.get(vK(I.name??""))})),x=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);x.sort((I,$)=>{let j=I.dom?.bbox.y??0,O=$.dom?.bbox.y??0;if(j!==O)return j-O;let W=I.dom?.bbox.x??0,q=$.dom?.bbox.x??0;return W-q}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let E=x.slice(0,n).map((I,$)=>{let j=I.ax.role??"generic",O=I.ax.name??"",W=eTe(j,O,$),q=I.dom?.bbox??{x:0,y:0,w:0,h:0},K=I.dom?.type??null,H=null;I.ax.value!==void 0&&I.ax.value!==null&&(H=String(I.ax.value)),I.ax.checked!==void 0&&(H=String(I.ax.checked)),aK({role:j,kind:K})&&(H="[redacted]");let Y={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(Y.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(Y.selected=I.ax.selected),I.ax.expanded!==void 0&&(Y.expanded=I.ax.expanded);let ie;I.dom?.testId?ie=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(ie=`#${I.dom.id}`);let M={id:W,role:j,label:Zke(O),kind:K,value:H,state:Y,bbox:q};return ie!==void 0&&(M.selector=ie),M}),C="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let _=tTe(f),R=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:R,url:g,title:h,textSummary:_,interactive:E,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var kK,xK,EK=b(()=>{"use strict";yw();kK=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);xK="a[href], button, input, select, textarea, [role], [tabindex], label"});async function RK(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function tP(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>RK(e,i)))).filter(o=>o!==null)}async function iTe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function nP(e,t,n){switch(t.kind){case"element_id":return sTe(e,t,n);case"selector":return aTe(e,t);case"semantic":return lTe(e,t)}}async function sTe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await tP(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function aTe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await tP(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function lTe(e,t){return t.role!==void 0?cTe(e,t.text,t.role):uTe(e,t.text,t)}async function cTe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await tP(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function uTe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await iTe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let w=await RK(y.locator,y.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let x=0;x<S.length;x++)v=v*31+S.charCodeAt(x)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var AK=b(()=>{"use strict"});async function rP(e,t,n,r){let o=e.url();if(o===n)return null;let i=Cr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var CK=b(()=>{"use strict";Gi()});var iP={};Pn(iP,{PlaywrightProvider:()=>oP});function _K(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var oP,sP=b(()=>{"use strict";SK();EK();AK();Gi();CK();Y_();oP=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new vw(t)}async open(t){let n=Cr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await rP(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await kw(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await kw(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await nP(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${_K(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(y){c=y}else c=h}let d=await rP(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await kw(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await nP(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${_K(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await au(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await au(n,o,r);return i}catch{return null}}}});var $a={};Pn($a,{__resetBrowserRegistryForTests:()=>hTe,browserProviderActive:()=>mTe,closeBrowserProvider:()=>lP,getBrowserProvider:()=>pTe,getLastRoutingDecision:()=>gTe,peekBrowserProvider:()=>fTe});function PK(){Promise.resolve(lP()).then(()=>{process.exit(130)})}function IK(){Promise.resolve(lP()).then(()=>{process.exit(143)})}function MK(){po=null}function dTe(){Tw||(process.on("SIGINT",PK),process.on("SIGTERM",IK),process.on("exit",MK),Tw=!0)}function OK(){Tw&&(process.removeListener("SIGINT",PK),process.removeListener("SIGTERM",IK),process.removeListener("exit",MK),Tw=!1)}async function pTe(e){return po!==null?po:(Oa!==null||(Oa=(async()=>{let t=q_(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await iK({config:t,surface:n});aP=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(hK(),gK)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sP(),iP));o=new i(t)}return dTe(),po=o,Oa=null,o})()),Oa)}async function lP(){if(po===null)return;let e=po;po=null,Oa=null,OK(),await e.shutdown()}function mTe(){return po!==null}function fTe(){return po}function gTe(){return aP}function hTe(){po=null,Oa=null,aP=null,OK()}var po,Oa,Tw,aP,Da=b(()=>{"use strict";Gi();sK();F();po=null,Oa=null,Tw=!1,aP=null});async function $K(e,t){try{return await qW(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function kTe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Da(),$a)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(sP(),iP)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(Gi(),z_)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function DK(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??kTe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await Ki(n,e,{headers:vTe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(STe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(wTe.test(p)&&!bTe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await $K(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof Vt||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=H_({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await sf(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>sf(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await sf(d.finalUrl,o);let p=await $K(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=H_({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof Vt)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var bTe,wTe,STe,vTe,LK=b(()=>{"use strict";zW();W_();Ia();me();bTe=/(text\/html|application\/xhtml\+xml)/i,wTe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,STe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,vTe={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function ETe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(TTe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),xTe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=le(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function FK(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?ETe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function NK(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
434
434
|
|
|
435
435
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
436
436
|
`).trimEnd()}var TTe,xTe,BK=b(()=>{"use strict";We();TTe="https://api.exa.ai/search",xTe=10});function xw(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var La=b(()=>{"use strict";ww()});function ITe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=RTe;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,ATe)}let a=CTe;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,_Te)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function cP(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:xr(e,t),truncated:!0}}function MTe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=ITe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await Pa(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Ki(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof Vt?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=cP(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await DK(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=cP(JW(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof Vt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=wn(p)&&!eP(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${af()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=FK({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:PTe,timeoutMs:s.timeoutMs,signal:a.signal}),f=cP(NK(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var RTe,ATe,CTe,_Te,PTe,UK,jK=b(()=>{"use strict";LK();BK();Ia();no();W_();La();RTe=3e4,ATe=12e4,CTe=1e5,_Te=1e6,PTe=10;UK=MTe()});function DTe(e){return OTe.has(e)?"low":e==="DELETE"?"high":"medium"}function LTe(e){return $Te.has(e)}function BTe(e){let t={};return e.forEach((n,r)=>{let o=r.toLowerCase();NTe.has(o)||FTe.some(i=>o.startsWith(i))||(t[r]=n)}),t}function UTe(e,t){if(e==null)return{serialized:void 0,inferredContentType:void 0};let n=Object.keys(t).some(o=>o.toLowerCase()==="content-type");return typeof e=="string"?{serialized:e,inferredContentType:n?void 0:"text/plain"}:{serialized:JSON.stringify(e),inferredContentType:n?void 0:"application/json"}}function jTe(e,t,n){let r=Buffer.byteLength(e,"utf8"),o=e,i=!1;if(r>n&&(o=xr(e,n),i=!0),!i&&/application\/json/i.test(t))try{return{body:JSON.parse(o),truncated:!1}}catch{}return{body:o,truncated:i}}async function KK(e){let{url:t,method:n,signal:r,domainCheck:o,recordEffect:i}=e,s=Math.min(e.maxResponseBytes??uP,dP),a={...e.headers},l=e.fetchFn??globalThis.fetch,c=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},u=DTe(n);if(o!==void 0){let R=o(t);if(!R.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${R.reason}`),{name:"DomainPolicyError"})}let d=await Pa(t,c);if(!d.allowed)throw new Vt(d.reason);let{serialized:p,inferredContentType:f}=UTe(e.body,a);f!==void 0&&(a["content-type"]=f);let g={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},y=LTe(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},w=Date.now(),S;try{S=await Ki(l,t,g,{...c,retry:y})}catch(R){throw R instanceof Vt,R}let v=Date.now()-w,x=S.headers.get("content-type")??"",T;try{let R=S.body?.getReader();if(!R)T="";else{let P=[],I=0,$=s*2;for(;;){let{done:j,value:O}=await R.read();if(j||!O)break;if(P.push(O),I+=O.byteLength,I>=$){await R.cancel();break}}T=new TextDecoder().decode(Buffer.concat(P,I))}}catch{T=""}let{body:E,truncated:C}=jTe(T,x,s),_=BTe(S.headers);return i!==void 0&&Promise.resolve(i({url:t,method:n,status:S.status,risk:u,timing_ms:v})).catch(()=>{}),{status:S.status,headers:_,body:E,truncated:C,timing_ms:v,risk:u}}function GK(e){if(typeof e!="string"||e.trim().length===0)return{error:"method must be a non-empty string (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)"};let t=e.trim().toUpperCase(),n=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"];return n.includes(t)?t:{error:`method "${e}" is not supported \u2014 must be one of: ${n.join(", ")}`}}var HK,WK,uP,dP,OTe,$Te,FTe,NTe,qK=b(()=>{"use strict";Ia();no();HK=3e4,WK=12e4,uP=1e5,dP=1e6,OTe=new Set(["GET","HEAD","OPTIONS"]),$Te=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);FTe=["set-cookie","x-"],NTe=new Set(["server","via","age","vary","authorization","www-authenticate"])});function HTe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e;if(typeof t.url!="string"||t.url.length===0)return{error:'Invalid input: "url" must be a non-empty string'};let n;try{n=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{error:`Invalid input: protocol "${n.protocol}" not supported (http/https only)`};n.username="",n.password="";let r=n.toString(),o=GK(t.method);if(typeof o=="object"&&"error"in o)return{error:`Invalid input: ${o.error}`};let i=o,s;if(t.body!==void 0&&t.body!==null){if(typeof t.body!="string"&&typeof t.body!="object")return{error:'Invalid input: "body" must be a string, object, or array'};s=t.body}let a={};if(t.headers!==void 0){if(typeof t.headers!="object"||t.headers===null||Array.isArray(t.headers))return{error:'Invalid input: "headers" must be a string-keyed object'};let d=t.headers;for(let[p,f]of Object.entries(d)){if(typeof f!="string")return{error:`Invalid input: header value for "${p}" must be a string`};a[p]=f}}let l=HK;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:'Invalid input: "timeout_ms" must be a positive finite number'};l=Math.min(t.timeout_ms,WK)}let c=uP;if(t.max_response_bytes!==void 0){if(typeof t.max_response_bytes!="number"||!Number.isFinite(t.max_response_bytes)||t.max_response_bytes<=0)return{error:'Invalid input: "max_response_bytes" must be a positive finite number'};c=Math.min(t.max_response_bytes,dP)}let u;if(t.credential!==void 0){if(typeof t.credential!="string"||t.credential.length===0)return{error:'Invalid input: "credential" must be a non-empty string (an env var name)'};u=t.credential}return{url:r,method:i,body:s,headers:a,timeoutMs:l,maxResponseBytes:c,credential:u}}function WTe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;async function r(){if(e.domainCheck!==void 0)return e.domainCheck;try{let{loadBrowserConfig:o,enforceDomainPolicy:i}=await Promise.resolve().then(()=>(Gi(),z_)),s=o();return a=>i(a,s)}catch{return}}return async(o,i)=>{if(typeof t!="function")return{content:"web_request unavailable: global fetch() is not present (agent-afk requires Node 20+).",isError:!0};let s=HTe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let p=i.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...s.headers};if(s.credential!==void 0){let p=n[s.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${s.credential}" is not set. Set it in afk.env or export it in the shell before starting AFK.`,isError:!0};if(Object.keys(a).some(g=>g.toLowerCase()==="authorization"))return{content:'web_request credential error: both "credential" and an explicit Authorization header were provided. Use one or the other.',isError:!0};a.Authorization=`Bearer ${p}`}let l=new AbortController,c=()=>l.abort(i.reason),u,d=()=>{let p=l.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{i.addEventListener("abort",c,{once:!0}),u=setTimeout(()=>{l.abort(new Error(`web_request timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let p=await r(),f={url:s.url,method:s.method,body:s.body,headers:a,maxResponseBytes:s.maxResponseBytes,signal:l.signal,fetchFn:t,lookupFn:e.lookupFn,domainCheck:p,recordEffect:e.recordEffect},g;try{g=await KK(f)}catch(S){if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};if(S instanceof Vt)return{content:`web_request blocked: ${S.message}`,isError:!0};let v=S instanceof Error&&S.name==="DomainPolicyError"?"blocked":"network error",x=S instanceof Error?S.message:String(S);return{content:`web_request ${v}: ${x}`,isError:!0}}if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};let h=g.body;if(typeof h=="string")h=dt(h);else if(typeof h=="object"&&h!==null){let S=dt(JSON.stringify(h));try{h=JSON.parse(S)}catch{h=S}}let y={status:g.status,headers:g.headers,body:h,timing_ms:g.timing_ms,...g.truncated?{truncated:!0}:{}};return{content:JSON.stringify(y,null,2),...g.truncated?{truncated:!0}:{}}}finally{u!==void 0&&clearTimeout(u),i.removeEventListener("abort",c)}}}var zK,JK=b(()=>{"use strict";qK();Ia();vr();zK=WTe()});import{existsSync as YK,mkdirSync as KTe,readFileSync as GTe,renameSync as qTe,unlinkSync as zTe,writeFileSync as JTe}from"node:fs";import{dirname as VK,join as VTe}from"node:path";import{randomBytes as YTe}from"node:crypto";function Ln(e){let t=e??wy();if(!YK(t))return[];try{let n=GTe(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function qi(e,t){let n=t??wy();KTe(VK(n),{recursive:!0});let r=VTe(VK(n),`.schedules.json.${process.pid}.${YTe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{JTe(r,o,"utf-8"),qTe(r,n)}catch(i){try{YK(r)&&zTe(r)}catch{}throw i}}function Ew(e,t){let n=Ln(t),r=n.map(l=>l.id),o=XTe(e.name),i=QTe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),qi(n,t),a}function Rw(e,t){let n=Ln(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(qi(o,t),!0)}function lf(e,t){return Ln(t).find(n=>n.id===e)}function XTe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function QTe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function Aw(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Cw=b(()=>{"use strict";U()});import{existsSync as ZTe,readFileSync as exe}from"node:fs";import{join as txe}from"node:path";async function rr(e,t,n){let r,o;try{let i=txe(Xp("default"),"port");if(!ZTe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=exe(i,"utf-8").trim(),a=nxe(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function nxe(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var zi,pP=b(()=>{"use strict";U();zi="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as rxe}from"node:fs";import{readFile as oxe}from"node:fs/promises";var XK,QK,ZK,eG,tG=b(()=>{"use strict";Cw();U();pP();XK=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=Ew({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await rr("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await rr("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:zi}})}},QK=async(e,t)=>{let n=Ln();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},ZK=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=wr();if(!rxe(i))return{content:JSON.stringify([])};let s;try{let c=await oxe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -439,7 +439,7 @@ ${nr(e,{headless:t,latched:n})}`,{cause:e})}var bK,Gke,qke,yK,Jke,ww=b(()=>{"use
|
|
|
439
439
|
`;try{await n(l,c,"utf-8"),await sxe(l,s),r.push(`${i.name}: terminal.integrated.fontSize set to ${t}`)}catch(u){let d=u;r.push(`${i.name}: could not write settings \u2014 ${d.message}`),o=!0}}return o?{content:r.join(`
|
|
440
440
|
`),isError:!0}:{content:r.join(`
|
|
441
441
|
`)}}var mP,fP,hP,yP=b(()=>{"use strict";Yc();F();mP=6,fP=60;hP=gP()});import{promises as Pw}from"node:fs";import{O_WRONLY as uxe,O_CREAT as dxe,O_TRUNC as pxe,O_NOFOLLOW as mxe}from"node:constants";import{join as iG}from"node:path";function bP(e){return iG(e,".afk-worktrees",fxe)}function hxe(e){return iG(e,".afk-worktrees")}async function wP(e){try{if(!(await Pw.stat(hxe(e))).isDirectory())return null}catch(n){let r=n.code;return r==="ENOENT"||r==="ENOTDIR"?null:0}let t;try{t=await Pw.lstat(bP(e))}catch{return 0}if(!t.isFile())return 0;try{let n=Number.parseInt((await Pw.readFile(bP(e),"utf-8")).trim(),10);if(Number.isInteger(n)&&n>=0)return n}catch{}return 0}async function aG(e){try{let t=await wP(e);if(t===null)return;let n=await Pw.open(bP(e),uxe|dxe|pxe|mxe,gxe);try{await n.writeFile(String(t+1),"utf-8")}finally{await n.close()}}catch{}}var sG,fxe,gxe,lG=b(()=>{"use strict";sG=3,fxe=".sweep-runs",gxe=384});import{readdir as yxe,stat as bxe}from"node:fs/promises";import{join as wxe}from"node:path";function Sxe(e){return Wi(e)!=="protected"}async function vxe(e,t){if(e.isDirectory())return!0;if(!e.isSymbolicLink())return!1;try{return(await bxe(t)).isDirectory()}catch{return!1}}async function cG(e,t,n,r={}){if(!Number.isFinite(t)||t<n)return{remove:!1,because:"too-young",detail:`age ${Math.max(0,Math.round(t))}ms < ${n}ms`};let o=r.maxDepth??kxe,i=r.maxEntries??Txe,s=i,a=[{abs:e,rel:"",depth:0}];for(;a.length>0;){let l=a.pop();if(l===void 0)break;let c;try{c=await yxe(l.abs,{withFileTypes:!0})}catch(u){return{remove:!1,because:"scan-failed",detail:`${l.rel===""?e:l.rel}: ${u instanceof Error?u.message:String(u)}`}}for(let u of c){if(--s<0)return{remove:!1,because:"scan-budget-exhausted",detail:`exceeded ${i} entries`};let d=l.rel===""?u.name:`${l.rel}/${u.name}`,p=wxe(l.abs,u.name);if(await vxe(u,p)&&!u.isDirectory()){if(Wi(`${d}/`)==="opaque")continue;return{remove:!1,because:"non-rebuildable-content",detail:d}}if(u.isDirectory()){if(Wi(`${d}/`)==="opaque")continue;if(l.depth+1>o)return{remove:!1,because:"scan-failed",detail:`depth limit at ${d}`};a.push({abs:p,rel:d,depth:l.depth+1});continue}if(!Sxe(d))return{remove:!1,because:"non-rebuildable-content",detail:d}}}return{remove:!0}}var kxe,Txe,uG=b(()=>{"use strict";ow();kxe=8,Txe=4e3});import{promises as or,existsSync as gG,createReadStream as xxe,realpathSync as Exe}from"node:fs";import{join as Iw,relative as Rxe,isAbsolute as Axe}from"node:path";import{createInterface as Cxe}from"node:readline";function dG(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function pG(e){try{return Exe(e)}catch{return e}}function mG(e,t){let n=Rxe(pG(t),pG(e));return n===""||!n.startsWith("..")&&!Axe(n)}function SP(e){return e.replace(/^refs\/heads\//,"")}function Pxe(e){let t=e.trim().split(/\n\n+/),n=[];for(let r of t){let o=r.split(`
|
|
442
|
-
`),i="",s="",a="",l=!1,c=!1,u=!1;for(let d of o)d.startsWith("worktree ")?i=d.slice(9).trim():d.startsWith("HEAD ")?s=d.slice(5).trim():d.startsWith("branch ")?a=d.slice(7).trim():d.trim()==="locked"?l=!0:d.trim()==="prunable"?c=!0:d.trim()==="bare"&&(u=!0);i&&n.push({path:i,head:s,branch:a,locked:l,prunable:c,isBare:u})}return n}function fG(e){return e.commitsAhead>0&&e.commitsUnpushed>0}function Ixe(e,t,n){if(e.locked)return"locked";let r=864e5,o=t*r,i=n*r;return e.ownerLiveness==="dead"&&!e.isDirty&&!fG(e)?"dead-owner":e.ownerLiveness!=="alive"&&!fG(e)&&!e.isDirty&&e.ageMs>=hG?"empty":e.isDirty&&e.ageMs>i?"stale-dirty":!e.isDirty&&e.commitsAhead>0&&e.ageMs>o?"stale-clean":"active"}async function Mxe(e){if(!gG(e))return 0;let t=0;try{let n=Cxe({input:xxe(e),crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let i=JSON.parse(o);i.taskId==="worktree-prune"&&(i.status==="success"||i.status==="error")&&t++}catch{}}}catch{}return t}async function Oxe(e){let t=Iw(e,"..");await or.mkdir(t,{recursive:!0}).catch(()=>{});let r=await(async()=>{try{return await or.open(e,"wx")}catch(o){if(o.code!=="EEXIST")throw o;let s=null;try{let a=await or.readFile(e,"utf-8");s=parseInt(a.trim(),10)}catch{}if(s!==null&&!Number.isNaN(s)){let a=!1;try{process.kill(s,0),a=!0}catch{}if(!a)return await or.unlink(e).catch(()=>{}),await or.open(e,"wx")}throw new Mw(e)}})();return await r.writeFile(String(process.pid),"utf-8"),await r.close(),async()=>{await or.unlink(e).catch(()=>{})}}async function ir(e){let{execFile:t,repoRoot:n,maxAgeDaysClean:r=14,maxAgeDaysDirty:o=30,scope:i="all",telemetryPath:s}=e,a=s??wr(),l=e.lockPath??_A(),c={removed:[],warnings:[],dryRun:e.dryRun??!1,candidates:[]},u=e.bypassSoftLaunch?Number.POSITIVE_INFINITY:await wP(n)??await Mxe(a),d=e.dryRun===!0||u<sG;c.dryRun=d;let p=null;try{p=await Oxe(l)}catch(f){if(f instanceof Mw)return c.warnings.push(`[WARN] ${f.message}`),c.contested=!0,c;throw f}try{let f=await t("git",["-C",n,"worktree","list","--porcelain"]),g=Pxe(f.stdout),h=Iw(n,".afk-worktrees"),y=new Set(g.map(R=>R.path)),w=[],S=h;try{(await or.lstat(h)).isSymbolicLink()&&(c.warnings.push(`[WARN] skipping orphan scan: .afk-worktrees is a symlink, not a directory: ${h}`),S=null)}catch{}if(S!==null)try{w=(await or.readdir(S,{withFileTypes:!0})).filter(P=>P.isDirectory()).map(P=>Iw(h,P.name))}catch{}let v=w.filter(R=>!y.has(R));if(i==="all"||i==="interactive")for(let R of v){let P=0;try{let $=await or.stat(R);Number.isFinite($.birthtimeMs)&&$.birthtimeMs>0&&(P=Math.max(0,Date.now()-$.birthtimeMs))}catch{}let I=await cG(R,P,hG);if(c.candidates.push({path:R,verdict:I.remove?"orphaned-dir":"orphaned-dir-preserved",owner:"interactive",ageMs:P}),!I.remove){c.warnings.push(`[WARN] orphaned dir preserved (${I.because}${I.detail===void 0?"":`: ${I.detail}`}): ${R}`);continue}if(!d)try{await or.rm(R,{recursive:!0,force:!0}),c.removed.push(R)}catch($){c.warnings.push(`[ERROR] Failed to remove orphaned dir ${R}: ${$ instanceof Error?$.message:String($)}`)}}let x=e.readPresence??Fb,T=[];try{T=(await x()).filter(P=>typeof P.pid=="number"&&P.pid>0&&dG(P.pid)).map(P=>P.cwd).filter(P=>typeof P=="string"&&P.length>0)}catch{}let E=!1,C=g[0]?.path,_=g[0]?.head;for(let R of g){if(R.path===C||R.isBare||!mG(R.path,h))continue;let P;try{let Q=await or.readFile(Iw(R.path,".afk-worktree-meta.json"),"utf-8");P=JSON.parse(Q)}catch{}if(i!=="all"&&P?.owner!==i)continue;let I=P?.owner==="interactive"||P?.owner==="diagnose"?P.owner:"unknown";if(!gG(R.path)){c.candidates.push({path:R.path,verdict:"orphaned-registration",owner:I,ageMs:0}),d||(E=!0);continue}let $=0,j=P?.createdAt;if(j)$=Date.now()-new Date(j).getTime();else try{let Q=await or.stat(R.path);$=Date.now()-Q.birthtimeMs}catch{}let O=!1,W="clean",q=0;try{O=(await t("git",["-C",R.path,"status","--porcelain"])).stdout.trim().length>0,O&&(W="uncommitted changes")}catch{O=!0,W="git status failed"}if(!O){let Q=await Jm(t,R.path);O=Q.protect,Q.protect&&(W=Q.because==="git-failed"?"ignored-file probe failed":`non-rebuildable ignored files: ${Q.detail}`),Q.protect&&Q.because==="git-failed"&&c.warnings.push(`[WARN] ignored-file probe failed for ${R.path} \u2014 preserving (${Q.detail})`)}if(!O&&R.head)try{let Q=P?.baseSha!==void 0?["-C",n,"rev-list",`${P.baseSha}..${R.head}`,"--count"]:_!==void 0&&_!==R.head?["-C",n,"rev-list",R.head,"--not",_,"--count"]:void 0;if(Q!==void 0){let ie=await t("git",Q);q=parseInt(ie.stdout.trim(),10)||0}}catch{q=0}let K=q;if(q>0)try{let Q=await t("git",["-C",R.path,"rev-list","@{upstream}..HEAD","--count"]),ie=parseInt(Q.stdout.trim(),10);Number.isInteger(ie)&&ie>=0&&(K=ie)}catch{}let H="unknown";typeof P?.pid=="number"&&Number.isInteger(P.pid)&&P.pid>0&&$<=_xe&&(H=dG(P.pid)?"alive":"dead"),H!=="alive"&&T.some(Q=>mG(Q,R.path))&&(H="alive");let Y={path:R.path,head:R.head,branch:R.branch,locked:R.locked,prunable:R.prunable,meta:P,ageMs:$,isDirty:O,dirtyReason:W,commitsAhead:q,commitsUnpushed:K,ownerLiveness:H},le=Ixe(Y,r,o);if(c.candidates.push({path:R.path,verdict:le,owner:I,ageMs:$}),d)continue;let M=Y.commitsAhead===0,N=async()=>{!R.branch||!M||await t("git",["-C",n,"branch","-d",SP(R.branch)]).catch(()=>{})};try{le==="empty"?(await t("git",["-C",n,"worktree","remove","--force",R.path]),await N(),!M&&R.branch&&c.warnings.push(`[INFO] reaped worktree with pushed commits; branch preserved (${SP(R.branch)}): ${R.path}`),c.removed.push(R.path)):le==="dead-owner"?(await t("git",["-C",n,"worktree","remove","--force",R.path]),await N(),!M&&R.branch&&c.warnings.push(`[INFO] reaped worktree with pushed commits; branch preserved (${SP(R.branch)}): ${R.path}`),c.removed.push(R.path)):le==="stale-clean"?c.warnings.push(`[WARN] stale-clean worktree preserved (commits ahead of base): ${R.path}`):le==="stale-dirty"&&c.warnings.push(`[WARN] stale-dirty worktree preserved (${Y.dirtyReason}): ${R.path}`)}catch(Q){c.warnings.push(`[ERROR] Failed to process ${R.path} (${le}): ${Q instanceof Error?Q.message:String(Q)}`)}}if(E&&!d)try{await t("git",["-C",n,"worktree","prune"])}catch(R){c.warnings.push(`[ERROR] git worktree prune failed: ${R instanceof Error?R.message:String(R)}`)}}finally{p&&await p()}return e.bypassSoftLaunch!==!0&&e.dryRun!==!0&&await aG(n),c}var hG,_xe,Mw,cu=b(()=>{"use strict";U();xa();iw();lG();uG();hG=36e5,_xe=30*864e5;Mw=class extends Error{constructor(t){super(`Worktree sweep lock contested: ${t} \u2014 another sweep may be running.`),this.name="LockContestedError"}}});import{execFile as $xe}from"node:child_process";import{promisify as Dxe}from"node:util";import{promises as yG}from"node:fs";import{join as Ow,resolve as Lxe,isAbsolute as Fxe,dirname as Nxe}from"node:path";async function vP(e,t){let r=(await e("git",["-C",t,"rev-parse","--git-common-dir"])).stdout.trim();if(!r)throw new Error("Not in a git repository.");let o=Fxe(r)?r:Lxe(t,r),i=Nxe(o);return{repoRoot:i,afkWorktreesRoot:Ow(i,".afk-worktrees")}}function kP(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,80)}async function TP(e,t){try{let r=(await e("git",["-C",t,"rev-parse","HEAD"])).stdout.trim();if(r)return r}catch{}return"HEAD"}async function xP(e){let{execFile:t,repoRoot:n,worktreePath:r,branch:o,baseRef:i}=e;await t("git",["-C",n,"worktree","add","-b",o,r,i]),await aw(n);let s="";try{s=(await t("git",["-C",n,"rev-parse",i])).stdout.trim()}catch{}try{await yG.writeFile(Ow(r,".afk-worktree-meta.json"),JSON.stringify({owner:e.owner??"agent",pid:process.pid,createdAt:new Date().toISOString(),baseSha:s,baseBranch:i},null,2),"utf-8")}catch{}return{path:r,branch:o,baseRef:i,baseSha:s}}async function Bxe(e,t){try{return(await e("git",["-C",t,"status","--porcelain"])).stdout.trim().length>0}catch{return!0}}async function Uxe(e,t,n){try{let r=await yG.readFile(Ow(n,".afk-worktree-meta.json"),"utf-8"),o=JSON.parse(r);if(!o.baseSha)return 0;let i=await e("git",["-C",n,"rev-parse","HEAD"]),s=await e("git",["-C",t,"rev-list",`${o.baseSha}..${i.stdout.trim()}`,"--count"]);return parseInt(s.stdout.trim(),10)||0}catch{return 0}}async function EP(e){let{execFile:t,repoRoot:n,worktreePath:r,force:o}=e;if(!o){if(await Bxe(t,r))return{removed:!1,reason:"dirty"};if(await rW(t,r))return{removed:!1,reason:"ignored-local-state"};let s=await Uxe(t,n,r);if(s>0)return{removed:!1,reason:"commits-ahead",commitsAhead:s}}let i=["-C",n,"worktree","remove"];return o&&i.push("--force"),i.push(r),await t("git",i),{removed:!0,branchPreserved:e.branch??null}}async function bG(e){let t=e.execFile??$w,n=await vP(t,e.cwd),r=kP(e.slugHint)||"iso",o=Ow(n.afkWorktreesRoot,r),s=`${k.AFK_WORKTREE_BRANCH_PREFIX??"afk/"}${r}`,a=e.baseRef??await TP(t,e.cwd),l=/could not lock|index\.lock|already locked|unable to create .*\.lock|File exists/i,c=()=>xP({execFile:t,repoRoot:n.repoRoot,worktreePath:o,branch:s,baseRef:a}),u;try{u=await c()}catch(d){let p=d instanceof Error?d.message:String(d);if(!l.test(p))throw d;await new Promise(f=>setTimeout(f,100)),u=await c()}return{repoRoot:n.repoRoot,...u}}function RP(e){return e==="ignored-local-state"?"ignored-local-state: non-rebuildable ignored files present (e.g. .env) \u2014 git status looked clean":e}async function Dw(e){let t=e.execFile??$w;try{let n=await EP({execFile:t,repoRoot:e.repoRoot,worktreePath:e.worktreePath,force:!1});if(n.removed)return{removed:!0,preserved:!1};try{await t("git",["-C",e.repoRoot,"worktree","lock","--reason",`afk: isolated-worktree preserved (${RP(n.reason)})`,e.worktreePath])}catch{}return{removed:!1,preserved:!0,reason:n.reason}}catch{return{removed:!1,preserved:!1}}}var $w,cf=b(()=>{"use strict";lw();iw();F();$w=Dxe($xe)});import{join as CP,resolve as uu,isAbsolute as jxe,sep as Hxe}from"node:path";import{promises as Wxe}from"node:fs";async function Kxe(e){let t=[["pnpm-lock.yaml","pnpm install"],["package-lock.json","npm install"],["yarn.lock","yarn install"],["bun.lockb","bun install"]];for(let[n,r]of t)try{return await Wxe.access(CP(e,n)),r}catch{}return"pnpm install"}function Gxe(e){if(!(e==null||e===""))return typeof e!="string"?{error:"Invalid input: base must be a string when provided"}:e.startsWith("-")?{error:"Invalid input: base must be a git ref, not an option"}:e}function qxe(e,t){let n=uu(e),r=uu(t);return n===r||n.startsWith(r+Hxe)}async function zxe(e,t){let n=await e("git",["-C",t,"worktree","list","--porcelain"]),r=[],o;for(let i of n.stdout.split(`
|
|
442
|
+
`),i="",s="",a="",l=!1,c=!1,u=!1;for(let d of o)d.startsWith("worktree ")?i=d.slice(9).trim():d.startsWith("HEAD ")?s=d.slice(5).trim():d.startsWith("branch ")?a=d.slice(7).trim():d.trim()==="locked"?l=!0:d.trim()==="prunable"?c=!0:d.trim()==="bare"&&(u=!0);i&&n.push({path:i,head:s,branch:a,locked:l,prunable:c,isBare:u})}return n}function fG(e){return e.commitsAhead>0&&e.commitsUnpushed>0}function Ixe(e,t,n){if(e.locked)return"locked";let r=864e5,o=t*r,i=n*r;return e.ownerLiveness==="dead"&&!e.isDirty&&!fG(e)?"dead-owner":e.ownerLiveness!=="alive"&&!fG(e)&&!e.isDirty&&e.ageMs>=hG?"empty":e.isDirty&&e.ageMs>i?"stale-dirty":!e.isDirty&&e.commitsAhead>0&&e.ageMs>o?"stale-clean":"active"}async function Mxe(e){if(!gG(e))return 0;let t=0;try{let n=Cxe({input:xxe(e),crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let i=JSON.parse(o);i.taskId==="worktree-prune"&&(i.status==="success"||i.status==="error")&&t++}catch{}}}catch{}return t}async function Oxe(e){let t=Iw(e,"..");await or.mkdir(t,{recursive:!0}).catch(()=>{});let r=await(async()=>{try{return await or.open(e,"wx")}catch(o){if(o.code!=="EEXIST")throw o;let s=null;try{let a=await or.readFile(e,"utf-8");s=parseInt(a.trim(),10)}catch{}if(s!==null&&!Number.isNaN(s)){let a=!1;try{process.kill(s,0),a=!0}catch{}if(!a)return await or.unlink(e).catch(()=>{}),await or.open(e,"wx")}throw new Mw(e)}})();return await r.writeFile(String(process.pid),"utf-8"),await r.close(),async()=>{await or.unlink(e).catch(()=>{})}}async function ir(e){let{execFile:t,repoRoot:n,maxAgeDaysClean:r=14,maxAgeDaysDirty:o=30,scope:i="all",telemetryPath:s}=e,a=s??wr(),l=e.lockPath??_A(),c={removed:[],warnings:[],dryRun:e.dryRun??!1,candidates:[]},u=e.bypassSoftLaunch?Number.POSITIVE_INFINITY:await wP(n)??await Mxe(a),d=e.dryRun===!0||u<sG;c.dryRun=d;let p=null;try{p=await Oxe(l)}catch(f){if(f instanceof Mw)return c.warnings.push(`[WARN] ${f.message}`),c.contested=!0,c;throw f}try{let f=await t("git",["-C",n,"worktree","list","--porcelain"]),g=Pxe(f.stdout),h=Iw(n,".afk-worktrees"),y=new Set(g.map(R=>R.path)),w=[],S=h;try{(await or.lstat(h)).isSymbolicLink()&&(c.warnings.push(`[WARN] skipping orphan scan: .afk-worktrees is a symlink, not a directory: ${h}`),S=null)}catch{}if(S!==null)try{w=(await or.readdir(S,{withFileTypes:!0})).filter(P=>P.isDirectory()).map(P=>Iw(h,P.name))}catch{}let v=w.filter(R=>!y.has(R));if(i==="all"||i==="interactive")for(let R of v){let P=0;try{let $=await or.stat(R);Number.isFinite($.birthtimeMs)&&$.birthtimeMs>0&&(P=Math.max(0,Date.now()-$.birthtimeMs))}catch{}let I=await cG(R,P,hG);if(c.candidates.push({path:R,verdict:I.remove?"orphaned-dir":"orphaned-dir-preserved",owner:"interactive",ageMs:P}),!I.remove){c.warnings.push(`[WARN] orphaned dir preserved (${I.because}${I.detail===void 0?"":`: ${I.detail}`}): ${R}`);continue}if(!d)try{await or.rm(R,{recursive:!0,force:!0}),c.removed.push(R)}catch($){c.warnings.push(`[ERROR] Failed to remove orphaned dir ${R}: ${$ instanceof Error?$.message:String($)}`)}}let x=e.readPresence??Fb,T=[];try{T=(await x()).filter(P=>typeof P.pid=="number"&&P.pid>0&&dG(P.pid)).map(P=>P.cwd).filter(P=>typeof P=="string"&&P.length>0)}catch{}let E=!1,C=g[0]?.path,_=g[0]?.head;for(let R of g){if(R.path===C||R.isBare||!mG(R.path,h))continue;let P;try{let Q=await or.readFile(Iw(R.path,".afk-worktree-meta.json"),"utf-8");P=JSON.parse(Q)}catch{}if(i!=="all"&&P?.owner!==i)continue;let I=P?.owner==="interactive"||P?.owner==="diagnose"?P.owner:"unknown";if(!gG(R.path)){c.candidates.push({path:R.path,verdict:"orphaned-registration",owner:I,ageMs:0}),d||(E=!0);continue}let $=0,j=P?.createdAt;if(j)$=Date.now()-new Date(j).getTime();else try{let Q=await or.stat(R.path);$=Date.now()-Q.birthtimeMs}catch{}let O=!1,W="clean",q=0;try{O=(await t("git",["-C",R.path,"status","--porcelain"])).stdout.trim().length>0,O&&(W="uncommitted changes")}catch{O=!0,W="git status failed"}if(!O){let Q=await Jm(t,R.path);O=Q.protect,Q.protect&&(W=Q.because==="git-failed"?"ignored-file probe failed":`non-rebuildable ignored files: ${Q.detail}`),Q.protect&&Q.because==="git-failed"&&c.warnings.push(`[WARN] ignored-file probe failed for ${R.path} \u2014 preserving (${Q.detail})`)}if(!O&&R.head)try{let Q=P?.baseSha!==void 0?["-C",n,"rev-list",`${P.baseSha}..${R.head}`,"--count"]:_!==void 0&&_!==R.head?["-C",n,"rev-list",R.head,"--not",_,"--count"]:void 0;if(Q!==void 0){let se=await t("git",Q);q=parseInt(se.stdout.trim(),10)||0}}catch{q=0}let K=q;if(q>0)try{let Q=await t("git",["-C",R.path,"rev-list","@{upstream}..HEAD","--count"]),se=parseInt(Q.stdout.trim(),10);Number.isInteger(se)&&se>=0&&(K=se)}catch{}let H="unknown";typeof P?.pid=="number"&&Number.isInteger(P.pid)&&P.pid>0&&$<=_xe&&(H=dG(P.pid)?"alive":"dead"),H!=="alive"&&T.some(Q=>mG(Q,R.path))&&(H="alive");let Y={path:R.path,head:R.head,branch:R.branch,locked:R.locked,prunable:R.prunable,meta:P,ageMs:$,isDirty:O,dirtyReason:W,commitsAhead:q,commitsUnpushed:K,ownerLiveness:H},ie=Ixe(Y,r,o);if(c.candidates.push({path:R.path,verdict:ie,owner:I,ageMs:$}),d)continue;let M=Y.commitsAhead===0,N=async()=>{!R.branch||!M||await t("git",["-C",n,"branch","-d",SP(R.branch)]).catch(()=>{})};try{ie==="empty"?(await t("git",["-C",n,"worktree","remove","--force",R.path]),await N(),!M&&R.branch&&c.warnings.push(`[INFO] reaped worktree with pushed commits; branch preserved (${SP(R.branch)}): ${R.path}`),c.removed.push(R.path)):ie==="dead-owner"?(await t("git",["-C",n,"worktree","remove","--force",R.path]),await N(),!M&&R.branch&&c.warnings.push(`[INFO] reaped worktree with pushed commits; branch preserved (${SP(R.branch)}): ${R.path}`),c.removed.push(R.path)):ie==="stale-clean"?c.warnings.push(`[WARN] stale-clean worktree preserved (commits ahead of base): ${R.path}`):ie==="stale-dirty"&&c.warnings.push(`[WARN] stale-dirty worktree preserved (${Y.dirtyReason}): ${R.path}`)}catch(Q){c.warnings.push(`[ERROR] Failed to process ${R.path} (${ie}): ${Q instanceof Error?Q.message:String(Q)}`)}}if(E&&!d)try{await t("git",["-C",n,"worktree","prune"])}catch(R){c.warnings.push(`[ERROR] git worktree prune failed: ${R instanceof Error?R.message:String(R)}`)}}finally{p&&await p()}return e.bypassSoftLaunch!==!0&&e.dryRun!==!0&&await aG(n),c}var hG,_xe,Mw,cu=b(()=>{"use strict";U();xa();iw();lG();uG();hG=36e5,_xe=30*864e5;Mw=class extends Error{constructor(t){super(`Worktree sweep lock contested: ${t} \u2014 another sweep may be running.`),this.name="LockContestedError"}}});import{execFile as $xe}from"node:child_process";import{promisify as Dxe}from"node:util";import{promises as yG}from"node:fs";import{join as Ow,resolve as Lxe,isAbsolute as Fxe,dirname as Nxe}from"node:path";async function vP(e,t){let r=(await e("git",["-C",t,"rev-parse","--git-common-dir"])).stdout.trim();if(!r)throw new Error("Not in a git repository.");let o=Fxe(r)?r:Lxe(t,r),i=Nxe(o);return{repoRoot:i,afkWorktreesRoot:Ow(i,".afk-worktrees")}}function kP(e){return e.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,80)}async function TP(e,t){try{let r=(await e("git",["-C",t,"rev-parse","HEAD"])).stdout.trim();if(r)return r}catch{}return"HEAD"}async function xP(e){let{execFile:t,repoRoot:n,worktreePath:r,branch:o,baseRef:i}=e;await t("git",["-C",n,"worktree","add","-b",o,r,i]),await aw(n);let s="";try{s=(await t("git",["-C",n,"rev-parse",i])).stdout.trim()}catch{}try{await yG.writeFile(Ow(r,".afk-worktree-meta.json"),JSON.stringify({owner:e.owner??"agent",pid:process.pid,createdAt:new Date().toISOString(),baseSha:s,baseBranch:i},null,2),"utf-8")}catch{}return{path:r,branch:o,baseRef:i,baseSha:s}}async function Bxe(e,t){try{return(await e("git",["-C",t,"status","--porcelain"])).stdout.trim().length>0}catch{return!0}}async function Uxe(e,t,n){try{let r=await yG.readFile(Ow(n,".afk-worktree-meta.json"),"utf-8"),o=JSON.parse(r);if(!o.baseSha)return 0;let i=await e("git",["-C",n,"rev-parse","HEAD"]),s=await e("git",["-C",t,"rev-list",`${o.baseSha}..${i.stdout.trim()}`,"--count"]);return parseInt(s.stdout.trim(),10)||0}catch{return 0}}async function EP(e){let{execFile:t,repoRoot:n,worktreePath:r,force:o}=e;if(!o){if(await Bxe(t,r))return{removed:!1,reason:"dirty"};if(await rW(t,r))return{removed:!1,reason:"ignored-local-state"};let s=await Uxe(t,n,r);if(s>0)return{removed:!1,reason:"commits-ahead",commitsAhead:s}}let i=["-C",n,"worktree","remove"];return o&&i.push("--force"),i.push(r),await t("git",i),{removed:!0,branchPreserved:e.branch??null}}async function bG(e){let t=e.execFile??$w,n=await vP(t,e.cwd),r=kP(e.slugHint)||"iso",o=Ow(n.afkWorktreesRoot,r),s=`${k.AFK_WORKTREE_BRANCH_PREFIX??"afk/"}${r}`,a=e.baseRef??await TP(t,e.cwd),l=/could not lock|index\.lock|already locked|unable to create .*\.lock|File exists/i,c=()=>xP({execFile:t,repoRoot:n.repoRoot,worktreePath:o,branch:s,baseRef:a}),u;try{u=await c()}catch(d){let p=d instanceof Error?d.message:String(d);if(!l.test(p))throw d;await new Promise(f=>setTimeout(f,100)),u=await c()}return{repoRoot:n.repoRoot,...u}}function RP(e){return e==="ignored-local-state"?"ignored-local-state: non-rebuildable ignored files present (e.g. .env) \u2014 git status looked clean":e}async function Dw(e){let t=e.execFile??$w;try{let n=await EP({execFile:t,repoRoot:e.repoRoot,worktreePath:e.worktreePath,force:!1});if(n.removed)return{removed:!0,preserved:!1};try{await t("git",["-C",e.repoRoot,"worktree","lock","--reason",`afk: isolated-worktree preserved (${RP(n.reason)})`,e.worktreePath])}catch{}return{removed:!1,preserved:!0,reason:n.reason}}catch{return{removed:!1,preserved:!1}}}var $w,cf=b(()=>{"use strict";lw();iw();F();$w=Dxe($xe)});import{join as CP,resolve as uu,isAbsolute as jxe,sep as Hxe}from"node:path";import{promises as Wxe}from"node:fs";async function Kxe(e){let t=[["pnpm-lock.yaml","pnpm install"],["package-lock.json","npm install"],["yarn.lock","yarn install"],["bun.lockb","bun install"]];for(let[n,r]of t)try{return await Wxe.access(CP(e,n)),r}catch{}return"pnpm install"}function Gxe(e){if(!(e==null||e===""))return typeof e!="string"?{error:"Invalid input: base must be a string when provided"}:e.startsWith("-")?{error:"Invalid input: base must be a git ref, not an option"}:e}function qxe(e,t){let n=uu(e),r=uu(t);return n===r||n.startsWith(r+Hxe)}async function zxe(e,t){let n=await e("git",["-C",t,"worktree","list","--porcelain"]),r=[],o;for(let i of n.stdout.split(`
|
|
443
443
|
`))i.startsWith("worktree ")?(o&&r.push(o),o={path:i.slice(9).trim(),locked:!1}):i.startsWith("branch ")&&o?o.branch=i.slice(7).trim():i.startsWith("locked")&&o&&(o.locked=!0);return o&&r.push(o),r}async function wG(e,t,n){return(await zxe(e,t)).find(o=>uu(o.path)===uu(n))}async function AP(e,t,n){let r=jxe(n)?n:CP(t.afkWorktreesRoot,n);if(!qxe(r,t.afkWorktreesRoot))return`Refused: ${r} is outside the afk-managed worktree root (${t.afkWorktreesRoot}). This tool only manages worktrees under .afk-worktrees/.`;let o=await wG(e,t.repoRoot,r);return o||`No registered git worktree at ${r}. Use action "list" to see managed worktrees.`}function SG(e,t){let n=t?.execFile??$w;return async(r,o,i)=>{if(!r||typeof r!="object")return{content:"Invalid input: expected object",isError:!0};let s=r,a=s.action;if(a!=="create"&&a!=="keep"&&a!=="release"&&a!=="list"&&a!=="remove")return{content:"Invalid input: action must be one of create | keep | release | list | remove",isError:!0};let l=i?.resolveBase??i?.cwd??e??process.cwd(),c;try{c=await vP(n,l)}catch(u){return{content:`Cannot resolve git repo root from ${l}: ${u instanceof Error?u.message:String(u)}`,isError:!0}}try{switch(a){case"create":{if(typeof s.name!="string"||!s.name)return{content:"Invalid input: name required for create",isError:!0};let u=kP(s.name);if(!u)return{content:`Invalid input: name "${s.name}" sanitizes to empty`,isError:!0};let d=CP(c.afkWorktreesRoot,u);if(await wG(n,c.repoRoot,d))return{content:`Worktree already exists at ${d}`,isError:!0};let g=`${k.AFK_WORKTREE_BRANCH_PREFIX??"afk/"}${u}`,h=Gxe(s.base);if(typeof h=="object")return{content:h.error,isError:!0};let y=h??await TP(n,l),w=await xP({execFile:n,repoRoot:c.repoRoot,worktreePath:d,branch:g,baseRef:y}),S=await Kxe(w.path);return{content:JSON.stringify({path:w.path,branch:w.branch,base:w.baseRef,note:`Dependencies are NOT installed in this fresh worktree (no shared node_modules). Run \`${S}\` in ${w.path} before building or testing, or the build/tests will fail opaquely.`})}}case"keep":{if(typeof s.path!="string"||!s.path)return{content:"Invalid input: path required for keep",isError:!0};let u=await AP(n,c,s.path);if(typeof u=="string")return{content:u,isError:!0};let d=typeof s.reason=="string"&&s.reason?s.reason:"kept by agent";return await n("git",["-C",c.repoRoot,"worktree","lock","--reason",`afk: ${d}`,u.path]),{content:JSON.stringify({path:u.path,locked:!0,note:'The sweep engine never removes or warns about locked worktrees. Use action "release" to unlock.'})}}case"release":{if(typeof s.path!="string"||!s.path)return{content:"Invalid input: path required for release",isError:!0};let u=await AP(n,c,s.path);return typeof u=="string"?{content:u,isError:!0}:(await n("git",["-C",c.repoRoot,"worktree","unlock",u.path]),{content:JSON.stringify({path:u.path,locked:!1})})}case"list":{let u=await ir({execFile:n,repoRoot:c.repoRoot,dryRun:!0,scope:"all"});return{content:JSON.stringify(u.candidates.map(d=>({path:d.path,verdict:d.verdict,owner:d.owner,ageDays:Math.round(d.ageMs/864e5)})))}}case"remove":{if(typeof s.path!="string"||!s.path)return{content:"Invalid input: path required for remove",isError:!0};let u=await AP(n,c,s.path);if(typeof u=="string")return{content:u,isError:!0};if(uu(u.path)===uu(c.repoRoot))return{content:"Refused: cannot remove the main worktree.",isError:!0};if(u.locked)return{content:`Refused: ${u.path} is locked. Use action "release" first if removal is really intended.`,isError:!0};let d=s.force===!0,p=await EP({execFile:n,repoRoot:c.repoRoot,worktreePath:u.path,branch:u.branch??null,force:d});return p.removed?{content:JSON.stringify({path:u.path,removed:!0,branchPreserved:p.branchPreserved})}:p.reason==="dirty"?{content:`Refused: ${u.path} has uncommitted changes. Commit/stash them, or pass force: true to discard.`,isError:!0}:p.reason==="ignored-local-state"?{content:`Refused: ${u.path} holds non-rebuildable ignored files (e.g. .env, a gitignored plan) that \`git status\` cannot see, so removal would silently delete them. Move/back up what you need, or pass force: true to discard them along with the checkout.`,isError:!0}:{content:`Refused: ${u.path} has ${p.commitsAhead} commit(s) ahead of its base. The branch ref would survive, but pass force: true to confirm removing the checkout.`,isError:!0}}}}catch(u){return{content:`worktree ${a} failed: ${u instanceof Error?u.message:String(u)}`,isError:!0}}return{content:"Unhandled action",isError:!0}}}var vG=b(()=>{"use strict";cu();F();cf()});function Jo(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Lw=b(()=>{"use strict"});import{existsSync as uf,readFileSync as Fw,writeFileSync as Jxe,renameSync as Vxe,mkdirSync as Yxe,unlinkSync as Xxe}from"fs";import{dirname as Qxe}from"path";function wt(e,t,n=384){Yxe(Qxe(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;try{Jxe(r,t,{mode:n}),Vxe(r,e)}catch(o){try{uf(r)&&Xxe(r)}catch{}throw o}}function _r(e,t,n,r=[]){let o="";uf(e)&&(o=Fw(e,"utf-8"));for(let a of r){let l=new RegExp(`^${Jo(a)}=.*$
|
|
444
444
|
?`,"m");o=o.replace(l,"")}let i=`${t}=${n}`,s=new RegExp(`^${Jo(t)}=.*$`,"m");s.test(o)?o=o.replace(s,i):(o&&!o.endsWith(`
|
|
445
445
|
`)&&(o+=`
|
|
@@ -1320,7 +1320,7 @@ Rules:
|
|
|
1320
1320
|
- Find and read the files relevant to the dispatched question. Prefer targeted grep/glob over broad reads.
|
|
1321
1321
|
- Match the requested thoroughness when the prompt names one (quick / medium / very thorough); default to medium.
|
|
1322
1322
|
|
|
1323
|
-
Reply compactly: the answer first, then evidence as file:line citations, then open questions or paths not checked. No preamble.`,vM=50,TPe=150});import{readFileSync as xPe,readdirSync as EPe}from"node:fs";import{join as Av}from"node:path";function Cv(e,t=0){if(t>RPe)return[];let n;try{n=EPe(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let o of n){if(o.name.startsWith("."))continue;let i=Av(e,o.name);o.isDirectory()?r.push(...Cv(i,t+1)):o.isFile()&&o.name.endsWith(".md")&&r.push(i)}return r.sort()}function EM(e,t,n,r){let o=e.get(t);if(o===void 0||o.source!=="builtin")return;let i=o.bashReadOnly===!0?" \u2014 the built-in restricts its tools and gates bash to read-only commands; the override replaces both":o.definition.tools!==void 0?" \u2014 the built-in restricts which tools it may use; the override replaces that restriction":"";r(`[afk] agents: ${
|
|
1323
|
+
Reply compactly: the answer first, then evidence as file:line citations, then open questions or paths not checked. No preamble.`,vM=50,TPe=150});import{readFileSync as xPe,readdirSync as EPe}from"node:fs";import{join as Av}from"node:path";function Cv(e,t=0){if(t>RPe)return[];let n;try{n=EPe(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let o of n){if(o.name.startsWith("."))continue;let i=Av(e,o.name);o.isDirectory()?r.push(...Cv(i,t+1)):o.isFile()&&o.name.endsWith(".md")&&r.push(i)}return r.sort()}function EM(e,t,n,r){let o=e.get(t);if(o===void 0||o.source!=="builtin")return;let i=o.bashReadOnly===!0?" \u2014 the built-in restricts its tools and gates bash to read-only commands; the override replaces both":o.definition.tools!==void 0?" \u2014 the built-in restricts which tools it may use; the override replaces that restriction":"";r(`[afk] agents: ${le(n)} overrides built-in agent ${JSON.stringify(t)}${i}`)}function xM(e,t,n,r,o,i){let s=new Map;for(let a of Cv(n)){let l;try{l=xPe(a,"utf8")}catch(d){let p=le(d instanceof Error?d.message:String(d));o(`[afk] agents: cannot read ${le(a)}: ${p}`);continue}let c=Va(l,d=>o(`[afk] agents: ${le(a)}: ${d}`));if(c===void 0)continue;let u=s.get(c.name);if(u!==void 0){o(`[afk] agents: duplicate agent name ${JSON.stringify(c.name)} in ${r} scope \u2014 keeping ${le(u)}, ignoring ${le(a)}`);continue}if(s.set(c.name,a),i!==void 0){let d=i.get(c.name);d!==void 0&&o(`[afk] agents: duplicate agent name ${JSON.stringify(c.name)} in ${r} scope \u2014 ${le(a)} overrides ${le(d)}`),i.set(c.name,a)}EM(t,c.name,a,o),e.set(c.name,{name:c.name,definition:c.definition,source:r,filePath:a,...c.bashReadOnly===!0?{bashReadOnly:!0}:{},...c.ignoredKeys!==void 0?{ignoredKeys:c.ignoredKeys}:{}}),c.ignoredKeys!==void 0&&c.ignoredKeys.length>0&&o(`[afk] agents: ${le(a)}: frontmatter field(s) not honored by AFK yet: `+c.ignoredKeys.join(", "))}}function RM(e={}){let t=e.cwd??process.cwd(),n=e.warn??(s=>process.stderr.write(s+`
|
|
1324
1324
|
`)),r=kM(),o=new Map(r);if(e.pluginAgents!==void 0)for(let s of e.pluginAgents)EM(r,s.name,`plugin agent (${s.source})`,n),o.set(s.name,s);xM(o,r,Av(be(),"agents"),"user",n);let i=new Map;if(xM(o,r,Av(t,".claude","agents"),"project",n,i),xM(o,r,Av(t,".afk","agents"),"project",n,i),e.configAgents!==void 0)for(let[s,a]of Object.entries(e.configAgents))s.trim().length!==0&&(EM(r,s,"AgentSessionConfig.agents",n),o.set(s,{name:s,definition:a,source:"config"}));return o}var RPe,AM=b(()=>{"use strict";U();We();zf();TM();RPe=5});function APe(e,t=160){let n=e.replace(/\s+/g," ").trim();return n.length<=t?n:n.slice(0,t-1)+"\u2026"}function CM(e){if(e===void 0||e.size===0)return On;let t=[...e.values()].map(n=>`- ${n.name}: ${APe(n.definition.description)}`).join(`
|
|
1325
1325
|
`);return{...On,description:(On.description??"")+`
|
|
1326
1326
|
|
|
@@ -1351,7 +1351,7 @@ ${e}`:e}function ms(e){return Zt(e)?{incomplete:!0,incompleteReason:e}:{}}functi
|
|
|
1351
1351
|
|
|
1352
1352
|
[Subagent output was ${o} bytes \u2014 truncated to ${r} bytes. Full output could not be written to disk.]`,a=Buffer.byteLength(s,"utf8"),l=Math.max(r-a,Math.floor(r*.5));return{content:xr(e,l)+s,capped:!0}}var VV,XV=b(()=>{"use strict";U();no();F();VV=32768});function QV(e,t,n){return!t||!n||t===n?e:`[subagent result \xB7 model=${t} (parent: ${n})]
|
|
1353
1353
|
|
|
1354
|
-
${e}`}var ZV=b(()=>{"use strict"});async function e4(e){let{handle:t,signal:n,prompt:r,backgroundPrompt:o,idPrefix:i,model:s,parentModel:a,childManager:l,identity:c,traceWriter:u,depth:d,parentSessionId:p,registry:f,promotionTriggers:g,activeForegroundHandles:h}=e,y=()=>{t.cancel()};n.addEventListener("abort",y,{once:!0});let w=Date.now(),S=!1,v,x=new Promise(R=>{v=R}),T,E=new Promise(R=>{T=R});g.set(t.id,{fire:v,ready:E}),h.set(t.id,t);let C,_=t.runToResult(r);try{let R=await Promise.race([_.then(O=>({kind:"result",result:O})),x.then(O=>({kind:"promote",queuedNote:O}))]);if(R.kind==="promote")if(f){let O=e.isolationTeardown;try{O&&await Uv(O.repoRoot,O.worktreePath);let W=f.adoptRunning({handle:t,runPromise:_,prompt:o,model:s??"sonnet",provenance:"user",parentSessionId:p,...O?{onCleanup:async()=>{let Y=await ko(O);B(`background worktree teardown: ${JSON.stringify(Y)}`)}}:{}});S=!0,n.removeEventListener("abort",y),T({jobId:W.jobId,label:W.label});let q={status:"running",jobId:W.jobId,subagentId:W.subagentId,label:W.label,message:`Subagent backgrounded by user (jobId=${W.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${W.jobId} remains available for manual replay.`},K=GV(R.queuedNote);return K!==void 0&&await Qy(u,{jobId:W.jobId,subagentId:W.subagentId,byteLength:Buffer.byteLength(K,"utf8")}),{content:JSON.stringify(q),...K!==void 0?{harnessUserMessage:{kind:"queued_user_message",text:K}}:{}}}catch(W){if(B("subagent-executor: promotion failed, staying foreground: "+(W instanceof Error?W.message:String(W))),O)try{await LV(O.repoRoot,O.worktreePath)}catch(q){B(`[isolation] failed to unlock worktree after promotion failure: ${String(q)}`)}T(null)}}else T(null);let P=R.kind==="result"?R.result:await _;if(P.status==="succeeded"&&P.message){let O=P.message.content,W=typeof O=="string"?O:JSON.stringify(O),q=P.trace;ju({...c,event:"subagent.completed",subagent_id:t.id,parent_session_id:p,status:P.status,duration_ms:Date.now()-w,content_chars:W.length,stop_reason:ni(P.stopReason),depth:d,tool_call_count:q?.toolCalls.length,thinking_present:q?.thinkingPresent,tool_names:q?.toolCalls.length?JSON.stringify([...new Set(q.toolCalls.map(
|
|
1354
|
+
${e}`}var ZV=b(()=>{"use strict"});async function e4(e){let{handle:t,signal:n,prompt:r,backgroundPrompt:o,idPrefix:i,model:s,parentModel:a,childManager:l,identity:c,traceWriter:u,depth:d,parentSessionId:p,registry:f,promotionTriggers:g,activeForegroundHandles:h}=e,y=()=>{t.cancel()};n.addEventListener("abort",y,{once:!0});let w=Date.now(),S=!1,v,x=new Promise(R=>{v=R}),T,E=new Promise(R=>{T=R});g.set(t.id,{fire:v,ready:E}),h.set(t.id,t);let C,_=t.runToResult(r);try{let R=await Promise.race([_.then(O=>({kind:"result",result:O})),x.then(O=>({kind:"promote",queuedNote:O}))]);if(R.kind==="promote")if(f){let O=e.isolationTeardown;try{O&&await Uv(O.repoRoot,O.worktreePath);let W=f.adoptRunning({handle:t,runPromise:_,prompt:o,model:s??"sonnet",provenance:"user",parentSessionId:p,...O?{onCleanup:async()=>{let Y=await ko(O);B(`background worktree teardown: ${JSON.stringify(Y)}`)}}:{}});S=!0,n.removeEventListener("abort",y),T({jobId:W.jobId,label:W.label,sharesWorktree:!O});let q={status:"running",jobId:W.jobId,subagentId:W.subagentId,label:W.label,message:`Subagent backgrounded by user (jobId=${W.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${W.jobId} remains available for manual replay.`},K=GV(R.queuedNote);return K!==void 0&&await Qy(u,{jobId:W.jobId,subagentId:W.subagentId,byteLength:Buffer.byteLength(K,"utf8")}),{content:JSON.stringify(q),...K!==void 0?{harnessUserMessage:{kind:"queued_user_message",text:K}}:{}}}catch(W){if(B("subagent-executor: promotion failed, staying foreground: "+(W instanceof Error?W.message:String(W))),O)try{await LV(O.repoRoot,O.worktreePath)}catch(q){B(`[isolation] failed to unlock worktree after promotion failure: ${String(q)}`)}T(null)}}else T(null);let P=R.kind==="result"?R.result:await _;if(P.status==="succeeded"&&P.message){let O=P.message.content,W=typeof O=="string"?O:JSON.stringify(O),q=P.trace;ju({...c,event:"subagent.completed",subagent_id:t.id,parent_session_id:p,status:P.status,duration_ms:Date.now()-w,content_chars:W.length,stop_reason:ni(P.stopReason),depth:d,tool_call_count:q?.toolCalls.length,thinking_present:q?.thinkingPresent,tool_names:q?.toolCalls.length?JSON.stringify([...new Set(q.toolCalls.map(ie=>ie.name))]):void 0});let K=QV(Nr(W,P.stopReason),s,a),{content:H,capped:Y}=YV(K,p,t.id);return C={content:H,...ms(P.stopReason),...Y?{truncated:!0}:{}},C}let I=P.error?.message??"Subagent failed with no output",$=P.trace;ju({...c,event:"subagent.failed",subagent_id:t.id,id_prefix:i,parent_session_id:p,status:P.status,duration_ms:Date.now()-w,error_message:ti(I),schema_error:P.schemaError?ti(P.schemaError.message):void 0,partial_output_chars:NM(P.partialOutput),stop_reason:ni(P.stopReason),depth:d,tool_call_count:$?.toolCalls.length,thinking_present:$?.thinkingPresent,tool_names:$?.toolCalls.length?JSON.stringify([...new Set($.toolCalls.map(O=>O.name))]):void 0});let j=fV({status:P.status,errorMessage:I,schemaErrorMessage:P.schemaError?.message,partialOutput:P.partialOutput,subagentId:t.id});return C={content:JSON.stringify(j),isError:!0,...ms(P.stopReason)},C}catch(R){let P=R instanceof Error?R.message:String(R);throw ju({...c,event:"subagent.failed",subagent_id:t.id,id_prefix:i,parent_session_id:p,status:"failed",duration_ms:Date.now()-w,error_message:ti(P),depth:d}),R}finally{if(g.delete(t.id),h.delete(t.id),T(null),!S){n.removeEventListener("abort",y),await l?.teardownAll(),await t.teardown({deferInjectContextToCaller:!0});let R=t.getLastStopInjectContext?.();if(bv(C,R),e.isolationTeardown){let{repoRoot:P,worktreePath:I}=e.isolationTeardown,$=await Dw({repoRoot:P,worktreePath:I});$.preserved&&B(`[isolation] preserved worktree ${I} (${$.reason?RP($.reason):"unknown"}) \u2014 locked so the sweep will not reap it; recover via the worktree tool`)}}}}var t4=b(()=>{"use strict";vt();me();fe();Mv();pM();qV();XV();cf();jv();ZV()});function wIe(e){return e.isError===!0&&e.incompleteReason===Ku}async function n4(e){let t=e.maxRedispatch??yIe,n=e.delayMs??bIe,r=await e.dispatch(0);for(let o=1;o<=t;o+=1){if(!wIe(r)||e.signal.aborted||e.canRedispatch!==void 0&&!e.canRedispatch()||(n>0&&await ln(n,e.signal),e.signal.aborted)||e.canRedispatch!==void 0&&!e.canRedispatch())return r;e.onRedispatch?.(o),r=await e.dispatch(o)}return r}var yIe,bIe,r4=b(()=>{"use strict";Qi();vt();yIe=1,bIe=1e3});function gs(e,t){for(let n of t??[])e.push({type:"image",source:{type:"base64",media_type:n.mediaType,data:n.bytes.toString("base64")}})}var Vf=b(()=>{"use strict"});import{readFile as SIe,stat as vIe}from"node:fs/promises";import{extname as kIe,isAbsolute as TIe}from"node:path";function i4(){return new Error(`Agent tool image attachments exceed the ${KM} byte (5 MiB) total limit`)}async function s4(e){if(e.paths.length>o4)throw new Error(`Agent tool supports at most ${o4} image attachments per dispatch`);let t={...e.resolveBase!==void 0?{resolveBase:e.resolveBase}:{},...e.readRoots!==void 0?{readRoots:e.readRoots}:{}},n=[],r=0;for(let o of e.paths){let i;if(!TIe(o)&&(i=e.sessionId===void 0?void 0:e.registry?.get(e.sessionId,o),i===void 0)){let d=e.sessionId===void 0?[]:e.registry?.listIds(e.sessionId)??[];throw new Error(`Unknown inbound image id ${JSON.stringify(o)}; available ids for this session: `+(d.length>0?d.join(", "):"(none)"))}let s=i?.path??o,a=i?.mediaType??xIe.get(kIe(s).toLowerCase());if(a===void 0)throw new Error(`Unsupported image attachment ${JSON.stringify(o)}; expected .jpg, .jpeg, .png, .gif, or .webp`);let l=i===void 0?rt(s,t,"read"):s;if(r+(await vIe(l)).size>KM)throw i4();let u=await SIe(l);if(r+=u.byteLength,r>KM)throw i4();n.push({mediaType:a,bytes:u})}return n}var o4,KM,xIe,a4=b(()=>{"use strict";Bt();o4=8,KM=5*1024*1024,xIe=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".gif","image/gif"],[".webp","image/webp"]])});import{createHash as EIe}from"node:crypto";import{mkdir as RIe,writeFile as AIe}from"node:fs/promises";import{join as CIe}from"node:path";function IIe(e){return EIe("sha256").update(e).digest("hex")}function MIe(e,t,n){let r=Math.max(1,Math.round(n/1024));return`[image ${e} \xB7 ${t} \xB7 ${r} KB]`}async function Hv(e,t,n,r=el){for(let o of n){let i=await r.put(t,o.bytes,o.mediaType);e.push({type:"text",text:MIe(i.id,i.mediaType,i.sizeBytes)}),gs(e,[o])}}function OIe(e){switch(e){case"image/jpeg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp"}}var _Ie,PIe,GM,el,zu=b(()=>{"use strict";U();Vf();_Ie=6,PIe=new Map;GM=class{constructor(t=PIe,n=IIe){this.entries=t;this.hashBytes=n}entries;hashBytes;get(t,n){return this.entries.get(t)?.get(n)}listIds(t){return[...this.entries.get(t)?.keys()??[]].sort()}clear(t){this.entries.delete(t)}async put(t,n,r){let o=this.hashBytes(n),i=this.entries.get(t)??new Map;this.entries.set(t,i);let s=_Ie,a=0;for(;;){let l=`img_${o.slice(0,s)}`,c=a===0?l:`${l}_${a}`,u=i.get(c);if(u===void 0){let d=gy(t);await RIe(d,{recursive:!0});let p=CIe(d,`${c}${OIe(r)}`);await AIe(p,n);let f={path:p,mediaType:r,sizeBytes:n.byteLength,digest:o};return i.set(c,f),{id:c,...f}}if(u.mediaType===r&&u.digest===o)return{id:c,...u};s<o.length?s=Math.min(o.length,s+2):a+=1}}};el=new GM});function l4(e,t,n,r,o,i){let s="";return t&&!i(e)&&(s+=`WARNING: child model ${e} is not vision-capable; attached images were dropped.
|
|
1355
1355
|
|
|
1356
1356
|
`),!o&&n!==void 0&&$Ie.test(r)&&(s+=`WARNING: ${n} is read-only \u2014 write instructions were ignored. Findings are in the message below, not a file. Use a general-purpose agent when the task requires file output.
|
|
1357
1357
|
|
|
@@ -1374,7 +1374,7 @@ ${n}`:n}}}return{...e,systemPrompt:n}}var R4=b(()=>{"use strict"});function Xf()
|
|
|
1374
1374
|
${gMe(W)}`,artifacts:W,runPrompt:`Inspect every ${O} listed in the artifact section.`})}if(u.runHookInspector){let O=f.hook;if(O){let W=u0(be(),"settings.json"),q=yY(W);x.push({type:"hook",prompt:`${O}
|
|
1375
1375
|
${hMe(W,q)}`,artifacts:[],runPrompt:`Inspect every hook listed in the Discovered hooks section. Settings file: ${W}.`})}}let T=[];if(x.length>0){let O=await Promise.all(x.map(K=>w.forkSubagent({parent:{sessionId:d},config:{model:o,systemPrompt:`${bo.systemPrompt}
|
|
1376
1376
|
|
|
1377
|
-
${K.prompt}`,canUseTool:v()},idPrefix:`inspector-${K.type}`,agentType:`inspector-${K.type}`,outputSchema:Xe.array(kY),...i?{parentId:i}:{}}))),W=await uY(x.map((K,H)=>{let Y=O[H];if(!Y)throw new Error(`audit-fit: missing handle for ${K.type} inspector`);return{handle:Y,prompt:K.runPrompt}}),{failFast:!1}),q=[];for(let K=0;K<W.length;K++){let H=W[K],Y=x[K];if(!Y)continue;let
|
|
1377
|
+
${K.prompt}`,canUseTool:v()},idPrefix:`inspector-${K.type}`,agentType:`inspector-${K.type}`,outputSchema:Xe.array(kY),...i?{parentId:i}:{}}))),W=await uY(x.map((K,H)=>{let Y=O[H];if(!Y)throw new Error(`audit-fit: missing handle for ${K.type} inspector`);return{handle:Y,prompt:K.runPrompt}}),{failFast:!1}),q=[];for(let K=0;K<W.length;K++){let H=W[K],Y=x[K];if(!Y)continue;let ie=yMe(Y.type,H);if(ie.kind==="failure"){q.push(ie.message);continue}let M=new Map;for(let N of Y.artifacts)M.set(N.path,N.source);for(let N of ie.output){if(Y.type==="hook"){if(N.source!=="user"){q.push(`${Y.type}: hook verdict has source=${N.source} (must be 'user')`);continue}}else{let Q=M.get(N.path);if(Q===void 0){q.push(`${Y.type}: verdict for unknown path ${N.path} (not in discovered list)`);continue}if(N.source!==Q){q.push(`${Y.type}: verdict source mismatch for ${N.path} (expected ${Q}, got ${N.source})`);continue}}T.push(N)}}if(q.length>0){let K=q.map(H=>` - ${H}`).join(`
|
|
1378
1378
|
`);throw new Error(`audit-fit: ${q.length} inspector failure(s):
|
|
1379
1379
|
${K}`)}}let{inventory:E,misfits:C}=mMe(T),_=0;if(l){let O=EA();await wY(O,{recursive:!0});for(let W of C.filter(fMe)){let q=W.path.replace(/[^a-z0-9]+/gi,"-").toLowerCase().slice(0,30),K=u0(O,`audit-fit-${q}.md`),H=`---
|
|
1380
1380
|
theme: audit-fit
|
|
@@ -1398,7 +1398,7 @@ ${W.rationale}
|
|
|
1398
1398
|
|
|
1399
1399
|
---
|
|
1400
1400
|
Generated by audit-fit on ${new Date().toISOString().split(".")[0]}Z
|
|
1401
|
-
`;await SY(K,H),_++}}let R=Tt();await wY(R,{recursive:!0});let P=O=>{let W=0;for(let q of Object.values(O))for(let K of Object.values(q))W+=K;return W},I=O=>{let W=E.user[O]??{},q=E.plugin[O]??{},K=H=>Object.values(H).reduce((Y,
|
|
1401
|
+
`;await SY(K,H),_++}}let R=Tt();await wY(R,{recursive:!0});let P=O=>{let W=0;for(let q of Object.values(O))for(let K of Object.values(q))W+=K;return W},I=O=>{let W=E.user[O]??{},q=E.plugin[O]??{},K=H=>Object.values(H).reduce((Y,ie)=>Y+ie,0);return K(W)+K(q)},$={timestamp:new Date().toISOString(),surface:"afk",scope:c,total_artifacts:T.length,misfits_count:C.length,briefs_written:_,by_source:{user:P(E.user),plugin:P(E.plugin)},by_type:{skill:I("skill"),command:I("command"),agent:I("agent"),hook:I("hook")}},j=u0(R,"audit-fit-telemetry.jsonl");return await SY(j,JSON.stringify($)+`
|
|
1402
1402
|
`),{inventory:E,misfits:C,briefs_written:_,total_artifacts:T.length}}var kY,vY,DTt,uMe,dMe,TY,wMe,xY=b(()=>{"use strict";lr();Xt();Ka();St();dY();wM();mY();U();bY();kY=Xe.object({path:Xe.string(),type:Xe.enum(["skill","command","agent","hook"]),source:Xe.enum(["user","plugin"]),plugin_key:Xe.string().optional(),verdict:Xe.enum(["correct","misfit","outlier"]),recommended_type:Xe.string(),rationale:Xe.string(),confidence:Xe.enum(["high","med","low"])}),vY=Xe.record(Xe.string(),Xe.record(Xe.string(),Xe.number())),DTt=Xe.object({inventory:Xe.object({user:vY,plugin:vY}),misfits:Xe.array(kY),briefs_written:Xe.number(),total_artifacts:Xe.number()}),uMe=Xe.object({writeBriefs:Xe.boolean().optional(),scope:Xe.enum(["user","plugin","all"]).optional()}),dMe=["skill","command","agent"],TY=["skill","command","agent","hook"];wMe={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:bMe,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"],audience:"internal",category:"Review & verify"};vn(wMe)});async function SMe(){throw new Error("get-started is a load skill; its handler should never be called directly. Invoke via the `skill` tool or `/get-started` slash command.")}var vMe,EY=b(()=>{"use strict";Xt();vMe={name:"get-started",description:"Guided first-run onboarding for AFK. Runs a preflight check (git repo, model provider, AFK.md, Exa/Telegram/service config), asks the user their name and gives a brief intro, detects importable Claude Code / Codex assets and offers `afk migrate`, walks optional capability setup (Exa Search, Telegram via /telegram-setup, background service via /service-setup), then recommends /init to generate project context and /clear to start fresh \u2014 ending by routing the user to their first task. Runs interactively in the current session.",handler:SMe,context:"load",audience:"public",whenToUse:"When someone is setting up AFK for the first time or asks how to get going \u2014 triggers on `/get-started`, 'how do I start', 'set me up', 'onboard me', or a fresh install with no AFK.md and unconfigured capabilities. Best run in the interactive REPL.",category:"Setup & ops"};vn(vMe)});async function RY(e,t,n,r,o="sonnet",i,s,a){let c=it("mint")["spec.md"];if(!c)throw new Error("mint skill missing spec.md prompt");let p=await(await new ke({...n!==void 0?{cwd:n}:{},...i!==void 0?{parentReadRoots:i}:{},...s!==void 0?{traceWriter:s}:{},...a!==void 0?{workspaceStore:a}:{}}).forkSubagent({parent:{sessionId:t},config:{model:o,systemPrompt:c,apiKey:Ne(o)},idPrefix:"mint-spec",agentType:"mint-spec",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Create a detailed specification for: ${e}`);if(p.status!=="succeeded"||!p.message)throw new Error(`spec phase failed: ${en(p)}`);if(Zt(p.stopReason))throw new Error(`spec phase returned an incomplete result (stopReason=${p.stopReason})`);return p.message.content}var AY=b(()=>{"use strict";St();vt();Pt();lr()});async function CY(e,t,n,r,o="sonnet",i,s,a){let c=it("mint")["research.md"];if(!c)throw new Error("mint skill missing research.md prompt");let p=await(await new ke({...n!==void 0?{cwd:n}:{},...i!==void 0?{parentReadRoots:i}:{},...s!==void 0?{traceWriter:s}:{},...a!==void 0?{workspaceStore:a}:{}}).forkSubagent({parent:{sessionId:t},config:{model:o,systemPrompt:c,apiKey:Ne(o)},idPrefix:"mint-research",agentType:"mint-research",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Gather context and research for this specification:
|
|
1403
1403
|
|
|
1404
1404
|
${e}`);if(p.status!=="succeeded"||!p.message)throw new Error(`research phase failed: ${en(p)}`);if(Zt(p.stopReason))throw new Error(`research phase returned an incomplete result (stopReason=${p.stopReason})`);return p.message.content}var _Y=b(()=>{"use strict";St();vt();Pt();lr()});async function PY(e,t,n,r,o,i="sonnet",s,a,l){let u=it("mint")["plan.md"];if(!u)throw new Error("mint skill missing plan.md prompt");let p=await new ke({...r!==void 0?{cwd:r}:{},...s!==void 0?{parentReadRoots:s}:{},...a!==void 0?{traceWriter:a}:{},...l!==void 0?{workspaceStore:l}:{}}).forkSubagent({parent:{sessionId:n},config:{model:i,systemPrompt:u,apiKey:Ne(i)},idPrefix:"mint-plan",agentType:"mint-plan",phaseRole:"read-only",...o?{parentId:o}:{}}),f=`Specification:
|
|
@@ -1467,17 +1467,17 @@ ${t.body}`)}var jMe,h0=b(()=>{"use strict";jMe=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0
|
|
|
1467
1467
|
Skill arguments:
|
|
1468
1468
|
${t}`:i,a=new ke({parentAbortSignal:n?.abortSignal,...r?.traceWriter!==void 0?{traceWriter:r.traceWriter}:{},...r?.workspaceStore!==void 0?{workspaceStore:r.workspaceStore}:{}}),l=r?.callId;return await(await a.forkSubagent({parent:{sessionId:n?.sessionId,getInputStreamRef:n?.getInputStreamRef?.bind(n),abortSignal:n?.abortSignal},config:{model:o,systemPrompt:us(e.body,typeof t=="string"?t:void 0),env:{SKILL_ROOT:e.dir},isSkillDispatch:!0,skillDispatchName:e.name},idPrefix:`user-skill-${e.name}`,agentType:`user-skill-${e.name}`,...l?{parentId:l}:{}})).runToResult(s)}}function zMe(e,t){try{return Ye(e).origin===t?e:`${t}:${e}`}catch{return e}}function ii(e,t){let n;try{n=HMe(e,{withFileTypes:!0})}catch(o){let i=o;return i.code!=="ENOENT"&&process.stderr.write(`[afk] skipping skills dir ${e}: ${i.message}
|
|
1469
1469
|
`),0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let i;try{i=WMe(tX(e,o.name,"SKILL.md"),"utf-8")}catch(c){let u=c;u.code!=="ENOENT"&&process.stderr.write(`[afk] skipping skill ${o.name}: ${u.message}
|
|
1470
|
-
`);continue}let s=GMe(i,o.name);if(!s)continue;s.dir=tX(e,o.name);let l={name:zMe(s.name,t),description:s.description,handler:qMe(s),origin:t};s.argumentHint&&(l.argumentHint=s.argumentHint),s.whenToUse&&(l.whenToUse=s.whenToUse),s.flags&&s.flags.length>0&&(l.flags=s.flags),s.category&&Ef.includes(s.category)&&(l.category=s.category),s.context!=="fork"&&(l.context="load",l.loadBody=s.body.replace(/\$\{?SKILL_ROOT\}?/g,()=>s.dir)),vn(l),r++}return r}function y0(){return ii(lc(),"user")}var nX,b0=b(()=>{"use strict";U();Xt();h0();St();Ka();yv();nX=1024});var w0=b(()=>{"use strict";xY();EY();YY();XY();QY();b0()});import{isAbsolute as JMe,resolve as VMe}from"path";import{pathToFileURL as YMe}from"url";async function oX(e,t={}){let n=t.importer??(r=>import(r));for(let r of e){if(r.main===void 0)continue;let o=JMe(r.main)?r.main:VMe(r.path,r.main);if(!rX.has(o)){rX.add(o);try{let s=(await n(YMe(o).href))?.default;typeof s=="function"&&await s(t.pluginApi)}catch(i){t.onError?.(r,i)}}}}var rX,iX=b(()=>{"use strict";rX=new Set});import{existsSync as XMe,opendirSync as QMe,readFileSync as ZMe,realpathSync as e0e,statSync as t0e}from"fs";import{join as tg}from"path";function r0e(e,t){return JSON.stringify([e,t===void 0?null:[...t].sort()])}function sX(e,t){let n=r0e(e,t),r=ng.get(n);if(r!==void 0)return r;let o=tg(e,"commands");if(!XMe(o))return ng.set(n,[]),[];let i;try{i=e0e(o)}catch{return ng.set(n,[]),[]}let s=[],a=0;function l(c,u,d){if(d>n0e||a>=ak)return;let p;try{p=QMe(c)}catch{return}try{for(;a<ak;){let f=p.readSync();if(f===null)break;a++;let g=f.name;if(g.startsWith(".")){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping dotfile: ${
|
|
1471
|
-
`);continue}if(g.includes(":")){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping path segment with colon: ${
|
|
1472
|
-
`);continue}if(o0e.test(g)){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping path segment with control bytes: ${
|
|
1473
|
-
`);continue}let h=tg(c,g);if(NJ(o,h,i)===void 0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping path outside commands/ tree: ${
|
|
1474
|
-
`);continue}let y;try{y=t0e(h)}catch{continue}if(y.isDirectory()){l(h,[...u,g],d+1);continue}if(!y.isFile()||!g.endsWith(".md")){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping non-markdown entry: ${
|
|
1475
|
-
`);continue}let w=g.slice(0,-3);if(w.length===0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping command with empty basename: ${
|
|
1470
|
+
`);continue}let s=GMe(i,o.name);if(!s)continue;s.dir=tX(e,o.name);let l={name:zMe(s.name,t),description:s.description,handler:qMe(s),origin:t};s.argumentHint&&(l.argumentHint=s.argumentHint),s.whenToUse&&(l.whenToUse=s.whenToUse),s.flags&&s.flags.length>0&&(l.flags=s.flags),s.category&&Ef.includes(s.category)&&(l.category=s.category),s.context!=="fork"&&(l.context="load",l.loadBody=s.body.replace(/\$\{?SKILL_ROOT\}?/g,()=>s.dir)),vn(l),r++}return r}function y0(){return ii(lc(),"user")}var nX,b0=b(()=>{"use strict";U();Xt();h0();St();Ka();yv();nX=1024});var w0=b(()=>{"use strict";xY();EY();YY();XY();QY();b0()});import{isAbsolute as JMe,resolve as VMe}from"path";import{pathToFileURL as YMe}from"url";async function oX(e,t={}){let n=t.importer??(r=>import(r));for(let r of e){if(r.main===void 0)continue;let o=JMe(r.main)?r.main:VMe(r.path,r.main);if(!rX.has(o)){rX.add(o);try{let s=(await n(YMe(o).href))?.default;typeof s=="function"&&await s(t.pluginApi)}catch(i){t.onError?.(r,i)}}}}var rX,iX=b(()=>{"use strict";rX=new Set});import{existsSync as XMe,opendirSync as QMe,readFileSync as ZMe,realpathSync as e0e,statSync as t0e}from"fs";import{join as tg}from"path";function r0e(e,t){return JSON.stringify([e,t===void 0?null:[...t].sort()])}function sX(e,t){let n=r0e(e,t),r=ng.get(n);if(r!==void 0)return r;let o=tg(e,"commands");if(!XMe(o))return ng.set(n,[]),[];let i;try{i=e0e(o)}catch{return ng.set(n,[]),[]}let s=[],a=0;function l(c,u,d){if(d>n0e||a>=ak)return;let p;try{p=QMe(c)}catch{return}try{for(;a<ak;){let f=p.readSync();if(f===null)break;a++;let g=f.name;if(g.startsWith(".")){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping dotfile: ${le(tg(c,g))}
|
|
1471
|
+
`);continue}if(g.includes(":")){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping path segment with colon: ${le(tg(c,g))}
|
|
1472
|
+
`);continue}if(o0e.test(g)){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping path segment with control bytes: ${le(tg(c,g))}
|
|
1473
|
+
`);continue}let h=tg(c,g);if(NJ(o,h,i)===void 0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping path outside commands/ tree: ${le(h)}
|
|
1474
|
+
`);continue}let y;try{y=t0e(h)}catch{continue}if(y.isDirectory()){l(h,[...u,g],d+1);continue}if(!y.isFile()||!g.endsWith(".md")){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping non-markdown entry: ${le(h)}
|
|
1475
|
+
`);continue}let w=g.slice(0,-3);if(w.length===0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping command with empty basename: ${le(h)}
|
|
1476
1476
|
`);continue}let S=[...u,w].join(":"),v=bM(h,t);if(!v.body)try{let x=wv(ZMe(h,"utf-8"));x.startsWith(`---
|
|
1477
|
-
`)||(v.body=x.trim())}catch{continue}if(!v.body||v.body.length===0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping command with empty body: ${
|
|
1478
|
-
`);continue}s.push({...v,name:S,origin:"command"})}}finally{p.closeSync()}a>=ak&&k.AFK_DEBUG&&process.stderr.write(`[afk] commands walk: MAX_ENTRIES (${ak}) reached in ${
|
|
1477
|
+
`)||(v.body=x.trim())}catch{continue}if(!v.body||v.body.length===0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping command with empty body: ${le(h)}
|
|
1478
|
+
`);continue}s.push({...v,name:S,origin:"command"})}}finally{p.closeSync()}a>=ak&&k.AFK_DEBUG&&process.stderr.write(`[afk] commands walk: MAX_ENTRIES (${ak}) reached in ${le(o)}
|
|
1479
1479
|
`)}return l(o,[],0),s.sort((c,u)=>c.name<u.name?-1:c.name>u.name?1:0),ng.set(n,s),s}var n0e,ak,ng,o0e,aX=b(()=>{"use strict";Bu();mM();F();We();Fr();n0e=10,ak=1e3,ng=new Map;kv(()=>ng.clear());o0e=/[\u0000-\u001F\u007F-\u009F]/});import{existsSync as i0e,readFileSync as s0e}from"fs";import{join as a0e}from"path";function si(e){let t=a0e(e,".claude-plugin","plugin.json");if(!i0e(t))return{name:null,version:null};try{let n=JSON.parse(s0e(t,"utf8"));return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():null,version:typeof n.version=="string"&&n.version.trim()?n.version.trim():null}}catch{return{name:null,version:null}}}var rg=b(()=>{"use strict"});import{readFileSync as l0e}from"node:fs";import{join as c0e}from"node:path";function fv(e,t){let n=qa(e,t),r=t?.excludeName,i=(r!==void 0&&r.length>0?n.filter(a=>a.name!==r&&!a.name.endsWith(`:${r}`)):n).filter(a=>a.source!=="command");if(i.length===0)return"";let s=[];for(let a of i){let l=a.argumentHint?`${a.argumentHint}`:"",c=l?`- \`${a.name} ${l}\`: ${a.description}`:`- ${a.name}: ${a.description}`;s.push(c),a.whenToUse&&s.push(` When to use: ${a.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either forks an isolated subagent (delegation \u2014 preserves the main session's context) or loads its instructions directly into your current context for you to execute directly. The mode is fixed per-skill, not per-call. To run a skill N times in parallel with isolation, dispatch N subagents (via `agent` or `compose`) that each call `skill` once. Prefer a skill over inline investigation when the task shape matches.","",...s].join(`
|
|
1480
|
-
`)}function lX(e,t){return[...VJ(e,t),...sX(e,t)]}function qa(e,t){let n=[],r=new Set,o=k.AFK_INTERNAL==="1",i=Ar(Dn());ii(lc(),"user"),nz("project"),ii(Gp(t?.cwd),"project");for(let{dir:l,origin:c}of i.skillRoots)ii(l,c);for(let l of go()){let c=Ye(l);cr(c,o)&&(n.push({name:l,description:c.description,source:c.origin==="user"?"user":c.origin==="project"?"project":c.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:c.argumentHint,whenToUse:c.whenToUse}),r.add(l),l.includes(":")&&r.add(l.split(":").pop()))}let s=e??lk(t),a=Ev();for(let l of s){if(l.type!=="local")continue;let c=lX(l.path,a);for(let u of c)!u.name||r.has(u.name)||cr({audience:u.audience},o)&&(n.push({name:u.name,description:u.description??`Skill from plugin at ${l.path}`,source:u.origin==="command"?"command":"plugin",argumentHint:u.argumentHint,whenToUse:u.whenToUse}),r.add(u.name))}return n}function Yf(e,t){let n=new Map,r=e??lk(t),o=Ev();for(let i of r){if(i.type!=="local")continue;let s=lX(i.path,o);for(let a of s)a.name&&a.body&&a.body.length>0&&!n.has(a.name)&&n.set(a.name,{body:a.body,pluginPath:i.path,...a.allowedTools!==void 0?{allowedTools:a.allowedTools}:{},...a.context!==void 0?{context:a.context}:{},...a.readOnly===!0?{readOnly:!0}:{},...a.model!==void 0?{model:a.model}:{}})}return n}function cX(e,t=()=>{}){let n=e??lk(),r=[],o=new Set;for(let i of n){if(i.type!=="local")continue;let s=si(i.path).name;if(s!==null)for(let a of Cv(c0e(i.path,"agents"))){let l=
|
|
1480
|
+
`)}function lX(e,t){return[...VJ(e,t),...sX(e,t)]}function qa(e,t){let n=[],r=new Set,o=k.AFK_INTERNAL==="1",i=Ar(Dn());ii(lc(),"user"),nz("project"),ii(Gp(t?.cwd),"project");for(let{dir:l,origin:c}of i.skillRoots)ii(l,c);for(let l of go()){let c=Ye(l);cr(c,o)&&(n.push({name:l,description:c.description,source:c.origin==="user"?"user":c.origin==="project"?"project":c.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:c.argumentHint,whenToUse:c.whenToUse}),r.add(l),l.includes(":")&&r.add(l.split(":").pop()))}let s=e??lk(t),a=Ev();for(let l of s){if(l.type!=="local")continue;let c=lX(l.path,a);for(let u of c)!u.name||r.has(u.name)||cr({audience:u.audience},o)&&(n.push({name:u.name,description:u.description??`Skill from plugin at ${l.path}`,source:u.origin==="command"?"command":"plugin",argumentHint:u.argumentHint,whenToUse:u.whenToUse}),r.add(u.name))}return n}function Yf(e,t){let n=new Map,r=e??lk(t),o=Ev();for(let i of r){if(i.type!=="local")continue;let s=lX(i.path,o);for(let a of s)a.name&&a.body&&a.body.length>0&&!n.has(a.name)&&n.set(a.name,{body:a.body,pluginPath:i.path,...a.allowedTools!==void 0?{allowedTools:a.allowedTools}:{},...a.context!==void 0?{context:a.context}:{},...a.readOnly===!0?{readOnly:!0}:{},...a.model!==void 0?{model:a.model}:{}})}return n}function cX(e,t=()=>{}){let n=e??lk(),r=[],o=new Set;for(let i of n){if(i.type!=="local")continue;let s=si(i.path).name;if(s!==null)for(let a of Cv(c0e(i.path,"agents"))){let l=le(a),c;try{c=l0e(a,"utf8")}catch(p){let f=le(p instanceof Error?p.message:String(p));t(`[afk] agents: cannot read ${l}: ${f}`);continue}let u=Va(c,p=>t(`[afk] agents: ${l}: ${p}`));if(u===void 0)continue;let d=`${s}:${u.name}`;o.has(d)||(o.add(d),r.push({name:d,definition:u.definition,source:`plugin:${s}`,filePath:a,...u.bashReadOnly===!0?{bashReadOnly:!0}:{},...u.ignoredKeys!==void 0?{ignoredKeys:u.ignoredKeys}:{}}))}}return r}function lk(e){return[...Lr(qp(e?.cwd)),...Lr(),...Lr(Zs()),...Ar(Dn()).pluginRoots.flatMap(({dir:t,binary:n})=>Lr(t,{trustAll:!0,sourceEnabled:AW(n)}))]}async function td(){await oX(lk(),{pluginApi:{registerSkill:vn,listSkills:go,getSkill:Ye,loadSkillPrompts:it,env:k,SubagentManager:ke,describeFailure:en,discoverPluginSkillBodies:Yf,getAgentFrameworkDir:Tt,getSkillsDir:lc,getSessionsDir:Le,getOrDeriveFacet:Yo,listSessionIds:Ua,deriveSessionFacet:Sf,loadStoredSession:cS}})}var Mr=b(()=>{"use strict";w0();Xt();lr();b0();Fr();iX();Bu();aX();rg();zf();AM();We();St();vt();uS();U();F();qo()});function nd(e,t,n){let r=Pm({cwd:t,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:n.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:n.workspace}),o=[e.toolBase];return e.userSystem&&o.push(e.userSystem),o.push(e.memoryPrompt),e.workspacePrompt.length>0&&o.push(e.workspacePrompt),e.hotMemory.length>0&&o.push(e.hotMemory),o.push(r),e.manifest.length>0&&o.push(e.manifest),o.join(`
|
|
1481
1481
|
|
|
1482
1482
|
`)}var ck=b(()=>{"use strict";Jt()});function uX(e){let{config:t,cwd:n}=e,r=e.hasSkillExecutor?fv(void 0,{cwd:n,...typeof t.skillDispatchName=="string"&&t.skillDispatchName.length>0?{excludeName:t.skillDispatchName}:{}}):"",o=IS(t.isSkillDispatch),i=MS(e.readOnlyMemory),s=OS(e.workspaceEnabled),a={surface:e.surface,sessionId:t.sessionId,depth:t.depth,maxDepth:t.maxDepth,workspace:e.runtimeStateSource.getWorkspace()},l={toolBase:o,memoryPrompt:i,workspacePrompt:s,hotMemory:t.hotMemory??"",manifest:r,userSystem:e.userSystem};return{stableSystemPrefix:l,toolSystemAppend:nd(l,n,a)}}var dX=b(()=>{"use strict";Mr();RI();ck()});import u0e from"@anthropic-ai/sdk";function pX(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 mX(e,t,n,r){let o=t.config,{localMode:i,token:s}=Cq(o);if(!s||s.length===0)throw new Error(`${n} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let a=Zy(s),{client:l,throttleQueue:c,systemPrefix:u,tokenRefresher:d}=Wq({config:o,token:s,authMode:a,localMode:i,factory:e.providerFactory??wS(),createClient:R=>new u0e(R)}),p=pX(o.systemPrompt),f=typeof o.model=="string"&&o.model.length>0?Lt(o.model)??o.model:r,g=lb(o,f),h=o.permissionMode??"default";e.setCurrentPermissionMode(h),e.ensureSharedRoots(o.cwd),o.cwd&&e.setCurrentCwd(o.cwd);let y=e.getSharedReadRoots(),w=e.getSharedWriteRoots();o.readRoots&&y&&y.length<=1&&(y.length=0,y.push(...o.readRoots)),o.writeRoots&&w&&w.length<=1&&(w.length=0,w.push(...o.writeRoots));let{queryDispatcher:S,runtimeStateSource:v,toolDefs:x,resolvedSessionId:T}=Zq({config:o,model:f,permissionMode:h,surface:e.surface,providerName:n,externalTools:e.externalTools,sharedReadRoots:y,sharedWriteRoots:w,getCwd:()=>e.getCurrentCwd()||o.cwd||process.cwd(),getMcpTools:()=>e.mcpManager?.getMcpTools()??[],getSubagents:()=>e.subagentExecutor?e.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]},getMintedSessionId:()=>e.getMintedSessionId(),setMintedSessionId:R=>{e.setMintedSessionId(R)},getPresenceSessionId:()=>e.getPresenceSessionId(),setPresenceSessionId:R=>{e.setPresenceSessionId(R)},buildDispatcher:(R,P)=>e.buildDispatcher(R,P)}),E=o.cwd||process.cwd(),{stableSystemPrefix:C,toolSystemAppend:_}=uX({config:o,cwd:E,surface:e.surface,readOnlyMemory:e.readOnlyMemory,workspaceEnabled:e.workspaceStore!==void 0,hasSkillExecutor:!!e.skillExecutor,runtimeStateSource:v,userSystem:p});return _U({prompt:t.prompt,options:{model:f,maxTokens:g,system:_},provenance:{systemPrompt:{source:o.systemPromptSource??"none",shape:typeof o.systemPrompt=="string"?"string":Array.isArray(o.systemPrompt)?"string[]":o.systemPrompt!=null?"preset":"undefined",...typeof o.systemPrompt=="string"?{length:o.systemPrompt.length}:{}},...o.apiKey?{apiKey:{source:"config"}}:{}}}),{client:l,authMode:a,localMode:i,model:f,maxTokens:g,cwd:E,systemPrefix:u,throttleQueue:c,tokenRefresher:d,queryDispatcher:S,runtimeStateSource:v,toolDefs:x,resolvedSessionId:T,stableSystemPrefix:C,toolSystemAppend:_}}var S0=b(()=>{"use strict";da();Xn();db();_q();SS();Kq();ez();dX();Bo()});function fX(e){let t=e.initialUsageInputTokens!==void 0&&e.initialUsageInputTokens>0?{inputTokens:e.initialUsageInputTokens,stopReason:null,resultSubtype:"success",isError:!1}:null;return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:t,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var gX=b(()=>{"use strict"});function og(e){if(typeof e?.baseUrl=="string"&&e.baseUrl.length>0)return!1;let t=k.AFK_DISABLE_PROMPT_CACHE;if(t===void 0||t.length===0)return!0;let n=t.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function ol(){let e=k.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":e==="1h"?"1h":d0e}function uk(e){return og(e)&&ol()==="1h"}function hX(e,t){if(e.length===0)return e;let n=e[e.length-1],r=bX(n,t);return r===n?e:[...e.slice(0,-1),r]}function yX(e,t){if(e.length===0)return e;let n=e[e.length-1],r=p0e(n,t);return r===n?e:[...e.slice(0,-1),r]}function p0e(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=bX(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function bX(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}var d0e,rd=b(()=>{"use strict";F();d0e="1h"});var v0=b(()=>{"use strict";Hi()});function b0e(e){let t=n=>n===void 0?void 0:n*k0;return{inputPerMTok:e.inputPerMTok*k0,outputPerMTok:e.outputPerMTok*k0,...t(e.cacheWrite5mPerMTok)!==void 0?{cacheWrite5mPerMTok:t(e.cacheWrite5mPerMTok)}:{},...t(e.cacheWrite1hPerMTok)!==void 0?{cacheWrite1hPerMTok:t(e.cacheWrite1hPerMTok)}:{},...t(e.cacheReadPerMTok)!==void 0?{cacheReadPerMTok:t(e.cacheReadPerMTok)}:{}}}function w0e(e){return e.responseSpeed??e.requestSpeed??"standard"}function S0e(e){return Au(e,wX,h0e)}function T0(e,t,n,r,o,i,s={}){let a=S0e(e);if(!a)return;let l=w0e(s)==="fast"&&y0e.test(e)?b0e(a):a,c=1e6,u=un(t),d=un(n),p=un(r),f=un(o),g=u/c*l.inputPerMTok,h=d/c*l.outputPerMTok,y=l.cacheWrite5mPerMTok??l.inputPerMTok*m0e,w=l.cacheWrite1hPerMTok??l.inputPerMTok*f0e,S=l.cacheReadPerMTok??l.inputPerMTok*g0e,v=i??{ephemeral5m:f,ephemeral1h:0},x=un(v.ephemeral5m),T=un(v.ephemeral1h),E=Math.max(0,f-(x+T)),C=x/c*y+T/c*w+E/c*w,_=p/c*S;return g+h+C+_}var m0e,f0e,g0e,wX,h0e,k0,y0e,x0=b(()=>{"use strict";FS();m0e=1.25,f0e=2,g0e=.1,wX=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-opus-4-8",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-opus-4-7",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-opus-4-6",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-sonnet-4-6",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWrite5mPerMTok:1,cacheWrite1hPerMTok:1.6,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWrite5mPerMTok:18.75,cacheWrite1hPerMTok:30,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWrite5mPerMTok:.3,cacheWrite1hPerMTok:.5,cacheReadPerMTok:.03}]]),h0e=/-\d{8}$/,k0=2,y0e=/^claude-opus-(?:5|4-8)(?:-|$)/});function v0e(e){let t=e.speed;return t==="fast"||t==="standard"?t:void 0}function k0e(e){let t=o=>Number.isFinite(o)&&o>=0?o:0,n=e.cache_creation;if(n)return{ephemeral5m:t(n.ephemeral_5m_input_tokens??0),ephemeral1h:t(n.ephemeral_1h_input_tokens??0)};let r=t(e.cache_creation_input_tokens??0);return ol()==="1h"?{ephemeral5m:0,ephemeral1h:r}:{ephemeral5m:r,ephemeral1h:0}}function E0(e,t,n,r){if(!e)return{stopReason:t??null};let o=v0e(e),i={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null,raw:{...e,...o?{speed:o}:{}}};if(e.cache_read_input_tokens!=null&&(i.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(i.cacheCreationTokens=e.cache_creation_input_tokens),i.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let s=T0(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0,k0e(e),{...r?{requestSpeed:r}:{},...o?{responseSpeed:o}:{}});s!==void 0&&(i.totalCostUsd=s)}return i}var SX=b(()=>{"use strict";rd();x0()});var R0=b(()=>{"use strict";x0();SX();AI()});function ig(e){return e>2147483647?2147483647:e}var A0=b(()=>{"use strict"});function kX(){let e=k.AFK_MODEL_TTFB_TIMEOUT_MS;if(e===void 0||e.trim()==="")return vX;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?vX:ig(t)}function TX(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?void 0:(e<E0e?e:R0e)+x0e}function xX(e,t){if(t<=0)return{signal:e,timedOut:()=>!1,firstByteSeen:()=>{},extend:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([e,n.signal]),o=!1,i=!1,s=Date.now()+t,a,l=d=>{a=setTimeout(()=>{o=!0,n.abort(new Error(T0e))},ig(d)),a.unref()};l(t);let c=()=>{i||(i=!0,clearTimeout(a))};return{signal:r,timedOut:()=>o,firstByteSeen:c,extend:d=>{i||o||typeof d!="number"||!Number.isFinite(d)||d<=0||(s+=d,clearTimeout(a),l(Math.max(1,s-Date.now())))},dispose:c}}var vX,T0e,x0e,E0e,R0e,C0=b(()=>{"use strict";F();A0();vX=18e4;T0e="model_ttfb_timeout",x0e=3e4,E0e=6e4,R0e=8e3});function RX(){let e=k.AFK_MODEL_STALL_TIMEOUT_MS;if(e===void 0||e.trim()==="")return EX;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?EX:ig(t)}function CX(e){return e instanceof Error&&e.message===AX}function _0(e){return new Error(`Model stream stalled: no output for ${Math.round(e/1e3)}s after the response had already started streaming. The round was aborted rather than left hanging (issue #762: two sessions hung 38 and 63 minutes with no terminal event). A round that keeps producing output is never cut off, no matter how long it runs. Raise AFK_MODEL_STALL_TIMEOUT_MS, or set it to 0 to disable this bound.`)}function _X(e,t,n){if(t<=0)return{signal:e,timedOut:()=>!1,progress:()=>{},dispose:()=>{}};let r=new AbortController,o=AbortSignal.any([e,r.signal]),i,s=!1,a=!1,l=d=>{if(!(a||s)){s=!0,i=void 0;try{n?.({stallTimeoutMs:t,elapsedSinceLastProgressMs:Date.now()-d})}catch{}r.signal.aborted||r.abort(new Error(AX))}};return{signal:o,timedOut:()=>s,progress:()=>{if(a||s)return;i!==void 0&&clearTimeout(i);let d=Date.now(),p=setTimeout(()=>l(d),t);p.unref(),i=p},dispose:()=>{a||(a=!0,i!==void 0&&clearTimeout(i),i=void 0)}}}var EX,AX,dk=b(()=>{"use strict";F();A0();EX=12e5;AX="model_stream_stall_timeout"});function pk(e,t=Math.random){return e+Math.floor(t()*e*P0e)}function IX(e=Math.random){let t=_0e-PX;return PX+Math.floor(e()*t)}function MX(e){return e.type==="turn.completed"&&e.usage.stopReason===Un}function OX(e){let t=k.AFK_OVERLOAD_PAUSE_MS;if(t!==void 0&&t.trim()!==""){let n=Number(t);if(Number.isFinite(n)&&n>=0)return Math.min(Math.floor(n),C0e)}return e!==void 0&&I0e.has(e)?A0e:0}var P0,A0e,C0e,PX,_0e,P0e,I0e,sg=b(()=>{"use strict";F();Wu();Wu();P0="Anthropic is overloaded (HTTP 529) and did not recover within this turn's retry budget. This is an upstream capacity event, not an afk error. The turn was committed, so the conversation so far is preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state once capacity frees up.",A0e=600*1e3,C0e=7200*1e3,PX=60*1e3,_0e=120*1e3,P0e=.25;I0e=new Set(["cli","repl","telegram","web"])});function $X(e){if(!Number.isFinite(e)||e<=0)return 0;let t=Math.floor(e*2/3);return Math.max(1,t)}function DX(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function ag(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}var mk,lg=b(()=>{"use strict";mk=class{overloadRetries=0;streamIncompleteRetries=0;ttfbRetries=0;canRetryOverload(){return this.overloadRetries<3}canRetryStreamIncomplete(){return this.streamIncompleteRetries<2}canRetryTtfb(){return this.ttfbRetries<2}reset(){this.overloadRetries=0,this.streamIncompleteRetries=0,this.ttfbRetries=0}}});async function*O0e(e,t,n){re(e.traceWriter,{phase:"ttfb_timeout",durationMs:Date.now()-t,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:e.model,attempt:n}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId}}async function*M0(e,{input:t,turn:n,retry:r,requestStartedAt:o}){return e==="ttfb"?(r.ttfbRetries+=1,yield*O0e(t,o,r.ttfbRetries),"continue"):e==="overload"?(r.overloadRetries+=1,re(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:r.overloadRetries}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},yield*LX(pk(5e3*Math.pow(2,r.overloadRetries-1)),t,n),t.signal.aborted?"terminated":"continue"):(r.streamIncompleteRetries+=1,re(t.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:r.streamIncompleteRetries}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},yield*LX(1e3*Math.pow(2,r.streamIncompleteRetries-1),t,n),t.signal.aborted?"terminated":"continue")}async function*LX(e,t,n){await ln(e,t.signal),t.signal.aborted&&(yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId})}var FX=b(()=>{"use strict";fe();Qi();sg();lg()});function BX(e){let t=e.fastModeController?.snapshotTurn({resolvedModelId:e.model,providerFamily:"anthropic-direct",hasCustomEndpoint:e.baseUrl!==void 0,executionPath:"top-level"}),n=t?.effective===!0,r=Oi(e.authMode,e.sessionId,e.requestId,e.effort!==void 0,uk(e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{}),n);return{decision:t,runInput:{client:e.client,messages:e.messages,system:e.system,tools:e.tools,toolDispatcher:e.toolDispatcher,model:e.model,maxTokens:e.maxTokens,headers:r,signal:e.signal,ctx:{sessionId:e.sessionId},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},...n?{fastMode:!0}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.softDeadlineMs!==void 0?{softDeadlineMs:e.softDeadlineMs}:{},...e.traceWriter?{traceWriter:e.traceWriter}:{},...e.subagentId!==void 0?{subagentId:e.subagentId}:{},...e.throttleQueue?{throttleQueue:e.throttleQueue}:{},...e.onUsageProgress?{onUsageProgress:e.onUsageProgress}:{},...e.beforeNextRound?{beforeNextRound:e.beforeNextRound}:{}}}}function fk(e,t){let n=e instanceof Error?e:new Error(String(e));if(!t||n.message.startsWith(NX))return n;let r=new Error(`${NX} ${n.message}`,{cause:n});r.name=n.name,n.stack!==void 0&&(r.stack=n.stack);for(let o of Object.getOwnPropertyNames(n)){if(o==="message"||o==="stack")continue;let i=Object.getOwnPropertyDescriptor(n,o);i!==void 0&&Object.defineProperty(r,o,i)}return r}var NX,O0=b(()=>{"use strict";da();rd();NX="[Fast mode requested; no standard-mode fallback will be attempted]"});async function*UX(e,t,n){let r=t.throttleQueue;if(!r)return await e;r.resetAttempts();let o=Symbol("create-done"),i=!1,s=e.then(a=>(i=!0,a),a=>{throw i=!0,a});for(;;){for(let l of r.takeAll())n?.(l.retryAfterMs),yield{type:"rate_limit",sessionId:t.ctx.sessionId,status:l.status,attempt:l.attempt,...l.retryAfterMs!==void 0?{retryAfterMs:l.retryAfterMs}:{}};if(i)return await s;await Promise.race([s.then(()=>o,()=>o),r.waitForItem().then(()=>{})])}}var jX=b(()=>{"use strict"});function HX(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let i=o.content;for(let s=0;s<i.length;s++){let a=i[s];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:s,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var WX=b(()=>{"use strict"});function $0e(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}async function D0e(e,t,n,r,o){for(let i=0;;i++){if(i>0){let s=pk(5e3*Math.pow(2,i-1));if(await ln(s,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let a=s instanceof Error?s:new Error(String(s));if(DX(a)){if(i<3)continue;throw new gk}throw a}}}function L0e(e){return{model:e.model,max_tokens:e.maxTokens,messages:e.messages,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0?{tools:e.tools.map($0e)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},...e.fastMode===!0?{speed:"fast"}:{}}}async function*KX({input:e,turn:t,retry:n,ttfbTimeoutMs:r,stallTimeoutMs:o}){let i=og({baseUrl:e.baseUrl})?yX(e.messages,ol()):e.messages,s=L0e({...e,messages:i,tools:t.windDownReason!==null?null:e.tools}),a=Date.now(),l=xX(e.signal,r),c=_X(l.signal,o,u=>{re(e.traceWriter,{phase:"idle_watchdog_fired",durationMs:u.elapsedSinceLastProgressMs,resolvedModel:e.model,metadata:{source:"model-stream",stallTimeoutMs:u.stallTimeoutMs,elapsedSinceLastProgressMs:u.elapsedSinceLastProgressMs}})});try{return{kind:"opened",events:yield*UX(D0e(e.client,s,e.headers,c.signal,e.signal),e,d=>{let p=TX(d);p!==void 0&&l.extend(p)}),ttfb:l,stall:c,requestStartedAt:a}}catch(u){if(l.timedOut()&&!e.signal.aborted&&n.canRetryTtfb())return l.dispose(),c.dispose(),{kind:"retry-ttfb",requestStartedAt:a};if(l.dispose(),c.dispose(),e.signal.aborted)return yield{type:"turn.completed",usage:t.terminalUsage(),sessionId:e.ctx.sessionId},{kind:"terminated"};if(u instanceof gk)return{kind:"overload-exhausted"};let d=fk(u,e.fastMode===!0);return d.message.includes("thinking")&&HX(e.messages,d),yield{type:"error",error:d},{kind:"terminated"}}}var gk,GX=b(()=>{"use strict";O0();rd();fe();Qi();C0();dk();sg();lg();jX();WX();gk=class extends Error{constructor(){super("Connection-phase overload budget exhausted"),this.name="ConnectionOverloadExhaustedError"}}});function qX(e,t){return e||t!==null}function zX(){return new Jn("the model stream ended without a terminal message (no message_stop and no stop_reason): the turn is incomplete. The cause is not knowable at this layer \u2014 a client-side abort carrying an AbortError reason (including the SDK request timeout) and an upstream peer close are indistinguishable here. Check the trace for a preceding ttfb_timeout, idle_watchdog_fired, or rate_limit phase before suspecting the network.")}var JX=b(()=>{"use strict";He()});function F0e(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function N0e(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:F0e(a.partialJson)}));let i=a=>a.type==="tool_use",s=r.filter(i);return{stopReason:t,assistantBlocks:r,toolUseBlocks:s,usage:n,text:o.join("")}}async function*VX(e,t,n){let r=[],o=null,i=null,s=!1,a=!!k.AFK_TELEGRAM_TRACE;try{a&&console.log("[translate] starting SDK event iteration");for await(let l of e){switch(a&&console.log("[translate] SDK evt:",l.type),l.type){case"message_start":{let c=l.message?.usage;c&&(i={...c});break}case"content_block_start":{let c=l.content_block;c.type==="text"?r[l.index]={kind:"text",text:""}:c.type==="thinking"?r[l.index]={kind:"thinking",thinking:"",signature:""}:c.type==="redacted_thinking"?r[l.index]={kind:"redacted_thinking",data:c.data}:c.type==="tool_use"&&(r[l.index]={kind:"tool_use",id:c.id,name:c.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:c.id,toolName:c.name,toolInput:" \u2026",pending:!0,sessionId:t.sessionId}});break}case"content_block_delta":{let c=r[l.index],u=l.delta;u.type==="text_delta"?(c&&c.kind==="text"&&(c.text+=u.text),yield{kind:"event",event:{type:"delta.text",text:u.text,sessionId:t.sessionId}}):u.type==="input_json_delta"?(c&&c.kind==="tool_use"&&(c.partialJson+=u.partial_json),n?.()):u.type==="thinking_delta"?(c&&c.kind==="thinking"&&(c.thinking+=u.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:u.thinking,sessionId:t.sessionId}}):(u.type==="signature_delta"&&c&&c.kind==="thinking"&&(c.signature=u.signature),n?.());break}case"content_block_stop":{let c=r[l.index];c&&c.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:c.name,toolUseIds:[c.id],sessionId:t.sessionId}});break}case"message_delta":{l.delta&&l.delta.stop_reason!==void 0&&(o=l.delta.stop_reason);let c=l.usage;c&&(i!==null?(i.output_tokens=c.output_tokens,c.cache_creation_input_tokens!=null&&(i.cache_creation_input_tokens=c.cache_creation_input_tokens),c.cache_read_input_tokens!=null&&(i.cache_read_input_tokens=c.cache_read_input_tokens),c.input_tokens!=null&&(i.input_tokens=c.input_tokens)):i={cache_creation:null,cache_creation_input_tokens:c.cache_creation_input_tokens??null,cache_read_input_tokens:c.cache_read_input_tokens??null,inference_geo:null,input_tokens:c.input_tokens??0,output_tokens:c.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}a&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(l){a&&console.log("[translate] SDK iteration threw:",l.message),yield{kind:"event",event:{type:"error",error:l instanceof Error?l:new Error(String(l))}};return}if(!qX(s,o)){yield{kind:"event",event:{type:"error",error:zX()}};return}a&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:N0e(r,o,i)}}var YX=b(()=>{"use strict";F();JX()});async function*XX({events:e,input:t,turn:n,retry:r,ttfb:o,stall:i,stallTimeoutMs:s,requestStartedAt:a}){let l=null,c=!1,u=!1,d=!1,p=!1,f=!1,g=!1;try{k.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let h of VX(Mu(e,t.signal),t.ctx,()=>i.progress()))if(!g&&(h.kind==="turn-result"||h.event.type!=="error")&&(g=!0,o.firstByteSeen(),re(t.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-a,resolvedModel:t.model})),i.progress(),k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",h.kind,h.kind==="event"?h.event.type:""),h.kind==="event"){if(h.event.type==="error"){if(o.timedOut()&&!t.signal.aborted&&r.canRetryTtfb()&&!g){u=!0;break}if(i.timedOut()&&!t.signal.aborted){yield{type:"error",error:_0(s)},c=!0;break}if(ag(h.event.error)&&r.canRetryOverload()&&!t.signal.aborted){d=!0;break}if(ag(h.event.error)&&!t.signal.aborted){f=!0;break}if(t.signal.aborted)break;if(h.event.error instanceof Jn&&r.canRetryStreamIncomplete()&&!t.signal.aborted){p=!0;break}yield h.event,c=!0;break}yield h.event}else{l=h.result;break}k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",l?"set":"null")}catch(h){if(o.timedOut()&&!t.signal.aborted&&r.canRetryTtfb()&&!g)o.dispose(),i.dispose(),u=!0;else{if(o.dispose(),i.dispose(),t.signal.aborted)return yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId},{kind:"terminated"};let y=h instanceof Error?h:new Error(String(h));if((i.timedOut()||CX(y))&&!t.signal.aborted)return yield{type:"error",error:_0(s)},{kind:"terminated"};if(ag(y)&&r.canRetryOverload()&&!t.signal.aborted)d=!0;else if(ag(y)&&!t.signal.aborted)f=!0;else return yield{type:"error",error:y},{kind:"terminated"}}}return o.dispose(),i.dispose(),u?{kind:"retry",reason:"ttfb"}:d?{kind:"retry",reason:"overload"}:p?{kind:"retry",reason:"stream-incomplete"}:f?{kind:"overload-exhausted"}:c?{kind:"translator-errored"}:{kind:"streamed",turnResult:l}}var QX=b(()=>{"use strict";YX();He();zS();fe();F();dk();lg()});async function*ZX(e,t,n){let r=[],o=new Map;for(let s of e.toolUseBlocks)r.push({id:s.id,name:s.name,input:s.input,signal:t.signal}),o.set(s.id,Date.now()),la(t.traceWriter,nv({toolUseId:s.id,name:s.name,input:s.input,subagentId:t.subagentId})),yield{type:"tool.use.start",toolUseId:s.id,toolName:s.name,toolInput:as(s.name,s.input),toolInputRaw:ev(s.input),toolInputCapture:k.AFK_CAPTURE_SUBAGENT_OUTPUT==="1"?tv(s.input):void 0,sessionId:t.ctx.sessionId};if(t.signal.aborted){let s=r.map(a=>({type:"tool_result",tool_use_id:a.id,content:"Tool call aborted",is_error:!0}));return t.messages.push({role:"user",content:s}),yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId},{kind:"aborted"}}let i;if(t.toolDispatcher.executeBatch)i=yield*iv(async s=>{try{return await t.toolDispatcher.executeBatch(r,a=>{s({type:"tool.activity",activeCount:a.length,activeToolUseIds:[...a],sessionId:t.ctx.sessionId})})}catch(a){return r.map(()=>({content:`Tool batch execution failed: ${a instanceof Error?a.message:String(a)}`,isError:!0}))}});else{i=[];for(let s of r){if(t.signal.aborted){i.push({content:"Tool call aborted",isError:!0,failureClass:on(t.signal)});continue}try{i.push(await t.toolDispatcher.execute(s))}catch(a){let l=a instanceof Error?a.message:String(a);i.push({content:`Tool execution threw: ${l}`,isError:!0})}}}return{kind:"dispatched",calls:r,results:i,startTimes:o}}var e6=b(()=>{"use strict";Ni();fe();ZI();F();jf();ov();eM()});async function*t6(e,t,n,r){let o=[];for(let l=0;l<e.length;l++){let c=e[l],u=t[l],d=n.get(c.id),p=typeof d=="number"?Date.now()-d:0,f=u.truncated===!0||u.content.includes("[output truncated");la(r.traceWriter,rv({toolUseId:c.id,name:c.name,result:u,truncated:f,durationMs:p,subagentId:r.subagentId})),yield{type:"tool.output",toolUseId:c.id,toolName:c.name,content:u.content,...u.isError===!0?{isError:!0}:{},...f?{truncated:!0}:{},...u.capturePath!==void 0?{capturePath:u.capturePath}:{},...u.incomplete===!0?{incomplete:!0}:{},...u.incompleteReason?{incompleteReason:u.incompleteReason}:{},...typeof u.batchIndex=="number"&&typeof u.batchSize=="number"?{batchIndex:u.batchIndex,batchSize:u.batchSize}:{},...u.failureClass?{failureClass:u.failureClass}:{},durationMs:u.durationMs!==void 0?u.durationMs:p,...u.exitCode!==void 0?{exitCode:u.exitCode}:{},sessionId:r.ctx.sessionId},u.render?.diff&&(yield{type:"tool.diff",toolUseId:c.id,diff:u.render.diff,sessionId:r.ctx.sessionId});let{content:g,isError:h,image:y}=u,w=y!==void 0?[{type:"image",source:{type:"base64",media_type:y.mediaType,data:y.data}},...g.length>0?[{type:"text",text:g}]:[]]:g;o.push({type:"tool_result",tool_use_id:c.id,content:w,...h===!0?{is_error:!0}:{}})}let i=t.flatMap(l=>l.harnessUserMessage?.kind==="queued_user_message"?[{type:"text",text:l.harnessUserMessage.text}]:[]),s={role:"user",content:[...o,...i]};r.messages.push(s);let a=t.find(l=>l.failureClass===Hc);return a?(yield{type:"error",error:new wc(a.content)},"denial-tripped"):"committed"}var n6=b(()=>{"use strict";fe();ov();Dm();He()});async function*r6(e,t,n,r,o){let i=t.messages.length;t.messages.push({role:"assistant",content:e.assistantBlocks});try{n.toolCallCount+=e.toolUseBlocks.length;let u=yield*ZX(e,t,n);if(u.kind==="aborted"||(yield*t6(u.calls,u.results,u.startTimes,t))==="denial-tripped")return"terminated"}catch(u){throw t.messages.splice(i),u}n.iterations+=1;let s=e.toolUseBlocks[e.toolUseBlocks.length-1],a=s?`${s.name}${as(s.name,s.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:n.taskId,description:"Working",summary:`${cv(n.iterations,r)}: ${a}`,lastToolName:s?.name,totalTokens:n.usage.totalTokens??0,toolUses:n.toolCallCount,durationMs:Date.now()-n.startedAt},sessionId:t.ctx.sessionId},n.windDownReason!==null)return yield{type:"turn.completed",usage:n.withDuration({...n.usage,stopReason:n.windDownReason}),sessionId:t.ctx.sessionId},"terminated";let l=lv(n.iterations,r),c=pv(n.startedAt,o);if(l||c){let u=l?sv:uv,d=t.messages[t.messages.length-1];d!==void 0&&d.role==="user"&&Array.isArray(d.content)&&d.content.push({type:"text",text:u}),n.windDownReason=l?Or:$r}return"continue"}var o6=b(()=>{"use strict";jf();ls();$u();e6();n6()});function*i6(e,t,n){if(e.stopReason==="refusal"){e.text.length>0&&(yield{type:"assistant.message",text:e.text,sessionId:t.ctx.sessionId}),yield{type:"notice",text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,kind:"refusal",sessionId:t.ctx.sessionId},yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId};return}let r=ho(e.stopReason)?DS(e.toolUseBlocks.map(i=>i.name),e.stopReason):null;e.text.length>0?(yield{type:"assistant.message",text:r?`${e.text}
|
|
1483
1483
|
|
|
@@ -1489,7 +1489,7 @@ ${r}`:e.text,sessionId:t.ctx.sessionId},e.text.length<=B0e&&(yield{type:"suggest
|
|
|
1489
1489
|
`)}function zOe(e,t,n,r){let o=n&&n!==r?` (provider ${n} \u2192 ${r})`:"";return`[System context \u2014 not from the user. Your model was switched at the start of this turn: ${e} \u2192 ${t}${o}. Earlier turns in this conversation were produced by ${e}; the history carried across the switch is plain text only, so any prior tool calls and extended reasoning are now prose \u2014 treat their structure as lost, not authoritative.]`}function JOe(e,t){return typeof e=="string"?e.length>0?`${t}
|
|
1490
1490
|
|
|
1491
1491
|
${e}`:t:[{type:"text",text:t},...e]}var Wk,O8=b(()=>{"use strict";Z0();eO();me();Wk=class{outerIterator;baseConfig;deps;currentModel;currentPermissionMode;currentCwd;currentSystemPrompt;systemPromptOverridden=!1;startupFamily;active;activeModel;closed=!1;shadowHistory;pendingUserText;pendingAssistantText="";lastSessionId;constructor(t,n){this.outerIterator=t.prompt[Symbol.asyncIterator](),this.baseConfig=t.config,this.deps=n,this.currentModel=typeof t.config.model=="string"?t.config.model:void 0,this.currentPermissionMode=t.config.permissionMode,this.currentCwd=t.config.cwd,this.startupFamily=n.providerNameForModel(this.currentModel),this.shadowHistory=[...t.config.resumeHistory??[]]}resolveInner(t){let n=this.deps.resolveProvider(t),r={...this.baseConfig};r.model=t??this.baseConfig.model;let o=n.name===this.startupFamily&&this.baseConfig.apiKey!==void 0?this.baseConfig.apiKey:this.deps.resolveApiKey(t);o!==void 0?r.apiKey=o:delete r.apiKey,Hk(r);let i=[n.name,r.baseUrl??"",r.openaiBaseUrl??"",r.apiKey??"",r.forceChatgptOAuth?"chatgpt-oauth":"",r.forceXaiOAuth?"xai-oauth":"",r.forceXaiApiKey?"xai-apikey":"",r.xaiBaseUrl??""].join("\0");return{provider:n,innerConfig:r,signature:i}}buildInner(t,n){let{provider:r,innerConfig:o,signature:i}=this.resolveInner(t),s=new pd(()=>this.lastSessionId);this.currentPermissionMode!==void 0&&(o.permissionMode=this.currentPermissionMode),this.currentCwd!==void 0&&(o.cwd=this.currentCwd),this.systemPromptOverridden&&(o.systemPrompt=this.currentSystemPrompt),n&&(o.resumeHistory=[...this.shadowHistory]);let a=r.query({prompt:s.createIterable(),config:o});return{family:r.name,signature:i,query:a,iterator:a[Symbol.asyncIterator](),input:s}}async closeActive(){let t=this.active;if(t){this.active=void 0;try{await t.iterator.return?.(void 0)}catch{}try{await t.query.close()}catch{}}}observeEvent(t){t.type==="assistant.message"&&(this.pendingAssistantText+=(this.pendingAssistantText?`
|
|
1492
|
-
`:"")+t.text)}commitShadowTurn(){this.pendingUserText!==void 0&&(this.shadowHistory.push({user:this.pendingUserText,assistant:this.pendingAssistantText}),this.pendingUserText=void 0,this.pendingAssistantText="")}async*[Symbol.asyncIterator](){try{for(this.active=this.buildInner(this.currentModel,!1),this.activeModel=this.currentModel,yield*this.driveUntilInit(!1);!this.closed;){let t=await this.outerIterator.next();if(t.done)break;let n=t.value;this.lastSessionId=n.sessionId;let r=this.currentModel!==this.activeModel,o=!this.active||r&&this.resolveInner(this.currentModel).signature!==this.active.signature,i=this.activeModel,s=this.active?.family;this.activeModel=this.currentModel;let a;if(o&&(await this.closeActive(),this.active=this.buildInner(this.currentModel,!0),B(`\u{1F500} ProviderRouter: switched inner provider \u2192 ${this.active.family} (model=${this.currentModel})`),i!==void 0&&i!==this.currentModel&&(a=zOe(i,this.currentModel??"(unset)",s,this.active.family)),yield*this.driveUntilInit(!0)))break;for(this.pendingUserText=qOe(n.content),this.pendingAssistantText="",this.active.input.pushUserMessage(a?JOe(n.content,a):n.content);;){let l=await this.active.iterator.next();if(l.done){this.closed=!0;break}let c=l.value;if(this.observeEvent(c),yield c,c.type==="turn.completed"){this.commitShadowTurn();break}if(c.type==="error"){this.commitShadowTurn();break}}}}finally{await this.closeActive()}}async*driveUntilInit(t){for(;;){let n=await this.active.iterator.next();if(n.done)return yield{type:"error",error:new Error("provider ended before initialization")},this.closed=!0,!0;let r=n.value;if(r.type==="session.init")return t||(yield r),!1;if(r.type==="error")return yield r,this.closed=!0,!0;yield r}}async interrupt(t="interrupted"){await this.active?.query.interrupt(t)}async setModel(t){typeof t=="string"&&t.length>0&&(this.currentModel=t,this.active&&this.resolveInner(t).signature===this.active.signature&&await this.active.query.setModel(t))}async setPermissionMode(t){this.currentPermissionMode=t,await this.active?.query.setPermissionMode(t)}setCwd(t){this.currentCwd=t,this.active?.query.setCwd?.(t)}setSystemPrompt(t){return this.currentSystemPrompt=t,this.systemPromptOverridden=!0,this.active?.query.setSystemPrompt?.(t)??!1}async reauth(){return await this.active?.query.reauth?.()??null}async supportedCommands(){return await this.active?.query.supportedCommands()??[]}async supportedModels(){return await this.active?.query.supportedModels()??[]}async supportedAgents(){return await this.active?.query.supportedAgents()??[]}async getContextUsage(){return await this.active?.query.getContextUsage()??{}}async mcpServerStatus(){return await this.active?.query.mcpServerStatus()??[]}async accountInfo(){return await this.active?.query.accountInfo()??{}}async rewindFiles(t,n){let r=this.active;return r?r.query.rewindFiles(t,n):{canRewind:!1,error:"no active provider"}}async compact(){let t=this.active;return t?.query.compact?t.query.compact():{compacted:!1,reason:"provider does not support compaction",messagesBefore:0,messagesAfter:0}}listRewindTargets(){return this.active?.query.listRewindTargets?.()??[]}async rewindConversation(t){let n=this.active;return n?.query.rewindConversation?n.query.rewindConversation(t):{rewound:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}async reloadPlugins(...t){let n=this.active?.query;if(n&&typeof n.reloadPlugins=="function")return n.reloadPlugins(...t)}async close(){this.closed=!0,await this.closeActive()}}});async function Kk(e,t,n){if(!e)return;if(n.kind==="blocked"){await Yn(e,{hookEvent:t,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await Yn(e,{hookEvent:t,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function $8(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);return await Kk(n.traceWriter,"SessionStart",{kind:"decision",decision:r}),r.injectContext}catch(r){throw r instanceof Re&&await Kk(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function D8(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Kk(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof Re&&await Kk(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof Re||r instanceof Dt){B(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}B(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var L8=b(()=>{"use strict";me();He();fe()});function ll(e){switch(e){case"abort":return tO;case"iteration_cap":return VOe;case"timeout":return YOe;default:return null}}var tO,VOe,YOe,Gk=b(()=>{"use strict";tO="Session ended via abort before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state, or re-run the task if the interruption was intentional.",VOe="Session hit the tool-use iteration cap before reaching a terminal state. Partial work is preserved in the transcript and witness trace. Resume with `afk --resume <sessionId>` to continue from where it stopped, or re-run with a higher budget (`--max-turns` or `max_tool_use_iterations`).",YOe="Session was terminated by the wall-clock timeout before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue, or re-run with a longer timeout. Check the trace for whether the timeout hit during active work or while waiting on a slow tool call."});function F8(e){return e.maxTurnsHit?"max_turns_exceeded":e.hookBlocked?"hook_blocked":e.dispatchReason==="error"?"abort":e.abort!==null?e.abort:e.sawProviderError||e.lastStopReason===Un?"abort":e.lastStopReason==="tool_use_loop_capped"?"iteration_cap":e.lastStopReason===$r?"timeout":ho(e.lastStopReason)?"truncated":"model_end_turn"}var N8=b(()=>{"use strict";Wu();ls();_f()});function XOe(e){let t=null,n=e.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;r instanceof Vr?t="budget_exceeded":r instanceof xt?t="timeout":typeof r=="string"&&r.startsWith("Budget ")?t="budget_exceeded":typeof r=="string"&&r.includes("timed out")?t="timeout":t="abort"}return F8({dispatchReason:e.dispatchReason,maxTurnsHit:e.maxTurnsHit,hookBlocked:e.hookBlocked,abort:t,lastStopReason:e.lastStopReason,sawProviderError:e.sawProviderError})}function QOe(e){if(e.dispatchReason==="error")return"failed";let t=e.signal;return t.aborted&&t.reason!=="closed"?"cancelled":e.sawProviderError||e.lastStopReason===Un?"failed":"succeeded"}async function B8(e,t){if(!e)return;let n=XOe(t),r={},o=t.runningTokens;o.input>0&&(r.input=o.input),o.output>0&&(r.output=o.output),o.cacheRead>0&&(r.cacheRead=o.cacheRead),o.cacheCreation>0&&(r.cacheCreation=o.cacheCreation);let i=ll(n);await UU(e,{reason:n,finalTurnCount:t.finalTurnCount,finalCostUsd:t.finalCostUsd,finalTokens:r,...t.lastStopReason!==void 0?{lastStopReason:t.lastStopReason}:{},...i!==null?{guidance:i}:{}})}async function U8(e,t){if(!e)return;let n=QOe(t),r=t.subagentCompletedCount>0?t.subagentCompletedCount:void 0,o=t.subagentRunningTokens,s=o.input>0||o.output>0||o.cacheRead>0||o.cacheCreation>0?{...o.input>0?{input:o.input}:{},...o.output>0?{output:o.output}:{},...o.cacheRead>0?{cacheRead:o.cacheRead}:{},...o.cacheCreation>0?{cacheCreation:o.cacheCreation}:{}}:void 0,a=t.subagentRunningCostUsd>0?t.subagentRunningCostUsd:void 0;await e.seal({status:n,finalCostUsd:t.finalCostUsd,finalTurnCount:t.finalTurnCount,closedAt:new Date().toISOString(),...r!==void 0?{subagentCount:r}:{},...s!==void 0?{subagentTokens:s}:{},...a!==void 0?{subagentCostUsd:a}:{}})}var j8=b(()=>{"use strict";He();Wu();fe();Gk();N8()});var qk,H8=b(()=>{"use strict";F();U();Na();qk=class{writer=null;initAttempted=!1;ensure(t){if(this.initAttempted||(this.initAttempted=!0,t.depth!==void 0||t.parentSessionId!==void 0)||k.AFK_SESSION_LEDGER_DISABLED==="1")return;let n=t.sessionId;if(!n)return;let r=new Qw(n);if(!r.active)return;this.writer=r;let o=t.getMetadata();r.record({kind:"meta",sessionId:n,model:o.model??t.fallbackModel,...o.cwd!==void 0?{cwd:o.cwd}:{},traceLabel:xi(t.tracePath)})}recordUser(t){this.writer?.recordUser(t)}recordEvent(t){this.writer?.recordEvent(t)}recordElicitation(t,n){this.writer?.record({kind:"elicitation",reqId:t,request:n})}seal(t){let n=this.writer;return n?(this.writer=null,this.initAttempted=!1,n.close(t)):Promise.resolve()}}});var zk,W8=b(()=>{"use strict";zk=class{pendingSeed;prePlanMode;modeBeforeDefault;recordModeTransition(t,n){if(t==="plan"){if(n!=="plan"){let r=n==="default"&&this.modeBeforeDefault!==void 0?this.modeBeforeDefault:n;this.prePlanMode=r==="autonomous"?void 0:r}}else t==="default"?this.modeBeforeDefault=n!=="default"&&n!=="plan"?n:void 0:this.modeBeforeDefault=void 0}clearModeBeforeDefault(){this.modeBeforeDefault=void 0}getPrePlanMode(){return this.prePlanMode}requestImplementSeed(t,n){this.pendingSeed={message:t,mode:n}}takeSeed(){let t=this.pendingSeed;return this.pendingSeed=void 0,t}}});function K8(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 G8(e,t){let n=e.permissionMode??"default",r=e.persistSession??!0,o={sessionId:e.sessionId,configuredSessionId:e.sessionId,resume:e.resume,resumeSessionAt:e.resumeSessionAt,continue:e.continue,forkSession:e.forkSession,persistSession:r},i={sessionId:e.sessionId,model:t,permissionMode:n};return{sessionIdentity:o,metadata:i}}var q8=b(()=>{"use strict"});var Jk,z8=b(()=>{"use strict";Jk=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(t,n){this.sessionIdentity=t,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(t){t&&(this.sessionIdentity={...this.sessionIdentity,sessionId:t},this.sessionMetadata={...this.sessionMetadata,sessionId:t})}setSessionMetadata(t){this.sessionMetadata=t(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(t){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(t))}isInitializationSettled(){return this.initializationSettled}}});function J8(e){try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=t.length;if(n===0)return"no results";let r=0,o=0;for(let a of t)if(a&&typeof a=="object"){let l=a.type;l==="fact"?r++:l==="procedure"&&o++}let i=`${n} result${n===1?"":"s"}`;if(r+o!==n)return i;let s=[];return r>0&&s.push(`${r} fact${r===1?"":"s"}`),o>0&&s.push(`${o} procedure${o===1?"":"s"}`),s.length===0?i:`${i} (${s.join(", ")})`}catch{return null}}function V8(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;if(n.target==="hot"&&n.saved===!0){if(n.truncated===!0)return"hot memory saved (truncated to fit cap)";let r=n.usage;if(r&&typeof r=="object"){let o=r.pct;if(typeof o=="number")return`hot memory saved (${o}% of cap)`}return"hot memory saved"}if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function Y8(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}var X8=b(()=>{"use strict"});function nO(e){let t=e.trim();if(t.length===0)return null;let n=t[0];if(n!=="{"&&n!=="[")return null;let r=t[t.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(t)}catch{return null}return Array.isArray(o)?Q8(ZOe(o)):o!==null&&typeof o=="object"?Q8(e$e(o)):null}function ZOe(e){return e.length===0?"[empty array]":e.length===1?"[1 item]":`[${e.length} items]`}function e$e(e){let t=Object.keys(e);if(t.length===0)return"{empty object}";let n=t.slice(0,4),r=t.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function Q8(e){return e.length<=80?e:e.slice(0,79)+"\u2026"}var Z8=b(()=>{"use strict"});function e5(e,t){if(!e)return null;let n=t$e.get(e);if(!n)return null;try{let r=n(t);if(r===null)return null;let o=ae(r);return o.length>0?o:null}catch{return null}}var t$e,t5=b(()=>{"use strict";X8();Z8();We();t$e=new Map([["memory_search",J8],["memory_update",V8],["procedure_write",Y8],["bash",nO],["Bash",nO]])});function n$e(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 n5(e){let t=Buffer.byteLength(e,"utf8"),n=n$e(t),r=e.split(`
|
|
1492
|
+
`:"")+t.text)}commitShadowTurn(){this.pendingUserText!==void 0&&(this.shadowHistory.push({user:this.pendingUserText,assistant:this.pendingAssistantText}),this.pendingUserText=void 0,this.pendingAssistantText="")}async*[Symbol.asyncIterator](){try{for(this.active=this.buildInner(this.currentModel,!1),this.activeModel=this.currentModel,yield*this.driveUntilInit(!1);!this.closed;){let t=await this.outerIterator.next();if(t.done)break;let n=t.value;this.lastSessionId=n.sessionId;let r=this.currentModel!==this.activeModel,o=!this.active||r&&this.resolveInner(this.currentModel).signature!==this.active.signature,i=this.activeModel,s=this.active?.family;this.activeModel=this.currentModel;let a;if(o&&(await this.closeActive(),this.active=this.buildInner(this.currentModel,!0),B(`\u{1F500} ProviderRouter: switched inner provider \u2192 ${this.active.family} (model=${this.currentModel})`),i!==void 0&&i!==this.currentModel&&(a=zOe(i,this.currentModel??"(unset)",s,this.active.family)),yield*this.driveUntilInit(!0)))break;for(this.pendingUserText=qOe(n.content),this.pendingAssistantText="",this.active.input.pushUserMessage(a?JOe(n.content,a):n.content);;){let l=await this.active.iterator.next();if(l.done){this.closed=!0;break}let c=l.value;if(this.observeEvent(c),yield c,c.type==="turn.completed"){this.commitShadowTurn();break}if(c.type==="error"){this.commitShadowTurn();break}}}}finally{await this.closeActive()}}async*driveUntilInit(t){for(;;){let n=await this.active.iterator.next();if(n.done)return yield{type:"error",error:new Error("provider ended before initialization")},this.closed=!0,!0;let r=n.value;if(r.type==="session.init")return t||(yield r),!1;if(r.type==="error")return yield r,this.closed=!0,!0;yield r}}async interrupt(t="interrupted"){await this.active?.query.interrupt(t)}async setModel(t){typeof t=="string"&&t.length>0&&(this.currentModel=t,this.active&&this.resolveInner(t).signature===this.active.signature&&await this.active.query.setModel(t))}async setPermissionMode(t){this.currentPermissionMode=t,await this.active?.query.setPermissionMode(t)}setCwd(t){this.currentCwd=t,this.active?.query.setCwd?.(t)}setSystemPrompt(t){return this.currentSystemPrompt=t,this.systemPromptOverridden=!0,this.active?.query.setSystemPrompt?.(t)??!1}async reauth(){return await this.active?.query.reauth?.()??null}async supportedCommands(){return await this.active?.query.supportedCommands()??[]}async supportedModels(){return await this.active?.query.supportedModels()??[]}async supportedAgents(){return await this.active?.query.supportedAgents()??[]}async getContextUsage(){return await this.active?.query.getContextUsage()??{}}async mcpServerStatus(){return await this.active?.query.mcpServerStatus()??[]}async accountInfo(){return await this.active?.query.accountInfo()??{}}async rewindFiles(t,n){let r=this.active;return r?r.query.rewindFiles(t,n):{canRewind:!1,error:"no active provider"}}async compact(){let t=this.active;return t?.query.compact?t.query.compact():{compacted:!1,reason:"provider does not support compaction",messagesBefore:0,messagesAfter:0}}listRewindTargets(){return this.active?.query.listRewindTargets?.()??[]}async rewindConversation(t){let n=this.active;return n?.query.rewindConversation?n.query.rewindConversation(t):{rewound:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}async reloadPlugins(...t){let n=this.active?.query;if(n&&typeof n.reloadPlugins=="function")return n.reloadPlugins(...t)}async close(){this.closed=!0,await this.closeActive()}}});async function Kk(e,t,n){if(!e)return;if(n.kind==="blocked"){await Yn(e,{hookEvent:t,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await Yn(e,{hookEvent:t,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function $8(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);return await Kk(n.traceWriter,"SessionStart",{kind:"decision",decision:r}),r.injectContext}catch(r){throw r instanceof Re&&await Kk(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function D8(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Kk(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof Re&&await Kk(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof Re||r instanceof Dt){B(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}B(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var L8=b(()=>{"use strict";me();He();fe()});function ll(e){switch(e){case"abort":return tO;case"iteration_cap":return VOe;case"timeout":return YOe;default:return null}}var tO,VOe,YOe,Gk=b(()=>{"use strict";tO="Session ended via abort before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state, or re-run the task if the interruption was intentional.",VOe="Session hit the tool-use iteration cap before reaching a terminal state. Partial work is preserved in the transcript and witness trace. Resume with `afk --resume <sessionId>` to continue from where it stopped, or re-run with a higher budget (`--max-turns` or `max_tool_use_iterations`).",YOe="Session was terminated by the wall-clock timeout before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue, or re-run with a longer timeout. Check the trace for whether the timeout hit during active work or while waiting on a slow tool call."});function F8(e){return e.maxTurnsHit?"max_turns_exceeded":e.hookBlocked?"hook_blocked":e.dispatchReason==="error"?"abort":e.abort!==null?e.abort:e.sawProviderError||e.lastStopReason===Un?"abort":e.lastStopReason==="tool_use_loop_capped"?"iteration_cap":e.lastStopReason===$r?"timeout":ho(e.lastStopReason)?"truncated":"model_end_turn"}var N8=b(()=>{"use strict";Wu();ls();_f()});function XOe(e){let t=null,n=e.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;r instanceof Vr?t="budget_exceeded":r instanceof xt?t="timeout":typeof r=="string"&&r.startsWith("Budget ")?t="budget_exceeded":typeof r=="string"&&r.includes("timed out")?t="timeout":t="abort"}return F8({dispatchReason:e.dispatchReason,maxTurnsHit:e.maxTurnsHit,hookBlocked:e.hookBlocked,abort:t,lastStopReason:e.lastStopReason,sawProviderError:e.sawProviderError})}function QOe(e){if(e.dispatchReason==="error")return"failed";let t=e.signal;return t.aborted&&t.reason!=="closed"?"cancelled":e.sawProviderError||e.lastStopReason===Un?"failed":"succeeded"}async function B8(e,t){if(!e)return;let n=XOe(t),r={},o=t.runningTokens;o.input>0&&(r.input=o.input),o.output>0&&(r.output=o.output),o.cacheRead>0&&(r.cacheRead=o.cacheRead),o.cacheCreation>0&&(r.cacheCreation=o.cacheCreation);let i=ll(n);await UU(e,{reason:n,finalTurnCount:t.finalTurnCount,finalCostUsd:t.finalCostUsd,finalTokens:r,...t.lastStopReason!==void 0?{lastStopReason:t.lastStopReason}:{},...i!==null?{guidance:i}:{}})}async function U8(e,t){if(!e)return;let n=QOe(t),r=t.subagentCompletedCount>0?t.subagentCompletedCount:void 0,o=t.subagentRunningTokens,s=o.input>0||o.output>0||o.cacheRead>0||o.cacheCreation>0?{...o.input>0?{input:o.input}:{},...o.output>0?{output:o.output}:{},...o.cacheRead>0?{cacheRead:o.cacheRead}:{},...o.cacheCreation>0?{cacheCreation:o.cacheCreation}:{}}:void 0,a=t.subagentRunningCostUsd>0?t.subagentRunningCostUsd:void 0;await e.seal({status:n,finalCostUsd:t.finalCostUsd,finalTurnCount:t.finalTurnCount,closedAt:new Date().toISOString(),...r!==void 0?{subagentCount:r}:{},...s!==void 0?{subagentTokens:s}:{},...a!==void 0?{subagentCostUsd:a}:{}})}var j8=b(()=>{"use strict";He();Wu();fe();Gk();N8()});var qk,H8=b(()=>{"use strict";F();U();Na();qk=class{writer=null;initAttempted=!1;ensure(t){if(this.initAttempted||(this.initAttempted=!0,t.depth!==void 0||t.parentSessionId!==void 0)||k.AFK_SESSION_LEDGER_DISABLED==="1")return;let n=t.sessionId;if(!n)return;let r=new Qw(n);if(!r.active)return;this.writer=r;let o=t.getMetadata();r.record({kind:"meta",sessionId:n,model:o.model??t.fallbackModel,...o.cwd!==void 0?{cwd:o.cwd}:{},traceLabel:xi(t.tracePath)})}recordUser(t){this.writer?.recordUser(t)}recordEvent(t){this.writer?.recordEvent(t)}recordElicitation(t,n){this.writer?.record({kind:"elicitation",reqId:t,request:n})}seal(t){let n=this.writer;return n?(this.writer=null,this.initAttempted=!1,n.close(t)):Promise.resolve()}}});var zk,W8=b(()=>{"use strict";zk=class{pendingSeed;prePlanMode;modeBeforeDefault;recordModeTransition(t,n){if(t==="plan"){if(n!=="plan"){let r=n==="default"&&this.modeBeforeDefault!==void 0?this.modeBeforeDefault:n;this.prePlanMode=r==="autonomous"?void 0:r}}else t==="default"?this.modeBeforeDefault=n!=="default"&&n!=="plan"?n:void 0:this.modeBeforeDefault=void 0}clearModeBeforeDefault(){this.modeBeforeDefault=void 0}getPrePlanMode(){return this.prePlanMode}requestImplementSeed(t,n){this.pendingSeed={message:t,mode:n}}takeSeed(){let t=this.pendingSeed;return this.pendingSeed=void 0,t}}});function K8(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 G8(e,t){let n=e.permissionMode??"default",r=e.persistSession??!0,o={sessionId:e.sessionId,configuredSessionId:e.sessionId,resume:e.resume,resumeSessionAt:e.resumeSessionAt,continue:e.continue,forkSession:e.forkSession,persistSession:r},i={sessionId:e.sessionId,model:t,permissionMode:n};return{sessionIdentity:o,metadata:i}}var q8=b(()=>{"use strict"});var Jk,z8=b(()=>{"use strict";Jk=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(t,n){this.sessionIdentity=t,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(t){t&&(this.sessionIdentity={...this.sessionIdentity,sessionId:t},this.sessionMetadata={...this.sessionMetadata,sessionId:t})}setSessionMetadata(t){this.sessionMetadata=t(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(t){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(t))}isInitializationSettled(){return this.initializationSettled}}});function J8(e){try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=t.length;if(n===0)return"no results";let r=0,o=0;for(let a of t)if(a&&typeof a=="object"){let l=a.type;l==="fact"?r++:l==="procedure"&&o++}let i=`${n} result${n===1?"":"s"}`;if(r+o!==n)return i;let s=[];return r>0&&s.push(`${r} fact${r===1?"":"s"}`),o>0&&s.push(`${o} procedure${o===1?"":"s"}`),s.length===0?i:`${i} (${s.join(", ")})`}catch{return null}}function V8(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;if(n.target==="hot"&&n.saved===!0){if(n.truncated===!0)return"hot memory saved (truncated to fit cap)";let r=n.usage;if(r&&typeof r=="object"){let o=r.pct;if(typeof o=="number")return`hot memory saved (${o}% of cap)`}return"hot memory saved"}if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function Y8(e){try{let t=JSON.parse(e);if(!t||typeof t!="object")return null;let n=t;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}var X8=b(()=>{"use strict"});function nO(e){let t=e.trim();if(t.length===0)return null;let n=t[0];if(n!=="{"&&n!=="[")return null;let r=t[t.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(t)}catch{return null}return Array.isArray(o)?Q8(ZOe(o)):o!==null&&typeof o=="object"?Q8(e$e(o)):null}function ZOe(e){return e.length===0?"[empty array]":e.length===1?"[1 item]":`[${e.length} items]`}function e$e(e){let t=Object.keys(e);if(t.length===0)return"{empty object}";let n=t.slice(0,4),r=t.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function Q8(e){return e.length<=80?e:e.slice(0,79)+"\u2026"}var Z8=b(()=>{"use strict"});function e5(e,t){if(!e)return null;let n=t$e.get(e);if(!n)return null;try{let r=n(t);if(r===null)return null;let o=le(r);return o.length>0?o:null}catch{return null}}var t$e,t5=b(()=>{"use strict";X8();Z8();We();t$e=new Map([["memory_search",J8],["memory_update",V8],["procedure_write",Y8],["bash",nO],["Bash",nO]])});function n$e(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 n5(e){let t=Buffer.byteLength(e,"utf8"),n=n$e(t),r=e.split(`
|
|
1493
1493
|
`);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};let i=r.filter(u=>u.trim()!=="").slice(-r$e),s=r.length-i.length;if(e.length<=80)return{content:e,truncated:!1,lineCount:r.length,sizeBytes:t,sizeLabel:n,tailPreview:i,hiddenLineCount:s};let a=r[0]??"",l=a;return a.length>80&&(l=a.substring(0,80)+"\u2026"),{content:l+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:t,sizeLabel:n,tailPreview:i,hiddenLineCount:s}}var r$e,r5=b(()=>{"use strict";r$e=7});function o$e(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],i=n[3],s=parseFloat(r),a=s;o==="KB"?a=s*1024:o==="MB"?a=s*1024*1024:o==="GB"&&(a=s*1024*1024*1024);let l=r;return s%1===0&&(l=String(Math.floor(s))),l+=o,{sizeLabel:l,sizeBytes:Math.round(a),absolutePath:i.trim()}}function i$e(e,t){let n={...e.raw??{}};return e.inputTokens!==void 0&&(n.input_tokens=e.inputTokens),e.outputTokens!==void 0&&(n.output_tokens=e.outputTokens),e.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=e.cachedInputTokens),e.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=e.cacheCreationTokens),e.totalTokens!==void 0&&(n.total_tokens=e.totalTokens),e.contextWindowTokens!==void 0&&(n.context_window_tokens=e.contextWindowTokens),{sessionId:t,stopReason:e.stopReason??void 0,resultSubtype:e.resultSubtype,durationMs:e.durationMs,durationApiMs:e.durationApiMs,totalCostUsd:e.totalCostUsd,isError:e.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:e.modelUsage,permissionDenials:e.permissionDenials,errors:e.errors}}function s$e(e){let t=e.isError===!0?null:e5(e.toolName,e.content),n=t!==null?{display:t}:{},r=typeof e.batchIndex=="number"&&typeof e.batchSize=="number"?{batchIndex:e.batchIndex,batchSize:e.batchSize}:{},o=e.failureClass?{failureClass:e.failureClass}:{},i=o$e(e.content);if(i)return{type:"chunk",chunk:{type:"tool_result",toolUseId:e.toolUseId,content:`Output persisted (${i.sizeLabel}) \u2192 ${i.absolutePath}`,isError:e.isError===!0,persistedPath:i.absolutePath,sizeBytes:i.sizeBytes,sizeLabel:i.sizeLabel,...n,...r,...o}};let{content:s,lineCount:a,sizeBytes:l,sizeLabel:c,tailPreview:u,hiddenLineCount:d}=n5(e.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:e.toolUseId,content:s,isError:e.isError===!0,sizeBytes:l,sizeLabel:c,...e.truncated===!0&&{truncated:!0},...e.capturePath!==void 0&&{capturePath:e.capturePath},...a!==void 0&&{lineCount:a},...u!==void 0&&u.length>0&&{tailPreview:u},...d!==void 0&&{hiddenLineCount:d},...e.exitCode!==void 0&&{exitCode:e.exitCode},...e.durationMs!==void 0&&{durationMs:e.durationMs},...n,...r,...o}}}function rO(e,t){switch(e.type){case"session.init":{let n=e.info;return t.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),t.updateSessionIdentity(n.sessionId),t.resolveInitialization(),null}case"session.status":return t.setSessionMetadata(n=>({...n,sessionId:e.sessionId,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{permissionMode:n.permissionMode},...e.status!==void 0?{status:e.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:e.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:e.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(e.sessionId&&t.updateSessionIdentity(e.sessionId),e.text){let n={role:"assistant",content:e.text,timestamp:new Date};return t.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:e.toolUseId,toolName:e.toolName,toolInput:e.toolInput,toolInputRaw:e.toolInputRaw,toolInputCapture:e.toolInputCapture,...e.pending?{pending:!0}:{}}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:e.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:e.toolUseIds}}};case"tool.output":return e.isError!==!0&&e.toolName&&(t._successfulToolNames??=[]).push(e.toolName),s$e(e);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:e.toolUseId,diff:e.diff}};case"progress":return{type:"progress",progress:{taskId:e.progress.taskId,description:e.progress.description,...e.progress.summary!==void 0?{summary:e.progress.summary}:{},...e.progress.lastToolName!==void 0?{lastToolName:e.progress.lastToolName}:{},totalTokens:e.progress.totalTokens,toolUses:e.progress.toolUses,durationMs:e.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:e.suggestion};case"turn.completed":{let n=i$e(e.usage,e.sessionId??t.getSessionMetadata().sessionId);t._successfulToolNames!==void 0&&t._successfulToolNames.length>0&&(n.successfulToolNames=[...t._successfulToolNames]),t.setLastResponseMetadata(n);for(let r=t.conversationHistory.length-1;r>=0;r--){let o=t.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(t.maxBudgetUsd!==void 0&&t.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(t._runningCostUsd=(t._runningCostUsd??0)+n.totalCostUsd,t._runningCostUsd>=t.maxBudgetUsd)){NU(t.traceWriter,{kind:"monetary",runningCostUsd:t._runningCostUsd,maxBudgetUsd:t.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new Vr(t._runningCostUsd,t.maxBudgetUsd);return t.abortBudget(r),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:e.error};case"paused":return{type:"paused",reason:e.reason,...e.resetsAt!==void 0?{resetsAt:e.resetsAt}:{},...e.accountId!==void 0?{accountId:e.accountId}:{},...e.autoResume!==void 0?{autoResume:e.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:e.hotSwapped,...e.accountId!==void 0?{accountId:e.accountId}:{}};case"stream.retry":return{type:"stream_retry"};case"rate_limit":return{type:"rate_limit",...e.retryAfterMs!==void 0?{retryAfterMs:e.retryAfterMs}:{}};case"notice":return{type:"notice",text:e.text,kind:e.kind};case"tool.activity":return{type:"tool-activity",activeCount:e.activeCount,activeToolUseIds:e.activeToolUseIds};default:return null}}var o5=b(()=>{"use strict";He();fe();t5();r5()});import{stat as a$e,readFile as l$e,writeFile as c$e,rename as u$e,unlink as d$e}from"node:fs/promises";async function a5(e,{maxBytes:t,keepTailLines:n}){let r={trimmed:!1,removedLines:0},o;try{if((await a$e(e)).size<=t)return r;let a=(await l$e(e,"utf8")).split(`
|
|
1494
1494
|
`);if(a.length>0&&a[a.length-1]===""&&a.pop(),a.length<=n)return r;let l=a.slice(a.length-n),c=a.length-l.length;return o=`${e}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`,await c$e(o,l.join(`
|
|
1495
1495
|
`)+`
|
|
@@ -1522,8 +1522,8 @@ ${s}`:i;n.push(`## ${o.id} [FAILED]
|
|
|
1522
1522
|
${a}`)}return e.skipped.length>0&&n.push(`## Skipped
|
|
1523
1523
|
${e.skipped.join(", ")}`),{content:n.join(`
|
|
1524
1524
|
|
|
1525
|
-
`),truncations:r}}function p3(e){if(e)try{let t=wO(Le(),e,"compose");SDe(t,{recursive:!0,force:!0})}catch{}}function RDe(e){let t=`node "${e.nodeId}" output truncated: emitted ${e.emittedChars} of ${e.totalChars} chars`;return e.spillPath!==void 0?`${t}; full output at ${e.spillPath} (use read_file to retrieve)`:`${t}; full output unavailable (spill write failed)`}var a3,Qk,l3,c3,wg,u3,d3,Zk,SO=b(()=>{"use strict";zv();St();Ga();bO();Ka();Ge();Pt();Wf();Rr();Ha();ei();dr();s3();Hf();U();a3=1e3,Qk=36e5,l3=1,c3=1e3;wg=8e3,u3=500,d3=4e3;Zk=class{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;currentCwd;setCwd(t){this.currentCwd=t}setTraceWriter(t){this.ctx.traceWriter=t}setOnSubagentSucceeded(t){this.ctx.onSubagentSucceeded=t}async execute(t){if(t.signal.aborted)return{content:"Compose tool call aborted",isError:!0};let n,r;try{({parsed:n,warnings:r}=kDe(t.input))}catch(p){return{content:`Compose tool input validation failed: ${p instanceof Error?p.message:String(p)}`,isError:!0}}if(!this.ctx.resolveApiKeyForModel&&(!this.ctx.apiKey||this.ctx.apiKey.length===0))return{content:"Compose tool requires an API key (ctx.apiKey is missing or empty)",isError:!0};let o=this.ctx.surface!==void 0?{origin:es(this.ctx.surface),actor:ts(this.ctx.depth)}:{},i=this.ctx.depth??0,s=this.ctx.maxDepth??To();if(i>=s)return Fe({...o,event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:i}).catch(()=>{}),{content:bJ(i,s),isError:!0};let a=n.max_tool_rounds_per_node,l,c=(p,f)=>{try{Ir()?.(p,f)}catch{}},u=is(this.ctx.getReadScopeInputs?.(),this.currentCwd);l=new ke({parentAbortSignal:t.signal,apiKey:this.ctx.apiKey,parentModel:this.ctx.defaultModel,progressSink:c,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...u!==void 0?{parentReadRoots:u}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{},...this.ctx.workspaceStore!==void 0?{workspaceStore:this.ctx.workspaceStore}:{}}),this.ctx.onSubagentSucceeded!==void 0&&l.setOnSubagentSucceeded(this.ctx.onSubagentSucceeded);let d=Date.now();Fe({...o,event:"compose.started",parent_session_id:this.ctx.parentSession.sessionId,node_count:n.nodes.length,edge_count:n.edges?.length??0}).catch(()=>{});try{let p=t.id,f=n.nodes.length,g=n.nodes.map((R,P)=>{let I=kn({callSiteModel:R.model,defaultSubagentModel:this.ctx.defaultSubagentModel,defaultModel:this.ctx.defaultModel}),j=oe(typeof I=="string"?I:void 0)==="openai-compatible",O=j?void 0:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(I):Ne(I),W=j?void 0:Ja({childModel:I,resolved:O,parentApiKey:this.ctx.apiKey});return{id:R.id,agentType:`${R.id} [${P+1}/${f}]`,parentId:p,systemPrompt:this.ctx.systemPrompt,promptBuilder:q=>{let K=Object.entries(q).map(([H,Y])=>{let
|
|
1526
|
-
${
|
|
1525
|
+
`),truncations:r}}function p3(e){if(e)try{let t=wO(Le(),e,"compose");SDe(t,{recursive:!0,force:!0})}catch{}}function RDe(e){let t=`node "${e.nodeId}" output truncated: emitted ${e.emittedChars} of ${e.totalChars} chars`;return e.spillPath!==void 0?`${t}; full output at ${e.spillPath} (use read_file to retrieve)`:`${t}; full output unavailable (spill write failed)`}var a3,Qk,l3,c3,wg,u3,d3,Zk,SO=b(()=>{"use strict";zv();St();Ga();bO();Ka();Ge();Pt();Wf();Rr();Ha();ei();dr();s3();Hf();U();a3=1e3,Qk=36e5,l3=1,c3=1e3;wg=8e3,u3=500,d3=4e3;Zk=class{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;currentCwd;setCwd(t){this.currentCwd=t}setTraceWriter(t){this.ctx.traceWriter=t}setOnSubagentSucceeded(t){this.ctx.onSubagentSucceeded=t}async execute(t){if(t.signal.aborted)return{content:"Compose tool call aborted",isError:!0};let n,r;try{({parsed:n,warnings:r}=kDe(t.input))}catch(p){return{content:`Compose tool input validation failed: ${p instanceof Error?p.message:String(p)}`,isError:!0}}if(!this.ctx.resolveApiKeyForModel&&(!this.ctx.apiKey||this.ctx.apiKey.length===0))return{content:"Compose tool requires an API key (ctx.apiKey is missing or empty)",isError:!0};let o=this.ctx.surface!==void 0?{origin:es(this.ctx.surface),actor:ts(this.ctx.depth)}:{},i=this.ctx.depth??0,s=this.ctx.maxDepth??To();if(i>=s)return Fe({...o,event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:i}).catch(()=>{}),{content:bJ(i,s),isError:!0};let a=n.max_tool_rounds_per_node,l,c=(p,f)=>{try{Ir()?.(p,f)}catch{}},u=is(this.ctx.getReadScopeInputs?.(),this.currentCwd);l=new ke({parentAbortSignal:t.signal,apiKey:this.ctx.apiKey,parentModel:this.ctx.defaultModel,progressSink:c,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...u!==void 0?{parentReadRoots:u}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{},...this.ctx.workspaceStore!==void 0?{workspaceStore:this.ctx.workspaceStore}:{}}),this.ctx.onSubagentSucceeded!==void 0&&l.setOnSubagentSucceeded(this.ctx.onSubagentSucceeded);let d=Date.now();Fe({...o,event:"compose.started",parent_session_id:this.ctx.parentSession.sessionId,node_count:n.nodes.length,edge_count:n.edges?.length??0}).catch(()=>{});try{let p=t.id,f=n.nodes.length,g=n.nodes.map((R,P)=>{let I=kn({callSiteModel:R.model,defaultSubagentModel:this.ctx.defaultSubagentModel,defaultModel:this.ctx.defaultModel}),j=oe(typeof I=="string"?I:void 0)==="openai-compatible",O=j?void 0:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(I):Ne(I),W=j?void 0:Ja({childModel:I,resolved:O,parentApiKey:this.ctx.apiKey});return{id:R.id,agentType:`${R.id} [${P+1}/${f}]`,parentId:p,systemPrompt:this.ctx.systemPrompt,promptBuilder:q=>{let K=Object.entries(q).map(([H,Y])=>{let ie=typeof Y=="string"?Y:JSON.stringify(Y);return`<<<UPSTREAM_OUTPUT_BEGIN node="${H}">>>
|
|
1526
|
+
${ie}
|
|
1527
1527
|
<<<UPSTREAM_OUTPUT_END node="${H}">>>`}).join(`
|
|
1528
1528
|
|
|
1529
1529
|
`);return K.length>0?`${R.prompt}
|
|
@@ -1536,7 +1536,7 @@ ${K}`:R.prompt},model:I,idPrefix:`compose-${R.id}`,...W!==void 0?{apiKey:W}:{},.
|
|
|
1536
1536
|
${T.map(R=>`> - ${R}`).join(`
|
|
1537
1537
|
`)}
|
|
1538
1538
|
|
|
1539
|
-
`:"")+S,_=y.failed.length>0;return{content:C,isError:_}}catch(p){let f=p instanceof Error?p.message:String(p);return Fe({...o,event:"compose.failed",parent_session_id:this.ctx.parentSession.sessionId,error_message:f.slice(0,240),duration_ms:Date.now()-d}).catch(()=>{}),{content:`Compose execution error: ${f}`,isError:!0}}finally{await l.teardownAll()}}}});var m3,fd,Sg=b(()=>{"use strict";m3=["policy-refusal","timeout","budget","permission-denied","hook-block","abort","elicitation-declined","denial-breaker","repeat-failure","no-such-target"],fd=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined","no-such-target"])});import{mkdir as ADe,readFile as CDe,writeFile as f3}from"fs/promises";import{basename as _De,dirname as PDe,join as g3}from"path";function ODe(e){return Ct(e,{guard:$De})}function $De(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.kind=="string"&&typeof t.ts=="string"&&"payload"in t}function vO(e){let t=_De(PDe(e)),n=Wp();return{label:t,jsonPath:g3(n,`${t}.json`),mdPath:g3(n,`${t}.md`)}}function DDe(e,t){let n={},r={},o={},i=[],s=0,a=0,l=0,c=0,u={started:0,succeeded:0,failed:0,cancelled:0},d,p,f,g,h,y,w,S,v,x,T=!1;for(let K of e)switch(n[K.kind]=(n[K.kind]??0)+1,K.kind){case"tool_call":{let H=K.payload;if(H.phase!=="completed")break;if(H.circuitBreaker===!0){c++;break}s++;let Y=r[H.name]??{total:0,errored:0};if(Y.total++,H.isError===!0){l++,Y.errored++;let
|
|
1539
|
+
`:"")+S,_=y.failed.length>0;return{content:C,isError:_}}catch(p){let f=p instanceof Error?p.message:String(p);return Fe({...o,event:"compose.failed",parent_session_id:this.ctx.parentSession.sessionId,error_message:f.slice(0,240),duration_ms:Date.now()-d}).catch(()=>{}),{content:`Compose execution error: ${f}`,isError:!0}}finally{await l.teardownAll()}}}});var m3,fd,Sg=b(()=>{"use strict";m3=["policy-refusal","timeout","budget","permission-denied","hook-block","abort","elicitation-declined","denial-breaker","repeat-failure","no-such-target"],fd=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined","no-such-target"])});import{mkdir as ADe,readFile as CDe,writeFile as f3}from"fs/promises";import{basename as _De,dirname as PDe,join as g3}from"path";function ODe(e){return Ct(e,{guard:$De})}function $De(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.kind=="string"&&typeof t.ts=="string"&&"payload"in t}function vO(e){let t=_De(PDe(e)),n=Wp();return{label:t,jsonPath:g3(n,`${t}.json`),mdPath:g3(n,`${t}.md`)}}function DDe(e,t){let n={},r={},o={},i=[],s=0,a=0,l=0,c=0,u={started:0,succeeded:0,failed:0,cancelled:0},d,p,f,g,h,y,w,S,v,x,T=!1;for(let K of e)switch(n[K.kind]=(n[K.kind]??0)+1,K.kind){case"tool_call":{let H=K.payload;if(H.phase!=="completed")break;if(H.circuitBreaker===!0){c++;break}s++;let Y=r[H.name]??{total:0,errored:0};if(Y.total++,H.isError===!0){l++,Y.errored++;let ie=H.failureClass,M=ie??"unclassified";o[M]=(o[M]??0)+1,i.push({toolUseId:H.toolUseId,name:H.name,...ie!==void 0?{failureClass:ie}:{},durationMs:H.durationMs,ts:K.ts,truncated:H.truncated===!0,exempt:ie!==void 0&&fd.has(ie),...H.subagentId!==void 0?{subagentId:H.subagentId}:{}})}else a++;r[H.name]=Y;break}case"subagent_lifecycle":{let H=K.payload.transition;H==="started"?u.started++:H==="succeeded"?u.succeeded++:H==="failed"?u.failed++:H==="cancelled"&&u.cancelled++;break}case"closure":{let H=K.payload;d=H.reason,p=H.lastStopReason,f=H.guidance,h=H.finalCostUsd,y=H.finalTurnCount,H.finalTokens!==void 0&&(g=H.finalTokens);break}case"session_sealed":{let H=K.payload;w=H.status,S=H.finalCostUsd,v=H.finalTurnCount,x=H.closedAt,H.incomplete===!0&&(T=!0);break}default:break}let E=i.filter(K=>!K.exempt).length,C=MDe.reduce((K,H)=>K+(o[H]??0),0),_=w??"unknown",R=e[0]?.ts,P=x??(e.length>0?e[e.length-1]?.ts:void 0),I;if(R!==void 0&&P!==void 0){let K=Date.parse(P)-Date.parse(R);Number.isFinite(K)&&K>=0&&(I=K)}let $=S??h,j=v??y,O=[];_==="failed"?O.push('Session sealed with status "failed".'):_==="cancelled"?O.push("Session was cancelled."):_==="unknown"&&O.push("No terminal session_sealed record found \u2014 the trace may be truncated or was read before the session sealed."),T&&O.push("Trace was sealed by the process-exit backstop, indicating an abnormal exit (crash, early EOF, or process.exit())."),d!==void 0&&d!=="model_end_turn"&&O.push(`Closure reason "${d}" is not a clean completion.`),E>0&&O.push(`${E} tool call(s) returned an error (excluding benign outcomes).`),c>0&&O.push(`Repeat-loop circuit breaker fired ${c} time(s).`),u.failed>0&&O.push(`${u.failed} subagent(s) failed.`);let W=["Sourced from witness-trace metadata only: raw tool output (stdout/stderr, file contents, error messages) is NOT recorded in the trace and is therefore absent here.","Failure entries list tool name, failure class, duration, and timestamp; inspect the trace at the path above for full per-call detail."];_==="unknown"&&W.push("No session_sealed record was present when this receipt was generated.");let q={...$!==void 0?{finalCostUsd:$}:{},...j!==void 0?{turnCount:j}:{},...g!==void 0?{tokens:g}:{}};return{schemaVersion:IDe,generatedAt:(t.now??new Date).toISOString(),witnessLabel:t.witnessLabel,tracePath:t.tracePath,...t.sessionId!==void 0?{sessionId:t.sessionId}:{},...t.endReason!==void 0?{endReason:t.endReason}:{},status:_,...d!==void 0?{closureReason:d}:{},...p!==void 0?{lastStopReason:p}:{},...f!==void 0?{guidance:f}:{},incomplete:T,...R!==void 0?{startedAt:R}:{},...P!==void 0?{endedAt:P}:{},...I!==void 0?{durationMs:I}:{},toolCalls:{total:s,succeeded:a,errored:l,erroredNotable:E,refused:C,circuitBreakerHits:c,byTool:r,byFailureClass:o},events:{total:e.length,byKind:n},subagents:u,cost:q,failures:i,humanReviewRequired:O.length>0,humanReviewReasons:O,limitations:W}}function LDe(e){if(e<1e3)return`${e}ms`;let t=e/1e3;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),r=Math.round(t%60);return`${n}m${r}s`}function FDe(e){let t=[];t.push(`# Run receipt \u2014 ${e.witnessLabel}`),t.push(""),t.push(`**Status:** ${e.status} \xB7 **Review required:** ${e.humanReviewRequired?"\u26A0\uFE0F YES":"\u2713 no"}`);let n=[];if(e.sessionId!==void 0&&n.push(`**Session:** ${e.sessionId}`),e.endedAt!==void 0&&n.push(`**Ended:** ${e.endedAt}`),e.durationMs!==void 0&&n.push(`**Duration:** ${LDe(e.durationMs)}`),n.length>0&&t.push(n.join(" \xB7 ")),t.push(`**Trace:** \`${e.tracePath}\``),t.push(""),e.humanReviewRequired){t.push("## Why review is required");for(let o of e.humanReviewReasons)t.push(`- ${o}`);t.push("")}if(t.push("## Summary"),t.push(""),t.push("| Metric | Value |"),t.push("| --- | --- |"),t.push(`| Tool calls | ${e.toolCalls.total} |`),t.push(`| Errored | ${e.toolCalls.errored} (${e.toolCalls.erroredNotable} notable) |`),e.toolCalls.refused>0){let o=e.toolCalls.total>0?(e.toolCalls.refused/e.toolCalls.total*100).toFixed(1):"0.0";t.push(`| Refused (denylisted) | ${e.toolCalls.refused} (${o}% of calls) |`)}e.toolCalls.circuitBreakerHits>0&&t.push(`| Circuit-breaker hits | ${e.toolCalls.circuitBreakerHits} |`),e.cost.turnCount!==void 0&&t.push(`| Turns | ${e.cost.turnCount} |`),e.cost.finalCostUsd!==void 0&&t.push(`| Cost (USD) | ${e.cost.finalCostUsd.toFixed(4)} |`),e.subagents.started>0&&t.push(`| Subagents | ${e.subagents.started} started \xB7 ${e.subagents.succeeded} ok \xB7 ${e.subagents.failed} failed \xB7 ${e.subagents.cancelled} cancelled |`),e.closureReason!==void 0&&t.push(`| Closure | ${e.closureReason} |`),t.push("");let r=Object.keys(e.toolCalls.byTool).sort();if(r.length>0){t.push("## Tool calls by name"),t.push(""),t.push("| Tool | Calls | Errored |"),t.push("| --- | --- | --- |");for(let o of r){let i=e.toolCalls.byTool[o];i!==void 0&&t.push(`| ${o} | ${i.total} | ${i.errored} |`)}t.push("")}if(e.failures.length>0){t.push("## Failures"),t.push(""),t.push("| Tool | Class | Duration | When | Exempt |"),t.push("| --- | --- | --- | --- | --- |");for(let o of e.failures)t.push(`| ${o.name} | ${o.failureClass??"unclassified"} | ${o.durationMs}ms | ${o.ts} | ${o.exempt?"yes":"no"} |`);t.push("")}else t.push("No tool failures recorded."),t.push("");t.push("## Limitations"),t.push("");for(let o of e.limitations)t.push(`- ${o}`);return t.push(""),t.push("---"),t.push(`_Generated ${e.generatedAt} by the AFK run-receipt writer (read-only; no agent behavior was modified)._`),t.push(""),t.join(`
|
|
1540
1540
|
`)}async function NDe(e){let t;try{t=await CDe(e.tracePath,"utf8")}catch{return null}let n=ODe(t);if(n.length===0)return null;let r=vO(e.tracePath),o=DDe(n,{tracePath:e.tracePath,witnessLabel:r.label,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.reason!==void 0?{endReason:e.reason}:{},...e.now!==void 0?{now:e.now}:{}});return await ADe(Wp(),{recursive:!0}),await f3(r.jsonPath,JSON.stringify(o,null,2)+`
|
|
1541
1541
|
`,"utf8"),await f3(r.mdPath,FDe(o),"utf8"),r}var IDe,MDe,h3,kO=b(()=>{"use strict";U();F();Wo();Sg();IDe=1,MDe=["permission-denied","hook-block","policy-refusal"];h3=async e=>{if(e.event!=="SessionEnd")return{};if(e.parentSessionId!==void 0)return{};if(k.AFK_RUN_RECEIPT_DISABLED==="1")return{};if(e.tracePath===void 0)return{};try{await NDe({tracePath:e.tracePath,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.reason!==void 0?{reason:e.reason}:{}})}catch{}return{}}});import*as eT from"node:fs";import*as w3 from"node:fs/promises";import{dirname as BDe}from"node:path";import{randomUUID as UDe}from"node:crypto";function y3(e,t){eT.mkdirSync(BDe(e),{recursive:!0,mode:448}),eT.appendFileSync(e,JSON.stringify(t)+`
|
|
1542
1542
|
`,{encoding:"utf8",mode:384})}async function b3(e){let t;try{t=await w3.readFile(e,"utf8")}catch(r){if(r.code==="ENOENT")return[];throw r}let n=[];for(let r of t.split(`
|
|
@@ -1797,12 +1797,12 @@ Open this URL to authorize:
|
|
|
1797
1797
|
${n}
|
|
1798
1798
|
Status written to: ${yc()}
|
|
1799
1799
|
`)}_readSlot(){let t=this.backend.read();if(!t)return{};try{return JSON.parse(t).mcpOAuth?.[this.serverName]??{}}catch{return{}}}_updateSlot(t){let n=this.backend.read(),r={};if(n)try{r=JSON.parse(n)}catch{}let o=r.mcpOAuth??{},i=o[this.serverName]??{};o[this.serverName]=t(i),r.mcpOAuth=o,this.backend.write(JSON.stringify(r))}}});import*as R9 from"node:path";function DT(e=process.env){return e.AFK_DEMO_CLEAN==="1"||typeof e.SCRIPT=="string"&&e.SCRIPT.length>0||e.ASCIINEMA_REC==="1"}function TNe(e=process.env){return e.AFK_BELL==="1"}function LT(e=process.env){return e.AFK_REDUCED_MOTION==="1"}function A9(e=process.env){return e.AFK_CARET_BLINK!=="0"}function FT(e=process.env){return e.AFK_GOBLIN_SPINNER!=="0"}function C9(e=process.env){let t=e.AFK_GOBLIN_MASCOT;return t==="1"||t==="true"}function $d(e,t=process.env){TNe(t)&&e.isTTY&&e.write("\x07")}function xNe(e=process.env){return e.AFK_TERM_TITLE!=="0"}function ENe(e=process.env){return e.AFK_NOTIFY==="1"}function _9(e=process.env){return e.AFK_TURN_SEPARATOR!=="0"}function Fg(e,t){let n=R9.basename(e)||e;return t?`afk \u2014 ${n} \xB7 running`:`afk \u2014 ${n}`}function P9(e){return e.replace(/[\x00-\x1F\x7F-\x9F]/g,"")}function Dd(e,t,n=process.env){xNe(n)&&e.isTTY&&e.write(`\x1B]2;${P9(t)}\x07`)}function I9(e,t,n=process.env){ENe(n)&&e.isTTY&&e.write(`\x1B]9;${P9(t)}\x07`)}var mi=b(()=>{"use strict"});function Ng(e){return RNe.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function As(e,t){let n=["afk","interactive"];return typeof t=="string"&&t.length>0&&n.push("--model",Ng(t)),n.push("--resume",Ng(e)),n.join(" ")}var RNe,Ld=b(()=>{"use strict";RNe=/^[A-Za-z0-9_@%+=:,./-]+$/});function MNe(){return c$}function ge(e){if(xn.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);xn.set(e.name,e);for(let t of e.aliases??[]){if(Cs.has(t)||xn.has(t))throw new Error(`Slash alias collides: ${t}`);Cs.set(t,e.name)}c$++}function _s(e){if(xn.has(e.name)){for(let[t,n]of Cs.entries())n===e.name&&Cs.delete(t);xn.delete(e.name)}ge(e)}function M9(e){xn.has(e.name)||ge(e)}function ONe(e){return xn.has(e)||Cs.has(e)}function Fd(){return{has:e=>ONe(`/${e}`),version:MNe}}function O9(){xn.clear(),Cs.clear(),c$++}function Br(){return[...xn.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Nd(){let e=[];for(let[t,n]of Cs.entries()){let r=xn.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function UT(e){if(xn.has(e))return xn.get(e);let t=Cs.get(e);return t?xn.get(t):void 0}function $Ne(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 i=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]+i)}return n[e.length][t.length]}function DNe(e,t=3){let n;for(let r of xn.keys()){let o=$Ne(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function u$(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 $9(e,t,n){let r=u$(e);if(r===null)return{handled:!1};let o=UT(r.name);if(!o){let a=DNe(r.name);return a?t.out.warn(`Unknown command: ${r.name} (did you mean ${a}?)`):t.out.warn(`Unknown command: ${r.name} (type /help for commands)`),{handled:!0,result:"continue"}}let i=n??[];i.length>0&&o.acceptsAttachments!==!0&&t.out.warn(`\u26A0 Image attachments are ignored by ${r.name} (images only reach the model on skill commands like /forge, /mint).`);let s=await o.handler(t,r.args,o.acceptsAttachments===!0?i:void 0);return s==="forward"?{handled:!1}:{handled:!0,result:s}}var xn,Cs,c$,Ht=b(()=>{"use strict";xn=new Map,Cs=new Map,c$=0});function D9(e){Hn=e}function Ot(e){return e.includes(":")?e.split(":").pop():e}var Hn,Bd=b(()=>{"use strict";Hn={discovered:[],collisions:[],shadowedBareNames:new Set}});import{readdirSync as LNe,readFileSync as FNe,statSync as L9}from"fs";import{join as NNe,basename as BNe,dirname as UNe}from"path";function d$(e){return Ug(e).flags}function Ug(e){let t=e??Kr(),n=new Map,r=new Map;try{L9(t)}catch{return{flags:n,categories:r}}let o=(i,s)=>{if(s>8)return;let a;try{a=LNe(i)}catch{return}for(let l of a){let c=NNe(i,l),u;try{u=L9(c)}catch{continue}if(u.isDirectory()){o(c,s+1);continue}if(l!=="SKILL.md"||!u.isFile())continue;let d;try{d=FNe(c,"utf-8")}catch{continue}let p=BNe(UNe(c));if(!p)continue;let f=eg(d),g=f.frontmatterFlags&&f.frontmatterFlags.length>0?f.frontmatterFlags:g0(`${f.frontmatter?.["argument-hint"]??""}
|
|
1800
|
-
${f.body}`);if(g.length>0){let y=n.get(p)??[],w=new Set([...y,...g]);n.set(p,Array.from(w).sort())}let h=f.frontmatter?.category;h&&h.length>0&&r.set(p,h)}};return o(t,0),{flags:n,categories:r}}function F9(){let e=d$();for(let[t,n]of d$(Zs())){let r=e.get(t)??[];e.set(t,Array.from(new Set([...r,...n])).sort())}return e}function Ps(e){if(!e)return;let t=e.split(/(?<=[.!?])\s+/);for(let n of t){let r=/^(Use(?:d)? when\b.*|When\s+(?:the\s+user\s+|to\s+)?\b.*)$/i.exec(n.trim());if(r&&r[1]){let o=r[1].trim();if(o.length>=12)return o}}}var jg=b(()=>{"use strict";U();h0()});function HT(e){return e==="user"?"user":e==="project"?"project":e?.startsWith("imported:")?"imported":"builtin"}function jT(e){switch(e){case"builtin":return"built-in";case"user":return"user";case"project":return"project";case"plugin":return"plugin";case"imported":return"imported";case"command":return"command"}}function p$(e,t){try{let n=Ye(e);return cr(n,t)?n:void 0}catch{return}}function jNe(e,t){let n=[];for(let r of vu(t))r.includes(":")&&Ot(r)===e&&n.push({slash:`/${r}`,source:HT(Ye(r).origin)});for(let r of Hn.collisions)r.bare===e&&n.push({slash:r.altSlash,source:r.source??"plugin"});return n}function m$(e,t,n,r){let o=t.replace(/^\//,"").trim(),i=p$(o,r),s=n.find(w=>Ot(w.name)===o||w.name===o);if(!i&&!s){e.out.line(),e.out.line(m.dim(` No skill found matching "${
|
|
1800
|
+
${f.body}`);if(g.length>0){let y=n.get(p)??[],w=new Set([...y,...g]);n.set(p,Array.from(w).sort())}let h=f.frontmatter?.category;h&&h.length>0&&r.set(p,h)}};return o(t,0),{flags:n,categories:r}}function F9(){let e=d$();for(let[t,n]of d$(Zs())){let r=e.get(t)??[];e.set(t,Array.from(new Set([...r,...n])).sort())}return e}function Ps(e){if(!e)return;let t=e.split(/(?<=[.!?])\s+/);for(let n of t){let r=/^(Use(?:d)? when\b.*|When\s+(?:the\s+user\s+|to\s+)?\b.*)$/i.exec(n.trim());if(r&&r[1]){let o=r[1].trim();if(o.length>=12)return o}}}var jg=b(()=>{"use strict";U();h0()});function HT(e){return e==="user"?"user":e==="project"?"project":e?.startsWith("imported:")?"imported":"builtin"}function jT(e){switch(e){case"builtin":return"built-in";case"user":return"user";case"project":return"project";case"plugin":return"plugin";case"imported":return"imported";case"command":return"command"}}function p$(e,t){try{let n=Ye(e);return cr(n,t)?n:void 0}catch{return}}function jNe(e,t){let n=[];for(let r of vu(t))r.includes(":")&&Ot(r)===e&&n.push({slash:`/${r}`,source:HT(Ye(r).origin)});for(let r of Hn.collisions)r.bare===e&&n.push({slash:r.altSlash,source:r.source??"plugin"});return n}function m$(e,t,n,r){let o=t.replace(/^\//,"").trim(),i=p$(o,r),s=n.find(w=>Ot(w.name)===o||w.name===o);if(!i&&!s){e.out.line(),e.out.line(m.dim(` No skill found matching "${le(o)}".`)),e.out.line(m.dim(" Run /skills to see everything available.")),e.out.line();return}let a=i?.name??Ot(s.name),l=i?.description??s.description,c=i?.argumentHint??s?.argumentHint,u=c?`/${a} ${c}`:`/${a}`,d=i?HT(i.origin):s?.source??"plugin",p=Math.max(20,ne()),f=Math.max(20,Math.min(p-2,100));e.out.line(),e.out.line(` ${m.warning(u)}`),e.out.line();for(let w of pe(l,f).split(`
|
|
1801
1801
|
`))e.out.line(` ${w}`);let g=i?.whenToUse??s?.whenToUse??Ps(l);if(g&&g!==l.trim()){e.out.line(),e.out.line(` ${m.bold("When to use")}`);for(let w of pe(g,f).split(`
|
|
1802
1802
|
`))e.out.line(` ${m.dim(w)}`)}let h=i?.flags??F9().get(o);h&&h.length>0&&(e.out.line(),e.out.line(` ${m.bold("Flags")} ${m.dim(h.join(", "))}`)),e.out.line(),e.out.line(` ${m.bold("Source")} ${m.dim(jT(d))}`);let y=jNe(a,r);if(y.length>0){e.out.line(),e.out.line(` ${m.bold("Alternatives")}`);for(let w of y)e.out.line(` ${m.dim("\u21B3")} ${m.warning(w.slash)} ${m.dim(`(${jT(w.source)} \u2014 shadowed by /${a})`)}`)}e.out.line()}var N9=b(()=>{"use strict";Xt();L();tt();we();jg();Bd();We()});function f$(e,t){if(e.length===0)return!0;let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&(n+=1);return n===e.length}function B9(e,t){let n=e.name.toLowerCase(),r=n.includes(":")?n.split(":").pop():n;if(r.startsWith(t)||n.startsWith(t))return 0;if(f$(t,r)||f$(t,n))return 1;let o=e.description.toLowerCase(),i=(e.hint??"").toLowerCase(),s=`${o} ${i}`;return s.includes(t)?2:f$(t,s)?3:null}function U9(e,t){let n=t.trim().toLowerCase();if(n.length===0)return[];let r=n.split(/\s+/).filter(s=>s.length>0),o=[[],[],[],[]];for(let s of e){let a;if(r.length===1)a=B9(s,r[0]);else{let l=0,c=!0;for(let u of r){let d=B9(s,u);if(d===null){c=!1;break}d>l&&(l=d)}a=c?l:null}a!==null&&o[a].push({skill:s,tier:a})}let i=(s,a)=>s.skill.name.localeCompare(a.skill.name);for(let s of o)s.sort(i);return[].concat(...o)}var j9=b(()=>{"use strict"});function g$(e,t){let n=[],r=new Set;for(let o of vu(t)){let i=Ye(o),s=i.argumentHint??Ps(i.description);n.push({name:o,description:i.description,...s!==void 0?{hint:s}:{}}),r.add(o),r.add(Ot(o))}for(let o of e){let i=Ot(o.name);if(r.has(o.name)||r.has(i))continue;let s=Hn.collisions.find(c=>c.bare===i),a=s?s.altSlash.replace(/^\//,""):o.name,l=o.argumentHint??Ps(o.description);n.push({name:a,description:o.description,...l!==void 0?{hint:l}:{}})}return n}function HNe(e,t,n,r){let{skill:o}=t,i=`/${o.name}`,s=o.hint?`${i} ${o.hint}`:i,a=pe(o.description,r).split(`
|
|
1803
|
-
`);if(G(s)>n-1){e.out.line(" "+m.warning(s));for(let l of a)e.out.line(" "+" ".repeat(n)+m.dim(l))}else{let l=st(m.warning(s),n);e.out.line(" "+l+m.dim(a[0]??""));for(let c of a.slice(1))e.out.line(" "+" ".repeat(n)+m.dim(c))}}function h$(e,t,n){let r=U9(t,n);if(e.out.line(),r.length===0){e.out.line(m.dim(` No skills matched "${
|
|
1803
|
+
`);if(G(s)>n-1){e.out.line(" "+m.warning(s));for(let l of a)e.out.line(" "+" ".repeat(n)+m.dim(l))}else{let l=st(m.warning(s),n);e.out.line(" "+l+m.dim(a[0]??""));for(let c of a.slice(1))e.out.line(" "+" ".repeat(n)+m.dim(c))}}function h$(e,t,n){let r=U9(t,n);if(e.out.line(),r.length===0){e.out.line(m.dim(` No skills matched "${le(n)}".`)),e.out.line(m.dim(" Try a shorter term, or run /skills to browse everything.")),e.out.line();return}let o=Math.max(20,ne()),i=r.reduce((l,c)=>Math.max(l,G(c.skill.hint?`/${c.skill.name} ${c.skill.hint}`:`/${c.skill.name}`)),0),s=Math.min(i+2,Math.max(10,Math.floor((o-2)*.45))),a=Math.max(12,o-2-s);e.out.line(m.bold("Skills matching")+m.dim(` "${le(n)}"`)+m.dim(` (${r.length} result${r.length===1?"":"s"})`)),e.out.line();for(let l of r)HNe(e,l,s,a);e.out.line(),e.out.line(m.dim(" Tip: /skills <name> for full details \xB7 /skills to browse everything")),e.out.line()}var H9=b(()=>{"use strict";Xt();L();tt();we();de();j9();jg();Bd();We()});function KNe(e,t){let n=new Map,r=(i,s)=>{let a=Ot(i.slashName.replace(/^\//,"")),l=n.get(a);l?(l.alts.push(i),!l.category&&s&&l.main.source!=="builtin"&&(l.category=s)):n.set(a,{main:i,alts:[],...s?{category:s}:{}})};for(let i of vu(t)){let s=Ye(i),a=`/${i}`,l=s.argumentHint?`${a} ${s.argumentHint}`:a;r({slashName:a,display:l,description:s.description,source:HT(s.origin)},s.category)}let o=new Map(Hn.collisions.map(i=>[i.bare,i.altSlash]));for(let i of e){let s=Ot(i.name),l=o.get(s)??`/${i.name}`,c=i.argumentHint?`${l} ${i.argumentHint}`:l;r({slashName:l,display:c,description:i.description,source:i.source??"plugin"},i.category)}return n}function b$(e,t){let n=Ot(e.main.slashName.replace(/^\//,"")),r=Ot(t.main.slashName.replace(/^\//,""));return n.localeCompare(r)}function w$(e,t,n,r){let{main:o,alts:i}=t,s=pe(o.description,r).split(`
|
|
1804
1804
|
`);if(G(o.display)>n-1){e.out.line(" "+m.warning(o.display));for(let a of s)e.out.line(" "+" ".repeat(n)+m.dim(a))}else{let a=st(m.warning(o.display),n);e.out.line(" "+a+m.dim(s[0]??""));for(let l of s.slice(1))e.out.line(" "+" ".repeat(n)+m.dim(l))}if(i.length>0){let a=i.map(l=>l.slashName).join(", ");for(let l of pe(`\u21B3 also: ${a}`,r).split(`
|
|
1805
|
-
`))e.out.line(" "+" ".repeat(n)+m.dim(l))}}function W9(e,t,n){let r=KNe(t,n);if(e.out.line(),r.size===0){e.out.line(m.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}let o=Array.from(r.values()),i=o.reduce((f,g)=>f+g.alts.length,0),s=Math.max(20,ne()),a=o.reduce((f,g)=>Math.max(f,G(g.main.display)),0),l=Math.min(a+2,Math.max(10,Math.floor((s-2)*.45))),c=Math.max(12,s-2-l);e.out.line(m.bold("Skills")+m.dim(` (${o.length})`));let u=new Set(o.map(f=>f.main.source)),d=WNe.filter(f=>u.has(f)).map(jT).join(" \xB7 ");if(e.out.line(m.dim(` ${d} \u2014 /skills <name> for details`)),o.some(f=>f.category)){let f=new Map;for(let h of o){let w=Ef.includes(h.category??"")?h.category:_S,S=f.get(w)??[];S.push(h),f.set(w,S)}let g=[...Ef.filter(h=>f.has(h)),...f.has(_S)?[_S]:[]];for(let h of g){let y=(f.get(h)??[]).sort(b$);if(y.length!==0){e.out.line(),e.out.line(
|
|
1805
|
+
`))e.out.line(" "+" ".repeat(n)+m.dim(l))}}function W9(e,t,n){let r=KNe(t,n);if(e.out.line(),r.size===0){e.out.line(m.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}let o=Array.from(r.values()),i=o.reduce((f,g)=>f+g.alts.length,0),s=Math.max(20,ne()),a=o.reduce((f,g)=>Math.max(f,G(g.main.display)),0),l=Math.min(a+2,Math.max(10,Math.floor((s-2)*.45))),c=Math.max(12,s-2-l);e.out.line(m.bold("Skills")+m.dim(` (${o.length})`));let u=new Set(o.map(f=>f.main.source)),d=WNe.filter(f=>u.has(f)).map(jT).join(" \xB7 ");if(e.out.line(m.dim(` ${d} \u2014 /skills <name> for details`)),o.some(f=>f.category)){let f=new Map;for(let h of o){let w=Ef.includes(h.category??"")?h.category:_S,S=f.get(w)??[];S.push(h),f.set(w,S)}let g=[...Ef.filter(h=>f.has(h)),...f.has(_S)?[_S]:[]];for(let h of g){let y=(f.get(h)??[]).sort(b$);if(y.length!==0){e.out.line(),e.out.line(ae(le(h)));for(let w of y)w$(e,w,l,c)}}}else{let f=o.filter(h=>h.main.source==="builtin").sort(b$),g=o.filter(h=>h.main.source!=="builtin").sort(b$);if(f.length>0){e.out.line(),e.out.line(ae("Built-in"));for(let h of f)w$(e,h,l,c)}if(g.length>0){e.out.line(),e.out.line(f.length>0?ae("Plugins & user skills"):ae());for(let h of g)w$(e,h,l,c)}}e.out.line(),e.out.line(m.dim(i>0?" Tip: \u21B3 also lines show alternative (shadowed) forms \xB7 /skills <name> for full details":" Tip: /skills <name> for full details on a skill")),e.out.line()}function K9(e,t,n){let r=e.replace(/^\//,"").trim();return p$(r,n)!==void 0?!0:t.some(o=>Ot(o.name)===r||o.name===r)}function G9(e){return{name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",usage:"/skills [name | query]",hint:"Browse every skill the session can dispatch \u2014 pass a name for full details, or a search query to find skills by intent.",async handler(t,n){let r=k.AFK_INTERNAL==="1",o=n.trim();return o&&!o.startsWith("-")?K9(o,e,r)?m$(t,o,e,r):h$(t,g$(e,r),o):W9(t,e,r),"continue"}}}var y$,WNe,S$,WT=b(()=>{"use strict";Xt();L();ht();tt();we();de();F();Bd();N9();H9();We();y$={builtin:0,user:1,project:2,plugin:3,command:4,imported:5},WNe=Object.keys(y$).sort((e,t)=>y$[e]-y$[t]);S$={name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",usage:"/skills [name | query]",hint:"Browse every skill the session can dispatch \u2014 pass a name for full details, or a search query to find skills by intent.",async handler(e,t){let n=k.AFK_INTERNAL==="1",r=t.trim();return r&&!r.startsWith("-")?K9(r,[],n)?m$(e,r,[],n):h$(e,g$([],n),r):W9(e,[],n),"continue"}}});import{basename as GNe}from"path";function qNe(e,t,n){let r=new Set([e]);t&&r.add(t);for(let[o,i]of Object.entries(n)){if(r.has(o))return i;let s=o.includes(":")?o.split(":").pop():o;if(r.has(s)||i.manifestName&&r.has(i.manifestName))return i}return null}function q9(e={}){let t=e.roots??[qp(),Ze(),Zs()],n=Me(e.indexPath??Te()),r=[],o=new Set;for(let i of t)for(let s of Lr(i)){if(s.type!=="local")continue;let a=s.path,l=GNe(a),{name:c,version:u}=si(a),d=c??l;if(o.has(d))continue;o.add(d);let p=qNe(l,c,n.plugins);r.push({name:d,version:u,ref:p?.ref??null,commit:p?.commit??null,source:p?.source??null,sourceType:p?.sourceType??null,dir:a})}return r.sort((i,s)=>i.name.localeCompare(s.name)),r}function z9(e){let t;return e.version?t=/^v/i.test(e.version)?e.version:`v${e.version}`:e.ref?t=e.ref:t="(local)",e.commit&&e.commit!==e.ref&&(t+=` @ ${e.commit.slice(0,7)}`),t}var J9=b(()=>{"use strict";U();Fr();Bn();rg()});function JNe(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(m.dim(" No plugin agents loaded. Agents come from `agents:` entries in plugin.json or from ~/.afk/agents/.")),t.out.line(),"continue";t.out.line(m.bold("Plugin agents")+m.dim(` (${e.length} loaded)`)),t.out.line(ae(void 0,60));let n=e.reduce((r,o)=>Math.max(r,o.name.length),0)+2;for(let r of e){let o=m.warning(r.name.padEnd(n)),i=r.model?m.dim(`[${r.model}]`):"",s=r.description?m.dim(` ${r.description}`):"";t.out.line(` ${o} ${i}${s}`)}return t.out.line(),t.out.line(m.dim(" Agents are dispatched by the model via the Task tool \u2014 not user-invoked.")),t.out.line(),"continue"}}}async function KT(e){let t;try{t=await e.supportedAgents()}catch(n){return console.error(m.dim(" \u26A0 Plugin-agent discovery failed: ")+(n instanceof Error?n.message:String(n))),null}return v$=t.map(n=>{let r={name:n.name,description:n.description};return n.model&&(r.model=n.model),r}),_s(JNe(v$)),v$.length}function V9(){ge(zNe)}var v$,zNe,GT=b(()=>{"use strict";aa();L();Ht();v$=[],zNe={name:"/agents",summary:"List plugin-provided subagents (loads after session init)",async handler(e){return e.out.line(),e.out.line(m.dim(" Plugin agents are still loading \u2014 try again after the session is ready.")),e.out.line(),"continue"}}});import Is from"string-width";function Sl(e){let{buffer:t,promptText:n,isTTY:r,attachmentSummary:o}=e,i=o&&o.length>0?o:null;if(!r){let g=n+t;return i!==null?`${g} ${i}`:g}let s=e.terminalWidth??ne(),a=t.includes(`
|
|
1806
1806
|
`),l=Is(Ie(t)),c=l>=s-2,u;if(!a&&!c){let g=m.user("\u25B6")+" ",h=2,y=s-1,w=Math.max(0,y-l-h);u=g+" ".repeat(w)+t}else u=Ac({kind:"user",body:t});if(i===null)return u;let d=Is(i),p=Math.max(0,s-1-d),f=" ".repeat(p)+m.dim(i);return u+`
|
|
1807
1807
|
`+f}function k$(e,t,n){let r=n||80,o=e.split(`
|
|
1808
1808
|
`),i=0;for(let s=0;s<o.length;s++){let a=Ie(o[s]),l=(s===0?t:0)+Is(a);i+=Math.max(1,Math.ceil(l/r))}return Math.max(0,i-1)}function Y9(e,t,n,r){let o=r||80,i=e.split(`
|
|
@@ -1924,7 +1924,7 @@ ${e.replace(/<\/system-reminder>/gi,"")}
|
|
|
1924
1924
|
${t}`}var _te=b(()=>{"use strict"});function Ite(){Pte||(Pte=!0,$D("review",kte),xte())}var Pte,Wx=b(()=>{"use strict";LD();OD();LD();Cte();_te();Pte=!1});function BD(e,t){let n=`/${e.name}`,r=e.argumentHint?`${n} ${e.argumentHint}`:void 0,o=Ps(e.description);return{name:n,summary:e.description,acceptsAttachments:!0,...r!==void 0?{usage:r}:{},...o?{hint:o}:{},...t&&t.length>0?{flags:t}:{},async handler(i,s,a){let l=Ot(e.name)==="review",c=s,u=[],d=null;if(l){let f=WQ(s);u=f.targets,c=f.cleanedArgs;for(let g of f.unknown)i.out.warn(`/review: unknown --post target "${g}" \u2014 expected "github" or "telegram".`);u.length===0&&f.unknown.length===0&&/--post\b/.test(s)&&i.out.warn('/review: --post needs a target \u2014 try "--post github" or "--post telegram".');try{d=MD(c)}catch{d=null}}let p={name:e.name,description:e.description,handler:async()=>{},context:"inline"};try{let f=await Ux(i,{skillName:e.name,skillMeta:p,args:c,attachments:a,preflight:async()=>{let g=e.name.includes(":")?e.name.split(":").pop()??e.name:e.name,h={skillName:g,rawArgs:c,source:e.source??"plugin",capabilities:{compose:!0,subagents:!0}},y=i.session.current.sessionId,w=Nl(y);return(await Fl(h,{cwd:i.stats.cwd??process.cwd(),artifactDir:w},v=>{k.AFK_SKILL_STREAM_VERBOSE==="1"&&i.out.warn(`preflight(${g}) failed: ${v instanceof Error?v.message:String(v)}`)}))?.manifestBlock}});l&&u.length>0&&await TT(i.out,{targets:u,reviewText:f,prRefFromArgs:d})}catch(f){i.out.line(),i.out.error(`${e.name} failed: ${f instanceof Error?f.message:String(f)}`)}return"continue"}}}async function Kx(e){let t;try{t=await e.supportedCommands()}catch(u){return console.error(m.dim(" \u26A0 Plugin-skill discovery failed: ")+(u instanceof Error?u.message:String(u))),null}let{flags:n,categories:r}=Ug(),o=Ug(await Promise.resolve().then(()=>(U(),uB)).then(u=>u.getBundledPluginsDir()));for(let[u,d]of o.flags){let p=n.get(u)??[];n.set(u,Array.from(new Set([...p,...d])).sort())}for(let[u,d]of o.categories)r.has(u)||r.set(u,d);let i=t.map(u=>{let d=Ot(u.name),p=r.get(d);return{name:u.name,description:u.description??"",...u.argumentHint?{argumentHint:u.argumentHint}:{},...u.whenToUse?{whenToUse:u.whenToUse}:{},...u.source?{source:u.source}:{},...p?{category:p}:{}}}),s=k.AFK_INTERNAL==="1",a=new Set(go().filter(u=>cr(Ye(u),s)).map(Ot)),l=[],c=new Set;for(let u of i){let d=`/${u.name}`;if(Pje.has(d))continue;let p=Ot(u.name),f=n.get(p);if(a.has(p)){let g=u.name.includes(":")?u.name:`plugin:${u.name}`,h={...u,name:g};_s(BD(h,f)),l.push({bare:p,altSlash:`/${g}`,...u.source?{source:u.source}:{}}),c.add(p);continue}_s(BD(u,f))}return D9({discovered:i,collisions:l,shadowedBareNames:c}),_s(G9(i)),i.length}function UD(){return Hn.collisions.length===0?[]:Hn.collisions.map(e=>m.dim(` /${e.bare}: vendored or user skill wins; plugin form ${e.altSlash} stays reachable.`))}async function mh(e){let[t,n]=await Promise.all([Kx(e),KT(e)]);return{skillCount:t,agentCount:n}}var Pje,jD=b(()=>{"use strict";Xt();L();GT();Ht();PD();t$();OD();Wx();F();jg();WT();Bd();Pje=new Set(["/exit","/quit","/clear","/compact","/help"])});function Mte(e){let t={builtin:0,plugin:0,user:0,project:0,imported:0,command:0};for(let r of e)t[r.source]++;return[["builtin","built-in"],["plugin","plugin"],["user","user"],["project","project"],["imported","imported"],["command","command"]].filter(([r])=>t[r]>0).map(([r,o])=>`${t[r]} ${o}`).join(" \xB7 ")}function Ote(e,t){return e.size===0?null:{added:[...t].filter(n=>!e.has(n)).sort(),removed:[...e].filter(n=>!t.has(n)).sort()}}function $te(e){let{added:t,removed:n}=e;if(t.length===0&&n.length===0)return"";let r=[];t.length&&r.push(`+${t.length}`),n.length&&r.push(`\u2212${n.length}`);let o=`${r.join(" ")} since last reload`,i=[];return t.length>0&&t.length<=3&&i.push(`new: ${t.map(s=>`/${s}`).join(", ")}`),n.length>0&&n.length<=3&&i.push(`gone: ${n.map(s=>`/${s}`).join(", ")}`),i.length>0&&(o+=` (${i.join("; ")})`),o}function Dte(e){if(e.length===0)return[];let t=8,n=e.slice(0,t),r=Math.min(24,n.reduce((i,s)=>Math.max(i,s.name.length),0)),o=n.map(i=>m.dim(` ${i.name.padEnd(r)} ${z9(i)}`));return e.length>t&&o.push(m.dim(` \u2026and ${e.length-t} more`)),o}var HD,WD=b(()=>{"use strict";Fr();Mr();J9();L();GT();jD();Bd();HD={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");let t=new Set(Hn.discovered.map(a=>a.name));Dr();try{let a=e.session.current.getQuery();typeof a.reloadPlugins=="function"&&await a.reloadPlugins()}catch(a){e.out.warn(`Plugin reload failed: ${a instanceof Error?a.message:String(a)}`)}let[n,r]=await Promise.all([Kx(e.session.current),KT(e.session.current)]);if(n===null&&r===null)return e.out.error("Could not refresh plugin skills or agents."),e.out.line(),"continue";let o=q9(),i=[];n!==null&&i.push(`${n} skill${n===1?"":"s"}`),r!==null&&i.push(`${r} agent${r===1?"":"s"}`);let s=o.length>0?` from ${o.length} plugin${o.length===1?"":"s"}`:"";if(e.out.success(`Reloaded ${i.join(" + ")}${s}.`),n!==null){let a=Mte(qa()),l=Ote(t,new Set(Hn.discovered.map(d=>d.name))),c=l?$te(l):"",u=[a,c].filter(d=>d.length>0);u.length>0&&e.out.line(m.dim(` ${u.join(" \xB7 ")}`))}for(let a of Dte(o))e.out.line(a);return e.out.line(),"continue"}}});function Lte(){ge(S$),ge(HD)}var Gx=b(()=>{"use strict";Ht();WT();WD();jg();WT();jD();WD()});var fh=b(()=>{"use strict";kr()});function qx(e){if(e!==void 0&&!(e.fiveHourUtilization===void 0&&e.sevenDayUtilization===void 0))return{...e.fiveHourUtilization!==void 0?{fiveHour:{utilization:e.fiveHourUtilization,...e.fiveHourResetsAt!==void 0?{resetsAt:e.fiveHourResetsAt}:{}}}:{},...e.sevenDayUtilization!==void 0?{sevenDay:{utilization:e.sevenDayUtilization,...e.sevenDayResetsAt!==void 0?{resetsAt:e.sevenDayResetsAt}:{}}}:{},observedAt:e.observedAt}}function Fte(e){return e>Mje?"critical":e>Ije?"caution":"calm"}function Dje(e){return e==="critical"?m.error:e==="caution"?m.warning:m.chrome}function KD(e){let t=Math.floor(e/6e4);if(t<1)return"<1m";let n=Math.floor(t/1440),r=Math.floor(t%1440/60),o=t%60;return n>0?`${n}d${r}h`:r>0?`${r}h${o}m`:`${o}m`}function Lje(e){let t=[];return e.fiveHour!==void 0&&t.push({label:"5h",state:e.fiveHour,severity:Fte(e.fiveHour.utilization)}),e.sevenDay!==void 0&&t.push({label:"7d",state:e.sevenDay,severity:Fte(e.sevenDay.utilization)}),t}function Fje(e){return e.reduce((t,n)=>t===void 0||n.state.utilization>t.state.utilization?n:t,void 0)}function Nje(e){return e.some(t=>t.severity==="critical")?"critical":e.some(t=>t.severity==="caution")?"caution":"calm"}function Nte(e,t=new Date){let n=Lje(e);if(n.length===0)return;let r=Nje(n),o=e.observedAt!==void 0&&t.getTime()-e.observedAt.getTime()>Oje,i=r==="calm"?void 0:Fje(n),s=n.map(l=>{let c=Dje(l.severity),u=`${Math.round(l.state.utilization*100)}%`,d=`${m.meta(l.label)} ${c(u)}`;if(l===i&&l.state.resetsAt!==void 0){let p=l.state.resetsAt.getTime()-t.getTime();p>0&&(d+=` ${m.meta(`${$je}${KD(p)}`)}`)}return d});return{text:(o?m.meta("~"):"")+s.join(m.dim(" \xB7 ")),severity:r,stale:o}}var Ije,Mje,Oje,$je,gh=b(()=>{"use strict";L();Ije=.5,Mje=.8,Oje=600*1e3,$je="\u27F3"});import{statSync as Bje}from"node:fs";function zx(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.unpricedTurns=t.unpricedTurns??0,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.name=t.name,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}function Uje(e){try{return Bje(e).isDirectory()}catch{return!1}}function jte(e,t){if(e!==void 0)return e;if(t!==void 0&&Uje(t))return t}function Jx(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=Ute(Bte(r.user),80),i=Ute(jje(Bte(r.assistant)),120);o.length>0&&t.fn(m.dim(` Last: ${o}`)),i.length>0&&t.fn(m.dim(` \u21B3 ${i}`)),t.fn(m.dim(" \u21AA /history for full review"))}function Bte(e){return ve(e).replace(/\s+/g," ").trim()}function jje(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function Ute(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}function GD(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];return n?(n.footprint??n.input+n.output+n.cache)/at(e.model):0}function fr(e,t,n,r){let o=GD(e,t),i=at(e.model),s,a=t?.getDetail();if(a!==void 0)s=a.used;else{let f=e.turnTokens[e.turnTokens.length-1];f&&(s=f.footprint??f.input+f.output+f.cache)}let l;if(e.turnTokens.length>=2){let f=e.turnTokens.map(h=>(h.footprint??h.input+h.output+h.cache)/i),g=xU(f,5);g.length>0&&(l=g)}let c=n?.getBranch(),u=n?.getPr(),d=qx(AS()),p=e.totalTurns>0?e.totalTurns:void 0;return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:o,contextLimit:i,contextUsedTokens:s,contextSparkline:l,permissionMode:e.permissionMode,...e.cwd!==void 0?{cwd:e.cwd}:{},...c!==void 0?{branch:c}:{},...u!==void 0?{pr:u}:{},...d!==void 0?{quotaWindows:d}:{},...p!==void 0?{turnCount:p}:{},...p!==void 0&&r&&r>0?{maxTurns:r}:{}}}var hh,Po=b(()=>{"use strict";kf();fh();rC();gh();L();We();hh={stream:process.stdout,hideCursor:!1,discardStdin:!1}});function sp(e){if(e.type==="chunk"){let t=e.chunk;return t.type==="content"?ve(t.content):t.type==="tool_use_detail"?m.dim(` [tool: ${t.toolName}]`):null}if(e.type==="error")return m.dim(` [error: ${e.error.message}]`);if(e.type==="message"){let t=e.message.content,n=typeof t=="string"?t:JSON.stringify(t);return ve(n)}return null}var Kte,Yx=b(()=>{"use strict";L();We();Kte=sp});function Gte(e){zD=e}function qte(e){JD=e}function Xx(e){return zD||(e.out.error("Background subagent jobs are not available in this session."),null)}function Vje(e,t=120){let n=ve(e).replace(/[\r\n]+/g," ").trim();return n.length>t?`${n.slice(0,t)}\u2026`:n}function Yje(e){let t=zte[e.status],n=e.endedAt!==void 0?he(e.endedAt-e.startedAt):he(Date.now()-e.startedAt),r=Z(e.label,60),o=` ${t} ${m.bold(e.jobId)} ${r} ${m.dim(`(${e.provenance} \xB7 ${e.status} \xB7 ${n} \xB7 ${e.model})`)}`;if(!JD||e.status!=="running")return o;let i=JD.getSummary(e.jobId);if(!i)return o;let s=ne(),a=Vje(i.text,Math.max(40,s-10)),l=Math.round((Date.now()-i.refreshedAt)/1e3),c=i.stale?" [stale]":"",u=m.dim(` \u21B3 ${a} (${l}s ago)${c}`);return`${o}
|
|
1925
1925
|
${u}`}function VD(e,t){let n=zte[t.status];e.out.line(` ${n} ${m.bold(t.jobId)} ${t.label}`);let r=t.endedAt!==void 0?he(t.endedAt-t.startedAt):he(Date.now()-t.startedAt);e.out.line(` Status: ${t.status} \xB7 ${r}`),e.out.line(` Subagent: ${t.subagentId}`),e.out.line(` Model: ${t.model}`),e.out.line(` Owner: ${t.provenance}`);let o=t.result;if(o?.message?.content){e.out.line("");let i=typeof o.message.content=="string"?o.message.content:JSON.stringify(o.message.content),s=Nr(i,o.stopReason),a=s.split(`
|
|
1926
1926
|
`).slice(0,40);for(let l of a)e.out.line(` ${l}`);s.split(`
|
|
1927
|
-
`).length>40&&e.out.line(m.dim(" \u2026 (truncated; full result available via /bgsub:join again)"))}o?.error&&e.out.error(` Error: ${o.error.message}`)}var zD,JD,zte,Xje,Qje,Zje,e1e,Jte,YD=b(()=>{"use strict";L();nt();we();de();Fv();vt();We();Yx();zte={running:"\u25D0",completed:"\u2713",failed:"\u2717",cancelled:"\u2298"};Xje={name:"/bgsub",summary:"List background subagent jobs",usage:"/bgsub [id]",hint:'When you want to check on background subagent jobs spawned with mode="background" during this session.',async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(r){let i=n.get(r);return i?(VD(e,i),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}let o=n.list();if(o.length===0)return e.out.info('No background subagent jobs. Spawn one by calling the agent tool with mode="background".'),"continue";for(let i of o)e.out.line(Yje(i));return"continue"}},Qje={name:"/bgsub:status",summary:"Show one background job",usage:"/bgsub:status <id>",hint:"When you need the full detail view for one specific background job by its ID.",async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:status <id>"),"continue";let o=n.get(r);return o?(VD(e,o),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},Zje={name:"/bgsub:join",summary:"Wait for a background subagent job and print its result",usage:"/bgsub:join <id>",hint:"When a background subagent has finished and you want to surface its result into the conversation.",async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:join <id>"),"continue";if(n.get(r)){try{await n.join(r)}catch(s){let a=s instanceof Error?s.message:String(s);e.out.error(`/bgsub:join failed: ${a}`)}let i=n.get(r);return i&&VD(e,i),"continue"}let o=await vo.readMeta(r);if(o){e.out.info("Job evicted from memory \u2014 replaying from log."),Zt(o.stopReason)&&(e.out.line(` ${Nr("",o.stopReason).trimEnd()}`),e.out.line(""));let i=0;for await(let s of vo.readEvents(r)){let a=Kte(s);a!==null&&(e.out.line(a),i++)}return i===0&&e.out.info(` (no events recorded for job ${r})`),e.out.line(""),e.out.line(` Status: ${o.status}`+(o.endedAt!==void 0?` \xB7 ended ${new Date(o.endedAt).toISOString()}`:"")),"continue"}return e.out.error(`No background job with ID "${r}".`),"continue"}},e1e={name:"/bgsub:cancel",summary:"Cancel a running background subagent job",usage:"/bgsub:cancel <id>",hint:"When you want to abort a background subagent job that is still in progress.",async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:cancel <id>"),"continue";let o=n.get(r);return o?o.status!=="running"?(e.out.info(`Job ${r} is already ${o.status}; nothing to cancel.`),"continue"):(await n.cancelJob(r)?e.out.line(m.dim(` \u2192 cancellation requested for ${r}`)):e.out.info(`Job ${r} could not be cancelled (already terminal).`),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},Jte=[Xje,Qje,Zje,e1e]});function r1e(e){return e==="succeeded"||e==="completed"?"done":e==="failed"?"error":e==="running"?"running":e==="cancelled"?"blocked":"warn"}function XD(e,t,n){let r=[m.bold(`Subagent: ${e.slice(0,20)}`),...n?[m.dim(`type: ${n}`)]:[],`status: ${Pi(r1e(t))}`];return[
|
|
1927
|
+
`).length>40&&e.out.line(m.dim(" \u2026 (truncated; full result available via /bgsub:join again)"))}o?.error&&e.out.error(` Error: ${o.error.message}`)}var zD,JD,zte,Xje,Qje,Zje,e1e,Jte,YD=b(()=>{"use strict";L();nt();we();de();Fv();vt();We();Yx();zte={running:"\u25D0",completed:"\u2713",failed:"\u2717",cancelled:"\u2298"};Xje={name:"/bgsub",summary:"List background subagent jobs",usage:"/bgsub [id]",hint:'When you want to check on background subagent jobs spawned with mode="background" during this session.',async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(r){let i=n.get(r);return i?(VD(e,i),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}let o=n.list();if(o.length===0)return e.out.info('No background subagent jobs. Spawn one by calling the agent tool with mode="background".'),"continue";for(let i of o)e.out.line(Yje(i));return"continue"}},Qje={name:"/bgsub:status",summary:"Show one background job",usage:"/bgsub:status <id>",hint:"When you need the full detail view for one specific background job by its ID.",async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:status <id>"),"continue";let o=n.get(r);return o?(VD(e,o),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},Zje={name:"/bgsub:join",summary:"Wait for a background subagent job and print its result",usage:"/bgsub:join <id>",hint:"When a background subagent has finished and you want to surface its result into the conversation.",async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:join <id>"),"continue";if(n.get(r)){try{await n.join(r)}catch(s){let a=s instanceof Error?s.message:String(s);e.out.error(`/bgsub:join failed: ${a}`)}let i=n.get(r);return i&&VD(e,i),"continue"}let o=await vo.readMeta(r);if(o){e.out.info("Job evicted from memory \u2014 replaying from log."),Zt(o.stopReason)&&(e.out.line(` ${Nr("",o.stopReason).trimEnd()}`),e.out.line(""));let i=0;for await(let s of vo.readEvents(r)){let a=Kte(s);a!==null&&(e.out.line(a),i++)}return i===0&&e.out.info(` (no events recorded for job ${r})`),e.out.line(""),e.out.line(` Status: ${o.status}`+(o.endedAt!==void 0?` \xB7 ended ${new Date(o.endedAt).toISOString()}`:"")),"continue"}return e.out.error(`No background job with ID "${r}".`),"continue"}},e1e={name:"/bgsub:cancel",summary:"Cancel a running background subagent job",usage:"/bgsub:cancel <id>",hint:"When you want to abort a background subagent job that is still in progress.",async handler(e,t){let n=Xx(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:cancel <id>"),"continue";let o=n.get(r);return o?o.status!=="running"?(e.out.info(`Job ${r} is already ${o.status}; nothing to cancel.`),"continue"):(await n.cancelJob(r)?e.out.line(m.dim(` \u2192 cancellation requested for ${r}`)):e.out.info(`Job ${r} could not be cancelled (already terminal).`),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},Jte=[Xje,Qje,Zje,e1e]});function r1e(e){return e==="succeeded"||e==="completed"?"done":e==="failed"?"error":e==="running"?"running":e==="cancelled"?"blocked":"warn"}function XD(e,t,n){let r=[m.bold(`Subagent: ${e.slice(0,20)}`),...n?[m.dim(`type: ${n}`)]:[],`status: ${Pi(r1e(t))}`];return[ae(void 0,80),r.join(" "),ae(void 0,80)].join(`
|
|
1928
1928
|
`)}function Qx(e){return e?t1e:Yte}function Xte(e){e.ictx&&(e.ictx.viewingTaskId=void 0),e.ctx.ui.repaintStatusLine(),e.ctx.out.line(""),e.ctx.out.line(n1e)}async function o1e(e,t=500){let n=0;for await(let r of rl.readEvents(e.sessionLabel,e.id)){if(n>=t)break;let o=sp(r);o!==null&&(e.ctx.out.line(o),n++)}return n}async function Zx(e){let{id:t,manager:n,ctx:r,ictx:o}=e;o&&(o.viewingTaskId=t),r.ui.clearScreen();let i=n.get(t),s=i?i.status:"completed",a=i?._agentType;if(r.out.line(XD(t,s,a)),r.out.line(""),i&&typeof i.session.getHistory=="function"){let d=i.session.getHistory();if(d.length>0)for(let p of d){let f=p.role==="user"?m.bold("user"):m.bold("assistant");r.out.line(`${f}:`);let g=p.content,h=typeof g=="string"?g:JSON.stringify(g);for(let y of h.split(`
|
|
1929
1929
|
`))r.out.line(` ${y}`);r.out.line("")}else r.out.line(m.dim(" (no history yet)")),r.out.line("")}else{await o1e(e)===0&&r.out.line(m.dim(" (no events recorded)")),r.out.line(""),r.out.line(Qx(!1)),Vte(e),o&&(o.viewingTaskId=void 0);return}let l=s==="running"||s==="idle";if(r.out.line(Qx(l)),Vte(e),!l){o&&(o.viewingTaskId=void 0);return}let c=new AbortController,{signal:u}=c;r.setSoftStopHandler?.(()=>{c.abort(),Xte(e),r.setSoftStopHandler?.(null)});try{await i1e(i.session.getOutputStream(),r,u)}catch{}finally{u.aborted||(r.out.line(""),r.out.line(Yte),r.setSoftStopHandler?.(null),o&&(o.viewingTaskId=void 0))}}function Vte(e){e.ctx.setSoftStopHandler?.(()=>{Xte(e),e.ctx.setSoftStopHandler?.(null)})}async function i1e(e,t,n){for await(let r of e){if(n.aborted)break;let o=sp(r);o!==null&&t.out.line(o)}}var t1e,Yte,n1e,QD=b(()=>{"use strict";L();aa();um();Yx();nk();t1e=m.dim(" Task running\u2026 (press Esc to return)"),Yte=m.dim(" Task complete (press Esc to return)"),n1e=m.dim(" Returned to main conversation.")});function Qte(e,t){eE=e,eL=t}function Zte(e){tE=e}function ene(){return eE}function tL(e){return eE||(e.out.error("Subagent manager is not available in this session."),null)}function tne(e){return eL||(e.out.error("Session label is not available \u2014 cannot access subagent logs."),null)}function nne(e,t){let n=e.get(t);if(n)return n.id;let r=e.completed.list().filter(o=>o.handle.id.startsWith(t)).map(o=>o.handle.id);return r.length===1&&r[0]!==void 0?r[0]:null}function ZD(e,t,n,r,o,i=!1){let s=s1e[t],a=e.slice(0,12),l=n?m.dim(`[${n}]`):"",c=r!==void 0?m.dim(`${he(r)}`):"",u=m.dim(`${o} calls`),d=i?"\u25B6":" ",p=i?m.bold(a):a;return[` ${d} ${s}`,p,l,c,u].filter(Boolean).join(" ")}async function a1e(e,t){let n=[];for(let{id:s,status:a}of e.list()){let c=e.get(s);n.push({id:s,status:a,agentType:c._agentType,toolCount:c._currentTrace?.toolCalls.length??0})}let r=new Set(e.list().map(s=>s.id));for(let s of e.completed.list()){if(r.has(s.handle.id))continue;let a=s.handle;n.push({id:s.handle.id,status:s.handle.status,agentType:a._agentType,durationMs:s.handle.durationMs,toolCount:a._currentTrace?.toolCalls.length??0})}let o=new Set(n.map(s=>s.id)),i=(await rl.list(t)).filter(s=>!o.has(s));for(let s of i)n.push({id:s,status:"succeeded",toolCount:0});return n}var eE,eL,tE,s1e,l1e,c1e,u1e,rne,bh=b(()=>{"use strict";L();nt();nk();QD();s1e={idle:"\xB7",running:"\u27F3",succeeded:"\u2713",failed:"\u2717",cancelled:"\u2298"};l1e={name:"/tasks",summary:"List all subagents (active + recently completed) with cursor navigation",usage:"/tasks",hint:"When you want to see what subagents this session has spawned. Use \u2191/\u2193 to navigate, Enter to view, Esc to return.",async handler(e){let t=tL(e);if(!t)return"continue";let n=tne(e);if(!n)return"continue";let r=await a1e(t,n);if(r.length===0)return e.out.info("No subagents in this session yet."),"continue";let o=0,i=()=>{e.ui.clearScreen(),e.out.line(m.dim(" Subagent list \u2014 \u2191/\u2193 navigate Enter view Esc return")),e.out.line("");for(let a=0;a<r.length;a++){let l=r[a],c=ZD(l.id,l.status,l.agentType,l.durationMs,l.toolCount,a===o);e.out.line(c)}e.out.line("")};if(!e.setSoftStopHandler){e.out.line(m.dim(` ${"STATUS".padEnd(2)} ${"ID".padEnd(12)} DETAILS`));for(let a of r)e.out.line(ZD(a.id,a.status,a.agentType,a.durationMs,a.toolCount));return e.out.line(m.dim(" Use /tasks:view <id> to open a task.")),"continue"}let s=e.getCompositor?.()??null;return s?await new Promise(a=>{let l=!1,c=d=>{l||(l=!0,e.setSoftStopHandler?.(null),s.exitPickerMode(),d?Zx(d).then(a).catch(p=>{e.out.error?.(`task view error: ${String(p)}`),a()}):(e.ui.clearScreen(),e.ui.repaintStatusLine(),a()))},u={renderRows:()=>{let d=[];d.push(m.dim(" Subagent list \u2014 \u2191/\u2193 navigate Enter view Esc return")),d.push("");for(let p=0;p<r.length;p++){let f=r[p];d.push(ZD(f.id,f.status,f.agentType,f.durationMs,f.toolCount,p===o))}return d.push(""),d},onKey:(d,p)=>{if(!l)if(p.name==="up")o=Math.max(0,o-1),s.repaintPicker();else if(p.name==="down")o=Math.min(r.length-1,o+1),s.repaintPicker();else if(p.name==="return"){let f=r[o];f&&c({id:f.id,manager:t,sessionLabel:n,ctx:e,ictx:tE})}else(p.name==="escape"||p.ctrl&&p.name==="c")&&c()}};e.setSoftStopHandler?.(()=>{c()}),s.enterPickerMode(u)}):(i(),await new Promise(a=>{let l=c=>{let u=typeof c=="string"?c:c.toString();if(u==="\x1B[A"||u==="\x1BOA")o=Math.max(0,o-1),i();else if(u==="\x1B[B"||u==="\x1BOB")o=Math.min(r.length-1,o+1),i();else if(u==="\r"||u===`
|
|
1930
1930
|
`){let d=r[o];if(d){e.setSoftStopHandler?.(null),process.stdin.off("data",l);let p={id:d.id,manager:t,sessionLabel:n,ctx:e,ictx:tE};Zx(p).then(a).catch(f=>{e.out.error?.(`task view error: ${String(f)}`),a()})}}else(u==="\x1B"||u==="")&&(e.setSoftStopHandler?.(null),process.stdin.off("data",l),e.ui.clearScreen(),e.ui.repaintStatusLine(),a())};e.setSoftStopHandler?.(()=>{e.setSoftStopHandler?.(null),process.stdin.off("data",l),e.ui.clearScreen(),e.ui.repaintStatusLine(),a()}),process.stdin.on("data",l)})),"continue"}},c1e={name:"/tasks:view",summary:"View a subagent's conversation (live view mode)",usage:"/tasks:view <id>",hint:"When you want to replay what a subagent said and which tools it called. Tails live output for running subagents.",async handler(e,t){let n=tL(e);if(!n)return"continue";let r=tne(e);if(!r)return"continue";let o=t.trim();if(!o)return e.out.info("Usage: /tasks:view <id>"),"continue";let i=nne(n,o)??o;return!n.get(i)&&!(await rl.list(r)).some(u=>u===i||u.startsWith(o))?(e.out.info(`No events found for subagent "${o}".`),"continue"):(await Zx({id:i,manager:n,sessionLabel:r,ctx:e,ictx:tE}),"continue")}},u1e={name:"/tasks:cancel",summary:"Cancel a running subagent",usage:"/tasks:cancel <id>",hint:"When you want to abort a subagent that is still in progress.",async handler(e,t){let n=tL(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /tasks:cancel <id>"),"continue";let o=nne(n,r)??r,i=n.get(o);return i?i.status!=="running"&&i.status!=="idle"?(e.out.info(`Subagent ${o} is already ${i.status}; nothing to cancel.`),"continue"):(await i.cancel(),e.out.line(m.dim(` \u2192 cancelled ${o}`)),"continue"):(e.out.error(`No subagent found with ID "${r}".`),"continue")}},rne=[l1e,c1e,u1e]});function ap(e){let t=e!==void 0?r=>{e.fn(r)}:r=>{console.log(En(r))},n=e!==void 0&&e.rawFn!==void 0?r=>{e.rawFn(r)}:r=>{if(process.stdout.isTTY===!0){let o=r.split(`
|
|
@@ -1937,15 +1937,15 @@ ${u}`}function VD(e,t){let n=zte[t.status];e.out.line(` ${n} ${m.bold(t.jobId)}
|
|
|
1937
1937
|
`)+`
|
|
1938
1938
|
`);let c=l.length;function u(){let d=a();process.stdout.write(`\x1B[${c}A\x1B[0J`+d.join(`
|
|
1939
1939
|
`)+`
|
|
1940
|
-
`),c=d.length}return new Promise(d=>{process.stdin.setRawMode(!0),Ol(process.stdin);let p=(g,h)=>{if(h)if(h.name==="up"||h.sequence==="\x1B[A")r>0&&(r--,r<o&&(o=r),u());else if(h.name==="down"||h.sequence==="\x1B[B"){if(r<e.length-1){r++;let{end:y}=s();r>=y&&o++,u()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),u()):h.name==="return"||h.name==="enter"?(f(),d([...i].sort((y,w)=>y-w))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(f(),d(":cancel"))};function f(){process.stdin.removeListener("keypress",p);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",p)})}var Bl,rL=b(()=>{"use strict";lp();dx();L();Bl="\u270E Type your own answer"});import x1e from"path";import{statSync as E1e}from"fs";function kne(e){jl=e}var jl,Tne,sL=b(()=>{"use strict";Tne={name:"/allow-dir",aliases:["/add-dir"],summary:"Manage per-session directory access grants for tool handlers",usage:"/allow-dir [--rw | --revoke] [<path>]",hint:"When the model needs read or write access to a directory outside the session root \u2014 grant it here without restarting.",flags:["--rw","--revoke"],async handler(e,t){if(!jl)return e.out.error("Directory grants not available in this session."),"continue";let n=t.trim();if(!n){let a=jl.getGrants();return e.out.line(" Session directory grants:"),e.out.line(` resolveBase : ${a.resolveBase??"(none)"}`),e.out.line(` readRoots : ${a.readRoots.length>0?a.readRoots.join(", "):"(none)"}`),e.out.line(` writeRoots : ${a.writeRoots.length>0?a.writeRoots.join(", "):"(none)"}`),"continue"}let r="read",o=n;if(o.startsWith("--rw ")||o==="--rw"?(r="write",o=o.slice(5).trim()):(o.startsWith("--revoke ")||o==="--revoke")&&(r="revoke",o=o.slice(9).trim()),!o)return e.out.error("Usage: /allow-dir [--rw | --revoke] <path>"),"continue";let i=x1e.resolve(process.cwd(),o);if(r!=="revoke")try{E1e(i)}catch{return e.out.error(`Path does not exist: ${i}`),"continue"}let s=e.stats.sessionId;if(r==="revoke"){let a=jl.getGrants();jl.revokeRoot(i,"slash",s),a.resolveBase&&i===a.resolveBase?e.out.warn(`Cannot revoke the session's initial resolveBase: ${i}`):e.out.line(`\u2713 Revoked: ${i}`)}else r==="write"?(jl.addWriteRoot(i,"slash",s),e.out.line(`\u2713 Read+write grant: ${i}`)):(jl.addReadRoot(i,"slash",s),e.out.line(`\u2713 Read-only grant: ${i}`));return"continue"}}});import xne from"chalk";function Ene(e,t){let n=aL.get(e);if(n){if(n.glyph===t.glyph&&n.color===t.color&&n.inFlightVerb===t.inFlightVerb)return;throw new Error(`Trusted skill "${e}" already registered with different config`)}aL.set(e,t),SJ(e)}function mE(e){return aL.get(e)}function R1e(e){return(e/1e3).toFixed(1)+"s"}function Rne(e,t){let n=mE(e.skillName),r=R1e(e.durationMs);if(!n){let i=`[${e.skillName} \xB7 ${r}]`;return cp(i,t?.columns)}if(t?.isTTY!==!1){let i;if(e.claimsTotal!==void 0){let a=e.claimsTotal===e.claimsConfirmed&&e.claimsRefuted===void 0&&e.claimsInconclusive===void 0,l;if(a)l=`${e.claimsTotal} claims \xB7 all confirmed`;else{let c=`${e.claimsTotal} claims`;e.claimsConfirmed!==void 0&&(c+=` \xB7 ${e.claimsConfirmed} confirmed`),e.claimsRefuted!==void 0&&(c+=` \xB7 ${e.claimsRefuted} refuted`),e.claimsInconclusive!==void 0&&(c+=` \xB7 ${e.claimsInconclusive} inconclusive`),l=c}i=`${n.glyph} ${e.skillName} \xB7 ${l} \xB7 ${r}`}else i=`${n.glyph} ${e.skillName} \xB7 ${r}`;let s=xne.hex(n.color)(i);return cp(s,t?.columns)}else{let i;if(e.claimsTotal!==void 0){let s=e.claimsConfirmed??0;i=`[${e.skillName} \xB7 ${s}/${e.claimsTotal} confirmed \xB7 ${r}]`}else i=`[${e.skillName} \xB7 ${r}]`;return cp(i,t?.columns)}}function cp(e,t){return t!==void 0&&G(e)>t?Z(e,t):e}function Ane(e,t){let n=mE(e);if(!n){let i=`[${e} \xB7 running\u2026]`;return cp(i,t?.columns)}if(t?.isTTY!==!1){let i=`${n.glyph} ${e} \xB7 ${n.inFlightVerb}`,s=xne.hex(n.color)(i);return cp(s,t?.columns)}let o=`[${e} \xB7 ${n.inFlightVerb}]`;return cp(o,t?.columns)}var aL,fE=b(()=>{"use strict";de();sM();aL=new Map});import A1e from"ora";function C1e(e){return e>=1e6?`${(e/1e6).toFixed(1)}MB`:e>=1e3?`${Math.round(e/1e3)}KB`:`${e}B`}var _1e,P1e,I1e,M1e,O1e,One,$ne=b(()=>{"use strict";L();ht();Ht();_d();Po();He();rL();_1e={name:"/exit",aliases:["/quit"],summary:"Exit the session",hint:"When you want to tear down the REPL \u2014 Ctrl+D on an empty prompt does the same.",async handler(){return"exit"}},P1e={name:"/clear",summary:"Clear conversation history",hint:"When the current thread has drifted off-topic or you want a clean slate without restarting the session.",async handler(e){try{await e.session.current.reset(),e.ui.clearScreen(),FQ(e.stats),e.ledger?.clear(),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},I1e={name:"/compact",summary:"Compact history (summarize older messages)",hint:"When context is filling up but you want to keep the thread \u2014 summarizes old turns and keeps the recent ones intact.",async handler(e){let t=e.getCompositor?.()??null,n=null,r=!1,o=()=>{r&&(t?t.setSpinner({enabled:!1}):n?.stop(),r=!1)};try{let i=e.session.current,s=i.hookRegistry;s&&await s.dispatch({event:"PreCompact",sessionId:i.sessionId,trigger:"manual"}),t?(e.out.info("Summarizing earlier turns..."),t.setSpinner({enabled:!0}),r=!0):(n=A1e({text:m.meta("Summarizing earlier turns..."),...hh}).start(),r=!0);let a=await i.compact();if(o(),a.compacted){let l=a.tokensSavedEstimate?` (~${a.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${a.messagesBefore} \u2192 ${a.messagesAfter} messages${l}.`)}else{let l=a.reason??"unknown";if(l==="aborted")e.out.info("Compaction cancelled.");else if(l.startsWith("summarization-failed"))e.out.error(`Compaction failed: ${l}. History unchanged.`);else if(l==="microcompacted"){let c=a.microcompaction,u=c?` \u2014 cleared ${c.blocksCleared} tool result${c.blocksCleared===1?"":"s"} (~${C1e(c.bytesReclaimed)} reclaimed)`:"";e.out.success(`Reclaimed context${u}.`)}else l==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):l==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):l==="responses-compaction-unavailable"?e.out.warn("Summarization is unavailable on this backend \u2014 it refused the compaction request earlier this session. Start a new session, or set AFK_COMPACT_MODEL to a model this endpoint can serve."):e.out.info(`Nothing to compact (${l}).`)}}catch(i){if(o(),i instanceof Dt)throw i;if(i instanceof Re)return e.out.info(`Compaction skipped: ${i.reason??"blocked by hook"}`),"continue";e.out.error(i instanceof Error?i.message:"Unknown error")}return"continue"}},M1e={name:"/rewind",summary:"Edit a previous message (rewind the conversation)",hint:"When you want to go back and re-ask an earlier prompt \u2014 pick a message, the conversation rewinds to it, and its text loads into the input to edit and resend. (Also: press Esc twice at an empty prompt.)",async handler(e){let t=e.session.current,n=t.listRewindTargets();if(n.length===0)return e.out.info("Nothing to rewind to \u2014 no earlier messages in this conversation."),"continue";let r=e.getCompositor?.()??null;r?.suspendInput();let o;try{o=await dE(n.map(a=>a.preview),new AbortController().signal)}finally{r?.resumeInput()}if(o===null)return e.out.info("Rewind requires an interactive terminal."),"continue";if(o===":cancel")return"continue";let i=n[o];if(!i)return"continue";let s=await t.rewindConversation(i.turnIndex);if(!s.rewound){let a=s.reason??"unknown";return a==="not-supported"?e.out.warn("Rewind is not supported for this provider \u2014 use a Claude model to enable /rewind."):a==="session-busy"||a==="turn-in-flight"?e.out.info("Cannot rewind while a turn is running."):e.out.info(`Cannot rewind (${a}).`),"continue"}return e.out.success(`Rewound ${s.messagesBefore} \u2192 ${s.messagesAfter} messages. Edit the message below and press Enter to resend.`),{kind:"prefill",message:s.reloadText??""}}},O1e={name:"/help",summary:"Show this help",hint:"When you want the full command list with usage strings \u2014 broader than this inline dropdown.",async handler(e){let t=Br(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(m.bold(m.brand("Commands"))),e.out.line(se());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${m.warning(o)}${i} ${m.dim(r.summary)}`)}return e.out.line(),e.out.line(m.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(m.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},One=[_1e,P1e,I1e,M1e,O1e]});function lL(e,t){let n=e+t;return n>0?Math.round(e/n*100):void 0}function Lne(e){if(!e)return"";let t=e.cacheRead??0,n=e.cacheCreation??0,r=lL(t,n);return r===void 0?"":` ${[`cache r=${Dne(t)}`,`w=${Dne(n)}`,`hit=${r}%`].join(" ")}`}function Dne(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}var cL=b(()=>{"use strict"});function uL(e,t=30){return!e||e.length===0?m.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${m.dim(`+${e.length-t} more`)}`}function gr(e,t){return` ${m.label(e.padEnd(16))} ${t}`}function hE(e){let t=[];t.push(" "+se("Session Debug")),e.sessionId&&t.push(gr("session",e.sessionId)),e.model&&t.push(gr("model",e.model)),e.permissionMode&&t.push(gr("permission",e.permissionMode)),e.cwd&&t.push(gr("cwd",e.cwd)),e.claudeCodeVersion&&t.push(gr("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(gr("api key",e.apiKeySource)),e.outputStyle&&t.push(gr("output style",e.outputStyle));let n=e.tools?.length??0;t.push(gr(`tools (${n})`,uL(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):m.dim("(none)");t.push(gr(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(gr(`skills (${i})`,uL(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):m.dim("(none)");t.push(gr(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(gr(`slash (${l})`,uL(e.slashCommands))),t.push(" "+se()),t.join(`
|
|
1941
|
-
`)}var dL=b(()=>{"use strict";L();ht()});function $1e(e,t){try{if(!e||e.trim().toLowerCase()==="auto")return{available:!0,needs:"unknown"};let n=ma(e,t);if(n.id==="")return{available:!1,needs:"local",hint:"not configured (set AFK_MODEL_LOCAL / models.local)"};if(n.provider==="chatgpt-oauth"){let o=yo(void 0,{},!0),i=o.apiKey!=null,s=i?void 0:o.source==="chatgpt-oauth-expired"?"ChatGPT token expired \u2014 re-run `codex` to refresh":"needs ChatGPT sign-in (~/.codex/auth.json)";return{available:i,needs:"chatgpt-oauth",hint:s}}if(n.provider==="xai-oauth"){let o=jn(void 0,"oauth").apiKey!=null;return{available:o,needs:"xai-oauth",hint:o?void 0:"needs SuperGrok OAuth (`afk provider auth xai login`)"}}if(n.provider==="xai"){let o=jn(n.apiKey,"apikey").apiKey!=null;return{available:o,needs:"xai",hint:o?void 0:"needs XAI_API_KEY"}}if(n.apiKey)return{available:!0,needs:"unknown"};let r=oe(e,t?{slots:t}:void 0);if(r==="anthropic-direct"){let o=!!qm();return{available:o,needs:"anthropic",hint:o?void 0:"needs Claude sign-in / ANTHROPIC_API_KEY"}}if(r==="openai-compatible"){if(n.baseUrl)return{available:!0,needs:"local"};let o=!!zm()||yo(void 0,{},!1).apiKey!=null;return{available:o,needs:"openai",hint:o?void 0:"needs OPENAI_API_KEY"}}if(r==="xai"||r==="xai-oauth"){let s=jn(void 0,r==="xai-oauth"?"oauth":void 0).apiKey!=null;return{available:s,needs:r==="xai-oauth"?"xai-oauth":"xai",hint:s?void 0:"needs XAI_API_KEY or SuperGrok OAuth (`afk provider auth xai login`)"}}return{available:!0,needs:"unknown"}}catch{return{available:!0,needs:"unknown"}}}function Fne(e,t){return $1e(e,t).available}var Nne=b(()=>{"use strict";Ge();At();Pt();Ru();bs()});async function Bne(e){let t=e?.fetchImpl??fetch,n=e?.timeoutMs??F1e,r=e?.token??(k.CLAUDE_CODE_OAUTH_TOKEN||bt());if(!r)return{kind:"unavailable",reason:"no-token",detail:"No Claude Code OAuth token found. Set CLAUDE_CODE_OAUTH_TOKEN or run `claude login` and try again."};let o;try{o=await t(D1e,{headers:{Authorization:`Bearer ${r}`,"anthropic-beta":L1e},signal:AbortSignal.timeout(n)})}catch(d){return N1e(d)?{kind:"unavailable",reason:"timeout",detail:"Request to the usage endpoint timed out."}:{kind:"unavailable",reason:"network-error",detail:"Network error while contacting the usage endpoint."}}if(!o.ok)return{kind:"unavailable",reason:"http-error",detail:`Usage endpoint returned HTTP ${o.status}.`};let i;try{i=await o.json()}catch{return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned a response that was not valid JSON."}}if(typeof i!="object"||i===null)return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned an unexpected response shape."};let s=i,a=yE(s.five_hour),l=yE(s.seven_day),c=yE(s.seven_day_sonnet),u=yE(s.seven_day_opus);return!a&&!l&&!c&&!u?{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint response contained none of the known usage windows."}:{kind:"ok",...a!==void 0?{fiveHour:a}:{},...l!==void 0?{sevenDay:l}:{},...c!==void 0?{sevenDaySonnet:c}:{},...u!==void 0?{sevenDayOpus:u}:{}}}function N1e(e){return e instanceof Error&&(e.name==="TimeoutError"||e.name==="AbortError")}function j1e(e){if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}if(typeof e=="number")return!Number.isFinite(e)||e<B1e||e>U1e?void 0:new Date(e*1e3)}function yE(e){if(typeof e!="object"||e===null)return;let t=e,n=t.utilization;if(typeof n!="number"||!Number.isFinite(n))return;let r=n>1?n/100:n,o=Math.min(1,Math.max(0,r)),i=j1e(t.resets_at);return{utilization:o,...i!==void 0?{resetsAt:i}:{}}}var D1e,L1e,F1e,B1e,U1e,Une=b(()=>{"use strict";Hi();F();D1e="https://api.anthropic.com/api/oauth/usage",L1e="oauth-2025-04-20",F1e=1e4;B1e=0,U1e=4102444800});function jne(e){if(Ic.includes(e)||Di(e)!==void 0)return!0;let t=oe(e);if(t==="openai-compatible"||t==="xai"||t==="xai-oauth")return!0;let n=ma(e).id.trim().toLowerCase();return n.startsWith("claude-")||n.startsWith("claude_")}var Hne=b(()=>{"use strict";Ge();At()});function H1e(e,t){if(t.length===0)return 100;let n=Ie(e).toLowerCase(),r=t.toLowerCase();if(n.includes(r))return 100;let o=0,i=-1,s=-1;for(let c=0;c<n.length&&o<r.length;c++)n[c]===r[o]&&(i===-1&&(i=c),s=c,o++);if(o<r.length)return;let a=s-i+1,l=r.length/a;return 50+Math.round(l*49)}function Sh(e,t){let n=[];for(let r=0;r<e.length;r++){let o=H1e(e[r]??"",t);o!==void 0&&n.push({originalIndex:r,score:o})}return t.length===0?n:n.sort((r,o)=>o.score-r.score)}var Wne=b(()=>{"use strict";de()});function An(e,t){return new Promise(n=>{let{header:r,options:o,multi:i=!1,signal:s,initialIndex:a=0,onCtrlC:l,searchable:c=!1}=t;if(o.length===0){n(null);return}if(s?.aborted){n(null);return}let u="",d=Sh(o,u),p=()=>c?d.map(_=>o[_.originalIndex]??""):o,f=mL(a,0,o.length-1),g=0,h=_=>{let R=e.terminalRows?.();if(R===void 0)return pL;let P=r.length+(c?1:0)+1,I=Math.max(0,R-1-P),$=_>Math.min(pL,I)?1:0;return Math.min(pL,Math.max(0,I-$))},y=()=>{let _=p().length;if(_===0){f=0,g=0;return}let R=h(_);f=mL(f,0,_-1),f<g&&(g=f),R>0&&f>=g+R&&(g=f-R+1),g=mL(g,0,Math.max(0,_-R))},w=new Set(t.initialSelected??[]),S=!1,v=_=>{S||(S=!0,s&&s.removeEventListener("abort",x),e.exitPickerMode(),n(_))},x=()=>v(null);s&&s.addEventListener("abort",x,{once:!0});let T=()=>{let _=[];for(let W of r)_.push(W);c&&_.push(m.dim(" Filter: ")+u+"\u2588");let R=p(),P=R.length,I=h(P);y();let $=g,j=Math.min(g+I,P);for(let W=$;W<j;W++){let q=R[W]??"",K=W===f,H=K?m.brand(W1e):K1e,Y;if(i){let le=c?d[W]?.originalIndex??W:W,M=w.has(le),N=M?m.success(G1e):m.dim(q1e),Q=K&&!M?m.bold(q):q;Y=` ${H} ${N} ${Q}`}else{let le=K?m.bold(q):m.dim(q);Y=` ${H} ${le}`}_.push(Y)}if(P>I){let W=$+1,q=j;_.push(m.dim(` (${W}\u2013${q} of ${P} \u2191/\u2193 scroll)`))}let O=c?V1e:i?J1e:z1e;return _.push(m.dim(" "+O)),_},E=(_,R)=>{if(!S){if(R.name==="escape"){if(c&&u.length>0){u="",d=Sh(o,u),f=0,g=0,e.repaintPicker();return}v(null);return}if(R.ctrl&&R.name==="c"){l?.(),v(null);return}if(c&&(R.name==="backspace"||R.name==="delete")){u.length>0&&(u=u.slice(0,-1),d=Sh(o,u),f=0,g=0,e.repaintPicker());return}if(R.name==="up"||R.ctrl&&R.name==="p"){let P=p().length;f=f===0?P-1:f-1,y(),e.repaintPicker();return}if(R.name==="down"||R.ctrl&&R.name==="n"){let P=p().length;f=f===P-1?0:f+1,y(),e.repaintPicker();return}if(R.name==="return"){if(c&&d.length===0)return;if(i){let P=[];for(let I=0;I<o.length;I++)if(w.has(I)){let $=o[I];$!==void 0&&P.push($)}v(P)}else{let P=c?d[f]?.originalIndex??f:f,I=o[P];v(I!==void 0?[I]:[])}return}if(i&&(R.name==="space"||_===" ")){let P=c?d[f]?.originalIndex??f:f;w.has(P)?w.delete(P):w.add(P),e.repaintPicker();return}if(R.name==="home"){f=0,g=0,e.repaintPicker();return}if(R.name==="end"){f=p().length-1,y(),e.repaintPicker();return}if(c&&_!==void 0&&_.length===1&&!R.ctrl&&!R.meta&&(_.codePointAt(0)??0)>=32){u+=_,d=Sh(o,u),f=0,g=0,e.repaintPicker();return}}};y();let C={renderRows:T,onKey:E};e.enterPickerMode(C)})}function mL(e,t,n){return n<t||e<t?t:e>n?n:e}var W1e,K1e,G1e,q1e,z1e,J1e,V1e,pL,Ls=b(()=>{"use strict";L();Wne();W1e="\u25B8",K1e=" ",G1e="\u25C9",q1e="\u25EF",z1e="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",J1e="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel",V1e="\u2191/\u2193 navigate \xB7 enter select \xB7 esc clear/cancel \xB7 type to filter",pL=20});function X1e(e,t){let n=`${Math.round(t.utilization*100)}%`,r=t.resetsAt?m.dim(` (resets ${t.resetsAt.toLocaleString()})`):"";return` ${e.padEnd(16)}${m.meta(n)}${r}`}function Z1e(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,i=n?.cache_read_input_tokens??0,s=n?.cache_creation_input_tokens??0,a=t.totalTokens??n?.context_window_tokens??0,l=lL(i,s);e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(se()),e.line(` total ${m.success(Ae(t.totalTokens))} of ${m.meta(Ae(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(Ae(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(Ae(r))} ${m.dim("(turn total)")}`),e.line(` output ${m.meta(Ae(o))} ${m.dim("(turn total)")}`),e.line(` cache read ${m.meta(Ae(i))} ${m.dim("(last call)")}`),e.line(` cache creat ${m.meta(Ae(s))} ${m.dim("(last call)")}`),l!==void 0&&e.line(` cache hit ${m.meta(`${l}%`)} ${m.dim("(of cached tokens, last call)")}`),e.line(` window ${m.meta(Ae(a))} ${m.dim("(last call occupancy)")}`);let c=t.categories??[];if(c.length>0){let f=[...c].sort((g,h)=>h.tokens-g.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let g of f)e.line(` ${m.warning(g.name.padEnd(18))} ${m.meta(Ae(g.tokens))}`)}let u=t.systemTools??[],d=t.mcpTools??[];if(u.length>0||d.length>0){e.line();let f=u.reduce((h,y)=>h+y.tokens,0),g=d.reduce((h,y)=>h+y.tokens,0);u.length>0&&e.line(m.dim(` system tools ${u.length} tools, ${Ae(f)} tokens`)),d.length>0&&e.line(m.dim(` MCP tools ${d.length} tools, ${Ae(g)} tokens`))}let p=t.agents??[];if(p.length>0){let f=p.reduce((g,h)=>g+h.tokens,0);e.line(m.dim(` agents ${p.length} loaded, ${Ae(f)} tokens`))}if(t.skills){let f=t.skills;e.line(m.dim(` skills ${f.includedSkills}/${f.totalSkills} included, ${Ae(f.tokens)} tokens`))}if(t.slashCommands){let f=t.slashCommands;e.line(m.dim(` slash cmds ${f.includedCommands}/${f.totalCommands} included, ${Ae(f.tokens)} tokens`))}e.line()}function eHe(e,t){let n=t.turnTokens.reduce((u,d)=>u+d.input,0),r=t.turnTokens.reduce((u,d)=>u+d.output,0),o=t.turnTokens.reduce((u,d)=>u+d.cache,0),i=n+r,s=at(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=s>0?Math.round(l/s*100):0;e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(se()),e.line(` input ${m.meta(Ae(n))}`),e.line(` output ${m.meta(Ae(r))}`),e.line(` cache read ${m.meta(Ae(o))}`),e.line(` total ${m.success(Ae(i))}`),e.line(` context ${m.meta(`${c}% of ${Ae(s)} (${t.model})`)}`),e.line()}async function Kne(e,t){if(!jne(t)){e.out.warn(`Unknown model: ${t}. Aliases: ${Ic.join(", ")} (or a full model id)`);return}let n=Mc(t);if(n){e.out.warn(n);return}try{await e.session.current.setModel(t),e.stats.model=t,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(t)}`)}catch(r){e.out.error(`Failed to switch model: ${r instanceof Error?r.message:String(r)}`)}}var Y1e,Q1e,tHe,nHe,rHe,oHe,iHe,sHe,aHe,Gne,qne=b(()=>{"use strict";L();ht();nt();cL();fh();dL();Nne();Une();At();Hne();Ls();Y1e={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(se()),n.line(` total ${m.success(nn(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(nn(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(nn).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return t.unpricedTurns>0&&n.line(` unpriced ${m.warning(`${t.unpricedTurns} turn${t.unpricedTurns===1?"":"s"} had no cost metadata \u2014 total may be understated`)}`),n.line(),n.line(m.dim(" This is session-local spend. For account-wide subscription quota, see /usage.")),n.line(),"continue"}};Q1e={name:"/usage",summary:"Show Claude subscription usage (5h / 7d windows)",hint:"When you want to know how close you are to hitting your Claude subscription's rolling usage limits \u2014 distinct from /cost, which is session-local spend.",async handler(e){let{out:t}=e,n=await Bne();if(t.line(),n.kind==="unavailable")return t.line(m.bold("Subscription usage")),t.line(se()),n.reason==="no-token"?t.warn("No Claude subscription token found \u2014 run `claude login`, then try /usage again."):t.warn(`Usage unavailable (${n.reason}): ${n.detail}`),t.line(),"continue";let o=[["5-hour",n.fiveHour],["7-day",n.sevenDay],["7-day (Sonnet)",n.sevenDaySonnet],["7-day (Opus)",n.sevenDayOpus]].filter(i=>i[1]!==void 0);if(t.line(m.bold("Subscription usage")),t.line(se()),o.length===0)t.line(m.dim(" No usage windows reported."));else for(let[i,s]of o)t.line(X1e(i,s));return t.line(),"continue"}};tHe={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();Z1e(e.out,t)}catch{eHe(e.out,e.stats)}return"continue"}},nHe={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(se()),t.turns.forEach((r,o)=>{let i=m.meta(`#${o+1}`),s=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${i} ${m.user("\u25B6")} ${s}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}};rHe={name:"/model",usage:"/model [local|small|medium|large|opus|sonnet|haiku|fable|org/model]",summary:"Switch the active model mid-session",hint:"Switch the capability tier (local/small/medium/large \u2014 or your configured names) or pass a full model id. Bare `/model` opens an interactive picker on a TTY. Upgrade to large for a hard problem, downshift to small for cheap iteration \u2014 context carries over. Also accepts HuggingFace-style ids (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(n)return await Kne(e,n),"continue";let r=e.getCompositor?.()??null;if(r){let i=[...Ic],s=i.indexOf(e.stats.model),l=(await An(r,{header:[m.bold("Switch model"),m.dim(`current: ${e.stats.model}`),m.dim("or type a full id: /model <org/model>"),""],options:i,initialIndex:s>=0?s:0}))?.[0];return l&&await Kne(e,l),"continue"}e.out.info(`Current model: ${m.brand(e.stats.model)}`);let o=Ic.map(i=>Fne(i)?i:`${i} (needs sign-in)`).join(", ");return e.out.line(m.dim(` Aliases: ${o} (or any org/model HF id)`)),"continue"}},oHe={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(se());let r=3,o=Math.ceil(n.length/r),i=Math.max(...n.map(s=>s.length))+2;for(let s=0;s<o;s++){let a=[];for(let l=0;l<r;l++){let c=l*o+s;c<n.length&&a.push(n[c].padEnd(i))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},iHe={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(CT(),s9)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(se());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${i} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),i=o.indexOf(" ");if(i===-1||o.slice(0,i).length===0||o.slice(i+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let s=o.slice(0,i).trim(),a=o.slice(i+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${s}"\u2026`),await e.mcpManager.completeAuth(s,a),e.out.success(`OAuth complete for "${s}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${s}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(se());let i=0;for(let s of o){let a=typeof s=="string"?s:s.name??JSON.stringify(s),l=typeof s=="object"&&s!==null&&"status"in s?String(s.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(m.dim(` ${i} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},sHe={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(se());for(let[t,n]of Object.entries($c)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(Ae(n))}${r}`)}return e.out.line(),"continue"}},aHe={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(hE(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},Gne=[Y1e,tHe,nHe,rHe,oHe,iHe,sHe,aHe,Q1e]});function lHe(e){switch(e){case"bypassPermissions":return"bypass restored \u2014 no prompts, read/write any path";case"acceptEdits":return"accept-edits restored \u2014 edits auto-approved";case"dontAsk":case"auto":return"previous mode restored \u2014 no approval prompts";default:return"default permissions restored"}}async function vh(e,t){let n=e.stats.permissionMode==="plan",r=t!==void 0?t:!n,o=r?"plan":e.session.current.getPrePlanMode?.()??"default";try{if(await e.session.current.setPermissionMode(o),e.stats.permissionMode=o,e.ui.repaintStatusLine(),r){let i=fL?"":m.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");fL||(fL=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(m.success("\u25CB plan mode OFF")+m.dim(` \u2014 ${lHe(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}var fL,zne=b(()=>{"use strict";L();fL=!1});async function cHe(e){if(await vh(e,!1),e.stats.permissionMode==="plan")return"continue";let t=zp(e.stats.cwd??process.cwd());return e.out.info(m.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:mS(t)}}var Jne,Vne=b(()=>{"use strict";U();aI();zne();L();Jne={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode; /plan off saves the plan to a file then implements it",hint:"Think through an approach without changing anything \u2014 write tools and state-mutating bash are refused until you exit; read-only investigation runs. /plan off saves the plan + implements it; Shift+Tab cycles to the next mode without implementing.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();return n!==""&&r!=="on"&&r!=="off"?(e.stats.permissionMode!=="plan"&&await vh(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await vh(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await vh(e,!1),"continue"):cHe(e)}}});function fHe(e){let t=e.trim();return mHe.some(n=>n.test(t))}function bL(e){let t=-1,n=-1;for(let r=0;r<e.length;r++){let o=e[r];o.isError!==!0&&(pHe.has(o.toolName)?t=r:o.toolName==="bash"&&fHe(o.input)&&(n=r))}return t<0?"no-code-changes":n>t?"verified":"unverified"}function Qne(e){return e.some(n=>n.isError!==!0&&yL.has(n.toolName))?bL(e)!=="unverified":!1}function gHe(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":uHe[e.kind]}`,i=[];for(let[a,l]of dHe[e.kind]){let c=e[l];typeof c=="string"&&c.trim().length>0&&i.push(a?`\u2022 ${a}: ${c.trim()}`:`\u2022 ${c.trim()}`)}if(i.length===0&&e.rawBody.trim().length>0){let a=e.rawBody.trim();i.push(a.length>Xne?`${a.slice(0,Xne)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no recognized successful verification was observed backing this Done claim \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
|
|
1940
|
+
`),c=d.length}return new Promise(d=>{process.stdin.setRawMode(!0),Ol(process.stdin);let p=(g,h)=>{if(h)if(h.name==="up"||h.sequence==="\x1B[A")r>0&&(r--,r<o&&(o=r),u());else if(h.name==="down"||h.sequence==="\x1B[B"){if(r<e.length-1){r++;let{end:y}=s();r>=y&&o++,u()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),u()):h.name==="return"||h.name==="enter"?(f(),d([...i].sort((y,w)=>y-w))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(f(),d(":cancel"))};function f(){process.stdin.removeListener("keypress",p);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",p)})}var Bl,rL=b(()=>{"use strict";lp();dx();L();Bl="\u270E Type your own answer"});import x1e from"path";import{statSync as E1e}from"fs";function kne(e){jl=e}var jl,Tne,sL=b(()=>{"use strict";Tne={name:"/allow-dir",aliases:["/add-dir"],summary:"Manage per-session directory access grants for tool handlers",usage:"/allow-dir [--rw | --revoke] [<path>]",hint:"When the model needs read or write access to a directory outside the session root \u2014 grant it here without restarting.",flags:["--rw","--revoke"],async handler(e,t){if(!jl)return e.out.error("Directory grants not available in this session."),"continue";let n=t.trim();if(!n){let a=jl.getGrants();return e.out.line(" Session directory grants:"),e.out.line(` resolveBase : ${a.resolveBase??"(none)"}`),e.out.line(` readRoots : ${a.readRoots.length>0?a.readRoots.join(", "):"(none)"}`),e.out.line(` writeRoots : ${a.writeRoots.length>0?a.writeRoots.join(", "):"(none)"}`),"continue"}let r="read",o=n;if(o.startsWith("--rw ")||o==="--rw"?(r="write",o=o.slice(5).trim()):(o.startsWith("--revoke ")||o==="--revoke")&&(r="revoke",o=o.slice(9).trim()),!o)return e.out.error("Usage: /allow-dir [--rw | --revoke] <path>"),"continue";let i=x1e.resolve(process.cwd(),o);if(r!=="revoke")try{E1e(i)}catch{return e.out.error(`Path does not exist: ${i}`),"continue"}let s=e.stats.sessionId;if(r==="revoke"){let a=jl.getGrants();jl.revokeRoot(i,"slash",s),a.resolveBase&&i===a.resolveBase?e.out.warn(`Cannot revoke the session's initial resolveBase: ${i}`):e.out.line(`\u2713 Revoked: ${i}`)}else r==="write"?(jl.addWriteRoot(i,"slash",s),e.out.line(`\u2713 Read+write grant: ${i}`)):(jl.addReadRoot(i,"slash",s),e.out.line(`\u2713 Read-only grant: ${i}`));return"continue"}}});import xne from"chalk";function Ene(e,t){let n=aL.get(e);if(n){if(n.glyph===t.glyph&&n.color===t.color&&n.inFlightVerb===t.inFlightVerb)return;throw new Error(`Trusted skill "${e}" already registered with different config`)}aL.set(e,t),SJ(e)}function mE(e){return aL.get(e)}function R1e(e){return(e/1e3).toFixed(1)+"s"}function Rne(e,t){let n=mE(e.skillName),r=R1e(e.durationMs);if(!n){let i=`[${e.skillName} \xB7 ${r}]`;return cp(i,t?.columns)}if(t?.isTTY!==!1){let i;if(e.claimsTotal!==void 0){let a=e.claimsTotal===e.claimsConfirmed&&e.claimsRefuted===void 0&&e.claimsInconclusive===void 0,l;if(a)l=`${e.claimsTotal} claims \xB7 all confirmed`;else{let c=`${e.claimsTotal} claims`;e.claimsConfirmed!==void 0&&(c+=` \xB7 ${e.claimsConfirmed} confirmed`),e.claimsRefuted!==void 0&&(c+=` \xB7 ${e.claimsRefuted} refuted`),e.claimsInconclusive!==void 0&&(c+=` \xB7 ${e.claimsInconclusive} inconclusive`),l=c}i=`${n.glyph} ${e.skillName} \xB7 ${l} \xB7 ${r}`}else i=`${n.glyph} ${e.skillName} \xB7 ${r}`;let s=xne.hex(n.color)(i);return cp(s,t?.columns)}else{let i;if(e.claimsTotal!==void 0){let s=e.claimsConfirmed??0;i=`[${e.skillName} \xB7 ${s}/${e.claimsTotal} confirmed \xB7 ${r}]`}else i=`[${e.skillName} \xB7 ${r}]`;return cp(i,t?.columns)}}function cp(e,t){return t!==void 0&&G(e)>t?Z(e,t):e}function Ane(e,t){let n=mE(e);if(!n){let i=`[${e} \xB7 running\u2026]`;return cp(i,t?.columns)}if(t?.isTTY!==!1){let i=`${n.glyph} ${e} \xB7 ${n.inFlightVerb}`,s=xne.hex(n.color)(i);return cp(s,t?.columns)}let o=`[${e} \xB7 ${n.inFlightVerb}]`;return cp(o,t?.columns)}var aL,fE=b(()=>{"use strict";de();sM();aL=new Map});import A1e from"ora";function C1e(e){return e>=1e6?`${(e/1e6).toFixed(1)}MB`:e>=1e3?`${Math.round(e/1e3)}KB`:`${e}B`}var _1e,P1e,I1e,M1e,O1e,One,$ne=b(()=>{"use strict";L();ht();Ht();_d();Po();He();rL();_1e={name:"/exit",aliases:["/quit"],summary:"Exit the session",hint:"When you want to tear down the REPL \u2014 Ctrl+D on an empty prompt does the same.",async handler(){return"exit"}},P1e={name:"/clear",summary:"Clear conversation history",hint:"When the current thread has drifted off-topic or you want a clean slate without restarting the session.",async handler(e){try{await e.session.current.reset(),e.ui.clearScreen(),FQ(e.stats),e.ledger?.clear(),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},I1e={name:"/compact",summary:"Compact history (summarize older messages)",hint:"When context is filling up but you want to keep the thread \u2014 summarizes old turns and keeps the recent ones intact.",async handler(e){let t=e.getCompositor?.()??null,n=null,r=!1,o=()=>{r&&(t?t.setSpinner({enabled:!1}):n?.stop(),r=!1)};try{let i=e.session.current,s=i.hookRegistry;s&&await s.dispatch({event:"PreCompact",sessionId:i.sessionId,trigger:"manual"}),t?(e.out.info("Summarizing earlier turns..."),t.setSpinner({enabled:!0}),r=!0):(n=A1e({text:m.meta("Summarizing earlier turns..."),...hh}).start(),r=!0);let a=await i.compact();if(o(),a.compacted){let l=a.tokensSavedEstimate?` (~${a.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${a.messagesBefore} \u2192 ${a.messagesAfter} messages${l}.`)}else{let l=a.reason??"unknown";if(l==="aborted")e.out.info("Compaction cancelled.");else if(l.startsWith("summarization-failed"))e.out.error(`Compaction failed: ${l}. History unchanged.`);else if(l==="microcompacted"){let c=a.microcompaction,u=c?` \u2014 cleared ${c.blocksCleared} tool result${c.blocksCleared===1?"":"s"} (~${C1e(c.bytesReclaimed)} reclaimed)`:"";e.out.success(`Reclaimed context${u}.`)}else l==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):l==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):l==="responses-compaction-unavailable"?e.out.warn("Summarization is unavailable on this backend \u2014 it refused the compaction request earlier this session. Start a new session, or set AFK_COMPACT_MODEL to a model this endpoint can serve."):e.out.info(`Nothing to compact (${l}).`)}}catch(i){if(o(),i instanceof Dt)throw i;if(i instanceof Re)return e.out.info(`Compaction skipped: ${i.reason??"blocked by hook"}`),"continue";e.out.error(i instanceof Error?i.message:"Unknown error")}return"continue"}},M1e={name:"/rewind",summary:"Edit a previous message (rewind the conversation)",hint:"When you want to go back and re-ask an earlier prompt \u2014 pick a message, the conversation rewinds to it, and its text loads into the input to edit and resend. (Also: press Esc twice at an empty prompt.)",async handler(e){let t=e.session.current,n=t.listRewindTargets();if(n.length===0)return e.out.info("Nothing to rewind to \u2014 no earlier messages in this conversation."),"continue";let r=e.getCompositor?.()??null;r?.suspendInput();let o;try{o=await dE(n.map(a=>a.preview),new AbortController().signal)}finally{r?.resumeInput()}if(o===null)return e.out.info("Rewind requires an interactive terminal."),"continue";if(o===":cancel")return"continue";let i=n[o];if(!i)return"continue";let s=await t.rewindConversation(i.turnIndex);if(!s.rewound){let a=s.reason??"unknown";return a==="not-supported"?e.out.warn("Rewind is not supported for this provider \u2014 use a Claude model to enable /rewind."):a==="session-busy"||a==="turn-in-flight"?e.out.info("Cannot rewind while a turn is running."):e.out.info(`Cannot rewind (${a}).`),"continue"}return e.out.success(`Rewound ${s.messagesBefore} \u2192 ${s.messagesAfter} messages. Edit the message below and press Enter to resend.`),{kind:"prefill",message:s.reloadText??""}}},O1e={name:"/help",summary:"Show this help",hint:"When you want the full command list with usage strings \u2014 broader than this inline dropdown.",async handler(e){let t=Br(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(m.bold(m.brand("Commands"))),e.out.line(ae());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${m.warning(o)}${i} ${m.dim(r.summary)}`)}return e.out.line(),e.out.line(m.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(m.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},One=[_1e,P1e,I1e,M1e,O1e]});function lL(e,t){let n=e+t;return n>0?Math.round(e/n*100):void 0}function Lne(e){if(!e)return"";let t=e.cacheRead??0,n=e.cacheCreation??0,r=lL(t,n);return r===void 0?"":` ${[`cache r=${Dne(t)}`,`w=${Dne(n)}`,`hit=${r}%`].join(" ")}`}function Dne(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}var cL=b(()=>{"use strict"});function uL(e,t=30){return!e||e.length===0?m.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${m.dim(`+${e.length-t} more`)}`}function gr(e,t){return` ${m.label(e.padEnd(16))} ${t}`}function hE(e){let t=[];t.push(" "+ae("Session Debug")),e.sessionId&&t.push(gr("session",e.sessionId)),e.model&&t.push(gr("model",e.model)),e.permissionMode&&t.push(gr("permission",e.permissionMode)),e.cwd&&t.push(gr("cwd",e.cwd)),e.claudeCodeVersion&&t.push(gr("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(gr("api key",e.apiKeySource)),e.outputStyle&&t.push(gr("output style",e.outputStyle));let n=e.tools?.length??0;t.push(gr(`tools (${n})`,uL(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):m.dim("(none)");t.push(gr(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(gr(`skills (${i})`,uL(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):m.dim("(none)");t.push(gr(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(gr(`slash (${l})`,uL(e.slashCommands))),t.push(" "+ae()),t.join(`
|
|
1941
|
+
`)}var dL=b(()=>{"use strict";L();ht()});function $1e(e,t){try{if(!e||e.trim().toLowerCase()==="auto")return{available:!0,needs:"unknown"};let n=ma(e,t);if(n.id==="")return{available:!1,needs:"local",hint:"not configured (set AFK_MODEL_LOCAL / models.local)"};if(n.provider==="chatgpt-oauth"){let o=yo(void 0,{},!0),i=o.apiKey!=null,s=i?void 0:o.source==="chatgpt-oauth-expired"?"ChatGPT token expired \u2014 re-run `codex` to refresh":"needs ChatGPT sign-in (~/.codex/auth.json)";return{available:i,needs:"chatgpt-oauth",hint:s}}if(n.provider==="xai-oauth"){let o=jn(void 0,"oauth").apiKey!=null;return{available:o,needs:"xai-oauth",hint:o?void 0:"needs SuperGrok OAuth (`afk provider auth xai login`)"}}if(n.provider==="xai"){let o=jn(n.apiKey,"apikey").apiKey!=null;return{available:o,needs:"xai",hint:o?void 0:"needs XAI_API_KEY"}}if(n.apiKey)return{available:!0,needs:"unknown"};let r=oe(e,t?{slots:t}:void 0);if(r==="anthropic-direct"){let o=!!qm();return{available:o,needs:"anthropic",hint:o?void 0:"needs Claude sign-in / ANTHROPIC_API_KEY"}}if(r==="openai-compatible"){if(n.baseUrl)return{available:!0,needs:"local"};let o=!!zm()||yo(void 0,{},!1).apiKey!=null;return{available:o,needs:"openai",hint:o?void 0:"needs OPENAI_API_KEY"}}if(r==="xai"||r==="xai-oauth"){let s=jn(void 0,r==="xai-oauth"?"oauth":void 0).apiKey!=null;return{available:s,needs:r==="xai-oauth"?"xai-oauth":"xai",hint:s?void 0:"needs XAI_API_KEY or SuperGrok OAuth (`afk provider auth xai login`)"}}return{available:!0,needs:"unknown"}}catch{return{available:!0,needs:"unknown"}}}function Fne(e,t){return $1e(e,t).available}var Nne=b(()=>{"use strict";Ge();At();Pt();Ru();bs()});async function Bne(e){let t=e?.fetchImpl??fetch,n=e?.timeoutMs??F1e,r=e?.token??(k.CLAUDE_CODE_OAUTH_TOKEN||bt());if(!r)return{kind:"unavailable",reason:"no-token",detail:"No Claude Code OAuth token found. Set CLAUDE_CODE_OAUTH_TOKEN or run `claude login` and try again."};let o;try{o=await t(D1e,{headers:{Authorization:`Bearer ${r}`,"anthropic-beta":L1e},signal:AbortSignal.timeout(n)})}catch(d){return N1e(d)?{kind:"unavailable",reason:"timeout",detail:"Request to the usage endpoint timed out."}:{kind:"unavailable",reason:"network-error",detail:"Network error while contacting the usage endpoint."}}if(!o.ok)return{kind:"unavailable",reason:"http-error",detail:`Usage endpoint returned HTTP ${o.status}.`};let i;try{i=await o.json()}catch{return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned a response that was not valid JSON."}}if(typeof i!="object"||i===null)return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned an unexpected response shape."};let s=i,a=yE(s.five_hour),l=yE(s.seven_day),c=yE(s.seven_day_sonnet),u=yE(s.seven_day_opus);return!a&&!l&&!c&&!u?{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint response contained none of the known usage windows."}:{kind:"ok",...a!==void 0?{fiveHour:a}:{},...l!==void 0?{sevenDay:l}:{},...c!==void 0?{sevenDaySonnet:c}:{},...u!==void 0?{sevenDayOpus:u}:{}}}function N1e(e){return e instanceof Error&&(e.name==="TimeoutError"||e.name==="AbortError")}function j1e(e){if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}if(typeof e=="number")return!Number.isFinite(e)||e<B1e||e>U1e?void 0:new Date(e*1e3)}function yE(e){if(typeof e!="object"||e===null)return;let t=e,n=t.utilization;if(typeof n!="number"||!Number.isFinite(n))return;let r=n>1?n/100:n,o=Math.min(1,Math.max(0,r)),i=j1e(t.resets_at);return{utilization:o,...i!==void 0?{resetsAt:i}:{}}}var D1e,L1e,F1e,B1e,U1e,Une=b(()=>{"use strict";Hi();F();D1e="https://api.anthropic.com/api/oauth/usage",L1e="oauth-2025-04-20",F1e=1e4;B1e=0,U1e=4102444800});function jne(e){if(Ic.includes(e)||Di(e)!==void 0)return!0;let t=oe(e);if(t==="openai-compatible"||t==="xai"||t==="xai-oauth")return!0;let n=ma(e).id.trim().toLowerCase();return n.startsWith("claude-")||n.startsWith("claude_")}var Hne=b(()=>{"use strict";Ge();At()});function H1e(e,t){if(t.length===0)return 100;let n=Ie(e).toLowerCase(),r=t.toLowerCase();if(n.includes(r))return 100;let o=0,i=-1,s=-1;for(let c=0;c<n.length&&o<r.length;c++)n[c]===r[o]&&(i===-1&&(i=c),s=c,o++);if(o<r.length)return;let a=s-i+1,l=r.length/a;return 50+Math.round(l*49)}function Sh(e,t){let n=[];for(let r=0;r<e.length;r++){let o=H1e(e[r]??"",t);o!==void 0&&n.push({originalIndex:r,score:o})}return t.length===0?n:n.sort((r,o)=>o.score-r.score)}var Wne=b(()=>{"use strict";de()});function An(e,t){return new Promise(n=>{let{header:r,options:o,multi:i=!1,signal:s,initialIndex:a=0,onCtrlC:l,searchable:c=!1}=t;if(o.length===0){n(null);return}if(s?.aborted){n(null);return}let u="",d=Sh(o,u),p=()=>c?d.map(_=>o[_.originalIndex]??""):o,f=mL(a,0,o.length-1),g=0,h=_=>{let R=e.terminalRows?.();if(R===void 0)return pL;let P=r.length+(c?1:0)+1,I=Math.max(0,R-1-P),$=_>Math.min(pL,I)?1:0;return Math.min(pL,Math.max(0,I-$))},y=()=>{let _=p().length;if(_===0){f=0,g=0;return}let R=h(_);f=mL(f,0,_-1),f<g&&(g=f),R>0&&f>=g+R&&(g=f-R+1),g=mL(g,0,Math.max(0,_-R))},w=new Set(t.initialSelected??[]),S=!1,v=_=>{S||(S=!0,s&&s.removeEventListener("abort",x),e.exitPickerMode(),n(_))},x=()=>v(null);s&&s.addEventListener("abort",x,{once:!0});let T=()=>{let _=[];for(let W of r)_.push(W);c&&_.push(m.dim(" Filter: ")+u+"\u2588");let R=p(),P=R.length,I=h(P);y();let $=g,j=Math.min(g+I,P);for(let W=$;W<j;W++){let q=R[W]??"",K=W===f,H=K?m.brand(W1e):K1e,Y;if(i){let ie=c?d[W]?.originalIndex??W:W,M=w.has(ie),N=M?m.success(G1e):m.dim(q1e),Q=K&&!M?m.bold(q):q;Y=` ${H} ${N} ${Q}`}else{let ie=K?m.bold(q):m.dim(q);Y=` ${H} ${ie}`}_.push(Y)}if(P>I){let W=$+1,q=j;_.push(m.dim(` (${W}\u2013${q} of ${P} \u2191/\u2193 scroll)`))}let O=c?V1e:i?J1e:z1e;return _.push(m.dim(" "+O)),_},E=(_,R)=>{if(!S){if(R.name==="escape"){if(c&&u.length>0){u="",d=Sh(o,u),f=0,g=0,e.repaintPicker();return}v(null);return}if(R.ctrl&&R.name==="c"){l?.(),v(null);return}if(c&&(R.name==="backspace"||R.name==="delete")){u.length>0&&(u=u.slice(0,-1),d=Sh(o,u),f=0,g=0,e.repaintPicker());return}if(R.name==="up"||R.ctrl&&R.name==="p"){let P=p().length;f=f===0?P-1:f-1,y(),e.repaintPicker();return}if(R.name==="down"||R.ctrl&&R.name==="n"){let P=p().length;f=f===P-1?0:f+1,y(),e.repaintPicker();return}if(R.name==="return"){if(c&&d.length===0)return;if(i){let P=[];for(let I=0;I<o.length;I++)if(w.has(I)){let $=o[I];$!==void 0&&P.push($)}v(P)}else{let P=c?d[f]?.originalIndex??f:f,I=o[P];v(I!==void 0?[I]:[])}return}if(i&&(R.name==="space"||_===" ")){let P=c?d[f]?.originalIndex??f:f;w.has(P)?w.delete(P):w.add(P),e.repaintPicker();return}if(R.name==="home"){f=0,g=0,e.repaintPicker();return}if(R.name==="end"){f=p().length-1,y(),e.repaintPicker();return}if(c&&_!==void 0&&_.length===1&&!R.ctrl&&!R.meta&&(_.codePointAt(0)??0)>=32){u+=_,d=Sh(o,u),f=0,g=0,e.repaintPicker();return}}};y();let C={renderRows:T,onKey:E};e.enterPickerMode(C)})}function mL(e,t,n){return n<t||e<t?t:e>n?n:e}var W1e,K1e,G1e,q1e,z1e,J1e,V1e,pL,Ls=b(()=>{"use strict";L();Wne();W1e="\u25B8",K1e=" ",G1e="\u25C9",q1e="\u25EF",z1e="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",J1e="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel",V1e="\u2191/\u2193 navigate \xB7 enter select \xB7 esc clear/cancel \xB7 type to filter",pL=20});function X1e(e,t){let n=`${Math.round(t.utilization*100)}%`,r=t.resetsAt?m.dim(` (resets ${t.resetsAt.toLocaleString()})`):"";return` ${e.padEnd(16)}${m.meta(n)}${r}`}function Z1e(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,i=n?.cache_read_input_tokens??0,s=n?.cache_creation_input_tokens??0,a=t.totalTokens??n?.context_window_tokens??0,l=lL(i,s);e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(ae()),e.line(` total ${m.success(Ae(t.totalTokens))} of ${m.meta(Ae(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(Ae(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(Ae(r))} ${m.dim("(turn total)")}`),e.line(` output ${m.meta(Ae(o))} ${m.dim("(turn total)")}`),e.line(` cache read ${m.meta(Ae(i))} ${m.dim("(last call)")}`),e.line(` cache creat ${m.meta(Ae(s))} ${m.dim("(last call)")}`),l!==void 0&&e.line(` cache hit ${m.meta(`${l}%`)} ${m.dim("(of cached tokens, last call)")}`),e.line(` window ${m.meta(Ae(a))} ${m.dim("(last call occupancy)")}`);let c=t.categories??[];if(c.length>0){let f=[...c].sort((g,h)=>h.tokens-g.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let g of f)e.line(` ${m.warning(g.name.padEnd(18))} ${m.meta(Ae(g.tokens))}`)}let u=t.systemTools??[],d=t.mcpTools??[];if(u.length>0||d.length>0){e.line();let f=u.reduce((h,y)=>h+y.tokens,0),g=d.reduce((h,y)=>h+y.tokens,0);u.length>0&&e.line(m.dim(` system tools ${u.length} tools, ${Ae(f)} tokens`)),d.length>0&&e.line(m.dim(` MCP tools ${d.length} tools, ${Ae(g)} tokens`))}let p=t.agents??[];if(p.length>0){let f=p.reduce((g,h)=>g+h.tokens,0);e.line(m.dim(` agents ${p.length} loaded, ${Ae(f)} tokens`))}if(t.skills){let f=t.skills;e.line(m.dim(` skills ${f.includedSkills}/${f.totalSkills} included, ${Ae(f.tokens)} tokens`))}if(t.slashCommands){let f=t.slashCommands;e.line(m.dim(` slash cmds ${f.includedCommands}/${f.totalCommands} included, ${Ae(f.tokens)} tokens`))}e.line()}function eHe(e,t){let n=t.turnTokens.reduce((u,d)=>u+d.input,0),r=t.turnTokens.reduce((u,d)=>u+d.output,0),o=t.turnTokens.reduce((u,d)=>u+d.cache,0),i=n+r,s=at(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=s>0?Math.round(l/s*100):0;e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(ae()),e.line(` input ${m.meta(Ae(n))}`),e.line(` output ${m.meta(Ae(r))}`),e.line(` cache read ${m.meta(Ae(o))}`),e.line(` total ${m.success(Ae(i))}`),e.line(` context ${m.meta(`${c}% of ${Ae(s)} (${t.model})`)}`),e.line()}async function Kne(e,t){if(!jne(t)){e.out.warn(`Unknown model: ${t}. Aliases: ${Ic.join(", ")} (or a full model id)`);return}let n=Mc(t);if(n){e.out.warn(n);return}try{await e.session.current.setModel(t),e.stats.model=t,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(t)}`)}catch(r){e.out.error(`Failed to switch model: ${r instanceof Error?r.message:String(r)}`)}}var Y1e,Q1e,tHe,nHe,rHe,oHe,iHe,sHe,aHe,Gne,qne=b(()=>{"use strict";L();ht();nt();cL();fh();dL();Nne();Une();At();Hne();Ls();Y1e={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(ae()),n.line(` total ${m.success(nn(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(nn(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(nn).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return t.unpricedTurns>0&&n.line(` unpriced ${m.warning(`${t.unpricedTurns} turn${t.unpricedTurns===1?"":"s"} had no cost metadata \u2014 total may be understated`)}`),n.line(),n.line(m.dim(" This is session-local spend. For account-wide subscription quota, see /usage.")),n.line(),"continue"}};Q1e={name:"/usage",summary:"Show Claude subscription usage (5h / 7d windows)",hint:"When you want to know how close you are to hitting your Claude subscription's rolling usage limits \u2014 distinct from /cost, which is session-local spend.",async handler(e){let{out:t}=e,n=await Bne();if(t.line(),n.kind==="unavailable")return t.line(m.bold("Subscription usage")),t.line(ae()),n.reason==="no-token"?t.warn("No Claude subscription token found \u2014 run `claude login`, then try /usage again."):t.warn(`Usage unavailable (${n.reason}): ${n.detail}`),t.line(),"continue";let o=[["5-hour",n.fiveHour],["7-day",n.sevenDay],["7-day (Sonnet)",n.sevenDaySonnet],["7-day (Opus)",n.sevenDayOpus]].filter(i=>i[1]!==void 0);if(t.line(m.bold("Subscription usage")),t.line(ae()),o.length===0)t.line(m.dim(" No usage windows reported."));else for(let[i,s]of o)t.line(X1e(i,s));return t.line(),"continue"}};tHe={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();Z1e(e.out,t)}catch{eHe(e.out,e.stats)}return"continue"}},nHe={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(ae()),t.turns.forEach((r,o)=>{let i=m.meta(`#${o+1}`),s=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${i} ${m.user("\u25B6")} ${s}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}};rHe={name:"/model",usage:"/model [local|small|medium|large|opus|sonnet|haiku|fable|org/model]",summary:"Switch the active model mid-session",hint:"Switch the capability tier (local/small/medium/large \u2014 or your configured names) or pass a full model id. Bare `/model` opens an interactive picker on a TTY. Upgrade to large for a hard problem, downshift to small for cheap iteration \u2014 context carries over. Also accepts HuggingFace-style ids (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(n)return await Kne(e,n),"continue";let r=e.getCompositor?.()??null;if(r){let i=[...Ic],s=i.indexOf(e.stats.model),l=(await An(r,{header:[m.bold("Switch model"),m.dim(`current: ${e.stats.model}`),m.dim("or type a full id: /model <org/model>"),""],options:i,initialIndex:s>=0?s:0}))?.[0];return l&&await Kne(e,l),"continue"}e.out.info(`Current model: ${m.brand(e.stats.model)}`);let o=Ic.map(i=>Fne(i)?i:`${i} (needs sign-in)`).join(", ");return e.out.line(m.dim(` Aliases: ${o} (or any org/model HF id)`)),"continue"}},oHe={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(ae());let r=3,o=Math.ceil(n.length/r),i=Math.max(...n.map(s=>s.length))+2;for(let s=0;s<o;s++){let a=[];for(let l=0;l<r;l++){let c=l*o+s;c<n.length&&a.push(n[c].padEnd(i))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},iHe={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(CT(),s9)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(ae());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${i} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),i=o.indexOf(" ");if(i===-1||o.slice(0,i).length===0||o.slice(i+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let s=o.slice(0,i).trim(),a=o.slice(i+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${s}"\u2026`),await e.mcpManager.completeAuth(s,a),e.out.success(`OAuth complete for "${s}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${s}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(ae());let i=0;for(let s of o){let a=typeof s=="string"?s:s.name??JSON.stringify(s),l=typeof s=="object"&&s!==null&&"status"in s?String(s.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(m.dim(` ${i} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},sHe={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(ae());for(let[t,n]of Object.entries($c)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(Ae(n))}${r}`)}return e.out.line(),"continue"}},aHe={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(hE(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},Gne=[Y1e,tHe,nHe,rHe,oHe,iHe,sHe,aHe,Q1e]});function lHe(e){switch(e){case"bypassPermissions":return"bypass restored \u2014 no prompts, read/write any path";case"acceptEdits":return"accept-edits restored \u2014 edits auto-approved";case"dontAsk":case"auto":return"previous mode restored \u2014 no approval prompts";default:return"default permissions restored"}}async function vh(e,t){let n=e.stats.permissionMode==="plan",r=t!==void 0?t:!n,o=r?"plan":e.session.current.getPrePlanMode?.()??"default";try{if(await e.session.current.setPermissionMode(o),e.stats.permissionMode=o,e.ui.repaintStatusLine(),r){let i=fL?"":m.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");fL||(fL=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(m.success("\u25CB plan mode OFF")+m.dim(` \u2014 ${lHe(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}var fL,zne=b(()=>{"use strict";L();fL=!1});async function cHe(e){if(await vh(e,!1),e.stats.permissionMode==="plan")return"continue";let t=zp(e.stats.cwd??process.cwd());return e.out.info(m.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:mS(t)}}var Jne,Vne=b(()=>{"use strict";U();aI();zne();L();Jne={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode; /plan off saves the plan to a file then implements it",hint:"Think through an approach without changing anything \u2014 write tools and state-mutating bash are refused until you exit; read-only investigation runs. /plan off saves the plan + implements it; Shift+Tab cycles to the next mode without implementing.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();return n!==""&&r!=="on"&&r!=="off"?(e.stats.permissionMode!=="plan"&&await vh(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await vh(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await vh(e,!1),"continue"):cHe(e)}}});function fHe(e){let t=e.trim();return mHe.some(n=>n.test(t))}function bL(e){let t=-1,n=-1;for(let r=0;r<e.length;r++){let o=e[r];o.isError!==!0&&(pHe.has(o.toolName)?t=r:o.toolName==="bash"&&fHe(o.input)&&(n=r))}return t<0?"no-code-changes":n>t?"verified":"unverified"}function Qne(e){return e.some(n=>n.isError!==!0&&yL.has(n.toolName))?bL(e)!=="unverified":!1}function gHe(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":uHe[e.kind]}`,i=[];for(let[a,l]of dHe[e.kind]){let c=e[l];typeof c=="string"&&c.trim().length>0&&i.push(a?`\u2022 ${a}: ${c.trim()}`:`\u2022 ${c.trim()}`)}if(i.length===0&&e.rawBody.trim().length>0){let a=e.rawBody.trim();i.push(a.length>Xne?`${a.slice(0,Xne)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no recognized successful verification was observed backing this Done claim \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
|
|
1942
1942
|
`):"(no detail)";return Ke(`${o}
|
|
1943
1943
|
${s}`)}function Zne(){gL=0,hL=!1}async function ere(e,t=an,n={}){try{if(gL>=Yne){hL||(hL=!0,await t(`\u{1F916} AFK \xB7 reached ${Yne} updates this session \u2014 further terminal-state pushes muted. Run /afk off then /afk on to resume.`));return}gL+=1,await t(gHe(e,n))}catch{}}var Yne,Xne,uHe,dHe,yL,pHe,mHe,gL,hL,bE=b(()=>{"use strict";Bo();uo();Yne=20,Xne=500,uHe={done:"\u2705 Done",blocked:"\u26D4 Blocked",asking:"\u2753 Asking",interrupted:"\u23F8\uFE0F Interrupted"},dHe={done:[["","whatWasDone"],["Evidence","evidence"],["Pending","deferred"]],blocked:[["Blocked by","whatBlocks"],["Unblock","unblockCondition"],["Done so far","alreadyDone"]],asking:[["","question"],["Resolves","assumption"],["Then","followup"]],interrupted:[["","whatWasInProgress"],["State saved","stateLocation"],["Resume needs","resumeRequires"]]},yL=new Set(["write_file","edit_file","bash"]),pHe=new Set(["write_file","edit_file"]),mHe=[/^\s*(?:pnpm|npm|yarn|bun|npx)\s+(?:run\s+)?(?:test|lint|check|typecheck|type-check|verify|build)\b/,/^\s*make\s+(?:test|check|lint|verify|build)\b/,/^\s*cargo\s+(?:test|check|clippy|build)\b/,/^\s*go\s+(?:test|vet|build)\b/,/^\s*(?:pytest|python3?\s+-m\s+(?:pytest|unittest))\b/,/^\s*(?:vitest|jest|mocha|ava|tap)\b/,/^\s*(?:pnpm\s+exec|npx)\s+(?:vitest|jest|mocha|pytest|tsc)\b/,/^\s*tsc\b/,/^\s*(?:gcc|g\+\+|clang|clang\+\+|rustc|javac|dotnet\s+(?:build|test))\b/,/^\s*swift\s+(?:build|test)\b/,/^\s*(?:rake\s+(?:test|spec)|bundle\s+exec\s+rspec)\b/];gL=0,hL=!1});import*as up from"node:fs";import*as nre from"node:path";import{createHmac as hHe,randomBytes as rre,timingSafeEqual as yHe}from"node:crypto";function wHe(e){return JSON.stringify(wL(e))}function wL(e){if(Array.isArray(e))return e.map(wL);if(e!==null&&typeof e=="object"){let t=e,n={};for(let r of Object.keys(t).sort())n[r]=wL(t[r]);return n}return e}function ire(e){let t=tre(e);if(t)return t;let n;try{n=_y(e)}catch{return null}try{up.mkdirSync(nre.dirname(n),{recursive:!0});let r=rre(bHe).toString("hex");return up.writeFileSync(n,r+`
|
|
1944
1944
|
`,{mode:384}),r}catch{return tre(e)}}function tre(e){let t;try{t=_y(e)}catch{return null}try{let n=up.readFileSync(t,"utf8").trim();return n.length>0?n:null}catch{return null}}function sre(e,t){return hHe("sha256",e).update(t).digest("hex")}function are(e,t){if(typeof e!="string"||typeof t!="string"||e.length!==t.length||e.length===0||!/^[0-9a-f]+$/i.test(e)||!/^[0-9a-f]+$/i.test(t))return!1;let n,r;try{n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex")}catch{return!1}return n.length!==r.length||n.length===0?!1:yHe(n,r)}function SHe(e,t,n){return["elicitation_response",e,t,wHe(n)].join(ore)}function vHe(e,t,n,r){return sre(e,SHe(t,n,r))}function lre(e,t,n,r,o){return are(o,vHe(e,t,n,r))}function kHe(e,t){return["abort_request",e,t].join(ore)}function THe(e,t,n){return sre(e,kHe(t,n))}function cre(e,t,n,r){return are(r,THe(e,t,n))}function ure(){return rre(8).toString("hex")}var bHe,ore,SL=b(()=>{"use strict";U();bHe=32,ore="\0"});function pre(e){let{sessionId:t,key:n,onAbort:r}=e;if(n===null)return{stop:()=>{}};let o=new AbortController;return(async()=>{try{for await(let i of ff(t,{fromStart:!1,signal:o.signal}))if(i.kind==="abort_request"&&cre(n,t,i.nonce,i.hmac)){r("remote abort via Telegram"),o.abort();return}}catch{}})(),{stop:()=>{o.abort()}}}function mre(e){let{sessionId:t,key:n,emitElicitation:r,fallback:o}=e,i=e.newReqId??ure;return function(a,l){let c=l.signal;if(c.aborted)return Promise.resolve(dre);let u=i(),d,p=new Promise(h=>{d=h}),f=new AbortController,g=()=>{f.abort(),d(dre)};c.addEventListener("abort",g,{once:!0}),n&&(async()=>{try{for await(let h of ff(t,{fromStart:!1,signal:f.signal}))if(h.kind==="elicitation_response"&&h.reqId===u&&lre(n,t,u,h.result,h.hmac)){d(h.result);return}}catch{}})();try{r({kind:"elicitation",reqId:u,request:a})}catch{}return Promise.resolve(o(a,{signal:f.signal})).then(h=>d(h)).catch(()=>{}),p.finally(()=>{f.abort(),c.removeEventListener("abort",g)})}}var dre,fre=b(()=>{"use strict";Na();SL();dre={action:"decline"}});function xHe(){return k.TELEGRAM_BOT_TOKEN?iu().length>0:!1}async function kh(e,t){let n=e.stats.permissionMode==="autonomous",r=t!==void 0?t:!n;try{if(await e.session.current.setPermissionMode(r?"autonomous":"default"),e.stats.permissionMode=r?"autonomous":"default",e.ui.repaintStatusLine(),r){Zne();let o=e.session.current,i=o.sessionId,s=e.swapElicitationHandler,a=e.stdinElicitationHandler;if(i&&s&&a){let l=ire(i);l===null&&e.out.error("AFK: could not establish a signing key \u2014 phone replies and remote /abort will NOT work (keyboard only). Check that the AFK state dir is writable.");let c=mre({sessionId:i,key:l,emitElicitation:u=>o.recordLedgerElicitation(u.reqId,u.request),fallback:a});s(c),wE?.stop(),wE=pre({sessionId:i,key:l,onAbort:u=>o.abort(u)}),qC(i,!0)}else e.out.error("AFK: phone relay NOT armed \u2014 the session has no id until your first message completes. Running keyboard-only; re-run /afk on after a turn to enable phone questions/approvals and remote /abort.");e.out.success(m.info("\u25D0 AFK mode ON")+m.dim(" \u2014 autonomous on reversible work; high-risk/irreversible ops are refused; terminal states report to Telegram.")),xHe()||e.out.error("Telegram is not configured, so AFK updates will not be delivered. Run /telegram-setup to connect a chat. (AFK posture + safety gate still apply.)")}else{e.swapElicitationHandler?.(null),wE?.stop(),wE=null;let o=e.session.current.sessionId;o&&qC(o,!1),e.out.success(m.success("\u25CB AFK mode OFF")+m.dim(" \u2014 default permissions restored"))}}catch(o){e.out.error(`Could not toggle AFK mode: ${o instanceof Error?o.message:String(o)}`)}}var wE,vL=b(()=>{"use strict";F();of();bE();SL();fre();xa();L();wE=null});var gre,hre=b(()=>{"use strict";vL();gre={name:"/afk",usage:"/afk [on|off]",summary:"Toggle AFK mode \u2014 autonomous work + Telegram reporting while you are away",hint:"Tell the agent you are away from keyboard: it works autonomously on reversible operations, a safety gate refuses high-risk/irreversible ops, and each turn reports its terminal state to Telegram. /afk off restores default permissions.",async handler(e,t){let n=t.trim().toLowerCase(),r=n==="on"?!0:n==="off"?!1:e.stats.permissionMode!=="autonomous";return r&&e.stats.permissionMode==="autonomous"?"continue":!r&&e.stats.permissionMode==="plan"?(e.out.warn("AFK is already off \u2014 you're in plan mode. Use `/plan off` to leave plan mode."),"continue"):!r&&e.stats.permissionMode!=="autonomous"?(await kh(e,!1),"continue"):(await kh(e,r),"continue")}}});import{readFileSync as EHe,writeFileSync as RHe,existsSync as yre,mkdirSync as AHe}from"fs";import{join as CHe}from"path";function bre(){return $A(),Sy()}function wre(e){return CHe(bre(),`${e}.json`)}function SE(e){let t=wre(e);if(!yre(t))return{sessionId:e,items:[]};try{let n=EHe(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function Th(e){let t=bre();yre(t)||AHe(t,{recursive:!0}),RHe(wre(e.sessionId),JSON.stringify(e,null,2))}function Sre(e,t){let r={id:e.items.reduce((o,i)=>Math.max(o,i.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function vre(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function kre(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function Tre(e){e.items.length=0}function vE(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,ne());{let r=m.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+m.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?m.success("[x]"):m.dim("[ ]"),i=r.done?m.dim(r.text):cm(r.text),a=` ${m.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-G(a)),c=pe(i,l,{breakLongWords:!0}).split(`
|
|
1945
1945
|
`);t.push(a+(c[0]??""));let u=" ".repeat(G(a));for(let d of c.slice(1))t.push(u+d)}{let r=Math.max(0,Math.min(n-1,120));t.push(m.dim("\u2514"+"\u2500".repeat(r)))}return t}function xre(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
|
|
1946
|
-
`)}var kL=b(()=>{"use strict";U();de();_i();L();we();tt()});function Ere(e){let t=e.stats.sessionId??"unbound";return SE(t)}function _He(e){let t=Ere(e),n=vE(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 Rre,Are=b(()=>{"use strict";L();kL();Rre={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",hint:"When you want a durable checklist the model and you both see \u2014 survives across turns and shows above each prompt.",async handler(e,t){let n=t.trim();if(!n||n==="list")return _He(e),"continue";let[r,...o]=n.split(/\s+/),i=o.join(" "),s=Ere(e);switch(r){case"add":{if(!i)return e.out.warn("Usage: /todo add <text>"),"continue";let a=Sre(s,i);return Th(s),e.out.success(`Added ${m.meta(`#${a.id}`)} ${a.text}`),"continue"}case"done":{let a=parseInt(i,10);if(!Number.isFinite(a))return e.out.warn("Usage: /todo done <id>"),"continue";let l=vre(s,a);return l?(Th(s),e.out.success(`Marked done ${m.meta(`#${a}`)} ${l.text}`)):e.out.warn(`No todo with id ${a}`),"continue"}case"rm":case"remove":{let a=parseInt(i,10);return Number.isFinite(a)?(kre(s,a)?(Th(s),e.out.success(`Removed ${m.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return Tre(s),Th(s),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}}});var Cre,_re=b(()=>{"use strict";L();Rs();QO();Ld();Cre={name:"/name",usage:"/name [name]",hint:"When you want a memorable handle for this session so /resume and --resume can find it by name instead of a UUID.",summary:"Show or set this session\u2019s name",async handler(e,t){let n=t.trim();if(!n)return e.stats.name?e.out.line(m.dim(" name ")+m.warning(e.stats.name)):e.out.info("No name set. Use /name <name> to set one."),"continue";let r=wT(n);if(!r)return e.out.warn("Invalid name \u2014 use letters, numbers, spaces, or hyphens."),"continue";if(e.stats.name=r,e.stats.totalTurns>0)try{Es(e.stats),e.out.success(m.success("Named")+m.dim(` ${r}`)),e.out.line(m.dim(` Resume: ${As(r,e.stats.model)}`))}catch(o){e.out.error(`Named "${r}" but save failed: ${o instanceof Error?o.message:String(o)}`)}else e.out.success(m.success("Named")+m.dim(` ${r} (saves on first turn)`));return"continue"}}});function PHe(){return
|
|
1947
|
-
`);for(let r of n)t.line(` ${r}`)}function IHe(e){let t=[];if(typeof e.costUsd=="number"&&e.costUsd>0&&t.push(`$${e.costUsd.toFixed(4)}`),typeof e.durationMs=="number"&&e.durationMs>0){let n=(e.durationMs/1e3).toFixed(1);t.push(`${n}s`)}return t.length===0?null:m.dim(` [${t.join(" \xB7 ")}]`)}function Ore(e){let t=
|
|
1948
|
-
`)}function TL(e){return e==="cancelled"?m.dim(" Resume cancelled \u2014 returned to prompt."):e==="resuming"?m.dim(" Resuming session\u2026"):m.dim(" Press Enter to resume this session, Esc to cancel")}function $re(e,t,n){if(e.length===0){t.line(m.dim(" (no turns recorded)"));return}let r=n!==void 0&&n>0?n:e.length,o=e.slice(Math.max(0,e.length-r));o.length<e.length&&(t.line(m.dim(` \u2026 ${e.length-o.length} earlier turn${e.length-o.length===1?"":"s"} not shown`)),t.line(""));for(let i of o){let s=(i.user??"").trim(),a=(i.assistant??"").trim();if(s.length===0&&a.length===0)continue;if(t.line(m.dim("\xB7")+" "+m.user("User")),s.length>0?Mre(Ire(s,Pre),t):t.line(m.dim(" (empty)")),t.line(""),t.line(m.dim("\xB7")+" "+m.heading("Assistant")),a.length>0?Mre(Ire(a,Pre),t):t.line(m.dim(" (empty)")),t.line(""),i.toolEvents&&i.toolEvents.length>0){let c=bT(i.toolEvents);if(c.length>0){let u=c.replace(/^\n/,"");t.line(m.dim(` ${u}`)),t.line("")}}let l=IHe(i);l!==null&&t.line(l),t.line(PHe()),t.line("")}}var Pre,Dre=b(()=>{"use strict";L();aa();XO();Pre=600});function Nre(e){if(typeof e!="number"||!Number.isFinite(e))return"\u2014".padEnd(9);let t=new Date(e);if(Number.isNaN(t.getTime()))return"\u2014".padEnd(9);let n=Date.now()-e,r=Math.floor(n/6e4);if(r<1)return"just now".padEnd(9);if(r<60)return`${r}m ago`.padEnd(9);let o=Math.floor(r/60);if(o<24)return`${o}h ago`.padEnd(9);let i=Math.floor(o/24);if(i<30)return`${i}d ago`.padEnd(9);let s=t.toLocaleString("en-US",{month:"short"}),a=t.getDate();return`${s} ${a}`.padEnd(9)}function MHe(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}function Lre(e){let t=Nre(e.savedAt),n=e.model.padEnd(7),r=`${e.totalTurns} turn${e.totalTurns===1?"":"s"}`.padEnd(9),o=nn(e.totalCostUsd).padStart(8),i=e.source==="telegram"?"tg":" ";return`${t} ${n} ${r} ${o} ${i} ${e.name??e.id}`}function OHe(e){let t=new Map;for(let n of e){let r=Lre(n);t.set(r,(t.get(r)??0)+1)}return e.map(n=>{let r=Lre(n);return(t.get(r)??0)>1?`${r} ${m.dim(n.id)}`:r})}async function DHe(e,t){let n=e.getCompositor?.()??null;if(!n)return!0;let r=t.data,o=r.turns??[],i=[],s={line:(a="")=>{i.push(a)},raw:a=>{i.push(a)},success:a=>{i.push(a)},info:a=>{i.push(a)},warn:a=>{i.push(a)},error:a=>{i.push(a)}};return s.line(Ore({name:r.name,id:t.id,totalTurns:r.totalTurns})),s.line(""),$re(o,s,$He),s.line(""),s.line(TL("preview")),new Promise(a=>{let l=!1,c=d=>{l||(l=!0,n.exitPickerMode(),a(d))},u={renderRows:()=>i,onKey:(d,p)=>{if(!l){if(p.name==="return"){c(!0);return}if(p.name==="escape"){c(!1);return}p.ctrl&&p.name==="c"&&c(!1)}}};n.enterPickerMode(u)})}async function Fre(e,t){let n=t.data.name??t.id;if(typeof e.requestResume=="function"){let i=e.session.current.sessionId,s=t.data.sessionId;if(i!==void 0&&s!==void 0&&i===s||i!==void 0&&i===t.id){e.out.warn(`Already on session ${n}.`);return}if(!await DHe(e,t)){e.out.line(TL("cancelled"));return}e.out.info(`Resuming session ${n} \u2026`);let c=await e.requestResume(MHe(t));c.ok?e.out.success(`Resumed ${n} (sdk id: ${c.sessionId})`):e.out.warn(c.reason);return}let r=t.data,o=r.name??r.sessionId??t.id;e.out.line(),e.out.line(m.bold(`Session ${r.name??t.id}`)),e.out.line(
|
|
1946
|
+
`)}var kL=b(()=>{"use strict";U();de();_i();L();we();tt()});function Ere(e){let t=e.stats.sessionId??"unbound";return SE(t)}function _He(e){let t=Ere(e),n=vE(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 Rre,Are=b(()=>{"use strict";L();kL();Rre={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",hint:"When you want a durable checklist the model and you both see \u2014 survives across turns and shows above each prompt.",async handler(e,t){let n=t.trim();if(!n||n==="list")return _He(e),"continue";let[r,...o]=n.split(/\s+/),i=o.join(" "),s=Ere(e);switch(r){case"add":{if(!i)return e.out.warn("Usage: /todo add <text>"),"continue";let a=Sre(s,i);return Th(s),e.out.success(`Added ${m.meta(`#${a.id}`)} ${a.text}`),"continue"}case"done":{let a=parseInt(i,10);if(!Number.isFinite(a))return e.out.warn("Usage: /todo done <id>"),"continue";let l=vre(s,a);return l?(Th(s),e.out.success(`Marked done ${m.meta(`#${a}`)} ${l.text}`)):e.out.warn(`No todo with id ${a}`),"continue"}case"rm":case"remove":{let a=parseInt(i,10);return Number.isFinite(a)?(kre(s,a)?(Th(s),e.out.success(`Removed ${m.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return Tre(s),Th(s),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}}});var Cre,_re=b(()=>{"use strict";L();Rs();QO();Ld();Cre={name:"/name",usage:"/name [name]",hint:"When you want a memorable handle for this session so /resume and --resume can find it by name instead of a UUID.",summary:"Show or set this session\u2019s name",async handler(e,t){let n=t.trim();if(!n)return e.stats.name?e.out.line(m.dim(" name ")+m.warning(e.stats.name)):e.out.info("No name set. Use /name <name> to set one."),"continue";let r=wT(n);if(!r)return e.out.warn("Invalid name \u2014 use letters, numbers, spaces, or hyphens."),"continue";if(e.stats.name=r,e.stats.totalTurns>0)try{Es(e.stats),e.out.success(m.success("Named")+m.dim(` ${r}`)),e.out.line(m.dim(` Resume: ${As(r,e.stats.model)}`))}catch(o){e.out.error(`Named "${r}" but save failed: ${o instanceof Error?o.message:String(o)}`)}else e.out.success(m.success("Named")+m.dim(` ${r} (saves on first turn)`));return"continue"}}});function PHe(){return ae(void 0,100)}function Ire(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}function Mre(e,t){let n=e.split(`
|
|
1947
|
+
`);for(let r of n)t.line(` ${r}`)}function IHe(e){let t=[];if(typeof e.costUsd=="number"&&e.costUsd>0&&t.push(`$${e.costUsd.toFixed(4)}`),typeof e.durationMs=="number"&&e.durationMs>0){let n=(e.durationMs/1e3).toFixed(1);t.push(`${n}s`)}return t.length===0?null:m.dim(` [${t.join(" \xB7 ")}]`)}function Ore(e){let t=ae(void 0,100),n=e.name?`${e.name} ${m.dim(`(${e.id.slice(0,12)})`)}`:e.id.slice(0,20),r=`${e.totalTurns} turn${e.totalTurns===1?"":"s"}`,o=m.bold(`Session: ${n}`)+" "+m.dim(r);return[t,o,t].join(`
|
|
1948
|
+
`)}function TL(e){return e==="cancelled"?m.dim(" Resume cancelled \u2014 returned to prompt."):e==="resuming"?m.dim(" Resuming session\u2026"):m.dim(" Press Enter to resume this session, Esc to cancel")}function $re(e,t,n){if(e.length===0){t.line(m.dim(" (no turns recorded)"));return}let r=n!==void 0&&n>0?n:e.length,o=e.slice(Math.max(0,e.length-r));o.length<e.length&&(t.line(m.dim(` \u2026 ${e.length-o.length} earlier turn${e.length-o.length===1?"":"s"} not shown`)),t.line(""));for(let i of o){let s=(i.user??"").trim(),a=(i.assistant??"").trim();if(s.length===0&&a.length===0)continue;if(t.line(m.dim("\xB7")+" "+m.user("User")),s.length>0?Mre(Ire(s,Pre),t):t.line(m.dim(" (empty)")),t.line(""),t.line(m.dim("\xB7")+" "+m.heading("Assistant")),a.length>0?Mre(Ire(a,Pre),t):t.line(m.dim(" (empty)")),t.line(""),i.toolEvents&&i.toolEvents.length>0){let c=bT(i.toolEvents);if(c.length>0){let u=c.replace(/^\n/,"");t.line(m.dim(` ${u}`)),t.line("")}}let l=IHe(i);l!==null&&t.line(l),t.line(PHe()),t.line("")}}var Pre,Dre=b(()=>{"use strict";L();aa();XO();Pre=600});function Nre(e){if(typeof e!="number"||!Number.isFinite(e))return"\u2014".padEnd(9);let t=new Date(e);if(Number.isNaN(t.getTime()))return"\u2014".padEnd(9);let n=Date.now()-e,r=Math.floor(n/6e4);if(r<1)return"just now".padEnd(9);if(r<60)return`${r}m ago`.padEnd(9);let o=Math.floor(r/60);if(o<24)return`${o}h ago`.padEnd(9);let i=Math.floor(o/24);if(i<30)return`${i}d ago`.padEnd(9);let s=t.toLocaleString("en-US",{month:"short"}),a=t.getDate();return`${s} ${a}`.padEnd(9)}function MHe(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}function Lre(e){let t=Nre(e.savedAt),n=e.model.padEnd(7),r=`${e.totalTurns} turn${e.totalTurns===1?"":"s"}`.padEnd(9),o=nn(e.totalCostUsd).padStart(8),i=e.source==="telegram"?"tg":" ";return`${t} ${n} ${r} ${o} ${i} ${e.name??e.id}`}function OHe(e){let t=new Map;for(let n of e){let r=Lre(n);t.set(r,(t.get(r)??0)+1)}return e.map(n=>{let r=Lre(n);return(t.get(r)??0)>1?`${r} ${m.dim(n.id)}`:r})}async function DHe(e,t){let n=e.getCompositor?.()??null;if(!n)return!0;let r=t.data,o=r.turns??[],i=[],s={line:(a="")=>{i.push(a)},raw:a=>{i.push(a)},success:a=>{i.push(a)},info:a=>{i.push(a)},warn:a=>{i.push(a)},error:a=>{i.push(a)}};return s.line(Ore({name:r.name,id:t.id,totalTurns:r.totalTurns})),s.line(""),$re(o,s,$He),s.line(""),s.line(TL("preview")),new Promise(a=>{let l=!1,c=d=>{l||(l=!0,n.exitPickerMode(),a(d))},u={renderRows:()=>i,onKey:(d,p)=>{if(!l){if(p.name==="return"){c(!0);return}if(p.name==="escape"){c(!1);return}p.ctrl&&p.name==="c"&&c(!1)}}};n.enterPickerMode(u)})}async function Fre(e,t){let n=t.data.name??t.id;if(typeof e.requestResume=="function"){let i=e.session.current.sessionId,s=t.data.sessionId;if(i!==void 0&&s!==void 0&&i===s||i!==void 0&&i===t.id){e.out.warn(`Already on session ${n}.`);return}if(!await DHe(e,t)){e.out.line(TL("cancelled"));return}e.out.info(`Resuming session ${n} \u2026`);let c=await e.requestResume(MHe(t));c.ok?e.out.success(`Resumed ${n} (sdk id: ${c.sessionId})`):e.out.warn(c.reason);return}let r=t.data,o=r.name??r.sessionId??t.id;e.out.line(),e.out.line(m.bold(`Session ${r.name??t.id}`)),e.out.line(ae()),e.out.line(` name ${m.brand(r.name??"\u2014")}`),e.out.line(` source ${m.brand(r.source??"cli")}`),e.out.line(` model ${m.brand(r.model)}`),e.out.line(` turns ${m.meta(String(r.totalTurns))}`),e.out.line(` cost ${m.meta(nn(r.totalCostUsd))}`),e.out.line(` sdk id ${m.meta(r.sessionId??"\u2014")}`),e.out.line(),e.out.line(m.dim(" Resume with:")),e.out.line(m.brand(` ${As(o,r.model)}`)),e.out.line()}var $He,Bre,Ure=b(()=>{"use strict";L();ht();Rs();nt();Ld();Ls();Dre();$He=10;Bre={name:"/resume",usage:"/resume [id]",hint:"When you want to continue a previously saved session \u2014 runs interactively to pick one if no id is given.",summary:"List saved sessions, or swap the active session for a stored one",async handler(e,t){let n=t.trim();if(n){let u=ml(n);return u?(await Fre(e,u),"continue"):(e.out.warn(`No saved session: ${n}`),"continue")}let r=Mg();if(r.length===0)return e.out.info("No saved sessions found. Start a session \u2014 it autosaves each turn."),"continue";let o=e.stats.cwd??process.cwd(),i=r.filter(u=>u.cwd===o),s=i.length>0,a=s?i:r,l=e.getCompositor?.()??null;if(l){let u=a,d=OHe(u),f=(await An(l,{header:[m.bold(`Resume a session (${u.length})`),m.dim(s?"saved in this directory":"all directories (none saved here)"),""],options:d,searchable:!0}))?.[0];if(f){let g=d.indexOf(f),h=g>=0?u[g]:void 0;if(h){let y=ml(h.id);y?await Fre(e,y):e.out.warn(`No saved session: ${h.name??h.id}`)}}return"continue"}let c=s?m.bold(`Saved sessions (${a.length})`):m.bold("Saved sessions \u2014 all (none in this directory)");e.out.line(),e.out.line(c),e.out.line(ae());for(let u of a.slice(0,50)){let d=Nre(u.savedAt),p=m.brand(u.model.padEnd(7)),f=m.meta(`${u.totalTurns} turn${u.totalTurns===1?"":"s"}`.padEnd(9)),g=m.meta(nn(u.totalCostUsd).padStart(8)),h=u.source==="telegram"?m.brand("tg"):" ",y=m.warning(u.name??u.id);e.out.line(` ${d} ${p} ${f} ${g} ${h} ${y}`)}return e.out.line(),e.out.line(m.dim(" Resume with: /resume <name>")),e.out.line(),"continue"}}});import{resolve as LHe}from"node:path";function xL(e,t,n){let r=LHe(process.argv[1]??""),o=[process.execPath,r,"interactive"];typeof t=="string"&&t.length>0&&o.push("--model",t),o.push("--resume",e);let i=o.map(Ng).join(" "),s=r.length>0&&!r.endsWith(".ts");return{argv:o,shellCommand:i,cwd:n,spawnable:s}}function kE(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function jre(e){return`cd ${Ng(e.cwd)} && ${e.shellCommand}`}function FHe(e){return`tell application "iTerm" to tell current window to create tab with default profile command "${kE(jre(e))}"`}function NHe(e){return`tell application "Terminal" to do script "${kE(jre(e))}"`}function BHe(e){return['tell application "Ghostty"',"set cfg to new surface configuration",`set command of cfg to "${kE(e.shellCommand)}"`,`set initial working directory of cfg to "${kE(e.cwd)}"`,"new tab in (front window) with configuration cfg","end tell"].join(`
|
|
1949
1949
|
`)}function EL(e,t,n=process.platform){switch(e){case"tmux":return{kind:e,capability:"tab",exec:{cmd:"tmux",args:["new-window","-c",t.cwd,t.shellCommand]}};case"wezterm":return{kind:e,capability:"tab",exec:{cmd:"wezterm",args:["cli","spawn","--cwd",t.cwd,"--",...t.argv]}};case"kitty":return{kind:e,capability:"tab",exec:{cmd:"kitten",args:["@","launch","--type=tab",`--cwd=${t.cwd}`,...t.argv]}};case"windows-terminal":return{kind:e,capability:"tab",exec:{cmd:"wt",args:["-w","0","new-tab","-d",t.cwd,...t.argv]}};case"iterm2":return{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",FHe(t)]}};case"apple-terminal":return{kind:e,capability:"window",exec:{cmd:"osascript",args:["-e",NHe(t)]}};case"ghostty":return n==="darwin"?{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",BHe(t)]}}:{kind:e,capability:"none"};case"gnome-terminal":return{kind:e,capability:"tab",exec:{cmd:"gnome-terminal",args:["--tab",`--working-directory=${t.cwd}`,"--",...t.argv]}};case"konsole":return{kind:e,capability:"tab",exec:{cmd:"konsole",args:["--new-tab","--workdir",t.cwd,"-e",...t.argv]}};case"vscode":case"alacritty":case"hyper":case"unknown":return{kind:e,capability:"none"}}}var RL=b(()=>{"use strict";Ld()});import{spawnSync as UHe}from"node:child_process";function Hre(e){let t=e.env??process.env,n=e.platform??process.platform,r=e.run??HHe,o=Rg(t);if(!e.interactive)return{spawned:!1,kind:o,capability:"none",reason:"non-interactive-surface"};let i=xL(e.forkId,e.model,e.cwd);if(!i.spawnable)return{spawned:!1,kind:o,capability:"none",reason:"dev-entrypoint"};let s=EL(o,i,n);if(s.capability==="none"||!s.exec)return{spawned:!1,kind:o,capability:s.capability,reason:"no-tab-mechanism"};try{let a=r(s.exec.cmd,s.exec.args,{stdio:"ignore",timeout:jHe});if(a.error||a.status!==0){let l=a.error?a.error.message:`exited ${a.status}`;return{spawned:!1,kind:o,capability:s.capability,reason:l}}return{spawned:!0,kind:o,capability:s.capability}}catch(a){return{spawned:!1,kind:o,capability:s.capability,reason:a instanceof Error?a.message:String(a)}}}var jHe,HHe,Wre=b(()=>{"use strict";uT();RL();uT();RL();jHe=5e3,HHe=(e,t,n)=>{let r=UHe(e,t,n);return{status:r.status,...r.error?{error:r.error}:{}}}});function KHe(e,t,n){let r=[];if(e.spawned){let o=e.capability==="window"?"window":"tab";r.push(m.info(` \u2197 Continuing in a new ${WHe[e.kind]} ${o}.`)),r.push(m.dim(" Or run it yourself:"))}else e.kind==="vscode"&&e.reason==="no-tab-mechanism"?r.push(m.dim(" VS Code's integrated terminal can't be opened from outside \u2014 run this in a new terminal:")):r.push(m.dim(" Continue the fork with:"));return r.push(m.brand(` ${t}`)),n&&r.push(m.dim(" (copied to clipboard)")),r.push(""),r.push(m.meta(" This session continues here, untouched. The fork carries the")),r.push(m.meta(" conversation only \u2014 live subagents and background jobs are not forked.")),r}var WHe,Kre,Gre=b(()=>{"use strict";L();Rs();Ld();dS();Wre();WHe={tmux:"tmux",wezterm:"WezTerm",kitty:"kitty",iterm2:"iTerm","apple-terminal":"Terminal",ghostty:"Ghostty","windows-terminal":"Windows Terminal","gnome-terminal":"GNOME Terminal",konsole:"Konsole",vscode:"VS Code",alacritty:"Alacritty",hyper:"Hyper",unknown:"this terminal"};Kre={name:"/fork",aliases:["/branch"],usage:"/fork",hint:"When you want to explore a divergent path without losing this thread \u2014 duplicates the conversation into a new resumable session you can continue in parallel.",summary:"Duplicate this conversation into a new, independent session",async handler(e){if(e.stats.totalTurns===0)return e.out.warn("Nothing to fork yet \u2014 no turns in this session."),"continue";let t,n;try{({id:t,path:n}=LQ(e.stats))}catch(l){return e.out.error(`Could not fork: ${l instanceof Error?l.message:String(l)}`),"continue"}let r=As(t,e.stats.model),o=e.stats.cwd??process.cwd(),i=typeof e.requestResume=="function"&&process.stdout.isTTY===!0,s=Hre({forkId:t,model:e.stats.model,cwd:o,interactive:i}),a=!s.spawned&&i&&Zi(r);e.out.success(m.success("Forked")+m.dim(` ${n}`)),e.out.line();for(let l of KHe(s,r,a))e.out.line(l);return e.out.line(),"continue"}}});import{execFileSync as qre}from"node:child_process";import{readFileSync as GHe,writeFileSync as qHe}from"node:fs";import{resolve as zHe}from"node:path";function zre(e){let t;try{t=qre("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=qre("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
|
|
1950
1950
|
`).map(o=>{let i=o.indexOf(" "),s=o.slice(0,i),a=o.slice(i+1),l=a.match(/^(\w+(?:\+\w+)?)(?:\([^)]*\))?!?:\s*(.+)/);if(l){let c=l[1].toLowerCase(),u=JHe[c]??"Changed";return{hash:s,subject:l[2],category:u}}return{hash:s,subject:a,category:"Changed"}}):[]}function Jre(e,t={}){let n=t.includeHash??!1,r=new Map;for(let i of e){let s=r.get(i.category)??[];s.push(i),r.set(i.category,s)}let o=[];for(let i of VHe){let s=r.get(i);if(s?.length){o.push(`### ${i}`);for(let a of s)o.push(n?`- ${a.subject} (${a.hash})`:`- ${a.subject}`);o.push("")}}return o.join(`
|
|
1951
1951
|
`)}function AL(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function YHe(e){let t=new Set;for(let n of e.split(`
|
|
@@ -1958,8 +1958,8 @@ ${s}`)}function Zne(){gL=0,hL=!1}async function ere(e,t=an,n={}){try{if(gL>=Yne)
|
|
|
1958
1958
|
`+s:o||s,l=r.replace(/## \[Unreleased\][^\n]*\n[\s\S]*?(?=\n## \[|$)/,`## [Unreleased]
|
|
1959
1959
|
|
|
1960
1960
|
${a}
|
|
1961
|
-
`);if(l===r)throw new Error("No ## [Unreleased] section found");qHe(n,l)}var JHe,VHe,Yre=b(()=>{"use strict";JHe={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},VHe=["Added","Fixed","Changed","Deprecated","Removed","Security"]});import{existsSync as XHe,readFileSync as QHe}from"node:fs";import{resolve as Xre}from"node:path";var Qre,Zre=b(()=>{"use strict";Yre();aa();L();Qre={name:"/changelog",usage:"/changelog [--dry-run]",summary:"Generate CHANGELOG entries from commits since last tag",hint:"When you are preparing a release and want to auto-generate changelog entries from conventional commits.",async handler(e,t){let n=t.split(/\s+/).includes("--dry-run"),r=process.cwd(),o;try{o=zre(r)}catch(a){return e.out.error(`Failed to read git log: ${a instanceof Error?a.message:String(a)}`),"continue"}if(o.length===0)return e.out.warn("No commits found since the last tag."),"continue";let i=Jre(o),s=(()=>{try{let a=QHe(Xre(r,"CHANGELOG.md"),"utf8");return AL(a)}catch{return""}})();e.out.line(),e.out.info(`${o.length} commits since last tag`),e.out.line(),s&&(e.out.warn("Existing [Unreleased] entries will be preserved above new entries."),e.out.line()),e.out.line(m.heading("Preview:")),e.out.line(
|
|
1962
|
-
`))a.startsWith("### ")?e.out.line(m.bold(a)):a.startsWith("- ")?e.out.line(m.dim(" ")+a):e.out.line(a);if(e.out.line(
|
|
1961
|
+
`);if(l===r)throw new Error("No ## [Unreleased] section found");qHe(n,l)}var JHe,VHe,Yre=b(()=>{"use strict";JHe={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},VHe=["Added","Fixed","Changed","Deprecated","Removed","Security"]});import{existsSync as XHe,readFileSync as QHe}from"node:fs";import{resolve as Xre}from"node:path";var Qre,Zre=b(()=>{"use strict";Yre();aa();L();Qre={name:"/changelog",usage:"/changelog [--dry-run]",summary:"Generate CHANGELOG entries from commits since last tag",hint:"When you are preparing a release and want to auto-generate changelog entries from conventional commits.",async handler(e,t){let n=t.split(/\s+/).includes("--dry-run"),r=process.cwd(),o;try{o=zre(r)}catch(a){return e.out.error(`Failed to read git log: ${a instanceof Error?a.message:String(a)}`),"continue"}if(o.length===0)return e.out.warn("No commits found since the last tag."),"continue";let i=Jre(o),s=(()=>{try{let a=QHe(Xre(r,"CHANGELOG.md"),"utf8");return AL(a)}catch{return""}})();e.out.line(),e.out.info(`${o.length} commits since last tag`),e.out.line(),s&&(e.out.warn("Existing [Unreleased] entries will be preserved above new entries."),e.out.line()),e.out.line(m.heading("Preview:")),e.out.line(ae(void 0,60));for(let a of i.split(`
|
|
1962
|
+
`))a.startsWith("### ")?e.out.line(m.bold(a)):a.startsWith("- ")?e.out.line(m.dim(" ")+a):e.out.line(a);if(e.out.line(ae(void 0,60)),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!XHe(Xre(r,"CHANGELOG.md")))return e.out.error("CHANGELOG.md not found. Create one with a ## [Unreleased] section first."),"continue";Vre(r,i),e.out.success("Wrote entries to CHANGELOG.md [Unreleased] section."),e.out.line(m.dim(" Review with: git diff CHANGELOG.md"))}catch(a){e.out.error(`Failed to update CHANGELOG.md: ${a instanceof Error?a.message:String(a)}`)}return"continue"}}});function toe(e){dp=e}function eoe(e){let t=e.trim();return t.startsWith("sh-")?t:/^\d+$/.test(t)?`sh-${t}`:t}function ZHe(e){switch(e){case"running":return"\u25B6";case"completed":return"\u2713";case"failed":return"\u2717";case"killed":return"\u2298";default:return"?"}}var dp,noe,CL=b(()=>{"use strict";L();nt();noe={name:"/sh",summary:"Inspect or kill user-typed `!cmd` shell jobs",usage:"/sh [list | show <id> | kill <id>]",hint:"Manages shell processes started with `!cmd` (foreground) or `!&cmd` (background). No args \u2192 list. `show <id>` prints captured output, `kill <id>` terminates a running job.",async handler(e,t){if(!dp)return e.out.error("Shell passthrough not available in this session."),"continue";let n=t.trim(),[r,...o]=n===""?["list"]:n.split(/\s+/),i=o.join(" ");switch(r){case"list":{let s=dp.registry.list();if(s.length===0)return e.out.line(m.dim(" no shell jobs in this session yet \u2014 type !<cmd> to start one")),"continue";e.out.line(m.dim(" id status duration mode command"));for(let a of s){let l=ZHe(a.status),c=a.status.padEnd(10),u=a.result?he(a.result.durationMs).padEnd(12):he(Date.now()-a.startedAt).padEnd(12),d=a.mode==="background"?"bg":"fg",p=a.command.length>60?a.command.slice(0,57)+"...":a.command;e.out.line(` ${l} ${a.id.padEnd(5)} ${c} ${u} ${d.padEnd(4)} ${p}`)}return"continue"}case"show":{if(!i)return e.out.info("Usage: /sh show <id>"),"continue";let s=eoe(i),a=dp.registry.get(s);if(!a)return e.out.error(`Job ${s} not found.`),"continue";if(e.out.line(m.dim(`$ ${a.command}`)),!a.result)return e.out.line(m.dim(" (still running \u2014 output captured so far is not yet flushed)")),"continue";let l=a.result.displayCaptured;l.length===0?e.out.line(m.dim(" (no output)")):e.out.raw(l.endsWith(`
|
|
1963
1963
|
`)?l:l+`
|
|
1964
1964
|
`);let c=a.result.errorReason==="abort"?"killed":a.result.errorReason==="timeout"?"timed out":`exit ${a.result.exitCode??0}`;return e.out.line(m.dim(` [${a.id} \xB7 ${c} \xB7 ${he(a.result.durationMs)}]`)),a.result.truncated&&e.out.line(m.warning(" \u26A0 output was truncated \u2014 re-run with smaller scope if you need the tail")),"continue"}case"kill":{if(!i)return e.out.info("Usage: /sh kill <id>"),"continue";let s=eoe(i);if(dp.registry.kill(s))e.out.success(`Killed ${s}.`);else{let l=dp.registry.get(s);l?e.out.warn(`${s} is not running (status: ${l.status}).`):e.out.error(`Job ${s} not found.`)}return"continue"}default:return e.out.warn(`Unknown subcommand: ${r}. Try /sh list, /sh show <id>, or /sh kill <id>.`),"continue"}}}});import{existsSync as _L}from"node:fs";import{resolve as PL}from"node:path";var eWe,roe,ooe=b(()=>{"use strict";Dx();_D();iE();ei();eWe="You are initializing this project for use with AFK (an AI agent CLI).\n\nYour job: scan this project and generate an `AFK.md` file in the project root. AFK.md is a plain markdown file (no YAML frontmatter) that serves as the system prompt for all AFK sessions in this project.\n\n## Steps\n\n1. **Discover project metadata** \u2014 read these files if they exist:\n - `package.json`, `tsconfig.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Makefile`, `CMakeLists.txt`\n - `.github/workflows/` (CI config)\n - `docker-compose.yml`, `Dockerfile`\n - `README.md` or `README`\n - Any existing `CLAUDE.md` or `AGENTS.md` (borrow relevant context)\n\n2. **Scan directory structure** \u2014 list top-level directories and key subdirectories to understand the project layout.\n\n3. **Generate AFK.md** with these sections:\n - **What This Is** \u2014 one-paragraph description of the project (language, framework, purpose)\n - **Commands** \u2014 build, test, lint, dev commands (extracted from package.json scripts, Makefile targets, etc.)\n - **Architecture** \u2014 key directories and their purpose, entry points, major subsystems\n - **Conventions** \u2014 coding style, naming patterns, anything notable from config files (strictness levels, linting rules)\n - Only include sections where you found real content. Skip empty sections.\n\n4. **Write the file** \u2014 write AFK.md to the project root. Keep it concise \u2014 under 150 lines. This file is loaded into every session, so brevity matters.\n\n## Format rules\n- Plain markdown, no YAML frontmatter\n- Use code blocks for commands\n- Use tables for directory layouts\n- Don't include boilerplate or filler \u2014 every line should earn its place",roe={name:"/init",summary:"Scan project and generate AFK.md",hint:"When you're in a fresh repo and want the model to bootstrap an AFK.md system prompt that captures conventions, commands, and architecture.",async handler(e,t){let n=PL(process.cwd(),"AFK.md"),r=PL(process.cwd(),"CLAUDE.md"),o=[];o.push({type:"text",text:$x("init",t)});let i=eWe;_L(n)&&!t.includes("--force")&&(i+=`
|
|
1965
1965
|
|
|
@@ -1973,29 +1973,29 @@ A CLAUDE.md exists at \`${r}\`. Read it and incorporate relevant context (comman
|
|
|
1973
1973
|
These existing agent-instruction sources were found: ${c}. Read each and incorporate relevant context (commands, conventions, architecture, do's and don'ts) into the AFK.md. Adapt \u2014 don't duplicate. If a source is a directory, read the files inside it.`}if(t.trim()){let c=t.replace("--force","").trim();c&&(i+=`
|
|
1974
1974
|
|
|
1975
1975
|
## Additional context from user
|
|
1976
|
-
${c}`)}o.push({type:"text",text:i});let l=Bx(e,{skillName:"init",out:ap(),onCancel:()=>{e.session.current.interrupt().catch(()=>{})}});try{await l.arm(),await ku(l.sink,async()=>{for await(let c of e.session.current.sendMessageStream(o))l.sink(c)})}catch(c){e.out.line(),e.out.error(`init failed: ${c instanceof Error?c.message:String(c)}`)}finally{await l.dispose()}return"continue"}}});var ioe,soe=b(()=>{"use strict";fE();L();ioe={name:"/stats",summary:"Show session statistics including skill runs",hint:"When you want a summary of skill invocations, token usage, and cost for the current session.",async handler(e){let t=e.ledger;if(!t)return e.out.info("No skill stats available."),"continue";let n=t.summary();if(!n)return e.out.info("No skill runs recorded this session."),"continue";e.out.line(),e.out.line(m.bold("Skill runs"));for(let[r,o]of n){let i=mE(r)?.glyph??"",s=i?`${i} `:"",a=`${(o.totalDurationMs/1e3).toFixed(1)}s total`,l=`${o.runs} run${o.runs!==1?"s":""}`,c="";o.totalClaims!==void 0&&(c=` \xB7 ${o.totalClaims} claims`,o.totalConfirmed!==void 0&&(c+=` \xB7 ${o.totalConfirmed} confirmed`),o.totalRefuted!==void 0&&(c+=` \xB7 ${o.totalRefuted} refuted`),o.totalInconclusive!==void 0&&(c+=` \xB7 ${o.totalInconclusive} inconclusive`)),e.out.line(` ${s}${r} ${l}${c} \xB7 ${a}`)}return e.out.line(),"continue"}}});function tWe(e=hP){return{name:"/font-size",summary:"Get or set the terminal font size in Cursor / VS Code",usage:"/font-size [size] [editor]",hint:"Direct shortcut to the terminal_font_size tool \u2014 bypasses the LLM and the first-write permission prompt. Examples: `/font-size` (read all), `/font-size 18` (set all), `/font-size 14 cursor` (set Cursor only).",async handler(t,n){let r=n.split(/\s+/).filter(Boolean),o=new AbortController;if(r.length===0){let u=await e({action:"get"},o.signal);return u.isError?t.out.error(u.content):t.out.line(u.content),"continue"}let i=r[0],s=Number(i);if(!Number.isFinite(s))return t.out.error(`Invalid size: "${i}". Usage: /font-size [size] [editor]`),"continue";let a=r[1],l={action:"set",size:s};a!==void 0&&(l.editor=a);let c=await e(l,o.signal);return c.isError?t.out.error(c.content):t.out.success(c.content),"continue"}}}var aoe,loe=b(()=>{"use strict";yP();aoe=tWe()});var coe,uoe,doe,poe=b(()=>{"use strict";L();coe=["summary","live","digest","off"],uoe={live:"streaming preview + finalize summary",summary:"collapsed one-line summary on finalize",digest:"live preview + reasoning paragraph persisted to scrollback per phase",off:"suppressed entirely"},doe={name:"/thinking",aliases:["/thinking-ui"],usage:"/thinking [summary|live|digest|off]",summary:"Toggle how thinking blocks are rendered mid-session",hint:"Switch thinking display: `live` (streaming preview + summary, default), `summary` (one-line collapse only), `digest` (live preview + persists a capped reasoning paragraph to scrollback per phase \u2014 good for AFK review), or `off` (hidden). This is a display-only toggle \u2014 extended thinking still runs; cost and latency are unaffected. Takes effect on the next turn \u2014 same semantics as `/model`. Run without args to see the current mode.",flags:["summary","live","digest","off"],async handler(e,t){let n=t.trim().toLowerCase();if(!n){let r=e.stats.thinkingUi??"live";return e.out.info(`Thinking display: ${m.brand(r)} (${uoe[r]})`),"continue"}return coe.includes(n)?(e.stats.thinkingUi=n,e.out.success(`Thinking display set to ${m.brand(n)} (${uoe[n]}). Takes effect on the next turn. (display only \u2014 thinking still runs; cost and latency are unaffected.)`),"continue"):(e.out.warn(`Invalid mode: "${n}". Valid modes: ${coe.join(", ")}`),"continue")}}});var nWe,moe,foe=b(()=>{"use strict";nWe={"preference-off":"preference is off","unsupported-provider":"the current provider is not Anthropic Direct","custom-endpoint":"custom Anthropic endpoints are excluded","excluded-execution-path":"this execution path is excluded","unsupported-model":"the current model is not a supported Opus 5 or Opus 4.8 model"},moe={name:"/fast",usage:"/fast [on|off]",flags:["on","off"],summary:"Toggle Anthropic Opus Fast mode for the session",async handler(e,t){let n=e.fastMode;if(!n)return e.out.warn("Fast mode is unavailable on this surface."),"continue";let r=t.trim().toLowerCase();if(r&&r!=="on"&&r!=="off")return e.out.warn("Usage: /fast [on|off]"),"continue";if(r==="on"||r==="off")return n.setPreference(r),e.out.success(`Fast mode preference set to ${r}. Takes effect on the next turn.`),"continue";let o=n.resolveStatus(e.getFastModeContext?.()??{resolvedModelId:String(e.stats.model),providerFamily:"unknown",hasCustomEndpoint:!1,executionPath:"top-level"});return o.preference==="off"?e.out.info("Fast mode preference: off."):o.effective?e.out.info("Fast mode: active."):e.out.info(`Fast mode preference: on, but inactive because ${nWe[o.reason]}.`),"continue"}}});var IL,goe,hoe=b(()=>{"use strict";L();bc();IL=[...My,"auto"],goe={name:"/theme",usage:`/theme [${IL.join("|")}]`,summary:"Switch the TUI color palette (dark/light/umber) mid-session",hint:"Switch the color palette: `dark` (default), `light` (retuned for light-background terminals), `umber` (the Umber terminal's warm palette \u2014 dark-only, never auto-selected), or `auto` (detect from the terminal, falling back to dark). Applies to the active frame and new output immediately; already-printed scrollback keeps its original colors. Session-scoped \u2014 persist with `afk config set theme <mode>`. Run without args to see the active theme.",flags:[...IL],async handler(e,t){let n=t.trim();if(!n)return e.out.info(`Theme: ${m.brand(AB())}`),"continue";let r=Ri(n);if(r===void 0)return e.out.warn(`Invalid theme: "${n}". Valid: ${IL.join(", ")}`),"continue";let o=Jr(r);zr(o),e.getCompositor?.()?.repaint();let i=r==="auto"?` (auto \u2192 ${o})`:"";return e.out.success(`Theme set to ${m.brand(o)}${i}. Session-scoped \u2014 persist with \`afk config set theme ${r}\`.`),"continue"}}});var yoe,boe,woe=b(()=>{"use strict";L();ht();yoe=[{group:"Navigation",rows:[["ctrl+a","Move to start of current line"],["ctrl+e","Move to end of current line"],["ctrl+b","Move one character backward (input mode) / Run turn in background (streaming mode)"],["ctrl+f","Move one character forward"],["alt+b","Move one word backward"],["alt+f","Move one word forward"],["\u2190 / \u2192","Character left / right"],["home / end","Buffer start / end"]]},{group:"Editing",rows:[["ctrl+u","Delete to start of current line"],["ctrl+k","Delete to end of current line"],["ctrl+w","Delete previous word"],["backspace","Delete previous character"],["delete","Delete next character"],["alt+backspace","Delete previous word (Option+Delete on macOS)"],["alt+delete","Delete next word (Option+Fn-Delete on macOS)"]]},{group:"History",rows:[["ctrl+p / \u2191","Previous history entry (or move up in multi-line draft)"],["ctrl+n / \u2193","Next history entry (or move down in multi-line draft)"]]},{group:"Multi-line",rows:[["shift+enter","Insert newline (no submit)"],["alt+enter","Insert newline (no submit)"],["<text>\\","Trailing \\ + Enter inserts newline (backwards-compat)"]]},{group:"Attach",rows:[["@<path>","Autocomplete and attach a file \u2014 type @ then start the path"],["ctrl+v","Paste image from clipboard (macOS: Cmd+V also works)"],["ctrl+x","Remove the last attached image from the prompt"]]},{group:"Misc",rows:[["ctrl+o","Compose the prompt in your external $EDITOR (also /editor)"],["ctrl+l","Clear screen and repaint"],["ctrl+c","Interrupt running turn / exit (second press)"],["ctrl+d","EOF / exit (when buffer is empty)"],["tab","Accept autocomplete suggestion"],["enter","Submit prompt"]]}],boe={name:"/keys",summary:"Show keybinding reference",hint:"When you want the full list of keyboard shortcuts available in the interactive REPL.",async handler(e){e.out.line(),e.out.line(m.bold(m.brand("Keybindings"))),e.out.line(se());let n=yoe.flatMap(r=>r.rows).reduce((r,[o])=>Math.max(r,o.length),0);for(let{group:r,rows:o}of yoe){e.out.line(),e.out.line(m.bold(r));for(let[i,s]of o){let a=" ".repeat(Math.max(0,n-i.length));e.out.line(` ${m.warning(i)}${a} ${m.dim(s)}`)}}return e.out.line(),"continue"}}});import{execFile as rWe}from"node:child_process";import{promises as oWe}from"node:fs";import{dirname as iWe,isAbsolute as sWe,join as aWe,resolve as lWe}from"node:path";import{promisify as cWe}from"node:util";async function koe(){let t=(await ML("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=sWe(t)?t:lWe(process.cwd(),t);return iWe(n)}function uWe(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function dWe(e,t){return TE.has(e)?m.error(t):voe.has(e)?m.warning(t):e==="locked"?m.dim(t):m.dim(t)}function Toe(e,t){let n=e.split(/\s+/).map(o=>o.trim()).filter(o=>o.length>0),r={scope:t,apply:!1,unknown:[]};for(let o=0;o<n.length;o++){let i=n[o];if(i==="--apply")r.apply=!0;else if(i==="--scope"&&o+1<n.length){let s=n[o+1];o++,Soe.includes(s)?r.scope=s:r.unknown.push(`--scope=${s}`)}else if(i.startsWith("--scope=")){let s=i.slice(8);Soe.includes(s)?r.scope=s:r.unknown.push(i)}else r.unknown.push(i)}return r}async function pWe(e){try{let t=await oWe.readFile(aWe(e,".afk-worktree-meta.json"),"utf-8"),n=JSON.parse(t);if(typeof n.pid=="number"&&Number.isInteger(n.pid)&&n.pid>0)return n.pid}catch{}}async function mWe(e,t,n){if(t.length===0){e.info("No afk-managed worktrees found.");return}let r=process.pid;e.line(),e.line(m.bold("Worktrees")),e.line(m.dim(" "+"PATH".padEnd(45)+" "+"OWNER".padEnd(12)+" "+"AGE".padEnd(5)+" "+"VERDICT".padEnd(22)+" PRUNE?"));for(let o of t){let a=n.get(o.path)===r?m.brand("\u2192 "):" ",l=o.path.slice(-44).padEnd(45),c=o.owner.padEnd(12),u=uWe(o.ageMs).padEnd(5),d=o.verdict.padEnd(22),p=TE.has(o.verdict)?m.error("yes"):voe.has(o.verdict)?m.warning("warn"):m.dim("no"),f=dWe(o.verdict,d);e.line(`${a}${l} ${c} ${u} ${f} ${p}`)}e.line(),e.line(m.dim(" \u2192 this session")),e.line()}async function fWe(e){let t=new Map;for(let n of e)t.set(n.path,await pWe(n.path));return t}async function gWe(e,t){let n=Toe(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await koe()}catch(s){return e.out.error(`Not in a git repository: ${s.message}`),"continue"}let o;try{let s={execFile:ML,repoRoot:r,dryRun:!0,scope:n.scope};o=await ir(s)}catch(s){return e.out.error(`Sweep failed: ${s.message}`),"continue"}let i=await fWe(o.candidates);await mWe(e.out,o.candidates,i);for(let s of o.warnings)e.out.warn(s);return"continue"}async function hWe(e,t){let n=Toe(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await koe()}catch(a){return e.out.error(`Not in a git repository: ${a.message}`),"continue"}let o;try{let a={execFile:ML,repoRoot:r,dryRun:!n.apply,scope:n.scope,...n.apply===!0?{bypassSoftLaunch:!0}:{}};o=await ir(a)}catch(a){return e.out.error(`Sweep failed: ${a.message}`),"continue"}let i={};for(let a of o.candidates)i[a.verdict]=(i[a.verdict]??0)+1;let s=Object.entries(i).sort(([a],[l])=>a.localeCompare(l)).map(([a,l])=>`${a}=${l}`);if(o.dryRun){let a=o.candidates.filter(l=>TE.has(l.verdict)).length;e.out.line(),e.out.line(m.warning("\u{1F50D} Dry-run \u2014 pass --apply to actually remove.")+` Would prune ${a} worktree(s).`+(s.length>0?` [${s.join(" ")}]`:""))}else{let a=o.warnings.filter(c=>c.startsWith("[WARN]")).length,l=o.warnings.filter(c=>c.startsWith("[ERROR]")).length;e.out.line(),e.out.success(`Removed ${o.removed.length}, warned ${a}, errors ${l}`+(s.length>0?` [${s.join(" ")}]`:""))}for(let a of o.candidates){let c=o.removed.includes(a.path)?m.error("\u2717"):TE.has(a.verdict)?m.warning("\u2022"):m.dim("\xB7");e.out.line(` ${c} [${a.verdict.padEnd(22)}] ${a.path}`)}for(let a of o.warnings)a.startsWith("[ERROR]")?e.out.error(a):e.out.warn(a);return e.out.line(),"continue"}var ML,Soe,TE,voe,xoe,Eoe=b(()=>{"use strict";cu();L();ML=cWe(rWe),Soe=["interactive","diagnose","all"],TE=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]),voe=new Set(["stale-clean","stale-dirty"]);xoe={name:"/worktree",summary:"List or prune afk-managed git worktrees",usage:"/worktree list | /worktree prune [--apply] [--scope <interactive|diagnose|all>]",hint:"When you want to audit or clean up stale afk-managed git worktrees from past sessions.",async handler(e,t){let n=t.trim();return n.length===0||n.startsWith("list")?gWe(e,n.replace(/^list\s*/,"")):n.startsWith("prune")?hWe(e,n.replace(/^prune\s*/,"")):(e.out.error(`Unknown /worktree subcommand. Usage:
|
|
1976
|
+
${c}`)}o.push({type:"text",text:i});let l=Bx(e,{skillName:"init",out:ap(),onCancel:()=>{e.session.current.interrupt().catch(()=>{})}});try{await l.arm(),await ku(l.sink,async()=>{for await(let c of e.session.current.sendMessageStream(o))l.sink(c)})}catch(c){e.out.line(),e.out.error(`init failed: ${c instanceof Error?c.message:String(c)}`)}finally{await l.dispose()}return"continue"}}});var ioe,soe=b(()=>{"use strict";fE();L();ioe={name:"/stats",summary:"Show session statistics including skill runs",hint:"When you want a summary of skill invocations, token usage, and cost for the current session.",async handler(e){let t=e.ledger;if(!t)return e.out.info("No skill stats available."),"continue";let n=t.summary();if(!n)return e.out.info("No skill runs recorded this session."),"continue";e.out.line(),e.out.line(m.bold("Skill runs"));for(let[r,o]of n){let i=mE(r)?.glyph??"",s=i?`${i} `:"",a=`${(o.totalDurationMs/1e3).toFixed(1)}s total`,l=`${o.runs} run${o.runs!==1?"s":""}`,c="";o.totalClaims!==void 0&&(c=` \xB7 ${o.totalClaims} claims`,o.totalConfirmed!==void 0&&(c+=` \xB7 ${o.totalConfirmed} confirmed`),o.totalRefuted!==void 0&&(c+=` \xB7 ${o.totalRefuted} refuted`),o.totalInconclusive!==void 0&&(c+=` \xB7 ${o.totalInconclusive} inconclusive`)),e.out.line(` ${s}${r} ${l}${c} \xB7 ${a}`)}return e.out.line(),"continue"}}});function tWe(e=hP){return{name:"/font-size",summary:"Get or set the terminal font size in Cursor / VS Code",usage:"/font-size [size] [editor]",hint:"Direct shortcut to the terminal_font_size tool \u2014 bypasses the LLM and the first-write permission prompt. Examples: `/font-size` (read all), `/font-size 18` (set all), `/font-size 14 cursor` (set Cursor only).",async handler(t,n){let r=n.split(/\s+/).filter(Boolean),o=new AbortController;if(r.length===0){let u=await e({action:"get"},o.signal);return u.isError?t.out.error(u.content):t.out.line(u.content),"continue"}let i=r[0],s=Number(i);if(!Number.isFinite(s))return t.out.error(`Invalid size: "${i}". Usage: /font-size [size] [editor]`),"continue";let a=r[1],l={action:"set",size:s};a!==void 0&&(l.editor=a);let c=await e(l,o.signal);return c.isError?t.out.error(c.content):t.out.success(c.content),"continue"}}}var aoe,loe=b(()=>{"use strict";yP();aoe=tWe()});var coe,uoe,doe,poe=b(()=>{"use strict";L();coe=["summary","live","digest","off"],uoe={live:"streaming preview + finalize summary",summary:"collapsed one-line summary on finalize",digest:"live preview + reasoning paragraph persisted to scrollback per phase",off:"suppressed entirely"},doe={name:"/thinking",aliases:["/thinking-ui"],usage:"/thinking [summary|live|digest|off]",summary:"Toggle how thinking blocks are rendered mid-session",hint:"Switch thinking display: `live` (streaming preview + summary, default), `summary` (one-line collapse only), `digest` (live preview + persists a capped reasoning paragraph to scrollback per phase \u2014 good for AFK review), or `off` (hidden). This is a display-only toggle \u2014 extended thinking still runs; cost and latency are unaffected. Takes effect on the next turn \u2014 same semantics as `/model`. Run without args to see the current mode.",flags:["summary","live","digest","off"],async handler(e,t){let n=t.trim().toLowerCase();if(!n){let r=e.stats.thinkingUi??"live";return e.out.info(`Thinking display: ${m.brand(r)} (${uoe[r]})`),"continue"}return coe.includes(n)?(e.stats.thinkingUi=n,e.out.success(`Thinking display set to ${m.brand(n)} (${uoe[n]}). Takes effect on the next turn. (display only \u2014 thinking still runs; cost and latency are unaffected.)`),"continue"):(e.out.warn(`Invalid mode: "${n}". Valid modes: ${coe.join(", ")}`),"continue")}}});var nWe,moe,foe=b(()=>{"use strict";nWe={"preference-off":"preference is off","unsupported-provider":"the current provider is not Anthropic Direct","custom-endpoint":"custom Anthropic endpoints are excluded","excluded-execution-path":"this execution path is excluded","unsupported-model":"the current model is not a supported Opus 5 or Opus 4.8 model"},moe={name:"/fast",usage:"/fast [on|off]",flags:["on","off"],summary:"Toggle Anthropic Opus Fast mode for the session",async handler(e,t){let n=e.fastMode;if(!n)return e.out.warn("Fast mode is unavailable on this surface."),"continue";let r=t.trim().toLowerCase();if(r&&r!=="on"&&r!=="off")return e.out.warn("Usage: /fast [on|off]"),"continue";if(r==="on"||r==="off")return n.setPreference(r),e.out.success(`Fast mode preference set to ${r}. Takes effect on the next turn.`),"continue";let o=n.resolveStatus(e.getFastModeContext?.()??{resolvedModelId:String(e.stats.model),providerFamily:"unknown",hasCustomEndpoint:!1,executionPath:"top-level"});return o.preference==="off"?e.out.info("Fast mode preference: off."):o.effective?e.out.info("Fast mode: active."):e.out.info(`Fast mode preference: on, but inactive because ${nWe[o.reason]}.`),"continue"}}});var IL,goe,hoe=b(()=>{"use strict";L();bc();IL=[...My,"auto"],goe={name:"/theme",usage:`/theme [${IL.join("|")}]`,summary:"Switch the TUI color palette (dark/light/umber) mid-session",hint:"Switch the color palette: `dark` (default), `light` (retuned for light-background terminals), `umber` (the Umber terminal's warm palette \u2014 dark-only, never auto-selected), or `auto` (detect from the terminal, falling back to dark). Applies to the active frame and new output immediately; already-printed scrollback keeps its original colors. Session-scoped \u2014 persist with `afk config set theme <mode>`. Run without args to see the active theme.",flags:[...IL],async handler(e,t){let n=t.trim();if(!n)return e.out.info(`Theme: ${m.brand(AB())}`),"continue";let r=Ri(n);if(r===void 0)return e.out.warn(`Invalid theme: "${n}". Valid: ${IL.join(", ")}`),"continue";let o=Jr(r);zr(o),e.getCompositor?.()?.repaint();let i=r==="auto"?` (auto \u2192 ${o})`:"";return e.out.success(`Theme set to ${m.brand(o)}${i}. Session-scoped \u2014 persist with \`afk config set theme ${r}\`.`),"continue"}}});var yoe,boe,woe=b(()=>{"use strict";L();ht();yoe=[{group:"Navigation",rows:[["ctrl+a","Move to start of current line"],["ctrl+e","Move to end of current line"],["ctrl+b","Move one character backward (input mode) / Run turn in background (streaming mode)"],["ctrl+f","Move one character forward"],["alt+b","Move one word backward"],["alt+f","Move one word forward"],["\u2190 / \u2192","Character left / right"],["home / end","Buffer start / end"]]},{group:"Editing",rows:[["ctrl+u","Delete to start of current line"],["ctrl+k","Delete to end of current line"],["ctrl+w","Delete previous word"],["backspace","Delete previous character"],["delete","Delete next character"],["alt+backspace","Delete previous word (Option+Delete on macOS)"],["alt+delete","Delete next word (Option+Fn-Delete on macOS)"]]},{group:"History",rows:[["ctrl+p / \u2191","Previous history entry (or move up in multi-line draft)"],["ctrl+n / \u2193","Next history entry (or move down in multi-line draft)"]]},{group:"Multi-line",rows:[["shift+enter","Insert newline (no submit)"],["alt+enter","Insert newline (no submit)"],["<text>\\","Trailing \\ + Enter inserts newline (backwards-compat)"]]},{group:"Attach",rows:[["@<path>","Autocomplete and attach a file \u2014 type @ then start the path"],["ctrl+v","Paste image from clipboard (macOS: Cmd+V also works)"],["ctrl+x","Remove the last attached image from the prompt"]]},{group:"Misc",rows:[["ctrl+o","Compose the prompt in your external $EDITOR (also /editor)"],["ctrl+l","Clear screen and repaint"],["ctrl+c","Interrupt running turn / exit (second press)"],["ctrl+d","EOF / exit (when buffer is empty)"],["tab","Accept autocomplete suggestion"],["enter","Submit prompt"]]}],boe={name:"/keys",summary:"Show keybinding reference",hint:"When you want the full list of keyboard shortcuts available in the interactive REPL.",async handler(e){e.out.line(),e.out.line(m.bold(m.brand("Keybindings"))),e.out.line(ae());let n=yoe.flatMap(r=>r.rows).reduce((r,[o])=>Math.max(r,o.length),0);for(let{group:r,rows:o}of yoe){e.out.line(),e.out.line(m.bold(r));for(let[i,s]of o){let a=" ".repeat(Math.max(0,n-i.length));e.out.line(` ${m.warning(i)}${a} ${m.dim(s)}`)}}return e.out.line(),"continue"}}});import{execFile as rWe}from"node:child_process";import{promises as oWe}from"node:fs";import{dirname as iWe,isAbsolute as sWe,join as aWe,resolve as lWe}from"node:path";import{promisify as cWe}from"node:util";async function koe(){let t=(await ML("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=sWe(t)?t:lWe(process.cwd(),t);return iWe(n)}function uWe(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function dWe(e,t){return TE.has(e)?m.error(t):voe.has(e)?m.warning(t):e==="locked"?m.dim(t):m.dim(t)}function Toe(e,t){let n=e.split(/\s+/).map(o=>o.trim()).filter(o=>o.length>0),r={scope:t,apply:!1,unknown:[]};for(let o=0;o<n.length;o++){let i=n[o];if(i==="--apply")r.apply=!0;else if(i==="--scope"&&o+1<n.length){let s=n[o+1];o++,Soe.includes(s)?r.scope=s:r.unknown.push(`--scope=${s}`)}else if(i.startsWith("--scope=")){let s=i.slice(8);Soe.includes(s)?r.scope=s:r.unknown.push(i)}else r.unknown.push(i)}return r}async function pWe(e){try{let t=await oWe.readFile(aWe(e,".afk-worktree-meta.json"),"utf-8"),n=JSON.parse(t);if(typeof n.pid=="number"&&Number.isInteger(n.pid)&&n.pid>0)return n.pid}catch{}}async function mWe(e,t,n){if(t.length===0){e.info("No afk-managed worktrees found.");return}let r=process.pid;e.line(),e.line(m.bold("Worktrees")),e.line(m.dim(" "+"PATH".padEnd(45)+" "+"OWNER".padEnd(12)+" "+"AGE".padEnd(5)+" "+"VERDICT".padEnd(22)+" PRUNE?"));for(let o of t){let a=n.get(o.path)===r?m.brand("\u2192 "):" ",l=o.path.slice(-44).padEnd(45),c=o.owner.padEnd(12),u=uWe(o.ageMs).padEnd(5),d=o.verdict.padEnd(22),p=TE.has(o.verdict)?m.error("yes"):voe.has(o.verdict)?m.warning("warn"):m.dim("no"),f=dWe(o.verdict,d);e.line(`${a}${l} ${c} ${u} ${f} ${p}`)}e.line(),e.line(m.dim(" \u2192 this session")),e.line()}async function fWe(e){let t=new Map;for(let n of e)t.set(n.path,await pWe(n.path));return t}async function gWe(e,t){let n=Toe(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await koe()}catch(s){return e.out.error(`Not in a git repository: ${s.message}`),"continue"}let o;try{let s={execFile:ML,repoRoot:r,dryRun:!0,scope:n.scope};o=await ir(s)}catch(s){return e.out.error(`Sweep failed: ${s.message}`),"continue"}let i=await fWe(o.candidates);await mWe(e.out,o.candidates,i);for(let s of o.warnings)e.out.warn(s);return"continue"}async function hWe(e,t){let n=Toe(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await koe()}catch(a){return e.out.error(`Not in a git repository: ${a.message}`),"continue"}let o;try{let a={execFile:ML,repoRoot:r,dryRun:!n.apply,scope:n.scope,...n.apply===!0?{bypassSoftLaunch:!0}:{}};o=await ir(a)}catch(a){return e.out.error(`Sweep failed: ${a.message}`),"continue"}let i={};for(let a of o.candidates)i[a.verdict]=(i[a.verdict]??0)+1;let s=Object.entries(i).sort(([a],[l])=>a.localeCompare(l)).map(([a,l])=>`${a}=${l}`);if(o.dryRun){let a=o.candidates.filter(l=>TE.has(l.verdict)).length;e.out.line(),e.out.line(m.warning("\u{1F50D} Dry-run \u2014 pass --apply to actually remove.")+` Would prune ${a} worktree(s).`+(s.length>0?` [${s.join(" ")}]`:""))}else{let a=o.warnings.filter(c=>c.startsWith("[WARN]")).length,l=o.warnings.filter(c=>c.startsWith("[ERROR]")).length;e.out.line(),e.out.success(`Removed ${o.removed.length}, warned ${a}, errors ${l}`+(s.length>0?` [${s.join(" ")}]`:""))}for(let a of o.candidates){let c=o.removed.includes(a.path)?m.error("\u2717"):TE.has(a.verdict)?m.warning("\u2022"):m.dim("\xB7");e.out.line(` ${c} [${a.verdict.padEnd(22)}] ${a.path}`)}for(let a of o.warnings)a.startsWith("[ERROR]")?e.out.error(a):e.out.warn(a);return e.out.line(),"continue"}var ML,Soe,TE,voe,xoe,Eoe=b(()=>{"use strict";cu();L();ML=cWe(rWe),Soe=["interactive","diagnose","all"],TE=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]),voe=new Set(["stale-clean","stale-dirty"]);xoe={name:"/worktree",summary:"List or prune afk-managed git worktrees",usage:"/worktree list | /worktree prune [--apply] [--scope <interactive|diagnose|all>]",hint:"When you want to audit or clean up stale afk-managed git worktrees from past sessions.",async handler(e,t){let n=t.trim();return n.length===0||n.startsWith("list")?gWe(e,n.replace(/^list\s*/,"")):n.startsWith("prune")?hWe(e,n.replace(/^prune\s*/,"")):(e.out.error(`Unknown /worktree subcommand. Usage:
|
|
1977
1977
|
/worktree list
|
|
1978
1978
|
/worktree prune [--apply] [--scope <interactive|diagnose|all>]`),"continue")}}});var Roe,Aoe=b(()=>{"use strict";Hi();Roe={name:"/reauth",summary:"Re-read keychain credentials and swap the running session's client",usage:"/reauth [--check]",hint:"Force the running session to pick up a new keychain token (e.g. after `claude /login` in another terminal)",async handler(e,t){if(t.trim()==="--check"){let i=bt();if(!i)return e.out.warn("No OAuth token found. Run `claude login` in a terminal to authenticate."),"continue";let s=ao(i);return e.out.success(`Active keychain account: ${s}`),e.out.info("Note: --check only inspects the keychain. The running SDK client may still hold an older token \u2014 run `/reauth` (no args) to actually swap."),"continue"}let r=bt();if(r){let i=ao(r);e.out.info(`Current keychain account: ${i}`)}e.out.info("Rebuilding session client from keychain credentials\u2026");let o;try{o=await e.session.current.reauth()}catch(i){return e.out.error(`Client refresh failed: ${i instanceof Error?i.message:String(i)}`),e.out.warn("Run `claude login` in a terminal to re-authenticate."),"continue"}return o?(o.swapped?(e.out.success(`\u2713 Client swapped. Session now authenticated as: ${o.accountId}`),e.out.info("Next turn will use the new credential. If a usage-limit pause is active, it will resume automatically within ~30s (or send a message to retry immediately).")):e.out.success(`\u2713 Client refreshed. Authenticated as: ${o.accountId} (token unchanged)`),"continue"):(bt()?e.out.warn("This session is not using OAuth (probably api-key mode) \u2014 nothing to refresh. The active credential is whatever ANTHROPIC_API_KEY held at session start."):e.out.warn("No OAuth credentials found in the keychain. Run `claude login` in a terminal to authenticate."),"continue")}}});var Coe,_oe=b(()=>{"use strict";Coe={name:"/retry",summary:"Resubmit the last user message (e.g. after a turn died from a usage-limit error)",hint:"When a turn died mid-stream (usage-limit 429, dropped subagent fork) and the conversation is stuck on your last message \u2014 resubmits it instead of retyping.",async handler(e){let t=e.session.current.getHistory(),n;for(let r=t.length-1;r>=0;r--){let o=t[r];if(o?.role==="user"){n=o.content;break}}return n===void 0||n.trim()===""?(e.out.info("No previous user message to retry yet \u2014 send one first."),"continue"):{kind:"submit",message:n}}}});import{spawn as yWe}from"node:child_process";import{promises as Poe}from"node:fs";import*as Ioe from"node:os";import*as xE from"node:path";function bWe(e){return new Date(e).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function wWe(e,t){let n=[m.meta(`#${t+1}`),m.dim(bWe(e.timestamp))];if(e.durationMs!==void 0&&e.durationMs>0&&n.push(m.dim(he(e.durationMs))),e.costUsd!==void 0&&e.costUsd>0&&n.push(m.dim(nn(e.costUsd))),e.inputTokens!==void 0||e.outputTokens!==void 0){let r=e.inputTokens??0,o=e.outputTokens??0;n.push(m.dim(`${Math.round((r+o)/1e3)}k tokens`))}return n.join(" ")}function SWe(e){if(!e.toolEvents||e.toolEvents.length===0)return"";let t=[];for(let n of e.toolEvents){let r=n.isError?m.error("\u2717"):m.dim("\u25CF"),o=m.chrome(n.toolName),i="";if(n.result){let s=n.result.trim().split(`
|
|
1979
1979
|
`)[0]??"";i=s.length>80?s.slice(0,77)+"...":s}t.push(` ${r} ${o}${i?m.dim(` ${i}`):""}`)}return t.join(`
|
|
1980
1980
|
`)+`
|
|
1981
|
-
`}function vWe(e,t,n,r){let o=[];o.push(
|
|
1981
|
+
`}function vWe(e,t,n,r){let o=[];o.push(ae("Session Transcript"));let i=[m.dim(`Started ${new Date(n).toLocaleString()}`),m.dim(`model: ${t}`),m.dim(`${e.length} turn${e.length===1?"":"s"}`)];r>0&&i.push(m.dim(nn(r))),o.push(i.join(" \xB7 ")),o.push("");for(let s=0;s<e.length;s++){let a=e[s];o.push(wWe(a,s)),o.push(""),o.push(` ${m.user("\u25B6")} ${m.user("User")}`),o.push("");let l=a.user.split(`
|
|
1982
1982
|
`).map(p=>` ${p}`);o.push(l.join(`
|
|
1983
1983
|
`)),o.push("");let c=SWe(a);c&&(o.push(` ${m.chrome("Tools")}`),o.push(c)),o.push(` ${m.brand("\u25C6")} ${m.brand("Assistant")}`),o.push("");let d=Sr(a.assistant).split(`
|
|
1984
1984
|
`).map(p=>` ${p}`);o.push(d.join(`
|
|
1985
|
-
`)),o.push(""),s<e.length-1&&(o.push(
|
|
1985
|
+
`)),o.push(""),s<e.length-1&&(o.push(ae()),o.push(""))}return o.push(ae()),o.join(`
|
|
1986
1986
|
`)+`
|
|
1987
1987
|
`}function kWe(){let e=k.PAGER;if(e){let t=e.split(/\s+/),n=t[0],r=t.slice(1);return xE.basename(n)==="less"&&!r.includes("-R")&&!r.includes("-r")&&r.push("-R"),{cmd:n,args:r}}return{cmd:"less",args:["-R"]}}var Moe,Ooe=b(()=>{"use strict";F();L();ht();nt();_i();Moe={name:"/transcript",aliases:["/t"],summary:"View full session transcript in $PAGER",hint:"When you want to read the full conversation \u2014 all turns, tool calls, costs \u2014 in a scrollable pager.",async handler(e){let{stats:t,out:n}=e;if(t.turns.length===0)return n.info("No turns yet in this session."),"continue";let r=vWe(t.turns,String(t.model),t.sessionStartTime,t.totalCostUsd);if(!process.stdout.isTTY)return n.raw(r),"continue";let o=kWe();if(!o)return n.raw(r),"continue";let i=xE.join(Ioe.tmpdir(),`afk-transcript-${Date.now()}.txt`);await Poe.writeFile(i,r,{mode:384});let s=e.getCompositor?.()??null,a=!1,l=()=>{if(!a){a=!0;try{process.stdin.resume()}catch{}s?.resumeInput(),e.resumeFooter?.()}};s?.suspendInput(),e.suspendFooter?.();try{process.stdin.pause()}catch{}return new Promise(c=>{let u=p=>{l(),p&&n.raw(r),Poe.unlink(i).catch(()=>{}),c("continue")},d;try{d=yWe(o.cmd,[...o.args,i],{stdio:"inherit"})}catch{u(!0);return}d.on("error",()=>u(!0)),d.on("exit",()=>u(!1))})}}});import{spawn as TWe}from"node:child_process";function pp(){let e=k.VISUAL?.trim()||k.EDITOR?.trim()||"";if(!e)return null;let t=e.split(/\s+/);return{cmd:t[0],args:t.slice(1)}}async function xh(e){let{compositor:t,filePath:n,notify:r}=e;if(!t||!process.stdout.isTTY)return r("info","The editor handoff needs an interactive terminal \u2014 not available on this surface."),{outcome:"no-tty",exitCode:null};let o=pp();if(!o)return r("error","No editor configured. Set $VISUAL or $EDITOR (e.g. `export EDITOR=vim`) to compose prompts externally."),{outcome:"no-editor",exitCode:null};let i=!1,s=()=>{if(!i){i=!0;try{process.stdin.resume()}catch{}t.resumeInput(),e.resumeFooter?.()}};t.suspendInput(),e.suspendFooter?.();try{process.stdin.pause()}catch{}try{let a=await new Promise(l=>{let c;try{c=TWe(o.cmd,[...o.args,n],{stdio:"inherit"})}catch{l(Number.NaN);return}c.on("error",()=>l(Number.NaN)),c.on("exit",u=>l(u))});return Number.isNaN(a)?{outcome:"spawn-failed",exitCode:null}:a!==0?{outcome:"nonzero",exitCode:a}:{outcome:"clean",exitCode:a}}finally{s()}}var EE=b(()=>{"use strict";F()});import{promises as RE}from"node:fs";import*as $oe from"node:os";import*as OL from"node:path";async function AE(e){let{compositor:t,notify:n}=e;if(!t||!process.stdout.isTTY||!pp()){let{outcome:s}=await xh({compositor:t,filePath:"",notify:n});return s==="no-editor"?"no-editor":"no-tty"}let r=t.getBuffer().text,o=await RE.mkdtemp(OL.join($oe.tmpdir(),"afk-editor-")),i=OL.join(o,"prompt.md");await RE.writeFile(i,r,{mode:384});try{let{outcome:s,exitCode:a}=await xh({compositor:t,filePath:i,notify:n,suspendFooter:e.suspendFooter,resumeFooter:e.resumeFooter});if(s==="spawn-failed"){let u=pp();return n("warn",`Could not launch editor \`${u?.cmd??"editor"}\` \u2014 keeping your current prompt.`),"spawn-failed"}if(s!=="clean")return n("warn",`Editor exited with status ${a} \u2014 keeping your current prompt.`),"kept";let l=await RE.readFile(i,"utf8"),c=l.endsWith(`
|
|
1988
1988
|
`)?l.slice(0,-1):l;return t.applyEdit(z.seed(c)),"loaded"}finally{RE.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}var $L=b(()=>{"use strict";dn();EE()});var Doe,Loe=b(()=>{"use strict";$L();Doe={name:"/editor",aliases:["/edit"],summary:"Compose the current prompt in your external $EDITOR (Ctrl+O)",hint:"When your prompt is long enough to want real editor keybindings \u2014 opens $VISUAL/$EDITOR seeded with the input box; on exit the text loads back for you to review and submit.",async handler(e){return await AE({compositor:e.getCompositor?.()??null,notify:(t,n)=>{t==="error"?e.out.error(n):t==="warn"?e.out.warn(n):e.out.info(n)},suspendFooter:e.suspendFooter,resumeFooter:e.resumeFooter}),"continue"}}});function mp(e){let t=zo(e);return t?ka(t.content):0}function CE(e,t){fw(),DW();let n=e.stats.cwd??process.cwd(),{prompt:r,source:o}=Tn(n),i=ot(void 0,n),s=o.includes("env:AFK_SYSTEM_PROMPT")||o.includes("file:"),a=s?null:zo(n),l=a?ka(a.content):0,c=Td(r,i.autoRouting?.interactive??!0,"repl");return{applied:e.session.current.setSystemPrompt(c),tokens:l,delta:l-t,source:o,shadowed:s}}function _E(e){return e===0?"no size change":e>0?`+${e}`:`${e}`}var DL=b(()=>{"use strict";nf();nf();It();It();kt();lT();cn()});import{existsSync as LL,readFileSync as xWe,realpathSync as Foe,statSync as EWe}from"node:fs";function RWe(e,t){if(e===t)return!0;if(!LL(e)||!LL(t))return!1;try{return Foe(e)===Foe(t)}catch{return!1}}function Noe(e,t,n){let r=e==="user"?"personal":"project";if(!LL(t))return{scope:e,label:r,path:t,exists:!1,bytes:0,tokens:0,blank:!1,duplicate:n};let o=0,i="";try{o=EWe(t).size,i=xWe(t,"utf-8").trim()}catch{return{scope:e,label:r,path:t,exists:!0,bytes:o,tokens:0,blank:!0,duplicate:n}}return{scope:e,label:r,path:t,exists:!0,bytes:o,tokens:i.length>0?ka(i):0,blank:i.length===0,duplicate:n}}function FL(e=process.cwd()){let t=Zp(),n=em(e);return[Noe("user",t,!1),Noe("project",n,RWe(n,t))]}function NL(e,t){let n=FL(t).find(r=>r.scope===e);if(!n)throw new Error(`unknown AFK.md scope: ${e}`);return n}function PE(e){return e.exists&&!e.blank&&!e.duplicate}function AWe(e){return e<1024?`${e} B`:`${(e/1024).toFixed(1)} KB`}function Hl(e){return e<1e3?`~${e}`:`~${(e/1e3).toFixed(1)}k`}function CWe(e){return e.exists?e.blank?m.warning("empty \u2014 treated as absent"):e.duplicate?m.warning("same file as personal \u2014 counted once"):m.success("loaded"):m.dim("missing")}function Uoe(e){let t=[];for(let n of e){let r=PE(n)?`${AWe(n.bytes)} ${Hl(n.tokens)} tokens`:"",o=n.scope==="project"&&PE(n)?m.dim(" \u2190 wins on conflict"):"";t.push(` ${n.label.padEnd(9)} ${m.dim(n.path)}`),t.push(` ${"".padEnd(9)} ${CWe(n)}${r?` ${r}`:""}${o}`)}return t}var Boe,BL=b(()=>{"use strict";cn();U();L();Boe=1e4});import{mkdirSync as _We,readFileSync as PWe,writeFileSync as Hoe,existsSync as IWe}from"node:fs";import{dirname as MWe}from"node:path";function OWe(e){let t=e.scope==="user"?"Applies to every project on this machine. Loaded first.":"Applies to this project only. Loaded last, so it wins on conflict.";return[`# ${e.scope==="user"?"Personal":"Project"} AFK configuration`,"",`<!-- ${t}`,' This file is appended to the system prompt under "# Operator configuration".'," Edit it with /afk-md; changes hot-reload into the running session. -->","",""].join(`
|
|
1989
1989
|
`)}function Woe(e){return IWe(e.path)?!1:(_We(MWe(e.path),{recursive:!0}),Hoe(e.path,OWe(e),"utf-8"),!0)}function UL(e){try{return PWe(e,"utf-8")}catch{return""}}function $We(e,t){e.out.line(` ${m.success(`+${t.addedLines}`)} ${m.error(`-${t.removedLines}`)}`);let n=0;for(let o of t.hunks){if(n>=joe)break;e.out.line(m.dim(` @@ -${o.oldStart},${o.oldLines} +${o.newStart},${o.newLines} @@`));for(let i of o.lines){if(n>=joe)break;let s=` ${i.kind}${i.text}`;i.kind==="+"?e.out.line(m.success(s)):i.kind==="-"?e.out.line(m.error(s)):e.out.line(m.dim(s)),n++}}let r=t.hunks.reduce((o,i)=>o+i.lines.length,0);r>n&&e.out.line(m.dim(` \u2026 ${r-n} more diff lines (see the file for the rest)`))}function Koe(e,t){let{applied:n,tokens:r,delta:o,source:i,shadowed:s}=CE(e,t);s?e.out.warn("Saved to disk, but AFK.md is shadowed by a higher-priority system prompt override and is not part of what the model receives."):n?e.out.success(`Reloaded into this session \u2014 overlay now ${Hl(r)} tokens (${_E(o)}). Takes effect on your next message.`):e.out.warn("Saved to disk, but this provider cannot swap the prompt of a running session \u2014 it applies on next launch."),e.out.line(m.dim(` ${i}`))}async function Goe(e,t){Woe(t)&&e.out.info(`Created ${t.path}`);let r=UL(t.path),o=mp(e.stats.cwd),{outcome:i,exitCode:s}=await xh({compositor:e.getCompositor?.()??null,filePath:t.path,notify:(c,u)=>{c==="error"?e.out.error(u):c==="warn"?e.out.warn(u):e.out.info(u)},suspendFooter:e.suspendFooter,resumeFooter:e.resumeFooter});if(i==="no-tty"||i==="no-editor"){e.out.line(m.dim(` Edit it directly: ${t.path}`));return}if(i==="spawn-failed"){e.out.warn("Could not launch your editor \u2014 the file is unchanged.");return}if(i==="nonzero"){e.out.warn(`Editor exited with status ${s} \u2014 treating that as "discard", nothing reloaded.`);return}let a=UL(t.path),l=so(r,a);if(!l){e.out.info("No changes.");return}$We(e,l),a.trim().length===0&&e.out.warn("This file is now empty \u2014 the tier is treated as ABSENT and contributes nothing."),Koe(e,o)}function qoe(e,t,n){let r=Woe(t),o=mp(e.stats.cwd),i=UL(t.path),s=i.length===0||i.endsWith(`
|
|
1990
1990
|
`)?"":`
|
|
1991
1991
|
`;Hoe(t.path,`${i}${s}- ${n}
|
|
1992
|
-
`,"utf-8"),r&&e.out.info(`Created ${t.path}`),e.out.success(`Appended to ${t.path}`),e.out.line(` ${m.success("+")} - ${n}`),Koe(e,o)}var joe,zoe=b(()=>{"use strict";eu();L();EE();DL();BL();joe=40});function DWe(e){e.out.line(m.heading("/afk-md \u2014 AFK.md prompt overlay"));for(let t of Joe)e.out.line(t)}function LWe(e){return e==="user"||e==="u"||e==="1"||e==="personal"?"user":e==="project"||e==="p"||e==="2"?"project":null}function FWe(e){let t=e.stats.cwd??process.cwd(),n=FL(t),{source:r}=Tn(t),o=zo(t),i=mp(t),s=o?Buffer.byteLength(o.content,"utf8"):0;e.out.line(m.heading("AFK.md prompt overlay")),e.out.line("");for(let c of Uoe(n))e.out.line(c);e.out.line("");let a=n.filter(PE).length;a===0?e.out.line(m.dim(" No overlay is active \u2014 the framework prompt is running bare.")):e.out.line(` composed: ${s} B ${Hl(i)} tokens across ${a} tier${a===1?"":"s"}`),e.out.line(m.dim(` ${r}`)),i>Boe&&e.out.warn(`That overlay is ${Hl(i)} tokens \u2014 it is prepended to every request in every session. Consider trimming it.`);let l=pp();e.out.line("");for(let c of Joe)e.out.line(c);e.out.line(""),e.out.line(l?m.dim(` editor: ${l.cmd}`):m.dim(" editor: none \u2014 set $VISUAL or $EDITOR to enable in-REPL editing")),e.out.line(m.dim(" hot memory (HOT.md) + the fact archive are managed by the agent via memory_update \u2014")),e.out.line(m.dim(" this command edits your AFK.md prompt overlay."))}function NWe(e){let t=e.stats.cwd??process.cwd(),{source:n}=Tn(t),r=zo(t);if(!r){e.out.info("No AFK.md overlay is active \u2014 nothing to show."),e.out.line(m.dim(` ${n}`));return}e.out.line(m.heading("Composed overlay \u2014 exactly what the model receives")),e.out.line(m.dim(` ${n}`)),e.out.line(""),e.out.raw(r.content),e.out.line("")}var Joe,Voe,Yoe=b(()=>{"use strict";nf();kt();L();EE();zoe();DL();BL();Joe=[" /afk-md overview of both tiers and what the model receives"," /afk-md user edit your personal overlay in $EDITOR"," /afk-md project edit this project\u2019s overlay in $EDITOR"," /afk-md show print the composed overlay exactly as the model sees it"," /afk-md add <text> append a bullet to the project overlay (--user for personal)"," /afk-md reload re-read from disk into this live session"];Voe={name:"/afk-md",aliases:["/memory","/mem"],summary:"Inspect + edit your AFK.md prompt overlay, hot-reloaded into this session",usage:"/afk-md [user|project|show|add <text>|reload]",hint:"When you want to change the standing instructions the agent runs under \u2014 opens the tier in $EDITOR, diffs what changed, and applies it to the RUNNING session (no restart).",flags:["--user"],async handler(e,t){let n=t.trim();if(n.length===0)return FWe(e),"continue";let[r="",...o]=n.split(/\s+/);if(r==="show")return NWe(e),"continue";if(r==="reload"){let s=mp(e.stats.cwd),{applied:a,tokens:l,delta:c,source:u,shadowed:d}=CE(e,s);return d?e.out.warn("AFK.md is shadowed by a higher-priority system prompt override; the file is not part of what the model receives."):a?e.out.success(`Re-read from disk \u2014 overlay now ${Hl(l)} tokens (${_E(c)}). Takes effect on your next message.`):e.out.warn("Re-read from disk, but this provider cannot swap the prompt of a running session \u2014 it applies on next launch."),e.out.line(m.dim(` ${u}`)),"continue"}if(r==="add"){let s=o.includes("--user"),a=o.filter(l=>l!=="--user").join(" ").trim();return a.length===0?(e.out.error("Nothing to add. Usage: /afk-md add <text> [--user]"),"continue"):(qoe(e,NL(s?"user":"project",e.stats.cwd),a),"continue")}let i=LWe(r);return i?(await Goe(e,NL(i,e.stats.cwd)),"continue"):(e.out.error(`Unknown subcommand \`${r}\`.`),DWe(e),"continue")}}});function UWe(e,t){let n=e.replace(/\s+/g," ").trim(),o=n.toLowerCase().indexOf(t.toLowerCase());if(o<0)return n;let i=Math.max(0,o-Xoe),s=Math.min(n.length,o+t.length+Xoe),a=n.slice(i,o),l=n.slice(o,o+t.length),c=n.slice(o+t.length,s),u=i>0?"\u2026":"",d=s<n.length?"\u2026":"";return`${u}${a}${m.warning(l)}${c}${d}`}function jWe(e,t){let n=t.toLowerCase(),r=[];for(let o=0;o<e.length;o++){let i=e[o],s=(i.user??"").toLowerCase().includes(n),a=(i.assistant??"").toLowerCase().includes(n);if(!s&&!a)continue;let l=s?"user":"assistant",c=s?i.user:i.assistant;r.push({ordinal:o+1,role:l,snippet:UWe(c,t)})}return r}function HWe(e){for(let t=e.length-1;t>=0;t--){let n=e[t].toolEvents;if(!(!n||n.length===0))for(let r=n.length-1;r>=0;r--){let o=n[r];if(o.isError!==!0)continue;let i=(o.result??"").replace(/\s+/g," ").trim(),s=i.length>Qoe?i.slice(0,Qoe-1)+"\u2026":i;return{ordinal:t+1,toolName:o.toolName,snippet:s}}}return null}function WWe(e){return e==="user"?`${m.brand("\u25B6")} ${m.meta("user")}`:`${m.brand("\u25C6")} ${m.meta("assistant")}`}function KWe(e){let{stats:t,out:n}=e,r=HWe(t.turns);if(!r){n.info("No tool errors recorded in this session.");return}n.line(),n.line(m.bold("Last tool error")),n.line(
|
|
1993
|
-
`),n=[],r=0,o=0,i="",s="",a=[],l=[],c=null,u=()=>{c&&a.push(c),(i||s)&&n.push({from:i,to:s,metadata:l,hunks:a}),i="",s="",a=[],l=[],c=null};for(let d of t)if(d.startsWith("diff --git ")){u();let p=/^diff --git a\/(.*) b\/(.*)$/.exec(d);i=p?.[1]??d.slice(11),s=p?.[2]??i}else d.startsWith("--- ")?i=d.slice(4).replace(/^a\//,""):d.startsWith("+++ ")?s=d.slice(4).replace(/^b\//,""):d.startsWith("@@ ")?(c&&a.push(c),c={header:/^(@@ [^@]+ @@)/.exec(d)?.[1]??d,lines:[]}):!c&&d!==""?l.push(d):c&&(d.startsWith("+")?(c.lines.push({kind:"+",text:d.slice(1)}),r++):d.startsWith("-")?(c.lines.push({kind:"-",text:d.slice(1)}),o++):d.startsWith(" ")&&c.lines.push({kind:" ",text:d.slice(1)}));return u(),{filePairs:n,totalAdded:r,totalRemoved:o}}function VWe(e,t){if(t.filePairs.length===0){e.info("No changes.");return}let n=m.diffAdd(`+${t.totalAdded}`),r=m.diffRemove(`-${t.totalRemoved}`),o=t.filePairs.length,i=m.dim(`across ${o} file${o===1?"":"s"}`);e.line(` ${n} ${r} ${i}`),e.line();let s=0,a=!1,l=Number.parseInt(k.AFK_DIFF_LINES??"",10),c=l===0?Number.POSITIVE_INFINITY:l>0?l:zWe,u=t.filePairs.reduce((d,p)=>d+p.hunks.reduce((f,g)=>f+g.lines.length,0),0);e:for(let d of t.filePairs){let p=
|
|
1992
|
+
`,"utf-8"),r&&e.out.info(`Created ${t.path}`),e.out.success(`Appended to ${t.path}`),e.out.line(` ${m.success("+")} - ${n}`),Koe(e,o)}var joe,zoe=b(()=>{"use strict";eu();L();EE();DL();BL();joe=40});function DWe(e){e.out.line(m.heading("/afk-md \u2014 AFK.md prompt overlay"));for(let t of Joe)e.out.line(t)}function LWe(e){return e==="user"||e==="u"||e==="1"||e==="personal"?"user":e==="project"||e==="p"||e==="2"?"project":null}function FWe(e){let t=e.stats.cwd??process.cwd(),n=FL(t),{source:r}=Tn(t),o=zo(t),i=mp(t),s=o?Buffer.byteLength(o.content,"utf8"):0;e.out.line(m.heading("AFK.md prompt overlay")),e.out.line("");for(let c of Uoe(n))e.out.line(c);e.out.line("");let a=n.filter(PE).length;a===0?e.out.line(m.dim(" No overlay is active \u2014 the framework prompt is running bare.")):e.out.line(` composed: ${s} B ${Hl(i)} tokens across ${a} tier${a===1?"":"s"}`),e.out.line(m.dim(` ${r}`)),i>Boe&&e.out.warn(`That overlay is ${Hl(i)} tokens \u2014 it is prepended to every request in every session. Consider trimming it.`);let l=pp();e.out.line("");for(let c of Joe)e.out.line(c);e.out.line(""),e.out.line(l?m.dim(` editor: ${l.cmd}`):m.dim(" editor: none \u2014 set $VISUAL or $EDITOR to enable in-REPL editing")),e.out.line(m.dim(" hot memory (HOT.md) + the fact archive are managed by the agent via memory_update \u2014")),e.out.line(m.dim(" this command edits your AFK.md prompt overlay."))}function NWe(e){let t=e.stats.cwd??process.cwd(),{source:n}=Tn(t),r=zo(t);if(!r){e.out.info("No AFK.md overlay is active \u2014 nothing to show."),e.out.line(m.dim(` ${n}`));return}e.out.line(m.heading("Composed overlay \u2014 exactly what the model receives")),e.out.line(m.dim(` ${n}`)),e.out.line(""),e.out.raw(r.content),e.out.line("")}var Joe,Voe,Yoe=b(()=>{"use strict";nf();kt();L();EE();zoe();DL();BL();Joe=[" /afk-md overview of both tiers and what the model receives"," /afk-md user edit your personal overlay in $EDITOR"," /afk-md project edit this project\u2019s overlay in $EDITOR"," /afk-md show print the composed overlay exactly as the model sees it"," /afk-md add <text> append a bullet to the project overlay (--user for personal)"," /afk-md reload re-read from disk into this live session"];Voe={name:"/afk-md",aliases:["/memory","/mem"],summary:"Inspect + edit your AFK.md prompt overlay, hot-reloaded into this session",usage:"/afk-md [user|project|show|add <text>|reload]",hint:"When you want to change the standing instructions the agent runs under \u2014 opens the tier in $EDITOR, diffs what changed, and applies it to the RUNNING session (no restart).",flags:["--user"],async handler(e,t){let n=t.trim();if(n.length===0)return FWe(e),"continue";let[r="",...o]=n.split(/\s+/);if(r==="show")return NWe(e),"continue";if(r==="reload"){let s=mp(e.stats.cwd),{applied:a,tokens:l,delta:c,source:u,shadowed:d}=CE(e,s);return d?e.out.warn("AFK.md is shadowed by a higher-priority system prompt override; the file is not part of what the model receives."):a?e.out.success(`Re-read from disk \u2014 overlay now ${Hl(l)} tokens (${_E(c)}). Takes effect on your next message.`):e.out.warn("Re-read from disk, but this provider cannot swap the prompt of a running session \u2014 it applies on next launch."),e.out.line(m.dim(` ${u}`)),"continue"}if(r==="add"){let s=o.includes("--user"),a=o.filter(l=>l!=="--user").join(" ").trim();return a.length===0?(e.out.error("Nothing to add. Usage: /afk-md add <text> [--user]"),"continue"):(qoe(e,NL(s?"user":"project",e.stats.cwd),a),"continue")}let i=LWe(r);return i?(await Goe(e,NL(i,e.stats.cwd)),"continue"):(e.out.error(`Unknown subcommand \`${r}\`.`),DWe(e),"continue")}}});function UWe(e,t){let n=e.replace(/\s+/g," ").trim(),o=n.toLowerCase().indexOf(t.toLowerCase());if(o<0)return n;let i=Math.max(0,o-Xoe),s=Math.min(n.length,o+t.length+Xoe),a=n.slice(i,o),l=n.slice(o,o+t.length),c=n.slice(o+t.length,s),u=i>0?"\u2026":"",d=s<n.length?"\u2026":"";return`${u}${a}${m.warning(l)}${c}${d}`}function jWe(e,t){let n=t.toLowerCase(),r=[];for(let o=0;o<e.length;o++){let i=e[o],s=(i.user??"").toLowerCase().includes(n),a=(i.assistant??"").toLowerCase().includes(n);if(!s&&!a)continue;let l=s?"user":"assistant",c=s?i.user:i.assistant;r.push({ordinal:o+1,role:l,snippet:UWe(c,t)})}return r}function HWe(e){for(let t=e.length-1;t>=0;t--){let n=e[t].toolEvents;if(!(!n||n.length===0))for(let r=n.length-1;r>=0;r--){let o=n[r];if(o.isError!==!0)continue;let i=(o.result??"").replace(/\s+/g," ").trim(),s=i.length>Qoe?i.slice(0,Qoe-1)+"\u2026":i;return{ordinal:t+1,toolName:o.toolName,snippet:s}}}return null}function WWe(e){return e==="user"?`${m.brand("\u25B6")} ${m.meta("user")}`:`${m.brand("\u25C6")} ${m.meta("assistant")}`}function KWe(e){let{stats:t,out:n}=e,r=HWe(t.turns);if(!r){n.info("No tool errors recorded in this session.");return}n.line(),n.line(m.bold("Last tool error")),n.line(ae());let o=` ${m.meta(`#${r.ordinal}`)} ${m.warning(r.toolName)}`;n.line(o),n.line(` ${r.snippet?m.dim(r.snippet):m.dim("(no error output captured)")}`),n.line()}function GWe(e,t){let{stats:n,out:r}=e;if(n.turns.length===0){r.info("No turns yet in this session.");return}let o=jWe(n.turns,t);if(o.length===0){r.info(`No matches for "${t}".`);return}let i=o.slice(-BWe),s=o.length-i.length;r.line(),r.line(m.bold(`Search: "${t}" (${o.length} match${o.length===1?"":"es"})`)),r.line(ae());for(let a of i)r.line(` ${m.meta(`#${a.ordinal}`)} ${WWe(a.role)}`),r.line(` ${a.snippet}`);s>0&&(r.line(),r.line(m.dim(` \u2026and ${s} more (showing the ${i.length} most recent)`))),r.line()}var Xoe,BWe,Qoe,Zoe,eie=b(()=>{"use strict";L();ht();Xoe=90,BWe=20,Qoe=300;Zoe={name:"/search",usage:"/search <term> | /search --error",summary:"Search this session's turns (or --error to jump to the last tool error)",hint:"Find where something was said this session: /search <term> matches your prompts and the assistant's replies; /search --error jumps to the most recent tool failure.",flags:["--error"],async handler(e,t){let n=t.trim();return n==="--error"||n==="-e"?(KWe(e),"continue"):n===""?(e.out.info("Usage: /search <term> (or /search --error to jump to the last tool error)"),"continue"):(GWe(e,n),"continue")}}});import{execFileSync as qWe}from"node:child_process";function JWe(e){let t=e.split(`
|
|
1993
|
+
`),n=[],r=0,o=0,i="",s="",a=[],l=[],c=null,u=()=>{c&&a.push(c),(i||s)&&n.push({from:i,to:s,metadata:l,hunks:a}),i="",s="",a=[],l=[],c=null};for(let d of t)if(d.startsWith("diff --git ")){u();let p=/^diff --git a\/(.*) b\/(.*)$/.exec(d);i=p?.[1]??d.slice(11),s=p?.[2]??i}else d.startsWith("--- ")?i=d.slice(4).replace(/^a\//,""):d.startsWith("+++ ")?s=d.slice(4).replace(/^b\//,""):d.startsWith("@@ ")?(c&&a.push(c),c={header:/^(@@ [^@]+ @@)/.exec(d)?.[1]??d,lines:[]}):!c&&d!==""?l.push(d):c&&(d.startsWith("+")?(c.lines.push({kind:"+",text:d.slice(1)}),r++):d.startsWith("-")?(c.lines.push({kind:"-",text:d.slice(1)}),o++):d.startsWith(" ")&&c.lines.push({kind:" ",text:d.slice(1)}));return u(),{filePairs:n,totalAdded:r,totalRemoved:o}}function VWe(e,t){if(t.filePairs.length===0){e.info("No changes.");return}let n=m.diffAdd(`+${t.totalAdded}`),r=m.diffRemove(`-${t.totalRemoved}`),o=t.filePairs.length,i=m.dim(`across ${o} file${o===1?"":"s"}`);e.line(` ${n} ${r} ${i}`),e.line();let s=0,a=!1,l=Number.parseInt(k.AFK_DIFF_LINES??"",10),c=l===0?Number.POSITIVE_INFINITY:l>0?l:zWe,u=t.filePairs.reduce((d,p)=>d+p.hunks.reduce((f,g)=>f+g.lines.length,0),0);e:for(let d of t.filePairs){let p=le(d.from==="/dev/null"?"":d.from),f=le(d.to==="/dev/null"?"":d.to),g=d.from==="/dev/null"?m.diffAdd(f):d.to==="/dev/null"?m.diffRemove(p):p!==f?`${m.dim(p)} \u2192 ${m.warning(f)}`:m.warning(p);e.line(m.bold(` ${g}`));for(let h of d.metadata)e.line(m.dim(` ${le(h)}`));for(let h of d.hunks){e.line(m.diffHunk(` ${le(h.header)}`));for(let y of h.lines){if(s>=c){a=!0;break e}let S=` ${y.kind==="+"?"+ ":y.kind==="-"?"- ":" "}${le(y.text)}`;y.kind==="+"?e.line(m.diffAdd(S)):y.kind==="-"?e.line(m.diffRemove(S)):e.line(m.dim(S)),s++}}e.line()}a&&e.line(m.dim(` \u2026 ${u-s} more diff lines (set AFK_DIFF_LINES=0 or pipe to git diff for full output)`))}function YWe(e,t){try{return{ok:!0,stdout:qWe("git",["diff",...e],{cwd:t,encoding:"utf-8",stdio:["ignore","pipe","pipe"]})}}catch(n){let r=n;return{ok:!1,message:le((r.stderr??"").trim()||(r.message??""))||"git diff failed"}}}function XWe(e){let t=e.trim().split(/\s+/).filter(Boolean),n=!1,r=[];for(let o of t)o==="--staged"||o==="--cached"?n=!0:o.startsWith("-")||r.push(o);return{staged:n,file:r.length>0?r.join(" "):null}}var zWe,tie,nie=b(()=>{"use strict";L();ht();We();F();zWe=60;tie={name:"/diff",summary:"Show current git working-tree diff inline",usage:"/diff [--staged] [<file>]",hint:"Shows uncommitted changes colorized in the REPL. `--staged` for only staged changes; pass a path to scope to one file.",async handler(e,t){let{out:n,stats:r}=e,o=r.cwd??process.cwd(),{staged:i,file:s}=XWe(t),a=[];i?a.push("--cached"):a.push("HEAD"),s&&a.push("--",s);let l=YWe(a,o);if(!l.ok)return n.error(`git diff failed: ${l.message}`),"continue";if(!l.stdout.trim()){let p=s?le(s):"",f=p?` for ${m.warning(p)}`:"",g=i?" (staged)":"";return n.info(`No changes${g}${f}.`),"continue"}n.line();let c=i?"Staged changes":"Uncommitted changes",u=s?` ${m.dim(`\u2014 ${le(s)}`)}`:"";n.line(m.bold(`${c}${u}`)),n.line(ae());let d=JWe(l.stdout);return VWe(n,d),"continue"}}});function ZWe(e){return e.replace(QWe,"")}function rie(e){return e.toUpperCase()}function oie(e){let n=ZWe(e).split(`
|
|
1994
1994
|
`),r=[],o=!1,i="";for(let l=0;l<n.length;l++){let c=n[l]??"",u=/^(`{3,}|~{3,})(\w*)/.exec(c);if(u&&!o){o=!0,i=u[2]??"",i&&r.push(`[${i}]`);continue}if(o){u?(o=!1,i=""):r.push(` ${c}`);continue}let d=c;if(/^(\s*[-*_]){3,}\s*$/.test(d)){r.push("");continue}let p=/^#{1}\s+(.+)/.exec(d),f=/^#{2}\s+(.+)/.exec(d),g=/^#{3,6}\s+(.+)/.exec(d);if(p&&!f){let y=rie((p[1]??"").trim());r.push(y),r.push("");continue}if(f){let y=rie((f[1]??"").trim());r.push(y),r.push("");continue}if(g){r.push((g[1]??"").trim());continue}d=d.replace(/^>\s?/,""),d=d.replace(/^(\s*)[-*+]\s+/,(y,w)=>`${w}\u2022 `);let h=[];d=d.replace(/`([^`]+)`/g,(y,w)=>(h.push(w),`\0CS${h.length-1}\0`)),d=d.replace(/\*\*(.+?)\*\*/g,"$1"),d=d.replace(/__(.+?)__/g,"$1"),d=d.replace(/\*([^*]+)\*/g,"$1"),d=d.replace(/_([^_]+)_/g,"$1"),d=d.replace(/\x00CS(\d+)\x00/g,(y,w)=>h[Number(w)]??""),r.push(d.trimEnd())}let s=[],a=0;for(let l of r)l.trim()===""?(a++,a<=2&&s.push(l)):(a=0,s.push(l));return s.join(`
|
|
1995
1995
|
`).trimEnd()}var QWe,iie=b(()=>{"use strict";QWe=/\x1b\[[0-9;]*m/g});var sie,aie=b(()=>{"use strict";L();dS();lm();iie();sie={name:"/copy",aliases:["/cp"],summary:"Copy last response or a code block to clipboard",usage:"/copy [N|plain]",hint:"When you need to paste agent output into another terminal or editor. Use /cp N to grab a specific code block \u2014 the index is shown on each block header. Use /copy plain for Slack/email-friendly output.",async handler(e,t){let{stats:n,out:r}=e;if(!(typeof e.requestResume=="function"&&process.stdout.isTTY===!0))return r.warn("Clipboard not available on this surface \u2014 use /transcript to review output."),"continue";if(n.turns.length===0)return r.info("Nothing to copy \u2014 no assistant responses yet."),"continue";let s=n.turns[n.turns.length-1]?.assistant;if(!s)return r.info("Last turn has no assistant response."),"continue";let a=t.trim();if(a&&/^\d+$/.test(a)){let c=parseInt(a,10),u=rU(c);if(!u){let p=nU();return p.length===0?r.info("No code blocks in the last response."):r.warn(`Block ${c} not found \u2014 last response has ${p.length} code block${p.length===1?"":"s"} (1\u2013${p.length}).`),"continue"}if(Zi(u.text)){let p=u.text.split(`
|
|
1996
1996
|
`).length,f=u.type==="command"?"command":u.type==="url"?"url":u.lang||"code";r.success(`Copied block ${c} `+m.dim(`(${f}, ${p} line${p===1?"":"s"})`)+m.dim(" to clipboard"))}else r.warn("Clipboard write failed \u2014 the block content is in /transcript.");return"continue"}if(a==="plain"){let c=oie(s);if(Zi(c)){let d=c.length,p=c.split(`
|
|
1997
1997
|
`).length;r.success("Copied last response (plain) "+m.dim(`(${d} chars, ${p} line${p===1?"":"s"})`)+m.dim(" to clipboard"))}else r.warn("Clipboard write failed \u2014 the full response is in /transcript.");return"continue"}if(a)return r.warn(`Unknown argument "${a}". Usage: /copy (whole response), /copy N (code block N), or /copy plain (strip markdown).`),"continue";if(Zi(s)){let c=s.length,u=s.split(`
|
|
1998
|
-
`).length;r.success("Copied last response "+m.dim(`(${c} chars, ${u} line${u===1?"":"s"})`)+m.dim(" to clipboard"))}else r.warn("Clipboard write failed \u2014 the full response is in /transcript.");return"continue"}}});import{access as eKe,constants as tKe,mkdir as nKe,readFile as rKe}from"fs/promises";import{execSync as oKe}from"child_process";async function iKe(){return await ew("anthropic-direct")??vs()?{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 sKe(){return sT()?{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 aKe(){let{resolveXaiAuth:e}=await Promise.resolve().then(()=>(bs(),v8)),t=e(void 0,void 0);return t.apiKey?{name:"xAI / Grok auth",state:"pass",detail:`${t.mode==="oauth"?"SuperGrok OAuth":"XAI_API_KEY"} (\u2026${t.last4??"????"})`}:t.source==="ambiguous-auth"?{name:"xAI / Grok auth",state:"warn",detail:"both XAI_API_KEY and SuperGrok OAuth present",fix:"Choose `--provider xai` or `--provider xai-oauth` explicitly"}:{name:"xAI / Grok auth",state:"warn",fix:"Set XAI_API_KEY or run `afk provider auth xai login` for SuperGrok / SuperGrok Heavy / X Premium+"}}async function lKe(){try{let t=`${oKe("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(k.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 jL(e,t){let n=t();try{return await eKe(n,tKe.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await nKe(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 cKe(){let e=fn();try{let t=await rKe(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 uKe(){let e=SA();return e.length===0?null:{name:"Required env vars",state:"fail",detail:`Missing: ${e.map(t=>t.name).join(", ")}`,fix:"Set these env vars before running. See docs/env-registry.md for descriptions."}}async function dKe(){let e=k.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 i=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:i?`@${i}`:"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"}`}}}async function pKe(e={}){let t;if(e.detected!==void 0)t=e.detected;else try{t=pw()}catch{return null}let n=e.trusted??Dn()??{},r=t.filter(i=>i.present&&(i.plugins.length>0||i.skills.length>0)&&n[i.binary]===void 0);return r.length===0?null:{name:"Cross-tool import available",state:"warn",detail:r.map(i=>`${i.label} (${i.plugins.length} plugins, ${i.skills.length} skills)`).join("; "),fix:"Run `afk migrate` to import them"}}function mKe(){return Sj(!1).map(e=>({name:e.key,state:e.valid?"pass":"warn",detail:e.valid?`effective value ${e.effectiveValue} (${e.source})`:`invalid value ${JSON.stringify(e.rawValue)}; effective value ${e.effectiveValue} (fallback)`,...e.valid?{}:{fix:`Set ${e.key} to an integer in [1, ${e.maxValue}] or unset it to use the default.`}}))}async function IE(){let e=[];e.push(await iKe()),e.push(await sKe()),e.push(await aKe()),e.push(await lKe()),e.push(await jL("Config Directory",zn)),e.push(await jL("State Directory",ue)),e.push(await jL("Logs Directory",Fo)),e.push(await cKe()),e.push(...mKe());let t=await uKe();t!==null&&e.push(t);let n=await dKe();n!==null&&e.push(n);let r=await pKe();return r!==null&&e.push(r),e}var HL=b(()=>{"use strict";F();Rm();kt();Pt();U();qo()});function ME(e,t){return new Promise(n=>{let{header:r,initial:o="",help:i=fKe,validate:s,signal:a}=t;if(a?.aborted){n(null);return}let l=z.seed(o),c=null,u=!1,d=y=>{u||(u=!0,a&&a.removeEventListener("abort",p),e.exitPickerMode(),n(y))},p=()=>d(null);a&&a.addEventListener("abort",p,{once:!0});let h={renderRows:()=>{let y=[];for(let w of r)y.push(w);return y.push(hKe(l)),c!==null&&y.push(m.warning(" "+c)),y.push(m.dim(" "+i)),y},onKey:(y,w)=>{if(u)return;if(w.name==="escape"||w.ctrl&&w.name==="c"){d(null);return}if(w.name==="return"){if(s){let v=s(l.buffer);if(v!==null){c=v,e.repaintPicker();return}}d(l.buffer);return}let S=c!==null;if(w.name==="left"||w.ctrl&&w.name==="b"){l=z.moveLeft(l),c=null,e.repaintPicker();return}if(w.name==="right"||w.ctrl&&w.name==="f"){l=z.moveRight(l),c=null,e.repaintPicker();return}if(w.name==="home"||w.ctrl&&w.name==="a"){l=z.moveHome(l),c=null,e.repaintPicker();return}if(w.name==="end"||w.ctrl&&w.name==="e"){l=z.moveEnd(l),c=null,e.repaintPicker();return}if(w.name==="backspace"){l=z.backspace(l),c=null,e.repaintPicker();return}if(w.name==="delete"){l=z.deleteForward(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="w"){l=z.deleteWordBackward(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="u"){l=z.deleteToLineStart(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="k"){l=z.deleteToLineEnd(l),c=null,e.repaintPicker();return}if(y!==void 0&&y.length>0&&!yKe(y)){l=z.insert(l,y),c=null,e.repaintPicker();return}S&&(c=null,e.repaintPicker())}};e.enterPickerMode(h)})}function hKe(e){let{buffer:t,cursor:n}=e,r=t.slice(0,n),o=n>=t.length,i=o?"\u258F":t.charAt(n),s=n<t.length?t.slice(n+1):"",a=o?m.caret(i):m.caret.inverse(i);return` ${m.dim(gKe)} ${r}${a}${s}`}function yKe(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t<32||t===127}var fKe,gKe,WL=b(()=>{"use strict";L();dn();fKe="enter to submit \xB7 esc to cancel",gKe=">"});function wKe(e){return e==="model"||e.startsWith("models.")||e==="temperature"||e==="maxTokens"||e.startsWith("autoRouting.")?"Model & routing":e.startsWith("interactive.")?"Interactive":e.startsWith("telegram.")?"Telegram":e.startsWith("daemon.")||e==="systemPrompt"||e==="permissionMode"||e==="enableShellHooks"||e==="enablePluginHooks"||e==="updatePolicy"?"Advanced":"Session"}function lie(e){let t=new Map;for(let r of e){let o=wKe(r.path),i=t.get(o);i?i.push(r):t.set(o,[r])}let n=[];for(let r of bKe){let o=t.get(r);o&&o.length>0&&n.push({name:r,keys:o})}return n}function OE(e){return e===void 0?"(unset)":e===null?"null":Array.isArray(e)?e.length===0?"(empty)":e.join(","):typeof e=="object"?JSON.stringify(e):String(e)}function cie(e,t,n,r){let o=e.tier==="human"?"\u{1F512} ":" ",i=r?` ${m.warning(r)}`:"";return`${o}${e.path.padEnd(n)} ${OE(t)} (${e.type})${i}`}function uie(e){if(e.type==="boolean")return{kind:"pick",options:["true","false"]};if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0)return{kind:"pick",options:[...e.enumValues]};let t="enter to save \xB7 esc to cancel";return e.type==="number"&&e.clamp?t=`number ${`[${e.clamp.min}..${e.clamp.max}]${e.clamp.integer?" integer":""}`} \xB7 enter to save \xB7 esc to cancel`:e.type==="number"?t="number \xB7 enter to save \xB7 esc to cancel":e.type==="number-array"?t="comma-separated numbers \xB7 enter to save \xB7 esc to cancel":e.type==="model-slot"&&(t="model id (e.g. sonnet) \xB7 enter to save \xB7 esc to cancel"),{kind:"text",help:t}}function die(e){return t=>{let n=Bw(e,t);return n.ok?null:n.error}}var bKe,pie=b(()=>{"use strict";L();Fa();bKe=["Model & routing","Interactive","Session","Telegram","Advanced"]});function mie(){let e=new Map,t=new Map,n=(r,o,i)=>{if(r.has(o))return r.get(o);let s=i();return r.set(o,s),s};return{raw:(r,o)=>n(e,r,o),validated:(r,o)=>n(t,r,o)}}var fie,KL=b(()=>{"use strict";fie={raw:(e,t)=>t(),validated:(e,t)=>t()}});import{readFileSync as SKe,existsSync as vKe}from"fs";function GL(e){return e.kind==="env"?`env ${e.via}`:e.kind==="default"?"default":VH[e.kind]}function gie(e){if(e.source.kind==="default")return e.shadowedBy?`\u2190 default (${GL(e.shadowedBy)} active \u2014 see \u26A0)`:void 0;if(e.source.kind!=="user")return`\u2190 ${GL(e.source)}`}function $E(e){let t=e.shadowedBy;if(t)return t.kind==="env"?`${t.via} is set in the environment and overrides this file \u2014 unset it for this change to take effect.`:t.kind==="project"?e.source.kind==="default"?`${t.path} outranks the user config and is loaded INSTEAD of it (config files are not merged), so this key falls back to its default \u2014 set it in that file for this change to take effect.`:`${t.path} sets this key and outranks the user config \u2014 edit that file for this change to take effect.`:`${GL(t)} overrides this file.`}function xKe(e){if(vKe(e))try{let t=JSON.parse(SKe(e,"utf-8"));return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0}catch{return}}function EKe(e){try{let t=mw(e);return t===void 0?void 0:PW(t)}catch{return}}function RKe(e){for(let t of kKe[e]??[]){if(!ic(t))continue;let n=fy(t);if(n===void 0)return;let r=TKe[t];if(!(r&&!r(n)))return t}}function DE(e,t=fie){let n=rw(),r=n.find(s=>s.tier==="user"),o=r?df(t.raw(r.path,()=>xKe(r.path))??{},e):void 0,i=RKe(e);if(i!==void 0){let s=Xs(i),a=fy(i),l=s?.secret===!0?mf(a):a,c={kind:"env",via:i};return{path:e,effective:l,source:c,shadowedBy:c,userValue:o}}for(let s of n){let a=t.validated(s.path,()=>EKe(s.path));if(a===void 0)continue;let l=df(a,e),c={kind:s.tier,path:s.path},u=s.tier==="project"?{shadowedBy:c}:{};return{path:e,effective:l,source:l===void 0?{kind:"default"}:c,...u,userValue:o}}return{path:e,effective:void 0,source:{kind:"default"},userValue:o}}var kKe,TKe,qL=b(()=>{"use strict";F();Fa();mu();F_();R_();KL();kKe={model:["AFK_MODEL","CLAUDE_MODEL"],maxTokens:["AFK_MAX_TOKENS"],temperature:["AFK_TEMPERATURE"],systemPrompt:["AFK_SYSTEM_PROMPT"],"autoRouting.interactive":["AFK_AUTO_ROUTING"],"autoRouting.chat":["AFK_AUTO_ROUTING"],"autoRouting.telegram":["AFK_AUTO_ROUTING"],"autoRouting.daemon":["AFK_AUTO_ROUTING"],theme:["AFK_THEME"],"interactive.thinkingUi":["AFK_THINKING_UI"],"interactive.suggestGhost":["AFK_SUGGEST_GHOST"],"models.local":["AFK_MODEL_LOCAL"],"models.small":["AFK_MODEL_SMALL"],"models.medium":["AFK_MODEL_MEDIUM"],"models.large":["AFK_MODEL_LARGE"]},TKe={AFK_MAX_TOKENS:e=>Number.isInteger(Number(e)),AFK_TEMPERATURE:e=>Number.isFinite(Number(e))}});async function LE(e,t,n){let r=AKe[e];if(!r)return{applied:!1};if(!n)return{applied:!1,reason:"no live session on this surface"};try{return await r(t,n)}catch(o){return{applied:!1,reason:o instanceof Error?o.message:String(o)}}}var AKe,zL=b(()=>{"use strict";bc();AKe={model:async(e,t)=>(await t.setModel(e),t.noteModel?.(e),t.repaint?.(),{applied:!0,note:"applied to this session"}),theme:async(e,t)=>{let n=Ri(e);if(n===void 0)return{applied:!1,reason:`unrecognised theme "${e}"`};let r=Jr(n);return zr(r),t.repaint?.(),{applied:!0,note:`applied to this session${n==="auto"?` (auto \u2192 ${r})`:""}`}}}});async function hie(e,t){let n=lie(t.specs());if(n.length!==0)for(;;){let r=[m.bold(JL),m.dim("Changes apply on the next restart"),""],o=await e.pick(r,n.map(a=>`${a.name} \xB7 ${a.keys.length} setting${a.keys.length===1?"":"s"}`));if(o===null)return;let i=n[o];if(!i)return;let s=Math.min(28,Math.max(...i.keys.map(a=>a.path.length)));for(;;){let a=[m.bold(`${JL} \u203A ${i.name}`),""],l=mie(),c=await e.pick(a,i.keys.map(d=>{let p=t.current(d.path),f=t.provenance?.(d.path,l),g=f?f.effective:p;return cie(d,g,s,f?gie(f):void 0)}));if(c===null)break;let u=i.keys[c];if(!u)break;await CKe(e,t,u)}}}async function CKe(e,t,n){let r=t.current(n.path),o=t.provenance?.(n.path),i=o?$E(o):void 0,s=[m.bold(`${JL} \u203A ${n.path}`),m.dim(n.description),m.dim(`current: ${OE(o?o.effective:r)}`),...i?[m.warning(`\u26A0 ${i}`)]:[],""],a=uie(n),l;if(a.kind==="pick"){let u=await e.pick(s,a.options);if(u===null)return;let d=a.options[u];if(d===void 0)return;l=d}else{let u=r===void 0?"":OE(r),d=await e.editText(s,u,a.help,die(n));if(d===null)return;l=d}let c=!1;if(n.tier==="human"){if(await e.pick([m.warning(`Apply human-tier change to ${n.path}?`),m.dim("This setting is normally changed via `afk config` on the CLI."),""],[`Yes \u2014 set to "${l}"`,"No \u2014 cancel"])!==0)return;c=!0}try{let u=t.write(n.path,l,c),d=await t.applyLive?.(n.path,l),p=d?.applied===!0?d.note:sr;e.emit(`${m.success(" \u2713")} ${n.path} = ${m.bold(u)} ${m.dim(`\u2014 ${p}`)}`),d&&d.applied===!1&&d.reason!==void 0&&e.emit(`${m.warning(" \u26A0")} ${m.dim(`saved, but not applied live: ${d.reason}`)}`),i&&e.emit(`${m.warning(" \u26A0")} ${m.dim(i)}`)}catch(u){e.emit(`${m.error(" \u2717")} ${m.error(u instanceof Error?u.message:String(u))}`)}}function yie(e){return{async pick(t,n){let r=await An(e,{header:t,options:n});if(!r||r.length===0)return null;let o=n.indexOf(r[0]);return o>=0?o:null},async editText(t,n,r,o){return ME(e,{header:t,initial:n,help:r,validate:o})},emit(t){e.commitAbove(t)}}}function bie(e){return{specs:()=>_P,current:t=>pu(t).value,write:(t,n,r)=>String(Ji(t,n,r?{allowHumanOnly:!0}:void 0).value),provenance:(t,n)=>DE(t,n),applyLive:(t,n)=>LE(t,n,e)}}var JL,wie=b(()=>{"use strict";L();Ls();WL();Fa();pie();mu();qL();KL();zL();JL="\u2699 Settings"});function Sie(e){return{setModel:async t=>{await e.session.current.setModel(t)},noteModel:t=>{e.stats.model=t},repaint:()=>{e.ui.repaintStatusLine(),e.getCompositor?.()?.repaint()}}}function FE(e){let t=k.AFK_MODEL??k.CLAUDE_MODEL,n=t??"sonnet",r=oe(t),o=k.ANTHROPIC_API_KEY||k.CLAUDE_CODE_OAUTH_TOKEN,i=k.OPENAI_API_KEY||k.CODEX_API_KEY,s=r==="anthropic"?o:i;if(e.line(),e.line(m.bold("Configuration")),e.line(se()),e.line(` model ${m.info(t?n:`${n} (default)`)}`),e.line(` provider ${m.plan(r)}`),r==="anthropic"){let u=s?m.success("\u2713 set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):m.warning("\u26A0 not set \u2014 subprocess falls back to OAuth / keychain");e.line(` api key ${u}`)}else{let u=k.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY",d=s?m.success(`\u2713 set (${u})`):m.warning("\u26A0 not set \u2014 falling back to `codex login` state");e.line(` api key ${d}`)}e.line(` thinking ${k.AFK_THINKING?m.info(k.AFK_THINKING):m.dim("(unset \u2014 SDK default)")}`),e.line(` effort ${k.AFK_EFFORT?m.info(k.AFK_EFFORT):m.dim("(unset \u2014 SDK default)")}`);let a=ou();e.line(` perm mode ${a==="bypassPermissions"?m.warning(`${a} (bypass \u2014 containment off)`):m.info(`${a} (containment on)`)}`),e.line(),e.line(m.bold("Environment variables")),e.line(se());let l=[["AFK_MODEL",k.AFK_MODEL??m.dim("unset")],["CLAUDE_MODEL",k.CLAUDE_MODEL??m.dim("unset")],["ANTHROPIC_API_KEY",k.ANTHROPIC_API_KEY?m.success("set"):m.dim("unset")],["CLAUDE_CODE_OAUTH_TOKEN",k.CLAUDE_CODE_OAUTH_TOKEN?m.success("set"):m.dim("unset")],["OPENAI_API_KEY",k.OPENAI_API_KEY?m.success("set"):m.dim("unset")],["CODEX_API_KEY",k.CODEX_API_KEY?m.success("set"):m.dim("unset")],["AFK_THINKING",k.AFK_THINKING??m.dim("unset")],["AFK_EFFORT",k.AFK_EFFORT??m.dim("unset")]],c=Math.max(...l.map(([u])=>u.length))+2;for(let[u,d]of l)e.line(` ${m.meta(u.padEnd(c))} ${d}`);_Ke(e),e.line()}function _Ke(e){let{systemPromptSource:t,shadowedAfkMdPaths:n}=ot();if(e.line(),e.line(m.bold("System prompt overlay")),e.line(se()),e.line(` source ${t?m.info(t):m.dim("(none \u2014 framework base only)")}`),n!==void 0&&n.length>0){for(let r of n)e.line(` ${m.warning("\u26A0 shadowed")} ${m.dim(r)}`);e.line(` ${m.dim("a higher-precedence tier supplied the overlay; this file was not loaded")}`)}}async function PKe(e,t){let n=t.trim(),r=n.indexOf(" ");if(r===-1)return e.out.warn("Usage: /config set <key> <value>"),"continue";let o=n.slice(0,r).trim(),i=n.slice(r+1).trim(),s=Nw(o);if(!s)return e.out.error(`Unknown config key: ${o} (type /config to browse settings)`),"continue";if(s.tier==="human")return e.out.warn(`${o} is human-tier \u2014 set it from the interactive menu (/config) or \`afk config set ${o} <value>\`.`),"continue";try{let a=$E(DE(o));a&&e.out.warn(a);let l=Ji(o,i),c=await LE(o,i,Sie(e));e.out.success(`\u2713 set ${o} = ${String(l.value)} \u2014 ${c.applied?c.note:sr}`),!c.applied&&c.reason!==void 0&&e.out.warn(`saved, but not applied live: ${c.reason}`),a&&e.out.warn(a)}catch(a){e.out.error(a instanceof Error?a.message:String(a))}return"continue"}var IKe,MKe,vie,kie=b(()=>{"use strict";F();L();ht();Ge();It();HL();Fa();mu();wie();qL();zL();IKe={name:"/config",summary:"View or edit configuration \u2014 interactive settings menu on a TTY",usage:"/config [view | set <key> <value>]",hint:"Browse and edit config mid-session in an arrow-key settings menu. Rows show the value the loader will actually use and name the tier it came from, so an env var or project-local afk.config.json that overrides your change is visible before you make it. `model` and `theme` apply immediately; other keys apply on the next restart. Same store as `afk config`.",async handler(e,t){let n=t.trim();if(n==="view")return FE(e.out),"continue";if(n==="set"||n.startsWith("set "))return await PKe(e,n==="set"?"":n.slice(4));if(n.length>0&&n!=="edit"&&n!=="menu")return e.out.warn(`Unknown argument: ${n} (usage: /config [view | set <key> <value>])`),FE(e.out),"continue";let r=e.getCompositor?.()??null;if(!r)return FE(e.out),e.out.line(m.dim(" Interactive editing needs a TTY. Use `/config set <key> <value>` or `afk config`.")),"continue";try{await hie(yie(r),bie(Sie(e)))}catch(o){e.out.error(`Could not open the settings menu: ${o instanceof Error?o.message:String(o)}`),e.out.line(m.dim(" Showing the read-only view instead:")),FE(e.out)}return"continue"}},MKe={name:"/doctor",summary:"Run system health checks (API keys, directories, config file, Telegram)",hint:"When something feels broken \u2014 API key missing, config file unreadable, Telegram bot unreachable. Same checks as `afk doctor` but surfaced mid-session without exiting.",async handler(e){let{out:t}=e;t.line(),t.line(m.bold("System health checks")),t.line(se());let n;try{n=await IE()}catch(r){return t.error(`Health check failed: ${r instanceof Error?r.message:String(r)}`),"continue"}for(let r of n)for(let o of Uy(r))t.line(o);return t.line(),t.line(jy(n)),t.line(),"continue"}},vie=[IKe,MKe]});var Tie,xie=b(()=>{"use strict";L();Tie={name:"/ghost",usage:"/ghost [on|off]",summary:"Toggle ghost-text suggestions mid-session",hint:"Pause or resume inline ghost-text suggestions (the dim text after the cursor). `/ghost off` suppresses all ghost text for the rest of this session \u2014 nothing new appears and nothing new is recorded to history. `/ghost on` resumes. For a permanent toggle, set `interactive.suggestGhost: false` in afk.config.json.",flags:["on","off"],async handler(e,t){let n=e.getCompositor?.();if(!n)return e.out.warn("Ghost text is not available on this surface."),"continue";if(!n.ghostEngine)return e.out.info(`Ghost text is ${m.dim("disabled")} (set at boot via AFK_SUGGEST_GHOST or interactive.suggestGhost).`),"continue";let r=t.trim().toLowerCase();if(!r){let o=n.ghostPaused?m.dim("paused"):m.brand("on");return e.out.info(`Ghost text: ${o} (session-scoped)`),"continue"}return r==="off"?(n.ghostPaused=!0,n.activeGhost=null,n.repaint(),e.out.success(`Ghost text paused for this session. Run ${m.brand("/ghost on")} to resume.`),"continue"):r==="on"?(n.ghostPaused=!1,n.repaint(),e.out.success("Ghost text resumed."),"continue"):(e.out.warn(`Unknown argument: "${r}". Usage: /ghost [on|off]`),"continue")}}});var OKe,Eie,Rie=b(()=>{"use strict";L();OKe=20,Eie={name:"/suggestions",usage:"/suggestions [N | rm <index> | clear]",summary:"View or manage saved input history (ghost-text source)",hint:"List recent inputs that feed ghost-text suggestions. `/suggestions rm 3` removes entry #3. `/suggestions clear` wipes all history. Tip: prefix any input with a space to skip history recording.",async handler(e,t){let r=e.getCompositor?.()?.history;if(!r||typeof r.getEntries!="function")return e.out.warn("History is not available on this surface."),"continue";let o=t.trim();if(o==="clear"){if(typeof r.clear!="function")return e.out.warn("History clearing is not supported."),"continue";let c=r.length??0;return c===0?(e.out.info("History is already empty."),"continue"):(r.clear(),e.out.success(`Cleared ${c} history entries (memory + disk).`),"continue")}if(o.startsWith("rm ")){let c=o.slice(3).trim(),u=parseInt(c,10);if(Number.isNaN(u)||u<1)return e.out.warn(`Invalid index: "${c}". Use a number from the /suggestions list.`),"continue";let d=r.getEntries();if(u>d.length)return e.out.warn(`Index ${u} is out of range (${d.length} entries).`),"continue";let p=d.length-u,f=d[u-1];if(typeof r.removeAt!="function")return e.out.warn("History removal is not supported."),"continue";if(r.removeAt(p)){let h=f&&f.length>60?f.slice(0,57)+"...":f;e.out.success(`Removed #${u}: ${m.dim(h??"(unknown)")}`)}else e.out.warn(`Failed to remove entry #${u}.`);return"continue"}let i=o?parseInt(o,10):OKe;if(Number.isNaN(i)||i<1)return e.out.warn("Usage: /suggestions [N | rm <index> | clear]"),"continue";let s=r.getEntries();if(s.length===0)return e.out.info("No history entries."),"continue";let a=s.slice(0,i),{out:l}=e;return l.line(),l.line(m.bold("Input history")+m.dim(` (${s.length} total, showing ${a.length} newest)`)),l.line(),a.forEach((c,u)=>{let d=m.meta(`#${u+1}`),p=c.length>80?c.slice(0,77)+"...":c;l.line(` ${d} ${p}`)}),l.line(),l.line(m.dim("Tip: prefix input with a space to skip history recording.")),l.line(),"continue"}}});function $Ke(e){let t=e??"builtin";return t==="builtin"||t==="user"||t==="project"?t:t.startsWith("imported:")?"imported":"user"}function DKe(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,acceptsAttachments:!0,...n!==void 0?{usage:n}:{},...e.whenToUse?{hint:e.whenToUse}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o,i){try{await Ux(r,{skillName:e.name,skillMeta:e,args:o,attachments:i,preflight:async()=>{let s={skillName:e.name,rawArgs:o,source:$Ke(e.origin),capabilities:{compose:!0,subagents:!0}},a=r.session.current.sessionId,l=Nl(a);return(await Fl(s,{cwd:r.stats.cwd??process.cwd(),artifactDir:l},u=>{k.AFK_SKILL_STREAM_VERBOSE==="1"&&r.out.warn(`preflight(${e.name}) failed: ${u instanceof Error?u.message:String(u)}`)}))?.manifestBlock}})}catch(s){r.out.line(),r.out.error(`${e.name} failed: ${s instanceof Error?s.message:String(s)}`)}return"continue"}}}function Aie(){Ite(),y0(),ii(Gp(),"project");for(let{dir:t,origin:n}of Ar(Dn()).skillRoots)ii(t,n);let e=k.AFK_INTERNAL==="1";for(let t of go()){let n=Ye(t);cr(n,e)&&_s(DKe(n))}}var Cie=b(()=>{"use strict";Xt();w0();qo();U();Ht();PD();Wx();F()});import{execFile as LKe}from"child_process";import{promisify as FKe}from"util";function BKe(e){return typeof e=="object"&&e!==null&&"code"in e}function VL(e){return[...UKe,...e]}async function NE(e,t,n={}){await(n.runner??Wl)(VL(["clone","--",e,t]),void 0,n.env)}async function BE(e,t={}){await(t.runner??Wl)(VL(["fetch","--tags","--prune"]),e,t.env)}async function Fs(e,t={}){let n=t.runner??Wl,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e,t.env);return r.split(`
|
|
1998
|
+
`).length;r.success("Copied last response "+m.dim(`(${c} chars, ${u} line${u===1?"":"s"})`)+m.dim(" to clipboard"))}else r.warn("Clipboard write failed \u2014 the full response is in /transcript.");return"continue"}}});import{access as eKe,constants as tKe,mkdir as nKe,readFile as rKe}from"fs/promises";import{execSync as oKe}from"child_process";async function iKe(){return await ew("anthropic-direct")??vs()?{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 sKe(){return sT()?{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 aKe(){let{resolveXaiAuth:e}=await Promise.resolve().then(()=>(bs(),v8)),t=e(void 0,void 0);return t.apiKey?{name:"xAI / Grok auth",state:"pass",detail:`${t.mode==="oauth"?"SuperGrok OAuth":"XAI_API_KEY"} (\u2026${t.last4??"????"})`}:t.source==="ambiguous-auth"?{name:"xAI / Grok auth",state:"warn",detail:"both XAI_API_KEY and SuperGrok OAuth present",fix:"Choose `--provider xai` or `--provider xai-oauth` explicitly"}:{name:"xAI / Grok auth",state:"warn",fix:"Set XAI_API_KEY or run `afk provider auth xai login` for SuperGrok / SuperGrok Heavy / X Premium+"}}async function lKe(){try{let t=`${oKe("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(k.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 jL(e,t){let n=t();try{return await eKe(n,tKe.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await nKe(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 cKe(){let e=fn();try{let t=await rKe(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 uKe(){let e=SA();return e.length===0?null:{name:"Required env vars",state:"fail",detail:`Missing: ${e.map(t=>t.name).join(", ")}`,fix:"Set these env vars before running. See docs/env-registry.md for descriptions."}}async function dKe(){let e=k.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 i=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:i?`@${i}`:"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"}`}}}async function pKe(e={}){let t;if(e.detected!==void 0)t=e.detected;else try{t=pw()}catch{return null}let n=e.trusted??Dn()??{},r=t.filter(i=>i.present&&(i.plugins.length>0||i.skills.length>0)&&n[i.binary]===void 0);return r.length===0?null:{name:"Cross-tool import available",state:"warn",detail:r.map(i=>`${i.label} (${i.plugins.length} plugins, ${i.skills.length} skills)`).join("; "),fix:"Run `afk migrate` to import them"}}function mKe(){return Sj(!1).map(e=>({name:e.key,state:e.valid?"pass":"warn",detail:e.valid?`effective value ${e.effectiveValue} (${e.source})`:`invalid value ${JSON.stringify(e.rawValue)}; effective value ${e.effectiveValue} (fallback)`,...e.valid?{}:{fix:`Set ${e.key} to an integer in [1, ${e.maxValue}] or unset it to use the default.`}}))}async function IE(){let e=[];e.push(await iKe()),e.push(await sKe()),e.push(await aKe()),e.push(await lKe()),e.push(await jL("Config Directory",zn)),e.push(await jL("State Directory",ue)),e.push(await jL("Logs Directory",Fo)),e.push(await cKe()),e.push(...mKe());let t=await uKe();t!==null&&e.push(t);let n=await dKe();n!==null&&e.push(n);let r=await pKe();return r!==null&&e.push(r),e}var HL=b(()=>{"use strict";F();Rm();kt();Pt();U();qo()});function ME(e,t){return new Promise(n=>{let{header:r,initial:o="",help:i=fKe,validate:s,signal:a}=t;if(a?.aborted){n(null);return}let l=z.seed(o),c=null,u=!1,d=y=>{u||(u=!0,a&&a.removeEventListener("abort",p),e.exitPickerMode(),n(y))},p=()=>d(null);a&&a.addEventListener("abort",p,{once:!0});let h={renderRows:()=>{let y=[];for(let w of r)y.push(w);return y.push(hKe(l)),c!==null&&y.push(m.warning(" "+c)),y.push(m.dim(" "+i)),y},onKey:(y,w)=>{if(u)return;if(w.name==="escape"||w.ctrl&&w.name==="c"){d(null);return}if(w.name==="return"){if(s){let v=s(l.buffer);if(v!==null){c=v,e.repaintPicker();return}}d(l.buffer);return}let S=c!==null;if(w.name==="left"||w.ctrl&&w.name==="b"){l=z.moveLeft(l),c=null,e.repaintPicker();return}if(w.name==="right"||w.ctrl&&w.name==="f"){l=z.moveRight(l),c=null,e.repaintPicker();return}if(w.name==="home"||w.ctrl&&w.name==="a"){l=z.moveHome(l),c=null,e.repaintPicker();return}if(w.name==="end"||w.ctrl&&w.name==="e"){l=z.moveEnd(l),c=null,e.repaintPicker();return}if(w.name==="backspace"){l=z.backspace(l),c=null,e.repaintPicker();return}if(w.name==="delete"){l=z.deleteForward(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="w"){l=z.deleteWordBackward(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="u"){l=z.deleteToLineStart(l),c=null,e.repaintPicker();return}if(w.ctrl&&w.name==="k"){l=z.deleteToLineEnd(l),c=null,e.repaintPicker();return}if(y!==void 0&&y.length>0&&!yKe(y)){l=z.insert(l,y),c=null,e.repaintPicker();return}S&&(c=null,e.repaintPicker())}};e.enterPickerMode(h)})}function hKe(e){let{buffer:t,cursor:n}=e,r=t.slice(0,n),o=n>=t.length,i=o?"\u258F":t.charAt(n),s=n<t.length?t.slice(n+1):"",a=o?m.caret(i):m.caret.inverse(i);return` ${m.dim(gKe)} ${r}${a}${s}`}function yKe(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t<32||t===127}var fKe,gKe,WL=b(()=>{"use strict";L();dn();fKe="enter to submit \xB7 esc to cancel",gKe=">"});function wKe(e){return e==="model"||e.startsWith("models.")||e==="temperature"||e==="maxTokens"||e.startsWith("autoRouting.")?"Model & routing":e.startsWith("interactive.")?"Interactive":e.startsWith("telegram.")?"Telegram":e.startsWith("daemon.")||e==="systemPrompt"||e==="permissionMode"||e==="enableShellHooks"||e==="enablePluginHooks"||e==="updatePolicy"?"Advanced":"Session"}function lie(e){let t=new Map;for(let r of e){let o=wKe(r.path),i=t.get(o);i?i.push(r):t.set(o,[r])}let n=[];for(let r of bKe){let o=t.get(r);o&&o.length>0&&n.push({name:r,keys:o})}return n}function OE(e){return e===void 0?"(unset)":e===null?"null":Array.isArray(e)?e.length===0?"(empty)":e.join(","):typeof e=="object"?JSON.stringify(e):String(e)}function cie(e,t,n,r){let o=e.tier==="human"?"\u{1F512} ":" ",i=r?` ${m.warning(r)}`:"";return`${o}${e.path.padEnd(n)} ${OE(t)} (${e.type})${i}`}function uie(e){if(e.type==="boolean")return{kind:"pick",options:["true","false"]};if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0)return{kind:"pick",options:[...e.enumValues]};let t="enter to save \xB7 esc to cancel";return e.type==="number"&&e.clamp?t=`number ${`[${e.clamp.min}..${e.clamp.max}]${e.clamp.integer?" integer":""}`} \xB7 enter to save \xB7 esc to cancel`:e.type==="number"?t="number \xB7 enter to save \xB7 esc to cancel":e.type==="number-array"?t="comma-separated numbers \xB7 enter to save \xB7 esc to cancel":e.type==="model-slot"&&(t="model id (e.g. sonnet) \xB7 enter to save \xB7 esc to cancel"),{kind:"text",help:t}}function die(e){return t=>{let n=Bw(e,t);return n.ok?null:n.error}}var bKe,pie=b(()=>{"use strict";L();Fa();bKe=["Model & routing","Interactive","Session","Telegram","Advanced"]});function mie(){let e=new Map,t=new Map,n=(r,o,i)=>{if(r.has(o))return r.get(o);let s=i();return r.set(o,s),s};return{raw:(r,o)=>n(e,r,o),validated:(r,o)=>n(t,r,o)}}var fie,KL=b(()=>{"use strict";fie={raw:(e,t)=>t(),validated:(e,t)=>t()}});import{readFileSync as SKe,existsSync as vKe}from"fs";function GL(e){return e.kind==="env"?`env ${e.via}`:e.kind==="default"?"default":VH[e.kind]}function gie(e){if(e.source.kind==="default")return e.shadowedBy?`\u2190 default (${GL(e.shadowedBy)} active \u2014 see \u26A0)`:void 0;if(e.source.kind!=="user")return`\u2190 ${GL(e.source)}`}function $E(e){let t=e.shadowedBy;if(t)return t.kind==="env"?`${t.via} is set in the environment and overrides this file \u2014 unset it for this change to take effect.`:t.kind==="project"?e.source.kind==="default"?`${t.path} outranks the user config and is loaded INSTEAD of it (config files are not merged), so this key falls back to its default \u2014 set it in that file for this change to take effect.`:`${t.path} sets this key and outranks the user config \u2014 edit that file for this change to take effect.`:`${GL(t)} overrides this file.`}function xKe(e){if(vKe(e))try{let t=JSON.parse(SKe(e,"utf-8"));return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0}catch{return}}function EKe(e){try{let t=mw(e);return t===void 0?void 0:PW(t)}catch{return}}function RKe(e){for(let t of kKe[e]??[]){if(!ic(t))continue;let n=fy(t);if(n===void 0)return;let r=TKe[t];if(!(r&&!r(n)))return t}}function DE(e,t=fie){let n=rw(),r=n.find(s=>s.tier==="user"),o=r?df(t.raw(r.path,()=>xKe(r.path))??{},e):void 0,i=RKe(e);if(i!==void 0){let s=Xs(i),a=fy(i),l=s?.secret===!0?mf(a):a,c={kind:"env",via:i};return{path:e,effective:l,source:c,shadowedBy:c,userValue:o}}for(let s of n){let a=t.validated(s.path,()=>EKe(s.path));if(a===void 0)continue;let l=df(a,e),c={kind:s.tier,path:s.path},u=s.tier==="project"?{shadowedBy:c}:{};return{path:e,effective:l,source:l===void 0?{kind:"default"}:c,...u,userValue:o}}return{path:e,effective:void 0,source:{kind:"default"},userValue:o}}var kKe,TKe,qL=b(()=>{"use strict";F();Fa();mu();F_();R_();KL();kKe={model:["AFK_MODEL","CLAUDE_MODEL"],maxTokens:["AFK_MAX_TOKENS"],temperature:["AFK_TEMPERATURE"],systemPrompt:["AFK_SYSTEM_PROMPT"],"autoRouting.interactive":["AFK_AUTO_ROUTING"],"autoRouting.chat":["AFK_AUTO_ROUTING"],"autoRouting.telegram":["AFK_AUTO_ROUTING"],"autoRouting.daemon":["AFK_AUTO_ROUTING"],theme:["AFK_THEME"],"interactive.thinkingUi":["AFK_THINKING_UI"],"interactive.suggestGhost":["AFK_SUGGEST_GHOST"],"models.local":["AFK_MODEL_LOCAL"],"models.small":["AFK_MODEL_SMALL"],"models.medium":["AFK_MODEL_MEDIUM"],"models.large":["AFK_MODEL_LARGE"]},TKe={AFK_MAX_TOKENS:e=>Number.isInteger(Number(e)),AFK_TEMPERATURE:e=>Number.isFinite(Number(e))}});async function LE(e,t,n){let r=AKe[e];if(!r)return{applied:!1};if(!n)return{applied:!1,reason:"no live session on this surface"};try{return await r(t,n)}catch(o){return{applied:!1,reason:o instanceof Error?o.message:String(o)}}}var AKe,zL=b(()=>{"use strict";bc();AKe={model:async(e,t)=>(await t.setModel(e),t.noteModel?.(e),t.repaint?.(),{applied:!0,note:"applied to this session"}),theme:async(e,t)=>{let n=Ri(e);if(n===void 0)return{applied:!1,reason:`unrecognised theme "${e}"`};let r=Jr(n);return zr(r),t.repaint?.(),{applied:!0,note:`applied to this session${n==="auto"?` (auto \u2192 ${r})`:""}`}}}});async function hie(e,t){let n=lie(t.specs());if(n.length!==0)for(;;){let r=[m.bold(JL),m.dim("Changes apply on the next restart"),""],o=await e.pick(r,n.map(a=>`${a.name} \xB7 ${a.keys.length} setting${a.keys.length===1?"":"s"}`));if(o===null)return;let i=n[o];if(!i)return;let s=Math.min(28,Math.max(...i.keys.map(a=>a.path.length)));for(;;){let a=[m.bold(`${JL} \u203A ${i.name}`),""],l=mie(),c=await e.pick(a,i.keys.map(d=>{let p=t.current(d.path),f=t.provenance?.(d.path,l),g=f?f.effective:p;return cie(d,g,s,f?gie(f):void 0)}));if(c===null)break;let u=i.keys[c];if(!u)break;await CKe(e,t,u)}}}async function CKe(e,t,n){let r=t.current(n.path),o=t.provenance?.(n.path),i=o?$E(o):void 0,s=[m.bold(`${JL} \u203A ${n.path}`),m.dim(n.description),m.dim(`current: ${OE(o?o.effective:r)}`),...i?[m.warning(`\u26A0 ${i}`)]:[],""],a=uie(n),l;if(a.kind==="pick"){let u=await e.pick(s,a.options);if(u===null)return;let d=a.options[u];if(d===void 0)return;l=d}else{let u=r===void 0?"":OE(r),d=await e.editText(s,u,a.help,die(n));if(d===null)return;l=d}let c=!1;if(n.tier==="human"){if(await e.pick([m.warning(`Apply human-tier change to ${n.path}?`),m.dim("This setting is normally changed via `afk config` on the CLI."),""],[`Yes \u2014 set to "${l}"`,"No \u2014 cancel"])!==0)return;c=!0}try{let u=t.write(n.path,l,c),d=await t.applyLive?.(n.path,l),p=d?.applied===!0?d.note:sr;e.emit(`${m.success(" \u2713")} ${n.path} = ${m.bold(u)} ${m.dim(`\u2014 ${p}`)}`),d&&d.applied===!1&&d.reason!==void 0&&e.emit(`${m.warning(" \u26A0")} ${m.dim(`saved, but not applied live: ${d.reason}`)}`),i&&e.emit(`${m.warning(" \u26A0")} ${m.dim(i)}`)}catch(u){e.emit(`${m.error(" \u2717")} ${m.error(u instanceof Error?u.message:String(u))}`)}}function yie(e){return{async pick(t,n){let r=await An(e,{header:t,options:n});if(!r||r.length===0)return null;let o=n.indexOf(r[0]);return o>=0?o:null},async editText(t,n,r,o){return ME(e,{header:t,initial:n,help:r,validate:o})},emit(t){e.commitAbove(t)}}}function bie(e){return{specs:()=>_P,current:t=>pu(t).value,write:(t,n,r)=>String(Ji(t,n,r?{allowHumanOnly:!0}:void 0).value),provenance:(t,n)=>DE(t,n),applyLive:(t,n)=>LE(t,n,e)}}var JL,wie=b(()=>{"use strict";L();Ls();WL();Fa();pie();mu();qL();KL();zL();JL="\u2699 Settings"});function Sie(e){return{setModel:async t=>{await e.session.current.setModel(t)},noteModel:t=>{e.stats.model=t},repaint:()=>{e.ui.repaintStatusLine(),e.getCompositor?.()?.repaint()}}}function FE(e){let t=k.AFK_MODEL??k.CLAUDE_MODEL,n=t??"sonnet",r=oe(t),o=k.ANTHROPIC_API_KEY||k.CLAUDE_CODE_OAUTH_TOKEN,i=k.OPENAI_API_KEY||k.CODEX_API_KEY,s=r==="anthropic"?o:i;if(e.line(),e.line(m.bold("Configuration")),e.line(ae()),e.line(` model ${m.info(t?n:`${n} (default)`)}`),e.line(` provider ${m.plan(r)}`),r==="anthropic"){let u=s?m.success("\u2713 set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):m.warning("\u26A0 not set \u2014 subprocess falls back to OAuth / keychain");e.line(` api key ${u}`)}else{let u=k.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY",d=s?m.success(`\u2713 set (${u})`):m.warning("\u26A0 not set \u2014 falling back to `codex login` state");e.line(` api key ${d}`)}e.line(` thinking ${k.AFK_THINKING?m.info(k.AFK_THINKING):m.dim("(unset \u2014 SDK default)")}`),e.line(` effort ${k.AFK_EFFORT?m.info(k.AFK_EFFORT):m.dim("(unset \u2014 SDK default)")}`);let a=ou();e.line(` perm mode ${a==="bypassPermissions"?m.warning(`${a} (bypass \u2014 containment off)`):m.info(`${a} (containment on)`)}`),e.line(),e.line(m.bold("Environment variables")),e.line(ae());let l=[["AFK_MODEL",k.AFK_MODEL??m.dim("unset")],["CLAUDE_MODEL",k.CLAUDE_MODEL??m.dim("unset")],["ANTHROPIC_API_KEY",k.ANTHROPIC_API_KEY?m.success("set"):m.dim("unset")],["CLAUDE_CODE_OAUTH_TOKEN",k.CLAUDE_CODE_OAUTH_TOKEN?m.success("set"):m.dim("unset")],["OPENAI_API_KEY",k.OPENAI_API_KEY?m.success("set"):m.dim("unset")],["CODEX_API_KEY",k.CODEX_API_KEY?m.success("set"):m.dim("unset")],["AFK_THINKING",k.AFK_THINKING??m.dim("unset")],["AFK_EFFORT",k.AFK_EFFORT??m.dim("unset")]],c=Math.max(...l.map(([u])=>u.length))+2;for(let[u,d]of l)e.line(` ${m.meta(u.padEnd(c))} ${d}`);_Ke(e),e.line()}function _Ke(e){let{systemPromptSource:t,shadowedAfkMdPaths:n}=ot();if(e.line(),e.line(m.bold("System prompt overlay")),e.line(ae()),e.line(` source ${t?m.info(t):m.dim("(none \u2014 framework base only)")}`),n!==void 0&&n.length>0){for(let r of n)e.line(` ${m.warning("\u26A0 shadowed")} ${m.dim(r)}`);e.line(` ${m.dim("a higher-precedence tier supplied the overlay; this file was not loaded")}`)}}async function PKe(e,t){let n=t.trim(),r=n.indexOf(" ");if(r===-1)return e.out.warn("Usage: /config set <key> <value>"),"continue";let o=n.slice(0,r).trim(),i=n.slice(r+1).trim(),s=Nw(o);if(!s)return e.out.error(`Unknown config key: ${o} (type /config to browse settings)`),"continue";if(s.tier==="human")return e.out.warn(`${o} is human-tier \u2014 set it from the interactive menu (/config) or \`afk config set ${o} <value>\`.`),"continue";try{let a=$E(DE(o));a&&e.out.warn(a);let l=Ji(o,i),c=await LE(o,i,Sie(e));e.out.success(`\u2713 set ${o} = ${String(l.value)} \u2014 ${c.applied?c.note:sr}`),!c.applied&&c.reason!==void 0&&e.out.warn(`saved, but not applied live: ${c.reason}`),a&&e.out.warn(a)}catch(a){e.out.error(a instanceof Error?a.message:String(a))}return"continue"}var IKe,MKe,vie,kie=b(()=>{"use strict";F();L();ht();Ge();It();HL();Fa();mu();wie();qL();zL();IKe={name:"/config",summary:"View or edit configuration \u2014 interactive settings menu on a TTY",usage:"/config [view | set <key> <value>]",hint:"Browse and edit config mid-session in an arrow-key settings menu. Rows show the value the loader will actually use and name the tier it came from, so an env var or project-local afk.config.json that overrides your change is visible before you make it. `model` and `theme` apply immediately; other keys apply on the next restart. Same store as `afk config`.",async handler(e,t){let n=t.trim();if(n==="view")return FE(e.out),"continue";if(n==="set"||n.startsWith("set "))return await PKe(e,n==="set"?"":n.slice(4));if(n.length>0&&n!=="edit"&&n!=="menu")return e.out.warn(`Unknown argument: ${n} (usage: /config [view | set <key> <value>])`),FE(e.out),"continue";let r=e.getCompositor?.()??null;if(!r)return FE(e.out),e.out.line(m.dim(" Interactive editing needs a TTY. Use `/config set <key> <value>` or `afk config`.")),"continue";try{await hie(yie(r),bie(Sie(e)))}catch(o){e.out.error(`Could not open the settings menu: ${o instanceof Error?o.message:String(o)}`),e.out.line(m.dim(" Showing the read-only view instead:")),FE(e.out)}return"continue"}},MKe={name:"/doctor",summary:"Run system health checks (API keys, directories, config file, Telegram)",hint:"When something feels broken \u2014 API key missing, config file unreadable, Telegram bot unreachable. Same checks as `afk doctor` but surfaced mid-session without exiting.",async handler(e){let{out:t}=e;t.line(),t.line(m.bold("System health checks")),t.line(ae());let n;try{n=await IE()}catch(r){return t.error(`Health check failed: ${r instanceof Error?r.message:String(r)}`),"continue"}for(let r of n)for(let o of Uy(r))t.line(o);return t.line(),t.line(jy(n)),t.line(),"continue"}},vie=[IKe,MKe]});var Tie,xie=b(()=>{"use strict";L();Tie={name:"/ghost",usage:"/ghost [on|off]",summary:"Toggle ghost-text suggestions mid-session",hint:"Pause or resume inline ghost-text suggestions (the dim text after the cursor). `/ghost off` suppresses all ghost text for the rest of this session \u2014 nothing new appears and nothing new is recorded to history. `/ghost on` resumes. For a permanent toggle, set `interactive.suggestGhost: false` in afk.config.json.",flags:["on","off"],async handler(e,t){let n=e.getCompositor?.();if(!n)return e.out.warn("Ghost text is not available on this surface."),"continue";if(!n.ghostEngine)return e.out.info(`Ghost text is ${m.dim("disabled")} (set at boot via AFK_SUGGEST_GHOST or interactive.suggestGhost).`),"continue";let r=t.trim().toLowerCase();if(!r){let o=n.ghostPaused?m.dim("paused"):m.brand("on");return e.out.info(`Ghost text: ${o} (session-scoped)`),"continue"}return r==="off"?(n.ghostPaused=!0,n.activeGhost=null,n.repaint(),e.out.success(`Ghost text paused for this session. Run ${m.brand("/ghost on")} to resume.`),"continue"):r==="on"?(n.ghostPaused=!1,n.repaint(),e.out.success("Ghost text resumed."),"continue"):(e.out.warn(`Unknown argument: "${r}". Usage: /ghost [on|off]`),"continue")}}});var OKe,Eie,Rie=b(()=>{"use strict";L();OKe=20,Eie={name:"/suggestions",usage:"/suggestions [N | rm <index> | clear]",summary:"View or manage saved input history (ghost-text source)",hint:"List recent inputs that feed ghost-text suggestions. `/suggestions rm 3` removes entry #3. `/suggestions clear` wipes all history. Tip: prefix any input with a space to skip history recording.",async handler(e,t){let r=e.getCompositor?.()?.history;if(!r||typeof r.getEntries!="function")return e.out.warn("History is not available on this surface."),"continue";let o=t.trim();if(o==="clear"){if(typeof r.clear!="function")return e.out.warn("History clearing is not supported."),"continue";let c=r.length??0;return c===0?(e.out.info("History is already empty."),"continue"):(r.clear(),e.out.success(`Cleared ${c} history entries (memory + disk).`),"continue")}if(o.startsWith("rm ")){let c=o.slice(3).trim(),u=parseInt(c,10);if(Number.isNaN(u)||u<1)return e.out.warn(`Invalid index: "${c}". Use a number from the /suggestions list.`),"continue";let d=r.getEntries();if(u>d.length)return e.out.warn(`Index ${u} is out of range (${d.length} entries).`),"continue";let p=d.length-u,f=d[u-1];if(typeof r.removeAt!="function")return e.out.warn("History removal is not supported."),"continue";if(r.removeAt(p)){let h=f&&f.length>60?f.slice(0,57)+"...":f;e.out.success(`Removed #${u}: ${m.dim(h??"(unknown)")}`)}else e.out.warn(`Failed to remove entry #${u}.`);return"continue"}let i=o?parseInt(o,10):OKe;if(Number.isNaN(i)||i<1)return e.out.warn("Usage: /suggestions [N | rm <index> | clear]"),"continue";let s=r.getEntries();if(s.length===0)return e.out.info("No history entries."),"continue";let a=s.slice(0,i),{out:l}=e;return l.line(),l.line(m.bold("Input history")+m.dim(` (${s.length} total, showing ${a.length} newest)`)),l.line(),a.forEach((c,u)=>{let d=m.meta(`#${u+1}`),p=c.length>80?c.slice(0,77)+"...":c;l.line(` ${d} ${p}`)}),l.line(),l.line(m.dim("Tip: prefix input with a space to skip history recording.")),l.line(),"continue"}}});function $Ke(e){let t=e??"builtin";return t==="builtin"||t==="user"||t==="project"?t:t.startsWith("imported:")?"imported":"user"}function DKe(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,acceptsAttachments:!0,...n!==void 0?{usage:n}:{},...e.whenToUse?{hint:e.whenToUse}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o,i){try{await Ux(r,{skillName:e.name,skillMeta:e,args:o,attachments:i,preflight:async()=>{let s={skillName:e.name,rawArgs:o,source:$Ke(e.origin),capabilities:{compose:!0,subagents:!0}},a=r.session.current.sessionId,l=Nl(a);return(await Fl(s,{cwd:r.stats.cwd??process.cwd(),artifactDir:l},u=>{k.AFK_SKILL_STREAM_VERBOSE==="1"&&r.out.warn(`preflight(${e.name}) failed: ${u instanceof Error?u.message:String(u)}`)}))?.manifestBlock}})}catch(s){r.out.line(),r.out.error(`${e.name} failed: ${s instanceof Error?s.message:String(s)}`)}return"continue"}}}function Aie(){Ite(),y0(),ii(Gp(),"project");for(let{dir:t,origin:n}of Ar(Dn()).skillRoots)ii(t,n);let e=k.AFK_INTERNAL==="1";for(let t of go()){let n=Ye(t);cr(n,e)&&_s(DKe(n))}}var Cie=b(()=>{"use strict";Xt();w0();qo();U();Ht();PD();Wx();F()});import{execFile as LKe}from"child_process";import{promisify as FKe}from"util";function BKe(e){return typeof e=="object"&&e!==null&&"code"in e}function VL(e){return[...UKe,...e]}async function NE(e,t,n={}){await(n.runner??Wl)(VL(["clone","--",e,t]),void 0,n.env)}async function BE(e,t={}){await(t.runner??Wl)(VL(["fetch","--tags","--prune"]),e,t.env)}async function Fs(e,t={}){let n=t.runner??Wl,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e,t.env);return r.split(`
|
|
1999
1999
|
`).map(o=>o.trim()).filter(Boolean)}async function Ns(e,t,n={}){let r=n.runner??Wl,o=["checkout","--detach"];n.force&&o.push("--force"),o.push(t),await r(VL(o),e,n.env)}async function Io(e,t={}){let n=t.runner??Wl,{stdout:r}=await n(["rev-parse","HEAD"],e,t.env);return r.trim()}async function UE(e,t,n={}){let r=n.runner??Wl;try{let{stdout:o}=await r(["rev-parse","--verify","--quiet",t],e,n.env);return o.trim()||null}catch{return null}}async function Mo(e,t={}){let n=t.runner??Wl;try{let{stdout:r}=await n(["symbolic-ref","refs/remotes/origin/HEAD","--short"],e,t.env);return r.trim().replace(/^origin\//,"")||"main"}catch{return"main"}}var NKe,Wl,UKe,Eh=b(()=>{"use strict";NKe=FKe(LKe),Wl=async(e,t,n)=>{try{let{stdout:r,stderr:o}=await NKe("git",Array.from(e),{cwd:t,env:n,maxBuffer:20971520});return{stdout:r,stderr:o}}catch(r){throw BKe(r)&&r.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):r}};UKe=Object.freeze(["-c","core.hooksPath=/dev/null","-c","filter.process=","-c","filter.smudge=","-c","filter.clean="])});function HKe(e){let t=jKe.exec(e);if(!t)return null;let[,n,r,o,i]=t;return{raw:e,major:Number(n),minor:Number(r),patch:Number(o),prerelease:i??null}}function WKe(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 i=0;i<o;i++){let s=n[i],a=r[i];if(s===void 0)return-1;if(a===void 0)return 1;let l=/^\d+$/.test(s),c=/^\d+$/.test(a);if(l&&c){let u=Number(s)-Number(a);if(u!==0)return u}else{if(l)return-1;if(c)return 1;if(s<a)return-1;if(s>a)return 1}}return 0}function KKe(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:WKe(e.prerelease,t.prerelease)}function Bs(e){let t=e.map(n=>HKe(n.trim())).filter(n=>n!==null);return t.length===0?null:(t.sort((n,r)=>KKe(r,n)),t[0]?.raw??null)}var jKe,Rh=b(()=>{"use strict";jKe=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/});import{existsSync as Us,mkdirSync as GKe,readFileSync as qKe,realpathSync as _ie,renameSync as zKe,rmSync as JKe,symlinkSync as VKe,lstatSync as YKe,unlinkSync as XKe}from"fs";import{basename as QL,dirname as QKe,join as Kl,resolve as YL,relative as ZKe}from"path";async function HE(e,t={},n={}){let r=n.pluginsDir??Ze(),o=n.indexPath??Te(),i=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},a=n.confirm??!0,l=n.confirmDelayMs??3e3,c=Vc(e);if(GKe(r,{recursive:!0}),c.type==="local")return eGe(c,t,r,o,i);if(c.type==="marketplace-ref")throw new Error(`marketplace-ref source "${c.marketplace}:${c.plugin}" must be installed via the marketplace resolver, not installPlugin directly`);return qb(c.url),tGe(c,t,r,o,i,s,{confirm:a,confirmDelayMs:l})}function eGe(e,t,n,r,o){Pie(e.path);let i=Iie(e.path),s=t.name??i??QL(e.path);bi(s);let a=Kl(n,s);Gl(a,n),XL(a,t.force??!1,r),(Us(a)||ZL(a))&&Ah(a),VKe(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,enabled:!0,installedAt:l,updatedAt:l,...i&&i!==s?{manifestName:i}:{}};return ds(s,c,r),Dr(),{name:s,dir:a,entry:c}}async function tGe(e,t,n,r,o,i,s){let a=t.name??rGe(e);bi(a);let l=Kl(n,a);Gl(l,n),XL(l,t.force??!1,r),Us(l)&&Ah(l);let c=e.type==="github"?`${e.owner}/${e.repo}`:e.url;s.confirm&&await oGe(e.url,s.confirmDelayMs),await NE(e.url,l,i);try{let u;if(t.ref)u=t.ref;else{let w=await Fs(l,i);u=Bs(w)??await Mo(l,i)}(t.ref||await nGe(l,u,i))&&await Ns(l,u,i);let d=await Io(l,i);Pie(l);let p=Iie(l),f=a,g=l;if(!t.name&&p&&p!==a){bi(p);let w=Kl(n,p);Gl(w,n),XL(w,t.force??!1,r),Us(w)&&Ah(w),zKe(l,w),f=p,g=w}let h=o().toISOString(),y={source:c,sourceType:e.type,ref:u,commit:d,enabled:!0,installedAt:h,updatedAt:h,...p&&p!==f?{manifestName:p}:{}};return ds(f,y,r),Dr(),{name:f,dir:g,entry:y}}catch(u){try{Us(l)&&Ah(l)}catch{}throw u}}async function nGe(e,t,n){let r=await Mo(e,n);return t!==r}function rGe(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}async function oGe(e,t){let n="\u2550".repeat(70),r=o=>process.stderr.write(o+`
|
|
2000
2000
|
`);if(r(""),r(n),r(" \u26A0\uFE0F PLUGIN INSTALL WARNING \u2014 READ BEFORE CONTINUING"),r(n),r(""),r(` Source : ${e}`),r(""),r(" Installing a plugin grants ARBITRARY CODE EXECUTION to whoever controls"),r(" that git ref. The plugin's SKILL.md becomes a system prompt that runs"),r(" inside a subagent with full tool access (bash, write_file, web_scrape,"),r(" and any other tool enabled in your session)."),r(""),r(" \u25BA Audit the repository source code before proceeding."),r(" \u25BA Only install plugins from authors you trust."),r(" \u25BA Run `afk plugin install --yes <source>` to suppress this warning."),r(""),t>0){let o=Math.ceil(t/1e3);r(` Proceeding in ${o} second(s)\u2026 Press Ctrl-C to abort.`),r(""),await new Promise(i=>setTimeout(i,t))}r(n),r("")}function Pie(e){let t=Kl(e,".claude-plugin","plugin.json");if(Us(t))return;let n=Kl(e,".claude-plugin","marketplace.json");if(Us(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 Iie(e){let t=Kl(e,".claude-plugin","plugin.json");if(!Us(t))return null;try{let n=JSON.parse(qKe(t,"utf8"));return typeof n.name=="string"&&n.name.trim()?n.name.trim():null}catch{return null}}function bi(e){if(!e||e.length>100||!iGe.test(e))throw new Error(`Invalid plugin name "${e}": must be 1\u2013100 chars, starting with alphanumeric, containing only letters, digits, hyphens, or underscores.`)}function Gl(e,t){let n;try{n=_ie(YL(t))}catch{n=YL(t)}let r=YL(e),o;try{o=Kl(_ie(QKe(r)),QL(r))}catch{o=r}let i=ZKe(n,o);if(i.startsWith("..")||i==="")throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`);if(i.startsWith("/"))throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`)}function XL(e,t,n){if(!Us(e)&&!ZL(e)||t)return;let r=QL(e);if(!Me(n).plugins[r]){Ah(e);return}throw new Error(`plugin directory already exists: ${e} (re-run with --force to replace)`)}function ZL(e){try{return YKe(e).isSymbolicLink()}catch{return!1}}function Ah(e){if(ZL(e)){XKe(e);return}JKe(e,{recursive:!0,force:!0})}var iGe,Ch=b(()=>{"use strict";U();Yc();Eh();Bn();Rh();Fr();iGe=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/});import{existsSync as Oie,readFileSync as sGe}from"fs";import{join as aGe}from"path";function $ie(e){return aGe(e,lGe)}function eF(e){return Oie($ie(e))}function wi(e){let t=$ie(e);if(!Oie(t))throw new Error(`marketplace manifest not found: ${t}`);let n;try{n=sGe(t,"utf8")}catch(o){throw new Error(`could not read marketplace manifest at ${t}: ${Mie(o)}`)}let r;try{r=JSON.parse(n)}catch(o){throw new Error(`marketplace manifest at ${t} is not valid JSON: ${Mie(o)}`)}return cGe(r,t)}function Die(e){try{return wi(e)}catch{return null}}function cGe(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 i=new Set,s=o.map((u,d)=>{if(!u||typeof u!="object")throw new Error(`marketplace manifest at ${t}: plugins[${d}] must be an object`);let p=u,f=p.name,g=p.source;if(typeof f!="string"||!f.trim())throw new Error(`marketplace manifest at ${t}: plugins[${d}] missing required "name"`);if(typeof g!="string"||!g.trim())throw new Error(`marketplace manifest at ${t}: plugins[${d}] missing required "source"`);let h=f.trim();if(i.has(h))throw new Error(`marketplace manifest at ${t}: duplicate plugin name "${h}"`);i.add(h);let y={name:h,source:g.trim()},w=p.description;return typeof w=="string"&&(y.description=w),y}),a={name:r.trim(),plugins:s},l=n.metadata;if(l&&typeof l=="object"){let u=l,d={};typeof u.description=="string"&&(d.description=u.description),Object.keys(d).length>0&&(a.metadata=d)}let c=n.owner;if(c&&typeof c=="object"){let u=c,d={};typeof u.name=="string"&&(d.name=u.name),typeof u.email=="string"&&(d.email=u.email),Object.keys(d).length>0&&(a.owner=d)}return a}function Mie(e){return e instanceof Error?e.message:String(e)}var lGe,WE=b(()=>{"use strict";lGe=".claude-plugin/marketplace.json"});import{existsSync as _h,mkdirSync as uGe,renameSync as dGe,rmSync as pGe,symlinkSync as mGe,lstatSync as fGe,unlinkSync as gGe}from"fs";import{basename as hGe,join as tF}from"path";async function GE(e,t={},n={}){let r=n.cacheDir??Kr(),o=n.indexPath??Te(),i=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},a=Vc(e);if(a.type==="marketplace-ref")throw new Error(`marketplace source cannot itself be a marketplace reference ("${e}")`);return uGe(r,{recursive:!0}),a.type==="local"?yGe(a,t,r,o,i):bGe(a,t,r,o,i,s)}function yGe(e,t,n,r,o){let i=wi(e.path),s=t.name??i.name;bi(s);let a=tF(n,s);Gl(a,n),nF(a,t.force??!1),(_h(a)||rF(a))&&KE(a),mGe(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,installedAt:l,updatedAt:l};return Gf(s,c,r),{name:s,dir:a,entry:c,plugins:i.plugins.map(Lie)}}async function bGe(e,t,n,r,o,i){qb(e.url);let s=t.name??SGe(e);bi(s);let a=tF(n,s);Gl(a,n),nF(a,t.force??!1),_h(a)&&KE(a);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await NE(e.url,a,i);try{let c;if(t.ref)c=t.ref;else{let y=await Fs(a,i);c=Bs(y)??await Mo(a,i)}(t.ref||await wGe(a,c,i))&&await Ns(a,c,i);let u=await Io(a,i),d=wi(a),p=s,f=a;if(!t.name&&d.name!==s){bi(d.name);let y=tF(n,d.name);Gl(y,n),nF(y,t.force??!1),_h(y)&&KE(y),dGe(a,y),p=d.name,f=y}let g=o().toISOString(),h={source:l,sourceType:e.type,ref:c,commit:u,installedAt:g,updatedAt:g};return Gf(p,h,r),{name:p,dir:f,entry:h,plugins:d.plugins.map(Lie)}}catch(c){try{_h(a)&&KE(a)}catch{}throw c}}async function wGe(e,t,n){let r=await Mo(e,n);return t!==r}function SGe(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):hGe(t)}function nF(e,t){if(!(!_h(e)&&!rF(e))&&!t)throw new Error(`marketplace directory already exists: ${e} (re-run with --force to replace)`)}function rF(e){try{return fGe(e).isSymbolicLink()}catch{return!1}}function KE(e){if(rF(e)){gGe(e);return}pGe(e,{recursive:!0,force:!0})}function Lie(e){return e.description?{name:e.name,description:e.description}:{name:e.name}}var oF=b(()=>{"use strict";U();Ch();Yc();Eh();Bn();Rh();WE()});import{existsSync as vGe,lstatSync as kGe,rmSync as TGe,unlinkSync as xGe}from"fs";import{join as EGe}from"path";function qE(e,t={}){let n=t.cacheDir??Kr(),r=t.indexPath??Te(),o=EGe(n,e),i=!1;RGe(o)?(xGe(o),i=!0):vGe(o)&&(TGe(o,{recursive:!0,force:!0}),i=!0);let s=Me(r),a=Object.prototype.hasOwnProperty.call(s.marketplaces,e),l=Object.entries(s.plugins).filter(([,c])=>c.marketplace===e).map(([c])=>c);return(a||l.length>0)&&HJ(e,r),{name:e,removedDir:i,removedIndexEntry:a,removedPluginEntries:l}}function RGe(e){try{return kGe(e).isSymbolicLink()}catch{return!1}}var iF=b(()=>{"use strict";U();Bn()});import{existsSync as zE,statSync as AGe}from"fs";import{isAbsolute as Fie,join as CGe,resolve as Nie}from"path";async function fp(e,t,n={},r={}){let o=r.marketplaceDirFor??cc,i=r.indexPath??Te(),s=r.now??(()=>new Date),a=o(e);if(!zE(a)||!eF(a))throw new Error(`marketplace "${e}" is not installed (looked for manifest under ${a})`);let l=wi(a),c=l.plugins.find(u=>u.name===t);if(!c){let u=l.plugins.map(d=>d.name).join(", ")||"(none)";throw new Error(`marketplace "${e}" does not list a plugin named "${t}". Available: ${u}`)}return _Ge(c.source)?PGe(e,c,a,i,s,n):IGe(e,c,n,r)}function JE(e,t={}){let n=t.marketplaceDirFor??cc,r=t.indexPath??Te(),o=n(e);if(!zE(o)||!eF(o))throw new Error(`marketplace "${e}" is not installed`);let i=wi(o),s=Me(r);return i.plugins.map(a=>{let l=`${e}:${a.name}`,c=l in s.plugins||a.name in s.plugins&&s.plugins[a.name]?.marketplace===e,u={name:a.name,installed:c,key:l};return a.description&&(u.description=a.description),u})}function _Ge(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.startsWith("~")}function Bie(e){return e.startsWith(".")||Fie(e)||e.startsWith("~")}function sF(e,t){return Fie(t)||t.startsWith("~")?MGe(t):Nie(e,t)}function PGe(e,t,n,r,o,i){let s=t.source,a=sF(n,s);if(!zE(a))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path does not exist on disk`);if(!AGe(a).isDirectory())throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path is not a directory`);let c=CGe(a,".claude-plugin","plugin.json");if(!zE(c))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but no .claude-plugin/plugin.json was found`);let u=`${e}:${t.name}`,d=Me(r);if(!i.force&&u in d.plugins&&d.plugins[u]?.enabled)throw new Error(`plugin "${u}" is already installed (re-run with --force to overwrite)`);let p=o().toISOString(),f={source:`${e}:${t.name}`,sourceType:"marketplace",ref:null,commit:null,enabled:!0,installedAt:p,updatedAt:p,marketplace:e};return ds(u,f,r),{key:u,name:t.name,dir:a,entry:f}}async function IGe(e,t,n,r){let o={name:t.name,...n.ref?{ref:n.ref}:{},...n.force?{force:!0}:{}},i=await HE(t.source,o,r),s=r.indexPath??Te(),a={...i.entry,marketplace:e};return ds(i.name,a,s),{key:i.name,name:i.name,dir:i.dir,entry:a}}function MGe(e){if(e.startsWith("~")){let t=k.HOME??"";if(e==="~")return t;if(e.startsWith("~/"))return Nie(t,e.slice(2))}return e}var Ph=b(()=>{"use strict";F();U();Bn();Ch();WE()});import{existsSync as OGe}from"fs";import{join as $Ge}from"path";async function js(e,t={},n={}){let r=n.indexPath??Te(),o=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},a=Me(r).marketplaces[e];if(!a)throw new Error(`marketplace "${e}" is not installed`);let l=n.cacheDir?$Ge(n.cacheDir,e):cc(e);if(!OGe(l))return{name:e,status:"missing-dir",dir:l};if(a.sourceType==="local")return{name:e,status:"skipped-local"};let c=new Set((Die(l)?.plugins??[]).map(_=>_.name));await BE(l,i);let u,d=!1;if(t.ref)u=t.ref;else{let _=await Fs(l,i),R=Bs(_);R!==null?(u=R,d=!0):u=a.ref??await Mo(l,i)}let p=`refs/remotes/origin/${u}`,f=d?null:await UE(l,p,i),g=f!==null,h=await Io(l,i);if(g?f===h:u===a.ref)return{name:e,status:"up-to-date",ref:u,commit:h};await Ns(l,g?p:d?`refs/tags/${u}`:u,{...i,force:!0});let w=await Io(l,i),S=o().toISOString(),v={...a,ref:u,commit:w,updatedAt:S};Gf(e,v,r);let x=wi(l),T=new Set(x.plugins.map(_=>_.name)),E=[...T].filter(_=>!c.has(_)),C=[...c].filter(_=>!T.has(_));return{name:e,status:"updated",fromRef:a.ref,toRef:u,commit:w,addedPlugins:E,removedPlugins:C,pluginVersions:DGe(l,x)}}function DGe(e,t){return t.plugins.map(n=>{let r=Bie(n.source)?si(sF(e,n.source)).version:null;return{name:n.name,version:r}})}async function Uie(e={}){let t=e.indexPath??Te(),n=Me(t),r=[];for(let o of Object.keys(n.marketplaces))try{r.push(await js(o,{},e))}catch(i){let s=i instanceof Error?i.message:String(i);r.push({name:o,status:"missing-dir",dir:s})}return r}var VE=b(()=>{"use strict";U();Eh();Bn();Rh();rg();WE();Ph()});function Hie(){ge(FGe),ge(NGe)}function Wie(e){let t=Me(),n=Object.entries(t.marketplaces).sort(([r],[o])=>r.localeCompare(o));if(e.out.line(),n.length===0){e.out.line(m.dim(" No marketplaces installed.")),e.out.line(m.dim(" Try: /marketplace install anthropics/claude-plugins-official")),e.out.line();return}e.out.line(m.bold("Installed marketplaces:"));for(let[r,o]of n){let i=o.ref?m.brand(o.ref):m.dim("(local)");e.out.line(` ${m.bold(r.padEnd(28))} ${i.padEnd(12)} ${m.dim(o.source)}`)}e.out.line()}function BGe(e){e.out.line(),e.out.line(m.bold("/marketplace usage:")),e.out.line(` ${m.brand("/marketplace install")} <git-url|owner/repo|local-path> [name]`),e.out.line(` ${m.brand("/marketplace install-plugin")} <marketplace> <plugin>`),e.out.line(` ${m.brand("/marketplace plugins")} <marketplace>`),e.out.line(` ${m.brand("/marketplace remove")} <marketplace>`),e.out.line(` ${m.brand("/marketplace update")} [<marketplace>]`),e.out.line(` ${m.brand("/marketplace list")}`),e.out.line()}async function Kie(e,t){if(t.length===0)return e.out.error("Usage: /marketplace install <source> [name]"),"continue";let[n,r,...o]=t;if(!n)return e.out.error("Usage: /marketplace install <source> [name]"),"continue";let i=zGe(o);e.out.info(`Installing marketplace ${n}\u2026`);try{let s=await GE(n,{...r&&!r.startsWith("-")?{name:r}:{},...i.ref?{ref:i.ref}:{},...i.force?{force:!0}:{}});e.out.success(`Installed marketplace ${s.name} (${s.plugins.length} plugin(s) available).`),e.out.line(m.dim(` Next: /marketplace plugins ${s.name}`))}catch(s){e.out.error(`Install failed: ${YE(s)}`)}return"continue"}async function UGe(e,t){return t.length===1&&jGe(t[0])||t.length>=2?jie(e,t):Kie(e,t)}function jGe(e){return!e||!e.includes(":")?!1:!/^[a-zA-Z][a-zA-Z0-9+\-.]*:\/\//.test(e)}async function jie(e,t){return e.out.warn("Deprecated: use `/marketplace install-plugin <marketplace> <plugin>` instead."),Gie(e,t)}async function HGe(e,t){return Gie(e,t)}async function Gie(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-plugin <marketplace> <plugin>"),"continue";e.out.info(`Installing ${n}:${r}\u2026`);try{let o=await fp(n,r);e.out.success(`Installed ${o.key}.`),e.out.line(m.dim(" Run /reload-plugins to refresh this session's slash commands."))}catch(o){e.out.error(`Install failed: ${YE(o)}`)}return"continue"}async function WGe(e,t){return e.out.warn("Deprecated: use `/marketplace install <source>` instead."),Kie(e,t)}function KGe(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace plugins <marketplace>"),"continue";try{let r=JE(n);if(e.out.line(),r.length===0)return e.out.line(m.dim(` Marketplace "${n}" lists no plugins.`)),e.out.line(),"continue";e.out.line(m.bold(`Plugins in ${n}:`)),r.forEach((o,i)=>{let s=o.installed?m.brand("[\u2713]"):m.dim("[ ]"),a=o.description?m.dim(` \u2014 ${o.description}`):"";e.out.line(` ${s} ${m.bold(String(i+1).padStart(2))}. ${m.bold(o.name)}${a}`)}),e.out.line(),e.out.line(m.dim(` Install one: /marketplace install-plugin ${n} <plugin>`)),e.out.line()}catch(r){e.out.error(`List failed: ${YE(r)}`)}return"continue"}function GGe(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace remove <marketplace>"),"continue";let r=qE(n);if(!r.removedDir&&!r.removedIndexEntry&&r.removedPluginEntries.length===0)return e.out.line(m.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 qGe(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 js(n);switch(r.status){case"updated":{let o=r.addedPlugins.length>0?` +${r.addedPlugins.join(", ")}`:"",i=r.removedPlugins.length>0?` -${r.removedPlugins.join(", ")}`:"";e.out.success(`Updated ${n}: ${r.fromRef??"(none)"} \u2192 ${r.toRef}${o}${i}`);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: ${YE(r)}`)}return"continue"}function zGe(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 YE(e){return e instanceof Error?e.message:String(e)}var LGe,FGe,NGe,qie=b(()=>{"use strict";L();oF();iF();VE();Ph();Bn();Ht();LGe=["install","install-plugin","plugins","remove","update","list","add"],FGe={name:"/marketplaces",summary:"List installed plugin marketplaces",async handler(e){return Wie(e),"continue"}},NGe={name:"/marketplace",summary:"Manage plugin marketplaces (install | install-plugin | plugins | remove | update)",usage:"/marketplace <install|install-plugin|plugins|remove|update|list> [args]",async handler(e,t){let n=t.trim();if(!n)return BGe(e),"continue";let[r,...o]=n.split(/\s+/);if(!r||!LGe.includes(r))return e.out.error(`Unknown subcommand "${r??""}". Try one of: install, install-plugin, plugins, remove, update.`),"continue";switch(r){case"install":return UGe(e,o);case"install-plugin":return HGe(e,o);case"plugins":return KGe(e,o);case"remove":return GGe(e,o);case"update":return qGe(e,o);case"list":return Wie(e),"continue";case"add":return WGe(e,o);default:return"continue"}}}});var zie=b(()=>{"use strict";fE();Ene("shadow-verify",{glyph:"\u25C8",color:"#7B5EA7",inFlightVerb:"verifying\u2026"})});var Jie={};Pn(Jie,{registerAll:()=>aF});function aF(){O9();for(let e of One)ge(e);for(let e of Gne)ge(e);ge(Jne),ge(gre),ge(Rre),ge(Cre),ge(Bre),ge(Kre),ge(Qre);for(let e of Jte)ge(e);for(let e of rne)ge(e);ge(noe),ge(roe),ge(ioe),ge(aoe),ge(doe),ge(moe),ge(goe),ge(Tne),ge(xoe),ge(Roe),ge(Coe),ge(Moe),ge(Doe),ge(Voe),ge(Zoe),ge(tie),ge(sie);for(let e of vie)ge(e);ge(Tie),ge(Eie),Aie(),M9(boe),Lte(),V9(),Hie()}var lF=b(()=>{"use strict";Ht();$ne();qne();Vne();hre();Are();_re();Ure();Gre();Zre();YD();bh();CL();ooe();soe();loe();poe();foe();hoe();sL();woe();Eoe();Aoe();_oe();Ooe();Loe();Yoe();eie();nie();aie();kie();xie();Rie();Gx();GT();Cie();qie();zie()});var Yie={};Pn(Yie,{FastModeController:()=>cF,resolveFastModeStatus:()=>Vie});function Vie(e,t){return e==="off"?Object.freeze({preference:e,effective:!1,reason:"preference-off"}):t.providerFamily!=="anthropic-direct"?Object.freeze({preference:e,effective:!1,reason:"unsupported-provider"}):t.hasCustomEndpoint?Object.freeze({preference:e,effective:!1,reason:"custom-endpoint"}):t.executionPath!=="top-level"?Object.freeze({preference:e,effective:!1,reason:"excluded-execution-path"}):JGe.test(t.resolvedModelId)?Object.freeze({preference:e,effective:!0}):Object.freeze({preference:e,effective:!1,reason:"unsupported-model"})}var JGe,cF,Xie=b(()=>{"use strict";JGe=/^claude-opus-(?:5|4-8)(?:-[a-z0-9][a-z0-9-]*)?$/;cF=class{preference;constructor(t="off"){this.preference=t}getPreference(){return this.preference}setPreference(t){this.preference=t}resolveStatus(t){return Vie(this.preference,t)}snapshotTurn(t){return this.resolveStatus(t)}}});var Pce={};Pn(Pce,{SessionOwner:()=>ZF});var ZF,Ice=b(()=>{"use strict";Yk();Tg();kt();ZF=class{constructor(t){this.options=t}options;owned=new Set;sessions=new Map;info=new Map;turns=new Map;pending=new Map;get baseCwd(){return this.options.cwd??process.cwd()}async create(t={}){let n=this.options.allowArbitraryCwd===!0?t.cwd??this.baseCwd:this.baseCwd,r=t.model??this.options.model,{prompt:o,source:i}=Tn(n),{registry:s}=Ss(void 0,"web",void 0,void 0,void 0,{cwd:n}),a={model:r,surface:"web",apiKey:tn(r),cwd:n,hookRegistry:s,permissionMode:this.options.permissionMode??"default",...o!==void 0?{systemPrompt:o}:{},...i!==void 0?{systemPromptSource:i}:{}},l=new Ut(a),u=(await l.waitForInitialization()).sessionId??l.sessionId;if(u===void 0)throw await l.close().catch(()=>{}),new Error("session initialized without an id");let d={id:u,cwd:n,model:r,createdAt:new Date().toISOString()};return this.sessions.set(u,l),this.info.set(u,d),this.owned.add(u),d}async submitPrompt(t,n){let r=this.sessions.get(t);if(!r)throw new Error(`session ${t} is not owned by this process`);this.pending.set(t,(this.pending.get(t)??0)+1);let i=(this.turns.get(t)??Promise.resolve()).catch(()=>{}).then(async()=>{try{for await(let s of r.sendMessageStream(n));}finally{let s=(this.pending.get(t)??1)-1;s>0?this.pending.set(t,s):this.pending.delete(t)}});this.turns.set(t,i),i.catch(()=>{})}isBusy(t){return(this.pending.get(t)??0)>0}async interrupt(t){let n=this.sessions.get(t);if(!n)throw new Error(`session ${t} is not owned by this process`);await n.interrupt()}list(){return[...this.info.values()]}async closeAll(){let t=[...this.sessions.values()];this.sessions.clear(),this.info.clear(),this.owned.clear(),this.pending.clear(),this.turns.clear(),await Promise.all(t.map(n=>n.close().catch(()=>{})))}}});U();Iy();import{config as tB}from"dotenv";import{Command as O5e}from"commander";F();import FA from"chalk";function gB(){let e=k.FORCE_COLOR;if(e&&e.length>0)return;let t=k.NO_COLOR;if(t&&t.length>0){FA.level=0;return}let n=k.CI;if(n&&n.length>0){FA.level=0;return}if(!process.stdout.isTTY){FA.level=0;return}}F();bc();L();import SNe from"ora";He();function CB(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("rate limit")||t.toLowerCase().includes("too many requests")}function _B(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("network")||t.toLowerCase().includes("connect")||t.toLowerCase().includes("timeout")}function Sc(e){if(e instanceof Vr)return{kind:"budget_exceeded",userMessage:`Session stopped: cost ceiling reached ($${e.runningCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit).`,exitCode:1,raw:e};if(e instanceof Ly)return{kind:"unsupported_config",userMessage:`The "${e.provider}" provider does not support this configuration option.`,hint:`Option "${e.field}" is not available for provider "${e.provider}". Switch to a compatible provider or remove the option.`,exitCode:1,raw:e};if(e instanceof Re)return{kind:"hook_blocked",userMessage:`A hook blocked the operation (event: ${e.event}).`,...e.reason!==void 0?{hint:e.reason}:{},exitCode:1,raw:e};if(e instanceof xt){let i=Math.round(e.timeoutMs/1e3);return{kind:"timeout",userMessage:`The operation timed out after ${i} second${i!==1?"s":""}.`,hint:`Timeout: ${e.timeoutMs}ms (${i}s). Increase the timeout or retry.`,exitCode:124,raw:e}}let t=e,n=e instanceof Error?e.message:String(e),r=n.toLowerCase();return t.status===401||e instanceof Error&&e.name==="AuthenticationError"?{kind:"auth",userMessage:"Authentication failed. Check that your API key is valid and has not expired.",hint:"Verify the ANTHROPIC_API_KEY environment variable or run `afk login`.",exitCode:1,raw:e}:t.status===429||CB(e)?{kind:"rate_limit",userMessage:"Anthropic rate limit reached. The request was rejected (HTTP 429).",hint:"Wait a moment and retry, or reduce the request frequency.",exitCode:1,raw:e}:t.status===529||t.status===503?{kind:"overloaded",userMessage:`Anthropic API is temporarily overloaded (HTTP ${t.status}). All retry attempts were exhausted.`,hint:"Wait a minute and try again, or switch to a less loaded model (e.g. sonnet).",exitCode:1,raw:e}:n==="Not in a git repository."||r.includes("not in a git repository")?{kind:"not_git_repo",userMessage:"This command must be run from inside a git repository.",hint:"Run `git init` to initialise a repository, or change to a directory that is already a git repo.",exitCode:1,raw:e}:_B(e)||r.includes("econnrefused")||r.includes("etimedout")?{kind:"network",userMessage:"Network error: unable to reach the API endpoint.",hint:"Check your internet connection and try again.",exitCode:1,raw:e}:{kind:"unknown",userMessage:(e instanceof Error?e.message:String(e))||"An unexpected error occurred.",exitCode:1,raw:e}}ht();me();function _c(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(Ky({body:e.userMessage,hint:e.hint})+`
|
|
2001
2001
|
`);else{let o=e.hint?` (${e.hint})`:"";r(`afk: error: ${e.userMessage}${o}
|
|
@@ -2011,7 +2011,7 @@ ${r}
|
|
|
2011
2011
|
|
|
2012
2012
|
${o}`};if(i&&typeof i=="object"&&"type"in i&&i.type==="preset"){let s=i.append??"";return{...e,systemPrompt:{...i,append:`${s}
|
|
2013
2013
|
|
|
2014
|
-
${o}`}}}return{...e,systemPrompt:o}}At();nt();Cc();kt();$n();cn();Jt();ja();Fi();Nc();function aT(e=[]){return[...gn,...Ta,..._t,...ya,...Fc,Nn,"agent","skill","compose",...e]}It();bc();lT();_i();_g();St();VM();QM();SO();dr();_v();Mr();zu();function Ed(e){let{surface:t,parentSession:n,apiKey:r,model:o,managerParentModel:i,defaultSubagentModel:s,resolveApiKeyForModel:a,systemPrompt:l,baseUrl:c,openaiBaseUrl:u,xaiBaseUrl:d,cwd:p,nestedCwd:f,traceWriter:g,skillTraceWriter:h,backgroundRegistry:y,agentRegistryWarn:w}=e,S=c!==void 0?{baseUrl:c}:{},v=u!==void 0?{openaiBaseUrl:u}:{},x=d!==void 0?{xaiBaseUrl:d}:{},T=p!==void 0?{cwd:p}:{},E=f!==void 0?{cwd:f}:{},C=g!==void 0?{traceWriter:g}:{},_=h!==void 0?{traceWriter:h}:{},R=r!==void 0?{apiKey:r}:{},P=y!==void 0?{backgroundRegistry:y}:{},I=w??(
|
|
2014
|
+
${o}`}}}return{...e,systemPrompt:o}}At();nt();Cc();kt();$n();cn();Jt();ja();Fi();Nc();function aT(e=[]){return[...gn,...Ta,..._t,...ya,...Fc,Nn,"agent","skill","compose",...e]}It();bc();lT();_i();_g();St();VM();QM();SO();dr();_v();Mr();zu();function Ed(e){let{surface:t,parentSession:n,apiKey:r,model:o,managerParentModel:i,defaultSubagentModel:s,resolveApiKeyForModel:a,systemPrompt:l,baseUrl:c,openaiBaseUrl:u,xaiBaseUrl:d,cwd:p,nestedCwd:f,traceWriter:g,skillTraceWriter:h,backgroundRegistry:y,agentRegistryWarn:w}=e,S=c!==void 0?{baseUrl:c}:{},v=u!==void 0?{openaiBaseUrl:u}:{},x=d!==void 0?{xaiBaseUrl:d}:{},T=p!==void 0?{cwd:p}:{},E=f!==void 0?{cwd:f}:{},C=g!==void 0?{traceWriter:g}:{},_=h!==void 0?{traceWriter:h}:{},R=r!==void 0?{apiKey:r}:{},P=y!==void 0?{backgroundRegistry:y}:{},I=w??(ie=>process.stderr.write(ie+`
|
|
2015
2015
|
`)),$=To(),j=new ke({...R,parentModel:i,...S,...T,...C,surface:t,...e.workspaceStore!==void 0?{workspaceStore:e.workspaceStore}:{},...e.sessionLabel!==void 0?{sessionLabel:e.sessionLabel}:{}}),O=v4({...v,...e.workspaceStore!==void 0?{workspaceStore:e.workspaceStore}:{}}),W=RM({...T,pluginAgents:cX(void 0,I),warn:I}),q=T4(o,r,O,c,h,y,p,a,t,s,W,u,d,e.workspaceStore),K=new Ju({subagentManager:j,parentSession:n,surface:t,defaultConfig:{...R,...l!==void 0?{systemPrompt:l}:{},...S,...v,...x},defaultSubagentModel:s,childProviderFactory:O,childSkillExecutorFactory:q,...P,resolveApiKeyForModel:a,depth:0,maxDepth:$,...E,agentRegistry:W,inboundAttachmentRegistry:el,parentModel:o,...C,...e.workspaceStore!==void 0?{workspaceStore:e.workspaceStore}:{}}),H=new Vu({parentSession:n,surface:t,defaultModel:o,defaultSubagentModel:s,...R,childProviderFactory:O,childSkillExecutorFactory:q,agentRegistry:W,...P,...S,...v,...x,resolveApiKeyForModel:a,..._,...E,maxDepth:$,getReadScopeInputs:()=>j.getReadScopeInputs(),...e.workspaceStore!==void 0?{workspaceStore:e.workspaceStore}:{}}),Y=new Zk({parentSession:n,defaultModel:o,defaultSubagentModel:s,...R,resolveApiKeyForModel:a,getReadScopeInputs:()=>j.getReadScopeInputs(),...S,...v,...T,systemPrompt:l??"",surface:t,depth:0,maxDepth:$,...C,...e.workspaceStore!==void 0?{workspaceStore:e.workspaceStore}:{}});return{rootManager:j,subagentExecutor:K,skillExecutor:H,composeExecutor:Y}}Mr();nl();F();U();import{randomUUID as hFe}from"node:crypto";import{readFileSync as yFe,existsSync as bFe}from"node:fs";import{createHash as uFe}from"crypto";import{appendFileSync as dFe}from"fs";import{mkdir as pFe,open as mFe,writeFile as fFe}from"fs/promises";import{join as AQ}from"path";Sg();import{z as A}from"zod";import{z as pl}from"zod";var JO=pl.object({transition:pl.literal("cancelled"),jobId:pl.string(),subagentId:pl.string(),source:pl.enum(["explicit","cascade"]),cancelledBy:pl.literal("model").optional(),reason:pl.string().optional()});var HLe=A.object({phase:A.literal("started"),toolUseId:A.string(),name:A.string(),inputBytes:A.number().int().nonnegative(),argsFingerprint:A.string().regex(/^[0-9a-f]{64}$/).optional(),subagentId:A.string().optional()}),mQ=A.enum(m3),WLe=A.object({phase:A.literal("completed"),toolUseId:A.string(),name:A.string(),resultBytes:A.number().int().nonnegative(),isError:A.boolean(),truncated:A.boolean(),durationMs:A.number().nonnegative(),incomplete:A.boolean().optional(),incompleteReason:A.string().optional(),circuitBreaker:A.boolean().optional(),failureClass:mQ.optional(),batchIndex:A.number().int().positive().optional(),batchSize:A.number().int().positive().optional(),subagentId:A.string().optional()}),fQ=A.discriminatedUnion("phase",[HLe,WLe]),KLe=A.enum(["PreToolUse","PostToolUse","PostToolUseFailure","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),gQ=A.object({hookEvent:KLe,decision:A.union([A.literal("block"),A.literal("approve")]).optional(),reason:A.string().optional(),blockedTool:A.string().optional(),subagentId:A.string().optional(),injectedContextBytes:A.number().int().nonnegative().optional(),durationMs:A.number().nonnegative().optional(),approvalOutcome:A.enum(["carve-out","approved","denied","unrecognised","timeout","decline","cancel","hard-block"]).optional()}),GLe=A.object({transition:A.literal("started"),subagentId:A.string(),parentId:A.string(),model:A.string(),allowedTools:A.array(A.string()).readonly().optional(),systemPromptHash:A.string().optional(),promptHead:A.string().optional(),agentType:A.string().optional(),resolvedAgentType:A.string().optional()}),qLe=A.object({transition:A.literal("succeeded"),subagentId:A.string(),durationMs:A.number().nonnegative(),turnCount:A.number().int().nonnegative(),totalCostUsd:A.number().nonnegative().optional(),outputBytes:A.number().int().nonnegative(),stopReason:A.string().optional()}),zLe=A.object({transition:A.literal("failed"),subagentId:A.string(),errorClass:A.string(),errorMessage:A.string(),partialOutputBytes:A.number().int().nonnegative(),failureClass:mQ.optional()}),JLe=A.object({transition:A.literal("cancelled"),subagentId:A.string(),source:A.enum(["cascade","explicit"]),timeout:A.boolean().optional()}),hQ=A.discriminatedUnion("transition",[GLe,qLe,zLe,JLe]),VLe=A.object({transition:A.literal("started"),jobId:A.string(),subagentId:A.string(),label:A.string(),model:A.string()}),YLe=A.object({transition:A.literal("completed"),jobId:A.string(),subagentId:A.string(),durationMs:A.number().nonnegative(),outputBytes:A.number().int().nonnegative()}),XLe=A.object({transition:A.literal("failed"),jobId:A.string(),subagentId:A.string(),durationMs:A.number().nonnegative(),errorClass:A.string(),errorMessage:A.string()}),QLe=A.object({transition:A.literal("joined"),jobId:A.string(),subagentId:A.string(),jobStatus:A.enum(["completed","failed","cancelled"])}),ZLe=A.object({transition:A.literal("delivered"),jobId:A.string(),subagentId:A.string(),jobStatus:A.enum(["completed","failed","cancelled"])}),yQ=A.discriminatedUnion("transition",[VLe,YLe,XLe,JO,QLe,ZLe]),bQ=A.object({kind:A.literal("monetary"),runningCostUsd:A.number().nonnegative(),maxBudgetUsd:A.number().nonnegative(),lastTurnCostUsd:A.number().nonnegative()}),eFe=A.enum(["user_signal","cascade","timeout","budget","hook_block"]),wQ=A.object({origin:eFe,cascadedTo:A.array(A.string()).readonly(),reason:A.string().optional()}),SQ=A.enum(["manual","token_threshold","turn_count"]),tFe=A.object({path:A.string(),sizeBytes:A.number().int().nonnegative(),sha256:A.string().regex(/^[0-9a-f]{64}$/)}),nFe=A.object({trigger:SQ,preCompactionMessages:A.array(A.unknown()),summary:A.string(),keptTailCount:A.number().int().nonnegative(),keepLastNConfig:A.number().int().nonnegative(),messagesBefore:A.number().int().nonnegative(),messagesAfter:A.number().int().nonnegative(),tokensSavedEstimate:A.number().nonnegative().optional(),summarizationTokens:A.object({input:A.number().int().nonnegative(),output:A.number().int().nonnegative()}).optional()}),rFe=A.object({trigger:SQ,preCompactionMessagesRef:tFe,summary:A.string(),keptTailCount:A.number().int().nonnegative(),keepLastNConfig:A.number().int().nonnegative(),messagesBefore:A.number().int().nonnegative(),messagesAfter:A.number().int().nonnegative(),tokensSavedEstimate:A.number().nonnegative().optional(),summarizationTokens:A.object({input:A.number().int().nonnegative(),output:A.number().int().nonnegative()}).optional()}),oFe=A.enum(["model_end_turn","truncated","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),vQ=A.object({reason:oFe,finalTurnCount:A.number().int().nonnegative(),finalCostUsd:A.number().nonnegative(),finalTokens:A.object({input:A.number().int().nonnegative().optional(),output:A.number().int().nonnegative().optional(),cacheRead:A.number().int().nonnegative().optional(),cacheCreation:A.number().int().nonnegative().optional()}),lastStopReason:A.string().optional(),guidance:A.string().optional()}),kQ=A.object({source:A.string(),assertion:A.string(),evidence:A.array(A.string()).readonly(),confidence:A.number().min(0).max(1),dissent:A.string().optional()}),iFe=A.enum(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),sFe=A.enum(["click","fill","press","select","hover","scroll_to","wait_for"]),aFe=A.object({kind:A.enum(["semantic","element_id","selector"]),text:A.string().max(80).optional(),role:A.string().optional(),elementId:A.string().optional(),selectorHash:A.string().regex(/^[0-9a-f]{8}$/).optional()}),TQ=A.object({jobId:A.string(),subagentId:A.string(),byteLength:A.number().int().nonnegative()}),xQ=A.object({tool:iFe,action:sFe.optional(),toolUseId:A.string(),backend:A.enum(["playwright","agent-browser"]).optional(),backendReason:A.string().optional(),target:aFe.optional(),urlBefore:A.string().nullable(),urlAfter:A.string().nullable(),status:A.enum(["ok","error","ambiguous_target","blocked_by_policy"]),screenshotPath:A.string().optional(),observationSummary:A.string().max(500).optional(),error:A.object({reason:A.string(),recoverable:A.boolean()}).optional(),durationMs:A.number().nonnegative()}),lFe=A.enum(["bootstrap_start","bootstrap_done","session_init_start","session_init_done","mcp_connect_start","mcp_connect_done","mcp_server_start","mcp_server_done","loop_start","loop_end","model_ttfb","interrupt_halt","rate_limit","ttfb_timeout","usage_limit_pause","usage_limit_resume","overload_pause","overload_resume","idle_watchdog_fired","pause_extension_granted","suspected_loop","compaction_disabled","boot_warning"]),EQ=A.object({phase:lFe,durationMs:A.number().nonnegative().optional(),metadata:A.record(A.string(),A.union([A.string(),A.number(),A.boolean()])).optional(),model:A.string().optional(),resolvedModel:A.string().optional(),origin:A.enum(["cli","telegram","daemon","web","unknown"]).optional(),actor:A.enum(["main","subagent"]).optional()}),cFe=A.object({status:A.enum(["succeeded","failed","cancelled"]),finalCostUsd:A.number().nonnegative(),finalTurnCount:A.number().int().nonnegative(),closedAt:A.string().datetime(),incomplete:A.boolean().optional(),subagentCount:A.number().int().nonnegative().optional(),subagentTokens:A.object({input:A.number().int().nonnegative().optional(),output:A.number().int().nonnegative().optional(),cacheRead:A.number().int().nonnegative().optional(),cacheCreation:A.number().int().nonnegative().optional()}).optional(),subagentCostUsd:A.number().nonnegative().optional()}),RQ=A.discriminatedUnion("kind",[A.object({kind:A.literal("tool_call"),payload:fQ}),A.object({kind:A.literal("hook_decision"),payload:gQ}),A.object({kind:A.literal("subagent_lifecycle"),payload:hQ}),A.object({kind:A.literal("background_agent"),payload:yQ}),A.object({kind:A.literal("budget"),payload:bQ}),A.object({kind:A.literal("abort"),payload:wQ}),A.object({kind:A.literal("compaction"),payload:nFe}),A.object({kind:A.literal("closure"),payload:vQ}),A.object({kind:A.literal("claim"),payload:kQ}),A.object({kind:A.literal("browser_event"),payload:xQ}),A.object({kind:A.literal("queued_user_message"),payload:TQ}),A.object({kind:A.literal("session_phase"),payload:EQ})]),fT=A.discriminatedUnion("kind",[A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("tool_call"),payload:fQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("hook_decision"),payload:gQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("subagent_lifecycle"),payload:hQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("background_agent"),payload:yQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("budget"),payload:bQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("abort"),payload:wQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("compaction"),payload:rFe}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("closure"),payload:vQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("claim"),payload:kQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("browser_event"),payload:xQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("queued_user_message"),payload:TQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("session_phase"),payload:EQ}),A.object({ts:A.string().datetime(),seq:A.number().int().nonnegative(),kind:A.literal("session_sealed"),payload:cFe})]);var gT=new Set,CQ=!1;function gFe(){CQ||(CQ=!0,process.on("exit",()=>{for(let e of gT)e.sealOnProcessExit()}))}var hT=class{traceDir;tracePath;seq;sealed=!1;sealRecordPersisted=!1;fh=null;writeQueue=Promise.resolve();constructor(t){this.traceDir=t.traceDir,this.tracePath=AQ(this.traceDir,"trace.jsonl"),this.seq=t.startSeq??0}getTracePath(){return this.tracePath}async write(t){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return RQ.parse(t),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(t);await this.appendLine(n)})}async seal(t){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{if(await this.ensureOpen(),this.sealRecordPersisted)return;let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:t};await this.appendLine(n),this.sealRecordPersisted=!0,this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(t){let n=this.writeQueue.then(t,t);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await pFe(this.traceDir,{recursive:!0}),this.fh=await mFe(this.tracePath,"a"),gT.add(this),gFe())}async closeHandle(){if(gT.delete(this),!this.fh)return;let t=this.fh;this.fh=null,await t.close()}sealOnProcessExit(){if(this.sealRecordPersisted||this.seq===0)return;this.sealed=!0,gT.delete(this);try{let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:{status:"failed",finalCostUsd:0,finalTurnCount:0,closedAt:new Date().toISOString(),incomplete:!0}};dFe(this.tracePath,`${JSON.stringify(n)}
|
|
2016
2016
|
`),this.sealRecordPersisted=!0}catch{}let t=this.fh;this.fh=null,t&&t.close().catch(()=>{})}async appendLine(t){if(!this.fh)throw new Error("NdjsonTraceWriter: file handle missing");await this.fh.appendFile(`${JSON.stringify(t)}
|
|
2017
2017
|
`)}async materializePersistedEvent(t){let n=new Date().toISOString(),r=this.seq++;if(t.kind==="compaction"){let o=await this.persistCompactionSidecar(t.payload,r,n);return{ts:n,seq:r,kind:"compaction",payload:o}}return{ts:n,seq:r,kind:t.kind,payload:t.payload}}async persistCompactionSidecar(t,n,r){let o=r.replace(/[:.]/g,"-"),i=AQ(this.traceDir,`${String(n).padStart(6,"0")}-${o}-pre-compaction.json`),s=JSON.stringify(t.preCompactionMessages),a=Buffer.byteLength(s,"utf8"),l=uFe("sha256").update(s).digest("hex");await fFe(i,s,{encoding:"utf8",flag:"w"});let c={path:i,sizeBytes:a,sha256:l};return{trigger:t.trigger,preCompactionMessagesRef:c,summary:t.summary,keptTailCount:t.keptTailCount,keepLastNConfig:t.keepLastNConfig,messagesBefore:t.messagesBefore,messagesAfter:t.messagesAfter,...t.tokensSavedEstimate!==void 0?{tokensSavedEstimate:t.tokensSavedEstimate}:{},...t.summarizationTokens!==void 0?{summarizationTokens:t.summarizationTokens}:{}}}};function wFe(e){if(!bFe(e))return;let n=yFe(e,"utf8").split(`
|
|
@@ -2020,7 +2020,7 @@ ${o}`}}}return{...e,systemPrompt:o}}At();nt();Cc();kt();$n();cn();Jt();ja();Fi()
|
|
|
2020
2020
|
`),this.client=a,this.connected=!0,this.pendingAuthTransport=void 0;let l=await _T(this.client.listTools(),i,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${i}ms`),()=>a.close().catch(()=>{})),c=this.client.getServerVersion();return{tools:l.tools,serverInfo:c?{name:c.name,version:c.version}:void 0}}async listTools(){if(!this.client)throw new Error(`McpClient(${this.serverName}): not connected`);let t=this.config.timeout??i$;return(await _T(this.client.listTools(),t,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${t}ms`))).tools}async refreshTools(){return this.listTools()}async callTool(t,n,r){if(!this.client)return{content:`MCP server "${this.serverName}" is not connected`,isError:!0};if(r.aborted)return{content:"Tool call aborted",isError:!0};let o=this.config.timeout??i$,i;try{i=await this.client.callTool({name:t,arguments:n??{}},rNe,{signal:r,timeout:o})}catch(s){let a=s instanceof Error?s.message:String(s);return{content:`MCP tool "${this.serverName}.${t}" failed: ${a}`,isError:!0}}return oNe(i)}async finishAuth(t){if(!this.pendingAuthTransport)throw new Error(`McpClient(${this.serverName}): no pending OAuth transport \u2014 server is not in oauth_pending state`);await this.pendingAuthTransport.finishAuth(t)}async disconnect(){if(this.pendingAuthTransport=void 0,!this.client)return;let t=this.client;this.client=void 0,this.connected=!1;try{await t.close()}catch{}}},u9=5*1024*1024,d9=new Set(["image/png","image/jpeg","image/gif","image/webp"]);function oNe(e){let t=[],n;for(let o of e.content??[])if(o.type==="text")t.push(o.text);else if(o.type==="image"){let i=typeof o.mimeType=="string"?o.mimeType:"",s=typeof o.data=="string"?o.data:"";if(!i||!s)console.warn("[mcp] image block missing mimeType or data \u2014 using text placeholder"),t.push("[image block: malformed (missing mimeType or data)]");else if(!d9.has(i))console.warn(`[mcp] image block has unsupported mimeType "${i.replace(/[\r\n]/g,"\\n")}" \u2014 using text placeholder. Supported types: ${[...d9].join(", ")}`),t.push(`[image block: mimeType=${i}, ${s.length} bytes base64 (unsupported format)]`);else{let a=Math.ceil(s.length*3/4);if(a>u9)console.warn(`[mcp] image block "${i}" is ~${a} bytes decoded (base64 length ${s.length}), exceeds the ${u9}-byte limit \u2014 using text placeholder to avoid poisoning conversation history`),t.push(`[image block: mimeType=${i}, ${s.length} bytes base64 (too large for model context)]`);else if(n===void 0){let l=s.replace(/\s/g,"");n={mediaType:i,data:l},t.push(`[image: ${i}]`)}else t.push(`[image block: mimeType=${i}, ${s.length} bytes base64 (additional image not forwarded)]`)}}else if(o.type==="resource"){let i="resource"in o&&typeof o.resource=="object"?o.resource.uri??"(unknown)":"(unknown)";t.push(`[resource block: ${i}]`)}else t.push(`[unknown block: ${JSON.stringify(o)}]`);let r=t.join(`
|
|
2021
2021
|
`);return{content:r.length===0?"(empty tool result)":r,...n!==void 0?{image:n}:{},...e.isError?{isError:!0}:{}}}function iNe(e,t,n,r="user-global",o=[]){let i=t.type??(t.command?"stdio":"streamable-http");return{primary:ET(e,t,n,r,o),fallback:i==="streamable-http"?()=>ET(e,{...t,type:"sse"},n,r,o):null}}function sNe(e){return e instanceof p9&&(e.code===404||e.code===405)}function aNe(e){return e instanceof p9?e.code:void 0}function _T(e,t,n,r){let o=null,i=new Promise((s,a)=>{o=setTimeout(()=>{if(r!==void 0)try{let l=r();l&&typeof l.then=="function"&&l.catch(()=>{})}catch{}a(n())},t)});return Promise.race([e,i]).finally(()=>{o!==null&&clearTimeout(o)})}import{createHash as lNe}from"node:crypto";var m9="mcp__",f9="__",a$=64,cNe=6;function $g(e){if(e.length===0)return"_";let n=e.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_{2,}/g,"_");return n.length===0?"_":n}function uNe(e){return lNe("sha256").update(e).digest("hex").slice(0,cNe)}function g9(e,t){let n=$g(e),r=$g(t),o=`${m9}${n}${f9}${r}`;if(o.length<=a$)return o;let s=`${`${m9}${uNe(e)}${f9}`}${r}`;return s.length<=a$?s:s.slice(0,a$)}function Dg(e){let t=new Map,n=new Map;for(let{serverName:o,toolNames:i}of e)for(let s of i){let a=g9(o,s),l={serverName:o,originalToolName:s},c=t.get(a);if(c===void 0){t.set(a,l);continue}if(c.serverName===o&&c.originalToolName===s)continue;let u=n.get(a)??[c];u.push(l),n.set(a,u)}let r=[];for(let[o,i]of n)r.push({wireName:o,pairs:i});return{tools:t,conflicts:r}}fe();var pi=class e{records;nameRegistry;onToolsRefreshed;constructor(t){this.records=t;let n=[];for(let[o,i]of t)i.state.status==="connected"&&n.push({serverName:o,toolNames:i.tools.map(s=>s.name)});let r=Dg(n);if(r.conflicts.length>0){let o=r.conflicts.map(i=>{let s=i.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");return` ${i.wireName} \u2190 ${s}`});throw new Error(`MCP tool name conflicts (rename one of the servers in mcp.json):
|
|
2022
2022
|
${o.join(`
|
|
2023
|
-
`)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],i={manager:void 0};for(let[c,u]of Object.entries(t)){let d=$g(c);d!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${d}" for wire encoding`);let p=n.serverLayers?.[c]??"user-global",f=n.userAllowSecretEnv?.[c]??[];if(u.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:u,status:"disabled",toolCount:0},layer:p,trustedAllowSecretEnv:f});continue}let h={client:void 0,tools:[],state:{serverName:c,config:u,status:"connecting",toolCount:0},layer:p,trustedAllowSecretEnv:f};r.set(c,h);let y=new Id(c,u,p,f);h.client=y,y.onTransportError=S=>{h.state.status="error",h.state.error=PT(S.message,200),console.warn(`[mcp:${c}] transport error: ${S.message}`)},y.onToolListChanged=()=>{i.manager?.refreshServer(c).catch(S=>{let v=S instanceof Error?S.message:String(S);console.warn(`[mcp:${c}] refreshServer failed: ${v}`)})};let w=(async()=>{let S=Date.now();re(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let v="error",x=0;try{let{tools:T,serverInfo:E}=await y.connect();h.tools=T,h.state.status="connected",h.state.toolCount=T.length,h.state.lastListedAt=Date.now(),v="connected",x=T.length;let C=E?`${E.name}@${E.version}`:"unknown";console.log(`[mcp:${c}] connected (${C}) \u2014 ${T.length} tool(s)`)}catch(T){if(T instanceof s$){h.state.status="oauth_pending",v="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let E=T instanceof Error?T.message:String(T);if(h.state.status="error",h.state.error=PT(E,200),u.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${E}`);console.warn(`[mcp:${c}] connect failed: ${E}`)}finally{re(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-S,metadata:{server:c,status:v,toolCount:x}})}})();o.push(w)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return i.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let i=this.records.get(r);if(!i||i.state.status!=="connected")continue;let s=i.tools.find(a=>a.name===o);s&&t.push(dNe(n,s))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let i=this.records.get(r);!i||i.state.status!=="connected"||t.set(n,async(s,a)=>i.client?i.client.callTool(o,s,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[i,s]of this.nameRegistry)s.serverName===t&&this.nameRegistry.delete(i);let o=Dg([{serverName:t,toolNames:r.map(i=>i.name)}]);if(o.conflicts.length>0)for(let i of o.conflicts){let s=i.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${i.wireName} \u2190 ${s}`)}for(let[i,s]of o.tools)this.nameRegistry.set(i,s);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(s=>{let a=s instanceof Error?s.message:String(s);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new Id(t,r.state.config,r.layer,r.trustedAllowSecretEnv);o.onTransportError=s=>{r.state.status="error",r.state.error=PT(s.message,200),console.warn(`[mcp:${t}] transport error: ${s.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(s=>{let a=s instanceof Error?s.message:String(s);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:s,serverInfo:a}=await o.connect();r.tools=s,r.state.status="connected",r.state.toolCount=s.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${s.length} tool(s)`)}catch(s){let a=s instanceof Error?s.message:String(s);throw r.state.status="error",r.state.error=PT(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[s,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(s);let i=Dg([{serverName:t,toolNames:r.tools.map(s=>s.name)}]);for(let[s,a]of i.tools)this.nameRegistry.set(s,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let i=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${i}`)}));await Promise.all(t)}};function dNe(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function PT(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}F();U();We();import{existsSync as Md,lstatSync as pNe,readFileSync as mNe,readdirSync as fNe,realpathSync as h9}from"node:fs";import{isAbsolute as gNe,join as Lg,relative as hNe}from"node:path";function yl(){return Lg(zn(),"mcp.json")}function b9(e=process.cwd()){let t=Lg(e,".mcp.json");if(!Md(t))return t;try{let n=h9(e),r=h9(t),o=hNe(n,r);return o.startsWith("..")||gNe(o)?null:t}catch{return null}}var yNe=5;function l$(e=Ze()){if(!Md(e))return[];let t=[];return w9(e,e,0,t,new Set),t}function w9(e,t,n,r,o){if(n>yNe||o.has(t))return;o.add(t);let i=Lg(t,".claude-plugin","plugin.json");if(Md(i)){let a=Lg(t,".claude-plugin","mcp.json");Md(a)&&r.push(a);return}let s;try{s=fNe(t)}catch{return}for(let a of s){if(a.startsWith("."))continue;let l=Lg(t,a),c;try{c=pNe(l)}catch{continue}c.isDirectory()&&w9(e,l,n+1,r,o)}}function bNe(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(i=>typeof i=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let i={};for(let[s,a]of Object.entries(n.env))typeof a=="string"&&(i[s]=a);o.env=i}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let i={};for(let[s,a]of Object.entries(n.headers))typeof a=="string"&&(i[s]=a);o.headers=i}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),Array.isArray(n.allowSecretEnv)&&(o.allowSecretEnv=n.allowSecretEnv.filter(i=>typeof i=="string")),{ok:!0,config:o}}function hl(e){if(!Md(e))return{mcpServers:{},sources:[],warnings:[],serverLayers:{},userAllowSecretEnv:{}};let t=[],n;try{n=JSON.parse(mNe(e,"utf-8"))}catch(s){let a=s instanceof Error?s.message:String(s);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}};let i={};for(let[s,a]of Object.entries(o)){let l=bNe(s,a);l.ok?i[s]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:i,sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}}}function wNe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function y9(e,t){let n=ae(e);return n.length>t?n.slice(0,t)+"\u2026":n}function bl(e={}){let t=[],n=[];if(e.importedMcpConfigs&&e.importedMcpConfigs.length>0)for(let c of e.importedMcpConfigs)t.push({path:c,loaded:hl(c),layer:"user-global"});if(e.pluginsRoot!==null){let c=e.pluginsRoot,u=c?l$(c):l$();for(let d of u)t.push({path:d,loaded:hl(d),layer:"plugin"})}if(!e.skipUserGlobal){let c=yl();t.push({path:c,loaded:hl(c),layer:"user-global"})}if(!e.skipProjectLocal){let c=b9(e.cwd);if(c===null)n.push("mcp: refusing to load project-local .mcp.json \u2014 it resolves outside the working directory (symlink or path traversal).");else if(Md(c))if(wNe(k.AFK_ALLOW_PROJECT_MCP))t.push({path:c,loaded:hl(c),layer:"project"}),n.push(`mcp: loaded project-local config from ${c} (AFK_ALLOW_PROJECT_MCP is set).`);else{let u=hl(c),d=Object.entries(u.mcpServers);if(d.length>0){let p=d.map(([f,g])=>{let h=g.command?[g.command,...g.args??[]].join(" "):g.url??"(no transport)";return`${y9(f,64)} \u2192 ${y9(h,160)}`}).join("; ");n.push(`mcp: skipped ${d.length} project-local server(s) from ${c} \u2014 not spawned: [${p}]. Set AFK_ALLOW_PROJECT_MCP=1 to load ${d.length===1?"it":`these ${d.length}`} if you trust this directory.`)}}}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:hl(e.cliOverride),layer:"cli"});let r=new Map,o=[...n],i=[];for(let{path:c,loaded:u,layer:d}of t){for(let p of u.warnings)o.push(p);if(u.sources.length>0)for(let p of u.sources)i.includes(p)||i.push(p);for(let[p,f]of Object.entries(u.mcpServers)){let g=r.get(p);g&&o.push(`mcp: server "${p}" defined in ${g.source} is overridden by ${c}`),r.set(p,{config:f,source:c,layer:d})}}let s={},a={},l={};for(let[c,u]of r)s[c]=u.config,a[c]=u.layer,u.layer!=="project"&&u.config.allowSecretEnv&&u.config.allowSecretEnv.length>0&&(l[c]=u.config.allowSecretEnv);return{mcpServers:s,sources:i,warnings:o,serverLayers:a,userAllowSecretEnv:l}}CT();function Od(e,t){return t instanceof Date?t.toISOString():t instanceof Error?{message:t.message,name:t.name}:t}qo();fe();lO();function S9(e){sO(!0)&&Promise.resolve().then(()=>{try{let t=oO({sessionId:e});for(let n of t.offers)process.stderr.write(iO(n)+`
|
|
2023
|
+
`)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],i={manager:void 0};for(let[c,u]of Object.entries(t)){let d=$g(c);d!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${d}" for wire encoding`);let p=n.serverLayers?.[c]??"user-global",f=n.userAllowSecretEnv?.[c]??[];if(u.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:u,status:"disabled",toolCount:0},layer:p,trustedAllowSecretEnv:f});continue}let h={client:void 0,tools:[],state:{serverName:c,config:u,status:"connecting",toolCount:0},layer:p,trustedAllowSecretEnv:f};r.set(c,h);let y=new Id(c,u,p,f);h.client=y,y.onTransportError=S=>{h.state.status="error",h.state.error=PT(S.message,200),console.warn(`[mcp:${c}] transport error: ${S.message}`)},y.onToolListChanged=()=>{i.manager?.refreshServer(c).catch(S=>{let v=S instanceof Error?S.message:String(S);console.warn(`[mcp:${c}] refreshServer failed: ${v}`)})};let w=(async()=>{let S=Date.now();re(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let v="error",x=0;try{let{tools:T,serverInfo:E}=await y.connect();h.tools=T,h.state.status="connected",h.state.toolCount=T.length,h.state.lastListedAt=Date.now(),v="connected",x=T.length;let C=E?`${E.name}@${E.version}`:"unknown";console.log(`[mcp:${c}] connected (${C}) \u2014 ${T.length} tool(s)`)}catch(T){if(T instanceof s$){h.state.status="oauth_pending",v="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let E=T instanceof Error?T.message:String(T);if(h.state.status="error",h.state.error=PT(E,200),u.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${E}`);console.warn(`[mcp:${c}] connect failed: ${E}`)}finally{re(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-S,metadata:{server:c,status:v,toolCount:x}})}})();o.push(w)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return i.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let i=this.records.get(r);if(!i||i.state.status!=="connected")continue;let s=i.tools.find(a=>a.name===o);s&&t.push(dNe(n,s))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let i=this.records.get(r);!i||i.state.status!=="connected"||t.set(n,async(s,a)=>i.client?i.client.callTool(o,s,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[i,s]of this.nameRegistry)s.serverName===t&&this.nameRegistry.delete(i);let o=Dg([{serverName:t,toolNames:r.map(i=>i.name)}]);if(o.conflicts.length>0)for(let i of o.conflicts){let s=i.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${i.wireName} \u2190 ${s}`)}for(let[i,s]of o.tools)this.nameRegistry.set(i,s);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(s=>{let a=s instanceof Error?s.message:String(s);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new Id(t,r.state.config,r.layer,r.trustedAllowSecretEnv);o.onTransportError=s=>{r.state.status="error",r.state.error=PT(s.message,200),console.warn(`[mcp:${t}] transport error: ${s.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(s=>{let a=s instanceof Error?s.message:String(s);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:s,serverInfo:a}=await o.connect();r.tools=s,r.state.status="connected",r.state.toolCount=s.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${s.length} tool(s)`)}catch(s){let a=s instanceof Error?s.message:String(s);throw r.state.status="error",r.state.error=PT(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[s,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(s);let i=Dg([{serverName:t,toolNames:r.tools.map(s=>s.name)}]);for(let[s,a]of i.tools)this.nameRegistry.set(s,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let i=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${i}`)}));await Promise.all(t)}};function dNe(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function PT(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}F();U();We();import{existsSync as Md,lstatSync as pNe,readFileSync as mNe,readdirSync as fNe,realpathSync as h9}from"node:fs";import{isAbsolute as gNe,join as Lg,relative as hNe}from"node:path";function yl(){return Lg(zn(),"mcp.json")}function b9(e=process.cwd()){let t=Lg(e,".mcp.json");if(!Md(t))return t;try{let n=h9(e),r=h9(t),o=hNe(n,r);return o.startsWith("..")||gNe(o)?null:t}catch{return null}}var yNe=5;function l$(e=Ze()){if(!Md(e))return[];let t=[];return w9(e,e,0,t,new Set),t}function w9(e,t,n,r,o){if(n>yNe||o.has(t))return;o.add(t);let i=Lg(t,".claude-plugin","plugin.json");if(Md(i)){let a=Lg(t,".claude-plugin","mcp.json");Md(a)&&r.push(a);return}let s;try{s=fNe(t)}catch{return}for(let a of s){if(a.startsWith("."))continue;let l=Lg(t,a),c;try{c=pNe(l)}catch{continue}c.isDirectory()&&w9(e,l,n+1,r,o)}}function bNe(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(i=>typeof i=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let i={};for(let[s,a]of Object.entries(n.env))typeof a=="string"&&(i[s]=a);o.env=i}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let i={};for(let[s,a]of Object.entries(n.headers))typeof a=="string"&&(i[s]=a);o.headers=i}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),Array.isArray(n.allowSecretEnv)&&(o.allowSecretEnv=n.allowSecretEnv.filter(i=>typeof i=="string")),{ok:!0,config:o}}function hl(e){if(!Md(e))return{mcpServers:{},sources:[],warnings:[],serverLayers:{},userAllowSecretEnv:{}};let t=[],n;try{n=JSON.parse(mNe(e,"utf-8"))}catch(s){let a=s instanceof Error?s.message:String(s);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}};let i={};for(let[s,a]of Object.entries(o)){let l=bNe(s,a);l.ok?i[s]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:i,sources:[e],warnings:t,serverLayers:{},userAllowSecretEnv:{}}}function wNe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function y9(e,t){let n=le(e);return n.length>t?n.slice(0,t)+"\u2026":n}function bl(e={}){let t=[],n=[];if(e.importedMcpConfigs&&e.importedMcpConfigs.length>0)for(let c of e.importedMcpConfigs)t.push({path:c,loaded:hl(c),layer:"user-global"});if(e.pluginsRoot!==null){let c=e.pluginsRoot,u=c?l$(c):l$();for(let d of u)t.push({path:d,loaded:hl(d),layer:"plugin"})}if(!e.skipUserGlobal){let c=yl();t.push({path:c,loaded:hl(c),layer:"user-global"})}if(!e.skipProjectLocal){let c=b9(e.cwd);if(c===null)n.push("mcp: refusing to load project-local .mcp.json \u2014 it resolves outside the working directory (symlink or path traversal).");else if(Md(c))if(wNe(k.AFK_ALLOW_PROJECT_MCP))t.push({path:c,loaded:hl(c),layer:"project"}),n.push(`mcp: loaded project-local config from ${c} (AFK_ALLOW_PROJECT_MCP is set).`);else{let u=hl(c),d=Object.entries(u.mcpServers);if(d.length>0){let p=d.map(([f,g])=>{let h=g.command?[g.command,...g.args??[]].join(" "):g.url??"(no transport)";return`${y9(f,64)} \u2192 ${y9(h,160)}`}).join("; ");n.push(`mcp: skipped ${d.length} project-local server(s) from ${c} \u2014 not spawned: [${p}]. Set AFK_ALLOW_PROJECT_MCP=1 to load ${d.length===1?"it":`these ${d.length}`} if you trust this directory.`)}}}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:hl(e.cliOverride),layer:"cli"});let r=new Map,o=[...n],i=[];for(let{path:c,loaded:u,layer:d}of t){for(let p of u.warnings)o.push(p);if(u.sources.length>0)for(let p of u.sources)i.includes(p)||i.push(p);for(let[p,f]of Object.entries(u.mcpServers)){let g=r.get(p);g&&o.push(`mcp: server "${p}" defined in ${g.source} is overridden by ${c}`),r.set(p,{config:f,source:c,layer:d})}}let s={},a={},l={};for(let[c,u]of r)s[c]=u.config,a[c]=u.layer,u.layer!=="project"&&u.config.allowSecretEnv&&u.config.allowSecretEnv.length>0&&(l[c]=u.config.allowSecretEnv);return{mcpServers:s,sources:i,warnings:o,serverLayers:a,userAllowSecretEnv:l}}CT();function Od(e,t){return t instanceof Date?t.toISOString():t instanceof Error?{message:t.message,name:t.name}:t}qo();fe();lO();function S9(e){sO(!0)&&Promise.resolve().then(()=>{try{let t=oO({sessionId:e});for(let n of t.offers)process.stderr.write(iO(n)+`
|
|
2024
2024
|
`),aO(n.manifest)}catch{}})}function IT(e){sO(!1)&&Promise.resolve().then(()=>{try{let t=oO({sessionId:e});for(let n of t.offers)process.stderr.write(iO(n)+`
|
|
2025
2025
|
`),aO(n.manifest)}catch{}})}function kNe(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}var v9=10*1024*1024;function k9(){return new Promise((e,t)=>{let n=[],r=0;if(process.stdin.readableEnded){e("");return}let o=i=>{if(r+=i.length,r>v9){process.stdin.destroy(new Error(`stdin exceeds ${v9}-byte limit`));return}n.push(i)};process.stdin.on("data",o),process.stdin.once("end",()=>{process.stdin.removeListener("data",o),e(Buffer.concat(n).toString("utf-8").replace(/\n+$/,""))}),process.stdin.once("error",i=>{process.stdin.removeListener("data",o),t(i)}),process.stdin.resume()})}function T9(e,t){return new Promise((n,r)=>{let o=e.write(t,i=>{i?r(i):o&&n()});if(!o){let i=()=>{e.removeListener("error",s),n()},s=a=>{e.removeListener("drain",i),r(a)};e.once("drain",i),e.once("error",s)}})}function E9(e){e.command("chat").description("Send a message to the agent").argument("[message]","Message to send; use `-` or omit to read from stdin").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.",ut()).option("-s, --stream","[no-op] reserved; use --format stream-json for headless streaming",!1).option("-f, --format <format>","Output format (text|json|stream-json)","text").option("--max-turns <number>","Maximum conversation turns","10").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'max' | 'enabled:<N>'","enabled:max").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--theme <mode>","TUI color palette: dark|light|umber|auto. Default dark. umber matches the Umber terminal (dark-only). Also: AFK_THEME env, or theme in afk.config.json.",Oy).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|openai-compatible|xai|xai-oauth. 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"').option("-w, --worktree [branch]","Create a git worktree for an isolated one-shot. 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. Mirrors `afk interactive -w`.").option("--worktree-base <ref>","Base git ref for the worktree created by --worktree. Default: the remote's default branch (origin/main), fetched fresh. Pass HEAD to base on your local checkout instead. Also: AFK_WORKTREE_BASE.").option("--mcp-config <path>","Path to an additional MCP config file (highest priority \u2014 merges over ~/.afk/config/mcp.json, project-local .mcp.json, and plugin-contributed configs). File format identical to mcp.json.").option("--resume <id>","Resume a persisted session by id").option("--continue","Continue the most recent persisted session in cwd").option("--session-id <uuid>","Assign a specific UUID to this session (creates new; errors if already exists)").option("--post <targets>","Headless publish of the final assistant message: github, telegram, or github,telegram").option("--post-pr <ref>","PR number, URL, or branch for --post github (defaults to the current-branch PR)").option("--dangerously-skip-permissions","Force bypass mode (already the default for new installs): skip path-approval prompts; read/write ANY path with no confirmation (permissionMode=bypassPermissions). Disable persistently with `afk config set permissionMode default`. Does not affect ask_question.").action(async(t,n)=>{if(n.resume&&n.continue){process.stderr.write(`Error: --resume and --continue are mutually exclusive
|
|
2026
2026
|
`),process.exitCode=1;return}if(n.sessionId!==void 0&&(n.resume||n.continue)){process.stderr.write(`Error: --session-id is mutually exclusive with --resume and --continue
|
|
@@ -2032,8 +2032,8 @@ ${o.join(`
|
|
|
2032
2032
|
`),process.exitCode=1;return}if(o.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
|
|
2033
2033
|
`),process.exitCode=1;return}let s=SNe("Initializing agent...").start(),a=null,l,c,u,d,p,f,g=!1,h,y=ST(n.model),w=!1,S;try{if(n.worktree!==void 0)try{d=await uw(n.worktree,n.worktreeBase!==void 0?{baseRef:n.worktreeBase}:void 0),p=d.path,s.text=`Worktree ready at ${d.path} (branch: ${d.branch})`}catch(ye){s.fail("Failed to create worktree"),J(ye)}let v,x,T,E,C,_,R;try{v=ks(n.thinking)??bd(),x=Ts(n.effort)??wd(),T=Sd(n.maxBudgetUsd)??LO(),E=Sd(n.taskBudget)??FO(),C=vd(n.maxOutputTokens)??xg(),_=kd(),R=void 0}catch(ye){s.fail("Invalid options"),J(ye)}if(n.dumpPrompt!==void 0){let ye=n.dumpPrompt===!0?MT.join(x9.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=ye,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 P=hd(n.provider),I=tn(ut(),P),{prompt:$,source:j}=Tn(),O=ot();zr(Jr($y(n.theme,O.theme)));let W=O.autoRouting?.chat??!1,q=Td($,W,"one-shot"),K={},H=Cd({resume:n.resume,continue:n.continue});if(n.resume&&H&&!H.stored){s.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
|
|
2034
2034
|
Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
2035
|
-
`),process.exitCode=1;return}H&&(K=fl(H),g=!0,h=H.id),n.sessionId!==void 0&&(K={sessionId:n.sessionId},g=!0,h=n.sessionId);let Y=H?.stored?.model??n.model,
|
|
2036
|
-
`)}let Gn=f?.getMcpToolWireNames()??[];R=cl(n.provider,{subagentExecutor:ee,skillExecutor:$e,composeExecutor:De,memoryStore:l,stateStore:u,model:String(n.model),...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{},...f!==void 0?{mcpManager:f}:{}})??new ct({permissions:{allowedTools:aT(Gn)},subagentExecutor:ee,skillExecutor:$e,composeExecutor:De,memoryStore:l,stateStore:u,surface:"cli",...f!==void 0?{mcpManager:f}:{}}),await td(),a=new Ut(li(Xo({model:Y,surface:"cli",drainSubagents:ye=>
|
|
2035
|
+
`),process.exitCode=1;return}H&&(K=fl(H),g=!0,h=H.id),n.sessionId!==void 0&&(K={sessionId:n.sessionId},g=!0,h=n.sessionId);let Y=H?.stored?.model??n.model,ie=Mc(Y);if(ie)throw new Error(ie);y.model=Y,H?.stored&&(y.totalTurns=H.stored.totalTurns,y.totalCostUsd=H.stored.totalCostUsd,y.totalTokens=H.stored.totalTokens,y.totalDurationMs=H.stored.totalDurationMs,y.turns=[...H.stored.turns],y.sessionId=H.stored.sessionId??H.resumeId,y.sessionStartTime=H.stored.startedAt??Date.now()),n.sessionId!==void 0&&(y.sessionId=n.sessionId);let M,N=Ro();S=N?.tracePath;let Q={get sessionId(){return M?.sessionId},getInputStreamRef(){return M?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return M?.abortSignal??new AbortController().signal},get hookRegistry(){return M?.hookRegistry}},{rootManager:se,subagentExecutor:ee,skillExecutor:$e,composeExecutor:De}=Ed({surface:"cli",parentSession:Q,apiKey:I,model:n.model,managerParentModel:ut(),defaultSubagentModel:yd(n.model),resolveApiKeyForModel:tn,...$!==void 0?{systemPrompt:$}:{},...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{},...p!==void 0?{cwd:p,nestedCwd:p}:{},...N?.writer!==void 0?{traceWriter:N.writer,skillTraceWriter:N.writer}:{},...k.AFK_WORKSPACE_DISABLED!=="1"?{workspaceStore:c=new Ho}:{}});l=new Nt,u=new Sn(Mn());{let ye=p??process.cwd(),gt=Ar(Dn()).mcpConfigs.filter(br=>br.format==="json").map(br=>br.source),Ue=bl({cwd:ye,...gt.length>0?{importedMcpConfigs:gt}:{},...n.mcpConfig!==void 0?{cliOverride:n.mcpConfig}:{}}),Pe=Object.values(Ue.mcpServers).filter(br=>!br.disabled).length;if(Pe>0){let br=Date.now();re(N?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Pe}});try{f=await pi.fromConfig(Ue.mcpServers,{warnings:Ue.warnings,serverLayers:Ue.serverLayers,userAllowSecretEnv:Ue.userAllowSecretEnv,...N?.writer!==void 0?{traceWriter:N.writer}:{}})}finally{re(N?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-br,metadata:{serverCount:Pe}})}}else if(Ue.warnings.length>0)for(let br of Ue.warnings)process.stderr.write(`[mcp] ${br}
|
|
2036
|
+
`)}let Gn=f?.getMcpToolWireNames()??[];R=cl(n.provider,{subagentExecutor:ee,skillExecutor:$e,composeExecutor:De,memoryStore:l,stateStore:u,model:String(n.model),...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{},...f!==void 0?{mcpManager:f}:{}})??new ct({permissions:{allowedTools:aT(Gn)},subagentExecutor:ee,skillExecutor:$e,composeExecutor:De,memoryStore:l,stateStore:u,surface:"cli",...f!==void 0?{mcpManager:f}:{}}),await td(),a=new Ut(li(Xo({model:Y,surface:"cli",drainSubagents:ye=>se.abortAllAndDrain("session_end","user_signal",void 0,ye==="reset"),apiKey:tn(Y,P),maxTurns:parseInt(n.maxTurns,10),isNonInteractive:!0,...n.dangerouslySkipPermissions?{permissionMode:"bypassPermissions"}:O.permissionMode!==void 0?{permissionMode:O.permissionMode}:{},hookRegistry:Ss(ye=>{console.log(zO(ye))},"cli",l,void 0,gd({cwd:p}),{cwd:p,...N?.writer!==void 0?{traceWriter:N.writer}:{}}).registry,...q!==void 0?{systemPrompt:q}:{},...j!==void 0?{systemPromptSource:j}:{},...v!==void 0?{thinking:v}:{},...x!==void 0?{effort:x}:{},...O.temperature!==void 0?{temperature:O.temperature}:{},...T!==void 0?{maxBudgetUsd:T}:{},...E!==void 0?{taskBudget:E}:{},...C!==void 0?{maxOutputTokens:C}:{},..._!==void 0?{maxToolUseIterations:_}:{},...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...N?{traceWriter:N.writer}:{},...O.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:O.autoResumeOnUsageLimit}:{},...p!==void 0?{cwd:p}:{},...K,provider:R})),N?.writer),M=a,IT(M?.sessionId??"");let Je=a;se.setOnSubagentSucceeded((ye,gt)=>{Je.recordSubagentCompletion(ye,gt)}),De.setOnSubagentSucceeded((ye,gt)=>{Je.recordSubagentCompletion(ye,gt)}),s.text="Sending message...";let qn=async(ye,gt)=>{if(r.length===0||gt)return;let Ue={line:Pe=>{process.stderr.write(`${Pe??""}
|
|
2037
2037
|
`)},raw:Pe=>{process.stderr.write(Pe)},success:Pe=>{process.stderr.write(`\u2714 ${Pe}
|
|
2038
2038
|
`)},info:Pe=>{process.stderr.write(`\u2139 ${Pe}
|
|
2039
2039
|
`)},warn:Pe=>{process.stderr.write(`\u26A0 ${Pe}
|
|
@@ -2054,7 +2054,7 @@ ${dt(s)}
|
|
|
2054
2054
|
(a) run the relevant verification command and cite the result; or
|
|
2055
2055
|
(b) if the work is not actually complete, correct the terminal state to Blocked or Asking with the accurate status.
|
|
2056
2056
|
Do not simply re-assert Done.`;function pne(e){let t=e.maxInjectionsPerSession??b1e,n=0;return r=>r.event!=="Stop"?{}:e.isEnabled()?e.getPermissionMode()!=="autonomous"?{}:r.terminalState!=="done"?{}:r.doneEvidenceClassification!=="unverified"?{}:n>=t?(B(`[terminal-state gate] injection budget exhausted (cap=${t}); letting unbacked Done stand (fail open)`,{sessionId:r.sessionId}),{}):(n+=1,B(`[terminal-state gate] injecting Done-evidence correction (${n}/${t})`,{sessionId:r.sessionId}),{injectContext:w1e}):{}}It();function mne(e){let t=Ss(o=>{pQ(e.completionWriter,o)},"cli",e.memoryStore,()=>e.stats.permissionMode,gd({cwd:e.effectiveCwd}),{cwd:e.effectiveCwd,...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{}},()=>e.effectiveCwd??process.cwd()),n=t.registry,r=t.addPreviewDiffRef;return n.register("Stop",pne({getPermissionMode:()=>e.stats.permissionMode,isEnabled:()=>ot().enforceDoneEvidence===!0})),{hookRegistry:n,addPreviewDiffRef:r}}Po();Xn();Ge();function fne(e){let t={session:e.sessionRef,stats:e.stats,out:e.writer,ui:{clearScreen:()=>{let n=t.getCompositor?.();n?.setOverlay(""),n?.resetCommittedBand(),e.statusLine.stop(),e.contextSampler.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),e.statusLine.start(),e.statusLine.repaint(fr(e.stats,e.contextSampler,e.gitStatusSampler,e.maxTurns))},repaintStatusLine:()=>e.statusLine.repaint(fr(e.stats,e.contextSampler,e.gitStatusSampler,e.maxTurns))},ledger:e.ledger,fastMode:e.fastModeController,getFastModeContext:()=>{let n=String(e.stats.model);return{resolvedModelId:Lt(e.stats.model)??n,providerFamily:oe(n,{...e.explicitProvider?{explicit:e.explicitProvider}:{},...e.openaiBaseUrl?{openaiBaseUrl:e.openaiBaseUrl}:{}}),hasCustomEndpoint:e.anthropicBaseUrl!==void 0,executionPath:"top-level"}},...e.mcpManager!==void 0?{mcpManager:e.mcpManager}:{}};return t}ar();import*as Cne from"node:readline";me();mi();lp();L();var Ds={action:"decline"},ce={action:"cancel"},gne={action:"accept"};me();lp();L();var cE=64,lE=256,aE=20,uE=new Set(["__proto__","constructor","prototype"]);function hne(e){let t=e.properties,n={},r=0,o=!1;if(typeof t=="object"&&t!==null){let a=0;for(let[l,c]of Object.entries(t))if(!uE.has(l)){if(r+=1,a>=cE){o=!0;continue}n[l]=c,a+=1}}let i=e.required,s=new Set(Array.isArray(i)?i.slice(0,cE*2).filter(a=>typeof a=="string").filter(a=>!uE.has(a)):[]);return{properties:n,required:s,fieldsTruncated:o,originalFieldCount:r}}function yne(e,t){e.line(),e.line(m.warning("\u26A0 MCP form elicitation")),e.line(m.dim(" server: ")+m.bold(Se(t.serverName,64))),e.line(m.dim(" message: ")+Se(t.message,256)),t.elicitationId&&e.line(m.dim(" id: ")+Se(t.elicitationId,64)),e.line(m.dim(" Type :decline or :cancel at any prompt to exit.")),e.line()}var nL="\u2014 skip (optional) \u2014";function v1e(e,t){let n=new Set(t),r=new Map;for(let i of e)r.set(i,(r.get(i)??0)+1);let o=[];for(let i of e){let s=(r.get(i)??0)>1||n.has(i),a=i;if(s){let l=0;do l+=1,a=`${i} (${l})`;while(n.has(a))}n.add(a),o.push(a)}return o}async function k1e(e,t,n,r,o,i,s){let a,l;if(e.enum!==void 0){let f=e.enum.slice(0,lE),g=f.map(h=>Se(String(h),64));a=v1e(g,t?[]:[nL]),l=h=>{let y=a.indexOf(h);return y>=0?f[y]:h}}else a=["Yes","No"],l=f=>f==="Yes";let c=t?a:[...a,nL],u=[m.bold(" ? "+n),""],d;try{d=await o({header:u,options:c,multi:!1,signal:s})}catch(f){return B("[elicitation] form pickFromList failed:",f),{tag:"cancel"}}if(s.aborted)return{tag:"cancel"};if(d===null)return{tag:"cancel"};let p=d[0];return p===void 0?{tag:"cancel"}:!t&&p===nL?{tag:"value",value:e.default}:(i.line(m.dim(" \u2713 ")+m.brand(`${r}: ${Se(p,128)}`)),{tag:"value",value:l(p)})}async function bne(e,t,n,r,o,i,s){if(i.aborted)return{tag:"cancel"};let a=Se(t.description??t.title??e),l=Se(t.type??"string",32),c=Se(e,64);if(s&&(t.enum!==void 0||l==="boolean"))return k1e(t,n,a,c,s,o,i);let u;if(t.enum!==void 0){let p=t.enum.slice(0,aE).map(g=>Se(String(g),32)).join("|"),f=t.enum.length>aE?"|\u2026":"";u=` (enum: ${p}${f})`}else l==="boolean"?u=" (boolean: y/n)":l==="number"||l==="integer"?u=` (${l})`:l==="string"?u=" (string)":(u=` (${l} \u2014 treated as string)`,o.line(m.warning(` \u26A0 Unknown field type '${l}' for '${c}' \u2014 collecting as string.`)));let d=n?"":m.dim(" [optional, enter to skip]");for(o.line(m.dim(` [${c}]`)+m.dim(` ${a}`)+m.dim(u)+d),t.enum!==void 0&&t.enum.length>lE&&o.line(m.warning(` \u26A0 Field '${c}' has ${t.enum.length} enum values; only the first ${lE} are valid for input.`));;){let p;try{p=await r(m.dim(" > "))}catch(h){return B("[elicitation] form readLine failed:",h),{tag:"cancel"}}if(i.aborted)return{tag:"cancel"};let f=p.trim();if(f===":cancel")return{tag:"cancel"};if(f===":decline")return{tag:"decline"};if(f===""){if(n){o.line(m.warning(" (required \u2014 cannot be skipped)"));continue}return{tag:"value",value:t.default}}let g;if(l==="boolean"){let h=f.toLowerCase();if(h==="y"||h==="yes"||h==="true"||h==="1")g=!0;else if(h==="n"||h==="no"||h==="false"||h==="0")g=!1;else{o.line(m.warning(" Invalid boolean \u2014 enter y/yes/true/1 or n/no/false/0."));continue}}else if(l==="number"){let h=Number(f);if(!isFinite(h)){o.line(m.warning(" Invalid number \u2014 enter a numeric value."));continue}g=h}else if(l==="integer"){let h=parseInt(f,10);if(!isFinite(h)||String(h)!==f.replace(/\.0+$/,"")){o.line(m.warning(" Invalid integer \u2014 enter a whole number."));continue}g=h}else g=f;if(t.enum!==void 0){let h=t.enum.slice(0,lE),y=!1;for(let w of h)if(String(w)===String(g)){y=!0;break}if(!y){let w=Se(String(g),64),S=h.slice(0,aE).map(x=>Se(String(x),32)).join(", "),v=h.length>aE?", \u2026":"";o.line(m.warning(` '${w}' is not a valid choice. Valid: ${S}${v}`));continue}}return{tag:"value",value:g}}}lp();L();function wne(e,t){e.line(),e.line(m.warning("\u26A0 MCP elicitation")),e.line(m.dim(" server: ")+m.bold(Se(t.serverName,64))),e.line(m.dim(" message: ")+Se(t.message,256)),t.url&&e.line(m.dim(" url: ")+m.brand(Se(t.url,512))),t.elicitationId&&e.line(m.dim(" id: ")+Se(t.elicitationId,64)),e.line()}me();rL();lp();L();function oL(e,t){if(e==="")return t.allowSkip?{ok:!0,skip:!0}:{ok:!1,error:t.emptyError};let n=Number(e);return Number.isFinite(n)?t.min!==void 0&&n<t.min?{ok:!1,error:`Value must be \u2265 ${t.min}.`}:t.max!==void 0&&n>t.max?{ok:!1,error:`Value must be \u2264 ${t.max}.`}:{ok:!0,skip:!1,value:n}:{ok:!1,error:"Please enter a valid number."}}function iL(e,t){return e===""?t.allowSkip?{ok:!0,skip:!0}:{ok:!1,error:t.emptyError}:t.minLength!==void 0&&e.length<t.minLength?{ok:!1,error:`Response must be at least ${t.minLength} characters.`}:t.maxLength!==void 0&&e.length>t.maxLength?{ok:!1,error:`Response must be at most ${t.maxLength} characters.`}:{ok:!0,skip:!1}}var Ul={action:"skip"};function pE(e){let t=[];return t.push(m.warning(" \u{1F4AC} Agent question")),t.push(m.bold(" ? "+Se(e.message,512))),e.context&&t.push(m.dim(" "+Se(e.context,512))),t.push(""),t}async function T1e(e,t,n,r){let o=pE(t),i=t.allowSkip===!0;if(e==="number"){let u=t.min,d=t.max,f=`enter to submit \xB7 esc to cancel${u!==void 0&&d!==void 0?` [${u}\u2013${d}]`:u!==void 0?` [\u2265${u}]`:d!==void 0?` [\u2264${d}]`:""}`,h=await n({header:o,help:f,validate:w=>{let S=oL(w.trim(),{allowSkip:i,min:u,max:d,emptyError:"Please enter a number (or esc to cancel)."});return S.ok?null:S.error},signal:r});if(h===null)return null;let y=h.trim();return y===""&&i?{tag:"skip"}:{tag:"number",value:Number(y)}}let s=t.minLength,a=t.maxLength,c=await n({header:o,validate:u=>{let d=iL(u,{allowSkip:i,minLength:s,maxLength:a,emptyError:"Please enter a response (or esc to cancel)."});return d.ok?null:d.error},signal:r});return c===null?null:c===""&&i?{tag:"skip"}:{tag:"text",value:c}}async function vne(e,t,n){if(n.aborted)return Ds;let{readLine:r,writer:o,pendingCount:i,pickFromList:s,readTextOverlay:a}=t,l=e.type??"text",c=i();if(c>1&&o.line(m.dim(` [${c} questions queued]`)),(l==="choice"||l==="multi_choice")&&s&&(e.choices?.length??0)>0){let p=(e.choices??[]).map(h=>Se(h,128));e.allowCustom&&p.push(Bl);let f;try{f=await s({header:pE(e),options:p,multi:l==="multi_choice",signal:n})}catch(h){return B("[elicitation] choice/multi_choice pickFromList failed:",h),ce}if(n.aborted)return ce;if(f===null)return ce;if(e.allowCustom&&f.includes(Bl)){if(!a)return ce;let h=await a({header:pE(e),help:"Type your custom answer (Esc to cancel)",validate:y=>y.trim()===""?"Please enter a non-empty answer":null,signal:n});return h===null?ce:(o.line(m.dim(" \u270E ")+m.brand(Se(h,256))),{action:"accept",content:{value:null,custom_value:h}})}if(f.length===0)return e.allowSkip?Ul:ce;let g=f.length===1?Se(f[0]??"",128):f.map(h=>Se(h,128)).join(", ");return o.line(m.dim(" \u2713 ")+m.brand(g)),l==="choice"?{action:"accept",content:{value:f[0]}}:{action:"accept",content:{value:[...f]}}}if(l==="confirm"&&s){let f=e.questionDefault!==!1?["Yes","No"]:["No","Yes"],g;try{g=await s({header:pE(e),options:f,multi:!1,signal:n})}catch(w){return B("[elicitation] confirm pickFromList failed:",w),ce}if(n.aborted)return ce;if(g===null)return ce;let h=g[0];if(h===void 0)return ce;let y=h==="Yes";return o.line(m.dim(" \u2713 ")+(y?m.success("Yes"):m.error("No"))),{action:"accept",content:{value:y}}}if((l==="text"||l==="number")&&a){let p=await T1e(l,e,a,n);if(p===null)return ce;if(p.tag==="skip")return Ul;let f=p.tag==="text"?Se(p.value,256):String(p.value);return o.line(m.dim(" \u2713 ")+m.brand(f)),{action:"accept",content:{value:p.value}}}if(o.line(),o.line(m.warning("\u{1F4AC} Agent question")),e.context&&o.line(m.dim(" context: ")+Se(e.context,512)),o.line(m.bold(" "+Se(e.message,512))),o.line(m.dim(" Type :cancel to skip this question.")),o.line(),l==="confirm"){o.line("\x07");let p=e.questionDefault===!0?"Y/n":"y/N";for(;;){if(n.aborted)return ce;let f;try{f=(await r(m.dim(` Continue? [${p}] `))).trim().toLowerCase()}catch(g){return B("[elicitation] confirm readLine failed:",g),ce}if(n.aborted)return ce;if(f===":cancel")return ce;if(f==="")return{action:"accept",content:{value:e.questionDefault===!0}};if(f==="y"||f==="yes")return{action:"accept",content:{value:!0}};if(f==="n"||f==="no")return{action:"accept",content:{value:!1}};o.line(m.warning(" Please enter y or n."))}}if(l==="choice"){o.line("\x07");let p=e.choices??[],f=e.allowCustom?[...p,Bl]:p,g=await dE(f,n);if(g!==null){if(g===":cancel")return ce;if(e.allowCustom&&g===p.length){let y;try{y=(await r(m.dim(" Type your answer: "))).trim()}catch(w){return B("[elicitation] custom-answer readLine failed:",w),ce}return y===":cancel"||n.aborted?ce:{action:"accept",content:{value:null,custom_value:y}}}let h=p[g];return h!==void 0?(o.line(m.dim(` Selected: ${Se(h,128)}`)),{action:"accept",content:{value:h}}):(B("[elicitation] choice selector returned an out-of-range index:",{selectorResult:g,choicesLength:p.length}),ce)}for(p.forEach((h,y)=>{o.line(` ${y+1}. ${Se(h,128)}`)}),e.allowCustom&&o.line(` ${p.length+1}. ${Bl}`);;){if(n.aborted)return ce;let h;try{h=(await r(m.dim(" Enter number: "))).trim()}catch(w){return B("[elicitation] choice readLine failed:",w),ce}if(n.aborted)return ce;if(h===":cancel")return ce;if(e.allowCustom&&h===String(p.length+1)){let w;try{w=(await r(m.dim(" Type your answer: "))).trim()}catch(S){return B("[elicitation] custom-answer readLine failed:",S),ce}return w===":cancel"?ce:{action:"accept",content:{value:null,custom_value:w}}}if(h===""&&e.allowSkip)return Ul;let y=parseInt(h,10);if(!isFinite(y)||String(y)!==h||y<1||y>p.length){o.line(m.warning(` Please enter a number between 1 and ${p.length+(e.allowCustom?1:0)}.`));continue}return{action:"accept",content:{value:p[y-1]}}}}if(l==="multi_choice"){o.line("\x07");let p=e.choices??[],f=e.allowCustom?[...p,Bl]:p,g=await Sne(f,n);if(g!==null){if(g===":cancel")return ce;if(e.allowCustom&&g.includes(p.length)){let h;try{h=(await r(m.dim(" Type your answer: "))).trim()}catch(y){return B("[elicitation] custom-answer readLine failed:",y),ce}return h===":cancel"||n.aborted?ce:{action:"accept",content:{value:null,custom_value:h}}}if(g.length===0&&e.allowSkip)return Ul;if(g.length>0){let h=g.map(y=>p[y]);return o.line(m.dim(` Selected: ${h.map(y=>Se(y,64)).join(", ")}`)),{action:"accept",content:{value:h}}}}for(p.forEach((h,y)=>{o.line(` ${y+1}. ${Se(h,128)}`)}),e.allowCustom&&o.line(` ${p.length+1}. ${Bl}`);;){if(n.aborted)return ce;let h;try{h=(await r(m.dim(" Enter numbers (comma-separated): "))).trim()}catch(v){return B("[elicitation] multi_choice readLine failed:",v),ce}if(n.aborted)return ce;if(h===":cancel")return ce;if(e.allowCustom&&h===String(p.length+1)){let v;try{v=(await r(m.dim(" Type your answer: "))).trim()}catch(x){return B("[elicitation] custom-answer readLine failed:",x),ce}return v===":cancel"?ce:{action:"accept",content:{value:null,custom_value:v}}}if(h===""&&e.allowSkip)return Ul;if(h===""){o.line(m.warning(" Please enter at least one selection."));continue}let y=h.split(",").map(v=>v.trim()),w=[],S=!0;for(let v of y){let x=parseInt(v,10);if(!isFinite(x)||String(x)!==v||x<1||x>p.length){o.line(m.warning(` Invalid selection "${Se(v,32)}". Enter numbers between 1 and ${p.length+(e.allowCustom?1:0)}.`)),S=!1;break}w.push(p[x-1])}if(S)return{action:"accept",content:{value:w}}}}if(l==="number"){let p=e.min,f=e.max,g=p!==void 0&&f!==void 0?` [${p}\u2013${f}]`:p!==void 0?` [\u2265${p}]`:f!==void 0?` [\u2264${f}]`:"";for(;;){if(n.aborted)return ce;let h;try{h=(await r(m.dim(` Enter a number${g}: `))).trim()}catch(w){return B("[elicitation] number readLine failed:",w),ce}if(n.aborted)return ce;if(h===":cancel")return ce;let y=oL(h,{allowSkip:e.allowSkip===!0,min:p,max:f,emptyError:"Please enter a number (or :cancel to skip)."});if(!y.ok){o.line(m.warning(" "+y.error));continue}return y.skip?Ul:{action:"accept",content:{value:y.value}}}}let u=e.minLength,d=e.maxLength;for(;;){if(n.aborted)return ce;let p;try{p=(await r(m.dim(" > "))).trim()}catch(g){return B("[elicitation] text readLine failed:",g),ce}if(n.aborted)return ce;if(p===":cancel")return ce;let f=iL(p,{allowSkip:e.allowSkip===!0,minLength:u,maxLength:d,emptyError:"Please enter a response (or type :cancel to skip)."});if(!f.ok){o.line(m.warning(" "+f.error));continue}return f.skip?Ul:{action:"accept",content:{value:p}}}}function wh(e){return async(t,{signal:n})=>{if(n.aborted)return Ds;$d(process.stdout),e.suspendInput?.();try{if(t.origin==="agent")return await vne(t,e,n);if(t.mode==="form"){let o=t.requestedSchema,{properties:i,required:s,fieldsTruncated:a,originalFieldCount:l}=typeof o=="object"&&o!==null?hne(o):{properties:{},required:new Set,fieldsTruncated:!1,originalFieldCount:0};yne(e.writer,t),a&&e.writer.line(m.warning(` \u26A0 Schema has ${l} fields; only the first ${cE} will be prompted (server may be malformed or compromised).`));let c=Object.create(null);if(Object.keys(i).length===0)return e.writer.line(m.warning(" \u26A0 Form schema has no usable fields \u2014 declining.")),Ds;for(let u of s)if(!(u in i))return e.writer.line(m.warning(` \u26A0 Required field '${Se(u,64)}' has no schema entry \u2014 declining.`)),Ds;for(let[u,d]of Object.entries(i)){if(n.aborted)return ce;let p=await bne(u,d,s.has(u),e.readLine,e.writer,n,e.pickFromList);if(p.tag==="cancel")return ce;if(p.tag==="decline")return Ds;p.value!==void 0&&!uE.has(u)&&(c[u]=p.value)}return{action:"accept",content:{...c}}}wne(e.writer,t);let r;try{r=(await e.readLine(m.dim("Continue? [y/N] "))).trim().toLowerCase()}catch(o){return B("[elicitation] url-mode readLine failed:",o),ce}return r===""?ce:r==="y"||r==="yes"?gne:Ds}finally{e.resumeInput?.()}}}sL();PO();kt();F();cM();fE();we();Cl();function _ne(e,t){let n=o=>{e.fn(Ane(o,{isTTY:process.stdout.isTTY,columns:ne()}))},r=o=>{e.fn(Rne(o,{isTTY:process.stdout.isTTY,columns:ne()})),t.record(o)};return xJ(n),kJ(r),()=>{EJ(n),TJ(r)}}function Pne(e){tQ(e)?(kne(e),A3(e)):k.AFK_DISABLE_PATH_APPROVAL!=="1"&&console.warn("[path-approval] active provider does not implement GrantManager \u2014 path-approval elicitation and bash restricted-path checks will not fire.")}function Ine(){let e=Cne.createInterface({input:process.stdin,output:process.stdout,terminal:!1}),t={current:null};return Be.install(wh({readLine:n=>new Promise((r,o)=>{e.question(n,r),e.once("close",()=>o(new Error("readline closed")))}),writer:{line:(n="")=>process.stdout.write(En(n,process.stdout)+`
|
|
2057
|
-
`)},pendingCount:()=>Be.pendingCount(),suspendInput:()=>t.current?.suspendForElicitation(),resumeInput:()=>t.current?.resumeAfterElicitation()})),{rl:e,inputSurfaceRef:t}}Qu();cn();kt();function gE(e){return new Ut(li(Xo({model:e.model,surface:"cli",apiKey:tn(e.model,hd(e.explicitProvider)),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.drainSubagents!==void 0?{drainSubagents:e.drainSubagents}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory})),e.traceWriter)}function Mne(e){return{model:e.sessionModel,resumeConfig:e.resumeConfig,systemPrompt:e.systemPrompt,systemPromptSource:e.systemPromptSource,thinking:e.thinking,effort:e.effort,maxOutputTokens:e.maxOutputTokens,maxToolUseIterations:e.maxToolUseIterations,...e.cliConfig.baseUrl!==void 0?{baseUrl:e.cliConfig.baseUrl}:{},...e.cliConfig.temperature!==void 0?{temperature:e.cliConfig.temperature}:{},providerFactory:e.providerFactory,hookRegistry:e.hookRegistry,traceWriter:e.traceWriter,drainSubagents:e.drainSubagents,cwd:e.effectiveCwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:e.cliConfig.autoResumeOnUsageLimit,...e.initialPermissionMode!==void 0?{permissionMode:e.initialPermissionMode}:{},...e.explicitProvider!==void 0?{explicitProvider:e.explicitProvider}:{}}}lF();bh();async function Qie(e,t){let n=Date.now(),{resumeTarget:r,resumeConfig:o,effectiveCwd:i,sessionModel:s,thinking:a,effort:l,maxOutputTokens:c,maxToolUseIterations:u,basePrompt:d,systemPrompt:p,systemPromptSource:f,cliConfig:g}=Wte(e,t),h={current:null},y=t?.bootWarnings??[],w=k.AFK_WORKSPACE_DISABLED==="1"?void 0:new Ho,S=new Nt,v=new Sn(Mn()),{trace:x,apiKey:T,backgroundRegistry:E,bgSummarizer:C,rootManager:_,subagentExecutor:R,skillExecutor:P,composeExecutor:I}=one({sessionRef:h,options:e,cliConfig:g,sessionModel:s,basePrompt:d,effectiveCwd:i,resumeTarget:r,bootWarnings:y,workspaceStore:w}),{FastModeController:$}=await Promise.resolve().then(()=>(Xie(),Yie)),j=new $,O=await ine({effectiveCwd:i,mcpConfigOverride:e.mcpConfig,traceWriter:x?.writer,bootWarnings:y}),{providerFactory:W,startupProvider:q}=ane({options:e,cliConfig:g,sessionModel:s,subagentExecutor:R,skillExecutor:P,composeExecutor:I,memoryStore:S,stateStore:v,workspaceStore:w,mcpManager:O,fastModeController:j}),{stats:K,initialPermissionMode:H,completionWriter:Y,statusLine:
|
|
2057
|
+
`)},pendingCount:()=>Be.pendingCount(),suspendInput:()=>t.current?.suspendForElicitation(),resumeInput:()=>t.current?.resumeAfterElicitation()})),{rl:e,inputSurfaceRef:t}}Qu();cn();kt();function gE(e){return new Ut(li(Xo({model:e.model,surface:"cli",apiKey:tn(e.model,hd(e.explicitProvider)),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.drainSubagents!==void 0?{drainSubagents:e.drainSubagents}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory})),e.traceWriter)}function Mne(e){return{model:e.sessionModel,resumeConfig:e.resumeConfig,systemPrompt:e.systemPrompt,systemPromptSource:e.systemPromptSource,thinking:e.thinking,effort:e.effort,maxOutputTokens:e.maxOutputTokens,maxToolUseIterations:e.maxToolUseIterations,...e.cliConfig.baseUrl!==void 0?{baseUrl:e.cliConfig.baseUrl}:{},...e.cliConfig.temperature!==void 0?{temperature:e.cliConfig.temperature}:{},providerFactory:e.providerFactory,hookRegistry:e.hookRegistry,traceWriter:e.traceWriter,drainSubagents:e.drainSubagents,cwd:e.effectiveCwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:e.cliConfig.autoResumeOnUsageLimit,...e.initialPermissionMode!==void 0?{permissionMode:e.initialPermissionMode}:{},...e.explicitProvider!==void 0?{explicitProvider:e.explicitProvider}:{}}}lF();bh();async function Qie(e,t){let n=Date.now(),{resumeTarget:r,resumeConfig:o,effectiveCwd:i,sessionModel:s,thinking:a,effort:l,maxOutputTokens:c,maxToolUseIterations:u,basePrompt:d,systemPrompt:p,systemPromptSource:f,cliConfig:g}=Wte(e,t),h={current:null},y=t?.bootWarnings??[],w=k.AFK_WORKSPACE_DISABLED==="1"?void 0:new Ho,S=new Nt,v=new Sn(Mn()),{trace:x,apiKey:T,backgroundRegistry:E,bgSummarizer:C,rootManager:_,subagentExecutor:R,skillExecutor:P,composeExecutor:I}=one({sessionRef:h,options:e,cliConfig:g,sessionModel:s,basePrompt:d,effectiveCwd:i,resumeTarget:r,bootWarnings:y,workspaceStore:w}),{FastModeController:$}=await Promise.resolve().then(()=>(Xie(),Yie)),j=new $,O=await ine({effectiveCwd:i,mcpConfigOverride:e.mcpConfig,traceWriter:x?.writer,bootWarnings:y}),{providerFactory:W,startupProvider:q}=ane({options:e,cliConfig:g,sessionModel:s,subagentExecutor:R,skillExecutor:P,composeExecutor:I,memoryStore:S,stateStore:v,workspaceStore:w,mcpManager:O,fastModeController:j}),{stats:K,initialPermissionMode:H,completionWriter:Y,statusLine:ie,replRenderer:M,writer:N,trustedSkillLedger:Q,gitStatusSampler:se}=dne({options:e,cliConfig:g,sessionModel:s,resumeTarget:r,effectiveCwd:i,extrasCwd:t?.cwd,trace:x}),{hookRegistry:ee,addPreviewDiffRef:$e}=mne({completionWriter:Y,memoryStore:S,stateStore:v,stats:K,effectiveCwd:i,traceWriter:x?.writer}),De=Mne({sessionModel:s,resumeConfig:o,systemPrompt:p,systemPromptSource:f,thinking:a,effort:l,maxOutputTokens:c,maxToolUseIterations:u,cliConfig:g,providerFactory:W,hookRegistry:ee,traceWriter:x?.writer,effectiveCwd:i,maxTurns:e.maxTurns,initialPermissionMode:H,drainSubagents:Hp=>_.abortAllAndDrain("session_end","user_signal",void 0,Hp==="reset"),...e.provider!==void 0?{explicitProvider:e.provider}:{}});await td();let Gn=gE(De);h.current=Gn,S9(Gn.sessionId??""),NT(Gn,{surface:"cli",model:De.model,...De.cwd!==void 0?{cwd:De.cwd}:{},...r?.stored?.sessionId!==void 0?{sdkSessionId:r.stored.sessionId}:{}});let Je=(Hp,Ys)=>{h.current?.recordSubagentCompletion(Hp,Ys)};_.setOnSubagentSucceeded(Je),I.setOnSubagentSucceeded(Je);let qn=new BT(Gn),Gt=parseInt(e.maxTurns,10),Ve=fne({sessionRef:h,stats:K,writer:N,statusLine:ie,contextSampler:qn,gitStatusSampler:se,ledger:Q,mcpManager:O,fastModeController:j,...g.baseUrl!==void 0?{anthropicBaseUrl:g.baseUrl}:{},...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{},...e.provider!==void 0?{explicitProvider:e.provider}:{},...Gt>0?{maxTurns:Gt}:{}}),ye,gt=Hp=>(Q.clear(),Hte(Hp,{sessionRef:h,stats:K,contextSampler:qn,gitStatusSampler:se,statusLine:ie,maxTurns:Gt>0?Gt:void 0,backgroundRegistry:E,completionWriter:Y,isInFlight:()=>Ue.getInFlight?.()??!1,onSwapped:Ys=>{Ue.resumeTarget=Ys,Ue.clearVerdictLedger?.(),Ue.clearBgResultBuffer?.(),Ue.clearPendingStopInjection?.(),R.setTraceWriter(ye),P.setTraceWriter(ye),I.setTraceWriter(ye),_.setTraceWriter(ye),E.setTraceWriter(ye),Ue.hasPendingUserMessage&&h.current?.setPlanExitQueueCheck(Ue.hasPendingUserMessage)},buildSession:Ys=>{let nB=Ys.stored?.sessionId;return ye=Ro(nB!==void 0?{sessionLabel:nB}:{})?.writer,gE({...De,model:Ys.stored?.model??De.model,resumeConfig:fl(Ys),permissionMode:K.permissionMode,traceWriter:ye})}})),Ue={session:h,memoryStore:S,stateStore:v,stats:K,statusLine:ie,contextSampler:qn,gitStatusSampler:se,completionWriter:Y,replRenderer:M,slashCtx:Ve,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,bootWarnings:y,backgroundRegistry:E,subagentControl:R,...C!==void 0?{bgSummarizer:C}:{},requestResume:gt,getInFlight:()=>!1,...O!==void 0?{mcpManager:O}:{},suggestApiKey:T,...g.openaiBaseUrl!==void 0?{suggestBaseUrl:g.openaiBaseUrl}:{},...g.interactive?.suggestGhost!==void 0?{suggestGhostConfig:g.interactive.suggestGhost}:{},hookRegistry:ee,addPreviewDiffRef:$e};Ue.teardownTrustedSkillEvents=_ne(Y,Q),aF(),Zte(Ue),Pne(q);let{rl:Pe,inputSurfaceRef:br}=Ine();return Ue.rl=Pe,Ue.inputSurfaceRef=br,Ve.requestResume=gt,re(x?.writer,{phase:"bootstrap_done",durationMs:Date.now()-n}),Ue}L();function uF(e){for(let t of e)console.warn(m.warning(` ${t}`));e.length=0}U();L();import{existsSync as VGe,mkdirSync as YGe,writeFileSync as XGe}from"node:fs";import{dirname as QGe}from"node:path";function ZGe(){try{return!VGe(Ty())}catch{return!1}}function e2e(){try{let e=Ty();YGe(QGe(e),{recursive:!0}),XGe(e,"",{flag:"wx"})}catch{}}function Zie(e){return!e.isTTY||e.isResume||!ZGe()?!1:(e2e(),console.log(["",` ${m.bold("Welcome to AFK!")} Here are two good starting points:`,` ${m.info("/skills")} ${m.dim("\u2014 browse 50+ amplifier skills (try /skills <query> to search by intent)")}`,` ${m.info("/help")} ${m.dim("\u2014 interactive command reference and tips")}`,""].join(`
|
|
2058
2058
|
`)),!0)}ar();U();import{promises as dF}from"node:fs";import*as tse from"node:path";async function ese(e,t,n=!1){await dF.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=tse.join(e,`${r}.md`),i=n?" (continued)":"";return await dF.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${i}
|
|
2059
2059
|
|
|
2060
2060
|
- model: ${t}
|
|
@@ -2164,13 +2164,13 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
|
|
|
2164
2164
|
`),y();try{for await(let S of s.session.getOutputStream()){if(g.aborted)break;let v=sp(S);v!==null&&(l.write(`\r\x1B[K${u(v)}
|
|
2165
2165
|
`),y())}}catch{}finally{process.stdin.removeListener("data",w),g.aborted||(l.write(`\r\x1B[K
|
|
2166
2166
|
`+u(m.dim(" Subagent completed. Press Esc to return."))+`
|
|
2167
|
-
`),await K2e());try{process.stdin.setRawMode?.(!1)}catch{}dR=!1,n.resumeInput(),n.repaint()}return!0}function K2e(){return new Promise(e=>{try{process.stdin.setRawMode?.(!0)}catch{}let t=()=>{process.stdin.removeListener("data",n),process.stdin.removeListener("close",t),clearTimeout(r);try{process.stdin.setRawMode?.(!1)}catch{}e()},n=o=>{o.toString()==="\x1B"&&t()},r=setTimeout(t,3e4);process.stdin.on("data",n),process.stdin.on("close",t)})}function nae(e){let t=e.getCompositor?.();return t?()=>{if(dR)return!1;let n=ene();return!n||!n.list().some(o=>o.status==="running"||o.status==="idle")?!1:(W2e({manager:n,compositor:t}),!0)}:null}L();nt();Cc();fh();kf();gh();gh();var G2e=.8,q2e=.95,z2e=1;function rae(e){return e>=z2e?"over":e>=q2e?"near":e>=G2e?"caution":"quiet"}function J2e(e){let t=[];return e.fiveHour!==void 0&&t.push({label:"5h",state:e.fiveHour}),e.sevenDay!==void 0&&t.push({label:"7d",state:e.sevenDay}),t}var V2e=7200*1e3;function Y2e(e,t,n){return n?e.resetsAt!==void 0&&e.resetsAt.getTime()-t.getTime()>V2e?"turns stop at the cap \u2014 the reset is too far out to wait":"AFK pauses and auto-resumes at the cap":"turns stop at the cap \u2014 auto-resume is off"}function X2e(e,t){if(e.resetsAt===void 0)return;let n=e.resetsAt.getTime()-t.getTime();if(!(n<=0))return`resets in ${KD(n)}`}function oae(e,t=new Date,n={}){if(e===void 0)return{tier:"quiet",text:null};let r=J2e(e),o=r.reduce((p,f)=>p===void 0||f.state.utilization>p.state.utilization?f:p,void 0);if(o===void 0)return{tier:"quiet",text:null};let i=rae(o.state.utilization);if(i==="quiet")return{tier:i,text:null};let s=Math.round(o.state.utilization*100),a=X2e(o.state,t),l=r.filter(p=>p!==o&&rae(p.state.utilization)!=="quiet").map(p=>`${p.label} ${Math.round(p.state.utilization*100)}%`),c=l.length>0?` (also ${l.join(", ")})`:"",u=Y2e(o.state,t,n.autoResume??!0);if(i==="over"){let p=` ${o.label} quota exhausted`;return{tier:i,text:`${p}${a===void 0?"":` \u2014 ${a}`} \u2014 ${u}${c}`}}if(i==="near"){let p=` ${o.label} quota ${s}% used`;return{tier:i,text:`${p}${a===void 0?"":` \u2014 ${a}`} \u2014 ${u}${c}`}}let d=` ${o.label} quota ${s}% used`;return{tier:i,text:`${d}${a===void 0?"":` \u2014 ${a}`}${c}`}}Po();It();aa();mi();function iae(e,t){let n=Math.round(e*100),r=Ae(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tokens by ~${Ae(o)} tokens \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function kF(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(he(e.durationMs));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);r.push(...Mi({costUsd:e.totalCostUsd,tokens:o+i,includeZeroCost:e.totalCostUsd!==void 0})),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let s=GD(t),a=at(t.model),l=iae(s,a);if(l.text!==null){let u=l.tier==="over"||l.tier==="near"?m.error:l.tier==="caution"?m.warning:m.dim;n(u(l.text))}let c=oae(qx(AS()),new Date,{autoResume:LW()});if(c.text!==null){let u=c.tier==="over"||c.tier==="near"?m.error:c.tier==="caution"?m.warning:m.dim;n(u(c.text))}n("")}function TF(e,t=process.stdout){!_9()||!t.isTTY||e(
|
|
2167
|
+
`),await K2e());try{process.stdin.setRawMode?.(!1)}catch{}dR=!1,n.resumeInput(),n.repaint()}return!0}function K2e(){return new Promise(e=>{try{process.stdin.setRawMode?.(!0)}catch{}let t=()=>{process.stdin.removeListener("data",n),process.stdin.removeListener("close",t),clearTimeout(r);try{process.stdin.setRawMode?.(!1)}catch{}e()},n=o=>{o.toString()==="\x1B"&&t()},r=setTimeout(t,3e4);process.stdin.on("data",n),process.stdin.on("close",t)})}function nae(e){let t=e.getCompositor?.();return t?()=>{if(dR)return!1;let n=ene();return!n||!n.list().some(o=>o.status==="running"||o.status==="idle")?!1:(W2e({manager:n,compositor:t}),!0)}:null}L();nt();Cc();fh();kf();gh();gh();var G2e=.8,q2e=.95,z2e=1;function rae(e){return e>=z2e?"over":e>=q2e?"near":e>=G2e?"caution":"quiet"}function J2e(e){let t=[];return e.fiveHour!==void 0&&t.push({label:"5h",state:e.fiveHour}),e.sevenDay!==void 0&&t.push({label:"7d",state:e.sevenDay}),t}var V2e=7200*1e3;function Y2e(e,t,n){return n?e.resetsAt!==void 0&&e.resetsAt.getTime()-t.getTime()>V2e?"turns stop at the cap \u2014 the reset is too far out to wait":"AFK pauses and auto-resumes at the cap":"turns stop at the cap \u2014 auto-resume is off"}function X2e(e,t){if(e.resetsAt===void 0)return;let n=e.resetsAt.getTime()-t.getTime();if(!(n<=0))return`resets in ${KD(n)}`}function oae(e,t=new Date,n={}){if(e===void 0)return{tier:"quiet",text:null};let r=J2e(e),o=r.reduce((p,f)=>p===void 0||f.state.utilization>p.state.utilization?f:p,void 0);if(o===void 0)return{tier:"quiet",text:null};let i=rae(o.state.utilization);if(i==="quiet")return{tier:i,text:null};let s=Math.round(o.state.utilization*100),a=X2e(o.state,t),l=r.filter(p=>p!==o&&rae(p.state.utilization)!=="quiet").map(p=>`${p.label} ${Math.round(p.state.utilization*100)}%`),c=l.length>0?` (also ${l.join(", ")})`:"",u=Y2e(o.state,t,n.autoResume??!0);if(i==="over"){let p=` ${o.label} quota exhausted`;return{tier:i,text:`${p}${a===void 0?"":` \u2014 ${a}`} \u2014 ${u}${c}`}}if(i==="near"){let p=` ${o.label} quota ${s}% used`;return{tier:i,text:`${p}${a===void 0?"":` \u2014 ${a}`} \u2014 ${u}${c}`}}let d=` ${o.label} quota ${s}% used`;return{tier:i,text:`${d}${a===void 0?"":` \u2014 ${a}`}${c}`}}Po();It();aa();mi();function iae(e,t){let n=Math.round(e*100),r=Ae(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tokens by ~${Ae(o)} tokens \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function kF(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(he(e.durationMs));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);r.push(...Mi({costUsd:e.totalCostUsd,tokens:o+i,includeZeroCost:e.totalCostUsd!==void 0})),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let s=GD(t),a=at(t.model),l=iae(s,a);if(l.text!==null){let u=l.tier==="over"||l.tier==="near"?m.error:l.tier==="caution"?m.warning:m.dim;n(u(l.text))}let c=oae(qx(AS()),new Date,{autoResume:LW()});if(c.text!==null){let u=c.tier==="over"||c.tier==="near"?m.error:c.tier==="caution"?m.warning:m.dim;n(u(c.text))}n("")}function TF(e,t=process.stdout){!_9()||!t.isTTY||e(ae())}zu();Vf();async function sae(e,t,n,r,o){let i=[];return n&&n.trim().length>0&&i.push({type:"text",text:n}),r&&r.length>0&&i.push(...r),e&&i.push({type:"text",text:e}),t.length>0&&o!==void 0?await Hv(i,o,t):gs(i,t),i}ZT();Ui();io();import{readFileSync as Q2e,statSync as Z2e}from"fs";import{extname as eqe,join as xF}from"path";import{homedir as tqe}from"os";var nqe=100*1024,rqe=400*1024,oqe=/(?<=\s|^)@([~\w./-]+)(?=\s|$)/g,iqe=/(^|\/)\.(ssh|aws|gnupg|kube|docker)(\/|$)|(^|\/)[^/]*\.env(\.[^/]+)?$|(^|\/)\.(netrc|npmrc|pypirc)$|(^|\/)id_(rsa|ed25519|ecdsa|dsa)(\.pub)?$|\.(pem|key|p12|pfx)$|(^|\/)credentials$|(^|\/)\.git\/config$|(^|\/)\.git-credentials$|(^|\/)\.(bash|zsh|fish|sh)_history$/i,sqe=[".afk/config",".afk/state",".config/gcloud",".config/gh"];function aqe(e){let t=0,n=e.match(/`+/g);if(n)for(let r of n)r.length>t&&(t=r.length);return"`".repeat(Math.max(3,t+1))}function lqe(e,t,n){if(n.includes(e))return yn(e).denied;if(iqe.test(e))return!0;for(let r of t)if(e===r||e.startsWith(r+"/"))return!0;return!1}var cqe={".ts":"typescript",".tsx":"tsx",".js":"javascript",".jsx":"jsx",".mjs":"javascript",".cjs":"javascript",".json":"json",".md":"markdown",".py":"python",".sh":"bash",".bash":"bash",".zsh":"bash",".yaml":"yaml",".yml":"yaml",".toml":"toml",".rs":"rust",".go":"go",".rb":"ruby",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cs":"csharp",".html":"html",".css":"css",".scss":"scss",".sql":"sql",".xml":"xml",".txt":""};function uqe(e){return cqe[e.toLowerCase()]??""}function dqe(e=process.env){return e.AFK_AT_FILE_INJECT!=="0"}function aae(e,t={}){let n={fileBlocks:[],warnings:[]};if(!dqe(t.env))return n;let r=[];for(let p of e.matchAll(oqe)){let f=p[1];f&&r.push(f)}if(r.length===0)return n;let o=t.rootDir??process.cwd(),i=t.homeDir??tqe(),s=sqe.map(p=>yt(xF(i,p))),a=Ko.map(p=>yt(xF(i,p))),l=[],c=[],u=new Set,d=0;for(let p of r){let{scanDir:f,leafPrefix:g}=Rl(p,o,i),h=g?xF(f,g):f,y=yt(h);if(u.has(y))continue;if(u.add(y),lqe(y,s,a)){c.push(`@${p}: sensitive path, not injected`);continue}let w;try{w=Z2e(y)}catch{c.push(`@${p}: not found, left as text`);continue}if(w.isDirectory()){c.push(`@${p}: is a directory, skipped`);continue}if(!w.isFile()){c.push(`@${p}: not a regular file, skipped`);continue}if(w.size>nqe){c.push(`@${p}: too large (${Math.round(w.size/1024)} KB > 100 KB), skipped`);continue}if(d+w.size>rqe){c.push(`@${p}: 400 KB total injection budget exceeded, skipped`);continue}let S;try{S=Q2e(y)}catch{c.push(`@${p}: could not read, skipped`);continue}if(S.includes(0)){c.push(`@${p}: binary file, skipped`);continue}d+=w.size;let v=uqe(eqe(y)),x=S.toString("utf8"),T=aqe(x);l.push({type:"text",text:`Contents of ${p}:
|
|
2168
2168
|
${T}${v}
|
|
2169
2169
|
${x}
|
|
2170
|
-
${T}`})}return{fileBlocks:l,warnings:c}}function lae(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function cae(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}F();L();F();nt();L();ul();function uae(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function dae(e,t){je()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function pae(e,t,n,r){if(!je())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Oe(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${he(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function mae(e,t,n,r){if(!je())return;let{subagentId:o,agentType:i}=n,s=Oe(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${he(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var pR=class{state;writer;ttfb;constructor(t,n){this.state=uae(),this.writer=t,this.ttfb=n}onToolStart(t){dae(this.state,t)}onToolResult(t,n){pae(this.state,t,n,this.writer)}onSubagentEvent(t,n){mae(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function fae(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function gae(e){return e.received?{}:{turnStartedAt:e.startedAt}}function hae(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function yae(e,t=process.stdout,n){if(!je()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new pR(e,n)))}me();L();var pqe=3e3;async function bae(e,t){if(!e)return t;let n=Date.now();if(n-t<pqe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){ze()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}L();me();ht();Ls();var mqe="Keep waiting \u2014 auto-resume in progress",wae="Switch model / provider (type /model after)",fqe="Stop waiting";async function Sae(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:mqe,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];An(r,{header:p,options:[d,wae,fqe],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===wae&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{ze()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{ze()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(zB({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}hx();async function vae(e,t,n,r,o="summary",i,s){let a=TZ(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=fae(l);yae(i,process.stdout,c),Dd(process.stdout,Fg(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,y=!1,w,S=!1,v=!1,x={abort:null},T=0,E=[],C=new Map,_=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,R=()=>{let W=r.subagentControl;W?.hasPromotableForeground()&&cae(W,P,r.onQueuedUserMessage).then(({jobs:q,flushedText:K,flushedPreview:H})=>{let Y=(i??{fn:console.log}).fn;for(let le of q)Y(m.dim(` \u2192 subagent backgrounded as ${le.jobId}: ${le.label}`));K!==void 0&&Y(m.dim(` \u2192 queued message sent to this turn: ${lae(H??K)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,I=()=>new ip({out:ap(i),thinkingMode:o,..._?{activeSkillName:_}:{},onCancel:()=>{t.interrupt().catch(W=>{ze()&&console.error(" "+m.error("session.interrupt() failed:"),W)})},...r.subagentControl?{onBackground:R}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...gae(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),$=I(),j=async()=>{if(!h){h=!0;try{await $.dispose()}catch{}}},O=async()=>{await $.arm();let W=$.getCompositor();if(i&&W){let q=W;i.fn=K=>q.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(W),r.setInterruptNotifier?.(q=>$.setInterrupting(q)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,$.setSoftStopping(!0),t.interrupt().catch(Q=>{ze()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),Q)});let N=r.subagentControl;N?.hasActiveForeground()&&N.cancelActiveForeground().catch(Q=>{ze()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),Q)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{v=!0,t.interrupt().catch(N=>{ze()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),N)})}),await O(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(R),r.setTaskViewHandler?.(nae(r));let{fileBlocks:W,warnings:q}=aae(e.text,{rootDir:process.cwd()});for(let N of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${N}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let K=W.length>0||e.attachments.length>0?await sae(e.text,e.attachments,void 0,W,t.sessionId):e.text,H=t.sendMessageStream(K);await ku((N,Q)=>{$.process(N,Q),Q&&c.plainHooks?.onSubagentEvent(N,Q)},async()=>{for await(let N of H){if(S||v)break;let Q=hae(c,N,f);if(N.type==="chunk"&&N.chunk.type==="content"?(u=p?eae(u,N.chunk.content):u+N.chunk.content,p=!1,f=!0):N.type==="message"&&!f&&(u=N.message.content),N.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),N.type==="chunk"&&N.chunk.type==="tool_use_detail"){let ie=N.chunk,ee={toolName:ie.toolName,toolUseId:ie.toolUseId,input:ie.toolInput,...ie.toolInputRaw!==void 0&&{inputRaw:ie.toolInputRaw}};C.set(ie.toolUseId,ee),E.push(ee),c.plainHooks?.onToolStart(ie)}else if(N.type==="chunk"&&N.chunk.type==="tool_result"){let ie=N.chunk;d=u.length,p=!0;let ee=C.get(ie.toolUseId);ee&&(ee.result=ie.content,ee.isError=ie.isError,C.delete(ie.toolUseId)),c.plainHooks?.onToolResult(ie,ee?.toolName),T=await bae(r.onContextProgress,T)}if(N.type==="paused"){await Sae({event:N,session:t,borrowedCompositor:P,pickerRef:x,completionWriter:i,disposeRendererOnce:j,setPausedState:r.setPausedState,onPauseInterrupt:()=>{v=!0}});continue}if(N.type==="resumed"){r.setPausedState?.(!1),x.abort?.abort(),x.abort=null;let ie=N.hotSwapped&&N.accountId?`\u25B6 Resumed on ${N.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,E.length=0,C.clear(),y=!1,w=void 0,g=!1,$=I(),h=!1,await O(),(i??{fn:console.log}).fn(m.success(ie));continue}if(N.type==="error"){await j(),_c(Sc(N.error)),g=!0;continue}$.process(N),Q&&(c.plainHooks?.onFirstContent(process.stdout),$.notifyFirstContent()),N.type==="done"&&(y=!0,w=N.metadata)}});let le=!1;if(y&&!S&&!v){let N=Qse($.getPendingBuffer());N>=0?$.stripPendingTerminalState(N):$h(u)!==null&&(le=!0)}await j();let M=i?i.fn:console.log;if(S){let N=P?P.getPendingCount():0,Q=N>0?` \xB7 ${N} queued`:"";M(m.warning(`\u23F8 Stopped${Q} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),M("")}if(v&&(M(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),M("")),y&&!S&&!v){gl(n,a,u,w,E),await r.onTurnComplete?.(a,u).catch(()=>{}),$d(process.stdout),I9(process.stdout,"afk: turn complete");let N=ie=>{i?i.fn(ie):console.log(ie)},Q=$h(u);if(Q&&!le){N(tae(Q,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:E.length})),N("");let ie=bL(E),ee=Qne(E);if(r.onTerminalState)try{r.onTerminalState(Q,{doneHasCorroboratingEvidence:ee,doneEvidenceClassification:ie})}catch{}if(n.permissionMode==="autonomous"){let $e=Q.kind==="done"&&rf().verifyDone===!0&&!ee;ere(Q,void 0,{unverified:$e})}}if(kF(w,n,N),TF(N,process.stdout),r.onAfterTurn){let ie=r.onAfterTurn();ie instanceof Promise&&await ie.catch(()=>{})}}}catch(W){await j(),g||_c(Sc(W))}finally{await j(),Dd(process.stdout,Fg(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),x.abort?.abort(),x.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Rs();lm();var gqe=5e3,hqe=3,yqe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function bqe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function kae(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,y=[];e.session.current.waitForInitialization().then(async I=>{ze()&&(h=hE(I)),await mh(e.session.current),ze()&&(y=UD())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,v=!1,x=!1,T;e.clearPendingStopInjection=()=>{T=void 0};let E,C,_,R=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),P=0;g.onInjectable=()=>{P>=hqe||!o.isAwaitingInput()||!o.bufferIsEmpty()||n.pendingSteerRead||(P++,$d(process.stdout),w={text:yqe,attachments:[]},o.abortPendingRead())};try{for(n.steerReadLine=async I=>{let $=()=>o.abortPendingRead({clearBuffer:!0});if(I?.addEventListener("abort",$,{once:!0}),I?.aborted)return"";try{return(await o.readLine({promptFn:()=>"Steer the agent \u2192 ",onEscape:$})).text}finally{I?.removeEventListener("abort",$)}};;){if(P=0,h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),y.length>0){for(let M of y)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),y=[]}let I=f.drainNotifications();for(let{job:M,result:N}of I){let Q=N.errorReason===void 0?"\u2713":"\u2717",ie=N.errorReason==="abort"?"killed":N.errorReason==="timeout"?"timed out":N.errorReason==="signal-killed"?"killed by signal":`exit ${N.exitCode??0}`,ee=Math.max(0,Math.round(N.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${Q} [${M.id}] ${ie} \xB7 ${ee}s \xB7 `)+M.command)}let $=g.drainNotifications();for(let{job:M}of $){let N=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",Q=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,ie=Z(M.label,60);e.replRenderer.writeLine(m.dim(` ${N} [${M.jobId}] subagent ${M.status} \xB7 ${Q}s \xB7 `)+ie)}let j=l.renderIfChanged(e.stats.sessionId);if(j.length>0){for(let M of j)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let O,W,q=n.pendingSteerRead;if(q){let M=await q;n.pendingSteerRead===q&&(n.pendingSteerRead=null),M?.trim()&&(n.pendingSteerText=M)}if(n.pendingSteerText&&(w={text:n.pendingSteerText,attachments:[]},n.pendingSteerText=null),w===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,w={text:M.message,attachments:[]})}if(w!==void 0){let M=w;w=void 0;let N=hp(e.stats.permissionMode),Q=Sl({buffer:M.text,promptText:N,isTTY:!!process.stdout.isTTY,attachmentSummary:Gd([...M.attachments])});e.replRenderer.writeLine(Q),O=M.text.trim(),W=M.attachments}else{let M=S;S=void 0;let N=await o.readLine({promptFn:()=>hp(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{iR(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=N.text.trim(),W=N.attachments}if(!O&&W.length===0)continue;if(O.startsWith("!")){let M=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(v||(v=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(O))){e.statusLine.rearm();continue}}let K=!1;if(O.startsWith("/")){let M=await $9(O,e.slashCtx,W);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){w={text:M.result.message,attachments:W??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){S=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}K=!0}a.push(O),await bqe(e,O);let H=O;if(K){let M=u$(O);if(M){let N=M.name.replace(/^\//,"").split(":").pop()??"";if(N&&DD(N)){let Q={skillName:N,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},ie=e.session.current.sessionId,ee=Nl(ie),$e=Date.now();B(`[afk trace] preflight.start commandName=${N}`);let De=!1,Gn=await Fl(Q,{cwd:e.stats.cwd??process.cwd(),artifactDir:ee},Je=>{ze()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${N}) failed: `)+(Je instanceof Error?Je.message:String(Je)))});De=Gn!==null,B(`[afk trace] preflight.end commandName=${N} durationMs=${Date.now()-$e} success=${De}`),H=ND(Gn?.manifestBlock,O)}}}let Y=f.drainInjections();Y.length>0&&(H=Y+H);let le=g.drainInjections();if(le.length>0&&(H=le+H),T!==void 0&&(H=T+`
|
|
2170
|
+
${T}`})}return{fileBlocks:l,warnings:c}}function lae(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function cae(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}F();L();F();nt();L();ul();function uae(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function dae(e,t){je()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function pae(e,t,n,r){if(!je())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Oe(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${he(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function mae(e,t,n,r){if(!je())return;let{subagentId:o,agentType:i}=n,s=Oe(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${he(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var pR=class{state;writer;ttfb;constructor(t,n){this.state=uae(),this.writer=t,this.ttfb=n}onToolStart(t){dae(this.state,t)}onToolResult(t,n){pae(this.state,t,n,this.writer)}onSubagentEvent(t,n){mae(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function fae(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function gae(e){return e.received?{}:{turnStartedAt:e.startedAt}}function hae(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function yae(e,t=process.stdout,n){if(!je()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new pR(e,n)))}me();L();var pqe=3e3;async function bae(e,t){if(!e)return t;let n=Date.now();if(n-t<pqe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){ze()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}L();me();ht();Ls();var mqe="Keep waiting \u2014 auto-resume in progress",wae="Switch model / provider (type /model after)",fqe="Stop waiting";async function Sae(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:mqe,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];An(r,{header:p,options:[d,wae,fqe],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===wae&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{ze()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{ze()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(zB({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}hx();async function vae(e,t,n,r,o="summary",i,s){let a=TZ(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=fae(l);yae(i,process.stdout,c),Dd(process.stdout,Fg(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,y=!1,w,S=!1,v=!1,x={abort:null},T=0,E=[],C=new Map,_=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,R=()=>{let W=r.subagentControl;W?.hasPromotableForeground()&&cae(W,P,r.onQueuedUserMessage).then(({jobs:q,flushedText:K,flushedPreview:H})=>{let Y=(i??{fn:console.log}).fn;for(let ie of q)Y(m.dim(` \u2192 subagent backgrounded as ${ie.jobId}: ${ie.label}`));q.some(ie=>ie.sharesWorktree)&&Y(m.warning("\u26A0 Background child is writing to your worktree \u2014 edits may conflict until it finishes")),K!==void 0&&Y(m.dim(` \u2192 queued message sent to this turn: ${lae(H??K)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,I=()=>new ip({out:ap(i),thinkingMode:o,..._?{activeSkillName:_}:{},onCancel:()=>{t.interrupt().catch(W=>{ze()&&console.error(" "+m.error("session.interrupt() failed:"),W)})},...r.subagentControl?{onBackground:R}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...gae(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),$=I(),j=async()=>{if(!h){h=!0;try{await $.dispose()}catch{}}},O=async()=>{await $.arm();let W=$.getCompositor();if(i&&W){let q=W;i.fn=K=>q.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(W),r.setInterruptNotifier?.(q=>$.setInterrupting(q)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,$.setSoftStopping(!0),t.interrupt().catch(Q=>{ze()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),Q)});let N=r.subagentControl;N?.hasActiveForeground()&&N.cancelActiveForeground().catch(Q=>{ze()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),Q)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{v=!0,t.interrupt().catch(N=>{ze()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),N)})}),await O(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(R),r.setTaskViewHandler?.(nae(r));let{fileBlocks:W,warnings:q}=aae(e.text,{rootDir:process.cwd()});for(let N of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${N}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let K=W.length>0||e.attachments.length>0?await sae(e.text,e.attachments,void 0,W,t.sessionId):e.text,H=t.sendMessageStream(K);await ku((N,Q)=>{$.process(N,Q),Q&&c.plainHooks?.onSubagentEvent(N,Q)},async()=>{for await(let N of H){if(S||v)break;let Q=hae(c,N,f);if(N.type==="chunk"&&N.chunk.type==="content"?(u=p?eae(u,N.chunk.content):u+N.chunk.content,p=!1,f=!0):N.type==="message"&&!f&&(u=N.message.content),N.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),N.type==="chunk"&&N.chunk.type==="tool_use_detail"){let se=N.chunk,ee={toolName:se.toolName,toolUseId:se.toolUseId,input:se.toolInput,...se.toolInputRaw!==void 0&&{inputRaw:se.toolInputRaw}};C.set(se.toolUseId,ee),E.push(ee),c.plainHooks?.onToolStart(se)}else if(N.type==="chunk"&&N.chunk.type==="tool_result"){let se=N.chunk;d=u.length,p=!0;let ee=C.get(se.toolUseId);ee&&(ee.result=se.content,ee.isError=se.isError,C.delete(se.toolUseId)),c.plainHooks?.onToolResult(se,ee?.toolName),T=await bae(r.onContextProgress,T)}if(N.type==="paused"){await Sae({event:N,session:t,borrowedCompositor:P,pickerRef:x,completionWriter:i,disposeRendererOnce:j,setPausedState:r.setPausedState,onPauseInterrupt:()=>{v=!0}});continue}if(N.type==="resumed"){r.setPausedState?.(!1),x.abort?.abort(),x.abort=null;let se=N.hotSwapped&&N.accountId?`\u25B6 Resumed on ${N.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,E.length=0,C.clear(),y=!1,w=void 0,g=!1,$=I(),h=!1,await O(),(i??{fn:console.log}).fn(m.success(se));continue}if(N.type==="error"){await j(),_c(Sc(N.error)),g=!0;continue}$.process(N),Q&&(c.plainHooks?.onFirstContent(process.stdout),$.notifyFirstContent()),N.type==="done"&&(y=!0,w=N.metadata)}});let ie=!1;if(y&&!S&&!v){let N=Qse($.getPendingBuffer());N>=0?$.stripPendingTerminalState(N):$h(u)!==null&&(ie=!0)}await j();let M=i?i.fn:console.log;if(S){let N=P?P.getPendingCount():0,Q=N>0?` \xB7 ${N} queued`:"";M(m.warning(`\u23F8 Stopped${Q} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),M("")}if(v&&(M(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),M("")),y&&!S&&!v){gl(n,a,u,w,E),await r.onTurnComplete?.(a,u).catch(()=>{}),$d(process.stdout),I9(process.stdout,"afk: turn complete");let N=se=>{i?i.fn(se):console.log(se)},Q=$h(u);if(Q&&!ie){N(tae(Q,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:E.length})),N("");let se=bL(E),ee=Qne(E);if(r.onTerminalState)try{r.onTerminalState(Q,{doneHasCorroboratingEvidence:ee,doneEvidenceClassification:se})}catch{}if(n.permissionMode==="autonomous"){let $e=Q.kind==="done"&&rf().verifyDone===!0&&!ee;ere(Q,void 0,{unverified:$e})}}if(kF(w,n,N),TF(N,process.stdout),r.onAfterTurn){let se=r.onAfterTurn();se instanceof Promise&&await se.catch(()=>{})}}}catch(W){await j(),g||_c(Sc(W))}finally{await j(),Dd(process.stdout,Fg(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),x.abort?.abort(),x.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Rs();lm();var gqe=5e3,hqe=3,yqe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function bqe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function kae(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,y=[];e.session.current.waitForInitialization().then(async I=>{ze()&&(h=hE(I)),await mh(e.session.current),ze()&&(y=UD())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,v=!1,x=!1,T;e.clearPendingStopInjection=()=>{T=void 0};let E,C,_,R=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),P=0;g.onInjectable=()=>{P>=hqe||!o.isAwaitingInput()||!o.bufferIsEmpty()||n.pendingSteerRead||(P++,$d(process.stdout),w={text:yqe,attachments:[]},o.abortPendingRead())};try{for(n.steerReadLine=async I=>{let $=()=>o.abortPendingRead({clearBuffer:!0});if(I?.addEventListener("abort",$,{once:!0}),I?.aborted)return"";try{return(await o.readLine({promptFn:()=>"Steer the agent \u2192 ",onEscape:$})).text}finally{I?.removeEventListener("abort",$)}};;){if(P=0,h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),y.length>0){for(let M of y)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),y=[]}let I=f.drainNotifications();for(let{job:M,result:N}of I){let Q=N.errorReason===void 0?"\u2713":"\u2717",se=N.errorReason==="abort"?"killed":N.errorReason==="timeout"?"timed out":N.errorReason==="signal-killed"?"killed by signal":`exit ${N.exitCode??0}`,ee=Math.max(0,Math.round(N.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${Q} [${M.id}] ${se} \xB7 ${ee}s \xB7 `)+M.command)}let $=g.drainNotifications();for(let{job:M}of $){let N=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",Q=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,se=Z(M.label,60);e.replRenderer.writeLine(m.dim(` ${N} [${M.jobId}] subagent ${M.status} \xB7 ${Q}s \xB7 `)+se)}let j=l.renderIfChanged(e.stats.sessionId);if(j.length>0){for(let M of j)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let O,W,q=n.pendingSteerRead;if(q){let M=await q;n.pendingSteerRead===q&&(n.pendingSteerRead=null),M?.trim()&&(n.pendingSteerText=M)}if(n.pendingSteerText&&(w={text:n.pendingSteerText,attachments:[]},n.pendingSteerText=null),w===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,w={text:M.message,attachments:[]})}if(w!==void 0){let M=w;w=void 0;let N=hp(e.stats.permissionMode),Q=Sl({buffer:M.text,promptText:N,isTTY:!!process.stdout.isTTY,attachmentSummary:Gd([...M.attachments])});e.replRenderer.writeLine(Q),O=M.text.trim(),W=M.attachments}else{let M=S;S=void 0;let N=await o.readLine({promptFn:()=>hp(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{iR(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=N.text.trim(),W=N.attachments}if(!O&&W.length===0)continue;if(O.startsWith("!")){let M=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(v||(v=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(O))){e.statusLine.rearm();continue}}let K=!1;if(O.startsWith("/")){let M=await $9(O,e.slashCtx,W);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){w={text:M.result.message,attachments:W??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){S=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}K=!0}a.push(O),await bqe(e,O);let H=O;if(K){let M=u$(O);if(M){let N=M.name.replace(/^\//,"").split(":").pop()??"";if(N&&DD(N)){let Q={skillName:N,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},se=e.session.current.sessionId,ee=Nl(se),$e=Date.now();B(`[afk trace] preflight.start commandName=${N}`);let De=!1,Gn=await Fl(Q,{cwd:e.stats.cwd??process.cwd(),artifactDir:ee},Je=>{ze()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${N}) failed: `)+(Je instanceof Error?Je.message:String(Je)))});De=Gn!==null,B(`[afk trace] preflight.end commandName=${N} durationMs=${Date.now()-$e} success=${De}`),H=ND(Gn?.manifestBlock,O)}}}let Y=f.drainInjections();Y.length>0&&(H=Y+H);let ie=g.drainInjections();if(ie.length>0&&(H=ie+H),T!==void 0&&(H=T+`
|
|
2171
2171
|
|
|
2172
|
-
`+H,T=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:H,sessionId:e.stats.sessionId},N=await e.hookRegistry.dispatch(M);N.injectContext&&(H=N.injectContext+H)}catch(M){if(M instanceof Re){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${
|
|
2173
|
-
`),Rae=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,EF=30,Mqe=1024,Oqe=8e3,$qe="haiku";async function Dqe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=Bqe(n,Mqe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Oqe),s=t.signal?Uqe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Oc({token:t.token,model:t.model??$qe,system:Iqe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Lqe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=_qe(t.worktreePath);return await Fqe(l,c)}function Lqe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Rae.test(t)&&t.length<=EF)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>EF)break;o=s}return Rae.test(o)?o:null}async function Fqe(e,t){if(!await Nqe(Cae(t,e)))return e;let n=Pqe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,EF-5)}-${n}`}async function Nqe(e){try{return await Cqe.access(e),!0}catch{return!1}}function Bqe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Uqe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function _ae(e){let t,n,r=Cae(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Dqe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${cw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Aae(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Aae(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Aae(e,t){e&&e.setCwd(t),jqe(t)}function jqe(e){try{process.chdir(e)}catch{}}kt();It();bc();Po();U();import{spawn as Iae}from"child_process";import{existsSync as Mae,mkdirSync as qqe,readFileSync as Oae,unlinkSync as Pae,writeFileSync as $ae}from"fs";import{get as zqe}from"https";import{join as Dae}from"path";import{readFileSync as Hqe}from"fs";import{dirname as Wqe,join as Kqe}from"path";import{fileURLToPath as Gqe}from"url";function Oo(){try{return"5.191.
|
|
2172
|
+
`+H,T=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:H,sessionId:e.stats.sessionId},N=await e.hookRegistry.dispatch(M);N.injectContext&&(H=N.injectContext+H)}catch(M){if(M instanceof Re){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${le(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof eo){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(E=C=_=void 0,eU(),oU(),await vae({text:H,attachments:W},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onQueuedUserMessage(M){await t.appendQueuedUser(M)},async onTurnComplete(M,N){if(await t.appendTurn(M,N),e.stats.sessionId)try{Es(e.stats)}catch(Q){x||(x=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(Q instanceof Error?Q.message:String(Q))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(fr(e.stats,e.contextSampler,e.gitStatusSampler,R)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,N)=>{p?.push(M),E=M.kind,C=N?.doneHasCorroboratingEvidence,_=N?.doneEvidenceClassification},setActiveCompositor:M=>{n.activeCompositor=M,M===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setTaskViewHandler:M=>o.setTaskViewHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(fr(e.stats,e.contextSampler,e.gitStatusSampler,R)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(M,N)=>{c.repaint(M),u?.onStage(M,N)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(hp(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...E!==void 0?{terminalState:E}:{},...C!==void 0?{doneHasCorroboratingEvidence:C}:{},..._!==void 0?{doneEvidenceClassification:_}:{}},void 0,gqe);M.injectContext&&M.injectContext.trim().length>0&&(T=M.injectContext)}catch(M){if(M instanceof Dt)throw M;M instanceof eo?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof Re?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${le(M.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(M))}}}finally{n.steerReadLine=null,n.pendingSteerRead=null,n.pendingSteerText=null}}function wqe(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function Tae(e,t,n,r){let o=await pse(),i=new oR({rl:e.rl,history:o,statusLine:e.statusLine}),s=wqe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await $se(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=Xse(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await kae(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Vm();cu();import{execFile as Sqe}from"node:child_process";import{dirname as vqe,isAbsolute as kqe,resolve as Tqe}from"node:path";import{promisify as xqe}from"node:util";var xae=xqe(Sqe),Eqe=3e3,Rqe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Aqe(){let t=(await xae("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=kqe(t)?t:Tqe(process.cwd(),t);return vqe(n)}async function Eae(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Aqe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Eqe)});try{let o=ir({execFile:xae,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>Rqe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}nb();Vm();import{promises as Cqe}from"node:fs";import{dirname as _qe,join as Cae}from"node:path";import{randomBytes as Pqe}from"node:crypto";var Iqe=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
2173
|
+
`),Rae=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,EF=30,Mqe=1024,Oqe=8e3,$qe="haiku";async function Dqe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=Bqe(n,Mqe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Oqe),s=t.signal?Uqe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Oc({token:t.token,model:t.model??$qe,system:Iqe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Lqe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=_qe(t.worktreePath);return await Fqe(l,c)}function Lqe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Rae.test(t)&&t.length<=EF)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>EF)break;o=s}return Rae.test(o)?o:null}async function Fqe(e,t){if(!await Nqe(Cae(t,e)))return e;let n=Pqe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,EF-5)}-${n}`}async function Nqe(e){try{return await Cqe.access(e),!0}catch{return!1}}function Bqe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Uqe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function _ae(e){let t,n,r=Cae(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Dqe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${cw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Aae(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Aae(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Aae(e,t){e&&e.setCwd(t),jqe(t)}function jqe(e){try{process.chdir(e)}catch{}}kt();It();bc();Po();U();import{spawn as Iae}from"child_process";import{existsSync as Mae,mkdirSync as qqe,readFileSync as Oae,unlinkSync as Pae,writeFileSync as $ae}from"fs";import{get as zqe}from"https";import{join as Dae}from"path";import{readFileSync as Hqe}from"fs";import{dirname as Wqe,join as Kqe}from"path";import{fileURLToPath as Gqe}from"url";function Oo(){try{return"5.191.4"}catch{}try{let e=Wqe(Gqe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Hqe(Kqe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var Jqe=64*1024,Vqe=10800*1e3,Yqe=800,Xqe=3600*1e3,Qqe="update-check.json",Zqe="pending-update.json";function RF(){return Dae(ea(),Qqe)}function Dh(){return Dae(ea(),Zqe)}function AF(){let e=ea();Mae(e)||qqe(e,{recursive:!0})}function Lae(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Fae(){try{let e=Oae(RF(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Nae(){try{AF();let e=`
|
|
2174
2174
|
const https = require('https');
|
|
2175
2175
|
const fs = require('fs');
|
|
2176
2176
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|
|
@@ -2202,8 +2202,8 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
|
2202
2202
|
Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
2203
2203
|
`),process.exitCode=1;return}let s=ot(),a=Jae({cli:r.worktreeOnExit,env:k.AFK_WORKTREE_ON_EXIT,config:s.interactive?.worktreeOnExit,isTTY:!!process.stdout.isTTY,console});r.thinkingUi=uze(r,s),zr(Jr($y(r.theme,s.theme)));let l=k.AFK_WORKTREE_BRANCH_PREFIX??s.interactive?.worktreeBranchPrefix,c=r.worktreeBase??k.AFK_WORKTREE_BASE??s.interactive?.worktreeBase,u={};l!==void 0&&(u.branchPrefix=l),c!==void 0&&(u.baseRef=c);let d=Object.keys(u).length>0?u:void 0,p=k.AFK_WORKTREE_BOOT_PRUNE==="0",f=await Eae({disabled:p}),g=cze(r,s),h=vs(),y=r.worktree===!0&&g&&h!==void 0,w,S,v;if(r.worktree!==void 0)try{y?(v=await SW(d),i.text="Worktree will be named from your first message"):(S=await uw(r.worktree,d),w=S.path,i.text=`Worktree ready at ${S.path} (branch: ${S.branch})`)}catch(ee){i.fail("Worktree setup failed"),J(ee)}let x=f.ran&&f.removedCount>0?`Pruned ${f.removedCount} stale worktree(s). Run /worktree list for details.`:void 0,T=[],E;try{E=await Qie(r,{bootWarnings:T,...w!==void 0?{cwd:w}:{}})}catch(ee){i.fail("Invalid options"),uF(T),J(ee)}let C=n.join(" ").trim();if(C&&(E.initialInput=C),v!==void 0&&h!==void 0){let ee=v,$e=h;E.firstTurnHook=async De=>{let Gn=Zae({text:"Naming & creating worktree\u2026",...hh}).start(),Je=await _ae({deferred:ee,message:De,token:$e,session:E.session.current,...l!==void 0?{branchPrefix:l}:{}}).finally(()=>Gn.stop());if(Je.status==="created"||Je.status==="created-fallback"){S=ee.handle(),E.stats.cwd=Je.path;let qn=Jl.relative(process.cwd(),Je.path)||Je.path;if(Je.status==="created")console.log(m.dim(" \u21AA worktree: ")+`${qn} `+m.dim(`(branch: ${Je.branch})`));else{let Gt=lze(Je.reason,Je.detail),Ve=Gt!==void 0?m.dim(` \u2014 ${Gt}`):"";console.log(m.dim(" \u21AA worktree: ")+`${qn} `+m.dim(`(branch: ${Je.branch})`)+Ve)}}else console.warn(m.warning("\u26A0 ")+`Worktree creation failed: ${Je.reason}. `+m.dim(`Continuing in ${Bg(process.cwd(),{maxWidth:60})} (no isolation).`))}}let _,R=new AbortController;E.resolveWorktreeDisposition=ee=>{if(_!==void 0)return _;let $e=ee?E.slashCtx.getCompositor?.()??null:null;return _=Vae({...$e!==null?{picker:De=>An($e,{...De,signal:R.signal})}:{},isTTY:ee&&!!process.stdout.isTTY,policy:a,turnCount:E.stats.totalTurns,hasWorktree:S!==void 0,console}).then(De=>{E.worktreeDisposition=De}),_},wl(async()=>{await E.resolveWorktreeDisposition?.(!1),E.teardownTrustedSkillEvents?.(),Be.uninstall(),E.bgSummarizer?.stop(),await E.backgroundRegistry.cancelAll().catch(()=>{}),await E.session.current.close(),E.mcpManager&&await E.mcpManager.disconnectAll(),E.memoryStore.close(),S!==void 0&&await S.cleanup({force:E.stats.totalTurns===0,disposition:E.worktreeDisposition})}),i.succeed("Session ready"),S!==void 0?console.log(m.dim(" \u21AA worktree: ")+m.dim(Bg(S.path,{maxWidth:60}))+m.dim(` (branch: ${S.branch})`)):v!==void 0&&console.log(m.dim(" \u21AA worktree: named & created from your first message"));let P=await nse(()=>E.stats.model);console.log(m.dim(` transcript: ${P.path()}`)),wl(async()=>{await P.appendEnded()});let I=!1,$=()=>{if(E.stats.totalTurns===0)return;let ee=Es(E.stats);return I=!0,ee};wl(async()=>{if(!I)try{$()}catch{}});let j={turnInFlight:!1,lastSigintAt:0};E.getInFlight=()=>j.turnInFlight;let O=1500,W=()=>{let ee=Date.now();if(j.tryAbortShellForeground&&j.tryAbortShellForeground()){j.lastSigintAt=ee;return}if(j.turnInFlight){j.lastSigintAt=ee;let $e=j.activeCompositor;if(j.interruptPickerAbort){j.interruptPickerAbort.abort(),j.interruptPickerAbort=null,E.session.current?.abort("sigint"),E.rl.close();return}if($e&&$e.isArmed()){qae({compositor:$e,turnState:j,onStop:()=>{j.requestSoftStop?j.requestSoftStop():E.session.current.interrupt().catch(()=>{}),j.notifyInterrupting?.(!0)},onCancel:()=>{E.session.current?.abort("sigint"),E.rl.close()},onSteer:()=>{let Je=(async()=>{let qn=j.steerReadLine;if(!qn)return j.interruptPickerAbort=null,null;try{let Gt=await qn(j.interruptPickerAbort?.signal);return Gt.trim().length>0?Gt:null}catch{return null}finally{j.interruptPickerAbort=null}})();j.pendingSteerRead=Je}});return}j.requestSoftStop?j.requestSoftStop():E.session.current.interrupt().catch(()=>{}),j.notifyInterrupting?.(!0);let De=`
|
|
2204
2204
|
`+m.info("\u2139 ")+"Press Ctrl+C again to exit.";if($e&&$e.isArmed())try{$e.commitAbove(De)}catch{console.log(De)}else console.log(De);return}if(ee-j.lastSigintAt<O){E.session.current?.abort("sigint"),E.rl.close();return}j.lastSigintAt=ee,console.log(`
|
|
2205
|
-
`+m.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",W),wl(async()=>{process.removeListener("SIGINT",W)});let q=!1,K=()=>{if(q)return;q=!0,E.session.current?.abort("sigterm"),R.abort();try{E.rl.close()}catch{}setTimeout(()=>{$T().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGTERM",K),wl(async()=>{process.removeListener("SIGTERM",K)});let H=!1,Y=()=>{if(H)return;H=!0,E.session.current?.abort("sighup"),R.abort();try{E.rl.close()}catch{}setTimeout(()=>{$T().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGHUP",Y),wl(async()=>{process.removeListener("SIGHUP",Y)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H");let
|
|
2206
|
-
`+HB({mode:"Interactive Mode",model:E.stats.model,version:Oo(),...S!==void 0?{worktree:S.branch}:{},cwd:w??process.cwd(),...ee!==void 0?{metaLine:ee}:{},hintLine:dze()})),x!==void 0&&console.log(m.dim(` ${x}`)),E.resumeTarget&&Jx(E.stats,E.completionWriter),Zie({isTTY:!!process.stdout.isTTY,isResume:E.resumeTarget!==void 0}),uF(E.bootWarnings),console.log()}finally{process.stdout.write=M,process.stderr.write=N}E.preArmAnchorRow=
|
|
2205
|
+
`+m.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",W),wl(async()=>{process.removeListener("SIGINT",W)});let q=!1,K=()=>{if(q)return;q=!0,E.session.current?.abort("sigterm"),R.abort();try{E.rl.close()}catch{}setTimeout(()=>{$T().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGTERM",K),wl(async()=>{process.removeListener("SIGTERM",K)});let H=!1,Y=()=>{if(H)return;H=!0,E.session.current?.abort("sighup"),R.abort();try{E.rl.close()}catch{}setTimeout(()=>{$T().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGHUP",Y),wl(async()=>{process.removeListener("SIGHUP",Y)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H");let ie=1,M=process.stdout.write.bind(process.stdout),N=process.stderr.write.bind(process.stderr),Q=ee=>(typeof ee=="string"?ee:ee instanceof Uint8Array?Buffer.from(ee).toString("utf8"):String(ee)).match(/\n/g)?.length??0,se=ee=>(($e,...De)=>(ie+=Q($e),ee($e,...De)));process.stdout.write=se(M),process.stderr.write=se(N);try{if(yR!==null){let{updateInfo:$e,pendingMessage:De}=yR;yR=null,De!==null&&process.stderr.write(De),$e!==null&&mR($e)}let ee=E.resumeTarget?`Resuming ${E.resumeTarget.id} \xB7 ${E.stats.totalTurns} prior turn${E.stats.totalTurns===1?"":"s"}`:void 0;console.log(`
|
|
2206
|
+
`+HB({mode:"Interactive Mode",model:E.stats.model,version:Oo(),...S!==void 0?{worktree:S.branch}:{},cwd:w??process.cwd(),...ee!==void 0?{metaLine:ee}:{},hintLine:dze()})),x!==void 0&&console.log(m.dim(` ${x}`)),E.resumeTarget&&Jx(E.stats,E.completionWriter),Zie({isTTY:!!process.stdout.isTTY,isResume:E.resumeTarget!==void 0}),uF(E.bootWarnings),console.log()}finally{process.stdout.write=M,process.stderr.write=N}E.preArmAnchorRow=ie,Dd(process.stdout,Fg(process.cwd(),!1)),E.statusLine.start(),E.slashCtx.ui.repaintStatusLine(),E.rl.on("close",async()=>{E.statusLine.stop(),Dd(process.stdout,""),pze(E,S,$),console.log(m.info("\u2139 ")+"Goodbye!"),await $T(),process.exit(0)}),await Tae(E,P,j,W)});Qae(t,e)}function pze(e,t,n){if(e.stats.totalTurns===0)return;console.log(ae("Session Summary"));let r=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,he(Date.now()-e.stats.sessionStartTime)];r.push(...Mi({costUsd:e.stats.totalCostUsd,tokens:e.stats.totalTokens})),console.log(m.dim(" "+r.join(" \xB7 ")));let o=t?Jl.basename(t.path):"none";console.log(m.dim(` model: ${e.stats.model} \xB7 worktree: ${o}`));try{let s=e.stats.cwd??process.cwd(),l=sze("git",["diff","--shortstat","HEAD"],{cwd:s,encoding:"utf8",timeout:2e3}).trim();console.log(m.dim(` edits: ${l||"no files changed"}`))}catch{}let i=e.stats.sessionId;try{let s=n();!i&&s&&(i=Jl.basename(s,".json"))}catch{}i&&console.log(m.dim(" Continue with: ")+m.brand(As(i,e.stats.model))),console.log()}F();import mze from"ora";Qu();Ge();ht();kt();It();function rle(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=mze("Checking status...").start();try{let r=ut(),o=oe(r),i=tn(r),s=o==="openai-compatible"||o==="openai-codex";await new Ut({model:s?"gpt-4o-mini":"haiku",...i!==void 0?{apiKey:i}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`);let l=ou();if(t.format==="json"){let c=vs(),u=sT(),d=c?k.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,p=u?k.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!c,source:d},codex:{ok:!!u,source:p}},model:String(r),permissionMode:l,bypass:l==="bypassPermissions"},null,2))}else{let c=l==="bypassPermissions"?{label:"Permissions",value:"Bypass \u2014 path containment off (read/write anywhere)",kind:"warn"}:{label:"Permissions",value:`Contained \u2014 mode: ${l}`,kind:"info"};console.log(`
|
|
2207
2207
|
`+DB("Agent AFK \xB7 Status",[{label:"Provider",value:o,kind:"info"},{label:"Auth",value:s?i?"Found (OPENAI_API_KEY / CODEX_API_KEY)":"Reading ~/.codex/auth.json (run `afk provider auth diagnose`)":i?"Found (ANTHROPIC_API_KEY)":"Falling back to Claude OAuth",kind:i?"ok":"warn"},{label:"Model",value:String(r),kind:"info"},c])+`
|
|
2208
2208
|
`)}}catch(r){n.fail("Connection failed"),J(r)}})}F();L();Ge();It();import{readFileSync as fze}from"fs";import ole from"chalk";function yp(e){return process.stdin.isTTY||(console.error(ole.red(`Cannot securely prompt for secret on a non-TTY stdin: "${e.trim()}"`)),console.error(ole.gray(" Supply the token via environment variable or ~/.afk/config/afk.env instead.")),process.exit(1)),new Promise(t=>{process.stdout.write(e);let n=[];process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf-8");let r=o=>{o==="\r"||o===`
|
|
2209
2209
|
`||o===""?(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",r),process.stdout.write(`
|
|
@@ -2353,8 +2353,8 @@ Multiple chats found:`)),o.forEach((l,c)=>{let u=l.username?`@${l.username}`:l.f
|
|
|
2353
2353
|
`).filter(Boolean):[]}catch{return[]}}var fN=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
|
|
2354
2354
|
${t.map(n=>` ${n}`).join(`
|
|
2355
2355
|
`)}`),this.name="FarmIsolationViolation",this.dirtyFiles=t}};function I4e(e,t){return e.length>=t?e:e+" ".repeat(t-e.length)}function M4e(e){if(e===void 0)return m.dim("\u2014");if(e===null)return m.dim("skipped");let t=e.fail===0&&e.pass>0?m.success("tests\u2713"):m.error("tests\u2717"),n=e.lint_ok===!0?m.success("lint\u2713"):e.lint_ok===!1?m.error("lint\u2717"):m.dim("lint?"),r=e.loc_delta>0?"+":"",o=m.dim(`${r}${e.loc_delta} LoC`);return`${t} ${n} ${o}`}function O4e(e,t,n,r){let o="\u2500".repeat(45);console.log(m.dim(o)),console.log(`farm: ${e}`),console.log(`slug: ${t}`),console.log("");let i=r.some(u=>u.score!=null),s=i?Jh(r.map(u=>({index:u.index,score:u.score??null}))).map(u=>r.find(d=>d.index===u)):r;for(let u=0;u<s.length;u++){let d=s[u],p=n.find(S=>S.index===d.index),f=d.ok?m.success("\u2713"):m.error("\u2717"),g=I4e(p.branch,40),h=d.ok?m.dim(`(${d.commitCount} commit${d.commitCount===1?"":"s"})`):m.error(`[error: ${d.error}]`),y=i?m.brand(`#${u+1} `):"",w=i?` ${M4e(d.score)}`:"";console.log(`${y}branch-${d.index} ${f} ${g} ${h}${w}`),console.log(m.dim(` worktree: ${p.path}`))}console.log(m.dim(o));let a=r.filter(u=>u.ok).length,l=r.length;console.log(`${a}/${l} branches completed.`);let c=r.some(u=>u.score!=null&&u.score.pass>0);i&&!c&&console.log(m.warning("\u26A0 no branch passed tests \u2014 ranking falls back to lint + LoC"))}function $4e(e,t,n){let r=t.map(a=>{let l=e.branches.find(u=>u.index===a.index),c={index:a.index,branch:l?.branch??`(unknown-${a.index})`,ok:a.ok,commitCount:a.commitCount};return l?.label!==void 0&&(c.label=l.label),a.error!==void 0&&(c.error=a.error),a.score!==void 0&&(c.score=a.score),c}),o=Jh(t.map(a=>({index:a.index,score:a.score??null}))),i;for(let a of o){let l=t.find(c=>c.index===a);if(!(!l||!l.ok||!l.score)&&l.score.pass>0&&l.score.fail===0){i=a;break}}if(i===void 0)for(let a of o){let l=t.find(c=>c.index===a);if(l?.ok&&l.score){i=a;break}}let s={taskName:e.taskName,taskSlug:e.taskSlug,baseSha:e.baseRef,startedAt:n,completedAt:new Date().toISOString(),branches:r};return i!==void 0&&(s.winner=i),e.human_decision!==void 0&&(s.human_decision=e.human_decision),s}async function D4e(e){let{task:t,branches:n,labels:r,model:o,baseRef:i,cwd:s=process.cwd(),failFast:a,taskSlug:l,score:c=!0,scoreTimeoutMs:u=BR,memoryWrite:d=!0,digest:p=!0,_createFarm:f=lue,_runSubagentDAG:g=Xk,_getCommitCount:h=_4e,_getSourceRepoDirtyFiles:y=P4e,_scoreBranch:w=mue,_writeScore:S=fue,_writeFarmFact:v=yue,_sendFarmDigest:x=wue,_setFarmMemoryFactId:T=cue,_createTraceWriter:E=Ro}=e,C=new Date().toISOString();(!Number.isInteger(n)||n<1||n>16)&&(console.error(m.error(`--branches must be between 1 and 16 (got ${n})`)),process.exit(1)),r!==void 0&&r.length!==n&&(console.error(m.error(`--labels count (${r.length}) must equal --branches (${n})`)),process.exit(1));let _;try{_=await f({taskName:t,count:n,labels:r,cwd:s,baseRef:i,taskSlug:l})}catch(M){console.error(m.error(`Farm creation failed: ${M instanceof Error?M.message:String(M)}`)),process.exit(1)}let R=_.baseRef,P=o??ut(),I=Tn().prompt??"",$=_.branches.map(M=>({id:`branch-${M.index}`,agentType:`branch-${M.index}${M.label?` (${M.label})`:""}`,systemPrompt:I,promptBuilder:N=>(console.log(`[branch-${M.index}] started`),[`Task: ${t}`,"",`You are working in a dedicated git worktree. Your working directory has been set to: ${M.path}`,`Your branch is: ${M.branch}`,"","Complete the task. All file operations are restricted to this worktree by the runtime."].join(`
|
|
2356
|
-
`)),model:P,idPrefix:`farm-${_.taskSlug}-branch-${M.index}`,cwd:M.path,readRoots:[M.path],writeRoots:[M.path]})),j=E(),O=new AbortController,W=new ke({parentAbortSignal:O.signal,...j!==null?{traceWriter:j.writer}:{},surface:"cli"}),q={sessionId:`farm-${_.taskSlug}`,abortSignal:O.signal,surface:"cli"},K;try{K=await g({manager:W,parentSession:q,nodes:$,edges:[],failFast:a})}catch(M){throw console.error(m.error(`Farm dispatch failed: ${M instanceof Error?M.message:String(M)}`)),M}finally{O.abort()}let H=[];for(let M of _.branches){let N=K.failed.find(ee=>ee.id===`branch-${M.index}`),Q=K.skipped.includes(`branch-${M.index}`);if(N||Q){let ee=N?N.error.message:"skipped";console.log(`[branch-${M.index}] \u2717 failed: ${ee}`),H.push({index:M.index,ok:!1,commitCount:0,error:ee});continue}let
|
|
2357
|
-
\u26A0 ISOLATION VIOLATION`)),console.error(m.error(M.message)),process.exit(1)}let
|
|
2356
|
+
`)),model:P,idPrefix:`farm-${_.taskSlug}-branch-${M.index}`,cwd:M.path,readRoots:[M.path],writeRoots:[M.path]})),j=E(),O=new AbortController,W=new ke({parentAbortSignal:O.signal,...j!==null?{traceWriter:j.writer}:{},surface:"cli"}),q={sessionId:`farm-${_.taskSlug}`,abortSignal:O.signal,surface:"cli"},K;try{K=await g({manager:W,parentSession:q,nodes:$,edges:[],failFast:a})}catch(M){throw console.error(m.error(`Farm dispatch failed: ${M instanceof Error?M.message:String(M)}`)),M}finally{O.abort()}let H=[];for(let M of _.branches){let N=K.failed.find(ee=>ee.id===`branch-${M.index}`),Q=K.skipped.includes(`branch-${M.index}`);if(N||Q){let ee=N?N.error.message:"skipped";console.log(`[branch-${M.index}] \u2717 failed: ${ee}`),H.push({index:M.index,ok:!1,commitCount:0,error:ee});continue}let se=await h(M.path,R);if(se===0){let ee="no commits made";console.log(`[branch-${M.index}] \u2717 failed: ${ee}`),H.push({index:M.index,ok:!1,commitCount:0,error:ee})}else console.log(`[branch-${M.index}] \u2713 done`),H.push({index:M.index,ok:!0,commitCount:se})}let Y=await y(s);if(c)for(let M of H){if(!M.ok){M.score=null;continue}let N=_.branches.find(se=>se.index===M.index);console.log(`[branch-${M.index}] scoring\u2026`);let Q=await w({branchPath:N.path,baseSha:R,timeoutMs:u});M.score=Q;try{await S(_.farmDir,M.index,Q)}catch(se){console.error(m.warning(`[branch-${M.index}] score.json write failed: ${se instanceof Error?se.message:String(se)}`))}}if(O4e(t,_.taskSlug,_.branches,H),d||p){let M=$4e(_,H,C);if(d){let N=v(M);if("skipped"in N)console.error(m.warning(`[memory] write skipped: ${N.reason}`));else{let{factId:Q}=N;try{await T(_.taskSlug,Q)}catch(se){console.error(m.warning(`[memory] setFarmMemoryFactId failed: ${se.message}`))}}}if(p){let N=await x(M);N.sent?console.log(m.dim(`[telegram] digest sent (${N.chatCount} chat${N.chatCount===1?"":"s"})`)):N.reason&&N.reason!=="telegram unconfigured"&&console.error(m.warning(`[telegram] digest failed: ${N.reason}`))}}if(Y.length>0){let M=new fN(Y);console.error(m.error(`
|
|
2357
|
+
\u26A0 ISOLATION VIOLATION`)),console.error(m.error(M.message)),process.exit(1)}let ie=H.every(M=>M.ok);process.exit(ie?0:1)}function vue(e){e.command("farm").description("Run a task across N speculative git worktree branches in parallel").argument("<task>","Task description to run on each branch").option("-n, --branches <number>","Number of branches to spawn (1-16)","3").option("--labels <labels>","Comma-separated branch labels (count must equal --branches)").option("-m, --model <model>","Model to use",ut()).option("--base-ref <ref>","Base git ref (default: HEAD)").option("--cwd <path>","Source repo root (default: process.cwd())").option("--fail-fast","Abort remaining branches on first failure",!1).option("--task-slug <slug>","Deterministic task slug override (for tests)").option("--no-score","Skip the post-run scorer (tests + lint + LoC)").option("--score-timeout <ms>",`Per-branch test timeout in ms (default ${BR})`).option("--no-memory","Skip writing the farm-run fact to cross-session memory").option("--no-digest","Skip pushing the Telegram digest on completion").action(async(t,n)=>{let r=parseInt(n.branches,10),o=n.labels?n.labels.split(",").map(s=>s.trim()).filter(Boolean):void 0,i=n.scoreTimeout?parseInt(n.scoreTimeout,10):void 0;i!==void 0&&(!Number.isFinite(i)||i<1)&&(console.error(m.error(`--score-timeout must be a positive integer (got "${n.scoreTimeout}")`)),process.exit(1));try{await D4e({task:t,branches:r,labels:o,model:n.model,baseRef:n.baseRef,cwd:n.cwd,failFast:n.failFast,taskSlug:n.taskSlug,score:n.score,memoryWrite:n.memory,digest:n.digest,...i!==void 0?{scoreTimeoutMs:i}:{}})}catch(s){console.error(s),process.exitCode=1}})}F();L();import{execFile as L4e}from"node:child_process";cu();It();import{promisify as F4e}from"node:util";var gN=F4e(L4e);async function kue(){try{return(await gN("git",["rev-parse","--show-toplevel"])).stdout.trim()}catch{throw new Error("Not in a git repository.")}}function N4e(e){return["empty","orphaned-dir","orphaned-registration","dead-owner"].includes(e)?m.error("yes"):e==="stale-dirty"||e==="stale-clean"?m.warning("warn"):m.success("no")}var Tue=["interactive","diagnose","all"];function B4e(e){if(Tue.includes(e))return e;throw new Error(`Invalid --scope value: '${e}'. Allowed: ${Tue.join(" | ")}.`)}function U4e(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function xue(e){let t=e.command("worktree").description("Manage git worktrees created by afk");t.command("list").description("List all afk-managed worktrees and show prune candidates (dry-run only)").action(async()=>{let n;try{n=await kue()}catch(i){J(i)}let r;try{r=await ir({execFile:gN,repoRoot:n,dryRun:!0})}catch(i){J(new Error(`Sweep failed: ${i.message}`))}let o=["PATH".padEnd(45),"OWNER".padEnd(12),"AGE".padEnd(6),"STATUS".padEnd(22),"PRUNE?"].join(" | ");console.log(m.heading(o)),console.log("-".repeat(o.length));for(let i of r.candidates){let s=[i.path.slice(-44).padEnd(45),i.owner.padEnd(12),U4e(i.ageMs).padEnd(6),i.verdict.padEnd(22),N4e(i.verdict)].join(" | ");console.log(s)}if(r.candidates.length===0&&console.log(m.dim(" (no afk-managed worktrees found)")),r.warnings.length>0){console.log("");for(let i of r.warnings)console.log(m.warning(i))}}),t.command("prune").description("Remove stale, empty, and orphaned worktrees").option("--apply","Execute removals (default is dry-run)",!1).option("--max-age-days-clean <n>","Max age (days) for clean worktrees before removal").option("--max-age-days-dirty <n>","Max age (days) for dirty worktrees before warning").option("--scope <scope>","Scope: interactive | diagnose | all","all").action(async n=>{let r;try{r=await kue()}catch(S){J(S)}let i=ot().daemon?.worktreePrune,s=parseInt(k.AFK_WORKTREE_MAX_AGE_CLEAN??"",10),a=parseInt(k.AFK_WORKTREE_MAX_AGE_DIRTY??"",10),l=n.maxAgeDaysClean!==void 0?parseInt(n.maxAgeDaysClean,10):i?.maxAgeDaysClean??(Number.isNaN(s)?14:s),c=n.maxAgeDaysDirty!==void 0?parseInt(n.maxAgeDaysDirty,10):i?.maxAgeDaysDirty??(Number.isNaN(a)?30:a),u;try{u=B4e(n.scope)}catch(S){J(S)}let d={execFile:gN,repoRoot:r,dryRun:!n.apply,maxAgeDaysClean:l,maxAgeDaysDirty:c,scope:u,...n.apply===!0?{bypassSoftLaunch:!0}:{}},p;try{p=await ir(d)}catch(S){J(new Error(`Sweep failed: ${S.message}`))}p.dryRun&&console.log(m.warning("\u{1F50D} Dry-run mode \u2014 no changes made."));let f={};for(let S of p.candidates)f[S.verdict]=(f[S.verdict]??0)+1;let g=p.warnings.filter(S=>S.startsWith("[WARN]")).length,h=p.warnings.filter(S=>S.startsWith("[ERROR]")).length,y=Object.entries(f).sort(([S],[v])=>S.localeCompare(v)).map(([S,v])=>`${S}=${v}`);console.log(`Removed: ${p.removed.length}, Warned: ${g}, Errors: ${h}`+(y.length>0?` [${y.join(" ")}]`:""));for(let S of p.candidates){let x=p.removed.includes(S.path)?m.error("\u2717"):m.success("\u2713");console.log(` ${x} [${S.verdict.padEnd(22)}] ${S.path}`)}if(p.warnings.length>0){console.log("");for(let S of p.warnings)S.startsWith("[ERROR]")?console.error(m.error(S)):console.log(m.warning(S))}p.warnings.some(S=>S.startsWith("[ERROR]"))&&process.exit(1)})}L();import{spawn as j4e}from"child_process";var H4e=/^\d+\.\d+\.\d+(-[\da-z.]+)?$/i;function W4e(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let i=0;i<o;i++){let s=n[i]??0,a=r[i]??0;if(a>s)return!0;if(a<s)return!1}return!1}function Eue(e){e.command("update").alias("upgrade").description("Update agent-afk to the latest published version").option("--check","Only check whether an update is available; do not install").option("--pin <version>","Install a specific version instead of latest (must be valid semver)").action(async t=>{let n=Oo();if(t.check===!0){process.stderr.write(`Checking for updates\u2026
|
|
2358
2358
|
`);let s=await hR();if(s===void 0){console.log(m.warning("Could not reach the npm registry to check for updates.")),console.log(m.dim(` Current: ${n}`)),process.exitCode=1;return}if(gR(s),W4e(n,s)){console.log(`${m.bold("Update available:")} ${m.dim(n)} \u2192 ${m.bold(s)}`),console.log(m.dim(" Run `afk update` to install."));return}console.log(`agent-afk ${m.bold(n)} is up to date.`);return}if(t.pin!==void 0&&!H4e.test(t.pin)){console.error(m.warning(`Invalid version: ${JSON.stringify(t.pin)}. Must be valid semver (e.g. 1.2.3 or 1.2.3-beta.1).`)),process.exitCode=1;return}let r=t.pin;if(r===void 0){if(process.stderr.write(`Fetching latest version\u2026
|
|
2359
2359
|
`),r=await hR(),r===void 0){console.error(m.warning("Could not reach the npm registry. Aborting.")),process.exitCode=1;return}if(gR(r),r===n){console.log(`agent-afk ${m.bold(n)} is up to date.`);return}}console.log(`Updating agent-afk: ${m.dim(n)} \u2192 ${m.bold(r)}`),console.log(m.dim(` npm install -g agent-afk@${r}`));let{code:o,signal:i}=await K4e(r);o===0?(CF(r),console.log(m.success(`\u2713 agent-afk@${r} installed.`))):i!==null?(console.error(m.warning(`npm install was killed by signal ${i}.`)),process.exitCode=1):(console.error(m.warning(`npm install exited with code ${o??1}.`)),process.exitCode=o??1)})}function K4e(e){return new Promise(t=>{let n=j4e("npm",["install","-g",`agent-afk@${e}`],{stdio:"inherit"});n.on("error",()=>t({code:1,signal:null})),n.on("exit",(r,o)=>t({code:r,signal:o}))})}import{existsSync as G4e,readFileSync as q4e}from"node:fs";Cw();U();pP();function Rue(e){let t=e.command("schedule").description("Manage scheduled daemon tasks");t.command("add").description("Add a new scheduled task").requiredOption("--name <name>","Human-readable label").requiredOption("--command <cmd>","Command to run").requiredOption("--cron <expr>","Cron expression (5-field)").option("--trigger <mode>","cron | sessionstart | both","cron").option("--notify <when>","failure | always | never","failure").option("--disabled","Add in disabled state",!1).action(async n=>{try{let r=Ew({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger,notifyOn:n.notify,enabled:!n.disabled});(r.enabled?await rr("POST","/tasks",{taskId:r.id,command:r.command,cron:r.cron,trigger:r.trigger,notifyOn:r.notifyOn}):await rr("DELETE",`/tasks/${r.id}`)).synced||console.error(`\u26A0\uFE0F ${zi}`),console.log(`\u2705 Added: ${r.id} \u2014 ${r.name}`)}catch(r){J(r)}}),t.command("list").description("List all scheduled tasks").action(()=>{try{let n=Ln();if(n.length===0){console.log("No scheduled tasks.");return}let r="ID | NAME | CRON | ENABLED",o="-".repeat(r.length);console.log(r),console.log(o);for(let i of n)console.log([i.id.padEnd(20),i.name.padEnd(30),i.cron.padEnd(15),String(i.enabled)].join(" | "))}catch(n){J(n)}}),t.command("remove <id>").description("Permanently remove a scheduled task").action(async n=>{try{Rw(n)||(console.error(`Task not found: ${n}`),process.exit(1)),(await rr("DELETE",`/tasks/${n}`)).synced||console.error(`\u26A0\uFE0F ${zi}`),console.log(`\u2705 Removed: ${n}`)}catch(r){J(r)}}),t.command("enable <id>").description("Enable a scheduled task").action(async n=>{try{let r=lf(n);r||(console.error(`Task not found: ${n}`),process.exit(1));let o=Ln();qi(o.map(s=>s.id===n?{...s,enabled:!0,updatedAt:new Date().toISOString()}:s)),(await rr("POST","/tasks",{taskId:r.id,command:r.command,cron:r.cron,trigger:r.trigger,notifyOn:r.notifyOn})).synced||console.error(`\u26A0\uFE0F ${zi}`),console.log(`\u2705 Enabled: ${n}`)}catch(r){J(r)}}),t.command("disable <id>").description("Disable a scheduled task").action(async n=>{try{lf(n)||(console.error(`Task not found: ${n}`),process.exit(1));let o=Ln();qi(o.map(s=>s.id===n?{...s,enabled:!1,updatedAt:new Date().toISOString()}:s)),(await rr("DELETE",`/tasks/${n}`)).synced||console.error(`\u26A0\uFE0F ${zi}`),console.log(`\u2705 Disabled: ${n}`)}catch(r){J(r)}}),t.command("logs <id>").description("Show recent execution history for a task").option("-n, --limit <n>","Number of records to show","10").action((n,r)=>{try{let o=Math.min(Math.max(1,parseInt(r.limit,10)||10),50),i=wr();if(!G4e(i)){console.log(`No telemetry found for task: ${n}`);return}let s=q4e(i),c=(s.length>1048576?s.subarray(s.length-1048576):s).toString("utf-8").split(`
|
|
2360
2360
|
`),u=[];for(let p=c.length-1;p>=0;p-=1){let f=c[p];if(f)try{let g=JSON.parse(f);if(g.taskId!==n)continue;if(u.push(g),u.length>=o)break}catch{continue}}let d=u.reverse();if(d.length===0){console.log(`No history found for task: ${n}`);return}console.log(JSON.stringify(d,null,2))}catch(o){J(o)}})}Fv();function Aue(e){return new Date(e).toISOString().replace("T"," ").slice(0,19)}function Ep(e,t){return e.length>=t?e:e+" ".repeat(t-e.length)}var Cue=9,UR=50,_ue=22;function z4e(e){let t=Ep(e.jobId,_ue),n=Ep(e.status,Cue),r=e.label.length>UR?`${e.label.slice(0,UR-1)}\u2026`:Ep(e.label,UR),o=Aue(e.startedAt),i=e.endedAt!==void 0?Aue(e.endedAt):"\u2014";return`${t} ${n} ${r} ${o} ${i}`}function J4e(e){return e.type==="done"||e.type==="error"}function Pue(e){let t=e.command("bg").description(`Inspect persisted background subagent job logs.
|