agent-afk 5.25.11 → 5.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +27 -27
- package/dist/index.mjs +4 -4
- package/dist/telegram.mjs +4 -4
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1088,7 +1088,7 @@ Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2
|
|
|
1088
1088
|
[output truncated]`,C=!0),d({content:R,...C?{truncated:!0}:{}})}),p.on("error",S=>{let R;if(m===void 0&&Jo(S))try{R=zr(S,process.cwd())}catch{R=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${S.message}`}else R=zr(S,m);d({content:`Failed to execute grep: ${R}`,isError:!0})})})}}var Nx,Bx=A(()=>{"use strict";dr();Jr();zo();xl();Nx=vy()});import{promises as _G}from"fs";var Ux,jx=A(()=>{"use strict";Jr();Ux=async(e,t,n)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let o=e.path;if(typeof o!="string")throw new Error("Invalid input: path must be a string");let i;try{i=cn(o,n,"read")}catch(s){return{content:s instanceof Error?s.message:String(s),isError:!0}}try{let s=await _G.readdir(i,{withFileTypes:!0}),a=s.filter(u=>u.isDirectory()).map(u=>`${u.name}/`),l=s.filter(u=>!u.isDirectory()).map(u=>u.name);a.sort(),l.sort();let c=[...a,...l];return c.length===0?{content:"(empty directory)"}:{content:c.join(`
|
|
1089
1089
|
`)}}catch(s){if(s instanceof Error){let a=s;return a.code==="ENOENT"?{content:`Directory not found: ${i}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${i}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${i}`,isError:!0}:{content:`Error listing directory: ${s.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}}});function IG(e=ds){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Hx)return{content:`Invalid input: message exceeds Telegram's ${Hx}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=E.TELEGRAM_BOT_TOKEN;if(!i)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let s=cs();if(s.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of s){let c=await e({token:i,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===s.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${s.length-a.length}/${s.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:s.length===1?`Sent Telegram message to chat ${s[0]}.`:`Sent Telegram message to ${s.length} chats.`}}}var Hx,Wx,Kx=A(()=>{"use strict";J();Wr();Yd();Hx=4096;Wx=IG()});import{JSDOM as PG}from"jsdom";import{Readability as MG}from"@mozilla/readability";import OG from"turndown";function Gx(e){return e.replace(/\n{3,}/g,`
|
|
1090
1090
|
|
|
1091
|
-
`).trim()}function $G(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function zx(e,t){let r=new PG(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new MG(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=Gx(ky.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=Gx(ky.turndown(a));return{title:o,markdown:l,textLength:$G(s),usedFallback:!0}}var qx,ky,Jx=A(()=>{"use strict";qx=200,ky=new OG({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});ky.remove(["script","style","noscript","iframe"])});function FG(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 Vx(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function LG(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 Tu(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??FG,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!DG.has(u.status)||d===o)return u;let m=LG(u,s)??Vx(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=Vx(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var DG,Ey=A(()=>{"use strict";Te();DG=new Set([429,502,503,504])});import{readFileSync as NG}from"node:fs";import{join as BG}from"path";function UG(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function Yx(e,t){return UG(t).test(e)}function WG(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(jG.has(t))return!0;if(HG.has(t))return!1}return!1}function Xx(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function KG(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function Zx(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tl(t),t}function GG(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function qG(e){try{return NG(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function zG(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=Zx(t.defaultProfile)),n}function Qx(e){let t=e?.env??E,n=e?.readFileSync??qG,r=e?.surface??t.AGENT_SURFACE,o=WG(t.AFK_BROWSER_HEADLESS,r),i=Xx(t.AFK_BROWSER_ALLOWED_DOMAINS),s=Xx(t.AFK_BROWSER_BLOCKED_DOMAINS),a=GG(t.AFK_BROWSER_DOM_SNAPSHOTS),l=KG(t.AFK_BROWSER_BACKEND),c=Zx(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():BG(hn(),"browser.json"),p=n(m);if(p===void 0)return d;let g;try{g=JSON.parse(p)}catch(b){throw new Error(`Failed to parse browser config at ${m}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=zG(d,g);return h.configPath=m,h}function Ty(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(Yx(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>Yx(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var jG,HG,xy=A(()=>{"use strict";J();G();jG=new Set(["daemon","subagent","telegram","afk"]),HG=new Set(["repl","interactive","cli"])});import Vo from"node:fs";import xu from"node:path";import{randomBytes as JG}from"node:crypto";import{chromium as VG}from"playwright";function YG(){try{return"5.25.11"}catch{}try{let e=xu.resolve(import.meta.dirname,"../../../package.json"),t=Vo.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var XG,Ru,eR=A(()=>{"use strict";G();Te();XG=YG(),Ru=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=VG.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${XG}`}}loadStorageState(t){let n=nl(t);try{if(!Vo.existsSync(n))return;let r=JSON.parse(Vo.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nl(t);if(!Vo.existsSync(r))return;let o=await n.storageState(),i=xu.join(xu.dirname(r),`.${xu.basename(r)}.${process.pid}.${JG(4).toString("hex")}.tmp`);Vo.writeFileSync(i,JSON.stringify(o),{mode:384}),Vo.chmodSync(i,384),Vo.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as ZG}from"crypto";function Ry(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of QG)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function tR(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&e2.test(e.label))}function nR(e){return ZG("sha256").update(e,"utf8").digest("hex").slice(0,8)}function rR(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var QG,e2,Al=A(()=>{"use strict";QG=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];e2=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as t2}from"node:crypto";function n2(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function r2(e,t,n){return`el_${t2("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function o2(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function oR(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function sR(e,t){let n=e.role??"",r=e.name??"";iR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])sR(i,t)}async function i2(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},aR).catch(()=>[])}async function s2(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,p=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),p!==void 0&&(g.checked=p),o.push(g)}return o},aR).catch(()=>[])}function a2(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Au(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=a2(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=i2(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,p,g,h]=await Promise.all([s,a,l,c,d]),b,y=!1;u!==null?(b=[],sR(u,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await s2(e)).filter(M=>iR.has(M.role??"")));let w=new Map;for(let k of m){let M=oR(k.name),N=w.get(M);(!N||N.bbox.w===0&&k.bbox.w>0)&&w.set(M,k)}let v=b.map(k=>({ax:k,dom:w.get(oR(k.name??""))})),T=r?v:v.filter(k=>k.dom?k.dom.bbox.w>0||k.dom.bbox.h>0:!0);T.sort((k,M)=>{let N=k.dom?.bbox.y??0,L=M.dom?.bbox.y??0;if(N!==L)return N-L;let B=k.dom?.bbox.x??0,H=M.dom?.bbox.x??0;return B-H}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((k,M)=>{let N=k.ax.role??"generic",L=k.ax.name??"",B=r2(N,L,M),H=k.dom?.bbox??{x:0,y:0,w:0,h:0},$=k.dom?.type??null,I=null;k.ax.value!==void 0&&k.ax.value!==null&&(I=String(k.ax.value)),k.ax.checked!==void 0&&(I=String(k.ax.checked)),tR({role:N,kind:$})&&(I="[redacted]");let O={disabled:k.ax.disabled??!1};k.ax.checked!==void 0&&(O.checked=k.ax.checked===!0||k.ax.checked==="mixed"),k.ax.selected!==void 0&&(O.selected=k.ax.selected),k.ax.expanded!==void 0&&(O.expanded=k.ax.expanded);let F;k.dom?.testId?F=`[data-testid="${k.dom.testId}"]`:k.dom?.id&&(F=`#${k.dom.id}`);let U={id:B,role:N,label:n2(L),kind:$,value:I,state:O,bbox:H};return F!==void 0&&(U.selector=F),U}),C="idle";try{let k=await e.evaluate(()=>document.readyState);k==="loading"?C="loading":k==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let _=o2(p),j=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:j,url:g,title:h,textSummary:_,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var iR,aR,lR=A(()=>{"use strict";Al();iR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);aR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function cR(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Ay(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>cR(e,i)))).filter(o=>o!==null)}async function l2(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 Cy(e,t,n){switch(t.kind){case"element_id":return c2(e,t,n);case"selector":return d2(e,t);case"semantic":return u2(e,t)}}async function c2(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 Ay(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function d2(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 Ay(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function u2(e,t){return t.role!==void 0?p2(e,t.text,t.role):m2(e,t.text,t)}async function p2(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 Ay(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function m2(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await l2(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),p=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let y=await cR(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,v=0;for(let T=0;T<w.length;T++)v=v*31+w.charCodeAt(T)>>>0;p.push({...y,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:p}}var dR=A(()=>{"use strict"});import{randomBytes as f2}from"crypto";import{mkdir as g2,stat as h2,writeFile as y2}from"fs/promises";import{join as _y}from"path";import{gzip as b2}from"zlib";import{promisify as w2}from"util";function S2(e){return _y(Oo(e),"browser")}function v2(e){return _y(S2(e),"screenshots")}function k2(){return new Date().toISOString().replace(/[:.]/g,"-")}function E2(){return f2(3).toString("hex")}async function Iy(e,t,n){if(t.length>uR)throw new Error(`writeScreenshotSidecar: buffer exceeds ${uR} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=v2(e);await g2(r,{recursive:!0});let o=`${k2()}-${E2()}-${n}.png`,i=_y(r,o);await y2(i,t);let{size:s}=await h2(i);return{path:i,bytes:s}}var Fge,uR,pR=A(()=>{"use strict";G();Al();Fge=w2(b2);uR=5*1024*1024});var fR={};md(fR,{PlaywrightProvider:()=>Py});function mR(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 Py,gR=A(()=>{"use strict";eR();lR();dR();xy();Al();pR();Py=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ru(t)}async open(t){let n=Ty(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Au(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Au(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 Cy(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mR(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Ry(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(b){c=b}else c=h}let u=r.url();if(u!==i){let h=Ty(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let p=await Au(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,p.interactive,p.url,p.title,g),c!==null)throw c;return p}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await Cy(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mR(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Iy(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Iy(n,o,r);return i}catch{return null}}}});var Xo={};md(Xo,{__resetBrowserRegistryForTests:()=>C2,browserProviderActive:()=>R2,closeBrowserProvider:()=>My,getBrowserProvider:()=>x2,peekBrowserProvider:()=>A2});function hR(){Promise.resolve(My()).then(()=>{process.exit(130)})}function yR(){Promise.resolve(My()).then(()=>{process.exit(143)})}function bR(){Nn=null}function T2(){Cu||(process.on("SIGINT",hR),process.on("SIGTERM",yR),process.on("exit",bR),Cu=!0)}function wR(){Cu&&(process.removeListener("SIGINT",hR),process.removeListener("SIGTERM",yR),process.removeListener("exit",bR),Cu=!1)}async function x2(e){return Nn!==null?Nn:(Yo!==null||(Yo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(gR(),fR)),n=Qx(e),r=new t(n);return T2(),Nn=r,Yo=null,r})()),Yo)}async function My(){if(Nn===null)return;let e=Nn;Nn=null,Yo=null,wR(),await e.shutdown()}function R2(){return Nn!==null}function A2(){return Nn}function C2(){Nn=null,Yo=null,wR()}var Nn,Yo,Cu,Zo=A(()=>{"use strict";xy();Nn=null,Yo=null,Cu=!1});function SR(e,t){try{return zx(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function O2(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Zo(),Xo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function vR(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??O2,o=null,i=e,s=null,a=null;try{let c=await Tu(n,e,{headers:M2,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(P2.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(I2.test(d)&&!_2.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=SR(u,i)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<qx)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=SR(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var _2,I2,P2,M2,kR=A(()=>{"use strict";Jx();Ey();Te();_2=/(text\/html|application\/xhtml\+xml)/i,I2=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,P2=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,M2={"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 F2(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t($2,{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),D2),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=qo(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function ER(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?F2({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 TR(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1091
|
+
`).trim()}function $G(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function zx(e,t){let r=new PG(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new MG(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=Gx(ky.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=Gx(ky.turndown(a));return{title:o,markdown:l,textLength:$G(s),usedFallback:!0}}var qx,ky,Jx=A(()=>{"use strict";qx=200,ky=new OG({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});ky.remove(["script","style","noscript","iframe"])});function FG(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 Vx(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function LG(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 Tu(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??FG,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!DG.has(u.status)||d===o)return u;let m=LG(u,s)??Vx(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=Vx(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var DG,Ey=A(()=>{"use strict";Te();DG=new Set([429,502,503,504])});import{readFileSync as NG}from"node:fs";import{join as BG}from"path";function UG(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function Yx(e,t){return UG(t).test(e)}function WG(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(jG.has(t))return!0;if(HG.has(t))return!1}return!1}function Xx(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function KG(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function Zx(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tl(t),t}function GG(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function qG(e){try{return NG(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function zG(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=Zx(t.defaultProfile)),n}function Qx(e){let t=e?.env??E,n=e?.readFileSync??qG,r=e?.surface??t.AGENT_SURFACE,o=WG(t.AFK_BROWSER_HEADLESS,r),i=Xx(t.AFK_BROWSER_ALLOWED_DOMAINS),s=Xx(t.AFK_BROWSER_BLOCKED_DOMAINS),a=GG(t.AFK_BROWSER_DOM_SNAPSHOTS),l=KG(t.AFK_BROWSER_BACKEND),c=Zx(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():BG(hn(),"browser.json"),p=n(m);if(p===void 0)return d;let g;try{g=JSON.parse(p)}catch(b){throw new Error(`Failed to parse browser config at ${m}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=zG(d,g);return h.configPath=m,h}function Ty(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(Yx(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>Yx(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var jG,HG,xy=A(()=>{"use strict";J();G();jG=new Set(["daemon","subagent","telegram","afk"]),HG=new Set(["repl","interactive","cli"])});import Vo from"node:fs";import xu from"node:path";import{randomBytes as JG}from"node:crypto";import{chromium as VG}from"playwright";function YG(){try{return"5.26.0"}catch{}try{let e=xu.resolve(import.meta.dirname,"../../../package.json"),t=Vo.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var XG,Ru,eR=A(()=>{"use strict";G();Te();XG=YG(),Ru=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=VG.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${XG}`}}loadStorageState(t){let n=nl(t);try{if(!Vo.existsSync(n))return;let r=JSON.parse(Vo.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nl(t);if(!Vo.existsSync(r))return;let o=await n.storageState(),i=xu.join(xu.dirname(r),`.${xu.basename(r)}.${process.pid}.${JG(4).toString("hex")}.tmp`);Vo.writeFileSync(i,JSON.stringify(o),{mode:384}),Vo.chmodSync(i,384),Vo.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as ZG}from"crypto";function Ry(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of QG)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function tR(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&e2.test(e.label))}function nR(e){return ZG("sha256").update(e,"utf8").digest("hex").slice(0,8)}function rR(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var QG,e2,Al=A(()=>{"use strict";QG=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];e2=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as t2}from"node:crypto";function n2(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function r2(e,t,n){return`el_${t2("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function o2(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function oR(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function sR(e,t){let n=e.role??"",r=e.name??"";iR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])sR(i,t)}async function i2(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},aR).catch(()=>[])}async function s2(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,p=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),p!==void 0&&(g.checked=p),o.push(g)}return o},aR).catch(()=>[])}function a2(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Au(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=a2(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=i2(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,p,g,h]=await Promise.all([s,a,l,c,d]),b,y=!1;u!==null?(b=[],sR(u,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await s2(e)).filter(M=>iR.has(M.role??"")));let w=new Map;for(let k of m){let M=oR(k.name),N=w.get(M);(!N||N.bbox.w===0&&k.bbox.w>0)&&w.set(M,k)}let v=b.map(k=>({ax:k,dom:w.get(oR(k.name??""))})),T=r?v:v.filter(k=>k.dom?k.dom.bbox.w>0||k.dom.bbox.h>0:!0);T.sort((k,M)=>{let N=k.dom?.bbox.y??0,L=M.dom?.bbox.y??0;if(N!==L)return N-L;let B=k.dom?.bbox.x??0,H=M.dom?.bbox.x??0;return B-H}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((k,M)=>{let N=k.ax.role??"generic",L=k.ax.name??"",B=r2(N,L,M),H=k.dom?.bbox??{x:0,y:0,w:0,h:0},$=k.dom?.type??null,I=null;k.ax.value!==void 0&&k.ax.value!==null&&(I=String(k.ax.value)),k.ax.checked!==void 0&&(I=String(k.ax.checked)),tR({role:N,kind:$})&&(I="[redacted]");let O={disabled:k.ax.disabled??!1};k.ax.checked!==void 0&&(O.checked=k.ax.checked===!0||k.ax.checked==="mixed"),k.ax.selected!==void 0&&(O.selected=k.ax.selected),k.ax.expanded!==void 0&&(O.expanded=k.ax.expanded);let F;k.dom?.testId?F=`[data-testid="${k.dom.testId}"]`:k.dom?.id&&(F=`#${k.dom.id}`);let U={id:B,role:N,label:n2(L),kind:$,value:I,state:O,bbox:H};return F!==void 0&&(U.selector=F),U}),C="idle";try{let k=await e.evaluate(()=>document.readyState);k==="loading"?C="loading":k==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let _=o2(p),j=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:j,url:g,title:h,textSummary:_,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var iR,aR,lR=A(()=>{"use strict";Al();iR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);aR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function cR(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Ay(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>cR(e,i)))).filter(o=>o!==null)}async function l2(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 Cy(e,t,n){switch(t.kind){case"element_id":return c2(e,t,n);case"selector":return d2(e,t);case"semantic":return u2(e,t)}}async function c2(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 Ay(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function d2(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 Ay(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function u2(e,t){return t.role!==void 0?p2(e,t.text,t.role):m2(e,t.text,t)}async function p2(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 Ay(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function m2(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await l2(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),p=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let y=await cR(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,v=0;for(let T=0;T<w.length;T++)v=v*31+w.charCodeAt(T)>>>0;p.push({...y,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:p}}var dR=A(()=>{"use strict"});import{randomBytes as f2}from"crypto";import{mkdir as g2,stat as h2,writeFile as y2}from"fs/promises";import{join as _y}from"path";import{gzip as b2}from"zlib";import{promisify as w2}from"util";function S2(e){return _y(Oo(e),"browser")}function v2(e){return _y(S2(e),"screenshots")}function k2(){return new Date().toISOString().replace(/[:.]/g,"-")}function E2(){return f2(3).toString("hex")}async function Iy(e,t,n){if(t.length>uR)throw new Error(`writeScreenshotSidecar: buffer exceeds ${uR} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=v2(e);await g2(r,{recursive:!0});let o=`${k2()}-${E2()}-${n}.png`,i=_y(r,o);await y2(i,t);let{size:s}=await h2(i);return{path:i,bytes:s}}var Fge,uR,pR=A(()=>{"use strict";G();Al();Fge=w2(b2);uR=5*1024*1024});var fR={};md(fR,{PlaywrightProvider:()=>Py});function mR(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 Py,gR=A(()=>{"use strict";eR();lR();dR();xy();Al();pR();Py=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ru(t)}async open(t){let n=Ty(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Au(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Au(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 Cy(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mR(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Ry(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(b){c=b}else c=h}let u=r.url();if(u!==i){let h=Ty(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let p=await Au(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,p.interactive,p.url,p.title,g),c!==null)throw c;return p}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await Cy(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mR(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Iy(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Iy(n,o,r);return i}catch{return null}}}});var Xo={};md(Xo,{__resetBrowserRegistryForTests:()=>C2,browserProviderActive:()=>R2,closeBrowserProvider:()=>My,getBrowserProvider:()=>x2,peekBrowserProvider:()=>A2});function hR(){Promise.resolve(My()).then(()=>{process.exit(130)})}function yR(){Promise.resolve(My()).then(()=>{process.exit(143)})}function bR(){Nn=null}function T2(){Cu||(process.on("SIGINT",hR),process.on("SIGTERM",yR),process.on("exit",bR),Cu=!0)}function wR(){Cu&&(process.removeListener("SIGINT",hR),process.removeListener("SIGTERM",yR),process.removeListener("exit",bR),Cu=!1)}async function x2(e){return Nn!==null?Nn:(Yo!==null||(Yo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(gR(),fR)),n=Qx(e),r=new t(n);return T2(),Nn=r,Yo=null,r})()),Yo)}async function My(){if(Nn===null)return;let e=Nn;Nn=null,Yo=null,wR(),await e.shutdown()}function R2(){return Nn!==null}function A2(){return Nn}function C2(){Nn=null,Yo=null,wR()}var Nn,Yo,Cu,Zo=A(()=>{"use strict";xy();Nn=null,Yo=null,Cu=!1});function SR(e,t){try{return zx(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function O2(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Zo(),Xo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function vR(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??O2,o=null,i=e,s=null,a=null;try{let c=await Tu(n,e,{headers:M2,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(P2.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(I2.test(d)&&!_2.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=SR(u,i)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<qx)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=SR(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var _2,I2,P2,M2,kR=A(()=>{"use strict";Jx();Ey();Te();_2=/(text\/html|application\/xhtml\+xml)/i,I2=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,P2=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,M2={"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 F2(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t($2,{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),D2),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=qo(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function ER(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?F2({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 TR(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1092
1092
|
|
|
1093
1093
|
(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(`
|
|
1094
1094
|
`).trimEnd()}var $2,D2,xR=A(()=>{"use strict";zo();$2="https://api.exa.ai/search",D2=10});function K2(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=L2;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,N2)}let a=B2;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,U2)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function Oy(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+j2}function G2(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return W2.some(o=>r.includes(o))}function q2(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=K2(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await Tu(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(p){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(p){return{content:`web_scrape read error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}return{content:Oy(m,i.maxBytes)}}if(i.mode==="markdown")try{let u=await vR(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0}:{content:Oy(u.markdown,i.maxBytes)}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),p=G2(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${p}`,isError:!0}}let d=ER({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:H2,timeoutMs:i.timeoutMs,signal:s.signal});return{content:Oy(TR(i.query,u),i.maxBytes)}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var L2,N2,B2,U2,j2,H2,W2,RR,AR=A(()=>{"use strict";kR();xR();Ey();L2=3e4,N2=12e4,B2=1e6,U2=1e7,j2=`
|
|
@@ -1169,7 +1169,7 @@ On your first turn, decide whether to call memory_search based on the request:
|
|
|
1169
1169
|
- If hot memory (shown in <cross-session-memory> tags above) already covers the relevant context, skip the search.
|
|
1170
1170
|
- Search at most once per session for general context. Search again only if new information surfaces a specific topic worth querying.
|
|
1171
1171
|
|
|
1172
|
-
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Ml(e,t){let n=(u,m)=>{if(!(u==null&&m==null))return(u??0)+(m??0)},r=(u,m)=>m!==void 0?m:u,o={stopReason:t.stopReason??e.stopReason??null},i=n(e.inputTokens,t.inputTokens);i!==void 0&&(o.inputTokens=i);let s=n(e.outputTokens,t.outputTokens);s!==void 0&&(o.outputTokens=s);let a=r(e.cachedInputTokens,t.cachedInputTokens);a!==void 0&&(o.cachedInputTokens=a);let l=r(e.cacheCreationTokens,t.cacheCreationTokens);l!==void 0&&(o.cacheCreationTokens=l);let c=n(e.totalTokens,t.totalTokens);c!==void 0&&(o.totalTokens=c);let d=n(e.totalCostUsd,t.totalCostUsd);return d!==void 0&&(o.totalCostUsd=d),o}var eb=A(()=>{"use strict"});function Sz(){let e=E.AFK_VISION_MODELS,t=[],n=[];if(e)for(let r of e.split(",")){let o=r.trim().toLowerCase();if(o)if(o.startsWith("!")){let i=o.slice(1).trim();i&&n.push(i)}else t.push(o)}return{enable:t,disable:n}}function OA(e,t){return e===t||e.includes(t)}function $A(e){if(!e)return!1;let t=(Ur(e)??e).trim();if(!t)return!1;let n=t.toLowerCase(),{enable:r,disable:o}=Sz();return o.some(i=>OA(n,i))?!1:r.some(i=>OA(n,i))||bz.has(n)?!0:wz.some(i=>i.test(t))}function DA(e){let t=e.trim().toLowerCase();return t.includes("/")?t.slice(t.lastIndexOf("/")+1):t}function ti(e){return e?/^o[0-9]/.test(DA(e)):!1}function Ol(e){if(!e)return!1;if(ti(e))return!0;let t=DA(e);return vz.some(n=>n.test(t))}var bz,wz,vz,ks=A(()=>{"use strict";J();nn();bz=new Set(["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4-turbo","o1","o3","o4-mini"]),wz=[/^claude-/i,/^gpt-4o/i,/^gpt-4\.1/i,/^gpt-4-turbo/i,/^gpt-4-vision/i,/^gpt-5/i,/(?:^|[/_-])(?:vl|vlm)(?:[/_.-]|$)/i,/(?:^|[/_-])(?:llava|pixtral|internvl|cogvlm|idefics|moondream|janus)/i,/(?:vision|minicpm-?[vo]|qwen[\d.]*-?vl|llama-?3\.2-\d+b-vision|gemma-3|phi-3\.5-vision|phi-4-multimodal)/i];vz=[/^gpt-5/]});function $l(e){let t=String(e).trim().toLowerCase(),n=np[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Ur(e)??String(e);return np[r]??np[r.toLowerCase()]??kz}function xz(e){if(!e)return!1;let t=e.trim().toLowerCase();return t?!!(t.includes("/")||t.startsWith("gpt-")||t.startsWith("gpt_")||ti(t)||t.startsWith("codex-")||t.startsWith("codex_")||t==="codex"):!1}function Gt(e){let t=String(e).trim().toLowerCase(),n=Es[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Ur(e)??String(e),o=Es[r]??Es[r.toLowerCase()];return o!==void 0?o:xz(r)?Tz:Ez}function LA(e){let t=Gt(e);if(String(e).trim().toLowerCase().endsWith("_1m"))return t;let r=Ur(e)??String(e),o=FA[r]??FA[r.toLowerCase()];return o!==void 0?Math.min(t,o):t}var np,kz,Es,Ez,Tz,FA,Ts=A(()=>{"use strict";nn();ks();np={opus:128e3,opus_1m:128e3,sonnet:128e3,sonnet_1m:128e3,haiku:64e3,fable:128e3,"claude-opus-4-8":128e3,"claude-sonnet-5":128e3,"claude-haiku-4-5-20251001":64e3,"claude-fable-5":128e3},kz=64e3;Es={opus:2e5,opus_1m:1e6,sonnet:1e6,sonnet_1m:1e6,haiku:2e5,fable:1e6,"claude-fable-5":1e6,"claude-sonnet-5":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"gpt-4.1":1e6,"gpt-4.1-mini":1e6,o1:2e5,"o1-mini":128e3,o3:2e5,"o3-mini":2e5,"o4-mini":2e5,"mlx-community/qwen3-30b-a3b-4bit":128e3,"mlx-community/qwen3-32b-4bit":128e3,"mlx-community/qwen2.5-coder-32b-instruct-4bit":131072},Ez=2e5,Tz=262144;FA={"claude-sonnet-5":2e5}});import{readFileSync as Rz}from"node:fs";import{homedir as Az}from"node:os";import{join as Cz}from"node:path";function _z(e){try{return Rz(e,"utf-8")}catch{return null}}function ni(e,t={}){let n=t.readEnv??(c=>process.env[c]),r=(t.homedir??Az)(),o=t.readFile??_z;if(e&&e.length>0)return{apiKey:e,source:"config",last4:Dl(e)};let i=n("OPENAI_API_KEY");if(i&&i.length>0)return{apiKey:i,source:"env",last4:Dl(i),envVar:"OPENAI_API_KEY"};let s=n("CODEX_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:Dl(s),envVar:"CODEX_API_KEY"};let a=Cz(r,".codex","auth.json"),l=o(a);if(l!==null){let c=Iz(l);if(c.kind==="apikey")return{apiKey:c.apiKey,source:"codex-cli",last4:Dl(c.apiKey)};if(c.kind==="chatgpt"){if(Pz(n)&&c.accessToken){let d={apiKey:c.accessToken,source:"chatgpt-oauth",last4:Dl(c.accessToken)};return c.accountId!==void 0&&(d.accountId=c.accountId),c.expiresAt!==void 0&&(d.expiresAt=c.expiresAt),d}return{apiKey:null,source:"no-usable-auth-codex-oauth"}}}return{apiKey:null,source:"no-usable-auth"}}function Iz(e){let t;try{t=JSON.parse(e)}catch{return{kind:"invalid"}}if(typeof t!="object"||t===null)return{kind:"invalid"};let n=t,r=n.OPENAI_API_KEY;if(typeof r=="string"&&r.length>0)return{kind:"apikey",apiKey:r};let o=n.tokens,i=typeof o=="object"&&o!==null?o:null,s=i&&typeof i.access_token=="string"?i.access_token:void 0;if(n.auth_mode==="chatgpt"||s){let a={kind:"chatgpt"};if(s&&(a.accessToken=s),i){let l=Mz(i);l!==void 0&&(a.accountId=l);let c=Oz(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function Dl(e){return e.length<=4?e:e.slice(-4)}function Pz(e){let t=e("AFK_OPENAI_CHATGPT_OAUTH");if(!t)return!1;let n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}function NA(e){let t=e.split(".");if(t.length<2||!t[1])return null;try{let n=Buffer.from(t[1],"base64url").toString("utf-8"),r=JSON.parse(n);return typeof r=="object"&&r!==null?r:null}catch{return null}}function Mz(e){let t=e.account_id;if(typeof t=="string"&&t.length>0)return t;for(let n of["access_token","id_token"]){let r=e[n];if(typeof r!="string")continue;let o=NA(r);if(!o)continue;let i=o["https://api.openai.com/auth"];if(typeof i=="object"&&i!==null){let a=i.chatgpt_account_id;if(typeof a=="string"&&a.length>0)return a}let s=o.chatgpt_account_id;if(typeof s=="string"&&s.length>0)return s}}function Oz(e){let t=e.access_token;if(typeof t!="string")return;let n=NA(t)?.exp;return typeof n=="number"?n:void 0}function $z(e){if(typeof e!="number")return"";let t=e-Math.floor(Date.now()/1e3);if(t<=0)return", EXPIRED \u2014 re-run `codex` to refresh";let n=Math.floor(t/3600),r=Math.floor(t%3600/60);return`, expires in ${n>0?`${n}h `:""}${r}m`}function Fl(e){switch(e.source){case"config":return`using explicit AFK config API key (\u2026${e.last4??"????"})`;case"env":return`using ${e.envVar??"OPENAI_API_KEY"} env var (\u2026${e.last4??"????"})`;case"codex-cli":return`using Codex CLI API key from ~/.codex/auth.json (\u2026${e.last4??"????"})`;case"chatgpt-oauth":{let t=e.accountId?`\u2026${e.accountId.slice(-4)}`:"unknown",n=$z(e.expiresAt);return`using ChatGPT subscription OAuth from ~/.codex/auth.json (account ${t}${n})`}case"no-usable-auth-codex-oauth":return"Found ChatGPT/OAuth credentials in ~/.codex/auth.json but the OpenAI provider is in API-key mode. To use your ChatGPT subscription, set AFK_OPENAI_CHATGPT_OAUTH=1 (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires). Otherwise run `codex login --api-key` or set OPENAI_API_KEY.";default:return"No OpenAI auth found. Set OPENAI_API_KEY, pass an explicit apiKey in AFK config, or run `codex login --api-key`."}}var Ll=A(()=>{"use strict"});function Dz(e,t){let n=t===1?"An image was":`${t} images were`,r=t===1?"an image":"images",o=t===1?"it":"them",i=e&&e.trim().length>0?`the current model ("${e.trim()}")`:"the current model";return`[${n} attached to this message, but ${i} cannot view images. Acknowledge to the user that you received ${r} but are unable to see ${o}, and suggest switching to a vision-capable model (e.g. gpt-4o or a Claude model).]`}function Fz(e){let t=e.source;return t.type==="base64"?`data:${t.media_type};base64,${t.data}`:t.type==="url"?t.url:null}function BA(e,t){if(typeof e=="string")return e;let n=[],r=0;for(let s of e)typeof s=="object"&&s&&"type"in s&&(s.type==="text"?n.push(s.text):s.type==="image"&&(r+=1));let o=n.join(`
|
|
1172
|
+
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Ml(e,t){let n=(u,m)=>{if(!(u==null&&m==null))return(u??0)+(m??0)},r=(u,m)=>m!==void 0?m:u,o={stopReason:t.stopReason??e.stopReason??null},i=n(e.inputTokens,t.inputTokens);i!==void 0&&(o.inputTokens=i);let s=n(e.outputTokens,t.outputTokens);s!==void 0&&(o.outputTokens=s);let a=r(e.cachedInputTokens,t.cachedInputTokens);a!==void 0&&(o.cachedInputTokens=a);let l=r(e.cacheCreationTokens,t.cacheCreationTokens);l!==void 0&&(o.cacheCreationTokens=l);let c=n(e.totalTokens,t.totalTokens);c!==void 0&&(o.totalTokens=c);let d=n(e.totalCostUsd,t.totalCostUsd);return d!==void 0&&(o.totalCostUsd=d),o}var eb=A(()=>{"use strict"});function Sz(){let e=E.AFK_VISION_MODELS,t=[],n=[];if(e)for(let r of e.split(",")){let o=r.trim().toLowerCase();if(o)if(o.startsWith("!")){let i=o.slice(1).trim();i&&n.push(i)}else t.push(o)}return{enable:t,disable:n}}function OA(e,t){return e===t||e.includes(t)}function $A(e){if(!e)return!1;let t=(Ur(e)??e).trim();if(!t)return!1;let n=t.toLowerCase(),{enable:r,disable:o}=Sz();return o.some(i=>OA(n,i))?!1:r.some(i=>OA(n,i))||bz.has(n)?!0:wz.some(i=>i.test(t))}function DA(e){let t=e.trim().toLowerCase();return t.includes("/")?t.slice(t.lastIndexOf("/")+1):t}function ti(e){return e?/^o[0-9]/.test(DA(e)):!1}function Ol(e){if(!e)return!1;if(ti(e))return!0;let t=DA(e);return vz.some(n=>n.test(t))}var bz,wz,vz,ks=A(()=>{"use strict";J();nn();bz=new Set(["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4-turbo","o1","o3","o4-mini"]),wz=[/^claude-/i,/^gpt-4o/i,/^gpt-4\.1/i,/^gpt-4-turbo/i,/^gpt-4-vision/i,/^gpt-5/i,/(?:^|[/_-])(?:vl|vlm)(?:[/_.-]|$)/i,/(?:^|[/_-])(?:llava|pixtral|internvl|cogvlm|idefics|moondream|janus)/i,/(?:vision|minicpm-?[vo]|qwen[\d.]*-?vl|llama-?3\.2-\d+b-vision|gemma-3|phi-3\.5-vision|phi-4-multimodal)/i];vz=[/^gpt-5/]});function $l(e){let t=String(e).trim().toLowerCase(),n=np[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Ur(e)??String(e);return np[r]??np[r.toLowerCase()]??kz}function xz(e){if(!e)return!1;let t=e.trim().toLowerCase();return t?!!(t.includes("/")||t.startsWith("gpt-")||t.startsWith("gpt_")||ti(t)||t.startsWith("codex-")||t.startsWith("codex_")||t==="codex"):!1}function Gt(e){let t=String(e).trim().toLowerCase(),n=Es[t];if(t.endsWith("_1m")&&n!==void 0)return n;let r=Ur(e)??String(e),o=Es[r]??Es[r.toLowerCase()];return o!==void 0?o:xz(r)?Tz:Ez}function LA(e){let t=Gt(e);if(String(e).trim().toLowerCase().endsWith("_1m"))return t;let r=Ur(e)??String(e),o=FA[r]??FA[r.toLowerCase()];return o!==void 0?Math.min(t,o):t}var np,kz,Es,Ez,Tz,FA,Ts=A(()=>{"use strict";nn();ks();np={opus:128e3,opus_1m:128e3,sonnet:128e3,sonnet_1m:128e3,haiku:64e3,fable:128e3,"claude-opus-4-8":128e3,"claude-sonnet-5":128e3,"claude-haiku-4-5-20251001":64e3,"claude-fable-5":128e3,"gpt-5.5":128e3,"gpt-5.6":128e3,"gpt-5.6-sol":128e3,"gpt-5.6-terra":128e3,"gpt-5.6-luna":128e3},kz=64e3;Es={opus:2e5,opus_1m:1e6,sonnet:1e6,sonnet_1m:1e6,haiku:2e5,fable:1e6,"claude-fable-5":1e6,"claude-sonnet-5":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"gpt-4.1":1e6,"gpt-4.1-mini":1e6,"gpt-5.5":1e6,"gpt-5.6":1e6,"gpt-5.6-sol":1e6,"gpt-5.6-terra":1e6,"gpt-5.6-luna":1e6,o1:2e5,"o1-mini":128e3,o3:2e5,"o3-mini":2e5,"o4-mini":2e5,"mlx-community/qwen3-30b-a3b-4bit":128e3,"mlx-community/qwen3-32b-4bit":128e3,"mlx-community/qwen2.5-coder-32b-instruct-4bit":131072},Ez=2e5,Tz=262144;FA={"claude-sonnet-5":2e5}});import{readFileSync as Rz}from"node:fs";import{homedir as Az}from"node:os";import{join as Cz}from"node:path";function _z(e){try{return Rz(e,"utf-8")}catch{return null}}function ni(e,t={}){let n=t.readEnv??(c=>process.env[c]),r=(t.homedir??Az)(),o=t.readFile??_z;if(e&&e.length>0)return{apiKey:e,source:"config",last4:Dl(e)};let i=n("OPENAI_API_KEY");if(i&&i.length>0)return{apiKey:i,source:"env",last4:Dl(i),envVar:"OPENAI_API_KEY"};let s=n("CODEX_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:Dl(s),envVar:"CODEX_API_KEY"};let a=Cz(r,".codex","auth.json"),l=o(a);if(l!==null){let c=Iz(l);if(c.kind==="apikey")return{apiKey:c.apiKey,source:"codex-cli",last4:Dl(c.apiKey)};if(c.kind==="chatgpt"){if(Pz(n)&&c.accessToken){let d={apiKey:c.accessToken,source:"chatgpt-oauth",last4:Dl(c.accessToken)};return c.accountId!==void 0&&(d.accountId=c.accountId),c.expiresAt!==void 0&&(d.expiresAt=c.expiresAt),d}return{apiKey:null,source:"no-usable-auth-codex-oauth"}}}return{apiKey:null,source:"no-usable-auth"}}function Iz(e){let t;try{t=JSON.parse(e)}catch{return{kind:"invalid"}}if(typeof t!="object"||t===null)return{kind:"invalid"};let n=t,r=n.OPENAI_API_KEY;if(typeof r=="string"&&r.length>0)return{kind:"apikey",apiKey:r};let o=n.tokens,i=typeof o=="object"&&o!==null?o:null,s=i&&typeof i.access_token=="string"?i.access_token:void 0;if(n.auth_mode==="chatgpt"||s){let a={kind:"chatgpt"};if(s&&(a.accessToken=s),i){let l=Mz(i);l!==void 0&&(a.accountId=l);let c=Oz(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function Dl(e){return e.length<=4?e:e.slice(-4)}function Pz(e){let t=e("AFK_OPENAI_CHATGPT_OAUTH");if(!t)return!1;let n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}function NA(e){let t=e.split(".");if(t.length<2||!t[1])return null;try{let n=Buffer.from(t[1],"base64url").toString("utf-8"),r=JSON.parse(n);return typeof r=="object"&&r!==null?r:null}catch{return null}}function Mz(e){let t=e.account_id;if(typeof t=="string"&&t.length>0)return t;for(let n of["access_token","id_token"]){let r=e[n];if(typeof r!="string")continue;let o=NA(r);if(!o)continue;let i=o["https://api.openai.com/auth"];if(typeof i=="object"&&i!==null){let a=i.chatgpt_account_id;if(typeof a=="string"&&a.length>0)return a}let s=o.chatgpt_account_id;if(typeof s=="string"&&s.length>0)return s}}function Oz(e){let t=e.access_token;if(typeof t!="string")return;let n=NA(t)?.exp;return typeof n=="number"?n:void 0}function $z(e){if(typeof e!="number")return"";let t=e-Math.floor(Date.now()/1e3);if(t<=0)return", EXPIRED \u2014 re-run `codex` to refresh";let n=Math.floor(t/3600),r=Math.floor(t%3600/60);return`, expires in ${n>0?`${n}h `:""}${r}m`}function Fl(e){switch(e.source){case"config":return`using explicit AFK config API key (\u2026${e.last4??"????"})`;case"env":return`using ${e.envVar??"OPENAI_API_KEY"} env var (\u2026${e.last4??"????"})`;case"codex-cli":return`using Codex CLI API key from ~/.codex/auth.json (\u2026${e.last4??"????"})`;case"chatgpt-oauth":{let t=e.accountId?`\u2026${e.accountId.slice(-4)}`:"unknown",n=$z(e.expiresAt);return`using ChatGPT subscription OAuth from ~/.codex/auth.json (account ${t}${n})`}case"no-usable-auth-codex-oauth":return"Found ChatGPT/OAuth credentials in ~/.codex/auth.json but the OpenAI provider is in API-key mode. To use your ChatGPT subscription, set AFK_OPENAI_CHATGPT_OAUTH=1 (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires). Otherwise run `codex login --api-key` or set OPENAI_API_KEY.";default:return"No OpenAI auth found. Set OPENAI_API_KEY, pass an explicit apiKey in AFK config, or run `codex login --api-key`."}}var Ll=A(()=>{"use strict"});function Dz(e,t){let n=t===1?"An image was":`${t} images were`,r=t===1?"an image":"images",o=t===1?"it":"them",i=e&&e.trim().length>0?`the current model ("${e.trim()}")`:"the current model";return`[${n} attached to this message, but ${i} cannot view images. Acknowledge to the user that you received ${r} but are unable to see ${o}, and suggest switching to a vision-capable model (e.g. gpt-4o or a Claude model).]`}function Fz(e){let t=e.source;return t.type==="base64"?`data:${t.media_type};base64,${t.data}`:t.type==="url"?t.url:null}function BA(e,t){if(typeof e=="string")return e;let n=[],r=0;for(let s of e)typeof s=="object"&&s&&"type"in s&&(s.type==="text"?n.push(s.text):s.type==="image"&&(r+=1));let o=n.join(`
|
|
1173
1173
|
`);if(r===0)return o;let i=Dz(t,r);return o.length>0?`${o}
|
|
1174
1174
|
|
|
1175
1175
|
${i}`:i}function UA(e,t){if(typeof e=="string")return e;if(!t.vision)return BA(e,t.model);let n=[],r=!1;for(let o of e)if(typeof o=="object"&&o&&"type"in o){if(o.type==="text")n.push({type:"text",text:o.text});else if(o.type==="image"){let i=Fz(o);i!==null&&(n.push({type:"image_url",image_url:{url:i}}),r=!0)}}return r?n:BA(e,t.model)}function Lz(e){if(typeof e=="string")return e;let t=[],n=0;for(let i of e)i.type==="text"?t.push(i.text):n+=1;let r=t.join(`
|
|
@@ -1180,9 +1180,9 @@ ${o}`:o}function Nz(e){let t=e.systemPrompt;if(t!==void 0){if(typeof t=="string"
|
|
|
1180
1180
|
`));let i=Uz(t);return i.length>0&&(o.tools=i),o}function Bz(e){if(e===null)return"";if(typeof e=="string")return e;let t=[];for(let n of e)n.type==="text"?t.push({type:"input_text",text:n.text}):t.push({type:"input_image",image_url:n.image_url.url,detail:"auto"});return t}function Uz(e){return!e||e.length===0?[]:e.map(t=>{let n={type:"function",name:t.function.name,parameters:t.function.parameters};return t.function.description!==void 0&&(n.description=t.function.description),n})}var QA=A(()=>{"use strict"});function tC(e){let t=(e??"").trim().toLowerCase();return t?t.startsWith("claude-")||t.startsWith("claude_")||t==="claude"||t.startsWith("local-")||t.startsWith("local_")?!0:/^(opus|sonnet|haiku)(?:[._-].*)?$/.test(t):!1}function nC(e){if(!e)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Hz(e){let t={"OpenAI-Beta":"responses=experimental",originator:"agent-afk"};return e&&(t["chatgpt-account-id"]=e),t}function rC(e,t=!1){return e.source==="chatgpt-oauth"?{mode:"responses",baseURL:jz,headers:Hz(e.accountId)}:t?{mode:"responses"}:{mode:"chat-completions"}}var jz,eC,oC=A(()=>{"use strict";jz="https://chatgpt.com/backend-api/codex",eC="You are a helpful assistant."});function iC(e){return(e.inputTokens??0)+(e.outputTokens??0)}function ri(e){return e.contextWindowTokens??iC(e)}function Nl(e){return e?{totalTokens:ri(e),apiUsage:{input_tokens:e.inputTokens??0,output_tokens:e.outputTokens??0,cache_read_input_tokens:e.cachedInputTokens??0,cache_creation_input_tokens:e.cacheCreationTokens??0}}:{totalTokens:0,apiUsage:null}}function sb(e,t,n){return t<=0||e<=0||n<=0||n>=1?!1:e/t>=n}var ab=A(()=>{"use strict"});function Hn(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=setTimeout(n,e);r.unref(),t.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}var op=A(()=>{"use strict"});function oi(e,t){if(!t||typeof t!="object")return"";let n=t;if(e==="skill"||e==="Skill"){let s=n.name;return typeof s=="string"&&s.length>0?`(${s.length>60?s.slice(0,59)+"\u2026":s})`:""}let r=n.file_path??n.path??n.filePath;if(typeof r=="string")return" "+r;let o=n.command??n.cmd;if(typeof o=="string"){let s=o.split(`
|
|
1181
1181
|
`)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let i=n.query??n.pattern??n.url??n.description;return typeof i=="string"?" "+i:""}var ip=A(()=>{"use strict"});function sp(e){if(!e||typeof e!="object")return;let t=e,n={};for(let r of Wz){let o=t[r];o!==void 0&&(n[r]=typeof o=="string"&&o.length>4096?o.slice(0,4096):o)}return Object.keys(n).length>0?JSON.stringify(n):void 0}var Wz,lb=A(()=>{"use strict";Wz=["file_path","name","id_prefix"]});import{randomUUID as Kz}from"node:crypto";async function*sC({state:e,signal:t,vision:n,toolDispatcher:r,traceWriter:o,priorTurns:i,sessionId:s}){if(!r)return;let a=rp(e);for(let p of a)p.id.length===0&&(p.id=Kz());let{calls:l,parseErrors:c}=qA(a,t),d=new Map;for(let p of l){let g=Date.now();d.set(p.id,g),Xi(o,{phase:"started",toolUseId:p.id,name:p.name,inputBytes:Buffer.byteLength(JSON.stringify(p.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:p.id,toolName:p.name,toolInput:oi(p.name,p.input),toolInputRaw:sp(p.input),sessionId:s}}let u=[];if(t.aborted)for(let p of l){let g={content:"Tool call aborted",isError:!0};u.push({call:p,result:g}),yield{type:"tool.output",toolUseId:p.id,toolName:p.name,content:g.content,isError:!0,sessionId:s}}else{let p;try{if(r.executeBatch)p=await r.executeBatch(l);else{p=[];for(let g of l){if(t.aborted){p.push({content:"Tool call aborted",isError:!0});continue}try{p.push(await r.execute(g))}catch(h){let b=h instanceof Error?h.message:String(h);p.push({content:`Tool execution threw: ${b}`,isError:!0})}}}}catch(g){let h=g instanceof Error?g.message:String(g);p=l.map(()=>({content:`Tool batch execution failed: ${h}`,isError:!0}))}for(let g=0;g<l.length;g++){let h=l[g],b=p[g],y=c.get(h.id);y!==void 0&&(b={content:`${y}
|
|
1182
1182
|
--
|
|
1183
|
-
${b.content}`,isError:!0,...b.truncated===!0?{truncated:!0}:{}}),u.push({call:h,result:b});let w=d.get(h.id),v=typeof w=="number"?Date.now()-w:0,T=b.truncated===!0||b.content.includes("[output truncated");Xi(o,{phase:"completed",toolUseId:h.id,name:h.name,resultBytes:Buffer.byteLength(b.content,"utf8"),isError:b.isError===!0,truncated:T,durationMs:v,...b.circuitBreaker===!0?{circuitBreaker:!0}:{},...b.failureClass?{failureClass:b.failureClass}:{}}),yield{type:"tool.output",toolUseId:h.id,toolName:h.name,content:b.content,...b.isError===!0?{isError:!0}:{},...b.truncated===!0?{truncated:!0}:{},sessionId:s},b.render?.diff&&(yield{type:"tool.diff",toolUseId:h.id,diff:b.render.diff,sessionId:s})}}i.push(zA(e.assistantText,a,e.reasoningText));for(let p of JA(u))i.push(p);let m=VA(u,{vision:n});m&&i.push(m)}var aC=A(()=>{"use strict";Ie();lb();ip();rb();ob()});function lp(e){return e!==void 0&&e>0?Math.floor(e):0}function cp(e,t){return t>0&&e>=t}var eo,ap,Bl=A(()=>{"use strict";eo="tool_use_loop_capped",ap="You have reached your tool-use budget for this turn. Do not request any more tools \u2014 give your final answer now using only the information already gathered."});function Ul(e){return Gz*Math.pow(2,e)}function cC(e){if(e===null||typeof e!="object")return;let t=e;return typeof t.status=="number"?t.status:void 0}function ub(e){let t=cC(e);return t===void 0?!1:lC.has(t)}function pb(e){let t=cC(e);return t===void 0?!1:lC.has(t)}var lC,cb,db,Gz,mb=A(()=>{"use strict";lC=new Set([429,500,502,503,529]),cb=3,db=3,Gz=2e3});function fb(e,t){let n=$l(e);return typeof t=="number"&&Number.isFinite(t)&&t>0?Math.floor(t):n}function dC(e,t){let n=fb(e,t);return Ol(e)?{max_completion_tokens:n}:{max_tokens:n}}function gb(e){return e??"default"}function uC(e){switch(e){case"low":return"low";case"medium":return"medium";case"high":case"xhigh":case"max":return"high"}}function hb(e,t){if(e!==void 0&&Ol(t))return uC(e)}var yb=A(()=>{"use strict";Ts();ks()});import qz from"openai";function Jz(e){let t={apiKey:e.apiKey};return e.baseURL!==void 0&&(t.baseURL=e.baseURL),e.defaultHeaders!==void 0&&(t.defaultHeaders=e.defaultHeaders),new qz(t)}function pC(){return zz??Jz}var zz,bb=A(()=>{"use strict";zz=null});import{randomUUID as Yz}from"node:crypto";function mC(e,t,n={}){let r=ni(e.apiKey,n.authDeps),o=e.resume??`openai-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i=typeof e.model=="string"?e.model:"gpt-4o-mini",s=Rt(i)??i,a={auth:r,model:s,synthesizedSessionId:o,promptStream:t,config:e};return n.baseURL!==void 0&&(a.baseURL=n.baseURL),n.toolDispatcher!==void 0&&(a.toolDispatcher=n.toolDispatcher),n.onPermissionMode!==void 0&&(a.onPermissionMode=n.onPermissionMode),n.mcpManager!==void 0&&(a.mcpManager=n.mcpManager),n.useResponsesApi!==void 0&&(a.useResponsesApi=n.useResponsesApi),e.traceWriter!==void 0&&(a.traceWriter=e.traceWriter),new dp(a)}var wb,dp,Sb=A(()=>{"use strict";Ie();dl();eb();Ts();ar();vb();Te();Ll();HA();ks();rb();ob();XA();QA();oC();J();ab();Ah();_h();Uo();op();ip();aC();Bl();mb();yb();bb();mb();bb();yb();wb="openai-compatible",dp=class{client;opts;initSessionId;toolDispatcher;onPermissionMode;openAITools;wireMode;traceWriter;priorTurns=[];currentModel;currentPermissionMode;abortController=null;pendingAbortReason=null;closed=!1;closeResolve=null;closedPromise;lastUsage=null;constructor(t){if(this.opts=t,this.initSessionId=t.synthesizedSessionId,this.currentModel=t.model,this.currentPermissionMode=gb(t.config.permissionMode),this.toolDispatcher=t.toolDispatcher,this.onPermissionMode=t.onPermissionMode,this.traceWriter=t.traceWriter,this.toolDispatcher){let o=this.toolDispatcher;Array.isArray(o.toolDefs)&&o.toolDefs.length>0&&(this.openAITools=GA(o.toolDefs))}let n=(t.useResponsesApi??!1)||nC(E.AFK_OPENAI_USE_RESPONSES),r=rC(t.auth,n);if(this.wireMode=r.mode,t.auth.apiKey===null)this.client=null;else{let o=pC(),i={apiKey:t.auth.apiKey},s=r.baseURL??t.baseURL;s!==void 0&&(i.baseURL=s),r.headers!==void 0&&(i.defaultHeaders=r.headers),this.client=o(i)}this.closedPromise=new Promise(o=>{this.closeResolve=()=>o("__closed__")})}activeOpenAITools(){if(!this.openAITools)return;if(this.currentPermissionMode==="plan")return this.openAITools;let t=this.openAITools.filter(n=>n.function.name!==Ht);return t.length>0?t:void 0}async*[Symbol.asyncIterator](){if(yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.currentModel,permissionMode:this.currentPermissionMode,cwd:process.cwd(),tools:this.openAITools?this.openAITools.map(r=>r.function.name):[],slashCommands:[],skills:[],plugins:[],mcpServers:this.opts.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.opts.auth.source,version:wb}},this.opts.auth.apiKey===null){yield{type:"error",error:new Error(Fl(this.opts.auth))};return}let n=this.opts.promptStream[Symbol.asyncIterator]();try{for(;!this.closed;){let r=await Promise.race([n.next(),this.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;yield*this.runTurn(o.value.content)}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}async*runTurn(t){let n=new AbortController;if(this.abortController=n,this.pendingAbortReason!==null&&!n.signal.aborted&&(n.abort(this.pendingAbortReason),this.pendingAbortReason=null),n.signal.aborted)return;let r=Date.now(),o=Yz();be(this.traceWriter,{phase:"loop_start"});try{yield*this._runTurnInner(t,n,r,o)}finally{be(this.traceWriter,{phase:"loop_end",durationMs:Date.now()-r})}}async*_runTurnInner(t,n,r,o){let i=$A(this.currentModel);this.priorTurns.push({role:"user",content:UA(t,{vision:i,model:this.currentModel})});let s={stopReason:null,resultSubtype:"success",isError:!1},a="",l="",c=lp(this.opts.config.maxToolUseIterations),d=!1,u=0;for(;;){if(n.signal.aborted){this.abortController===n&&(this.abortController=null),yield*this.finishTurn(s,r);return}let m=yield*this.runIteration(n,i,d);if(m===null){this.abortController===n&&(this.abortController=null),(n.signal.aborted||this.closed)&&(yield*this.finishTurn(s,r));return}let p=KA(m.state);if(s=Ml(s,p),s.contextWindowTokens=(p.inputTokens??0)+(p.outputTokens??0),this.lastUsage=s,m.text.length>0&&(a=m.text),l=m.state.reasoningText,!m.needsToolDispatch||d)break;yield*this.dispatchAndAppend(m.state,n.signal,i),u+=1;{let g=rp(m.state).at(-1),h=g?.name,b;try{b=g?JSON.parse(g.argumentsRaw||"{}"):void 0}catch{b=void 0}let y=g?`${g.name}${oi(g.name,b)}`:"unknown";yield{type:"progress",progress:{taskId:o,description:"Working",summary:`round ${u}: ${y}`,lastToolName:h,totalTokens:s.totalTokens??0,toolUses:u,durationMs:Date.now()-r},sessionId:this.initSessionId}}if(n.signal.aborted){this.abortController===n&&(this.abortController=null),yield*this.finishTurn(s,r);return}if(cp(u,c)){d=!0;continue}}if(this.abortController===n&&(this.abortController=null),a.length>0){let m={role:"assistant",content:a};l.length>0&&(m.reasoning_content=l),this.priorTurns.push(m)}yield{type:"assistant.message",text:a,sessionId:this.initSessionId},yield*this.finishTurn(d?{...s,stopReason:eo}:s,r)}*finishTurn(t,n){this.lastUsage=t,yield{type:"turn.completed",usage:{...t,durationMs:Date.now()-n},sessionId:this.initSessionId}}clarifyResponsesError(t,n){let r=t instanceof Error?t:new Error(String(t));if(!n||(t&&typeof t=="object"&&"status"in t?t.status:void 0)!==400&&!/\b400\b/.test(r.message))return r;let i,s=t?.error;if(s&&typeof s=="object"){let a=s;typeof a.detail=="string"?i=a.detail:typeof a.message=="string"&&(i=a.message)}return new Error(`ChatGPT/Codex backend rejected model "${this.currentModel}" (HTTP 400). A ChatGPT subscription only serves certain OpenAI models on this backend (gpt-5.5
|
|
1183
|
+
${b.content}`,isError:!0,...b.truncated===!0?{truncated:!0}:{}}),u.push({call:h,result:b});let w=d.get(h.id),v=typeof w=="number"?Date.now()-w:0,T=b.truncated===!0||b.content.includes("[output truncated");Xi(o,{phase:"completed",toolUseId:h.id,name:h.name,resultBytes:Buffer.byteLength(b.content,"utf8"),isError:b.isError===!0,truncated:T,durationMs:v,...b.circuitBreaker===!0?{circuitBreaker:!0}:{},...b.failureClass?{failureClass:b.failureClass}:{}}),yield{type:"tool.output",toolUseId:h.id,toolName:h.name,content:b.content,...b.isError===!0?{isError:!0}:{},...b.truncated===!0?{truncated:!0}:{},sessionId:s},b.render?.diff&&(yield{type:"tool.diff",toolUseId:h.id,diff:b.render.diff,sessionId:s})}}i.push(zA(e.assistantText,a,e.reasoningText));for(let p of JA(u))i.push(p);let m=VA(u,{vision:n});m&&i.push(m)}var aC=A(()=>{"use strict";Ie();lb();ip();rb();ob()});function lp(e){return e!==void 0&&e>0?Math.floor(e):0}function cp(e,t){return t>0&&e>=t}var eo,ap,Bl=A(()=>{"use strict";eo="tool_use_loop_capped",ap="You have reached your tool-use budget for this turn. Do not request any more tools \u2014 give your final answer now using only the information already gathered."});function Ul(e){return Gz*Math.pow(2,e)}function cC(e){if(e===null||typeof e!="object")return;let t=e;return typeof t.status=="number"?t.status:void 0}function ub(e){let t=cC(e);return t===void 0?!1:lC.has(t)}function pb(e){let t=cC(e);return t===void 0?!1:lC.has(t)}var lC,cb,db,Gz,mb=A(()=>{"use strict";lC=new Set([429,500,502,503,529]),cb=3,db=3,Gz=2e3});function fb(e,t){let n=$l(e);return typeof t=="number"&&Number.isFinite(t)&&t>0?Math.floor(t):n}function dC(e,t){let n=fb(e,t);return Ol(e)?{max_completion_tokens:n}:{max_tokens:n}}function gb(e){return e??"default"}function uC(e){switch(e){case"low":return"low";case"medium":return"medium";case"high":case"xhigh":case"max":return"high"}}function hb(e,t){if(e!==void 0&&Ol(t))return uC(e)}var yb=A(()=>{"use strict";Ts();ks()});import qz from"openai";function Jz(e){let t={apiKey:e.apiKey};return e.baseURL!==void 0&&(t.baseURL=e.baseURL),e.defaultHeaders!==void 0&&(t.defaultHeaders=e.defaultHeaders),new qz(t)}function pC(){return zz??Jz}var zz,bb=A(()=>{"use strict";zz=null});import{randomUUID as Yz}from"node:crypto";function mC(e,t,n={}){let r=ni(e.apiKey,n.authDeps),o=e.resume??`openai-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i=typeof e.model=="string"?e.model:"gpt-4o-mini",s=Rt(i)??i,a={auth:r,model:s,synthesizedSessionId:o,promptStream:t,config:e};return n.baseURL!==void 0&&(a.baseURL=n.baseURL),n.toolDispatcher!==void 0&&(a.toolDispatcher=n.toolDispatcher),n.onPermissionMode!==void 0&&(a.onPermissionMode=n.onPermissionMode),n.mcpManager!==void 0&&(a.mcpManager=n.mcpManager),n.useResponsesApi!==void 0&&(a.useResponsesApi=n.useResponsesApi),e.traceWriter!==void 0&&(a.traceWriter=e.traceWriter),new dp(a)}var wb,dp,Sb=A(()=>{"use strict";Ie();dl();eb();Ts();ar();vb();Te();Ll();HA();ks();rb();ob();XA();QA();oC();J();ab();Ah();_h();Uo();op();ip();aC();Bl();mb();yb();bb();mb();bb();yb();wb="openai-compatible",dp=class{client;opts;initSessionId;toolDispatcher;onPermissionMode;openAITools;wireMode;traceWriter;priorTurns=[];currentModel;currentPermissionMode;abortController=null;pendingAbortReason=null;closed=!1;closeResolve=null;closedPromise;lastUsage=null;constructor(t){if(this.opts=t,this.initSessionId=t.synthesizedSessionId,this.currentModel=t.model,this.currentPermissionMode=gb(t.config.permissionMode),this.toolDispatcher=t.toolDispatcher,this.onPermissionMode=t.onPermissionMode,this.traceWriter=t.traceWriter,this.toolDispatcher){let o=this.toolDispatcher;Array.isArray(o.toolDefs)&&o.toolDefs.length>0&&(this.openAITools=GA(o.toolDefs))}let n=(t.useResponsesApi??!1)||nC(E.AFK_OPENAI_USE_RESPONSES),r=rC(t.auth,n);if(this.wireMode=r.mode,t.auth.apiKey===null)this.client=null;else{let o=pC(),i={apiKey:t.auth.apiKey},s=r.baseURL??t.baseURL;s!==void 0&&(i.baseURL=s),r.headers!==void 0&&(i.defaultHeaders=r.headers),this.client=o(i)}this.closedPromise=new Promise(o=>{this.closeResolve=()=>o("__closed__")})}activeOpenAITools(){if(!this.openAITools)return;if(this.currentPermissionMode==="plan")return this.openAITools;let t=this.openAITools.filter(n=>n.function.name!==Ht);return t.length>0?t:void 0}async*[Symbol.asyncIterator](){if(yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.currentModel,permissionMode:this.currentPermissionMode,cwd:process.cwd(),tools:this.openAITools?this.openAITools.map(r=>r.function.name):[],slashCommands:[],skills:[],plugins:[],mcpServers:this.opts.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.opts.auth.source,version:wb}},this.opts.auth.apiKey===null){yield{type:"error",error:new Error(Fl(this.opts.auth))};return}let n=this.opts.promptStream[Symbol.asyncIterator]();try{for(;!this.closed;){let r=await Promise.race([n.next(),this.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;yield*this.runTurn(o.value.content)}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}async*runTurn(t){let n=new AbortController;if(this.abortController=n,this.pendingAbortReason!==null&&!n.signal.aborted&&(n.abort(this.pendingAbortReason),this.pendingAbortReason=null),n.signal.aborted)return;let r=Date.now(),o=Yz();be(this.traceWriter,{phase:"loop_start"});try{yield*this._runTurnInner(t,n,r,o)}finally{be(this.traceWriter,{phase:"loop_end",durationMs:Date.now()-r})}}async*_runTurnInner(t,n,r,o){let i=$A(this.currentModel);this.priorTurns.push({role:"user",content:UA(t,{vision:i,model:this.currentModel})});let s={stopReason:null,resultSubtype:"success",isError:!1},a="",l="",c=lp(this.opts.config.maxToolUseIterations),d=!1,u=0;for(;;){if(n.signal.aborted){this.abortController===n&&(this.abortController=null),yield*this.finishTurn(s,r);return}let m=yield*this.runIteration(n,i,d);if(m===null){this.abortController===n&&(this.abortController=null),(n.signal.aborted||this.closed)&&(yield*this.finishTurn(s,r));return}let p=KA(m.state);if(s=Ml(s,p),s.contextWindowTokens=(p.inputTokens??0)+(p.outputTokens??0),this.lastUsage=s,m.text.length>0&&(a=m.text),l=m.state.reasoningText,!m.needsToolDispatch||d)break;yield*this.dispatchAndAppend(m.state,n.signal,i),u+=1;{let g=rp(m.state).at(-1),h=g?.name,b;try{b=g?JSON.parse(g.argumentsRaw||"{}"):void 0}catch{b=void 0}let y=g?`${g.name}${oi(g.name,b)}`:"unknown";yield{type:"progress",progress:{taskId:o,description:"Working",summary:`round ${u}: ${y}`,lastToolName:h,totalTokens:s.totalTokens??0,toolUses:u,durationMs:Date.now()-r},sessionId:this.initSessionId}}if(n.signal.aborted){this.abortController===n&&(this.abortController=null),yield*this.finishTurn(s,r);return}if(cp(u,c)){d=!0;continue}}if(this.abortController===n&&(this.abortController=null),a.length>0){let m={role:"assistant",content:a};l.length>0&&(m.reasoning_content=l),this.priorTurns.push(m)}yield{type:"assistant.message",text:a,sessionId:this.initSessionId},yield*this.finishTurn(d?{...s,stopReason:eo}:s,r)}*finishTurn(t,n){this.lastUsage=t,yield{type:"turn.completed",usage:{...t,durationMs:Date.now()-n},sessionId:this.initSessionId}}clarifyResponsesError(t,n){let r=t instanceof Error?t:new Error(String(t));if(!n||(t&&typeof t=="object"&&"status"in t?t.status:void 0)!==400&&!/\b400\b/.test(r.message))return r;let i,s=t?.error;if(s&&typeof s=="object"){let a=s;typeof a.detail=="string"?i=a.detail:typeof a.message=="string"&&(i=a.message)}return new Error(`ChatGPT/Codex backend rejected model "${this.currentModel}" (HTTP 400). A ChatGPT subscription only serves certain OpenAI models on this backend (gpt-5.6 and gpt-5.5 work; gpt-5, gpt-5.1, gpt-5.2 and *-codex do not). `+(i?`Backend said: ${i}`:"No error body was returned."))}async*runIteration(t,n,r=!1){let o=jA({config:this.opts.config,...this.opts.config.resumeHistory!==void 0?{resumeHistory:this.opts.config.resumeHistory}:{},priorTurns:this.priorTurns,vision:n});if(o[0]?.role==="system"){let s=this.currentPermissionMode==="plan"?Wd:this.currentPermissionMode==="autonomous"?Kd:null;s!==null&&(o[0]={...o[0],content:o[0].content+`
|
|
1184
1184
|
|
|
1185
|
-
`+s})}r&&o.push({role:"user",content:ap});let i=r?void 0:this.activeOpenAITools();if(this.wireMode==="responses"){let s=this.opts.auth.source==="chatgpt-oauth";if(s&&tC(this.currentModel))return yield{type:"error",error:new Error(`Model "${this.currentModel}" can't run on a ChatGPT subscription \u2014 the ChatGPT/Codex backend only supports OpenAI gpt-5.x models. This usually means a subagent or skill requested a Claude model. Pass a gpt-5.x model to it (e.g. model: "gpt-5.5"), or run it on a provider configured with the matching API key.`)},null;let a=ZA(o,i),l={model:this.currentModel,input:a.input,stream:!0};s||(l.max_output_tokens=fb(this.currentModel,this.opts.config.maxOutputTokens));let c=a.instructions??(s?eC:void 0);c!==void 0&&(l.instructions=c),s&&(l.store=!1),a.tools&&a.tools.length>0&&(l.tools=a.tools);let d=hb(this.opts.config.effort,this.currentModel);d!==void 0&&(l.reasoning={effort:d});let u=0;for(;;){let m=tb(),p=Date.now(),g,h=null;for(let w=0;;w++)try{g=await this.client.responses.create(l,{signal:t.signal});break}catch(v){if(t.signal.aborted)return null;if(ub(v)&&w<cb){let T=Ul(w);if(await Hn(T,t.signal),t.signal.aborted)return null;continue}h=v;break}if(h!==null)return yield{type:"error",error:this.clarifyResponsesError(h,s)},null;let b=null,y=!1;try{for await(let w of g){if(this.closed)return null;for(let v of YA(w,m,this.initSessionId))y||(y=!0,be(this.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-p,resolvedModel:this.currentModel})),yield v}}catch(w){if(t.signal.aborted)return null;if(pb(w)&&u<db){if(u++,yield{type:"stream.retry",sessionId:this.initSessionId},await Hn(Ul(u-1),t.signal),t.signal.aborted)return null;continue}b=w}return b!==null?(yield{type:"error",error:this.clarifyResponsesError(b,s)},null):{state:m,events:[],text:m.assistantText,needsToolDispatch:nb(m)&&m.toolCallsByIndex.size>0}}}else{let s={model:this.currentModel,messages:o,stream:!0,stream_options:{include_usage:!0}};Object.assign(s,dC(this.currentModel,this.opts.config.maxOutputTokens)),i&&i.length>0&&(s.tools=i);let a=hb(this.opts.config.effort,this.currentModel);a!==void 0&&(s.reasoning_effort=a);let l=0;for(;;){let c=tb(),d=Date.now(),u,m=null;for(let h=0;;h++)try{u=await this.client.chat.completions.create(s,{signal:t.signal});break}catch(b){if(t.signal.aborted)return null;if(ub(b)&&h<cb){let y=Ul(h);if(await Hn(y,t.signal),t.signal.aborted)return null;continue}m=b;break}if(m!==null)return yield{type:"error",error:m instanceof Error?m:new Error(String(m))},null;let p=null,g=!1;try{for await(let h of u){if(this.closed)return null;for(let b of WA(h,c,this.initSessionId))g||(g=!0,be(this.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-d,resolvedModel:this.currentModel})),yield b}}catch(h){if(t.signal.aborted)return null;if(pb(h)&&l<db){if(l++,yield{type:"stream.retry",sessionId:this.initSessionId},await Hn(Ul(l-1),t.signal),t.signal.aborted)return null;continue}p=h}return p!==null?(yield{type:"error",error:p instanceof Error?p:new Error(String(p))},null):{state:c,events:[],text:c.assistantText,needsToolDispatch:nb(c)&&c.toolCallsByIndex.size>0}}}}async*dispatchAndAppend(t,n,r){yield*sC({state:t,signal:n,vision:r,toolDispatcher:this.toolDispatcher,traceWriter:this.traceWriter,priorTurns:this.priorTurns,sessionId:this.initSessionId})}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){t!==void 0&&(this.currentModel=Rt(t)??t)}async setPermissionMode(t){this.currentPermissionMode=gb(t);let n=Mn(this.currentPermissionMode);this.toolDispatcher?.setAllowAll?.(n),this.onPermissionMode?.(this.currentPermissionMode)}setCwd(t){this.toolDispatcher?.setResolveBase?.(t)}async supportedCommands(){return up()}async supportedModels(){return[{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=Gt(this.currentModel),r;if(t&&n>0){let s=ri(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=Nl(t);return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:i,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(t,n){return{canRewind:!1,error:`${wb} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),W(`\u{1F7E2} ${wb}: closed`)}}});import Xz from"openai";async function fC(e){let{apiKey:t,baseURL:n,model:r,system:o,user:i,maxTokens:s=64,signal:a,clientFactory:l}=e,c=ni(t);if(c.apiKey===null)throw new Error("oneShotChatCompletion: no usable OpenAI auth (set OPENAI_API_KEY or pass apiKey)");let d={apiKey:c.apiKey};n!==void 0&&(d.baseURL=n);let u=l??Zz,m=u?u(d):new Xz(d),p=Ol(r)?{max_completion_tokens:s}:{max_tokens:s},h=(await m.chat.completions.create({model:r,...p,stream:!1,messages:[{role:"system",content:o},{role:"user",content:i}]},a?{signal:a}:void 0)).choices?.[0]?.message?.content;return typeof h=="string"?h.trim():""}var Zz,gC=A(()=>{"use strict";Ll();ks();Zz=null});import kb from"path";import{appendFileSync as Qz,mkdirSync as eJ}from"fs";import{dirname as tJ}from"path";var Eb,qt,nJ,jl=A(()=>{"use strict";G();ru();su();Tl();dl();Xy();Uo();sn();Tn();Qy();Wn();Sb();gC();ln();Qr();Ll();Sb();Eb="openai-compatible",qt=class{name=Eb;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_initialResolveBase;_presenceSessionId=null;constructor(t={}){this.providerOpts=t,this.memoryStore=t.memoryStore??new mt;let n=[...pr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??Wt),t.skillExecutor&&n.push(Ho),t.composeExecutor&&n.push(Wo),t.readOnlyMemory===!0?n.push(gs):n.push(...qr),n.push(Ln);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);this.schemas=n}query(t){let n=t.config,r=n.permissionMode??"default";this._currentPermissionMode=r,this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,i=typeof n.model=="string"?n.model:String(n.model),s=Sl({surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),modelName:i,providerName:Eb,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof Kt?o.toolDefs.map(y=>y.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?vl(this.providerOpts.tools,s):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:s,...n.isSkillDispatch?{isSkillDispatch:!0}:{},...n.isNonInteractive?{isNonInteractive:!0}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{},...n.planExitControls!==void 0?{planExitControls:n.planExitControls}:{}});let a={},l=n.openaiBaseUrl??this.providerOpts.baseURL;if(l!==void 0&&(a.baseURL=l),a.toolDispatcher=o,a.onPermissionMode=y=>{this._currentPermissionMode=y},this.providerOpts.mcpManager!==void 0&&(a.mcpManager=this.providerOpts.mcpManager),(n.depth===void 0||n.depth===0)&&n.parentSessionId===void 0&&n.sessionId!==void 0&&this._presenceSessionId===null){this._presenceSessionId=n.sessionId;let y=n.sessionId,w=s.getWorkspace();kl({sessionId:y,surface:this.providerOpts.surface??"cli",actor:jn(n.depth),cwd:n.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:Eb,name:i},workspace:w,pid:process.pid}),process.once("exit",()=>{mr(y)}),process.once("SIGINT",()=>{mr(y),process.exit(130)}),process.once("SIGTERM",()=>{mr(y),process.exit(143)})}let d=Go({cwd:n.cwd??process.cwd(),...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:s.getWorkspace()}),u=ep(n.isSkillDispatch),m=tp(this.providerOpts.readOnlyMemory),p=this.providerOpts.skillExecutor?pp():"",g=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,h=[u,m,d];p.length>0&&h.push(p),g!==void 0&&g.length>0&&h.push(g);let b={...n,systemPrompt:h.join(`
|
|
1185
|
+
`+s})}r&&o.push({role:"user",content:ap});let i=r?void 0:this.activeOpenAITools();if(this.wireMode==="responses"){let s=this.opts.auth.source==="chatgpt-oauth";if(s&&tC(this.currentModel))return yield{type:"error",error:new Error(`Model "${this.currentModel}" can't run on a ChatGPT subscription \u2014 the ChatGPT/Codex backend only supports OpenAI gpt-5.x models. This usually means a subagent or skill requested a Claude model. Pass a gpt-5.x model to it (e.g. model: "gpt-5.5"), or run it on a provider configured with the matching API key.`)},null;let a=ZA(o,i),l={model:this.currentModel,input:a.input,stream:!0};s||(l.max_output_tokens=fb(this.currentModel,this.opts.config.maxOutputTokens));let c=a.instructions??(s?eC:void 0);c!==void 0&&(l.instructions=c),s&&(l.store=!1),a.tools&&a.tools.length>0&&(l.tools=a.tools);let d=hb(this.opts.config.effort,this.currentModel);d!==void 0&&(l.reasoning={effort:d});let u=0;for(;;){let m=tb(),p=Date.now(),g,h=null;for(let w=0;;w++)try{g=await this.client.responses.create(l,{signal:t.signal});break}catch(v){if(t.signal.aborted)return null;if(ub(v)&&w<cb){let T=Ul(w);if(await Hn(T,t.signal),t.signal.aborted)return null;continue}h=v;break}if(h!==null)return yield{type:"error",error:this.clarifyResponsesError(h,s)},null;let b=null,y=!1;try{for await(let w of g){if(this.closed)return null;for(let v of YA(w,m,this.initSessionId))y||(y=!0,be(this.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-p,resolvedModel:this.currentModel})),yield v}}catch(w){if(t.signal.aborted)return null;if(pb(w)&&u<db){if(u++,yield{type:"stream.retry",sessionId:this.initSessionId},await Hn(Ul(u-1),t.signal),t.signal.aborted)return null;continue}b=w}return b!==null?(yield{type:"error",error:this.clarifyResponsesError(b,s)},null):{state:m,events:[],text:m.assistantText,needsToolDispatch:nb(m)&&m.toolCallsByIndex.size>0}}}else{let s={model:this.currentModel,messages:o,stream:!0,stream_options:{include_usage:!0}};Object.assign(s,dC(this.currentModel,this.opts.config.maxOutputTokens)),i&&i.length>0&&(s.tools=i);let a=hb(this.opts.config.effort,this.currentModel);a!==void 0&&(s.reasoning_effort=a);let l=0;for(;;){let c=tb(),d=Date.now(),u,m=null;for(let h=0;;h++)try{u=await this.client.chat.completions.create(s,{signal:t.signal});break}catch(b){if(t.signal.aborted)return null;if(ub(b)&&h<cb){let y=Ul(h);if(await Hn(y,t.signal),t.signal.aborted)return null;continue}m=b;break}if(m!==null)return yield{type:"error",error:m instanceof Error?m:new Error(String(m))},null;let p=null,g=!1;try{for await(let h of u){if(this.closed)return null;for(let b of WA(h,c,this.initSessionId))g||(g=!0,be(this.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-d,resolvedModel:this.currentModel})),yield b}}catch(h){if(t.signal.aborted)return null;if(pb(h)&&l<db){if(l++,yield{type:"stream.retry",sessionId:this.initSessionId},await Hn(Ul(l-1),t.signal),t.signal.aborted)return null;continue}p=h}return p!==null?(yield{type:"error",error:p instanceof Error?p:new Error(String(p))},null):{state:c,events:[],text:c.assistantText,needsToolDispatch:nb(c)&&c.toolCallsByIndex.size>0}}}}async*dispatchAndAppend(t,n,r){yield*sC({state:t,signal:n,vision:r,toolDispatcher:this.toolDispatcher,traceWriter:this.traceWriter,priorTurns:this.priorTurns,sessionId:this.initSessionId})}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){t!==void 0&&(this.currentModel=Rt(t)??t)}async setPermissionMode(t){this.currentPermissionMode=gb(t);let n=Mn(this.currentPermissionMode);this.toolDispatcher?.setAllowAll?.(n),this.onPermissionMode?.(this.currentPermissionMode)}setCwd(t){this.toolDispatcher?.setResolveBase?.(t)}async supportedCommands(){return up()}async supportedModels(){return[{value:"gpt-5.6",displayName:"GPT-5.6 (Sol)",description:"OpenAI flagship \u2014 alias for gpt-5.6-sol"},{value:"gpt-5.6-sol",displayName:"GPT-5.6 Sol",description:"Frontier capability"},{value:"gpt-5.6-terra",displayName:"GPT-5.6 Terra",description:"Balanced intelligence/cost"},{value:"gpt-5.6-luna",displayName:"GPT-5.6 Luna",description:"Fast, high-volume workloads"},{value:"gpt-5.5",displayName:"GPT-5.5",description:"Prior flagship (ChatGPT backend)"},{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=Gt(this.currentModel),r;if(t&&n>0){let s=ri(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=Nl(t);return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:i,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(t,n){return{canRewind:!1,error:`${wb} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),W(`\u{1F7E2} ${wb}: closed`)}}});import Xz from"openai";async function fC(e){let{apiKey:t,baseURL:n,model:r,system:o,user:i,maxTokens:s=64,signal:a,clientFactory:l}=e,c=ni(t);if(c.apiKey===null)throw new Error("oneShotChatCompletion: no usable OpenAI auth (set OPENAI_API_KEY or pass apiKey)");let d={apiKey:c.apiKey};n!==void 0&&(d.baseURL=n);let u=l??Zz,m=u?u(d):new Xz(d),p=Ol(r)?{max_completion_tokens:s}:{max_tokens:s},h=(await m.chat.completions.create({model:r,...p,stream:!1,messages:[{role:"system",content:o},{role:"user",content:i}]},a?{signal:a}:void 0)).choices?.[0]?.message?.content;return typeof h=="string"?h.trim():""}var Zz,gC=A(()=>{"use strict";Ll();ks();Zz=null});import kb from"path";import{appendFileSync as Qz,mkdirSync as eJ}from"fs";import{dirname as tJ}from"path";var Eb,qt,nJ,jl=A(()=>{"use strict";G();ru();su();Tl();dl();Xy();Uo();sn();Tn();Qy();Wn();Sb();gC();ln();Qr();Ll();Sb();Eb="openai-compatible",qt=class{name=Eb;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_initialResolveBase;_presenceSessionId=null;constructor(t={}){this.providerOpts=t,this.memoryStore=t.memoryStore??new mt;let n=[...pr];t.subagentExecutor&&n.push(t.subagentExecutor.describeAgentTool?.()??Wt),t.skillExecutor&&n.push(Ho),t.composeExecutor&&n.push(Wo),t.readOnlyMemory===!0?n.push(gs):n.push(...qr),n.push(Ln);for(let r of t.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);this.schemas=n}query(t){let n=t.config,r=n.permissionMode??"default";this._currentPermissionMode=r,this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,i=typeof n.model=="string"?n.model:String(n.model),s=Sl({surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),modelName:i,providerName:Eb,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof Kt?o.toolDefs.map(y=>y.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?vl(this.providerOpts.tools,s):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},runtimeStateSource:s,...n.isSkillDispatch?{isSkillDispatch:!0}:{},...n.isNonInteractive?{isNonInteractive:!0}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{},...n.planExitControls!==void 0?{planExitControls:n.planExitControls}:{}});let a={},l=n.openaiBaseUrl??this.providerOpts.baseURL;if(l!==void 0&&(a.baseURL=l),a.toolDispatcher=o,a.onPermissionMode=y=>{this._currentPermissionMode=y},this.providerOpts.mcpManager!==void 0&&(a.mcpManager=this.providerOpts.mcpManager),(n.depth===void 0||n.depth===0)&&n.parentSessionId===void 0&&n.sessionId!==void 0&&this._presenceSessionId===null){this._presenceSessionId=n.sessionId;let y=n.sessionId,w=s.getWorkspace();kl({sessionId:y,surface:this.providerOpts.surface??"cli",actor:jn(n.depth),cwd:n.cwd??process.cwd(),startedAt:new Date().toISOString(),model:{provider:Eb,name:i},workspace:w,pid:process.pid}),process.once("exit",()=>{mr(y)}),process.once("SIGINT",()=>{mr(y),process.exit(130)}),process.once("SIGTERM",()=>{mr(y),process.exit(143)})}let d=Go({cwd:n.cwd??process.cwd(),...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:s.getWorkspace()}),u=ep(n.isSkillDispatch),m=tp(this.providerOpts.readOnlyMemory),p=this.providerOpts.skillExecutor?pp():"",g=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,h=[u,m,d];p.length>0&&h.push(p),g!==void 0&&g.length>0&&h.push(g);let b={...n,systemPrompt:h.join(`
|
|
1186
1186
|
|
|
1187
1187
|
`)};return mC(b,t.prompt,a)}buildDispatcher(t,n){let r=Zu(t,n.cwd),o=wl(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[d,u]of o)this.providerOpts.readOnlyMemory===!0&&d!=="memory_search"||r.set(d,u);n.runtimeStateSource&&r.set("get_runtime_state",hs(n.runtimeStateSource));for(let d of this.providerOpts.customTools??[])r.has(d.schema.name)||r.set(d.schema.name,d.handler);let i=n.planExitControls;i&&r.set(Ht,Qd(i));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[d,u]of this.providerOpts.mcpManager.getMcpHandlers())r.set(d,u);let a=n.isSkillDispatch?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="terminal_font_size"):n.isNonInteractive?this.schemas.filter(d=>d.name!=="ask_question"):this.schemas,l={handlers:r,schemas:[...a,...s,...i?[Zd]:[]],hookRegistry:nu(n.hookRegistry,this.providerOpts.hookRegistry)},c=iu(this.providerOpts.mcpManager?ou(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(d=>d.schema.name));return c!==void 0&&(l.permissions=c),this.providerOpts.subagentExecutor!==void 0&&(l.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(l.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(l.composeExecutor=this.providerOpts.composeExecutor),this.providerOpts.canUseTool!==void 0&&(l.canUseTool=this.providerOpts.canUseTool),n.cwd!==void 0&&(l.cwd=n.cwd),n.readRoots!==void 0&&(l.readRoots=n.readRoots),n.writeRoots!==void 0&&(l.writeRoots=n.writeRoots),n.sessionId!==void 0&&(l.sessionId=n.sessionId),n.parentSessionId!==void 0&&(l.parentSessionId=n.parentSessionId),n.traceWriter!==void 0&&(l.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(l.readOnlyBash=!0),l.allowAll=Mn(t),new Kt(l)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=kb.resolve(t);this._sharedReadRoots.includes(o)||(this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r}))}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=kb.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||(this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r}))}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=kb.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let i=this._sharedReadRoots.indexOf(o);if(i!==-1&&this._sharedReadRoots.splice(i,1),this._sharedWriteRoots){let s=this._sharedWriteRoots.indexOf(o);s!==-1&&this._sharedWriteRoots.splice(s,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[],allowAll:Mn(this._currentPermissionMode)}}appendProviderAuditLog(t){try{let n=Gi();eJ(tJ(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});Qz(n,r+`
|
|
1188
1188
|
`)}catch{}}close(){this.memoryStore.close()}async complete(t){let n={model:t.model??"gpt-4o-mini",system:t.system,user:t.user,maxTokens:t.maxTokens??64};t.apiKey!==void 0&&(n.apiKey=t.apiKey);let r=t.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),t.signal&&(n.signal=t.signal),fC(n)}},nJ=new qt});function to(e,t){if(e.has(t))return!0;let n=t.charAt(0).toUpperCase()+t.slice(1);return n!==t&&e.has(n)}function Kn(e){return e.startsWith("mcp__")||e.startsWith("MCP__")?"mcp":to(rJ,e)?"read":to(oJ,e)?"write":to(iJ,e)?"shell":to(no,e)?"subagent":to(Hl,e)?"skill":to(Wl,e)?"dag":to(sJ,e)?"web":aJ.has(e)?"browser":to(lJ,e)?"planning":cJ.has(e)?"schedule":"other"}function Tb(e){return dJ[e]}var rJ,oJ,iJ,no,Hl,Wl,Ye,sJ,aJ,lJ,cJ,hC,dJ,Kl=A(()=>{"use strict";bu();rJ=new Set(["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search"]),oJ=new Set(["Write","Edit","NotebookEdit","MultiEdit","write_file","edit_file","memory_update","procedure_write","terminal_font_size","config_set"]),iJ=new Set(["Bash","BashOutput","KillBash","bash"]),no=new Set(["Agent","Task","agent"]),Hl=new Set(["Skill","skill"]),Wl=new Set(["Compose","compose"]),Ye=new Set([...no,...Wl,...Hl]),sJ=new Set(["WebFetch","WebSearch","send_telegram","web_scrape"]),aJ=new Set(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),lJ=new Set(["TaskCreate","TaskUpdate","TaskList","TaskGet","TaskOutput","TaskStop","EnterPlanMode","ExitPlanMode","ToolSearch"]),cJ=new Set(["create_schedule","list_schedules","get_schedule_history","cancel_schedule"]);hC=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","config_get","memory_search",...at];dJ={subagent:"subagent",skill:"skill",dag:"dag"}});function mp(e){let t=uJ(e);return t!==void 0?t:pJ(e)}function uJ(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return yC(n.trim())}function pJ(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=mJ(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=yC(r);if(o!==void 0)return o}}function mJ(e,t){let n=0,r=!1,o=!1;for(let i=t;i>=0;i--){let s=e[i];if(o){o=!1;continue}if(r){if(s==="\\"){o=!0;continue}s==='"'&&(r=!1);continue}if(s==='"'){r=!0;continue}if(s==="}")n++;else if(s==="{"&&(n--,n===0))return i}return-1}function yC(e){try{return JSON.parse(e)}catch{return}}var xb=A(()=>{"use strict"});import{z as ro}from"zod";function yJ(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n;for(;(n=t.exec(e))!==null;){let r=n[1];if(r===void 0)continue;let o=bC(r.trim());if(wC(o))return o}for(let r=0;r<e.length;r++){if(e[r]!=="{"||bJ(e,r))continue;let o=wJ(e,r);if(o===-1)continue;let i=e.slice(r,o+1),s=bC(i);if(wC(s))return s;r=o}}function bJ(e,t){for(let n=t-1;n>=0;n--){let r=e[n];if(!(r===" "||r===" "||r===`
|
|
@@ -1637,7 +1637,7 @@ ${n}`;K3(this.serverName,n);let o=!1;try{let{pushIfConfigured:i}=await Promise.r
|
|
|
1637
1637
|
Open this URL to authorize:
|
|
1638
1638
|
${n}
|
|
1639
1639
|
Status written to: ${il()}
|
|
1640
|
-
`)}_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))}}});G();Ad();import{config as Kk}from"dotenv";import{Command as Ule}from"commander";J();import rh from"chalk";function fE(){let e=E.FORCE_COLOR;if(e&&e.length>0)return;let t=E.NO_COLOR;if(t&&t.length>0){rh.level=0;return}let n=E.CI;if(n&&n.length>0){rh.level=0;return}process.stdout.isTTY||(rh.level=0)}import S0 from"chalk";import
|
|
1640
|
+
`)}_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))}}});G();Ad();import{config as Kk}from"dotenv";import{Command as Ule}from"commander";J();import rh from"chalk";function fE(){let e=E.FORCE_COLOR;if(e&&e.length>0)return;let t=E.NO_COLOR;if(t&&t.length>0){rh.level=0;return}let n=E.CI;if(n&&n.length>0){rh.level=0;return}process.stdout.isTTY||(rh.level=0)}import S0 from"chalk";import i6 from"ora";yt();function gE(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("rate limit")||t.toLowerCase().includes("too many requests")}function hE(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("network")||t.toLowerCase().includes("connect")||t.toLowerCase().includes("timeout")}function qi(e){if(e instanceof Fr)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 Cd)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 he)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 ht){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||gE(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}:hE(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}}import _j from"string-width";var oh=/\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[P^_X][^\x1B]*\x1B\\|[@-OQ-WYZ\\\-])/g,yE=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function je(e){return e.replace(oh,"")}function X(e){return _j(e)}function _d(e){return e.length===0?[]:yE?Array.from(yE.segment(e),t=>t.segment):Array.from(e)}function Ij(e){let t=[],n=0,r;for(oh.lastIndex=0;(r=oh.exec(e))!==null;){if(r.index>n)for(let o of _d(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of _d(e.slice(n)))t.push({type:"text",value:o});return t}function it(e,t){let n=Math.max(0,t-X(e));return e+" ".repeat(n)}function Pj(e,t){let n=Math.max(0,t-X(e));return" ".repeat(n)+e}function ih(e,t,n="left"){let r=Math.max(0,t-X(e));if(r===0)return e;if(n==="right")return Pj(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return it(e,t)}var Mj=/^\x1b\]8;[^;\x07\x1b]*;(.*?)(?:\x07|\x1b\\)$/s,Oj="\x1B]8;;\x1B\\";function se(e,t,n="\u2026"){if(t<=0)return"";if(X(e)<=t)return e;let r=X(n),o=Math.max(0,t-r),i=0,s="",a=!1,l=!1;for(let c of Ij(e)){if(c.type==="ansi"){s+=c.value,a=!0;let u=Mj.exec(c.value);u&&(l=(u[1]??"").length>0);continue}let d=i+X(c.value);if(d>o)break;s+=c.value,i=d}return s+n+(l?Oj:"")+(a?"\x1B[0m":"")}function bE(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function sh(e,t){let n=bE(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of _d(e)){let i=r+o.length;if(i>=n)return r;r=i}return r}function Do(e,t){let n=bE(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of _d(e)){let i=r+o.length;if(r>=n||n>r&&n<i)return i;r=i}return e.length}function ee(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var Id=new Set,Pd=new Set,zi=!1,Fo=null;function $j(){for(let e of Id)try{e()}catch{}}function Dj(){for(let e of Pd)try{e()}catch{}}function Fj(){Fo!==null&&clearTimeout(Fo),Fo=setTimeout(()=>{Fo=null,$j()},150)}function ah(){Dj(),Fj()}function Lj(e){return Id.add(e),zi||(process.stdout.on("resize",ah),zi=!0),()=>{Id.delete(e),wE()}}function Nj(e){return Pd.add(e),zi||(process.stdout.on("resize",ah),zi=!0),()=>{Pd.delete(e),wE()}}function wE(){Id.size===0&&Pd.size===0&&(zi&&(process.stdout.off("resize",ah),zi=!1),Fo!==null&&(clearTimeout(Fo),Fo=null))}var We={subscribe:Lj,subscribeImmediate:Nj};import SE from"wrap-ansi";function ue(e,t,n={}){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let r=Math.floor(t);return SE(e,r,{hard:n.breakLongWords??!1,trim:!1,wordWrap:!0})}function Md(e,t){return!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY?e:SE(e,Math.floor(t),{hard:!0,trim:!1,wordWrap:!1})}import _e from"chalk";var f={brand:_e.hex("#E67E4C"),mint:_e.hex("#5FE3A1"),goblin:_e.hex("#9CB04A"),user:_e.cyan,caret:_e.hex("#7AA2F7"),tool:_e.hex("#DCDCAA"),chrome:_e.hex("#B0B8C2"),syntaxString:_e.italic.hex("#8AB07A"),toolArg:_e.dim.white,thinking:_e.italic.hex("#9B8FB5"),success:_e.green,error:_e.red,warning:_e.yellow,plan:_e.hex("#9F7CE0"),bypass:_e.bold.hex("#FF6AC1"),meta:_e.blackBright,info:_e.hex("#5BA8FF"),fileRef:_e.hex("#56B5A8"),heading:_e.bold.white,label:_e.dim,dim:_e.dim,bold:_e.bold,italic:_e.italic,diffAdd:_e.green,diffRemove:_e.red,diffHunk:_e.blackBright};function tn(){return Math.max(22,ee()-6)}function sl(e,t){return se(e,t)}var Bj={ok:f.success("\u25CF"),warn:f.warning("\u25CF"),error:f.error("\u25CF"),info:f.info("\u25C6")};function vE(e,t){let o=t.reduce((v,T)=>Math.max(v,X(T.label)),0),i=t.reduce((v,T)=>Math.max(v,X(T.value)),0),s=o+4+2+i,a=Math.min(ee()-4,100),l=Math.max(44,X(e),s,a);l=Math.min(l,tn());let c=l+4,d=f.dim,u=d("\u256D"+"\u2500".repeat(c)+"\u256E"),m=d("\u251C"+"\u2500".repeat(c)+"\u2524"),p=d("\u2570"+"\u2500".repeat(c)+"\u256F"),g=d("\u2502"),b=ue(e,l).split(`
|
|
1641
1641
|
`).map(v=>g+" "+it(v,l)+" "+g),y=Math.max(1,l-o-4-2),w=t.map(v=>{let T=v.kind?Bj[v.kind]+" ":" ",S=f.dim(it(sl(v.label,o),o)),R=" ".repeat(4),C=sl(v.value,y),_=it(C,y),j=S+R+T+_;return g+" "+j+" "+g});return[u,...b,m,...w,p].join(`
|
|
1642
1642
|
`)}import{sep as dh}from"node:path";J();J();import lh from"chalk";var kE={".":null,D:[74,92,36],M:[139,166,63],L:[178,197,88],Y:[245,213,71],K:[13,18,9],W:[238,238,222],X:[42,42,26]},Od=[".......KKKKK.......","......WKKLKKW......",".....KKWMLMWKK.....","..DDKKWLMMMLWKKDD..","DDD..KMMMMMMMK..DDD","..DDKMMMMMMMMMKDD..","...KKMMKKKKKMMKK...","...KMMKKKKKKKMMK...","...KMMMYMDMYMMMK...","...KMMMMMMMMMMMK...","...KKMMXXXXXMMKK...","....KKMMWXXMMKK....",".....KKMWMMMKK.....",".....KKMMMMMKK.....","......KKMMMKK......",".......KKKKK......."],ch=19,al=8;function Uj(e,t){if(e.length!==t.length)throw new Error(`pixel row width mismatch: top=${e.length}, bot=${t.length}`);let n="";for(let r=0;r<e.length;r++){let o=kE[e[r]??"."]??null,i=kE[t[r]??"."]??null;!o&&!i?n+=" ":o&&!i?n+=lh.rgb(o[0],o[1],o[2])("\u2580"):!o&&i?n+=lh.rgb(i[0],i[1],i[2])("\u2584"):o&&i&&(n+=lh.bgRgb(i[0],i[1],i[2]).rgb(o[0],o[1],o[2])("\u2580"))}return n}function jj(){if(Od.length!==al*2)throw new Error(`GOBLIN_GRID has ${Od.length} pixel rows but MASCOT_HEIGHT*2 = ${al*2}`);let e=[];for(let t=0;t<al;t++){let n=Od[t*2]??"",r=Od[t*2+1]??"";e.push(Uj(n,r))}return e}function EE(e="idle"){return E.AFK_BANNER_PLAIN==="1"?[]:jj()}function TE(){return E.AFK_BANNER_PLAIN==="1"}function RE(e){let t=e.model!==void 0||e.worktree!==void 0||e.cwd!==void 0||e.version!==void 0;return t&&!TE()?Wj(e):xE(t?Hj(e):e)}function Hj(e){let t=e.mode;e.model!==void 0&&e.model.length>0&&(t=`${e.model} \xB7 ${t}`),e.version!==void 0&&e.version.length>0&&(t=`${t} \xB7 ${AE(e.version)}`);let n=[];e.worktree!==void 0&&e.worktree.length>0&&n.push(`branch ${e.worktree}`),e.cwd!==void 0&&e.cwd.length>0&&n.push(CE(e.cwd));let r=n.join(" \xB7 "),o=e.metaLine!==void 0?e.metaLine:r.length>0?r:void 0,i={mode:t};return o!==void 0&&(i.metaLine=o),e.hintLine!==void 0&&(i.hintLine=e.hintLine),i}function xE(e){let t="Agent AFK",n=" \xB7 ",r=f.bold(t)+f.dim(n)+e.mode,o=t+n+e.mode,i=Math.min(ee()-4,120),s=Math.max(54,X(o)+4,i);s=Math.min(s,tn());let a=s+4,l=f.dim,c=l("\u256D"+"\u2500".repeat(a)+"\u256E"),u=ue(r,s).split(`
|
|
1643
1643
|
`).map(g=>l("\u2502")+" "+it(g,s)+" "+l("\u2502")),m=l("\u2570"+"\u2500".repeat(a)+"\u256F"),p=[c,...u,m];return e.metaLine!==void 0&&p.push(...ue(f.dim(" "+e.metaLine),ee()).split(`
|
|
@@ -1680,7 +1680,7 @@ Status written to: ${il()}
|
|
|
1680
1680
|
`+m}function c1(e,t,n){let r=s1[e],o=n.map(Nr),i=Math.max(X(t)+4,...o.map(l=>X(l))),s=Math.max(40,i)+4,a=Math.min(s,Math.min(ee()-4,100));return a=Math.min(a,tn()),Ji(o,{border:r,title:t,width:a,padding:2})}function fe(e){let t=Math.min(ee(),120);if(e===void 0)return f.dim("\u2500".repeat(t));let n=f.dim("\u2500\u2500")+" "+f.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-X(r));return n+f.dim("\u2500".repeat(o))}Te();function Yi(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r($d(e.userMessage,e.hint)+`
|
|
1681
1681
|
`);else{let o=e.hint?` (${e.hint})`:"";r(`afk: error: ${e.userMessage}${o}
|
|
1682
1682
|
`)}Ke()&&e.raw instanceof Error&&e.raw.stack&&r(e.raw.stack+`
|
|
1683
|
-
`)}function V(e){let t=qi(e);Yi(t),process.exit(t.exitCode)}Os();import*as T0 from"node:os";import*as x0 from"node:path";import{existsSync as
|
|
1683
|
+
`)}function V(e){let t=qi(e);Yi(t),process.exit(t.exitCode)}Os();import*as T0 from"node:os";import*as x0 from"node:path";import{existsSync as s6}from"node:fs";ru();var m8=["shadow-verify","shadow_verify","resolve","diagnose","appmap","mint","review","verify","verifier"],f8=[/\bverdict(s)?\b/i,/\brecommend(ation)?s?\b/i,/\bshould\s+(delete|remove|rewrite|refactor|rename|reject|merge|revert|disable)\b/i,/\b(USELESS|KEEP|REJECT|APPROVE|SALVAGE|BLOCK|FAIL)\b/,/\b(redundant|duplicated|superseded|obsolete)\b/i,/\bvulnerab\w*\b/i,/\bunused\b/i,/\bbroken\b/i,/\bregress\w*\b/i,/\|\s*(status|verdict|decision|severity|risk|finding|priority|holds\??)\s*\|/i,/\bfound\s+\d+\s*(issue|problem|bug|error|finding|vulnerabilit)/i,/\b(critical|high|medium|low)\s+(severity|priority|risk)\b/i,/\bclaim(s)?\b[^\n]{0,80}\b(holds?|refuted|verified|partial|confirmed|disputed)\b/i,/\b(root\s*cause|incident)\b/i,/\brecommend\s+(removing|deleting|rewriting|refactoring|merging|reverting)\b/i,/\bI\s+(applied|committed|pushed|edited|wrote|fixed|patched|reset|restored|staged)\b/i,/\b(applied|committed|pushed|fixed|patched)\s+(the|these|those)\s+(change|commit|fix|patch|edit)/i],g8=[/\bverifier_verdict\b/i,/"\s*claim\s*"\s*:/i,/\bre-derived\b[^.\n]{0,80}\bindependent/i,/\bindependently\s+(re-derived|re-verified|verified|checked)\b/i,/\bverifier\s+(agrees|disagrees|confirms|refutes)\b/i,/\b(CONFIRMED|REFUTED|UNVERIFIABLE)\b[\s\S]*?\b(CONFIRMED|REFUTED|UNVERIFIABLE)\b/,/\|\s*(claims?|verdicts?)\s*\|/i],h8=`[framework-generated context: shadow-verify nudge]
|
|
1684
1684
|
|
|
1685
1685
|
The sub-agent that just finished returned output that reads like **decision-driving findings** (verdicts, recommendations, audit conclusions, or claim-style results that could drive file edits, deletions, commits, or external side-effects).
|
|
1686
1686
|
|
|
@@ -1773,15 +1773,15 @@ ${l}`):i,a=!1;for(let l of s){let c=await n.pushIfConfigured(l);if(c===null){e.w
|
|
|
1773
1773
|
`),this.client=a,this.connected=!0,this.pendingAuthTransport=void 0;let l=await _m(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??tS;return(await _m(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??tS,i;try{i=await this.client.callTool({name:t,arguments:n??{}},G3,{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 q3(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{}}};function q3(e){let t=[];for(let r of e.content??[])if(r.type==="text")t.push(r.text);else if(r.type==="image")t.push(`[image block: mimeType=${r.mimeType}, ${r.data.length} bytes base64]`);else if(r.type==="resource"){let o="resource"in r&&typeof r.resource=="object"?r.resource.uri??"(unknown)":"(unknown)";t.push(`[resource block: ${o}]`)}else t.push(`[unknown block: ${JSON.stringify(r)}]`);let n=t.join(`
|
|
1774
1774
|
`);return{content:n.length===0?"(empty tool result)":n,...e.isError?{isError:!0}:{}}}function z3(e,t,n){let r=t.type??(t.command?"stdio":"streamable-http");return{primary:xm(e,t,n),fallback:r==="streamable-http"?()=>xm(e,{...t,type:"sse"},n):null}}function J3(e){return e instanceof f0&&(e.code===404||e.code===405)}function V3(e){return e instanceof f0?e.code:void 0}function _m(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 Y3}from"node:crypto";var g0="mcp__",h0="__",rS=64,X3=6;function hc(e){if(e.length===0)return"_";let n=e.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_{2,}/g,"_");return n.length===0?"_":n}function Z3(e){return Y3("sha256").update(e).digest("hex").slice(0,X3)}function y0(e,t){let n=hc(e),r=hc(t),o=`${g0}${n}${h0}${r}`;if(o.length<=rS)return o;let s=`${`${g0}${Z3(e)}${h0}`}${r}`;return s.length<=rS?s:s.slice(0,rS)}function yc(e){let t=new Map,n=new Map;for(let{serverName:o,toolNames:i}of e)for(let s of i){let a=y0(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 d=n.get(a)??[c];d.push(l),n.set(a,d)}let r=[];for(let[o,i]of n)r.push({wireName:o,pairs:i});return{tools:t,conflicts:r}}Ie();var Ar=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=yc(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):
|
|
1775
1775
|
${o.join(`
|
|
1776
|
-
`)}`)}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,d]of Object.entries(t)){let u=hc(c);if(u!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${u}" for wire encoding`),d.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:d,status:"disabled",toolCount:0}});continue}let p={client:void 0,tools:[],state:{serverName:c,config:d,status:"connecting",toolCount:0}};r.set(c,p);let g=new aa(c,d);p.client=g,g.onTransportError=b=>{p.state.status="error",p.state.error=Im(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{i.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{let b=Date.now();be(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let y="error",w=0;try{let{tools:v,serverInfo:T}=await g.connect();p.tools=v,p.state.status="connected",p.state.toolCount=v.length,p.state.lastListedAt=Date.now(),y="connected",w=v.length;let S=T?`${T.name}@${T.version}`:"unknown";console.log(`[mcp:${c}] connected (${S}) \u2014 ${v.length} tool(s)`)}catch(v){if(v instanceof nS){p.state.status="oauth_pending",y="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let T=v instanceof Error?v.message:String(v);if(p.state.status="error",p.state.error=Im(T,200),d.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${T}`);console.warn(`[mcp:${c}] connect failed: ${T}`)}finally{be(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-b,metadata:{server:c,status:y,toolCount:w}})}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return 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(Q3(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=yc([{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 aa(t,r.state.config);o.onTransportError=s=>{r.state.status="error",r.state.error=Im(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=Im(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=yc([{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 Q3(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Im(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}J();G();import{existsSync as wc,lstatSync as eX,readFileSync as tX,readdirSync as nX}from"node:fs";import{join as bc}from"node:path";function pi(){return bc(hn(),"mcp.json")}function b0(e=process.cwd()){return bc(e,".mcp.json")}var rX=5;function oS(e=Qe()){if(!wc(e))return[];let t=[];return w0(e,e,0,t,new Set),t}function w0(e,t,n,r,o){if(n>rX||o.has(t))return;o.add(t);let i=bc(t,".claude-plugin","plugin.json");if(wc(i)){let a=bc(t,".claude-plugin","mcp.json");wc(a)&&r.push(a);return}let s;try{s=nX(t)}catch{return}for(let a of s){if(a.startsWith("."))continue;let l=bc(t,a),c;try{c=eX(l)}catch{continue}c.isDirectory()&&w0(e,l,n+1,r,o)}}function oX(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),{ok:!0,config:o}}function la(e){if(!wc(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(tX(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}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let i={};for(let[s,a]of Object.entries(o)){let l=oX(s,a);l.ok?i[s]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:i,sources:[e],warnings:t}}function mi(e={}){let t=[],n=[];if(e.importedMcpConfigs&&e.importedMcpConfigs.length>0)for(let a of e.importedMcpConfigs)t.push({path:a,loaded:la(a)});if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?oS(a):oS();for(let c of l)t.push({path:c,loaded:la(c)})}if(!e.skipUserGlobal){let a=pi();t.push({path:a,loaded:la(a)})}if(!e.skipProjectLocal&&E.AFK_ALLOW_PROJECT_MCP!=="0"){let a=b0(e.cwd);wc(a)&&(t.push({path:a,loaded:la(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:la(e.cliOverride)});let r=new Map,o=[...n],i=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)i.includes(l)||i.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let d=r.get(l);d&&o.push(`mcp: server "${l}" defined in ${d.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let s={};for(let[a,l]of r)s[a]=l.config;return{mcpServers:s,sources:i,warnings:o}}Cm();cr();Ie();function aX(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 v0=10*1024*1024;function k0(){return new Promise((e,t)=>{let n=[],r=0;if(process.stdin.readableEnded){e("");return}let o=i=>{if(r+=i.length,r>v0){process.stdin.destroy(new Error(`stdin exceeds ${v0}-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 E0(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 R0(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.",ze()).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' | 'enabled:<N>'","enabled:max").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-budget-usd <usd>","Hard session cost ceiling in USD. Env: AFK_MAX_BUDGET_USD").option("--task-budget <tokens>","Soft per-task token budget. Env: AFK_TASK_BUDGET").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai|openai-compatible. 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
|
|
1776
|
+
`)}`)}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,d]of Object.entries(t)){let u=hc(c);if(u!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${u}" for wire encoding`),d.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:d,status:"disabled",toolCount:0}});continue}let p={client:void 0,tools:[],state:{serverName:c,config:d,status:"connecting",toolCount:0}};r.set(c,p);let g=new aa(c,d);p.client=g,g.onTransportError=b=>{p.state.status="error",p.state.error=Im(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{i.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{let b=Date.now();be(n.traceWriter,{phase:"mcp_server_start",metadata:{server:c}});let y="error",w=0;try{let{tools:v,serverInfo:T}=await g.connect();p.tools=v,p.state.status="connected",p.state.toolCount=v.length,p.state.lastListedAt=Date.now(),y="connected",w=v.length;let S=T?`${T.name}@${T.version}`:"unknown";console.log(`[mcp:${c}] connected (${S}) \u2014 ${v.length} tool(s)`)}catch(v){if(v instanceof nS){p.state.status="oauth_pending",y="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let T=v instanceof Error?v.message:String(v);if(p.state.status="error",p.state.error=Im(T,200),d.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${T}`);console.warn(`[mcp:${c}] connect failed: ${T}`)}finally{be(n.traceWriter,{phase:"mcp_server_done",durationMs:Date.now()-b,metadata:{server:c,status:y,toolCount:w}})}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return 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(Q3(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=yc([{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 aa(t,r.state.config);o.onTransportError=s=>{r.state.status="error",r.state.error=Im(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=Im(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=yc([{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 Q3(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Im(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}J();G();import{existsSync as wc,lstatSync as e6,readFileSync as t6,readdirSync as n6}from"node:fs";import{join as bc}from"node:path";function pi(){return bc(hn(),"mcp.json")}function b0(e=process.cwd()){return bc(e,".mcp.json")}var r6=5;function oS(e=Qe()){if(!wc(e))return[];let t=[];return w0(e,e,0,t,new Set),t}function w0(e,t,n,r,o){if(n>r6||o.has(t))return;o.add(t);let i=bc(t,".claude-plugin","plugin.json");if(wc(i)){let a=bc(t,".claude-plugin","mcp.json");wc(a)&&r.push(a);return}let s;try{s=n6(t)}catch{return}for(let a of s){if(a.startsWith("."))continue;let l=bc(t,a),c;try{c=e6(l)}catch{continue}c.isDirectory()&&w0(e,l,n+1,r,o)}}function o6(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),{ok:!0,config:o}}function la(e){if(!wc(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(t6(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}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let i={};for(let[s,a]of Object.entries(o)){let l=o6(s,a);l.ok?i[s]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:i,sources:[e],warnings:t}}function mi(e={}){let t=[],n=[];if(e.importedMcpConfigs&&e.importedMcpConfigs.length>0)for(let a of e.importedMcpConfigs)t.push({path:a,loaded:la(a)});if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?oS(a):oS();for(let c of l)t.push({path:c,loaded:la(c)})}if(!e.skipUserGlobal){let a=pi();t.push({path:a,loaded:la(a)})}if(!e.skipProjectLocal&&E.AFK_ALLOW_PROJECT_MCP!=="0"){let a=b0(e.cwd);wc(a)&&(t.push({path:a,loaded:la(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:la(e.cliOverride)});let r=new Map,o=[...n],i=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)i.includes(l)||i.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let d=r.get(l);d&&o.push(`mcp: server "${l}" defined in ${d.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let s={};for(let[a,l]of r)s[a]=l.config;return{mcpServers:s,sources:i,warnings:o}}Cm();cr();Ie();function a6(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 v0=10*1024*1024;function k0(){return new Promise((e,t)=>{let n=[],r=0;if(process.stdin.readableEnded){e("");return}let o=i=>{if(r+=i.length,r>v0){process.stdin.destroy(new Error(`stdin exceeds ${v0}-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 E0(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 R0(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.",ze()).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' | 'enabled:<N>'","enabled:max").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-budget-usd <usd>","Hard session cost ceiling in USD. Env: AFK_MAX_BUDGET_USD").option("--task-budget <tokens>","Soft per-task token budget. Env: AFK_TASK_BUDGET").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai|openai-compatible. 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
|
|
1777
1777
|
`),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
|
|
1778
|
-
`),process.exitCode=1;return}if(n.sessionId!==void 0&&!
|
|
1778
|
+
`),process.exitCode=1;return}if(n.sessionId!==void 0&&!a6(n.sessionId)){process.stderr.write(`Error: --session-id must be a UUID (got: ${n.sessionId})
|
|
1779
1779
|
`),process.exitCode=1;return}if(n.sessionId!==void 0&&na(n.sessionId)!==void 0){process.stderr.write(`Error: session already exists: ${n.sessionId} \u2014 use --resume to continue it
|
|
1780
1780
|
`),process.exitCode=1;return}let r=[];if(n.post!==void 0){let y=t0(n.post);r.push(...y.targets);for(let w of y.unknown)process.stderr.write(`Warning: unknown --post target ignored: ${w} (expected github or telegram)
|
|
1781
1781
|
`)}let o,i=!process.stdin.isTTY;if(t==="-"){if(!i){process.stderr.write(`Error: no stdin available \u2014 pass a message or pipe one in
|
|
1782
1782
|
`),process.exitCode=1;return}o=await k0()}else if(t===void 0&&i)o=await k0();else if(t!==void 0)o=t;else{process.stderr.write(`Error: missing message \u2014 pass a message argument or pipe via stdin
|
|
1783
1783
|
`),process.exitCode=1;return}if(o.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
|
|
1784
|
-
`),process.exitCode=1;return}let s=
|
|
1784
|
+
`),process.exitCode=1;return}let s=i6("Initializing agent...").start(),a=null,l,c,d,u,m=!1,p,g=Sm(n.model),h=!1,b;try{if(n.worktree!==void 0)try{c=await qd(n.worktree,n.worktreeBase!==void 0?{baseRef:n.worktreeBase}:void 0),d=c.path,s.text=`Worktree ready at ${c.path} (branch: ${c.branch})`}catch(de){s.fail("Failed to create worktree"),V(de)}let y,w,v,T,S,R,C;try{y=po(n.thinking)??Ls(),w=mo(n.effort)??Ns(),v=Bs(n.maxBudgetUsd)??uw(),T=Bs(n.taskBudget)??pw(),S=Us(n.maxOutputTokens)??oc(),R=js(),C=void 0}catch(de){s.fail("Invalid options"),V(de)}if(n.dumpPrompt!==void 0){let de=n.dumpPrompt===!0?x0.join(T0.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=de,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 _=Ft(),{prompt:j,source:P}=Fs(),k=$t(),M=k.autoRouting?.chat??!1,N=pm(j,M,"one-shot"),L={},B=ra({resume:n.resume,continue:n.continue});if(n.resume&&B&&!B.stored){s.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
|
|
1785
1785
|
Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
1786
1786
|
`),process.exitCode=1;return}B&&(L=oa(B),m=!0,p=B.id),n.sessionId!==void 0&&(L={sessionId:n.sessionId},m=!0,p=n.sessionId);let H=B?.stored?.model??n.model,$=ns(H);if($)throw new Error($);g.model=H,B?.stored&&(g.totalTurns=B.stored.totalTurns,g.totalCostUsd=B.stored.totalCostUsd,g.totalTokens=B.stored.totalTokens,g.totalDurationMs=B.stored.totalDurationMs,g.turns=[...B.stored.turns],g.sessionId=B.stored.sessionId??B.resumeId,g.sessionStartTime=B.stored.startedAt??Date.now()),n.sessionId!==void 0&&(g.sessionId=n.sessionId);let I,O=ho();b=O?.tracePath;let F=new ae({apiKey:_,parentModel:ze(),...k.baseUrl!==void 0?{baseUrl:k.baseUrl}:{},...d!==void 0?{cwd:d}:{},...O?.writer!==void 0?{traceWriter:O.writer}:{},surface:"cli"}),U=Ps(k.openaiBaseUrl!==void 0?{openaiBaseUrl:k.openaiBaseUrl}:{}),Y={get sessionId(){return I?.sessionId},getInputStreamRef(){return I?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return I?.abortSignal??new AbortController().signal},get hookRegistry(){return I?.hookRegistry}},ne=si({...d!==void 0?{cwd:d}:{},pluginAgents:Gs()}),te=Ms(n.model,_,U,k.baseUrl,O?.writer,void 0,d,Xe,"cli",It(n.model),ne,k.openaiBaseUrl),Z=new qn({subagentManager:F,parentSession:Y,surface:"cli",defaultConfig:{apiKey:_,systemPrompt:j,...k.baseUrl!==void 0?{baseUrl:k.baseUrl}:{},...k.openaiBaseUrl!==void 0?{openaiBaseUrl:k.openaiBaseUrl}:{}},defaultSubagentModel:It(n.model),childProviderFactory:U,childSkillExecutorFactory:te,resolveApiKeyForModel:Xe,depth:0,...d!==void 0?{cwd:d}:{},agentRegistry:ne,parentModel:n.model,...O?.writer!==void 0?{traceWriter:O.writer}:{}}),K=new zn({parentSession:Y,surface:"cli",defaultModel:n.model,defaultSubagentModel:It(n.model),apiKey:_,childProviderFactory:U,childSkillExecutorFactory:te,agentRegistry:ne,...k.baseUrl!==void 0?{baseUrl:k.baseUrl}:{},...k.openaiBaseUrl!==void 0?{openaiBaseUrl:k.openaiBaseUrl}:{},resolveApiKeyForModel:Xe,...O?.writer!==void 0?{traceWriter:O.writer}:{},...d!==void 0?{cwd:d}:{}}),Ce=new fo({parentSession:Y,defaultModel:n.model,defaultSubagentModel:It(n.model),apiKey:_,resolveApiKeyForModel:Xe,...k.baseUrl!==void 0?{baseUrl:k.baseUrl}:{},...d!==void 0?{cwd:d}:{},systemPrompt:j??"",surface:"cli",depth:0,...O?.writer!==void 0?{traceWriter:O.writer}:{}});l=new mt;{let de=d??process.cwd(),$e=wn(Ut()).mcpConfigs.filter(Le=>Le.format==="json").map(Le=>Le.source),Ve=mi({cwd:de,...$e.length>0?{importedMcpConfigs:$e}:{},...n.mcpConfig!==void 0?{cliOverride:n.mcpConfig}:{}}),Pe=Object.values(Ve.mcpServers).filter(Le=>!Le.disabled).length;if(Pe>0){let Le=Date.now();be(O?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Pe}});try{u=await Ar.fromConfig(Ve.mcpServers,{warnings:Ve.warnings,...O?.writer!==void 0?{traceWriter:O.writer}:{}})}finally{be(O?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-Le,metadata:{serverCount:Pe}})}}else if(Ve.warnings.length>0)for(let Le of Ve.warnings)process.stderr.write(`[mcp] ${Le}
|
|
1787
1787
|
`)}let Ot=u?.getMcpToolWireNames()??[];C=Hs(n.provider,{subagentExecutor:Z,skillExecutor:K,composeExecutor:Ce,memoryStore:l,model:String(n.model),...k.openaiBaseUrl!==void 0?{openaiBaseUrl:k.openaiBaseUrl}:{},...u!==void 0?{mcpManager:u}:{}})??new nt({permissions:{allowedTools:um(Ot)},subagentExecutor:Z,skillExecutor:K,composeExecutor:Ce,memoryStore:l,surface:"cli",...u!==void 0?{mcpManager:u}:{}}),await qs(),a=new _t(br({model:H,surface:"cli",apiKey:Xe(H),maxTurns:parseInt(n.maxTurns,10),isNonInteractive:!0,...n.dangerouslySkipPermissions?{permissionMode:"bypassPermissions"}:k.permissionMode!==void 0?{permissionMode:k.permissionMode}:{},hookRegistry:Zs(de=>{console.log(Yw(de))},"cli",l,void 0,Xs({cwd:d}),{cwd:d,...O?.writer!==void 0?{traceWriter:O.writer}:{}}).registry,...N!==void 0?{systemPrompt:N}:{},...P!==void 0?{systemPromptSource:P}:{},...y!==void 0?{thinking:y}:{},...w!==void 0?{effort:w}:{},...v!==void 0?{maxBudgetUsd:v}:{},...T!==void 0?{taskBudget:T}:{},...S!==void 0?{maxOutputTokens:S}:{},...R!==void 0?{maxToolUseIterations:R}:{},...k.baseUrl!==void 0?{baseUrl:k.baseUrl}:{},...O?{traceWriter:O.writer}:{},...k.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:k.autoResumeOnUsageLimit}:{},...d!==void 0?{cwd:d}:{},...L,provider:C})),I=a,s.text="Sending message...";let kt=async(de,$e)=>{if(r.length===0||$e)return;let Ve={line:Pe=>{process.stderr.write(`${Pe??""}
|
|
@@ -1794,8 +1794,8 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
|
1794
1794
|
`),Le.type==="chunk"&&Le.chunk.type==="content"&&($e+=Le.chunk.content),Le.type==="done"&&(ui(g,o,$e,Le.metadata),Le.metadata?.sessionId&&!g.sessionId&&(g.sessionId=String(Le.metadata.sessionId))),Le.type==="error"){process.exitCode=1,Ve=!0;break}await kt($e,Ve);return}let Qt=await a.sendMessage(o,{stream:n.stream});s.succeed("Response received");let Re=a.getLastResponseMetadata();if(ui(g,o,Qt.content,Re??void 0),Re?.sessionId&&!g.sessionId&&(g.sessionId=String(Re.sessionId)),n.format==="json"){let de=Re?Number(Re.usage?.input_tokens??0):0,$e=Re?Number(Re.usage?.output_tokens??0):0;console.log(JSON.stringify({success:!0,model:H,message:Qt.content,timestamp:Qt.timestamp,...Re?.totalCostUsd!==void 0?{costUsd:Re.totalCostUsd}:{},...Re?.durationMs!==void 0?{durationMs:Re.durationMs}:{},...de>0?{inputTokens:de}:{},...$e>0?{outputTokens:$e}:{}},null,2))}else{if(console.log(S0.cyan(`
|
|
1795
1795
|
\u{1F916} Claude:`)),console.log(Br(Qt.content)),Re){let de=[];Re.durationMs&&de.push(ge(Re.durationMs)),Re.totalCostUsd!==void 0&&de.push(ct(Re.totalCostUsd));let $e=Number(Re.usage?.input_tokens??0),Ve=Number(Re.usage?.output_tokens??0);$e+Ve>0&&de.push(le($e+Ve)+" tokens"),de.length>0&&console.log(S0.dim(" \xB7 "+de.join(" \xB7 ")))}console.log("")}await kt(Qt.content,!1)}catch(y){if(h=!0,n.format==="stream-json"){let w=y instanceof Error?y:new Error(String(y));try{await E0(process.stdout,JSON.stringify({type:"error",error:{message:w.message,name:w.name}})+`
|
|
1796
1796
|
`)}catch{}process.exitCode=1}s.fail("Failed to send message"),V(y)}finally{if(m&&g.totalTurns>0&&!h)try{let w=Vn(g,p).replace(/\.json$/,"").split("/").pop()??p??g.sessionId??"unknown";process.stderr.write(`Continue with: afk chat <msg> --resume ${w}
|
|
1797
|
-
`)}catch{}if(a&&(await a.close(),b!==void 0))try{let{mdPath:y}=Kw(b);
|
|
1798
|
-
`)}catch{}u&&await u.disconnectAll(),l?.close(),c!==void 0&&await c.cleanup()}})}J();import HL from"ora";import*as WL from"node:os";import*as Oi from"node:path";import{execFileSync as vne}from"node:child_process";var Pm=new Set;function fi(e){return Pm.add(e),()=>{Pm.delete(e)}}async function Mm(){await Promise.all([...Pm].map(e=>e())),Pm.clear()}Jt();var
|
|
1797
|
+
`)}catch{}if(a&&(await a.close(),b!==void 0))try{let{mdPath:y}=Kw(b);s6(y)&&process.stderr.write(`Receipt: ${y}
|
|
1798
|
+
`)}catch{}u&&await u.disconnectAll(),l?.close(),c!==void 0&&await c.cleanup()}})}J();import HL from"ora";import*as WL from"node:os";import*as Oi from"node:path";import{execFileSync as vne}from"node:child_process";var Pm=new Set;function fi(e){return Pm.add(e),()=>{Pm.delete(e)}}async function Mm(){await Promise.all([...Pm].map(e=>e())),Pm.clear()}Jt();var l6=/^[A-Za-z0-9_@%+=:,./-]+$/;function Sc(e){return l6.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function Yn(e,t){let n=["afk","interactive"];return typeof t=="string"&&t.length>0&&n.push("--model",Sc(t)),n.push("--resume",Sc(e)),n.join(" ")}import{homedir as c6}from"node:os";import{sep as Xn}from"node:path";function vc(e,t={}){if(!e)return"";let n=t.homedir??c6(),r=d6(e,n),o=t.maxWidth;if(o===void 0||o<=0||X(r)<=o)return r;let i=r.split(Xn).filter(u=>u.length>0);if(i.length<=1)return se(r,o);let a=r.startsWith("~")?"~":i[0],l=1,c=i[i.length-1],d=[];for(let u=i.length-2;u>=l;u--){let m=i.slice(l,u+1),p=m.length>0?m.join(Xn)+Xn:"";d.push(`${a}${Xn}${p}\u2026${Xn}${c}`)}d.push(`${a}${Xn}\u2026${Xn}${c}`);for(let u of d)if(X(u)<=o)return u;return se(d[d.length-1],o)}function d6(e,t){if(!t)return e;if(e===t)return"~";let n=t.endsWith(Xn)?t:t+Xn;return e.startsWith(n)?"~"+Xn+e.slice(n.length):e}Kr();import*as JF from"node:readline";var u6=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])|\x9B[0-?]*[ -/]*[@-~]|[\x80-\x9F]/g;function me(e,t=128){let n=e.replace(u6,"");return n.length>t?n.slice(0,t)+"\u2026":n}import{emitKeypressEvents as p6}from"readline";var m6=50;function gi(e){p6(e,{escapeCodeTimeout:m6})}var hi="\u270E Type your own answer";async function A0(e,t){if(!process.stdout.isTTY||!process.stdin.isTTY||e.length===0)return null;let n=10,r=0,o=0;function i(){let d=o,u=Math.min(d+n,e.length);return{start:d,end:u}}function s(){let{start:d,end:u}=i(),m=[];for(let p=d;p<u;p++){let g=me(e[p],80);p===r?m.push(` ${f.bold("\u25B6 "+g)}`):m.push(` ${f.dim(g)}`)}if(e.length>n){let{end:p}=i();m.push(f.dim(` (${o+1}\u2013${p} of ${e.length} \u2191/\u2193 to scroll)`))}else m.push(f.dim(" \u2191/\u2193 navigate Enter select Esc cancel"));return m}let a=s();process.stdout.write(a.join(`
|
|
1799
1799
|
`)+`
|
|
1800
1800
|
`);let l=a.length;function c(){let d=s();process.stdout.write(`\x1B[${l}A\x1B[0J`+d.join(`
|
|
1801
1801
|
`)+`
|
|
@@ -1803,17 +1803,17 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
|
1803
1803
|
`)+`
|
|
1804
1804
|
`);let c=l.length;function d(){let u=a();process.stdout.write(`\x1B[${c}A\x1B[0J`+u.join(`
|
|
1805
1805
|
`)+`
|
|
1806
|
-
`),c=u.length}return new Promise(u=>{process.stdin.setRawMode(!0),gi(process.stdin);let m=(g,h)=>{if(h)if(h.name==="up"||h.sequence==="\x1B[A")r>0&&(r--,r<o&&(o=r),d());else if(h.name==="down"||h.sequence==="\x1B[B"){if(r<e.length-1){r++;let{end:b}=s();r>=b&&o++,d()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),d()):h.name==="return"||h.name==="enter"?(p(),u([...i].sort((b,y)=>b-y))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(p(),u(":cancel"))};function p(){process.stdin.removeListener("keypress",m);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",m)})}function Om(e=process.env){return e.AFK_DEMO_CLEAN==="1"||typeof e.SCRIPT=="string"&&e.SCRIPT.length>0||e.ASCIINEMA_REC==="1"}function fX(e=process.env){return e.AFK_BELL==="1"}function $m(e=process.env){return e.AFK_REDUCED_MOTION==="1"}function _0(e=process.env){return e.AFK_CARET_BLINK!=="0"}function Dm(e,t=process.env){fX(t)&&e.isTTY&&e.write("\x07")}function iS(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 sS(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 aS=64,Lm=256,Fm=20,lS=new Set(["__proto__","constructor","prototype"]),ca={action:"decline"},ie={action:"cancel"},gX={action:"accept"};function hX(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(!lS.has(l)){if(r+=1,a>=aS){o=!0;continue}n[l]=c,a+=1}}let i=e.required,s=new Set(Array.isArray(i)?i.slice(0,aS*2).filter(a=>typeof a=="string").filter(a=>!lS.has(a)):[]);return{properties:n,required:s,fieldsTruncated:o,originalFieldCount:r}}function yX(e,t){e.line(),e.line(f.warning("\u26A0 MCP form elicitation")),e.line(f.dim(" server: ")+f.bold(me(t.serverName,64))),e.line(f.dim(" message: ")+me(t.message,256)),t.elicitationId&&e.line(f.dim(" id: ")+me(t.elicitationId,64)),e.line(f.dim(" Type :decline or :cancel at any prompt to exit.")),e.line()}var I0="\u2014 skip (optional) \u2014";async function bX(e,t,n,r,o,i,s){let a,l;if(e.enum!==void 0){let p=e.enum.slice(0,Lm);a=p.map(g=>me(String(g),64)),l=g=>{let h=a.indexOf(g);return h>=0?p[h]:g}}else a=["Yes","No"],l=p=>p==="Yes";let c=t?a:[...a,I0],d=[f.bold(" ? "+n),""],u;try{u=await o({header:d,options:c,multi:!1,signal:s})}catch{return{tag:"cancel"}}if(s.aborted)return{tag:"cancel"};if(u===null)return{tag:"cancel"};let m=u[0];return m===void 0?{tag:"cancel"}:!t&&m===I0?{tag:"value",value:e.default}:(i.line(f.dim(" \u2713 ")+f.brand(`${r}: ${me(m,128)}`)),{tag:"value",value:l(m)})}async function wX(e,t,n,r,o,i,s){if(i.aborted)return{tag:"cancel"};let a=me(t.description??t.title??e),l=me(t.type??"string",32),c=me(e,64);if(s&&(t.enum!==void 0||l==="boolean"))return bX(t,n,a,c,s,o,i);let d;if(t.enum!==void 0){let m=t.enum.slice(0,Fm).map(g=>me(String(g),32)).join("|"),p=t.enum.length>Fm?"|\u2026":"";d=` (enum: ${m}${p})`}else l==="boolean"?d=" (boolean: y/n)":l==="number"||l==="integer"?d=` (${l})`:l==="string"?d=" (string)":(d=` (${l} \u2014 treated as string)`,o.line(f.warning(` \u26A0 Unknown field type '${l}' for '${c}' \u2014 collecting as string.`)));let u=n?"":f.dim(" [optional, enter to skip]");for(o.line(f.dim(` [${c}]`)+f.dim(` ${a}`)+f.dim(d)+u),t.enum!==void 0&&t.enum.length>Lm&&o.line(f.warning(` \u26A0 Field '${c}' has ${t.enum.length} enum values; only the first ${Lm} are valid for input.`));;){let m;try{m=await r(f.dim(" > "))}catch{return{tag:"cancel"}}if(i.aborted)return{tag:"cancel"};let p=m.trim();if(p===":cancel")return{tag:"cancel"};if(p===":decline")return{tag:"decline"};if(p===""){if(n){o.line(f.warning(" (required \u2014 cannot be skipped)"));continue}return{tag:"value",value:t.default}}let g;if(l==="boolean"){let h=p.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(f.warning(" Invalid boolean \u2014 enter y/yes/true/1 or n/no/false/0."));continue}}else if(l==="number"){let h=Number(p);if(!isFinite(h)){o.line(f.warning(" Invalid number \u2014 enter a numeric value."));continue}g=h}else if(l==="integer"){let h=parseInt(p,10);if(!isFinite(h)||String(h)!==p.replace(/\.0+$/,"")){o.line(f.warning(" Invalid integer \u2014 enter a whole number."));continue}g=h}else g=p;if(t.enum!==void 0){let h=t.enum.slice(0,Lm),b=!1;for(let y of h)if(String(y)===String(g)){b=!0;break}if(!b){let y=me(String(g),64),w=h.slice(0,Fm).map(T=>me(String(T),32)).join(", "),v=h.length>Fm?", \u2026":"";o.line(f.warning(` '${y}' is not a valid choice. Valid: ${w}${v}`));continue}}return{tag:"value",value:g}}}function SX(e,t){e.line(),e.line(f.warning("\u26A0 MCP elicitation")),e.line(f.dim(" server: ")+f.bold(me(t.serverName,64))),e.line(f.dim(" message: ")+me(t.message,256)),t.url&&e.line(f.dim(" url: ")+f.brand(me(t.url,512))),t.elicitationId&&e.line(f.dim(" id: ")+me(t.elicitationId,64)),e.line()}var yi={action:"skip"};function Nm(e){let t=[];return t.push(f.warning(" \u{1F4AC} Agent question")),t.push(f.bold(" ? "+me(e.message,512))),e.context&&t.push(f.dim(" "+me(e.context,512))),t.push(""),t}async function vX(e,t,n,r){let o=Nm(t),i=t.allowSkip===!0;if(e==="number"){let d=t.min,u=t.max,p=`enter to submit \xB7 esc to cancel${d!==void 0&&u!==void 0?` [${d}\u2013${u}]`:d!==void 0?` [\u2265${d}]`:u!==void 0?` [\u2264${u}]`:""}`,h=await n({header:o,help:p,validate:y=>{let w=iS(y.trim(),{allowSkip:i,min:d,max:u,emptyError:"Please enter a number (or esc to cancel)."});return w.ok?null:w.error},signal:r});if(h===null)return null;let b=h.trim();return b===""&&i?{tag:"skip"}:{tag:"number",value:Number(b)}}let s=t.minLength,a=t.maxLength,c=await n({header:o,validate:d=>{let u=sS(d,{allowSkip:i,minLength:s,maxLength:a,emptyError:"Please enter a response (or esc to cancel)."});return u.ok?null:u.error},signal:r});return c===null?null:c===""&&i?{tag:"skip"}:{tag:"text",value:c}}async function kX(e,t,n){if(n.aborted)return ca;let{readLine:r,writer:o,pendingCount:i,pickFromList:s,readTextOverlay:a}=t,l=e.type??"text",c=i();if(c>1&&o.line(f.dim(` [${c} questions queued]`)),(l==="choice"||l==="multi_choice")&&s&&(e.choices?.length??0)>0){let m=(e.choices??[]).map(h=>me(h,128));e.allowCustom&&m.push(hi);let p;try{p=await s({header:Nm(e),options:m,multi:l==="multi_choice",signal:n})}catch{return ie}if(n.aborted||p===null)return ie;if(e.allowCustom&&p.includes(hi)){if(!a)return ie;let h=await a({header:Nm(e),help:"Type your custom answer (Esc to cancel)",validate:b=>b.trim()===""?"Please enter a non-empty answer":null,signal:n});return h===null?ie:(o.line(f.dim(" \u270E ")+f.brand(me(h,256))),{action:"accept",content:{value:null,custom_value:h}})}if(p.length===0)return e.allowSkip?yi:ie;let g=p.length===1?me(p[0]??"",128):p.map(h=>me(h,128)).join(", ");return o.line(f.dim(" \u2713 ")+f.brand(g)),l==="choice"?{action:"accept",content:{value:p[0]}}:{action:"accept",content:{value:[...p]}}}if(l==="confirm"&&s){let p=e.questionDefault!==!1?["Yes","No"]:["No","Yes"],g;try{g=await s({header:Nm(e),options:p,multi:!1,signal:n})}catch{return ie}if(n.aborted||g===null)return ie;let h=g[0];if(h===void 0)return ie;let b=h==="Yes";return o.line(f.dim(" \u2713 ")+(b?f.success("Yes"):f.error("No"))),{action:"accept",content:{value:b}}}if((l==="text"||l==="number")&&a){let m=await vX(l,e,a,n);if(m===null)return ie;if(m.tag==="skip")return yi;let p=m.tag==="text"?me(m.value,256):String(m.value);return o.line(f.dim(" \u2713 ")+f.brand(p)),{action:"accept",content:{value:(m.tag==="text",m.value)}}}if(o.line(),o.line(f.warning("\u{1F4AC} Agent question")),e.context&&o.line(f.dim(" context: ")+me(e.context,512)),o.line(f.bold(" "+me(e.message,512))),o.line(f.dim(" Type :cancel to skip this question.")),o.line(),l==="confirm"){o.line("\x07");let m=e.questionDefault===!0?"Y/n":"y/N";for(;;){if(n.aborted)return ie;let p;try{p=(await r(f.dim(` Continue? [${m}] `))).trim().toLowerCase()}catch{return ie}if(n.aborted||p===":cancel")return ie;if(p==="")return{action:"accept",content:{value:e.questionDefault===!0}};if(p==="y"||p==="yes")return{action:"accept",content:{value:!0}};if(p==="n"||p==="no")return{action:"accept",content:{value:!1}};o.line(f.warning(" Please enter y or n."))}}if(l==="choice"){o.line("\x07");let m=e.choices??[],p=e.allowCustom?[...m,hi]:m,g=await A0(p,n);if(g!==null){if(g===":cancel")return ie;if(e.allowCustom&&g===m.length){let b;try{b=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return b===":cancel"||n.aborted?ie:{action:"accept",content:{value:null,custom_value:b}}}let h=m[g];return h!==void 0?(o.line(f.dim(` Selected: ${me(h,128)}`)),{action:"accept",content:{value:h}}):ie}for(m.forEach((h,b)=>{o.line(` ${b+1}. ${me(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${hi}`);;){if(n.aborted)return ie;let h;try{h=(await r(f.dim(" Enter number: "))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;if(e.allowCustom&&h===String(m.length+1)){let y;try{y=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return y===":cancel"?ie:{action:"accept",content:{value:null,custom_value:y}}}if(h===""&&e.allowSkip)return yi;let b=parseInt(h,10);if(!isFinite(b)||String(b)!==h||b<1||b>m.length){o.line(f.warning(` Please enter a number between 1 and ${m.length+(e.allowCustom?1:0)}.`));continue}return{action:"accept",content:{value:m[b-1]}}}}if(l==="multi_choice"){let m=e.choices??[],p=e.allowCustom?[...m,hi]:m,g=await C0(p,n);if(g!==null){if(g===":cancel")return ie;if(e.allowCustom&&g.includes(m.length)){let h;try{h=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return h===":cancel"||n.aborted?ie:{action:"accept",content:{value:null,custom_value:h}}}if(g.length===0&&e.allowSkip)return yi;if(g.length>0){let h=g.map(b=>m[b]);return o.line(f.dim(` Selected: ${h.map(b=>me(b,64)).join(", ")}`)),{action:"accept",content:{value:h}}}}for(m.forEach((h,b)=>{o.line(` ${b+1}. ${me(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${hi}`);;){if(n.aborted)return ie;let h;try{h=(await r(f.dim(" Enter numbers (comma-separated): "))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;if(e.allowCustom&&h===String(m.length+1)){let v;try{v=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return v===":cancel"?ie:{action:"accept",content:{value:null,custom_value:v}}}if(h===""&&e.allowSkip)return yi;if(h===""){o.line(f.warning(" Please enter at least one selection."));continue}let b=h.split(",").map(v=>v.trim()),y=[],w=!0;for(let v of b){let T=parseInt(v,10);if(!isFinite(T)||String(T)!==v||T<1||T>m.length){o.line(f.warning(` Invalid selection "${me(v,32)}". Enter numbers between 1 and ${m.length}.`)),w=!1;break}y.push(m[T-1])}if(w)return{action:"accept",content:{value:y}}}}if(l==="number"){let m=e.min,p=e.max,g=m!==void 0&&p!==void 0?` [${m}\u2013${p}]`:m!==void 0?` [\u2265${m}]`:p!==void 0?` [\u2264${p}]`:"";for(;;){if(n.aborted)return ie;let h;try{h=(await r(f.dim(` Enter a number${g}: `))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;let b=iS(h,{allowSkip:e.allowSkip===!0,min:m,max:p,emptyError:"Please enter a number (or :cancel to skip)."});if(!b.ok){o.line(f.warning(" "+b.error));continue}return b.skip?yi:{action:"accept",content:{value:b.value}}}}let d=e.minLength,u=e.maxLength;for(;;){if(n.aborted)return ie;let m;try{m=(await r(f.dim(" > "))).trim()}catch{return ie}if(n.aborted||m===":cancel")return ie;let p=sS(m,{allowSkip:e.allowSkip===!0,minLength:d,maxLength:u,emptyError:"Please enter a response (or type :cancel to skip)."});if(!p.ok){o.line(f.warning(" "+p.error));continue}return p.skip?yi:{action:"accept",content:{value:m}}}}function Bm(e){return async(t,{signal:n})=>{if(n.aborted)return ca;Dm(process.stdout),e.suspendInput?.();try{if(t.origin==="agent")return await kX(t,e,n);if(t.mode==="form"){let o=t.requestedSchema,{properties:i,required:s,fieldsTruncated:a,originalFieldCount:l}=typeof o=="object"&&o!==null?hX(o):{properties:{},required:new Set,fieldsTruncated:!1,originalFieldCount:0};yX(e.writer,t),a&&e.writer.line(f.warning(` \u26A0 Schema has ${l} fields; only the first ${aS} will be prompted (server may be malformed or compromised).`));let c=Object.create(null);if(Object.keys(i).length===0)return e.writer.line(f.warning(" \u26A0 Form schema has no usable fields \u2014 declining.")),ca;for(let d of s)if(!(d in i))return e.writer.line(f.warning(` \u26A0 Required field '${me(d,64)}' has no schema entry \u2014 declining.`)),ca;for(let[d,u]of Object.entries(i)){if(n.aborted)return ie;let m=await wX(d,u,s.has(d),e.readLine,e.writer,n,e.pickFromList);if(m.tag==="cancel")return ie;if(m.tag==="decline")return ca;m.value!==void 0&&!lS.has(d)&&(c[d]=m.value)}return{action:"accept",content:{...c}}}SX(e.writer,t);let r=(await e.readLine(f.dim("Continue? [y/N] "))).trim().toLowerCase();return r===""?ie:r==="y"||r==="yes"?gX:ca}finally{e.resumeInput?.()}}}Os();nn();Tn();Jt();jt();import{basename as M0,dirname as EX}from"node:path";function P0(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?f.error:t>.5?f.warning:f.meta,r=20,o=Math.round(t*r),i=r-o,s="["+"\u2588".repeat(o)+"\u2591".repeat(i)+"]",a=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=le(e.used)+"/"+le(e.limit));let c=l?`${s} ${a} ${l}`:`${s} ${a}`,d=`${s} ${a}`,u=`ctx ${a}`,m=e.sparkline?f.meta(e.sparkline)+" ":"",p=e.sparkline?X(e.sparkline)+1:0,g=Math.max(0,e.width-p);if(X(c)<=g&&g>90)return m+n(c);if(X(d)<=g&&g>32)return m+n(d);if(X(u)<=g)return m+n(u);if(e.width>0){let h=m+n(u);return se(h,e.width)}return n(a)}var Um=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;resizeImmediateUnsub=null;lastPaintedRow=null;preResizePaintedRow=null;extraRows=0;afterScrollRestore=null;constructor(t={}){this.stream=t.stream??process.stdout,this.force=t.force??!1,this.throttleMs=t.throttleMs??100}get enabled(){return this.force||!!this.stream.isTTY}start(){if(this.started||!this.enabled)return;this.started=!0,this.lastRepaint=0;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.resizeUnsub===null&&(this.resizeUnsub=We.subscribe(()=>{this.onResize()}),this.resizeImmediateUnsub=We.subscribeImmediate(()=>this.resetGeometry()))}resetGeometry(){this.preResizePaintedRow=this.lastPaintedRow,this.lastPaintedRow=null,this.lastRepaint=0}onResize(){if(!this.started||!this.enabled)return;let t=this.currentRows(),n=this.preResizePaintedRow??this.lastPaintedRow;this.preResizePaintedRow=null,this.stream.write("\x1B[s"),n!==null&&n!==this.paintRow(t)&&(this.stream.write(`\x1B[${n};1H`),this.stream.write("\x1B[2K")),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}repaint(t){if(!this.enabled||!this.started){this.lastFields=t;return}let n=Date.now();if(n-this.lastRepaint<this.throttleMs){this.lastFields=t;return}this.lastRepaint=n,this.lastFields=t;let r=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.paintRow(r)};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatLine(t)),this.stream.write("\x1B[u"),this.lastPaintedRow=this.paintRow(r)}flush(){this.lastRepaint=0,this.lastFields&&this.repaint(this.lastFields)}setExtraRows(t){if(this.extraRows=t,this.started&&this.enabled){let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}getExtraRows(){return this.extraRows}setAfterScrollRestore(t){this.afterScrollRestore=t}rearm(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}withFullScrollRegion(t){if(!this.started||!this.enabled)return t();this.stream.write("\x1B[s"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u");try{return t()}finally{let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush(),this.afterScrollRestore?.()}}stop(){if(this.resizeUnsub!==null&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub!==null&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),!this.started||!this.enabled){this.started=!1;return}let t=this.currentRows();this.stream.write("\x1B[s");let n=this.preResizePaintedRow??this.lastPaintedRow??this.paintRow(t);this.stream.write(`\x1B[${n};1H`),this.stream.write("\x1B[2K"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u"),this.started=!1,this.lastRepaint=0,this.lastPaintedRow=null,this.preResizePaintedRow=null}formatLine(t){let n=[],r=Math.max(4,(this.stream.columns??80)-2);if(t.cwd!==void 0&&t.branch!==void 0&&M0(EX(t.cwd))===".afk-worktrees"&&t.branch.replaceAll("/","-")===M0(t.cwd)&&X(t.branch)<=30){let l=se(t.branch,30),c=`${f.dim("\u2387")} ${f.dim(l)}`;t.pr!==void 0&&(c+=` ${f.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}else{if(t.cwd){let l=Math.max(8,Math.floor(r*.4)),c=vc(t.cwd,{maxWidth:l});c&&n.push({text:f.dim(c)})}if(t.branch){let l=se(t.branch,30),c=`${f.dim("\u2387")} ${f.dim(l)}`;t.pr!==void 0&&(c+=` ${f.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}}if(n.push({text:f.brand(t.model)}),t.permissionMode==="plan"?n.push({text:f.warning("\u25CF plan")}):t.permissionMode==="autonomous"?n.push({text:f.info("\u25D0 AFK")}):t.permissionMode==="bypassPermissions"?n.push({text:f.bypass("\u26A1 bypass")}):t.permissionMode==="default"&&n.push({text:f.success("\u25CB default")}),t.contextPct!==void 0){let l=P0({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push({text:l,droppablePriority:2})}t.cost!==void 0&&n.push({text:f.meta(`$${t.cost.toFixed(2)}`),droppablePriority:3}),t.tokens!==void 0&&n.push({text:f.meta(`${TX(t.tokens)} tok`),droppablePriority:4});let i=f.dim(" \xB7 "),s=n.map(l=>l.text).join(i);if(X(s)<=r)return s;let a=n.filter(l=>l.droppablePriority!==void 0);for(;a.length>0&&X(s)>r;){let l=Math.max(...a.map(c=>c.droppablePriority));n=n.filter(c=>c.droppablePriority===void 0||c.droppablePriority!==l),s=n.map(c=>c.text).join(i),a=n.filter(c=>c.droppablePriority!==void 0)}return se(s,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){let n=1+this.extraRows;if(t>n){this.stream.write(`\x1B[1;${t-n}r`);return}this.stream.write("\x1B[r")}};function TX(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}import{execFile as xX}from"node:child_process";import{promisify as RX}from"node:util";var AX=RX(xX);function CX(e){return(t,n,r)=>AX(t,n,{cwd:r,timeout:e,killSignal:"SIGTERM",maxBuffer:64*1024}).then(o=>({stdout:o.stdout,stderr:o.stderr}))}var jm=class{cwd;exec;prTtlMs;branchTtlMs;now;onUpdate;branch;pr;prBranch;prFetchedAt=0;branchFetchedAt=0;branchInFlight=null;prInFlight=null;disposed=!1;resetToken=0;constructor(t){this.cwd=t.cwd,this.exec=t.exec??CX(t.timeoutMs??1e4),this.prTtlMs=t.prTtlMs??6e4,this.branchTtlMs=t.branchTtlMs??0,this.now=t.now??Date.now,this.onUpdate=t.onUpdate}setOnUpdate(t){this.onUpdate=t}getBranch(){return this.branch}getPr(){return this.pr}async refresh(t={}){this.disposed||(this.branchInFlight||(this.branchInFlight=this.updateBranch().finally(()=>{this.branchInFlight=null})),await this.branchInFlight,t.blockOnPr&&this.prInFlight&&await this.prInFlight)}reset(){this.resetToken++,this.branch=void 0,this.pr=void 0,this.prBranch=void 0,this.prFetchedAt=0,this.branchFetchedAt=0,this.branchInFlight=null,this.prInFlight=null}dispose(){this.disposed=!0}async updateBranch(){if(this.branchTtlMs>0&&this.branchFetchedAt>0&&this.now()-this.branchFetchedAt<this.branchTtlMs)return;let t=this.resetToken;this.branchFetchedAt=this.now();let n=await this.gitBranch();if(this.disposed||this.resetToken!==t)return;let r=n!==this.branch;if(this.branch=n,n===void 0){let o=this.pr!==void 0;this.pr=void 0,this.prBranch=void 0,(r||o)&&this.notify();return}r&&(this.pr=void 0,this.notify()),this.maybeFetchPr(n)}notify(){try{this.onUpdate?.()}catch{}}async gitBranch(){try{let{stdout:t}=await this.exec("git",["symbolic-ref","--short","HEAD"],this.cwd),n=t.trim();return n.length>0?n:void 0}catch{return}}maybeFetchPr(t){if(this.prInFlight)return this.prInFlight;if(!(this.prBranch!==t||this.now()-this.prFetchedAt>=this.prTtlMs))return Promise.resolve();this.prFetchedAt=this.now();let r=(async()=>{let o=this.resetToken,i=await km((l,c)=>this.exec(l,c,this.cwd));if(this.disposed||this.resetToken!==o||this.branch!==t)return;let s=i!==null?Number.parseInt(i,10):NaN,a=this.pr;this.pr=Number.isFinite(s)&&s>0?s:void 0,this.prBranch=t,this.pr!==a&&this.notify()})().finally(()=>{this.prInFlight=null;let o=this.branch;!this.disposed&&o!==void 0&&o!==t&&this.maybeFetchPr(o)});return this.prInFlight=r,r}};var Vt=new Map,bi=new Map;function ye(e){if(Vt.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);Vt.set(e.name,e);for(let t of e.aliases??[]){if(bi.has(t)||Vt.has(t))throw new Error(`Slash alias collides: ${t}`);bi.set(t,e.name)}}function yo(e){if(Vt.has(e.name)){for(let[t,n]of bi.entries())n===e.name&&bi.delete(t);Vt.delete(e.name)}ye(e)}function O0(e){Vt.has(e.name)||ye(e)}function $0(){Vt.clear(),bi.clear()}function dt(){return[...Vt.values()].sort((e,t)=>e.name.localeCompare(t.name))}function da(){let e=[];for(let[t,n]of bi.entries()){let r=Vt.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function _X(e){if(Vt.has(e))return Vt.get(e);let t=bi.get(e);return t?Vt.get(t):void 0}function IX(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 PX(e,t=3){let n;for(let r of Vt.keys()){let o=IX(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function cS(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 D0(e,t,n){let r=cS(e);if(r===null)return{handled:!1};let o=_X(r.name);if(!o){let a=PX(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}}import $X from"ora";Ts();function F0(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("")}function Hm(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.name=t.name,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}function Wm(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=N0(L0(r.user),80),i=N0(OX(L0(r.assistant)),120);o.length>0&&t.fn(f.dim(` Last: ${o}`)),i.length>0&&t.fn(f.dim(` \u21B3 ${i}`)),t.fn(f.dim(" \u21AA /history for full review"))}function L0(e){return e.replace(MX,"").replace(/\s+/g," ").trim()}var MX=/\u001B\][\s\S]*?(?:\u0007|\u001B\\|\u009C)|\u001B[PX^_][\s\S]*?(?:\u0007|\u001B\\|\u009C)|\u001B[@-OQ-WY-Z\\`6-9=]|[\u001B\u009B][[\]()#;?]*(?:\d{1,4}(?:[;:]\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]/g;function OX(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function N0(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}var kc={stream:process.stdout,hideCursor:!1,discardStdin:!1};function dS(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)/Gt(e.model):0}function Zn(e,t,n){let r=dS(e,t),o=Gt(e.model),i,s=t?.getDetail();if(s!==void 0)i=s.used;else{let d=e.turnTokens[e.turnTokens.length-1];d&&(i=d.footprint??d.input+d.output+d.cache)}let a;if(e.turnTokens.length>=2){let d=e.turnTokens.map(m=>(m.footprint??m.input+m.output+m.cache)/o),u=F0(d,5);u.length>0&&(a=u)}let l=n?.getBranch(),c=n?.getPr();return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:r,contextLimit:o,contextUsedTokens:i,contextSparkline:a,permissionMode:e.permissionMode,...e.cwd!==void 0?{cwd:e.cwd}:{},...l!==void 0?{branch:l}:{},...c!==void 0?{pr:c}:{}}}yt();var DX={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"}},FX={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(),zM(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"}},LX={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=$X({text:f.meta("Summarizing earlier turns..."),...kc}).start();try{let n=e.session.current,r=n.hookRegistry;r&&await r.dispatch({event:"PreCompact",sessionId:n.sessionId,trigger:"manual"});let o=await n.compact();if(t.stop(),o.compacted){let i=o.tokensSavedEstimate?` (~${o.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${o.messagesBefore} \u2192 ${o.messagesAfter} messages${i}.`)}else{let i=o.reason??"unknown";i==="aborted"?e.out.info("Compaction cancelled."):i.startsWith("summarization-failed")?e.out.error(`Compaction failed: ${i}. History unchanged.`):i==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):i==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):e.out.info(`Nothing to compact (${i}).`)}}catch(n){if(t.stop(),n instanceof ut)throw n;if(n instanceof he)return e.out.info(`Compaction skipped: ${n.reason??"blocked by hook"}`),"continue";e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},NX={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=dt(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(f.bold(f.brand("Commands"))),e.out.line(fe());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${f.warning(o)}${i} ${f.dim(r.summary)}`)}return e.out.line(),e.out.line(f.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(f.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},B0=[DX,FX,LX,NX];function uS(e,t=30){return!e||e.length===0?f.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${f.dim(`+${e.length-t} more`)}`}function mn(e,t){return` ${f.label(e.padEnd(16))} ${t}`}function Km(e){let t=[];t.push(" "+fe("Session Debug")),e.sessionId&&t.push(mn("session",e.sessionId)),e.model&&t.push(mn("model",e.model)),e.permissionMode&&t.push(mn("permission",e.permissionMode)),e.cwd&&t.push(mn("cwd",e.cwd)),e.claudeCodeVersion&&t.push(mn("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(mn("api key",e.apiKeySource)),e.outputStyle&&t.push(mn("output style",e.outputStyle));let n=e.tools?.length??0;t.push(mn(`tools (${n})`,uS(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):f.dim("(none)");t.push(mn(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(mn(`skills (${i})`,uS(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):f.dim("(none)");t.push(mn(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(mn(`slash (${l})`,uS(e.slashCommands))),t.push(" "+fe()),t.join(`
|
|
1807
|
-
`)}et();nn();var pS=["local","small","medium","large","opus","opus_1m","sonnet","sonnet_1m","haiku","fable"],BX={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(f.bold("Session cost")),n.line(fe()),n.line(` total ${f.success(ct(t.totalCostUsd))}`),n.line(` turns ${f.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${f.meta(ct(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(ct).join(f.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function UX(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=r+o+i+s;e.line(),e.line(f.bold("Token usage")+f.dim(" (SDK breakdown)")),e.line(fe()),e.line(` total ${f.success(le(t.totalTokens))} of ${f.meta(le(t.maxTokens))} (${f.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${f.meta(le(t.autoCompactThreshold))}`),e.line(),e.line(f.dim(" Last turn (API):")),e.line(` input ${f.meta(le(r))}`),e.line(` output ${f.meta(le(o))}`),e.line(` cache read ${f.meta(le(i))}`),e.line(` cache creat ${f.meta(le(s))}`),e.line(` total ${f.meta(le(a))}`);let l=t.categories??[];if(l.length>0){let m=[...l].sort((p,g)=>g.tokens-p.tokens).slice(0,5);e.line(),e.line(f.dim(" Top categories:"));for(let p of m)e.line(` ${f.warning(p.name.padEnd(18))} ${f.meta(le(p.tokens))}`)}let c=t.systemTools??[],d=t.mcpTools??[];if(c.length>0||d.length>0){e.line();let m=c.reduce((g,h)=>g+h.tokens,0),p=d.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(f.dim(` system tools ${c.length} tools, ${le(m)} tokens`)),d.length>0&&e.line(f.dim(` MCP tools ${d.length} tools, ${le(p)} tokens`))}let u=t.agents??[];if(u.length>0){let m=u.reduce((p,g)=>p+g.tokens,0);e.line(f.dim(` agents ${u.length} loaded, ${le(m)} tokens`))}if(t.skills){let m=t.skills;e.line(f.dim(` skills ${m.includedSkills}/${m.totalSkills} included, ${le(m.tokens)} tokens`))}if(t.slashCommands){let m=t.slashCommands;e.line(f.dim(` slash cmds ${m.includedCommands}/${m.totalCommands} included, ${le(m.tokens)} tokens`))}e.line()}function jX(e,t){let n=t.turnTokens.reduce((d,u)=>d+u.input,0),r=t.turnTokens.reduce((d,u)=>d+u.output,0),o=t.turnTokens.reduce((d,u)=>d+u.cache,0),i=n+r,s=Gt(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(f.bold("Token usage")+f.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(fe()),e.line(` input ${f.meta(le(n))}`),e.line(` output ${f.meta(le(r))}`),e.line(` cache read ${f.meta(le(o))}`),e.line(` total ${f.success(le(i))}`),e.line(` context ${f.meta(`${c}% of ${le(s)} (${t.model})`)}`),e.line()}var HX={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();UX(e.out,t)}catch{jX(e.out,e.stats)}return"continue"}},WX={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(f.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(fe()),t.turns.forEach((r,o)=>{let i=f.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} ${f.user("\u25B6")} ${s}`),n.line(` ${f.brand("\u25C6")} ${f.dim(a)}`)}),n.line(),"continue")}},KX={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. 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 e.out.info(`Current model: ${f.brand(e.stats.model)}`),e.out.line(f.dim(` Aliases: ${pS.join(", ")} (or any org/model HF id)`)),"continue";let r=pS.includes(n),o=ts(n)!==void 0,i=oe(n)==="openai-compatible";if(!r&&!o&&!i)return e.out.warn(`Unknown model: ${n}. Aliases: ${pS.join(", ")} (or org/model for local/OpenAI-compatible)`),"continue";let s=ns(n);if(s)return e.out.warn(s),"continue";try{await e.session.current.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${f.brand(n)}`)}catch(a){e.out.error(`Failed to switch model: ${a instanceof Error?a.message:String(a)}`)}return"continue"}},GX={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(f.bold(`Tools (${n.length})`)),e.out.line(fe());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"}},qX={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(()=>(Cm(),d0)),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(f.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(fe());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${f.warning("\u25CF")} ${i} ${f.dim(`(${l}m ago)`)}`),e.out.line(` ${f.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(f.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(f.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(f.bold(`MCP servers (${o.length})`)),e.out.line(fe());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"?f.success("\u25CF"):f.warning("\u25CF");e.out.line(` ${c} ${a}${l?f.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(f.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"}},zX={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(f.bold("Context-window limits")),e.out.line(fe());for(let[t,n]of Object.entries(Es)){let r=t===e.stats.model?f.brand(" \u2190 active"):"";e.out.line(` ${f.warning(t.padEnd(12))} ${f.meta(le(n))}${r}`)}return e.out.line(),"continue"}},JX={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(Km(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},U0=[BX,HX,WX,KX,GX,qX,zX,JX];G();zh();var mS=!1;function VX(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 Ec(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=mS?"":f.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");mS||(mS=!0),e.out.success(f.warning("\u25CF plan mode ON")+f.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(f.success("\u25CB plan mode OFF")+f.dim(` \u2014 ${VX(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}async function YX(e){if(await Ec(e,!1),e.stats.permissionMode==="plan")return"continue";let t=yd(e.stats.cwd??process.cwd());return e.out.info(f.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:Xd(t)}}var j0={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 Ec(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await Ec(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await Ec(e,!1),"continue"):YX(e)}};J();Yd();zs();Wr();var H0=20,W0=500,XX={done:"\u2705 Done",blocked:"\u26D4 Blocked",asking:"\u2753 Asking",interrupted:"\u23F8\uFE0F Interrupted"},ZX={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"]]},QX=new Set(["write_file","edit_file","bash"]);function K0(e){return e.some(t=>QX.has(t.toolName)&&t.isError!==!0)}function e6(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":XX[e.kind]}`,i=[];for(let[a,l]of ZX[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>W0?`${a.slice(0,W0)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no file write/edit or successful command recorded this turn \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
|
|
1806
|
+
`),c=u.length}return new Promise(u=>{process.stdin.setRawMode(!0),gi(process.stdin);let m=(g,h)=>{if(h)if(h.name==="up"||h.sequence==="\x1B[A")r>0&&(r--,r<o&&(o=r),d());else if(h.name==="down"||h.sequence==="\x1B[B"){if(r<e.length-1){r++;let{end:b}=s();r>=b&&o++,d()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),d()):h.name==="return"||h.name==="enter"?(p(),u([...i].sort((b,y)=>b-y))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(p(),u(":cancel"))};function p(){process.stdin.removeListener("keypress",m);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",m)})}function Om(e=process.env){return e.AFK_DEMO_CLEAN==="1"||typeof e.SCRIPT=="string"&&e.SCRIPT.length>0||e.ASCIINEMA_REC==="1"}function f6(e=process.env){return e.AFK_BELL==="1"}function $m(e=process.env){return e.AFK_REDUCED_MOTION==="1"}function _0(e=process.env){return e.AFK_CARET_BLINK!=="0"}function Dm(e,t=process.env){f6(t)&&e.isTTY&&e.write("\x07")}function iS(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 sS(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 aS=64,Lm=256,Fm=20,lS=new Set(["__proto__","constructor","prototype"]),ca={action:"decline"},ie={action:"cancel"},g6={action:"accept"};function h6(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(!lS.has(l)){if(r+=1,a>=aS){o=!0;continue}n[l]=c,a+=1}}let i=e.required,s=new Set(Array.isArray(i)?i.slice(0,aS*2).filter(a=>typeof a=="string").filter(a=>!lS.has(a)):[]);return{properties:n,required:s,fieldsTruncated:o,originalFieldCount:r}}function y6(e,t){e.line(),e.line(f.warning("\u26A0 MCP form elicitation")),e.line(f.dim(" server: ")+f.bold(me(t.serverName,64))),e.line(f.dim(" message: ")+me(t.message,256)),t.elicitationId&&e.line(f.dim(" id: ")+me(t.elicitationId,64)),e.line(f.dim(" Type :decline or :cancel at any prompt to exit.")),e.line()}var I0="\u2014 skip (optional) \u2014";async function b6(e,t,n,r,o,i,s){let a,l;if(e.enum!==void 0){let p=e.enum.slice(0,Lm);a=p.map(g=>me(String(g),64)),l=g=>{let h=a.indexOf(g);return h>=0?p[h]:g}}else a=["Yes","No"],l=p=>p==="Yes";let c=t?a:[...a,I0],d=[f.bold(" ? "+n),""],u;try{u=await o({header:d,options:c,multi:!1,signal:s})}catch{return{tag:"cancel"}}if(s.aborted)return{tag:"cancel"};if(u===null)return{tag:"cancel"};let m=u[0];return m===void 0?{tag:"cancel"}:!t&&m===I0?{tag:"value",value:e.default}:(i.line(f.dim(" \u2713 ")+f.brand(`${r}: ${me(m,128)}`)),{tag:"value",value:l(m)})}async function w6(e,t,n,r,o,i,s){if(i.aborted)return{tag:"cancel"};let a=me(t.description??t.title??e),l=me(t.type??"string",32),c=me(e,64);if(s&&(t.enum!==void 0||l==="boolean"))return b6(t,n,a,c,s,o,i);let d;if(t.enum!==void 0){let m=t.enum.slice(0,Fm).map(g=>me(String(g),32)).join("|"),p=t.enum.length>Fm?"|\u2026":"";d=` (enum: ${m}${p})`}else l==="boolean"?d=" (boolean: y/n)":l==="number"||l==="integer"?d=` (${l})`:l==="string"?d=" (string)":(d=` (${l} \u2014 treated as string)`,o.line(f.warning(` \u26A0 Unknown field type '${l}' for '${c}' \u2014 collecting as string.`)));let u=n?"":f.dim(" [optional, enter to skip]");for(o.line(f.dim(` [${c}]`)+f.dim(` ${a}`)+f.dim(d)+u),t.enum!==void 0&&t.enum.length>Lm&&o.line(f.warning(` \u26A0 Field '${c}' has ${t.enum.length} enum values; only the first ${Lm} are valid for input.`));;){let m;try{m=await r(f.dim(" > "))}catch{return{tag:"cancel"}}if(i.aborted)return{tag:"cancel"};let p=m.trim();if(p===":cancel")return{tag:"cancel"};if(p===":decline")return{tag:"decline"};if(p===""){if(n){o.line(f.warning(" (required \u2014 cannot be skipped)"));continue}return{tag:"value",value:t.default}}let g;if(l==="boolean"){let h=p.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(f.warning(" Invalid boolean \u2014 enter y/yes/true/1 or n/no/false/0."));continue}}else if(l==="number"){let h=Number(p);if(!isFinite(h)){o.line(f.warning(" Invalid number \u2014 enter a numeric value."));continue}g=h}else if(l==="integer"){let h=parseInt(p,10);if(!isFinite(h)||String(h)!==p.replace(/\.0+$/,"")){o.line(f.warning(" Invalid integer \u2014 enter a whole number."));continue}g=h}else g=p;if(t.enum!==void 0){let h=t.enum.slice(0,Lm),b=!1;for(let y of h)if(String(y)===String(g)){b=!0;break}if(!b){let y=me(String(g),64),w=h.slice(0,Fm).map(T=>me(String(T),32)).join(", "),v=h.length>Fm?", \u2026":"";o.line(f.warning(` '${y}' is not a valid choice. Valid: ${w}${v}`));continue}}return{tag:"value",value:g}}}function S6(e,t){e.line(),e.line(f.warning("\u26A0 MCP elicitation")),e.line(f.dim(" server: ")+f.bold(me(t.serverName,64))),e.line(f.dim(" message: ")+me(t.message,256)),t.url&&e.line(f.dim(" url: ")+f.brand(me(t.url,512))),t.elicitationId&&e.line(f.dim(" id: ")+me(t.elicitationId,64)),e.line()}var yi={action:"skip"};function Nm(e){let t=[];return t.push(f.warning(" \u{1F4AC} Agent question")),t.push(f.bold(" ? "+me(e.message,512))),e.context&&t.push(f.dim(" "+me(e.context,512))),t.push(""),t}async function v6(e,t,n,r){let o=Nm(t),i=t.allowSkip===!0;if(e==="number"){let d=t.min,u=t.max,p=`enter to submit \xB7 esc to cancel${d!==void 0&&u!==void 0?` [${d}\u2013${u}]`:d!==void 0?` [\u2265${d}]`:u!==void 0?` [\u2264${u}]`:""}`,h=await n({header:o,help:p,validate:y=>{let w=iS(y.trim(),{allowSkip:i,min:d,max:u,emptyError:"Please enter a number (or esc to cancel)."});return w.ok?null:w.error},signal:r});if(h===null)return null;let b=h.trim();return b===""&&i?{tag:"skip"}:{tag:"number",value:Number(b)}}let s=t.minLength,a=t.maxLength,c=await n({header:o,validate:d=>{let u=sS(d,{allowSkip:i,minLength:s,maxLength:a,emptyError:"Please enter a response (or esc to cancel)."});return u.ok?null:u.error},signal:r});return c===null?null:c===""&&i?{tag:"skip"}:{tag:"text",value:c}}async function k6(e,t,n){if(n.aborted)return ca;let{readLine:r,writer:o,pendingCount:i,pickFromList:s,readTextOverlay:a}=t,l=e.type??"text",c=i();if(c>1&&o.line(f.dim(` [${c} questions queued]`)),(l==="choice"||l==="multi_choice")&&s&&(e.choices?.length??0)>0){let m=(e.choices??[]).map(h=>me(h,128));e.allowCustom&&m.push(hi);let p;try{p=await s({header:Nm(e),options:m,multi:l==="multi_choice",signal:n})}catch{return ie}if(n.aborted||p===null)return ie;if(e.allowCustom&&p.includes(hi)){if(!a)return ie;let h=await a({header:Nm(e),help:"Type your custom answer (Esc to cancel)",validate:b=>b.trim()===""?"Please enter a non-empty answer":null,signal:n});return h===null?ie:(o.line(f.dim(" \u270E ")+f.brand(me(h,256))),{action:"accept",content:{value:null,custom_value:h}})}if(p.length===0)return e.allowSkip?yi:ie;let g=p.length===1?me(p[0]??"",128):p.map(h=>me(h,128)).join(", ");return o.line(f.dim(" \u2713 ")+f.brand(g)),l==="choice"?{action:"accept",content:{value:p[0]}}:{action:"accept",content:{value:[...p]}}}if(l==="confirm"&&s){let p=e.questionDefault!==!1?["Yes","No"]:["No","Yes"],g;try{g=await s({header:Nm(e),options:p,multi:!1,signal:n})}catch{return ie}if(n.aborted||g===null)return ie;let h=g[0];if(h===void 0)return ie;let b=h==="Yes";return o.line(f.dim(" \u2713 ")+(b?f.success("Yes"):f.error("No"))),{action:"accept",content:{value:b}}}if((l==="text"||l==="number")&&a){let m=await v6(l,e,a,n);if(m===null)return ie;if(m.tag==="skip")return yi;let p=m.tag==="text"?me(m.value,256):String(m.value);return o.line(f.dim(" \u2713 ")+f.brand(p)),{action:"accept",content:{value:(m.tag==="text",m.value)}}}if(o.line(),o.line(f.warning("\u{1F4AC} Agent question")),e.context&&o.line(f.dim(" context: ")+me(e.context,512)),o.line(f.bold(" "+me(e.message,512))),o.line(f.dim(" Type :cancel to skip this question.")),o.line(),l==="confirm"){o.line("\x07");let m=e.questionDefault===!0?"Y/n":"y/N";for(;;){if(n.aborted)return ie;let p;try{p=(await r(f.dim(` Continue? [${m}] `))).trim().toLowerCase()}catch{return ie}if(n.aborted||p===":cancel")return ie;if(p==="")return{action:"accept",content:{value:e.questionDefault===!0}};if(p==="y"||p==="yes")return{action:"accept",content:{value:!0}};if(p==="n"||p==="no")return{action:"accept",content:{value:!1}};o.line(f.warning(" Please enter y or n."))}}if(l==="choice"){o.line("\x07");let m=e.choices??[],p=e.allowCustom?[...m,hi]:m,g=await A0(p,n);if(g!==null){if(g===":cancel")return ie;if(e.allowCustom&&g===m.length){let b;try{b=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return b===":cancel"||n.aborted?ie:{action:"accept",content:{value:null,custom_value:b}}}let h=m[g];return h!==void 0?(o.line(f.dim(` Selected: ${me(h,128)}`)),{action:"accept",content:{value:h}}):ie}for(m.forEach((h,b)=>{o.line(` ${b+1}. ${me(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${hi}`);;){if(n.aborted)return ie;let h;try{h=(await r(f.dim(" Enter number: "))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;if(e.allowCustom&&h===String(m.length+1)){let y;try{y=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return y===":cancel"?ie:{action:"accept",content:{value:null,custom_value:y}}}if(h===""&&e.allowSkip)return yi;let b=parseInt(h,10);if(!isFinite(b)||String(b)!==h||b<1||b>m.length){o.line(f.warning(` Please enter a number between 1 and ${m.length+(e.allowCustom?1:0)}.`));continue}return{action:"accept",content:{value:m[b-1]}}}}if(l==="multi_choice"){let m=e.choices??[],p=e.allowCustom?[...m,hi]:m,g=await C0(p,n);if(g!==null){if(g===":cancel")return ie;if(e.allowCustom&&g.includes(m.length)){let h;try{h=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return h===":cancel"||n.aborted?ie:{action:"accept",content:{value:null,custom_value:h}}}if(g.length===0&&e.allowSkip)return yi;if(g.length>0){let h=g.map(b=>m[b]);return o.line(f.dim(` Selected: ${h.map(b=>me(b,64)).join(", ")}`)),{action:"accept",content:{value:h}}}}for(m.forEach((h,b)=>{o.line(` ${b+1}. ${me(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${hi}`);;){if(n.aborted)return ie;let h;try{h=(await r(f.dim(" Enter numbers (comma-separated): "))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;if(e.allowCustom&&h===String(m.length+1)){let v;try{v=(await r(f.dim(" Type your answer: "))).trim()}catch{return ie}return v===":cancel"?ie:{action:"accept",content:{value:null,custom_value:v}}}if(h===""&&e.allowSkip)return yi;if(h===""){o.line(f.warning(" Please enter at least one selection."));continue}let b=h.split(",").map(v=>v.trim()),y=[],w=!0;for(let v of b){let T=parseInt(v,10);if(!isFinite(T)||String(T)!==v||T<1||T>m.length){o.line(f.warning(` Invalid selection "${me(v,32)}". Enter numbers between 1 and ${m.length}.`)),w=!1;break}y.push(m[T-1])}if(w)return{action:"accept",content:{value:y}}}}if(l==="number"){let m=e.min,p=e.max,g=m!==void 0&&p!==void 0?` [${m}\u2013${p}]`:m!==void 0?` [\u2265${m}]`:p!==void 0?` [\u2264${p}]`:"";for(;;){if(n.aborted)return ie;let h;try{h=(await r(f.dim(` Enter a number${g}: `))).trim()}catch{return ie}if(n.aborted||h===":cancel")return ie;let b=iS(h,{allowSkip:e.allowSkip===!0,min:m,max:p,emptyError:"Please enter a number (or :cancel to skip)."});if(!b.ok){o.line(f.warning(" "+b.error));continue}return b.skip?yi:{action:"accept",content:{value:b.value}}}}let d=e.minLength,u=e.maxLength;for(;;){if(n.aborted)return ie;let m;try{m=(await r(f.dim(" > "))).trim()}catch{return ie}if(n.aborted||m===":cancel")return ie;let p=sS(m,{allowSkip:e.allowSkip===!0,minLength:d,maxLength:u,emptyError:"Please enter a response (or type :cancel to skip)."});if(!p.ok){o.line(f.warning(" "+p.error));continue}return p.skip?yi:{action:"accept",content:{value:m}}}}function Bm(e){return async(t,{signal:n})=>{if(n.aborted)return ca;Dm(process.stdout),e.suspendInput?.();try{if(t.origin==="agent")return await k6(t,e,n);if(t.mode==="form"){let o=t.requestedSchema,{properties:i,required:s,fieldsTruncated:a,originalFieldCount:l}=typeof o=="object"&&o!==null?h6(o):{properties:{},required:new Set,fieldsTruncated:!1,originalFieldCount:0};y6(e.writer,t),a&&e.writer.line(f.warning(` \u26A0 Schema has ${l} fields; only the first ${aS} will be prompted (server may be malformed or compromised).`));let c=Object.create(null);if(Object.keys(i).length===0)return e.writer.line(f.warning(" \u26A0 Form schema has no usable fields \u2014 declining.")),ca;for(let d of s)if(!(d in i))return e.writer.line(f.warning(` \u26A0 Required field '${me(d,64)}' has no schema entry \u2014 declining.`)),ca;for(let[d,u]of Object.entries(i)){if(n.aborted)return ie;let m=await w6(d,u,s.has(d),e.readLine,e.writer,n,e.pickFromList);if(m.tag==="cancel")return ie;if(m.tag==="decline")return ca;m.value!==void 0&&!lS.has(d)&&(c[d]=m.value)}return{action:"accept",content:{...c}}}S6(e.writer,t);let r=(await e.readLine(f.dim("Continue? [y/N] "))).trim().toLowerCase();return r===""?ie:r==="y"||r==="yes"?g6:ca}finally{e.resumeInput?.()}}}Os();nn();Tn();Jt();jt();import{basename as M0,dirname as E6}from"node:path";function P0(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?f.error:t>.5?f.warning:f.meta,r=20,o=Math.round(t*r),i=r-o,s="["+"\u2588".repeat(o)+"\u2591".repeat(i)+"]",a=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=le(e.used)+"/"+le(e.limit));let c=l?`${s} ${a} ${l}`:`${s} ${a}`,d=`${s} ${a}`,u=`ctx ${a}`,m=e.sparkline?f.meta(e.sparkline)+" ":"",p=e.sparkline?X(e.sparkline)+1:0,g=Math.max(0,e.width-p);if(X(c)<=g&&g>90)return m+n(c);if(X(d)<=g&&g>32)return m+n(d);if(X(u)<=g)return m+n(u);if(e.width>0){let h=m+n(u);return se(h,e.width)}return n(a)}var Um=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;resizeImmediateUnsub=null;lastPaintedRow=null;preResizePaintedRow=null;extraRows=0;afterScrollRestore=null;constructor(t={}){this.stream=t.stream??process.stdout,this.force=t.force??!1,this.throttleMs=t.throttleMs??100}get enabled(){return this.force||!!this.stream.isTTY}start(){if(this.started||!this.enabled)return;this.started=!0,this.lastRepaint=0;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.resizeUnsub===null&&(this.resizeUnsub=We.subscribe(()=>{this.onResize()}),this.resizeImmediateUnsub=We.subscribeImmediate(()=>this.resetGeometry()))}resetGeometry(){this.preResizePaintedRow=this.lastPaintedRow,this.lastPaintedRow=null,this.lastRepaint=0}onResize(){if(!this.started||!this.enabled)return;let t=this.currentRows(),n=this.preResizePaintedRow??this.lastPaintedRow;this.preResizePaintedRow=null,this.stream.write("\x1B[s"),n!==null&&n!==this.paintRow(t)&&(this.stream.write(`\x1B[${n};1H`),this.stream.write("\x1B[2K")),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}repaint(t){if(!this.enabled||!this.started){this.lastFields=t;return}let n=Date.now();if(n-this.lastRepaint<this.throttleMs){this.lastFields=t;return}this.lastRepaint=n,this.lastFields=t;let r=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.paintRow(r)};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatLine(t)),this.stream.write("\x1B[u"),this.lastPaintedRow=this.paintRow(r)}flush(){this.lastRepaint=0,this.lastFields&&this.repaint(this.lastFields)}setExtraRows(t){if(this.extraRows=t,this.started&&this.enabled){let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}getExtraRows(){return this.extraRows}setAfterScrollRestore(t){this.afterScrollRestore=t}rearm(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}withFullScrollRegion(t){if(!this.started||!this.enabled)return t();this.stream.write("\x1B[s"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u");try{return t()}finally{let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush(),this.afterScrollRestore?.()}}stop(){if(this.resizeUnsub!==null&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub!==null&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),!this.started||!this.enabled){this.started=!1;return}let t=this.currentRows();this.stream.write("\x1B[s");let n=this.preResizePaintedRow??this.lastPaintedRow??this.paintRow(t);this.stream.write(`\x1B[${n};1H`),this.stream.write("\x1B[2K"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u"),this.started=!1,this.lastRepaint=0,this.lastPaintedRow=null,this.preResizePaintedRow=null}formatLine(t){let n=[],r=Math.max(4,(this.stream.columns??80)-2);if(t.cwd!==void 0&&t.branch!==void 0&&M0(E6(t.cwd))===".afk-worktrees"&&t.branch.replaceAll("/","-")===M0(t.cwd)&&X(t.branch)<=30){let l=se(t.branch,30),c=`${f.dim("\u2387")} ${f.dim(l)}`;t.pr!==void 0&&(c+=` ${f.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}else{if(t.cwd){let l=Math.max(8,Math.floor(r*.4)),c=vc(t.cwd,{maxWidth:l});c&&n.push({text:f.dim(c)})}if(t.branch){let l=se(t.branch,30),c=`${f.dim("\u2387")} ${f.dim(l)}`;t.pr!==void 0&&(c+=` ${f.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}}if(n.push({text:f.brand(t.model)}),t.permissionMode==="plan"?n.push({text:f.warning("\u25CF plan")}):t.permissionMode==="autonomous"?n.push({text:f.info("\u25D0 AFK")}):t.permissionMode==="bypassPermissions"?n.push({text:f.bypass("\u26A1 bypass")}):t.permissionMode==="default"&&n.push({text:f.success("\u25CB default")}),t.contextPct!==void 0){let l=P0({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push({text:l,droppablePriority:2})}t.cost!==void 0&&n.push({text:f.meta(`$${t.cost.toFixed(2)}`),droppablePriority:3}),t.tokens!==void 0&&n.push({text:f.meta(`${T6(t.tokens)} tok`),droppablePriority:4});let i=f.dim(" \xB7 "),s=n.map(l=>l.text).join(i);if(X(s)<=r)return s;let a=n.filter(l=>l.droppablePriority!==void 0);for(;a.length>0&&X(s)>r;){let l=Math.max(...a.map(c=>c.droppablePriority));n=n.filter(c=>c.droppablePriority===void 0||c.droppablePriority!==l),s=n.map(c=>c.text).join(i),a=n.filter(c=>c.droppablePriority!==void 0)}return se(s,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){let n=1+this.extraRows;if(t>n){this.stream.write(`\x1B[1;${t-n}r`);return}this.stream.write("\x1B[r")}};function T6(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}import{execFile as x6}from"node:child_process";import{promisify as R6}from"node:util";var A6=R6(x6);function C6(e){return(t,n,r)=>A6(t,n,{cwd:r,timeout:e,killSignal:"SIGTERM",maxBuffer:64*1024}).then(o=>({stdout:o.stdout,stderr:o.stderr}))}var jm=class{cwd;exec;prTtlMs;branchTtlMs;now;onUpdate;branch;pr;prBranch;prFetchedAt=0;branchFetchedAt=0;branchInFlight=null;prInFlight=null;disposed=!1;resetToken=0;constructor(t){this.cwd=t.cwd,this.exec=t.exec??C6(t.timeoutMs??1e4),this.prTtlMs=t.prTtlMs??6e4,this.branchTtlMs=t.branchTtlMs??0,this.now=t.now??Date.now,this.onUpdate=t.onUpdate}setOnUpdate(t){this.onUpdate=t}getBranch(){return this.branch}getPr(){return this.pr}async refresh(t={}){this.disposed||(this.branchInFlight||(this.branchInFlight=this.updateBranch().finally(()=>{this.branchInFlight=null})),await this.branchInFlight,t.blockOnPr&&this.prInFlight&&await this.prInFlight)}reset(){this.resetToken++,this.branch=void 0,this.pr=void 0,this.prBranch=void 0,this.prFetchedAt=0,this.branchFetchedAt=0,this.branchInFlight=null,this.prInFlight=null}dispose(){this.disposed=!0}async updateBranch(){if(this.branchTtlMs>0&&this.branchFetchedAt>0&&this.now()-this.branchFetchedAt<this.branchTtlMs)return;let t=this.resetToken;this.branchFetchedAt=this.now();let n=await this.gitBranch();if(this.disposed||this.resetToken!==t)return;let r=n!==this.branch;if(this.branch=n,n===void 0){let o=this.pr!==void 0;this.pr=void 0,this.prBranch=void 0,(r||o)&&this.notify();return}r&&(this.pr=void 0,this.notify()),this.maybeFetchPr(n)}notify(){try{this.onUpdate?.()}catch{}}async gitBranch(){try{let{stdout:t}=await this.exec("git",["symbolic-ref","--short","HEAD"],this.cwd),n=t.trim();return n.length>0?n:void 0}catch{return}}maybeFetchPr(t){if(this.prInFlight)return this.prInFlight;if(!(this.prBranch!==t||this.now()-this.prFetchedAt>=this.prTtlMs))return Promise.resolve();this.prFetchedAt=this.now();let r=(async()=>{let o=this.resetToken,i=await km((l,c)=>this.exec(l,c,this.cwd));if(this.disposed||this.resetToken!==o||this.branch!==t)return;let s=i!==null?Number.parseInt(i,10):NaN,a=this.pr;this.pr=Number.isFinite(s)&&s>0?s:void 0,this.prBranch=t,this.pr!==a&&this.notify()})().finally(()=>{this.prInFlight=null;let o=this.branch;!this.disposed&&o!==void 0&&o!==t&&this.maybeFetchPr(o)});return this.prInFlight=r,r}};var Vt=new Map,bi=new Map;function ye(e){if(Vt.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);Vt.set(e.name,e);for(let t of e.aliases??[]){if(bi.has(t)||Vt.has(t))throw new Error(`Slash alias collides: ${t}`);bi.set(t,e.name)}}function yo(e){if(Vt.has(e.name)){for(let[t,n]of bi.entries())n===e.name&&bi.delete(t);Vt.delete(e.name)}ye(e)}function O0(e){Vt.has(e.name)||ye(e)}function $0(){Vt.clear(),bi.clear()}function dt(){return[...Vt.values()].sort((e,t)=>e.name.localeCompare(t.name))}function da(){let e=[];for(let[t,n]of bi.entries()){let r=Vt.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function _6(e){if(Vt.has(e))return Vt.get(e);let t=bi.get(e);return t?Vt.get(t):void 0}function I6(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 P6(e,t=3){let n;for(let r of Vt.keys()){let o=I6(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function cS(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 D0(e,t,n){let r=cS(e);if(r===null)return{handled:!1};let o=_6(r.name);if(!o){let a=P6(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}}import $6 from"ora";Ts();function F0(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("")}function Hm(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.name=t.name,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}function Wm(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=N0(L0(r.user),80),i=N0(O6(L0(r.assistant)),120);o.length>0&&t.fn(f.dim(` Last: ${o}`)),i.length>0&&t.fn(f.dim(` \u21B3 ${i}`)),t.fn(f.dim(" \u21AA /history for full review"))}function L0(e){return e.replace(M6,"").replace(/\s+/g," ").trim()}var M6=/\u001B\][\s\S]*?(?:\u0007|\u001B\\|\u009C)|\u001B[PX^_][\s\S]*?(?:\u0007|\u001B\\|\u009C)|\u001B[@-OQ-WY-Z\\`6-9=]|[\u001B\u009B][[\]()#;?]*(?:\d{1,4}(?:[;:]\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]/g;function O6(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function N0(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}var kc={stream:process.stdout,hideCursor:!1,discardStdin:!1};function dS(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)/Gt(e.model):0}function Zn(e,t,n){let r=dS(e,t),o=Gt(e.model),i,s=t?.getDetail();if(s!==void 0)i=s.used;else{let d=e.turnTokens[e.turnTokens.length-1];d&&(i=d.footprint??d.input+d.output+d.cache)}let a;if(e.turnTokens.length>=2){let d=e.turnTokens.map(m=>(m.footprint??m.input+m.output+m.cache)/o),u=F0(d,5);u.length>0&&(a=u)}let l=n?.getBranch(),c=n?.getPr();return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:r,contextLimit:o,contextUsedTokens:i,contextSparkline:a,permissionMode:e.permissionMode,...e.cwd!==void 0?{cwd:e.cwd}:{},...l!==void 0?{branch:l}:{},...c!==void 0?{pr:c}:{}}}yt();var D6={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"}},F6={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(),zM(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"}},L6={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=$6({text:f.meta("Summarizing earlier turns..."),...kc}).start();try{let n=e.session.current,r=n.hookRegistry;r&&await r.dispatch({event:"PreCompact",sessionId:n.sessionId,trigger:"manual"});let o=await n.compact();if(t.stop(),o.compacted){let i=o.tokensSavedEstimate?` (~${o.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${o.messagesBefore} \u2192 ${o.messagesAfter} messages${i}.`)}else{let i=o.reason??"unknown";i==="aborted"?e.out.info("Compaction cancelled."):i.startsWith("summarization-failed")?e.out.error(`Compaction failed: ${i}. History unchanged.`):i==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):i==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):e.out.info(`Nothing to compact (${i}).`)}}catch(n){if(t.stop(),n instanceof ut)throw n;if(n instanceof he)return e.out.info(`Compaction skipped: ${n.reason??"blocked by hook"}`),"continue";e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},N6={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=dt(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(f.bold(f.brand("Commands"))),e.out.line(fe());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${f.warning(o)}${i} ${f.dim(r.summary)}`)}return e.out.line(),e.out.line(f.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(f.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},B0=[D6,F6,L6,N6];function uS(e,t=30){return!e||e.length===0?f.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${f.dim(`+${e.length-t} more`)}`}function mn(e,t){return` ${f.label(e.padEnd(16))} ${t}`}function Km(e){let t=[];t.push(" "+fe("Session Debug")),e.sessionId&&t.push(mn("session",e.sessionId)),e.model&&t.push(mn("model",e.model)),e.permissionMode&&t.push(mn("permission",e.permissionMode)),e.cwd&&t.push(mn("cwd",e.cwd)),e.claudeCodeVersion&&t.push(mn("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(mn("api key",e.apiKeySource)),e.outputStyle&&t.push(mn("output style",e.outputStyle));let n=e.tools?.length??0;t.push(mn(`tools (${n})`,uS(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):f.dim("(none)");t.push(mn(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(mn(`skills (${i})`,uS(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):f.dim("(none)");t.push(mn(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(mn(`slash (${l})`,uS(e.slashCommands))),t.push(" "+fe()),t.join(`
|
|
1807
|
+
`)}et();nn();var pS=["local","small","medium","large","opus","opus_1m","sonnet","sonnet_1m","haiku","fable"],B6={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(f.bold("Session cost")),n.line(fe()),n.line(` total ${f.success(ct(t.totalCostUsd))}`),n.line(` turns ${f.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${f.meta(ct(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(ct).join(f.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function U6(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=r+o+i+s;e.line(),e.line(f.bold("Token usage")+f.dim(" (SDK breakdown)")),e.line(fe()),e.line(` total ${f.success(le(t.totalTokens))} of ${f.meta(le(t.maxTokens))} (${f.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${f.meta(le(t.autoCompactThreshold))}`),e.line(),e.line(f.dim(" Last turn (API):")),e.line(` input ${f.meta(le(r))}`),e.line(` output ${f.meta(le(o))}`),e.line(` cache read ${f.meta(le(i))}`),e.line(` cache creat ${f.meta(le(s))}`),e.line(` total ${f.meta(le(a))}`);let l=t.categories??[];if(l.length>0){let m=[...l].sort((p,g)=>g.tokens-p.tokens).slice(0,5);e.line(),e.line(f.dim(" Top categories:"));for(let p of m)e.line(` ${f.warning(p.name.padEnd(18))} ${f.meta(le(p.tokens))}`)}let c=t.systemTools??[],d=t.mcpTools??[];if(c.length>0||d.length>0){e.line();let m=c.reduce((g,h)=>g+h.tokens,0),p=d.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(f.dim(` system tools ${c.length} tools, ${le(m)} tokens`)),d.length>0&&e.line(f.dim(` MCP tools ${d.length} tools, ${le(p)} tokens`))}let u=t.agents??[];if(u.length>0){let m=u.reduce((p,g)=>p+g.tokens,0);e.line(f.dim(` agents ${u.length} loaded, ${le(m)} tokens`))}if(t.skills){let m=t.skills;e.line(f.dim(` skills ${m.includedSkills}/${m.totalSkills} included, ${le(m.tokens)} tokens`))}if(t.slashCommands){let m=t.slashCommands;e.line(f.dim(` slash cmds ${m.includedCommands}/${m.totalCommands} included, ${le(m.tokens)} tokens`))}e.line()}function j6(e,t){let n=t.turnTokens.reduce((d,u)=>d+u.input,0),r=t.turnTokens.reduce((d,u)=>d+u.output,0),o=t.turnTokens.reduce((d,u)=>d+u.cache,0),i=n+r,s=Gt(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(f.bold("Token usage")+f.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(fe()),e.line(` input ${f.meta(le(n))}`),e.line(` output ${f.meta(le(r))}`),e.line(` cache read ${f.meta(le(o))}`),e.line(` total ${f.success(le(i))}`),e.line(` context ${f.meta(`${c}% of ${le(s)} (${t.model})`)}`),e.line()}var H6={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();U6(e.out,t)}catch{j6(e.out,e.stats)}return"continue"}},W6={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(f.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(fe()),t.turns.forEach((r,o)=>{let i=f.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} ${f.user("\u25B6")} ${s}`),n.line(` ${f.brand("\u25C6")} ${f.dim(a)}`)}),n.line(),"continue")}},K6={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. 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 e.out.info(`Current model: ${f.brand(e.stats.model)}`),e.out.line(f.dim(` Aliases: ${pS.join(", ")} (or any org/model HF id)`)),"continue";let r=pS.includes(n),o=ts(n)!==void 0,i=oe(n)==="openai-compatible";if(!r&&!o&&!i)return e.out.warn(`Unknown model: ${n}. Aliases: ${pS.join(", ")} (or org/model for local/OpenAI-compatible)`),"continue";let s=ns(n);if(s)return e.out.warn(s),"continue";try{await e.session.current.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${f.brand(n)}`)}catch(a){e.out.error(`Failed to switch model: ${a instanceof Error?a.message:String(a)}`)}return"continue"}},G6={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(f.bold(`Tools (${n.length})`)),e.out.line(fe());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"}},q6={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(()=>(Cm(),d0)),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(f.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(fe());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${f.warning("\u25CF")} ${i} ${f.dim(`(${l}m ago)`)}`),e.out.line(` ${f.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(f.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(f.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(f.bold(`MCP servers (${o.length})`)),e.out.line(fe());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"?f.success("\u25CF"):f.warning("\u25CF");e.out.line(` ${c} ${a}${l?f.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(f.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"}},z6={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(f.bold("Context-window limits")),e.out.line(fe());for(let[t,n]of Object.entries(Es)){let r=t===e.stats.model?f.brand(" \u2190 active"):"";e.out.line(` ${f.warning(t.padEnd(12))} ${f.meta(le(n))}${r}`)}return e.out.line(),"continue"}},J6={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(Km(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},U0=[B6,H6,W6,K6,G6,q6,z6,J6];G();zh();var mS=!1;function V6(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 Ec(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=mS?"":f.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");mS||(mS=!0),e.out.success(f.warning("\u25CF plan mode ON")+f.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(f.success("\u25CB plan mode OFF")+f.dim(` \u2014 ${V6(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}async function Y6(e){if(await Ec(e,!1),e.stats.permissionMode==="plan")return"continue";let t=yd(e.stats.cwd??process.cwd());return e.out.info(f.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:Xd(t)}}var j0={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 Ec(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await Ec(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await Ec(e,!1),"continue"):Y6(e)}};J();Yd();zs();Wr();var H0=20,W0=500,X6={done:"\u2705 Done",blocked:"\u26D4 Blocked",asking:"\u2753 Asking",interrupted:"\u23F8\uFE0F Interrupted"},Z6={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"]]},Q6=new Set(["write_file","edit_file","bash"]);function K0(e){return e.some(t=>Q6.has(t.toolName)&&t.isError!==!0)}function eX(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":X6[e.kind]}`,i=[];for(let[a,l]of Z6[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>W0?`${a.slice(0,W0)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no file write/edit or successful command recorded this turn \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
|
|
1808
1808
|
`):"(no detail)";return Ze(`${o}
|
|
1809
|
-
${s}`)}var fS=0,gS=!1;function G0(){fS=0,gS=!1}async function q0(e,t=On,n={}){try{if(fS>=H0){gS||(gS=!0,await t(`\u{1F916} AFK \xB7 reached ${H0} updates this session \u2014 further terminal-state pushes muted. Run /afk off then /afk on to resume.`));return}fS+=1,await t(
|
|
1810
|
-
`,{mode:384}),r}catch{return z0(e)}}function z0(e){let t;try{t=nh(e)}catch{return null}try{let n=ua.readFileSync(t,"utf8").trim();return n.length>0?n:null}catch{return null}}function Z0(e,t){return
|
|
1809
|
+
${s}`)}var fS=0,gS=!1;function G0(){fS=0,gS=!1}async function q0(e,t=On,n={}){try{if(fS>=H0){gS||(gS=!0,await t(`\u{1F916} AFK \xB7 reached ${H0} updates this session \u2014 further terminal-state pushes muted. Run /afk off then /afk on to resume.`));return}fS+=1,await t(eX(e,n))}catch{}}G();import*as ua from"node:fs";import*as J0 from"node:path";import{createHmac as tX,randomBytes as V0,timingSafeEqual as nX}from"node:crypto";var rX=32,Y0="\0";function oX(e){return JSON.stringify(hS(e))}function hS(e){if(Array.isArray(e))return e.map(hS);if(e!==null&&typeof e=="object"){let t=e,n={};for(let r of Object.keys(t).sort())n[r]=hS(t[r]);return n}return e}function X0(e){let t=z0(e);if(t)return t;let n;try{n=nh(e)}catch{return null}try{ua.mkdirSync(J0.dirname(n),{recursive:!0});let r=V0(rX).toString("hex");return ua.writeFileSync(n,r+`
|
|
1810
|
+
`,{mode:384}),r}catch{return z0(e)}}function z0(e){let t;try{t=nh(e)}catch{return null}try{let n=ua.readFileSync(t,"utf8").trim();return n.length>0?n:null}catch{return null}}function Z0(e,t){return tX("sha256",e).update(t).digest("hex")}function Q0(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:nX(n,r)}function iX(e,t,n){return["elicitation_response",e,t,oX(n)].join(Y0)}function sX(e,t,n,r){return Z0(e,iX(t,n,r))}function eO(e,t,n,r,o){return Q0(o,sX(e,t,n,r))}function aX(e,t){return["abort_request",e,t].join(Y0)}function lX(e,t,n){return Z0(e,aX(t,n))}function tO(e,t,n,r){return Q0(r,lX(e,t,n))}function nO(){return V0(8).toString("hex")}am();var rO={action:"decline"};function oO(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 Bw(t,{fromStart:!1,signal:o.signal}))if(i.kind==="abort_request"&&tO(n,t,i.nonce,i.hmac)){r("remote abort via Telegram"),o.abort();return}}catch{}})(),{stop:()=>{o.abort()}}}function iO(e){let{sessionId:t,key:n,emitElicitation:r,fallback:o}=e,i=e.newReqId??nO;return function(a,l){let c=l.signal;if(c.aborted)return Promise.resolve(rO);let d=i(),u,m=new Promise(h=>{u=h}),p=new AbortController,g=()=>{p.abort(),u(rO)};c.addEventListener("abort",g,{once:!0}),n&&(async()=>{try{for await(let h of Bw(t,{fromStart:!1,signal:p.signal}))if(h.kind==="elicitation_response"&&h.reqId===d&&eO(n,t,d,h.result,h.hmac)){u(h.result);return}}catch{}})();try{r({kind:"elicitation",reqId:d,request:a})}catch{}return Promise.resolve(o(a,{signal:p.signal})).then(h=>u(h)).catch(()=>{}),m.finally(()=>{p.abort(),c.removeEventListener("abort",g)})}}El();var Gm=null;function cX(){return E.TELEGRAM_BOT_TOKEN?cs().length>0:!1}async function Tc(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){G0();let o=e.session.current,i=o.sessionId,s=e.swapElicitationHandler,a=e.stdinElicitationHandler;if(i&&s&&a){let l=X0(i),c=iO({sessionId:i,key:l,emitElicitation:d=>o.recordLedgerElicitation(d.reqId,d.request),fallback:a});s(c),Gm?.stop(),Gm=oO({sessionId:i,key:l,onAbort:d=>o.abort(d)}),py(i,!0)}e.out.success(f.info("\u25D0 AFK mode ON")+f.dim(" \u2014 autonomous on reversible work; high-risk/irreversible ops are refused; terminal states report to Telegram.")),cX()||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),Gm?.stop(),Gm=null;let o=e.session.current.sessionId;o&&py(o,!1),e.out.success(f.success("\u25CB AFK mode OFF")+f.dim(" \u2014 default permissions restored"))}}catch(o){e.out.error(`Could not toggle AFK mode: ${o instanceof Error?o.message:String(o)}`)}}var sO={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 Tc(e,!1),"continue"):(await Tc(e,r),"continue")}};G();import{readFileSync as dX,writeFileSync as uX,existsSync as aO,mkdirSync as pX}from"fs";import{join as mX}from"path";function lO(){return lE(),Jg()}function cO(e){return mX(lO(),`${e}.json`)}function qm(e){let t=cO(e);if(!aO(t))return{sessionId:e,items:[]};try{let n=dX(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function xc(e){let t=lO();aO(t)||pX(t,{recursive:!0}),uX(cO(e.sessionId),JSON.stringify(e,null,2))}function dO(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 uO(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function pO(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function mO(e){e.items.length=0}function zm(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,ee());{let r=f.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+f.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?f.success("[x]"):f.dim("[ ]"),i=r.done?f.dim(r.text):Nr(r.text),a=` ${f.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-X(a)),c=ue(i,l).split(`
|
|
1811
1811
|
`);t.push(a+(c[0]??""));let d=" ".repeat(X(a));for(let u of c.slice(1))t.push(d+u)}{let r=Math.max(0,Math.min(n-1,120));t.push(f.dim("\u2514"+"\u2500".repeat(r)))}return t}function fO(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
|
|
1812
|
-
`)}function gO(e){let t=e.stats.sessionId??"unbound";return qm(t)}function
|
|
1813
|
-
`)}function bS(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",
|
|
1814
|
-
`).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(),d=
|
|
1815
|
-
`)}function wS(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function
|
|
1816
|
-
`)){let r=n.match(/\(([0-9a-f]{7,})\)\s*$/);r?.[1]&&t.add(r[1])}return t}function AO(e,t){let n=
|
|
1812
|
+
`)}function gO(e){let t=e.stats.sessionId??"unbound";return qm(t)}function fX(e){let t=gO(e),n=zm(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 hO={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 fX(e),"continue";let[r,...o]=n.split(/\s+/),i=o.join(" "),s=gO(e);switch(r){case"add":{if(!i)return e.out.warn("Usage: /todo add <text>"),"continue";let a=dO(s,i);return xc(s),e.out.success(`Added ${f.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=uO(s,a);return l?(xc(s),e.out.success(`Marked done ${f.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)?(pO(s,a)?(xc(s),e.out.success(`Removed ${f.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return mO(s),xc(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 yO={name:"/save",usage:"/save [name]",hint:"Checkpoint now (sessions already autosave each turn). Pass a name to label it \u2014 /name is the primary rename command.",summary:"Save this session to disk (for /resume)",async handler(e,t){if(e.stats.totalTurns===0)return e.out.warn("Nothing to save \u2014 no turns in this session yet."),"continue";let n=t.trim();if(n){let r=ia(n);r?e.stats.name=r:e.out.warn("Ignoring invalid name \u2014 use letters, numbers, spaces, or hyphens.")}try{let r=Vn(e.stats);e.out.success(f.success("Saved")+f.dim(` ${r}`));let o=e.stats.name??e.stats.sessionId;o&&e.out.line(f.dim(` Resume: ${Yn(o,e.stats.model)}`))}catch(r){e.out.error(`Could not save: ${r instanceof Error?r.message:String(r)}`)}return"continue"}};var bO={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(f.dim(" name ")+f.warning(e.stats.name)):e.out.info("No name set. Use /name <name> to set one."),"continue";let r=ia(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{Vn(e.stats),e.out.success(f.success("Named")+f.dim(` ${r}`)),e.out.line(f.dim(` Resume: ${Yn(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(f.success("Named")+f.dim(` ${r} (saves on first turn)`));return"continue"}};function gX(e){if(typeof e!="number"||!Number.isFinite(e))return" \u2014 ";let t=new Date(e);return Number.isNaN(t.getTime())?" \u2014 ":t.toISOString().replace("T"," ").slice(0,16)}function hX(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}var wO={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 c=na(n);if(!c)return e.out.warn(`No saved session: ${n}`),"continue";let d=c.data.name??c.id;if(typeof e.requestResume=="function"){let p=e.session.current.sessionId,g=c.data.sessionId;if(p!==void 0&&g!==void 0&&p===g||p!==void 0&&p===c.id)return e.out.warn(`Already on session ${d}.`),"continue";e.out.info(`Resuming session ${d} \u2026`);let b=await e.requestResume(hX(c));return b.ok?e.out.success(`Resumed ${d} (sdk id: ${b.sessionId})`):e.out.warn(b.reason),"continue"}let u=c.data,m=u.name??u.sessionId??c.id;return e.out.line(),e.out.line(f.bold(`Session ${u.name??c.id}`)),e.out.line(fe()),e.out.line(` name ${f.brand(u.name??"\u2014")}`),e.out.line(` source ${f.brand(u.source??"cli")}`),e.out.line(` model ${f.brand(u.model)}`),e.out.line(` turns ${f.meta(String(u.totalTurns))}`),e.out.line(` cost ${f.meta(ct(u.totalCostUsd))}`),e.out.line(` sdk id ${f.meta(u.sessionId??"\u2014")}`),e.out.line(),e.out.line(f.dim(" Resume with:")),e.out.line(f.brand(` ${Yn(m,u.model)}`)),e.out.line(),"continue"}let r=fc();if(r.length===0)return e.out.info("No saved sessions found. Use /save first."),"continue";let o=e.stats.cwd??process.cwd(),i=r.filter(c=>c.cwd===o),s=i.length>0,a=s?i:r,l=s?f.bold(`Saved sessions (${a.length})`):f.bold("Saved sessions \u2014 all (none in this directory)");e.out.line(),e.out.line(l),e.out.line(fe());for(let c of a.slice(0,20)){let d=gX(c.savedAt),u=f.brand(c.model.padEnd(7)),m=f.meta(`${c.totalTurns} turn${c.totalTurns===1?"":"s"}`.padEnd(9)),p=f.meta(ct(c.totalCostUsd).padStart(8)),g=c.source==="telegram"?f.brand("tg"):" ",h=f.warning(c.name??c.id);e.out.line(` ${d} ${u} ${m} ${p} ${g} ${h}`)}return e.out.line(),e.out.line(f.dim(" Resume with: /resume <name>")),e.out.line(),"continue"}};import{spawnSync as yX}from"node:child_process";function bX(e){switch(e){case"darwin":return[{cmd:"pbcopy",args:[]}];case"win32":return[{cmd:"clip",args:[]}];default:return[{cmd:"wl-copy",args:[]},{cmd:"xclip",args:["-selection","clipboard"]},{cmd:"xsel",args:["--clipboard","--input"]}]}}function SO(e,t=process.platform){for(let n of bX(t))try{let r=yX(n.cmd,n.args,{input:e});if(!r.error&&r.status===0)return!0}catch{}return!1}import{spawnSync as EX}from"node:child_process";function Rc(e=process.env){if(e.TMUX)return"tmux";if(e.KITTY_WINDOW_ID)return"kitty";if(e.WEZTERM_PANE)return"wezterm";if(e.WT_SESSION)return"windows-terminal";if(e.KONSOLE_DBUS_SERVICE)return"konsole";if(e.GNOME_TERMINAL_SCREEN)return"gnome-terminal";let t=e.TERM_PROGRAM;if(t==="iTerm.app")return"iterm2";if(t==="Apple_Terminal")return"apple-terminal";if(t==="vscode")return"vscode";if(t==="Hyper")return"hyper";let n=e.TERM;return n==="xterm-ghostty"||e.GHOSTTY_RESOURCES_DIR?"ghostty":n==="alacritty"?"alacritty":e.VTE_VERSION?"gnome-terminal":"unknown"}import{resolve as wX}from"node:path";function yS(e,t,n){let r=wX(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(Sc).join(" "),s=r.length>0&&!r.endsWith(".ts");return{argv:o,shellCommand:i,cwd:n,spawnable:s}}function Jm(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function vO(e){return`cd ${Sc(e.cwd)} && ${e.shellCommand}`}function SX(e){return`tell application "iTerm" to tell current window to create tab with default profile command "${Jm(vO(e))}"`}function vX(e){return`tell application "Terminal" to do script "${Jm(vO(e))}"`}function kX(e){return['tell application "Ghostty"',"set cfg to new surface configuration",`set command of cfg to "${Jm(e.shellCommand)}"`,`set initial working directory of cfg to "${Jm(e.cwd)}"`,"new tab in (front window) with configuration cfg","end tell"].join(`
|
|
1813
|
+
`)}function bS(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",SX(t)]}};case"apple-terminal":return{kind:e,capability:"window",exec:{cmd:"osascript",args:["-e",vX(t)]}};case"ghostty":return n==="darwin"?{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",kX(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 TX=5e3,xX=(e,t,n)=>{let r=EX(e,t,n);return{status:r.status,...r.error?{error:r.error}:{}}};function kO(e){let t=e.env??process.env,n=e.platform??process.platform,r=e.run??xX,o=Rc(t);if(!e.interactive)return{spawned:!1,kind:o,capability:"none",reason:"non-interactive-surface"};let i=yS(e.forkId,e.model,e.cwd);if(!i.spawnable)return{spawned:!1,kind:o,capability:"none",reason:"dev-entrypoint"};let s=bS(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:TX});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 RX={tmux:"tmux",wezterm:"WezTerm",kitty:"kitty",iterm2:"iTerm","apple-terminal":"Terminal",ghostty:"Ghostty","windows-terminal":"Windows Terminal","gnome-terminal":"GNOME Terminal",konsole:"Konsole",vscode:"VS Code",alacritty:"Alacritty",hyper:"Hyper",unknown:"this terminal"};function AX(e,t,n){let r=[];if(e.spawned){let o=e.capability==="window"?"window":"tab";r.push(f.info(` \u2197 Continuing in a new ${RX[e.kind]} ${o}.`)),r.push(f.dim(" Or run it yourself:"))}else e.kind==="vscode"&&e.reason==="no-tab-mechanism"?r.push(f.dim(" VS Code's integrated terminal can't be opened from outside \u2014 run this in a new terminal:")):r.push(f.dim(" Continue the fork with:"));return r.push(f.brand(` ${t}`)),n&&r.push(f.dim(" (copied to clipboard)")),r.push(""),r.push(f.meta(" This session continues here, untouched. The fork carries the")),r.push(f.meta(" conversation only \u2014 live subagents and background jobs are not forked.")),r}var EO={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}=qM(e.stats))}catch(l){return e.out.error(`Could not fork: ${l instanceof Error?l.message:String(l)}`),"continue"}let r=Yn(t,e.stats.model),o=e.stats.cwd??process.cwd(),i=typeof e.requestResume=="function"&&process.stdout.isTTY===!0,s=kO({forkId:t,model:e.stats.model,cwd:o,interactive:i}),a=!s.spawned&&SO(r);e.out.success(f.success("Forked")+f.dim(` ${n}`)),e.out.line();for(let l of AX(s,r,a))e.out.line(l);return e.out.line(),"continue"}};import{existsSync as $X,readFileSync as DX}from"node:fs";import{resolve as CO}from"node:path";import{execFileSync as TO}from"node:child_process";import{readFileSync as CX,writeFileSync as _X}from"node:fs";import{resolve as IX}from"node:path";var PX={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},MX=["Added","Fixed","Changed","Deprecated","Removed","Security"];function xO(e){let t;try{t=TO("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=TO("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
|
|
1814
|
+
`).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(),d=PX[c]??"Changed";return{hash:s,subject:l[2],category:d}}return{hash:s,subject:a,category:"Changed"}}):[]}function RO(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 MX){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(`
|
|
1815
|
+
`)}function wS(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function OX(e){let t=new Set;for(let n of e.split(`
|
|
1816
|
+
`)){let r=n.match(/\(([0-9a-f]{7,})\)\s*$/);r?.[1]&&t.add(r[1])}return t}function AO(e,t){let n=IX(e,"CHANGELOG.md"),r=CX(n,"utf8"),o=wS(r),i=OX(o),s=t.split(`
|
|
1817
1817
|
`).filter(c=>{let d=c.match(/\(([0-9a-f]{7,})\)\s*$/);return!(d?.[1]&&i.has(d[1]))}).join(`
|
|
1818
1818
|
`).replace(/\n{3,}/g,`
|
|
1819
1819
|
|
|
@@ -1822,17 +1822,17 @@ ${s}`)}var fS=0,gS=!1;function G0(){fS=0,gS=!1}async function q0(e,t=On,n={}){tr
|
|
|
1822
1822
|
`+s:o||s,l=r.replace(/## \[Unreleased\][^\n]*\n[\s\S]*?(?=\n## \[|$)/,`## [Unreleased]
|
|
1823
1823
|
|
|
1824
1824
|
${a}
|
|
1825
|
-
`);if(l===r)throw new Error("No ## [Unreleased] section found");
|
|
1826
|
-
`))a.startsWith("### ")?e.out.line(f.bold(a)):a.startsWith("- ")?e.out.line(f.dim(" ")+a):e.out.line(a);if(e.out.line(f.dim("\u2500".repeat(60))),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!$
|
|
1825
|
+
`);if(l===r)throw new Error("No ## [Unreleased] section found");_X(n,l)}var _O={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=xO(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=RO(o),s=(()=>{try{let a=DX(CO(r,"CHANGELOG.md"),"utf8");return wS(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(f.heading("Preview:")),e.out.line(f.dim("\u2500".repeat(60)));for(let a of i.split(`
|
|
1826
|
+
`))a.startsWith("### ")?e.out.line(f.bold(a)):a.startsWith("- ")?e.out.line(f.dim(" ")+a):e.out.line(a);if(e.out.line(f.dim("\u2500".repeat(60))),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!$X(CO(r,"CHANGELOG.md")))return e.out.error("CHANGELOG.md not found. Create one with a ## [Unreleased] section first."),"continue";AO(r,i),e.out.success("Wrote entries to CHANGELOG.md [Unreleased] section."),e.out.line(f.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"}};Tp();var SS,vS;function IO(e){SS=e}function PO(e){vS=e}var MO={running:"\u25D0",completed:"\u2713",failed:"\u2717",cancelled:"\u2298"};function Vm(e){return SS||(e.out.error("Background subagent jobs are not available in this session."),null)}var kS=/\x1b\[[0-9;]*[a-zA-Z]/g;function FX(e,t=120){let n=e.replace(kS,"").replace(/[\r\n]+/g," ").trim();return n.length>t?`${n.slice(0,t)}\u2026`:n}function LX(e){let t=MO[e.status],n=e.endedAt!==void 0?ge(e.endedAt-e.startedAt):ge(Date.now()-e.startedAt),r=e.label.length>60?`${e.label.slice(0,60)}\u2026`:e.label,o=` ${t} ${f.bold(e.jobId)} ${r} ${f.dim(`(${e.status} \xB7 ${n} \xB7 ${e.model})`)}`;if(!vS||e.status!=="running")return o;let i=vS.getSummary(e.jobId);if(!i)return o;let s=process.stdout.columns??120,a=FX(i.text,Math.max(40,s-10)),l=Math.round((Date.now()-i.refreshedAt)/1e3),c=i.stale?" [stale]":"",d=f.dim(` \u21B3 ${a} (${l}s ago)${c}`);return`${o}
|
|
1827
1827
|
${d}`}function ES(e,t){let n=MO[t.status];e.out.line(` ${n} ${f.bold(t.jobId)} ${t.label}`);let r=t.endedAt!==void 0?ge(t.endedAt-t.startedAt):ge(Date.now()-t.startedAt);e.out.line(` Status: ${t.status} \xB7 ${r}`),e.out.line(` Subagent: ${t.subagentId}`),e.out.line(` Model: ${t.model}`);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=i.split(`
|
|
1828
1828
|
`).slice(0,40);for(let a of s)e.out.line(` ${a}`);i.split(`
|
|
1829
|
-
`).length>40&&e.out.line(f.dim(" \u2026 (truncated; full result available via /bgsub:join again)"))}o?.error&&e.out.error(` Error: ${o.error.message}`)}var
|
|
1829
|
+
`).length>40&&e.out.line(f.dim(" \u2026 (truncated; full result available via /bgsub:join again)"))}o?.error&&e.out.error(` Error: ${o.error.message}`)}var NX={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=Vm(e);if(!n)return"continue";let r=t.trim();if(r){let i=n.get(r);return i?(ES(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(LX(i));return"continue"}},BX={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=Vm(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?(ES(e,o),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},UX={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=Vm(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&&ES(e,i),"continue"}let o=await Gn.readMeta(r);if(o){e.out.info("Job evicted from memory \u2014 replaying from log.");let i=0;for await(let s of Gn.readEvents(r)){let a=jX(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"}};function jX(e){if(e.type==="chunk"){let t=e.chunk;return t.type==="content"?t.content.replace(kS,""):t.type==="tool_use_detail"?f.dim(` [tool: ${t.toolName}]`):null}if(e.type==="error")return f.dim(` [error: ${e.error.message}]`);if(e.type==="message"){let t=e.message.content;return(typeof t=="string"?t:JSON.stringify(t)).replace(kS,"")}return null}var HX={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=Vm(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(f.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")}},OO=[NX,BX,UX,HX];var pa;function DO(e){pa=e}function $O(e){let t=e.trim();return t.startsWith("sh-")?t:/^\d+$/.test(t)?`sh-${t}`:t}function WX(e){switch(e){case"running":return"\u25B6";case"completed":return"\u2713";case"failed":return"\u2717";case"killed":return"\u2298";default:return"?"}}var FO={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(!pa)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=pa.registry.list();if(s.length===0)return e.out.line(f.dim(" no shell jobs in this session yet \u2014 type !<cmd> to start one")),"continue";e.out.line(f.dim(" id status duration mode command"));for(let a of s){let l=WX(a.status),c=a.status.padEnd(10),d=a.result?ge(a.result.durationMs).padEnd(12):ge(Date.now()-a.startedAt).padEnd(12),u=a.mode==="background"?"bg":"fg",m=a.command.length>60?a.command.slice(0,57)+"...":a.command;e.out.line(` ${l} ${a.id.padEnd(5)} ${c} ${d} ${u.padEnd(4)} ${m}`)}return"continue"}case"show":{if(!i)return e.out.info("Usage: /sh show <id>"),"continue";let s=$O(i),a=pa.registry.get(s);if(!a)return e.out.error(`Job ${s} not found.`),"continue";if(e.out.line(f.dim(`$ ${a.command}`)),!a.result)return e.out.line(f.dim(" (still running \u2014 output captured so far is not yet flushed)")),"continue";let l=a.result.displayCaptured;l.length===0?e.out.line(f.dim(" (no output)")):e.out.raw(l.endsWith(`
|
|
1830
1830
|
`)?l:l+`
|
|
1831
1831
|
`);let c=a.result.errorReason==="abort"?"killed":a.result.errorReason==="timeout"?"timed out":`exit ${a.result.exitCode??0}`;return e.out.line(f.dim(` [${a.id} \xB7 ${c} \xB7 ${ge(a.result.durationMs)}]`)),a.result.truncated&&e.out.line(f.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=$O(i);if(pa.registry.kill(s))e.out.success(`Killed ${s}.`);else{let l=pa.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 nv}from"node:fs";import{resolve as rv}from"node:path";var Ym="command-name",Xm="command-message",Zm="command-args";function Qm(e,t){return`<${Ym}>/${e}</${Ym}>
|
|
1832
1832
|
<${Xm}>${e}</${Xm}>
|
|
1833
|
-
<${Zm}>${t}</${Zm}>`}var LO=`<(?:${Ym}|${Xm}|${Zm})[\\s\\S]*?</(?:${Ym}|${Xm}|${Zm})>`,
|
|
1833
|
+
<${Zm}>${t}</${Zm}>`}var LO=`<(?:${Ym}|${Xm}|${Zm})[\\s\\S]*?</(?:${Ym}|${Xm}|${Zm})>`,KX=new RegExp(`(\\n|^)[ \\t]*${LO}[ \\t]*\\n?`,"gm"),GX=new RegExp(LO,"g");function TS(e){let t=!1,n=e.replace(KX,(r,o)=>(t=!0,o));return n=n.replace(GX,()=>(t=!0,"")),n=n.replace(/^[ \t]+$/gm,""),n=n.replace(/\n{3,}/g,`
|
|
1834
1834
|
|
|
1835
|
-
`),t&&(n=n.replace(/^\n+/,"").replace(/\n+$/,"")),n}function
|
|
1835
|
+
`),t&&(n=n.replace(/^\n+/,"").replace(/\n+$/,"")),n}function qX(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function xS(e,t){let n=qX(t),r=new RegExp(`<${n}>`,"g"),o=r.test(e);r.lastIndex=0;let i=new RegExp(`(\\n|^)[ \\t]*<${n}>[ \\t]*\\n?`,"gm"),s=new RegExp(`(\\n|^)[ \\t]*</${n}>[ \\t]*\\n?`,"gm"),a=new RegExp(`</${n}>`,"g"),l=!1,c=e;return c=c.replace(i,(d,u)=>(l=!0,u)),c=c.replace(s,(d,u)=>(l=!0,u)),c=c.replace(r,()=>(l=!0,"")),c=c.replace(a,()=>(l=!0,"")),c=c.replace(/^[ \t]+$/gm,""),c=c.replace(/\n{3,}/g,`
|
|
1836
1836
|
|
|
1837
1837
|
`),l&&(c=c.replace(/^\n+/,"").replace(/\n+$/,"")),{text:c,found:o}}J();Te();J();import Ac from"string-width";function wi(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??ee(),a=t.includes(`
|
|
1838
1838
|
`),l=Ac(je(t)),c=l>=s-2,d;if(!a&&!c){let g=f.user("\u25B6")+" ",h=2,b=s-1,y=Math.max(0,b-l-h);d=g+" ".repeat(y)+t}else d=Vi({kind:"user",body:t});if(i===null)return d;let u=Ac(i),m=Math.max(0,s-1-u),p=" ".repeat(m)+f.dim(i);return d+`
|
|
@@ -1840,7 +1840,7 @@ ${d}`}function ES(e,t){let n=MO[t.status];e.out.line(` ${n} ${f.bold(t.jobId)}
|
|
|
1840
1840
|
`),i=0;for(let s=0;s<o.length;s++){let a=je(o[s]),l=(s===0?t:0)+Ac(a);i+=Math.max(1,Math.ceil(l/r))}return Math.max(0,i-1)}function bo(e,t,n,r){let o=r||80,i=e.split(`
|
|
1841
1841
|
`),s=0,a=0;for(let l=0;l<i.length;l++){let c=i[l],d=c.length+(l<i.length-1?1:0);if(t<=a+c.length){let m=t-a,p=je(c.slice(0,m)),g=(l===0?n:0)+Ac(p),h=Math.floor(g/o),b=g%o;return{row:s+h,col:b}}let u=(l===0?n:0)+Ac(je(c));s+=Math.max(1,Math.ceil(u/o)),a+=d}return{row:s,col:0}}function Si(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Qn(e,t){let n=Si(t,e.buffer.length);return n===e.cursor?e:{buffer:e.buffer,cursor:n}}function NO(e,t){let n=Si(t,e.length);for(;n>0&&/\s/.test(e.charAt(n-1));)n--;for(;n>0&&!/\s/.test(e.charAt(n-1));)n--;return n}function BO(e,t){let n=e.length,r=Si(t,n);for(;r<n&&/\s/.test(e.charAt(r));)r++;for(;r<n&&!/\s/.test(e.charAt(r));)r++;return r}function UO(e,t){let n=Si(t,e.length),r=n===0?-1:e.lastIndexOf(`
|
|
1842
1842
|
`,n-1);return r<0?0:r+1}function jO(e,t){let n=Si(t,e.length),r=e.indexOf(`
|
|
1843
|
-
`,n);return r<0?e.length:r}function wo(e,t,n){let r=Si(t.start,e.buffer.length),o=Si(t.end,e.buffer.length),i=Math.min(r,o),s=Math.max(r,o);if(i===s&&n.length===0)return e;let a=e.buffer.slice(0,i)+n+e.buffer.slice(s),l=i+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var z={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:wo,insert(e,t){return t.length===0?e:wo(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=sh(e.buffer,e.cursor);return wo(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=Do(e.buffer,e.cursor);return wo(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=NO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=BO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=UO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=jO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:e.cursor,end:t},"")},moveLeft(e){return Qn(e,sh(e.buffer,e.cursor))},moveRight(e){return Qn(e,Do(e.buffer,e.cursor))},moveHome(e){return Qn(e,0)},moveEnd(e){return Qn(e,e.buffer.length)},moveLineStart(e){return Qn(e,UO(e.buffer,e.cursor))},moveLineEnd(e){return Qn(e,jO(e.buffer,e.cursor))},moveWordBackward(e){return Qn(e,NO(e.buffer,e.cursor))},moveWordForward(e){return Qn(e,BO(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{row:o,col:i}=bo(e.buffer,e.cursor,n,r);if(o===0)return{moved:!1};let s=o-1,a=i,l=0,c=1/0;for(let u=0;u<=e.buffer.length;u++){let m=bo(e.buffer,u,n,r);if(m.row===s){let p=Math.abs(m.col-a);p<c&&(c=p,l=u)}else if(m.row>s)break}let d=Qn(e,l);return d===e?{moved:!1}:{moved:!0,state:d}},moveDownLine(e,t,n){let r=t||80,{row:o,col:i}=bo(e.buffer,e.cursor,n,r),s=bo(e.buffer,e.buffer.length,n,r);if(o>=s.row)return{moved:!1};let a=o+1,l=i,c=e.buffer.length,d=1/0;for(let m=0;m<e.buffer.length;m++){let p=bo(e.buffer,m,n,r);if(p.row===a){let g=Math.abs(p.col-l);g<d&&(d=g,c=m)}else if(p.row>a)break}s.row===a&&Math.abs(s.col-l)<d&&(c=e.buffer.length);let u=Qn(e,c);return u===e?{moved:!1}:{moved:!0,state:u}}};var HO=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"];function AS(){return HO[Math.floor(Math.random()*HO.length)]}Ct();J();var
|
|
1843
|
+
`,n);return r<0?e.length:r}function wo(e,t,n){let r=Si(t.start,e.buffer.length),o=Si(t.end,e.buffer.length),i=Math.min(r,o),s=Math.max(r,o);if(i===s&&n.length===0)return e;let a=e.buffer.slice(0,i)+n+e.buffer.slice(s),l=i+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var z={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:wo,insert(e,t){return t.length===0?e:wo(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=sh(e.buffer,e.cursor);return wo(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=Do(e.buffer,e.cursor);return wo(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=NO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=BO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=UO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=jO(e.buffer,e.cursor);return t===e.cursor?e:wo(e,{start:e.cursor,end:t},"")},moveLeft(e){return Qn(e,sh(e.buffer,e.cursor))},moveRight(e){return Qn(e,Do(e.buffer,e.cursor))},moveHome(e){return Qn(e,0)},moveEnd(e){return Qn(e,e.buffer.length)},moveLineStart(e){return Qn(e,UO(e.buffer,e.cursor))},moveLineEnd(e){return Qn(e,jO(e.buffer,e.cursor))},moveWordBackward(e){return Qn(e,NO(e.buffer,e.cursor))},moveWordForward(e){return Qn(e,BO(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{row:o,col:i}=bo(e.buffer,e.cursor,n,r);if(o===0)return{moved:!1};let s=o-1,a=i,l=0,c=1/0;for(let u=0;u<=e.buffer.length;u++){let m=bo(e.buffer,u,n,r);if(m.row===s){let p=Math.abs(m.col-a);p<c&&(c=p,l=u)}else if(m.row>s)break}let d=Qn(e,l);return d===e?{moved:!1}:{moved:!0,state:d}},moveDownLine(e,t,n){let r=t||80,{row:o,col:i}=bo(e.buffer,e.cursor,n,r),s=bo(e.buffer,e.buffer.length,n,r);if(o>=s.row)return{moved:!1};let a=o+1,l=i,c=e.buffer.length,d=1/0;for(let m=0;m<e.buffer.length;m++){let p=bo(e.buffer,m,n,r);if(p.row===a){let g=Math.abs(p.col-l);g<d&&(d=g,c=m)}else if(p.row>a)break}s.row===a&&Math.abs(s.col-l)<d&&(c=e.buffer.length);let u=Qn(e,c);return u===e?{moved:!1}:{moved:!0,state:u}}};var HO=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"];function AS(){return HO[Math.floor(Math.random()*HO.length)]}Ct();J();var zX=[{id:"kbd:ctrl-b",text:"Ctrl+B during a turn detaches it to the background so you can keep typing \u2014 find it later with /bgsub.",source:"static"},{id:"kbd:shift-tab",text:"Shift+Tab cycles permission modes: default \u2192 plan \u2192 bypass (AFK stays on /afk).",source:"static"},{id:"kbd:ctrl-c",text:"Ctrl+C interrupts the current turn; press it twice in a row to exit the REPL.",source:"static"},{id:"kbd:at-path",text:"Type @ in the prompt to autocomplete a file path and attach its contents to your turn.",source:"static"},{id:"kbd:cmd-v",text:"Paste an image with Cmd+V (macOS) or Ctrl+V \u2014 clipboard images attach automatically.",source:"static"},{id:"env:tips-opt-out",text:"Set AFK_SPINNER_TIPS=0 to silence these loading-screen tips.",source:"static"}];function JX(){let e=[];for(let t of dt())t.hint&&(t.name.includes(":")||e.push({id:`cmd:${t.name}`,text:`${t.name} \u2014 ${t.hint}`,source:"command"}));return e}function VX(e){let t=[];for(let n of $n()){let r=`cmd:/${n}`;if(e.has(r))continue;let o;try{o=Ge(n)}catch{continue}Sn(o,E.AFK_INTERNAL==="1")&&o.whenToUse&&t.push({id:`skill:${n}`,text:`/${n} \u2014 ${o.whenToUse}`,source:"skill"})}return t}function GO(){if(E.AFK_SPINNER_TIPS==="0")return[];let e=JX(),t=new Set(e.map(r=>r.id)),n=VX(t);return[...zX,...e,...n]}var WO=new Set,KO=new Map;function qO(e,t){if(e.length===0)return null;let n=t.now??Date.now(),r=t.warmupMs??1500;if(n-t.startedAt<r)return null;let o=t.rotateMs??7e3,i=Math.floor((n-t.startedAt)/o),s=`${t.startedAt}:${i}`,a=KO.get(s);if(a)return a;let l=null,c=e.filter(d=>!WO.has(d.id));if(c.length>0){let d=(i%c.length+c.length)%c.length;l=c[d]??null}else{let d=(i%e.length+e.length)%e.length;l=e[d]??null}return l&&(WO.add(l.id),KO.set(s,l)),l}var CS=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],YX=2e3;function zO(e){let t=Date.now()-e;if(t<YX)return"";let n=Math.floor(t/1e3);if(n<60)return f.dim(` ${n}s`);let r=Math.floor(n/60),o=n%60;return f.dim(` ${r}m${o.toString().padStart(2,"0")}s`)}function rt(e,t){return`\x1B[${e};1H\x1B[2K${t??""}`}function JO(e,t){let n=" \u{1F4A1} Tip: ",r=Math.max(8,t-X(n)-1),o=X(e)>r?se(e,Math.max(0,r-1),"")+"\u2026":e;return f.dim(n+o)}var ef=class{state=null;interval=null;captureMode;onTick;constructor(t){this.captureMode=t.captureMode,this.onTick=t.onTick}set(t){if(!t.enabled){this.interval&&(clearInterval(this.interval),this.interval=null),this.state&&(this.state=null,this.onTick());return}if(this.captureMode||this.state)return;let n=t.rotateVerbEveryMs??3500,r=Date.now();this.state={frameIndex:0,verb:AS(),nextVerbRotateAt:r+n,startedAt:r,tipPool:GO(),currentTip:null},this.interval=setInterval(()=>this.tick(n),80),this.onTick()}dispose(){this.interval&&(clearInterval(this.interval),this.interval=null),this.state=null}renderSpinnerRow(){return this.state?f.meta(`${CS[this.state.frameIndex]} ${this.state.verb}...`)+zO(this.state.startedAt):null}renderTipRow(t){return this.state?.currentTip?JO(this.state.currentTip.text,t):null}tick(t){if(!this.state)return;this.state.frameIndex=(this.state.frameIndex+1)%CS.length;let n=Date.now();n>=this.state.nextVerbRotateAt&&(this.state.verb=AS(),this.state.nextVerbRotateAt=n+t),this.state.currentTip=qO(this.state.tipPool,{startedAt:this.state.startedAt,now:n}),this.onTick()}};var tf=class{interval=null;visiblePhase=!0;enabled;captureMode;intervalMs;onTick;constructor(t){this.enabled=t.enabled,this.captureMode=t.captureMode,this.intervalMs=t.intervalMs,this.onTick=t.onTick}get visible(){return this.enabled?this.visiblePhase:!0}start(){!this.enabled||this.captureMode||this.interval||(this.visiblePhase=!0,this.schedule())}resetVisible(){if(!this.enabled||this.captureMode||!this.interval)return!1;let t=!this.visiblePhase;return this.visiblePhase=!0,clearInterval(this.interval),this.schedule(),t}stop(){this.interval&&(clearInterval(this.interval),this.interval=null),this.visiblePhase=!0}schedule(){let t=setInterval(()=>{this.visiblePhase=!this.visiblePhase,this.onTick()},this.intervalMs);t.unref?.(),this.interval=t}};import{randomBytes as XX}from"node:crypto";var ZX=5,QX=1e3,e9=/\[Pasted text #([0-9a-f]+) \+\d+ (?:lines|chars)\]/g;function t9(e,t){let n=t.match(/\n/g),r=n?n.length:0;return r>0?`[Pasted text #${e} +${r+1} lines]`:`[Pasted text #${e} +${t.length} chars]`}function nf(e,t){return e.pasteRegistry.size===0?t:t.replace(e9,(n,r)=>e.pasteRegistry.get(r)??n)}function VO(e){return{text:nf(e,e.input.buffer),queued:e.queued}}function YO(e){let t=e.pasteStartCursor,n=e.input.cursor;if(n<=t)return;let o=e.input.buffer.slice(t,n).replace(/\x1b\[200~/g,"").replace(/\x1b\[201~/g,""),i=o.match(/\n/g),s=i?i.length:0,a=o.length;if(s<ZX&&a<QX)return;let l=XX(4).toString("hex");e.pasteRegistry.set(l,o);let c=t9(l,o);e.input=z.replaceRange(e.input,{start:t,end:n},c)}function _S(e,t){if(e.pasteRegistry.size===0)return null;let n=e.input.buffer,r=e.input.cursor;if(t==="backward"){let l=/\[Pasted text #([0-9a-f]+) \+\d+ (?:lines|chars)\]$/.exec(n.slice(0,r));if(!l)return null;let c=r-l[0].length,d=l[1],u=z.replaceRange(e.input,{start:c,end:r},"");return e.pasteRegistry.delete(d),u}let o=/^\[Pasted text #([0-9a-f]+) \+\d+ (?:lines|chars)\]/.exec(n.slice(r));if(!o)return null;let i=r+o[0].length,s=o[1],a=z.replaceRange(e.input,{start:r,end:i},"");return e.pasteRegistry.delete(s),a}import{readdirSync as r9,statSync as o9}from"fs";import{join as i9}from"path";import{join as ZO}from"path";import{homedir as n9}from"os";function rf(e,t){let n=e?.shift===!0||t==="\x1B[13;2u",r=e?.meta===!0;return n||r}function ma(e){return e.endsWith("\\")}var QO=50;function of(e,t,n=n9()){if(e==="~"||e.startsWith("~/")){let l=e==="~"?"":e.slice(2),c=l.lastIndexOf("/"),d=c===-1?"":l.slice(0,c),u=c===-1?l:l.slice(c+1),m=d?ZO(n,d):n,p=d?`~/${d}/`:"~/";return{scanDir:m,leafPrefix:u,displayPrefix:p}}if(e.startsWith("/")){let l=e.lastIndexOf("/"),c=e.slice(0,l+1)||"/",d=e.slice(l+1);return{scanDir:c,leafPrefix:d,displayPrefix:c}}let r=e.lastIndexOf("/"),o=r===-1?"":e.slice(0,r),i=r===-1?e:e.slice(r+1),s=o?ZO(t,o):t,a=o?`${o}/`:"";return{scanDir:s,leafPrefix:i,displayPrefix:a}}async function e$(e){let t="",n=e.promptFn(),r=e.continuationPrompt??" \u203A ";for(;;){e.rl.setPrompt(n),e.rl.prompt();let o=await new Promise(i=>{e.rl.once("line",s=>i(s))});if(ma(o)){t+=o.slice(0,-1)+`
|
|
1844
1844
|
`,n=r;continue}return t+=o,t}}function Cc(e,t){let n=e.slice(0,t);if(/^\/[A-Za-z_-]*$/.test(n))return{kind:"slash",query:n.slice(1)};let r=n.split(/\s+/),o=r[r.length-1]??"";if(o.startsWith("@")&&/^@[^\s]*$/.test(o))return{kind:"file",query:o.slice(1)};let i=/^\/([A-Za-z][A-Za-z0-9_:-]*)\s+(?:.*\s)?--([a-z0-9-]*)$/.exec(n);if(i){let s=i[1],a=i[2],l=dt().find(c=>c.name===`/${s}`);if(l?.flags&&l.flags.length>0)return{kind:"flag",command:s,query:a}}return null}function sf(e){let t=dt(),n=t.filter(i=>i.name.slice(1).startsWith(e)).map(i=>({value:i.name,summary:i.summary,...i.hint?{hint:i.hint}:{}})),r=da().filter(i=>i.alias.slice(1).startsWith(e)).map(i=>{let s=t.find(a=>a.name===i.canonical);return{value:i.alias,summary:i.summary,...s?.hint?{hint:s.hint}:{}}});return[...n,...r].sort((i,s)=>i.value.localeCompare(s.value)).slice(0,20)}function af(e,t=process.cwd(),n){let{scanDir:r,leafPrefix:o,displayPrefix:i}=of(e,t,n);try{return r9(r).filter(a=>a.startsWith(o)).filter(a=>!(a.startsWith(".")&&!o.startsWith("."))).sort().slice(0,QO).map(a=>{let l=i+a;try{o9(i9(r,a)).isDirectory()&&(l+="/")}catch{}return{value:"@"+l}})}catch{return[]}}function _c(e,t){let n=dt().find(i=>i.name===`/${e}`);if(!n?.flags||n.flags.length===0)return[];let r=t.startsWith("--")?t.slice(2):t;return n.flags.filter(i=>(i.startsWith("--")?i.slice(2):i).startsWith(r)).map(i=>({value:i})).sort((i,s)=>i.value.localeCompare(s.value)).slice(0,20)}et();J();var s9=3,a9=250,l9=1500,c9=500;function t$(){return"Predict the single most likely completion of the user's in-progress REPL input. Return ONLY the completed line \u2014 no explanation, no preamble, no trailing newline."}function n$(e,t){let n=t.cwd.split("/").filter(Boolean).pop()??t.cwd,r=t.getRecentCommands().slice(0,5),o=t.getTranscriptTail(),i=[];return i.push(`cwd: ${n}`),r.length>0&&i.push(`recent: ${r.join(" | ")}`),o.length>0&&i.push(`context: ${o.slice(0,200)}`),i.push(`input: ${e}`),i.join(`
|
|
1845
1845
|
`)}function fa(e){return e.replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\u001b\][\s\S]*?(?:\u0007|\u001b\\)/g,"").replace(/\u001b[@-_]/g,"").replace(/[\u0000-\u001f\u007f-\u009f]/g,"")}function r$(e,t){let n=t.trim();return n.startsWith(e)&&n.length>e.length}function i$(e={}){let t=e.debounceMs??a9,n=e.timeoutMs??l9,r=null,o=null,i=null,s=new Map,a=e.resolveProviderFn??em,l=new Map;function c(h,b){let y=oe(h,b),w=l.get(y);return w===void 0&&(w=a(h,b),l.set(y,w)),w}function d(h,b){if(s.size>=c9&&!s.has(h)){let y=s.keys().next().value;y!==void 0&&s.delete(y)}s.set(h,b)}function u(h,b){if(h.length===0)return null;let y=b.getDropdownTopCandidate(h);if(y!==null&&y.startsWith(h)&&y.length>h.length)return y;let w=b.getHistory();for(let T of w)if(T.startsWith(h)&&T.length>h.length)return T;let v=/\s+\/([A-Za-z][A-Za-z0-9_:-]*)$/.exec(h);if(v){let S="/"+v[1],R=dt().map(P=>P.name),C=da().map(P=>P.alias),j=[...R,...C].filter(P=>P.startsWith(S)).sort((P,k)=>P.localeCompare(k))[0];if(j){let P=h.length-S.length;return h.slice(0,P)+j}}return null}async function m(h,b){let y=u(h,b);if(y!==null)return y;if(!b.llmEnabled()||h.length<s9)return null;if(s.has(h))return s.get(h)??null;if(i!==null&&(i.abort(),i=null),r!==null&&(clearTimeout(r),r=null,o!==null)){let w=o;o=null,w(null)}return new Promise(w=>{o=w,r=setTimeout(()=>{r=null,o=null,p(h,b,w)},t)})}async function p(h,b,y){let w=new AbortController;i=w;let v=setTimeout(()=>w.abort(),n),T=new Promise(S=>{w.signal.aborted?S(null):w.signal.addEventListener("abort",()=>S(null),{once:!0})});try{let S=null,R=!1;if(e.completeFn){let C=await Promise.race([e.completeFn({system:t$(),user:n$(h,b),model:o$(b),maxTokens:24,signal:w.signal,apiKey:b.apiKey,baseUrl:b.baseUrl}).then(_=>({ok:!0,raw:_})),T.then(()=>({ok:!1}))]);if(C.ok){R=!0;let _=fa(C.raw).trim();S=r$(h,_)?_:null}}else{let C=o$(b),_=b.baseUrl?{openaiBaseUrl:b.baseUrl}:void 0,j=c(C,_);if(typeof j.complete!="function"){d(h,null),y(null);return}let P=await Promise.race([j.complete({system:t$(),user:n$(h,b),model:C,maxTokens:24,signal:w.signal,apiKey:b.apiKey,baseUrl:b.baseUrl}).then(k=>({ok:!0,raw:k})),T.then(()=>({ok:!1}))]);if(P.ok){R=!0;let k=fa(P.raw).trim();S=r$(h,k)?k:null}}R&&d(h,S),y(S)}catch(S){e.onError?.(S),y(null)}finally{clearTimeout(v),i===w&&(i=null)}}function g(){if(r!==null&&(clearTimeout(r),r=null,o!==null)){let h=o;o=null,h(null)}i!==null&&(i.abort(),i=null);for(let h of l.values())try{h.close?.()}catch{}l.clear()}return{getDeterministicGhost:u,getGhost:m,dispose:g}}function o$(e){let t=E.AFK_SUGGEST_MODEL;if(t)return t;let n=oe(e.model);return n==="anthropic-direct"||n==="anthropic"?E.AFK_COMPACT_MODEL??"haiku":e.model}var vi=6;function lf(e){let t=e.autocompleteState;if(!t)return;t.trigger=Cc(e.input.buffer,e.input.cursor);let n=`${e.input.cursor}:${e.input.buffer}`;t.suppressedSignature!==null&&t.suppressedSignature!==n&&(t.suppressedSignature=null),t.trigger&&t.suppressedSignature===null?(t.trigger.kind==="slash"?t.candidates=sf(t.trigger.query).slice(0,12):t.trigger.kind==="file"?t.candidates=af(t.trigger.query):t.candidates=_c(t.trigger.command,t.trigger.query),t.dropdownOpen=t.candidates.length>0):(t.dropdownOpen=!1,t.candidates=[]),t.selectedIndex>=t.candidates.length&&(t.selectedIndex=Math.max(0,t.candidates.length-1)),t.viewportStart>t.selectedIndex&&(t.viewportStart=t.selectedIndex),t.selectedIndex>=t.viewportStart+vi&&(t.viewportStart=t.selectedIndex-vi+1)}function s$(e){if(!e.ghostEngine||!e.ghostGetContext)return;let t=e.input.buffer;e.activeGhost!==null&&!e.activeGhost.startsWith(t)&&(e.activeGhost=null);let n=e.ghostGetContext(),r=e.ghostEngine.getDeterministicGhost(t,n);if(r!==null){e.activeGhost=r;return}if(e.activeGhost=null,e.autocompleteState?.dropdownOpen)return;let i=t;e.ghostEngine.getGhost(t,n).then(s=>{s!==null&&e.input.buffer===i&&s.startsWith(i)&&s.length>i.length&&(e.activeGhost=s,e.repaint())}).catch(()=>{})}function a$(e){let t=e.autocompleteState;if(!t?.dropdownOpen||t.candidates.length===0)return!1;let n=t.candidates[t.selectedIndex];if(!n)return!1;let r=e.input.buffer.slice(0,e.input.cursor),o=e.input.buffer.slice(e.input.cursor),i,s;if(t.trigger?.kind==="slash"){let l=/\/[A-Za-z_-]*$/.exec(r);i=l?r.length-l[0].length:e.input.cursor,s=n.value+(o.startsWith(" ")?"":" ")}else if(t.trigger?.kind==="flag"){let l=/--[a-z0-9-]*$/.exec(r);i=l?r.length-l[0].length:e.input.cursor,s=n.value+(o.startsWith(" ")?"":" ")}else{let l=r.search(/[^\s]*$/);i=l>=0?l:e.input.cursor,s=n.value}let a=z.replaceRange(e.input,{start:i,end:e.input.cursor},s);return a===e.input?!1:(e.input=a,t.dropdownOpen=!1,t.candidates=[],t.viewportStart=0,t.selectedIndex=0,lf(e),e.repaint(),!0)}function l$(e){let t=e.activeGhost;if(t===null||e.autocompleteState?.dropdownOpen||e.input.cursor!==e.input.buffer.length||!t.startsWith(e.input.buffer)||t.length<=e.input.buffer.length)return!1;let r=e.input.buffer+fa(t.slice(e.input.buffer.length)),o=z.seed(r);return e.input=o,e.activeGhost=null,lf(e),e.repaint(),!0}import u9 from"chalk";import p9 from"string-width";function c$(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=p9(e[r]),n>t)return e.slice(0,r)+f.dim("\u2026");return e}function cf(e,t,n,r){let o=t?">":" ",i=e.value,s=e.summary?` ${e.summary}`:"",a=`${i}${s}`,l=c$(a,n-4),c=` ${o} ${l}`;return t?u9.inverse(f.user(c)):f.meta(c)}function df(e,t){if(!e)return null;let n=e.trim();if(n.length===0)return null;let r=c$(n,Math.max(0,t-7));return r.length===0?null:f.dim(` \u21B3 ${r}`)}function d$(e){let t=e.pendingSubmissions.length,n=t>0?" "+f.dim(t===1?"[queued]":`[${t} queued]`):"",r=e.input.buffer.slice(0,e.input.cursor),o=Do(e.input.buffer,e.input.cursor),i=e.input.cursor>=e.input.buffer.length,s=i?"\u258F":e.input.buffer.slice(e.input.cursor,o),a=e.input.cursor<e.input.buffer.length?e.input.buffer.slice(o):"",l=e.formatInputBuffer?.(r)??r,c=e.formatInputBuffer?.(a)??a,d=e.caretVisible!==!1,u;d?u=i?f.caret(s):f.caret.inverse(s):i?u=" ":u=e.formatInputBuffer?.(s)??s;let m=e.autocompleteState,p="",g=e.activeGhost;if(g!==null&&!n&&e.input.buffer.length>0&&e.input.cursor===e.input.buffer.length&&g.startsWith(e.input.buffer)&&g.length>e.input.buffer.length&&!m?.dropdownOpen){let h=fa(g.slice(e.input.buffer.length)),b=e.stdout.columns??80,y=X(je(e.promptTextFn())),w=X(je(r))+1,v=Math.max(0,b-y-w-1),T=se(h,v,"");T.length>0&&(p=f.dim(T))}return e.promptTextFn()+l+u+c+p+n}function u$(e){let t=e.autocompleteState;if(!t?.dropdownOpen)return[];let n=e.stdout.columns||80;if(n<=40)return[];let r=Math.min(n-4,60),o=Math.min(t.candidates.length-t.viewportStart,vi),i=[];for(let s=0;s<o;s++){let a=t.viewportStart+s,l=t.candidates[a];if(!l)continue;let c=cf(l,a===t.selectedIndex,r,t.trigger?.kind),d=X(je(c)),u=Math.max(0,Math.ceil(d/n)-1);i.push(c);for(let m=0;m<u;m++)i.push("")}return i.reverse()}function p$(e){let t=e.autocompleteState;if(!t?.dropdownOpen)return null;let n=e.stdout.columns||80;if(n<=40)return null;let r=t.candidates[t.selectedIndex];if(!r)return null;let o=Math.min(n-4,80);return df(r.hint,o)??""}function m$(e){let{prevTopRow:t,frameTop:n,anchorFloor:r,anchorRow:o,lineCount:i,textLines:s,rows:a,extraRows:l,committedBand:c,committedBandBottomRow:d,committedBandPaintedRows:u,geometryStale:m}=e,p=t>1&&!m&&i<=n-r,g=Math.max(0,n-r),h=Math.max(1,a-1-l),b=Math.max(0,h-r),y=c.length>0&&o<=1&&(m||d===n-1),w=y?[...c,...s]:s,v=y&&c.length>u,T=v||!p&&b>0;return{fitsAboveFrame:p,room:g,overflowTargetBottom:h,maxBandModel:b,overflowPriorContiguous:y,overflowRun:w,overflowHasPending:v,useBandHold:T}}function IS(e,t){return e.length>t?e.slice(e.length-t):e}function f9(e,t,n){if(e.length===0)return{rows:[],paintedRows:0};let r=Math.max(0,Math.min(t,e.length)),o=e.slice(0,e.length-r),i=e.slice(e.length-r),s=c=>c.flatMap(d=>Md(d,n).split(`
|
|
1846
1846
|
`)),a=s(i);return{rows:[...s(o),...a],paintedRows:a.length}}function uf(e,t){if(e.committedBand.length===0){e.bandReflowCache=null;return}let n=e.bandReflowCache;if(n!==null&&n.band===e.committedBand&&n.paintedRows===e.committedBandPaintedRows&&n.width===t)return;let{rows:r,paintedRows:o}=f9(e.committedBand,e.committedBandPaintedRows,t);e.committedBand=r,e.committedBandPaintedRows=o,e.bandReflowCache={band:r,paintedRows:o,width:t}}var g9="\x1B[?7l",h9="\x1B[?7h";function ga(e,t){let n=()=>{try{e.write(h9)}catch{}};try{e.write(g9)}catch{return}try{t()}finally{n()}}function f$(e,t){e.debugLog("commitAbove:enter",{textLen:t.length,anchorRow:e.anchorRow??null,committing:e.committing,topRow:e.logUpdate?.topRow??null});let n=M=>{e.scrollRegion?e.scrollRegion.withFullScrollRegion(M):M()};if(!e.armed||!e.logUpdate){n(()=>{e.stdout.write(t+`
|
|
@@ -2043,7 +2043,7 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
|
|
|
2043
2043
|
${T}${w}
|
|
2044
2044
|
${v}
|
|
2045
2045
|
${T}`})}return{fileBlocks:a,warnings:l}}async function TL(e,t,n,r,o="summary",i,s){let a=b$(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,m=!1,p=!1,g,h=!1,b=!1,y={abort:null},w=0,v=3e3,T=[],S=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,C=()=>{let N=r.subagentControl;N?.hasPromotableForeground()&&N.promoteActiveForeground().then(L=>{for(let B of L)(i??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${B.jobId}: ${B.label}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,j=()=>new xa({out:Ra(i),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(N=>{Ke()&&console.error(" "+f.error("session.interrupt() failed:"),N)})},...r.subagentControl?{onBackground:C}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},..._?{compositor:_}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=j(),k=async()=>{if(!m){m=!0;try{await P.dispose()}catch{}}},M=async()=>{await P.arm();let N=P.getCompositor();if(i&&N){let L=N;i.fn=B=>L.commitAbove(B),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(N),r.setInterruptNotifier?.(L=>P.setInterrupting(L)),r.rearmStatus?.()};try{_?_.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(O=>{Ke()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),O)});let I=r.subagentControl;I?.hasActiveForeground()&&I.cancelActiveForeground().catch(O=>{Ke()&&console.error(" "+f.error("soft-stop cancelActiveForeground() failed:"),O)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(I=>{Ke()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),I)})}),await M(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(C);let{fileBlocks:N,warnings:L}=EL(e.text,{rootDir:process.cwd()});for(let I of L)(i??{fn:console.log}).fn(f.dim(` @-file: ${I}`));let B=N.length>0||e.attachments.length>0?vL(e.text,e.attachments,void 0,N):e.text,H=t.sendMessageStream(B);if(await ms((I,O)=>{P.process(I,O)},async()=>{for await(let I of H){if(h||b)break;if(I.type==="chunk"&&I.chunk.type==="content"?(l+=I.chunk.content,d=!0):I.type==="message"&&!d&&(l=I.message.content),I.type==="stream_retry"&&(l=l.slice(0,c)),I.type==="chunk"&&I.chunk.type==="tool_use_detail"){let O=I.chunk,F={toolName:O.toolName,toolUseId:O.toolUseId,input:O.toolInput,...O.toolInputRaw!==void 0&&{inputRaw:O.toolInputRaw}};S.set(O.toolUseId,F),T.push(F)}else if(I.type==="chunk"&&I.chunk.type==="tool_result"){let O=I.chunk;c=l.length;let F=S.get(O.toolUseId);if(F&&(F.result=O.content,F.isError=O.isError,S.delete(O.toolUseId)),r.onContextProgress){let U=Date.now();if(U-w>=v){w=U;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){Ke()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),Y)}}}}if(I.type==="paused"){if(r.setPausedState?.(!0),await k(),_&&I.autoResume===!0){let O=new AbortController;y.abort=O;let F=I.resetsAt?I.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,U=F?`Keep waiting \u2014 auto-resumes at ${F}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",ne="Stop waiting",te=[f.warning(" \u23F3 Usage limit reached.")+(F?f.dim(` Auto-resumes at ${F}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];eg(_,{header:te,options:[U,Y,ne],signal:O.signal,initialIndex:0}).then(Z=>{if(y.abort=null,!Z)return;let K=Z[0];K===void 0||K===U||(b=!0,K===Y&&(i??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Ce=>{Ke()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),Ce)}))}).catch(Z=>{Ke()&&console.error(" "+f.error("picker promise rejected:"),Z)})}else(i??{fn:console.log}).fn(_E({reason:I.reason,...I.resetsAt!==void 0?{resetsAt:I.resetsAt}:{},...I.accountId!==void 0?{accountId:I.accountId}:{},...I.autoResume!==void 0?{autoResume:I.autoResume}:{}}));continue}if(I.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let O=I.hotSwapped&&I.accountId?`\u25B6 Resumed on ${I.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,T.length=0,S.clear(),p=!1,g=void 0,u=!1,P=j(),m=!1,await M(),(i??{fn:console.log}).fn(f.success(O));continue}if(I.type==="error"){await k(),Yi(qi(I.error)),u=!0;continue}P.process(I),I.type==="done"&&(p=!0,g=I.metadata)}}),await k(),h){let I=i?i.fn:console.log;I(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),I("")}if(b){let I=i?i.fn:console.log;I(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),I("")}if(p&&!h&&!b){ui(n,a,l,g,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Dm(process.stdout);let I=F=>{i?i.fn(F):console.log(F)},O=wL(l);if(O){if(I(SL(O)),I(""),r.onTerminalState)try{r.onTerminalState(O)}catch{}if(n.permissionMode==="autonomous"){let F=O.kind==="done"&&Vd().verifyDone===!0&&!K0(T);q0(O,void 0,{unverified:F})}}if($te(g,n,I),r.onAfterTurn){let F=r.onAfterTurn();F instanceof Promise&&await F.catch(()=>{})}}}catch(N){await k(),u||Yi(qi(N))}finally{await k(),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function $te(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ge(e.durationMs)),e.totalCostUsd!==void 0&&r.push(ct(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(le(o+i)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let s=dS(t),a=Gt(t.model);if(s>=1){let l=Math.round((s-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${le(l)} tok \u2014 model output may be silently truncated`))}else if(s>.5){let l=s>.8?f.error:f.warning;n(l(` context ${Math.round(s*100)}% used of ${le(a)}`))}n("")}var Dte=5e3;async function Fte(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function xL(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,p=null,g=[];e.session.current.waitForInitialization().then(async w=>{Ke()&&(p=Km(w)),await $f(e.session.current),Ke()&&(g=bF())}).catch(()=>{});let h,b=!1,y=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),g.length>0){for(let k of g)e.replRenderer.writeLine(k);e.replRenderer.writeLine(""),g=[]}let w=u.drainNotifications();for(let{job:k,result:M}of w){let N=M.errorReason===void 0?"\u2713":"\u2717",L=M.errorReason==="abort"?"killed":M.errorReason==="timeout"?"timed out":M.errorReason==="signal-killed"?"killed by signal":`exit ${M.exitCode??0}`,B=Math.max(0,Math.round(M.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${N} [${k.id}] ${L} \xB7 ${B}s \xB7 `)+k.command)}let v=m.drainNotifications();for(let{job:k}of v){let M=k.status==="completed"?"\u2713":k.status==="failed"?"\u2717":"\u2298",N=k.endedAt!==void 0?Math.max(0,Math.round((k.endedAt-k.startedAt)/100)/10):0,L=k.label.length>60?`${k.label.slice(0,60)}\u2026`:k.label;e.replRenderer.writeLine(f.dim(` ${M} [${k.jobId}] subagent ${k.status} \xB7 ${N}s \xB7 `)+L)}let T=l.renderIfChanged(e.stats.sessionId);if(T.length>0){for(let k of T)e.replRenderer.writeLine(k);e.replRenderer.writeLine("")}let S,R;if(h===void 0){let k=await e.session.current.takePendingPlanExitSeed();k!==void 0&&(h={text:k,attachments:[]})}if(h!==void 0){let k=h;h=void 0;let M=Ia(e.stats.permissionMode),N=wi({buffer:k.text,promptText:M,isTTY:!!process.stdout.isTTY,attachmentSummary:ha([...k.attachments])});e.replRenderer.writeLine(N),S=k.text.trim(),R=k.attachments}else{let k=await o.readLine({promptFn:()=>Ia(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{tg(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});S=k.text.trim(),R=k.attachments}if(!S&&R.length===0)continue;if(S.startsWith("!")){let k=/^(0|false|off|no)$/i.test(E.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!k&&(b||(b=!0,e.replRenderer.writeLine(f.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(S))){e.statusLine.rearm();continue}}let C=!1;if(S.startsWith("/")){let k=await D0(S,e.slashCtx,R);if(k.handled){if(k.result==="exit"){e.rl.close();return}if((S==="/clear"||S.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),d.reset()),k.result!==null&&typeof k.result=="object"&&"kind"in k.result&&k.result.kind==="submit"){h={text:k.result.message,attachments:R??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}C=!0}a.push(S),await Fte(e,S);let _=S;if(C){let k=cS(S);if(k){let M=k.name.replace(/^\//,"").split(":").pop()??"";if(M&&pv(M)){let N={skillName:M,rawArgs:k.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},L=e.session.current.sessionId,B=Ai(L),H=Date.now();W(`[afk trace] preflight.start commandName=${M}`);let $=!1,I=await Ri(N,{cwd:e.stats.cwd??process.cwd(),artifactDir:B},O=>{Ke()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${M}) failed: `)+(O instanceof Error?O.message:String(O)))});$=I!==null,W(`[afk trace] preflight.end commandName=${M} durationMs=${Date.now()-H} success=${$}`),_=fv(I?.manifestBlock,S)}}}let j=u.drainInjections();j.length>0&&(_=j+_);let P=m.drainInjections();if(P.length>0&&(_=P+_),e.hookRegistry)try{let k={event:"UserPromptSubmit",prompt:_,sessionId:e.stats.sessionId},M=await e.hookRegistry.dispatch(k);M.injectContext&&(_=M.injectContext+_)}catch(k){if(k instanceof he){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(k.reason?f.dim(`: ${qo(k.reason)}`):"")),e.statusLine.rearm();continue}if(k instanceof Dn){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${k.timeoutMs}ms`)),e.statusLine.rearm();continue}throw k}if(await TL({text:_,attachments:R},e.session.current,e.stats,{setInFlight(k){n.turnInFlight=k},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(k){await t.appendUser(k)},async onTurnComplete(k,M){if(await t.appendTurn(k,M),e.stats.sessionId)try{Vn(e.stats)}catch(N){y||(y=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(N instanceof Error?N.message:String(N))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:k=>d?.push(k),setActiveCompositor:k=>{n.activeCompositor=k},setInterruptNotifier:k=>{n.notifyInterrupting=k},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:k=>o.setBackgroundHandler(k),setSoftStopHandler:i,setPausedState:k=>o.setPausedState(k),setPauseInterruptHandler:k=>o.setPauseInterruptHandler(k),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Zn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:k=>c.repaint(k)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ia(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,Dte)}catch(k){if(k instanceof ut)throw k;k instanceof Dn?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):k instanceof he?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${qo(k.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(k))}}}function Lte(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 RL(e,t,n,r){let o=await nL(),i=new Qf({rl:e.rl,history:o,statusLine:e.statusLine}),s=Lte(E.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await lL(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=bL(e,n),await xL(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}ul();ws();import{execFile as Nte}from"node:child_process";import{dirname as Bte,isAbsolute as Ute,resolve as jte}from"node:path";import{promisify as Hte}from"node:util";var AL=Hte(Nte),Wte=3e3,Kte=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Gte(){let t=(await AL("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Ute(t)?t:jte(process.cwd(),t);return Bte(n)}async function CL(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Gte()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Wte)});try{let o=un({execFile:AL,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=>Kte.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Ud();ul();import{promises as qte}from"node:fs";import{dirname as zte,join as PL}from"node:path";import{randomBytes as Jte}from"node:crypto";var Vte=["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(`
|
|
2046
|
-
`),_L=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Lv=30,Yte=1024,Xte=8e3,Zte="haiku";async function Qte(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=rne(n,Yte),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Xte),s=t.signal?one([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await rs({token:t.token,model:t.model??Zte,system:Vte,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=ene(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=zte(t.worktreePath);return await tne(l,c)}function ene(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(_L.test(t)&&t.length<=Lv)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>Lv)break;o=s}return _L.test(o)?o:null}async function tne(e,t){if(!await nne(PL(t,e)))return e;let n=Jte(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Lv-5)}-${n}`}async function nne(e){try{return await qte.access(e),!0}catch{return!1}}function rne(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 one(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 ML(e){let t,n,r=PL(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Qte(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=`${Gd(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return IL(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 IL(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 IL(e,t){e&&e.setCwd(t),ine(t)}function ine(e){try{process.chdir(e)}catch{}}Jt();jt();G();import{spawn as $L}from"child_process";import{existsSync as DL,mkdirSync as dne,readFileSync as FL,unlinkSync as OL,writeFileSync as une}from"fs";import{get as pne}from"https";import{join as LL}from"path";import{readFileSync as sne}from"fs";import{dirname as ane,join as lne}from"path";import{fileURLToPath as cne}from"url";function Or(){try{return"5.
|
|
2046
|
+
`),_L=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Lv=30,Yte=1024,Xte=8e3,Zte="haiku";async function Qte(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=rne(n,Yte),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Xte),s=t.signal?one([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await rs({token:t.token,model:t.model??Zte,system:Vte,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=ene(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=zte(t.worktreePath);return await tne(l,c)}function ene(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(_L.test(t)&&t.length<=Lv)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>Lv)break;o=s}return _L.test(o)?o:null}async function tne(e,t){if(!await nne(PL(t,e)))return e;let n=Jte(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Lv-5)}-${n}`}async function nne(e){try{return await qte.access(e),!0}catch{return!1}}function rne(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 one(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 ML(e){let t,n,r=PL(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Qte(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=`${Gd(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return IL(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 IL(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 IL(e,t){e&&e.setCwd(t),ine(t)}function ine(e){try{process.chdir(e)}catch{}}Jt();jt();G();import{spawn as $L}from"child_process";import{existsSync as DL,mkdirSync as dne,readFileSync as FL,unlinkSync as OL,writeFileSync as une}from"fs";import{get as pne}from"https";import{join as LL}from"path";import{readFileSync as sne}from"fs";import{dirname as ane,join as lne}from"path";import{fileURLToPath as cne}from"url";function Or(){try{return"5.26.0"}catch{}try{let e=ane(cne(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(sne(lne(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}J();var mne=64*1024,fne=1440*60*1e3,gne=3600*1e3,hne="update-check.json",yne="pending-update.json";function NL(){return LL(bd(),hne)}function Vc(){return LL(bd(),yne)}function BL(){let e=bd();DL(e)||dne(e,{recursive:!0})}function bne(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 wne(){try{let e=FL(NL(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Sne(){try{BL();let e=`
|
|
2047
2047
|
const https = require('https');
|
|
2048
2048
|
const fs = require('fs');
|
|
2049
2049
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|