agent-afk 5.130.2 → 5.130.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,8 @@ export type { EditorNotifyKind };
5
5
  export interface EditorHandoffDeps {
6
6
  compositor: TerminalCompositor | null;
7
7
  notify: (kind: EditorNotifyKind, message: string) => void;
8
+ suspendFooter?: () => void;
9
+ resumeFooter?: () => void;
8
10
  }
9
11
  export type EditorHandoffResult = 'no-tty' | 'no-editor' | 'loaded' | 'kept' | 'spawn-failed';
10
12
  export declare function openEditorForBuffer(deps: EditorHandoffDeps): Promise<EditorHandoffResult>;
@@ -9,6 +9,8 @@ export interface EditorSpawnDeps {
9
9
  compositor: TerminalCompositor | null;
10
10
  filePath: string;
11
11
  notify: (kind: EditorNotifyKind, message: string) => void;
12
+ suspendFooter?: () => void;
13
+ resumeFooter?: () => void;
12
14
  }
13
15
  export declare function resolveEditor(): {
14
16
  cmd: string;
@@ -90,6 +90,8 @@ export interface SlashContext {
90
90
  };
91
91
  swapElicitationHandler?: (handler: ElicitationHandler | null) => void;
92
92
  stdinElicitationHandler?: ElicitationHandler;
93
+ suspendFooter?: () => void;
94
+ resumeFooter?: () => void;
93
95
  }
94
96
  export type SlashResult = 'continue' | 'exit' | 'forward' | {
95
97
  rerun: string;
package/dist/cli.mjs CHANGED
@@ -316,7 +316,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
316
316
 
317
317
  ${t}`}var Ode,Ox=y(()=>{"use strict";Ode=new Set(["script","style","noscript","template","svg"])});function Fde(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 xB(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Lde(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 AB(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Fde,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!$de.has(d.status)||u===o)return d;let p=Lde(d,s)??xB(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=xB(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var $de,CB=y(()=>{"use strict";fe();$de=new Set([429,502,503,504])});import{BlockList as Nde,isIP as $x}from"node:net";import{lookup as Bde}from"node:dns/promises";import{Agent as Ude}from"undici";function IB(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Kde(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Dx(e){let t=$x(e);return t===0?!1:Wde.check(e,t===4?"ipv4":"ipv6")}async function PB(e){return Bde(e,{all:!0,verbatim:!0})}async function Fx(e,t={}){if(t.allowPrivateHosts??IB())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=Kde(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if($x(r)!==0)return Dx(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??PB,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(Dx(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Ep(e,t={}){let n=await Fx(e,t);if(!n.allowed)throw new ir(n.reason)}async function sy(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=_B;s++){await Ep(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??IB())?{dispatcher:Gde}:{}},l=await AB(e,i,a,r.retry??{});if(!qde.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new ir(`too many redirects (>${_B}) starting from ${t}`)}var jde,Hde,Wde,ir,Gde,_B,qde,Lx=y(()=>{"use strict";N();CB();jde=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],Hde=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Wde=(()=>{let e=new Nde;for(let[t,n]of jde)e.addSubnet(t,n,"ipv4");for(let[t,n]of Hde)e.addSubnet(t,n,"ipv6");return e})(),ir=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Gde=new Ude({connect:{lookup(e,t,n){PB(e).then(r=>{let o=r.find(s=>Dx(s.address));if(o!==void 0){n(new ir(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,$x(i.address))},r=>n(r,"",0))}}});_B=20,qde=new Set([301,302,303,307,308])});import{readFileSync as zde}from"node:fs";import{join as Vde}from"path";function Yde(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function MB(e,t){return Yde(t).test(e)}function Qde(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(Jde.has(t))return!0;if(Xde.has(t))return!1}return!1}function OB(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Zde(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 DB(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Rd(t),t}function epe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function tpe(e){try{return zde(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function npe(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=DB(t.defaultProfile)),n}function $B(e){let t=e?.env??v,n=e?.readFileSync??tpe,r=e?.surface??t.AGENT_SURFACE,o=Qde(t.AFK_BROWSER_HEADLESS,r),i=OB(t.AFK_BROWSER_ALLOWED_DOMAINS),s=OB(t.AFK_BROWSER_BLOCKED_DOMAINS),a=epe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Zde(t.AFK_BROWSER_BACKEND),c=DB(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():Vde(Qn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=npe(u,g);return h.configPath=p,h}function ay(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(MB(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>MB(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Jde,Xde,ly=y(()=>{"use strict";N();H();Jde=new Set(["daemon","subagent","telegram","afk"]),Xde=new Set(["repl","interactive","cli"])});import{existsSync as rpe,readFileSync as ope}from"node:fs";import{createRequire as ipe}from"node:module";import{dirname as spe,join as ape}from"node:path";function NB(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<cpe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function an(e){let t=NB(e);return LB.some(n=>t.includes(n))}function upe(){try{let t=ipe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(ope(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=ape(spe(t),o);return rpe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Rp(){return FB??=upe()??lpe,FB}function Nx(e){return e.includes("install chromium")}function Nn(e,t){let n=NB(e),r=t?.latched===!0?` ${dpe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${Rp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Rp()}). Or pick a different tool.${r}`}function xp(e,t,n=!1){if(!an(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
318
318
 
319
- ${Nn(e,{headless:t,latched:n})}`,{cause:e})}var LB,lpe,cpe,FB,dpe,cy=y(()=>{"use strict";LB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],lpe="pnpm exec playwright install chromium",cpe=4;dpe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Hs from"node:fs";import uy from"node:path";import{randomBytes as ppe}from"node:crypto";import{chromium as mpe}from"playwright";function fpe(){try{return"5.130.2"}catch{}try{let e=uy.resolve(import.meta.dirname,"../../../package.json"),t=Hs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var gpe,dy,BB=y(()=>{"use strict";cy();H();fe();gpe=fpe(),dy=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=mpe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=xp(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${gpe}`}}loadStorageState(t){let n=xd(t);try{if(!Hs.existsSync(n))return;let r=JSON.parse(Hs.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=xd(t);if(!Hs.existsSync(r))return;let o=await n.storageState(),i=uy.join(uy.dirname(r),`.${uy.basename(r)}.${process.pid}.${ppe(4).toString("hex")}.tmp`);Hs.writeFileSync(i,JSON.stringify(o),{mode:384}),Hs.chmodSync(i,384),Hs.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as hpe}from"crypto";function UB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&ype.test(e.label))}function jB(e){return hpe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function HB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var ype,py=y(()=>{"use strict";ype=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as bpe}from"node:crypto";function Spe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function wpe(e,t,n){return`el_${bpe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function vpe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function WB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function GB(e,t){let n=e.role??"",r=e.name??"";KB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])GB(i,t)}async function kpe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},qB).catch(()=>[])}async function Tpe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},qB).catch(()=>[])}function Epe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function my(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Epe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=kpe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],GB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Tpe(e)).filter(D=>KB.has(D.role??"")));let w=new Map;for(let P of p){let D=WB(P.name),j=w.get(D);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(WB(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let j=P.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(j!==F)return j-F;let X=P.dom?.bbox.x??0,U=D.dom?.bbox.x??0;return X-U}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let j=P.ax.role??"generic",F=P.ax.name??"",X=wpe(j,F,D),U=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,K=null;P.ax.value!==void 0&&P.ax.value!==null&&(K=String(P.ax.value)),P.ax.checked!==void 0&&(K=String(P.ax.checked)),UB({role:j,kind:W})&&(K="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let $={id:X,role:j,label:Spe(F),kind:W,value:K,state:M,bbox:U};return z!==void 0&&($.selector=z),$}),_="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?_="loading":P==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=vpe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var KB,qB,zB=y(()=>{"use strict";py();KB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);qB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function VB(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Bx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>VB(e,i)))).filter(o=>o!==null)}async function Rpe(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 Ux(e,t,n){switch(t.kind){case"element_id":return xpe(e,t,n);case"selector":return Ape(e,t);case"semantic":return Cpe(e,t)}}async function xpe(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 Bx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Ape(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 Bx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Cpe(e,t){return t.role!==void 0?_pe(e,t.text,t.role):Ipe(e,t.text,t)}async function _pe(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 Bx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Ipe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Rpe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await VB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var YB=y(()=>{"use strict"});async function jx(e,t,n,r){let o=e.url();if(o===n)return null;let i=ay(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var JB=y(()=>{"use strict";ly()});import{randomBytes as Ppe}from"crypto";import{mkdir as Mpe,stat as Ope,writeFile as Dpe}from"fs/promises";import{join as Hx}from"path";import{gzip as $pe}from"zlib";import{promisify as Fpe}from"util";function Lpe(e){return Hx(yn(e),"browser")}function Npe(e){return Hx(Lpe(e),"screenshots")}function Bpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Upe(){return Ppe(3).toString("hex")}async function Wx(e,t,n){if(t.length>XB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${XB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Npe(e);await Mpe(r,{recursive:!0});let o=`${Bpe()}-${Upe()}-${n}.png`,i=Hx(r,o);await Dpe(i,t);let{size:s}=await Ope(i);return{path:i,bytes:s}}var JJe,XB,QB=y(()=>{"use strict";H();py();JJe=Fpe($pe);XB=5*1024*1024});var eU={};ro(eU,{PlaywrightProvider:()=>Kx});function ZB(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 Kx,tU=y(()=>{"use strict";BB();zB();YB();ly();JB();QB();Kx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dy(t)}async open(t){let n=ay(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await jx(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await my(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await my(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 Ux(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ZB(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await jx(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await my(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await Ux(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ZB(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Wx(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Wx(n,o,r);return i}catch{return null}}}});var Ks={};ro(Ks,{__resetBrowserRegistryForTests:()=>Gpe,browserProviderActive:()=>Wpe,closeBrowserProvider:()=>Gx,getBrowserProvider:()=>Hpe,peekBrowserProvider:()=>Kpe});function nU(){Promise.resolve(Gx()).then(()=>{process.exit(130)})}function rU(){Promise.resolve(Gx()).then(()=>{process.exit(143)})}function oU(){Dr=null}function jpe(){fy||(process.on("SIGINT",nU),process.on("SIGTERM",rU),process.on("exit",oU),fy=!0)}function iU(){fy&&(process.removeListener("SIGINT",nU),process.removeListener("SIGTERM",rU),process.removeListener("exit",oU),fy=!1)}async function Hpe(e){return Dr!==null?Dr:(Ws!==null||(Ws=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(tU(),eU)),n=$B(e),r=new t(n);return jpe(),Dr=r,Ws=null,r})()),Ws)}async function Gx(){if(Dr===null)return;let e=Dr;Dr=null,Ws=null,iU(),await e.shutdown()}function Wpe(){return Dr!==null}function Kpe(){return Dr}function Gpe(){Dr=null,Ws=null,iU()}var Dr,Ws,fy,Gs=y(()=>{"use strict";ly();Dr=null,Ws=null,fy=!1});async function sU(e,t){try{return await TB(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Xpe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Gs(),Ks));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function aU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Xpe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await sy(n,e,{headers:Jpe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Ype.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Vpe.test(p)&&!zpe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await sU(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof ir||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=Mx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Ep(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Ep(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Ep(d.finalUrl,o);let p=await sU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=Mx({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof ir)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var zpe,Vpe,Ype,Jpe,lU=y(()=>{"use strict";EB();Ox();Lx();fe();zpe=/(text\/html|application\/xhtml\+xml)/i,Vpe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Ype=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Jpe={"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 eme(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Qpe,{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),Zpe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function cU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?eme({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 uU(e,t){if(t.length===0)return`# Search results for "${e}"
319
+ ${Nn(e,{headless:t,latched:n})}`,{cause:e})}var LB,lpe,cpe,FB,dpe,cy=y(()=>{"use strict";LB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],lpe="pnpm exec playwright install chromium",cpe=4;dpe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Hs from"node:fs";import uy from"node:path";import{randomBytes as ppe}from"node:crypto";import{chromium as mpe}from"playwright";function fpe(){try{return"5.130.4"}catch{}try{let e=uy.resolve(import.meta.dirname,"../../../package.json"),t=Hs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var gpe,dy,BB=y(()=>{"use strict";cy();H();fe();gpe=fpe(),dy=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=mpe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=xp(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${gpe}`}}loadStorageState(t){let n=xd(t);try{if(!Hs.existsSync(n))return;let r=JSON.parse(Hs.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=xd(t);if(!Hs.existsSync(r))return;let o=await n.storageState(),i=uy.join(uy.dirname(r),`.${uy.basename(r)}.${process.pid}.${ppe(4).toString("hex")}.tmp`);Hs.writeFileSync(i,JSON.stringify(o),{mode:384}),Hs.chmodSync(i,384),Hs.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as hpe}from"crypto";function UB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&ype.test(e.label))}function jB(e){return hpe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function HB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var ype,py=y(()=>{"use strict";ype=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as bpe}from"node:crypto";function Spe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function wpe(e,t,n){return`el_${bpe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function vpe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function WB(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function GB(e,t){let n=e.role??"",r=e.name??"";KB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])GB(i,t)}async function kpe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},qB).catch(()=>[])}async function Tpe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},qB).catch(()=>[])}function Epe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function my(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Epe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=kpe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],GB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Tpe(e)).filter(D=>KB.has(D.role??"")));let w=new Map;for(let P of p){let D=WB(P.name),j=w.get(D);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(WB(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let j=P.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(j!==F)return j-F;let X=P.dom?.bbox.x??0,U=D.dom?.bbox.x??0;return X-U}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let j=P.ax.role??"generic",F=P.ax.name??"",X=wpe(j,F,D),U=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,K=null;P.ax.value!==void 0&&P.ax.value!==null&&(K=String(P.ax.value)),P.ax.checked!==void 0&&(K=String(P.ax.checked)),UB({role:j,kind:W})&&(K="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let $={id:X,role:j,label:Spe(F),kind:W,value:K,state:M,bbox:U};return z!==void 0&&($.selector=z),$}),_="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?_="loading":P==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=vpe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var KB,qB,zB=y(()=>{"use strict";py();KB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);qB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function VB(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Bx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>VB(e,i)))).filter(o=>o!==null)}async function Rpe(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 Ux(e,t,n){switch(t.kind){case"element_id":return xpe(e,t,n);case"selector":return Ape(e,t);case"semantic":return Cpe(e,t)}}async function xpe(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 Bx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Ape(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 Bx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Cpe(e,t){return t.role!==void 0?_pe(e,t.text,t.role):Ipe(e,t.text,t)}async function _pe(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 Bx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Ipe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Rpe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await VB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var YB=y(()=>{"use strict"});async function jx(e,t,n,r){let o=e.url();if(o===n)return null;let i=ay(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var JB=y(()=>{"use strict";ly()});import{randomBytes as Ppe}from"crypto";import{mkdir as Mpe,stat as Ope,writeFile as Dpe}from"fs/promises";import{join as Hx}from"path";import{gzip as $pe}from"zlib";import{promisify as Fpe}from"util";function Lpe(e){return Hx(yn(e),"browser")}function Npe(e){return Hx(Lpe(e),"screenshots")}function Bpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Upe(){return Ppe(3).toString("hex")}async function Wx(e,t,n){if(t.length>XB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${XB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Npe(e);await Mpe(r,{recursive:!0});let o=`${Bpe()}-${Upe()}-${n}.png`,i=Hx(r,o);await Dpe(i,t);let{size:s}=await Ope(i);return{path:i,bytes:s}}var JJe,XB,QB=y(()=>{"use strict";H();py();JJe=Fpe($pe);XB=5*1024*1024});var eU={};ro(eU,{PlaywrightProvider:()=>Kx});function ZB(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 Kx,tU=y(()=>{"use strict";BB();zB();YB();ly();JB();QB();Kx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dy(t)}async open(t){let n=ay(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await jx(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await my(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await my(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 Ux(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ZB(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await jx(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await my(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await Ux(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ZB(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Wx(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Wx(n,o,r);return i}catch{return null}}}});var Ks={};ro(Ks,{__resetBrowserRegistryForTests:()=>Gpe,browserProviderActive:()=>Wpe,closeBrowserProvider:()=>Gx,getBrowserProvider:()=>Hpe,peekBrowserProvider:()=>Kpe});function nU(){Promise.resolve(Gx()).then(()=>{process.exit(130)})}function rU(){Promise.resolve(Gx()).then(()=>{process.exit(143)})}function oU(){Dr=null}function jpe(){fy||(process.on("SIGINT",nU),process.on("SIGTERM",rU),process.on("exit",oU),fy=!0)}function iU(){fy&&(process.removeListener("SIGINT",nU),process.removeListener("SIGTERM",rU),process.removeListener("exit",oU),fy=!1)}async function Hpe(e){return Dr!==null?Dr:(Ws!==null||(Ws=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(tU(),eU)),n=$B(e),r=new t(n);return jpe(),Dr=r,Ws=null,r})()),Ws)}async function Gx(){if(Dr===null)return;let e=Dr;Dr=null,Ws=null,iU(),await e.shutdown()}function Wpe(){return Dr!==null}function Kpe(){return Dr}function Gpe(){Dr=null,Ws=null,iU()}var Dr,Ws,fy,Gs=y(()=>{"use strict";ly();Dr=null,Ws=null,fy=!1});async function sU(e,t){try{return await TB(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Xpe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Gs(),Ks));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function aU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Xpe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await sy(n,e,{headers:Jpe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Ype.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Vpe.test(p)&&!zpe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await sU(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof ir||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=Mx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Ep(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Ep(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Ep(d.finalUrl,o);let p=await sU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=Mx({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof ir)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var zpe,Vpe,Ype,Jpe,lU=y(()=>{"use strict";EB();Ox();Lx();fe();zpe=/(text\/html|application\/xhtml\+xml)/i,Vpe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Ype=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Jpe={"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 eme(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Qpe,{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),Zpe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function cU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?eme({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 uU(e,t){if(t.length===0)return`# Search results for "${e}"
320
320
 
321
321
  (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(`
322
322
  `).trimEnd()}var Qpe,Zpe,dU=y(()=>{"use strict";rt();Qpe="https://api.exa.ai/search",Zpe=10});function gy(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var qs=y(()=>{"use strict";cy()});function sme(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=tme;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,nme)}let a=rme;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,ome)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function qx(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:lo(e,t),truncated:!0}}function ame(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=sme(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await Fx(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await sy(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof ir?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=qx(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await aU(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=qx(RB(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof ir)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=an(p)&&!Nx(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Rp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=cU({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:ime,timeoutMs:s.timeoutMs,signal:a.signal}),f=qx(uU(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var tme,nme,rme,ome,ime,pU,mU=y(()=>{"use strict";lU();dU();Lx();oi();Ox();qs();tme=3e4,nme=12e4,rme=1e5,ome=1e6,ime=10;pU=ame()});import{existsSync as gU,mkdirSync as lme,readFileSync as cme,renameSync as ume,unlinkSync as dme,writeFileSync as pme}from"node:fs";import{dirname as fU,join as mme}from"node:path";import{randomBytes as fme}from"node:crypto";function Tn(e){let t=e??ME();if(!gU(t))return[];try{let n=cme(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function ui(e,t){let n=t??ME();lme(fU(n),{recursive:!0});let r=mme(fU(n),`.schedules.json.${process.pid}.${fme(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{pme(r,o,"utf-8"),ume(r,n)}catch(i){try{gU(r)&&dme(r)}catch{}throw i}}function hy(e,t){let n=Tn(t),r=n.map(l=>l.id),o=gme(e.name),i=hme(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),ui(n,t),a}function yy(e,t){let n=Tn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(ui(o,t),!0)}function Ap(e,t){return Tn(t).find(n=>n.id===e)}function gme(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function hme(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function by(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Sy=y(()=>{"use strict";H()});import{existsSync as yme,readFileSync as bme}from"node:fs";import{join as Sme}from"node:path";async function Bn(e,t,n){let r,o;try{let i=Sme(xg("default"),"port");if(!yme(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=bme(i,"utf-8").trim(),a=wme(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function wme(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var di,zx=y(()=>{"use strict";H();di="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as vme}from"node:fs";import{readFile as kme}from"node:fs/promises";var hU,yU,bU,SU,wU=y(()=>{"use strict";Sy();H();zx();hU=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=hy({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await Bn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await Bn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:di}})}},yU=async(e,t)=>{let n=Tn();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},bU=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=wr();if(!vme(i))return{content:JSON.stringify([])};let s;try{let c=await kme(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1720,9 +1720,9 @@ ${c}`)}o.push({type:"text",text:i});let l=ck(e,{skillName:"init",out:ju(),onCanc
1720
1720
  `).map(p=>` ${p}`);o.push(d.join(`
1721
1721
  `)),o.push(""),s<e.length-1&&(o.push(me()),o.push(""))}return o.push(me()),o.join(`
1722
1722
  `)+`
1723
- `}function cMe(){let e=v.PAGER;if(e){let t=e.split(/\s+/);return{cmd:t[0],args:t.slice(1)}}return{cmd:"less",args:["-R"]}}var h9,y9=y(()=>{"use strict";N();L();yt();mt();Zo();h9={name:"/transcript",aliases:["/t"],summary:"View full session transcript in $PAGER",hint:"When you want to read the full conversation \u2014 all turns, tool calls, costs \u2014 in a scrollable pager.",async handler(e){let{stats:t,out:n}=e;if(t.turns.length===0)return n.info("No turns yet in this session."),"continue";let r=lMe(t.turns,String(t.model),t.sessionStartTime,t.totalCostUsd);if(!process.stdout.isTTY)return n.raw(r),"continue";let o=cMe();if(!o)return n.raw(r),"continue";let i=g9.join(f9.tmpdir(),`afk-transcript-${Date.now()}.txt`);await m9.writeFile(i,r,{mode:384});let s=e.getCompositor?.()??null,a=!1,l=()=>{if(!a){a=!0;try{process.stdin.resume()}catch{}s?.resumeInput()}};s?.suspendInput();try{process.stdin.pause()}catch{}return new Promise(c=>{let u=p=>{l(),p&&n.raw(r),m9.unlink(i).catch(()=>{}),c("continue")},d;try{d=oMe(o.cmd,[...o.args,i],{stdio:"inherit"})}catch{u(!0);return}d.on("error",()=>u(!0)),d.on("exit",()=>u(!1))})}}});import{spawn as uMe}from"node:child_process";function qu(){let e=v.VISUAL?.trim()||v.EDITOR?.trim()||"";if(!e)return null;let t=e.split(/\s+/);return{cmd:t[0],args:t.slice(1)}}async function Of(e){let{compositor:t,filePath:n,notify:r}=e;if(!t||!process.stdout.isTTY)return r("info","The editor handoff needs an interactive terminal \u2014 not available on this surface."),{outcome:"no-tty",exitCode:null};let o=qu();if(!o)return r("error","No editor configured. Set $VISUAL or $EDITOR (e.g. `export EDITOR=vim`) to compose prompts externally."),{outcome:"no-editor",exitCode:null};let i=!1,s=()=>{if(!i){i=!0;try{process.stdin.resume()}catch{}t.resumeInput()}};t.suspendInput();try{process.stdin.pause()}catch{}try{let a=await new Promise(l=>{let c;try{c=uMe(o.cmd,[...o.args,n],{stdio:"inherit"})}catch{l(Number.NaN);return}c.on("error",()=>l(Number.NaN)),c.on("exit",u=>l(u))});return Number.isNaN(a)?{outcome:"spawn-failed",exitCode:null}:a!==0?{outcome:"nonzero",exitCode:a}:{outcome:"clean",exitCode:a}}finally{s()}}var Kk=y(()=>{"use strict";N()});import{promises as Gk}from"node:fs";import*as b9 from"node:os";import*as c0 from"node:path";async function qk(e){let{compositor:t,notify:n}=e;if(!t||!process.stdout.isTTY||!qu()){let{outcome:s}=await Of({compositor:t,filePath:"",notify:n});return s==="no-editor"?"no-editor":"no-tty"}let r=t.getBuffer().text,o=await Gk.mkdtemp(c0.join(b9.tmpdir(),"afk-editor-")),i=c0.join(o,"prompt.md");await Gk.writeFile(i,r,{mode:384});try{let{outcome:s,exitCode:a}=await Of({compositor:t,filePath:i,notify:n});if(s==="spawn-failed"){let u=qu();return n("warn",`Could not launch editor \`${u?.cmd??"editor"}\` \u2014 keeping your current prompt.`),"spawn-failed"}if(s!=="clean")return n("warn",`Editor exited with status ${a} \u2014 keeping your current prompt.`),"kept";let l=await Gk.readFile(i,"utf8"),c=l.endsWith(`
1724
- `)?l.slice(0,-1):l;return t.applyEdit(G.seed(c)),"loaded"}finally{Gk.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}var u0=y(()=>{"use strict";pn();Kk()});var S9,w9=y(()=>{"use strict";u0();S9={name:"/editor",aliases:["/edit"],summary:"Compose the current prompt in your external $EDITOR (Ctrl+O)",hint:"When your prompt is long enough to want real editor keybindings \u2014 opens $VISUAL/$EDITOR seeded with the input box; on exit the text loads back for you to review and submit.",async handler(e){return await qk({compositor:e.getCompositor?.()??null,notify:(t,n)=>{t==="error"?e.out.error(n):t==="warn"?e.out.warn(n):e.out.info(n)}}),"continue"}}});function zu(e){let t=ci(e);return t?Os(t.content):0}function zk(e,t){ry(),mB();let n=e.stats.cwd??process.cwd(),{prompt:r,source:o}=cn(n),i=ot(void 0,n),s=o.includes("env:AFK_SYSTEM_PROMPT")||o.includes("file:"),a=s?null:ci(n),l=a?Os(a.content):0,c=tu(r,i.autoRouting?.interactive??!0,"repl");return{applied:e.session.current.setSystemPrompt(c),tokens:l,delta:l-t,source:o,shadowed:s}}function Vk(e){return e===0?"no size change":e>0?`+${e}`:`${e}`}var d0=y(()=>{"use strict";vp();vp();Tt();Tt();ft();Ow();Ht()});import{existsSync as p0,readFileSync as dMe,realpathSync as v9,statSync as pMe}from"node:fs";function mMe(e,t){if(e===t)return!0;if(!p0(e)||!p0(t))return!1;try{return v9(e)===v9(t)}catch{return!1}}function k9(e,t,n){let r=e==="user"?"personal":"project";if(!p0(t))return{scope:e,label:r,path:t,exists:!1,bytes:0,tokens:0,blank:!1,duplicate:n};let o=0,i="";try{o=pMe(t).size,i=dMe(t,"utf-8").trim()}catch{return{scope:e,label:r,path:t,exists:!0,bytes:o,tokens:0,blank:!0,duplicate:n}}return{scope:e,label:r,path:t,exists:!0,bytes:o,tokens:i.length>0?Os(i):0,blank:i.length===0,duplicate:n}}function m0(e=process.cwd()){let t=Cg(),n=_g(e);return[k9("user",t,!1),k9("project",n,mMe(n,t))]}function f0(e,t){let n=m0(t).find(r=>r.scope===e);if(!n)throw new Error(`unknown AFK.md scope: ${e}`);return n}function Yk(e){return e.exists&&!e.blank&&!e.duplicate}function fMe(e){return e<1024?`${e} B`:`${(e/1024).toFixed(1)} KB`}function ja(e){return e<1e3?`~${e}`:`~${(e/1e3).toFixed(1)}k`}function gMe(e){return e.exists?e.blank?m.warning("empty \u2014 treated as absent"):e.duplicate?m.warning("same file as personal \u2014 counted once"):m.success("loaded"):m.dim("missing")}function E9(e){let t=[];for(let n of e){let r=Yk(n)?`${fMe(n.bytes)} ${ja(n.tokens)} tok`:"",o=n.scope==="project"&&Yk(n)?m.dim(" \u2190 wins on conflict"):"";t.push(` ${n.label.padEnd(9)} ${m.dim(n.path)}`),t.push(` ${"".padEnd(9)} ${gMe(n)}${r?` ${r}`:""}${o}`)}return t}var T9,g0=y(()=>{"use strict";Ht();H();L();T9=1e4});import{mkdirSync as hMe,readFileSync as yMe,writeFileSync as x9,existsSync as bMe}from"node:fs";import{dirname as SMe}from"node:path";function wMe(e){let t=e.scope==="user"?"Applies to every project on this machine. Loaded first.":"Applies to this project only. Loaded last, so it wins on conflict.";return[`# ${e.scope==="user"?"Personal":"Project"} AFK configuration`,"",`<!-- ${t}`,' This file is appended to the system prompt under "# Operator configuration".'," Edit it with /afk-md; changes hot-reload into the running session. -->","",""].join(`
1725
- `)}function A9(e){return bMe(e.path)?!1:(hMe(SMe(e.path),{recursive:!0}),x9(e.path,wMe(e),"utf-8"),!0)}function h0(e){try{return yMe(e,"utf-8")}catch{return""}}function vMe(e,t){e.out.line(` ${m.success(`+${t.addedLines}`)} ${m.error(`-${t.removedLines}`)}`);let n=0;for(let o of t.hunks){if(n>=R9)break;e.out.line(m.dim(` @@ -${o.oldStart},${o.oldLines} +${o.newStart},${o.newLines} @@`));for(let i of o.lines){if(n>=R9)break;let s=` ${i.kind}${i.text}`;i.kind==="+"?e.out.line(m.success(s)):i.kind==="-"?e.out.line(m.error(s)):e.out.line(m.dim(s)),n++}}let r=t.hunks.reduce((o,i)=>o+i.lines.length,0);r>n&&e.out.line(m.dim(` \u2026 ${r-n} more diff lines (see the file for the rest)`))}function C9(e,t){let{applied:n,tokens:r,delta:o,source:i,shadowed:s}=zk(e,t);s?e.out.warn("Saved to disk, but AFK.md is shadowed by a higher-priority system prompt override and is not part of what the model receives."):n?e.out.success(`Reloaded into this session \u2014 overlay now ${ja(r)} tokens (${Vk(o)}). Takes effect on your next message.`):e.out.warn("Saved to disk, but this provider cannot swap the prompt of a running session \u2014 it applies on next launch."),e.out.line(m.dim(` ${i}`))}async function _9(e,t){A9(t)&&e.out.info(`Created ${t.path}`);let r=h0(t.path),o=zu(e.stats.cwd),{outcome:i,exitCode:s}=await Of({compositor:e.getCompositor?.()??null,filePath:t.path,notify:(c,u)=>{c==="error"?e.out.error(u):c==="warn"?e.out.warn(u):e.out.info(u)}});if(i==="no-tty"||i==="no-editor"){e.out.line(m.dim(` Edit it directly: ${t.path}`));return}if(i==="spawn-failed"){e.out.warn("Could not launch your editor \u2014 the file is unchanged.");return}if(i==="nonzero"){e.out.warn(`Editor exited with status ${s} \u2014 treating that as "discard", nothing reloaded.`);return}let a=h0(t.path),l=Ul(r,a);if(!l){e.out.info("No changes.");return}vMe(e,l),a.trim().length===0&&e.out.warn("This file is now empty \u2014 the tier is treated as ABSENT and contributes nothing."),C9(e,o)}function I9(e,t,n){let r=A9(t),o=zu(e.stats.cwd),i=h0(t.path),s=i.length===0||i.endsWith(`
1723
+ `}function cMe(){let e=v.PAGER;if(e){let t=e.split(/\s+/),n=t[0],r=t.slice(1);return n==="less"&&!r.includes("-R")&&r.push("-R"),{cmd:n,args:r}}return{cmd:"less",args:["-R"]}}var h9,y9=y(()=>{"use strict";N();L();yt();mt();Zo();h9={name:"/transcript",aliases:["/t"],summary:"View full session transcript in $PAGER",hint:"When you want to read the full conversation \u2014 all turns, tool calls, costs \u2014 in a scrollable pager.",async handler(e){let{stats:t,out:n}=e;if(t.turns.length===0)return n.info("No turns yet in this session."),"continue";let r=lMe(t.turns,String(t.model),t.sessionStartTime,t.totalCostUsd);if(!process.stdout.isTTY)return n.raw(r),"continue";let o=cMe();if(!o)return n.raw(r),"continue";let i=g9.join(f9.tmpdir(),`afk-transcript-${Date.now()}.txt`);await m9.writeFile(i,r,{mode:384});let s=e.getCompositor?.()??null,a=!1,l=()=>{if(!a){a=!0;try{process.stdin.resume()}catch{}s?.resumeInput(),e.resumeFooter?.()}};s?.suspendInput(),e.suspendFooter?.();try{process.stdin.pause()}catch{}return new Promise(c=>{let u=p=>{l(),p&&n.raw(r),m9.unlink(i).catch(()=>{}),c("continue")},d;try{d=oMe(o.cmd,[...o.args,i],{stdio:"inherit"})}catch{u(!0);return}d.on("error",()=>u(!0)),d.on("exit",()=>u(!1))})}}});import{spawn as uMe}from"node:child_process";function qu(){let e=v.VISUAL?.trim()||v.EDITOR?.trim()||"";if(!e)return null;let t=e.split(/\s+/);return{cmd:t[0],args:t.slice(1)}}async function Of(e){let{compositor:t,filePath:n,notify:r}=e;if(!t||!process.stdout.isTTY)return r("info","The editor handoff needs an interactive terminal \u2014 not available on this surface."),{outcome:"no-tty",exitCode:null};let o=qu();if(!o)return r("error","No editor configured. Set $VISUAL or $EDITOR (e.g. `export EDITOR=vim`) to compose prompts externally."),{outcome:"no-editor",exitCode:null};let i=!1,s=()=>{if(!i){i=!0;try{process.stdin.resume()}catch{}t.resumeInput(),e.resumeFooter?.()}};t.suspendInput(),e.suspendFooter?.();try{process.stdin.pause()}catch{}try{let a=await new Promise(l=>{let c;try{c=uMe(o.cmd,[...o.args,n],{stdio:"inherit"})}catch{l(Number.NaN);return}c.on("error",()=>l(Number.NaN)),c.on("exit",u=>l(u))});return Number.isNaN(a)?{outcome:"spawn-failed",exitCode:null}:a!==0?{outcome:"nonzero",exitCode:a}:{outcome:"clean",exitCode:a}}finally{s()}}var Kk=y(()=>{"use strict";N()});import{promises as Gk}from"node:fs";import*as b9 from"node:os";import*as c0 from"node:path";async function qk(e){let{compositor:t,notify:n}=e;if(!t||!process.stdout.isTTY||!qu()){let{outcome:s}=await Of({compositor:t,filePath:"",notify:n});return s==="no-editor"?"no-editor":"no-tty"}let r=t.getBuffer().text,o=await Gk.mkdtemp(c0.join(b9.tmpdir(),"afk-editor-")),i=c0.join(o,"prompt.md");await Gk.writeFile(i,r,{mode:384});try{let{outcome:s,exitCode:a}=await Of({compositor:t,filePath:i,notify:n,suspendFooter:e.suspendFooter,resumeFooter:e.resumeFooter});if(s==="spawn-failed"){let u=qu();return n("warn",`Could not launch editor \`${u?.cmd??"editor"}\` \u2014 keeping your current prompt.`),"spawn-failed"}if(s!=="clean")return n("warn",`Editor exited with status ${a} \u2014 keeping your current prompt.`),"kept";let l=await Gk.readFile(i,"utf8"),c=l.endsWith(`
1724
+ `)?l.slice(0,-1):l;return t.applyEdit(G.seed(c)),"loaded"}finally{Gk.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}var u0=y(()=>{"use strict";pn();Kk()});var S9,w9=y(()=>{"use strict";u0();S9={name:"/editor",aliases:["/edit"],summary:"Compose the current prompt in your external $EDITOR (Ctrl+O)",hint:"When your prompt is long enough to want real editor keybindings \u2014 opens $VISUAL/$EDITOR seeded with the input box; on exit the text loads back for you to review and submit.",async handler(e){return await qk({compositor:e.getCompositor?.()??null,notify:(t,n)=>{t==="error"?e.out.error(n):t==="warn"?e.out.warn(n):e.out.info(n)},suspendFooter:e.suspendFooter,resumeFooter:e.resumeFooter}),"continue"}}});function zu(e){let t=ci(e);return t?Os(t.content):0}function zk(e,t){ry(),mB();let n=e.stats.cwd??process.cwd(),{prompt:r,source:o}=cn(n),i=ot(void 0,n),s=o.includes("env:AFK_SYSTEM_PROMPT")||o.includes("file:"),a=s?null:ci(n),l=a?Os(a.content):0,c=tu(r,i.autoRouting?.interactive??!0,"repl");return{applied:e.session.current.setSystemPrompt(c),tokens:l,delta:l-t,source:o,shadowed:s}}function Vk(e){return e===0?"no size change":e>0?`+${e}`:`${e}`}var d0=y(()=>{"use strict";vp();vp();Tt();Tt();ft();Ow();Ht()});import{existsSync as p0,readFileSync as dMe,realpathSync as v9,statSync as pMe}from"node:fs";function mMe(e,t){if(e===t)return!0;if(!p0(e)||!p0(t))return!1;try{return v9(e)===v9(t)}catch{return!1}}function k9(e,t,n){let r=e==="user"?"personal":"project";if(!p0(t))return{scope:e,label:r,path:t,exists:!1,bytes:0,tokens:0,blank:!1,duplicate:n};let o=0,i="";try{o=pMe(t).size,i=dMe(t,"utf-8").trim()}catch{return{scope:e,label:r,path:t,exists:!0,bytes:o,tokens:0,blank:!0,duplicate:n}}return{scope:e,label:r,path:t,exists:!0,bytes:o,tokens:i.length>0?Os(i):0,blank:i.length===0,duplicate:n}}function m0(e=process.cwd()){let t=Cg(),n=_g(e);return[k9("user",t,!1),k9("project",n,mMe(n,t))]}function f0(e,t){let n=m0(t).find(r=>r.scope===e);if(!n)throw new Error(`unknown AFK.md scope: ${e}`);return n}function Yk(e){return e.exists&&!e.blank&&!e.duplicate}function fMe(e){return e<1024?`${e} B`:`${(e/1024).toFixed(1)} KB`}function ja(e){return e<1e3?`~${e}`:`~${(e/1e3).toFixed(1)}k`}function gMe(e){return e.exists?e.blank?m.warning("empty \u2014 treated as absent"):e.duplicate?m.warning("same file as personal \u2014 counted once"):m.success("loaded"):m.dim("missing")}function E9(e){let t=[];for(let n of e){let r=Yk(n)?`${fMe(n.bytes)} ${ja(n.tokens)} tok`:"",o=n.scope==="project"&&Yk(n)?m.dim(" \u2190 wins on conflict"):"";t.push(` ${n.label.padEnd(9)} ${m.dim(n.path)}`),t.push(` ${"".padEnd(9)} ${gMe(n)}${r?` ${r}`:""}${o}`)}return t}var T9,g0=y(()=>{"use strict";Ht();H();L();T9=1e4});import{mkdirSync as hMe,readFileSync as yMe,writeFileSync as x9,existsSync as bMe}from"node:fs";import{dirname as SMe}from"node:path";function wMe(e){let t=e.scope==="user"?"Applies to every project on this machine. Loaded first.":"Applies to this project only. Loaded last, so it wins on conflict.";return[`# ${e.scope==="user"?"Personal":"Project"} AFK configuration`,"",`<!-- ${t}`,' This file is appended to the system prompt under "# Operator configuration".'," Edit it with /afk-md; changes hot-reload into the running session. -->","",""].join(`
1725
+ `)}function A9(e){return bMe(e.path)?!1:(hMe(SMe(e.path),{recursive:!0}),x9(e.path,wMe(e),"utf-8"),!0)}function h0(e){try{return yMe(e,"utf-8")}catch{return""}}function vMe(e,t){e.out.line(` ${m.success(`+${t.addedLines}`)} ${m.error(`-${t.removedLines}`)}`);let n=0;for(let o of t.hunks){if(n>=R9)break;e.out.line(m.dim(` @@ -${o.oldStart},${o.oldLines} +${o.newStart},${o.newLines} @@`));for(let i of o.lines){if(n>=R9)break;let s=` ${i.kind}${i.text}`;i.kind==="+"?e.out.line(m.success(s)):i.kind==="-"?e.out.line(m.error(s)):e.out.line(m.dim(s)),n++}}let r=t.hunks.reduce((o,i)=>o+i.lines.length,0);r>n&&e.out.line(m.dim(` \u2026 ${r-n} more diff lines (see the file for the rest)`))}function C9(e,t){let{applied:n,tokens:r,delta:o,source:i,shadowed:s}=zk(e,t);s?e.out.warn("Saved to disk, but AFK.md is shadowed by a higher-priority system prompt override and is not part of what the model receives."):n?e.out.success(`Reloaded into this session \u2014 overlay now ${ja(r)} tokens (${Vk(o)}). Takes effect on your next message.`):e.out.warn("Saved to disk, but this provider cannot swap the prompt of a running session \u2014 it applies on next launch."),e.out.line(m.dim(` ${i}`))}async function _9(e,t){A9(t)&&e.out.info(`Created ${t.path}`);let r=h0(t.path),o=zu(e.stats.cwd),{outcome:i,exitCode:s}=await Of({compositor:e.getCompositor?.()??null,filePath:t.path,notify:(c,u)=>{c==="error"?e.out.error(u):c==="warn"?e.out.warn(u):e.out.info(u)},suspendFooter:e.suspendFooter,resumeFooter:e.resumeFooter});if(i==="no-tty"||i==="no-editor"){e.out.line(m.dim(` Edit it directly: ${t.path}`));return}if(i==="spawn-failed"){e.out.warn("Could not launch your editor \u2014 the file is unchanged.");return}if(i==="nonzero"){e.out.warn(`Editor exited with status ${s} \u2014 treating that as "discard", nothing reloaded.`);return}let a=h0(t.path),l=Ul(r,a);if(!l){e.out.info("No changes.");return}vMe(e,l),a.trim().length===0&&e.out.warn("This file is now empty \u2014 the tier is treated as ABSENT and contributes nothing."),C9(e,o)}function I9(e,t,n){let r=A9(t),o=zu(e.stats.cwd),i=h0(t.path),s=i.length===0||i.endsWith(`
1726
1726
  `)?"":`
1727
1727
  `;x9(t.path,`${i}${s}- ${n}
1728
1728
  `,"utf-8"),r&&e.out.info(`Created ${t.path}`),e.out.success(`Appended to ${t.path}`),e.out.line(` ${m.success("+")} - ${n}`),C9(e,o)}var R9,P9=y(()=>{"use strict";Bh();L();Kk();d0();g0();R9=40});function kMe(e){e.out.line(m.heading("/afk-md \u2014 AFK.md prompt overlay"));for(let t of M9)e.out.line(t)}function TMe(e){return e==="user"||e==="u"||e==="1"||e==="personal"?"user":e==="project"||e==="p"||e==="2"?"project":null}function EMe(e){let t=e.stats.cwd??process.cwd(),n=m0(t),{source:r}=cn(t),o=ci(t),i=zu(t),s=o?Buffer.byteLength(o.content,"utf8"):0;e.out.line(m.heading("AFK.md prompt overlay")),e.out.line("");for(let c of E9(n))e.out.line(c);e.out.line("");let a=n.filter(Yk).length;a===0?e.out.line(m.dim(" No overlay is active \u2014 the framework prompt is running bare.")):e.out.line(` composed: ${s} B ${ja(i)} tokens across ${a} tier${a===1?"":"s"}`),e.out.line(m.dim(` ${r}`)),i>T9&&e.out.warn(`That overlay is ${ja(i)} tokens \u2014 it is prepended to every request in every session. Consider trimming it.`);let l=qu();e.out.line("");for(let c of M9)e.out.line(c);e.out.line(""),e.out.line(l?m.dim(` editor: ${l.cmd}`):m.dim(" editor: none \u2014 set $VISUAL or $EDITOR to enable in-REPL editing")),e.out.line(m.dim(" hot memory (HOT.md) + the fact archive are managed by the agent via memory_update \u2014")),e.out.line(m.dim(" this command edits your AFK.md prompt overlay."))}function RMe(e){let t=e.stats.cwd??process.cwd(),{source:n}=cn(t),r=ci(t);if(!r){e.out.info("No AFK.md overlay is active \u2014 nothing to show."),e.out.line(m.dim(` ${n}`));return}e.out.line(m.heading("Composed overlay \u2014 exactly what the model receives")),e.out.line(m.dim(` ${n}`)),e.out.line(""),e.out.raw(r.content),e.out.line("")}var M9,O9,D9=y(()=>{"use strict";vp();ft();L();Kk();P9();d0();g0();M9=[" /afk-md overview of both tiers and what the model receives"," /afk-md user edit your personal overlay in $EDITOR"," /afk-md project edit this project\u2019s overlay in $EDITOR"," /afk-md show print the composed overlay exactly as the model sees it"," /afk-md add <text> append a bullet to the project overlay (--user for personal)"," /afk-md reload re-read from disk into this live session"];O9={name:"/afk-md",aliases:["/memory","/mem"],summary:"Inspect + edit your AFK.md prompt overlay, hot-reloaded into this session",usage:"/afk-md [user|project|show|add <text>|reload]",hint:"When you want to change the standing instructions the agent runs under \u2014 opens the tier in $EDITOR, diffs what changed, and applies it to the RUNNING session (no restart).",flags:["--user"],async handler(e,t){let n=t.trim();if(n.length===0)return EMe(e),"continue";let[r="",...o]=n.split(/\s+/);if(r==="show")return RMe(e),"continue";if(r==="reload"){let s=zu(e.stats.cwd),{applied:a,tokens:l,delta:c,source:u,shadowed:d}=zk(e,s);return d?e.out.warn("AFK.md is shadowed by a higher-priority system prompt override; the file is not part of what the model receives."):a?e.out.success(`Re-read from disk \u2014 overlay now ${ja(l)} tokens (${Vk(c)}). Takes effect on your next message.`):e.out.warn("Re-read from disk, but this provider cannot swap the prompt of a running session \u2014 it applies on next launch."),e.out.line(m.dim(` ${u}`)),"continue"}if(r==="add"){let s=o.includes("--user"),a=o.filter(l=>l!=="--user").join(" ").trim();return a.length===0?(e.out.error("Nothing to add. Usage: /afk-md add <text> [--user]"),"continue"):(I9(e,f0(s?"user":"project",e.stats.cwd),a),"continue")}let i=TMe(r);return i?(await _9(e,f0(i,e.stats.cwd)),"continue"):(e.out.error(`Unknown subcommand \`${r}\`.`),kMe(e),"continue")}}});function AMe(e,t){let n=e.replace(/\s+/g," ").trim(),o=n.toLowerCase().indexOf(t.toLowerCase());if(o<0)return n;let i=Math.max(0,o-$9),s=Math.min(n.length,o+t.length+$9),a=n.slice(i,o),l=n.slice(o,o+t.length),c=n.slice(o+t.length,s),u=i>0?"\u2026":"",d=s<n.length?"\u2026":"";return`${u}${a}${m.warning(l)}${c}${d}`}function CMe(e,t){let n=t.toLowerCase(),r=[];for(let o=0;o<e.length;o++){let i=e[o],s=(i.user??"").toLowerCase().includes(n),a=(i.assistant??"").toLowerCase().includes(n);if(!s&&!a)continue;let l=s?"user":"assistant",c=s?i.user:i.assistant;r.push({ordinal:o+1,role:l,snippet:AMe(c,t)})}return r}function _Me(e){for(let t=e.length-1;t>=0;t--){let n=e[t].toolEvents;if(!(!n||n.length===0))for(let r=n.length-1;r>=0;r--){let o=n[r];if(o.isError!==!0)continue;let i=(o.result??"").replace(/\s+/g," ").trim(),s=i.length>F9?i.slice(0,F9-1)+"\u2026":i;return{ordinal:t+1,toolName:o.toolName,snippet:s}}}return null}function IMe(e){return e==="user"?`${m.brand("\u25B6")} ${m.meta("user")}`:`${m.brand("\u25C6")} ${m.meta("assistant")}`}function PMe(e){let{stats:t,out:n}=e,r=_Me(t.turns);if(!r){n.info("No tool errors recorded in this session.");return}n.line(),n.line(m.bold("Last tool error")),n.line(me());let o=` ${m.meta(`#${r.ordinal}`)} ${m.warning(r.toolName)}`;n.line(o),n.line(` ${r.snippet?m.dim(r.snippet):m.dim("(no error output captured)")}`),n.line()}function MMe(e,t){let{stats:n,out:r}=e;if(n.turns.length===0){r.info("No turns yet in this session.");return}let o=CMe(n.turns,t);if(o.length===0){r.info(`No matches for "${t}".`);return}let i=o.slice(-xMe),s=o.length-i.length;r.line(),r.line(m.bold(`Search: "${t}" (${o.length} match${o.length===1?"":"es"})`)),r.line(me());for(let a of i)r.line(` ${m.meta(`#${a.ordinal}`)} ${IMe(a.role)}`),r.line(` ${a.snippet}`);s>0&&(r.line(),r.line(m.dim(` \u2026and ${s} more (showing the ${i.length} most recent)`))),r.line()}var $9,xMe,F9,L9,N9=y(()=>{"use strict";L();yt();$9=90,xMe=20,F9=300;L9={name:"/search",usage:"/search <term> | /search --error",summary:"Search this session's turns (or --error to jump to the last tool error)",hint:"Find where something was said this session: /search <term> matches your prompts and the assistant's replies; /search --error jumps to the most recent tool failure.",flags:["--error"],async handler(e,t){let n=t.trim();return n==="--error"||n==="-e"?(PMe(e),"continue"):n===""?(e.out.info("Usage: /search <term> (or /search --error to jump to the last tool error)"),"continue"):(MMe(e,n),"continue")}}});import{execFileSync as OMe}from"node:child_process";function $Me(e){let t=e.split(`
@@ -1848,7 +1848,7 @@ _ended: ${new Date().toISOString()}_
1848
1848
  `),S(),p(E),h.prevBufferRows=0},T=()=>{S(),d({text:"",attachments:[...h.attachments]}),h.prevBufferRows=0};c=(E,R)=>{QQ(E,R,h,{opts:e,stdout:n,repaintCtx:b,callbacks:{onSubmit:w,onAbort:k,onEof:T},pasteWindowMs:g},Uf,jQ,HQ)},Uf(h,b),u=Ne.subscribe(()=>{h.prevBufferRows=0,h.prevStatusRows=0,h.rowsBelow=0,Uf(h,b)}),t.on("keypress",c)})}finally{e.statusLine?.setExtraRows(s),o.restore(),i?.release()}}N();nf();Ra();async function e7(e){return!process.stdout.isTTY||!process.stdin.isTTY||Ve()?NQ(e):ZQ(e)}BP();gf();Wi();Dt();Ra();_a();Lu();N();var wT=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;softStopHandler=null;pauseInterruptHandler=null;pendingReadReject=null;pendingReadResolve=null;slashRegistryView=hu();constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=bT()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY||Ve())return;let o=new Iu({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onSoftStop:()=>{this.softStopHandler?.()},onBackground:()=>{this.backgroundHandler?.()},onPauseInterrupt:()=>{this.pauseInterruptHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.onOpenEditor?{onOpenEditor:t.onOpenEditor}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:i=>Bo(i,this.slashRegistryView),caretBlink:C4()&&!sv(),captureMode:iv(),goblinSpinner:av(),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{},...t.anchorRow!==void 0?{anchorRow:t.anchorRow}:{},...t.suggest?{suggest:t.suggest}:{}});await o.arm(),o.setInputMode("idle"),o.setOnRewindRequest(()=>{this.requestRewind()}),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,t.primePromptSuggestion===!0&&n.primePromptGhost();let i=s=>{n.setOnSubmit(null),this.pendingReadReject=null,this.pendingReadResolve=null;let a=this.armedStdout??process.stdout,l=s.displayText??s.text,c=Ea({buffer:Bo(l,this.slashRegistryView),promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:xu([...s.attachments])});mn(n,c.split(`
1849
1849
  `)),r({text:s.text,attachments:[...s.attachments]})};n.setOnSubmit(i),t.initialBuffer!==void 0&&t.initialBuffer.length>0&&n.prefillInput(t.initialBuffer),n.setInputMode("idle"),n.repaint()})}return e7({rl:this.rl,promptFn:t.promptFn,...t.initialBuffer!==void 0?{initialBuffer:t.initialBuffer}:{},...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:[]})}requestRewind(){if(!this.pendingReadResolve)return!1;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;return this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"/rewind",attachments:[]}),!0}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};N();Cv();Fr();ts();S0();fe();QM();L();var Y0=["default","plan","bypassPermissions"];function YOe(e,t){switch(t){case"plan":e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 writes refused; read-only bash runs, mutating bash blocked."));return;case"bypassPermissions":e.out.line(m.bypass("\u26A1 bypass ON")+m.dim(" \u2014 path-approval prompts + containment OFF; read/write any path. (Does not affect ask_question.)"));return;case"default":e.out.success(m.success("\u25CB default")+m.dim(" \u2014 path containment + approval prompts restored."));return}}async function vT(e){let t=e.stats.permissionMode;if(t==="autonomous"){await Pf(e,!1);return}let n=Y0.indexOf(t),r=Y0[(n+1)%Y0.length]??"default";try{await e.session.current.setPermissionMode(r),e.stats.permissionMode=r,e.ui.repaintStatusLine(),YOe(e,r)}catch(o){e.out.error(`Could not switch permission mode: ${o instanceof Error?o.message:String(o)}`)}}u0();L();$p();Jr();L();function Ju(e){let t=m.brand("afk"),n=e==="plan"?m.warning(" \u25CF"):e==="autonomous"?m.info(" \u25D0"):e==="bypassPermissions"?m.bypass(" \u26A1 bp"):"";return t+n+m.brand(" \u203A ")}function t7(e){let t,n=e.history;if(n&&typeof n.push=="function"){let r=n.push.bind(n);n.push=o=>{let i=n.getEntries?.()?.[0];r(o);let s=n.getEntries?.()?.[0];s!==i&&(t=s)}}return{getLastSubmitted:()=>t}}N();function n7(e){if(!e.enabled)return{};let{engine:t,surface:n,stats:r,historyTracker:o}=e;return{suggest:{engine:t,getContext:()=>({model:r.model,apiKey:e.apiKey,baseUrl:e.baseUrl,cwd:r.cwd??process.cwd(),getHistory:()=>{let i=n.history;return i.getEntries?[...i.getEntries()]:[]},get lastSubmitted(){return o.getLastSubmitted()},getDropdownTopCandidate:i=>{let a=n.autocompleteState.candidates[0];return a&&a.value.startsWith(i)&&a.value.length>i.length?a.value:null},getTranscriptTail:()=>{let i=r.turns;return i.length===0?"":i.slice(-2).reverse().map(s=>`user: ${s.user}
1850
1850
  assistant: ${s.assistant}`).join(`
1851
- `)},getRecentCommands:()=>{let i=n.history;return i.getEntries?[...i.getEntries()]:[]},llmEnabled:()=>/^(1|true|yes|on)$/i.test(v.AFK_SUGGEST_ENABLED??""),promptSuggestEnabled:()=>/^(1|true|yes|on)$/i.test(v.AFK_SUGGEST_PROMPT??"")})}}}async function r7(e,t,n,r,o,i,s){let a=qJ({onError:g=>B("[afk suggest] Tier-2 completion failed:",g)}),l=t7(t);await t.armCompositor({promptFn:()=>Ju(e.stats.permissionMode),onCancel:o,onShiftTab:()=>{vT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},onOpenEditor:()=>{let g=t.getCompositor();qk({compositor:g,notify:(h,b)=>{let S=h==="error"?m.error(b):h==="warn"?m.warning(b):m.dim(b);g?.commitAbove(S)}}).catch(()=>{})},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...n7({enabled:i,engine:a,surface:t,stats:e.stats,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,historyTracker:l})});let c=t.getCompositor(),u=_f({readLine:g=>t.readLine({promptFn:()=>g}).then(h=>h.text),writer:{line:(g="")=>{let h=t.getCompositor();h?h.commitAbove(g):process.stdout.write(g+`
1851
+ `)},getRecentCommands:()=>{let i=n.history;return i.getEntries?[...i.getEntries()]:[]},llmEnabled:()=>/^(1|true|yes|on)$/i.test(v.AFK_SUGGEST_ENABLED??""),promptSuggestEnabled:()=>/^(1|true|yes|on)$/i.test(v.AFK_SUGGEST_PROMPT??"")})}}}async function r7(e,t,n,r,o,i,s){let a=qJ({onError:g=>B("[afk suggest] Tier-2 completion failed:",g)}),l=t7(t);await t.armCompositor({promptFn:()=>Ju(e.stats.permissionMode),onCancel:o,onShiftTab:()=>{vT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},onOpenEditor:()=>{let g=t.getCompositor();qk({compositor:g,notify:(h,b)=>{let S=h==="error"?m.error(b):h==="warn"?m.warning(b):m.dim(b);g?.commitAbove(S)},suspendFooter:()=>e.slashCtx.suspendFooter?.(),resumeFooter:()=>e.slashCtx.resumeFooter?.()}).catch(()=>{})},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...n7({enabled:i,engine:a,surface:t,stats:e.stats,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,historyTracker:l})});let c=t.getCompositor(),u=_f({readLine:g=>t.readLine({promptFn:()=>g}).then(h=>h.text),writer:{line:(g="")=>{let h=t.getCompositor();h?h.commitAbove(g):process.stdout.write(g+`
1852
1852
  `)}},pendingCount:()=>Je.pendingCount(),...c?{pickFromList:g=>fn(c,g),readTextOverlay:g=>Xk(c,g)}:{}});Je.install(u),e.replRenderer.setCompositor(t.getCompositor()),e.slashCtx.getCompositor=()=>t.getCompositor();let d=t.getCompositor();if(d){let g=h=>d.commitAbove(h);e.completionWriter.fn=g,e.completionWriter.idleFn=g}let p=g=>{t.setSoftStopHandler(g),n.requestSoftStop=g};e.slashCtx.setSoftStopHandler=p,e.slashCtx.onStageChange=(g,h)=>{s.getLoopStageBar()?.repaint(g),s.getMascotBar()?.onStage(g,h)};let f=(()=>{let g=parseInt(e.options.maxTurns,10);return g>0?g:void 0})();return e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),await e.gitStatusSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,f))},e.slashCtx.transcript=r,e.slashCtx.stdinElicitationHandler=u,e.slashCtx.swapElicitationHandler=g=>Je.install(g??u),e.inputSurfaceRef&&(e.inputSurfaceRef.current=t),e.gitStatusSampler.setOnUpdate(()=>{e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,f))}),e.gitStatusSampler.refresh(),r1(()=>{e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,f))}),{installSoftStop:p}}ZM();we();function o7(e={}){let t=e.load??Uk,n=e.onResize??(s=>Ne.subscribe(s)),r="",o,i=n(()=>{r=""});return{renderIfChanged(s){let a=s??"unbound",l=t(a),c=d3(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:jk(l))},invalidate(){r=""},dispose(){try{i()}catch{}}}}L();ue();we();N();var J0={done:{glyph:"\u2713",color:e=>m.success(e),label:"done"},blocked:{glyph:"\u2298",color:e=>m.error(e),label:"blocked"},asking:{glyph:"?",color:e=>m.warning(e),label:"asking"},interrupted:{glyph:"\u23F8",color:e=>m.meta(e),label:"interrupted"}};function i7(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 u(g){let h=o();return Math.max(1,g-1-h)}function d(){if(!i||!r?.isTTY)return;let g=f(),h=c(),b=g!==null&&h>1?1:0;if(b!==s&&(s>0&&p(),s=b,a?.(s)),b===0)return;let S=u(h);r.write("\x1B[s"),r.write(`\x1B[${S};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function p(){if(!r?.isTTY)return;let g=c(),h=u(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=m.dim(" ledger "),h=m.dim(" \xB7 "),b=n.map(E=>{let R=J0[E];return R.color(`${R.glyph} ${R.label}`)}),S=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+b.join(h)+S,k=Math.max(20,ne()-2);if(Y(w)<=k)return w;let T=g+n.map(E=>J0[E].color(J0[E].glyph)).join(m.dim(" "))+S;return ie(T,k)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),d()},reset(){n=[],i&&s>0&&(p(),s=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){i||Ve()||(i=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),s=0,l=Ne.subscribe(()=>d()),d())},stop(){i&&(i=!1,l!==null&&(l(),l=null),s>0&&(p(),s=0,a?.(0)),r=null)},repaint(){d()}}}ue();L();mt();we();N();var s7=["\u25D0","\u25D1","\u25D2","\u25D3"],kT=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||Ve()||(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=Ne.subscribe(()=>this.repaint()),this.resizeImmediateUnsub=Ne.subscribeImmediate(()=>this.resetGeometry()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%s7.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=m.brand(s7[this.spinnerIndex]),o=m.dim(t.jobId),i=m.bold(t.label||t.jobId),s=[r,o,i],a=Date.now()-t.startedAt;return s.push(m.dim(Ce(a))),ie(" "+s.join(" "),n)}};Xv();we();N();Wg();Wg();var a7=13,l7=3,JOe=[".....BBB.....","...BBBBBBB...","..KYYYYYYYK..","DDKMMMMMMMKDD"];function za(e,t){return[...JOe,e,t]}var X0=".DKMYMMMYMKD.",XOe=".DKM.MMM.MKD.",QOe=".DKMLMMMLMKD.",ZOe="DDKMRMMMRMKDD",eDe="DDKM.MMM.MKDD",Q0="..KMMKKKMMK..",Z0="..KMKKKKKMK..",tDe="..KKKKKKKKK..",c7={idle:[za(X0,Q0)],working:[za(X0,Q0),za(XOe,Z0),za(QOe,Q0),za(X0,Z0)],alert:[za(ZOe,tDe),za(eDe,Z0)]};function u7(e){return c7[e].length}function d7(e="idle",t=0){if(yl())return[];let n=c7[e],r=(t%n.length+n.length)%n.length;return XE(n[r]??n[0])}Wi();var p7=l7,nDe=8,m7=" ",rDe=1500,oDe=220,TT=class{stream;getAdjacentRows;frameMs;started=!1;state="idle";frame=0;rowCount=0;lastStartRow=0;lastRowCount=0;timer=null;stageState="idle";alertTimer=null;resizeUnsub=null;onRowCountChange;constructor(t){this.stream=t.stream??process.stdout,this.getAdjacentRows=t.getAdjacentRows,this.frameMs=t.frameMs??oDe}setRowCountChangeHandler(t){this.onRowCountChange=t}stop(){this.started&&(this.started=!1,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.stopTimer(),this.clearAlertTimer(),this.clearBand(),this.rowCount=0,this.state="idle",this.stageState="idle",this.onRowCountChange?.(0))}start(){this.started||_4()&&(Ve()||yl()||this.stream.isTTY&&(this.started=!0,this.resizeUnsub=Ne.subscribe(()=>this.repaint())))}setState(t){!this.started||t===this.state||(this.state=t,this.frame=0,t==="idle"?this.stopTimer():this.startTimer(),this.repaint())}onStage(t,n){if(this.started){if(this.stageState=t==="acting"?"working":"idle",n?.toolErrored){this.flashAlert();return}this.alertTimer||this.setState(this.stageState)}}redraw(){this.repaint()}getRowCount(){return this.rowCount}clearBand(){if(!this.stream.isTTY||this.lastRowCount<=0)return;let t=this.stream.rows??24;this.stream.write("\x1B[s");for(let n=0;n<this.lastRowCount;n++){let r=this.lastStartRow+n;r<1||r>t||(this.stream.write(`\x1B[${r};1H`),this.stream.write("\x1B[2K"))}this.stream.write("\x1B[u"),this.lastRowCount=0,this.lastStartRow=0}repaint(){if(!this.started||!this.stream.isTTY)return;let t=this.state==="idle"?[]:d7(this.state,this.frame),n=t.length>0?this.visibleRows():0,r=this.stream.rows??24,o=this.getAdjacentRows(),i=Math.max(1,r-n-o);if(this.lastRowCount>0&&(n!==this.lastRowCount||i!==this.lastStartRow)&&this.clearBand(),n!==this.rowCount&&(this.rowCount=n,this.onRowCountChange?.(n)),n!==0){this.stream.write("\x1B[s");for(let s=0;s<n;s++){let a=i+s;a<1||a>r||(this.stream.write(`\x1B[${a};1H`),this.stream.write("\x1B[2K"),this.stream.write(m7+(t[s]??"")))}this.stream.write("\x1B[u"),this.lastStartRow=i,this.lastRowCount=n}}visibleRows(){let t=this.stream.rows??24;return(this.stream.columns??80)<a7+m7.length+1?0:t-1-this.getAdjacentRows()-1-nDe>=p7?p7:0}clearAlertTimer(){this.alertTimer&&(clearTimeout(this.alertTimer),this.alertTimer=null)}flashAlert(){this.clearAlertTimer(),this.setState("alert"),this.alertTimer=setTimeout(()=>{this.alertTimer=null,this.setState(this.stageState)},rDe),this.alertTimer.unref?.()}stopTimer(){this.timer&&(clearInterval(this.timer),this.timer=null)}startTimer(){this.timer||u7(this.state)<=1||(this.timer=setInterval(()=>{this.frame+=1,this.repaint()},this.frameMs),this.timer.unref?.())}};L();ue();function iDe(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60);if(n<60)return`${n}m${t%60}s`;let r=Math.floor(n/60);return r<24?`${r}h${n%60}m`:`${Math.floor(r/24)}d${r%24}h`}function f7(e,t){let{totalTurns:n,elapsedMs:r,toolCalls:o,activeSubs:i,contextRatio:s}=e,a=m.dim(" \xB7 "),l=m.brand(`T${n}`),c=m.dim(iDe(r)),u=m.chrome(`${o} calls`),d=i>0?m.info(`${i} subs`):m.dim("0 subs"),p=Math.round(Math.max(0,Math.min(1,s))*100),f=s>.8?m.error:s>.5?m.warning:m.chrome,g=m.dim("ctx ")+f(`${p}%`),h=[l,c,u,d,g].join(a);return ie(" "+h,t)}we();N();var ET=class{stream;registry;getExtraRows;started=!1;snapshot=null;onRowCountChange;resizeUnsub=null;tickInterval=null;constructor(t){this.stream=t.stream??process.stdout,this.registry=t.backgroundRegistry,this.getExtraRows=t.getExtraRows}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||Ve()||(this.started=!0,this.onRowCountChange?.(1),this.resizeUnsub=Ne.subscribe(()=>this.repaint()),this.tickInterval=setInterval(()=>this.repaint(),1e3),this.repaint())}stop(){this.started&&(this.started=!1,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.tickInterval!==null&&(clearInterval(this.tickInterval),this.tickInterval=null),this.clearRow(),this.onRowCountChange?.(0))}update(t,n){let r=this.registry?this.registry.list().filter(s=>s.status==="running").length:0,o=t.turns.reduce((s,a)=>s+(a.toolEvents?.length??0),0),i;if(n!==void 0)i=n;else{let s=t.turnTokens[t.turnTokens.length-1];i=s!==void 0?(s.footprint??s.input+s.output+s.cache)/sDe(t):0}this.snapshot={totalTurns:t.totalTurns,sessionStartTime:t.sessionStartTime,toolCalls:o,activeSubs:r,contextRatio:Math.max(0,Math.min(1,i))},this.started&&this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getExtraRows(),r=Math.max(1,t-n+1),o=Math.max(4,(this.stream.columns??80)-2),i=this.snapshot,s=i?{totalTurns:i.totalTurns,elapsedMs:Date.now()-i.sessionStartTime,toolCalls:i.toolCalls,activeSubs:i.activeSubs,contextRatio:i.contextRatio}:{totalTurns:0,elapsedMs:0,toolCalls:0,activeSubs:0,contextRatio:0};this.stream.write("\x1B[s"),this.stream.write(`\x1B[${r};1H`),this.stream.write("\x1B[2K"),this.stream.write(f7(s,o)),this.stream.write("\x1B[u")}clearRow(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getExtraRows(),r=Math.max(1,t-n+1);this.stream.write("\x1B[s"),this.stream.write(`\x1B[${r};1H`),this.stream.write("\x1B[2K"),this.stream.write("\x1B[u")}};function sDe(e){let t=String(e.model);return t.includes("opus-5")||t.includes("claude-opus-5")?5e5:(t.includes("3-5")||t.includes("claude-3-5")||t.includes("3-7")||t.includes("claude-3-7"),2e5)}import{EventEmitter as pDe}from"node:events";import{spawn as aDe}from"node:child_process";var lDe=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function cDe(){let e="";return{strip(t){let r=(e+t).replace(lDe,""),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 g7(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 uDe=12e4,dDe=1e5;function h7(e){let t=Date.now(),n=e.timeoutMs??uDe,r=e.maxBytes??dDe,o=cDe(),i;try{i=aDe(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="",u="",d=0,p=0,f=!1,g=!1,h=!1;function b(E){let R=r-d;if(R>0){let _=E.length<=R?E:g7(E,R);d+=_.length,c+=_.toString("utf8"),E.length>R&&(f=!0)}else E.length>0&&(f=!0);if(p<r){let _=o.strip(E.toString("utf8")),C=Buffer.byteLength(_,"utf8"),x=r-p;if(C<=x)u+=_,p+=C;else{let I=Buffer.from(_,"utf8");u+=g7(I,x).toString("utf8"),p=r,f=!0}}}function S(){if(i.pid!==void 0&&i.pid!==0&&!i.killed)try{process.kill(-i.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{S(),e.abort.removeEventListener("abort",k),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),k=()=>{S(),clearTimeout(w),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",k);function T(){g||a||d<r&&p<r||(g=!0,S(),clearTimeout(w),e.abort.removeEventListener("abort",k),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return i.stdout?.on("data",E=>{b(E);try{e.onChunk?.(E,"stdout")}catch{}T()}),i.stderr?.on("data",E=>{b(E);try{e.onChunk?.(E,"stderr")}catch{}T()}),i.on("error",E=>{clearTimeout(w),e.abort.removeEventListener("abort",k),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${E.message}`})}),i.on("close",(E,R)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",k),!(g||a)){if(o.flush(),h){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(E!==null&&E!==0){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:u,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:u,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:u,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{}}}}}var y7=200,jf=class extends pDe{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=h7({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=mDe(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<=y7))for(let[t,n]of this.jobs){if(this.jobs.size<=y7)break;n.status!=="running"&&this.jobs.delete(t)}}};function mDe(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}L();mt();function fDe(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 gDe(e,t){let n=Ce(t.durationMs);return t.errorReason==="abort"?m.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?m.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?m.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?m.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?m.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?m.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):m.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function b7(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function hDe(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="${Ce(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${b7(e)}</command>`),r.push("<output>"),r.push(b7(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
1853
1853
  `)}var RT=class e{constructor(t){this.opts=t;this.registry.on("complete",n=>{if(n.mode!=="background")return;let r=n.result;r&&(this.queueInjection({command:n.command,mode:"background",result:r}),this.pendingNotifications.push({job:n,result:r}),this.pendingNotifications.length>e.MAX_PENDING_NOTIFICATIONS&&this.pendingNotifications.shift())})}opts;registry=new jf;pendingInjections=[];pendingNotifications=[];activeFgJobId=null;static MAX_PENDING_INJECTIONS=25;static MAX_PENDING_NOTIFICATIONS=50;async dispatch(t){let n=fDe(t);return n===null?t==="!"||t==="!&"||t.startsWith("! ")||t.startsWith("!& ")?(this.opts.writeLine(m.dim(" usage: !<cmd> (foreground) !&<cmd> (background)")),!0):!1:(n.mode==="foreground"?await this.runForeground(n.command):this.startBackground(n.command),!0)}drainInjections(){if(this.pendingInjections.length===0)return"";let t=this.pendingInjections.map(n=>hDe(n.command,n.mode,n.result));return this.pendingInjections=[],t.join(`
1854
1854
  `)+`
@@ -1873,8 +1873,8 @@ ${E}${k}
1873
1873
  ${T}
1874
1874
  ${E}`})}return{fileBlocks:l,warnings:c}}function C7(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function _7(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}N();L();function I7(e){return{startedAt:e,received:!1}}function P7(e){return e.received?{}:{turnStartedAt:e.startedAt}}function M7(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function O7(e){Ve()&&(e??{fn:console.log}).fn(m.dim(" \u25E6 waiting for response\u2026"))}jv();async function D7(e,t,n,r,o="summary",i,s){let a=TX(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=I7(l);O7(i),fu(process.stdout,Jm(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,T={abort:null},E=0,R=3e3,_=[],C=new Map,x=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,I=()=>{let U=r.subagentControl;U?.hasPromotableForeground()&&_7(U,P,r.onQueuedUserMessage).then(({jobs:W,flushedText:K,flushedPreview:M})=>{let z=(i??{fn:console.log}).fn;for(let $ of W)z(m.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));K!==void 0&&z(m.dim(` \u2192 queued message sent to this turn: ${C7(M??K)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,D=()=>new Uu({out:ju(i),thinkingMode:o,...x?{activeSkillName:x}:{},onCancel:()=>{t.interrupt().catch(U=>{We()&&console.error(" "+m.error("session.interrupt() failed:"),U)})},...r.subagentControl?{onBackground:I}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...P7(c)}),j=D(),F=async()=>{if(!h){h=!0;try{await j.dispose()}catch{}}},X=async()=>{await j.arm();let U=j.getCompositor();if(i&&U){let W=U;i.fn=K=>W.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(U),r.setInterruptNotifier?.(W=>j.setInterrupting(W)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,j.setSoftStopping(!0),t.interrupt().catch(te=>{We()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),te)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(te=>{We()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),te)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch($=>{We()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),$)})}),await X(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(I);let{fileBlocks:U,warnings:W}=A7(e.text,{rootDir:process.cwd()});for(let $ of W)(i??{fn:console.log}).fn(m.dim(` @-file: ${$}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let K=U.length>0||e.attachments.length>0?await x7(e.text,e.attachments,void 0,U,t.sessionId):e.text,M=t.sendMessageStream(K);if(await oc(($,te)=>{j.process($,te)},async()=>{for await(let $ of M){if(w||k)break;let te=M7(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=p?v7(u,$.chunk.content):u+$.chunk.content,p=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let Q=$.chunk,pe={toolName:Q.toolName,toolUseId:Q.toolUseId,input:Q.toolInput,...Q.toolInputRaw!==void 0&&{inputRaw:Q.toolInputRaw}};C.set(Q.toolUseId,pe),_.push(pe)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let Q=$.chunk;d=u.length,p=!0;let pe=C.get(Q.toolUseId);if(pe&&(pe.result=Q.content,pe.isError=Q.isError,C.delete(Q.toolUseId)),r.onContextProgress){let Z=Date.now();if(Z-E>=R){E=Z;try{let Se=r.onContextProgress();Se instanceof Promise&&await Se}catch(Se){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),Se)}}}}if($.type==="paused"){if(r.setPausedState?.(!0),await F(),P&&$.autoResume===!0){let Q=new AbortController;T.abort=Q;let pe=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Z=pe?`Keep waiting \u2014 auto-resumes at ${pe}`:"Keep waiting \u2014 auto-resume in progress",Se="Switch model / provider (type /model after)",Oe="Stop waiting",Vt=[m.warning(" \u23F3 Usage limit reached.")+(pe?m.dim(` Auto-resumes at ${pe}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];fn(P,{header:Vt,options:[Z,Se,Oe],signal:Q.signal,initialIndex:0}).then(ge=>{if(T.abort=null,!ge)return;let ce=ge[0];ce===void 0||ce===Z||(k=!0,ce===Se&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Qe=>{We()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Qe)}))}).catch(ge=>{We()&&console.error(" "+m.error("picker promise rejected:"),ge)})}else(i??{fn:console.log}).fn(C$({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),T.abort?.abort(),T.abort=null;let Q=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,_.length=0,C.clear(),b=!1,S=void 0,g=!1,j=D(),h=!1,await X(),(i??{fn:console.log}).fn(m.success(Q));continue}if($.type==="error"){await F(),wl(ml($.error)),g=!0;continue}j.process($),te&&j.notifyFirstContent(),$.type==="done"&&(b=!0,S=$.metadata)}}),await F(),w){let $=i?i.fn:console.log,te=P?P.getPendingCount():0,Q=te>0?` \xB7 ${te} queued`:"";$(m.warning(`\u23F8 Stopped${Q} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(k){let $=i?i.fn:console.log;$(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(b&&!w&&!k){Sa(n,a,u,S,_),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),mu(process.stdout),P4(process.stdout,"afk: turn complete");let $=Q=>{i?i.fn(Q):console.log(Q)},te=AT(u);if(te){$(k7(te)),$("");let Q=B8(_);if(r.onTerminalState)try{r.onTerminalState(te,{doneHasCorroboratingEvidence:Q})}catch{}if(n.permissionMode==="autonomous"){let pe=te.kind==="done"&&kp().verifyDone===!0&&!Q;j8(te,void 0,{unverified:pe})}}if(tO(S,n,$),r.onAfterTurn){let Q=r.onAfterTurn();Q instanceof Promise&&await Q.catch(()=>{})}}}catch(U){await F(),g||wl(ml(U))}finally{await F(),fu(process.stdout,Jm(process.cwd(),!1)),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),T.abort?.abort(),T.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Hi();var VDe=5e3,YDe=3,JDe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function XDe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function $7(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async I=>{We()&&(h=Fk(I)),await Rf(e.session.current),We()&&(b=RM())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,T=!1,E,R,_,C=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),x=0;for(g.onInjectable=()=>{x>=YDe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(x++,mu(process.stdout),S={text:JDe,attachments:[]},o.abortPendingRead())};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let M of b)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),b=[]}let I=f.drainNotifications();for(let{job:M,result:z}of I){let $=z.errorReason===void 0?"\u2713":"\u2717",te=z.errorReason==="abort"?"killed":z.errorReason==="timeout"?"timed out":z.errorReason==="signal-killed"?"killed by signal":`exit ${z.exitCode??0}`,Q=Math.max(0,Math.round(z.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${$} [${M.id}] ${te} \xB7 ${Q}s \xB7 `)+M.command)}let P=g.drainNotifications();for(let{job:M}of P){let z=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",$=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,te=ie(M.label,60);e.replRenderer.writeLine(m.dim(` ${z} [${M.jobId}] subagent ${M.status} \xB7 ${$}s \xB7 `)+te)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let M of D)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let j,F;if(S===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,S={text:M.message,attachments:[]})}if(S!==void 0){let M=S;S=void 0;let z=Ju(e.stats.permissionMode),$=Ea({buffer:M.text,promptText:z,isTTY:!!process.stdout.isTTY,attachmentSummary:xu([...M.attachments])});e.replRenderer.writeLine($),j=M.text.trim(),F=M.attachments}else{let M=w;w=void 0;let z=await o.readLine({promptFn:()=>Ju(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{vT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});j=z.text.trim(),F=z.attachments}if(!j&&F.length===0)continue;if(j.startsWith("!")){let M=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(j))){e.statusLine.rearm();continue}}let X=!1;if(j.startsWith("/")){let M=await D4(j,e.slashCtx,F);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((j==="/clear"||j.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),E=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){S={text:M.result.message,attachments:F??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){w=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}X=!0}a.push(j),await XDe(e,j);let U=j;if(X){let M=nP(j);if(M){let z=M.name.replace(/^\//,"").split(":").pop()??"";if(z&&wM(z)){let $={skillName:z,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},te=e.session.current.sessionId,Q=La(te),pe=Date.now();B(`[afk trace] preflight.start commandName=${z}`);let Z=!1,Se=await Fa($,{cwd:e.stats.cwd??process.cwd(),artifactDir:Q},Oe=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${z}) failed: `)+(Oe instanceof Error?Oe.message:String(Oe)))});Z=Se!==null,B(`[afk trace] preflight.end commandName=${z} durationMs=${Date.now()-pe} success=${Z}`),U=TM(Se?.manifestBlock,j)}}}let W=f.drainInjections();W.length>0&&(U=W+U);let K=g.drainInjections();if(K.length>0&&(U=K+U),E!==void 0&&(U=E+`
1875
1875
 
1876
- `+U,E=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:U,sessionId:e.stats.sessionId},z=await e.hookRegistry.dispatch(M);z.injectContext&&(U=z.injectContext+U)}catch(M){if(M instanceof Ae){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${ae(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Cr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(R=void 0,_=void 0,await D7({text:U,attachments:F},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onQueuedUserMessage(M){await t.appendQueuedUser(M)},async onTurnComplete(M,z){if(await t.appendTurn(M,z),e.stats.sessionId)try{ji(e.stats)}catch($){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+($ instanceof Error?$.message:String($))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,z)=>{p?.push(M),R=M.kind,_=z?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M,M===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(M,z)=>{c.repaint(M),u?.onStage(M,z)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ju(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},..._!==void 0?{doneHasCorroboratingEvidence:_}:{}},void 0,VDe);M.injectContext&&M.injectContext.trim().length>0&&(E=M.injectContext)}catch(M){if(M instanceof Ct)throw M;M instanceof Cr?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof Ae?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(M.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(M))}}}function QDe(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 F7(e,t,n,r){let o=await LQ(),i=new wT({rl:e.rl,history:o,statusLine:e.statusLine}),s=QDe(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await r7(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=w7(e,n),await $7(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}fp();zl();import{execFile as ZDe}from"node:child_process";import{dirname as e$e,isAbsolute as t$e,resolve as n$e}from"node:path";import{promisify as r$e}from"node:util";var L7=r$e(ZDe),o$e=3e3,i$e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function s$e(){let t=(await L7("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=t$e(t)?t:n$e(process.cwd(),t);return e$e(n)}async function N7(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await s$e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),o$e)});try{let o=jn({execFile:L7,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=>i$e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Zg();fp();import{promises as a$e}from"node:fs";import{dirname as l$e,join as j7}from"node:path";import{randomBytes as c$e}from"node:crypto";var u$e=["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(`
1877
- `),B7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,rO=30,d$e=1024,p$e=8e3,m$e="haiku";async function f$e(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=b$e(n,d$e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??p$e),s=t.signal?S$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rl({token:t.token,model:t.model??m$e,system:u$e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=g$e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=l$e(t.worktreePath);return await h$e(l,c)}function g$e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(B7.test(t)&&t.length<=rO)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>rO)break;o=s}return B7.test(o)?o:null}async function h$e(e,t){if(!await y$e(j7(t,e)))return e;let n=c$e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,rO-5)}-${n}`}async function y$e(e){try{return await a$e.access(e),!0}catch{return!1}}function b$e(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 S$e(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 H7(e){let t,n,r=j7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await f$e(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=`${Qh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return U7(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 U7(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 U7(e,t){e&&e.setCwd(t),w$e(t)}function w$e(e){try{process.chdir(e)}catch{}}ft();Tt();dl();Jr();H();import{spawn as K7}from"child_process";import{existsSync as G7,mkdirSync as R$e,readFileSync as q7,unlinkSync as W7,writeFileSync as z7}from"fs";import{get as x$e}from"https";import{join as V7}from"path";import{readFileSync as v$e}from"fs";import{dirname as k$e,join as T$e}from"path";import{fileURLToPath as E$e}from"url";function Zr(){try{return"5.130.2"}catch{}try{let e=k$e(E$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(v$e(T$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();N();var A$e=64*1024,C$e=10800*1e3,_$e=800,I$e=3600*1e3,P$e="update-check.json",M$e="pending-update.json";function oO(){return V7(ll(),P$e)}function Hf(){return V7(ll(),M$e)}function iO(){let e=ll();G7(e)||R$e(e,{recursive:!0})}function Y7(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 J7(){try{let e=q7(oO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function X7(){try{iO();let e=`
1876
+ `+U,E=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:U,sessionId:e.stats.sessionId},z=await e.hookRegistry.dispatch(M);z.injectContext&&(U=z.injectContext+U)}catch(M){if(M instanceof Ae){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${ae(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Cr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(R=void 0,_=void 0,await D7({text:U,attachments:F},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onQueuedUserMessage(M){await t.appendQueuedUser(M)},async onTurnComplete(M,z){if(await t.appendTurn(M,z),e.stats.sessionId)try{ji(e.stats)}catch($){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+($ instanceof Error?$.message:String($))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,z)=>{p?.push(M),R=M.kind,_=z?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M,M===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(M,z)=>{c.repaint(M),u?.onStage(M,z)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ju(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},..._!==void 0?{doneHasCorroboratingEvidence:_}:{}},void 0,VDe);M.injectContext&&M.injectContext.trim().length>0&&(E=M.injectContext)}catch(M){if(M instanceof Ct)throw M;M instanceof Cr?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof Ae?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(M.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(M))}}}function QDe(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 F7(e,t,n,r){let o=await LQ(),i=new wT({rl:e.rl,history:o,statusLine:e.statusLine}),s=QDe(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await r7(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=w7(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start()},await $7(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}fp();zl();import{execFile as ZDe}from"node:child_process";import{dirname as e$e,isAbsolute as t$e,resolve as n$e}from"node:path";import{promisify as r$e}from"node:util";var L7=r$e(ZDe),o$e=3e3,i$e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function s$e(){let t=(await L7("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=t$e(t)?t:n$e(process.cwd(),t);return e$e(n)}async function N7(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await s$e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),o$e)});try{let o=jn({execFile:L7,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=>i$e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Zg();fp();import{promises as a$e}from"node:fs";import{dirname as l$e,join as j7}from"node:path";import{randomBytes as c$e}from"node:crypto";var u$e=["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(`
1877
+ `),B7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,rO=30,d$e=1024,p$e=8e3,m$e="haiku";async function f$e(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=b$e(n,d$e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??p$e),s=t.signal?S$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rl({token:t.token,model:t.model??m$e,system:u$e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=g$e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=l$e(t.worktreePath);return await h$e(l,c)}function g$e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(B7.test(t)&&t.length<=rO)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>rO)break;o=s}return B7.test(o)?o:null}async function h$e(e,t){if(!await y$e(j7(t,e)))return e;let n=c$e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,rO-5)}-${n}`}async function y$e(e){try{return await a$e.access(e),!0}catch{return!1}}function b$e(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 S$e(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 H7(e){let t,n,r=j7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await f$e(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=`${Qh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return U7(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 U7(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 U7(e,t){e&&e.setCwd(t),w$e(t)}function w$e(e){try{process.chdir(e)}catch{}}ft();Tt();dl();Jr();H();import{spawn as K7}from"child_process";import{existsSync as G7,mkdirSync as R$e,readFileSync as q7,unlinkSync as W7,writeFileSync as z7}from"fs";import{get as x$e}from"https";import{join as V7}from"path";import{readFileSync as v$e}from"fs";import{dirname as k$e,join as T$e}from"path";import{fileURLToPath as E$e}from"url";function Zr(){try{return"5.130.4"}catch{}try{let e=k$e(E$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(v$e(T$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();N();var A$e=64*1024,C$e=10800*1e3,_$e=800,I$e=3600*1e3,P$e="update-check.json",M$e="pending-update.json";function oO(){return V7(ll(),P$e)}function Hf(){return V7(ll(),M$e)}function iO(){let e=ll();G7(e)||R$e(e,{recursive:!0})}function Y7(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 J7(){try{let e=q7(oO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function X7(){try{iO();let e=`
1878
1878
  const https = require('https');
1879
1879
  const fs = require('fs');
1880
1880
  const url = 'https://registry.npmjs.org/agent-afk/latest';