agent-afk 5.56.2 → 5.56.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -869,7 +869,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
869
869
  Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:A});return}if(v===2){let A=Fs(h.trim());d({content:`grep error: ${A.content}`,isError:!0,...A.truncated?{truncated:!0}:{}});return}let E=Kn(g.trimEnd()),R=Fs(E);d({content:R.content,...R.truncated?{truncated:!0}:{}})}),f.on("error",v=>{let E;if(m===void 0&&lc(v))try{E=Ds(v,process.cwd())}catch{E=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${v.message}`}else E=Ds(v,m);d({content:`Failed to execute grep: ${E}`,isError:!0})})})}}var aA,lA=x(()=>{"use strict";Hn();Tr();oo();dw();uw();aA=vw()});import{promises as XJ}from"fs";function kw(e){return(t,n,r)=>QJ(t,n,r,e)}var QJ,cA,dA=x(()=>{"use strict";Tr();QJ=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=ln(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await XJ.readdir(s,{withFileTypes:!0}),l=a.filter(m=>m.isDirectory()).map(m=>`${m.name}/`),c=a.filter(m=>!m.isDirectory()).map(m=>m.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
870
870
  `)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};cA=kw()});function ZJ(e=Rs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>uA)return{content:`Invalid input: message exceeds Telegram's ${uA}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=k.TELEGRAM_BOT_TOKEN;if(!i)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let s=xs();if(s.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of s){let c=await e({token:i,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===s.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${s.length-a.length}/${s.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:s.length===1?`Sent Telegram message to chat ${s[0]}.`:`Sent Telegram message to ${s.length} chats.`}}}var uA,pA,mA=x(()=>{"use strict";K();br();qu();uA=4096;pA=ZJ()});async function eY(){let[{JSDOM:e},{Readability:t},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:e,Readability:t,turndown:r}}function tY(){return Ew===null&&(Ew=eY()),Ew}function fA(e){return e.replace(/\n{3,}/g,`
871
871
 
872
- `).trim()}function nY(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function gA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await tY(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=fA(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=fA(o.turndown(d));return{title:a,markdown:u,textLength:nY(c),usedFallback:!0}}var Ew,hA=x(()=>{"use strict";Ew=null});function oY(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function yA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function iY(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function Rp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??oY,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!rY.has(u.status)||d===o)return u;let m=iY(u,s)??yA(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=yA(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var rY,Tw=x(()=>{"use strict";fe();rY=new Set([429,502,503,504])});import{readFileSync as sY}from"node:fs";import{join as aY}from"path";function lY(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function bA(e,t){return lY(t).test(e)}function uY(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(cY.has(t))return!0;if(dY.has(t))return!1}return!1}function wA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function pY(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function SA(e){let t=e===void 0||e.trim()===""?"default":e.trim();return $l(t),t}function mY(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function fY(e){try{return sY(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function gY(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=SA(t.defaultProfile)),n}function vA(e){let t=e?.env??k,n=e?.readFileSync??fY,r=e?.surface??t.AGENT_SURFACE,o=uY(t.AFK_BROWSER_HEADLESS,r),i=wA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=wA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=mY(t.AFK_BROWSER_DOM_SNAPSHOTS),l=pY(t.AFK_BROWSER_BACKEND),c=SA(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():aY(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=gY(d,g);return h.configPath=m,h}function xw(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(bA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>bA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var cY,dY,Rw=x(()=>{"use strict";K();G();cY=new Set(["daemon","subagent","telegram","afk"]),dY=new Set(["repl","interactive","cli"])});import ci from"node:fs";import Cp from"node:path";import{randomBytes as hY}from"node:crypto";import{chromium as yY}from"playwright";function bY(){try{return"5.56.2"}catch{}try{let e=Cp.resolve(import.meta.dirname,"../../../package.json"),t=ci.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var wY,Ap,kA=x(()=>{"use strict";G();fe();wY=bY(),Ap=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=yY.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${wY}`}}loadStorageState(t){let n=Dl(t);try{if(!ci.existsSync(n))return;let r=JSON.parse(ci.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Dl(t);if(!ci.existsSync(r))return;let o=await n.storageState(),i=Cp.join(Cp.dirname(r),`.${Cp.basename(r)}.${process.pid}.${hY(4).toString("hex")}.tmp`);ci.writeFileSync(i,JSON.stringify(o),{mode:384}),ci.chmodSync(i,384),ci.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as SY}from"crypto";function Cw(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of vY)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function EA(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&kY.test(e.label))}function TA(e){return SY("sha256").update(e,"utf8").digest("hex").slice(0,8)}function xA(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var vY,kY,pc=x(()=>{"use strict";vY=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];kY=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as EY}from"node:crypto";function TY(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function xY(e,t,n){return`el_${EY("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function RY(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function RA(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AA(e,t){let n=e.role??"",r=e.name??"";CA.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])AA(i,t)}async function CY(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},_A).catch(()=>[])}async function AY(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},_A).catch(()=>[])}function _Y(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function _p(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=_Y(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=CY(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],AA(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await AY(e)).filter(B=>CA.has(B.role??"")));let w=new Map;for(let P of m){let B=RA(P.name),j=w.get(B);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(B,P)}let S=y.map(P=>({ax:P,dom:w.get(RA(P.name??""))})),v=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,B)=>{let j=P.dom?.bbox.y??0,U=B.dom?.bbox.y??0;if(j!==U)return j-U;let I=P.dom?.bbox.x??0,D=B.dom?.bbox.x??0;return I-D}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=v.slice(0,n).map((P,B)=>{let j=P.ax.role??"generic",U=P.ax.name??"",I=xY(j,U,B),D=P.dom?.bbox??{x:0,y:0,w:0,h:0},F=P.dom?.type??null,M=null;P.ax.value!==void 0&&P.ax.value!==null&&(M=String(P.ax.value)),P.ax.checked!==void 0&&(M=String(P.ax.checked)),EA({role:j,kind:F})&&(M="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let H={id:I,role:j,label:TY(U),kind:F,value:M,state:O,bbox:D};return $!==void 0&&(H.selector=$),H}),A="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?A="loading":P==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=RY(f),N=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var CA,_A,IA=x(()=>{"use strict";pc();CA=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);_A="a[href], button, input, select, textarea, [role], [tabindex], label"});async function PA(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Aw(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>PA(e,i)))).filter(o=>o!==null)}async function IY(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function _w(e,t,n){switch(t.kind){case"element_id":return PY(e,t,n);case"selector":return MY(e,t);case"semantic":return OY(e,t)}}async function PY(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await Aw(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function MY(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await Aw(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function OY(e,t){return t.role!==void 0?$Y(e,t.text,t.role):DY(e,t.text,t)}async function $Y(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await Aw(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function DY(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await IY(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await PA(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let v=0;v<w.length;v++)S=S*31+w.charCodeAt(v)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var MA=x(()=>{"use strict"});import{randomBytes as FY}from"crypto";import{mkdir as LY,stat as NY,writeFile as BY}from"fs/promises";import{join as Iw}from"path";import{gzip as UY}from"zlib";import{promisify as jY}from"util";function HY(e){return Iw(qo(e),"browser")}function WY(e){return Iw(HY(e),"screenshots")}function KY(){return new Date().toISOString().replace(/[:.]/g,"-")}function GY(){return FY(3).toString("hex")}async function Pw(e,t,n){if(t.length>OA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${OA} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=WY(e);await LY(r,{recursive:!0});let o=`${KY()}-${GY()}-${n}.png`,i=Iw(r,o);await BY(i,t);let{size:s}=await NY(i);return{path:i,bytes:s}}var Ake,OA,$A=x(()=>{"use strict";G();pc();Ake=jY(UY);OA=5*1024*1024});var FA={};ru(FA,{PlaywrightProvider:()=>Mw});function DA(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var Mw,LA=x(()=>{"use strict";kA();IA();MA();Rw();pc();$A();Mw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ap(t)}async open(t){let n=xw(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await _p(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await _p(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await _w(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${DA(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Cw(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=xw(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await _p(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await _w(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${DA(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Pw(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Pw(n,o,r);return i}catch{return null}}}});var ui={};ru(ui,{__resetBrowserRegistryForTests:()=>VY,browserProviderActive:()=>JY,closeBrowserProvider:()=>Ow,getBrowserProvider:()=>zY,peekBrowserProvider:()=>YY});function NA(){Promise.resolve(Ow()).then(()=>{process.exit(130)})}function BA(){Promise.resolve(Ow()).then(()=>{process.exit(143)})}function UA(){Gn=null}function qY(){Ip||(process.on("SIGINT",NA),process.on("SIGTERM",BA),process.on("exit",UA),Ip=!0)}function jA(){Ip&&(process.removeListener("SIGINT",NA),process.removeListener("SIGTERM",BA),process.removeListener("exit",UA),Ip=!1)}async function zY(e){return Gn!==null?Gn:(di!==null||(di=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(LA(),FA)),n=vA(e),r=new t(n);return qY(),Gn=r,di=null,r})()),di)}async function Ow(){if(Gn===null)return;let e=Gn;Gn=null,di=null,jA(),await e.shutdown()}function JY(){return Gn!==null}function YY(){return Gn}function VY(){Gn=null,di=null,jA()}var Gn,di,Ip,pi=x(()=>{"use strict";Rw();Gn=null,di=null,Ip=!1});async function HA(e,t){try{return await gA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function nV(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(pi(),ui));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function WA(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??nV,o=null,i=e,s=null,a=null;try{let c=await Rp(n,e,{headers:tV,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(eV.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(ZY.test(d)&&!QY.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await HA(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await HA(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var QY,ZY,eV,tV,KA=x(()=>{"use strict";hA();Tw();fe();QY=/(text\/html|application\/xhtml\+xml)/i,ZY=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,eV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,tV={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function iV(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(rV,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),oV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Er(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function GA(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?iV({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function qA(e,t){if(t.length===0)return`# Search results for "${e}"
872
+ `).trim()}function nY(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function gA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await tY(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=fA(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=fA(o.turndown(d));return{title:a,markdown:u,textLength:nY(c),usedFallback:!0}}var Ew,hA=x(()=>{"use strict";Ew=null});function oY(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function yA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function iY(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function Rp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??oY,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!rY.has(u.status)||d===o)return u;let m=iY(u,s)??yA(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=yA(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var rY,Tw=x(()=>{"use strict";fe();rY=new Set([429,502,503,504])});import{readFileSync as sY}from"node:fs";import{join as aY}from"path";function lY(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function bA(e,t){return lY(t).test(e)}function uY(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(cY.has(t))return!0;if(dY.has(t))return!1}return!1}function wA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function pY(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function SA(e){let t=e===void 0||e.trim()===""?"default":e.trim();return $l(t),t}function mY(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function fY(e){try{return sY(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function gY(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=SA(t.defaultProfile)),n}function vA(e){let t=e?.env??k,n=e?.readFileSync??fY,r=e?.surface??t.AGENT_SURFACE,o=uY(t.AFK_BROWSER_HEADLESS,r),i=wA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=wA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=mY(t.AFK_BROWSER_DOM_SNAPSHOTS),l=pY(t.AFK_BROWSER_BACKEND),c=SA(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():aY(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=gY(d,g);return h.configPath=m,h}function xw(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(bA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>bA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var cY,dY,Rw=x(()=>{"use strict";K();G();cY=new Set(["daemon","subagent","telegram","afk"]),dY=new Set(["repl","interactive","cli"])});import ci from"node:fs";import Cp from"node:path";import{randomBytes as hY}from"node:crypto";import{chromium as yY}from"playwright";function bY(){try{return"5.56.4"}catch{}try{let e=Cp.resolve(import.meta.dirname,"../../../package.json"),t=ci.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var wY,Ap,kA=x(()=>{"use strict";G();fe();wY=bY(),Ap=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=yY.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${wY}`}}loadStorageState(t){let n=Dl(t);try{if(!ci.existsSync(n))return;let r=JSON.parse(ci.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Dl(t);if(!ci.existsSync(r))return;let o=await n.storageState(),i=Cp.join(Cp.dirname(r),`.${Cp.basename(r)}.${process.pid}.${hY(4).toString("hex")}.tmp`);ci.writeFileSync(i,JSON.stringify(o),{mode:384}),ci.chmodSync(i,384),ci.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as SY}from"crypto";function Cw(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of vY)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function EA(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&kY.test(e.label))}function TA(e){return SY("sha256").update(e,"utf8").digest("hex").slice(0,8)}function xA(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var vY,kY,pc=x(()=>{"use strict";vY=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];kY=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as EY}from"node:crypto";function TY(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function xY(e,t,n){return`el_${EY("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function RY(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function RA(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AA(e,t){let n=e.role??"",r=e.name??"";CA.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])AA(i,t)}async function CY(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},_A).catch(()=>[])}async function AY(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},_A).catch(()=>[])}function _Y(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function _p(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=_Y(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=CY(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],AA(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await AY(e)).filter(B=>CA.has(B.role??"")));let w=new Map;for(let P of m){let B=RA(P.name),j=w.get(B);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(B,P)}let S=y.map(P=>({ax:P,dom:w.get(RA(P.name??""))})),v=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,B)=>{let j=P.dom?.bbox.y??0,U=B.dom?.bbox.y??0;if(j!==U)return j-U;let I=P.dom?.bbox.x??0,D=B.dom?.bbox.x??0;return I-D}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=v.slice(0,n).map((P,B)=>{let j=P.ax.role??"generic",U=P.ax.name??"",I=xY(j,U,B),D=P.dom?.bbox??{x:0,y:0,w:0,h:0},F=P.dom?.type??null,M=null;P.ax.value!==void 0&&P.ax.value!==null&&(M=String(P.ax.value)),P.ax.checked!==void 0&&(M=String(P.ax.checked)),EA({role:j,kind:F})&&(M="[redacted]");let O={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(O.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(O.selected=P.ax.selected),P.ax.expanded!==void 0&&(O.expanded=P.ax.expanded);let $;P.dom?.testId?$=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&($=`#${P.dom.id}`);let H={id:I,role:j,label:TY(U),kind:F,value:M,state:O,bbox:D};return $!==void 0&&(H.selector=$),H}),A="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?A="loading":P==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=RY(f),N=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var CA,_A,IA=x(()=>{"use strict";pc();CA=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);_A="a[href], button, input, select, textarea, [role], [tabindex], label"});async function PA(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Aw(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>PA(e,i)))).filter(o=>o!==null)}async function IY(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function _w(e,t,n){switch(t.kind){case"element_id":return PY(e,t,n);case"selector":return MY(e,t);case"semantic":return OY(e,t)}}async function PY(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await Aw(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function MY(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await Aw(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function OY(e,t){return t.role!==void 0?$Y(e,t.text,t.role):DY(e,t.text,t)}async function $Y(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await Aw(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function DY(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await IY(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await PA(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let v=0;v<w.length;v++)S=S*31+w.charCodeAt(v)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var MA=x(()=>{"use strict"});import{randomBytes as FY}from"crypto";import{mkdir as LY,stat as NY,writeFile as BY}from"fs/promises";import{join as Iw}from"path";import{gzip as UY}from"zlib";import{promisify as jY}from"util";function HY(e){return Iw(qo(e),"browser")}function WY(e){return Iw(HY(e),"screenshots")}function KY(){return new Date().toISOString().replace(/[:.]/g,"-")}function GY(){return FY(3).toString("hex")}async function Pw(e,t,n){if(t.length>OA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${OA} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=WY(e);await LY(r,{recursive:!0});let o=`${KY()}-${GY()}-${n}.png`,i=Iw(r,o);await BY(i,t);let{size:s}=await NY(i);return{path:i,bytes:s}}var Ake,OA,$A=x(()=>{"use strict";G();pc();Ake=jY(UY);OA=5*1024*1024});var FA={};ru(FA,{PlaywrightProvider:()=>Mw});function DA(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var Mw,LA=x(()=>{"use strict";kA();IA();MA();Rw();pc();$A();Mw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Ap(t)}async open(t){let n=xw(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await _p(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await _p(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await _w(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${DA(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Cw(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=xw(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await _p(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await _w(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${DA(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Pw(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Pw(n,o,r);return i}catch{return null}}}});var ui={};ru(ui,{__resetBrowserRegistryForTests:()=>VY,browserProviderActive:()=>JY,closeBrowserProvider:()=>Ow,getBrowserProvider:()=>zY,peekBrowserProvider:()=>YY});function NA(){Promise.resolve(Ow()).then(()=>{process.exit(130)})}function BA(){Promise.resolve(Ow()).then(()=>{process.exit(143)})}function UA(){Gn=null}function qY(){Ip||(process.on("SIGINT",NA),process.on("SIGTERM",BA),process.on("exit",UA),Ip=!0)}function jA(){Ip&&(process.removeListener("SIGINT",NA),process.removeListener("SIGTERM",BA),process.removeListener("exit",UA),Ip=!1)}async function zY(e){return Gn!==null?Gn:(di!==null||(di=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(LA(),FA)),n=vA(e),r=new t(n);return qY(),Gn=r,di=null,r})()),di)}async function Ow(){if(Gn===null)return;let e=Gn;Gn=null,di=null,jA(),await e.shutdown()}function JY(){return Gn!==null}function YY(){return Gn}function VY(){Gn=null,di=null,jA()}var Gn,di,Ip,pi=x(()=>{"use strict";Rw();Gn=null,di=null,Ip=!1});async function HA(e,t){try{return await gA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function nV(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(pi(),ui));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function WA(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??nV,o=null,i=e,s=null,a=null;try{let c=await Rp(n,e,{headers:tV,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(eV.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(ZY.test(d)&&!QY.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await HA(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await HA(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var QY,ZY,eV,tV,KA=x(()=>{"use strict";hA();Tw();fe();QY=/(text\/html|application\/xhtml\+xml)/i,ZY=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,eV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,tV={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function iV(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(rV,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),oV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Er(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function GA(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?iV({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function qA(e,t){if(t.length===0)return`# Search results for "${e}"
873
873
 
874
874
  (no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
875
875
  `).trimEnd()}var rV,oV,zA=x(()=>{"use strict";oo();rV="https://api.exa.ai/search",oV=10});function mV(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=sV;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,aV)}let a=lV;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,cV)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function $w(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+dV}function fV(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return pV.some(o=>r.includes(o))}function gV(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=mV(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await Rp(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(f){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:$w(m,i.maxBytes)}}if(i.mode==="markdown")try{let u=await WA(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0}:{content:$w(u.markdown,i.maxBytes)}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),f=fV(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let d=GA({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:uV,timeoutMs:i.timeoutMs,signal:s.signal});return{content:$w(qA(i.query,u),i.maxBytes)}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var sV,aV,lV,cV,dV,uV,pV,JA,YA=x(()=>{"use strict";KA();zA();Tw();sV=3e4,aV=12e4,lV=1e6,cV=1e7,dV=`
@@ -1168,7 +1168,7 @@ Status written to: ${Nl()}
1168
1168
  `)}function Bx(e){return e.startsWith("v")?e:`v${e}`}function YK(e){return e.replace(/\s+·\s+/g," \xB7 ")}function Ux(e){let t=k.HOME;if(t===void 0||t.length===0)return e;if(e===t)return"~";let n=t.endsWith(Zy)?t:t+Zy;return e.startsWith(n)?"~"+Zy+e.slice(n.length):e}function VK(e,t){if(X(e)<=t)return e;let n="\u2026",r=Math.max(2,t-1),o=Math.ceil(r*.6),i=Math.max(1,r-o);return e.slice(0,i)+n+e.slice(e.length-o)}var nb="\u256D",rb="\u256E",XK="\u2570",QK="\u256F",Bl="\u2500",ZK="\u2502";function ds(e,t={}){let n=t.border??p.dim,r=Math.max(0,Math.trunc(t.padding??1)),o=t.title,i=Array.isArray(e)?e:e.split(`
1169
1169
  `),s=Zt(),a=o!==void 0?X(` ${o} `):0,l=i.reduce((y,b)=>Math.max(y,X(b)),0),c=t.width!==void 0?Math.max(1,Math.trunc(t.width)):Math.max(1,l,a+1);c=Math.min(c,s),c=Math.max(c,Math.min(a+1,s));let d=" ".repeat(r),u=c+r*2,m;if(o!==void 0){let y=u-1,b=` ${o} `;X(b)>y&&(b=ie(b,y));let w=X(b);if(w>0&&w<=y){let S=u-1-w;m=n(nb+Bl)+n.bold(b)+n(Bl.repeat(S)+rb)}else m=n(nb+Bl.repeat(u)+rb)}else m=n(nb+Bl.repeat(u)+rb);let f=n(ZK),g=[];for(let y of i)for(let b of ue(y,c).split(`
1170
1170
  `)){let w=nt(ie(b,c),c);g.push(f+d+w+d+f)}let h=n(XK+Bl.repeat(u)+QK);return[m,...g,h].join(`
1171
- `)}function xu(e,t){let n=Math.max(40,X(e),X(t??""))+4,r=Math.min(n,Math.min(ee()-4,100));r=Math.min(r,Zt());let o=t!==void 0?[e,p.dim(t)]:[e];return ds(o,{border:p.error,title:"Error",width:r,padding:2})}function jx(e){let{resetsAt:t,reason:n,accountId:r,hotSwapped:o}=e,i=e.autoResume??!0,s=[];if(n==="usage-limit"){if(s.push("You've hit your Claude subscription limit for now."),t!==void 0){let u=Date.now(),m=t.getTime()-u,f=Math.max(0,Math.ceil(m/6e4)),g=t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});s.push(""),s.push(`Resets at ${g} (in ~${f} min).`)}s.push(""),i?(s.push("I'll auto-resume when the limit resets \u2014 no need to retype."),s.push(""),s.push("Or act now:"),s.push(" \u2022 Switch model \u2014 type /model <name> then press Enter"),s.push(" \u2022 Switch account \u2014 run claude login in any terminal (resumes automatically)"),s.push(" \u2022 Press Esc to stop waiting")):(s.push("Options:"),s.push(" \u2022 Wait, then send the message again."),s.push(" \u2022 Switch to API-key billing: export ANTHROPIC_API_KEY=..."),s.push(" \u2022 Log into another account in any terminal: claude login"))}else s.push("Your Anthropic API credit balance is empty."),s.push(""),s.push("Top up at: https://console.anthropic.com/settings/billing"),s.push(""),s.push("Or switch to your Claude subscription on the server.");o===!0&&r!==void 0&&(s.push(""),s.push(`Resumed on ${r}.`));let a=" Usage paused ",l=s.reduce((u,m)=>Math.max(u,X(m)),0),c=Math.max(40,X(a),l)+4,d=Math.min(c,Math.min(ee()-4,100));return d=Math.min(d,Zt()),ds(s,{border:p.warning,title:"Usage paused",width:d,padding:2})}import{Lexer as Gx}from"marked";import eG from"chalk";import{createEmphasize as tG,common as nG}from"emphasize";var Hx={keyword:p.brand,built_in:p.brand,literal:p.brand,tag:p.brand,string:p.syntaxString,regexp:p.syntaxString,attr:p.syntaxString,comment:p.meta,meta:p.meta,quote:p.meta,number:p.warning,function:p.tool,title:p.tool,class:p.tool,"selector-tag":p.tool};var Wx=tG(nG),rG=2048,oG=512,iG=32,hr=new Map;function sG(e){let t=hr.get(e);if(t!==void 0)return hr.delete(e),hr.set(e,t),t}function aG(e,t){if(hr.has(e)&&hr.delete(e),hr.set(e,t),hr.size>iG){let n=hr.keys().next().value;n!==void 0&&hr.delete(n)}}function Kx(e,t){if(eG.level===0||e.length>rG)return e;let n=e.length<oG,r=n?`${t} ${e}`:"";if(n){let i=sG(r);if(i!==void 0)return i}let o;try{if(!t||!Wx.registered(t))o=e;else{let i=Wx.highlight(t,e,Hx);o=typeof i?.value=="string"?i.value:e}}catch{o=e}return n&&aG(r,o),o}function Ru(e){return X(e)}function lG(e,t,n){return zy(e,t,n??"left")}var qx=/^\/[A-Za-z][\w:-]*$/,cG=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|[,.:;!?]?$|[,.:;!?]\s)/g;function Jr(e){return e?e.map(t=>{switch(t.type){case"codespan":{let n=t.text;return qx.test(n)?p.brand(n):p.user(n)}case"strong":{let n=t;return p.bold(n.tokens?Jr(n.tokens):n.text)}case"em":{let n=t;return p.italic(n.tokens?Jr(n.tokens):n.text)}case"text":return t.text.replace(cG,n=>p.brand(n));case"link":{let n=t,r=n.tokens?Jr(n.tokens):n.text;return r===n.href?r:r+p.dim(` (${n.href})`)}case"escape":return t.text;default:return t.raw}}).join(""):""}var dG=new Set(["code","table","blockquote","hr","html"]);function Yr(e){let t=e.replace(/^(?:\*\*|__)\s/,""),n=Gx.lex(t);return n.some(o=>dG.has(o.type))?t:n.map(o=>{switch(o.type){case"heading":{let i=o;return p.bold(Jr(i.tokens))}case"list":return o.items.map(s=>{let l=s.tokens[0]?.tokens??[];return"\u2022 "+Jr(l)}).join(", ");case"paragraph":return Jr(o.tokens);case"text":{let i=o;return i.tokens?Jr(i.tokens):i.text}case"space":return"";default:return o.raw}}).join("")}function Vr(e,t={}){let n=Gx.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(s){return Jr(s)}function i(s){return s.map(a=>{switch(a.type){case"heading":{let l=a,c=l.tokens?o(l.tokens):l.text;return l.depth===1?p.brand.bold(c)+`
1171
+ `)}function xu(e,t){let n=Math.max(40,X(e),X(t??""))+4,r=Math.min(n,Math.min(ee()-4,100));r=Math.min(r,Zt());let o=t!==void 0?[e,p.dim(t)]:[e];return ds(o,{border:p.error,title:"Error",width:r,padding:2})}function jx(e){let{resetsAt:t,reason:n,accountId:r,hotSwapped:o}=e,i=e.autoResume??!0,s=[];if(n==="usage-limit"){if(s.push("You've hit your Claude subscription limit for now."),t!==void 0){let u=Date.now(),m=t.getTime()-u,f=Math.max(0,Math.ceil(m/6e4)),g=t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});s.push(""),s.push(`Resets at ${g} (in ~${f} min).`)}s.push(""),i?(s.push("I'll auto-resume when the limit resets \u2014 no need to retype."),s.push(""),s.push("Or act now:"),s.push(" \u2022 Switch model \u2014 type /model <name> then press Enter"),s.push(" \u2022 Switch account \u2014 run claude login in any terminal (resumes automatically)"),s.push(" \u2022 Press Esc to stop waiting")):(s.push("Options:"),s.push(" \u2022 Wait, then send the message again."),s.push(" \u2022 Switch to API-key billing: export ANTHROPIC_API_KEY=..."),s.push(" \u2022 Log into another account in any terminal: claude login"))}else s.push("Your Anthropic API credit balance is empty."),s.push(""),s.push("Top up at: https://console.anthropic.com/settings/billing"),s.push(""),s.push("Or switch to your Claude subscription on the server.");o===!0&&r!==void 0&&(s.push(""),s.push(`Resumed on ${r}.`));let a=" Usage paused ",l=s.reduce((u,m)=>Math.max(u,X(m)),0),c=Math.max(40,X(a),l)+4,d=Math.min(c,Math.min(ee()-4,100));return d=Math.min(d,Zt()),ds(s,{border:p.warning,title:"Usage paused",width:d,padding:2})}import{Lexer as Gx}from"marked";import eG from"chalk";import{createEmphasize as tG,common as nG}from"emphasize";var Hx={keyword:p.brand,built_in:p.brand,literal:p.brand,tag:p.brand,string:p.syntaxString,regexp:p.syntaxString,attr:p.syntaxString,comment:p.meta,meta:p.meta,quote:p.meta,number:p.warning,function:p.tool,title:p.tool,class:p.tool,"selector-tag":p.tool};var Wx=tG(nG),rG=2048,oG=512,iG=32,hr=new Map;function sG(e){let t=hr.get(e);if(t!==void 0)return hr.delete(e),hr.set(e,t),t}function aG(e,t){if(hr.has(e)&&hr.delete(e),hr.set(e,t),hr.size>iG){let n=hr.keys().next().value;n!==void 0&&hr.delete(n)}}function Kx(e,t){if(eG.level===0||e.length>rG)return e;let n=e.length<oG,r=n?`${t} ${e}`:"";if(n){let i=sG(r);if(i!==void 0)return i}let o;try{if(!t||!Wx.registered(t))o=e;else{let i=Wx.highlight(t,e,Hx);o=typeof i?.value=="string"?i.value:e}}catch{o=e}return n&&aG(r,o),o}function Ru(e){return X(e)}function lG(e,t,n){return zy(e,t,n??"left")}var qx=/^\/[A-Za-z][\w:-]*$/,cG=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|[,.:;!?]?$|[,.:;!?]\s)/g;function Jr(e){return e?e.map(t=>{switch(t.type){case"codespan":{let n=t.text;return qx.test(n)?p.brand(n):p.tool(n)}case"strong":{let n=t;return p.bold(n.tokens?Jr(n.tokens):n.text)}case"em":{let n=t;return p.italic(n.tokens?Jr(n.tokens):n.text)}case"text":return t.text.replace(cG,n=>p.brand(n));case"link":{let n=t,r=n.tokens?Jr(n.tokens):n.text;return r===n.href?r:r+p.dim(` (${n.href})`)}case"escape":return t.text;default:return t.raw}}).join(""):""}var dG=new Set(["code","table","blockquote","hr","html"]);function Yr(e){let t=e.replace(/^(?:\*\*|__)\s/,""),n=Gx.lex(t);return n.some(o=>dG.has(o.type))?t:n.map(o=>{switch(o.type){case"heading":{let i=o;return p.bold(Jr(i.tokens))}case"list":return o.items.map(s=>{let l=s.tokens[0]?.tokens??[];return"\u2022 "+Jr(l)}).join(", ");case"paragraph":return Jr(o.tokens);case"text":{let i=o;return i.tokens?Jr(i.tokens):i.text}case"space":return"";default:return o.raw}}).join("")}function Vr(e,t={}){let n=Gx.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(s){return Jr(s)}function i(s){return s.map(a=>{switch(a.type){case"heading":{let l=a,c=l.tokens?o(l.tokens):l.text;return l.depth===1?p.brand.bold(c)+`
1172
1172
  `:l.depth===2?p.heading(c)+`
1173
1173
  `:p.bold(c)+`
1174
1174
  `}case"paragraph":return o(a.tokens)+`
@@ -1177,7 +1177,7 @@ Status written to: ${Nl()}
1177
1177
  `);u.length>0&&u[u.length-1]===""&&u.pop();let m=p.dim("\u2502 "),f=u.map(h=>m+h).join(`
1178
1178
  `);return(l.lang?p.dim(`\u2502 ${l.lang}`)+`
1179
1179
  `:"")+f+`
1180
- `}case"codespan":{let l=a.text;return qx.test(l)?p.brand(l):p.user(l)}case"strong":{let l=a;return p.bold(l.tokens?o(l.tokens):l.text)}case"em":{let l=a;return p.italic(l.tokens?o(l.tokens):l.text)}case"text":{let l=a;return l.tokens?o(l.tokens):l.text}case"list":{let l=a,c=[],d=l.ordered&&typeof l.start=="number"?l.start:1;for(let u=0;u<l.items.length;u++){let m=l.items[u],f=m.task===!0,g=m.checked?"\u2611":"\u2610",h=l.ordered?f?` ${d+u}. ${g} `:` ${d+u}. `:f?` ${g} `:" \u2022 ",y=m.tokens?f?m.tokens.filter(A=>A.type!=="checkbox"):m.tokens:[],b=y.length>0?i(y):m.text,w=[],S=!0,v=Ru(h),E=zy(" ".repeat(v),v,"left"),R=r?Math.max(1,r-v):void 0;for(let A of b.trim().split(`
1180
+ `}case"codespan":{let l=a.text;return qx.test(l)?p.brand(l):p.tool(l)}case"strong":{let l=a;return p.bold(l.tokens?o(l.tokens):l.text)}case"em":{let l=a;return p.italic(l.tokens?o(l.tokens):l.text)}case"text":{let l=a;return l.tokens?o(l.tokens):l.text}case"list":{let l=a,c=[],d=l.ordered&&typeof l.start=="number"?l.start:1;for(let u=0;u<l.items.length;u++){let m=l.items[u],f=m.task===!0,g=m.checked?"\u2611":"\u2610",h=l.ordered?f?` ${d+u}. ${g} `:` ${d+u}. `:f?` ${g} `:" \u2022 ",y=m.tokens?f?m.tokens.filter(A=>A.type!=="checkbox"):m.tokens:[],b=y.length>0?i(y):m.text,w=[],S=!0,v=Ru(h),E=zy(" ".repeat(v),v,"left"),R=r?Math.max(1,r-v):void 0;for(let A of b.trim().split(`
1181
1181
  `)){let N=(R?ue(A,R):A).split(`
1182
1182
  `);for(let _=0;_<N.length;_++){let P=N[_];if(_>0&&(P=P.replace(/^ +/,"")),P=P.replace(/ +$/,""),!P){w.push("");continue}S?(w.push(p.dim(h)+P),S=!1):w.push(E+P)}}c.push(w.join(`
1183
1183
  `))}return c.join(`
@@ -1532,7 +1532,7 @@ ${d}`}function bk(e,t){let n=zF[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1532
1532
  `,n-1);return r<0?0:r+1}function nL(e,t){let n=Di(t,e.length),r=e.indexOf(`
1533
1533
  `,n);return r<0?e.length:r}function Oo(e,t,n){let r=Di(t.start,e.buffer.length),o=Di(t.end,e.buffer.length),i=Math.min(r,o),s=Math.max(r,o);if(i===s&&n.length===0)return e;let a=e.buffer.slice(0,i)+n+e.buffer.slice(s),l=i+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var V={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:Oo,insert(e,t){return t.length===0?e:Oo(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=Jy(e.buffer,e.cursor);return Oo(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=Jo(e.buffer,e.cursor);return Oo(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=ZF(e.buffer,e.cursor);return t===e.cursor?e:Oo(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=eL(e.buffer,e.cursor);return t===e.cursor?e:Oo(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=tL(e.buffer,e.cursor);return t===e.cursor?e:Oo(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=nL(e.buffer,e.cursor);return t===e.cursor?e:Oo(e,{start:e.cursor,end:t},"")},moveLeft(e){return ir(e,Jy(e.buffer,e.cursor))},moveRight(e){return ir(e,Jo(e.buffer,e.cursor))},moveHome(e){return ir(e,0)},moveEnd(e){return ir(e,e.buffer.length)},moveLineStart(e){return ir(e,tL(e.buffer,e.cursor))},moveLineEnd(e){return ir(e,nL(e.buffer,e.cursor))},moveWordBackward(e){return ir(e,ZF(e.buffer,e.cursor))},moveWordForward(e){return ir(e,eL(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{row:o,col:i}=Mo(e.buffer,e.cursor,n,r);if(o===0)return{moved:!1};let s=o-1,a=i,l=0,c=1/0;for(let u=0;u<=e.buffer.length;u++){let m=Mo(e.buffer,u,n,r);if(m.row===s){let f=Math.abs(m.col-a);f<c&&(c=f,l=u)}else if(m.row>s)break}let d=ir(e,l);return d===e?{moved:!1}:{moved:!0,state:d}},moveDownLine(e,t,n){let r=t||80,{row:o,col:i}=Mo(e.buffer,e.cursor,n,r),s=Mo(e.buffer,e.buffer.length,n,r);if(o>=s.row)return{moved:!1};let a=o+1,l=i,c=e.buffer.length,d=1/0;for(let m=0;m<e.buffer.length;m++){let f=Mo(e.buffer,m,n,r);if(f.row===a){let g=Math.abs(f.col-l);g<d&&(d=g,c=m)}else if(f.row>a)break}s.row===a&&Math.abs(s.col-l)<d&&(c=e.buffer.length);let u=ir(e,c);return u===e?{moved:!1}:{moved:!0,state:u}}};var rL=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"],oL=["Scheming","Skittering","Gnawing","Cackling","Plotting","Scuttling","Pilfering","Conniving","Hoarding","Tinkering","Snickering","Rummaging","Hexing","Scrounging","Scrabbling","Conjuring","Meddling","Sharpening","Snatching","Fiddling","Muttering","Lurking","Hacking"];function iL(){return rL[Math.floor(Math.random()*rL.length)]}function sL(){return oL[Math.floor(Math.random()*oL.length)]}Mt();K();var Dee=[{id:"kbd:ctrl-b",text:"Ctrl+B during a turn detaches it to the background so you can keep typing \u2014 find it later with /bgsub.",source:"static"},{id:"kbd:shift-tab",text:"Shift+Tab cycles permission modes: default \u2192 plan \u2192 bypass (AFK stays on /afk).",source:"static"},{id:"kbd:ctrl-c",text:"Ctrl+C interrupts the current turn; press it twice in a row to exit the REPL.",source:"static"},{id:"kbd:at-path",text:"Type @ in the prompt to autocomplete a file path and attach its contents to your turn.",source:"static"},{id:"kbd:cmd-v",text:"Paste an image with Cmd+V (macOS) or Ctrl+V \u2014 clipboard images attach automatically.",source:"static"},{id:"env:tips-opt-out",text:"Set AFK_SPINNER_TIPS=0 to silence these loading-screen tips.",source:"static"}];function Fee(){let e=[];for(let t of at())t.hint&&(t.name.includes(":")||e.push({id:`cmd:${t.name}`,text:`${t.name} \u2014 ${t.hint}`,source:"command"}));return e}function Lee(e){let t=[];for(let n of Bn()){let r=`cmd:/${n}`;if(e.has(r))continue;let o;try{o=qe(n)}catch{continue}rn(o,k.AFK_INTERNAL==="1")&&o.whenToUse&&t.push({id:`skill:${n}`,text:`/${n} \u2014 ${o.whenToUse}`,source:"skill"})}return t}function cL(){if(k.AFK_SPINNER_TIPS==="0")return[];let e=Fee(),t=new Set(e.map(r=>r.id)),n=Lee(t);return[...Dee,...e,...n]}var aL=new Set,lL=new Map;function dL(e,t){if(e.length===0)return null;let n=t.now??Date.now(),r=t.warmupMs??1500;if(n-t.startedAt<r)return null;let o=t.rotateMs??7e3,i=Math.floor((n-t.startedAt)/o),s=`${t.startedAt}:${i}`,a=lL.get(s);if(a)return a;let l=null,c=e.filter(d=>!aL.has(d.id));if(c.length>0){let d=(i%c.length+c.length)%c.length;l=c[d]??null}else{let d=(i%e.length+e.length)%e.length;l=e[d]??null}return l&&(aL.add(l.id),lL.set(s,l)),l}var kk=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Nee=2e3;function uL(e){let t=Date.now()-e;if(t<Nee)return"";let n=Math.floor(t/1e3);if(n<60)return p.dim(` ${n}s`);let r=Math.floor(n/60),o=n%60;return p.dim(` ${r}m${o.toString().padStart(2,"0")}s`)}function Ze(e,t){return`\x1B[${e};1H\x1B[2K${t??""}`}function pL(e,t){let n=" \u{1F4A1} Tip: ",r=Math.max(8,t-X(n)-1),o=X(e)>r?ie(e,Math.max(0,r-1),"")+"\u2026":e;return p.dim(n+o)}var Rg=class{state=null;interval=null;captureMode;onTick;goblin;constructor(t){this.captureMode=t.captureMode,this.onTick=t.onTick,this.goblin=t.goblin??!1}pickVerb(){return this.goblin?sL():iL()}set(t){if(!t.enabled){this.interval&&(clearInterval(this.interval),this.interval=null),this.state&&(this.state=null,this.onTick());return}if(this.captureMode||this.state)return;let n=t.rotateVerbEveryMs??3500,r=Date.now();this.state={frameIndex:0,verb:this.pickVerb(),nextVerbRotateAt:r+n,startedAt:r,tipPool:cL(),currentTip:null},this.interval=setInterval(()=>this.tick(n),80),this.onTick()}dispose(){this.interval&&(clearInterval(this.interval),this.interval=null),this.state=null}renderSpinnerRow(){return this.state?(this.goblin?p.goblin:p.meta)(`${kk[this.state.frameIndex]} ${this.state.verb}...`)+uL(this.state.startedAt):null}renderTipRow(t){return this.state?.currentTip?pL(this.state.currentTip.text,t):null}tick(t){if(!this.state)return;this.state.frameIndex=(this.state.frameIndex+1)%kk.length;let n=Date.now();n>=this.state.nextVerbRotateAt&&(this.state.verb=this.pickVerb(),this.state.nextVerbRotateAt=n+t),this.state.currentTip=dL(this.state.tipPool,{startedAt:this.state.startedAt,now:n}),this.onTick()}};var Cg=class{interval=null;visiblePhase=!0;enabled;captureMode;intervalMs;onTick;constructor(t){this.enabled=t.enabled,this.captureMode=t.captureMode,this.intervalMs=t.intervalMs,this.onTick=t.onTick}get visible(){return this.enabled?this.visiblePhase:!0}start(){!this.enabled||this.captureMode||this.interval||(this.visiblePhase=!0,this.schedule())}resetVisible(){if(!this.enabled||this.captureMode||!this.interval)return!1;let t=!this.visiblePhase;return this.visiblePhase=!0,clearInterval(this.interval),this.schedule(),t}stop(){this.interval&&(clearInterval(this.interval),this.interval=null),this.visiblePhase=!0}schedule(){let t=setInterval(()=>{this.visiblePhase=!this.visiblePhase,this.onTick()},this.intervalMs);t.unref?.(),this.interval=t}};import{randomBytes as Bee}from"node:crypto";var Uee=5,jee=1e3,Hee=/\[Pasted text #([0-9a-f]+) \+\d+ (?:lines|chars)\]/g;function Wee(e,t){let n=t.match(/\n/g),r=n?n.length:0;return r>0?`[Pasted text #${e} +${r+1} lines]`:`[Pasted text #${e} +${t.length} chars]`}function Ag(e,t){return e.pasteRegistry.size===0?t:t.replace(Hee,(n,r)=>e.pasteRegistry.get(r)??n)}function mL(e){return{text:Ag(e,e.input.buffer),queued:e.queued}}function fL(e){let t=e.pasteStartCursor,n=e.input.cursor;if(n<=t)return;let o=e.input.buffer.slice(t,n).replace(/\x1b\[200~/g,"").replace(/\x1b\[201~/g,""),i=o.match(/\n/g),s=i?i.length:0,a=o.length;if(s<Uee&&a<jee)return;let l=Bee(4).toString("hex");e.pasteRegistry.set(l,o);let c=Wee(l,o);e.input=V.replaceRange(e.input,{start:t,end:n},c)}function Ek(e,t){if(e.pasteRegistry.size===0)return null;let n=e.input.buffer,r=e.input.cursor;if(t==="backward"){let l=/\[Pasted text #([0-9a-f]+) \+\d+ (?:lines|chars)\]$/.exec(n.slice(0,r));if(!l)return null;let c=r-l[0].length,d=l[1],u=V.replaceRange(e.input,{start:c,end:r},"");return e.pasteRegistry.delete(d),u}let o=/^\[Pasted text #([0-9a-f]+) \+\d+ (?:lines|chars)\]/.exec(n.slice(r));if(!o)return null;let i=r+o[0].length,s=o[1],a=V.replaceRange(e.input,{start:r,end:i},"");return e.pasteRegistry.delete(s),a}import{readdirSync as Gee,statSync as qee}from"fs";import{join as zee}from"path";import{join as hL}from"path";import{homedir as Kee}from"os";function _g(e,t){let n=e?.shift===!0||t==="\x1B[13;2u",r=e?.meta===!0;return n||r}function Ua(e){return e.endsWith("\\")}var yL=50;function Ig(e,t,n=Kee()){if(e==="~"||e.startsWith("~/")){let l=e==="~"?"":e.slice(2),c=l.lastIndexOf("/"),d=c===-1?"":l.slice(0,c),u=c===-1?l:l.slice(c+1),m=d?hL(n,d):n,f=d?`~/${d}/`:"~/";return{scanDir:m,leafPrefix:u,displayPrefix:f}}if(e.startsWith("/")){let l=e.lastIndexOf("/"),c=e.slice(0,l+1)||"/",d=e.slice(l+1);return{scanDir:c,leafPrefix:d,displayPrefix:c}}let r=e.lastIndexOf("/"),o=r===-1?"":e.slice(0,r),i=r===-1?e:e.slice(r+1),s=o?hL(t,o):t,a=o?`${o}/`:"";return{scanDir:s,leafPrefix:i,displayPrefix:a}}async function bL(e){let t="",n=e.promptFn(),r=e.continuationPrompt??" \u203A ";for(;;){e.rl.setPrompt(n),e.rl.prompt();let o=await new Promise(i=>{e.rl.once("line",s=>i(s))});if(Ua(o)){t+=o.slice(0,-1)+`
1534
1534
  `,n=r;continue}return t+=o,t}}function pd(e,t){let n=e.slice(0,t);if(/^\/[A-Za-z_-]*$/.test(n))return{kind:"slash",query:n.slice(1)};let r=n.split(/\s+/),o=r[r.length-1]??"";if(o.startsWith("@")&&/^@[^\s]*$/.test(o))return{kind:"file",query:o.slice(1)};let i=/^\/([A-Za-z][A-Za-z0-9_:-]*)\s+(?:.*\s)?--([a-z0-9-]*)$/.exec(n);if(i){let s=i[1],a=i[2],l=at().find(c=>c.name===`/${s}`);if(l?.flags&&l.flags.length>0)return{kind:"flag",command:s,query:a}}return null}function Jee(e,t){if(e.length===0)return!0;let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&(n+=1);return n===e.length}function Pg(e){let t=at(),n=e.toLowerCase(),r=d=>({value:d.name,summary:d.summary,...d.hint?{hint:d.hint}:{}}),o=d=>{let u=t.find(m=>m.name===d.canonical);return{value:d.alias,summary:d.summary,...u?.hint?{hint:u.hint}:{}}},i=[...t.map(d=>({key:d.name.slice(1).toLowerCase(),cand:r(d)})),...La().map(d=>({key:d.alias.slice(1).toLowerCase(),cand:o(d)}))],s=i.filter(d=>d.key.startsWith(n)),a=new Set(s.map(d=>d.cand.value)),l=n.length===0?[]:i.filter(d=>!a.has(d.cand.value)&&Jee(n,d.key)),c=(d,u)=>d.cand.value.localeCompare(u.cand.value);return s.sort(c),l.sort(c),[...s,...l].map(d=>d.cand).slice(0,20)}function Mg(e,t=process.cwd(),n){let{scanDir:r,leafPrefix:o,displayPrefix:i}=Ig(e,t,n);try{return Gee(r).filter(a=>a.startsWith(o)).filter(a=>!(a.startsWith(".")&&!o.startsWith("."))).sort().slice(0,yL).map(a=>{let l=i+a;try{qee(zee(r,a)).isDirectory()&&(l+="/")}catch{}return{value:"@"+l}})}catch{return[]}}function md(e,t){let n=at().find(i=>i.name===`/${e}`);if(!n?.flags||n.flags.length===0)return[];let r=t.startsWith("--")?t.slice(2):t;return n.flags.filter(i=>(i.startsWith("--")?i.slice(2):i).startsWith(r)).map(i=>({value:i})).sort((i,s)=>i.value.localeCompare(s.value)).slice(0,20)}We();ym();K();var Yee=3,Vee=250,Xee=1500,Qee=500;function wL(){return"Predict the single most likely completion of the user's in-progress REPL input. Return ONLY the completed line \u2014 no explanation, no preamble, no trailing newline."}function SL(e,t){let n=t.cwd.split("/").filter(Boolean).pop()??t.cwd,r=t.getRecentCommands().slice(0,5),o=t.getTranscriptTail(),i=[];return i.push(`cwd: ${n}`),r.length>0&&i.push(`recent: ${r.join(" | ")}`),o.length>0&&i.push(`context: ${o.slice(0,200)}`),i.push(`input: ${e}`),Vs(i.join(`
1535
- `))}function ja(e){return e.replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\u001b\][\s\S]*?(?:\u0007|\u001b\\)/g,"").replace(/\u001b[@-_]/g,"").replace(/[\u0000-\u001f\u007f-\u009f]/g,"")}function vL(e,t){let n=t.trim();return n.startsWith(e)&&n.length>e.length}function EL(e={}){let t=e.debounceMs??Vee,n=e.timeoutMs??Xee,r=null,o=null,i=null,s=new Map,a=e.resolveProviderFn??bf,l=new Map;function c(h,y){let b=ne(h,y),w=l.get(b);return w===void 0&&(w=a(h,y),l.set(b,w)),w}function d(h,y){if(s.size>=Qee&&!s.has(h)){let b=s.keys().next().value;b!==void 0&&s.delete(b)}s.set(h,y)}function u(h,y){if(h.length===0)return null;let b=y.getDropdownTopCandidate(h);if(b!==null&&b.startsWith(h)&&b.length>h.length)return b;let w=y.getHistory();for(let v of w)if(v.startsWith(h)&&v.length>h.length)return v;let S=/\s+\/([A-Za-z][A-Za-z0-9_:-]*)$/.exec(h);if(S){let E="/"+S[1],R=at().map(_=>_.name),A=La().map(_=>_.alias),N=[...R,...A].filter(_=>_.startsWith(E)).sort((_,P)=>_.localeCompare(P))[0];if(N){let _=h.length-E.length;return h.slice(0,_)+N}}return null}async function m(h,y){let b=u(h,y);if(b!==null)return b;if(!y.llmEnabled()||h.length<Yee)return null;if(s.has(h))return s.get(h)??null;if(i!==null&&(i.abort(),i=null),r!==null&&(clearTimeout(r),r=null,o!==null)){let w=o;o=null,w(null)}return new Promise(w=>{o=w,r=setTimeout(()=>{r=null,o=null,f(h,y,w)},t)})}async function f(h,y,b){let w=new AbortController;i=w;let S=setTimeout(()=>w.abort(),n),v=new Promise(E=>{w.signal.aborted?E(null):w.signal.addEventListener("abort",()=>E(null),{once:!0})});try{let E=null,R=!1;if(e.completeFn){let A=await Promise.race([e.completeFn({system:wL(),user:SL(h,y),model:kL(y),maxTokens:24,signal:w.signal,apiKey:y.apiKey,baseUrl:y.baseUrl}).then(C=>({ok:!0,raw:C})),v.then(()=>({ok:!1}))]);if(A.ok){R=!0;let C=ja(A.raw).trim();E=vL(h,C)?C:null}}else{let A=kL(y),C=y.baseUrl?{openaiBaseUrl:y.baseUrl}:void 0,N=c(A,C);if(typeof N.complete!="function"){d(h,null),b(null);return}let _=await Promise.race([N.complete({system:wL(),user:SL(h,y),model:A,maxTokens:24,signal:w.signal,apiKey:y.apiKey,baseUrl:y.baseUrl}).then(P=>({ok:!0,raw:P})),v.then(()=>({ok:!1}))]);if(_.ok){R=!0;let P=ja(_.raw).trim();E=vL(h,P)?P:null}}R&&d(h,E),b(E)}catch(E){e.onError?.(E),b(null)}finally{clearTimeout(S),i===w&&(i=null)}}function g(){if(r!==null&&(clearTimeout(r),r=null,o!==null)){let h=o;o=null,h(null)}i!==null&&(i.abort(),i=null);for(let h of l.values())try{h.close?.()}catch{}l.clear()}return{getDeterministicGhost:u,getGhost:m,dispose:g}}function kL(e){let t=k.AFK_SUGGEST_MODEL;if(t)return t;let n=ne(e.model);return n==="anthropic-direct"||n==="anthropic"?k.AFK_COMPACT_MODEL??"haiku":e.model}var Fi=6;function Og(e){let t=e.autocompleteState;if(!t)return;t.trigger=pd(e.input.buffer,e.input.cursor);let n=`${e.input.cursor}:${e.input.buffer}`;t.suppressedSignature!==null&&t.suppressedSignature!==n&&(t.suppressedSignature=null),t.trigger&&t.suppressedSignature===null?(t.trigger.kind==="slash"?t.candidates=Pg(t.trigger.query).slice(0,12):t.trigger.kind==="file"?t.candidates=Mg(t.trigger.query):t.candidates=md(t.trigger.command,t.trigger.query),t.dropdownOpen=t.candidates.length>0):(t.dropdownOpen=!1,t.candidates=[]),t.selectedIndex>=t.candidates.length&&(t.selectedIndex=Math.max(0,t.candidates.length-1)),t.viewportStart>t.selectedIndex&&(t.viewportStart=t.selectedIndex),t.selectedIndex>=t.viewportStart+Fi&&(t.viewportStart=t.selectedIndex-Fi+1)}function TL(e){if(!e.ghostEngine||!e.ghostGetContext)return;let t=e.input.buffer;e.activeGhost!==null&&!e.activeGhost.startsWith(t)&&(e.activeGhost=null);let n=e.ghostGetContext(),r=e.ghostEngine.getDeterministicGhost(t,n);if(r!==null){e.activeGhost=r;return}if(e.activeGhost=null,e.autocompleteState?.dropdownOpen)return;let i=t;e.ghostEngine.getGhost(t,n).then(s=>{s!==null&&e.input.buffer===i&&s.startsWith(i)&&s.length>i.length&&(e.activeGhost=s,e.repaint())}).catch(()=>{})}function xL(e){let t=e.autocompleteState;if(!t?.dropdownOpen||t.candidates.length===0)return!1;let n=t.candidates[t.selectedIndex];if(!n)return!1;let r=e.input.buffer.slice(0,e.input.cursor),o=e.input.buffer.slice(e.input.cursor),i,s;if(t.trigger?.kind==="slash"){let l=/\/[A-Za-z_-]*$/.exec(r);i=l?r.length-l[0].length:e.input.cursor,s=n.value+(o.startsWith(" ")?"":" ")}else if(t.trigger?.kind==="flag"){let l=/--[a-z0-9-]*$/.exec(r);i=l?r.length-l[0].length:e.input.cursor,s=n.value+(o.startsWith(" ")?"":" ")}else{let l=r.search(/[^\s]*$/);i=l>=0?l:e.input.cursor,s=n.value}let a=V.replaceRange(e.input,{start:i,end:e.input.cursor},s);return a===e.input?!1:(e.input=a,t.dropdownOpen=!1,t.candidates=[],t.viewportStart=0,t.selectedIndex=0,Og(e),e.repaint(),!0)}function RL(e){let t=e.activeGhost;if(t===null||e.autocompleteState?.dropdownOpen||e.input.cursor!==e.input.buffer.length||!t.startsWith(e.input.buffer)||t.length<=e.input.buffer.length)return!1;let r=e.input.buffer+ja(t.slice(e.input.buffer.length)),o=V.seed(r);return e.input=o,e.activeGhost=null,Og(e),e.repaint(),!0}import ete from"string-width";function CL(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=ete(e[r]),n>t)return e.slice(0,r)+p.dim("\u2026");return e}function $g(e,t,n,r){let o=t?">":" ",i=e.value,s=e.summary?` ${e.summary}`:"",a=`${i}${s}`,l=CL(a,n-4),c=` ${o} ${l}`;return t?p.inverse(p.user(c)):p.meta(c)}function Dg(e,t){if(!e)return null;let n=e.trim();if(n.length===0)return null;let r=CL(n,Math.max(0,t-7));return r.length===0?null:p.dim(` \u21B3 ${r}`)}function AL(e){let t=e.pendingSubmissions.length,n=t>0?" "+p.dim(t===1?"[queued]":`[${t} queued]`):"",r=e.input.buffer.slice(0,e.input.cursor),o=Jo(e.input.buffer,e.input.cursor),i=e.input.cursor>=e.input.buffer.length,s=i?"\u258F":e.input.buffer.slice(e.input.cursor,o),a=e.input.cursor<e.input.buffer.length?e.input.buffer.slice(o):"",l=e.formatInputBuffer?.(r)??r,c=e.formatInputBuffer?.(a)??a,d=e.caretVisible!==!1,u;d?u=i?p.caret(s):p.caret.inverse(s):i?u=" ":u=e.formatInputBuffer?.(s)??s;let m=e.autocompleteState,f="",g=e.activeGhost;if(g!==null&&!n&&e.input.buffer.length>0&&e.input.cursor===e.input.buffer.length&&g.startsWith(e.input.buffer)&&g.length>e.input.buffer.length&&!m?.dropdownOpen){let h=ja(g.slice(e.input.buffer.length)),y=e.stdout.columns??80,b=X(Fe(e.promptTextFn())),w=X(Fe(r))+1,S=Math.max(0,y-b-w-1),v=ie(h,S,"");v.length>0&&(f=p.dim(v))}return e.promptTextFn()+l+u+c+f+n}function _L(e){let t=e.autocompleteState;if(!t?.dropdownOpen)return[];let n=e.stdout.columns||80;if(n<=40)return[];let r=Math.min(n-4,60),o=Math.min(t.candidates.length-t.viewportStart,Fi),i=[];for(let s=0;s<o;s++){let a=t.viewportStart+s,l=t.candidates[a];if(!l)continue;let c=$g(l,a===t.selectedIndex,r,t.trigger?.kind),d=X(Fe(c)),u=Math.max(0,Math.ceil(d/n)-1);i.push(c);for(let m=0;m<u;m++)i.push("")}return i.reverse()}function IL(e){let t=e.autocompleteState;if(!t?.dropdownOpen)return null;let n=e.stdout.columns||80;if(n<=40)return null;let r=t.candidates[t.selectedIndex];if(!r)return null;let o=Math.min(n-4,80);return Dg(r.hint,o)??""}function PL(e){let{prevTopRow:t,frameTop:n,anchorFloor:r,anchorRow:o,lineCount:i,textLines:s,rows:a,extraRows:l,committedBand:c,committedBandBottomRow:d,committedBandPaintedRows:u,geometryStale:m}=e,f=t>1&&!m&&i<=n-r,g=Math.max(0,n-r),h=Math.max(1,a-1-l),y=Math.max(0,h-r),b=c.length>0&&o<=1&&(m||d===n-1),w=b?[...c,...s]:s,S=b&&c.length>u,v=w.length>g,E=S||!f&&y>0||v&&y>0;return{fitsAboveFrame:f,room:g,overflowTargetBottom:h,maxBandModel:y,overflowPriorContiguous:b,overflowRun:w,overflowHasPending:S,useBandHold:E}}function Tk(e,t){return e.length>t?e.slice(e.length-t):e}function nte(e,t,n){if(e.length===0)return{rows:[],paintedRows:0};let r=Math.max(0,Math.min(t,e.length)),o=e.slice(0,e.length-r),i=e.slice(e.length-r),s=c=>c.flatMap(d=>ku(d,n).split(`
1535
+ `))}function ja(e){return e.replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\u001b\][\s\S]*?(?:\u0007|\u001b\\)/g,"").replace(/\u001b[@-_]/g,"").replace(/[\u0000-\u001f\u007f-\u009f]/g,"")}function vL(e,t){let n=t.trim();return n.startsWith(e)&&n.length>e.length}function EL(e={}){let t=e.debounceMs??Vee,n=e.timeoutMs??Xee,r=null,o=null,i=null,s=new Map,a=e.resolveProviderFn??bf,l=new Map;function c(h,y){let b=ne(h,y),w=l.get(b);return w===void 0&&(w=a(h,y),l.set(b,w)),w}function d(h,y){if(s.size>=Qee&&!s.has(h)){let b=s.keys().next().value;b!==void 0&&s.delete(b)}s.set(h,y)}function u(h,y){if(h.length===0)return null;let b=y.getDropdownTopCandidate(h);if(b!==null&&b.startsWith(h)&&b.length>h.length)return b;let w=y.getHistory();for(let v of w)if(v.startsWith(h)&&v.length>h.length)return v;let S=/\s+\/([A-Za-z][A-Za-z0-9_:-]*)$/.exec(h);if(S){let E="/"+S[1],R=at().map(_=>_.name),A=La().map(_=>_.alias),N=[...R,...A].filter(_=>_.startsWith(E)).sort((_,P)=>_.localeCompare(P))[0];if(N){let _=h.length-E.length;return h.slice(0,_)+N}}return null}async function m(h,y){let b=u(h,y);if(b!==null)return b;if(!y.llmEnabled()||h.length<Yee)return null;if(s.has(h))return s.get(h)??null;if(i!==null&&(i.abort(),i=null),r!==null&&(clearTimeout(r),r=null,o!==null)){let w=o;o=null,w(null)}return new Promise(w=>{o=w,r=setTimeout(()=>{r=null,o=null,f(h,y,w)},t)})}async function f(h,y,b){let w=new AbortController;i=w;let S=setTimeout(()=>w.abort(),n),v=new Promise(E=>{w.signal.aborted?E(null):w.signal.addEventListener("abort",()=>E(null),{once:!0})});try{let E=null,R=!1;if(e.completeFn){let A=await Promise.race([e.completeFn({system:wL(),user:SL(h,y),model:kL(y),maxTokens:24,signal:w.signal,apiKey:y.apiKey,baseUrl:y.baseUrl}).then(C=>({ok:!0,raw:C})),v.then(()=>({ok:!1}))]);if(A.ok){R=!0;let C=ja(A.raw).trim();E=vL(h,C)?C:null}}else{let A=kL(y),C=y.baseUrl?{openaiBaseUrl:y.baseUrl}:void 0,N=c(A,C);if(typeof N.complete!="function"){d(h,null),b(null);return}let _=await Promise.race([N.complete({system:wL(),user:SL(h,y),model:A,maxTokens:24,signal:w.signal,apiKey:y.apiKey,baseUrl:y.baseUrl}).then(P=>({ok:!0,raw:P})),v.then(()=>({ok:!1}))]);if(_.ok){R=!0;let P=ja(_.raw).trim();E=vL(h,P)?P:null}}R&&d(h,E),b(E)}catch(E){e.onError?.(E),b(null)}finally{clearTimeout(S),i===w&&(i=null)}}function g(){if(r!==null&&(clearTimeout(r),r=null,o!==null)){let h=o;o=null,h(null)}i!==null&&(i.abort(),i=null);for(let h of l.values())try{h.close?.()}catch{}l.clear()}return{getDeterministicGhost:u,getGhost:m,dispose:g}}function kL(e){let t=k.AFK_SUGGEST_MODEL;if(t)return t;let n=ne(e.model);return n==="anthropic-direct"||n==="anthropic"?k.AFK_COMPACT_MODEL??"haiku":e.model}var Fi=6;function Og(e){let t=e.autocompleteState;if(!t)return;t.trigger=pd(e.input.buffer,e.input.cursor);let n=`${e.input.cursor}:${e.input.buffer}`;t.suppressedSignature!==null&&t.suppressedSignature!==n&&(t.suppressedSignature=null),t.trigger&&t.suppressedSignature===null?(t.trigger.kind==="slash"?t.candidates=Pg(t.trigger.query).slice(0,12):t.trigger.kind==="file"?t.candidates=Mg(t.trigger.query):t.candidates=md(t.trigger.command,t.trigger.query),t.dropdownOpen=t.candidates.length>0):(t.dropdownOpen=!1,t.candidates=[]),t.selectedIndex>=t.candidates.length&&(t.selectedIndex=Math.max(0,t.candidates.length-1)),t.viewportStart>t.selectedIndex&&(t.viewportStart=t.selectedIndex),t.selectedIndex>=t.viewportStart+Fi&&(t.viewportStart=t.selectedIndex-Fi+1)}function TL(e){if(!e.ghostEngine||!e.ghostGetContext)return;let t=e.input.buffer;e.activeGhost!==null&&!e.activeGhost.startsWith(t)&&(e.activeGhost=null);let n=e.ghostGetContext(),r=e.ghostEngine.getDeterministicGhost(t,n);if(r!==null){e.activeGhost=r;return}if(e.activeGhost=null,e.autocompleteState?.dropdownOpen)return;let i=t;e.ghostEngine.getGhost(t,n).then(s=>{s!==null&&e.input.buffer===i&&s.startsWith(i)&&s.length>i.length&&(e.activeGhost=s,e.repaint())}).catch(()=>{})}function xL(e){let t=e.autocompleteState;if(!t?.dropdownOpen||t.candidates.length===0)return!1;let n=t.candidates[t.selectedIndex];if(!n)return!1;let r=e.input.buffer.slice(0,e.input.cursor),o=e.input.buffer.slice(e.input.cursor),i,s;if(t.trigger?.kind==="slash"){let l=/\/[A-Za-z_-]*$/.exec(r);i=l?r.length-l[0].length:e.input.cursor,s=n.value+(o.startsWith(" ")?"":" ")}else if(t.trigger?.kind==="flag"){let l=/--[a-z0-9-]*$/.exec(r);i=l?r.length-l[0].length:e.input.cursor,s=n.value+(o.startsWith(" ")?"":" ")}else{let l=r.search(/[^\s]*$/);i=l>=0?l:e.input.cursor,s=n.value}let a=V.replaceRange(e.input,{start:i,end:e.input.cursor},s);return a===e.input?!1:(e.input=a,t.dropdownOpen=!1,t.candidates=[],t.viewportStart=0,t.selectedIndex=0,Og(e),e.repaint(),!0)}function RL(e){let t=e.activeGhost;if(t===null||e.autocompleteState?.dropdownOpen||e.input.cursor!==e.input.buffer.length||!t.startsWith(e.input.buffer)||t.length<=e.input.buffer.length)return!1;let r=e.input.buffer+ja(t.slice(e.input.buffer.length)),o=V.seed(r);return e.input=o,e.activeGhost=null,Og(e),e.repaint(),!0}import ete from"string-width";function CL(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=ete(e[r]),n>t)return e.slice(0,r)+p.dim("\u2026");return e}function $g(e,t,n,r){let o=t?">":" ",i=e.value,s=e.summary?` ${e.summary}`:"",a=`${i}${s}`,l=CL(a,n-4),c=` ${o} ${l}`;return t?` ${p.brand(o)} ${p.bold(l)}`:p.meta(c)}function Dg(e,t){if(!e)return null;let n=e.trim();if(n.length===0)return null;let r=CL(n,Math.max(0,t-7));return r.length===0?null:p.dim(` \u21B3 ${r}`)}function AL(e){let t=e.pendingSubmissions.length,n=t>0?" "+p.dim(t===1?"[queued]":`[${t} queued]`):"",r=e.input.buffer.slice(0,e.input.cursor),o=Jo(e.input.buffer,e.input.cursor),i=e.input.cursor>=e.input.buffer.length,s=i?"\u258F":e.input.buffer.slice(e.input.cursor,o),a=e.input.cursor<e.input.buffer.length?e.input.buffer.slice(o):"",l=e.formatInputBuffer?.(r)??r,c=e.formatInputBuffer?.(a)??a,d=e.caretVisible!==!1,u;d?u=i?p.caret(s):p.caret.inverse(s):i?u=" ":u=e.formatInputBuffer?.(s)??s;let m=e.autocompleteState,f="",g=e.activeGhost;if(g!==null&&!n&&e.input.buffer.length>0&&e.input.cursor===e.input.buffer.length&&g.startsWith(e.input.buffer)&&g.length>e.input.buffer.length&&!m?.dropdownOpen){let h=ja(g.slice(e.input.buffer.length)),y=e.stdout.columns??80,b=X(Fe(e.promptTextFn())),w=X(Fe(r))+1,S=Math.max(0,y-b-w-1),v=ie(h,S,"");v.length>0&&(f=p.dim(v))}return e.promptTextFn()+l+u+c+f+n}function _L(e){let t=e.autocompleteState;if(!t?.dropdownOpen)return[];let n=e.stdout.columns||80;if(n<=40)return[];let r=Math.min(n-4,60),o=Math.min(t.candidates.length-t.viewportStart,Fi),i=[];for(let s=0;s<o;s++){let a=t.viewportStart+s,l=t.candidates[a];if(!l)continue;let c=$g(l,a===t.selectedIndex,r,t.trigger?.kind),d=X(Fe(c)),u=Math.max(0,Math.ceil(d/n)-1);i.push(c);for(let m=0;m<u;m++)i.push("")}return i.reverse()}function IL(e){let t=e.autocompleteState;if(!t?.dropdownOpen)return null;let n=e.stdout.columns||80;if(n<=40)return null;let r=t.candidates[t.selectedIndex];if(!r)return null;let o=Math.min(n-4,80);return Dg(r.hint,o)??""}function PL(e){let{prevTopRow:t,frameTop:n,anchorFloor:r,anchorRow:o,lineCount:i,textLines:s,rows:a,extraRows:l,committedBand:c,committedBandBottomRow:d,committedBandPaintedRows:u,geometryStale:m}=e,f=t>1&&!m&&i<=n-r,g=Math.max(0,n-r),h=Math.max(1,a-1-l),y=Math.max(0,h-r),b=c.length>0&&o<=1&&(m||d===n-1),w=b?[...c,...s]:s,S=b&&c.length>u,v=w.length>g,E=S||!f&&y>0||v&&y>0;return{fitsAboveFrame:f,room:g,overflowTargetBottom:h,maxBandModel:y,overflowPriorContiguous:b,overflowRun:w,overflowHasPending:S,useBandHold:E}}function Tk(e,t){return e.length>t?e.slice(e.length-t):e}function nte(e,t,n){if(e.length===0)return{rows:[],paintedRows:0};let r=Math.max(0,Math.min(t,e.length)),o=e.slice(0,e.length-r),i=e.slice(e.length-r),s=c=>c.flatMap(d=>ku(d,n).split(`
1536
1536
  `)),a=s(i);return{rows:[...s(o),...a],paintedRows:a.length}}function Fg(e,t){if(e.committedBand.length===0){e.bandReflowCache=null;return}let n=e.bandReflowCache;if(n!==null&&n.band===e.committedBand&&n.paintedRows===e.committedBandPaintedRows&&n.width===t)return;let{rows:r,paintedRows:o}=nte(e.committedBand,e.committedBandPaintedRows,t);e.committedBand=r,e.committedBandPaintedRows=o,e.bandReflowCache={band:r,paintedRows:o,width:t}}var rte="\x1B[?7l",ote="\x1B[?7h";function Ha(e,t){let n=()=>{try{e.write(ote)}catch{}};try{e.write(rte)}catch{return}try{t()}finally{n()}}function ML(e,t){e.debugLog("commitAbove:enter",{textLen:t.length,anchorRow:e.anchorRow??null,committing:e.committing,topRow:e.logUpdate?.topRow??null});let n=U=>{e.scrollRegion?e.scrollRegion.withFullScrollRegion(U):U()};if(!e.armed||!e.logUpdate){n(()=>{e.stdout.write(t+`
1537
1537
  `)});return}let r=Math.max(1,e.stdout.rows??24),o=t.endsWith(`
1538
1538
  `)?t.slice(0,-1):t,i=Math.max(1,e.stdout.columns??80);Fg(e,i);let s=o.split(`
@@ -1546,7 +1546,7 @@ ${d}`}function bk(e,t){let n=zF[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1546
1546
  `):[],r=e.spinnerController.renderSpinnerRow(),o=e.spinnerController.renderTipRow(e.stdout.columns??80),i=null;e.attachments.length>0?i=gd(e.attachments):e.clipboardFailureMsg!==null&&(i=p.dim(e.clipboardFailureMsg),e.clipboardFailureMsg=null);let s=e.renderDropdownRows(),a=e.renderHintRow(),l=!!r||!!o||!!i,c=l||n.length>0,d=e.scrollRegion?.getExtraRows()??0,u=Math.max(1,(e.stdout.rows??24)-1-d),m=c?1:0,f=(r?1:0)+(o?1:0)+(i?1:0)+m+s.length+(a!==null?1:0)+1,g=Math.max(0,u-f),h=n.length>g?n.slice(-g):n,y=l||h.length>0,b=[];b.push(...h),r&&b.push(r),o&&b.push(o),i&&b.push(i),y&&b.push(""),b.push(...s),a!==null&&b.push(a),b.push(t);let w=Math.max(1,(e.stdout.rows??24)-1-d),S=b.join(`
1547
1547
  `),v=w,E=e.logUpdate.measure?e.logUpdate.measure(S,v).topRow:Math.max(1,v-b.length+1);e.lastMeasuredFrameTop=E,xk(e,E);let R=e.logUpdate.topRow??0;e.logUpdate.render(S,v,e.anchorRow),e.repositionCommittedBand(E,R,v)}function lte(e){if(!e.logUpdate||!e.pickerController)return;let t=[...e.pickerController.renderRows()],n=e.overlay?e.overlay.split(`
1548
1548
  `):[],r=e.spinnerController.renderSpinnerRow(),o=e.spinnerController.renderTipRow(e.stdout.columns??80),i=null;e.attachments.length>0?i=gd(e.attachments):e.clipboardFailureMsg!==null&&(i=p.dim(e.clipboardFailureMsg),e.clipboardFailureMsg=null);let s=!!r||!!o||!!i,a=s||n.length>0,l=e.scrollRegion?.getExtraRows()??0,c=Math.max(1,(e.stdout.rows??24)-1-l),d=a?1:0,u=(r?1:0)+(o?1:0)+(i?1:0)+d+t.length,m=Math.max(0,c-u),f=n.length>m?n.slice(-m):n,g=s||f.length>0,h=[];if(h.push(...f),r&&h.push(r),o&&h.push(o),i&&h.push(i),g&&h.push(""),h.push(...t),h.length===0)return;let y=Math.max(1,(e.stdout.rows??24)-1-l),b=h.join(`
1549
- `),w=e.logUpdate.measure?e.logUpdate.measure(b,y).topRow:Math.max(1,y-h.length+1);e.lastMeasuredFrameTop=w,xk(e,w);let S=e.logUpdate.topRow??0;e.logUpdate.render(b,y,e.anchorRow),e.repositionCommittedBand(w,S,y)}function NL(e,t){if(e.pickerController)throw new Error("enterPickerMode: a picker is already active; call exitPickerMode first");e.pickerSavedMode=e.inputMode,e.pickerController=t,e.inputMode="picker",e.autocompleteState?.reset(),e.repaint()}function BL(e){e.pickerController&&(e.pickerController=null,e.inputMode=e.pickerSavedMode,e.repaint())}function UL(e){e.pickerController&&e.repaint()}function jL(e,t){let n=e.inputMode;if(e.inputMode=t,n==="idle"&&t==="streaming"){e.canceled=!1,e.backgrounded=!1,e.softStopped=!1,e.softStopQueueBase=0,e.autocompleteState?.reset(),e.repaint();return}if(t==="idle"&&e.softStopped&&(e.softStopped=!1,e.softStopQueueBase=0),t==="idle"&&e.pendingSubmissions.length>0&&e.onSubmit){let r=e.onSubmit,o=e.pendingSubmissions.shift();e.queued=e.pendingSubmissions.length>0,e.repaint(),r(o);return}n!==t&&e.repaint()}function HL(e){return e.inputMode}function Ka(e){return e>=" "&&Jo(e,0)===e.length}K();import{spawn as WL}from"child_process";import{randomUUID as Rk}from"crypto";import{readFile as KL,unlink as Ck}from"fs/promises";import{tmpdir as GL}from"os";import{join as qL}from"path";var Li=!!k.AFK_DEBUG_CLIPBOARD;function Ni(e){process.stderr.write(`[afk-clipboard] ${e}
1549
+ `),w=e.logUpdate.measure?e.logUpdate.measure(b,y).topRow:Math.max(1,y-h.length+1);e.lastMeasuredFrameTop=w,xk(e,w);let S=e.logUpdate.topRow??0;e.logUpdate.render(b,y,e.anchorRow),e.repositionCommittedBand(w,S,y)}function NL(e,t){if(e.pickerController)throw new Error("enterPickerMode: a picker is already active; call exitPickerMode first");e.pickerSavedMode=e.inputMode,e.pickerController=t,e.inputMode="picker",e.autocompleteState?.reset(),e.repaint()}function BL(e){e.pickerController&&(e.pickerController=null,e.inputMode=e.pickerSavedMode,e.repaint())}function UL(e){e.pickerController&&e.repaint()}function jL(e,t){let n=e.inputMode;if(e.inputMode=t,n==="idle"&&t==="streaming"){e.canceled=!1,e.backgrounded=!1,e.softStopped=!1,e.postEscPayload===null&&(e.postEscCoalesce=!1),e.autocompleteState?.reset(),e.repaint();return}if(t==="idle"&&e.softStopped&&(e.softStopped=!1),t==="idle"&&e.pendingSubmissions.length>0&&e.onSubmit){let r=e.onSubmit,o=e.pendingSubmissions.shift();e.queued=e.pendingSubmissions.length>0,o===e.postEscPayload&&(e.postEscCoalesce=!1,e.postEscPayload=null),e.repaint(),r(o);return}n!==t&&e.repaint()}function HL(e){return e.inputMode}function Ka(e){return e>=" "&&Jo(e,0)===e.length}K();import{spawn as WL}from"child_process";import{randomUUID as Rk}from"crypto";import{readFile as KL,unlink as Ck}from"fs/promises";import{tmpdir as GL}from"os";import{join as qL}from"path";var Li=!!k.AFK_DEBUG_CLIPBOARD;function Ni(e){process.stderr.write(`[afk-clipboard] ${e}
1550
1550
  `)}async function Bi(){if(process.platform!=="darwin")return null;Li&&Ni("probing clipboard for image data");for(let e of["PNGf","TIFF"]){let t=qL(GL(),`afk-clipboard-${Rk()}.bin`);try{let{ok:n,exitCode:r,stderr:o}=await mte(e,t);if(Li&&Ni(`class=${e} osascript exitCode=${r} stderr=${JSON.stringify(o)} ok=${n}`),!n)continue;let i=await KL(t);if(i.length===0)continue;if(ute(i)){Li&&Ni(`class=${e} magic=TIFF detected, transcoding via sips`);let a=await pte(t);if(!a){Li&&Ni(`class=${e} sips transcode failed, skipping`);continue}i=a}let s=gte(i);if(Li&&Ni(`class=${e} magic-byte detection result: ${s??"unrecognized"}`),!s)continue;return Li&&Ni(`probe success: mediaType=${s} size=${i.byteLength}`),{id:Rk(),mediaType:s,bytes:i,sizeBytes:i.byteLength}}catch{}finally{Ck(t).catch(()=>{})}}return Li&&Ni("probe result: null (no image found on clipboard)"),null}function ute(e){return e.length<4?!1:e[0]===73&&e[1]===73&&e[2]===42&&e[3]===0||e[0]===77&&e[1]===77&&e[2]===0&&e[3]===42}async function pte(e){let t=qL(GL(),`afk-clipboard-${Rk()}.png`);if(!await new Promise(r=>{let o=WL("sips",["-s","format","png",e,"--out",t],{stdio:["ignore","ignore","ignore"]});o.on("error",()=>r(!1)),o.on("close",i=>r(i===0))}))return Ck(t).catch(()=>{}),null;try{let r=await KL(t);return r.length>0?r:null}catch{return null}finally{Ck(t).catch(()=>{})}}async function mte(e,t){let n=`
1551
1551
  try
1552
1552
  set imgData to the clipboard as \xABclass ${e}\xBB
@@ -1561,18 +1561,18 @@ ${d}`}function bk(e,t){let n=zF[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1561
1561
  end try
1562
1562
  return "no"
1563
1563
  end try
1564
- `;return new Promise(r=>{let o=WL("osascript",["-e",n],{stdio:["ignore","pipe","pipe"]}),i="",s="";o.stdout?.on("data",a=>{i+=a.toString("utf8")}),o.stderr?.on("data",a=>{s+=a.toString("utf8")}),o.on("error",()=>r({ok:!1,exitCode:null,stderr:s})),o.on("close",a=>{r({ok:a===0&&i.trim()==="ok",exitCode:a,stderr:s})})})}function fte(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}function gte(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=4&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?"image/gif":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"image/webp":null}function zL(e,t){return t===e.input?!1:(e.input=t,e.pasting||(e.updateAutocomplete(),e.updateGhost(),e.repaint()),!0)}function JL(e,t,n){if(!e.armed||hte(e,t,n))return;let r=n?.sequence??"";yte(e,r)||bte(e,n)||wte(e,n)||Ste(e,n)||vte(e,n)||Ete(e,n,r)||Tte(e,n)||xte(e,n)||Rte(e,n)||Cte(e,n)||Ate(e,t,n)}function hte(e,t,n){return e.inputMode==="picker"&&e.pickerController?(e.pickerController.onKey(t,n),!0):!1}function yte(e,t){if(t==="\x1B[200~")return e.pasting=!0,e.pasteStartBufferLen=e.input.buffer.length,e.pasteStartCursor=e.input.cursor,!0;if(t==="\x1B[201~"){e.pasting=!1;let n=r=>{e.clipboardInFlight||(e.clipboardInFlight=!0,Bi().then(o=>{o?(e.clipboardFailureMsg=null,e.attachments.push(o),e.repaint()):r==="flag-missing"&&(e.clipboardFailureMsg="[clipboard: no image found]",e.repaint())}).catch(()=>{}).finally(()=>{e.clipboardInFlight=!1}))};return e.input.buffer.length===e.pasteStartBufferLen?n("flag-missing"):(fL(e),e.updateAutocomplete(),e.repaint(),n("silent")),!0}return!1}function bte(e,t){if(t?.name!=="escape")return!1;let n=e.autocompleteState;return n?.dropdownOpen&&(n.suppressedSignature=`${e.input.cursor}:${e.input.buffer}`,n.dropdownOpen=!1,n.candidates=[],e.repaint()),e.inputMode==="idle"||e.softStopped||(e.softStopped=!0,e.softStopQueueBase=e.pendingSubmissions.length,e.onSoftStop&&e.onSoftStop()),!0}function wte(e,t){return t?.ctrl&&t?.name==="c"?e.inputMode==="idle"?(e.onCancel&&e.onCancel(),!0):(e.canceled||(e.canceled=!0,e.onCancel&&e.onCancel()),!0):!1}function Ste(e,t){return t?.ctrl&&t?.name==="v"?(e.clipboardInFlight||(e.clipboardInFlight=!0,Bi().then(n=>{n?(e.clipboardFailureMsg=null,e.attachments.push(n)):e.clipboardFailureMsg="[clipboard: no image found]",e.repaint()}).catch(()=>{}).finally(()=>{e.clipboardInFlight=!1})),!0):!1}function vte(e,t){let n=e.autocompleteState;if(t?.ctrl&&t?.name==="p"||t?.name==="up"){if(n?.dropdownOpen)return n.selectedIndex<n.candidates.length-1&&(n.selectedIndex++,n.selectedIndex>=n.viewportStart+Fi&&(n.viewportStart=n.selectedIndex-Fi+1),e.repaint()),!0;if(e.pendingSubmissions.length>0&&e.input.buffer.length===0){let r=e.pendingSubmissions.pop();return e.queued=e.pendingSubmissions.length>0,e.attachments=[...r.attachments],e.history?.resetRecall(),e.applyEdit(V.seed(r.text)),!0}if(e.history){let r=e.history.back(e.input.buffer);r!==null&&e.applyEdit(V.seed(r))}return!0}if(t?.ctrl&&t?.name==="n"||t?.name==="down"){if(n?.dropdownOpen)return n.selectedIndex>0&&(n.selectedIndex--,n.selectedIndex<n.viewportStart&&(n.viewportStart=n.selectedIndex),e.repaint()),!0;if(e.history){let r=e.history.forward();r!==null&&e.applyEdit(V.seed(r))}return!0}return!1}function kte(e){if(e.length===1)return e[0];let t=e.map(i=>i.text).filter(i=>i.length>0).join(`
1564
+ `;return new Promise(r=>{let o=WL("osascript",["-e",n],{stdio:["ignore","pipe","pipe"]}),i="",s="";o.stdout?.on("data",a=>{i+=a.toString("utf8")}),o.stderr?.on("data",a=>{s+=a.toString("utf8")}),o.on("error",()=>r({ok:!1,exitCode:null,stderr:s})),o.on("close",a=>{r({ok:a===0&&i.trim()==="ok",exitCode:a,stderr:s})})})}function fte(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}function gte(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=4&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?"image/gif":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"image/webp":null}K();function zL(e,t){return t===e.input?!1:(e.input=t,e.pasting||(e.updateAutocomplete(),e.updateGhost(),e.repaint()),!0)}function JL(e,t,n){if(!e.armed||hte(e,t,n))return;let r=n?.sequence??"";yte(e,r)||bte(e,n)||wte(e,n)||Ste(e,n)||vte(e,n)||Ete(e,n,r)||Tte(e,n)||xte(e,n)||Rte(e,n)||Cte(e,n)||Ate(e,t,n)}function hte(e,t,n){return e.inputMode==="picker"&&e.pickerController?(e.pickerController.onKey(t,n),!0):!1}function yte(e,t){if(t==="\x1B[200~")return e.pasting=!0,e.pasteStartBufferLen=e.input.buffer.length,e.pasteStartCursor=e.input.cursor,!0;if(t==="\x1B[201~"){e.pasting=!1;let n=r=>{e.clipboardInFlight||(e.clipboardInFlight=!0,Bi().then(o=>{o?(e.clipboardFailureMsg=null,e.attachments.push(o),e.repaint()):r==="flag-missing"&&(e.clipboardFailureMsg="[clipboard: no image found]",e.repaint())}).catch(()=>{}).finally(()=>{e.clipboardInFlight=!1}))};return e.input.buffer.length===e.pasteStartBufferLen?n("flag-missing"):(fL(e),e.updateAutocomplete(),e.repaint(),n("silent")),!0}return!1}function bte(e,t){if(t?.name!=="escape")return!1;let n=e.autocompleteState;return n?.dropdownOpen&&(n.suppressedSignature=`${e.input.cursor}:${e.input.buffer}`,n.dropdownOpen=!1,n.candidates=[],e.repaint()),e.inputMode==="idle"||e.softStopped||(e.softStopped=!0,e.postEscCoalesce=!0,e.postEscPayload=null,e.onSoftStop&&e.onSoftStop()),!0}function wte(e,t){return t?.ctrl&&t?.name==="c"?e.inputMode==="idle"?(e.onCancel&&e.onCancel(),!0):(e.canceled||(e.canceled=!0,e.onCancel&&e.onCancel()),!0):!1}function Ste(e,t){return t?.ctrl&&t?.name==="v"?(e.clipboardInFlight||(e.clipboardInFlight=!0,Bi().then(n=>{n?(e.clipboardFailureMsg=null,e.attachments.push(n)):e.clipboardFailureMsg="[clipboard: no image found]",e.repaint()}).catch(()=>{}).finally(()=>{e.clipboardInFlight=!1})),!0):!1}function vte(e,t){let n=e.autocompleteState;if(t?.ctrl&&t?.name==="p"||t?.name==="up"){if(n?.dropdownOpen)return n.selectedIndex<n.candidates.length-1&&(n.selectedIndex++,n.selectedIndex>=n.viewportStart+Fi&&(n.viewportStart=n.selectedIndex-Fi+1),e.repaint()),!0;if(e.pendingSubmissions.length>0&&e.input.buffer.length===0){let r=e.pendingSubmissions.pop();return r===e.postEscPayload&&(e.postEscPayload=null),e.queued=e.pendingSubmissions.length>0,e.attachments=[...r.attachments],e.history?.resetRecall(),e.applyEdit(V.seed(r.text)),!0}if(e.history){let r=e.history.back(e.input.buffer);r!==null&&e.applyEdit(V.seed(r))}return!0}if(t?.ctrl&&t?.name==="n"||t?.name==="down"){if(n?.dropdownOpen)return n.selectedIndex>0&&(n.selectedIndex--,n.selectedIndex<n.viewportStart&&(n.viewportStart=n.selectedIndex),e.repaint()),!0;if(e.history){let r=e.history.forward();r!==null&&e.applyEdit(V.seed(r))}return!0}return!1}function kte(e){if(e.length===1)return e[0];let t=e.map(i=>i.text).filter(i=>i.length>0).join(`
1565
1565
  `),n=e.flatMap(i=>[...i.attachments]);if(!e.some(i=>i.displayText!==void 0))return{text:t,attachments:n};let o=e.map(i=>i.displayText??i.text).filter(i=>i.length>0).join(`
1566
1566
  `);return{text:t,displayText:o,attachments:n}}function Ete(e,t,n){if(t?.name!=="return")return!1;if(_g(t,n))return e.history?.resetRecall(),e.applyEdit(V.insert(e.input,`
1567
1567
  `)),!0;if(e.pasting)return e.input=V.insert(e.input,`
1568
1568
  `),e.queued=e.pendingSubmissions.length>0,!0;let r=e.autocompleteState;if(r?.dropdownOpen){let l=r.trigger?.kind,c=e.applyDropdownSelection();if(l!=="slash"||!c)return!0}if(Ua(e.input.buffer))return e.history?.resetRecall(),e.applyEdit(V.replaceRange(e.input,{start:e.input.buffer.length-1,end:e.input.buffer.length},`
1569
- `)),!0;if(e.input.buffer.length===0&&e.attachments.length===0)return!0;if(e.inputMode==="idle"&&e.onSubmit){let l=e.input.buffer,c=Ag(e,l),d=[...e.attachments],u=e.onSubmit;return e.queued=e.pendingSubmissions.length>0,e.input=V.seed(""),e.attachments=[],e.pasteRegistry.clear(),e.autocompleteState?.reset(),e.repaint(),u(c===l?{text:c,attachments:d}:{text:c,displayText:l,attachments:d}),!0}let o=e.input.buffer,i=Ag(e,o),s=[...e.attachments],a=i===o?{text:i,attachments:s}:{text:i,displayText:o,attachments:s};if(e.softStopped){let l=e.pendingSubmissions.slice(e.softStopQueueBase);e.pendingSubmissions.length=e.softStopQueueBase,e.pendingSubmissions.push(kte([...l,a]))}else e.pendingSubmissions.push(a);return e.queued=!0,e.input=V.seed(""),e.attachments=[],e.pasteRegistry.clear(),e.history?.resetRecall(),e.autocompleteState?.reset(),e.repaint(),e.paused&&e.onPauseInterrupt&&e.onPauseInterrupt(),!0}function Tte(e,t){if(t?.name!=="backspace")return!1;if(t?.meta){let o=V.deleteWordBackward(e.input);return o!==e.input&&(e.history?.resetRecall(),e.applyEdit(o)),!0}let n=Ek(e,"backward");if(n)return e.history?.resetRecall(),e.applyEdit(n),!0;let r=V.backspace(e.input);return r!==e.input?(e.history?.resetRecall(),e.applyEdit(r)):e.attachments.length>0&&(e.attachments.pop(),e.repaint()),!0}function xte(e,t){if(t?.ctrl&&t?.name==="a")return e.applyEdit(V.moveLineStart(e.input)),!0;if(t?.ctrl&&t?.name==="e")return e.applyEdit(V.moveLineEnd(e.input)),!0;if((t?.meta||t?.ctrl)&&t?.name==="left")return e.applyEdit(V.moveWordBackward(e.input)),!0;if((t?.meta||t?.ctrl)&&t?.name==="right")return e.applyEdit(V.moveWordForward(e.input)),!0;if(t?.meta&&t?.name==="b")return e.applyEdit(V.moveWordBackward(e.input)),!0;if(t?.meta&&t?.name==="f")return e.applyEdit(V.moveWordForward(e.input)),!0;if(t?.ctrl&&t?.name==="w"){let n=V.deleteWordBackward(e.input);return n!==e.input&&(e.history?.resetRecall(),e.applyEdit(n)),!0}if(t?.ctrl&&t?.name==="u"){let n=V.deleteToLineStart(e.input);return n!==e.input&&(e.history?.resetRecall(),e.applyEdit(n)),!0}if(t?.ctrl&&t?.name==="k"){let n=V.deleteToLineEnd(e.input);return n!==e.input&&(e.history?.resetRecall(),e.applyEdit(n)),!0}if(t?.ctrl&&t?.name==="l")return e.clearScreen(),!0;if(t?.ctrl&&t?.name==="d")return e.input.buffer.length===0?e.onCancel&&e.onCancel():(e.history?.resetRecall(),e.applyEdit(V.deleteForward(e.input))),!0;if(t?.name==="left")return e.applyEdit(V.moveLeft(e.input)),!0;if(t?.name==="right")return e.input.cursor===e.input.buffer.length&&e.activeGhost!==null&&!e.autocompleteState?.dropdownOpen?e.applyGhostAccept():e.applyEdit(V.moveRight(e.input)),!0;if(t?.name==="home")return e.applyEdit(V.moveLineStart(e.input)),!0;if(t?.name==="end")return e.applyEdit(V.moveLineEnd(e.input)),!0;if(t?.name==="delete"){if(t?.meta){let r=V.deleteWordForward(e.input);return r!==e.input&&(e.history?.resetRecall(),e.applyEdit(r)),!0}let n=Ek(e,"forward");return n?(e.history?.resetRecall(),e.applyEdit(n),!0):(e.history?.resetRecall(),e.applyEdit(V.deleteForward(e.input)),!0)}return!1}function Rte(e,t){return t?.ctrl&&t?.name==="b"?(e.inputMode==="idle"||e.backgrounded||(e.backgrounded=!0,e.onBackground&&e.onBackground()),!0):!1}function Cte(e,t){return t?.name==="tab"&&t?.shift?(e.onShiftTab&&e.onShiftTab(),!0):t?.name==="tab"?(e.applyDropdownSelection()||e.applyGhostAccept(),!0):!1}function Ate(e,t,n){let r=["tab","pageup","pagedown"];if(n?.name&&r.includes(n.name)||n?.ctrl||n?.meta)return;let o=typeof t=="string"&&Ka(t)?t:typeof n?.sequence=="string"&&Ka(n.sequence)?n.sequence:null;o!==null&&(e.history?.resetRecall(),e.applyEdit(V.insert(e.input,o)))}K();import _te from"wrap-ansi";var VL="\x1B[?2026h",XL="\x1B[?2026l",hd=(e,t)=>`\x1B[${e};${t}H`,Ak="\x1B[2K",Ite="\x1B[?25l",QL="\x1B[?25h",Ng=class e{stream;previousTopRow=0;previousLineCount=0;previousRawLineCount=0;constructor(t){this.stream=t}get topRow(){return this.previousTopRow}static wrapToPhysicalLines(t,n){let r=t.endsWith(`
1569
+ `)),!0;if(e.input.buffer.length===0&&e.attachments.length===0)return!0;if(e.inputMode==="idle"&&e.onSubmit){let l=e.input.buffer,c=Ag(e,l),d=[...e.attachments],u=e.onSubmit;return e.queued=e.pendingSubmissions.length>0,e.input=V.seed(""),e.attachments=[],e.pasteRegistry.clear(),e.autocompleteState?.reset(),e.repaint(),u(c===l?{text:c,attachments:d}:{text:c,displayText:l,attachments:d}),!0}let o=e.input.buffer,i=Ag(e,o),s=[...e.attachments],a=i===o?{text:i,attachments:s}:{text:i,displayText:o,attachments:s};if(e.postEscCoalesce){let l=e.postEscPayload,c=l!==null?e.pendingSubmissions.indexOf(l):-1;if(l!==null&&c>=0){let d=kte([l,a]);e.pendingSubmissions[c]=d,e.postEscPayload=d}else{if(l!==null&&k.NODE_ENV!=="production")throw new Error("terminal-compositor: post-ESC coalesce reference is dangling (postEscPayload non-null but absent from pendingSubmissions) \u2014 a pendingSubmissions removal site failed to clear the epoch reference.");e.postEscPayload=a,e.pendingSubmissions.push(a)}}else e.pendingSubmissions.push(a);return e.queued=!0,e.input=V.seed(""),e.attachments=[],e.pasteRegistry.clear(),e.history?.resetRecall(),e.autocompleteState?.reset(),e.repaint(),e.paused&&e.onPauseInterrupt&&e.onPauseInterrupt(),!0}function Tte(e,t){if(t?.name!=="backspace")return!1;if(t?.meta){let o=V.deleteWordBackward(e.input);return o!==e.input&&(e.history?.resetRecall(),e.applyEdit(o)),!0}let n=Ek(e,"backward");if(n)return e.history?.resetRecall(),e.applyEdit(n),!0;let r=V.backspace(e.input);return r!==e.input?(e.history?.resetRecall(),e.applyEdit(r)):e.attachments.length>0&&(e.attachments.pop(),e.repaint()),!0}function xte(e,t){if(t?.ctrl&&t?.name==="a")return e.applyEdit(V.moveLineStart(e.input)),!0;if(t?.ctrl&&t?.name==="e")return e.applyEdit(V.moveLineEnd(e.input)),!0;if((t?.meta||t?.ctrl)&&t?.name==="left")return e.applyEdit(V.moveWordBackward(e.input)),!0;if((t?.meta||t?.ctrl)&&t?.name==="right")return e.applyEdit(V.moveWordForward(e.input)),!0;if(t?.meta&&t?.name==="b")return e.applyEdit(V.moveWordBackward(e.input)),!0;if(t?.meta&&t?.name==="f")return e.applyEdit(V.moveWordForward(e.input)),!0;if(t?.ctrl&&t?.name==="w"){let n=V.deleteWordBackward(e.input);return n!==e.input&&(e.history?.resetRecall(),e.applyEdit(n)),!0}if(t?.ctrl&&t?.name==="u"){let n=V.deleteToLineStart(e.input);return n!==e.input&&(e.history?.resetRecall(),e.applyEdit(n)),!0}if(t?.ctrl&&t?.name==="k"){let n=V.deleteToLineEnd(e.input);return n!==e.input&&(e.history?.resetRecall(),e.applyEdit(n)),!0}if(t?.ctrl&&t?.name==="l")return e.clearScreen(),!0;if(t?.ctrl&&t?.name==="d")return e.input.buffer.length===0?e.onCancel&&e.onCancel():(e.history?.resetRecall(),e.applyEdit(V.deleteForward(e.input))),!0;if(t?.name==="left")return e.applyEdit(V.moveLeft(e.input)),!0;if(t?.name==="right")return e.input.cursor===e.input.buffer.length&&e.activeGhost!==null&&!e.autocompleteState?.dropdownOpen?e.applyGhostAccept():e.applyEdit(V.moveRight(e.input)),!0;if(t?.name==="home")return e.applyEdit(V.moveLineStart(e.input)),!0;if(t?.name==="end")return e.applyEdit(V.moveLineEnd(e.input)),!0;if(t?.name==="delete"){if(t?.meta){let r=V.deleteWordForward(e.input);return r!==e.input&&(e.history?.resetRecall(),e.applyEdit(r)),!0}let n=Ek(e,"forward");return n?(e.history?.resetRecall(),e.applyEdit(n),!0):(e.history?.resetRecall(),e.applyEdit(V.deleteForward(e.input)),!0)}return!1}function Rte(e,t){return t?.ctrl&&t?.name==="b"?(e.inputMode==="idle"||e.backgrounded||(e.backgrounded=!0,e.onBackground&&e.onBackground()),!0):!1}function Cte(e,t){return t?.name==="tab"&&t?.shift?(e.onShiftTab&&e.onShiftTab(),!0):t?.name==="tab"?(e.applyDropdownSelection()||e.applyGhostAccept(),!0):!1}function Ate(e,t,n){let r=["tab","pageup","pagedown"];if(n?.name&&r.includes(n.name)||n?.ctrl||n?.meta)return;let o=typeof t=="string"&&Ka(t)?t:typeof n?.sequence=="string"&&Ka(n.sequence)?n.sequence:null;o!==null&&(e.history?.resetRecall(),e.applyEdit(V.insert(e.input,o)))}K();import _te from"wrap-ansi";var VL="\x1B[?2026h",XL="\x1B[?2026l",hd=(e,t)=>`\x1B[${e};${t}H`,Ak="\x1B[2K",Ite="\x1B[?25l",QL="\x1B[?25h",Ng=class e{stream;previousTopRow=0;previousLineCount=0;previousRawLineCount=0;constructor(t){this.stream=t}get topRow(){return this.previousTopRow}static wrapToPhysicalLines(t,n){let r=t.endsWith(`
1570
1570
  `)?t:`${t}
1571
1571
  `,i=_te(r,n,{trim:!1,hard:!0,wordWrap:!1}).split(`
1572
1572
  `);for(;i.length>0&&i[i.length-1]==="";)i.pop();return i}measure(t,n){let r=this.stream.columns??80,o=Math.max(1,e.wrapToPhysicalLines(t,r).length),i=Math.max(1,n);return{topRow:Math.max(1,i-o+1),lineCount:o}}render(t,n,r){let o=Math.max(1,n),i=Math.max(1,r??1),s=this.stream.columns??80,a=this.stream.isTTY===!0,l=e.wrapToPhysicalLines(t,s),c=Math.max(1,l.length),d=this.previousRawLineCount>c?this.previousRawLineCount-c:0,u=Math.max(0,o-c+1-i),m=Math.min(d,u),f=m>0?[...Array(m).fill(""),...l]:l,g=f.length,h=Math.max(1,o-g+1),y="";if(a&&(y+=VL),this.previousLineCount>0)for(let b=0;b<this.previousLineCount;b++){let w=this.previousTopRow+b;y+=hd(w,1)+Ak}for(let b=0;b<g;b++){let w=h+b;y+=hd(w,1)+Ak+(f[b]??"")}if(y+=hd(h+g-1,1),a&&(y+=XL),this.stream.isTTY)try{this.stream.write(Ite)}catch{}try{this.stream.write(y)}catch{try{this.stream.isTTY&&this.stream.write(QL)}catch{}}if(k.NODE_ENV!=="production"&&g<c)throw new Error(`CupFrameRenderer invariant violation: lineCount (${g}) < rawLineCount (${c}). previousLineCount must cover at least previousRawLineCount \u2014 padded footprint must be \u2265 raw content size; see PR #557.`);this.previousTopRow=h,this.previousLineCount=g,this.previousRawLineCount=c}resetGeometry(){this.previousTopRow=0,this.previousLineCount=0,this.previousRawLineCount=0}clear(t=0){if(this.previousLineCount===0)return;let n="",r=this.stream.isTTY===!0;r&&(n+=VL);for(let o=0;o<this.previousLineCount;o++){let i=this.previousTopRow+o;n+=hd(i,1)+Ak}n+=hd(Math.max(1,(this.stream.rows??24)-1-t),1),r&&(n+=XL);try{this.stream.write(n)}catch{}this.previousTopRow=0,this.previousLineCount=0,this.previousRawLineCount=0}done(){if(this.previousTopRow=0,this.previousLineCount=0,this.previousRawLineCount=0,this.stream.isTTY)try{this.stream.write(QL)}catch{}}};var yd=null;function bd(e){if(yd!==null)throw new Error(`stdin claim conflict: '${yd.name}' already holds the claim, '${e}' cannot acquire it concurrently.`);let t=!1,n={release(){t||(t=!0,yd?.handle===n&&(yd=null))}};return yd={name:e,handle:n},n}async function ZL(e,t){let n=bd(e);try{return await t()}finally{n.release()}}function eN(e){if(!(!e.armed||e.suspended)){if(e.logUpdate)try{e.logUpdate.clear(e.scrollRegion?.getExtraRows()??0),e.logUpdate.done()}catch{}e.handleKeypress&&e.stdin.removeListener("keypress",e.handleKeypress);try{e.stdin.setRawMode(!1)}catch{}e.caretBlinkController.stop(),e.suspended=!0}}function tN(e){if(!(!e.armed||!e.suspended)){try{e.stdin.setRawMode(!0)}catch{}e.handleKeypress&&e.stdin.on("keypress",e.handleKeypress),e.suspended=!1,e.repaint(),e.caretBlinkController.start()}}async function nN(e){if(e.armed)throw new Error("TerminalCompositor: arm() called while already armed");if(!(!e.stdout.isTTY||!e.stdin.isTTY)){e.anchorRow=e.declaredAnchorRow,e.logUpdate||(e.logUpdate=new Ng(e.stdout)),e.stdinClaim=bd("TerminalCompositor.arm"),e.wasRaw=e.stdin.isRaw??!1;try{e.stdin.setRawMode(!0)}catch{e.stdinClaim?.release(),e.stdinClaim=null,e.logUpdate=null,e.wasRaw=!1;return}try{e.stdout.write("\x1B[?2004h")}catch{}e.stdin.resume(),_i(e.stdin),e.handleKeypress=(t,n)=>{let r=e.pasting?!1:e.caretBlinkController.resetVisible(),o=e.repaintCount;JL(e,t,n),r&&e.repaintCount===o&&e.repaint()},e.stdin.on("keypress",e.handleKeypress),e.armed=!0,e.canceled=!1,e.resizeUnsub=je.subscribe(()=>{e.armed&&e.repaint()}),e.resizeImmediateUnsub=je.subscribeImmediate(()=>{if(!e.armed)return;let t=e.stdout.rows??24;if(e.lastKnownRows>0&&t>e.lastKnownRows){let n=e.scrollRegion?.getExtraRows()??0,r=e.logUpdate?.topRow??0,o=e.committedBand.length>0?e.committedBandTopRow:0,i=[r,o].filter(l=>l>0),s=i.length>0?Math.min(...i):0,a=Math.max(1,e.lastKnownRows-1-n);s>0&&s<=a&&(e.pendingResizeErase={top:s,bottom:a})}else e.pendingResizeErase=null;e.logUpdate?.resetGeometry?.(),e.bandGeometryStale=!0}),e.repaint(),e.caretBlinkController.start()}}function rN(e){if(e.spinnerController.dispose(),e.caretBlinkController.stop(),!e.armed){e.resetState();return}if(e.handleKeypress&&(e.stdin.removeListener("keypress",e.handleKeypress),e.handleKeypress=null),e.resizeUnsub&&(e.resizeUnsub(),e.resizeUnsub=null),e.resizeImmediateUnsub&&(e.resizeImmediateUnsub(),e.resizeImmediateUnsub=null),Pte(e),e.logUpdate)try{e.logUpdate.clear(e.scrollRegion?.getExtraRows()??0),e.logUpdate.done()}catch{}if(e.stdout.isTTY&&e.stdin.isTTY){try{e.stdout.write("\x1B[?2004l")}catch{}try{e.stdin.setRawMode(e.wasRaw)}catch{}}e.stdinClaim&&(e.stdinClaim.release(),e.stdinClaim=null),e.armed=!1,e.resetState(),e.ghostEngine?.dispose()}function Pte(e){let t=e.committedBand.length-e.committedBandPaintedRows;if(t<=0)return;let n=e.committedBand.slice(0,t),r=Math.max(1,e.stdout.rows??24),o=Math.max(e.anchorRow??1,1),i=()=>{let s=Math.max(1,r-o+1);for(let a=0;a<n.length;a+=s){let l=n.slice(a,Math.min(a+s,n.length)),c=l.map((d,u)=>Ze(o+u,d)).join("");e.stdout.write(`${c}\x1B[${r};1H${`
1573
- `.repeat(l.length)}`)}};try{e.scrollRegion?e.scrollRegion.withFullScrollRegion(i):i()}catch{}}function oN(e){e.overlay="",e.input=V.seed(""),e.queued=!1,e.pendingSubmissions=[],e.canceled=!1,e.backgrounded=!1,e.softStopped=!1,e.softStopQueueBase=0,e.paused=!1,e.activeGhost=null,e.anchorRow=void 0,e.hasCommitted=!1,e.clearCommittedBand(),e.commitInFlight=!1,e.pendingResizeErase=null,e.bandGeometryStale=!1,e.lastKnownRows=0,e.pickerController=null,e.inputMode="streaming",e.attachments=[],e.pasting=!1,e.pasteStartBufferLen=0,e.pasteStartCursor=0,e.pasteRegistry.clear(),e.clipboardFailureMsg=null,e.autocompleteState?.reset(),e.resizeUnsub&&(e.resizeUnsub(),e.resizeUnsub=null),e.resizeImmediateUnsub&&(e.resizeImmediateUnsub(),e.resizeImmediateUnsub=null)}var Ga=class{stdout;stdin;onCancel;onSoftStop;softStopped=!1;softStopQueueBase=0;onBackground;onPauseInterrupt;onShiftTab;promptTextFn;history;autocompleteState;formatInputBuffer;scrollRegion;anchorRow;declaredAnchorRow;onSubmit;attachments=[];pasting=!1;pasteStartBufferLen=0;pasteStartCursor=0;pasteRegistry=new Map;clipboardInFlight=!1;clipboardFailureMsg=null;inputMode="streaming";pickerController=null;pickerSavedMode="streaming";armed=!1;suspended=!1;canceled=!1;backgrounded=!1;paused=!1;wasRaw=!1;stdinClaim=null;logUpdate=null;overlay="";input=V.seed("");queued=!1;pendingSubmissions=[];handleKeypress=null;resizeUnsub=null;resizeImmediateUnsub=null;spinnerController;caretBlinkController;repaintCount=0;committing=!1;hasCommitted=!1;committedBand=[];committedBandTopRow=0;committedBandBottomRow=0;lastMeasuredFrameTop=0;committedBandPaintedRows=0;bandReflowCache=null;lastKnownRows=0;pendingResizeErase=null;bandGeometryStale=!1;commitInFlight=!1;debugCompositor=!!k.AFK_DEBUG_COMPOSITOR;ghostEngine;ghostGetContext;activeGhost=null;debugLog(t,n={}){if(!this.debugCompositor)return;let r=process.hrtime.bigint(),o=Object.entries(n).map(([i,s])=>{let a=typeof s=="string"?JSON.stringify(s.length>60?s.slice(0,57)+"...":s):String(s);return`${i}=${a}`}).join(" ");process.stderr.write(`[compositor] t=${r} ${t}${o?" "+o:""}
1573
+ `.repeat(l.length)}`)}};try{e.scrollRegion?e.scrollRegion.withFullScrollRegion(i):i()}catch{}}function oN(e){e.overlay="",e.input=V.seed(""),e.queued=!1,e.pendingSubmissions=[],e.canceled=!1,e.backgrounded=!1,e.softStopped=!1,e.postEscCoalesce=!1,e.postEscPayload=null,e.paused=!1,e.activeGhost=null,e.anchorRow=void 0,e.hasCommitted=!1,e.clearCommittedBand(),e.commitInFlight=!1,e.pendingResizeErase=null,e.bandGeometryStale=!1,e.lastKnownRows=0,e.pickerController=null,e.inputMode="streaming",e.attachments=[],e.pasting=!1,e.pasteStartBufferLen=0,e.pasteStartCursor=0,e.pasteRegistry.clear(),e.clipboardFailureMsg=null,e.autocompleteState?.reset(),e.resizeUnsub&&(e.resizeUnsub(),e.resizeUnsub=null),e.resizeImmediateUnsub&&(e.resizeImmediateUnsub(),e.resizeImmediateUnsub=null)}var Ga=class{stdout;stdin;onCancel;onSoftStop;softStopped=!1;postEscCoalesce=!1;postEscPayload=null;onBackground;onPauseInterrupt;onShiftTab;promptTextFn;history;autocompleteState;formatInputBuffer;scrollRegion;anchorRow;declaredAnchorRow;onSubmit;attachments=[];pasting=!1;pasteStartBufferLen=0;pasteStartCursor=0;pasteRegistry=new Map;clipboardInFlight=!1;clipboardFailureMsg=null;inputMode="streaming";pickerController=null;pickerSavedMode="streaming";armed=!1;suspended=!1;canceled=!1;backgrounded=!1;paused=!1;wasRaw=!1;stdinClaim=null;logUpdate=null;overlay="";input=V.seed("");queued=!1;pendingSubmissions=[];handleKeypress=null;resizeUnsub=null;resizeImmediateUnsub=null;spinnerController;caretBlinkController;repaintCount=0;committing=!1;hasCommitted=!1;committedBand=[];committedBandTopRow=0;committedBandBottomRow=0;lastMeasuredFrameTop=0;committedBandPaintedRows=0;bandReflowCache=null;lastKnownRows=0;pendingResizeErase=null;bandGeometryStale=!1;commitInFlight=!1;debugCompositor=!!k.AFK_DEBUG_COMPOSITOR;ghostEngine;ghostGetContext;activeGhost=null;debugLog(t,n={}){if(!this.debugCompositor)return;let r=process.hrtime.bigint(),o=Object.entries(n).map(([i,s])=>{let a=typeof s=="string"?JSON.stringify(s.length>60?s.slice(0,57)+"...":s):String(s);return`${i}=${a}`}).join(" ");process.stderr.write(`[compositor] t=${r} ${t}${o?" "+o:""}
1574
1574
  `)}constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.onSoftStop=t.onSoftStop,this.onBackground=t.onBackground,this.onPauseInterrupt=t.onPauseInterrupt,this.onShiftTab=t.onShiftTab;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+p.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.spinnerController=new Rg({captureMode:t.captureMode??!1,goblin:t.goblinSpinner??!1,onTick:()=>this.repaint()}),this.caretBlinkController=new Cg({enabled:t.caretBlink??!1,captureMode:t.captureMode??!1,intervalMs:t.caretBlinkIntervalMs??530,onTick:()=>this.repaint()}),this.onSubmit=t.onSubmit,this.anchorRow=t.anchorRow,this.declaredAnchorRow=t.anchorRow,this.ghostEngine=t.suggest?.engine,this.ghostGetContext=t.suggest?.getContext}isArmed(){return this.armed}setAnchorRow(t){this.anchorRow=t,this.declaredAnchorRow=t}suspendInput(){eN(this)}resumeInput(){tN(this)}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnSoftStop(t){this.onSoftStop=t??void 0}setOnBackground(t){this.onBackground=t??void 0}setOnShiftTab(t){this.onShiftTab=t??void 0}enterPickerMode(t){NL(this,t)}exitPickerMode(){BL(this)}repaintPicker(){UL(this)}setInputMode(t){jL(this,t)}getInputMode(){return HL(this)}async arm(){return nN(this)}disarm(){rN(this)}setOverlay(t){t!==this.overlay&&(this.debugLog("setOverlay",{framesLen:t.length,anchorRow:this.anchorRow??null}),this.overlay=t,this.repaint())}setSpinner(t){this.stdout.isTTY&&this.spinnerController.set(t)}commitAbove(t){ML(this,t)}clearCommittedBand(){fd(this)}flushResizeGhostErase(){$L(this)}resetCommittedBand(){OL(this)}repositionCommittedBand(t,n,r){DL(this,t,n,r)}getBuffer(){return mL(this)}getPendingCount(){return this.pendingSubmissions.length}getAttachments(){return[...this.attachments]}get caretVisible(){return this.caretBlinkController.visible}renderInputLine(){return AL(this)}updateAutocomplete(){Og(this)}updateGhost(){TL(this)}renderDropdownRows(){return _L(this)}renderHintRow(){return IL(this)}repaint(){this.repaintCount++,LL(this)}clearScreen(){this.logUpdate?.resetGeometry?.(),this.stdout.write("\x1B[H\x1B[2J"),this.repaint()}resetState(){oN(this)}applyEdit(t){return zL(this,t)}applyDropdownSelection(){return xL(this)}applyGhostAccept(){return RL(this)}};K();import Dte from"chalk";var Fte=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,Lte=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,Nte=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,iN={mint:p.mint};function Bte(e){let t=iN[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=iN[r];if(o)return o}return null}function $o(e,t){return Dte.level===0?e:e.replace(Fte,o=>{let i=o.slice(1);return t.has(i)?(Bte(i)??p.brand)(o):p.meta(o)}).replace(Lte,o=>p.fileRef(o)).replace(Nte,o=>p.meta(o))}K();import{pathToFileURL as Ute}from"node:url";var jte="\x1B]8;;\x1B\\",Hte=new Set(["iterm2","wezterm","kitty","vscode","ghostty","windows-terminal","konsole","gnome-terminal","alacritty"]),Wte=5e3;function Kte(e=process.env,t=process.stdout.isTTY===!0){let n=e.FORCE_HYPERLINK;if(n!==void 0&&n.length>0)return n!=="0"&&n.toLowerCase()!=="false";if(!t||e.CI!==void 0&&e.CI.length>0)return!1;let r=Oi(e);if(!Hte.has(r))return!1;if(r==="gnome-terminal"&&e.VTE_VERSION!==void 0){let o=Number.parseInt(e.VTE_VERSION,10);if(!Number.isFinite(o)||o<Wte)return!1}return!0}var _k;function Bg(){return _k===void 0&&(_k=Kte()),_k}function Gte(e,t){return`\x1B]8;;${t}\x1B\\${e}${jte}`}function Ug(e,t){try{return Gte(e,Ute(t).href)}catch{return e}}function wd(e){let t=/[a-z][a-z0-9+.-]*:\/\/[^\s<>\"`]+/gi,n="",r=0;for(let o of e.matchAll(t)){let i=o[0]??"",s=o.index??r;n+=sN(e.slice(r,s)),n+=i,r=s+i.length}return n+=sN(e.slice(r)),n}function sN(e){let t=Bg();return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,(n,r)=>t?Ug(r,n):r)}function qte(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}var aN=60;function Ik(e,t){let n=e.trim().replace(/^\((.*)\)$/s,"$1"),r;try{r=JSON.parse(n)}catch{return e}if(!r||typeof r!="object")return e;let o=r;for(let i of t){let s=o[i];if(typeof s=="string"&&s.length>0){let a=$e(s);if(a.length===0)continue;return`(${a.length>aN?ie(a,aN,"\u2026"):a})`}}return e}function lN(e,t){if(e==="bash"||e==="Bash")return qte(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,i=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let s=`${o} node${o===1?"":"s"}`,a=i>0?`, ${i} edge${i===1?"":"s"}`:"";return`(${s}${a})`}}}catch{}}return e==="agent"||e==="Agent"?Ik(t,["id_prefix","prompt"]):e==="Task"?Ik(t,["description","prompt"]):e==="skill"||e==="Skill"?Ik(t,["name","arguments"]):e==="ask_question"?zte(t):t}function zte(e){let t=e.trim().replace(/^\((.*)\)$/s,"$1");try{let n=JSON.parse(t);if(!n||typeof n!="object")return e;let r=n,o=typeof r.type=="string"?r.type:"text";if(o==="choice"||o==="multi_choice"){let i=r.choices,s=Array.isArray(i)?i.length:0;return s>0?`(${o}: ${s} option${s===1?"":"s"})`:`(${o})`}return`(${o})`}catch{return e}}function Jte(e){return e.replace(/[\r\n]+/g," ")}var Yte={"(":")","{":"}","[":"]"};function cN(e,t,n="\u2026"){let r=e.charAt(0),o=Yte[r];return!(o&&e.endsWith(o)&&e.length>=2)||X(e)<=t?ie(e,t,n):t<3?t>=2?r+o:ie(e,t,n):ie(e,t-1,n)+o}function Fr(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=wd(lN(r,n[2]??"")),i=Xn(r),{color:s,glyph:a}=Aa(r),l=CS(i),c=l?` [${l}]`:"";if(t!==void 0){let u=(a+" ").length+r.length+c.length,m=Math.max(1,t-u);o=cN(o,m)}o=Jte(o);let d=s(a+" ")+s.bold(r)+p.toolArg(o);return l?d+p.dim(c):d}return p.chrome("\u25CF ")+p.toolArg(e)}K();var dN=8,jg=30;function Vte(){let e=k.AFK_DIFF_LINES;if(e===void 0)return jg;let t=e.trim();if(!/^\d+$/.test(t))return jg;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:jg}function Xte(){let e=k.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}function Qte(e){let t=p.diffAdd(`+${e.addedLines}`),n=p.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=p.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var Zte=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function ene(e){let t=Fe(e.text).replace(Zte,"");return e.kind==="+"?p.diffAdd("+ "+t):e.kind==="-"?p.diffRemove("- "+t):p.dim(" "+t)}var Mk=new WeakMap;function Lr(e,t,n){if(Xte())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?dN:Vte(),o=t+"|"+n+"|"+r,i=Mk.get(e);if(i!==void 0){let f=i.get(o);if(f!==void 0)return f}let s=[];s.push(n+Qte(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:p.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:ene(h)})}if(r===0){for(let f of a)s.push(n+f.text);return Pk(e,o,s),s}let l=0;for(let f of a)f.kind==="body"&&l++;if(l<=r){for(let f of a)s.push(n+f.text);return Pk(e,o,s),s}let c=0;for(let f of a)f.kind==="header"?s.push(n+f.text):c<r&&(s.push(n+f.text),c++);let d=l-r,u=`line${d===1?"":"s"}`,m=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return s.push(n+p.dim(`\u2026 +${d} more diff ${u}${m}`)),Pk(e,o,s),s}function Pk(e,t,n){let r=Mk.get(e);r===void 0&&(r=new Map,Mk.set(e,r)),r.set(t,n)}var tne=p.success("\u2713"),nne=p.error("\u2717");function Do(e){return e?nne:tne}var Sd=3,uN=2,pN=3;function mN(e){switch(Xn(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function rne(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function Nr(e,t,n=60,r){let o=e.isError?p.error:p.dim,i=t??k.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(i)?"~"+e.persistedPath.slice(i.length):e.persistedPath,l=Bg()?Ug(a,e.persistedPath):a;return o(`saved \u2192 ${l}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${rne(r,e.lineCount)}`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o($e(s))}function qa(e){return!e||typeof e.batchSize!="number"||typeof e.batchIndex!="number"||e.batchSize<=1?"":p.dim(` \u2225${e.batchIndex}/${e.batchSize}`)}K();function vd(e,t){if(e.length<=t)return e;let n=e.length-t,r=e.slice(0,n),o=e.slice(n),i=gN(r);return[{kind:"overflow",count:r.length,text:i},...o]}function one(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var ine=5,fN=60;function gN(e){let t=new Map,n=0;for(let i of e)i.kind==="group"?(t.set(i.toolName,(t.get(i.toolName)??0)+i.entries.length),n+=i.entries.length):(t.set(i.toolName,(t.get(i.toolName)??0)+1),n+=1);if(n===0)return"";if(e.length>0&&e.every(i=>ze.has(i.toolName))&&new Set(e.map(i=>i.toolName)).size===1){let i=[],s=!1;for(let a of e){let c=(a.kind==="group"?a.label:a.toolInput).trim();if(!c.startsWith("(")||!c.endsWith(")")){s=!0;break}let d=c.slice(1,-1),u=$e(d);if(!u){s=!0;break}let m=u.length>fN?u.slice(0,fN-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;i.push({display:m,entries:f})}if(!s&&i.length>0){let a=i.slice(0,ine),l=a.map(({display:m,entries:f})=>f>1?`${m} \xD7${f}`:m),c=a.reduce((m,f)=>m+f.entries,0),d=n-c,u=l.join(", ")+(d>0?` (+${d})`:"");return`\u2026 +${n} more: ${u}`}}let o=[];for(let[i,s]of t)o.push(`${s} ${one(i,s)}`);return`\u2026 +${n} (${o.join(", ")})`}function Hg(e,t=In()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function Ok(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function $k(e){if(e.length===0)return[];let t=new Map;for(let o of e){let i=hN(o),s=t.get(i);s||(s=[],t.set(i,s)),s.push(o)}let n=[],r=new Set;for(let o of e){let i=hN(o),s=t.get(i);s.length>=sne(o.toolName)?r.has(i)||(n.push({kind:"group",toolName:o.toolName,label:ze.has(o.toolName)?o.toolInput:"",entries:s}),r.add(i)):n.push(o)}return n}function Dk(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,i;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),i=l.join(", ")}else o===t?i=`${t} done`:o===0?i=`${t} running`:i=`${o}/${t} done`;return Fr(e.toolName+e.label)+p.dim(` \xD7${t} \u2014 ${i}`)}function hN(e){return ze.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function sne(e){return ze.has(e)?uN:pN}function yN(e,t,n,r){return e>0||t?za([...n,!0],r):za(n,r)}function bN(e,t){return!ze.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&bN(r,t))}function Wg(e,t,n,r=ee(),o=[],i=In(),s){let a=za(o,i),l=kd(a,i),c=e.filter(h=>h.kind==="text"),d=e.filter(h=>h.kind==="tool").filter(h=>!bN(h,t)),u=$k(d),m=vd(u,Sd),f=Hg(m,i);for(let{sibling:h,connector:y}of f){let b=p.dim(y),w=y===i.lastConnector;if(h.kind==="overflow")n.push(Pe(l+b+p.dim(h.text),r));else if(h.kind==="group")n.push(Pe(l+b+Dk(h),r));else if(h.kind==="resultSummary")n.push(Pe(l+b+h.summary,r));else{let S=h,v=t.get(S.toolUseId);if(ze.has(S.toolName)&&v&&v.length>0){S.headerEmitted?n.push(Pe(l+b,r)):n.push(Pe(l+b+S.prefix,r));let E=s??w;if(Wg(v,t,n,r,[...o,E],i,w),S.thinkingTail){let R=kd(za([...o,E],i),i);n.push(Pe(R+p.thinking("\u2307 "+$e(S.thinkingTail)),r))}}else if(!(ze.has(S.toolName)&&S.headerEmitted))if(S.result){if(n.push(Pe(l+b+S.prefix+p.dim(" \u2014 ")+Do(S.result.isError)+" "+Nr(S.result,void 0,60,S.toolName),r)),S.diff&&!S.result.isError){let E=l+(w?i.spineClosed:p.dim(i.spine))+" ";for(let R of Lr(S.diff,"overlay",E))n.push(Pe(R,r))}}else{n.push(Pe(l+b+S.prefix,r));let E=l+(w?i.spineClosed:p.dim(i.spine))+" ";S.thinkingTail?n.push(Pe(E+p.thinking("\u2307 "+$e(S.thinkingTail)),r)):n.push(Pe(E+p.dim(mN(S.toolName)),r))}}}let g=yN(d.length,!1,o,i);for(let h of c)for(let y of Fk(h.text,g,i))n.push(Pe(y,r))}function Ed(e,t,n,r,o=ee(),i=[],s=In(),a){let l=za(i,s),c=kd(l,s),d=[],u=e.filter(w=>w.kind==="text"),m=e.filter(w=>w.kind==="tool"),f=$k(m),g=vd(f,Sd),h=Ok(g,r),y=Hg(h,s);for(let{sibling:w,connector:S}of y){let v=p.dim(S),E=S===s.lastConnector;if(w.kind==="overflow")d.push(Pe(c+v+p.dim(w.text),o));else if(w.kind==="resultSummary")d.push(Pe(c+v+w.summary,o));else if(w.kind==="group")d.push(Pe(c+v+Dk(w),o));else{let R=w,A=t.get(R.toolUseId);if(ze.has(R.toolName)&&A&&A.length>0){if(R.headerEmitted){let N=R.toolInput?`${R.toolName} ${$e(R.toolInput)}`:R.toolName;d.push(Pe(c+v+p.dim("\u21B3 "+N),o))}else d.push(Pe(c+v+R.prefix,o));let C=a??E;d.push(...Ed(A,t,n,void 0,o,[...i,C],s,E))}else if(R.result){if(d.push(Pe(c+v+R.prefix+p.dim(" \u2014 ")+Do(R.result.isError)+" "+Nr(R.result,n,60,R.toolName),o)),R.diff&&!R.result.isError){let C=c+(E?s.spineClosed:p.dim(s.spine))+" ";for(let N of Lr(R.diff,"flush",C))d.push(Pe(N,o))}}else d.push(Pe(c+v+R.prefix,o))}}let b=yN(m.length,r!=null,i,s);for(let w of u)for(let S of Fk(w.text,b,s))d.push(Pe(S,o));return d}function wN(e){return e.agentResultSummary?p.dim(e.agentResultSummary)+qa(e.result):e.agentResultSummary}function Td(e,t,n,r,o=[]){let i=In(),s=t.filter(h=>h.kind==="tool"),l=s.filter(h=>h.result).reduce((h,y)=>h+(y.result.lineCount??0),0),c=[];s.length>Sd&&(c.push(Sa(s.length)),l>0&&c.push(`${l} lines`));let d=p.dim(i.spine.repeat(o.length)),u=o,m=p.dim(i.turnRoot),f=c.length>0?d+m+e.prefix+p.dim(" \u2014 "+c.join(" \xB7 ")):d+m+e.prefix,g=Ed(t,n,r,wN(e),ee(),u,i);return[f,...g].join(`
1575
- `)}function Lk(e,t=[]){let n=In(),r=p.dim(n.spine.repeat(t.length)),o=p.dim(n.turnRoot);return r+o+e.prefix}function xd(e,t,n,r,o=[]){let i=In(),s=o;return Ed(t,n,r,wN(e),ee(),s,i)}function Ja(e,t,n){let r=[],o=ee();for(let i of t){let s=e.get(i);if(s.length===1){let a=s[0];if(a.result){if(r.push(" "+a.prefix+p.dim(" \u2014 ")+Do(a.result.isError)+" "+Nr(a.result,n,60,a.toolName)+qa(a.result)),a.diff&&!a.result.isError)for(let l of Lr(a.diff,"flush"," "))r.push(Pe(l,o))}else r.push(" "+a.prefix)}else{r.push(SN(i,s,n));let a=s.filter(c=>c.diff&&c.result&&!c.result.isError),l=a.length>1;for(let c of a){if(l){let d=$e(c.toolInput),u=wd(d).trim()||d.trim();r.push(" "+p.dim(`\u2500\u2500 ${u} \u2500\u2500`))}for(let d of Lr(c.diff,"flush"," "))r.push(Pe(d,o))}}}return r}function SN(e,t,n){let{color:r,glyph:o}=Aa(e),i=t.map(d=>wd($e(d.toolInput)).trim()),s=r(o+" ")+r.bold(e)+p.dim(` \xD7${t.length}`)+" "+p.toolArg(i.join(", ")),a=t.filter(d=>d.result),l=a.filter(d=>d.result.isError);if(l.length>0){let d=a.length-l.length,m=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return m>0&&f.push(`${m} lines`),d>0&&f.push(`${d} ok`),f.push(p.error(`${l.length} error${l.length>1?"s":""}`))," "+s+p.dim(" \u2014 ")+f.join(p.dim(", "))}let c=a.map(d=>d.result?.lineCount).filter(d=>d!==void 0);if(c.length===a.length&&c.length>0){if(c.every(m=>m===c[0]))return" "+s+p.dim(` \u2014 ${c[0]} lines each`);let u=c.reduce((m,f)=>m+f,0);return" "+s+p.dim(` \u2014 ${u} lines total`)}if(a.length>0){let d=a.map(u=>Nr(u.result,n,60,u.toolName));return" "+s+p.dim(" \u2014 ")+d.join(p.dim(", "))}return" "+s}function Pe(e,t){return ie(e,t)}var Nk=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),ane=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),wGe=Nk.midConnector,SGe=Nk.lastConnector;function In(){let e=k.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?ane:Nk}function za(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function kd(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?p.dim(o):o}return n}function Fk(e,t,n){if(!e||!e.trim())return[];let r=p.dim(n.textPrefix),o=Math.max(1,ee()-t.length-2-2),i=kd(t,n),s=[];for(let a of e.split(`
1575
+ `)}function Lk(e,t=[]){let n=In(),r=p.dim(n.spine.repeat(t.length)),o=p.dim(n.turnRoot);return r+o+e.prefix}function xd(e,t,n,r,o=[]){let i=In(),s=o;return Ed(t,n,r,wN(e),ee(),s,i)}function Ja(e,t,n){let r=[],o=ee();for(let i of t){let s=e.get(i);if(s.length===1){let a=s[0];if(a.result){if(r.push(" "+a.prefix+p.dim(" \u2014 ")+Do(a.result.isError)+" "+Nr(a.result,n,60,a.toolName)+qa(a.result)),a.diff&&!a.result.isError)for(let l of Lr(a.diff,"flush"," "))r.push(Pe(l,o))}else r.push(" "+a.prefix)}else{r.push(SN(i,s,n));let a=s.filter(c=>c.diff&&c.result&&!c.result.isError),l=a.length>1;for(let c of a){if(l){let d=$e(c.toolInput),u=wd(d).trim()||d.trim();r.push(" "+p.dim(`\u2500\u2500 ${u} \u2500\u2500`))}for(let d of Lr(c.diff,"flush"," "))r.push(Pe(d,o))}}}return r}function SN(e,t,n){let{color:r,glyph:o}=Aa(e),i=t.map(d=>wd($e(d.toolInput)).trim()),s=r(o+" ")+r.bold(e)+p.dim(` \xD7${t.length}`)+" "+p.toolArg(i.join(", ")),a=t.filter(d=>d.result),l=a.filter(d=>d.result.isError);if(l.length>0){let d=a.length-l.length,m=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return m>0&&f.push(`${m} lines`),d>0&&f.push(`${d} ok`),f.push(p.error(`${l.length} error${l.length>1?"s":""}`))," "+s+p.dim(" \u2014 ")+f.join(p.dim(", "))}let c=a.map(d=>d.result?.lineCount).filter(d=>d!==void 0);if(c.length===a.length&&c.length>0){if(c.every(m=>m===c[0]))return" "+s+p.dim(` \u2014 ${c[0]} lines each`);let u=c.reduce((m,f)=>m+f,0);return" "+s+p.dim(` \u2014 ${u} lines total`)}if(a.length>0){let d=a.map(u=>Nr(u.result,n,60,u.toolName));return" "+s+p.dim(" \u2014 ")+d.join(p.dim(", "))}return" "+s}function Pe(e,t){return ie(e,t)}var Nk=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),ane=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),SGe=Nk.midConnector,vGe=Nk.lastConnector;function In(){let e=k.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?ane:Nk}function za(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function kd(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?p.dim(o):o}return n}function Fk(e,t,n){if(!e||!e.trim())return[];let r=p.dim(n.textPrefix),o=Math.max(1,ee()-t.length-2-2),i=kd(t,n),s=[];for(let a of e.split(`
1576
1576
  `)){let l=Kv(a),c=ue(l,o);for(let d of c.split(`
1577
1577
  `))s.push(i+r+d)}return s}var vN=6,Rd=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=Fe(r),i=Fr(n+o),s=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:o,prefix:i,...s!==void 0?{agentContext:s}:{}};this.entries.set(t,a),this.order.push(t),go.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,i){let s=Fe(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=s,a.prefix=Fr(n+s,i),o!==void 0&&(a.agentContext=o);return}let l=Fr(n+s,i),c={kind:"tool",toolUseId:t,toolName:n,toolInput:s,prefix:l,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,c),this.order.push(t)}mergeAgentLabel(t,n,r){let o=this.entries.get(t);if(o?.kind!=="tool"||!go.has(o.toolName)||o.toolName==="Agent")return!1;let s=`(${Fe(n)})`;return o.toolName="Agent",o.toolInput=s,o.prefix=Fr("Agent"+s,r),!0}setAgentContext(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.agentContext:r.agentContext=n)}setAgentResultSummary(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.agentResultSummary=n)}setThinkingTail(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.thinkingTail:r.thinkingTail=n)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}addDiff(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.diff=n)}upsertTextChild(t,n,r){let o=this.entries.get(t);if(o?.kind==="text"){o.text=r,o.agentContext=n;return}let i={kind:"text",toolUseId:t,text:r,agentContext:n};this.entries.set(t,i),this.order.push(t)}removeTextChildrenUnder(t){let n=[];for(let[r,o]of this.entries)o.kind==="text"&&o.agentContext===t&&n.push(r);for(let r of n)this.entries.delete(r);if(n.length>0){let r=new Set(n);this.order=this.order.filter(o=>!r.has(o))}}hasPending(){return this.entries.size>0}hasEntry(t){return this.entries.get(t)?.kind==="tool"}findLastSkillEntryId(){for(let t=this.order.length-1;t>=0;t--){let n=this.order[t],r=this.entries.get(n);if(r?.kind==="tool"&&Ac.has(r.toolName))return n}}peekTrailingCompletedRootToolName(){for(let t=this.order.length-1;t>=0;t--){let n=this.order[t],r=this.entries.get(n);if(!(!r||r.kind!=="tool")&&!r.agentContext)return r.result===void 0||ze.has(r.toolName)?void 0:r.toolName}}getOverlay(){let t=this.buildChildMap(),n=[],r=In(),o=ee(),i=u=>ie(u,o),s=[];for(let u of this.order){let m=this.entries.get(u);!m||m.kind!=="tool"||m.agentContext||s.push(m)}let a=s,l=0;if(s.length>vN){let u=s.filter(h=>!h.result),m=s.filter(h=>h.result),f=Math.max(0,vN-u.length),g=new Set(m.slice(-f));l=m.length-g.size,a=s.filter(h=>!h.result||g.has(h))}let d=a.some(u=>ze.has(u.toolName))?p.dim(r.turnRoot):" ";for(let u of a){let m=t.get(u.toolUseId);if(ze.has(u.toolName)&&m&&m.length>0)u.headerEmitted?n.push(i(p.dim(r.turnRoot))):n.push(i(p.dim(r.turnRoot)+u.prefix)),Wg(m,t,n,o,void 0,r),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+$e(u.thinkingTail))));else if(!(ze.has(u.toolName)&&u.headerEmitted))if(ze.has(u.toolName))u.result?n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2014 ")+Do(u.result.isError)+" "+Nr(u.result,void 0,60,u.toolName)+qa(u.result))):n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+$e(u.thinkingTail))));else if(u.result){if(n.push(i(d+u.prefix+p.dim(" \u2014 ")+Do(u.result.isError)+" "+Nr(u.result,void 0,60,u.toolName)+qa(u.result))),u.diff&&!u.result.isError)for(let f of Lr(u.diff,"overlay"," "))n.push(i(f))}else n.push(i(d+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+$e(u.thinkingTail))))}return l>0&&n.push(i(" "+p.dim(`\u2026 +${l} done`))),n.join(`
1578
1578
  `)}ancestorDepthOf(t){let n=new Set([t]),r=0,o=t,i=32;for(;o!==void 0&&r<i;){let s=this.entries.get(o);if(!s||s.kind!=="tool")break;let a=s.agentContext;if(a===void 0||n.has(a))break;n.add(a);let l=this.entries.get(a);if(!l||l.kind!=="tool")break;r+=1,o=a}return r}flushSource(t,n){let r=this.entries.get(t);if(!r||r.kind!=="tool")return[];let o=Array.from({length:this.ancestorDepthOf(t)},()=>!1),i=[];{let m=[],f=new Set([t]),g=r.agentContext;for(;g!==void 0&&!f.has(g);){f.add(g);let h=this.entries.get(g);if(!h||h.kind!=="tool")break;m.push({entry:h,depth:this.ancestorDepthOf(h.toolUseId)}),g=h.agentContext}m.reverse();for(let{entry:h,depth:y}of m)h.headerEmitted||(i.push(Lk(h,Array.from({length:y},()=>!1))),h.headerEmitted=!0)}let s=new Set([t]),a=[t];for(;a.length>0;){let m=a.shift();for(let[f,g]of this.entries){if(s.has(f))continue;(g.kind==="tool",g.agentContext)===m&&(s.add(f),g.kind==="tool"&&a.push(f))}}let l=new Map;for(let m of this.order){if(!s.has(m))continue;let f=this.entries.get(m);if(!f)continue;let g=(f.kind==="tool",f.agentContext);if(!g)continue;let h=l.get(g);h||(h=[],l.set(g,h)),h.push(f)}let c=l.get(r.toolUseId)??[],d=r.headerEmitted?xd(r,c,l,n,o).join(`
@@ -1740,7 +1740,7 @@ ${S}
1740
1740
  ${v}`})}return{fileBlocks:a,warnings:l}}async function qU(e,t,n,r,o="summary",i,s){let a=FL(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,m=!1,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,v=[],E=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then(U=>{for(let I of U)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${I.jobId}: ${I.label}`))}).catch(()=>{})},C=r.getCompositor?r.getCompositor():null,N=()=>new Za({out:el(i),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(j=>{He()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:A}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...C?{compositor:C}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=N(),P=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let U=j;i.fn=I=>U.commitAbove(I),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(U=>_.setInterrupting(U)),r.rearmStatus?.()};try{C?C.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(O=>{He()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),O)});let M=r.subagentControl;M?.hasActiveForeground()&&M.cancelActiveForeground().catch(O=>{He()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),O)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(M=>{He()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),M)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A);let{fileBlocks:j,warnings:U}=GU(e.text,{rootDir:process.cwd()});for(let M of U)(i??{fn:console.log}).fn(p.dim(` @-file: ${M}`));let I=j.length>0||e.attachments.length>0?WU(e.text,e.attachments,void 0,j):e.text,D=t.sendMessageStream(I);if(await _s((M,O)=>{_.process(M,O)},async()=>{for await(let M of D){if(h||y)break;if(M.type==="chunk"&&M.chunk.type==="content"?(l+=M.chunk.content,d=!0):M.type==="message"&&!d&&(l=M.message.content),M.type==="stream_retry"&&(l=l.slice(0,c)),M.type==="chunk"&&M.chunk.type==="tool_use_detail"){let O=M.chunk,$={toolName:O.toolName,toolUseId:O.toolUseId,input:O.toolInput,...O.toolInputRaw!==void 0&&{inputRaw:O.toolInputRaw}};E.set(O.toolUseId,$),v.push($)}else if(M.type==="chunk"&&M.chunk.type==="tool_result"){let O=M.chunk;c=l.length;let $=E.get(O.toolUseId);if($&&($.result=O.content,$.isError=O.isError,E.delete(O.toolUseId)),r.onContextProgress){let H=Date.now();if(H-w>=S){w=H;try{let z=r.onContextProgress();z instanceof Promise&&await z}catch(z){He()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),z)}}}}if(M.type==="paused"){if(r.setPausedState?.(!0),await P(),C&&M.autoResume===!0){let O=new AbortController;b.abort=O;let $=M.resetsAt?M.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,H=$?`Keep waiting \u2014 auto-resumes at ${$}`:"Keep waiting \u2014 auto-resume in progress",z="Switch model / provider (type /model after)",Q="Stop waiting",te=[p.warning(" \u23F3 Usage limit reached.")+($?p.dim(` Auto-resumes at ${$}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];or(C,{header:te,options:[H,z,Q],signal:O.signal,initialIndex:0}).then(oe=>{if(b.abort=null,!oe)return;let q=oe[0];q===void 0||q===H||(y=!0,q===z&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(we=>{He()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),we)}))}).catch(oe=>{He()&&console.error(" "+p.error("picker promise rejected:"),oe)})}else(i??{fn:console.log}).fn(jx({reason:M.reason,...M.resetsAt!==void 0?{resetsAt:M.resetsAt}:{},...M.accountId!==void 0?{accountId:M.accountId}:{},...M.autoResume!==void 0?{autoResume:M.autoResume}:{}}));continue}if(M.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let O=M.hotSwapped&&M.accountId?`\u25B6 Resumed on ${M.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,v.length=0,E.clear(),f=!1,g=void 0,u=!1,_=N(),m=!1,await B(),(i??{fn:console.log}).fn(p.success(O));continue}if(M.type==="error"){await P(),ps(as(M.error)),u=!0;continue}_.process(M),M.type==="done"&&(f=!0,g=M.metadata)}}),await P(),h){let M=i?i.fn:console.log;M(p.warning("\u23F8 Stopped \u2014 work so far kept.")+p.dim(" Send a message to continue.")),M("")}if(y){let M=i?i.fn:console.log;M(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),M("")}if(f&&!h&&!y){Ti(n,a,l,g,v),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Fa(process.stdout);let M=$=>{i?i.fn($):console.log($)},O=$h(l);if(O){M(HU(O)),M("");let $=rF(v);if(r.onTerminalState)try{r.onTerminalState(O,{doneHasCorroboratingEvidence:$})}catch{}if(n.permissionMode==="autonomous"){let H=O.kind==="done"&&Gu().verifyDone===!0&&!$;iF(O,void 0,{unverified:H})}}if(bse(g,n,M),r.onAfterTurn){let $=r.onAfterTurn();$ instanceof Promise&&await $.catch(()=>{})}}}catch(j){await P(),u||ps(as(j))}finally{await P(),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function yse(e,t){let n=Math.round(e*100),r=ce(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ce(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function bse(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(be(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ce(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=ik(t),a=Gt(t.model),l=yse(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var wse=5e3,Sse=3,vse="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function kse(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function zU(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async R=>{He()&&(f=hg(R)),await _d(e.session.current),He()&&(g=gE())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y=!1,b=!1,w,S,v,E=0;for(m.onInjectable=()=>{E>=Sse||!o.isAwaitingInput()||!o.bufferIsEmpty()||(E++,Fa(process.stdout),h={text:vse,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let I of g)e.replRenderer.writeLine(I);e.replRenderer.writeLine(""),g=[]}let R=u.drainNotifications();for(let{job:I,result:D}of R){let F=D.errorReason===void 0?"\u2713":"\u2717",M=D.errorReason==="abort"?"killed":D.errorReason==="timeout"?"timed out":D.errorReason==="signal-killed"?"killed by signal":`exit ${D.exitCode??0}`,O=Math.max(0,Math.round(D.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${F} [${I.id}] ${M} \xB7 ${O}s \xB7 `)+I.command)}let A=m.drainNotifications();for(let{job:I}of A){let D=I.status==="completed"?"\u2713":I.status==="failed"?"\u2717":"\u2298",F=I.endedAt!==void 0?Math.max(0,Math.round((I.endedAt-I.startedAt)/100)/10):0,M=I.label.length>60?`${I.label.slice(0,60)}\u2026`:I.label;e.replRenderer.writeLine(p.dim(` ${D} [${I.jobId}] subagent ${I.status} \xB7 ${F}s \xB7 `)+M)}let C=l.renderIfChanged(e.stats.sessionId);if(C.length>0){for(let I of C)e.replRenderer.writeLine(I);e.replRenderer.writeLine("")}let N,_;if(h===void 0){let I=await e.session.current.takePendingPlanExitSeed();I!==void 0&&(e.stats.permissionMode=I.mode,h={text:I.message,attachments:[]})}if(h!==void 0){let I=h;h=void 0;let D=ol(e.stats.permissionMode),F=$i({buffer:I.text,promptText:D,isTTY:!!process.stdout.isTTY,attachmentSummary:Wa([...I.attachments])});e.replRenderer.writeLine(F),N=I.text.trim(),_=I.attachments}else{let I=await o.readLine({promptFn:()=>ol(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Ih(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});N=I.text.trim(),_=I.attachments}if(!N&&_.length===0)continue;if(N.startsWith("!")){let I=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!I&&(y||(y=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(N))){e.statusLine.rearm();continue}}let P=!1;if(N.startsWith("/")){let I=await GD(N,e.slashCtx,_);if(I.handled){if(I.result==="exit"){e.rl.close();return}if((N==="/clear"||N.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),w=void 0),I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="submit"){h={text:I.result.message,attachments:_??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}P=!0}a.push(N),await kse(e,N);let B=N;if(P){let I=ok(N);if(I){let D=I.name.replace(/^\//,"").split(":").pop()??"";if(D&&uE(D)){let F={skillName:D,rawArgs:I.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,O=Hi(M),$=Date.now();W(`[afk trace] preflight.start commandName=${D}`);let H=!1,z=await ji(F,{cwd:e.stats.cwd??process.cwd(),artifactDir:O},Q=>{He()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${D}) failed: `)+(Q instanceof Error?Q.message:String(Q)))});H=z!==null,W(`[afk trace] preflight.end commandName=${D} durationMs=${Date.now()-$} success=${H}`),B=mE(z?.manifestBlock,N)}}}let j=u.drainInjections();j.length>0&&(B=j+B);let U=m.drainInjections();if(U.length>0&&(B=U+B),w!==void 0&&(B=w+`
1741
1741
 
1742
1742
  `+B,w=void 0),e.hookRegistry)try{let I={event:"UserPromptSubmit",prompt:B,sessionId:e.stats.sessionId},D=await e.hookRegistry.dispatch(I);D.injectContext&&(B=D.injectContext+B)}catch(I){if(I instanceof me){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(I.reason?p.dim(`: ${Er(I.reason)}`):"")),e.statusLine.rearm();continue}if(I instanceof Un){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${I.timeoutMs}ms`)),e.statusLine.rearm();continue}throw I}if(S=void 0,v=void 0,await qU({text:B,attachments:_},e.session.current,e.stats,{setInFlight(I){n.turnInFlight=I},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(I){await t.appendUser(I)},async onTurnComplete(I,D){if(await t.appendTurn(I,D),e.stats.sessionId)try{Ao(e.stats)}catch(F){b||(b=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(F instanceof Error?F.message:String(F))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(I,D)=>{d?.push(I),S=I.kind,v=D?.doneHasCorroboratingEvidence},setActiveCompositor:I=>{n.activeCompositor=I},setInterruptNotifier:I=>{n.notifyInterrupting=I},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:I=>o.setBackgroundHandler(I),setSoftStopHandler:i,setPausedState:I=>o.setPausedState(I),setPauseInterruptHandler:I=>o.setPauseInterruptHandler(I),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(rr(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:I=>c.repaint(I)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(ol(e.stats.permissionMode))),e.hookRegistry)try{let I=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...S!==void 0?{terminalState:S}:{},...v!==void 0?{doneHasCorroboratingEvidence:v}:{}},void 0,wse);I.injectContext&&I.injectContext.trim().length>0&&(w=I.injectContext)}catch(I){if(I instanceof dt)throw I;I instanceof Un?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):I instanceof me?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${Er(I.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(I))}}}function Ese(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function JU(e,t,n,r){let o=await RU(),i=new _h({rl:e.rl,history:o,statusLine:e.statusLine}),s=Ese(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await PU(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=jU(e,n),await zU(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}zl();Bs();import{execFile as Tse}from"node:child_process";import{dirname as xse,isAbsolute as Rse,resolve as Cse}from"node:path";import{promisify as Ase}from"node:util";var YU=Ase(Tse),_se=3e3,Ise=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Pse(){let t=(await YU("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Rse(t)?t:Cse(process.cwd(),t);return xse(n)}async function VU(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Pse()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),_se)});try{let o=dn({execFile:YU,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>Ise.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Pu();zl();import{promises as Mse}from"node:fs";import{dirname as Ose,join as ZU}from"node:path";import{randomBytes as $se}from"node:crypto";var Dse=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
1743
- `),XU=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,LE=30,Fse=1024,Lse=8e3,Nse="haiku";async function Bse(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=Wse(n,Fse),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Lse),s=t.signal?Kse([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ws({token:t.token,model:t.model??Nse,system:Dse,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Use(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Ose(t.worktreePath);return await jse(l,c)}function Use(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(XU.test(t)&&t.length<=LE)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>LE)break;o=s}return XU.test(o)?o:null}async function jse(e,t){if(!await Hse(ZU(t,e)))return e;let n=$se(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,LE-5)}-${n}`}async function Hse(e){try{return await Mse.access(e),!0}catch{return!1}}function Wse(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Kse(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function ej(e){let t,n,r=ZU(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Bse(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Bu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return QU(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return QU(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function QU(e,t){e&&e.setCwd(t),Gse(t)}function Gse(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as nj}from"child_process";import{existsSync as rj,mkdirSync as Vse,readFileSync as oj,unlinkSync as tj,writeFileSync as ij}from"fs";import{get as Xse}from"https";import{join as sj}from"path";import{readFileSync as qse}from"fs";import{dirname as zse,join as Jse}from"path";import{fileURLToPath as Yse}from"url";function cr(){try{return"5.56.2"}catch{}try{let e=zse(Yse(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(qse(Jse(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var Qse=64*1024,Zse=10800*1e3,eae=800,tae=3600*1e3,nae="update-check.json",rae="pending-update.json";function NE(){return sj(is(),nae)}function Dd(){return sj(is(),rae)}function BE(){let e=is();rj(e)||Vse(e,{recursive:!0})}function aj(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function lj(){try{let e=oj(NE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cj(){try{BE();let e=`
1743
+ `),XU=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,LE=30,Fse=1024,Lse=8e3,Nse="haiku";async function Bse(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=Wse(n,Fse),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Lse),s=t.signal?Kse([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ws({token:t.token,model:t.model??Nse,system:Dse,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Use(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Ose(t.worktreePath);return await jse(l,c)}function Use(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(XU.test(t)&&t.length<=LE)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>LE)break;o=s}return XU.test(o)?o:null}async function jse(e,t){if(!await Hse(ZU(t,e)))return e;let n=$se(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,LE-5)}-${n}`}async function Hse(e){try{return await Mse.access(e),!0}catch{return!1}}function Wse(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Kse(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function ej(e){let t,n,r=ZU(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Bse(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Bu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return QU(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return QU(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function QU(e,t){e&&e.setCwd(t),Gse(t)}function Gse(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as nj}from"child_process";import{existsSync as rj,mkdirSync as Vse,readFileSync as oj,unlinkSync as tj,writeFileSync as ij}from"fs";import{get as Xse}from"https";import{join as sj}from"path";import{readFileSync as qse}from"fs";import{dirname as zse,join as Jse}from"path";import{fileURLToPath as Yse}from"url";function cr(){try{return"5.56.4"}catch{}try{let e=zse(Yse(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(qse(Jse(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var Qse=64*1024,Zse=10800*1e3,eae=800,tae=3600*1e3,nae="update-check.json",rae="pending-update.json";function NE(){return sj(is(),nae)}function Dd(){return sj(is(),rae)}function BE(){let e=is();rj(e)||Vse(e,{recursive:!0})}function aj(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function lj(){try{let e=oj(NE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cj(){try{BE();let e=`
1744
1744
  const https = require('https');
1745
1745
  const fs = require('fs');
1746
1746
  const url = 'https://registry.npmjs.org/agent-afk/latest';
@@ -1901,7 +1901,7 @@ Multiple chats found:`)),o.forEach((l,c)=>{let d=l.username?`@${l.username}`:l.f
1901
1901
  `).slice(-o-1);console.log(i.join(`
1902
1902
  `))})}function Ule(e){if(console.log(p.heading("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${p.success("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${jle(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${p.error("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(p.heading("Recent log entries:"));for(let t of e.logTail)console.log(p.meta(` ${t}`))}}function jle(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m ${e%60}s`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}import{execFile as hce}from"node:child_process";import{promisify as yce}from"node:util";G();import{execFile as Hle}from"node:child_process";import{randomBytes as Wle}from"node:crypto";import{promises as cl}from"node:fs";import{join as qh}from"node:path";import{promisify as Kle}from"node:util";var Gle=Kle(Hle),f1=16;var Ct=class extends Error{cause;code;constructor(t,n,r){super(t),this.name="WorktreeError",this.cause=n,this.code=r}};function sT(e,t=40){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||"task"}function qle(){return Wle(4).toString("hex").slice(0,4)}function zle(e){let t=n=>String(n).padStart(2,"0");return`${e.getUTCFullYear()}${t(e.getUTCMonth()+1)}${t(e.getUTCDate())}T${t(e.getUTCHours())}${t(e.getUTCMinutes())}${t(e.getUTCSeconds())}`}function Jle(e,t={}){let n=(t.now??(()=>new Date))(),r=(t.randomSuffix??qle)();return`${zle(n)}-${sT(e,32)}-${r}`}async function Yi(e,t){try{let n=await Gle("git",t,{cwd:e,maxBuffer:4194304});return{stdout:n.stdout.trim(),stderr:n.stderr.trim()}}catch(n){let r=n,o=(r.stderr??r.stdout??r.message??"").toString().trim();throw new Ct(`git ${t.join(" ")} failed: ${o}`,n)}}async function Yle(e){let{stdout:t}=await Yi(e,["rev-parse","--show-toplevel"]);if(!t)throw new Ct(`not a git repository: ${e}`);return t}async function Vle(e,t){if(t){let{stdout:o}=await Yi(e,["rev-parse",t]);return{sha:o}}let{stdout:n}=await Yi(e,["rev-parse","HEAD"]),r;try{let{stdout:o}=await Yi(e,["symbolic-ref","--quiet","HEAD"]);o&&(r=o)}catch{}return{sha:n,branch:r}}function Xle(e,t,n){let r=n?sT(n,32):`branch-${t}`;return`afk/farm/${e}/${t}-${r}`}function Qle(e,t){return qh(e,`branch-${t}`)}async function Zle(e,t){try{await Yi(e,["worktree","remove","--force",t])}catch{}}async function ece(e,t){try{await Yi(e,["branch","-D",t])}catch{}}async function g1(e){if(e.count<1||e.count>f1)throw new Ct(`count must be between 1 and ${f1}, got ${e.count}`);if(e.labels&&e.labels.length!==e.count)throw new Ct(`labels.length (${e.labels.length}) must equal count (${e.count})`);let t=e.cwd??process.cwd(),n=await Yle(t),{sha:r,branch:o}=await Vle(n,e.baseRef),i=(e.now??(()=>new Date))(),s=e.taskSlug??Jle(e.taskName,{now:()=>i,randomSuffix:e.randomSuffix}),a=e.taskSlug??s,l=Fy(s);try{throw await cl.access(l),new Ct(`farm directory already exists: ${l}`)}catch(u){if(u.code!=="ENOENT")throw u instanceof Ct?u:new Ct(`failed to check farm dir ${l}`,u)}await cl.mkdir(l,{recursive:!0});let c=[];try{for(let u=1;u<=e.count;u++){let m=e.labels?.[u-1],f=Xle(s,u,m),g=Qle(l,u);await Yi(n,["worktree","add","-b",f,g,r]),c.push({index:u,label:m?sT(m,32):void 0,path:g,branch:f})}}catch(u){for(let m of c.slice().reverse())await Zle(n,m.path),await ece(n,m.branch);throw await cl.rm(l,{recursive:!0,force:!0}).catch(()=>{}),u instanceof Ct?u:new Ct("farm creation failed",u)}let d={schemaVersion:3,taskId:a,taskSlug:s,taskName:e.taskName,repoRoot:n,baseRef:r,baseBranch:o,farmDir:l,createdAt:i.toISOString(),branches:c};return await cl.writeFile(qh(l,"farm.json"),JSON.stringify(d,null,2)+`
1903
1903
  `,"utf8"),d}function tce(e){let t=e;return t.respawnedAt===void 0&&(t.respawnedAt=void 0),t.respawnedAs===void 0&&(t.respawnedAs=void 0),t.prUrl===void 0&&(t.prUrl=void 0),t.prCreatedAt===void 0&&(t.prCreatedAt=void 0),t}async function nce(e){let t=qh(Fy(e),"farm.json");try{let n=await cl.readFile(t,"utf8"),r=JSON.parse(n);if(r.schemaVersion!==1&&r.schemaVersion!==2&&r.schemaVersion!==3)throw new Ct(`unsupported farm manifest schema: ${r.schemaVersion} (expected 1, 2, or 3)`,void 0,"unsupported-schema");return tce(r)}catch(n){if(n.code==="ENOENT")return null;throw n instanceof Ct?n:new Ct(`failed to load farm manifest ${t}`,n,"invalid")}}async function h1(e,t){let n=await nce(e);if(!n)throw new Ct(`farm not found: ${e}`);return n.memoryFactId=t,n.schemaVersion=3,await cl.writeFile(qh(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
1904
- `,"utf8"),n}Ke();import{spawn as rce}from"child_process";import{promises as zh}from"fs";import{join as Bd,dirname as AQe}from"path";var oce=1,Jh=12e4;async function S1(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=Jh,_spawn:i=rce,_readPackageJson:s=ice,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await sce(t,s),d=0,u=0,m=0,f;if(c){let b=await k1(c,t,o,i,a);m=b.durationMs,b.timedOut?(u=1,f=`tests timed out after ${o}ms`):b.crashed?(u=1,f=`test runner crashed: ${cce(b.stderr,200)}`):b.exitCode===0?d=1:u=1}else f="no test command found (no package.json scripts.test)";let g=await ace(t,o,i,a),h=await lce(t,n,i),y={schemaVersion:oce,pass:d,fail:u,loc_delta:h,lint_ok:g,duration_ms:m,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(y.error=f),c!==void 0&&(y.testCmd=c),y}async function v1(e,t,n){let r=Bd(e,"scores");await zh.mkdir(r,{recursive:!0});let o=Bd(r,`branch-${t}.json`);return await zh.writeFile(o,JSON.stringify(n,null,2)+`
1904
+ `,"utf8"),n}Ke();import{spawn as rce}from"child_process";import{promises as zh}from"fs";import{join as Bd,dirname as _Qe}from"path";var oce=1,Jh=12e4;async function S1(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=Jh,_spawn:i=rce,_readPackageJson:s=ice,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await sce(t,s),d=0,u=0,m=0,f;if(c){let b=await k1(c,t,o,i,a);m=b.durationMs,b.timedOut?(u=1,f=`tests timed out after ${o}ms`):b.crashed?(u=1,f=`test runner crashed: ${cce(b.stderr,200)}`):b.exitCode===0?d=1:u=1}else f="no test command found (no package.json scripts.test)";let g=await ace(t,o,i,a),h=await lce(t,n,i),y={schemaVersion:oce,pass:d,fail:u,loc_delta:h,lint_ok:g,duration_ms:m,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(y.error=f),c!==void 0&&(y.testCmd=c),y}async function v1(e,t,n){let r=Bd(e,"scores");await zh.mkdir(r,{recursive:!0});let o=Bd(r,`branch-${t}.json`);return await zh.writeFile(o,JSON.stringify(n,null,2)+`
1905
1905
  `,"utf8"),o}function Ud(e){let t=e.filter(r=>r.score!==null),n=e.filter(r=>r.score===null).map(r=>r.index).sort((r,o)=>r-o);return t.sort((r,o)=>{let i=r.score,s=o.score,a=y1(i),l=y1(s);if(a!==l)return l-a;let c=b1(i.lint_ok),d=b1(s.lint_ok);return c!==d?d-c:i.loc_delta!==s.loc_delta?i.loc_delta-s.loc_delta:r.index-o.index}),[...t.map(r=>r.index),...n]}async function ice(e){try{let t=await zh.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function sce(e,t){let n=await t(Bd(e,"package.json"));if(!w1(n))return;let r=n.scripts;return!w1(r)||typeof r.test!="string"?void 0:await E1(Bd(e,"pnpm-lock.yaml"))?"pnpm test":"npm test"}async function k1(e,t,n,r,o){let i=o();return new Promise(s=>{let a;try{a=r(e,{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],env:{...process.env,CI:"1"}})}catch(m){s({exitCode:null,durationMs:o()-i,stderr:m instanceof Error?m.message:String(m),timedOut:!1,crashed:!0});return}let l="",c=!1,d=!1,u=setTimeout(()=>{c=!0,a.kill("SIGKILL")},n);a.stderr?.on("data",m=>{l+=String(m),l.length>64e3&&(l=l.slice(-32e3))}),a.on("error",m=>{d||(d=!0,clearTimeout(u),s({exitCode:null,durationMs:o()-i,stderr:m.message,timedOut:!1,crashed:!0}))}),a.on("close",m=>{d||(d=!0,clearTimeout(u),s({exitCode:m,durationMs:o()-i,stderr:l,timedOut:c,crashed:!1}))})})}async function ace(e,t,n,r){if(!await E1(Bd(e,"tsconfig.json")))return null;let o=await k1("npx --no-install tsc --noEmit",e,t,n,r);return o.crashed||o.timedOut?null:o.exitCode===0}async function lce(e,t,n){return new Promise(r=>{let o;try{o=n("git",["diff","--shortstat",`${t}..HEAD`],{cwd:e,stdio:["ignore","pipe","pipe"]})}catch{r(0);return}let i="";o.stdout?.on("data",s=>{i+=String(s)}),o.on("error",()=>r(0)),o.on("close",()=>{let s=/(\d+) insertions?\(\+\)/.exec(i),a=/(\d+) deletions?\(-\)/.exec(i),l=s?Number(s[1]):0,c=a?Number(a[1]):0;r(l-c)})})}function y1(e){let t=e.pass+e.fail;return t===0?0:e.pass/t}function b1(e){return e===!0?2:e===!1?1:0}function cce(e,t){return e.length<=t?e:e.slice(0,t)+"\u2026"}function w1(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function E1(e){try{return await zh.access(e),!0}catch{return!1}}pp();function T1(e,t){let n;try{n=t?._store??new ut}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r=dce(e);return{factId:n.storeFact({category:"learning",content:JSON.stringify(r),source_surface:"afk"})}}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}}function dce(e){let t=uce(e.branches),n=e.winner??null,r=pce(e,t);return{type:"farm-run",task:e.taskName,taskSlug:e.taskSlug,winner:n,why:r,scores:t,human_decision:e.human_decision??null,baseSha:e.baseSha,completedAt:e.completedAt}}function uce(e){return e.map(t=>{let n=t.score??null;return{index:t.index,branch:t.branch,pass:n?.pass??0,fail:n?.fail??0,loc_delta:n?.loc_delta??0,lint_ok:n?.lint_ok??null,duration_ms:n?.duration_ms??0}})}function pce(e,t){let{winner:n,branches:r}=e;if(n==null)return r.some(m=>m.score!=null)?`no winner: all ${r.length} branches failed tests`:"no winner: scoring data unavailable";let o=t.find(u=>u.index===n);if(!o)return`branch-${n} wins`;let i=o.pass>0?"\u2713":"\u2717",s=o.lint_ok===!0?"\u2713":o.lint_ok===!1?"\u2717":"?",a=o.loc_delta>=0?`+${o.loc_delta}`:String(o.loc_delta),c=t.filter(u=>u.index!==n).map(u=>u.loc_delta>=0?`+${u.loc_delta}`:String(u.loc_delta)),d=c.length>0?` (vs ${c.join(", ")} LoC)`:"";return`branch-${n} wins: tests${i}, lint${s}, ${a} LoC${d}`}var mce="afk:f:";var fce=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function jd(e,t){if(!fce.test(t))throw new Error(`buildFarmCallback: invalid taskSlug ${JSON.stringify(t)}`);let n=`${mce}${e}:${t}`,r=Buffer.byteLength(n,"utf8");if(r>64)throw new Error(`buildFarmCallback: payload ${r} bytes exceeds Telegram's 64-byte limit (slug=${t})`);return n}function x1(e){return{inline_keyboard:[[{text:"\u2705 Open PR",callback_data:jd("p",e)},{text:"\u{1F501} Respawn from winner",callback_data:jd("r",e)}],[{text:"\u{1F50D} Full diff",callback_data:jd("d",e)},{text:"\u274C Discard all",callback_data:jd("x",e)}]]}}function gce(e){let{taskName:t,taskSlug:n,baseSha:r,branches:o,winner:i}=e,s=o.filter(b=>b.ok),a=o.filter(b=>!b.ok),l=o.length,c=s.length,d=s.map(b=>({index:b.index,score:b.score??null})),u=Ud(d),m=new Map(o.map(b=>[b.index,b])),f=[];f.push(`\u{1F331} Farm complete: ${c}/${l} branches \u2014 ${t}`),f.push("");let g=1;for(let b of u){let w=m.get(b);if(!w)continue;let S=i!==void 0&&i===w.index,v=w.label?` (${w.label})`:"",E=w.score??null,R=E===null?"\u2014":E.pass>0?"\u2713":"\u2717",A=E===null?"\u2014":E.lint_ok===!0?"\u2713":E.lint_ok===!1?"\u2717":"?",C=E===null?"?":E.loc_delta>0?`+${E.loc_delta}`:E.loc_delta<0?`${E.loc_delta}`:"0",N=S?" \u2190 winner":"";f.push(`#${g} ${w.branch}${v} tests${R} lint${A} ${C} LoC${N}`),g++}let h=[...a].sort((b,w)=>b.index-w.index);for(let b of h){let w=b.label?` (${b.label})`:"",S=b.error??"unknown error";f.push(`#${g} ${b.branch}${w} failed: ${S}`),g++}f.push(""),i===void 0&&(f.push("\u26A0 no branch won (no successful + scored branches)"),f.push(""));let y=r.slice(0,7);return f.push(`base: ${y}`),f.push(`farm: ~/.afk/farms/${n}/`),f.join(`
1906
1906
  `)}async function R1(e,t){let n=gce(e),r=x1(e.taskSlug),o=t?._push??await Promise.resolve().then(()=>(br(),Db)).then(i=>i.pushIfConfigured);try{let i=await o(n,{replyMarkup:r});return i===null?{sent:!1,reason:"telegram unconfigured"}:{sent:!0,chatCount:i.length}}catch(i){return{sent:!1,reason:i instanceof Error?i.message:String(i)}}}var C1=yce(hce);async function bce(e,t){try{let{stdout:n}=await C1("git",["-C",e,"rev-list",`${t}..HEAD`,"--count"],{maxBuffer:4194304});return parseInt(n.trim(),10)||0}catch{return 0}}async function wce(e){try{let{stdout:t}=await C1("git",["-C",e,"status","--porcelain"],{maxBuffer:4194304});return t.trim()?t.trim().split(`
1907
1907
  `).filter(Boolean):[]}catch{return[]}}var aT=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
@@ -1946,7 +1946,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
1946
1946
  `)){let r=n.indexOf("=");if(r<0)continue;let o=n.slice(0,r).trim(),i=n.slice(r+1).trim();switch(o){case"MainPID":{let s=Number.parseInt(i,10);Number.isFinite(s)&&s>0&&(t.pid=s);break}case"ExecMainStatus":{let s=Number.parseInt(i,10);Number.isFinite(s)&&(t.lastExitStatus=s);break}case"ActiveState":i&&(t.activeState=i);break;case"LoadState":i&&(t.loadState=i);break;default:break}}return t}function cH(e){let t=Mn(e),n={name:e,label:Gd(e),installed:Ade(t),configPath:t,logFile:fl(e)};if(!n.installed)return n;try{let r=Cde("systemctl",["--user","show",Dt(e),"--property=MainPID,ExecMainStatus,ActiveState,LoadState"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:gl}),o=_de(r);o.pid!==void 0&&(n.pid=o.pid),o.lastExitStatus!==void 0&&(n.lastExitStatus=o.lastExitStatus)}catch{}return n}var uH={backend:"systemd",configKind:"systemd user unit",install(e,t={}){return sH(e,t)},uninstall(e){return aH(e)},status(e){return cH(e)},restart(e){if(!dH(Mn(e)))return{kind:"not-installed",configPath:Mn(e)};try{return Ide("systemctl",["--user","restart",Dt(e)],{stdio:["ignore","pipe","pipe"],timeout:gl}),{kind:"restarted",label:Gd(e)}}catch(t){let n=t.stderr;return{kind:"failed",reason:n&&n.toString().trim()||t.message}}},isInstalled(e){return dH(Mn(e))},configPath(e){return Mn(e)},logPath(e){return fl(e)},label(e){return Gd(e)},readConfigFile(e){return lH(e)}};var bl=["telegram","daemon"];function pH(e=process.platform){switch(e){case"darwin":return Z1;case"linux":return uH;default:return null}}var mH="macOS (launchd) and Linux (systemd --user)";function qd(){let e=pH();if(!e)throw new Error(`'afk service' is not supported on ${process.platform}. Supported: ${mH}.`);return e}function iy(e){let t=e.toLowerCase();if(bl.includes(t))return t;throw new Error(`Unknown service '${e}'. Supported: ${bl.join(", ")}.`)}function gH(e){let t=e.command("service").description("Manage AFK background services (launchd on macOS, systemd --user on Linux) \u2014 always-on, auto-restart");t.command("install <name>").description(`Install <${bl.join("|")}> as an OS service that starts on login and relaunches on crash`).option("--no-watch","Disable auto-restart-on-rebuild (launchd WatchPaths / systemd .path unit)").option("--dry-run","Write the config file but do not register with the supervisor",!1).action((n,r)=>{try{let o=qd(),i=iy(n),s=o.install(i,{noWatch:r.watch===!1,dryRun:!!r.dryRun});s.kind==="already-installed"&&(console.log(p.warning(`\u26A0 ${s.label} already installed at ${s.configPath}`)),console.log(p.meta(` Run 'afk service uninstall ${i}' first to reinstall.`)),process.exit(1)),s.kind==="failed"&&(console.error(p.error(`\u2717 Install failed: ${s.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Installed ${s.label}`)),console.log(p.meta(` Config: ${s.configPath} (${o.configKind})`)),console.log(p.meta(` Log: ${o.logPath(i)}`)),s.autoRestartOnRebuild?console.log(p.meta(" Auto-restart on rebuild: on")):console.log(p.meta(` Auto-restart on rebuild: off \u2014 run 'afk service restart ${i}' after updates.`));for(let a of s.notes??[])console.log(p.info(` ${a}`));r.dryRun||console.log(p.meta(` Status: afk service status ${i}`))}catch(o){J(o)}}),t.command("uninstall <name>").description("Stop the service and remove its config (LaunchAgent plist / systemd unit)").action(n=>{try{let r=qd(),o=iy(n),i=r.uninstall(o);if(i.kind==="not-installed"){console.log(p.warning(`\u26A0 ${r.label(o)} is not installed (no config at ${i.configPath})`));return}i.kind==="failed"&&(console.error(p.error(`\u2717 Uninstall failed: ${i.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Uninstalled ${r.label(o)}`)),console.log(p.meta(` Removed: ${i.configPath}`))}catch(r){J(r)}}),t.command("status [name]").description("Show running PID, last exit status, and log file for one or all services").action(n=>{try{let r=qd();if(n){fH(r.status(iy(n)),r.configKind);return}for(let o of bl)fH(r.status(o),r.configKind),console.log("")}catch(r){J(r)}}),t.command("list").description("List recognised service names and whether each is installed").action(()=>{try{let n=qd();console.log(p.heading(`AFK services (${n.backend}):`));for(let r of bl){let o=n.isInstalled(r),i=o?p.success("\u25CF"):p.dim("\u25CB"),s=o?p.meta("installed"):p.meta("not installed");console.log(` ${i} ${r.padEnd(10)} ${s} ${p.meta(n.configPath(r))}`)}}catch(n){J(n)}}),t.command("restart <name>").description("Restart the service (launchctl kickstart -k / systemctl --user restart)").action(n=>{try{let r=qd(),o=iy(n),i=r.restart(o);i.kind==="not-installed"&&(console.error(p.error(`\u2717 ${r.label(o)} is not installed. Run 'afk service install ${o}' first.`)),process.exit(1)),i.kind==="failed"&&(console.error(p.error(`\u2717 Restart failed: ${i.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Restarted ${i.label}`))}catch(r){J(r)}})}function fH(e,t){if(console.log(p.heading(`${e.label}`)),!e.installed){console.log(` ${p.dim("\u25CB")} Not installed`),console.log(p.meta(` Config: ${e.configPath} (${t})`)),console.log(p.meta(` Install: afk service install ${e.name}`));return}e.pid!==void 0?console.log(` ${p.success("\u25CF")} Running (PID ${e.pid})`):(console.log(` ${p.warning("\u25CF")} Installed but not running`),e.lastExitStatus!==void 0&&e.lastExitStatus!==0&&console.log(p.meta(` Last exit status: ${e.lastExitStatus}`))),console.log(p.meta(` Config: ${e.configPath} (${t})`)),console.log(p.meta(` Log: ${e.logFile}`))}import{execFileSync as Pde}from"child_process";import{chmodSync as Mde,existsSync as zd,mkdirSync as bH,readdirSync as Ode,readFileSync as $de,renameSync as wH,writeFileSync as SH}from"fs";import{basename as Dde,dirname as bT,join as wT}from"path";import{randomBytes as vH}from"crypto";import{createInterface as Fde}from"node:readline";G();function Lde(e){let t=Fde({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,()=>{t.close(),n()})})}var Wo="chrome-devtools",yT=["stable","beta","canary","dev"];function Nde(e="stable"){let t=["chrome-devtools-mcp@latest","--autoConnect"];return e!=="stable"&&t.push("--channel",e),{command:"npx",args:t}}function hH(e){if(!zd(e))return{mcpServers:{}};let t;try{t=$de(e,"utf-8")}catch(o){throw new Error(`Failed to read MCP config at ${e}: ${o.message}`)}let n;try{n=JSON.parse(t)}catch{throw new Error(`MCP config at ${e} is not valid JSON. Fix or remove it, then retry.`)}if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`MCP config at ${e} must be a JSON object.`);let r=n;if(Array.isArray(r.mcpServers))throw new Error(`MCP config at ${e} has an invalid "mcpServers" (must be a JSON object, not an array).`);return(r.mcpServers===void 0||typeof r.mcpServers!="object"||r.mcpServers===null)&&(r.mcpServers={}),r}function yH(e,t){bH(bT(e),{recursive:!0});let n=wT(bT(e),`.mcp.json.${process.pid}.${vH(4).toString("hex")}.tmp`);SH(n,`${JSON.stringify(t,null,2)}
1947
1947
  `,"utf-8"),wH(n,e)}function Bde(){let e=process.platform==="darwin"?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"]:["google-chrome","google-chrome-stable","chromium","chromium-browser"];for(let t of e)try{let r=Pde(t,["--version"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:5e3}).match(/(\d+)\.\d+\.\d+/);if(r!==null&&r[1]!==void 0)return parseInt(r[1],10)}catch{}return null}function Ude(){let e=Bde();console.log(""),console.log(p.heading("Drive your real Chrome \u2014 one-time setup:")),e===null?console.log(p.meta(" \u2022 Chrome not detected. autoConnect requires Chrome \u2265 144.")):e<144?console.log(p.warning(` \u2022 Detected Chrome ${e} \u2014 autoConnect requires \u2265 144. Please update Chrome.`)):console.log(p.meta(` \u2022 Detected Chrome ${e} \u2713 (autoConnect needs \u2265 144)`)),console.log(p.meta(" 1. In Chrome, open chrome://inspect/#remote-debugging and enable it (one time).")),console.log(p.meta(' 2. The first time the agent drives Chrome, click "Allow" on the prompt.')),console.log(p.meta(' 3. Chrome shows a "being controlled by automated test software" banner while active.')),console.log(""),console.log(p.meta("The agent gains mcp__chrome-devtools__* tools (navigate, click, fill, take_snapshot, \u2026)")),console.log(p.meta("driving your REAL, logged-in profile. Run `/mcp` in the REPL to confirm it connected.")),console.log(p.meta("Undo anytime with `afk browser disconnect`."))}function kH(e){let t=e.command("browser").description("Give the agent web hands: connect your real Chrome, or save a login it reuses");t.command("connect").description("Wire chrome-devtools-mcp (--autoConnect) so the agent can drive your real, logged-in Chrome").option("--channel <channel>",`Chrome channel autoConnect targets (${yT.join("|")})`,"stable").action(n=>{try{let r=(n.channel??"stable").toLowerCase();if(!yT.includes(r))throw new Error(`--channel must be one of ${yT.join(", ")} (got "${n.channel}")`);let o=Ri(),i=hH(o);i.mcpServers===void 0&&(i.mcpServers={});let s=Nde(r),a=i.mcpServers[Wo];if(a!==void 0&&JSON.stringify(a)===JSON.stringify(s))console.log(p.success(`\u2713 "${Wo}" already configured`)),console.log(p.meta(` Config: ${o}`));else{i.mcpServers[Wo]=s,yH(o,i);let l=a===void 0?"Added":"Updated";console.log(p.success(`\u2713 ${l} "${Wo}" MCP server`)),console.log(p.meta(` Config: ${o}`)),console.log(p.meta(` Runs: npx ${s.args?.join(" ")??""}`))}Ude()}catch(r){J(r)}}),t.command("disconnect").description("Remove the chrome-devtools server from your MCP config").action(()=>{try{let n=Ri();if(!zd(n)){console.log(p.warning(`\u26A0 No MCP config at ${n} \u2014 nothing to remove.`));return}let r=hH(n);if(r.mcpServers===void 0||r.mcpServers[Wo]===void 0){console.log(p.warning(`\u26A0 "${Wo}" is not configured \u2014 nothing to remove.`));return}delete r.mcpServers[Wo],yH(n,r),console.log(p.success(`\u2713 Removed "${Wo}" from ${n}`))}catch(n){J(n)}}),t.command("login <url>").description("Open a headed browser, log in manually, and save the session to a vault profile the agent's native browser tools reuse").option("--profile <name>","Vault profile name to save the session under","default").action(async(n,r)=>{try{let o=(r.profile??"default").trim();$l(o);let i;try{i=new URL(n)}catch{throw new Error(`Invalid URL: ${n}`)}if(i.protocol!=="http:"&&i.protocol!=="https:")throw new Error(`login URL must be http(s), got: ${i.protocol}`);let s=Dl(o),{chromium:a}=await import("playwright");console.log(p.meta(`Launching a browser for profile "${o}"\u2026`));let l=await a.launch({headless:!1}),c=await l.newContext(zd(s)?{storageState:s}:{});await(await c.newPage()).goto(n,{waitUntil:"load"}).catch(()=>{}),console.log(""),console.log(p.heading("Log in to the site in the opened browser window.")),console.log(p.meta("When fully logged in, return here and press Enter to save the session.")),console.log(p.meta("(Do NOT close the browser window yourself \u2014 this command closes it for you.)")),await Lde("Press Enter to save the session\u2026 ");let u=await c.storageState();bH(Wy(o),{recursive:!0});let m=wT(bT(s),`.${Dde(s)}.${process.pid}.${vH(4).toString("hex")}.tmp`);SH(m,JSON.stringify(u),{mode:384}),Mde(m,384),wH(m,s),await l.close().catch(()=>{}),console.log(p.success(`\u2713 Saved session for profile "${o}"`)),console.log(p.meta(` Vault: ${s} (0600 \u2014 treat as a credential)`)),console.log(p.meta(" Point the agent at it:")),console.log(p.meta(` export AFK_BROWSER_DEFAULT_PROFILE=${o}`))}catch(o){J(o)}}),t.command("profiles").description("List saved browser session-vault profiles").action(()=>{try{let n=Hy(),r=zd(n)?Ode(n,{withFileTypes:!0}).filter(o=>o.isDirectory()):[];if(r.length===0){console.log(p.meta("No saved profiles. Create one with `afk browser login <url> --profile <name>`."));return}console.log(p.heading("Saved browser profiles:"));for(let o of r){let i=zd(wT(n,o.name,"storageState.json")),s=i?p.success("\u25CF"):p.meta("\u25CB"),a=i?"":p.meta(" (no saved session)");console.log(` ${s} ${o.name}${a}`)}console.log(""),console.log(p.meta("Use one: export AFK_BROWSER_DEFAULT_PROFILE=<name>"))}catch(n){J(n)}})}import{readFileSync as jde,readdirSync as Hde,statSync as Wde}from"fs";import{join as ET}from"path";G();import{join as et}from"path";function sy(){return et(At(),"improve")}function Ko(){return et(sy(),"failure-cards")}function EH(){return et(Ko(),".index.jsonl")}function Jd(e){return et(Ko(),`${e}.json`)}function ay(e){return et(Ko(),`${e}.md`)}function TH(){return et(he(),"witness")}function Xi(){return et(sy(),"proposals")}function xH(){return et(Xi(),".index.jsonl")}function ST(e){return et(Xi(),`${e}.json`)}function RH(e){return et(Xi(),`${e}.md`)}function Go(){return et(sy(),"eval-cases")}function CH(){return et(Go(),".index.jsonl")}function vT(e){return et(Go(),`${e}.json`)}function kT(e){return et(Go(),`${e}.fixture.jsonl`)}function AH(e){return et(Go(),`${e}.md`)}function wl(){return et(sy(),"eval-runs")}function _H(){return et(wl(),".index.jsonl")}function IH(e){return et(wl(),`${e}.json`)}function PH(e){return et(wl(),`${e}.md`)}K();function MH(e){let t=e.trim(),n=/^(\d+)\s*([smhd])$/i.exec(t);if(!n)return;let r=Number.parseInt(n[1]??"0",10),o=(n[2]??"").toLowerCase();if(!(!Number.isFinite(r)||r<=0))switch(o){case"s":return r*1e3;case"m":return r*60*1e3;case"h":return r*60*60*1e3;case"d":return r*24*60*60*1e3;default:return}}function OH(e={}){let t=e.witnessRoot??TH(),n=e.afkHome??k.AFK_HOME??Kde(),r=e.sinceMs,o={sessionsScanned:0,sessionsSkippedOld:0,sessionsSkippedEmpty:0,invalidLineCount:0,sessions:[]},i;try{i=Hde(t)}catch{return o}for(let s of i){if(s.startsWith("."))continue;let a=ET(t,s),l;try{l=Wde(a)}catch{continue}if(!l.isDirectory())continue;if(r!==void 0&&l.mtimeMs<r){o.sessionsSkippedOld+=1;continue}let c=ET(a,"trace.jsonl"),d;try{d=jde(c,"utf-8")}catch{o.sessionsSkippedEmpty+=1;continue}let u=Gde(c,n),m=Sl({sessionId:s,tracePath:c,relativeTracePath:u,content:d,sessionMtimeMs:l.mtimeMs});o.sessions.push(m),o.sessionsScanned+=1,o.invalidLineCount+=m.invalidLineCount}return o}function Sl(e){let{sessionId:t,tracePath:n,relativeTracePath:r,content:o,sessionMtimeMs:i}=e,s=[],a=0,l=o.split(`
1948
1948
  `);for(let c=0;c<l.length;c+=1){let d=l[c]??"";if(d.trim()==="")continue;let u;try{u=JSON.parse(d)}catch{a+=1;continue}let m=Uf.safeParse(u);if(!m.success){a+=1;continue}s.push({sessionId:t,tracePath:n,relativeTracePath:r,lineNumber:c+1,rawLine:d,event:m.data})}return{sessionId:t,tracePath:n,relativeTracePath:r,sessionMtimeMs:i,events:s,invalidLineCount:a}}function Kde(){let e=k.AFK_HOME;return e&&e.length>0?e:ET(k.HOME??"",".afk")}function Gde(e,t){if(!t)return e;if(e.startsWith(t)){let n=e.slice(t.length);return n.startsWith("/")&&(n=n.slice(1)),n}return e}import{createHash as qde}from"crypto";var Hr=4,zde=8,Jde="v1-bytes-tuple";function ly(e,t={}){let n=t.minRepeats??Hr;if(n<2)throw new Error(`minRepeats must be >= 2 (got ${n})`);let r=[];for(let o of e){let i=Yde(o,n);r.push(...i)}return r}function Yde(e,t){let n=Vde(e.events),r=Xde(n),o=[];for(let[i,s]of r.entries()){let a=Qde(s,t);for(let l of a)o.push(eue(e,l,i))}return o}function Vde(e){let t=new Map,n=[];for(let r of e){let o=r.event;if(o.kind!=="tool_call")continue;if(o.payload.phase==="started"){t.set(o.payload.toolUseId,{seq:o.seq,name:o.payload.name,inputBytes:o.payload.inputBytes,subagentId:o.payload.subagentId});continue}let i=t.get(o.payload.toolUseId);if(!i)continue;t.delete(o.payload.toolUseId);let s=Zde({name:o.payload.name,inputBytes:i.inputBytes,resultBytes:o.payload.resultBytes,isError:o.payload.isError,subagentId:i.subagentId});n.push({toolUseId:o.payload.toolUseId,startedSeq:i.seq,completedSeq:o.seq,completedLineNumber:r.lineNumber,name:o.payload.name,inputBytes:i.inputBytes,resultBytes:o.payload.resultBytes,isError:o.payload.isError,subagentId:i.subagentId,rawLine:r.rawLine,fingerprint:s})}return n}function Xde(e){let t=new Map;for(let n of e){let r=n.subagentId??"root",o=t.get(r);o?o.push(n):t.set(r,[n])}return t}function Qde(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r];if(!o){r+=1;continue}let i=r+1;for(;i<e.length;){let a=e[i];if(!a||a.fingerprint!==o.fingerprint)break;i+=1}i-r>=t&&n.push(e.slice(r,i)),r=i>r?i:r+1}return n}function Zde(e){let t=[e.name,String(e.inputBytes),String(e.resultBytes),e.isError?"1":"0",e.subagentId??""].join("|");return qde("sha256").update(t).digest("hex")}function eue(e,t,n){let r=t[0];if(!r)throw new Error("repeated-tool-use: empty run");let o=iue(r.name,r.fingerprint),i=new Date().toISOString(),s=t.slice(0,zde),a=[{sessionId:e.sessionId,tracePath:e.relativeTracePath,eventIndices:s.map(l=>l.completedSeq),excerpt:tue(s),annotation:nue(t,n)}];return{slug:o,title:rue(r.name,t.length),pattern:"repeated-tool-use",severity:oue(t.length),observedAt:i,evidence:a,detail:{detector:"repeated-tool-use@v1",fingerprintAlgorithm:Jde,fingerprint:r.fingerprint,toolName:r.name,runLength:t.length,agentContext:n,inputBytes:r.inputBytes,resultBytes:r.resultBytes,isError:r.isError,toolUseIds:t.map(l=>l.toolUseId),completedSeqs:t.map(l=>l.completedSeq)}}}function tue(e){let t=e.map(n=>n.rawLine).join(`
1949
- `);return t.length<=2e3?t:t.slice(0,1997)+"..."}function nue(e,t){let n=e[0],r=e[e.length-1];return!n||!r?"":[`${e.length}\xD7 consecutive '${n.name}' calls in ${t} context`,`(seq ${n.completedSeq}\u2026${r.completedSeq},`,`inputBytes=${n.inputBytes}, resultBytes=${n.resultBytes},`,`isError=${n.isError})`].join(" ")}function rue(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function oue(e){return e>=10?"high":e>=4?"medium":"low"}function iue(e,t){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),r=t.slice(0,12);return`repeated-tool-${n.length>0?n:"tool"}-${r}`}var sue=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function cy(e,t={}){let n=t.minOccurrences??1;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="closure")continue;let l=a.payload.reason;if(!sue.has(l))continue;let c={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,finalCostUsd:a.payload.finalCostUsd,finalTurnCount:a.payload.finalTurnCount},d=r.get(l);d?d.push(c):r.set(l,[c])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(lue(i,s));return o}var aue=8;function lue(e,t){let n=due(e),r=new Date().toISOString(),i=t.slice(0,aue).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:uue(l.rawLine),annotation:`closure.reason='${l.reason}' \xB7 cost=${pue(l.finalCostUsd)} \xB7 turns=${l.finalTurnCount}`})),s=t.reduce((l,c)=>l+c.finalCostUsd,0),a=t.reduce((l,c)=>l+c.finalTurnCount,0)/t.length;return{slug:n,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:cue(e,t.length),observedAt:r,evidence:i,detail:{detector:"closure-anomaly@v1",closureReason:e,affectedSessions:t.length,totalCostUsd:$H(s),avgTurnCount:mue(a),maxCostUsd:$H(Math.max(...t.map(l=>l.finalCostUsd))),sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function cue(e,t){switch(e){case"budget_exceeded":case"timeout":return"high";case"hook_blocked":case"iteration_cap":case"max_turns_exceeded":return t>=3?"high":"medium";case"abort":return t>=3?"medium":"low";default:return"low"}}function due(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function uue(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function pue(e){return`$${e.toFixed(4)}`}function $H(e){return Math.round(e*1e4)/1e4}function mue(e){return Math.round(e*100)/100}import{createHash as fue}from"crypto";var Qi=2,gue="v1-hook-reason-tuple",hue=8;function DH(e,t={}){let n=t.minOccurrences??Qi;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="SubagentStart"||a.payload.decision!=="block")continue;let l=a.payload.reason??"",c=a.payload.blockedTool,d=yue({hookEvent:a.payload.hookEvent,reason:l,blockedTool:c}),u={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,blockedTool:c,injectedContextBytes:a.payload.injectedContextBytes},m=r.get(d);m?m.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(wue(i,s));return o}function yue(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return fue("sha256").update(t).digest("hex")}function bue(e){return`subagent-block-${e.slice(0,12)}`}function wue(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=bue(e),o=new Date().toISOString(),s=t.slice(0,hue).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Eue(l.rawLine),annotation:kue(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:vue(n.reason,t.length,a),pattern:"subagent-block",severity:Sue(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:gue,fingerprint:e,hookEvent:"SubagentStart",reason:n.reason,blockedTool:n.blockedTool??null,blockCount:t.length,distinctSessions:a,sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function Sue(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function vue(e,t,n){let r=e.length>80?e.slice(0,77)+"...":e,o=r.length>0?`: "${r}"`:"";return`SubagentStart hook blocked ${t}\xD7 across ${n} session${n===1?"":"s"}${o}`}function kue(e){let t=[`seq ${e.seq}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),e.blockedTool&&t.push(`blockedTool=${e.blockedTool}`),typeof e.injectedContextBytes=="number"&&t.push(`injectedContextBytes=${e.injectedContextBytes}`),t.join(" \xB7 ")}function Eue(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as Tue}from"crypto";var Zi=2,xue="v1-pretooluse-read-normreason",Rue=8,Cue=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function Aue(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function FH(e,t={}){let n=t.minOccurrences??Zi;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="PreToolUse"||a.payload.decision!=="block")continue;let l=a.payload.blockedTool;if(l===void 0||!Cue.has(l))continue;let c=a.payload.reason??"",d=Aue(c),u=_ue({hookEvent:a.payload.hookEvent,normalizedReason:d}),m={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:d,blockedTool:l},f=r.get(u);f?f.push(m):r.set(u,[m])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Pue(i,s));return o}function _ue(e){let t=[e.hookEvent,e.normalizedReason].join("|");return Tue("sha256").update(t).digest("hex")}function Iue(e){return`subagent-read-denial-${e.slice(0,12)}`}function Pue(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=Iue(e),o=new Date().toISOString(),s=t.slice(0,Rue).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:Due(c.rawLine),annotation:$ue(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:Oue(t.length,a),pattern:"subagent-read-denial",severity:Mue(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v1",fingerprintAlgorithm:xue,fingerprint:e,hookEvent:"PreToolUse",normalizedReason:n.normalizedReason,reason:n.reason,blockedTools:l,denialCount:t.length,distinctSessions:a,sessionIds:[...new Set(t.map(c=>c.sessionId))],seqs:t.map(c=>c.seq)}}}function Mue(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function Oue(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function $ue(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function Due(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var Fue=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined"]),es=3,ts=.25,Lue=8;function vl(e,t={}){let n=t.minFailures??es,r=t.minFailureRate??ts;if(n<1)throw new Error(`minFailures must be >= 1 (got ${n})`);if(r<=0||r>1)throw new Error(`minFailureRate must be in (0, 1] (got ${r})`);let o=new Map;for(let s of e)for(let a of s.events){let l=a.event;if(l.kind!=="tool_call"||l.payload.phase!=="completed"||l.payload.circuitBreaker===!0)continue;let c=Nue(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&Fue.has(d)){c.excludedByClass.set(d,(c.excludedByClass.get(d)??0)+1);continue}c.totalCalls+=1,l.payload.isError&&(c.failures.push({sessionId:s.sessionId,relativeTracePath:s.relativeTracePath,seq:l.seq,rawLine:a.rawLine,resultBytes:l.payload.resultBytes,durationMs:l.payload.durationMs,truncated:l.payload.truncated,...d!==void 0?{failureClass:d}:{}}),c.affectedSessions.add(s.sessionId),l.payload.truncated&&(c.truncatedFailureCount+=1))}let i=[];for(let s of o.values()){if(s.failures.length<n)continue;let a=s.failures.length/s.totalCalls;a<r||i.push(Bue(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function Nue(e,t){let n=e.get(t);return n||(n={toolName:t,totalCalls:0,failures:[],affectedSessions:new Set,truncatedFailureCount:0,excludedByClass:new Map},e.set(t,n)),n}function Bue(e,t){let n=Hue(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,Lue).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:Wue(d.rawLine),annotation:`isError=true${d.failureClass?` \xB7 class=${d.failureClass}`:""} \xB7 resultBytes=${d.resultBytes} \xB7 durationMs=${d.durationMs}${d.truncated?" \xB7 truncated":""}`})),a=e.failures.reduce((d,u)=>d+u.durationMs,0)/e.failures.length,l={};for(let d of e.failures){let u=d.failureClass??"unclassified";l[u]=(l[u]??0)+1}let c={};for(let[d,u]of e.excludedByClass)c[d]=u;return{slug:n,title:jue(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:Uue(e.failures.length,t),observedAt:r,evidence:i,detail:{detector:"tool-failure-density@v2",toolName:e.toolName,totalCalls:e.totalCalls,failureCount:e.failures.length,failureRate:Kue(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:Gue(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function Uue(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function jue(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function Hue(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function Wue(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Kue(e){return Math.round(e*1e4)/1e4}function Gue(e){return Math.round(e*100)/100}var dy=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Hr})`,run:(e,t)=>ly(e,{minRepeats:t.minRepeats??Hr})},{name:"closure-anomaly",description:`Session closure reason \u2208 {budget_exceeded,timeout,hook_blocked,abort,iteration_cap,max_turns_exceeded} (default \u2265${1})`,enabledByDefault:!1,run:(e,t)=>cy(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${Qi})`,enabledByDefault:!1,run:(e,t)=>DH(e,{minOccurrences:t.subagentBlockMinOccurrences??Qi})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${es} failures, ${ts} rate)`,enabledByDefault:!0,run:(e,t)=>vl(e,{minFailures:t.toolFailureMinFailures??es,minFailureRate:t.toolFailureMinRate??ts})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${Zi})`,enabledByDefault:!1,run:(e,t)=>FH(e,{minOccurrences:t.subagentReadDenialMinOccurrences??Zi})}]);function LH(e,t,n,r){let o=[];for(let i of dy){if(n!==void 0){if(!n.has(i.name))continue}else if(r!==!0&&i.enabledByDefault===!1)continue;let s=i.run(e,t);o.push(...s)}return o}function uy(){return dy.map(e=>e.name)}function NH(){return dy.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function kl(){return dy.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as Xd,mkdirSync as zH,readFileSync as cpe,readdirSync as JH,renameSync as YH,writeFileSync as RT}from"fs";import{join as VH}from"path";import{z as L}from"zod";var El=L.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),py=L.enum(["low","medium","high"]),que=L.enum(["open","deferred","resolved"]),BH=L.object({sessionId:L.string().min(1),tracePath:L.string().min(1),eventIndices:L.array(L.number().int().nonnegative()).min(1),excerpt:L.string().max(2e3),annotation:L.string().optional()}),my=L.object({at:L.string().datetime(),text:L.string()}),Vd=L.object({schemaVersion:L.literal(1),slug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:L.string().min(1).max(200),pattern:El,severity:py,status:que,firstSeen:L.string().datetime(),lastSeen:L.string().datetime(),occurrenceCount:L.number().int().nonnegative(),evidence:L.array(BH).min(1),detail:L.record(L.string(),L.unknown()),notes:L.array(my).default([])}),utt=L.object({slug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:L.string().min(1).max(200),pattern:El,severity:py,observedAt:L.string().datetime(),evidence:L.array(BH).min(1),detail:L.record(L.string(),L.unknown())}),UH=L.object({timestamp:L.string().datetime(),event:L.enum(["created","updated","merged-noop"]),slug:L.string(),pattern:El,occurrenceCount:L.number().int().nonnegative(),evidenceAdded:L.number().int().nonnegative()}),zue=L.enum(["prompt-defect","schema-too-strict","schema-too-loose","tool-output-shape","hook-overreach","retry-policy","timeout-too-low","cost-control","dispatcher-bug","detector-needs-tuning","unknown"]),Jue=L.enum(["safe","moderate","high","forbidden"]),Yue=L.enum(["low","medium","high"]),Vue=L.object({cardSlug:L.string(),eventIndices:L.array(L.number().int().nonnegative()).min(1),annotation:L.string().optional()}),Xue=L.object({path:L.string().min(1),rationale:L.string(),riskTier:Jue,confidence:Yue}),Que=L.object({unitTests:L.array(L.string()),evalCases:L.array(L.string()),smokeChecks:L.array(L.string()),manualChecks:L.array(L.string())}),Zue=L.object({forbiddenPaths:L.array(L.string()),requiresExplicitApproval:L.boolean()}),epe=L.enum(["draft","approved","rejected","superseded"]),TT=L.object({schemaVersion:L.literal(1),proposalId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),cardSlug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:L.string().min(1).max(200),hypothesis:L.string().min(1),rootCauseClass:zue,evidenceRefs:L.array(Vue).min(1),fixSketch:L.string().min(1),likelyFiles:L.array(Xue),riskLevel:py,validationPlan:Que,scopeFreeze:Zue,generatedBy:L.enum(["template","llm"]),createdAt:L.string().datetime(),status:epe,notes:L.array(my).default([])}),jH=L.object({timestamp:L.string().datetime(),event:L.enum(["created","triaged","superseded"]),proposalId:L.string(),cardSlug:L.string(),generatedBy:L.enum(["template","llm"]),riskLevel:py}),tpe=L.object({sourceSessionId:L.string().min(1),sourceTracePath:L.string().min(1),fixturePath:L.string().min(1),evidenceRowIndex:L.number().int().nonnegative(),evidenceEventIndices:L.array(L.number().int().nonnegative()).min(1),sliceLineRange:L.object({startLine:L.number().int().positive(),endLine:L.number().int().positive()}),sliceLineCount:L.number().int().positive(),sliceSha256:L.string().regex(/^[0-9a-f]{64}$/,"sliceSha256 must be 64 lowercase hex chars")}),npe=L.object({kind:L.literal("pattern-absent"),patternId:El,detectorVersion:L.string().min(1),rationale:L.string().min(1)}),rpe=L.object({detectorAtGeneration:L.string().min(1),fingerprintAtGeneration:L.string().nullable(),cardOccurrenceCountAtGeneration:L.number().int().nonnegative(),cardLastSeenAtGeneration:L.string().datetime(),generatedBy:L.literal("replay-fixture")}),ope=L.enum(["draft","approved","rejected","superseded"]),fy=L.object({schemaVersion:L.literal(1),evalCaseId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalCaseId must be lowercase alphanumeric with hyphens"),cardSlug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),proposalId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/).nullable(),title:L.string().min(1).max(200),createdAt:L.string().datetime(),kind:L.literal("replay"),replay:tpe,assertion:npe,provenance:rpe,status:ope,notes:L.array(my).default([])}),HH=L.object({timestamp:L.string().datetime(),event:L.enum(["created","triaged","superseded"]),evalCaseId:L.string(),cardSlug:L.string(),proposalId:L.string().nullable(),kind:L.literal("replay")}),ipe=L.enum(["pass","fail","skipped"]),spe=L.object({name:L.string().min(1),description:L.string().min(1),status:ipe,expected:L.string(),actual:L.string()}),ape=L.enum(["config-value","observed-behavior","source-symbol","fixture"]),lpe=L.object({kind:ape,ref:L.string().min(1),detail:L.string()}),WH=L.enum(["pass","fail","unsupported","error"]),xT=L.object({schemaVersion:L.literal(1),evalRunId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalRunId must be lowercase alphanumeric with hyphens"),evalCaseId:L.string().min(1),cardSlug:L.string().min(1),patternId:El,contract:L.string().min(1).nullable(),status:WH,createdAt:L.string().datetime(),durationMs:L.number().int().nonnegative(),checks:L.array(spe),evidence:L.array(lpe),runner:L.object({version:L.string().min(1),mode:L.literal("deterministic")}),notes:L.array(my).default([])}),KH=L.object({timestamp:L.string().datetime(),event:L.literal("created"),evalRunId:L.string(),evalCaseId:L.string(),cardSlug:L.string(),patternId:El,contract:L.string().nullable(),status:WH}),GH=Object.freeze(["**/auth/**","**/billing/**","**/secrets/**","**/credentials*",".env",".env.*","pnpm-lock.yaml","package-lock.json","yarn.lock",".github/workflows/**","dist/**","build/**","node_modules/**",".git/**","**/.afk/config/**","**/.afk/state/**"]);function XH(e){let t=Ko();Xd(t)||zH(t,{recursive:!0});let n=Jd(e.slug),r=ay(e.slug),o=Tl(n),i=dpe(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=Vd.parse(i);return mpe(n,c),fpe(r,Qd(c)),ppe({timestamp:gpe(),event:l,slug:c.slug,pattern:c.pattern,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a)}),{slug:c.slug,event:l,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a),jsonPath:n,markdownPath:r}}function Tl(e){if(Xd(e))try{let t=cpe(e,"utf-8"),n=JSON.parse(t),r=Vd.safeParse(n);return r.success?r.data:void 0}catch{return}}function dpe(e,t){if(!e)return{schemaVersion:1,slug:t.slug,title:t.title,pattern:t.pattern,severity:t.severity,status:"open",firstSeen:t.observedAt,lastSeen:t.observedAt,occurrenceCount:t.evidence.length,evidence:t.evidence,detail:t.detail,notes:[]};if(e.slug!==t.slug)throw new Error(`card-writer: slug mismatch on merge (existing='${e.slug}', detection='${t.slug}')`);let n=upe(e.evidence,t.evidence),r=hpe(e.firstSeen,t.observedAt),o=ype(e.lastSeen,t.observedAt),i=bpe(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:i,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function upe(e,t){let n=i=>`${i.sessionId}::${i.eventIndices[0]??"NA"}`,r=new Set(e.map(n)),o=[...e];for(let i of t){let s=n(i);r.has(s)||(r.add(s),o.push(i))}return o}function Qd(e){let t=[];t.push(`# ${e.slug} \u2014 \`${e.severity}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Pattern:** \`${e.pattern}\` \xB7 **Occurrences:** ${e.occurrenceCount} \xB7 **First seen:** ${e.firstSeen} \xB7 **Last seen:** ${e.lastSeen}`),t.push(""),t.push("## Evidence"),t.push("");for(let n of e.evidence)t.push(`### Session \`${n.sessionId}\``),t.push(""),t.push(`- Trace: \`${n.tracePath}\``),t.push(`- Event seqs: ${n.eventIndices.join(", ")}`),n.annotation&&t.push(`- Note: ${n.annotation}`),t.push(""),t.push("```jsonl"),t.push(n.excerpt),t.push("```"),t.push("");if(t.push("## Detail"),t.push(""),t.push("```json"),t.push(JSON.stringify(e.detail,null,2)),t.push("```"),t.push(""),t.push("## Triage notes"),t.push(""),e.notes.length>0){for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);t.push("")}else t.push('_(none \u2014 add one with `afk improve cards triage <slug> --note "\u2026"`)_'),t.push("");return t.join(`
1949
+ `);return t.length<=2e3?t:t.slice(0,1997)+"..."}function nue(e,t){let n=e[0],r=e[e.length-1];return!n||!r?"":[`${e.length}\xD7 consecutive '${n.name}' calls in ${t} context`,`(seq ${n.completedSeq}\u2026${r.completedSeq},`,`inputBytes=${n.inputBytes}, resultBytes=${n.resultBytes},`,`isError=${n.isError})`].join(" ")}function rue(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function oue(e){return e>=10?"high":e>=4?"medium":"low"}function iue(e,t){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),r=t.slice(0,12);return`repeated-tool-${n.length>0?n:"tool"}-${r}`}var sue=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function cy(e,t={}){let n=t.minOccurrences??1;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="closure")continue;let l=a.payload.reason;if(!sue.has(l))continue;let c={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,finalCostUsd:a.payload.finalCostUsd,finalTurnCount:a.payload.finalTurnCount},d=r.get(l);d?d.push(c):r.set(l,[c])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(lue(i,s));return o}var aue=8;function lue(e,t){let n=due(e),r=new Date().toISOString(),i=t.slice(0,aue).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:uue(l.rawLine),annotation:`closure.reason='${l.reason}' \xB7 cost=${pue(l.finalCostUsd)} \xB7 turns=${l.finalTurnCount}`})),s=t.reduce((l,c)=>l+c.finalCostUsd,0),a=t.reduce((l,c)=>l+c.finalTurnCount,0)/t.length;return{slug:n,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:cue(e,t.length),observedAt:r,evidence:i,detail:{detector:"closure-anomaly@v1",closureReason:e,affectedSessions:t.length,totalCostUsd:$H(s),avgTurnCount:mue(a),maxCostUsd:$H(Math.max(...t.map(l=>l.finalCostUsd))),sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function cue(e,t){switch(e){case"budget_exceeded":case"timeout":return"high";case"hook_blocked":case"iteration_cap":case"max_turns_exceeded":return t>=3?"high":"medium";case"abort":return t>=3?"medium":"low";default:return"low"}}function due(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function uue(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function pue(e){return`$${e.toFixed(4)}`}function $H(e){return Math.round(e*1e4)/1e4}function mue(e){return Math.round(e*100)/100}import{createHash as fue}from"crypto";var Qi=2,gue="v1-hook-reason-tuple",hue=8;function DH(e,t={}){let n=t.minOccurrences??Qi;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="SubagentStart"||a.payload.decision!=="block")continue;let l=a.payload.reason??"",c=a.payload.blockedTool,d=yue({hookEvent:a.payload.hookEvent,reason:l,blockedTool:c}),u={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,blockedTool:c,injectedContextBytes:a.payload.injectedContextBytes},m=r.get(d);m?m.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(wue(i,s));return o}function yue(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return fue("sha256").update(t).digest("hex")}function bue(e){return`subagent-block-${e.slice(0,12)}`}function wue(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=bue(e),o=new Date().toISOString(),s=t.slice(0,hue).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Eue(l.rawLine),annotation:kue(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:vue(n.reason,t.length,a),pattern:"subagent-block",severity:Sue(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:gue,fingerprint:e,hookEvent:"SubagentStart",reason:n.reason,blockedTool:n.blockedTool??null,blockCount:t.length,distinctSessions:a,sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function Sue(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function vue(e,t,n){let r=e.length>80?e.slice(0,77)+"...":e,o=r.length>0?`: "${r}"`:"";return`SubagentStart hook blocked ${t}\xD7 across ${n} session${n===1?"":"s"}${o}`}function kue(e){let t=[`seq ${e.seq}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),e.blockedTool&&t.push(`blockedTool=${e.blockedTool}`),typeof e.injectedContextBytes=="number"&&t.push(`injectedContextBytes=${e.injectedContextBytes}`),t.join(" \xB7 ")}function Eue(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as Tue}from"crypto";var Zi=2,xue="v1-pretooluse-read-normreason",Rue=8,Cue=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function Aue(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function FH(e,t={}){let n=t.minOccurrences??Zi;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="PreToolUse"||a.payload.decision!=="block")continue;let l=a.payload.blockedTool;if(l===void 0||!Cue.has(l))continue;let c=a.payload.reason??"",d=Aue(c),u=_ue({hookEvent:a.payload.hookEvent,normalizedReason:d}),m={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:d,blockedTool:l},f=r.get(u);f?f.push(m):r.set(u,[m])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Pue(i,s));return o}function _ue(e){let t=[e.hookEvent,e.normalizedReason].join("|");return Tue("sha256").update(t).digest("hex")}function Iue(e){return`subagent-read-denial-${e.slice(0,12)}`}function Pue(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=Iue(e),o=new Date().toISOString(),s=t.slice(0,Rue).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:Due(c.rawLine),annotation:$ue(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:Oue(t.length,a),pattern:"subagent-read-denial",severity:Mue(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v1",fingerprintAlgorithm:xue,fingerprint:e,hookEvent:"PreToolUse",normalizedReason:n.normalizedReason,reason:n.reason,blockedTools:l,denialCount:t.length,distinctSessions:a,sessionIds:[...new Set(t.map(c=>c.sessionId))],seqs:t.map(c=>c.seq)}}}function Mue(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function Oue(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function $ue(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function Due(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var Fue=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined"]),es=3,ts=.25,Lue=8;function vl(e,t={}){let n=t.minFailures??es,r=t.minFailureRate??ts;if(n<1)throw new Error(`minFailures must be >= 1 (got ${n})`);if(r<=0||r>1)throw new Error(`minFailureRate must be in (0, 1] (got ${r})`);let o=new Map;for(let s of e)for(let a of s.events){let l=a.event;if(l.kind!=="tool_call"||l.payload.phase!=="completed"||l.payload.circuitBreaker===!0)continue;let c=Nue(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&Fue.has(d)){c.excludedByClass.set(d,(c.excludedByClass.get(d)??0)+1);continue}c.totalCalls+=1,l.payload.isError&&(c.failures.push({sessionId:s.sessionId,relativeTracePath:s.relativeTracePath,seq:l.seq,rawLine:a.rawLine,resultBytes:l.payload.resultBytes,durationMs:l.payload.durationMs,truncated:l.payload.truncated,...d!==void 0?{failureClass:d}:{}}),c.affectedSessions.add(s.sessionId),l.payload.truncated&&(c.truncatedFailureCount+=1))}let i=[];for(let s of o.values()){if(s.failures.length<n)continue;let a=s.failures.length/s.totalCalls;a<r||i.push(Bue(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function Nue(e,t){let n=e.get(t);return n||(n={toolName:t,totalCalls:0,failures:[],affectedSessions:new Set,truncatedFailureCount:0,excludedByClass:new Map},e.set(t,n)),n}function Bue(e,t){let n=Hue(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,Lue).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:Wue(d.rawLine),annotation:`isError=true${d.failureClass?` \xB7 class=${d.failureClass}`:""} \xB7 resultBytes=${d.resultBytes} \xB7 durationMs=${d.durationMs}${d.truncated?" \xB7 truncated":""}`})),a=e.failures.reduce((d,u)=>d+u.durationMs,0)/e.failures.length,l={};for(let d of e.failures){let u=d.failureClass??"unclassified";l[u]=(l[u]??0)+1}let c={};for(let[d,u]of e.excludedByClass)c[d]=u;return{slug:n,title:jue(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:Uue(e.failures.length,t),observedAt:r,evidence:i,detail:{detector:"tool-failure-density@v2",toolName:e.toolName,totalCalls:e.totalCalls,failureCount:e.failures.length,failureRate:Kue(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:Gue(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function Uue(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function jue(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function Hue(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function Wue(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Kue(e){return Math.round(e*1e4)/1e4}function Gue(e){return Math.round(e*100)/100}var dy=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Hr})`,run:(e,t)=>ly(e,{minRepeats:t.minRepeats??Hr})},{name:"closure-anomaly",description:`Session closure reason \u2208 {budget_exceeded,timeout,hook_blocked,abort,iteration_cap,max_turns_exceeded} (default \u2265${1})`,enabledByDefault:!1,run:(e,t)=>cy(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${Qi})`,enabledByDefault:!1,run:(e,t)=>DH(e,{minOccurrences:t.subagentBlockMinOccurrences??Qi})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${es} failures, ${ts} rate)`,enabledByDefault:!0,run:(e,t)=>vl(e,{minFailures:t.toolFailureMinFailures??es,minFailureRate:t.toolFailureMinRate??ts})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${Zi})`,enabledByDefault:!1,run:(e,t)=>FH(e,{minOccurrences:t.subagentReadDenialMinOccurrences??Zi})}]);function LH(e,t,n,r){let o=[];for(let i of dy){if(n!==void 0){if(!n.has(i.name))continue}else if(r!==!0&&i.enabledByDefault===!1)continue;let s=i.run(e,t);o.push(...s)}return o}function uy(){return dy.map(e=>e.name)}function NH(){return dy.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function kl(){return dy.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as Xd,mkdirSync as zH,readFileSync as cpe,readdirSync as JH,renameSync as YH,writeFileSync as RT}from"fs";import{join as VH}from"path";import{z as L}from"zod";var El=L.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),py=L.enum(["low","medium","high"]),que=L.enum(["open","deferred","resolved"]),BH=L.object({sessionId:L.string().min(1),tracePath:L.string().min(1),eventIndices:L.array(L.number().int().nonnegative()).min(1),excerpt:L.string().max(2e3),annotation:L.string().optional()}),my=L.object({at:L.string().datetime(),text:L.string()}),Vd=L.object({schemaVersion:L.literal(1),slug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:L.string().min(1).max(200),pattern:El,severity:py,status:que,firstSeen:L.string().datetime(),lastSeen:L.string().datetime(),occurrenceCount:L.number().int().nonnegative(),evidence:L.array(BH).min(1),detail:L.record(L.string(),L.unknown()),notes:L.array(my).default([])}),ptt=L.object({slug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:L.string().min(1).max(200),pattern:El,severity:py,observedAt:L.string().datetime(),evidence:L.array(BH).min(1),detail:L.record(L.string(),L.unknown())}),UH=L.object({timestamp:L.string().datetime(),event:L.enum(["created","updated","merged-noop"]),slug:L.string(),pattern:El,occurrenceCount:L.number().int().nonnegative(),evidenceAdded:L.number().int().nonnegative()}),zue=L.enum(["prompt-defect","schema-too-strict","schema-too-loose","tool-output-shape","hook-overreach","retry-policy","timeout-too-low","cost-control","dispatcher-bug","detector-needs-tuning","unknown"]),Jue=L.enum(["safe","moderate","high","forbidden"]),Yue=L.enum(["low","medium","high"]),Vue=L.object({cardSlug:L.string(),eventIndices:L.array(L.number().int().nonnegative()).min(1),annotation:L.string().optional()}),Xue=L.object({path:L.string().min(1),rationale:L.string(),riskTier:Jue,confidence:Yue}),Que=L.object({unitTests:L.array(L.string()),evalCases:L.array(L.string()),smokeChecks:L.array(L.string()),manualChecks:L.array(L.string())}),Zue=L.object({forbiddenPaths:L.array(L.string()),requiresExplicitApproval:L.boolean()}),epe=L.enum(["draft","approved","rejected","superseded"]),TT=L.object({schemaVersion:L.literal(1),proposalId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),cardSlug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:L.string().min(1).max(200),hypothesis:L.string().min(1),rootCauseClass:zue,evidenceRefs:L.array(Vue).min(1),fixSketch:L.string().min(1),likelyFiles:L.array(Xue),riskLevel:py,validationPlan:Que,scopeFreeze:Zue,generatedBy:L.enum(["template","llm"]),createdAt:L.string().datetime(),status:epe,notes:L.array(my).default([])}),jH=L.object({timestamp:L.string().datetime(),event:L.enum(["created","triaged","superseded"]),proposalId:L.string(),cardSlug:L.string(),generatedBy:L.enum(["template","llm"]),riskLevel:py}),tpe=L.object({sourceSessionId:L.string().min(1),sourceTracePath:L.string().min(1),fixturePath:L.string().min(1),evidenceRowIndex:L.number().int().nonnegative(),evidenceEventIndices:L.array(L.number().int().nonnegative()).min(1),sliceLineRange:L.object({startLine:L.number().int().positive(),endLine:L.number().int().positive()}),sliceLineCount:L.number().int().positive(),sliceSha256:L.string().regex(/^[0-9a-f]{64}$/,"sliceSha256 must be 64 lowercase hex chars")}),npe=L.object({kind:L.literal("pattern-absent"),patternId:El,detectorVersion:L.string().min(1),rationale:L.string().min(1)}),rpe=L.object({detectorAtGeneration:L.string().min(1),fingerprintAtGeneration:L.string().nullable(),cardOccurrenceCountAtGeneration:L.number().int().nonnegative(),cardLastSeenAtGeneration:L.string().datetime(),generatedBy:L.literal("replay-fixture")}),ope=L.enum(["draft","approved","rejected","superseded"]),fy=L.object({schemaVersion:L.literal(1),evalCaseId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalCaseId must be lowercase alphanumeric with hyphens"),cardSlug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),proposalId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/).nullable(),title:L.string().min(1).max(200),createdAt:L.string().datetime(),kind:L.literal("replay"),replay:tpe,assertion:npe,provenance:rpe,status:ope,notes:L.array(my).default([])}),HH=L.object({timestamp:L.string().datetime(),event:L.enum(["created","triaged","superseded"]),evalCaseId:L.string(),cardSlug:L.string(),proposalId:L.string().nullable(),kind:L.literal("replay")}),ipe=L.enum(["pass","fail","skipped"]),spe=L.object({name:L.string().min(1),description:L.string().min(1),status:ipe,expected:L.string(),actual:L.string()}),ape=L.enum(["config-value","observed-behavior","source-symbol","fixture"]),lpe=L.object({kind:ape,ref:L.string().min(1),detail:L.string()}),WH=L.enum(["pass","fail","unsupported","error"]),xT=L.object({schemaVersion:L.literal(1),evalRunId:L.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalRunId must be lowercase alphanumeric with hyphens"),evalCaseId:L.string().min(1),cardSlug:L.string().min(1),patternId:El,contract:L.string().min(1).nullable(),status:WH,createdAt:L.string().datetime(),durationMs:L.number().int().nonnegative(),checks:L.array(spe),evidence:L.array(lpe),runner:L.object({version:L.string().min(1),mode:L.literal("deterministic")}),notes:L.array(my).default([])}),KH=L.object({timestamp:L.string().datetime(),event:L.literal("created"),evalRunId:L.string(),evalCaseId:L.string(),cardSlug:L.string(),patternId:El,contract:L.string().nullable(),status:WH}),GH=Object.freeze(["**/auth/**","**/billing/**","**/secrets/**","**/credentials*",".env",".env.*","pnpm-lock.yaml","package-lock.json","yarn.lock",".github/workflows/**","dist/**","build/**","node_modules/**",".git/**","**/.afk/config/**","**/.afk/state/**"]);function XH(e){let t=Ko();Xd(t)||zH(t,{recursive:!0});let n=Jd(e.slug),r=ay(e.slug),o=Tl(n),i=dpe(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=Vd.parse(i);return mpe(n,c),fpe(r,Qd(c)),ppe({timestamp:gpe(),event:l,slug:c.slug,pattern:c.pattern,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a)}),{slug:c.slug,event:l,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a),jsonPath:n,markdownPath:r}}function Tl(e){if(Xd(e))try{let t=cpe(e,"utf-8"),n=JSON.parse(t),r=Vd.safeParse(n);return r.success?r.data:void 0}catch{return}}function dpe(e,t){if(!e)return{schemaVersion:1,slug:t.slug,title:t.title,pattern:t.pattern,severity:t.severity,status:"open",firstSeen:t.observedAt,lastSeen:t.observedAt,occurrenceCount:t.evidence.length,evidence:t.evidence,detail:t.detail,notes:[]};if(e.slug!==t.slug)throw new Error(`card-writer: slug mismatch on merge (existing='${e.slug}', detection='${t.slug}')`);let n=upe(e.evidence,t.evidence),r=hpe(e.firstSeen,t.observedAt),o=ype(e.lastSeen,t.observedAt),i=bpe(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:i,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function upe(e,t){let n=i=>`${i.sessionId}::${i.eventIndices[0]??"NA"}`,r=new Set(e.map(n)),o=[...e];for(let i of t){let s=n(i);r.has(s)||(r.add(s),o.push(i))}return o}function Qd(e){let t=[];t.push(`# ${e.slug} \u2014 \`${e.severity}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Pattern:** \`${e.pattern}\` \xB7 **Occurrences:** ${e.occurrenceCount} \xB7 **First seen:** ${e.firstSeen} \xB7 **Last seen:** ${e.lastSeen}`),t.push(""),t.push("## Evidence"),t.push("");for(let n of e.evidence)t.push(`### Session \`${n.sessionId}\``),t.push(""),t.push(`- Trace: \`${n.tracePath}\``),t.push(`- Event seqs: ${n.eventIndices.join(", ")}`),n.annotation&&t.push(`- Note: ${n.annotation}`),t.push(""),t.push("```jsonl"),t.push(n.excerpt),t.push("```"),t.push("");if(t.push("## Detail"),t.push(""),t.push("```json"),t.push(JSON.stringify(e.detail,null,2)),t.push("```"),t.push(""),t.push("## Triage notes"),t.push(""),e.notes.length>0){for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);t.push("")}else t.push('_(none \u2014 add one with `afk improve cards triage <slug> --note "\u2026"`)_'),t.push("");return t.join(`
1950
1950
  `)}function ppe(e){let t=UH.parse(e),n=EH(),r=Ko();Xd(r)||zH(r,{recursive:!0});try{RT(n,JSON.stringify(t)+`
1951
1951
  `,{flag:"a"})}catch{}}function mpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;RT(n,JSON.stringify(t,null,2)),YH(n,e)}function fpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;RT(n,t),YH(n,e)}function gpe(){return new Date().toISOString()}function hpe(e,t){return e<=t?e:t}function ype(e,t){return e>=t?e:t}var qH={low:0,medium:1,high:2};function bpe(e,t){return qH[e]>=qH[t]?e:t}function QH(){let e=Ko();if(!Xd(e))return[];let t=[];for(let n of JH(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=Tl(VH(e,n));r&&t.push({slug:r.slug,title:r.title,pattern:r.pattern,severity:r.severity,status:r.status,occurrenceCount:r.occurrenceCount,firstSeen:r.firstSeen,lastSeen:r.lastSeen})}return t.sort((n,r)=>n.lastSeen!==r.lastSeen?n.lastSeen<r.lastSeen?1:-1:n.slug<r.slug?-1:1),t}function gy(e){return Tl(Jd(e))}function ZH(e){let t;for(let n of e.notes)(t===void 0||Date.parse(n.at)>Date.parse(t))&&(t=n.at);return t}function wpe(e){if(e.status!=="resolved"&&e.status!=="deferred")return!1;let t=ZH(e);if(t===void 0)return!1;let n=Date.parse(e.lastSeen),r=Date.parse(t);return Number.isNaN(n)||Number.isNaN(r)?!1:n>r}function Spe(e){let t=[];for(let n of e){if(!wpe(n))continue;let r=ZH(n);r!==void 0&&t.push({slug:n.slug,pattern:n.pattern,severity:n.severity,status:n.status,occurrenceCount:n.occurrenceCount,lastSeen:n.lastSeen,latestNoteAt:r})}return t.sort((n,r)=>n.lastSeen!==r.lastSeen?n.lastSeen<r.lastSeen?1:-1:n.slug<r.slug?-1:1),t}function eW(){let e=Ko();if(!Xd(e))return[];let t=[];for(let n of JH(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=Tl(VH(e,n));r&&t.push(r)}return Spe(t)}import{existsSync as vpe,mkdirSync as kpe,renameSync as tW,writeFileSync as nW}from"fs";import{dirname as Epe}from"path";var ns=class extends Error{constructor(n,r){super(r);this.code=n;this.name="TriageError"}code};function rW(e,t){let n=Jd(e),r=ay(e),o=Tl(n);if(!o)throw new ns("card-not-found",`No failure card found for slug '${e}'`);if(t.note!==void 0&&t.note.trim().length===0)throw new ns("invalid-note","triage note must be non-empty after trim");let i=t.note?.trim(),s=i!==void 0&&i.length>0,a=t.status!==void 0&&t.status!==o.status;if(!s&&!a)throw new ns("no-change","triage requires at least --note or --status to differ from current");let l=(t.now??(()=>new Date))().toISOString(),c=s?[...o.notes,{at:l,text:i}]:o.notes,d=a?t.status:o.status,u={...o,status:d,notes:c},m=Vd.parse(u);return Tpe(n),xpe(n,m),Rpe(r,Qd(m)),{slug:e,card:m,noteAdded:s,statusChanged:a?{from:o.status,to:d}:void 0,jsonPath:n,markdownPath:r}}function Tpe(e){let t=Epe(e);vpe(t)||kpe(t,{recursive:!0})}function xpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;nW(n,JSON.stringify(t,null,2)),tW(n,e)}function Rpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;nW(n,t),tW(n,e)}var Cpe={"repeated-tool-use":{rootCauseClass:"dispatcher-bug",hypothesis:e=>{let t=typeof e.detail.toolName=="string"?e.detail.toolName:"<unknown>",n=typeof e.detail.runLength=="number"?e.detail.runLength:"?";return`The '${t}' tool was dispatched ${n} times in a row with an identical input/output byte fingerprint. This is either (a) the model is stuck retrying the same call without responding to its result, (b) the tool's result shape is too uninformative for the model to make progress, or (c) a productive recursion that happens to share byte counts (rare; the fingerprint caveat is documented on the detector).`},fixSketch:e=>["## Candidate fixes (human picks)","",`**Option A \u2014 make the loop visible.** Surface a clear "no-progress" signal to the model when '${typeof e.detail.toolName=="string"?e.detail.toolName:"<the tool>"}' returns the same result N times in a row. Today the dispatcher just executes the call.`,"",`**Option B \u2014 improve the tool's result shape.** If the model can't distinguish "no results" from "same results," its result is information-poor. Inspect the tool's response and verify it carries enough signal for the model to change its query.`,"","**Option C \u2014 confirm productive recursion.** Open the source trace at the seq values listed in the evidence and inspect the model's reasoning between repeats. If each call's args genuinely differ (and the byte-count collision is the issue), no code change is needed; tune the detector instead.","","_Option C first \u2014 the byte-fingerprint detector has a documented collision caveat. Confirm there is a real loop before changing dispatcher behavior._"].join(`
1952
1952
  `),likelyFiles:[{path:"src/agent/providers/anthropic-direct/loop.ts",rationale:"Main tool dispatch loop. If a no-progress detector is added at the dispatch boundary, it lives here.",riskTier:"moderate",confidence:"medium"},{path:"src/agent/tools/",rationale:"Tool implementations. If the result shape is information-poor, the specific tool implementation needs the change.",riskTier:"safe",confidence:"low"},{path:"src/improve/scan/detectors/repeated-tool-use.ts",rationale:"If this turns out to be detector noise rather than a real bug, tune here.",riskTier:"safe",confidence:"medium"}],riskFloor:"medium",validationPlan:{unitTests:["pnpm test src/improve/scan/detectors/repeated-tool-use","pnpm test src/agent/providers/anthropic-direct"],evalCases:[],smokeChecks:["pnpm lint","afk improve scan --since 7d # after fix lands, this pattern should NOT recur"],manualChecks:["Open the trace at the evidence seqs and confirm the calls are truly identical (not just byte-coincident)."]}},"subagent-block":{rootCauseClass:"hook-overreach",hypothesis:e=>{let t=typeof e.detail.reason=="string"?e.detail.reason:"",n=typeof e.detail.blockCount=="number"?e.detail.blockCount:"?",r=typeof e.detail.distinctSessions=="number"?e.detail.distinctSessions:"?",o=t?` with reason "${t.slice(0,200)}"`:" (no reason field on the block events)";return`A SubagentStart hook returned decision:'block' ${n} times across ${r} session(s)${o}. Recurring blocks suggest either (a) the guard is over-broad and trips on legitimate dispatches, (b) the legitimate use case actually needs a refactor to satisfy the guard, or (c) the user has no signal explaining the block and keeps retrying.`},fixSketch:e=>{let t=typeof e.detail.reason=="string"?e.detail.reason:"<not in payload>";return["## Candidate fixes (human picks)","",`**Identify the hook owner first.** The trace's hook_decision event carries the \`reason\` field ("${t}"). Grep the codebase for that literal string \u2014 that locates the hook handler.`,"","```sh","# Replace the quoted string below with the actual reason text from the evidence.",`grep -rn -- "${t.slice(0,60).replace(/"/g,'\\"')}" src/`,"```","","**Option A \u2014 tighten the guard.** If the block fires on dispatches it should not, narrow the predicate. Confirm by adding a unit test that exercises the false-positive case.","","**Option B \u2014 make the refusal legible.** Instead of `decision: 'block'`, return a hook decision that injects a context message via `injectContext`. The parent session then sees a clear no-op message instead of a silent block.","",'**Option C \u2014 accept the block as correct.** If the guard is doing its job, mark the card resolved via `afk improve cards triage <slug> --status resolved --note "..."`. No code change.'].join(`
@@ -1957,7 +1957,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
1957
1957
  `)}function dW(){let e=Xi();if(!hy(e))return[];let t=[];for(let n of Fpe(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=uW(Lpe(e,n));r&&t.push({proposalId:r.proposalId,cardSlug:r.cardSlug,title:r.title,riskLevel:r.riskLevel,status:r.status,rootCauseClass:r.rootCauseClass,generatedBy:r.generatedBy,createdAt:r.createdAt})}return t.sort((n,r)=>n.createdAt!==r.createdAt?n.createdAt<r.createdAt?1:-1:n.proposalId<r.proposalId?-1:1),t}function AT(e){return uW(ST(e))}function uW(e){if(hy(e))try{let t=Dpe(e,"utf-8"),n=JSON.parse(t),r=TT.safeParse(n);return r.success?r.data:void 0}catch{return}}function Bpe(e){let t=jH.parse(e),n=xH(),r=Xi();hy(r)||sW(r,{recursive:!0});try{CT(n,JSON.stringify(t)+`
1958
1958
  `,{flag:"a"})}catch{}}function Upe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;CT(n,JSON.stringify(t,null,2)),aW(n,e)}function jpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;CT(n,t),aW(n,e)}import{createHash as pW}from"crypto";import{existsSync as Hpe,readFileSync as Wpe}from"fs";var gn=class extends Error{code;constructor(t,n){super(t),this.name="EvalGenError",this.code=n}};function mW(e,t){if(!Hpe(e))throw new gn(`replay-fixture: source trace not found: ${e}`,"source-not-found");let n=t.startLine??1;if(n!==1)throw new gn(`replay-fixture: only startLine=1 (prefix slice) is supported in Sprint 3 (got ${n})`,"unsupported-window");let r=Wpe(e);if(r.length===0)throw new gn(`replay-fixture: source trace is empty: ${e}`,"source-empty");let o=Kpe(r),i=o.length,s=-1;for(let u=0;u<o.length;u++){let m=o[u];if(m.contentEnd===m.start)continue;let f=r.subarray(m.start,m.contentEnd).toString("utf8"),g;try{g=JSON.parse(f)}catch{continue}if(g!==null&&typeof g=="object"&&"seq"in g&&typeof g.seq=="number"&&g.seq===t.endSeq){s=u+1;break}}if(s===-1)throw new gn(`replay-fixture: seq ${t.endSeq} not found in ${e} (scanned ${i} lines)`,"seq-not-found");let l=o[s-1].byteEnd,c=Buffer.from(r.subarray(0,l)),d=pW("sha256").update(c).digest("hex");return{bytes:c,startLine:1,endLine:s,sliceLineCount:s,sliceSha256:d,sourceLineCount:i}}function by(e){return pW("sha256").update(e).digest("hex")}function Kpe(e){let t=[],n=0;for(let r=0;r<e.length;r++)e[r]===10&&(t.push({start:n,contentEnd:r,byteEnd:r+1}),n=r+1);return n<e.length&&t.push({start:n,contentEnd:e.length,byteEnd:e.length}),t}import{randomBytes as Gpe}from"crypto";import{existsSync as wy,mkdirSync as fW,readFileSync as gW,readdirSync as qpe,renameSync as _T,writeFileSync as Sy}from"fs";import{join as hW,relative as zpe}from"path";G();function yW(e,t={}){let n=(t.now??(()=>new Date))(),r=Jpe(n),o=t.randomSuffix!==void 0?t.randomSuffix():Gpe(3).toString("hex");if(!/^[0-9a-f]{6}$/.test(o))throw new Error(`generateEvalCaseId: randomSuffix must be 6 lowercase hex chars (got '${o}')`);return`${e}-eval-${r}-${o}`}function Jpe(e){let t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0");return`${t}${n}${r}`}function bW(e,t){if(t.evidenceRowIndex<0||t.evidenceRowIndex>=e.evidence.length)throw new gn(`buildEvalCase: evidence row ${t.evidenceRowIndex} out of range (card has ${e.evidence.length} row(s))`,"evidence-row-out-of-range");let n=e.evidence[t.evidenceRowIndex];if(n.eventIndices.length===0)throw new gn(`buildEvalCase: evidence row ${t.evidenceRowIndex} has no eventIndices`,"seq-not-found");let r=Math.max(...n.eventIndices),i=(t.resolveTraceAbsPath??Ype)(n.tracePath),s=mW(i,{endSeq:r}),a=(t.now??(()=>new Date))().toISOString(),l=kT(t.evalCaseId),c=zpe(Ce(),l),d=typeof e.detail.detector=="string"?e.detail.detector:e.pattern,u=typeof e.detail.fingerprint=="string"?e.detail.fingerprint:null,m=t.proposalId??null,f={schemaVersion:1,evalCaseId:t.evalCaseId,cardSlug:e.slug,proposalId:m,title:Vpe(e,r),createdAt:a,kind:"replay",replay:{sourceSessionId:n.sessionId,sourceTracePath:n.tracePath,fixturePath:c,evidenceRowIndex:t.evidenceRowIndex,evidenceEventIndices:[...n.eventIndices],sliceLineRange:{startLine:s.startLine,endLine:s.endLine},sliceLineCount:s.sliceLineCount,sliceSha256:s.sliceSha256},assertion:{kind:"pattern-absent",patternId:e.pattern,detectorVersion:d,rationale:Xpe({patternId:e.pattern,detectorVersion:d,endSeq:r,sliceLineCount:s.sliceLineCount,sessionId:n.sessionId})},provenance:{detectorAtGeneration:d,fingerprintAtGeneration:u,cardOccurrenceCountAtGeneration:e.occurrenceCount,cardLastSeenAtGeneration:e.lastSeen,generatedBy:"replay-fixture"},status:"draft",notes:[]};return fy.parse(f),{evalCase:f,sliceBytes:s.bytes}}function Ype(e){return hW(Ce(),e)}function Vpe(e,t){let n="Replay [pattern-absent]: ",r=` (through seq ${t})`,o=200-n.length-r.length,i=e.title.length>o?e.title.slice(0,o-1)+"\u2026":e.title;return`${n}${i}${r}`.slice(0,200)}function Xpe(e){let t=e.sessionId.slice(0,8);return`After the proposed fix lands, replaying the prefix [seq 0..${e.endSeq}] (${e.sliceLineCount} lines, session ${t}\u2026) through ${e.detectorVersion} must produce zero findings for '${e.patternId}' with the fingerprint at generation time. **Sprint 3 ships eval-case-as-contract; the runner that enforces this lands in a later sprint.**`}function wW(e,t){let n=fy.parse(e),r=Go();wy(r)||fW(r,{recursive:!0});let o=vT(n.evalCaseId),i=kT(n.evalCaseId),s=AH(n.evalCaseId);tme(i,t);let a=by(gW(i));if(a!==n.replay.sliceSha256)throw new gn(`writeEvalCase: fixture sha256 mismatch after write (expected ${n.replay.sliceSha256}, got ${a}, path ${i})`,"fixture-mismatch");return Zpe(o,n),eme(s,vy(n)),Qpe({timestamp:new Date().toISOString(),event:"created",evalCaseId:n.evalCaseId,cardSlug:n.cardSlug,proposalId:n.proposalId,kind:n.kind}),{evalCaseId:n.evalCaseId,jsonPath:o,fixturePath:i,markdownPath:s}}function vy(e){let t=[];if(t.push(`# ${e.evalCaseId} \u2014 \`${e.kind}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Card:** \`${e.cardSlug}\` \xB7 **Proposal:** ${e.proposalId?`\`${e.proposalId}\``:"_(none)_"} \xB7 **Created:** ${e.createdAt}`),t.push(""),t.push("> **Sprint 3 disclaimer.** This file is a CONTRACT, not an"),t.push("> executable. No runner consumes it yet. A future sprint will"),t.push("> replay the fixture through the detector and assert the"),t.push("> pattern is absent. Until then this artifact captures intent."),t.push(""),t.push("## Replay fixture"),t.push(""),t.push(`- **Source session:** \`${e.replay.sourceSessionId}\``),t.push(`- **Source trace:** \`${e.replay.sourceTracePath}\``),t.push(`- **Fixture:** \`${e.replay.fixturePath}\``),t.push(`- **Evidence row:** index ${e.replay.evidenceRowIndex} (seqs ${e.replay.evidenceEventIndices.join(", ")})`),t.push(`- **Slice:** lines ${e.replay.sliceLineRange.startLine}\u2013${e.replay.sliceLineRange.endLine} (${e.replay.sliceLineCount} lines)`),t.push(`- **SHA-256:** \`${e.replay.sliceSha256}\``),t.push(""),t.push("## Assertion"),t.push(""),t.push(`- **Kind:** \`${e.assertion.kind}\``),t.push(`- **Pattern:** \`${e.assertion.patternId}\``),t.push(`- **Detector:** \`${e.assertion.detectorVersion}\``),t.push(""),t.push(e.assertion.rationale),t.push(""),t.push("## Provenance"),t.push(""),t.push(`- **Detector at generation:** \`${e.provenance.detectorAtGeneration}\``),t.push(`- **Fingerprint at generation:** ${e.provenance.fingerprintAtGeneration?`\`${e.provenance.fingerprintAtGeneration}\``:"_(none \u2014 detector has no fingerprint)_"}`),t.push(`- **Card occurrence count at generation:** ${e.provenance.cardOccurrenceCountAtGeneration}`),t.push(`- **Card lastSeen at generation:** ${e.provenance.cardLastSeenAtGeneration}`),t.push(`- **Generated by:** \`${e.provenance.generatedBy}\``),t.push(""),t.push("## Triage notes"),t.push(""),e.notes.length===0)t.push("_(none)_");else for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);return t.push(""),t.join(`
1959
1959
  `)}function IT(){let e=Go();if(!wy(e))return[];let t=[];for(let n of qpe(e)){if(!n.endsWith(".json")||n.startsWith(".")||n.endsWith(".fixture.jsonl"))continue;let r=vW(hW(e,n));r&&t.push({evalCaseId:r.evalCaseId,cardSlug:r.cardSlug,proposalId:r.proposalId,title:r.title,kind:r.kind,status:r.status,patternId:r.assertion.patternId,createdAt:r.createdAt,sliceSha256:r.replay.sliceSha256})}return t.sort((n,r)=>n.createdAt!==r.createdAt?n.createdAt<r.createdAt?1:-1:n.evalCaseId<r.evalCaseId?-1:1),t}function ky(e){return vW(vT(e))}function SW(e){return IT().filter(t=>t.cardSlug===e).map(t=>ky(t.evalCaseId)).filter(t=>t!==void 0)}function vW(e){if(wy(e))try{let t=gW(e,"utf-8"),n=JSON.parse(t),r=fy.safeParse(n);return r.success?r.data:void 0}catch{return}}function Qpe(e){let t=HH.parse(e),n=CH(),r=Go();wy(r)||fW(r,{recursive:!0});try{Sy(n,JSON.stringify(t)+`
1960
- `,{flag:"a"})}catch{}}function Zpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sy(n,JSON.stringify(t,null,2)),_T(n,e)}function eme(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sy(n,t),_T(n,e)}function tme(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sy(n,t),_T(n,e)}import{randomBytes as Sme}from"crypto";import{existsSync as FT,mkdirSync as $W,readFileSync as vme,readdirSync as int,renameSync as DW,writeFileSync as LT}from"fs";import{join as kme}from"path";G();ac();AS();kf();var kW=400;function Qt(e){let n=(typeof e=="string"?e:String(e)).replace(/\s+/g," ").trim();return n.length>kW?n.slice(0,kW-1)+"\u2026":n}function ke(e){return{name:e.name,description:e.description,status:e.status??(e.pass?"pass":"fail"),expected:Qt(e.expected),actual:Qt(e.actual)}}var Zd="eval_run_probe_tool";async function nme(){let e=$s,t=0,n=async()=>(t+=1,{content:"probe-ok"}),r=new Wt({handlers:new Map([[Zd,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[Zd]}}),o=new AbortController().signal,i=h=>({id:"eval-run-probe",name:Zd,input:h,signal:o}),s={probe:"byte-identical-input"},a=[];for(let h=0;h<e-1;h++)a.push(await r.execute(i(s)));let l=t,c=await r.execute(i(s)),d=t,u=await r.execute(i({probe:"a-different-input"})),m=a.every(h=>h.isError!==!0&&h.circuitBreaker!==!0),f=[ke({name:"executes-below-threshold",description:`First ${e-1} byte-identical calls execute without tripping`,pass:m&&l===e-1,expected:`${e-1} clean executions; handler runs ${e-1}\xD7`,actual:`${a.filter(h=>h.isError!==!0).length} clean; handler ran ${l}\xD7`}),ke({name:"trips-at-threshold",description:`Call #${e} is short-circuited with isError + circuitBreaker, handler skipped`,pass:c.isError===!0&&c.circuitBreaker===!0&&d===l,expected:"isError=true, circuitBreaker=true, handler not re-run",actual:`isError=${c.isError??!1}, circuitBreaker=${c.circuitBreaker??!1}, handler ran ${d}\xD7`}),ke({name:"breaker-message-is-actionable",description:"The synthetic block names the looping tool and reads as a stop nudge",pass:/circuit breaker/i.test(c.content)&&c.content.includes(Zd),expected:`mentions "circuit breaker" and the tool name "${Zd}"`,actual:c.content}),ke({name:"resets-on-different-input",description:"A different-input call after a trip resets the consecutive counter and executes",pass:u.isError!==!0&&u.circuitBreaker!==!0&&t===d+1,expected:"executes (no breaker), handler runs once more",actual:`isError=${u.isError??!1}, circuitBreaker=${u.circuitBreaker??!1}, handler ran ${t}\xD7`})],g=[{kind:"config-value",ref:"src/agent/tools/dispatcher.ts#REPEAT_CIRCUIT_BREAKER_THRESHOLD",detail:String(e)},{kind:"observed-behavior",ref:"SessionToolDispatcher.execute",detail:`handler ran ${d}\xD7 across ${e} byte-identical calls; call #${e} short-circuited (circuitBreaker=${c.circuitBreaker??!1})`}];return{checks:f,evidence:g}}async function rme(){let n=Pm(3,3);return{checks:[ke({name:"refusal-states-depth",description:"Refusal reports the depth that was hit and the max",pass:n.includes("nesting depth 3 (max 3)"),expected:'mentions "nesting depth 3 (max 3)"',actual:n}),ke({name:"recovery-hint-present",description:"Refusal carries the recovery hint clause",pass:n.includes(Xs),expected:"contains SKILL_MAX_DEPTH_RECOVERY_HINT",actual:n}),ke({name:"hint-directs-inline-work",description:"Hint tells the model to work inline instead of delegating further",pass:/perform the work inline/i.test(Xs)&&/skill\/agent\/compose/i.test(Xs),expected:'hint mentions "perform the work inline" and "skill/agent/compose"',actual:Xs})],evidence:[{kind:"source-symbol",ref:"src/agent/tools/skill-depth-message.ts#buildSkillMaxDepthRefusal",detail:n},{kind:"source-symbol",ref:"src/agent/tools/skill-executor.ts (execute: depth >= maxDepth branch)",detail:"returns buildSkillMaxDepthRefusal(depth, maxDepth)"}]}}var rs="tool-failure-density",On="flaky_tool",xl="refusal_only_tool",Rl="tool-failure-flaky-tool",ome="tool-failure-refusal-only-tool";async function ime(){let e=NH(),t=kl(),n=[ke({name:"in-default-enabled-set",description:`${rs} runs in a default scan`,pass:e.includes(rs),expected:`defaultEnabledDetectorNames() includes "${rs}"`,actual:`[${e.join(", ")}]`}),ke({name:"not-opt-in",description:`${rs} is not in the disabled-by-default set`,pass:!t.includes(rs),expected:`disabledByDefaultDetectorNames() excludes "${rs}"`,actual:`[${t.join(", ")}]`})],r=[{kind:"config-value",ref:"DETECTOR_REGISTRY['tool-failure-density'].enabledByDefault",detail:String(e.includes(rs))}];return{checks:n,evidence:r}}function pt(e,t,n){let r={phase:"completed",toolUseId:`tu-${e}`,name:t,resultBytes:128,isError:n.isError,truncated:!1,durationMs:10};return n.circuitBreaker===!0&&(r.circuitBreaker=!0),n.failureClass!==void 0&&(r.failureClass=n.failureClass),JSON.stringify({ts:"2026-06-20T10:00:00.000Z",seq:e,kind:"tool_call",payload:r})}function PT(e,t){let n=`state/witness/${e}/trace.jsonl`;return Sl({sessionId:e,tracePath:n,relativeTracePath:n,content:t.join(`
1960
+ `,{flag:"a"})}catch{}}function Zpe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sy(n,JSON.stringify(t,null,2)),_T(n,e)}function eme(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sy(n,t),_T(n,e)}function tme(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sy(n,t),_T(n,e)}import{randomBytes as Sme}from"crypto";import{existsSync as FT,mkdirSync as $W,readFileSync as vme,readdirSync as snt,renameSync as DW,writeFileSync as LT}from"fs";import{join as kme}from"path";G();ac();AS();kf();var kW=400;function Qt(e){let n=(typeof e=="string"?e:String(e)).replace(/\s+/g," ").trim();return n.length>kW?n.slice(0,kW-1)+"\u2026":n}function ke(e){return{name:e.name,description:e.description,status:e.status??(e.pass?"pass":"fail"),expected:Qt(e.expected),actual:Qt(e.actual)}}var Zd="eval_run_probe_tool";async function nme(){let e=$s,t=0,n=async()=>(t+=1,{content:"probe-ok"}),r=new Wt({handlers:new Map([[Zd,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[Zd]}}),o=new AbortController().signal,i=h=>({id:"eval-run-probe",name:Zd,input:h,signal:o}),s={probe:"byte-identical-input"},a=[];for(let h=0;h<e-1;h++)a.push(await r.execute(i(s)));let l=t,c=await r.execute(i(s)),d=t,u=await r.execute(i({probe:"a-different-input"})),m=a.every(h=>h.isError!==!0&&h.circuitBreaker!==!0),f=[ke({name:"executes-below-threshold",description:`First ${e-1} byte-identical calls execute without tripping`,pass:m&&l===e-1,expected:`${e-1} clean executions; handler runs ${e-1}\xD7`,actual:`${a.filter(h=>h.isError!==!0).length} clean; handler ran ${l}\xD7`}),ke({name:"trips-at-threshold",description:`Call #${e} is short-circuited with isError + circuitBreaker, handler skipped`,pass:c.isError===!0&&c.circuitBreaker===!0&&d===l,expected:"isError=true, circuitBreaker=true, handler not re-run",actual:`isError=${c.isError??!1}, circuitBreaker=${c.circuitBreaker??!1}, handler ran ${d}\xD7`}),ke({name:"breaker-message-is-actionable",description:"The synthetic block names the looping tool and reads as a stop nudge",pass:/circuit breaker/i.test(c.content)&&c.content.includes(Zd),expected:`mentions "circuit breaker" and the tool name "${Zd}"`,actual:c.content}),ke({name:"resets-on-different-input",description:"A different-input call after a trip resets the consecutive counter and executes",pass:u.isError!==!0&&u.circuitBreaker!==!0&&t===d+1,expected:"executes (no breaker), handler runs once more",actual:`isError=${u.isError??!1}, circuitBreaker=${u.circuitBreaker??!1}, handler ran ${t}\xD7`})],g=[{kind:"config-value",ref:"src/agent/tools/dispatcher.ts#REPEAT_CIRCUIT_BREAKER_THRESHOLD",detail:String(e)},{kind:"observed-behavior",ref:"SessionToolDispatcher.execute",detail:`handler ran ${d}\xD7 across ${e} byte-identical calls; call #${e} short-circuited (circuitBreaker=${c.circuitBreaker??!1})`}];return{checks:f,evidence:g}}async function rme(){let n=Pm(3,3);return{checks:[ke({name:"refusal-states-depth",description:"Refusal reports the depth that was hit and the max",pass:n.includes("nesting depth 3 (max 3)"),expected:'mentions "nesting depth 3 (max 3)"',actual:n}),ke({name:"recovery-hint-present",description:"Refusal carries the recovery hint clause",pass:n.includes(Xs),expected:"contains SKILL_MAX_DEPTH_RECOVERY_HINT",actual:n}),ke({name:"hint-directs-inline-work",description:"Hint tells the model to work inline instead of delegating further",pass:/perform the work inline/i.test(Xs)&&/skill\/agent\/compose/i.test(Xs),expected:'hint mentions "perform the work inline" and "skill/agent/compose"',actual:Xs})],evidence:[{kind:"source-symbol",ref:"src/agent/tools/skill-depth-message.ts#buildSkillMaxDepthRefusal",detail:n},{kind:"source-symbol",ref:"src/agent/tools/skill-executor.ts (execute: depth >= maxDepth branch)",detail:"returns buildSkillMaxDepthRefusal(depth, maxDepth)"}]}}var rs="tool-failure-density",On="flaky_tool",xl="refusal_only_tool",Rl="tool-failure-flaky-tool",ome="tool-failure-refusal-only-tool";async function ime(){let e=NH(),t=kl(),n=[ke({name:"in-default-enabled-set",description:`${rs} runs in a default scan`,pass:e.includes(rs),expected:`defaultEnabledDetectorNames() includes "${rs}"`,actual:`[${e.join(", ")}]`}),ke({name:"not-opt-in",description:`${rs} is not in the disabled-by-default set`,pass:!t.includes(rs),expected:`disabledByDefaultDetectorNames() excludes "${rs}"`,actual:`[${t.join(", ")}]`})],r=[{kind:"config-value",ref:"DETECTOR_REGISTRY['tool-failure-density'].enabledByDefault",detail:String(e.includes(rs))}];return{checks:n,evidence:r}}function pt(e,t,n){let r={phase:"completed",toolUseId:`tu-${e}`,name:t,resultBytes:128,isError:n.isError,truncated:!1,durationMs:10};return n.circuitBreaker===!0&&(r.circuitBreaker=!0),n.failureClass!==void 0&&(r.failureClass=n.failureClass),JSON.stringify({ts:"2026-06-20T10:00:00.000Z",seq:e,kind:"tool_call",payload:r})}function PT(e,t){let n=`state/witness/${e}/trace.jsonl`;return Sl({sessionId:e,tracePath:n,relativeTracePath:n,content:t.join(`
1961
1961
  `)+`
1962
1962
  `,sessionMtimeMs:0})}function sme(){let e=PT("tfd-sess-a",[pt(0,On,{isError:!1}),pt(1,On,{isError:!0,failureClass:"timeout"}),pt(2,On,{isError:!0}),pt(3,On,{isError:!0,failureClass:"policy-refusal"}),pt(4,On,{isError:!0,circuitBreaker:!0})]),t=PT("tfd-sess-b",[pt(0,On,{isError:!0}),pt(1,On,{isError:!1}),pt(2,On,{isError:!0,failureClass:"permission-denied"}),pt(3,On,{isError:!0,failureClass:"abort"}),pt(4,On,{isError:!0,failureClass:"hook-block"}),pt(5,On,{isError:!0,failureClass:"elicitation-declined"})]),n=PT("tfd-sess-c",[pt(0,xl,{isError:!1}),pt(1,xl,{isError:!0,failureClass:"policy-refusal"}),pt(2,xl,{isError:!0,failureClass:"policy-refusal"}),pt(3,xl,{isError:!0,failureClass:"permission-denied"}),pt(4,xl,{isError:!0,failureClass:"hook-block"}),pt(5,xl,{isError:!0,failureClass:"abort"})]);return[e,t,n]}function Ey(e,t){let n=e[t];return typeof n=="number"?n:void 0}function MT(e){let t={};if(e===null||typeof e!="object")return t;for(let[n,r]of Object.entries(e))typeof r=="number"&&(t[n]=r);return t}function EW(e,t){let n=MT(e),r=Object.keys(n),o=Object.keys(t);if(r.length!==o.length)return!1;for(let i of o)if(n[i]!==t[i])return!1;return!0}function ame(e){return Array.isArray(e)?e.filter(t=>typeof t=="number"):[]}function lme(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function cme(){let e=sme(),t=vl(e,{}),n=t.find(E=>E.slug===Rl),r=t.find(E=>E.slug===ome),o=n?.detail??{},i=Ey(o,"failureCount"),s=Ey(o,"totalCalls"),a=Ey(o,"failureRate"),l=Ey(o,"affectedSessionCount"),c=MT(o.failureClassBreakdown),d=MT(o.excludedByClass),u=lme(o.sessionIds).slice().sort(),m=ame(o.seqs),f=vl(e,{minFailures:4}),g=vl(e,{minFailureRate:.7}),h=!f.some(E=>E.slug===Rl),y=!g.some(E=>E.slug===Rl),b={"policy-refusal":1,"permission-denied":1,abort:1,"hook-block":1,"elicitation-declined":1},w={timeout:1,unclassified:2},S=[ke({name:"classification-fires-on-dual-threshold",description:"A tool clearing BOTH the failure-count and failure-rate floors yields exactly one card at the recorded magnitude",pass:t.length===1&&n!==void 0&&i===3&&s===5&&a===.6,expected:`1 card '${Rl}' with failureCount=3, totalCalls=5, failureRate=0.6`,actual:n===void 0?`no '${Rl}' card; ${t.length} card(s): [${t.map(E=>E.slug).join(", ")}]`:`${t.length} card(s); failureCount=${i}, totalCalls=${s}, failureRate=${a}`}),ke({name:"classification-excludes-system-said-no-classes",description:"policy-refusal / permission-denied / hook-block / abort / elicitation-declined are excluded from BOTH numerator and denominator and never manufacture a card alone",pass:EW(d,b)&&i===3&&s===5&&r===void 0,expected:"excludedByClass={policy-refusal:1,permission-denied:1,abort:1,hook-block:1,elicitation-declined:1}; counts not inflated; refusal-only tool yields NO card",actual:`excludedByClass=${JSON.stringify(d)}; failureCount=${i}, totalCalls=${s}; refusal_only_tool card ${r===void 0?"absent":"PRESENT"}`}),ke({name:"classification-excludes-circuit-breaker",description:"A circuitBreaker-synthesised completion is skipped before classification \u2014 it inflates neither totalCalls nor the unclassified count, and never lands in excludedByClass",pass:s===5&&c.unclassified===2&&d.circuitBreaker===void 0,expected:"totalCalls=5 (breaker not counted); unclassified=2 (breaker not folded in); no circuitBreaker key in excludedByClass",actual:`totalCalls=${s}; unclassified=${c.unclassified??0}; excludedByClass keys=[${Object.keys(d).join(", ")}]`}),ke({name:"classification-counts-timeout-and-unclassified",description:"timeout and unclassified (no failureClass) failures DO count toward the failure stats",pass:EW(c,w),expected:"failureClassBreakdown={timeout:1,unclassified:2}",actual:`failureClassBreakdown=${JSON.stringify(c)}`}),ke({name:"classification-respects-thresholds",description:"The card drops out when EITHER the count floor or the rate floor is raised above the recorded magnitude (dual AND threshold)",pass:h&&y,expected:"minFailures=4 \u2192 no card (count gate); minFailureRate=0.7 \u2192 no card (rate gate)",actual:`count gate ${h?"held":"LEAKED"}; rate gate ${y?"held":"LEAKED"}`}),ke({name:"classification-reports-affected-sessions-and-seqs",description:"The card reports the distinct affected sessions and per-failure seqs in deterministic order",pass:l===2&&JSON.stringify(u)===JSON.stringify(["tfd-sess-a","tfd-sess-b"])&&JSON.stringify(m)===JSON.stringify([1,2,0]),expected:"affectedSessionCount=2; sessionIds=[tfd-sess-a,tfd-sess-b]; seqs=[1,2,0]",actual:`affectedSessionCount=${l}; sessionIds=[${u.join(",")}]; seqs=[${m.join(",")}]`})],v=[{kind:"source-symbol",ref:"src/improve/scan/detectors/tool-failure-density.ts#detectToolFailureDensity",detail:n===void 0?`synthetic corpus \u2192 ${t.length} card(s); '${Rl}' absent`:`synthetic corpus \u2192 flaky_tool ${i}/${s} (rate ${a}); breakdown ${JSON.stringify(c)}`},{kind:"observed-behavior",ref:"detectToolFailureDensity (EXCLUDED_FAILURE_CLASSES + circuitBreaker exclusion)",detail:`excludedByClass=${JSON.stringify(d)}; refusal_only_tool card ${r===void 0?"absent":"PRESENT"}`}];return{checks:S,evidence:v}}async function dme(){let e=await ime(),t=cme();return{checks:[...e.checks,...t.checks],evidence:[...e.evidence,...t.evidence]}}async function ume(){let e=ki("abort"),t=ki("model_end_turn"),n=[ke({name:"abort-closure-has-guidance",description:"An abort closure maps to a non-empty recovery hint",pass:typeof e=="string"&&e.trim().length>0,expected:"non-empty guidance string for reason=abort",actual:e===null?"null (no guidance)":Qt(e)}),ke({name:"guidance-names-a-recovery-action",description:"The abort hint names a concrete next action (resume / re-run)",pass:e!==null&&/\b(resume|re-run|rerun|retry)\b/i.test(e),expected:"hint mentions resume / re-run",actual:e===null?"null":Qt(e)}),ke({name:"guidance-is-the-canonical-constant",description:"The wired hint is the exported CLOSURE_ABORT_RECOVERY_HINT (no drift)",pass:e===Av,expected:'buildClosureGuidance("abort") === CLOSURE_ABORT_RECOVERY_HINT',actual:e===null?"null":Qt(e)}),ke({name:"benign-closure-has-no-guidance",description:"A clean model_end_turn close carries no false-positive guidance",pass:t===null,expected:"null for reason=model_end_turn",actual:t===null?"null":Qt(t)})],r=[{kind:"source-symbol",ref:"src/agent/session/closure-guidance.ts#buildClosureGuidance",detail:e===null?"null":Qt(e)},{kind:"source-symbol",ref:"src/agent/session/agent-session.ts (emitClosure: attaches guidance to closure event)",detail:"buildClosureGuidance(reason) \u2192 closure payload .guidance"}];return{checks:n,evidence:r}}var OT=Object.freeze([{id:"repeat-loop-circuit-breaker",patternId:"repeated-tool-use",title:"Repeat-loop circuit breaker trips at the consecutive-identical threshold",run:nme},{id:"skill-max-depth-recovery-hint",patternId:"subagent-block",title:"Skill max-depth refusal carries an actionable recovery hint",run:rme},{id:"tool-failure-density-enabled",patternId:"tool-failure-density",title:"tool-failure-density detector is enabled by default and classifies a known failure mix correctly",run:dme},{id:"closure-abort-recovery-hint",patternId:"closure-anomaly",title:"Anomalous abort closure carries an actionable recovery hint",run:ume}]);function TW(e){return OT.find(t=>t.patternId===e)}function xW(){return OT.map(e=>e.patternId)}function RW(){return OT.map(e=>e.id)}ac();kf();var xy="replay:",CW=`${xy}fixture-reproduces-pattern`,PW=`${xy}guardrail-neutralizes-recorded-loop`,AW=`${xy}fixture-reproduces-closure-anomaly`,MW=`${xy}guardrail-guides-recorded-closure`,_W="The committed fixture still reproduces the recorded repeated-tool-use loop when re-scanned by the detector",pme=Object.freeze({replay:"byte-identical-input"}),mme=async(e,t)=>{let n=async()=>({content:"replay-probe-ok"}),r=new Wt({handlers:new Map([[e,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[e]}}),o=new AbortController().signal,i=null,s=0;for(let a=1;a<=t;a++){let l={id:`replay-${a}`,name:e,input:pme,signal:o},c=await r.execute(l);if(s=a,c.circuitBreaker===!0){i=a;break}}return{trippedAtCall:i,callsDriven:s}};function Ty(e){let t=e.detail.runLength;return typeof t=="number"?t:0}async function fme(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=Sl({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=ly([s],{minRepeats:Hr}),l=e.provenance.fingerprintAtGeneration,c=l?a.find(w=>w.detail.fingerprint===l):void 0,d=[...a].sort((w,S)=>Ty(S)-Ty(w))[0],u=c??d;if(u===void 0)return r.push(ke({name:CW,description:_W,pass:!1,status:"skipped",expected:l?`detector finds a run with fingerprint ${l.slice(0,12)}\u2026`:"detector finds \u22651 repeated-tool-use run in the fixture",actual:`detector found ${a.length} run(s); none matched \u2014 replay skipped (eval-case may be stale or misgenerated)`})),o.push({kind:"fixture",ref:e.replay.fixturePath,detail:"fixture did not reproduce the repeated-tool-use pattern; replay skipped (no loop to re-drive)"}),{checks:r,evidence:o};r.push(ke({name:CW,description:_W,pass:!0,expected:l?`detector finds a run with fingerprint ${l.slice(0,12)}\u2026`:"detector finds \u22651 repeated-tool-use run in the fixture",actual:`found '${String(u.detail.toolName)}' \xD7${Ty(u)}`}));let m=String(u.detail.toolName),f=Ty(u),g=n.driveLoop??mme,h=Math.min(f,$s),y=await g(m,h),b=y.trippedAtCall!==null&&y.trippedAtCall<=f;return r.push(ke({name:PW,description:"Re-driving the recorded loop through the live guardrail trips the circuit breaker at or before the recorded length",pass:b,expected:`circuit breaker trips at call \u2264 ${f} (recorded run length)`,actual:y.trippedAtCall===null?`no trip within ${y.callsDriven} call(s) \u2014 recorded loop of ${f} would still complete`:`tripped at call ${y.trippedAtCall}`})),o.push({kind:"observed-behavior",ref:"SessionToolDispatcher.execute (repeat-loop circuit breaker)",detail:`'${m}' recorded \xD7${f}; live breaker ${y.trippedAtCall===null?"did NOT trip":`tripped at call ${y.trippedAtCall}`} (threshold ${$s})`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded loop on '${m}' (run length ${f})`}),{checks:r,evidence:o}}function gme(e){let t=e.detail.closureReason;return typeof t=="string"?t:null}function hme(e){let t=e.detail.seqs;return Array.isArray(t)?t.filter(n=>typeof n=="number"):[]}var IW="The committed fixture still reproduces the recorded anomalous closure when re-scanned by the detector";async function yme(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=Sl({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=cy([s],{minOccurrences:1}),l=Math.max(...e.replay.evidenceEventIndices),d=a.find(h=>hme(h).includes(l))??a[0];if(d===void 0)return r.push(ke({name:AW,description:IW,pass:!1,status:"skipped",expected:"detector finds \u22651 anomalous closure in the fixture",actual:`detector found ${a.length} closure-anomaly finding(s); none matched \u2014 replay skipped (eval-case may be stale or misgenerated)`})),o.push({kind:"fixture",ref:e.replay.fixturePath,detail:"fixture did not reproduce an anomalous closure; replay skipped (no closure to re-drive)"}),{checks:r,evidence:o};let u=gme(d)??"";r.push(ke({name:AW,description:IW,pass:!0,expected:"detector finds \u22651 anomalous closure in the fixture",actual:`found closure.reason='${u}' (seq ${l})`}));let f=(n.buildGuidance??ki)(u),g=f!==null&&f.trim().length>0;return r.push(ke({name:MW,description:"Re-driving the recorded closure reason through the live guardrail yields actionable recovery guidance",pass:g,expected:`buildClosureGuidance('${u}') returns a non-empty recovery hint`,actual:g?Qt(f):`no guidance for reason '${u}' \u2014 the recorded closure anomaly would still surface with no recovery path`})),o.push({kind:"observed-behavior",ref:"buildClosureGuidance (closure-anomaly recovery hint)",detail:`closure.reason='${u}'; live guardrail ${g?"returned a recovery hint":"returned no guidance"}`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded closure reason '${u}'`}),{checks:r,evidence:o}}var bme=Object.freeze([{patternId:"repeated-tool-use",run:fme},{patternId:"closure-anomaly",run:yme}]),wme=[PW,MW];function $T(e){return wme.includes(e)}function OW(e){return bme.find(t=>t.patternId===e)}var Eme="eval-run@v1";function FW(e,t={}){let n=(t.now??(()=>new Date))(),r=Tme(n),o=t.randomSuffix!==void 0?t.randomSuffix():Sme(3).toString("hex");if(!/^[0-9a-f]{6}$/.test(o))throw new Error(`generateEvalRunId: randomSuffix must be 6 lowercase hex chars (got '${o}')`);return`${e}-run-${r}-${o}`}function Tme(e){let t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0");return`${t}${n}${r}`}async function LW(e,t){let r=(t.now??(()=>new Date))().toISOString(),o=t.clockMs??(()=>Date.now()),i=o(),s=[],a=[],l=[],c=Rme(e,t);s.push(c.check),c.evidence&&a.push(c.evidence);let d=TW(e.assertion.patternId),u=null,m=!1;if(!d)l.push({at:r,text:`No deterministic validation contract is registered for pattern '${e.assertion.patternId}'. Supported: ${xW().join(", ")}.`});else{u=d.id;try{let v=await d.run();s.push(...v.checks),a.push(...v.evidence)}catch(v){m=!0;let E=v instanceof Error?v.message:String(v);l.push({at:r,text:`Contract '${d.id}' threw during execution: ${Qt(E)}`})}}let f=OW(e.assertion.patternId),g=!1;if(f&&c.bytes!==void 0&&c.check.status==="pass")try{let v=await f.run(e,c.bytes,{...t.driveLoop?{driveLoop:t.driveLoop}:{}});s.push(...v.checks),a.push(...v.evidence),g=!0}catch(v){m=!0;let E=v instanceof Error?v.message:String(v);l.push({at:r,text:`Fixture-replay for '${e.assertion.patternId}' threw during execution: ${Qt(E)}`})}let h=s.some(v=>$T(v.name)),y=f!==void 0&&c.check.status==="pass"&&g&&!h,b=xme({hasContract:d!==void 0||g,contractThrew:m,checks:s,replayInconclusive:y}),w=Math.max(0,Math.round(o()-i)),S={schemaVersion:1,evalRunId:t.evalRunId,evalCaseId:e.evalCaseId,cardSlug:e.cardSlug,patternId:e.assertion.patternId,contract:u,status:b,createdAt:r,durationMs:w,checks:s,evidence:a,runner:{version:Eme,mode:"deterministic"},notes:l};return xT.parse(S),S}function xme(e){return e.contractThrew?"error":e.checks.some(t=>t.status==="fail")?"fail":!e.hasContract||e.replayInconclusive===!0?"unsupported":"pass"}function Rme(e,t){let r=(t.resolveFixtureAbsPath??(d=>kme(Ce(),d)))(e.replay.fixturePath),o=e.replay.sliceSha256,i="fixture-integrity",s="Committed replay fixture exists and matches the eval-case's recorded sha256";if(!FT(r))return{check:ke({name:i,description:s,pass:!1,expected:`fixture present at ${e.replay.fixturePath}`,actual:"fixture file not found on disk"})};let a;try{a=vme(r)}catch(d){let u=d instanceof Error?d.message:String(d);return{check:ke({name:i,description:s,pass:!1,expected:`readable fixture (${o})`,actual:`read error: ${Qt(u)}`})}}let l=by(a),c=l===o;return{check:ke({name:i,description:s,pass:c,expected:o,actual:l}),evidence:{kind:"fixture",ref:e.replay.fixturePath,detail:`sha256 ${c?"match":"MISMATCH"} (${e.replay.sliceLineCount} lines)`},bytes:a}}function NW(e){let t=xT.parse(e),n=wl();FT(n)||$W(n,{recursive:!0});let r=IH(t.evalRunId),o=PH(t.evalRunId);return Ime(r,t),Pme(o,NT(t)),_me({timestamp:new Date().toISOString(),event:"created",evalRunId:t.evalRunId,evalCaseId:t.evalCaseId,cardSlug:t.cardSlug,patternId:t.patternId,contract:t.contract,status:t.status}),{evalRunId:t.evalRunId,jsonPath:r,markdownPath:o}}var Cme={pass:"\u2713 PASS",fail:"\u2717 FAIL",unsupported:"\u2013 UNSUPPORTED",error:"\u26A0 ERROR"},Ame={pass:"\u2713",fail:"\u2717",skipped:"\u2013"};function NT(e){let t=e.checks.filter(s=>s.status==="pass").length,n=e.checks.filter(s=>s.status==="fail").length,r=e.checks.filter(s=>s.status==="skipped").length,o=[];if(o.push(`# ${e.evalRunId} \u2014 \`eval-run\` \u2014 \`${e.status}\``),o.push(""),o.push(`Deterministic guardrail validation of eval-case \`${e.evalCaseId}\`.`),o.push(""),o.push(`**Eval-case:** \`${e.evalCaseId}\` \xB7 **Card:** \`${e.cardSlug}\` \xB7 **Pattern:** \`${e.patternId}\` \xB7 **Contract:** ${e.contract?`\`${e.contract}\``:"_(none)_"} \xB7 **Created:** ${e.createdAt} \xB7 **Duration:** ${e.durationMs}ms`),o.push(""),e.checks.some(s=>$T(s.name))?(o.push("> **What this is.** A deterministic validation of pattern"),o.push(`> \`${e.patternId}\`. It re-drove the failure recorded in the committed`),o.push("> fixture through the LIVE guardrail and asserts the recorded failure is"),o.push("> neutralised at the recorded magnitude \u2014 proving the behaviour is fixed,"),o.push("> not merely that a guardrail exists. It re-drives the recorded failure"),o.push("> conditions; it does NOT re-execute the original tool/LLM.")):(o.push("> **What this is.** A narrow, deterministic check that the guardrail"),o.push(`> mapped to pattern \`${e.patternId}\` is present and behaving. It`),o.push("> validates the guardrail the pattern maps to; the eval-case's own"),o.push("> `pattern-absent` assertion remains the full contract.")),o.push(""),o.push(`## Result: ${Cme[e.status]} (${t}/${e.checks.length} checks passed${n?`, ${n} failed`:""}${r?`, ${r} skipped`:""})`),o.push(""),o.push("## Checks"),o.push(""),e.checks.length===0)o.push("_(none)_");else{o.push("| Check | Status | Expected | Actual |"),o.push("|---|---|---|---|");for(let s of e.checks)o.push(`| ${DT(s.name)} | ${Ame[s.status]} ${s.status} | ${DT(s.expected)} | ${DT(s.actual)} |`)}if(o.push(""),o.push("## Evidence"),o.push(""),e.evidence.length===0)o.push("_(none)_");else for(let s of e.evidence)o.push(`- **[${s.kind}]** \`${s.ref}\` \u2014 ${s.detail}`);if(o.push(""),o.push("## Runner"),o.push(""),o.push(`- **Version:** \`${e.runner.version}\` \xB7 **Mode:** \`${e.runner.mode}\``),o.push(""),o.push("## Notes"),o.push(""),e.notes.length===0)o.push("_(none)_");else for(let s of e.notes)o.push(`- _${s.at}_ \u2014 ${s.text}`);return o.push(""),o.join(`
1963
1963
  `)}function DT(e){return e.replace(/\|/g,"\\|").replace(/\n/g," ")}function _me(e){let t=KH.parse(e),n=wl();FT(n)||$W(n,{recursive:!0});try{LT(_H(),JSON.stringify(t)+`