agent-afk 5.56.1 → 5.56.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@ export { AbortGraph } from './abort-graph.js';
7
7
  export { DEFAULT_SESSION_TIMEOUT_MS, RESET_DRAIN_TIMEOUT_MS, withTimeout } from './timeout.js';
8
8
  export { extractStructuredOutput } from './output-extractor.js';
9
9
  export { createHookRegistry } from './hooks.js';
10
- export { HookBlockedError } from '../utils/errors.js';
10
+ export { HookBlockedError, BudgetExceededError } from '../utils/errors.js';
11
11
  export { OpenAICompatibleProvider, openaiCompatibleProvider } from './providers/openai-compatible/index.js';
12
12
  export { providerForModel, resolveProvider } from './providers/index.js';
13
13
  export type { BundledProviderName } from './providers/index.js';
package/dist/cli.mjs CHANGED
@@ -869,7 +869,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
869
869
  Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:A});return}if(v===2){let A=Fs(h.trim());d({content:`grep error: ${A.content}`,isError:!0,...A.truncated?{truncated:!0}:{}});return}let E=Kn(g.trimEnd()),R=Fs(E);d({content:R.content,...R.truncated?{truncated:!0}:{}})}),f.on("error",v=>{let E;if(m===void 0&&lc(v))try{E=Ds(v,process.cwd())}catch{E=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${v.message}`}else E=Ds(v,m);d({content:`Failed to execute grep: ${E}`,isError:!0})})})}}var aA,lA=x(()=>{"use strict";Hn();Tr();oo();dw();uw();aA=vw()});import{promises as XJ}from"fs";function kw(e){return(t,n,r)=>QJ(t,n,r,e)}var QJ,cA,dA=x(()=>{"use strict";Tr();QJ=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=ln(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await XJ.readdir(s,{withFileTypes:!0}),l=a.filter(m=>m.isDirectory()).map(m=>`${m.name}/`),c=a.filter(m=>!m.isDirectory()).map(m=>m.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
870
870
  `)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};cA=kw()});function ZJ(e=Rs){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>uA)return{content:`Invalid input: message exceeds Telegram's ${uA}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=k.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=xs();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 uA,pA,mA=x(()=>{"use strict";K();br();qu();uA=4096;pA=ZJ()});async function eY(){let[{JSDOM:e},{Readability:t},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:e,Readability:t,turndown:r}}function tY(){return Ew===null&&(Ew=eY()),Ew}function fA(e){return e.replace(/\n{3,}/g,`
871
871
 
872
- `).trim()}function nY(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function gA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await tY(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=fA(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=fA(o.turndown(d));return{title:a,markdown:u,textLength:nY(c),usedFallback:!0}}var Ew,hA=x(()=>{"use strict";Ew=null});function oY(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 yA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function iY(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 Rp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??oY,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(!rY.has(u.status)||d===o)return u;let m=iY(u,s)??yA(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=yA(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 rY,Tw=x(()=>{"use strict";fe();rY=new Set([429,502,503,504])});import{readFileSync as sY}from"node:fs";import{join as aY}from"path";function lY(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function bA(e,t){return lY(t).test(e)}function uY(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(cY.has(t))return!0;if(dY.has(t))return!1}return!1}function wA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function pY(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 SA(e){let t=e===void 0||e.trim()===""?"default":e.trim();return $l(t),t}function mY(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function fY(e){try{return sY(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function gY(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=SA(t.defaultProfile)),n}function vA(e){let t=e?.env??k,n=e?.readFileSync??fY,r=e?.surface??t.AGENT_SURFACE,o=uY(t.AFK_BROWSER_HEADLESS,r),i=wA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=wA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=mY(t.AFK_BROWSER_DOM_SNAPSHOTS),l=pY(t.AFK_BROWSER_BACKEND),c=SA(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():aY(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=gY(d,g);return h.configPath=m,h}function xw(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(bA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>bA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var cY,dY,Rw=x(()=>{"use strict";K();G();cY=new Set(["daemon","subagent","telegram","afk"]),dY=new Set(["repl","interactive","cli"])});import ci from"node:fs";import Cp from"node:path";import{randomBytes as hY}from"node:crypto";import{chromium as yY}from"playwright";function bY(){try{return"5.56.1"}catch{}try{let e=Cp.resolve(import.meta.dirname,"../../../package.json"),t=ci.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var wY,Ap,kA=x(()=>{"use strict";G();fe();wY=bY(),Ap=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=yY.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/${wY}`}}loadStorageState(t){let n=Dl(t);try{if(!ci.existsSync(n))return;let r=JSON.parse(ci.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=Dl(t);if(!ci.existsSync(r))return;let o=await n.storageState(),i=Cp.join(Cp.dirname(r),`.${Cp.basename(r)}.${process.pid}.${hY(4).toString("hex")}.tmp`);ci.writeFileSync(i,JSON.stringify(o),{mode:384}),ci.chmodSync(i,384),ci.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 SY}from"crypto";function Cw(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of vY)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function EA(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&kY.test(e.label))}function TA(e){return SY("sha256").update(e,"utf8").digest("hex").slice(0,8)}function xA(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var vY,kY,pc=x(()=>{"use strict";vY=[{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}];kY=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as EY}from"node:crypto";function TY(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function xY(e,t,n){return`el_${EY("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function RY(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function RA(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AA(e,t){let n=e.role??"",r=e.name??"";CA.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])AA(i,t)}async function CY(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},_A).catch(()=>[])}async function AY(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,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},_A).catch(()=>[])}function _Y(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function _p(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=_Y(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=CY(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],AA(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await AY(e)).filter(B=>CA.has(B.role??"")));let w=new Map;for(let P of m){let B=RA(P.name),j=w.get(B);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(B,P)}let S=y.map(P=>({ax:P,dom:w.get(RA(P.name??""))})),v=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,B)=>{let j=P.dom?.bbox.y??0,U=B.dom?.bbox.y??0;if(j!==U)return j-U;let I=P.dom?.bbox.x??0,D=B.dom?.bbox.x??0;return I-D}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=v.slice(0,n).map((P,B)=>{let j=P.ax.role??"generic",U=P.ax.name??"",I=xY(j,U,B),D=P.dom?.bbox??{x:0,y:0,w:0,h:0},F=P.dom?.type??null,M=null;P.ax.value!==void 0&&P.ax.value!==null&&(M=String(P.ax.value)),P.ax.checked!==void 0&&(M=String(P.ax.checked)),EA({role:j,kind:F})&&(M="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let H={id:I,role:j,label:TY(U),kind:F,value:M,state:O,bbox:D};return $!==void 0&&(H.selector=$),H}),A="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?A="loading":P==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=RY(f),N=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var CA,_A,IA=x(()=>{"use strict";pc();CA=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);_A="a[href], button, input, select, textarea, [role], [tabindex], label"});async function PA(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 Aw(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>PA(e,i)))).filter(o=>o!==null)}async function IY(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 _w(e,t,n){switch(t.kind){case"element_id":return PY(e,t,n);case"selector":return MY(e,t);case"semantic":return OY(e,t)}}async function PY(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 Aw(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function MY(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 Aw(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function OY(e,t){return t.role!==void 0?$Y(e,t.text,t.role):DY(e,t.text,t)}async function $Y(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 Aw(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function DY(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 IY(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),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await PA(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let v=0;v<w.length;v++)S=S*31+w.charCodeAt(v)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var MA=x(()=>{"use strict"});import{randomBytes as FY}from"crypto";import{mkdir as LY,stat as NY,writeFile as BY}from"fs/promises";import{join as Iw}from"path";import{gzip as UY}from"zlib";import{promisify as jY}from"util";function HY(e){return Iw(qo(e),"browser")}function WY(e){return Iw(HY(e),"screenshots")}function KY(){return new Date().toISOString().replace(/[:.]/g,"-")}function GY(){return FY(3).toString("hex")}async function Pw(e,t,n){if(t.length>OA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${OA} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=WY(e);await LY(r,{recursive:!0});let o=`${KY()}-${GY()}-${n}.png`,i=Iw(r,o);await BY(i,t);let{size:s}=await NY(i);return{path:i,bytes:s}}var Ake,OA,$A=x(()=>{"use strict";G();pc();Ake=jY(UY);OA=5*1024*1024});var FA={};ru(FA,{PlaywrightProvider:()=>Mw});function DA(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 Mw,LA=x(()=>{"use strict";kA();IA();MA();Rw();pc();$A();Mw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ap(t)}async open(t){let n=xw(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 _p(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 _p(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 _w(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${DA(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=Cw(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(y){c=y}else c=h}let u=r.url();if(u!==i){let h=xw(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 f=await _p(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,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await _w(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${DA(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 Pw(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 Pw(n,o,r);return i}catch{return null}}}});var ui={};ru(ui,{__resetBrowserRegistryForTests:()=>VY,browserProviderActive:()=>JY,closeBrowserProvider:()=>Ow,getBrowserProvider:()=>zY,peekBrowserProvider:()=>YY});function NA(){Promise.resolve(Ow()).then(()=>{process.exit(130)})}function BA(){Promise.resolve(Ow()).then(()=>{process.exit(143)})}function UA(){Gn=null}function qY(){Ip||(process.on("SIGINT",NA),process.on("SIGTERM",BA),process.on("exit",UA),Ip=!0)}function jA(){Ip&&(process.removeListener("SIGINT",NA),process.removeListener("SIGTERM",BA),process.removeListener("exit",UA),Ip=!1)}async function zY(e){return Gn!==null?Gn:(di!==null||(di=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(LA(),FA)),n=vA(e),r=new t(n);return qY(),Gn=r,di=null,r})()),di)}async function Ow(){if(Gn===null)return;let e=Gn;Gn=null,di=null,jA(),await e.shutdown()}function JY(){return Gn!==null}function YY(){return Gn}function VY(){Gn=null,di=null,jA()}var Gn,di,Ip,pi=x(()=>{"use strict";Rw();Gn=null,di=null,Ip=!1});async function HA(e,t){try{return await gA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function nV(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(pi(),ui));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function WA(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??nV,o=null,i=e,s=null,a=null;try{let c=await Rp(n,e,{headers:tV,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(eV.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(ZY.test(d)&&!QY.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await HA(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}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<200)&&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=await HA(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");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 QY,ZY,eV,tV,KA=x(()=>{"use strict";hA();Tw();fe();QY=/(text\/html|application\/xhtml\+xml)/i,ZY=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,eV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,tV={"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 iV(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(rV,{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),oV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Er(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 GA(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?iV({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 qA(e,t){if(t.length===0)return`# Search results for "${e}"
872
+ `).trim()}function nY(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function gA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await tY(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=fA(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=fA(o.turndown(d));return{title:a,markdown:u,textLength:nY(c),usedFallback:!0}}var Ew,hA=x(()=>{"use strict";Ew=null});function oY(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 yA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function iY(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 Rp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??oY,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(!rY.has(u.status)||d===o)return u;let m=iY(u,s)??yA(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=yA(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 rY,Tw=x(()=>{"use strict";fe();rY=new Set([429,502,503,504])});import{readFileSync as sY}from"node:fs";import{join as aY}from"path";function lY(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function bA(e,t){return lY(t).test(e)}function uY(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(cY.has(t))return!0;if(dY.has(t))return!1}return!1}function wA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function pY(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 SA(e){let t=e===void 0||e.trim()===""?"default":e.trim();return $l(t),t}function mY(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function fY(e){try{return sY(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function gY(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=SA(t.defaultProfile)),n}function vA(e){let t=e?.env??k,n=e?.readFileSync??fY,r=e?.surface??t.AGENT_SURFACE,o=uY(t.AFK_BROWSER_HEADLESS,r),i=wA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=wA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=mY(t.AFK_BROWSER_DOM_SNAPSHOTS),l=pY(t.AFK_BROWSER_BACKEND),c=SA(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():aY(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=gY(d,g);return h.configPath=m,h}function xw(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(bA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>bA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var cY,dY,Rw=x(()=>{"use strict";K();G();cY=new Set(["daemon","subagent","telegram","afk"]),dY=new Set(["repl","interactive","cli"])});import ci from"node:fs";import Cp from"node:path";import{randomBytes as hY}from"node:crypto";import{chromium as yY}from"playwright";function bY(){try{return"5.56.2"}catch{}try{let e=Cp.resolve(import.meta.dirname,"../../../package.json"),t=ci.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var wY,Ap,kA=x(()=>{"use strict";G();fe();wY=bY(),Ap=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=yY.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/${wY}`}}loadStorageState(t){let n=Dl(t);try{if(!ci.existsSync(n))return;let r=JSON.parse(ci.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=Dl(t);if(!ci.existsSync(r))return;let o=await n.storageState(),i=Cp.join(Cp.dirname(r),`.${Cp.basename(r)}.${process.pid}.${hY(4).toString("hex")}.tmp`);ci.writeFileSync(i,JSON.stringify(o),{mode:384}),ci.chmodSync(i,384),ci.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 SY}from"crypto";function Cw(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of vY)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function EA(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&kY.test(e.label))}function TA(e){return SY("sha256").update(e,"utf8").digest("hex").slice(0,8)}function xA(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var vY,kY,pc=x(()=>{"use strict";vY=[{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}];kY=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as EY}from"node:crypto";function TY(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function xY(e,t,n){return`el_${EY("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function RY(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function RA(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AA(e,t){let n=e.role??"",r=e.name??"";CA.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])AA(i,t)}async function CY(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},_A).catch(()=>[])}async function AY(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,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},_A).catch(()=>[])}function _Y(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function _p(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=_Y(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=CY(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],AA(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await AY(e)).filter(B=>CA.has(B.role??"")));let w=new Map;for(let P of m){let B=RA(P.name),j=w.get(B);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(B,P)}let S=y.map(P=>({ax:P,dom:w.get(RA(P.name??""))})),v=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,B)=>{let j=P.dom?.bbox.y??0,U=B.dom?.bbox.y??0;if(j!==U)return j-U;let I=P.dom?.bbox.x??0,D=B.dom?.bbox.x??0;return I-D}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=v.slice(0,n).map((P,B)=>{let j=P.ax.role??"generic",U=P.ax.name??"",I=xY(j,U,B),D=P.dom?.bbox??{x:0,y:0,w:0,h:0},F=P.dom?.type??null,M=null;P.ax.value!==void 0&&P.ax.value!==null&&(M=String(P.ax.value)),P.ax.checked!==void 0&&(M=String(P.ax.checked)),EA({role:j,kind:F})&&(M="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let H={id:I,role:j,label:TY(U),kind:F,value:M,state:O,bbox:D};return $!==void 0&&(H.selector=$),H}),A="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?A="loading":P==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=RY(f),N=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var CA,_A,IA=x(()=>{"use strict";pc();CA=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);_A="a[href], button, input, select, textarea, [role], [tabindex], label"});async function PA(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 Aw(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>PA(e,i)))).filter(o=>o!==null)}async function IY(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 _w(e,t,n){switch(t.kind){case"element_id":return PY(e,t,n);case"selector":return MY(e,t);case"semantic":return OY(e,t)}}async function PY(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 Aw(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function MY(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 Aw(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function OY(e,t){return t.role!==void 0?$Y(e,t.text,t.role):DY(e,t.text,t)}async function $Y(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 Aw(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function DY(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 IY(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),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await PA(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let v=0;v<w.length;v++)S=S*31+w.charCodeAt(v)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var MA=x(()=>{"use strict"});import{randomBytes as FY}from"crypto";import{mkdir as LY,stat as NY,writeFile as BY}from"fs/promises";import{join as Iw}from"path";import{gzip as UY}from"zlib";import{promisify as jY}from"util";function HY(e){return Iw(qo(e),"browser")}function WY(e){return Iw(HY(e),"screenshots")}function KY(){return new Date().toISOString().replace(/[:.]/g,"-")}function GY(){return FY(3).toString("hex")}async function Pw(e,t,n){if(t.length>OA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${OA} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=WY(e);await LY(r,{recursive:!0});let o=`${KY()}-${GY()}-${n}.png`,i=Iw(r,o);await BY(i,t);let{size:s}=await NY(i);return{path:i,bytes:s}}var Ake,OA,$A=x(()=>{"use strict";G();pc();Ake=jY(UY);OA=5*1024*1024});var FA={};ru(FA,{PlaywrightProvider:()=>Mw});function DA(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 Mw,LA=x(()=>{"use strict";kA();IA();MA();Rw();pc();$A();Mw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ap(t)}async open(t){let n=xw(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 _p(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 _p(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 _w(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${DA(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=Cw(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(y){c=y}else c=h}let u=r.url();if(u!==i){let h=xw(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 f=await _p(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,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await _w(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${DA(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 Pw(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 Pw(n,o,r);return i}catch{return null}}}});var ui={};ru(ui,{__resetBrowserRegistryForTests:()=>VY,browserProviderActive:()=>JY,closeBrowserProvider:()=>Ow,getBrowserProvider:()=>zY,peekBrowserProvider:()=>YY});function NA(){Promise.resolve(Ow()).then(()=>{process.exit(130)})}function BA(){Promise.resolve(Ow()).then(()=>{process.exit(143)})}function UA(){Gn=null}function qY(){Ip||(process.on("SIGINT",NA),process.on("SIGTERM",BA),process.on("exit",UA),Ip=!0)}function jA(){Ip&&(process.removeListener("SIGINT",NA),process.removeListener("SIGTERM",BA),process.removeListener("exit",UA),Ip=!1)}async function zY(e){return Gn!==null?Gn:(di!==null||(di=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(LA(),FA)),n=vA(e),r=new t(n);return qY(),Gn=r,di=null,r})()),di)}async function Ow(){if(Gn===null)return;let e=Gn;Gn=null,di=null,jA(),await e.shutdown()}function JY(){return Gn!==null}function YY(){return Gn}function VY(){Gn=null,di=null,jA()}var Gn,di,Ip,pi=x(()=>{"use strict";Rw();Gn=null,di=null,Ip=!1});async function HA(e,t){try{return await gA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function nV(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(pi(),ui));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function WA(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??nV,o=null,i=e,s=null,a=null;try{let c=await Rp(n,e,{headers:tV,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(eV.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(ZY.test(d)&&!QY.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await HA(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}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<200)&&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=await HA(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");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 QY,ZY,eV,tV,KA=x(()=>{"use strict";hA();Tw();fe();QY=/(text\/html|application\/xhtml\+xml)/i,ZY=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,eV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,tV={"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 iV(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(rV,{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),oV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Er(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 GA(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?iV({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 qA(e,t){if(t.length===0)return`# Search results for "${e}"
873
873
 
874
874
  (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(`
875
875
  `).trimEnd()}var rV,oV,zA=x(()=>{"use strict";oo();rV="https://api.exa.ai/search",oV=10});function mV(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=sV;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,aV)}let a=lV;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,cV)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function $w(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+dV}function fV(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 pV.some(o=>r.includes(o))}function gV(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=mV(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 Rp(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(f){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,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(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:$w(m,i.maxBytes)}}if(i.mode==="markdown")try{let u=await WA(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:$w(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),f=fV(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let d=GA({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:uV,timeoutMs:i.timeoutMs,signal:s.signal});return{content:$w(qA(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 sV,aV,lV,cV,dV,uV,pV,JA,YA=x(()=>{"use strict";KA();zA();Tw();sV=3e4,aV=12e4,lV=1e6,cV=1e7,dV=`
@@ -1493,7 +1493,7 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
1493
1493
  `)+`
1494
1494
  `);let c=l.length;function d(){let u=a();process.stdout.write(`\x1B[${c}A\x1B[0J`+u.join(`
1495
1495
  `)+`
1496
- `),c=u.length}return new Promise(u=>{process.stdin.setRawMode(!0),_i(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:y}=s();r>=y&&o++,d()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),d()):h.name==="return"||h.name==="enter"?(f(),u([...i].sort((y,b)=>y-b))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(f(),u(":cancel"))};function f(){process.stdin.removeListener("keypress",m);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",m)})}function nk(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 rk(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 Pi={action:"skip"};function ug(e){let t=[];return t.push(p.warning(" \u{1F4AC} Agent question")),t.push(p.bold(" ? "+de(e.message,512))),e.context&&t.push(p.dim(" "+de(e.context,512))),t.push(""),t}async function XQ(e,t,n,r){let o=ug(t),i=t.allowSkip===!0;if(e==="number"){let d=t.min,u=t.max,f=`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:f,validate:b=>{let w=nk(b.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 y=h.trim();return y===""&&i?{tag:"skip"}:{tag:"number",value:Number(y)}}let s=t.minLength,a=t.maxLength,c=await n({header:o,validate:d=>{let u=rk(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 UD(e,t,n){if(n.aborted)return Io;let{readLine:r,writer:o,pendingCount:i,pickFromList:s,readTextOverlay:a}=t,l=e.type??"text",c=i();if(c>1&&o.line(p.dim(` [${c} questions queued]`)),(l==="choice"||l==="multi_choice")&&s&&(e.choices?.length??0)>0){let m=(e.choices??[]).map(h=>de(h,128));e.allowCustom&&m.push(Ii);let f;try{f=await s({header:ug(e),options:m,multi:l==="multi_choice",signal:n})}catch(h){return W("[elicitation] choice/multi_choice pickFromList failed:",h),re}if(n.aborted)return re;if(f===null)return re;if(e.allowCustom&&f.includes(Ii)){if(!a)return re;let h=await a({header:ug(e),help:"Type your custom answer (Esc to cancel)",validate:y=>y.trim()===""?"Please enter a non-empty answer":null,signal:n});return h===null?re:(o.line(p.dim(" \u270E ")+p.brand(de(h,256))),{action:"accept",content:{value:null,custom_value:h}})}if(f.length===0)return e.allowSkip?Pi:re;let g=f.length===1?de(f[0]??"",128):f.map(h=>de(h,128)).join(", ");return o.line(p.dim(" \u2713 ")+p.brand(g)),l==="choice"?{action:"accept",content:{value:f[0]}}:{action:"accept",content:{value:[...f]}}}if(l==="confirm"&&s){let f=e.questionDefault!==!1?["Yes","No"]:["No","Yes"],g;try{g=await s({header:ug(e),options:f,multi:!1,signal:n})}catch(b){return W("[elicitation] confirm pickFromList failed:",b),re}if(n.aborted)return re;if(g===null)return re;let h=g[0];if(h===void 0)return re;let y=h==="Yes";return o.line(p.dim(" \u2713 ")+(y?p.success("Yes"):p.error("No"))),{action:"accept",content:{value:y}}}if((l==="text"||l==="number")&&a){let m=await XQ(l,e,a,n);if(m===null)return re;if(m.tag==="skip")return Pi;let f=m.tag==="text"?de(m.value,256):String(m.value);return o.line(p.dim(" \u2713 ")+p.brand(f)),{action:"accept",content:{value:m.value}}}if(o.line(),o.line(p.warning("\u{1F4AC} Agent question")),e.context&&o.line(p.dim(" context: ")+de(e.context,512)),o.line(p.bold(" "+de(e.message,512))),o.line(p.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 re;let f;try{f=(await r(p.dim(` Continue? [${m}] `))).trim().toLowerCase()}catch(g){return W("[elicitation] confirm readLine failed:",g),re}if(n.aborted)return re;if(f===":cancel")return re;if(f==="")return{action:"accept",content:{value:e.questionDefault===!0}};if(f==="y"||f==="yes")return{action:"accept",content:{value:!0}};if(f==="n"||f==="no")return{action:"accept",content:{value:!1}};o.line(p.warning(" Please enter y or n."))}}if(l==="choice"){o.line("\x07");let m=e.choices??[],f=e.allowCustom?[...m,Ii]:m,g=await ND(f,n);if(g!==null){if(g===":cancel")return re;if(e.allowCustom&&g===m.length){let y;try{y=(await r(p.dim(" Type your answer: "))).trim()}catch(b){return W("[elicitation] custom-answer readLine failed:",b),re}return y===":cancel"||n.aborted?re:{action:"accept",content:{value:null,custom_value:y}}}let h=m[g];return h!==void 0?(o.line(p.dim(` Selected: ${de(h,128)}`)),{action:"accept",content:{value:h}}):(W("[elicitation] choice selector returned an out-of-range index:",{selectorResult:g,choicesLength:m.length}),re)}for(m.forEach((h,y)=>{o.line(` ${y+1}. ${de(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${Ii}`);;){if(n.aborted)return re;let h;try{h=(await r(p.dim(" Enter number: "))).trim()}catch(b){return W("[elicitation] choice readLine failed:",b),re}if(n.aborted)return re;if(h===":cancel")return re;if(e.allowCustom&&h===String(m.length+1)){let b;try{b=(await r(p.dim(" Type your answer: "))).trim()}catch(w){return W("[elicitation] custom-answer readLine failed:",w),re}return b===":cancel"?re:{action:"accept",content:{value:null,custom_value:b}}}if(h===""&&e.allowSkip)return Pi;let y=parseInt(h,10);if(!isFinite(y)||String(y)!==h||y<1||y>m.length){o.line(p.warning(` Please enter a number between 1 and ${m.length+(e.allowCustom?1:0)}.`));continue}return{action:"accept",content:{value:m[y-1]}}}}if(l==="multi_choice"){o.line("\x07");let m=e.choices??[],f=e.allowCustom?[...m,Ii]:m,g=await BD(f,n);if(g!==null){if(g===":cancel")return re;if(e.allowCustom&&g.includes(m.length)){let h;try{h=(await r(p.dim(" Type your answer: "))).trim()}catch(y){return W("[elicitation] custom-answer readLine failed:",y),re}return h===":cancel"||n.aborted?re:{action:"accept",content:{value:null,custom_value:h}}}if(g.length===0&&e.allowSkip)return Pi;if(g.length>0){let h=g.map(y=>m[y]);return o.line(p.dim(` Selected: ${h.map(y=>de(y,64)).join(", ")}`)),{action:"accept",content:{value:h}}}}for(m.forEach((h,y)=>{o.line(` ${y+1}. ${de(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${Ii}`);;){if(n.aborted)return re;let h;try{h=(await r(p.dim(" Enter numbers (comma-separated): "))).trim()}catch(S){return W("[elicitation] multi_choice readLine failed:",S),re}if(n.aborted)return re;if(h===":cancel")return re;if(e.allowCustom&&h===String(m.length+1)){let S;try{S=(await r(p.dim(" Type your answer: "))).trim()}catch(v){return W("[elicitation] custom-answer readLine failed:",v),re}return S===":cancel"?re:{action:"accept",content:{value:null,custom_value:S}}}if(h===""&&e.allowSkip)return Pi;if(h===""){o.line(p.warning(" Please enter at least one selection."));continue}let y=h.split(",").map(S=>S.trim()),b=[],w=!0;for(let S of y){let v=parseInt(S,10);if(!isFinite(v)||String(v)!==S||v<1||v>m.length){o.line(p.warning(` Invalid selection "${de(S,32)}". Enter numbers between 1 and ${m.length+(e.allowCustom?1:0)}.`)),w=!1;break}b.push(m[v-1])}if(w)return{action:"accept",content:{value:b}}}}if(l==="number"){let m=e.min,f=e.max,g=m!==void 0&&f!==void 0?` [${m}\u2013${f}]`:m!==void 0?` [\u2265${m}]`:f!==void 0?` [\u2264${f}]`:"";for(;;){if(n.aborted)return re;let h;try{h=(await r(p.dim(` Enter a number${g}: `))).trim()}catch(b){return W("[elicitation] number readLine failed:",b),re}if(n.aborted)return re;if(h===":cancel")return re;let y=nk(h,{allowSkip:e.allowSkip===!0,min:m,max:f,emptyError:"Please enter a number (or :cancel to skip)."});if(!y.ok){o.line(p.warning(" "+y.error));continue}return y.skip?Pi:{action:"accept",content:{value:y.value}}}}let d=e.minLength,u=e.maxLength;for(;;){if(n.aborted)return re;let m;try{m=(await r(p.dim(" > "))).trim()}catch(g){return W("[elicitation] text readLine failed:",g),re}if(n.aborted)return re;if(m===":cancel")return re;let f=rk(m,{allowSkip:e.allowSkip===!0,minLength:d,maxLength:u,emptyError:"Please enter a response (or type :cancel to skip)."});if(!f.ok){o.line(p.warning(" "+f.error));continue}return f.skip?Pi:{action:"accept",content:{value:m}}}}function sd(e){return async(t,{signal:n})=>{if(n.aborted)return Io;Fa(process.stdout),e.suspendInput?.();try{if(t.origin==="agent")return await UD(t,e,n);if(t.mode==="form"){let o=t.requestedSchema,{properties:i,required:s,fieldsTruncated:a,originalFieldCount:l}=typeof o=="object"&&o!==null?$D(o):{properties:{},required:new Set,fieldsTruncated:!1,originalFieldCount:0};DD(e.writer,t),a&&e.writer.line(p.warning(` \u26A0 Schema has ${l} fields; only the first ${cg} will be prompted (server may be malformed or compromised).`));let c=Object.create(null);if(Object.keys(i).length===0)return e.writer.line(p.warning(" \u26A0 Form schema has no usable fields \u2014 declining.")),Io;for(let d of s)if(!(d in i))return e.writer.line(p.warning(` \u26A0 Required field '${de(d,64)}' has no schema entry \u2014 declining.`)),Io;for(let[d,u]of Object.entries(i)){if(n.aborted)return re;let m=await FD(d,u,s.has(d),e.readLine,e.writer,n,e.pickFromList);if(m.tag==="cancel")return re;if(m.tag==="decline")return Io;m.value!==void 0&&!dg.has(d)&&(c[d]=m.value)}return{action:"accept",content:{...c}}}LD(e.writer,t);let r;try{r=(await e.readLine(p.dim("Continue? [y/N] "))).trim().toLowerCase()}catch(o){return W("[elicitation] url-mode readLine failed:",o),re}return r===""?re:r==="y"||r==="yes"?OD:Io}finally{e.resumeInput?.()}}}sa();_t();Cn();Ut();import{basename as HD,dirname as QQ}from"node:path";function jD(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?p.error:t>.5?p.warning:p.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=ce(e.used)+"/"+ce(e.limit));let c=l?`${s} ${a} ${l}`:`${s} ${a}`,d=`${s} ${a}`,u=`ctx ${a}`,m=e.sparkline?p.meta(e.sparkline)+" ":"",f=e.sparkline?X(e.sparkline)+1:0,g=Math.max(0,e.width-f);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 ie(h,e.width)}return n(a)}K();var pg=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&&!ft()}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=je.subscribe(()=>{this.onResize()}),this.resizeImmediateUnsub=je.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&&HD(QQ(t.cwd))===".afk-worktrees"&&t.branch.replaceAll("/","-")===HD(t.cwd)&&X(t.branch)<=30){let l=ie(t.branch,30),c=`${p.dim("\u2387")} ${p.dim(l)}`;t.pr!==void 0&&(c+=` ${p.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}else{if(t.cwd){let l=Math.max(8,Math.floor(r*.4)),c=id(t.cwd,{maxWidth:l});c&&n.push({text:p.dim(c)})}if(t.branch){let l=ie(t.branch,30),c=`${p.dim("\u2387")} ${p.dim(l)}`;t.pr!==void 0&&(c+=` ${p.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}}if(n.push({text:p.brand(t.model)}),t.permissionMode==="plan"?n.push({text:p.warning("\u25CF plan")}):t.permissionMode==="autonomous"?n.push({text:p.info("\u25D0 AFK")}):t.permissionMode==="bypassPermissions"?n.push({text:p.bypass("\u26A1 bypass")}):t.permissionMode==="default"&&n.push({text:p.success("\u25CB default")}),t.contextPct!==void 0){let l=jD({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:p.meta(`$${t.cost.toFixed(2)}`),droppablePriority:3}),t.tokens!==void 0&&n.push({text:p.meta(`${ZQ(t.tokens)} tok`),droppablePriority:4});let i=p.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 ie(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 ZQ(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}import{execFile as eZ}from"node:child_process";import{promisify as tZ}from"node:util";var nZ=tZ(eZ);function rZ(e){return(t,n,r)=>nZ(t,n,{cwd:r,timeout:e,killSignal:"SIGTERM",maxBuffer:64*1024}).then(o=>({stdout:o.stdout,stderr:o.stderr}))}var mg=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??rZ(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 zf((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 Yt=new Map,Mi=new Map;function ve(e){if(Yt.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);Yt.set(e.name,e);for(let t of e.aliases??[]){if(Mi.has(t)||Yt.has(t))throw new Error(`Slash alias collides: ${t}`);Mi.set(t,e.name)}}function Po(e){if(Yt.has(e.name)){for(let[t,n]of Mi.entries())n===e.name&&Mi.delete(t);Yt.delete(e.name)}ve(e)}function WD(e){Yt.has(e.name)||ve(e)}function KD(){Yt.clear(),Mi.clear()}function at(){return[...Yt.values()].sort((e,t)=>e.name.localeCompare(t.name))}function La(){let e=[];for(let[t,n]of Mi.entries()){let r=Yt.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function oZ(e){if(Yt.has(e))return Yt.get(e);let t=Mi.get(e);return t?Yt.get(t):void 0}function iZ(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 sZ(e,t=3){let n;for(let r of Yt.keys()){let o=iZ(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function ok(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 GD(e,t,n){let r=ok(e);if(r===null)return{handled:!1};let o=oZ(r.name);if(!o){let a=sZ(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 uZ from"ora";import{statSync as aZ}from"node:fs";qs();function qD(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 fg(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 lZ(e){try{return aZ(e).isDirectory()}catch{return!1}}function YD(e,t){if(e!==void 0)return e;if(t!==void 0&&lZ(t))return t}function gg(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=JD(zD(r.user),80),i=JD(dZ(zD(r.assistant)),120);o.length>0&&t.fn(p.dim(` Last: ${o}`)),i.length>0&&t.fn(p.dim(` \u21B3 ${i}`)),t.fn(p.dim(" \u21AA /history for full review"))}function zD(e){return e.replace(cZ,"").replace(/\s+/g," ").trim()}var cZ=/\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 dZ(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function JD(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}var ad={stream:process.stdout,hideCursor:!1,discardStdin:!1};function ik(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 rr(e,t,n){let r=ik(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=qD(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}:{}}}Ue();var pZ={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"}},mZ={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(),X$(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"}},fZ={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=uZ({text:p.meta("Summarizing earlier turns..."),...ad}).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 dt)throw n;if(n instanceof me)return e.out.info(`Compaction skipped: ${n.reason??"blocked by hook"}`),"continue";e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},gZ={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=at(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(p.bold(p.brand("Commands"))),e.out.line(ye());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${p.warning(o)}${i} ${p.dim(r.summary)}`)}return e.out.line(),e.out.line(p.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(p.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},VD=[pZ,mZ,fZ,gZ];function sk(e,t=30){return!e||e.length===0?p.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${p.dim(`+${e.length-t} more`)}`}function mn(e,t){return` ${p.label(e.padEnd(16))} ${t}`}function hg(e){let t=[];t.push(" "+ye("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})`,sk(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):p.dim("(none)");t.push(mn(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(mn(`skills (${i})`,sk(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):p.dim("(none)");t.push(mn(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(mn(`slash (${l})`,sk(e.slashCommands))),t.push(" "+ye()),t.join(`
1496
+ `),c=u.length}return new Promise(u=>{process.stdin.setRawMode(!0),_i(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:y}=s();r>=y&&o++,d()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),d()):h.name==="return"||h.name==="enter"?(f(),u([...i].sort((y,b)=>y-b))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(f(),u(":cancel"))};function f(){process.stdin.removeListener("keypress",m);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",m)})}function nk(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 rk(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 Pi={action:"skip"};function ug(e){let t=[];return t.push(p.warning(" \u{1F4AC} Agent question")),t.push(p.bold(" ? "+de(e.message,512))),e.context&&t.push(p.dim(" "+de(e.context,512))),t.push(""),t}async function XQ(e,t,n,r){let o=ug(t),i=t.allowSkip===!0;if(e==="number"){let d=t.min,u=t.max,f=`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:f,validate:b=>{let w=nk(b.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 y=h.trim();return y===""&&i?{tag:"skip"}:{tag:"number",value:Number(y)}}let s=t.minLength,a=t.maxLength,c=await n({header:o,validate:d=>{let u=rk(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 UD(e,t,n){if(n.aborted)return Io;let{readLine:r,writer:o,pendingCount:i,pickFromList:s,readTextOverlay:a}=t,l=e.type??"text",c=i();if(c>1&&o.line(p.dim(` [${c} questions queued]`)),(l==="choice"||l==="multi_choice")&&s&&(e.choices?.length??0)>0){let m=(e.choices??[]).map(h=>de(h,128));e.allowCustom&&m.push(Ii);let f;try{f=await s({header:ug(e),options:m,multi:l==="multi_choice",signal:n})}catch(h){return W("[elicitation] choice/multi_choice pickFromList failed:",h),re}if(n.aborted)return re;if(f===null)return re;if(e.allowCustom&&f.includes(Ii)){if(!a)return re;let h=await a({header:ug(e),help:"Type your custom answer (Esc to cancel)",validate:y=>y.trim()===""?"Please enter a non-empty answer":null,signal:n});return h===null?re:(o.line(p.dim(" \u270E ")+p.brand(de(h,256))),{action:"accept",content:{value:null,custom_value:h}})}if(f.length===0)return e.allowSkip?Pi:re;let g=f.length===1?de(f[0]??"",128):f.map(h=>de(h,128)).join(", ");return o.line(p.dim(" \u2713 ")+p.brand(g)),l==="choice"?{action:"accept",content:{value:f[0]}}:{action:"accept",content:{value:[...f]}}}if(l==="confirm"&&s){let f=e.questionDefault!==!1?["Yes","No"]:["No","Yes"],g;try{g=await s({header:ug(e),options:f,multi:!1,signal:n})}catch(b){return W("[elicitation] confirm pickFromList failed:",b),re}if(n.aborted)return re;if(g===null)return re;let h=g[0];if(h===void 0)return re;let y=h==="Yes";return o.line(p.dim(" \u2713 ")+(y?p.success("Yes"):p.error("No"))),{action:"accept",content:{value:y}}}if((l==="text"||l==="number")&&a){let m=await XQ(l,e,a,n);if(m===null)return re;if(m.tag==="skip")return Pi;let f=m.tag==="text"?de(m.value,256):String(m.value);return o.line(p.dim(" \u2713 ")+p.brand(f)),{action:"accept",content:{value:m.value}}}if(o.line(),o.line(p.warning("\u{1F4AC} Agent question")),e.context&&o.line(p.dim(" context: ")+de(e.context,512)),o.line(p.bold(" "+de(e.message,512))),o.line(p.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 re;let f;try{f=(await r(p.dim(` Continue? [${m}] `))).trim().toLowerCase()}catch(g){return W("[elicitation] confirm readLine failed:",g),re}if(n.aborted)return re;if(f===":cancel")return re;if(f==="")return{action:"accept",content:{value:e.questionDefault===!0}};if(f==="y"||f==="yes")return{action:"accept",content:{value:!0}};if(f==="n"||f==="no")return{action:"accept",content:{value:!1}};o.line(p.warning(" Please enter y or n."))}}if(l==="choice"){o.line("\x07");let m=e.choices??[],f=e.allowCustom?[...m,Ii]:m,g=await ND(f,n);if(g!==null){if(g===":cancel")return re;if(e.allowCustom&&g===m.length){let y;try{y=(await r(p.dim(" Type your answer: "))).trim()}catch(b){return W("[elicitation] custom-answer readLine failed:",b),re}return y===":cancel"||n.aborted?re:{action:"accept",content:{value:null,custom_value:y}}}let h=m[g];return h!==void 0?(o.line(p.dim(` Selected: ${de(h,128)}`)),{action:"accept",content:{value:h}}):(W("[elicitation] choice selector returned an out-of-range index:",{selectorResult:g,choicesLength:m.length}),re)}for(m.forEach((h,y)=>{o.line(` ${y+1}. ${de(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${Ii}`);;){if(n.aborted)return re;let h;try{h=(await r(p.dim(" Enter number: "))).trim()}catch(b){return W("[elicitation] choice readLine failed:",b),re}if(n.aborted)return re;if(h===":cancel")return re;if(e.allowCustom&&h===String(m.length+1)){let b;try{b=(await r(p.dim(" Type your answer: "))).trim()}catch(w){return W("[elicitation] custom-answer readLine failed:",w),re}return b===":cancel"?re:{action:"accept",content:{value:null,custom_value:b}}}if(h===""&&e.allowSkip)return Pi;let y=parseInt(h,10);if(!isFinite(y)||String(y)!==h||y<1||y>m.length){o.line(p.warning(` Please enter a number between 1 and ${m.length+(e.allowCustom?1:0)}.`));continue}return{action:"accept",content:{value:m[y-1]}}}}if(l==="multi_choice"){o.line("\x07");let m=e.choices??[],f=e.allowCustom?[...m,Ii]:m,g=await BD(f,n);if(g!==null){if(g===":cancel")return re;if(e.allowCustom&&g.includes(m.length)){let h;try{h=(await r(p.dim(" Type your answer: "))).trim()}catch(y){return W("[elicitation] custom-answer readLine failed:",y),re}return h===":cancel"||n.aborted?re:{action:"accept",content:{value:null,custom_value:h}}}if(g.length===0&&e.allowSkip)return Pi;if(g.length>0){let h=g.map(y=>m[y]);return o.line(p.dim(` Selected: ${h.map(y=>de(y,64)).join(", ")}`)),{action:"accept",content:{value:h}}}}for(m.forEach((h,y)=>{o.line(` ${y+1}. ${de(h,128)}`)}),e.allowCustom&&o.line(` ${m.length+1}. ${Ii}`);;){if(n.aborted)return re;let h;try{h=(await r(p.dim(" Enter numbers (comma-separated): "))).trim()}catch(S){return W("[elicitation] multi_choice readLine failed:",S),re}if(n.aborted)return re;if(h===":cancel")return re;if(e.allowCustom&&h===String(m.length+1)){let S;try{S=(await r(p.dim(" Type your answer: "))).trim()}catch(v){return W("[elicitation] custom-answer readLine failed:",v),re}return S===":cancel"?re:{action:"accept",content:{value:null,custom_value:S}}}if(h===""&&e.allowSkip)return Pi;if(h===""){o.line(p.warning(" Please enter at least one selection."));continue}let y=h.split(",").map(S=>S.trim()),b=[],w=!0;for(let S of y){let v=parseInt(S,10);if(!isFinite(v)||String(v)!==S||v<1||v>m.length){o.line(p.warning(` Invalid selection "${de(S,32)}". Enter numbers between 1 and ${m.length+(e.allowCustom?1:0)}.`)),w=!1;break}b.push(m[v-1])}if(w)return{action:"accept",content:{value:b}}}}if(l==="number"){let m=e.min,f=e.max,g=m!==void 0&&f!==void 0?` [${m}\u2013${f}]`:m!==void 0?` [\u2265${m}]`:f!==void 0?` [\u2264${f}]`:"";for(;;){if(n.aborted)return re;let h;try{h=(await r(p.dim(` Enter a number${g}: `))).trim()}catch(b){return W("[elicitation] number readLine failed:",b),re}if(n.aborted)return re;if(h===":cancel")return re;let y=nk(h,{allowSkip:e.allowSkip===!0,min:m,max:f,emptyError:"Please enter a number (or :cancel to skip)."});if(!y.ok){o.line(p.warning(" "+y.error));continue}return y.skip?Pi:{action:"accept",content:{value:y.value}}}}let d=e.minLength,u=e.maxLength;for(;;){if(n.aborted)return re;let m;try{m=(await r(p.dim(" > "))).trim()}catch(g){return W("[elicitation] text readLine failed:",g),re}if(n.aborted)return re;if(m===":cancel")return re;let f=rk(m,{allowSkip:e.allowSkip===!0,minLength:d,maxLength:u,emptyError:"Please enter a response (or type :cancel to skip)."});if(!f.ok){o.line(p.warning(" "+f.error));continue}return f.skip?Pi:{action:"accept",content:{value:m}}}}function sd(e){return async(t,{signal:n})=>{if(n.aborted)return Io;Fa(process.stdout),e.suspendInput?.();try{if(t.origin==="agent")return await UD(t,e,n);if(t.mode==="form"){let o=t.requestedSchema,{properties:i,required:s,fieldsTruncated:a,originalFieldCount:l}=typeof o=="object"&&o!==null?$D(o):{properties:{},required:new Set,fieldsTruncated:!1,originalFieldCount:0};DD(e.writer,t),a&&e.writer.line(p.warning(` \u26A0 Schema has ${l} fields; only the first ${cg} will be prompted (server may be malformed or compromised).`));let c=Object.create(null);if(Object.keys(i).length===0)return e.writer.line(p.warning(" \u26A0 Form schema has no usable fields \u2014 declining.")),Io;for(let d of s)if(!(d in i))return e.writer.line(p.warning(` \u26A0 Required field '${de(d,64)}' has no schema entry \u2014 declining.`)),Io;for(let[d,u]of Object.entries(i)){if(n.aborted)return re;let m=await FD(d,u,s.has(d),e.readLine,e.writer,n,e.pickFromList);if(m.tag==="cancel")return re;if(m.tag==="decline")return Io;m.value!==void 0&&!dg.has(d)&&(c[d]=m.value)}return{action:"accept",content:{...c}}}LD(e.writer,t);let r;try{r=(await e.readLine(p.dim("Continue? [y/N] "))).trim().toLowerCase()}catch(o){return W("[elicitation] url-mode readLine failed:",o),re}return r===""?re:r==="y"||r==="yes"?OD:Io}finally{e.resumeInput?.()}}}sa();_t();Cn();Ut();import{basename as HD,dirname as QQ}from"node:path";function jD(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?p.error:t>.5?p.warning:p.chrome,r=p.meta,o=20,i=Math.round(t*o),s=o-i,a=r("[")+n("\u2588".repeat(i))+r("\u2591".repeat(s))+r("]"),l=Math.round(t*100)+"%",c=n(l),d="";e.used!==void 0&&e.limit!==void 0&&(d=ce(e.used)+"/"+ce(e.limit));let u=p.meta(d),m="["+"\u2588".repeat(i)+"\u2591".repeat(s)+"]",f=d?`${m} ${l} ${d}`:`${m} ${l}`,g=`${m} ${l}`,h=`ctx ${l}`,y=d?`${a} ${c} ${u}`:`${a} ${c}`,b=`${a} ${c}`,w=p.meta("ctx ")+c,S=e.sparkline?p.meta(e.sparkline)+" ":"",v=e.sparkline?X(e.sparkline)+1:0,E=Math.max(0,e.width-v);if(X(f)<=E&&E>90)return S+y;if(X(g)<=E&&E>32)return S+b;if(X(h)<=E)return S+w;if(e.width>0){let R=S+w;return ie(R,e.width)}return c}K();var pg=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&&!ft()}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=je.subscribe(()=>{this.onResize()}),this.resizeImmediateUnsub=je.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&&HD(QQ(t.cwd))===".afk-worktrees"&&t.branch.replaceAll("/","-")===HD(t.cwd)&&X(t.branch)<=30){let l=ie(t.branch,30),c=`${p.dim("\u2387")} ${p.chrome(l)}`;t.pr!==void 0&&(c+=` ${p.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}else{if(t.cwd){let l=Math.max(8,Math.floor(r*.4)),c=id(t.cwd,{maxWidth:l});c&&n.push({text:p.dim(c)})}if(t.branch){let l=ie(t.branch,30),c=`${p.dim("\u2387")} ${p.chrome(l)}`;t.pr!==void 0&&(c+=` ${p.meta(`#${t.pr}`)}`),n.push({text:c,droppablePriority:1})}}if(n.push({text:p.brand(t.model)}),t.permissionMode==="plan"?n.push({text:p.warning("\u25CF plan")}):t.permissionMode==="autonomous"?n.push({text:p.info("\u25D0 AFK")}):t.permissionMode==="bypassPermissions"?n.push({text:p.bypass("\u26A1 bypass")}):t.permissionMode==="default"&&n.push({text:p.success("\u25CB default")}),t.contextPct!==void 0){let l=jD({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:p.chrome(`$${t.cost.toFixed(2)}`),droppablePriority:3}),t.tokens!==void 0&&n.push({text:p.chrome(`${ZQ(t.tokens)} tok`),droppablePriority:4});let i=p.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 ie(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 ZQ(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}import{execFile as eZ}from"node:child_process";import{promisify as tZ}from"node:util";var nZ=tZ(eZ);function rZ(e){return(t,n,r)=>nZ(t,n,{cwd:r,timeout:e,killSignal:"SIGTERM",maxBuffer:64*1024}).then(o=>({stdout:o.stdout,stderr:o.stderr}))}var mg=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??rZ(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 zf((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 Yt=new Map,Mi=new Map;function ve(e){if(Yt.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);Yt.set(e.name,e);for(let t of e.aliases??[]){if(Mi.has(t)||Yt.has(t))throw new Error(`Slash alias collides: ${t}`);Mi.set(t,e.name)}}function Po(e){if(Yt.has(e.name)){for(let[t,n]of Mi.entries())n===e.name&&Mi.delete(t);Yt.delete(e.name)}ve(e)}function WD(e){Yt.has(e.name)||ve(e)}function KD(){Yt.clear(),Mi.clear()}function at(){return[...Yt.values()].sort((e,t)=>e.name.localeCompare(t.name))}function La(){let e=[];for(let[t,n]of Mi.entries()){let r=Yt.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function oZ(e){if(Yt.has(e))return Yt.get(e);let t=Mi.get(e);return t?Yt.get(t):void 0}function iZ(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 sZ(e,t=3){let n;for(let r of Yt.keys()){let o=iZ(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function ok(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 GD(e,t,n){let r=ok(e);if(r===null)return{handled:!1};let o=oZ(r.name);if(!o){let a=sZ(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 uZ from"ora";import{statSync as aZ}from"node:fs";qs();function qD(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 fg(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 lZ(e){try{return aZ(e).isDirectory()}catch{return!1}}function YD(e,t){if(e!==void 0)return e;if(t!==void 0&&lZ(t))return t}function gg(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=JD(zD(r.user),80),i=JD(dZ(zD(r.assistant)),120);o.length>0&&t.fn(p.dim(` Last: ${o}`)),i.length>0&&t.fn(p.dim(` \u21B3 ${i}`)),t.fn(p.dim(" \u21AA /history for full review"))}function zD(e){return e.replace(cZ,"").replace(/\s+/g," ").trim()}var cZ=/\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 dZ(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function JD(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}var ad={stream:process.stdout,hideCursor:!1,discardStdin:!1};function ik(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 rr(e,t,n){let r=ik(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=qD(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}:{}}}Ue();var pZ={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"}},mZ={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(),X$(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"}},fZ={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=uZ({text:p.meta("Summarizing earlier turns..."),...ad}).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 dt)throw n;if(n instanceof me)return e.out.info(`Compaction skipped: ${n.reason??"blocked by hook"}`),"continue";e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},gZ={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=at(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(p.bold(p.brand("Commands"))),e.out.line(ye());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${p.warning(o)}${i} ${p.dim(r.summary)}`)}return e.out.line(),e.out.line(p.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(p.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},VD=[pZ,mZ,fZ,gZ];function sk(e,t=30){return!e||e.length===0?p.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${p.dim(`+${e.length-t} more`)}`}function mn(e,t){return` ${p.label(e.padEnd(16))} ${t}`}function hg(e){let t=[];t.push(" "+ye("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})`,sk(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):p.dim("(none)");t.push(mn(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(mn(`skills (${i})`,sk(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):p.dim("(none)");t.push(mn(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(mn(`slash (${l})`,sk(e.slashCommands))),t.push(" "+ye()),t.join(`
1497
1497
  `)}We();We();_t();Et();Js();function hZ(e,t){try{if(!e||e.trim().toLowerCase()==="auto")return{available:!0,needs:"unknown"};let n=Zo(e,t);if(n.id==="")return{available:!1,needs:"local",hint:"not configured (set AFK_MODEL_LOCAL / models.local)"};if(n.provider==="chatgpt-oauth"){let o=Yn(void 0,{},!0).apiKey!=null;return{available:o,needs:"chatgpt-oauth",hint:o?void 0:"needs ChatGPT sign-in (~/.codex/auth.json)"}}if(n.apiKey)return{available:!0,needs:"unknown"};let r=ne(e,t?{slots:t}:void 0);if(r==="anthropic-direct"){let o=!!Gl();return{available:o,needs:"anthropic",hint:o?void 0:"needs Claude sign-in / ANTHROPIC_API_KEY"}}if(r==="openai-compatible"){if(n.baseUrl)return{available:!0,needs:"local"};let o=!!ql()||Yn(void 0,{},!1).apiKey!=null;return{available:o,needs:"openai",hint:o?void 0:"needs OPENAI_API_KEY"}}return{available:!0,needs:"unknown"}}catch{return{available:!0,needs:"unknown"}}}function XD(e,t){return hZ(e,t).available}_t();var yZ="\u25B8",bZ=" ",wZ="\u25C9",SZ="\u25EF",vZ="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",kZ="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel";function or(e,t){return new Promise(n=>{let{header:r,options:o,multi:i=!1,signal:s,initialIndex:a=0}=t;if(o.length===0){n(null);return}if(s?.aborted){n(null);return}let l=EZ(a,0,o.length-1),c=new Set(t.initialSelected??[]),d=!1,u=y=>{d||(d=!0,s&&s.removeEventListener("abort",m),e.exitPickerMode(),n(y))},m=()=>u(null);s&&s.addEventListener("abort",m,{once:!0});let h={renderRows:()=>{let y=[];for(let b of r)y.push(b);for(let b=0;b<o.length;b++){let w=o[b]??"",S=b===l,v=S?p.brand(yZ):bZ,E;if(i){let R=c.has(b),A=R?p.success(wZ):p.dim(SZ),C=S&&!R?p.bold(w):w;E=` ${v} ${A} ${C}`}else{let R=S?p.bold(w):p.dim(w);E=` ${v} ${R}`}y.push(E)}return y.push(p.dim(" "+(i?kZ:vZ))),y},onKey:(y,b)=>{if(!d){if(b.name==="escape"||b.ctrl&&b.name==="c"){u(null);return}if(b.name==="up"||b.ctrl&&b.name==="p"){l=l===0?o.length-1:l-1,e.repaintPicker();return}if(b.name==="down"||b.ctrl&&b.name==="n"){l=l===o.length-1?0:l+1,e.repaintPicker();return}if(b.name==="return"){if(i){let w=[];for(let S=0;S<o.length;S++)if(c.has(S)){let v=o[S];v!==void 0&&w.push(v)}u(w)}else{let w=o[l];u(w!==void 0?[w]:[])}return}if(i&&(b.name==="space"||y===" ")){c.has(l)?c.delete(l):c.add(l),e.repaintPicker();return}if(b.name==="home"){l=0,e.repaintPicker();return}if(b.name==="end"){l=o.length-1,e.repaintPicker();return}}}};e.enterPickerMode(h)})}function EZ(e,t,n){return n<t||e<t?t:e>n?n:e}var TZ={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(p.bold("Session cost")),n.line(ye()),n.line(` total ${p.success(st(t.totalCostUsd))}`),n.line(` turns ${p.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${p.meta(st(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(st).join(p.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function xZ(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(p.bold("Token usage")+p.dim(" (SDK breakdown)")),e.line(ye()),e.line(` total ${p.success(ce(t.totalTokens))} of ${p.meta(ce(t.maxTokens))} (${p.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${p.meta(ce(t.autoCompactThreshold))}`),e.line(),e.line(p.dim(" Last turn (API):")),e.line(` input ${p.meta(ce(r))}`),e.line(` output ${p.meta(ce(o))}`),e.line(` cache read ${p.meta(ce(i))}`),e.line(` cache creat ${p.meta(ce(s))}`),e.line(` total ${p.meta(ce(a))}`);let l=t.categories??[];if(l.length>0){let m=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(p.dim(" Top categories:"));for(let f of m)e.line(` ${p.warning(f.name.padEnd(18))} ${p.meta(ce(f.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),f=d.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(p.dim(` system tools ${c.length} tools, ${ce(m)} tokens`)),d.length>0&&e.line(p.dim(` MCP tools ${d.length} tools, ${ce(f)} tokens`))}let u=t.agents??[];if(u.length>0){let m=u.reduce((f,g)=>f+g.tokens,0);e.line(p.dim(` agents ${u.length} loaded, ${ce(m)} tokens`))}if(t.skills){let m=t.skills;e.line(p.dim(` skills ${m.includedSkills}/${m.totalSkills} included, ${ce(m.tokens)} tokens`))}if(t.slashCommands){let m=t.slashCommands;e.line(p.dim(` slash cmds ${m.includedCommands}/${m.totalCommands} included, ${ce(m.tokens)} tokens`))}e.line()}function RZ(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(p.bold("Token usage")+p.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(ye()),e.line(` input ${p.meta(ce(n))}`),e.line(` output ${p.meta(ce(r))}`),e.line(` cache read ${p.meta(ce(o))}`),e.line(` total ${p.success(ce(i))}`),e.line(` context ${p.meta(`${c}% of ${ce(s)} (${t.model})`)}`),e.line()}var CZ={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();xZ(e.out,t)}catch{RZ(e.out,e.stats)}return"continue"}},AZ={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(p.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(ye()),t.turns.forEach((r,o)=>{let i=p.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} ${p.user("\u25B6")} ${s}`),n.line(` ${p.brand("\u25C6")} ${p.dim(a)}`)}),n.line(),"continue")}};async function QD(e,t){let n=Hl.includes(t),r=ys(t)!==void 0,o=ne(t)==="openai-compatible",i=Zo(t).id.trim().toLowerCase(),s=i.startsWith("claude-")||i.startsWith("claude_");if(!n&&!r&&!o&&!s){e.out.warn(`Unknown model: ${t}. Aliases: ${Hl.join(", ")} (or a full model id)`);return}let a=bs(t);if(a){e.out.warn(a);return}try{await e.session.current.setModel(t),e.stats.model=t,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${p.brand(t)}`)}catch(l){e.out.error(`Failed to switch model: ${l instanceof Error?l.message:String(l)}`)}}var _Z={name:"/model",usage:"/model [local|small|medium|large|opus|sonnet|haiku|fable|org/model]",summary:"Switch the active model mid-session",hint:"Switch the capability tier (local/small/medium/large \u2014 or your configured names) or pass a full model id. Bare `/model` opens an interactive picker on a TTY. Upgrade to large for a hard problem, downshift to small for cheap iteration \u2014 context carries over. Also accepts HuggingFace-style ids (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(n)return await QD(e,n),"continue";let r=e.getCompositor?.()??null;if(r){let i=[...Hl],s=i.indexOf(e.stats.model),l=(await or(r,{header:[p.bold("Switch model"),p.dim(`current: ${e.stats.model}`),p.dim("or type a full id: /model <org/model>"),""],options:i,initialIndex:s>=0?s:0}))?.[0];return l&&await QD(e,l),"continue"}e.out.info(`Current model: ${p.brand(e.stats.model)}`);let o=Hl.map(i=>XD(i)?i:`${i} (needs sign-in)`).join(", ");return e.out.line(p.dim(` Aliases: ${o} (or any org/model HF id)`)),"continue"}},IZ={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(p.bold(`Tools (${n.length})`)),e.out.line(ye());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"}},PZ={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(()=>(Zf(),fD)),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(p.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(ye());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${p.warning("\u25CF")} ${i} ${p.dim(`(${l}m ago)`)}`),e.out.line(` ${p.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(p.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(p.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(p.bold(`MCP servers (${o.length})`)),e.out.line(ye());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"?p.success("\u25CF"):p.warning("\u25CF");e.out.line(` ${c} ${a}${l?p.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(p.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"}},MZ={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(p.bold("Context-window limits")),e.out.line(ye());for(let[t,n]of Object.entries(Gs)){let r=t===e.stats.model?p.brand(" \u2190 active"):"";e.out.line(` ${p.warning(t.padEnd(12))} ${p.meta(ce(n))}${r}`)}return e.out.line(),"continue"}},OZ={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(hg(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},ZD=[TZ,CZ,AZ,_Z,IZ,PZ,MZ,OZ];G();Lb();var ak=!1;function $Z(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 ld(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=ak?"":p.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");ak||(ak=!0),e.out.success(p.warning("\u25CF plan mode ON")+p.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(p.success("\u25CB plan mode OFF")+p.dim(` \u2014 ${$Z(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}async function DZ(e){if(await ld(e,!1),e.stats.permissionMode==="plan")return"continue";let t=au(e.stats.cwd??process.cwd());return e.out.info(p.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:zu(t)}}var eF={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 ld(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await ld(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await ld(e,!1),"continue"):DZ(e)}};K();qu();ma();br();var tF=20,nF=500,FZ={done:"\u2705 Done",blocked:"\u26D4 Blocked",asking:"\u2753 Asking",interrupted:"\u23F8\uFE0F Interrupted"},LZ={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"]]},dk=new Set(["write_file","edit_file","bash"]);function rF(e){return e.some(t=>dk.has(t.toolName)&&t.isError!==!0)}function NZ(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":FZ[e.kind]}`,i=[];for(let[a,l]of LZ[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>nF?`${a.slice(0,nF)}\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(`
1498
1498
  `):"(no detail)";return Je(`${o}
1499
1499
  ${s}`)}var lk=0,ck=!1;function oF(){lk=0,ck=!1}async function iF(e,t=tn,n={}){try{if(lk>=tF){ck||(ck=!0,await t(`\u{1F916} AFK \xB7 reached ${tF} updates this session \u2014 further terminal-state pushes muted. Run /afk off then /afk on to resume.`));return}lk+=1,await t(NZ(e,n))}catch{}}G();import*as Na from"node:fs";import*as aF from"node:path";import{createHmac as BZ,randomBytes as lF,timingSafeEqual as UZ}from"node:crypto";var jZ=32,cF="\0";function HZ(e){return JSON.stringify(uk(e))}function uk(e){if(Array.isArray(e))return e.map(uk);if(e!==null&&typeof e=="object"){let t=e,n={};for(let r of Object.keys(t).sort())n[r]=uk(t[r]);return n}return e}function dF(e){let t=sF(e);if(t)return t;let n;try{n=Ky(e)}catch{return null}try{Na.mkdirSync(aF.dirname(n),{recursive:!0});let r=lF(jZ).toString("hex");return Na.writeFileSync(n,r+`
@@ -1714,7 +1714,7 @@ _ended: ${new Date().toISOString()}_
1714
1714
  `);return}if(z){f=V.insert(f,`
1715
1715
  `),U();return}if(g.dropdownOpen){let q=g.trigger?.kind,we=I();q==="slash"&&we&&D()}else Ua(f.buffer)?(f=V.replaceRange(f,{start:f.buffer.length-1,end:f.buffer.length},`
1716
1716
  `),B()):D();return}if($?.shift&&$?.name==="tab"||$?.sequence==="\x1B[Z"){e.onShiftTab?.();return}if($?.name==="tab"){if(g.dropdownOpen)I();else{let q=f.buffer.slice(0,f.cursor),we=/\s+\/([A-Za-z][A-Za-z0-9_:-]*)$/.exec(q);if(we){let Ft="/"+we[1],Re=[...at().map(ae=>ae.name),...La().map(ae=>ae.alias)].filter(ae=>ae.startsWith(Ft)).sort((ae,Ge)=>ae.localeCompare(Ge))[0];if(Re){let ae=f.buffer.slice(f.cursor),Ge=f.cursor-Ft.length,Ne=Re+(ae.startsWith(" ")?"":" ");f=V.replaceRange(f,{start:Ge,end:f.cursor},Ne),B()}}}return}let te=!$?.ctrl&&!$?.meta,oe=te&&typeof O=="string"&&Ka(O)?O:te&&typeof $?.sequence=="string"&&Ka($.sequence)?$.sequence:null;oe!==null&&(f=V.insert(f,oe),e.history?.resetRecall(),y||(z?U():B()))},d=je.subscribe(()=>{S=0,v=0,h=0,B()}),t.on("keypress",c)})}finally{e.statusLine?.setExtraRows(s),o.restore(),i?.release()}}K();async function IU(e){return!process.stdout.isTTY||!process.stdin.isTTY||ft()?CU(e):_U(e)}K();var _h=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;softStopHandler=null;pauseInterruptHandler=null;pendingReadReject=null;pendingReadResolve=null;slashRegistryView={has:t=>at().some(n=>n.name===`/${t}`)};constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=Ah()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY||ft())return;let o=new Ga({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onSoftStop:()=>{this.softStopHandler?.()},onBackground:()=>{this.backgroundHandler?.()},onPauseInterrupt:()=>{this.pauseInterruptHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:i=>$o(i,this.slashRegistryView),caretBlink:MD()&&!ig(),captureMode:og(),goblinSpinner:sg(),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{},...t.anchorRow!==void 0?{anchorRow:t.anchorRow}:{},...t.suggest?{suggest:t.suggest}:{}});await o.arm(),o.setInputMode("idle"),this.compositor=o,this.armedStdout=n}async dispose(){if(this.compositor){if(this.pendingReadReject){this.compositor.setOnSubmit(null);let t=this.pendingReadReject;this.pendingReadReject=null,this.pendingReadResolve=null,t(new Error("InputSurface disposed while readLine was in progress"))}try{this.compositor.disarm()}catch{}this.compositor=null,this.armedStdout=null,this.backgroundHandler=null,this.softStopHandler=null,this.pauseInterruptHandler=null}}getCompositor(){return this.compositor}setBackgroundHandler(t){this.backgroundHandler=t}setSoftStopHandler(t){this.softStopHandler=t}setPauseInterruptHandler(t){this.pauseInterruptHandler=t}setPausedState(t){this.compositor&&(this.compositor.paused=t)}suspendForElicitation(){this.compositor?.suspendInput()}resumeAfterElicitation(){this.compositor?.resumeInput()}async readLine(t){if(this.compositor&&this.compositor.isArmed()){let n=this.compositor;return new Promise((r,o)=>{this.pendingReadReject=o,this.pendingReadResolve=r;let i=s=>{n.setOnSubmit(null),this.pendingReadReject=null,this.pendingReadResolve=null;let a=this.armedStdout??process.stdout,l=s.displayText??s.text,c=$i({buffer:$o(l,this.slashRegistryView),promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:Wa([...s.attachments])});Vt(n,c.split(`
1717
- `)),r({text:s.text,attachments:[...s.attachments]})};n.setOnSubmit(i),n.setInputMode("idle"),n.repaint()})}return IU({rl:this.rl,promptFn:t.promptFn,...t.onSigint?{onSigint:t.onSigint}:{},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.compositor?{compositor:t.compositor}:{},history:this.history,autocompleteState:this.autocompleteState,...this.statusLine?{statusLine:this.statusLine}:{}})}isAwaitingInput(){return this.pendingReadResolve!==null}bufferIsEmpty(){let t=this.compositor?.getBuffer();return t?t.text.length===0&&!t.queued:!0}abortPendingRead(){if(!this.pendingReadResolve)return;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"",attachments:[]})}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};K();wr();fe();K();var OE=["default","plan","bypassPermissions"];function Nie(e,t){switch(t){case"plan":e.out.success(p.warning("\u25CF plan mode ON")+p.dim(" \u2014 writes refused; read-only bash runs, mutating bash blocked."));return;case"bypassPermissions":e.out.line(p.bypass("\u26A1 bypass ON")+p.dim(" \u2014 path-approval prompts + containment OFF; read/write any path. (Does not affect ask_question.)"));return;case"default":e.out.success(p.success("\u25CB default")+p.dim(" \u2014 path containment + approval prompts restored."));return}}async function Ih(e){let t=e.stats.permissionMode;if(t==="autonomous"){await cd(e,!1);return}let n=OE.indexOf(t),r=OE[(n+1)%OE.length]??"default";try{await e.session.current.setPermissionMode(r),e.stats.permissionMode=r,e.ui.repaintStatusLine(),Nie(e,r)}catch(o){e.out.error(`Could not switch permission mode: ${o instanceof Error?o.message:String(o)}`)}}function ol(e){let t=p.brand("afk"),n=e==="plan"?p.warning(" \u25CF"):e==="autonomous"?p.info(" \u25D0"):e==="bypassPermissions"?p.bypass(" \u26A1 bp"):"";return t+n+p.dim(" \u203A ")}async function PU(e,t,n,r,o,i,s){let a=EL({onError:m=>W("[afk suggest] Tier-2 completion failed:",m)});await t.armCompositor({promptFn:()=>ol(e.stats.permissionMode),onCancel:o,onShiftTab:()=>{Ih(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...i?{suggest:{engine:a,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let m=t.history;return m.getEntries?[...m.getEntries()]:[]},getDropdownTopCandidate:m=>{let g=t.autocompleteState.candidates[0];return g&&g.value.startsWith(m)&&g.value.length>m.length?g.value:null},getTranscriptTail:()=>{let m=e.stats.turns;return m.length===0?"":m.slice(-2).reverse().map(f=>`user: ${f.user}
1717
+ `)),r({text:s.text,attachments:[...s.attachments]})};n.setOnSubmit(i),n.setInputMode("idle"),n.repaint()})}return IU({rl:this.rl,promptFn:t.promptFn,...t.onSigint?{onSigint:t.onSigint}:{},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.compositor?{compositor:t.compositor}:{},history:this.history,autocompleteState:this.autocompleteState,...this.statusLine?{statusLine:this.statusLine}:{}})}isAwaitingInput(){return this.pendingReadResolve!==null}bufferIsEmpty(){let t=this.compositor?.getBuffer();return t?t.text.length===0&&!t.queued:!0}abortPendingRead(){if(!this.pendingReadResolve)return;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"",attachments:[]})}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};K();wr();fe();K();var OE=["default","plan","bypassPermissions"];function Nie(e,t){switch(t){case"plan":e.out.success(p.warning("\u25CF plan mode ON")+p.dim(" \u2014 writes refused; read-only bash runs, mutating bash blocked."));return;case"bypassPermissions":e.out.line(p.bypass("\u26A1 bypass ON")+p.dim(" \u2014 path-approval prompts + containment OFF; read/write any path. (Does not affect ask_question.)"));return;case"default":e.out.success(p.success("\u25CB default")+p.dim(" \u2014 path containment + approval prompts restored."));return}}async function Ih(e){let t=e.stats.permissionMode;if(t==="autonomous"){await cd(e,!1);return}let n=OE.indexOf(t),r=OE[(n+1)%OE.length]??"default";try{await e.session.current.setPermissionMode(r),e.stats.permissionMode=r,e.ui.repaintStatusLine(),Nie(e,r)}catch(o){e.out.error(`Could not switch permission mode: ${o instanceof Error?o.message:String(o)}`)}}function ol(e){let t=p.brand("afk"),n=e==="plan"?p.warning(" \u25CF"):e==="autonomous"?p.info(" \u25D0"):e==="bypassPermissions"?p.bypass(" \u26A1 bp"):"";return t+n+p.brand(" \u203A ")}async function PU(e,t,n,r,o,i,s){let a=EL({onError:m=>W("[afk suggest] Tier-2 completion failed:",m)});await t.armCompositor({promptFn:()=>ol(e.stats.permissionMode),onCancel:o,onShiftTab:()=>{Ih(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...i?{suggest:{engine:a,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let m=t.history;return m.getEntries?[...m.getEntries()]:[]},getDropdownTopCandidate:m=>{let g=t.autocompleteState.candidates[0];return g&&g.value.startsWith(m)&&g.value.length>m.length?g.value:null},getTranscriptTail:()=>{let m=e.stats.turns;return m.length===0?"":m.slice(-2).reverse().map(f=>`user: ${f.user}
1718
1718
  assistant: ${f.assistant}`).join(`
1719
1719
  `)},getRecentCommands:()=>{let m=t.history;return m.getEntries?[...m.getEntries()]:[]},llmEnabled:()=>/^(1|true|yes|on)$/i.test(k.AFK_SUGGEST_ENABLED??"")})}}:{}});let l=t.getCompositor(),c=sd({readLine:m=>t.readLine({promptFn:()=>m}).then(f=>f.text),writer:{line:(m="")=>{let f=t.getCompositor();f?f.commitAbove(m):process.stdout.write(m+`
1720
1720
  `)}},pendingCount:()=>Ve.pendingCount(),...l?{pickFromList:m=>or(l,m),readTextOverlay:m=>nh(l,m)}:{}});Ve.install(c),e.replRenderer.setCompositor(t.getCompositor()),e.slashCtx.getCompositor=()=>t.getCompositor();let d=t.getCompositor();if(d){let m=f=>d.commitAbove(f);e.completionWriter.fn=m,e.completionWriter.idleFn=m}let u=m=>{t.setSoftStopHandler(m),n.requestSoftStop=m};return e.slashCtx.setSoftStopHandler=u,e.slashCtx.onStageChange=m=>s.getLoopStageBar()?.repaint(m),e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),await e.gitStatusSampler.refresh(),e.statusLine.repaint(rr(e.stats,e.contextSampler,e.gitStatusSampler))},e.slashCtx.transcript=r,e.slashCtx.stdinElicitationHandler=c,e.slashCtx.swapElicitationHandler=m=>Ve.install(m??c),e.inputSurfaceRef&&(e.inputSurfaceRef.current=t),e.gitStatusSampler.setOnUpdate(()=>{e.statusLine.repaint(rr(e.stats,e.contextSampler,e.gitStatusSampler))}),e.gitStatusSampler.refresh(),{installSoftStop:u}}function MU(e={}){let t=e.load??bg,n=e.onResize??(s=>je.subscribe(s)),r="",o,i=n(()=>{r=""});return{renderIfChanged(s){let a=s??"unbound",l=t(a),c=CF(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:wg(l))},invalidate(){r=""},dispose(){try{i()}catch{}}}}K();var $E={done:{glyph:"\u2713",color:p.success,label:"done"},blocked:{glyph:"\u2298",color:p.error,label:"blocked"},asking:{glyph:"?",color:p.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:p.meta,label:"interrupted"}};function OU(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,i=!1,s=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function d(g){let h=o();return Math.max(1,g-1-h)}function u(){if(!i||!r?.isTTY)return;let g=f(),h=c(),y=g!==null&&h>1?1:0;if(y!==s&&(s>0&&m(),s=y,a?.(s)),y===0)return;let b=d(h);r.write("\x1B[s"),r.write(`\x1B[${b};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function m(){if(!r?.isTTY)return;let g=c(),h=d(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=p.dim(" ledger "),h=p.dim(" \xB7 "),y=n.map(E=>{let R=$E[E];return R.color(`${R.glyph} ${R.label}`)}),b=p.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+y.join(h)+b,S=Math.max(20,ee()-2);if(X(w)<=S)return w;let v=g+n.map(E=>$E[E].color($E[E].glyph)).join(p.dim(" "))+b;return ie(v,S)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),u()},reset(){n=[],i&&s>0&&(m(),s=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){i||ft()||(i=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),s=0,l=je.subscribe(()=>u()),u())},stop(){i&&(i=!1,l!==null&&(l(),l=null),s>0&&(m(),s=0,a?.(0)),r=null)},repaint(){u()}}}K();var $U=["\u25D0","\u25D1","\u25D2","\u25D3"],Ph=class{stream;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;resizeImmediateUnsub=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;lastPaintStartRow=0;preResizeStartRow=null;preResizeRowCount=null;onRowCountChange;getAdjacentRows;constructor(t,n={}){this.registry=t,this.stream=n.stream??process.stdout,this.throttleMs=n.throttleMs??200,this.getAdjacentRows=n.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||ft()||(this.started=!0,this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=je.subscribe(()=>this.repaint()),this.resizeImmediateUnsub=je.subscribeImmediate(()=>this.resetGeometry()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%$U.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}resetGeometry(){this.rowCount>0&&(this.preResizeStartRow=this.lastPaintStartRow,this.preResizeRowCount=this.rowCount),this.rowCount=0,this.lastRepaint=0}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s})),n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(this.clearPreResizeRows(),o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let i=Math.max(1,n-o-r);this.lastPaintStartRow=i,this.stream.write("\x1B[s");for(let s=0;s<o;s++){let a=t[s],l=i+s;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let i=0;i<r;i++)this.stream.write(`\x1B[${o+i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}clearPreResizeRows(){let t=this.preResizeStartRow,n=this.preResizeRowCount;if(this.preResizeStartRow=null,this.preResizeRowCount=null,t===null||n===null||!this.stream.isTTY)return;let r=this.stream.rows??24,o=[];for(let i=0;i<n;i++){let s=t+i;s<=r&&o.push(s)}if(o.length!==0){this.stream.write("\x1B[s");for(let i of o)this.stream.write(`\x1B[${i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}}formatItemLine(t){return this.formatJobLine(t.job)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=p.brand($U[this.spinnerIndex]),o=p.dim(t.jobId),i=p.bold(t.label||t.jobId),s=[r,o,i],a=Date.now()-t.startedAt;return s.push(p.dim(be(a))),ie(" "+s.join(" "),n)}};import{spawn as Bie}from"node:child_process";var Uie=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function jie(){let e="";return{strip(t){let r=(e+t).replace(Uie,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function DU(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var FU=12e4,LU=1e5;function DE(e){let t=Date.now(),n=e.timeoutMs??FU,r=e.maxBytes??LU,o=jie(),i;try{i=Bie(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(E){let R=E instanceof Error?E.message:String(E);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${R}`})}}i.unref();let s,a=!1,l=new Promise(E=>{s=R=>{a||(a=!0,E(R))}}),c="",d="",u=0,m=0,f=!1,g=!1,h=!1;function y(E){let R=r-u;if(R>0){let A=E.length<=R?E:DU(E,R);u+=A.length,c+=A.toString("utf8"),E.length>R&&(f=!0)}else E.length>0&&(f=!0);if(m<r){let A=o.strip(E.toString("utf8")),C=Buffer.byteLength(A,"utf8"),N=r-m;if(C<=N)d+=A,m+=C;else{let _=Buffer.from(A,"utf8");d+=DU(_,N).toString("utf8"),m=r,f=!0}}}function b(){if(i.pid!==void 0&&i.pid!==0&&!i.killed)try{process.kill(-i.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{b(),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),S=()=>{b(),clearTimeout(w),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",S);function v(){g||a||u<r&&m<r||(g=!0,b(),clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return i.stdout?.on("data",E=>{y(E);try{e.onChunk?.(E,"stdout")}catch{}v()}),i.stderr?.on("data",E=>{y(E);try{e.onChunk?.(E,"stderr")}catch{}v()}),i.on("error",E=>{clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${E.message}`})}),i.on("close",(E,R)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",S),!(g||a)){if(o.flush(),h){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(E!==null&&E!==0){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${E}`});return}if(E===null){s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"signal-killed",errorMessage:R?`Command killed by signal ${R}`:"Command killed by signal"});return}s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f})}}),{pid:i.pid,promise:l,kill:(E="SIGKILL")=>{if(!(i.pid===void 0||i.pid===0||i.killed)){h=!0;try{process.kill(-i.pid,E)}catch{}}}}}import{EventEmitter as Hie}from"node:events";var NU=200,$d=class extends Hie{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=DE({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),i={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,i),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(s=>{i.result=s,i.status=Wie(s),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",i)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:i,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=NU))for(let[t,n]of this.jobs){if(this.jobs.size<=NU)break;n.status!=="running"&&this.jobs.delete(t)}}};function Wie(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function Kie(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function Gie(e,t){let n=be(t.durationMs);return t.errorReason==="abort"?p.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?p.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?p.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?p.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?p.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?p.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):p.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function BU(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function qie(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${be(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${BU(e)}</command>`),r.push("<output>"),r.push(BU(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
@@ -1740,7 +1740,7 @@ ${S}
1740
1740
  ${v}`})}return{fileBlocks:a,warnings:l}}async function qU(e,t,n,r,o="summary",i,s){let a=FL(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,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,v=[],E=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then(U=>{for(let I of U)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${I.jobId}: ${I.label}`))}).catch(()=>{})},C=r.getCompositor?r.getCompositor():null,N=()=>new Za({out:el(i),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(j=>{He()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:A}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...C?{compositor:C}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=N(),P=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let U=j;i.fn=I=>U.commitAbove(I),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(U=>_.setInterrupting(U)),r.rearmStatus?.()};try{C?C.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(O=>{He()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),O)});let M=r.subagentControl;M?.hasActiveForeground()&&M.cancelActiveForeground().catch(O=>{He()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),O)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(M=>{He()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),M)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A);let{fileBlocks:j,warnings:U}=GU(e.text,{rootDir:process.cwd()});for(let M of U)(i??{fn:console.log}).fn(p.dim(` @-file: ${M}`));let I=j.length>0||e.attachments.length>0?WU(e.text,e.attachments,void 0,j):e.text,D=t.sendMessageStream(I);if(await _s((M,O)=>{_.process(M,O)},async()=>{for await(let M of D){if(h||y)break;if(M.type==="chunk"&&M.chunk.type==="content"?(l+=M.chunk.content,d=!0):M.type==="message"&&!d&&(l=M.message.content),M.type==="stream_retry"&&(l=l.slice(0,c)),M.type==="chunk"&&M.chunk.type==="tool_use_detail"){let O=M.chunk,$={toolName:O.toolName,toolUseId:O.toolUseId,input:O.toolInput,...O.toolInputRaw!==void 0&&{inputRaw:O.toolInputRaw}};E.set(O.toolUseId,$),v.push($)}else if(M.type==="chunk"&&M.chunk.type==="tool_result"){let O=M.chunk;c=l.length;let $=E.get(O.toolUseId);if($&&($.result=O.content,$.isError=O.isError,E.delete(O.toolUseId)),r.onContextProgress){let H=Date.now();if(H-w>=S){w=H;try{let z=r.onContextProgress();z instanceof Promise&&await z}catch(z){He()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),z)}}}}if(M.type==="paused"){if(r.setPausedState?.(!0),await P(),C&&M.autoResume===!0){let O=new AbortController;b.abort=O;let $=M.resetsAt?M.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,H=$?`Keep waiting \u2014 auto-resumes at ${$}`:"Keep waiting \u2014 auto-resume in progress",z="Switch model / provider (type /model after)",Q="Stop waiting",te=[p.warning(" \u23F3 Usage limit reached.")+($?p.dim(` Auto-resumes at ${$}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];or(C,{header:te,options:[H,z,Q],signal:O.signal,initialIndex:0}).then(oe=>{if(b.abort=null,!oe)return;let q=oe[0];q===void 0||q===H||(y=!0,q===z&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(we=>{He()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),we)}))}).catch(oe=>{He()&&console.error(" "+p.error("picker promise rejected:"),oe)})}else(i??{fn:console.log}).fn(jx({reason:M.reason,...M.resetsAt!==void 0?{resetsAt:M.resetsAt}:{},...M.accountId!==void 0?{accountId:M.accountId}:{},...M.autoResume!==void 0?{autoResume:M.autoResume}:{}}));continue}if(M.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let O=M.hotSwapped&&M.accountId?`\u25B6 Resumed on ${M.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,v.length=0,E.clear(),f=!1,g=void 0,u=!1,_=N(),m=!1,await B(),(i??{fn:console.log}).fn(p.success(O));continue}if(M.type==="error"){await P(),ps(as(M.error)),u=!0;continue}_.process(M),M.type==="done"&&(f=!0,g=M.metadata)}}),await P(),h){let M=i?i.fn:console.log;M(p.warning("\u23F8 Stopped \u2014 work so far kept.")+p.dim(" Send a message to continue.")),M("")}if(y){let M=i?i.fn:console.log;M(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),M("")}if(f&&!h&&!y){Ti(n,a,l,g,v),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Fa(process.stdout);let M=$=>{i?i.fn($):console.log($)},O=$h(l);if(O){M(HU(O)),M("");let $=rF(v);if(r.onTerminalState)try{r.onTerminalState(O,{doneHasCorroboratingEvidence:$})}catch{}if(n.permissionMode==="autonomous"){let H=O.kind==="done"&&Gu().verifyDone===!0&&!$;iF(O,void 0,{unverified:H})}}if(bse(g,n,M),r.onAfterTurn){let $=r.onAfterTurn();$ instanceof Promise&&await $.catch(()=>{})}}}catch(j){await P(),u||ps(as(j))}finally{await P(),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),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function yse(e,t){let n=Math.round(e*100),r=ce(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ce(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function bse(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(be(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ce(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=ik(t),a=Gt(t.model),l=yse(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var wse=5e3,Sse=3,vse="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function kse(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(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function zU(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async R=>{He()&&(f=hg(R)),await _d(e.session.current),He()&&(g=gE())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y=!1,b=!1,w,S,v,E=0;for(m.onInjectable=()=>{E>=Sse||!o.isAwaitingInput()||!o.bufferIsEmpty()||(E++,Fa(process.stdout),h={text:vse,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let I of g)e.replRenderer.writeLine(I);e.replRenderer.writeLine(""),g=[]}let R=u.drainNotifications();for(let{job:I,result:D}of R){let F=D.errorReason===void 0?"\u2713":"\u2717",M=D.errorReason==="abort"?"killed":D.errorReason==="timeout"?"timed out":D.errorReason==="signal-killed"?"killed by signal":`exit ${D.exitCode??0}`,O=Math.max(0,Math.round(D.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${F} [${I.id}] ${M} \xB7 ${O}s \xB7 `)+I.command)}let A=m.drainNotifications();for(let{job:I}of A){let D=I.status==="completed"?"\u2713":I.status==="failed"?"\u2717":"\u2298",F=I.endedAt!==void 0?Math.max(0,Math.round((I.endedAt-I.startedAt)/100)/10):0,M=I.label.length>60?`${I.label.slice(0,60)}\u2026`:I.label;e.replRenderer.writeLine(p.dim(` ${D} [${I.jobId}] subagent ${I.status} \xB7 ${F}s \xB7 `)+M)}let C=l.renderIfChanged(e.stats.sessionId);if(C.length>0){for(let I of C)e.replRenderer.writeLine(I);e.replRenderer.writeLine("")}let N,_;if(h===void 0){let I=await e.session.current.takePendingPlanExitSeed();I!==void 0&&(e.stats.permissionMode=I.mode,h={text:I.message,attachments:[]})}if(h!==void 0){let I=h;h=void 0;let D=ol(e.stats.permissionMode),F=$i({buffer:I.text,promptText:D,isTTY:!!process.stdout.isTTY,attachmentSummary:Wa([...I.attachments])});e.replRenderer.writeLine(F),N=I.text.trim(),_=I.attachments}else{let I=await o.readLine({promptFn:()=>ol(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Ih(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});N=I.text.trim(),_=I.attachments}if(!N&&_.length===0)continue;if(N.startsWith("!")){let I=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!I&&(y||(y=!0,e.replRenderer.writeLine(p.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(N))){e.statusLine.rearm();continue}}let P=!1;if(N.startsWith("/")){let I=await GD(N,e.slashCtx,_);if(I.handled){if(I.result==="exit"){e.rl.close();return}if((N==="/clear"||N.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),w=void 0),I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="submit"){h={text:I.result.message,attachments:_??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}P=!0}a.push(N),await kse(e,N);let B=N;if(P){let I=ok(N);if(I){let D=I.name.replace(/^\//,"").split(":").pop()??"";if(D&&uE(D)){let F={skillName:D,rawArgs:I.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,O=Hi(M),$=Date.now();W(`[afk trace] preflight.start commandName=${D}`);let H=!1,z=await ji(F,{cwd:e.stats.cwd??process.cwd(),artifactDir:O},Q=>{He()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${D}) failed: `)+(Q instanceof Error?Q.message:String(Q)))});H=z!==null,W(`[afk trace] preflight.end commandName=${D} durationMs=${Date.now()-$} success=${H}`),B=mE(z?.manifestBlock,N)}}}let j=u.drainInjections();j.length>0&&(B=j+B);let U=m.drainInjections();if(U.length>0&&(B=U+B),w!==void 0&&(B=w+`
1741
1741
 
1742
1742
  `+B,w=void 0),e.hookRegistry)try{let I={event:"UserPromptSubmit",prompt:B,sessionId:e.stats.sessionId},D=await e.hookRegistry.dispatch(I);D.injectContext&&(B=D.injectContext+B)}catch(I){if(I instanceof me){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(I.reason?p.dim(`: ${Er(I.reason)}`):"")),e.statusLine.rearm();continue}if(I instanceof Un){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${I.timeoutMs}ms`)),e.statusLine.rearm();continue}throw I}if(S=void 0,v=void 0,await qU({text:B,attachments:_},e.session.current,e.stats,{setInFlight(I){n.turnInFlight=I},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(I){await t.appendUser(I)},async onTurnComplete(I,D){if(await t.appendTurn(I,D),e.stats.sessionId)try{Ao(e.stats)}catch(F){b||(b=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(F instanceof Error?F.message:String(F))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(I,D)=>{d?.push(I),S=I.kind,v=D?.doneHasCorroboratingEvidence},setActiveCompositor:I=>{n.activeCompositor=I},setInterruptNotifier:I=>{n.notifyInterrupting=I},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:I=>o.setBackgroundHandler(I),setSoftStopHandler:i,setPausedState:I=>o.setPausedState(I),setPauseInterruptHandler:I=>o.setPauseInterruptHandler(I),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(rr(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:I=>c.repaint(I)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(ol(e.stats.permissionMode))),e.hookRegistry)try{let I=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...S!==void 0?{terminalState:S}:{},...v!==void 0?{doneHasCorroboratingEvidence:v}:{}},void 0,wse);I.injectContext&&I.injectContext.trim().length>0&&(w=I.injectContext)}catch(I){if(I instanceof dt)throw I;I instanceof Un?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):I instanceof me?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${Er(I.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(I))}}}function Ese(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 JU(e,t,n,r){let o=await RU(),i=new _h({rl:e.rl,history:o,statusLine:e.statusLine}),s=Ese(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await PU(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=jU(e,n),await zU(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)}}zl();Bs();import{execFile as Tse}from"node:child_process";import{dirname as xse,isAbsolute as Rse,resolve as Cse}from"node:path";import{promisify as Ase}from"node:util";var YU=Ase(Tse),_se=3e3,Ise=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Pse(){let t=(await YU("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Rse(t)?t:Cse(process.cwd(),t);return xse(n)}async function VU(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Pse()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),_se)});try{let o=dn({execFile:YU,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=>Ise.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Pu();zl();import{promises as Mse}from"node:fs";import{dirname as Ose,join as ZU}from"node:path";import{randomBytes as $se}from"node:crypto";var Dse=["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(`
1743
- `),XU=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,LE=30,Fse=1024,Lse=8e3,Nse="haiku";async function Bse(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=Wse(n,Fse),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Lse),s=t.signal?Kse([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ws({token:t.token,model:t.model??Nse,system:Dse,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=Use(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Ose(t.worktreePath);return await jse(l,c)}function Use(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(XU.test(t)&&t.length<=LE)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>LE)break;o=s}return XU.test(o)?o:null}async function jse(e,t){if(!await Hse(ZU(t,e)))return e;let n=$se(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,LE-5)}-${n}`}async function Hse(e){try{return await Mse.access(e),!0}catch{return!1}}function Wse(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 Kse(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 ej(e){let t,n,r=ZU(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Bse(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=`${Bu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return QU(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 QU(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 QU(e,t){e&&e.setCwd(t),Gse(t)}function Gse(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as nj}from"child_process";import{existsSync as rj,mkdirSync as Vse,readFileSync as oj,unlinkSync as tj,writeFileSync as ij}from"fs";import{get as Xse}from"https";import{join as sj}from"path";import{readFileSync as qse}from"fs";import{dirname as zse,join as Jse}from"path";import{fileURLToPath as Yse}from"url";function cr(){try{return"5.56.1"}catch{}try{let e=zse(Yse(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(qse(Jse(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var Qse=64*1024,Zse=10800*1e3,eae=800,tae=3600*1e3,nae="update-check.json",rae="pending-update.json";function NE(){return sj(is(),nae)}function Dd(){return sj(is(),rae)}function BE(){let e=is();rj(e)||Vse(e,{recursive:!0})}function aj(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 lj(){try{let e=oj(NE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cj(){try{BE();let e=`
1743
+ `),XU=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,LE=30,Fse=1024,Lse=8e3,Nse="haiku";async function Bse(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=Wse(n,Fse),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Lse),s=t.signal?Kse([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ws({token:t.token,model:t.model??Nse,system:Dse,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=Use(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Ose(t.worktreePath);return await jse(l,c)}function Use(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(XU.test(t)&&t.length<=LE)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>LE)break;o=s}return XU.test(o)?o:null}async function jse(e,t){if(!await Hse(ZU(t,e)))return e;let n=$se(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,LE-5)}-${n}`}async function Hse(e){try{return await Mse.access(e),!0}catch{return!1}}function Wse(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 Kse(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 ej(e){let t,n,r=ZU(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Bse(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=`${Bu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return QU(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 QU(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 QU(e,t){e&&e.setCwd(t),Gse(t)}function Gse(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as nj}from"child_process";import{existsSync as rj,mkdirSync as Vse,readFileSync as oj,unlinkSync as tj,writeFileSync as ij}from"fs";import{get as Xse}from"https";import{join as sj}from"path";import{readFileSync as qse}from"fs";import{dirname as zse,join as Jse}from"path";import{fileURLToPath as Yse}from"url";function cr(){try{return"5.56.2"}catch{}try{let e=zse(Yse(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(qse(Jse(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var Qse=64*1024,Zse=10800*1e3,eae=800,tae=3600*1e3,nae="update-check.json",rae="pending-update.json";function NE(){return sj(is(),nae)}function Dd(){return sj(is(),rae)}function BE(){let e=is();rj(e)||Vse(e,{recursive:!0})}function aj(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 lj(){try{let e=oj(NE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cj(){try{BE();let e=`
1744
1744
  const https = require('https');
1745
1745
  const fs = require('fs');
1746
1746
  const url = 'https://registry.npmjs.org/agent-afk/latest';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { AgentSession, query, queryText, queryStructured, SubagentManager, createCanUseToolHook, OpenAICompatibleProvider, openaiCompatibleProvider, providerForModel, resolveProvider, tool, } from './agent/index.js';
1
+ export { AgentSession, BudgetExceededError, query, queryText, queryStructured, SubagentManager, createCanUseToolHook, OpenAICompatibleProvider, openaiCompatibleProvider, providerForModel, resolveProvider, tool, } from './agent/index.js';
2
2
  export type { AccountInfo, AgentConfig, AgentModelInput, BundledProviderName, CanUseTool, CanUseToolContext, ClaudeModel, ForkSubagentOptions, IAgentSession, McpServerStatus, Message, MessageChunk, MessageRole, ModelInfo, ModelProvider, OutputEvent, PermissionBubbler, PermissionDecision, PermissionMode, ProviderEvent, ProviderQuery, ProviderUserTurn, QueryOptions, RenderHints, ResponseMetadata, SDKStatus, SendMessageOptions, StructuredMessageOptions, SessionIdentity, SessionMetadata, SessionState, SessionRef, SlashCommand, SubagentHandle, SubagentManagerOptions, SubagentResult, SubagentStatus, ToolConfig, ToolDiffChunk, ToolPermission, ToolPermissionMode, ToolPermissionRules, ToolResultChunk, CustomToolDef, } from './agent/index.js';
3
3
  export type { DiffHunk, DiffLine, DiffPayload } from './utils/diff.js';
4
4
  export { registerSkill, listSkills, getSkill, } from './skills/index.js';