agent-afk 5.93.1 → 5.93.3
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 +13 -13
- package/dist/index.mjs +1 -1
- package/dist/telegram.mjs +1 -1
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -891,7 +891,7 @@ Retrying it verbatim will fail the same way. Fix the underlying cause, change th
|
|
|
891
891
|
|
|
892
892
|
`).trim()}function I9(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function MM(e,t){let{JSDOM:n,Readability:r,turndown:o}=await _9(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let p=s.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=PM(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:p,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=PM(o.turndown(d));return{title:a,markdown:u,textLength:I9(c),usedFallback:!0}}var Gv,OM=T(()=>{"use strict";Gv=null});function M9(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 $M(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function O9(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 DM(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??M9,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(!P9.has(u.status)||d===o)return u;let p=O9(u,s)??$M(d,i,s);B("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=$M(d,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var P9,FM=T(()=>{"use strict";ue();P9=new Set([429,502,503,504])});import{BlockList as $9,isIP as zv}from"node:net";import{lookup as D9}from"node:dns/promises";import{Agent as F9}from"undici";function NM(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function U9(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function qv(e){let t=zv(e);return t===0?!1:B9.check(e,t===4?"ipv4":"ipv6")}async function BM(e){return D9(e,{all:!0,verbatim:!0})}async function Jv(e,t={}){if(t.allowPrivateHosts??NM())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=U9(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(zv(r)!==0)return qv(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??BM,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(qv(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function id(e,t={}){let n=await Jv(e,t);if(!n.allowed)throw new In(n.reason)}async function Qm(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=LM;s++){await id(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??NM())?{dispatcher:j9}:{}},l=await DM(e,i,a,r.retry??{});if(!H9.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let d;try{d=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=d}throw new In(`too many redirects (>${LM}) starting from ${t}`)}var L9,N9,B9,In,j9,LM,H9,Yv=T(()=>{"use strict";K();FM();L9=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],N9=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],B9=(()=>{let e=new $9;for(let[t,n]of L9)e.addSubnet(t,n,"ipv4");for(let[t,n]of N9)e.addSubnet(t,n,"ipv6");return e})(),In=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};j9=new F9({connect:{lookup(e,t,n){BM(e).then(r=>{let o=r.find(s=>qv(s.address));if(o!==void 0){n(new In(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,zv(i.address))},r=>n(r,"",0))}}});LM=20,H9=new Set([301,302,303,307,308])});import{readFileSync as W9}from"node:fs";import{join as K9}from"path";function G9(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function UM(e,t){return G9(t).test(e)}function J9(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(q9.has(t))return!0;if(z9.has(t))return!1}return!1}function jM(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Y9(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 HM(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Sc(t),t}function V9(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function X9(e){try{return W9(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Q9(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=HM(t.defaultProfile)),n}function WM(e){let t=e?.env??k,n=e?.readFileSync??X9,r=e?.surface??t.AGENT_SURFACE,o=J9(t.AFK_BROWSER_HEADLESS,r),i=jM(t.AFK_BROWSER_ALLOWED_DOMAINS),s=jM(t.AFK_BROWSER_BLOCKED_DOMAINS),a=V9(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Y9(t.AFK_BROWSER_BACKEND),c=HM(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,p=u!==void 0&&u.trim()!==""?u.trim():K9(Tn(),"browser.json"),f=n(p);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Q9(d,g);return h.configPath=p,h}function Zm(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(UM(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>UM(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var q9,z9,ef=T(()=>{"use strict";K();q();q9=new Set(["daemon","subagent","telegram","afk"]),z9=new Set(["repl","interactive","cli"])});import{existsSync as Z9,readFileSync as e7}from"node:fs";import{createRequire as t7}from"node:module";import{dirname as n7,join as r7}from"node:path";function qM(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<i7&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function Ft(e){let t=qM(e);return GM.some(n=>t.includes(n))}function s7(){try{let t=t7(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(e7(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=r7(n7(t),o);return Z9(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function sd(){return KM??=s7()??o7,KM}function Vv(e){return e.includes("install chromium")}function an(e,t){let n=qM(e),r=t?.latched===!0?` ${a7}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${sd()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${sd()}). Or pick a different tool.${r}`}function ad(e,t,n=!1){if(!Ft(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
893
893
|
|
|
894
|
-
${an(e,{headless:t,latched:n})}`,{cause:e})}var GM,o7,i7,KM,a7,tf=T(()=>{"use strict";GM=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],o7="pnpm exec playwright install chromium",i7=4;a7="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Ci from"node:fs";import nf from"node:path";import{randomBytes as l7}from"node:crypto";import{chromium as c7}from"playwright";function d7(){try{return"5.93.1"}catch{}try{let e=nf.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 u7,rf,zM=T(()=>{"use strict";tf();q();ue();u7=d7(),rf=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=c7.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=ad(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${u7}`}}loadStorageState(t){let n=vc(t);try{if(!Ci.existsSync(n))return;let r=JSON.parse(Ci.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=vc(t);if(!Ci.existsSync(r))return;let o=await n.storageState(),i=nf.join(nf.dirname(r),`.${nf.basename(r)}.${process.pid}.${l7(4).toString("hex")}.tmp`);Ci.writeFileSync(i,JSON.stringify(o),{mode:384}),Ci.chmodSync(i,384),Ci.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as p7}from"crypto";function JM(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&m7.test(e.label))}function YM(e){return p7("sha256").update(e,"utf8").digest("hex").slice(0,8)}function VM(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var m7,of=T(()=>{"use strict";m7=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as f7}from"node:crypto";function g7(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function h7(e,t,n){return`el_${f7("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function y7(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function XM(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function ZM(e,t){let n=e.role??"",r=e.name??"";QM.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])ZM(i,t)}async function b7(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},e0).catch(()=>[])}async function w7(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,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},e0).catch(()=>[])}function S7(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function sf(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=S7(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=b7(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],ZM(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await w7(e)).filter($=>QM.has($.role??"")));let w=new Map;for(let C of p){let $=XM(C.name),U=w.get($);(!U||U.bbox.w===0&&C.bbox.w>0)&&w.set($,C)}let S=y.map(C=>({ax:C,dom:w.get(XM(C.name??""))})),v=r?S:S.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);v.sort((C,$)=>{let U=C.dom?.bbox.y??0,N=$.dom?.bbox.y??0;if(U!==N)return U-N;let H=C.dom?.bbox.x??0,G=$.dom?.bbox.x??0;return H-G}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=v.slice(0,n).map((C,$)=>{let U=C.ax.role??"generic",N=C.ax.name??"",H=h7(U,N,$),G=C.dom?.bbox??{x:0,y:0,w:0,h:0},P=C.dom?.type??null,F=null;C.ax.value!==void 0&&C.ax.value!==null&&(F=String(C.ax.value)),C.ax.checked!==void 0&&(F=String(C.ax.checked)),JM({role:U,kind:P})&&(F="[redacted]");let M={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(M.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(M.selected=C.ax.selected),C.ax.expanded!==void 0&&(M.expanded=C.ax.expanded);let O;C.dom?.testId?O=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(O=`#${C.dom.id}`);let j={id:H,role:U,label:g7(N),kind:P,value:F,state:M,bbox:G};return O!==void 0&&(j.selector=O),j}),D="idle";try{let C=await e.evaluate(()=>document.readyState);C==="loading"?D="loading":C==="interactive"?D="navigating":D="idle"}catch{D="navigating"}D!=="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 I=y7(f),A=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:I,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:D,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var QM,e0,t0=T(()=>{"use strict";of();QM=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);e0="a[href], button, input, select, textarea, [role], [tabindex], label"});async function n0(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 Xv(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>n0(e,i)))).filter(o=>o!==null)}async function v7(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 Qv(e,t,n){switch(t.kind){case"element_id":return k7(e,t,n);case"selector":return T7(e,t);case"semantic":return E7(e,t)}}async function k7(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 Xv(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function T7(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 Xv(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function E7(e,t){return t.role!==void 0?R7(e,t.text,t.role):x7(e,t.text,t)}async function R7(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 Xv(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function x7(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 v7(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 p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await n0(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 r0=T(()=>{"use strict"});async function Zv(e,t,n,r){let o=e.url();if(o===n)return null;let i=Zm(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var o0=T(()=>{"use strict";ef()});import{randomBytes as A7}from"crypto";import{mkdir as C7,stat as _7,writeFile as I7}from"fs/promises";import{join as ek}from"path";import{gzip as P7}from"zlib";import{promisify as M7}from"util";function O7(e){return ek(Sr(e),"browser")}function $7(e){return ek(O7(e),"screenshots")}function D7(){return new Date().toISOString().replace(/[:.]/g,"-")}function F7(){return A7(3).toString("hex")}async function tk(e,t,n){if(t.length>i0)throw new Error(`writeScreenshotSidecar: buffer exceeds ${i0} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=$7(e);await C7(r,{recursive:!0});let o=`${D7()}-${F7()}-${n}.png`,i=ek(r,o);await I7(i,t);let{size:s}=await _7(i);return{path:i,bytes:s}}var v$e,i0,s0=T(()=>{"use strict";q();of();v$e=M7(P7);i0=5*1024*1024});var l0={};gp(l0,{PlaywrightProvider:()=>nk});function a0(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 nk,c0=T(()=>{"use strict";zM();t0();r0();ef();o0();s0();nk=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new rf(t)}async open(t){let n=Zm(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(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await Zv(o,this.config,t.url,()=>this.close({sessionId:r}));if(u!==null)return u}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let d=await sf(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,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}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 sf(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 Qv(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${a0(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":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=await Zv(r,this.config,i,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await sf(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await Qv(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${a0(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 tk(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 tk(n,o,r);return i}catch{return null}}}});var Ii={};gp(Ii,{__resetBrowserRegistryForTests:()=>j7,browserProviderActive:()=>B7,closeBrowserProvider:()=>rk,getBrowserProvider:()=>N7,peekBrowserProvider:()=>U7});function d0(){Promise.resolve(rk()).then(()=>{process.exit(130)})}function u0(){Promise.resolve(rk()).then(()=>{process.exit(143)})}function p0(){rr=null}function L7(){af||(process.on("SIGINT",d0),process.on("SIGTERM",u0),process.on("exit",p0),af=!0)}function m0(){af&&(process.removeListener("SIGINT",d0),process.removeListener("SIGTERM",u0),process.removeListener("exit",p0),af=!1)}async function N7(e){return rr!==null?rr:(_i!==null||(_i=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(c0(),l0)),n=WM(e),r=new t(n);return L7(),rr=r,_i=null,r})()),_i)}async function rk(){if(rr===null)return;let e=rr;rr=null,_i=null,m0(),await e.shutdown()}function B7(){return rr!==null}function U7(){return rr}function j7(){rr=null,_i=null,m0()}var rr,_i,af,Pi=T(()=>{"use strict";ef();rr=null,_i=null,af=!1});async function f0(e,t){try{return await MM(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function z7(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Pi(),Ii));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function g0(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??z7,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s=e,a=null,l=null;try{let d=await Qm(n,e,{headers:q7,signal:t.signal},o);a=d.status,s=d.url||e;let u=d.headers.get("content-type")??"";if(d.ok){if(G7.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if(K7.test(u)&&!W7.test(u))return{title:"",markdown:p.trim(),finalUrl:s,usedRender:!1};if(i=await f0(p,s),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof In||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(i===null||i.textLength<200)&&i!==null)return{title:i.title,markdown:i.markdown,finalUrl:s,usedRender:!1};try{await id(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:p=>id(p,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await id(d.finalUrl,o);let u=await f0(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||u.textLength>=i.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(t.signal.aborted||d instanceof In)throw d;if(i===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${e}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${a??"error"}).`)}var W7,K7,G7,q7,h0=T(()=>{"use strict";OM();Yv();ue();W7=/(text\/html|application\/xhtml\+xml)/i,K7=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,G7=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,q7={"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 V7(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(J7,{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),Y7),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Cr(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 y0(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?V7({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 b0(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
894
|
+
${an(e,{headless:t,latched:n})}`,{cause:e})}var GM,o7,i7,KM,a7,tf=T(()=>{"use strict";GM=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],o7="pnpm exec playwright install chromium",i7=4;a7="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Ci from"node:fs";import nf from"node:path";import{randomBytes as l7}from"node:crypto";import{chromium as c7}from"playwright";function d7(){try{return"5.93.3"}catch{}try{let e=nf.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 u7,rf,zM=T(()=>{"use strict";tf();q();ue();u7=d7(),rf=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=c7.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=ad(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${u7}`}}loadStorageState(t){let n=vc(t);try{if(!Ci.existsSync(n))return;let r=JSON.parse(Ci.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=vc(t);if(!Ci.existsSync(r))return;let o=await n.storageState(),i=nf.join(nf.dirname(r),`.${nf.basename(r)}.${process.pid}.${l7(4).toString("hex")}.tmp`);Ci.writeFileSync(i,JSON.stringify(o),{mode:384}),Ci.chmodSync(i,384),Ci.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as p7}from"crypto";function JM(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&m7.test(e.label))}function YM(e){return p7("sha256").update(e,"utf8").digest("hex").slice(0,8)}function VM(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var m7,of=T(()=>{"use strict";m7=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as f7}from"node:crypto";function g7(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function h7(e,t,n){return`el_${f7("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function y7(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function XM(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function ZM(e,t){let n=e.role??"",r=e.name??"";QM.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])ZM(i,t)}async function b7(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},e0).catch(()=>[])}async function w7(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,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},e0).catch(()=>[])}function S7(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function sf(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=S7(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=b7(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],ZM(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await w7(e)).filter($=>QM.has($.role??"")));let w=new Map;for(let C of p){let $=XM(C.name),U=w.get($);(!U||U.bbox.w===0&&C.bbox.w>0)&&w.set($,C)}let S=y.map(C=>({ax:C,dom:w.get(XM(C.name??""))})),v=r?S:S.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);v.sort((C,$)=>{let U=C.dom?.bbox.y??0,N=$.dom?.bbox.y??0;if(U!==N)return U-N;let H=C.dom?.bbox.x??0,G=$.dom?.bbox.x??0;return H-G}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=v.slice(0,n).map((C,$)=>{let U=C.ax.role??"generic",N=C.ax.name??"",H=h7(U,N,$),G=C.dom?.bbox??{x:0,y:0,w:0,h:0},P=C.dom?.type??null,F=null;C.ax.value!==void 0&&C.ax.value!==null&&(F=String(C.ax.value)),C.ax.checked!==void 0&&(F=String(C.ax.checked)),JM({role:U,kind:P})&&(F="[redacted]");let M={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(M.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(M.selected=C.ax.selected),C.ax.expanded!==void 0&&(M.expanded=C.ax.expanded);let O;C.dom?.testId?O=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(O=`#${C.dom.id}`);let j={id:H,role:U,label:g7(N),kind:P,value:F,state:M,bbox:G};return O!==void 0&&(j.selector=O),j}),D="idle";try{let C=await e.evaluate(()=>document.readyState);C==="loading"?D="loading":C==="interactive"?D="navigating":D="idle"}catch{D="navigating"}D!=="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 I=y7(f),A=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:I,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:D,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var QM,e0,t0=T(()=>{"use strict";of();QM=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);e0="a[href], button, input, select, textarea, [role], [tabindex], label"});async function n0(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 Xv(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>n0(e,i)))).filter(o=>o!==null)}async function v7(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 Qv(e,t,n){switch(t.kind){case"element_id":return k7(e,t,n);case"selector":return T7(e,t);case"semantic":return E7(e,t)}}async function k7(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 Xv(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function T7(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 Xv(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function E7(e,t){return t.role!==void 0?R7(e,t.text,t.role):x7(e,t.text,t)}async function R7(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 Xv(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function x7(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 v7(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 p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await n0(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 r0=T(()=>{"use strict"});async function Zv(e,t,n,r){let o=e.url();if(o===n)return null;let i=Zm(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var o0=T(()=>{"use strict";ef()});import{randomBytes as A7}from"crypto";import{mkdir as C7,stat as _7,writeFile as I7}from"fs/promises";import{join as ek}from"path";import{gzip as P7}from"zlib";import{promisify as M7}from"util";function O7(e){return ek(Sr(e),"browser")}function $7(e){return ek(O7(e),"screenshots")}function D7(){return new Date().toISOString().replace(/[:.]/g,"-")}function F7(){return A7(3).toString("hex")}async function tk(e,t,n){if(t.length>i0)throw new Error(`writeScreenshotSidecar: buffer exceeds ${i0} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=$7(e);await C7(r,{recursive:!0});let o=`${D7()}-${F7()}-${n}.png`,i=ek(r,o);await I7(i,t);let{size:s}=await _7(i);return{path:i,bytes:s}}var v$e,i0,s0=T(()=>{"use strict";q();of();v$e=M7(P7);i0=5*1024*1024});var l0={};gp(l0,{PlaywrightProvider:()=>nk});function a0(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 nk,c0=T(()=>{"use strict";zM();t0();r0();ef();o0();s0();nk=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new rf(t)}async open(t){let n=Zm(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(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await Zv(o,this.config,t.url,()=>this.close({sessionId:r}));if(u!==null)return u}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let d=await sf(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,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}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 sf(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 Qv(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${a0(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":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=await Zv(r,this.config,i,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await sf(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await Qv(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${a0(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 tk(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 tk(n,o,r);return i}catch{return null}}}});var Ii={};gp(Ii,{__resetBrowserRegistryForTests:()=>j7,browserProviderActive:()=>B7,closeBrowserProvider:()=>rk,getBrowserProvider:()=>N7,peekBrowserProvider:()=>U7});function d0(){Promise.resolve(rk()).then(()=>{process.exit(130)})}function u0(){Promise.resolve(rk()).then(()=>{process.exit(143)})}function p0(){rr=null}function L7(){af||(process.on("SIGINT",d0),process.on("SIGTERM",u0),process.on("exit",p0),af=!0)}function m0(){af&&(process.removeListener("SIGINT",d0),process.removeListener("SIGTERM",u0),process.removeListener("exit",p0),af=!1)}async function N7(e){return rr!==null?rr:(_i!==null||(_i=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(c0(),l0)),n=WM(e),r=new t(n);return L7(),rr=r,_i=null,r})()),_i)}async function rk(){if(rr===null)return;let e=rr;rr=null,_i=null,m0(),await e.shutdown()}function B7(){return rr!==null}function U7(){return rr}function j7(){rr=null,_i=null,m0()}var rr,_i,af,Pi=T(()=>{"use strict";ef();rr=null,_i=null,af=!1});async function f0(e,t){try{return await MM(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function z7(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Pi(),Ii));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function g0(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??z7,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s=e,a=null,l=null;try{let d=await Qm(n,e,{headers:q7,signal:t.signal},o);a=d.status,s=d.url||e;let u=d.headers.get("content-type")??"";if(d.ok){if(G7.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if(K7.test(u)&&!W7.test(u))return{title:"",markdown:p.trim(),finalUrl:s,usedRender:!1};if(i=await f0(p,s),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof In||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(i===null||i.textLength<200)&&i!==null)return{title:i.title,markdown:i.markdown,finalUrl:s,usedRender:!1};try{await id(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:p=>id(p,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await id(d.finalUrl,o);let u=await f0(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||u.textLength>=i.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(t.signal.aborted||d instanceof In)throw d;if(i===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${e}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${a??"error"}).`)}var W7,K7,G7,q7,h0=T(()=>{"use strict";OM();Yv();ue();W7=/(text\/html|application\/xhtml\+xml)/i,K7=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,G7=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,q7={"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 V7(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(J7,{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),Y7),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Cr(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 y0(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?V7({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 b0(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
895
895
|
|
|
896
896
|
(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(`
|
|
897
897
|
`).trimEnd()}var J7,Y7,w0=T(()=>{"use strict";fo();J7="https://api.exa.ai/search",Y7=10});function lf(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var Mi=T(()=>{"use strict";tf()});function nQ(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=X7;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,Q7)}let a=Z7;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,eQ)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function ok(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ar(e,t),truncated:!0}}function rQ(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=nQ(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let u=i.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await Jv(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Qm(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:h instanceof In?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=ok(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await g0(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=ok(p.markdown,s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof In)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=Ft(p)&&!Vv(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${sd()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let u=y0({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(s.query,{limit:tQ,timeoutMs:s.timeoutMs,signal:a.signal}),f=ok(b0(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var X7,Q7,Z7,eQ,tQ,S0,v0=T(()=>{"use strict";h0();w0();Yv();Si();Mi();X7=3e4,Q7=12e4,Z7=1e5,eQ=1e6,tQ=10;S0=rQ()});import{existsSync as T0,mkdirSync as oQ,readFileSync as iQ,renameSync as sQ,unlinkSync as aQ,writeFileSync as lQ}from"node:fs";import{dirname as k0,join as cQ}from"node:path";import{randomBytes as dQ}from"node:crypto";function ln(e){let t=e??Hw();if(!T0(t))return[];try{let n=iQ(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Oi(e,t){let n=t??Hw();oQ(k0(n),{recursive:!0});let r=cQ(k0(n),`.schedules.json.${process.pid}.${dQ(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{lQ(r,o,"utf-8"),sQ(r,n)}catch(i){try{T0(r)&&aQ(r)}catch{}throw i}}function cf(e,t){let n=ln(t),r=n.map(l=>l.id),o=uQ(e.name),i=pQ(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Oi(n,t),a}function df(e,t){let n=ln(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Oi(o,t),!0)}function ld(e,t){return ln(t).find(n=>n.id===e)}function uQ(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function pQ(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function E0(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var uf=T(()=>{"use strict";q()});import{existsSync as mQ,readFileSync as fQ}from"node:fs";import{join as gQ}from"node:path";async function Pn(e,t,n){let r;try{let o=gQ(Rp("default"),"port");if(!mQ(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=fQ(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var yo,ik=T(()=>{"use strict";q();yo="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as hQ}from"node:fs";import{readFile as yQ}from"node:fs/promises";var R0,x0,A0,C0,_0=T(()=>{"use strict";uf();q();ik();R0=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=cf({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await Pn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await Pn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:yo}})}},x0=async(e,t)=>{let n=ln();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},A0=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Kn();if(!hQ(i))return{content:JSON.stringify([])};let s;try{let c=await yQ(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1575,7 +1575,7 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
|
1575
1575
|
`)?t:`${t}
|
|
1576
1576
|
`,i=Ade(r,n,{trim:!1,hard:!0,wordWrap:!1}).split(`
|
|
1577
1577
|
`);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),p=Math.min(d,u),f=p>0?[...Array(p).fill(""),...l]:l,g=f.length,h=Math.max(1,o-g+1),y="";if(a&&(y+=SH),this.previousLineCount>0)for(let b=0;b<this.previousLineCount;b++){let w=this.previousTopRow+b;y+=Ru(w,1)+IR}for(let b=0;b<g;b++){let w=h+b;y+=Ru(w,1)+IR+(f[b]??"")}if(y+=Ru(h+g-1,1),a&&(y+=vH),this.stream.isTTY)try{this.stream.write(Cde)}catch{}try{this.stream.write(y)}catch{try{this.stream.isTTY&&this.stream.write(kH)}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+=SH);for(let o=0;o<this.previousLineCount;o++){let i=this.previousTopRow+o;n+=Ru(i,1)+IR}n+=Ru(Math.max(1,(this.stream.rows??24)-1-t),1),r&&(n+=vH);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(kH)}catch{}}};import{emitKeypressEvents as _de}from"readline";var Ide=50;function ps(e){_de(e,{escapeCodeTimeout:Ide})}var xu=null;function Au(e){if(xu!==null)throw new Error(`stdin claim conflict: '${xu.name}' already holds the claim, '${e}' cannot acquire it concurrently.`);let t=!1,n={release(){t||(t=!0,xu?.handle===n&&(xu=null))}};return xu={name:e,handle:n},n}async function TH(e,t){let n=Au(e);try{return await t()}finally{n.release()}}function EH(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 RH(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 xH(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 Ty(e.stdout)),e.stdinClaim=Au("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(),ps(e.stdin),e.handleKeypress=(t,n)=>{let r=e.pasting?!1:e.caretBlinkController.resetVisible(),o=e.repaintCount;yH(e,t,n),r&&e.repaintCount===o&&e.repaint()},e.stdin.on("keypress",e.handleKeypress),e.armed=!0,e.canceled=!1,e.resizeUnsub=Le.subscribe(()=>{e.armed&&e.repaint()}),e.resizeImmediateUnsub=Le.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 AH(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),Pde(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 Pde(e){let t=e.committedBand.length-e.committedBandPaintedRows;if(t<=0)return;let n=Math.max(1,e.stdout.rows??24),r=Math.max(1,e.stdout.columns??80),o=Math.max(e.anchorRow??1,1),i=El(e.committedBand,e.committedBandMeta,t),s=Rl(i,o,n,r);if(s.length===0)return;let a=()=>{e.stdout.write(s)};try{e.scrollRegion?e.scrollRegion.withFullScrollRegion(a):a()}catch{}}function CH(e){e.overlay="",e.input=J.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.pendingTrailingRepaint=!1,e.burstActive=!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 Il=class{stdout;stdin;onCancel;onSoftStop;softStopped=!1;postEscCoalesce=!1;postEscPayload=null;onBackground;onRewindRequest;lastIdleEscAt=0;onPauseInterrupt;onShiftTab;onOpenEditor;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=J.seed("");queued=!1;pendingSubmissions=[];handleKeypress=null;resizeUnsub=null;resizeImmediateUnsub=null;spinnerController;activeToolName;caretBlinkController;repaintCount=0;pendingTrailingRepaint=!1;burstActive=!1;committing=!1;hasCommitted=!1;committedBand=[];committedBandMeta=[];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:""}
|
|
1578
|
-
`)}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,this.onOpenEditor=t.onOpenEditor;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+m.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.spinnerController=new cy({captureMode:t.captureMode??!1,goblin:t.goblinSpinner??!1,onTick:()=>this.repaint(),workVerb:()=>x1(this.activeToolName)}),this.caretBlinkController=new uy({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(){EH(this)}resumeInput(){RH(this)}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnRewindRequest(t){this.onRewindRequest=t??void 0}setOnOpenEditor(t){this.onOpenEditor=t??void 0}enterPickerMode(t){aH(this,t)}exitPickerMode(){lH(this)}repaintPicker(){cH(this)}setInputMode(t){this.flushPendingRepaint(),dH(this,t)}getInputMode(){return uH(this)}async arm(){return xH(this)}disarm(){AH(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)}setActiveToolName(t){this.activeToolName=t}commitAbove(t){this.flushPendingRepaint(),nH(this,t)}clearCommittedBand(){ku(this)}flushResizeGhostErase(){oH(this)}resetCommittedBand(){rH(this)}repositionCommittedBand(t,n,r){iH(this,t,n,r)}getBuffer(){return C1(this)}getPendingCount(){return this.pendingSubmissions.length}getAttachments(){return[...this.attachments]}get caretVisible(){return this.caretBlinkController.visible}renderInputLine(){return Q1(this)}updateAutocomplete(){hy(this)}updateGhost(){J1(this)}renderDropdownRows(){return Z1(this)}renderHintRow(){return eH(this)}repaint(){this.repaintCount++,this.pendingTrailingRepaint=!1,ky(this)}scheduleRepaint(){if(this.repaintCount++,!this.burstActive){this.burstActive=!0,this.pendingTrailingRepaint=!1,ky(this),queueMicrotask(()=>{this.burstActive=!1,this.flushPendingRepaint()});return}this.pendingTrailingRepaint=!0}flushPendingRepaint(){this.pendingTrailingRepaint&&(this.pendingTrailingRepaint=!1,this.armed&&ky(this))}clearScreen(){this.logUpdate?.resetGeometry?.(),this.stdout.write("\x1B[H\x1B[2J"),this.repaint()}resetState(){CH(this)}applyEdit(t){return hH(this,t)}prefillInput(t){this.applyEdit(J.seed(t))}applyDropdownSelection(){return Y1(this)}applyGhostAccept(){return V1(this)}};K();import PR from"chalk";var Dde=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,Fde=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,Lde=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,_H={mint:m.mint};function Nde(e){let t=_H[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=_H[r];if(o)return o}return null}var IH=null,PH=null,MH=null,OH=null,$H="";function Wo(e,t){if(PR.level===0)return e;let n=t.version?.(),r=n!==void 0;if(r&&OH===t&&IH===e&&PH===PR.level&&MH===n)return $H;let s=e.replace(Dde,a=>{let l=a.slice(1);return t.has(l)?(Nde(l)??m.brand)(a):m.meta(a)}).replace(Fde,a=>m.fileRef(a)).replace(Lde,a=>m.meta(a));return r&&(OH=t,IH=e,PH=PR.level,MH=n,$H=s),s}K();K();var DH=8,Ey=30;function Bde(){let e=k.AFK_DIFF_LINES;if(e===void 0)return Ey;let t=e.trim();if(!/^\d+$/.test(t))return Ey;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Ey}function Ude(){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 jde(e){let t=m.diffAdd(`+${e.addedLines}`),n=m.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=m.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var Hde=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function Wde(e){let t=$e(e.text).replace(Hde,"");return e.kind==="+"?m.diffAdd("+ "+t):e.kind==="-"?m.diffRemove("- "+t):m.dim(" "+t)}var OR=new WeakMap;function Kr(e,t,n){if(Ude())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?DH:Bde(),o=t+"|"+n+"|"+r,i=OR.get(e);if(i!==void 0){let f=i.get(o);if(f!==void 0)return f}let s=[];s.push(n+jde(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:m.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:Wde(h)})}if(r===0){for(let f of a)s.push(n+f.text);return MR(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 MR(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"}`,p=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return s.push(n+m.dim(`\u2026 +${d} more diff ${u}${p}`)),MR(e,o,s),s}function MR(e,t,n){let r=OR.get(e);r===void 0&&(r=new Map,OR.set(e,r)),r.set(t,n)}function Ko(e,t){return e?Go(t)?m.warning("\u2298"):m.error("\u2717"):m.success("\u2713")}function Go(e){return e!==void 0&&Lh.has(e)}var Cu=3,FH=2,LH=3;function NH(e){switch(mn(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 Kde(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 Gr(e,t,n=60,r){let o=e.isError?Go(e.failureClass)?m.warning:m.error:m.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=Oh()?$h(a,e.persistedPath):a;return o(`saved \u2192 ${l}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${Kde(r,e.lineCount)}`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(Oe(s))}function ms(e){return!e||typeof e.batchSize!="number"||typeof e.batchIndex!="number"||e.batchSize<=1?"":m.dim(` \u2225${e.batchIndex}/${e.batchSize}`)}K();function _u(e,t){if(e.length<=t)return e;let n=e.length-t,r=e.slice(0,n),o=e.slice(n),i=UH(r);return[{kind:"overflow",count:r.length,text:i},...o]}function Gde(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var qde=5,BH=60;function UH(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=Oe(d);if(!u){s=!0;break}let p=u.length>BH?u.slice(0,BH-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;i.push({display:p,entries:f})}if(!s&&i.length>0){let a=i.slice(0,qde),l=a.map(({display:p,entries:f})=>f>1?`${p} \xD7${f}`:p),c=a.reduce((p,f)=>p+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} ${Gde(i,s)}`);return`\u2026 +${n} (${o.join(", ")})`}function Ry(e,t=Bn()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function $R(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function DR(e){if(e.length===0)return[];let t=new Map;for(let o of e){let i=jH(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=jH(o),s=t.get(i);s.length>=Yde(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}var zde=40;function Jde(e){let t=e.result?.content??"",n=jr(Oe(t));return n?ce(n,zde):""}function FR(e){let t=e.entries.length,n=e.entries.filter(d=>d.result),r=n.filter(d=>d.result.isError),o=n.length,i=r.filter(d=>Go(d.result.failureClass)),s=r.filter(d=>!Go(d.result.failureClass)),a,l="";if(r.length>0){let d=o-r.length,u=[];d>0&&u.push(m.dim(`${d} ok`)),s.length>0&&u.push(m.error(`${s.length} error${s.length===1?"":"s"}`)),i.length>0&&u.push(m.warning(`${i.length} blocked`)),a=u.join(m.dim(", "));let p=s.length>0?s:i,f=s.length>0?m.error:m.warning,g=Jde(p[p.length-1]);g&&(l=m.dim(" \xB7 last: ")+f(g))}else o===t?a=`${t} done`:o===0?a=`${t} running`:a=`${o}/${t} done`;let c=Hr(e.toolName+e.label);return r.length>0?c+m.dim(` \xD7${t} \u2014 `)+a+l:c+m.dim(` \xD7${t} \u2014 ${a}`)}function jH(e){return ze.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function Yde(e){return ze.has(e)?FH:LH}function HH(e,t,n,r){return e>0||t?Pl([...n,!0],r):Pl(n,r)}function WH(e,t){return!ze.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&WH(r,t))}function xy(e,t,n,r=ne(),o=[],i=Bn(),s){let a=Pl(o,i),l=Iu(a,i),c=e.filter(h=>h.kind==="text"),d=e.filter(h=>h.kind==="tool").filter(h=>!WH(h,t)),u=DR(d),p=_u(u,Cu),f=Ry(p,i);for(let{sibling:h,connector:y}of f){let b=m.dim(y),w=y===i.lastConnector;if(h.kind==="overflow")n.push(Ae(l+b+m.dim(h.text),r));else if(h.kind==="group")n.push(Ae(l+b+FR(h),r));else if(h.kind==="resultSummary")n.push(Ae(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(Ae(l+b,r)):n.push(Ae(l+b+S.prefix,r));let E=s??w;if(xy(v,t,n,r,[...o,E],i,w),S.thinkingTail){let x=Iu(Pl([...o,E],i),i);n.push(Ae(x+m.thinking("\u2307 "+Oe(S.thinkingTail)),r))}}else if(!(ze.has(S.toolName)&&S.headerEmitted))if(S.result){if(n.push(Ae(l+b+S.prefix+m.dim(" \u2014 ")+Ko(S.result.isError,S.result.failureClass)+" "+Gr(S.result,void 0,60,S.toolName),r)),S.diff&&!S.result.isError){let E=l+(w?i.spineClosed:m.dim(i.spine))+" ";for(let x of Kr(S.diff,"overlay",E))n.push(Ae(x,r))}}else{n.push(Ae(l+b+S.prefix,r));let E=l+(w?i.spineClosed:m.dim(i.spine))+" ";S.thinkingTail?n.push(Ae(E+m.thinking("\u2307 "+Oe(S.thinkingTail)),r)):n.push(Ae(E+m.dim(NH(S.toolName)),r))}}}let g=HH(d.length,!1,o,i);for(let h of c)for(let y of LR(h.text,g,i))n.push(Ae(y,r))}function Pu(e,t,n,r,o=ne(),i=[],s=Bn(),a){let l=Pl(i,s),c=Iu(l,s),d=[],u=e.filter(w=>w.kind==="text"),p=e.filter(w=>w.kind==="tool"),f=DR(p),g=_u(f,Cu),h=$R(g,r),y=Ry(h,s);for(let{sibling:w,connector:S}of y){let v=m.dim(S),E=S===s.lastConnector;if(w.kind==="overflow")d.push(Ae(c+v+m.dim(w.text),o));else if(w.kind==="resultSummary")d.push(Ae(c+v+w.summary,o));else if(w.kind==="group")d.push(Ae(c+v+FR(w),o));else{let x=w,D=t.get(x.toolUseId);if(ze.has(x.toolName)&&D&&D.length>0){if(x.headerEmitted){let A=x.toolInput?`${x.toolName} ${Oe(x.toolInput)}`:x.toolName;d.push(Ae(c+v+m.dim("\u21B3 "+A),o))}else d.push(Ae(c+v+x.prefix,o));let I=a??E;d.push(...Pu(D,t,n,void 0,o,[...i,I],s,E))}else if(x.result){if(d.push(Ae(c+v+x.prefix+m.dim(" \u2014 ")+Ko(x.result.isError,x.result.failureClass)+" "+Gr(x.result,n,60,x.toolName),o)),x.diff&&!x.result.isError){let I=c+(E?s.spineClosed:m.dim(s.spine))+" ";for(let A of Kr(x.diff,"flush",I))d.push(Ae(A,o))}}else d.push(Ae(c+v+x.prefix,o))}}let b=HH(p.length,r!=null,i,s);for(let w of u)for(let S of LR(w.text,b,s))d.push(Ae(S,o));return d}function KH(e){return e.agentResultSummary?m.dim(e.agentResultSummary)+ms(e.result):e.agentResultSummary}function Mu(e,t,n,r,o=[]){let i=Bn(),s=t.filter(y=>y.kind==="tool"),l=s.filter(y=>y.result).reduce((y,b)=>y+(b.result.lineCount??0),0),c=[];s.length>Cu&&(c.push(Oo(s.length)),l>0&&c.push(`${l} lines`));let d=m.dim(i.spine.repeat(o.length)),u=o,p=m.dim(i.turnRoot),f=ne(),g=Ae(c.length>0?d+p+e.prefix+m.dim(" \u2014 "+c.join(" \xB7 ")):d+p+e.prefix,f),h=Pu(t,n,r,KH(e),f,u,i);return[g,...h].join(`
|
|
1578
|
+
`)}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,this.onOpenEditor=t.onOpenEditor;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+m.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.spinnerController=new cy({captureMode:t.captureMode??!1,goblin:t.goblinSpinner??!1,onTick:()=>this.repaint(),workVerb:()=>x1(this.activeToolName)}),this.caretBlinkController=new uy({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(){EH(this)}resumeInput(){RH(this)}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnRewindRequest(t){this.onRewindRequest=t??void 0}setOnOpenEditor(t){this.onOpenEditor=t??void 0}enterPickerMode(t){aH(this,t)}exitPickerMode(){lH(this)}repaintPicker(){cH(this)}setInputMode(t){this.flushPendingRepaint(),dH(this,t)}getInputMode(){return uH(this)}async arm(){return xH(this)}disarm(){AH(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)}setActiveToolName(t){this.activeToolName=t}commitAbove(t){this.flushPendingRepaint(),nH(this,t)}clearCommittedBand(){ku(this)}flushResizeGhostErase(){oH(this)}resetCommittedBand(){rH(this)}repositionCommittedBand(t,n,r){iH(this,t,n,r)}getBuffer(){return C1(this)}getPendingCount(){return this.pendingSubmissions.length}getAttachments(){return[...this.attachments]}get caretVisible(){return this.caretBlinkController.visible}renderInputLine(){return Q1(this)}updateAutocomplete(){hy(this)}updateGhost(){J1(this)}renderDropdownRows(){return Z1(this)}renderHintRow(){return eH(this)}repaint(){this.repaintCount++,this.pendingTrailingRepaint=!1,ky(this)}scheduleRepaint(){if(this.repaintCount++,!this.burstActive){this.burstActive=!0,this.pendingTrailingRepaint=!1,ky(this),queueMicrotask(()=>{this.burstActive=!1,this.flushPendingRepaint()});return}this.pendingTrailingRepaint=!0}flushPendingRepaint(){this.pendingTrailingRepaint&&(this.pendingTrailingRepaint=!1,this.armed&&ky(this))}clearScreen(){this.logUpdate?.resetGeometry?.(),this.stdout.write("\x1B[H\x1B[2J"),this.repaint()}resetState(){CH(this)}applyEdit(t){return hH(this,t)}prefillInput(t){this.applyEdit(J.seed(t))}applyDropdownSelection(){return Y1(this)}applyGhostAccept(){return V1(this)}};K();import PR from"chalk";var Dde=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,Fde=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,Lde=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,_H={mint:e=>m.mint(e)};function Nde(e){let t=_H[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=_H[r];if(o)return o}return null}var IH=null,PH=null,MH=null,OH=null,$H="";function Wo(e,t){if(PR.level===0)return e;let n=t.version?.(),r=n!==void 0;if(r&&OH===t&&IH===e&&PH===PR.level&&MH===n)return $H;let s=e.replace(Dde,a=>{let l=a.slice(1);return t.has(l)?(Nde(l)??m.brand)(a):m.meta(a)}).replace(Fde,a=>m.fileRef(a)).replace(Lde,a=>m.meta(a));return r&&(OH=t,IH=e,PH=PR.level,MH=n,$H=s),s}K();K();var DH=8,Ey=30;function Bde(){let e=k.AFK_DIFF_LINES;if(e===void 0)return Ey;let t=e.trim();if(!/^\d+$/.test(t))return Ey;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Ey}function Ude(){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 jde(e){let t=m.diffAdd(`+${e.addedLines}`),n=m.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=m.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var Hde=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function Wde(e){let t=$e(e.text).replace(Hde,"");return e.kind==="+"?m.diffAdd("+ "+t):e.kind==="-"?m.diffRemove("- "+t):m.dim(" "+t)}var OR=new WeakMap;function Kr(e,t,n){if(Ude())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?DH:Bde(),o=t+"|"+n+"|"+r,i=OR.get(e);if(i!==void 0){let f=i.get(o);if(f!==void 0)return f}let s=[];s.push(n+jde(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:m.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:Wde(h)})}if(r===0){for(let f of a)s.push(n+f.text);return MR(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 MR(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"}`,p=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return s.push(n+m.dim(`\u2026 +${d} more diff ${u}${p}`)),MR(e,o,s),s}function MR(e,t,n){let r=OR.get(e);r===void 0&&(r=new Map,OR.set(e,r)),r.set(t,n)}function Ko(e,t){return e?Go(t)?m.warning("\u2298"):m.error("\u2717"):m.success("\u2713")}function Go(e){return e!==void 0&&Lh.has(e)}var Cu=3,FH=2,LH=3;function NH(e){switch(mn(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 Kde(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 Gr(e,t,n=60,r){let o=e.isError?Go(e.failureClass)?m.warning:m.error:m.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=Oh()?$h(a,e.persistedPath):a;return o(`saved \u2192 ${l}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${Kde(r,e.lineCount)}`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(Oe(s))}function ms(e){return!e||typeof e.batchSize!="number"||typeof e.batchIndex!="number"||e.batchSize<=1?"":m.dim(` \u2225${e.batchIndex}/${e.batchSize}`)}K();function _u(e,t){if(e.length<=t)return e;let n=e.length-t,r=e.slice(0,n),o=e.slice(n),i=UH(r);return[{kind:"overflow",count:r.length,text:i},...o]}function Gde(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var qde=5,BH=60;function UH(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=Oe(d);if(!u){s=!0;break}let p=u.length>BH?u.slice(0,BH-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;i.push({display:p,entries:f})}if(!s&&i.length>0){let a=i.slice(0,qde),l=a.map(({display:p,entries:f})=>f>1?`${p} \xD7${f}`:p),c=a.reduce((p,f)=>p+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} ${Gde(i,s)}`);return`\u2026 +${n} (${o.join(", ")})`}function Ry(e,t=Bn()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function $R(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function DR(e){if(e.length===0)return[];let t=new Map;for(let o of e){let i=jH(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=jH(o),s=t.get(i);s.length>=Yde(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}var zde=40;function Jde(e){let t=e.result?.content??"",n=jr(Oe(t));return n?ce(n,zde):""}function FR(e){let t=e.entries.length,n=e.entries.filter(d=>d.result),r=n.filter(d=>d.result.isError),o=n.length,i=r.filter(d=>Go(d.result.failureClass)),s=r.filter(d=>!Go(d.result.failureClass)),a,l="";if(r.length>0){let d=o-r.length,u=[];d>0&&u.push(m.dim(`${d} ok`)),s.length>0&&u.push(m.error(`${s.length} error${s.length===1?"":"s"}`)),i.length>0&&u.push(m.warning(`${i.length} blocked`)),a=u.join(m.dim(", "));let p=s.length>0?s:i,f=s.length>0?m.error:m.warning,g=Jde(p[p.length-1]);g&&(l=m.dim(" \xB7 last: ")+f(g))}else o===t?a=`${t} done`:o===0?a=`${t} running`:a=`${o}/${t} done`;let c=Hr(e.toolName+e.label);return r.length>0?c+m.dim(` \xD7${t} \u2014 `)+a+l:c+m.dim(` \xD7${t} \u2014 ${a}`)}function jH(e){return ze.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function Yde(e){return ze.has(e)?FH:LH}function HH(e,t,n,r){return e>0||t?Pl([...n,!0],r):Pl(n,r)}function WH(e,t){return!ze.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&WH(r,t))}function xy(e,t,n,r=ne(),o=[],i=Bn(),s){let a=Pl(o,i),l=Iu(a,i),c=e.filter(h=>h.kind==="text"),d=e.filter(h=>h.kind==="tool").filter(h=>!WH(h,t)),u=DR(d),p=_u(u,Cu),f=Ry(p,i);for(let{sibling:h,connector:y}of f){let b=m.dim(y),w=y===i.lastConnector;if(h.kind==="overflow")n.push(Ae(l+b+m.dim(h.text),r));else if(h.kind==="group")n.push(Ae(l+b+FR(h),r));else if(h.kind==="resultSummary")n.push(Ae(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(Ae(l+b,r)):n.push(Ae(l+b+S.prefix,r));let E=s??w;if(xy(v,t,n,r,[...o,E],i,w),S.thinkingTail){let x=Iu(Pl([...o,E],i),i);n.push(Ae(x+m.thinking("\u2307 "+Oe(S.thinkingTail)),r))}}else if(!(ze.has(S.toolName)&&S.headerEmitted))if(S.result){if(n.push(Ae(l+b+S.prefix+m.dim(" \u2014 ")+Ko(S.result.isError,S.result.failureClass)+" "+Gr(S.result,void 0,60,S.toolName),r)),S.diff&&!S.result.isError){let E=l+(w?i.spineClosed:m.dim(i.spine))+" ";for(let x of Kr(S.diff,"overlay",E))n.push(Ae(x,r))}}else{n.push(Ae(l+b+S.prefix,r));let E=l+(w?i.spineClosed:m.dim(i.spine))+" ";S.thinkingTail?n.push(Ae(E+m.thinking("\u2307 "+Oe(S.thinkingTail)),r)):n.push(Ae(E+m.dim(NH(S.toolName)),r))}}}let g=HH(d.length,!1,o,i);for(let h of c)for(let y of LR(h.text,g,i))n.push(Ae(y,r))}function Pu(e,t,n,r,o=ne(),i=[],s=Bn(),a){let l=Pl(i,s),c=Iu(l,s),d=[],u=e.filter(w=>w.kind==="text"),p=e.filter(w=>w.kind==="tool"),f=DR(p),g=_u(f,Cu),h=$R(g,r),y=Ry(h,s);for(let{sibling:w,connector:S}of y){let v=m.dim(S),E=S===s.lastConnector;if(w.kind==="overflow")d.push(Ae(c+v+m.dim(w.text),o));else if(w.kind==="resultSummary")d.push(Ae(c+v+w.summary,o));else if(w.kind==="group")d.push(Ae(c+v+FR(w),o));else{let x=w,D=t.get(x.toolUseId);if(ze.has(x.toolName)&&D&&D.length>0){if(x.headerEmitted){let A=x.toolInput?`${x.toolName} ${Oe(x.toolInput)}`:x.toolName;d.push(Ae(c+v+m.dim("\u21B3 "+A),o))}else d.push(Ae(c+v+x.prefix,o));let I=a??E;d.push(...Pu(D,t,n,void 0,o,[...i,I],s,E))}else if(x.result){if(d.push(Ae(c+v+x.prefix+m.dim(" \u2014 ")+Ko(x.result.isError,x.result.failureClass)+" "+Gr(x.result,n,60,x.toolName),o)),x.diff&&!x.result.isError){let I=c+(E?s.spineClosed:m.dim(s.spine))+" ";for(let A of Kr(x.diff,"flush",I))d.push(Ae(A,o))}}else d.push(Ae(c+v+x.prefix,o))}}let b=HH(p.length,r!=null,i,s);for(let w of u)for(let S of LR(w.text,b,s))d.push(Ae(S,o));return d}function KH(e){return e.agentResultSummary?m.dim(e.agentResultSummary)+ms(e.result):e.agentResultSummary}function Mu(e,t,n,r,o=[]){let i=Bn(),s=t.filter(y=>y.kind==="tool"),l=s.filter(y=>y.result).reduce((y,b)=>y+(b.result.lineCount??0),0),c=[];s.length>Cu&&(c.push(Oo(s.length)),l>0&&c.push(`${l} lines`));let d=m.dim(i.spine.repeat(o.length)),u=o,p=m.dim(i.turnRoot),f=ne(),g=Ae(c.length>0?d+p+e.prefix+m.dim(" \u2014 "+c.join(" \xB7 ")):d+p+e.prefix,f),h=Pu(t,n,r,KH(e),f,u,i);return[g,...h].join(`
|
|
1579
1579
|
`)}function NR(e,t=[]){let n=Bn(),r=m.dim(n.spine.repeat(t.length)),o=m.dim(n.turnRoot);return Ae(r+o+e.prefix,ne())}function Ou(e,t,n,r,o=[]){let i=Bn(),s=o;return Pu(t,n,r,KH(e),ne(),s,i)}function Vde(e,t){let n=e.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=r.filter(a=>Go(a.result.failureClass)),i=r.filter(a=>!Go(a.result.failureClass));if(r.length>0){let a=n.length-r.length,c=n.filter(u=>!u.result.isError).map(u=>u.result.lineCount).filter(u=>u!==void 0).reduce((u,p)=>u+p,0),d=[];return c>0&&d.push(`${c} lines`),a>0&&d.push(`${a} ok`),i.length>0&&d.push(m.error(`${i.length} error${i.length>1?"s":""}`)),o.length>0&&d.push(m.warning(`${o.length} blocked`)),m.dim(" \u2014 ")+d.join(m.dim(", "))}let s=n.map(a=>a.result?.lineCount).filter(a=>a!==void 0);if(s.length===n.length&&s.length>0){if(s.every(c=>c===s[0]))return m.dim(` \u2014 ${s[0]} lines each`);let l=s.reduce((c,d)=>c+d,0);return m.dim(` \u2014 ${l} lines total`)}if(n.length>0){let a=n.map(l=>Gr(l.result,t,60,l.toolName));return m.dim(" \u2014 ")+a.join(m.dim(", "))}return""}function GH(e,t,n,r){let{color:o,glyph:i}=pl(e),s=" "+o(i+" ")+o.bold(e)+m.dim(` \xD7${t.length}`)+" ",a=Vde(t,r),l=t.map(u=>jr(Oe(u.toolInput)).trim()).join(", "),c=Math.max(0,n-ee(s)-ee(a)),d=ce(m.toolArg(l),c);return Ae(s+d+a,n)}function Ml(e,t,n){let r=[],o=ne();for(let i of t){let s=e.get(i);if(s.length===1){let a=s[0];if(a.result){if(r.push(Ae(" "+a.prefix+m.dim(" \u2014 ")+Ko(a.result.isError,a.result.failureClass)+" "+Gr(a.result,n,60,a.toolName)+ms(a.result),o)),a.diff&&!a.result.isError)for(let l of Kr(a.diff,"flush"," "))r.push(Ae(l,o))}else r.push(Ae(" "+a.prefix,o))}else{r.push(GH(i,s,o,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=Oe(c.toolInput),u=jr(d).trim()||d.trim();r.push(Ae(" "+m.dim(`\u2500\u2500 ${u} \u2500\u2500`),o))}for(let d of Kr(c.diff,"flush"," "))r.push(Ae(d,o))}}}return r}function Ae(e,t){return ce(e,t)}var BR=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),Xde=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),V7e=BR.midConnector,X7e=BR.lastConnector;function Bn(){let e=k.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?Xde:BR}function Pl(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function Iu(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?m.dim(o):o}return n}function LR(e,t,n){if(!e||!e.trim())return[];let r=m.dim(n.textPrefix),o=Math.max(1,ne()-t.length-2-2),i=Iu(t,n),s=[];for(let a of e.split(`
|
|
1580
1580
|
`)){let l=rR(a),c=Se(l,o);for(let d of c.split(`
|
|
1581
1581
|
`))s.push(i+r+d)}return s}var qH=6,$u=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=$e(r),i=Hr(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),To.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,i){let s=$e(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=s,a.prefix=Hr(n+s,i),o!==void 0&&(a.agentContext=o);return}let l=Hr(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"||!To.has(o.toolName)||o.toolName==="Agent")return!1;let s=`(${$e(n)})`;return o.toolName="Agent",o.toolInput=s,o.prefix=Hr("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"&&Od.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=Bn(),o=ne(),i=u=>ce(u,o),s=[];for(let u of this.order){let p=this.entries.get(u);!p||p.kind!=="tool"||p.agentContext||s.push(p)}let a=s,l=0;if(s.length>qH){let u=s.filter(h=>!h.result),p=s.filter(h=>h.result),f=Math.max(0,qH-u.length),g=new Set(p.slice(-f));l=p.length-g.size,a=s.filter(h=>!h.result||g.has(h))}let d=a.some(u=>ze.has(u.toolName))?m.dim(r.turnRoot):" ";for(let u of a){let p=t.get(u.toolUseId);if(ze.has(u.toolName)&&p&&p.length>0)u.headerEmitted?n.push(i(m.dim(r.turnRoot))):n.push(i(m.dim(r.turnRoot)+u.prefix)),xy(p,t,n,o,void 0,r),u.thinkingTail&&n.push(i(m.dim(r.spine)+m.thinking("\u2307 "+Oe(u.thinkingTail))));else if(!(ze.has(u.toolName)&&u.headerEmitted))if(ze.has(u.toolName))u.result?n.push(i(m.dim(r.turnRoot)+u.prefix+m.dim(" \u2014 ")+Ko(u.result.isError,u.result.failureClass)+" "+Gr(u.result,void 0,60,u.toolName)+ms(u.result))):n.push(i(m.dim(r.turnRoot)+u.prefix+m.dim(" \u2026"))),u.thinkingTail&&n.push(i(m.dim(r.spine)+m.thinking("\u2307 "+Oe(u.thinkingTail))));else if(u.result){if(n.push(i(d+u.prefix+m.dim(" \u2014 ")+Ko(u.result.isError,u.result.failureClass)+" "+Gr(u.result,void 0,60,u.toolName)+ms(u.result))),u.diff&&!u.result.isError)for(let f of Kr(u.diff,"overlay"," "))n.push(i(f))}else n.push(i(d+u.prefix+m.dim(" \u2026"))),u.thinkingTail&&n.push(i(m.dim(r.spine)+m.thinking("\u2307 "+Oe(u.thinkingTail))))}return l>0&&n.push(i(" "+m.dim(`\u2026 +${l} done`))),n.join(`
|
|
@@ -1616,7 +1616,7 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
|
1616
1616
|
`);if(r.isTTY&&r.compositor)Yt(r.compositor,i);else for(let s of i)r.out.line(s);r.isTTY&&r.compositor?r.compositor.commitAbove(""):r.out.line("")}function bue(e,t,n){let r=t.syntheticAgentToolUseId;if(!r||t.errored)return;if(!n.isTTY&&t.contentBuffer&&Mh(t.contentBuffer,n),t.contentBuffer="",!n.isTTY&&t.thinkingLane?.hasBufferedContent()){let i=t.thinkingLane.collapse();i&&(n.out.line(i),n.out.line(""))}n.toolLane.setThinkingTail(r,void 0),jy.delete(r),Fl.delete(r);let o=YH(t);n.toolLane.setAgentResultSummary(r,o),n.toolLane.addResult(r,Du(o,!1)),n.isTTY&&n.orchestratorCtx&&Qe(n.orchestratorCtx)}var Hy=class{sink;order;slots=new Map;dirty=!1;constructor(t,n){this.sink=t,this.order=[...n]}register(t){this.slots.set(t.key,t),this.dirty=!0}markDirty(t){this.slots.has(t)&&(this.dirty=!0)}flush(){if(!this.dirty)return;this.dirty=!1;let t=[];for(let n of this.order){let r=this.slots.get(n);if(r===void 0)continue;let o=r.render();o.length>0&&t.push(o)}this.sink.setOverlay(t.join(`
|
|
1617
1617
|
`))}invalidate(){this.dirty=!0}};function uW(e,t=2){if(t<1||!Number.isInteger(t))throw new RangeError(`makeDedupingLineWriter: maxRepeat must be a positive integer, got ${t}`);let n=null,r=0,o=()=>{if(n!==null&&r>t){let i=r-t;e.line(` \u2026 (line repeated ${i} more time${i===1?"":"s"})`)}};return{line(i){let s=i??"";s===n?(r++,r<=t&&e.line(s)):(o(),n=s,r=1,e.line(s))},raw(i){o(),n=null,r=0,e.raw(i)},success(i){o(),n=null,r=0,e.success(i)},info(i){o(),n=null,r=0,e.info(i)},warn(i){o(),n=null,r=0,e.warn(i)},error(i){o(),n=null,r=0,e.error(i)},flush(){o(),n=null,r=0}}}ue();var wue=3e4,Sue=" \xB7 waiting ",vue=375;function pW(e,t){e.register({key:"thinking-live",render:()=>t.thinkingMode!=="live"&&t.thinkingMode!=="digest"||!t.thinkingLane.isActive()||!t.thinkingLane.hasBufferedContent()?"":$l(t.thinkingLane.peekPhase(),{cols:ne()})??""}),e.register({key:"markdown-pending",render:()=>{let n=t.streamingMarkdownRef.current;return n?n.renderPending():""}}),e.register({key:"tool-lane",render:()=>t.toolLane.hasPending()?t.toolLane.getOverlay():""}),e.register({key:"progress-banner",render:()=>{let n=[],r=t.getSoftStopping(),o=Fh(t.thinkingLane.peekPhase()),i=o?void 0:_y(t),s=o??i?.activity;for(let a of t.lastProgressByTask.values()){let l=i?{...a,...i.stats,lastToolName:void 0}:a;n.push(...Xi(l,void 0,s,r))}return r&&n.length===0&&n.push(...Xi({taskId:"__soft_stop__",description:"Turn",totalTokens:0,toolUses:0,durationMs:0},void 0,void 0,!0)),i&&n.length===0&&n.push(...Xi(Iy(i.stats),void 0,s,r)),n.length>0?n.join(`
|
|
1618
1618
|
`):""}}),e.register({key:"interrupt",render:()=>kue(t.getInterrupting())})}function kue(e){return e?" "+m.warning("\u26A0 interrupting\u2026 (Ctrl+C again to exit)"):""}function mW(e,t){return Le.subscribe(()=>{t||!e||(e.invalidate(),e.flush())})}function fW(e){if(e.disposed)return!1;let t=!1,n=Date.now();for(let[r,o]of e.sources){if(o.done||o.errored||!o.syntheticAgentToolUseId)continue;let i=n-o.lastEventAt;if(i>wue)if(o.stalledTicks+=1,o.stalledTicks>=vue*2)Ne()&&process.stderr.write(`[stream-renderer] auto_settle_timeout ${JSON.stringify({sourceId:r,elapsedMs:i,syntheticAgentToolUseId:o.syntheticAgentToolUseId})}
|
|
1619
|
-
`),e.toolLane.addResult(o.syntheticAgentToolUseId,Du("[no-result \u2014 timed out]",!
|
|
1619
|
+
`),e.toolLane.addResult(o.syntheticAgentToolUseId,Du("[no-result \u2014 timed out]",!0)),o.done=!0,t=!0;else{let s=o.agentType??r,a=Sue+xe(i);o.pauseAnnotation!==a&&(o.pauseAnnotation=a,e.toolLane.addStartWithAgentContext(o.syntheticAgentToolUseId,"Agent",`(${s})${a}`,void 0),t=!0)}}return t&&e.isTTY&&e.overlayComposer&&(e.overlayComposer.markDirty("tool-lane"),e.overlayComposer.flush()),t}ue();function gW(e){let t=e.overlayComposer;if(e.disposed||!e.isTTY||!t)return!1;let n=Date.now(),r=!1;for(let[o,i]of e.sources){if(o===fs||i.done||i.errored)continue;let s=Math.max(0,n-i.lastEventAt);if(s<Cy){i.quietBannerAnnounced=!1;continue}i.quietBannerAnnounced||(i.quietBannerAnnounced=!0,r=!0,Ne()&&process.stderr.write(`[stream-renderer] progress_banner_quiet ${JSON.stringify({sourceId:o,silentMs:s})}
|
|
1620
1620
|
`))}return r&&(t.markDirty("progress-banner"),t.flush()),r}ue();function hW(e){return{out:e.out,isTTY:e.isTTY,compositor:e.compositor,overlayComposer:e.overlayComposer,toolLane:e.toolLane,thinkingLane:e.thinkingLane,thinkingMode:e.thinkingMode,streamingMarkdown:e.streamingMarkdown,coordinator:e.coordinator,lastProgressByTask:e.lastProgressByTask,...e.sources?{sources:e.sources}:{},...e.childActivity?{childActivity:e.childActivity}:{},...e.isTTY&&e.stageTracker?{stageTracker:e.stageTracker}:{},...e.activeSkillName?{activeSkillName:e.activeSkillName}:{}}}function XR(e){return{isTTY:e.isTTY,compositor:e.compositor,toolLane:e.toolLane,out:e.out,streamingMarkdown:e.streamingMarkdown,thinkingMode:e.thinkingMode,orchestratorCtx:e.orchestratorCtx}}function yW(e){if(e.parentId===void 0)return;let t=e.sources.get(e.parentId);if(t!==void 0)return t.syntheticAgentToolUseId;if(e.toolLane.hasEntry(e.parentId))return e.parentId;Ne()&&process.stderr.write(`[stream-renderer] parentId_fallback_unresolved ${JSON.stringify({parentId:e.parentId,sourceId:e.sourceId})}
|
|
1621
1621
|
`)}var Ll=class{out;thinkingMode;isTTY;captureMode;reducedMotion;onCancel;onBackground;activeSkillName;history;autocompleteState;promptText;scrollRegion;onStageChange;ownsCompositor=!0;borrowedCompositor=null;priorOnCancel=void 0;interrupting=!1;softStopping=!1;coordinator=new Uy;compositor=null;overlayComposer=null;streamingMarkdownRef={current:null};toolLane=new $u;thinkingLane=new Ol;stageTracker=rW();sources=new Map;subagentMarkdown=new Map;lastProgressByTask=new Map;childActivity=new Ay;inFlightTools=new dy;disposed=!1;pauseTickInterval=null;resizeUnsub=null;sink;constructor(t){this.captureMode=t.captureMode??ny(),this.reducedMotion=t.reducedMotion??ry(),this.out=this.captureMode?uW(t.out,2):t.out;let n=t.thinkingMode??(t.verbose===!0?"live":"summary");this.thinkingMode=this.captureMode&&n==="live"?"summary":n,this.onCancel=t.onCancel,this.onBackground=t.onBackground,this.isTTY=!(t.forceNonTty??!1)&&!et()&&!!process.stdout.isTTY&&!!process.stdin.isTTY,this.activeSkillName=t.activeSkillName,this.history=t.history,this.autocompleteState=t.autocompleteState,this.promptText=t.promptText,this.scrollRegion=t.scrollRegion,this.onStageChange=t.onStageChange,t.compositor&&(this.borrowedCompositor=t.compositor,this.ownsCompositor=!1),this.sink=(r,o)=>this.process(r,o)}async arm(){if(this.disposed||!this.isTTY||this.compositor)return;let t;if(this.borrowedCompositor)t=this.borrowedCompositor,t.setInputMode("streaming"),this.priorOnCancel=t.getOnCancel(),this.onCancel&&t.setOnCancel(this.onCancel);else{let n=kl();t=new Il({stdout:process.stdout,stdin:process.stdin,...this.onCancel?{onCancel:this.onCancel}:{},...this.onBackground?{onBackground:this.onBackground}:{},...this.history?{history:this.history}:{},...this.autocompleteState?{autocompleteState:this.autocompleteState}:{},...this.promptText!==void 0?{promptText:this.promptText}:{},formatInputBuffer:r=>Wo(r,n),...this.scrollRegion?{scrollRegion:this.scrollRegion}:{},captureMode:this.captureMode,goblinSpinner:oy()}),await t.arm()}this.compositor=t,this.overlayComposer=new Hy(t,["thinking-live","markdown-pending","tool-lane","progress-banner","interrupt"]),pW(this.overlayComposer,{stageTracker:this.stageTracker,thinkingMode:this.thinkingMode,thinkingLane:this.thinkingLane,streamingMarkdownRef:this.streamingMarkdownRef,toolLane:this.toolLane,lastProgressByTask:this.lastProgressByTask,sources:this.sources,childActivity:this.childActivity,getInterrupting:()=>this.interrupting,getSoftStopping:()=>this.softStopping}),t.setSpinner({enabled:!this.reducedMotion,rotateVerbEveryMs:3500}),this.pauseTickInterval=setInterval(()=>this.checkPauseAnnotations(),80),this.resizeUnsub=mW(this.overlayComposer,!1)}getCompositor(){return this.compositor}setInterrupting(t){this.disposed||(this.interrupting=t,this.overlayComposer&&(this.overlayComposer.markDirty("interrupt"),this.overlayComposer.flush()))}setSoftStopping(t){this.disposed||(this.softStopping=t,this.overlayComposer&&(this.overlayComposer.markDirty("progress-banner"),this.overlayComposer.flush()))}buildOrchestratorCtx(){return hW({out:this.out,isTTY:this.isTTY,compositor:this.compositor,overlayComposer:this.overlayComposer,toolLane:this.toolLane,thinkingLane:this.thinkingLane,thinkingMode:this.thinkingMode,streamingMarkdown:this.streamingMarkdownRef,coordinator:this.coordinator,lastProgressByTask:this.lastProgressByTask,sources:this.sources,childActivity:this.childActivity,...this.isTTY?{stageTracker:this.stageTracker}:{},...this.activeSkillName?{activeSkillName:this.activeSkillName}:{}})}process(t,n){if(this.disposed)return;A1(t,this.inFlightTools,this.compositor);let r=n?.subagentId??fs,o=r===fs,i=this.sources.get(r);if(!i&&(i=JH(n?.agentType),this.sources.set(r,i),!o)){let s=yW({parentId:n?.parentId,sources:this.sources,toolLane:this.toolLane,sourceId:r});eR(r,i,XR({isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown,thinkingMode:this.thinkingMode,orchestratorCtx:this.buildOrchestratorCtx()}),s)}if(o){let s=this.stageTracker.stage;cW(t,i,this.buildOrchestratorCtx());let a=t.type==="chunk"&&t.chunk.type==="tool_result"&&t.chunk.isError===!0;if(this.onStageChange&&(this.stageTracker.stage!==s||a))try{a?this.onStageChange(this.stageTracker.stage,{toolErrored:!0}):this.onStageChange(this.stageTracker.stage)}catch{}}else{if(dW(t,r,i,XR({isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown,thinkingMode:this.thinkingMode,orchestratorCtx:this.buildOrchestratorCtx()})),i.lastEventAt=Date.now(),i.quietBannerAnnounced=!1,i.pauseAnnotation!==void 0&&i.syntheticAgentToolUseId){i.pauseAnnotation=void 0,i.stalledTicks=0;let a=i.agentType??r;this.toolLane.addStartWithAgentContext(i.syntheticAgentToolUseId,"Agent",`(${a})`,void 0)}if((t.type==="done"||t.type==="error")&&this.isTTY){let a=i.syntheticAgentToolUseId;if(a&&this.toolLane.hasEntry(a)){let l=this.toolLane.flushSource(a),c=this.compositor,d=this.overlayComposer,u=this.toolLane,p=this.out;this.coordinator.schedule({anchor:`after-subagent:${r}`,commits:[()=>{if(c)Yt(c,l),c.commitAbove(""),d?(d.markDirty("tool-lane"),d.flush()):c.setOverlay(u.getOverlay());else{for(let f of l)p.line(f);p.line("")}}]});try{this.streamingMarkdownRef.current&&this.streamingMarkdownRef.current.commitPending()}finally{this.coordinator.drainSubagent(r)}}Qe(this.buildOrchestratorCtx())}}}async dispose(){if(this.disposed)return;this.disposed=!0,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.lastProgressByTask.clear(),this.softStopping=!1;let t=this.streamingMarkdownRef.current?()=>this.streamingMarkdownRef.current.flush():void 0;await this.coordinator.flushAll(t),this.streamingMarkdownRef.current&&(this.streamingMarkdownRef.current.dispose(),this.streamingMarkdownRef.current=null);for(let r of this.subagentMarkdown.values()){try{await r.flush()}catch{}r.dispose()}if(this.subagentMarkdown.clear(),this.toolLane.hasPending()){let r=this.toolLane.flush();if(this.isTTY&&this.compositor)Yt(this.compositor,r),this.compositor.commitAbove(""),this.overlayComposer?(this.overlayComposer.markDirty("tool-lane"),this.overlayComposer.flush()):this.compositor.setOverlay(this.toolLane.getOverlay());else{for(let o of r)this.out.line(o);this.out.line("")}}if(this.pauseTickInterval&&(clearInterval(this.pauseTickInterval),this.pauseTickInterval=null),this.compositor){if(this.ownsCompositor)try{this.compositor.disarm()}catch{}else{try{this.compositor.setSpinner({enabled:!1})}catch(r){B("[stream-renderer] borrow-dispose setSpinner: "+String(r))}try{this.overlayComposer?(this.overlayComposer.invalidate(),this.overlayComposer.flush()):this.compositor.setOverlay("")}catch(r){B("[stream-renderer] borrow-dispose setOverlay: "+String(r))}try{this.compositor.setInputMode("idle")}catch(r){B("[stream-renderer] borrow-dispose setInputMode: "+String(r))}try{this.compositor.setOnCancel(this.priorOnCancel??null)}catch(r){B("[stream-renderer] borrow-dispose setOnCancel: "+String(r))}this.priorOnCancel=void 0}this.compositor=null,this.borrowedCompositor=null}let n=this.out;if(typeof n.flush=="function")try{n.flush()}catch{}}checkPauseAnnotations(){let t={compositor:this.compositor,disposed:this.disposed,sources:this.sources,toolLane:this.toolLane,isTTY:this.isTTY,overlayComposer:this.overlayComposer,stageTracker:this.stageTracker,thinkingMode:this.thinkingMode,thinkingLane:this.thinkingLane,streamingMarkdownRef:this.streamingMarkdownRef,lastProgressByTask:this.lastProgressByTask,out:this.out,pauseTickInterval:this.pauseTickInterval,resizeUnsub:this.resizeUnsub};gW(t),fW(t)}};function Wy(e,t){let n=t.verbose??k.AFK_SKILL_STREAM_VERBOSE==="1",r=t.out??e.out,o=e.getCompositor?.()??null;return new Ll({out:r,verbose:n,activeSkillName:t.skillName,onCancel:t.onCancel??(()=>{}),...o?{compositor:o}:{},...e.onStageChange?{onStageChange:e.onStageChange}:{}})}xr();Kd();Wa();async function bW(e,t,n,r,o){let i=Fy(e.name,t),s=e.context==="fork"?" This skill runs with context: 'fork' \u2014 the executor will fork a subagent.":"",a=`Use the \`skill\` tool with {"name": "${e.name}", "arguments": "${t}"} to dispatch this skill.${s}`,l=[];return n&&n.trim().length>0&&l.push({type:"text",text:n}),l.push({type:"text",text:i}),l.push({type:"text",text:a}),r!==void 0&&r.length>0&&o!==void 0?await $g(l,o,r):Io(l,r),l}var Tue=15e3;async function Ky(e,t){let n=Wy(e,{skillName:t.skillName,onCancel:()=>{e.session.current.interrupt().catch(()=>{})}}),r=!1,o=`/${t.skillName}${t.args?" "+t.args:""}`;await e.transcript?.appendUser?.(o).catch(()=>{});let i="",s=!1,a,l=0,c=[],d=new Map;try{await n.arm(),e.setSoftStopHandler?.(()=>{r=!0,e.session.current.interrupt().catch(()=>{})});let u;if(t.preflight)try{u=await t.preflight()}catch{u=void 0}let p=await bW(t.skillMeta,t.args,u,t.attachments,e.stats.sessionId);await da(n.sink,async()=>{for await(let f of e.session.current.sendMessageStream(p)){if(r)break;if(f.type==="message"&&f.message.role==="assistant"&&(i=f.message.content),f.type==="chunk"&&f.chunk.type==="tool_use_detail"){let g=f.chunk,h={toolName:g.toolName,toolUseId:g.toolUseId,input:g.toolInput};d.set(g.toolUseId,h),c.push(h)}else if(f.type==="chunk"&&f.chunk.type==="tool_result"){let g=f.chunk,h=d.get(g.toolUseId);if(h&&(h.result=g.content,h.isError=g.isError,d.delete(g.toolUseId)),e.onContextProgress){let y=Date.now();if(y-l>=Tue){l=y;try{let b=e.onContextProgress();b instanceof Promise&&await b}catch{}}}}else f.type==="done"&&(s=!0,a=f.metadata);n.sink(f)}})}finally{e.setSoftStopHandler?.(null),await n.dispose();try{e.onStageChange?.("observing")}catch{}}if(s&&!r){es(e.stats,o,i,a,c);try{e.ui.repaintStatusLine()}catch{}await e.transcript?.appendTurn(o,i).catch(()=>{})}return i}K();import{execFile as Eue}from"child_process";import{promisify as Rue}from"util";import{writeFileSync as xue}from"fs";import{join as Aue}from"path";var Cue=Rue(Eue),_ue=4*1024*1024,QR=!1;function ZR(e){let t=e.trim();if(!t)return null;if(/^#?\d+$/.test(t)){let r=t.replace(/^#/,""),o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number: ${r}. Must be 1\u2013999999.`);return r}let n=t.match(/github\.com\/[^/]+\/[^/]+\/pull\/(\d+)/);if(n&&n[1]){let r=n[1],o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number in URL: ${r}. Must be 1\u2013999999.`);return r}return null}async function Iue(e,t,n){try{let{stdout:r}=await Cue(e,t,{encoding:"utf-8",...n?.cwd?{cwd:n.cwd}:{},maxBuffer:n?.maxBuffer??_ue,timeout:8e3});return r}catch(r){if(k.AFK_DEBUG==="1"&&r instanceof Error&&"stderr"in r){let i=String(r.stderr??"").replace(/\x1b\[[0-9;]*m/g,"").slice(0,200).trim();i&&process.stderr.write(`[afk preflight] ${e} stderr: ${i}
|
|
1622
1622
|
`)}return null}}async function Pue(e,t,n={}){let r=n.exec??Iue,o=n.writeFile??((f,g)=>xue(f,g,"utf-8")),[i,s,a]=await Promise.all([r("gh",["pr","view",e,"--json","title,baseRefName,headRefName,additions,deletions,changedFiles,files"],{cwd:t.cwd}),r("gh",["pr","diff",e],{cwd:t.cwd}),r("git",["status","--porcelain"],{cwd:t.cwd})]),l=null;if(i)try{l=JSON.parse(i)}catch{l=null}let c=null,d=null;if(s!==null){let f=Aue(t.artifactDir,`pr-${e}.diff`);try{o(f,s),c=f,d=s.trimEnd().split(`
|
|
@@ -1759,7 +1759,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
1759
1759
|
`)),r({text:s.text,attachments:[...s.attachments]})};n.setOnSubmit(i),t.initialBuffer!==void 0&&t.initialBuffer.length>0&&n.prefillInput(t.initialBuffer),n.setInputMode("idle"),n.repaint()})}return _2({rl:this.rl,promptFn:t.promptFn,...t.initialBuffer!==void 0?{initialBuffer:t.initialBuffer}:{},...t.onSigint?{onSigint:t.onSigint}:{},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.compositor?{compositor:t.compositor}:{},history:this.history,autocompleteState:this.autocompleteState,...this.statusLine?{statusLine:this.statusLine}:{}})}isAwaitingInput(){return this.pendingReadResolve!==null}bufferIsEmpty(){let t=this.compositor?.getBuffer();return t?t.text.length===0&&!t.queued:!0}abortPendingRead(){if(!this.pendingReadResolve)return;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"",attachments:[]})}requestRewind(){if(!this.pendingReadResolve)return!1;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;return this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"/rewind",attachments:[]}),!0}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};K();Rr();ue();K();var Xx=["default","plan","bypassPermissions"];function $he(e,t){switch(t){case"plan":e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 writes refused; read-only bash runs, mutating bash blocked."));return;case"bypassPermissions":e.out.line(m.bypass("\u26A1 bypass ON")+m.dim(" \u2014 path-approval prompts + containment OFF; read/write any path. (Does not affect ask_question.)"));return;case"default":e.out.success(m.success("\u25CB default")+m.dim(" \u2014 path containment + approval prompts restored."));return}}async function Nb(e){let t=e.stats.permissionMode;if(t==="autonomous"){await ju(e,!1);return}let n=Xx.indexOf(t),r=Xx[(n+1)%Xx.length]??"default";try{await e.session.current.setPermissionMode(r),e.stats.permissionMode=r,e.ui.repaintStatusLine(),$he(e,r)}catch(o){e.out.error(`Could not switch permission mode: ${o instanceof Error?o.message:String(o)}`)}}nu();function Kl(e){let t=m.brand("afk"),n=e==="plan"?m.warning(" \u25CF"):e==="autonomous"?m.info(" \u25D0"):e==="bypassPermissions"?m.bypass(" \u26A1 bp"):"";return t+n+m.brand(" \u203A ")}async function I2(e,t,n,r,o,i,s){let a=z1({onError:p=>B("[afk suggest] Tier-2 completion failed:",p)});await t.armCompositor({promptFn:()=>Kl(e.stats.permissionMode),onCancel:o,onShiftTab:()=>{Nb(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},onOpenEditor:()=>{let p=t.getCompositor();bb({compositor:p,notify:(f,g)=>{let h=f==="error"?m.error(g):f==="warn"?m.warning(g):m.dim(g);p?.commitAbove(h)}}).catch(()=>{})},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...i?{suggest:{engine:a,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let p=t.history;return p.getEntries?[...p.getEntries()]:[]},getDropdownTopCandidate:p=>{let g=t.autocompleteState.candidates[0];return g&&g.value.startsWith(p)&&g.value.length>p.length?g.value:null},getTranscriptTail:()=>{let p=e.stats.turns;return p.length===0?"":p.slice(-2).reverse().map(f=>`user: ${f.user}
|
|
1760
1760
|
assistant: ${f.assistant}`).join(`
|
|
1761
1761
|
`)},getRecentCommands:()=>{let p=t.history;return p.getEntries?[...p.getEntries()]:[]},llmEnabled:()=>/^(1|true|yes|on)$/i.test(k.AFK_SUGGEST_ENABLED??"")})}}:{}});let l=t.getCompositor(),c=Bu({readLine:p=>t.readLine({promptFn:()=>p}).then(f=>f.text),writer:{line:(p="")=>{let f=t.getCompositor();f?f.commitAbove(p):process.stdout.write(p+`
|
|
1762
|
-
`)}},pendingCount:()=>Je.pendingCount(),...l?{pickFromList:p=>Sn(l,p),readTextOverlay:p=>Sb(l,p)}:{}});Je.install(c),e.replRenderer.setCompositor(t.getCompositor()),e.slashCtx.getCompositor=()=>t.getCompositor();let d=t.getCompositor();if(d){let p=f=>d.commitAbove(f);e.completionWriter.fn=p,e.completionWriter.idleFn=p}let u=p=>{t.setSoftStopHandler(p),n.requestSoftStop=p};return e.slashCtx.setSoftStopHandler=u,e.slashCtx.onStageChange=(p,f)=>{s.getLoopStageBar()?.repaint(p),s.getMascotBar()?.onStage(p,f)},e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))},e.slashCtx.transcript=r,e.slashCtx.stdinElicitationHandler=c,e.slashCtx.swapElicitationHandler=p=>Je.install(p??c),e.inputSurfaceRef&&(e.inputSurfaceRef.current=t),e.gitStatusSampler.setOnUpdate(()=>{e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))}),e.gitStatusSampler.refresh(),eB(()=>{e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))}),{installSoftStop:u}}function P2(e={}){let t=e.load??mb,n=e.onResize??(s=>Le.subscribe(s)),r="",o,i=n(()=>{r=""});return{renderIfChanged(s){let a=s??"unbound",l=t(a),c=QK(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:fb(l))},invalidate(){r=""},dispose(){try{i()}catch{}}}}K();var Qx={done:{glyph:"\u2713",color:m.success,label:"done"},blocked:{glyph:"\u2298",color:m.error,label:"blocked"},asking:{glyph:"?",color:m.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:m.meta,label:"interrupted"}};function M2(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,i=!1,s=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function d(g){let h=o();return Math.max(1,g-1-h)}function u(){if(!i||!r?.isTTY)return;let g=f(),h=c(),y=g!==null&&h>1?1:0;if(y!==s&&(s>0&&p(),s=y,a?.(s)),y===0)return;let b=d(h);r.write("\x1B[s"),r.write(`\x1B[${b};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function p(){if(!r?.isTTY)return;let g=c(),h=d(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=m.dim(" ledger "),h=m.dim(" \xB7 "),y=n.map(E=>{let x=Qx[E];return x.color(`${x.glyph} ${x.label}`)}),b=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+y.join(h)+b,S=Math.max(20,ne()-2);if(ee(w)<=S)return w;let v=g+n.map(E=>Qx[E].color(Qx[E].glyph)).join(m.dim(" "))+b;return ce(v,S)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),u()},reset(){n=[],i&&s>0&&(p(),s=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){i||et()||(i=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),s=0,l=Le.subscribe(()=>u()),u())},stop(){i&&(i=!1,l!==null&&(l(),l=null),s>0&&(p(),s=0,a?.(0)),r=null)},repaint(){u()}}}K();var O2=["\u25D0","\u25D1","\u25D2","\u25D3"],Bb=class{stream;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;resizeImmediateUnsub=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;lastPaintStartRow=0;preResizeStartRow=null;preResizeRowCount=null;onRowCountChange;getAdjacentRows;constructor(t,n={}){this.registry=t,this.stream=n.stream??process.stdout,this.throttleMs=n.throttleMs??200,this.getAdjacentRows=n.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||et()||(this.started=!0,this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=Le.subscribe(()=>this.repaint()),this.resizeImmediateUnsub=Le.subscribeImmediate(()=>this.resetGeometry()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%O2.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}resetGeometry(){this.rowCount>0&&(this.preResizeStartRow=this.lastPaintStartRow,this.preResizeRowCount=this.rowCount),this.rowCount=0,this.lastRepaint=0}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s})),n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(this.clearPreResizeRows(),o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let i=Math.max(1,n-o-r);this.lastPaintStartRow=i,this.stream.write("\x1B[s");for(let s=0;s<o;s++){let a=t[s],l=i+s;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let i=0;i<r;i++)this.stream.write(`\x1B[${o+i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}clearPreResizeRows(){let t=this.preResizeStartRow,n=this.preResizeRowCount;if(this.preResizeStartRow=null,this.preResizeRowCount=null,t===null||n===null||!this.stream.isTTY)return;let r=this.stream.rows??24,o=[];for(let i=0;i<n;i++){let s=t+i;s<=r&&o.push(s)}if(o.length!==0){this.stream.write("\x1B[s");for(let i of o)this.stream.write(`\x1B[${i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}}formatItemLine(t){return this.formatJobLine(t.job)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(O2[this.spinnerIndex]),o=m.dim(t.jobId),i=m.bold(t.label||t.jobId),s=[r,o,i],a=Date.now()-t.startedAt;return s.push(m.dim(xe(a))),ce(" "+s.join(" "),n)}};K();var $2=13,D2=3,Dhe=[".....BBB.....","...BBBBBBB...","..KYYYYYYYK..","DDKMMMMMMMKDD"];function Es(e,t){return[...Dhe,e,t]}var Zx=".DKMYMMMYMKD.",Fhe=".DKM.MMM.MKD.",Lhe=".DKMLMMMLMKD.",Nhe="DDKMRMMMRMKDD",Bhe="DDKM.MMM.MKDD",eA="..KMMKKKMMK..",tA="..KMKKKKKMK..",Uhe="..KKKKKKKKK..",F2={idle:[Es(Zx,eA)],working:[Es(Zx,eA),Es(Fhe,tA),Es(Lhe,eA),Es(Zx,tA)],alert:[Es(Nhe,Uhe),Es(Bhe,tA)]};function L2(e){return F2[e].length}function N2(e="idle",t=0){if(Ks())return[];let n=F2[e],r=(t%n.length+n.length)%n.length;return sS(n[r]??n[0])}var B2=D2,jhe=8,U2=" ",Hhe=1500,Whe=220,Ub=class{stream;getAdjacentRows;frameMs;started=!1;state="idle";frame=0;rowCount=0;lastStartRow=0;lastRowCount=0;timer=null;stageState="idle";alertTimer=null;resizeUnsub=null;onRowCountChange;constructor(t){this.stream=t.stream??process.stdout,this.getAdjacentRows=t.getAdjacentRows,this.frameMs=t.frameMs??Whe}setRowCountChangeHandler(t){this.onRowCountChange=t}stop(){this.started&&(this.started=!1,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.stopTimer(),this.clearAlertTimer(),this.clearBand(),this.rowCount=0,this.state="idle",this.stageState="idle",this.onRowCountChange?.(0))}start(){this.started||zj()&&(et()||Ks()||this.stream.isTTY&&(this.started=!0,this.resizeUnsub=Le.subscribe(()=>this.repaint())))}setState(t){!this.started||t===this.state||(this.state=t,this.frame=0,t==="idle"?this.stopTimer():this.startTimer(),this.repaint())}onStage(t,n){if(this.started){if(this.stageState=t==="acting"?"working":"idle",n?.toolErrored){this.flashAlert();return}this.alertTimer||this.setState(this.stageState)}}redraw(){this.repaint()}getRowCount(){return this.rowCount}clearBand(){if(!this.stream.isTTY||this.lastRowCount<=0)return;let t=this.stream.rows??24;this.stream.write("\x1B[s");for(let n=0;n<this.lastRowCount;n++){let r=this.lastStartRow+n;r<1||r>t||(this.stream.write(`\x1B[${r};1H`),this.stream.write("\x1B[2K"))}this.stream.write("\x1B[u"),this.lastRowCount=0,this.lastStartRow=0}repaint(){if(!this.started||!this.stream.isTTY)return;let t=this.state==="idle"?[]:N2(this.state,this.frame),n=t.length>0?this.visibleRows():0,r=this.stream.rows??24,o=this.getAdjacentRows(),i=Math.max(1,r-n-o);if(this.lastRowCount>0&&(n!==this.lastRowCount||i!==this.lastStartRow)&&this.clearBand(),n!==this.rowCount&&(this.rowCount=n,this.onRowCountChange?.(n)),n!==0){this.stream.write("\x1B[s");for(let s=0;s<n;s++){let a=i+s;a<1||a>r||(this.stream.write(`\x1B[${a};1H`),this.stream.write("\x1B[2K"),this.stream.write(U2+(t[s]??"")))}this.stream.write("\x1B[u"),this.lastStartRow=i,this.lastRowCount=n}}visibleRows(){let t=this.stream.rows??24;return(this.stream.columns??80)<$2+U2.length+1?0:t-1-this.getAdjacentRows()-1-jhe>=B2?B2:0}clearAlertTimer(){this.alertTimer&&(clearTimeout(this.alertTimer),this.alertTimer=null)}flashAlert(){this.clearAlertTimer(),this.setState("alert"),this.alertTimer=setTimeout(()=>{this.alertTimer=null,this.setState(this.stageState)},Hhe),this.alertTimer.unref?.()}stopTimer(){this.timer&&(clearInterval(this.timer),this.timer=null)}startTimer(){this.timer||L2(this.state)<=1||(this.timer=setInterval(()=>{this.frame+=1,this.repaint()},this.frameMs),this.timer.unref?.())}};import{spawn as Khe}from"node:child_process";var Ghe=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function qhe(){let e="";return{strip(t){let r=(e+t).replace(Ghe,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function j2(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var H2=12e4,W2=1e5;function nA(e){let t=Date.now(),n=e.timeoutMs??H2,r=e.maxBytes??W2,o=qhe(),i;try{i=Khe(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(E){let x=E instanceof Error?E.message:String(E);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${x}`})}}i.unref();let s,a=!1,l=new Promise(E=>{s=x=>{a||(a=!0,E(x))}}),c="",d="",u=0,p=0,f=!1,g=!1,h=!1;function y(E){let x=r-u;if(x>0){let D=E.length<=x?E:j2(E,x);u+=D.length,c+=D.toString("utf8"),E.length>x&&(f=!0)}else E.length>0&&(f=!0);if(p<r){let D=o.strip(E.toString("utf8")),I=Buffer.byteLength(D,"utf8"),A=r-p;if(I<=A)d+=D,p+=I;else{let _=Buffer.from(D,"utf8");d+=j2(_,A).toString("utf8"),p=r,f=!0}}}function b(){if(i.pid!==void 0&&i.pid!==0&&!i.killed)try{process.kill(-i.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{b(),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),S=()=>{b(),clearTimeout(w),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",S);function v(){g||a||u<r&&p<r||(g=!0,b(),clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return i.stdout?.on("data",E=>{y(E);try{e.onChunk?.(E,"stdout")}catch{}v()}),i.stderr?.on("data",E=>{y(E);try{e.onChunk?.(E,"stderr")}catch{}v()}),i.on("error",E=>{clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${E.message}`})}),i.on("close",(E,x)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",S),!(g||a)){if(o.flush(),h){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(E!==null&&E!==0){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${E}`});return}if(E===null){s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"signal-killed",errorMessage:x?`Command killed by signal ${x}`:"Command killed by signal"});return}s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f})}}),{pid:i.pid,promise:l,kill:(E="SIGKILL")=>{if(!(i.pid===void 0||i.pid===0||i.killed)){h=!0;try{process.kill(-i.pid,E)}catch{}}}}}import{EventEmitter as zhe}from"node:events";var K2=200,qu=class extends zhe{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=nA({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),i={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,i),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(s=>{i.result=s,i.status=Jhe(s),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",i)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:i,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=K2))for(let[t,n]of this.jobs){if(this.jobs.size<=K2)break;n.status!=="running"&&this.jobs.delete(t)}}};function Jhe(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function Yhe(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function Vhe(e,t){let n=xe(t.durationMs);return t.errorReason==="abort"?m.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?m.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?m.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?m.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?m.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?m.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):m.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function G2(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Xhe(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${xe(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${G2(e)}</command>`),r.push("<output>"),r.push(G2(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
|
|
1762
|
+
`)}},pendingCount:()=>Je.pendingCount(),...l?{pickFromList:p=>Sn(l,p),readTextOverlay:p=>Sb(l,p)}:{}});Je.install(c),e.replRenderer.setCompositor(t.getCompositor()),e.slashCtx.getCompositor=()=>t.getCompositor();let d=t.getCompositor();if(d){let p=f=>d.commitAbove(f);e.completionWriter.fn=p,e.completionWriter.idleFn=p}let u=p=>{t.setSoftStopHandler(p),n.requestSoftStop=p};return e.slashCtx.setSoftStopHandler=u,e.slashCtx.onStageChange=(p,f)=>{s.getLoopStageBar()?.repaint(p),s.getMascotBar()?.onStage(p,f)},e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))},e.slashCtx.transcript=r,e.slashCtx.stdinElicitationHandler=c,e.slashCtx.swapElicitationHandler=p=>Je.install(p??c),e.inputSurfaceRef&&(e.inputSurfaceRef.current=t),e.gitStatusSampler.setOnUpdate(()=>{e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))}),e.gitStatusSampler.refresh(),eB(()=>{e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))}),{installSoftStop:u}}function P2(e={}){let t=e.load??mb,n=e.onResize??(s=>Le.subscribe(s)),r="",o,i=n(()=>{r=""});return{renderIfChanged(s){let a=s??"unbound",l=t(a),c=QK(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:fb(l))},invalidate(){r=""},dispose(){try{i()}catch{}}}}K();var Qx={done:{glyph:"\u2713",color:e=>m.success(e),label:"done"},blocked:{glyph:"\u2298",color:e=>m.error(e),label:"blocked"},asking:{glyph:"?",color:e=>m.warning(e),label:"asking"},interrupted:{glyph:"\u23F8",color:e=>m.meta(e),label:"interrupted"}};function M2(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,i=!1,s=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function d(g){let h=o();return Math.max(1,g-1-h)}function u(){if(!i||!r?.isTTY)return;let g=f(),h=c(),y=g!==null&&h>1?1:0;if(y!==s&&(s>0&&p(),s=y,a?.(s)),y===0)return;let b=d(h);r.write("\x1B[s"),r.write(`\x1B[${b};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function p(){if(!r?.isTTY)return;let g=c(),h=d(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=m.dim(" ledger "),h=m.dim(" \xB7 "),y=n.map(E=>{let x=Qx[E];return x.color(`${x.glyph} ${x.label}`)}),b=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+y.join(h)+b,S=Math.max(20,ne()-2);if(ee(w)<=S)return w;let v=g+n.map(E=>Qx[E].color(Qx[E].glyph)).join(m.dim(" "))+b;return ce(v,S)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),u()},reset(){n=[],i&&s>0&&(p(),s=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){i||et()||(i=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),s=0,l=Le.subscribe(()=>u()),u())},stop(){i&&(i=!1,l!==null&&(l(),l=null),s>0&&(p(),s=0,a?.(0)),r=null)},repaint(){u()}}}K();var O2=["\u25D0","\u25D1","\u25D2","\u25D3"],Bb=class{stream;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;resizeImmediateUnsub=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;lastPaintStartRow=0;preResizeStartRow=null;preResizeRowCount=null;onRowCountChange;getAdjacentRows;constructor(t,n={}){this.registry=t,this.stream=n.stream??process.stdout,this.throttleMs=n.throttleMs??200,this.getAdjacentRows=n.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||et()||(this.started=!0,this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=Le.subscribe(()=>this.repaint()),this.resizeImmediateUnsub=Le.subscribeImmediate(()=>this.resetGeometry()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%O2.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}resetGeometry(){this.rowCount>0&&(this.preResizeStartRow=this.lastPaintStartRow,this.preResizeRowCount=this.rowCount),this.rowCount=0,this.lastRepaint=0}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s})),n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(this.clearPreResizeRows(),o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let i=Math.max(1,n-o-r);this.lastPaintStartRow=i,this.stream.write("\x1B[s");for(let s=0;s<o;s++){let a=t[s],l=i+s;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let i=0;i<r;i++)this.stream.write(`\x1B[${o+i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}clearPreResizeRows(){let t=this.preResizeStartRow,n=this.preResizeRowCount;if(this.preResizeStartRow=null,this.preResizeRowCount=null,t===null||n===null||!this.stream.isTTY)return;let r=this.stream.rows??24,o=[];for(let i=0;i<n;i++){let s=t+i;s<=r&&o.push(s)}if(o.length!==0){this.stream.write("\x1B[s");for(let i of o)this.stream.write(`\x1B[${i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}}formatItemLine(t){return this.formatJobLine(t.job)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(O2[this.spinnerIndex]),o=m.dim(t.jobId),i=m.bold(t.label||t.jobId),s=[r,o,i],a=Date.now()-t.startedAt;return s.push(m.dim(xe(a))),ce(" "+s.join(" "),n)}};K();var $2=13,D2=3,Dhe=[".....BBB.....","...BBBBBBB...","..KYYYYYYYK..","DDKMMMMMMMKDD"];function Es(e,t){return[...Dhe,e,t]}var Zx=".DKMYMMMYMKD.",Fhe=".DKM.MMM.MKD.",Lhe=".DKMLMMMLMKD.",Nhe="DDKMRMMMRMKDD",Bhe="DDKM.MMM.MKDD",eA="..KMMKKKMMK..",tA="..KMKKKKKMK..",Uhe="..KKKKKKKKK..",F2={idle:[Es(Zx,eA)],working:[Es(Zx,eA),Es(Fhe,tA),Es(Lhe,eA),Es(Zx,tA)],alert:[Es(Nhe,Uhe),Es(Bhe,tA)]};function L2(e){return F2[e].length}function N2(e="idle",t=0){if(Ks())return[];let n=F2[e],r=(t%n.length+n.length)%n.length;return sS(n[r]??n[0])}var B2=D2,jhe=8,U2=" ",Hhe=1500,Whe=220,Ub=class{stream;getAdjacentRows;frameMs;started=!1;state="idle";frame=0;rowCount=0;lastStartRow=0;lastRowCount=0;timer=null;stageState="idle";alertTimer=null;resizeUnsub=null;onRowCountChange;constructor(t){this.stream=t.stream??process.stdout,this.getAdjacentRows=t.getAdjacentRows,this.frameMs=t.frameMs??Whe}setRowCountChangeHandler(t){this.onRowCountChange=t}stop(){this.started&&(this.started=!1,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.stopTimer(),this.clearAlertTimer(),this.clearBand(),this.rowCount=0,this.state="idle",this.stageState="idle",this.onRowCountChange?.(0))}start(){this.started||zj()&&(et()||Ks()||this.stream.isTTY&&(this.started=!0,this.resizeUnsub=Le.subscribe(()=>this.repaint())))}setState(t){!this.started||t===this.state||(this.state=t,this.frame=0,t==="idle"?this.stopTimer():this.startTimer(),this.repaint())}onStage(t,n){if(this.started){if(this.stageState=t==="acting"?"working":"idle",n?.toolErrored){this.flashAlert();return}this.alertTimer||this.setState(this.stageState)}}redraw(){this.repaint()}getRowCount(){return this.rowCount}clearBand(){if(!this.stream.isTTY||this.lastRowCount<=0)return;let t=this.stream.rows??24;this.stream.write("\x1B[s");for(let n=0;n<this.lastRowCount;n++){let r=this.lastStartRow+n;r<1||r>t||(this.stream.write(`\x1B[${r};1H`),this.stream.write("\x1B[2K"))}this.stream.write("\x1B[u"),this.lastRowCount=0,this.lastStartRow=0}repaint(){if(!this.started||!this.stream.isTTY)return;let t=this.state==="idle"?[]:N2(this.state,this.frame),n=t.length>0?this.visibleRows():0,r=this.stream.rows??24,o=this.getAdjacentRows(),i=Math.max(1,r-n-o);if(this.lastRowCount>0&&(n!==this.lastRowCount||i!==this.lastStartRow)&&this.clearBand(),n!==this.rowCount&&(this.rowCount=n,this.onRowCountChange?.(n)),n!==0){this.stream.write("\x1B[s");for(let s=0;s<n;s++){let a=i+s;a<1||a>r||(this.stream.write(`\x1B[${a};1H`),this.stream.write("\x1B[2K"),this.stream.write(U2+(t[s]??"")))}this.stream.write("\x1B[u"),this.lastStartRow=i,this.lastRowCount=n}}visibleRows(){let t=this.stream.rows??24;return(this.stream.columns??80)<$2+U2.length+1?0:t-1-this.getAdjacentRows()-1-jhe>=B2?B2:0}clearAlertTimer(){this.alertTimer&&(clearTimeout(this.alertTimer),this.alertTimer=null)}flashAlert(){this.clearAlertTimer(),this.setState("alert"),this.alertTimer=setTimeout(()=>{this.alertTimer=null,this.setState(this.stageState)},Hhe),this.alertTimer.unref?.()}stopTimer(){this.timer&&(clearInterval(this.timer),this.timer=null)}startTimer(){this.timer||L2(this.state)<=1||(this.timer=setInterval(()=>{this.frame+=1,this.repaint()},this.frameMs),this.timer.unref?.())}};import{spawn as Khe}from"node:child_process";var Ghe=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function qhe(){let e="";return{strip(t){let r=(e+t).replace(Ghe,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function j2(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var H2=12e4,W2=1e5;function nA(e){let t=Date.now(),n=e.timeoutMs??H2,r=e.maxBytes??W2,o=qhe(),i;try{i=Khe(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(E){let x=E instanceof Error?E.message:String(E);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${x}`})}}i.unref();let s,a=!1,l=new Promise(E=>{s=x=>{a||(a=!0,E(x))}}),c="",d="",u=0,p=0,f=!1,g=!1,h=!1;function y(E){let x=r-u;if(x>0){let D=E.length<=x?E:j2(E,x);u+=D.length,c+=D.toString("utf8"),E.length>x&&(f=!0)}else E.length>0&&(f=!0);if(p<r){let D=o.strip(E.toString("utf8")),I=Buffer.byteLength(D,"utf8"),A=r-p;if(I<=A)d+=D,p+=I;else{let _=Buffer.from(D,"utf8");d+=j2(_,A).toString("utf8"),p=r,f=!0}}}function b(){if(i.pid!==void 0&&i.pid!==0&&!i.killed)try{process.kill(-i.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{b(),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),S=()=>{b(),clearTimeout(w),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",S);function v(){g||a||u<r&&p<r||(g=!0,b(),clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return i.stdout?.on("data",E=>{y(E);try{e.onChunk?.(E,"stdout")}catch{}v()}),i.stderr?.on("data",E=>{y(E);try{e.onChunk?.(E,"stderr")}catch{}v()}),i.on("error",E=>{clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${E.message}`})}),i.on("close",(E,x)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",S),!(g||a)){if(o.flush(),h){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(E!==null&&E!==0){s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${E}`});return}if(E===null){s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"signal-killed",errorMessage:x?`Command killed by signal ${x}`:"Command killed by signal"});return}s({exitCode:E,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f})}}),{pid:i.pid,promise:l,kill:(E="SIGKILL")=>{if(!(i.pid===void 0||i.pid===0||i.killed)){h=!0;try{process.kill(-i.pid,E)}catch{}}}}}import{EventEmitter as zhe}from"node:events";var K2=200,qu=class extends zhe{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=nA({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),i={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,i),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(s=>{i.result=s,i.status=Jhe(s),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",i)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:i,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=K2))for(let[t,n]of this.jobs){if(this.jobs.size<=K2)break;n.status!=="running"&&this.jobs.delete(t)}}};function Jhe(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function Yhe(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function Vhe(e,t){let n=xe(t.durationMs);return t.errorReason==="abort"?m.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?m.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?m.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?m.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?m.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?m.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):m.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function G2(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Xhe(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${xe(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${G2(e)}</command>`),r.push("<output>"),r.push(G2(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
|
|
1763
1763
|
`)}var jb=class e{constructor(t){this.opts=t;this.registry.on("complete",n=>{if(n.mode!=="background")return;let r=n.result;r&&(this.queueInjection({command:n.command,mode:"background",result:r}),this.pendingNotifications.push({job:n,result:r}),this.pendingNotifications.length>e.MAX_PENDING_NOTIFICATIONS&&this.pendingNotifications.shift())})}opts;registry=new qu;pendingInjections=[];pendingNotifications=[];activeFgJobId=null;static MAX_PENDING_INJECTIONS=25;static MAX_PENDING_NOTIFICATIONS=50;async dispatch(t){let n=Yhe(t);return n===null?t==="!"||t==="!&"||t.startsWith("! ")||t.startsWith("!& ")?(this.opts.writeLine(m.dim(" usage: !<cmd> (foreground) !&<cmd> (background)")),!0):!1:(n.mode==="foreground"?await this.runForeground(n.command):this.startBackground(n.command),!0)}drainInjections(){if(this.pendingInjections.length===0)return"";let t=this.pendingInjections.map(n=>Xhe(n.command,n.mode,n.result));return this.pendingInjections=[],t.join(`
|
|
1764
1764
|
`)+`
|
|
1765
1765
|
`}drainNotifications(){if(this.pendingNotifications.length===0)return[];let t=this.pendingNotifications;return this.pendingNotifications=[],t}abortActiveForeground(){return this.activeFgJobId===null?!1:(this.registry.kill(this.activeFgJobId),!0)}hasActiveForeground(){return this.activeFgJobId!==null}drainOnExit(){let t=this.registry.killAll();t.length>0&&this.opts.writeLine(m.dim(` Killing ${t.length} background shell job${t.length===1?"":"s"} on exit.`))}async runForeground(t){this.opts.writeLine(m.dim(`$ ${t}`));let n="",r=!1,o=()=>{let c;for(;(c=n.indexOf(`
|
|
@@ -1774,7 +1774,7 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
|
|
|
1774
1774
|
`),n=t.slice(Math.max(0,t.length-40)),r=-1,o=null;for(let l=n.length-1;l>=0;l--){let c=n[l]??"",d=dye(c);if(d){r=l,o=d;break}}if(o===null||r<0)return null;let i=n.slice(r+1).map(l=>l.trim());for(;i.length>0&&i[0]==="";)i.shift();for(;i.length>0&&i[i.length-1]==="";)i.pop();let s=uye(i),a=i.join(`
|
|
1775
1775
|
`).trim();return{kind:o,rawBody:a,...pye(o,s)}}function dye(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function uye(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),i=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let a=t[t.length-1];a.value=`${a.value} ${r}`.trim();continue}let s=i.indexOf(":");if(s>0&&s<60){let a=i.slice(0,s).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^(?:\*\*|__)\s*/,"").toLowerCase(),l=i.slice(s+1).trim().replace(/^(?:\*\*|__)\s/,"");t.push({label:a,value:l})}else t.push({label:"",value:i})}return t}function pye(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let i of r)if(o.label.includes(i))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let i=n("evidence","what changed","change","artifact","output");i!==void 0&&(r.evidence=i);let s=n("pending","deferred","follow-up","followup","next");return s!==void 0&&(r.deferred=s),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let i=n("unblock","must change","to unblock","condition");i!==void 0&&(r.unblockCondition=i);let s=n("has already","been done","already done","what has been done","progress");return s!==void 0&&(r.alreadyDone=s),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let i=n("assumption","resolves");i!==void 0&&(r.assumption=i);let s=n("once answered","follow-up","next","will do","after");return s!==void 0&&(r.followup=s),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let i=n("state was saved","state","saved","where");i!==void 0&&(r.stateLocation=i);let s=n("resumption","resume","requires");return s!==void 0&&(r.resumeRequires=s),r}}}function V2(e,t){return e.length===0||t.length===0||/\s$/.test(e)||/^\s/.test(t)?e+t:e+`
|
|
1776
1776
|
|
|
1777
|
-
`+t}var mye={done:{color:m.success,chip:"\u2713 Done",affordance:"Objective satisfied - review evidence and close."},blocked:{color:m.error,chip:"\u2298 Blocked",affordance:"External dependency - unblock above to resume."},asking:{color:m.warning,chip:"? Asking",affordance:"Waiting on you - answer above to continue."},interrupted:{color:m.meta,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved - resume when ready."}};function X2(e){let t=mye[e.kind],n=Math.max(34,Math.min(ne()-6,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-ee(` ${t.chip} `)))+"\u256E"),i=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),s=t.color("\u2502"),a=s+" ".repeat(n+4)+s,l=fye(e),c=l.reduce((f,g)=>Math.max(f,ee(g.label)),0),d=Math.max(8,n-c-2),u=[o,a];if(l.length===0){let f=e.rawBody.split(`
|
|
1777
|
+
`+t}var mye={done:{color:e=>m.success(e),chip:"\u2713 Done",affordance:"Objective satisfied - review evidence and close."},blocked:{color:e=>m.error(e),chip:"\u2298 Blocked",affordance:"External dependency - unblock above to resume."},asking:{color:e=>m.warning(e),chip:"? Asking",affordance:"Waiting on you - answer above to continue."},interrupted:{color:e=>m.meta(e),chip:"\u23F8 Interrupted",affordance:"Halted with state preserved - resume when ready."}};function X2(e){let t=mye[e.kind],n=Math.max(34,Math.min(ne()-6,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-ee(` ${t.chip} `)))+"\u256E"),i=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),s=t.color("\u2502"),a=s+" ".repeat(n+4)+s,l=fye(e),c=l.reduce((f,g)=>Math.max(f,ee(g.label)),0),d=Math.max(8,n-c-2),u=[o,a];if(l.length===0){let f=e.rawBody.split(`
|
|
1778
1778
|
`).find(y=>y.trim().length>0)?.trim()??"",g=f.length>0?f:`${e.kind} (no structured fields)`,h=Se(ro(g),n).split(`
|
|
1779
1779
|
`);for(let y of h)u.push(s+" "+tt(y,n)+" "+s)}else for(let f of l){let g=m.dim(tt(f.label,c)),h=Se(ro(f.value),d).split(`
|
|
1780
1780
|
`),y=h[0]??"";u.push(s+" "+g+" "+tt(y,d)+" "+s);for(let b of h.slice(1))u.push(s+" "+" ".repeat(c)+" "+tt(b,d)+" "+s)}u.push(a);let p=m.dim(ce(t.affordance,n));return u.push(s+" "+tt(p,n)+" "+s),u.push(i),u.join(`
|
|
@@ -1784,7 +1784,7 @@ ${v}
|
|
|
1784
1784
|
${E}`})}return{fileBlocks:l,warnings:c}}async function eq(e,t,n,r,o="summary",i,s){let a=sH(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),vl(process.stdout,fu(process.cwd(),!0));let l="",c=0,d=!1,u=!1,p=!1,f=!1,g=!1,h,y=!1,b=!1,w={abort:null},S=0,v=3e3,E=[],x=new Map,D=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,I=()=>{let N=r.subagentControl;N?.hasPromotableForeground()&&N.promoteActiveForeground().then(H=>{for(let G of H)(i??{fn:console.log}).fn(m.dim(` \u2192 subagent backgrounded as ${G.jobId}: ${G.label}`))}).catch(()=>{})},A=r.getCompositor?r.getCompositor():null,_=()=>new Ll({out:Nl(i),thinkingMode:o,...D?{activeSkillName:D}:{},onCancel:()=>{t.interrupt().catch(N=>{Ne()&&console.error(" "+m.error("session.interrupt() failed:"),N)})},...r.subagentControl?{onBackground:I}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...A?{compositor:A}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),C=_(),$=async()=>{if(!f){f=!0;try{await C.dispose()}catch{}}},U=async()=>{await C.arm();let N=C.getCompositor();if(i&&N){let H=N;i.fn=G=>H.commitAbove(G),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(N),r.setInterruptNotifier?.(H=>C.setInterrupting(H)),r.rearmStatus?.()};try{A?A.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{y=!0,C.setSoftStopping(!0),t.interrupt().catch(O=>{Ne()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),O)});let M=r.subagentControl;M?.hasActiveForeground()&&M.cancelActiveForeground().catch(O=>{Ne()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),O)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(M=>{Ne()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),M)})}),await U(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(I);let{fileBlocks:N,warnings:H}=Z2(e.text,{rootDir:process.cwd()});for(let M of H)(i??{fn:console.log}).fn(m.dim(` @-file: ${M}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let G=N.length>0||e.attachments.length>0?await Q2(e.text,e.attachments,void 0,N,t.sessionId):e.text,P=t.sendMessageStream(G);if(await da((M,O)=>{C.process(M,O)},async()=>{for await(let M of P){if(y||b)break;if(M.type==="chunk"&&M.chunk.type==="content"?(l=d?V2(l,M.chunk.content):l+M.chunk.content,d=!1,u=!0):M.type==="message"&&!u&&(l=M.message.content),M.type==="stream_retry"&&(l=l.slice(0,c),d=l.length>0),M.type==="chunk"&&M.chunk.type==="tool_use_detail"){let O=M.chunk,j={toolName:O.toolName,toolUseId:O.toolUseId,input:O.toolInput,...O.toolInputRaw!==void 0&&{inputRaw:O.toolInputRaw}};x.set(O.toolUseId,j),E.push(j)}else if(M.type==="chunk"&&M.chunk.type==="tool_result"){let O=M.chunk;c=l.length,d=!0;let j=x.get(O.toolUseId);if(j&&(j.result=O.content,j.isError=O.isError,x.delete(O.toolUseId)),r.onContextProgress){let Q=Date.now();if(Q-S>=v){S=Q;try{let W=r.onContextProgress();W instanceof Promise&&await W}catch(W){Ne()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),W)}}}}if(M.type==="paused"){if(r.setPausedState?.(!0),await $(),A&&M.autoResume===!0){let O=new AbortController;w.abort=O;let j=M.resetsAt?M.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Q=j?`Keep waiting \u2014 auto-resumes at ${j}`:"Keep waiting \u2014 auto-resume in progress",W="Switch model / provider (type /model after)",Z="Stop waiting",se=[m.warning(" \u23F3 Usage limit reached.")+(j?m.dim(` Auto-resumes at ${j}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Sn(A,{header:se,options:[Q,W,Z],signal:O.signal,initialIndex:0}).then(z=>{if(w.abort=null,!z)return;let te=z[0];te===void 0||te===Q||(b=!0,te===W&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(ie=>{Ne()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),ie)}))}).catch(z=>{Ne()&&console.error(" "+m.error("picker promise rejected:"),z)})}else(i??{fn:console.log}).fn(w_({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),w.abort?.abort(),w.abort=null;let O=M.hotSwapped&&M.accountId?`\u25B6 Resumed on ${M.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,u=!1,E.length=0,x.clear(),g=!1,h=void 0,p=!1,C=_(),f=!1,await U(),(i??{fn:console.log}).fn(m.success(O));continue}if(M.type==="error"){await $(),zs(Us(M.error)),p=!0;continue}C.process(M),M.type==="done"&&(g=!0,h=M.metadata)}}),await $(),y){let M=i?i.fn:console.log,O=A?A.getPendingCount():0,j=O>0?` \xB7 ${O} queued`:"";M(m.warning(`\u23F8 Stopped${j} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),M("")}if(b){let M=i?i.fn:console.log;M(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),M("")}if(g&&!y&&!b){es(n,a,l,h,E),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Sl(process.stdout),Yj(process.stdout,"afk: turn complete");let M=j=>{i?i.fn(j):console.log(j)},O=Wb(l);if(O){M(X2(O)),M("");let j=CK(E);if(r.onTerminalState)try{r.onTerminalState(O,{doneHasCorroboratingEvidence:j})}catch{}if(n.permissionMode==="autonomous"){let Q=O.kind==="done"&&Gc().verifyDone===!0&&!j;IK(O,void 0,{unverified:Q})}}if(Iye(h,n,M),r.onAfterTurn){let j=r.onAfterTurn();j instanceof Promise&&await j.catch(()=>{})}}}catch(N){await $(),p||zs(Us(N))}finally{await $(),vl(process.stdout,fu(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),w.abort?.abort(),w.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function _ye(e,t){let n=Math.round(e*100),r=ge(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ge(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 Iye(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(xe(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(ge(o+i)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let s=lx(t),a=qt(t.model),l=_ye(s,a);if(l.text!==null){let d=l.tier==="over"||l.tier==="near"?m.error:l.tier==="caution"?m.warning:m.dim;n(d(l.text))}let c=Y2(Jy(uh()),new Date,{autoResume:zI()});if(c.text!==null){let d=c.tier==="over"||c.tier==="near"?m.error:c.tier==="caution"?m.warning:m.dim;n(d(c.text))}n("")}var Pye=5e3,Mye=3,Oye="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function $ye(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function tq(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:d,verdictLedger:u,shellPassthrough:p,bgResultNotifier:f}=s,g=null,h=[];e.session.current.waitForInitialization().then(async I=>{Ne()&&(g=db(I)),await Fu(e.session.current),Ne()&&(h=ix())}).catch(()=>{});let y=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,b,w=!1,S=!1,v,E,x,D=0;for(f.onInjectable=()=>{D>=Mye||!o.isAwaitingInput()||!o.bufferIsEmpty()||(D++,Sl(process.stdout),y={text:Oye,attachments:[]},o.abortPendingRead())};;){if(g&&(e.replRenderer.writeLine(g),e.replRenderer.writeLine(""),g=null),h.length>0){for(let P of h)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),h=[]}let I=p.drainNotifications();for(let{job:P,result:F}of I){let M=F.errorReason===void 0?"\u2713":"\u2717",O=F.errorReason==="abort"?"killed":F.errorReason==="timeout"?"timed out":F.errorReason==="signal-killed"?"killed by signal":`exit ${F.exitCode??0}`,j=Math.max(0,Math.round(F.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${M} [${P.id}] ${O} \xB7 ${j}s \xB7 `)+P.command)}let A=f.drainNotifications();for(let{job:P}of A){let F=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",M=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,O=P.label.length>60?`${P.label.slice(0,60)}\u2026`:P.label;e.replRenderer.writeLine(m.dim(` ${F} [${P.jobId}] subagent ${P.status} \xB7 ${M}s \xB7 `)+O)}let _=l.renderIfChanged(e.stats.sessionId);if(_.length>0){for(let P of _)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let C,$;if(y===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,y={text:P.message,attachments:[]})}if(y!==void 0){let P=y;y=void 0;let F=Kl(e.stats.permissionMode),M=is({buffer:P.text,promptText:F,isTTY:!!process.stdout.isTTY,attachmentSummary:Cl([...P.attachments])});e.replRenderer.writeLine(M),C=P.text.trim(),$=P.attachments}else{let P=b;b=void 0;let F=await o.readLine({promptFn:()=>Kl(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},onSigint:r,onShiftTab:()=>{Nb(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});C=F.text.trim(),$=F.attachments}if(!C&&$.length===0)continue;if(C.startsWith("!")){let P=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(w||(w=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await p.dispatch(C))){e.statusLine.rearm();continue}}let U=!1;if(C.startsWith("/")){let P=await Qj(C,e.slashCtx,$);if(P.handled){if(P.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((C==="/clear"||C.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),u.reset(),v=void 0),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){y={text:P.result.message,attachments:$??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){b=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}U=!0}a.push(C),await $ye(e,C);let N=C;if(U){let P=hR(C);if(P){let F=P.name.replace(/^\//,"").split(":").pop()??"";if(F&&tx(F)){let M={skillName:F,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},O=e.session.current.sessionId,j=hs(O),Q=Date.now();B(`[afk trace] preflight.start commandName=${F}`);let W=!1,Z=await gs(M,{cwd:e.stats.cwd??process.cwd(),artifactDir:j},se=>{Ne()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${F}) failed: `)+(se instanceof Error?se.message:String(se)))});W=Z!==null,B(`[afk trace] preflight.end commandName=${F} durationMs=${Date.now()-Q} success=${W}`),N=rx(Z?.manifestBlock,C)}}}let H=p.drainInjections();H.length>0&&(N=H+N);let G=f.drainInjections();if(G.length>0&&(N=G+N),v!==void 0&&(N=v+`
|
|
1785
1785
|
|
|
1786
1786
|
`+N,v=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:N,sessionId:e.stats.sessionId},F=await e.hookRegistry.dispatch(P);F.injectContext&&(N=F.injectContext+N)}catch(P){if(P instanceof Re){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(P.reason?m.dim(`: ${Cr(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Qn){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(E=void 0,x=void 0,await eq({text:N,attachments:$},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onTurnComplete(P,F){if(await t.appendTurn(P,F),e.stats.sessionId)try{Lo(e.stats)}catch(M){S||(S=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(M instanceof Error?M.message:String(M))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,F)=>{u?.push(P),E=P.kind,x=F?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Un(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:(P,F)=>{c.repaint(P),d?.onStage(P,F)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Kl(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...E!==void 0?{terminalState:E}:{},...x!==void 0?{doneHasCorroboratingEvidence:x}:{}},void 0,Pye);P.injectContext&&P.injectContext.trim().length>0&&(v=P.injectContext)}catch(P){if(P instanceof lt)throw P;P instanceof Qn?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):P instanceof Re?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${Cr(P.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(P))}}}function Dye(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 nq(e,t,n,r){let o=await R2(),i=new Lb({rl:e.rl,history:o,statusLine:e.statusLine}),s=Dye(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await I2(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=z2(e,n),await tq(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Uc();Sa();import{execFile as Fye}from"node:child_process";import{dirname as Lye,isAbsolute as Nye,resolve as Bye}from"node:path";import{promisify as Uye}from"node:util";var rq=Uye(Fye),jye=3e3,Hye=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Wye(){let t=(await rq("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Nye(t)?t:Bye(process.cwd(),t);return Lye(n)}async function oq(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Wye()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),jye)});try{let o=dn({execFile:rq,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=>Hye.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}zp();Uc();import{promises as Kye}from"node:fs";import{dirname as Gye,join as aq}from"node:path";import{randomBytes as qye}from"node:crypto";var zye=["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(`
|
|
1787
|
-
`),iq=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,iA=30,Jye=1024,Yye=8e3,Vye="haiku";async function Xye(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=tbe(n,Jye),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Yye),s=t.signal?nbe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Qs({token:t.token,model:t.model??Vye,system:zye,user:r,maxTokens:32,signal:s})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Qye(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Gye(t.worktreePath);return await Zye(l,c)}function Qye(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(iq.test(t)&&t.length<=iA)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>iA)break;o=s}return iq.test(o)?o:null}async function Zye(e,t){if(!await ebe(aq(t,e)))return e;let n=qye(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,iA-5)}-${n}`}async function ebe(e){try{return await Kye.access(e),!0}catch{return!1}}function tbe(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 nbe(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 lq(e){let t,n,r=aq(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Xye(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=`${mm(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return sq(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 sq(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 sq(e,t){e&&e.setCwd(t),rbe(t)}function rbe(e){try{process.chdir(e)}catch{}}_t();q();import{spawn as dq}from"child_process";import{existsSync as uq,mkdirSync as lbe,readFileSync as pq,unlinkSync as cq,writeFileSync as mq}from"fs";import{get as cbe}from"https";import{join as fq}from"path";import{readFileSync as obe}from"fs";import{dirname as ibe,join as sbe}from"path";import{fileURLToPath as abe}from"url";function fr(){try{return"5.93.
|
|
1787
|
+
`),iq=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,iA=30,Jye=1024,Yye=8e3,Vye="haiku";async function Xye(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=tbe(n,Jye),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Yye),s=t.signal?nbe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Qs({token:t.token,model:t.model??Vye,system:zye,user:r,maxTokens:32,signal:s})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Qye(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Gye(t.worktreePath);return await Zye(l,c)}function Qye(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(iq.test(t)&&t.length<=iA)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>iA)break;o=s}return iq.test(o)?o:null}async function Zye(e,t){if(!await ebe(aq(t,e)))return e;let n=qye(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,iA-5)}-${n}`}async function ebe(e){try{return await Kye.access(e),!0}catch{return!1}}function tbe(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 nbe(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 lq(e){let t,n,r=aq(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Xye(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=`${mm(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return sq(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 sq(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 sq(e,t){e&&e.setCwd(t),rbe(t)}function rbe(e){try{process.chdir(e)}catch{}}_t();q();import{spawn as dq}from"child_process";import{existsSync as uq,mkdirSync as lbe,readFileSync as pq,unlinkSync as cq,writeFileSync as mq}from"fs";import{get as cbe}from"https";import{join as fq}from"path";import{readFileSync as obe}from"fs";import{dirname as ibe,join as sbe}from"path";import{fileURLToPath as abe}from"url";function fr(){try{return"5.93.3"}catch{}try{let e=ibe(abe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(obe(sbe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var dbe=64*1024,ube=10800*1e3,pbe=800,mbe=3600*1e3,fbe="update-check.json",gbe="pending-update.json";function sA(){return fq(Ls(),fbe)}function zu(){return fq(Ls(),gbe)}function aA(){let e=Ls();uq(e)||lbe(e,{recursive:!0})}function gq(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 hq(){try{let e=pq(sA(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function yq(){try{aA();let e=`
|
|
1788
1788
|
const https = require('https');
|
|
1789
1789
|
const fs = require('fs');
|
|
1790
1790
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|
|
@@ -1803,10 +1803,10 @@ ${E}`})}return{fileBlocks:l,warnings:c}}async function eq(e,t,n,r,o="summary",i,
|
|
|
1803
1803
|
} catch {}
|
|
1804
1804
|
});
|
|
1805
1805
|
}).on('error', () => {});
|
|
1806
|
-
`;dq(process.execPath,["-e",e],{detached:!0,stdio:"ignore"}).unref()}catch{}}function bq(e){if(e==="off"||k.NO_UPDATE_NOTIFIER||k.CI)return null;let t=hq(),n=Date.now();if((!t||n-t.checkedAt>ube)&&yq(),!t)return null;let r=fr();return gq(r,t.latestVersion)?{currentVersion:r,latestVersion:t.latestVersion}:null}function wq(){return hq()!==null}async function Sq(e){if(e==="off"||k.NO_UPDATE_NOTIFIER||k.CI)return null;let t=await zb(pbe);if(t===void 0)return yq(),null;qb(t);let n=fr();return gq(n,t)?{currentVersion:n,latestVersion:t}:null}function Kb(e){
|
|
1807
|
-
${
|
|
1808
|
-
${
|
|
1809
|
-
`)}var Gb=/^\d+\.\d+\.\d+(-[\da-z.]+)?$/i;function lA(e){if(Gb.test(e))try{aA(),mq(zu(),JSON.stringify({targetVersion:e,triggeredAt:Date.now()}))}catch{}}function qb(e){if(Gb.test(e))try{aA(),mq(sA(),JSON.stringify({latestVersion:e,checkedAt:Date.now()}))}catch{}}function zb(e=5e3,t="https://registry.npmjs.org/agent-afk/latest"){return new Promise(n=>{let r=!1,o=s=>{r||(r=!0,n(s))},i=(s,a)=>{try{let l=cbe(s,{headers:{Accept:"application/json"}},c=>{if((c.statusCode===301||c.statusCode===302)&&typeof c.headers.location=="string"&&a>0){c.resume(),i(c.headers.location,a-1);return}if(c.statusCode!==200){c.resume(),o(void 0);return}let d="",u=0,p=!1;c.on("data",f=>{if(!p){if(u+=f.byteLength,u>dbe){p=!0,l.destroy(),o(void 0);return}d+=f.toString("utf-8")}}),c.on("end",()=>{if(!p){try{let f=JSON.parse(d);if(typeof f.version=="string"&&Gb.test(f.version)){o(f.version);return}}catch{}o(void 0)}})});l.on("error",()=>o(void 0)),l.setTimeout(e,()=>{l.destroy(),o(void 0)})}catch{o(void 0)}};i(t,3)})}function cA(e){if(Gb.test(e)&&!uq(zu()))try{lA(e),dq("npm",["install","-g",`agent-afk@${e}`],{detached:!0,stdio:"ignore"}).unref()}catch{}}function vq(){try{let e=pq(zu(),"utf-8"),t=JSON.parse(e);if(typeof t.targetVersion!="string")return;let n=fr();if(n===t.targetVersion){cq(zu()),process.stderr.write(
|
|
1806
|
+
`;dq(process.execPath,["-e",e],{detached:!0,stdio:"ignore"}).unref()}catch{}}function bq(e){if(e==="off"||k.NO_UPDATE_NOTIFIER||k.CI)return null;let t=hq(),n=Date.now();if((!t||n-t.checkedAt>ube)&&yq(),!t)return null;let r=fr();return gq(r,t.latestVersion)?{currentVersion:r,latestVersion:t.latestVersion}:null}function wq(){return hq()!==null}async function Sq(e){if(e==="off"||k.NO_UPDATE_NOTIFIER||k.CI)return null;let t=await zb(pbe);if(t===void 0)return yq(),null;qb(t);let n=fr();return gq(n,t)?{currentVersion:n,latestVersion:t}:null}function Kb(e){process.stderr.write(`
|
|
1807
|
+
${m.warning(m.bold("Update available:"))} ${m.dim(e.currentVersion)} \u2192 ${m.bold(e.latestVersion)}
|
|
1808
|
+
${m.dim("Run `npm install -g agent-afk` to update")}
|
|
1809
|
+
`)}var Gb=/^\d+\.\d+\.\d+(-[\da-z.]+)?$/i;function lA(e){if(Gb.test(e))try{aA(),mq(zu(),JSON.stringify({targetVersion:e,triggeredAt:Date.now()}))}catch{}}function qb(e){if(Gb.test(e))try{aA(),mq(sA(),JSON.stringify({latestVersion:e,checkedAt:Date.now()}))}catch{}}function zb(e=5e3,t="https://registry.npmjs.org/agent-afk/latest"){return new Promise(n=>{let r=!1,o=s=>{r||(r=!0,n(s))},i=(s,a)=>{try{let l=cbe(s,{headers:{Accept:"application/json"}},c=>{if((c.statusCode===301||c.statusCode===302)&&typeof c.headers.location=="string"&&a>0){c.resume(),i(c.headers.location,a-1);return}if(c.statusCode!==200){c.resume(),o(void 0);return}let d="",u=0,p=!1;c.on("data",f=>{if(!p){if(u+=f.byteLength,u>dbe){p=!0,l.destroy(),o(void 0);return}d+=f.toString("utf-8")}}),c.on("end",()=>{if(!p){try{let f=JSON.parse(d);if(typeof f.version=="string"&&Gb.test(f.version)){o(f.version);return}}catch{}o(void 0)}})});l.on("error",()=>o(void 0)),l.setTimeout(e,()=>{l.destroy(),o(void 0)})}catch{o(void 0)}};i(t,3)})}function cA(e){if(Gb.test(e)&&!uq(zu()))try{lA(e),dq("npm",["install","-g",`agent-afk@${e}`],{detached:!0,stdio:"ignore"}).unref()}catch{}}function vq(){try{let e=pq(zu(),"utf-8"),t=JSON.parse(e);if(typeof t.targetVersion!="string")return;let n=fr();if(n===t.targetVersion){cq(zu()),process.stderr.write(`${m.success(m.bold(`Updated to agent-afk v${n}`))}
|
|
1810
1810
|
`);return}let r=typeof t.triggeredAt=="number"?t.triggeredAt:0;Date.now()-r>mbe&&cq(zu())}catch{}}function Tq(e){let t=e.isTTY?"ask":"remove",n=e.cli!==void 0?"CLI flag":e.env!==void 0?"AFK_WORKTREE_ON_EXIT":"interactive.worktreeOnExit",r=e.cli??e.env??e.config;return r===void 0?t:r==="ask"||r==="keep"||r==="remove"?r:(e.console.warn(`Ignoring unrecognised ${n} worktree exit policy ${JSON.stringify(r)}; expected ask, keep, or remove.`),t)}var hbe="Keep worktree and cd into it on exit",kq="Delete worktree and branch";async function Eq(e){if(e.turnCount<=0||!e.hasWorktree)return"remove";if(e.policy!=="ask"||!e.isTTY||e.picker===void 0)return e.policy==="remove"?"remove":e.policy==="keep"?"keep-locked":"keep-unlocked";try{let t=await e.picker({header:["Keep this worktree?",""],options:[hbe,kq]});return t===null?"keep-locked":t[0]===kq?"remove":"keep-locked"}catch(t){return e.console.warn(`Could not ask how to handle the worktree (${t instanceof Error?t.message:String(t)}); keeping it.`),"keep-locked"}}var Jb=null;function Aq(e,t){Jb={updateInfo:e,pendingMessage:t}}function bbe(e){if(e==="summary"||e==="live"||e==="digest"||e==="off")return e;throw new Error(`Invalid --thinking-ui value: ${e}. Expected summary|live|digest|off`)}function wbe(e,t){switch(e){case"empty-message":case"slash-command":return;case"slug-generator-error":return t?`slug generation failed: ${t}`:"slug generation failed";case"invalid-slug-output":return t?`model returned invalid slug: ${JSON.stringify(t)}`:"model returned invalid slug";case"create-failed":return t?`named worktree create failed: ${t}`:"named worktree create failed";default:return"unknown reason"}}function Sbe(e,t){if(e.worktreeAutoname===!1)return!1;let n=k.AFK_WORKTREE_AUTONAME;if(n!==void 0){let r=n.toLowerCase();return!(r==="0"||r==="false"||r==="off"||r==="no")}return typeof t.interactive?.worktreeAutoname=="boolean"?t.interactive.worktreeAutoname:!0}function vbe(e,t){if(e.thinkingUi!==void 0)return e.thinkingUi;let n=k.AFK_THINKING_UI;if(n!==void 0){let o=n.trim().toLowerCase();if(o==="summary"||o==="live"||o==="digest"||o==="off")return o}let r=t.interactive?.thinkingUi;return r!==void 0?r:"live"}function kbe(){return"/help \xB7 /model \xB7 @ for files \xB7 Shift+Tab mode \xB7 Esc to interrupt \xB7 /exit to quit"}function Cq(e){e.command("interactive",{isDefault:!0}).description("Start interactive chat session").argument("[input...]",'Optional first message \u2014 or a /slash-command \u2014 auto-submitted as the opening turn. E.g. `afk "what does this project do"` or `afk /review`. A bare `afk` starts an empty REPL.').option("-m, --model <model>","Model to use. Short aliases: opus|opus_1m|sonnet|sonnet_1m|haiku. Any other value (e.g. `auto` for cursor-api-proxy, or a full `claude-*` ID) passes through to the SDK/proxy untouched.",Xe()).option("--max-turns <number>","Maximum conversation turns","100").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'","enabled:max").option("--thinking-ui <mode>","Thinking display mode: summary|live|digest|off. Default live. Also: AFK_THINKING_UI env, or interactive.thinkingUi in afk.config.json.",bbe).option("--theme <mode>","TUI color palette: dark|light|umber|auto. Default dark. umber matches the Umber terminal (dark-only). Also: AFK_THEME env, or theme in afk.config.json. Toggle live with /theme.",Op).option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--resume <id>","Resume a persisted SDK session by id").option("--continue","Continue the most recent persisted session in cwd").option("--debug","Show SDK init metadata on startup; enables /debug command",!1).option("-w, --worktree [branch]","Create a git worktree for an isolated session. Optional value sets the branch name; otherwise auto-named. On clean interactive exit, choose whether to keep or delete it; dirty worktrees are always preserved.").option("--worktree-on-exit <ask|keep|remove>","Clean-worktree quit policy. Default: ask on TTY, remove otherwise. Also: AFK_WORKTREE_ON_EXIT, or interactive.worktreeOnExit in afk.config.json.").option("--no-worktree-autoname","Disable mid-session rename of auto-named worktrees from the first user message via haiku. Default on. Also: AFK_WORKTREE_AUTONAME=0, or interactive.worktreeAutoname:false in afk.config.json.").option("--worktree-base <ref>","Base git ref for the worktree created by --worktree. Default: the remote's default branch (origin/main), fetched fresh. Pass HEAD to base on your local checkout instead. Also: AFK_WORKTREE_BASE, or interactive.worktreeBase in afk.config.json.").option("--no-shell-passthrough","Disable the ! shell-passthrough feature. When set, inputs beginning with ! are sent to the model as literal text instead of being executed as shell commands. Also: AFK_SHELL_PASSTHROUGH set to 0, false, off, or no.").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai|openai-compatible. Default: auto-selected by model").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').option("--dangerously-skip-permissions","Force bypass mode (already the default for new installs): skip path-approval prompts; read/write ANY path with no confirmation. Toggle live with Shift+Tab (permission-mode cycle); disable persistently with `afk config set permissionMode default`. Does not affect ask_question.").option("--mcp-config <path>","Path to an additional MCP config file (highest priority \u2014 merges over ~/.afk/config/mcp.json, project-local .mcp.json, and plugin-contributed configs). File format identical to mcp.json.").option("--plain","Force the session to fully behave like a non-TTY surface for rendering: append-only plain-stdout output instead of the live-overlay renderer (no persistent or per-turn compositor), AND the input surface downgrades to the simple line reader \u2014 even when stdout/stdin ARE a TTY. Full opt-out escape hatch for tmux/SSH/multiplexer sessions where cursor-up redraws and DECSTBM reserved rows misbehave. Also: AFK_PLAIN_OUTPUT=1. Non-TTY sessions (pipes, CI) already use this path by default.").action(async(t,n)=>{if(n.debug&&(process.env.AFK_DEBUG="1"),n.plain&&(process.env.AFK_PLAIN_OUTPUT="1"),n.dumpPrompt!==void 0){let W=n.dumpPrompt===!0?Rs.join(xq.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=W,n.provider!==void 0&&n.provider!=="anthropic"&&n.provider!=="anthropic-direct"&&console.error(`[--dump-prompt] WARNING: active provider (${n.provider}) does not support prompt dumping. No file will be written.`)}let r=Rq({text:"Initializing interactive session...",...Lu}).start();if(n.resume||n.continue)try{let W=hl({resume:n.resume,continue:n.continue});if(W&&!W.stored){r.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
|
|
1811
1811
|
Run \`afk i\` then \`/resume\` to list saved sessions.
|
|
1812
1812
|
`),process.exitCode=1;return}}catch(W){r.fail("Session not found");let Z=W instanceof Error?W.message:String(W);process.stderr.write(`Error: ${Z}
|
|
@@ -1945,7 +1945,7 @@ Multiple chats found:`)),o.forEach((l,c)=>{let d=l.username?`@${l.username}`:l.f
|
|
|
1945
1945
|
`).slice(-o-1);console.log(i.join(`
|
|
1946
1946
|
`))})}function oSe(e){if(console.log(m.heading("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${m.success("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${iSe(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${m.error("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(m.heading("Recent log entries:"));for(let t of e.logTail)console.log(m.meta(` ${t}`))}}function iSe(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 $Se}from"node:child_process";import{promisify as DSe}from"node:util";q();import{execFile as sSe}from"node:child_process";import{randomBytes as aSe}from"node:crypto";import{promises as Yl}from"node:fs";import{join as tw}from"node:path";import{promisify as lSe}from"node:util";var cSe=lSe(sSe),_z=16;var At=class extends Error{cause;code;constructor(t,n,r){super(t),this.name="WorktreeError",this.cause=n,this.code=r}};function CA(e,t=40){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||"task"}function dSe(){return aSe(4).toString("hex").slice(0,4)}function uSe(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 pSe(e,t={}){let n=(t.now??(()=>new Date))(),r=(t.randomSuffix??dSe)();return`${uSe(n)}-${CA(e,32)}-${r}`}async function As(e,t){try{let n=await cSe("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 At(`git ${t.join(" ")} failed: ${o}`,n)}}async function mSe(e){let{stdout:t}=await As(e,["rev-parse","--show-toplevel"]);if(!t)throw new At(`not a git repository: ${e}`);return t}async function fSe(e,t){if(t){let{stdout:o}=await As(e,["rev-parse",t]);return{sha:o}}let{stdout:n}=await As(e,["rev-parse","HEAD"]),r;try{let{stdout:o}=await As(e,["symbolic-ref","--quiet","HEAD"]);o&&(r=o)}catch{}return{sha:n,branch:r}}function gSe(e,t,n){let r=n?CA(n,32):`branch-${t}`;return`afk/farm/${e}/${t}-${r}`}function hSe(e,t){return tw(e,`branch-${t}`)}async function ySe(e,t){try{await As(e,["worktree","remove","--force",t])}catch{}}async function bSe(e,t){try{await As(e,["branch","-D",t])}catch{}}async function Iz(e){if(e.count<1||e.count>_z)throw new At(`count must be between 1 and ${_z}, got ${e.count}`);if(e.labels&&e.labels.length!==e.count)throw new At(`labels.length (${e.labels.length}) must equal count (${e.count})`);let t=e.cwd??process.cwd(),n=await mSe(t),{sha:r,branch:o}=await fSe(n,e.baseRef),i=(e.now??(()=>new Date))(),s=e.taskSlug??pSe(e.taskName,{now:()=>i,randomSuffix:e.randomSuffix}),a=e.taskSlug??s,l=Kw(s);try{throw await Yl.access(l),new At(`farm directory already exists: ${l}`)}catch(u){if(u.code!=="ENOENT")throw u instanceof At?u:new At(`failed to check farm dir ${l}`,u)}await Yl.mkdir(l,{recursive:!0});let c=[];try{for(let u=1;u<=e.count;u++){let p=e.labels?.[u-1],f=gSe(s,u,p),g=hSe(l,u);await As(n,["worktree","add","-b",f,g,r]),c.push({index:u,label:p?CA(p,32):void 0,path:g,branch:f})}}catch(u){for(let p of c.slice().reverse())await ySe(n,p.path),await bSe(n,p.branch);throw await Yl.rm(l,{recursive:!0,force:!0}).catch(()=>{}),u instanceof At?u:new At("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 Yl.writeFile(tw(l,"farm.json"),JSON.stringify(d,null,2)+`
|
|
1947
1947
|
`,"utf8"),d}function wSe(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 SSe(e){let t=tw(Kw(e),"farm.json");try{let n=await Yl.readFile(t,"utf8"),r=JSON.parse(n);if(r.schemaVersion!==1&&r.schemaVersion!==2&&r.schemaVersion!==3)throw new At(`unsupported farm manifest schema: ${r.schemaVersion} (expected 1, 2, or 3)`,void 0,"unsupported-schema");return wSe(r)}catch(n){if(n.code==="ENOENT")return null;throw n instanceof At?n:new At(`failed to load farm manifest ${t}`,n,"invalid")}}async function Pz(e,t){let n=await SSe(e);if(!n)throw new At(`farm not found: ${e}`);return n.memoryFactId=t,n.schemaVersion=3,await Yl.writeFile(tw(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
|
|
1948
|
-
`,"utf8"),n}Ye();import{spawn as vSe}from"child_process";import{promises as nw}from"fs";import{join as Xu,dirname as
|
|
1948
|
+
`,"utf8"),n}Ye();import{spawn as vSe}from"child_process";import{promises as nw}from"fs";import{join as Xu,dirname as Lyt}from"path";var kSe=1,rw=12e4;async function Dz(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=rw,_spawn:i=vSe,_readPackageJson:s=TSe,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await ESe(t,s),d=0,u=0,p=0,f;if(c){let b=await Lz(c,t,o,i,a);p=b.durationMs,b.timedOut?(u=1,f=`tests timed out after ${o}ms`):b.crashed?(u=1,f=`test runner crashed: ${ASe(b.stderr,200)}`):b.exitCode===0?d=1:u=1}else f="no test command found (no package.json scripts.test)";let g=await RSe(t,o,i,a),h=await xSe(t,n,i),y={schemaVersion:kSe,pass:d,fail:u,loc_delta:h,lint_ok:g,duration_ms:p,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(y.error=f),c!==void 0&&(y.testCmd=c),y}async function Fz(e,t,n){let r=Xu(e,"scores");await nw.mkdir(r,{recursive:!0});let o=Xu(r,`branch-${t}.json`);return await nw.writeFile(o,JSON.stringify(n,null,2)+`
|
|
1949
1949
|
`,"utf8"),o}function Qu(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=Mz(i),l=Mz(s);if(a!==l)return l-a;let c=Oz(i.lint_ok),d=Oz(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 TSe(e){try{let t=await nw.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function ESe(e,t){let n=await t(Xu(e,"package.json"));if(!$z(n))return;let r=n.scripts;return!$z(r)||typeof r.test!="string"?void 0:await Nz(Xu(e,"pnpm-lock.yaml"))?"pnpm test":"npm test"}async function Lz(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(p){s({exitCode:null,durationMs:o()-i,stderr:p instanceof Error?p.message:String(p),timedOut:!1,crashed:!0});return}let l="",c=!1,d=!1,u=setTimeout(()=>{c=!0,a.kill("SIGKILL")},n);a.stderr?.on("data",p=>{l+=String(p),l.length>64e3&&(l=l.slice(-32e3))}),a.on("error",p=>{d||(d=!0,clearTimeout(u),s({exitCode:null,durationMs:o()-i,stderr:p.message,timedOut:!1,crashed:!0}))}),a.on("close",p=>{d||(d=!0,clearTimeout(u),s({exitCode:p,durationMs:o()-i,stderr:l,timedOut:c,crashed:!1}))})})}async function RSe(e,t,n,r){if(!await Nz(Xu(e,"tsconfig.json")))return null;let o=await Lz("npx --no-install tsc --noEmit",e,t,n,r);return o.crashed||o.timedOut?null:o.exitCode===0}async function xSe(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 Mz(e){let t=e.pass+e.fail;return t===0?0:e.pass/t}function Oz(e){return e===!0?2:e===!1?1:0}function ASe(e,t){return e.length<=t?e:e.slice(0,t)+"\u2026"}function $z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Nz(e){try{return await nw.access(e),!0}catch{return!1}}jm();function Bz(e,t){let n;try{n=t?._store??new dt}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r=CSe(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 CSe(e){let t=_Se(e.branches),n=e.winner??null,r=ISe(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 _Se(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 ISe(e,t){let{winner:n,branches:r}=e;if(n==null)return r.some(p=>p.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 PSe="afk:f:";var MSe=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function Zu(e,t){if(!MSe.test(t))throw new Error(`buildFarmCallback: invalid taskSlug ${JSON.stringify(t)}`);let n=`${PSe}${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 Uz(e){return{inline_keyboard:[[{text:"\u2705 Open PR",callback_data:Zu("p",e)},{text:"\u{1F501} Respawn from winner",callback_data:Zu("r",e)}],[{text:"\u{1F50D} Full diff",callback_data:Zu("d",e)},{text:"\u274C Discard all",callback_data:Zu("x",e)}]]}}function OSe(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=Qu(d),p=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=p.get(b);if(!w)continue;let S=i!==void 0&&i===w.index,v=w.label?` (${w.label})`:"",E=w.score??null,x=E===null?"\u2014":E.pass>0?"\u2713":"\u2717",D=E===null?"\u2014":E.lint_ok===!0?"\u2713":E.lint_ok===!1?"\u2717":"?",I=E===null?"?":E.loc_delta>0?`+${E.loc_delta}`:E.loc_delta<0?`${E.loc_delta}`:"0",A=S?" \u2190 winner":"";f.push(`#${g} ${w.branch}${v} tests${x} lint${D} ${I} LoC${A}`),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(`
|
|
1950
1950
|
`)}async function jz(e,t){let n=OSe(e),r=Uz(e.taskSlug),o=t?._push??await Promise.resolve().then(()=>(Er(),ov)).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 Hz=DSe($Se);async function FSe(e,t){try{let{stdout:n}=await Hz("git",["-C",e,"rev-list",`${t}..HEAD`,"--count"],{maxBuffer:4194304});return parseInt(n.trim(),10)||0}catch{return 0}}async function LSe(e){try{let{stdout:t}=await Hz("git",["-C",e,"status","--porcelain"],{maxBuffer:4194304});return t.trim()?t.trim().split(`
|
|
1951
1951
|
`).filter(Boolean):[]}catch{return[]}}var _A=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
|
|
@@ -1990,7 +1990,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
|
|
|
1990
1990
|
`)){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 EJ(e){let t=Hn(e),n={name:e,label:rp(e),installed:qve(t),configPath:t,logFile:Zl(e)};if(!n.installed)return n;try{let r=Gve("systemctl",["--user","show",Bt(e),"--property=MainPID,ExecMainStatus,ActiveState,LoadState"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:ec}),o=zve(r);o.pid!==void 0&&(n.pid=o.pid),o.lastExitStatus!==void 0&&(n.lastExitStatus=o.lastExitStatus)}catch{}return n}var xJ={backend:"systemd",configKind:"systemd user unit",install(e,t={}){return vJ(e,t)},uninstall(e){return kJ(e)},status(e){return EJ(e)},restart(e){if(!RJ(Hn(e)))return{kind:"not-installed",configPath:Hn(e)};try{return Jve("systemctl",["--user","restart",Bt(e)],{stdio:["ignore","pipe","pipe"],timeout:ec}),{kind:"restarted",label:rp(e)}}catch(t){let n=t.stderr;return{kind:"failed",reason:n&&n.toString().trim()||t.message}}},isInstalled(e){return RJ(Hn(e))},configPath(e){return Hn(e)},logPath(e){return Zl(e)},label(e){return rp(e)},readConfigFile(e){return TJ(e)}};var rc=["telegram","daemon"];function AJ(e=process.platform){switch(e){case"darwin":return fJ;case"linux":return xJ;default:return null}}var CJ="macOS (launchd) and Linux (systemd --user)";function op(){let e=AJ();if(!e)throw new Error(`'afk service' is not supported on ${process.platform}. Supported: ${CJ}.`);return e}function fw(e){let t=e.toLowerCase();if(rc.includes(t))return t;throw new Error(`Unknown service '${e}'. Supported: ${rc.join(", ")}.`)}function IJ(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 <${rc.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=op(),i=fw(n),s=o.install(i,{noWatch:r.watch===!1,dryRun:!!r.dryRun});s.kind==="already-installed"&&(console.log(m.warning(`\u26A0 ${s.label} already installed at ${s.configPath}`)),console.log(m.meta(` Run 'afk service uninstall ${i}' first to reinstall.`)),process.exit(1)),s.kind==="failed"&&(console.error(m.error(`\u2717 Install failed: ${s.reason}`)),process.exit(1)),console.log(m.success(`\u2713 Installed ${s.label}`)),console.log(m.meta(` Config: ${s.configPath} (${o.configKind})`)),console.log(m.meta(` Log: ${o.logPath(i)}`)),s.autoRestartOnRebuild?console.log(m.meta(" Auto-restart on rebuild: on")):console.log(m.meta(` Auto-restart on rebuild: off \u2014 run 'afk service restart ${i}' after updates.`));for(let a of s.notes??[])console.log(m.info(` ${a}`));r.dryRun||console.log(m.meta(` Status: afk service status ${i}`))}catch(o){V(o)}}),t.command("uninstall <name>").description("Stop the service and remove its config (LaunchAgent plist / systemd unit)").action(n=>{try{let r=op(),o=fw(n),i=r.uninstall(o);if(i.kind==="not-installed"){console.log(m.warning(`\u26A0 ${r.label(o)} is not installed (no config at ${i.configPath})`));return}i.kind==="failed"&&(console.error(m.error(`\u2717 Uninstall failed: ${i.reason}`)),process.exit(1)),console.log(m.success(`\u2713 Uninstalled ${r.label(o)}`)),console.log(m.meta(` Removed: ${i.configPath}`))}catch(r){V(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=op();if(n){_J(r.status(fw(n)),r.configKind);return}for(let o of rc)_J(r.status(o),r.configKind),console.log("")}catch(r){V(r)}}),t.command("list").description("List recognised service names and whether each is installed").action(()=>{try{let n=op();console.log(m.heading(`AFK services (${n.backend}):`));for(let r of rc){let o=n.isInstalled(r),i=o?m.success("\u25CF"):m.dim("\u25CB"),s=o?m.meta("installed"):m.meta("not installed");console.log(` ${i} ${r.padEnd(10)} ${s} ${m.meta(n.configPath(r))}`)}}catch(n){V(n)}}),t.command("restart <name>").description("Restart the service (launchctl kickstart -k / systemctl --user restart)").action(n=>{try{let r=op(),o=fw(n),i=r.restart(o);i.kind==="not-installed"&&(console.error(m.error(`\u2717 ${r.label(o)} is not installed. Run 'afk service install ${o}' first.`)),process.exit(1)),i.kind==="failed"&&(console.error(m.error(`\u2717 Restart failed: ${i.reason}`)),process.exit(1)),console.log(m.success(`\u2713 Restarted ${i.label}`))}catch(r){V(r)}})}function _J(e,t){if(console.log(m.heading(`${e.label}`)),!e.installed){console.log(` ${m.dim("\u25CB")} Not installed`),console.log(m.meta(` Config: ${e.configPath} (${t})`)),console.log(m.meta(` Install: afk service install ${e.name}`));return}e.pid!==void 0?console.log(` ${m.success("\u25CF")} Running (PID ${e.pid})`):(console.log(` ${m.warning("\u25CF")} Installed but not running`),e.lastExitStatus!==void 0&&e.lastExitStatus!==0&&console.log(m.meta(` Last exit status: ${e.lastExitStatus}`))),console.log(m.meta(` Config: ${e.configPath} (${t})`)),console.log(m.meta(` Log: ${e.logFile}`))}import{execFileSync as Yve}from"child_process";import{chmodSync as Vve,existsSync as ip,mkdirSync as OJ,readdirSync as Xve,readFileSync as Qve,renameSync as $J,writeFileSync as DJ}from"fs";import{basename as Zve,dirname as UA,join as jA}from"path";import{randomBytes as FJ}from"crypto";import{createInterface as eke}from"node:readline";tf();q();function tke(e){let t=eke({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,()=>{t.close(),n()})})}var ei="chrome-devtools",BA=["stable","beta","canary","dev"];function nke(e="stable"){let t=["chrome-devtools-mcp@latest","--autoConnect"];return e!=="stable"&&t.push("--channel",e),{command:"npx",args:t}}function PJ(e){if(!ip(e))return{mcpServers:{}};let t;try{t=Qve(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 MJ(e,t){OJ(UA(e),{recursive:!0});let n=jA(UA(e),`.mcp.json.${process.pid}.${FJ(4).toString("hex")}.tmp`);DJ(n,`${JSON.stringify(t,null,2)}
|
|
1991
1991
|
`,"utf-8"),$J(n,e)}function rke(){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=Yve(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 oke(){let e=rke();console.log(""),console.log(m.heading("Drive your real Chrome \u2014 one-time setup:")),e===null?console.log(m.meta(" \u2022 Chrome not detected. autoConnect requires Chrome \u2265 144.")):e<144?console.log(m.warning(` \u2022 Detected Chrome ${e} \u2014 autoConnect requires \u2265 144. Please update Chrome.`)):console.log(m.meta(` \u2022 Detected Chrome ${e} \u2713 (autoConnect needs \u2265 144)`)),console.log(m.meta(" 1. In Chrome, open chrome://inspect/#remote-debugging and enable it (one time).")),console.log(m.meta(' 2. The first time the agent drives Chrome, click "Allow" on the prompt.')),console.log(m.meta(' 3. Chrome shows a "being controlled by automated test software" banner while active.')),console.log(""),console.log(m.meta("The agent gains mcp__chrome-devtools__* tools (navigate, click, fill, take_snapshot, \u2026)")),console.log(m.meta("driving your REAL, logged-in profile. Run `/mcp` in the REPL to confirm it connected.")),console.log(m.meta("Undo anytime with `afk browser disconnect`."))}function LJ(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 (${BA.join("|")})`,"stable").action(n=>{try{let r=(n.channel??"stable").toLowerCase();if(!BA.includes(r))throw new Error(`--channel must be one of ${BA.join(", ")} (got "${n.channel}")`);let o=ns(),i=PJ(o);i.mcpServers===void 0&&(i.mcpServers={});let s=nke(r),a=i.mcpServers[ei];if(a!==void 0&&JSON.stringify(a)===JSON.stringify(s))console.log(m.success(`\u2713 "${ei}" already configured`)),console.log(m.meta(` Config: ${o}`));else{i.mcpServers[ei]=s,MJ(o,i);let l=a===void 0?"Added":"Updated";console.log(m.success(`\u2713 ${l} "${ei}" MCP server`)),console.log(m.meta(` Config: ${o}`)),console.log(m.meta(` Runs: npx ${s.args?.join(" ")??""}`))}oke()}catch(r){V(r)}}),t.command("disconnect").description("Remove the chrome-devtools server from your MCP config").action(()=>{try{let n=ns();if(!ip(n)){console.log(m.warning(`\u26A0 No MCP config at ${n} \u2014 nothing to remove.`));return}let r=PJ(n);if(r.mcpServers===void 0||r.mcpServers[ei]===void 0){console.log(m.warning(`\u26A0 "${ei}" is not configured \u2014 nothing to remove.`));return}delete r.mcpServers[ei],MJ(n,r),console.log(m.success(`\u2713 Removed "${ei}" from ${n}`))}catch(n){V(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();Sc(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=vc(o),{chromium:a}=await import("playwright");console.log(m.meta(`Launching a browser for profile "${o}"\u2026`));let l=await a.launch({headless:!1}).catch(f=>{throw ad(f,!1)}),c=await l.newContext(ip(s)?{storageState:s}:{});await(await c.newPage()).goto(n,{waitUntil:"load"}).catch(()=>{}),console.log(""),console.log(m.heading("Log in to the site in the opened browser window.")),console.log(m.meta("When fully logged in, return here and press Enter to save the session.")),console.log(m.meta("(Do NOT close the browser window yourself \u2014 this command closes it for you.)")),await tke("Press Enter to save the session\u2026 ");let u=await c.storageState();OJ(Xw(o),{recursive:!0});let p=jA(UA(s),`.${Zve(s)}.${process.pid}.${FJ(4).toString("hex")}.tmp`);DJ(p,JSON.stringify(u),{mode:384}),Vve(p,384),$J(p,s),await l.close().catch(()=>{}),console.log(m.success(`\u2713 Saved session for profile "${o}"`)),console.log(m.meta(` Vault: ${s} (0600 \u2014 treat as a credential)`)),console.log(m.meta(" Point the agent at it:")),console.log(m.meta(` export AFK_BROWSER_DEFAULT_PROFILE=${o}`))}catch(o){V(o)}}),t.command("profiles").description("List saved browser session-vault profiles").action(()=>{try{let n=Vw(),r=ip(n)?Xve(n,{withFileTypes:!0}).filter(o=>o.isDirectory()):[];if(r.length===0){console.log(m.meta("No saved profiles. Create one with `afk browser login <url> --profile <name>`."));return}console.log(m.heading("Saved browser profiles:"));for(let o of r){let i=ip(jA(n,o.name,"storageState.json")),s=i?m.success("\u25CF"):m.meta("\u25CB"),a=i?"":m.meta(" (no saved session)");console.log(` ${s} ${o.name}${a}`)}console.log(""),console.log(m.meta("Use one: export AFK_BROWSER_DEFAULT_PROFILE=<name>"))}catch(n){V(n)}})}import{readFileSync as ike,readdirSync as ske,statSync as ake}from"fs";import{join as GA}from"path";q();import{join as Ze}from"path";function gw(){return Ze(mt(),"improve")}function ti(){return Ze(gw(),"failure-cards")}function NJ(){return Ze(ti(),".index.jsonl")}function sp(e){return Ze(ti(),`${e}.json`)}function hw(e){return Ze(ti(),`${e}.md`)}function BJ(){return Ze(me(),"witness")}function _s(){return Ze(gw(),"proposals")}function UJ(){return Ze(_s(),".index.jsonl")}function HA(e){return Ze(_s(),`${e}.json`)}function jJ(e){return Ze(_s(),`${e}.md`)}function ni(){return Ze(gw(),"eval-cases")}function HJ(){return Ze(ni(),".index.jsonl")}function WA(e){return Ze(ni(),`${e}.json`)}function KA(e){return Ze(ni(),`${e}.fixture.jsonl`)}function WJ(e){return Ze(ni(),`${e}.md`)}function oc(){return Ze(gw(),"eval-runs")}function KJ(){return Ze(oc(),".index.jsonl")}function GJ(e){return Ze(oc(),`${e}.json`)}function qJ(e){return Ze(oc(),`${e}.md`)}K();function zJ(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 JJ(e={}){let t=e.witnessRoot??BJ(),n=e.afkHome??k.AFK_HOME??lke(),r=e.sinceMs,o={sessionsScanned:0,sessionsSkippedOld:0,sessionsSkippedEmpty:0,invalidLineCount:0,sessions:[]},i;try{i=ske(t)}catch{return o}for(let s of i){if(s.startsWith("."))continue;let a=GA(t,s),l;try{l=ake(a)}catch{continue}if(!l.isDirectory())continue;if(r!==void 0&&l.mtimeMs<r){o.sessionsSkippedOld+=1;continue}let c=GA(a,"trace.jsonl"),d;try{d=ike(c,"utf-8")}catch{o.sessionsSkippedEmpty+=1;continue}let u=cke(c,n),p=ic({sessionId:s,tracePath:c,relativeTracePath:u,content:d,sessionMtimeMs:l.mtimeMs});o.sessions.push(p),o.sessionsScanned+=1,o.invalidLineCount+=p.invalidLineCount}return o}function ic(e){let{sessionId:t,tracePath:n,relativeTracePath:r,content:o,sessionMtimeMs:i}=e,s=[],a=0,l=o.split(`
|
|
1992
1992
|
`);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 p=Nh.safeParse(u);if(!p.success){a+=1;continue}s.push({sessionId:t,tracePath:n,relativeTracePath:r,lineNumber:c+1,rawLine:d,event:p.data})}return{sessionId:t,tracePath:n,relativeTracePath:r,sessionMtimeMs:i,events:s,invalidLineCount:a}}function lke(){let e=k.AFK_HOME;return e&&e.length>0?e:GA(k.HOME??"",".afk")}function cke(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 dke}from"crypto";var Vr=4,uke=8,pke="v1-bytes-tuple";function yw(e,t={}){let n=t.minRepeats??Vr;if(n<2)throw new Error(`minRepeats must be >= 2 (got ${n})`);let r=[];for(let o of e){let i=mke(o,n);r.push(...i)}return r}function mke(e,t){let n=fke(e.events),r=gke(n),o=[];for(let[i,s]of r.entries()){let a=hke(s,t);for(let l of a)o.push(bke(e,l,i))}return o}function fke(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=yke({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 gke(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 hke(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 yke(e){let t=[e.name,String(e.inputBytes),String(e.resultBytes),e.isError?"1":"0",e.subagentId??""].join("|");return dke("sha256").update(t).digest("hex")}function bke(e,t,n){let r=t[0];if(!r)throw new Error("repeated-tool-use: empty run");let o=Tke(r.name,r.fingerprint),i=new Date().toISOString(),s=t.slice(0,uke),a=[{sessionId:e.sessionId,tracePath:e.relativeTracePath,eventIndices:s.map(l=>l.completedSeq),excerpt:wke(s),annotation:Ske(t,n)}];return{slug:o,title:vke(r.name,t.length),pattern:"repeated-tool-use",severity:kke(t.length),observedAt:i,evidence:a,detail:{detector:"repeated-tool-use@v1",fingerprintAlgorithm:pke,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 wke(e){let t=e.map(n=>n.rawLine).join(`
|
|
1993
|
-
`);return t.length<=2e3?t:t.slice(0,1997)+"..."}function Ske(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 vke(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function kke(e){return e>=10?"high":e>=4?"medium":"low"}function Tke(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 Eke=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function bw(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(!Eke.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()){let a=Rke(s);a.length<n||o.push(Ake(i,a,s))}return o}function Rke(e){return[...new Set(e.map(t=>t.sessionId))]}var xke=8;function Ake(e,t,n){let r=_ke(e),o=new Date().toISOString(),i=n.slice(0,xke),s=i.map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:Ike(c.rawLine),annotation:`closure.reason='${c.reason}' \xB7 cost=${Pke(c.finalCostUsd)} \xB7 turns=${c.finalTurnCount}`})),a=n.reduce((c,d)=>c+d.finalCostUsd,0),l=n.reduce((c,d)=>c+d.finalTurnCount,0)/n.length;return{slug:r,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:Cke(e,t.length),observedAt:o,evidence:s,detail:{detector:"closure-anomaly@v2",closureReason:e,affectedSessions:t.length,closureEventCount:n.length,totalCostUsd:YJ(a),avgTurnCount:Mke(l),maxCostUsd:YJ(Math.max(...n.map(c=>c.finalCostUsd))),sessionIds:t,seqs:i.map(c=>c.seq)}}}function Cke(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 _ke(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function Ike(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Pke(e){return`$${e.toFixed(4)}`}function YJ(e){return Math.round(e*1e4)/1e4}function Mke(e){return Math.round(e*100)/100}import{createHash as Oke}from"crypto";var Is=2,$ke="v1-hook-reason-tuple",Dke=8;function VJ(e,t={}){let n=t.minOccurrences??Is;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=Fke({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},p=r.get(d);p?p.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Nke(i,s));return o}function Fke(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return Oke("sha256").update(t).digest("hex")}function Lke(e){return`subagent-block-${e.slice(0,12)}`}function Nke(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=Lke(e),o=new Date().toISOString(),s=t.slice(0,Dke).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Hke(l.rawLine),annotation:jke(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:Uke(n.reason,t.length,a),pattern:"subagent-block",severity:Bke(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:$ke,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 Bke(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function Uke(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 jke(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 Hke(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as Wke}from"crypto";var Ps=2,Kke="v1-pretooluse-read-normreason",Gke=8,qke=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function zke(e){return e.includes("read-denylist entry:")||e.includes("is a protected credential/secret path")?"credential-floor":e.includes("Sub-agent path access denied:")||e.includes("Sub-agents cannot access paths outside the session's granted roots")?"read-root-containment":"unclassified"}function Jke(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function XJ(e,t={}){let n=t.minOccurrences??Ps;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||!qke.has(l))continue;let c=a.payload.reason??"",d=zke(c);if(d==="credential-floor")continue;let u=Jke(c),p=Yke({hookEvent:a.payload.hookEvent,normalizedReason:u}),f={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:u,blockedTool:l,mechanism:d},g=r.get(p);g?g.push(f):r.set(p,[f])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Xke(i,s));return o}function Yke(e){let t=[e.hookEvent,e.normalizedReason].join("|");return Wke("sha256").update(t).digest("hex")}function Vke(e){return`subagent-read-denial-${e.slice(0,12)}`}function Xke(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=Vke(e),o=new Date().toISOString(),s=t.slice(0,Gke).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:tTe(c.rawLine),annotation:eTe(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:Zke(t.length,a),pattern:"subagent-read-denial",severity:Qke(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v2",fingerprintAlgorithm:Kke,fingerprint:e,hookEvent:"PreToolUse",denialMechanism:n.mechanism,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 Qke(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function Zke(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function eTe(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function tTe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var nTe=Lh,Ms=3,Os=.25,rTe=8;function sc(e,t={}){let n=t.minFailures??Ms,r=t.minFailureRate??Os;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=oTe(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&nTe.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(iTe(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function oTe(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 iTe(e,t){let n=lTe(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,rTe).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:cTe(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:aTe(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:sTe(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:dTe(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:uTe(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function sTe(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function aTe(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function lTe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function cTe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function dTe(e){return Math.round(e*1e4)/1e4}function uTe(e){return Math.round(e*100)/100}var ww=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Vr})`,run:(e,t)=>yw(e,{minRepeats:t.minRepeats??Vr})},{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)=>bw(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${Is})`,enabledByDefault:!1,run:(e,t)=>VJ(e,{minOccurrences:t.subagentBlockMinOccurrences??Is})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${Ms} failures, ${Os} rate)`,enabledByDefault:!0,run:(e,t)=>sc(e,{minFailures:t.toolFailureMinFailures??Ms,minFailureRate:t.toolFailureMinRate??Os})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${Ps})`,enabledByDefault:!1,run:(e,t)=>XJ(e,{minOccurrences:t.subagentReadDenialMinOccurrences??Ps})}]);function QJ(e,t,n,r){let o=[];for(let i of ww){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 Sw(){return ww.map(e=>e.name)}function ZJ(){return ww.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function ac(){return ww.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as cp,mkdirSync as dY,readFileSync as ITe,readdirSync as uY,renameSync as pY,writeFileSync as JA}from"fs";import{join as mY}from"path";import{z as L}from"zod";var ri=L.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),vw=L.enum(["low","medium","high"]),pTe=L.enum(["open","deferred","resolved"]),eY=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()}),kw=L.object({at:L.string().datetime(),text:L.string()}),lp=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:ri,severity:vw,status:pTe,firstSeen:L.string().datetime(),lastSeen:L.string().datetime(),occurrenceCount:L.number().int().nonnegative(),evidence:L.array(eY).min(1),detail:L.record(L.string(),L.unknown()),notes:L.array(kw).default([])}),wSt=L.object({slug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:L.string().min(1).max(200),pattern:ri,severity:vw,observedAt:L.string().datetime(),evidence:L.array(eY).min(1),detail:L.record(L.string(),L.unknown())}),tY=L.object({timestamp:L.string().datetime(),event:L.enum(["created","updated","merged-noop"]),slug:L.string(),pattern:ri,occurrenceCount:L.number().int().nonnegative(),evidenceAdded:L.number().int().nonnegative()}),mTe=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"]),fTe=L.enum(["safe","moderate","high","forbidden"]),gTe=L.enum(["low","medium","high"]),hTe=L.object({cardSlug:L.string(),eventIndices:L.array(L.number().int().nonnegative()).min(1),annotation:L.string().optional()}),yTe=L.object({path:L.string().min(1),rationale:L.string(),riskTier:fTe,confidence:gTe}),bTe=L.object({unitTests:L.array(L.string()),evalCases:L.array(L.string()),smokeChecks:L.array(L.string()),manualChecks:L.array(L.string())}),wTe=L.object({forbiddenPaths:L.array(L.string()),requiresExplicitApproval:L.boolean()}),STe=L.enum(["draft","approved","rejected","superseded"]),qA=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:mTe,evidenceRefs:L.array(hTe).min(1),fixSketch:L.string().min(1),likelyFiles:L.array(yTe),riskLevel:vw,validationPlan:bTe,scopeFreeze:wTe,generatedBy:L.enum(["template","llm"]),createdAt:L.string().datetime(),status:STe,notes:L.array(kw).default([])}),nY=L.object({timestamp:L.string().datetime(),event:L.enum(["created","triaged","superseded"]),proposalId:L.string(),cardSlug:L.string(),generatedBy:L.enum(["template","llm"]),riskLevel:vw}),vTe=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")}),kTe=L.object({kind:L.literal("pattern-absent"),patternId:ri,detectorVersion:L.string().min(1),rationale:L.string().min(1)}),TTe=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")}),ETe=L.enum(["draft","approved","rejected","superseded"]),Tw=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:vTe,assertion:kTe,provenance:TTe,status:ETe,notes:L.array(kw).default([])}),rY=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")}),RTe=L.enum(["pass","fail","skipped"]),xTe=L.object({name:L.string().min(1),description:L.string().min(1),status:RTe,expected:L.string(),actual:L.string()}),ATe=L.enum(["config-value","observed-behavior","source-symbol","fixture"]),CTe=L.object({kind:ATe,ref:L.string().min(1),detail:L.string()}),oY=L.enum(["pass","fail","unsupported","error"]),zA=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:ri,contract:L.string().min(1).nullable(),status:oY,createdAt:L.string().datetime(),durationMs:L.number().int().nonnegative(),checks:L.array(xTe),evidence:L.array(CTe),runner:L.object({version:L.string().min(1),mode:L.literal("deterministic")}),notes:L.array(kw).default([])}),iY=L.object({timestamp:L.string().datetime(),event:L.literal("created"),evalRunId:L.string(),evalCaseId:L.string(),cardSlug:L.string(),patternId:ri,contract:L.string().nullable(),status:oY}),sY=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/**"]);var aY={low:0,medium:1,high:2};function _Te(e,t){return aY[e]>=aY[t]?e:t}function lY(e){let t=e?.detector;return typeof t=="string"&&t.length>0?t:void 0}function cY(e,t){let n=lY(e.detail),r=lY(t.detail);return n!==void 0&&r!==void 0&&n!==r?t.severity:_Te(e.severity,t.severity)}function fY(e){let t=ti();cp(t)||dY(t,{recursive:!0});let n=sp(e.slug),r=hw(e.slug),o=lc(n),i=PTe(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=lp.parse(i);return $Te(n,c),DTe(r,dp(c)),OTe({timestamp:FTe(),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 lc(e){if(cp(e))try{let t=ITe(e,"utf-8"),n=JSON.parse(t),r=lp.safeParse(n);return r.success?r.data:void 0}catch{return}}function PTe(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=MTe(e.evidence,t.evidence),r=LTe(e.firstSeen,t.observedAt),o=NTe(e.lastSeen,t.observedAt),i=cY(e,t);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 MTe(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 dp(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(`
|
|
1993
|
+
`);return t.length<=2e3?t:t.slice(0,1997)+"..."}function Ske(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 vke(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function kke(e){return e>=10?"high":e>=4?"medium":"low"}function Tke(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 Eke=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function bw(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(!Eke.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()){let a=Rke(s);a.length<n||o.push(Ake(i,a,s))}return o}function Rke(e){return[...new Set(e.map(t=>t.sessionId))]}var xke=8;function Ake(e,t,n){let r=_ke(e),o=new Date().toISOString(),i=n.slice(0,xke),s=i.map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:Ike(c.rawLine),annotation:`closure.reason='${c.reason}' \xB7 cost=${Pke(c.finalCostUsd)} \xB7 turns=${c.finalTurnCount}`})),a=n.reduce((c,d)=>c+d.finalCostUsd,0),l=n.reduce((c,d)=>c+d.finalTurnCount,0)/n.length;return{slug:r,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:Cke(e,t.length),observedAt:o,evidence:s,detail:{detector:"closure-anomaly@v2",closureReason:e,affectedSessions:t.length,closureEventCount:n.length,totalCostUsd:YJ(a),avgTurnCount:Mke(l),maxCostUsd:YJ(Math.max(...n.map(c=>c.finalCostUsd))),sessionIds:t,seqs:i.map(c=>c.seq)}}}function Cke(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 _ke(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function Ike(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Pke(e){return`$${e.toFixed(4)}`}function YJ(e){return Math.round(e*1e4)/1e4}function Mke(e){return Math.round(e*100)/100}import{createHash as Oke}from"crypto";var Is=2,$ke="v1-hook-reason-tuple",Dke=8;function VJ(e,t={}){let n=t.minOccurrences??Is;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=Fke({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},p=r.get(d);p?p.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Nke(i,s));return o}function Fke(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return Oke("sha256").update(t).digest("hex")}function Lke(e){return`subagent-block-${e.slice(0,12)}`}function Nke(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=Lke(e),o=new Date().toISOString(),s=t.slice(0,Dke).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Hke(l.rawLine),annotation:jke(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:Uke(n.reason,t.length,a),pattern:"subagent-block",severity:Bke(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:$ke,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 Bke(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function Uke(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 jke(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 Hke(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as Wke}from"crypto";var Ps=2,Kke="v1-pretooluse-read-normreason",Gke=8,qke=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function zke(e){return e.includes("read-denylist entry:")||e.includes("is a protected credential/secret path")?"credential-floor":e.includes("Sub-agent path access denied:")||e.includes("Sub-agents cannot access paths outside the session's granted roots")?"read-root-containment":"unclassified"}function Jke(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function XJ(e,t={}){let n=t.minOccurrences??Ps;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||!qke.has(l))continue;let c=a.payload.reason??"",d=zke(c);if(d==="credential-floor")continue;let u=Jke(c),p=Yke({hookEvent:a.payload.hookEvent,normalizedReason:u}),f={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:u,blockedTool:l,mechanism:d},g=r.get(p);g?g.push(f):r.set(p,[f])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Xke(i,s));return o}function Yke(e){let t=[e.hookEvent,e.normalizedReason].join("|");return Wke("sha256").update(t).digest("hex")}function Vke(e){return`subagent-read-denial-${e.slice(0,12)}`}function Xke(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=Vke(e),o=new Date().toISOString(),s=t.slice(0,Gke).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:tTe(c.rawLine),annotation:eTe(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:Zke(t.length,a),pattern:"subagent-read-denial",severity:Qke(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v2",fingerprintAlgorithm:Kke,fingerprint:e,hookEvent:"PreToolUse",denialMechanism:n.mechanism,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 Qke(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function Zke(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function eTe(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function tTe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var nTe=Lh,Ms=3,Os=.25,rTe=8;function sc(e,t={}){let n=t.minFailures??Ms,r=t.minFailureRate??Os;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=oTe(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&nTe.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(iTe(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function oTe(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 iTe(e,t){let n=lTe(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,rTe).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:cTe(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:aTe(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:sTe(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:dTe(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:uTe(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function sTe(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function aTe(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function lTe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function cTe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function dTe(e){return Math.round(e*1e4)/1e4}function uTe(e){return Math.round(e*100)/100}var ww=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Vr})`,run:(e,t)=>yw(e,{minRepeats:t.minRepeats??Vr})},{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)=>bw(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${Is})`,enabledByDefault:!1,run:(e,t)=>VJ(e,{minOccurrences:t.subagentBlockMinOccurrences??Is})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${Ms} failures, ${Os} rate)`,enabledByDefault:!0,run:(e,t)=>sc(e,{minFailures:t.toolFailureMinFailures??Ms,minFailureRate:t.toolFailureMinRate??Os})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${Ps})`,enabledByDefault:!1,run:(e,t)=>XJ(e,{minOccurrences:t.subagentReadDenialMinOccurrences??Ps})}]);function QJ(e,t,n,r){let o=[];for(let i of ww){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 Sw(){return ww.map(e=>e.name)}function ZJ(){return ww.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function ac(){return ww.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as cp,mkdirSync as dY,readFileSync as ITe,readdirSync as uY,renameSync as pY,writeFileSync as JA}from"fs";import{join as mY}from"path";import{z as L}from"zod";var ri=L.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),vw=L.enum(["low","medium","high"]),pTe=L.enum(["open","deferred","resolved"]),eY=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()}),kw=L.object({at:L.string().datetime(),text:L.string()}),lp=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:ri,severity:vw,status:pTe,firstSeen:L.string().datetime(),lastSeen:L.string().datetime(),occurrenceCount:L.number().int().nonnegative(),evidence:L.array(eY).min(1),detail:L.record(L.string(),L.unknown()),notes:L.array(kw).default([])}),SSt=L.object({slug:L.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:L.string().min(1).max(200),pattern:ri,severity:vw,observedAt:L.string().datetime(),evidence:L.array(eY).min(1),detail:L.record(L.string(),L.unknown())}),tY=L.object({timestamp:L.string().datetime(),event:L.enum(["created","updated","merged-noop"]),slug:L.string(),pattern:ri,occurrenceCount:L.number().int().nonnegative(),evidenceAdded:L.number().int().nonnegative()}),mTe=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"]),fTe=L.enum(["safe","moderate","high","forbidden"]),gTe=L.enum(["low","medium","high"]),hTe=L.object({cardSlug:L.string(),eventIndices:L.array(L.number().int().nonnegative()).min(1),annotation:L.string().optional()}),yTe=L.object({path:L.string().min(1),rationale:L.string(),riskTier:fTe,confidence:gTe}),bTe=L.object({unitTests:L.array(L.string()),evalCases:L.array(L.string()),smokeChecks:L.array(L.string()),manualChecks:L.array(L.string())}),wTe=L.object({forbiddenPaths:L.array(L.string()),requiresExplicitApproval:L.boolean()}),STe=L.enum(["draft","approved","rejected","superseded"]),qA=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:mTe,evidenceRefs:L.array(hTe).min(1),fixSketch:L.string().min(1),likelyFiles:L.array(yTe),riskLevel:vw,validationPlan:bTe,scopeFreeze:wTe,generatedBy:L.enum(["template","llm"]),createdAt:L.string().datetime(),status:STe,notes:L.array(kw).default([])}),nY=L.object({timestamp:L.string().datetime(),event:L.enum(["created","triaged","superseded"]),proposalId:L.string(),cardSlug:L.string(),generatedBy:L.enum(["template","llm"]),riskLevel:vw}),vTe=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")}),kTe=L.object({kind:L.literal("pattern-absent"),patternId:ri,detectorVersion:L.string().min(1),rationale:L.string().min(1)}),TTe=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")}),ETe=L.enum(["draft","approved","rejected","superseded"]),Tw=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:vTe,assertion:kTe,provenance:TTe,status:ETe,notes:L.array(kw).default([])}),rY=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")}),RTe=L.enum(["pass","fail","skipped"]),xTe=L.object({name:L.string().min(1),description:L.string().min(1),status:RTe,expected:L.string(),actual:L.string()}),ATe=L.enum(["config-value","observed-behavior","source-symbol","fixture"]),CTe=L.object({kind:ATe,ref:L.string().min(1),detail:L.string()}),oY=L.enum(["pass","fail","unsupported","error"]),zA=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:ri,contract:L.string().min(1).nullable(),status:oY,createdAt:L.string().datetime(),durationMs:L.number().int().nonnegative(),checks:L.array(xTe),evidence:L.array(CTe),runner:L.object({version:L.string().min(1),mode:L.literal("deterministic")}),notes:L.array(kw).default([])}),iY=L.object({timestamp:L.string().datetime(),event:L.literal("created"),evalRunId:L.string(),evalCaseId:L.string(),cardSlug:L.string(),patternId:ri,contract:L.string().nullable(),status:oY}),sY=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/**"]);var aY={low:0,medium:1,high:2};function _Te(e,t){return aY[e]>=aY[t]?e:t}function lY(e){let t=e?.detector;return typeof t=="string"&&t.length>0?t:void 0}function cY(e,t){let n=lY(e.detail),r=lY(t.detail);return n!==void 0&&r!==void 0&&n!==r?t.severity:_Te(e.severity,t.severity)}function fY(e){let t=ti();cp(t)||dY(t,{recursive:!0});let n=sp(e.slug),r=hw(e.slug),o=lc(n),i=PTe(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=lp.parse(i);return $Te(n,c),DTe(r,dp(c)),OTe({timestamp:FTe(),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 lc(e){if(cp(e))try{let t=ITe(e,"utf-8"),n=JSON.parse(t),r=lp.safeParse(n);return r.success?r.data:void 0}catch{return}}function PTe(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=MTe(e.evidence,t.evidence),r=LTe(e.firstSeen,t.observedAt),o=NTe(e.lastSeen,t.observedAt),i=cY(e,t);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 MTe(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 dp(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(`
|
|
1994
1994
|
`)}function OTe(e){let t=tY.parse(e),n=NJ(),r=ti();cp(r)||dY(r,{recursive:!0});try{JA(n,JSON.stringify(t)+`
|
|
1995
1995
|
`,{flag:"a"})}catch{}}function $Te(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;JA(n,JSON.stringify(t,null,2)),pY(n,e)}function DTe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;JA(n,t),pY(n,e)}function FTe(){return new Date().toISOString()}function LTe(e,t){return e<=t?e:t}function NTe(e,t){return e>=t?e:t}function gY(){let e=ti();if(!cp(e))return[];let t=[];for(let n of uY(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=lc(mY(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 Ew(e){return lc(sp(e))}function hY(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 BTe(e){if(e.status!=="resolved"&&e.status!=="deferred")return!1;let t=hY(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 UTe(e){let t=[];for(let n of e){if(!BTe(n))continue;let r=hY(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 yY(){let e=ti();if(!cp(e))return[];let t=[];for(let n of uY(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=lc(mY(e,n));r&&t.push(r)}return UTe(t)}import{existsSync as jTe,mkdirSync as HTe,renameSync as bY,writeFileSync as wY}from"fs";import{dirname as WTe}from"path";var $s=class extends Error{constructor(n,r){super(r);this.code=n;this.name="TriageError"}code};function SY(e,t){let n=sp(e),r=hw(e),o=lc(n);if(!o)throw new $s("card-not-found",`No failure card found for slug '${e}'`);if(t.note!==void 0&&t.note.trim().length===0)throw new $s("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 $s("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},p=lp.parse(u);return KTe(n),GTe(n,p),qTe(r,dp(p)),{slug:e,card:p,noteAdded:s,statusChanged:a?{from:o.status,to:d}:void 0,jsonPath:n,markdownPath:r}}function KTe(e){let t=WTe(e);jTe(t)||HTe(t,{recursive:!0})}function GTe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;wY(n,JSON.stringify(t,null,2)),bY(n,e)}function qTe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;wY(n,t),bY(n,e)}var zTe={"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(`
|
|
1996
1996
|
`),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(`
|
|
@@ -2001,7 +2001,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
|
|
|
2001
2001
|
`)}function AY(){let e=_s();if(!Rw(e))return[];let t=[];for(let n of nEe(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=CY(rEe(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 VA(e){return CY(HA(e))}function CY(e){if(Rw(e))try{let t=tEe(e,"utf-8"),n=JSON.parse(t),r=qA.safeParse(n);return r.success?r.data:void 0}catch{return}}function iEe(e){let t=nY.parse(e),n=UJ(),r=_s();Rw(r)||TY(r,{recursive:!0});try{YA(n,JSON.stringify(t)+`
|
|
2002
2002
|
`,{flag:"a"})}catch{}}function sEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;YA(n,JSON.stringify(t,null,2)),EY(n,e)}function aEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;YA(n,t),EY(n,e)}import{createHash as _Y}from"crypto";import{existsSync as lEe,readFileSync as cEe}from"fs";var vn=class extends Error{code;constructor(t,n){super(t),this.name="EvalGenError",this.code=n}};function IY(e,t){if(!lEe(e))throw new vn(`replay-fixture: source trace not found: ${e}`,"source-not-found");let n=t.startLine??1;if(n!==1)throw new vn(`replay-fixture: only startLine=1 (prefix slice) is supported in Sprint 3 (got ${n})`,"unsupported-window");let r=cEe(e);if(r.length===0)throw new vn(`replay-fixture: source trace is empty: ${e}`,"source-empty");let o=dEe(r),i=o.length,s=-1;for(let u=0;u<o.length;u++){let p=o[u];if(p.contentEnd===p.start)continue;let f=r.subarray(p.start,p.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 vn(`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=_Y("sha256").update(c).digest("hex");return{bytes:c,startLine:1,endLine:s,sliceLineCount:s,sliceSha256:d,sourceLineCount:i}}function Aw(e){return _Y("sha256").update(e).digest("hex")}function dEe(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 uEe}from"crypto";import{existsSync as Cw,mkdirSync as PY,readFileSync as MY,readdirSync as pEe,renameSync as XA,writeFileSync as _w}from"fs";import{join as OY,relative as mEe}from"path";q();function $Y(e,t={}){let n=(t.now??(()=>new Date))(),r=fEe(n),o=t.randomSuffix!==void 0?t.randomSuffix():uEe(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 fEe(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 DY(e,t){if(t.evidenceRowIndex<0||t.evidenceRowIndex>=e.evidence.length)throw new vn(`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 vn(`buildEvalCase: evidence row ${t.evidenceRowIndex} has no eventIndices`,"seq-not-found");let r=Math.max(...n.eventIndices),i=(t.resolveTraceAbsPath??gEe)(n.tracePath),s=IY(i,{endSeq:r}),a=(t.now??(()=>new Date))().toISOString(),l=KA(t.evalCaseId),c=mEe(we(),l),d=typeof e.detail.detector=="string"?e.detail.detector:e.pattern,u=typeof e.detail.fingerprint=="string"?e.detail.fingerprint:null,p=t.proposalId??null,f={schemaVersion:1,evalCaseId:t.evalCaseId,cardSlug:e.slug,proposalId:p,title:hEe(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:yEe({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 Tw.parse(f),{evalCase:f,sliceBytes:s.bytes}}function gEe(e){return OY(we(),e)}function hEe(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 yEe(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 FY(e,t){let n=Tw.parse(e),r=ni();Cw(r)||PY(r,{recursive:!0});let o=WA(n.evalCaseId),i=KA(n.evalCaseId),s=WJ(n.evalCaseId);vEe(i,t);let a=Aw(MY(i));if(a!==n.replay.sliceSha256)throw new vn(`writeEvalCase: fixture sha256 mismatch after write (expected ${n.replay.sliceSha256}, got ${a}, path ${i})`,"fixture-mismatch");return wEe(o,n),SEe(s,Iw(n)),bEe({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 Iw(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(`
|
|
2003
2003
|
`)}function QA(){let e=ni();if(!Cw(e))return[];let t=[];for(let n of pEe(e)){if(!n.endsWith(".json")||n.startsWith(".")||n.endsWith(".fixture.jsonl"))continue;let r=NY(OY(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 Pw(e){return NY(WA(e))}function LY(e){return QA().filter(t=>t.cardSlug===e).map(t=>Pw(t.evalCaseId)).filter(t=>t!==void 0)}function NY(e){if(Cw(e))try{let t=MY(e,"utf-8"),n=JSON.parse(t),r=Tw.safeParse(n);return r.success?r.data:void 0}catch{return}}function bEe(e){let t=rY.parse(e),n=HJ(),r=ni();Cw(r)||PY(r,{recursive:!0});try{_w(n,JSON.stringify(t)+`
|
|
2004
|
-
`,{flag:"a"})}catch{}}function wEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;_w(n,JSON.stringify(t,null,2)),XA(n,e)}function SEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;_w(n,t),XA(n,e)}function vEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;_w(n,t),XA(n,e)}import{randomBytes as UEe}from"crypto";import{existsSync as oC,mkdirSync as XY,readFileSync as jEe,readdirSync as
|
|
2004
|
+
`,{flag:"a"})}catch{}}function wEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;_w(n,JSON.stringify(t,null,2)),XA(n,e)}function SEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;_w(n,t),XA(n,e)}function vEe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;_w(n,t),XA(n,e)}import{randomBytes as UEe}from"crypto";import{existsSync as oC,mkdirSync as XY,readFileSync as jEe,readdirSync as hvt,renameSync as QY,writeFileSync as iC}from"fs";import{join as HEe}from"path";q();ha();Dd();yh();var BY=400;function Xt(e){let n=(typeof e=="string"?e:String(e)).replace(/\s+/g," ").trim();return n.length>BY?n.slice(0,BY-1)+"\u2026":n}function _e(e){return{name:e.name,description:e.description,status:e.status??(e.pass?"pass":"fail"),expected:Xt(e.expected),actual:Xt(e.actual)}}var up="eval_run_probe_tool";async function kEe(){let e=ga,t=0,n=async()=>(t+=1,{content:"probe-ok"}),r=new Ot({handlers:new Map([[up,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[up]}}),o=new AbortController().signal,i=h=>({id:"eval-run-probe",name:up,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"})),p=a.every(h=>h.isError!==!0&&h.circuitBreaker!==!0),f=[_e({name:"executes-below-threshold",description:`First ${e-1} byte-identical calls execute without tripping`,pass:p&&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`}),_e({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`}),_e({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(up),expected:`mentions "circuit breaker" and the tool name "${up}"`,actual:c.content}),_e({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 TEe(){let n=fg(3,3);return{checks:[_e({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}),_e({name:"recovery-hint-present",description:"Refusal carries the recovery hint clause",pass:n.includes(Eo),expected:"contains SKILL_MAX_DEPTH_RECOVERY_HINT",actual:n}),_e({name:"hint-directs-inline-work",description:"Hint tells the model to work inline instead of delegating further",pass:/perform the work inline/i.test(Eo)&&/skill\/agent\/compose/i.test(Eo),expected:'hint mentions "perform the work inline" and "skill/agent/compose"',actual:Eo})],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 Ds="tool-failure-density",Wn="flaky_tool",cc="refusal_only_tool",dc="tool-failure-flaky-tool",EEe="tool-failure-refusal-only-tool";async function REe(){let e=ZJ(),t=ac(),n=[_e({name:"in-default-enabled-set",description:`${Ds} runs in a default scan`,pass:e.includes(Ds),expected:`defaultEnabledDetectorNames() includes "${Ds}"`,actual:`[${e.join(", ")}]`}),_e({name:"not-opt-in",description:`${Ds} is not in the disabled-by-default set`,pass:!t.includes(Ds),expected:`disabledByDefaultDetectorNames() excludes "${Ds}"`,actual:`[${t.join(", ")}]`})],r=[{kind:"config-value",ref:"DETECTOR_REGISTRY['tool-failure-density'].enabledByDefault",detail:String(e.includes(Ds))}];return{checks:n,evidence:r}}function ut(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 ZA(e,t){let n=`state/witness/${e}/trace.jsonl`;return ic({sessionId:e,tracePath:n,relativeTracePath:n,content:t.join(`
|
|
2005
2005
|
`)+`
|
|
2006
2006
|
`,sessionMtimeMs:0})}function xEe(){let e=ZA("tfd-sess-a",[ut(0,Wn,{isError:!1}),ut(1,Wn,{isError:!0,failureClass:"timeout"}),ut(2,Wn,{isError:!0}),ut(3,Wn,{isError:!0,failureClass:"policy-refusal"}),ut(4,Wn,{isError:!0,circuitBreaker:!0})]),t=ZA("tfd-sess-b",[ut(0,Wn,{isError:!0}),ut(1,Wn,{isError:!1}),ut(2,Wn,{isError:!0,failureClass:"permission-denied"}),ut(3,Wn,{isError:!0,failureClass:"abort"}),ut(4,Wn,{isError:!0,failureClass:"hook-block"}),ut(5,Wn,{isError:!0,failureClass:"elicitation-declined"})]),n=ZA("tfd-sess-c",[ut(0,cc,{isError:!1}),ut(1,cc,{isError:!0,failureClass:"policy-refusal"}),ut(2,cc,{isError:!0,failureClass:"policy-refusal"}),ut(3,cc,{isError:!0,failureClass:"permission-denied"}),ut(4,cc,{isError:!0,failureClass:"hook-block"}),ut(5,cc,{isError:!0,failureClass:"abort"})]);return[e,t,n]}function Mw(e,t){let n=e[t];return typeof n=="number"?n:void 0}function eC(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 UY(e,t){let n=eC(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 AEe(e){return Array.isArray(e)?e.filter(t=>typeof t=="number"):[]}function CEe(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function _Ee(){let e=xEe(),t=sc(e,{}),n=t.find(E=>E.slug===dc),r=t.find(E=>E.slug===EEe),o=n?.detail??{},i=Mw(o,"failureCount"),s=Mw(o,"totalCalls"),a=Mw(o,"failureRate"),l=Mw(o,"affectedSessionCount"),c=eC(o.failureClassBreakdown),d=eC(o.excludedByClass),u=CEe(o.sessionIds).slice().sort(),p=AEe(o.seqs),f=sc(e,{minFailures:4}),g=sc(e,{minFailureRate:.7}),h=!f.some(E=>E.slug===dc),y=!g.some(E=>E.slug===dc),b={"policy-refusal":1,"permission-denied":1,abort:1,"hook-block":1,"elicitation-declined":1},w={timeout:1,unclassified:2},S=[_e({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 '${dc}' with failureCount=3, totalCalls=5, failureRate=0.6`,actual:n===void 0?`no '${dc}' card; ${t.length} card(s): [${t.map(E=>E.slug).join(", ")}]`:`${t.length} card(s); failureCount=${i}, totalCalls=${s}, failureRate=${a}`}),_e({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:UY(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"}`}),_e({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(", ")}]`}),_e({name:"classification-counts-timeout-and-unclassified",description:"timeout and unclassified (no failureClass) failures DO count toward the failure stats",pass:UY(c,w),expected:"failureClassBreakdown={timeout:1,unclassified:2}",actual:`failureClassBreakdown=${JSON.stringify(c)}`}),_e({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"}`}),_e({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(p)===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=[${p.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); '${dc}' 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 IEe(){let e=await REe(),t=_Ee();return{checks:[...e.checks,...t.checks],evidence:[...e.evidence,...t.evidence]}}async function PEe(){let e=Ji("abort"),t=Ji("model_end_turn"),n=[_e({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)":Xt(e)}),_e({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":Xt(e)}),_e({name:"guidance-is-the-canonical-constant",description:"The wired hint is the exported CLOSURE_ABORT_RECOVERY_HINT (no drift)",pass:e===LE,expected:'buildClosureGuidance("abort") === CLOSURE_ABORT_RECOVERY_HINT',actual:e===null?"null":Xt(e)}),_e({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":Xt(t)})],r=[{kind:"source-symbol",ref:"src/agent/session/closure-guidance.ts#buildClosureGuidance",detail:e===null?"null":Xt(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 tC=Object.freeze([{id:"repeat-loop-circuit-breaker",patternId:"repeated-tool-use",title:"Repeat-loop circuit breaker trips at the consecutive-identical threshold",run:kEe},{id:"skill-max-depth-recovery-hint",patternId:"subagent-block",title:"Skill max-depth refusal carries an actionable recovery hint",run:TEe},{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:IEe},{id:"closure-abort-recovery-hint",patternId:"closure-anomaly",title:"Anomalous abort closure carries an actionable recovery hint",run:PEe}]);function jY(e){return tC.find(t=>t.patternId===e)}function HY(){return tC.map(e=>e.patternId)}function WY(){return tC.map(e=>e.id)}ha();yh();var $w="replay:",KY=`${$w}fixture-reproduces-pattern`,JY=`${$w}guardrail-neutralizes-recorded-loop`,GY=`${$w}fixture-reproduces-closure-anomaly`,YY=`${$w}guardrail-guides-recorded-closure`,qY="The committed fixture still reproduces the recorded repeated-tool-use loop when re-scanned by the detector",MEe=Object.freeze({replay:"byte-identical-input"}),OEe=async(e,t)=>{let n=async()=>({content:"replay-probe-ok"}),r=new Ot({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:MEe,signal:o},c=await r.execute(l);if(s=a,c.circuitBreaker===!0){i=a;break}}return{trippedAtCall:i,callsDriven:s}};function Ow(e){let t=e.detail.runLength;return typeof t=="number"?t:0}async function $Ee(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=ic({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=yw([s],{minRepeats:Vr}),l=e.provenance.fingerprintAtGeneration,c=l?a.find(w=>w.detail.fingerprint===l):void 0,d=[...a].sort((w,S)=>Ow(S)-Ow(w))[0],u=c??d;if(u===void 0)return r.push(_e({name:KY,description:qY,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(_e({name:KY,description:qY,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${Ow(u)}`}));let p=String(u.detail.toolName),f=Ow(u),g=n.driveLoop??OEe,h=Math.min(f,ga),y=await g(p,h),b=y.trippedAtCall!==null&&y.trippedAtCall<=f;return r.push(_e({name:JY,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:`'${p}' recorded \xD7${f}; live breaker ${y.trippedAtCall===null?"did NOT trip":`tripped at call ${y.trippedAtCall}`} (threshold ${ga})`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded loop on '${p}' (run length ${f})`}),{checks:r,evidence:o}}function DEe(e){let t=e.detail.closureReason;return typeof t=="string"?t:null}function FEe(e){let t=e.detail.seqs;return Array.isArray(t)?t.filter(n=>typeof n=="number"):[]}var zY="The committed fixture still reproduces the recorded anomalous closure when re-scanned by the detector";async function LEe(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=ic({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=bw([s],{minOccurrences:1}),l=Math.max(...e.replay.evidenceEventIndices),d=a.find(h=>FEe(h).includes(l))??a[0];if(d===void 0)return r.push(_e({name:GY,description:zY,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=DEe(d)??"";r.push(_e({name:GY,description:zY,pass:!0,expected:"detector finds \u22651 anomalous closure in the fixture",actual:`found closure.reason='${u}' (seq ${l})`}));let f=(n.buildGuidance??Ji)(u),g=f!==null&&f.trim().length>0;return r.push(_e({name:YY,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?Xt(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 NEe=Object.freeze([{patternId:"repeated-tool-use",run:$Ee},{patternId:"closure-anomaly",run:LEe}]),BEe=[JY,YY];function nC(e){return BEe.includes(e)}function VY(e){return NEe.find(t=>t.patternId===e)}var WEe="eval-run@v1";function ZY(e,t={}){let n=(t.now??(()=>new Date))(),r=KEe(n),o=t.randomSuffix!==void 0?t.randomSuffix():UEe(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 KEe(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 eV(e,t){let r=(t.now??(()=>new Date))().toISOString(),o=t.clockMs??(()=>Date.now()),i=o(),s=[],a=[],l=[],c=qEe(e,t);s.push(c.check),c.evidence&&a.push(c.evidence);let d=jY(e.assertion.patternId),u=null,p=!1;if(!d)l.push({at:r,text:`No deterministic validation contract is registered for pattern '${e.assertion.patternId}'. Supported: ${HY().join(", ")}.`});else{u=d.id;try{let v=await d.run();s.push(...v.checks),a.push(...v.evidence)}catch(v){p=!0;let E=v instanceof Error?v.message:String(v);l.push({at:r,text:`Contract '${d.id}' threw during execution: ${Xt(E)}`})}}let f=VY(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){p=!0;let E=v instanceof Error?v.message:String(v);l.push({at:r,text:`Fixture-replay for '${e.assertion.patternId}' threw during execution: ${Xt(E)}`})}let h=s.some(v=>nC(v.name)),y=f!==void 0&&c.check.status==="pass"&&g&&!h,b=GEe({hasContract:d!==void 0||g,contractThrew:p,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:WEe,mode:"deterministic"},notes:l};return zA.parse(S),S}function GEe(e){return e.contractThrew?"error":e.checks.some(t=>t.status==="fail")?"fail":!e.hasContract||e.replayInconclusive===!0?"unsupported":"pass"}function qEe(e,t){let r=(t.resolveFixtureAbsPath??(d=>HEe(we(),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(!oC(r))return{check:_e({name:i,description:s,pass:!1,expected:`fixture present at ${e.replay.fixturePath}`,actual:"fixture file not found on disk"})};let a;try{a=jEe(r)}catch(d){let u=d instanceof Error?d.message:String(d);return{check:_e({name:i,description:s,pass:!1,expected:`readable fixture (${o})`,actual:`read error: ${Xt(u)}`})}}let l=Aw(a),c=l===o;return{check:_e({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 tV(e){let t=zA.parse(e),n=oc();oC(n)||XY(n,{recursive:!0});let r=GJ(t.evalRunId),o=qJ(t.evalRunId);return VEe(r,t),XEe(o,sC(t)),YEe({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 zEe={pass:"\u2713 PASS",fail:"\u2717 FAIL",unsupported:"\u2013 UNSUPPORTED",error:"\u26A0 ERROR"},JEe={pass:"\u2713",fail:"\u2717",skipped:"\u2013"};function sC(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=>nC(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: ${zEe[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(`| ${rC(s.name)} | ${JEe[s.status]} ${s.status} | ${rC(s.expected)} | ${rC(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(`
|
|
2007
2007
|
`)}function rC(e){return e.replace(/\|/g,"\\|").replace(/\n/g," ")}function YEe(e){let t=iY.parse(e),n=oc();oC(n)||XY(n,{recursive:!0});try{iC(KJ(),JSON.stringify(t)+`
|