agent-afk 5.84.9 → 5.84.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs
CHANGED
|
@@ -878,7 +878,7 @@ Retrying it verbatim will fail the same way. Fix the underlying cause, change th
|
|
|
878
878
|
|
|
879
879
|
`).trim()}function C5(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function hP(e,t){let{JSDOM:n,Readability:r,turndown:o}=await A5(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=gP(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=gP(o.turndown(d));return{title:a,markdown:u,textLength:C5(c),usedFallback:!0}}var pv,yP=k(()=>{"use strict";pv=null});function I5(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 bP(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function P5(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 wP(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??I5,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(!_5.has(u.status)||d===o)return u;let m=P5(u,s)??bP(d,i,s);j("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=bP(d,i,s);j("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var _5,SP=k(()=>{"use strict";Se();_5=new Set([429,502,503,504])});import{BlockList as M5,isIP as fv}from"node:net";import{lookup as O5}from"node:dns/promises";import{Agent as $5}from"undici";function kP(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function N5(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function mv(e){let t=fv(e);return t===0?!1:L5.check(e,t===4?"ipv4":"ipv6")}async function TP(e){return O5(e,{all:!0,verbatim:!0})}async function gv(e,t={}){if(t.allowPrivateHosts??kP())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=N5(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(fv(r)!==0)return mv(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??TP,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(mv(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Yc(e,t={}){let n=await gv(e,t);if(!n.allowed)throw new _n(n.reason)}async function Fm(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<=vP;s++){await Yc(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??kP())?{dispatcher:B5}:{}},l=await wP(e,i,a,r.retry??{});if(!U5.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 _n(`too many redirects (>${vP}) starting from ${t}`)}var D5,F5,L5,_n,B5,vP,U5,hv=k(()=>{"use strict";G();SP();D5=[["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]],F5=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],L5=(()=>{let e=new M5;for(let[t,n]of D5)e.addSubnet(t,n,"ipv4");for(let[t,n]of F5)e.addSubnet(t,n,"ipv6");return e})(),_n=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};B5=new $5({connect:{lookup(e,t,n){TP(e).then(r=>{let o=r.find(s=>mv(s.address));if(o!==void 0){n(new _n(`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,fv(i.address))},r=>n(r,"",0))}}});vP=20,U5=new Set([301,302,303,307,308])});import{readFileSync as j5}from"node:fs";import{join as H5}from"path";function W5(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function EP(e,t){return W5(t).test(e)}function q5(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(K5.has(t))return!0;if(G5.has(t))return!1}return!1}function xP(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function z5(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 RP(e){let t=e===void 0||e.trim()===""?"default":e.trim();return pc(t),t}function J5(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function V5(e){try{return j5(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Y5(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=RP(t.defaultProfile)),n}function AP(e){let t=e?.env??v,n=e?.readFileSync??V5,r=e?.surface??t.AGENT_SURFACE,o=q5(t.AFK_BROWSER_HEADLESS,r),i=xP(t.AFK_BROWSER_ALLOWED_DOMAINS),s=xP(t.AFK_BROWSER_BLOCKED_DOMAINS),a=J5(t.AFK_BROWSER_DOM_SNAPSHOTS),l=z5(t.AFK_BROWSER_BACKEND),c=RP(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():H5(kn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=Y5(d,g);return h.configPath=m,h}function Lm(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(EP(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>EP(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var K5,G5,Nm=k(()=>{"use strict";G();q();K5=new Set(["daemon","subagent","telegram","afk"]),G5=new Set(["repl","interactive","cli"])});import{existsSync as X5,readFileSync as Q5}from"node:fs";import{createRequire as Z5}from"node:module";import{dirname as e3,join as t3}from"node:path";function IP(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<r3&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function Ft(e){let t=IP(e);return _P.some(n=>t.includes(n))}function o3(){try{let t=Z5(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(Q5(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=t3(e3(t),o);return X5(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Xc(){return CP??=o3()??n3,CP}function yv(e){return e.includes("install chromium")}function cn(e,t){let n=IP(e),r=t?.latched===!0?` ${i3}`:"";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: ${Xc()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Xc()}). Or pick a different tool.${r}`}function Qc(e,t,n=!1){if(!Ft(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
880
880
|
|
|
881
|
-
${cn(e,{headless:t,latched:n})}`,{cause:e})}var _P,n3,r3,CP,i3,Bm=k(()=>{"use strict";_P=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],n3="pnpm exec playwright install chromium",r3=4;i3="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 Ri from"node:fs";import Um from"node:path";import{randomBytes as s3}from"node:crypto";import{chromium as a3}from"playwright";function l3(){try{return"5.84.9"}catch{}try{let e=Um.resolve(import.meta.dirname,"../../../package.json"),t=Ri.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var c3,jm,PP=k(()=>{"use strict";Bm();q();Se();c3=l3(),jm=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=a3.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=Qc(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(m){throw i??m}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/${c3}`}}loadStorageState(t){let n=mc(t);try{if(!Ri.existsSync(n))return;let r=JSON.parse(Ri.readFileSync(n,"utf8"));return j("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){j("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=mc(t);if(!Ri.existsSync(r))return;let o=await n.storageState(),i=Um.join(Um.dirname(r),`.${Um.basename(r)}.${process.pid}.${s3(4).toString("hex")}.tmp`);Ri.writeFileSync(i,JSON.stringify(o),{mode:384}),Ri.chmodSync(i,384),Ri.renameSync(i,r),j("[browser/vault] saved session",{profile:t,file:r})}catch(r){j("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as d3}from"crypto";function MP(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&u3.test(e.label))}function OP(e){return d3("sha256").update(e,"utf8").digest("hex").slice(0,8)}function $P(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var u3,Hm=k(()=>{"use strict";u3=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as p3}from"node:crypto";function m3(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function f3(e,t,n){return`el_${p3("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function g3(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function DP(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function LP(e,t){let n=e.role??"",r=e.name??"";FP.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])LP(i,t)}async function h3(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},NP).catch(()=>[])}async function y3(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},NP).catch(()=>[])}function b3(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Wm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=b3(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=h3(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],LP(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await y3(e)).filter(F=>FP.has(F.role??"")));let w=new Map;for(let P of m){let F=DP(P.name),W=w.get(F);(!W||W.bbox.w===0&&P.bbox.w>0)&&w.set(F,P)}let S=y.map(P=>({ax:P,dom:w.get(DP(P.name??""))})),T=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,F)=>{let W=P.dom?.bbox.y??0,L=F.dom?.bbox.y??0;if(W!==L)return W-L;let H=P.dom?.bbox.x??0,M=F.dom?.bbox.x??0;return H-M}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((P,F)=>{let W=P.ax.role??"generic",L=P.ax.name??"",H=f3(W,L,F),M=P.dom?.bbox??{x:0,y:0,w:0,h:0},U=P.dom?.type??null,N=null;P.ax.value!==void 0&&P.ax.value!==null&&(N=String(P.ax.value)),P.ax.checked!==void 0&&(N=String(P.ax.checked)),MP({role:W,kind:U})&&(N="[redacted]");let $={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&($.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&($.selected=P.ax.selected),P.ax.expanded!==void 0&&($.expanded=P.ax.expanded);let _;P.dom?.testId?_=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(_=`#${P.dom.id}`);let B={id:H,role:W,label:m3(L),kind:U,value:N,state:$,bbox:M};return _!==void 0&&(B.selector=_),B}),O="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?O="loading":P==="interactive"?O="navigating":O="idle"}catch{O="navigating"}O!=="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 R=g3(f),I=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:I,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:O,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var FP,NP,BP=k(()=>{"use strict";Hm();FP=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);NP="a[href], button, input, select, textarea, [role], [tabindex], label"});async function UP(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 bv(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>UP(e,i)))).filter(o=>o!==null)}async function w3(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 wv(e,t,n){switch(t.kind){case"element_id":return S3(e,t,n);case"selector":return v3(e,t);case"semantic":return k3(e,t)}}async function S3(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 bv(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function v3(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 bv(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function k3(e,t){return t.role!==void 0?T3(e,t.text,t.role):E3(e,t.text,t)}async function T3(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 bv(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function E3(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 w3(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await UP(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>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 jP=k(()=>{"use strict"});async function Sv(e,t,n,r){let o=e.url();if(o===n)return null;let i=Lm(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 HP=k(()=>{"use strict";Nm()});import{randomBytes as x3}from"crypto";import{mkdir as R3,stat as A3,writeFile as C3}from"fs/promises";import{join as vv}from"path";import{gzip as _3}from"zlib";import{promisify as I3}from"util";function P3(e){return vv(ti(e),"browser")}function M3(e){return vv(P3(e),"screenshots")}function O3(){return new Date().toISOString().replace(/[:.]/g,"-")}function $3(){return x3(3).toString("hex")}async function kv(e,t,n){if(t.length>WP)throw new Error(`writeScreenshotSidecar: buffer exceeds ${WP} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=M3(e);await R3(r,{recursive:!0});let o=`${O3()}-${$3()}-${n}.png`,i=vv(r,o);await C3(i,t);let{size:s}=await A3(i);return{path:i,bytes:s}}var ZIe,WP,KP=k(()=>{"use strict";q();Hm();ZIe=I3(_3);WP=5*1024*1024});var qP={};ap(qP,{PlaywrightProvider:()=>Tv});function GP(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 Tv,zP=k(()=>{"use strict";PP();BP();jP();Nm();HP();KP();Tv=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new jm(t)}async open(t){let n=Lm(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 Sv(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 Wm(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 Wm(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 wv(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${GP(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 Sv(r,this.config,i,()=>this.close({sessionId:n}));if(u!==null)return u;let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Wm(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,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 wv(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${GP(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 kv(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 kv(n,o,r);return i}catch{return null}}}});var Ci={};ap(Ci,{__resetBrowserRegistryForTests:()=>B3,browserProviderActive:()=>L3,closeBrowserProvider:()=>Ev,getBrowserProvider:()=>F3,peekBrowserProvider:()=>N3});function JP(){Promise.resolve(Ev()).then(()=>{process.exit(130)})}function VP(){Promise.resolve(Ev()).then(()=>{process.exit(143)})}function YP(){tr=null}function D3(){Km||(process.on("SIGINT",JP),process.on("SIGTERM",VP),process.on("exit",YP),Km=!0)}function XP(){Km&&(process.removeListener("SIGINT",JP),process.removeListener("SIGTERM",VP),process.removeListener("exit",YP),Km=!1)}async function F3(e){return tr!==null?tr:(Ai!==null||(Ai=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(zP(),qP)),n=AP(e),r=new t(n);return D3(),tr=r,Ai=null,r})()),Ai)}async function Ev(){if(tr===null)return;let e=tr;tr=null,Ai=null,XP(),await e.shutdown()}function L3(){return tr!==null}function N3(){return tr}function B3(){tr=null,Ai=null,XP()}var tr,Ai,Km,_i=k(()=>{"use strict";Nm();tr=null,Ai=null,Km=!1});async function QP(e,t){try{return await hP(e,t)}catch(n){return j("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function G3(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(_i(),Ci));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function ZP(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??G3,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s=e,a=null,l=null;try{let d=await Fm(n,e,{headers:K3,signal:t.signal},o);a=d.status,s=d.url||e;let u=d.headers.get("content-type")??"";if(d.ok){if(W3.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 m=await d.text();if(H3.test(u)&&!j3.test(u))return{title:"",markdown:m.trim(),finalUrl:s,usedRender:!1};if(i=await QP(m,s),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof _n||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 Yc(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:m=>Yc(m,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Yc(d.finalUrl,o);let u=await QP(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 _n)throw d;if(i===null){let u=d instanceof Error?d.message:String(d),m=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${e}: fetch failed (${m}) 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 j3,H3,W3,K3,eM=k(()=>{"use strict";yP();hv();Se();j3=/(text\/html|application\/xhtml\+xml)/i,H3=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,W3=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,K3={"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 J3(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(q3,{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),z3),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Ar(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 tM(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?J3({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 nM(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
881
|
+
${cn(e,{headless:t,latched:n})}`,{cause:e})}var _P,n3,r3,CP,i3,Bm=k(()=>{"use strict";_P=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],n3="pnpm exec playwright install chromium",r3=4;i3="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 Ri from"node:fs";import Um from"node:path";import{randomBytes as s3}from"node:crypto";import{chromium as a3}from"playwright";function l3(){try{return"5.84.10"}catch{}try{let e=Um.resolve(import.meta.dirname,"../../../package.json"),t=Ri.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var c3,jm,PP=k(()=>{"use strict";Bm();q();Se();c3=l3(),jm=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=a3.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=Qc(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(m){throw i??m}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/${c3}`}}loadStorageState(t){let n=mc(t);try{if(!Ri.existsSync(n))return;let r=JSON.parse(Ri.readFileSync(n,"utf8"));return j("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){j("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=mc(t);if(!Ri.existsSync(r))return;let o=await n.storageState(),i=Um.join(Um.dirname(r),`.${Um.basename(r)}.${process.pid}.${s3(4).toString("hex")}.tmp`);Ri.writeFileSync(i,JSON.stringify(o),{mode:384}),Ri.chmodSync(i,384),Ri.renameSync(i,r),j("[browser/vault] saved session",{profile:t,file:r})}catch(r){j("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as d3}from"crypto";function MP(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&u3.test(e.label))}function OP(e){return d3("sha256").update(e,"utf8").digest("hex").slice(0,8)}function $P(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var u3,Hm=k(()=>{"use strict";u3=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as p3}from"node:crypto";function m3(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function f3(e,t,n){return`el_${p3("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function g3(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function DP(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function LP(e,t){let n=e.role??"",r=e.name??"";FP.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])LP(i,t)}async function h3(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},NP).catch(()=>[])}async function y3(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},NP).catch(()=>[])}function b3(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Wm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=b3(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=h3(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],LP(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await y3(e)).filter(F=>FP.has(F.role??"")));let w=new Map;for(let P of m){let F=DP(P.name),W=w.get(F);(!W||W.bbox.w===0&&P.bbox.w>0)&&w.set(F,P)}let S=y.map(P=>({ax:P,dom:w.get(DP(P.name??""))})),T=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,F)=>{let W=P.dom?.bbox.y??0,L=F.dom?.bbox.y??0;if(W!==L)return W-L;let H=P.dom?.bbox.x??0,M=F.dom?.bbox.x??0;return H-M}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((P,F)=>{let W=P.ax.role??"generic",L=P.ax.name??"",H=f3(W,L,F),M=P.dom?.bbox??{x:0,y:0,w:0,h:0},U=P.dom?.type??null,N=null;P.ax.value!==void 0&&P.ax.value!==null&&(N=String(P.ax.value)),P.ax.checked!==void 0&&(N=String(P.ax.checked)),MP({role:W,kind:U})&&(N="[redacted]");let $={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&($.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&($.selected=P.ax.selected),P.ax.expanded!==void 0&&($.expanded=P.ax.expanded);let _;P.dom?.testId?_=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(_=`#${P.dom.id}`);let B={id:H,role:W,label:m3(L),kind:U,value:N,state:$,bbox:M};return _!==void 0&&(B.selector=_),B}),O="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?O="loading":P==="interactive"?O="navigating":O="idle"}catch{O="navigating"}O!=="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 R=g3(f),I=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:I,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:O,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var FP,NP,BP=k(()=>{"use strict";Hm();FP=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);NP="a[href], button, input, select, textarea, [role], [tabindex], label"});async function UP(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 bv(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>UP(e,i)))).filter(o=>o!==null)}async function w3(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 wv(e,t,n){switch(t.kind){case"element_id":return S3(e,t,n);case"selector":return v3(e,t);case"semantic":return k3(e,t)}}async function S3(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 bv(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function v3(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 bv(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function k3(e,t){return t.role!==void 0?T3(e,t.text,t.role):E3(e,t.text,t)}async function T3(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 bv(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function E3(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 w3(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await UP(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>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 jP=k(()=>{"use strict"});async function Sv(e,t,n,r){let o=e.url();if(o===n)return null;let i=Lm(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 HP=k(()=>{"use strict";Nm()});import{randomBytes as x3}from"crypto";import{mkdir as R3,stat as A3,writeFile as C3}from"fs/promises";import{join as vv}from"path";import{gzip as _3}from"zlib";import{promisify as I3}from"util";function P3(e){return vv(ti(e),"browser")}function M3(e){return vv(P3(e),"screenshots")}function O3(){return new Date().toISOString().replace(/[:.]/g,"-")}function $3(){return x3(3).toString("hex")}async function kv(e,t,n){if(t.length>WP)throw new Error(`writeScreenshotSidecar: buffer exceeds ${WP} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=M3(e);await R3(r,{recursive:!0});let o=`${O3()}-${$3()}-${n}.png`,i=vv(r,o);await C3(i,t);let{size:s}=await A3(i);return{path:i,bytes:s}}var ZIe,WP,KP=k(()=>{"use strict";q();Hm();ZIe=I3(_3);WP=5*1024*1024});var qP={};ap(qP,{PlaywrightProvider:()=>Tv});function GP(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 Tv,zP=k(()=>{"use strict";PP();BP();jP();Nm();HP();KP();Tv=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new jm(t)}async open(t){let n=Lm(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 Sv(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 Wm(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 Wm(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 wv(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${GP(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 Sv(r,this.config,i,()=>this.close({sessionId:n}));if(u!==null)return u;let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Wm(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,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 wv(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${GP(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 kv(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 kv(n,o,r);return i}catch{return null}}}});var Ci={};ap(Ci,{__resetBrowserRegistryForTests:()=>B3,browserProviderActive:()=>L3,closeBrowserProvider:()=>Ev,getBrowserProvider:()=>F3,peekBrowserProvider:()=>N3});function JP(){Promise.resolve(Ev()).then(()=>{process.exit(130)})}function VP(){Promise.resolve(Ev()).then(()=>{process.exit(143)})}function YP(){tr=null}function D3(){Km||(process.on("SIGINT",JP),process.on("SIGTERM",VP),process.on("exit",YP),Km=!0)}function XP(){Km&&(process.removeListener("SIGINT",JP),process.removeListener("SIGTERM",VP),process.removeListener("exit",YP),Km=!1)}async function F3(e){return tr!==null?tr:(Ai!==null||(Ai=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(zP(),qP)),n=AP(e),r=new t(n);return D3(),tr=r,Ai=null,r})()),Ai)}async function Ev(){if(tr===null)return;let e=tr;tr=null,Ai=null,XP(),await e.shutdown()}function L3(){return tr!==null}function N3(){return tr}function B3(){tr=null,Ai=null,XP()}var tr,Ai,Km,_i=k(()=>{"use strict";Nm();tr=null,Ai=null,Km=!1});async function QP(e,t){try{return await hP(e,t)}catch(n){return j("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function G3(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(_i(),Ci));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function ZP(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??G3,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s=e,a=null,l=null;try{let d=await Fm(n,e,{headers:K3,signal:t.signal},o);a=d.status,s=d.url||e;let u=d.headers.get("content-type")??"";if(d.ok){if(W3.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 m=await d.text();if(H3.test(u)&&!j3.test(u))return{title:"",markdown:m.trim(),finalUrl:s,usedRender:!1};if(i=await QP(m,s),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof _n||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 Yc(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:m=>Yc(m,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Yc(d.finalUrl,o);let u=await QP(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 _n)throw d;if(i===null){let u=d instanceof Error?d.message:String(d),m=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${e}: fetch failed (${m}) 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 j3,H3,W3,K3,eM=k(()=>{"use strict";yP();hv();Se();j3=/(text\/html|application\/xhtml\+xml)/i,H3=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,W3=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,K3={"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 J3(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(q3,{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),z3),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Ar(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 tM(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?J3({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 nM(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
882
882
|
|
|
883
883
|
(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(`
|
|
884
884
|
`).trimEnd()}var q3,z3,rM=k(()=>{"use strict";go();q3="https://api.exa.ai/search",z3=10});function Gm(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 Ii=k(()=>{"use strict";Bm()});function eX(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=V3;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,Y3)}let a=X3;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,Q3)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function xv(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Rr(e,t),truncated:!0}}function tX(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=eX(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 m=await gv(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!m.allowed)return{content:`web_scrape blocked: ${m.reason}`,isError:!0}}if(s.mode==="raw"){let m;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};m=await Fm(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:h instanceof _n?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!m.ok)return{content:`web_scrape HTTP ${m.status} ${m.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await m.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=xv(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let m=await ZP(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(m.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=xv(m.markdown,s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(m){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(m instanceof _n)return{content:`web_scrape blocked: ${m.message}`,isError:!0};let f=m instanceof Error?m.message:String(m),g=Ft(m)&&!yv(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Xc()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let u=tM({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let m=await u.search(s.query,{limit:Z3,timeoutMs:s.timeoutMs,signal:a.signal}),f=xv(nM(s.query,m),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(m){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${m instanceof Error?m.message:String(m)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var V3,Y3,X3,Q3,Z3,oM,iM=k(()=>{"use strict";eM();rM();hv();bi();Ii();V3=3e4,Y3=12e4,X3=1e5,Q3=1e6,Z3=10;oM=tX()});import{existsSync as aM,mkdirSync as nX,readFileSync as rX,renameSync as oX,unlinkSync as iX,writeFileSync as sX}from"node:fs";import{dirname as sM,join as aX}from"node:path";import{randomBytes as lX}from"node:crypto";function dn(e){let t=e??fw();if(!aM(t))return[];try{let n=rX(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 Pi(e,t){let n=t??fw();nX(sM(n),{recursive:!0});let r=aX(sM(n),`.schedules.json.${process.pid}.${lX(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{sX(r,o,"utf-8"),oX(r,n)}catch(i){try{aM(r)&&iX(r)}catch{}throw i}}function qm(e,t){let n=dn(t),r=n.map(l=>l.id),o=cX(e.name),i=dX(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Pi(n,t),a}function zm(e,t){let n=dn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Pi(o,t),!0)}function Zc(e,t){return dn(t).find(n=>n.id===e)}function cX(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function dX(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function lM(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 Jm=k(()=>{"use strict";q()});import{existsSync as uX,readFileSync as pX}from"node:fs";import{join as mX}from"node:path";async function In(e,t,n){let r;try{let o=mX(hp("default"),"port");if(!uX(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=pX(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 bo,Rv=k(()=>{"use strict";q();bo="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 fX}from"node:fs";import{readFile as gX}from"node:fs/promises";var cM,dM,uM,pM,mM=k(()=>{"use strict";Jm();q();Rv();cM=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=qm({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 In("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 In("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:bo}})}},dM=async(e,t)=>{let n=dn();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})))}},uM=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=Wn();if(!fX(i))return{content:JSON.stringify([])};let s;try{let c=await gX(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1558,7 +1558,7 @@ ${d}`}function JE(e,t){let n=Tj[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
|
|
|
1558
1558
|
`),s=0,a=0;for(let l=0;l<i.length;l++){let c=i[l],d=c.length+(l<i.length-1?1:0);if(t<=a+c.length){let m=t-a,f=Oe(c.slice(0,m)),g=(l===0?n:0)+Uo(f),h=Math.floor(g/o),y=g%o;return{row:s+h,col:y}}let u=(l===0?n:0)+Uo(Oe(c));s+=Math.max(1,Math.ceil(u/o)),a+=d}return{row:s,col:0}}function QE(e,t,n){let r=n||80,o=e.length,i=new Array(o+1),s=new Array(o+1),a=e.split(`
|
|
1559
1559
|
`),l=0,c=0;for(let d=0;d<a.length;d++){let u=a[d],m=d===0?t:0,f=(y,b)=>{i[y]=l+Math.floor(b/r),s[y]=b%r};f(c,m);let g=0,h=0;for(let y of $s(u)){let b=h+y.length,w=Uo(Oe(y));for(let S=h+1;S<=b;S++){let T=S===b?w:Uo(Oe(u.slice(h,S)));f(c+S,m+g+T)}g+=w,h=b}if(d<a.length-1){let y=m+Uo(Oe(u));l+=Math.max(1,Math.ceil(y/r)),c+=u.length+1}}return{rowAt:i,colAt:s,totalRows:i[o]}}function rs(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function ur(e,t){let n=rs(t,e.buffer.length);return n===e.cursor?e:{buffer:e.buffer,cursor:n}}function Pj(e,t){let n=rs(t,e.length);for(;n>0&&/\s/.test(e.charAt(n-1));)n--;for(;n>0&&!/\s/.test(e.charAt(n-1));)n--;return n}function Mj(e,t){let n=e.length,r=rs(t,n);for(;r<n&&/\s/.test(e.charAt(r));)r++;for(;r<n&&!/\s/.test(e.charAt(r));)r++;return r}function Oj(e,t){let n=rs(t,e.length),r=n===0?-1:e.lastIndexOf(`
|
|
1560
1560
|
`,n-1);return r<0?0:r+1}function $j(e,t){let n=rs(t,e.length),r=e.indexOf(`
|
|
1561
|
-
`,n);return r<0?e.length:r}function jo(e,t,n){let r=rs(t.start,e.buffer.length),o=rs(t.end,e.buffer.length),i=Math.min(r,o),s=Math.max(r,o);if(i===s&&n.length===0)return e;let a=e.buffer.slice(0,i)+n+e.buffer.slice(s),l=i+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var J={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:jo,insert(e,t){return t.length===0?e:jo(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=Cw(e.buffer,e.cursor);return jo(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=ri(e.buffer,e.cursor);return jo(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=Pj(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=Mj(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=Oj(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=$j(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:e.cursor,end:t},"")},moveLeft(e){return ur(e,Cw(e.buffer,e.cursor))},moveRight(e){return ur(e,ri(e.buffer,e.cursor))},moveHome(e){return ur(e,0)},moveEnd(e){return ur(e,e.buffer.length)},moveLineStart(e){return ur(e,Oj(e.buffer,e.cursor))},moveLineEnd(e){return ur(e,$j(e.buffer,e.cursor))},moveWordBackward(e){return ur(e,Pj(e.buffer,e.cursor))},moveWordForward(e){return ur(e,Mj(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{rowAt:o,colAt:i}=QE(e.buffer,n,r),s=o[e.cursor];if(s===0)return{moved:!1};let a=s-1,l=i[e.cursor],c=0,d=1/0;for(let m=0;m<=e.buffer.length;m++){let f=o[m];if(f===a){let g=Math.abs(i[m]-l);g<d&&(d=g,c=m)}else if(f>a)break}let u=ur(e,c);return u===e?{moved:!1}:{moved:!0,state:u}},moveDownLine(e,t,n){let r=t||80,{rowAt:o,colAt:i,totalRows:s}=QE(e.buffer,n,r),a=o[e.cursor];if(a>=s)return{moved:!1};let l=a+1,c=i[e.cursor],d=e.buffer.length,u=1/0;for(let f=0;f<e.buffer.length;f++){let g=o[f];if(g===l){let h=Math.abs(i[f]-c);h<u&&(u=h,d=f)}else if(g>l)break}o[e.buffer.length]===l&&Math.abs(i[e.buffer.length]-c)<u&&(d=e.buffer.length);let m=ur(e,d);return m===e?{moved:!1}:{moved:!0,state:m}}};var Dj=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"],Fj=["Scheming","Skittering","Gnawing","Cackling","Plotting","Scuttling","Pilfering","Conniving","Hoarding","Tinkering","Snickering","Rummaging","Hexing","Scrounging","Scrabbling","Conjuring","Meddling","Sharpening","Snatching","Fiddling","Muttering","Lurking","Hacking"];function Lj(){return Dj[Math.floor(Math.random()*Dj.length)]}function Nj(){return Fj[Math.floor(Math.random()*Fj.length)]}Mt();G();var Vae=[{id:"kbd:ctrl-b",text:"Ctrl+B during a turn detaches it to the background so you can keep typing \u2014 find it later with /bgsub.",source:"static"},{id:"kbd:shift-tab",text:"Shift+Tab cycles permission modes: default \u2192 plan \u2192 bypass (AFK stays on /afk).",source:"static"},{id:"kbd:ctrl-c",text:"Ctrl+C interrupts the current turn; press it twice in a row to exit the REPL.",source:"static"},{id:"kbd:at-path",text:"Type @ in the prompt to autocomplete a file path and attach its contents to your turn.",source:"static"},{id:"kbd:cmd-v",text:"Paste an image with Cmd+V (macOS) or Ctrl+V \u2014 clipboard images attach automatically.",source:"static"},{id:"env:tips-opt-out",text:"Set AFK_SPINNER_TIPS=0 to silence these loading-screen tips.",source:"static"}];function Yae(){let e=[];for(let t of Vt())t.hint&&(t.name.includes(":")||e.push({id:`cmd:${t.name}`,text:`${t.name} \u2014 ${t.hint}`,source:"command"}));return e}function Xae(e){let t=[];for(let n of Jn()){let r=`cmd:/${n}`;if(e.has(r))continue;let o;try{o=qe(n)}catch{continue}on(o,v.AFK_INTERNAL==="1")&&o.whenToUse&&t.push({id:`skill:${n}`,text:`/${n} \u2014 ${o.whenToUse}`,source:"skill"})}return t}function jj(){if(v.AFK_SPINNER_TIPS==="0")return[];let e=Yae(),t=new Set(e.map(r=>r.id)),n=Xae(t);return[...Vae,...e,...n]}var Bj=new Set,Uj=new Map;function Hj(e,t){if(e.length===0)return null;let n=t.now??Date.now(),r=t.warmupMs??1500;if(n-t.startedAt<r)return null;let o=t.rotateMs??7e3,i=Math.floor((n-t.startedAt)/o),s=`${t.startedAt}:${i}`,a=Uj.get(s);if(a)return a;let l=null,c=e.filter(d=>!Bj.has(d.id));if(c.length>0){let d=(i%c.length+c.length)%c.length;l=c[d]??null}else{let d=(i%e.length+e.length)%e.length;l=e[d]??null}return l&&(Bj.add(l.id),Uj.set(s,l)),l}var ZE=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]
|
|
1561
|
+
`,n);return r<0?e.length:r}function jo(e,t,n){let r=rs(t.start,e.buffer.length),o=rs(t.end,e.buffer.length),i=Math.min(r,o),s=Math.max(r,o);if(i===s&&n.length===0)return e;let a=e.buffer.slice(0,i)+n+e.buffer.slice(s),l=i+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var J={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:jo,insert(e,t){return t.length===0?e:jo(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=Cw(e.buffer,e.cursor);return jo(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=ri(e.buffer,e.cursor);return jo(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=Pj(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=Mj(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=Oj(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=$j(e.buffer,e.cursor);return t===e.cursor?e:jo(e,{start:e.cursor,end:t},"")},moveLeft(e){return ur(e,Cw(e.buffer,e.cursor))},moveRight(e){return ur(e,ri(e.buffer,e.cursor))},moveHome(e){return ur(e,0)},moveEnd(e){return ur(e,e.buffer.length)},moveLineStart(e){return ur(e,Oj(e.buffer,e.cursor))},moveLineEnd(e){return ur(e,$j(e.buffer,e.cursor))},moveWordBackward(e){return ur(e,Pj(e.buffer,e.cursor))},moveWordForward(e){return ur(e,Mj(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{rowAt:o,colAt:i}=QE(e.buffer,n,r),s=o[e.cursor];if(s===0)return{moved:!1};let a=s-1,l=i[e.cursor],c=0,d=1/0;for(let m=0;m<=e.buffer.length;m++){let f=o[m];if(f===a){let g=Math.abs(i[m]-l);g<d&&(d=g,c=m)}else if(f>a)break}let u=ur(e,c);return u===e?{moved:!1}:{moved:!0,state:u}},moveDownLine(e,t,n){let r=t||80,{rowAt:o,colAt:i,totalRows:s}=QE(e.buffer,n,r),a=o[e.cursor];if(a>=s)return{moved:!1};let l=a+1,c=i[e.cursor],d=e.buffer.length,u=1/0;for(let f=0;f<e.buffer.length;f++){let g=o[f];if(g===l){let h=Math.abs(i[f]-c);h<u&&(u=h,d=f)}else if(g>l)break}o[e.buffer.length]===l&&Math.abs(i[e.buffer.length]-c)<u&&(d=e.buffer.length);let m=ur(e,d);return m===e?{moved:!1}:{moved:!0,state:m}}};var Dj=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"],Fj=["Scheming","Skittering","Gnawing","Cackling","Plotting","Scuttling","Pilfering","Conniving","Hoarding","Tinkering","Snickering","Rummaging","Hexing","Scrounging","Scrabbling","Conjuring","Meddling","Sharpening","Snatching","Fiddling","Muttering","Lurking","Hacking"];function Lj(){return Dj[Math.floor(Math.random()*Dj.length)]}function Nj(){return Fj[Math.floor(Math.random()*Fj.length)]}Mt();G();var Vae=[{id:"kbd:ctrl-b",text:"Ctrl+B during a turn detaches it to the background so you can keep typing \u2014 find it later with /bgsub.",source:"static"},{id:"kbd:shift-tab",text:"Shift+Tab cycles permission modes: default \u2192 plan \u2192 bypass (AFK stays on /afk).",source:"static"},{id:"kbd:ctrl-c",text:"Ctrl+C interrupts the current turn; press it twice in a row to exit the REPL.",source:"static"},{id:"kbd:at-path",text:"Type @ in the prompt to autocomplete a file path and attach its contents to your turn.",source:"static"},{id:"kbd:cmd-v",text:"Paste an image with Cmd+V (macOS) or Ctrl+V \u2014 clipboard images attach automatically.",source:"static"},{id:"env:tips-opt-out",text:"Set AFK_SPINNER_TIPS=0 to silence these loading-screen tips.",source:"static"}];function Yae(){let e=[];for(let t of Vt())t.hint&&(t.name.includes(":")||e.push({id:`cmd:${t.name}`,text:`${t.name} \u2014 ${t.hint}`,source:"command"}));return e}function Xae(e){let t=[];for(let n of Jn()){let r=`cmd:/${n}`;if(e.has(r))continue;let o;try{o=qe(n)}catch{continue}on(o,v.AFK_INTERNAL==="1")&&o.whenToUse&&t.push({id:`skill:${n}`,text:`/${n} \u2014 ${o.whenToUse}`,source:"skill"})}return t}function jj(){if(v.AFK_SPINNER_TIPS==="0")return[];let e=Yae(),t=new Set(e.map(r=>r.id)),n=Xae(t);return[...Vae,...e,...n]}var Bj=new Set,Uj=new Map;function Hj(e,t){if(e.length===0)return null;let n=t.now??Date.now(),r=t.warmupMs??1500;if(n-t.startedAt<r)return null;let o=t.rotateMs??7e3,i=Math.floor((n-t.startedAt)/o),s=`${t.startedAt}:${i}`,a=Uj.get(s);if(a)return a;let l=null,c=e.filter(d=>!Bj.has(d.id));if(c.length>0){let d=(i%c.length+c.length)%c.length;l=c[d]??null}else{let d=(i%e.length+e.length)%e.length;l=e[d]??null}return l&&(Bj.add(l.id),Uj.set(s,l)),l}var ZE=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];var Qae=2e3;function Wj(e){let t=Date.now()-e;if(t<Qae)return"";let n=Math.floor(t/1e3);if(n<60)return p.dim(` ${n}s`);let r=Math.floor(n/60),o=n%60;return p.dim(` ${r}m${o.toString().padStart(2,"0")}s`)}function yn(e,t){return`\x1B[${e};1H\x1B[2K${t??""}`}function Kj(e,t){let n=[];for(let r of e){let o=ii(r,t).split(`
|
|
1562
1562
|
`).length;for(let i=0;i<o;i++)n.push({logicalText:r,isHead:i===0})}return n}function wl(e,t,n){let r=Math.max(0,Math.min(n,e.length));if(!t||t.length<e.length)return e.slice(0,r);let o=[],i=0;for(;i<r;){if(!t[i]?.isHead){o.push(e[i]??""),i+=1;continue}let s=i+1;for(;s<e.length&&!t[s]?.isHead;)s+=1;if(s<=r)o.push(t[i].logicalText);else for(let a=i;a<r;a++)o.push(e[a]??"");i=s}return o}function Gj(e,t,n){let r=Math.max(0,Math.min(t,n));if(!e||e.length<n)return r;if(r>=n)return n;for(let o=r;o>0;o--)if(e[o]?.isHead)return o;return 0}function Sl(e,t,n,r){if(e.length===0)return"";let o=Math.max(1,t),i=Math.max(1,n),s=Math.max(1,i-o+1),a=m=>Math.max(1,ii(m,r).split(`
|
|
1563
1563
|
`).length),l="",c=[],d=0,u=()=>{if(c.length===0)return;let m=Math.min(d,s);for(let f=0;f<m;f++)l+=`\x1B[${o+f};1H\x1B[2K`;l+=`\x1B[${o};1H`,l+=c.map(f=>`\x1B[2K${f}`).join(`\r
|
|
1564
1564
|
`),l+=`\x1B[${i};1H${`
|
|
@@ -1602,7 +1602,7 @@ ${d}`}function JE(e,t){let n=Tj[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
|
|
|
1602
1602
|
`,i=qle(r,n,{trim:!1,hard:!0,wordWrap:!1}).split(`
|
|
1603
1603
|
`);for(;i.length>0&&i[i.length-1]==="";)i.pop();return i}measure(t,n){let r=this.stream.columns??80,o=Math.max(1,e.wrapToPhysicalLines(t,r).length),i=Math.max(1,n);return{topRow:Math.max(1,i-o+1),lineCount:o}}render(t,n,r){let o=Math.max(1,n),i=Math.max(1,r??1),s=this.stream.columns??80,a=this.stream.isTTY===!0,l=e.wrapToPhysicalLines(t,s),c=Math.max(1,l.length),d=this.previousRawLineCount>c?this.previousRawLineCount-c:0,u=Math.max(0,o-c+1-i),m=Math.min(d,u),f=m>0?[...Array(m).fill(""),...l]:l,g=f.length,h=Math.max(1,o-g+1),y="";if(a&&(y+=F1),this.previousLineCount>0)for(let b=0;b<this.previousLineCount;b++){let w=this.previousTopRow+b;y+=Su(w,1)+rx}for(let b=0;b<g;b++){let w=h+b;y+=Su(w,1)+rx+(f[b]??"")}if(y+=Su(h+g-1,1),a&&(y+=L1),this.stream.isTTY)try{this.stream.write(zle)}catch{}try{this.stream.write(y)}catch{try{this.stream.isTTY&&this.stream.write(N1)}catch{}}if(v.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+=F1);for(let o=0;o<this.previousLineCount;o++){let i=this.previousTopRow+o;n+=Su(i,1)+rx}n+=Su(Math.max(1,(this.stream.rows??24)-1-t),1),r&&(n+=L1);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(N1)}catch{}}};var vu=null;function ku(e){if(vu!==null)throw new Error(`stdin claim conflict: '${vu.name}' already holds the claim, '${e}' cannot acquire it concurrently.`);let t=!1,n={release(){t||(t=!0,vu?.handle===n&&(vu=null))}};return vu={name:e,handle:n},n}async function B1(e,t){let n=ku(e);try{return await t()}finally{n.release()}}function U1(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 j1(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 H1(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 yy(e.stdout)),e.stdinClaim=ku("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(),Qi(e.stdin),e.handleKeypress=(t,n)=>{let r=e.pasting?!1:e.caretBlinkController.resetVisible(),o=e.repaintCount;O1(e,t,n),r&&e.repaintCount===o&&e.repaint()},e.stdin.on("keypress",e.handleKeypress),e.armed=!0,e.canceled=!1,e.resizeUnsub=We.subscribe(()=>{e.armed&&e.repaint()}),e.resizeImmediateUnsub=We.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 W1(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),Jle(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 Jle(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=wl(e.committedBand,e.committedBandMeta,t),s=Sl(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 K1(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 xl=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;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=!!v.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:""}
|
|
1604
1604
|
`)}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=" "+p.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.spinnerController=new oy({captureMode:t.captureMode??!1,goblin:t.goblinSpinner??!1,onTick:()=>this.repaint()}),this.caretBlinkController=new iy({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(){U1(this)}resumeInput(){j1(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){T1(this,t)}exitPickerMode(){E1(this)}repaintPicker(){x1(this)}setInputMode(t){this.flushPendingRepaint(),R1(this,t)}getInputMode(){return A1(this)}async arm(){return H1(this)}disarm(){W1(this)}setOverlay(t){t!==this.overlay&&(this.debugLog("setOverlay",{framesLen:t.length,anchorRow:this.anchorRow??null}),this.overlay=t,this.repaint())}setSpinner(t){this.stdout.isTTY&&this.spinnerController.set(t)}commitAbove(t){this.flushPendingRepaint(),b1(this,t)}clearCommittedBand(){yu(this)}flushResizeGhostErase(){S1(this)}resetCommittedBand(){w1(this)}repositionCommittedBand(t,n,r){v1(this,t,n,r)}getBuffer(){return zj(this)}getPendingCount(){return this.pendingSubmissions.length}getAttachments(){return[...this.attachments]}get caretVisible(){return this.caretBlinkController.visible}renderInputLine(){return f1(this)}updateAutocomplete(){dy(this)}updateGhost(){d1(this)}renderDropdownRows(){return g1(this)}renderHintRow(){return h1(this)}repaint(){this.repaintCount++,this.pendingTrailingRepaint=!1,hy(this)}scheduleRepaint(){if(this.repaintCount++,!this.burstActive){this.burstActive=!0,this.pendingTrailingRepaint=!1,hy(this),queueMicrotask(()=>{this.burstActive=!1,this.flushPendingRepaint()});return}this.pendingTrailingRepaint=!0}flushPendingRepaint(){this.pendingTrailingRepaint&&(this.pendingTrailingRepaint=!1,this.armed&&hy(this))}clearScreen(){this.logUpdate?.resetGeometry?.(),this.stdout.write("\x1B[H\x1B[2J"),this.repaint()}resetState(){K1(this)}applyEdit(t){return M1(this,t)}prefillInput(t){this.applyEdit(J.seed(t))}applyDropdownSelection(){return u1(this)}applyGhostAccept(){return p1(this)}};G();import ox from"chalk";var Qle=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,Zle=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,ece=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,G1={mint:p.mint};function tce(e){let t=G1[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=G1[r];if(o)return o}return null}var q1=null,z1=null,J1=null,V1=null,Y1="";function Ho(e,t){if(ox.level===0)return e;let n=t.version?.(),r=n!==void 0;if(r&&V1===t&&q1===e&&z1===ox.level&&J1===n)return Y1;let s=e.replace(Qle,a=>{let l=a.slice(1);return t.has(l)?(tce(l)??p.brand)(a):p.meta(a)}).replace(Zle,a=>p.fileRef(a)).replace(ece,a=>p.meta(a));return r&&(V1=t,q1=e,z1=ox.level,J1=n,Y1=s),s}G();import{pathToFileURL as nce}from"node:url";var rce="\x1B]8;;\x1B\\",oce=new Set(["iterm2","wezterm","kitty","vscode","ghostty","windows-terminal","konsole","gnome-terminal","alacritty"]),ice=5e3;function sce(e=process.env,t=process.stdout.isTTY===!0){let n=e.FORCE_HYPERLINK;if(n!==void 0&&n.length>0)return n!=="0"&&n.toLowerCase()!=="false";if(!t||e.CI!==void 0&&e.CI.length>0)return!1;let r=ts(e);if(!oce.has(r))return!1;if(r==="gnome-terminal"&&e.VTE_VERSION!==void 0){let o=Number.parseInt(e.VTE_VERSION,10);if(!Number.isFinite(o)||o<ice)return!1}return!0}var ix;function by(){return ix===void 0&&(ix=sce()),ix}function ace(e,t){return`\x1B]8;;${t}\x1B\\${e}${rce}`}function wy(e,t){try{return ace(e,nce(t).href)}catch{return e}}function Tu(e){let t=/[a-z][a-z0-9+.-]*:\/\/[^\s<>\"`]+/gi,n="",r=0;for(let o of e.matchAll(t)){let i=o[0]??"",s=o.index??r;n+=X1(e.slice(r,s)),n+=i,r=s+i.length}return n+=X1(e.slice(r)),n}function X1(e){let t=by();return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,(n,r)=>t?wy(r,n):r)}function lce(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}var Q1=60;function sx(e,t){let n=e.trim().replace(/^\((.*)\)$/s,"$1"),r;try{r=JSON.parse(n)}catch{return e}if(!r||typeof r!="object")return e;let o=r;for(let i of t){let s=o[i];if(typeof s=="string"&&s.length>0){let a=Fe(s);if(a.length===0)continue;return`(${a.length>Q1?le(a,Q1,"\u2026"):a})`}}return e}function Z1(e,t){if(e==="bash"||e==="Bash")return lce(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,i=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let s=`${o} node${o===1?"":"s"}`,a=i>0?`, ${i} edge${i===1?"":"s"}`:"";return`(${s}${a})`}}}catch{}}return e==="agent"||e==="Agent"?sx(t,["id_prefix","prompt"]):e==="Task"?sx(t,["description","prompt"]):e==="skill"||e==="Skill"?sx(t,["name","arguments"]):e==="ask_question"?cce(t):t}function cce(e){let t=e.trim().replace(/^\((.*)\)$/s,"$1");try{let n=JSON.parse(t);if(!n||typeof n!="object")return e;let r=n,o=typeof r.type=="string"?r.type:"text";if(o==="choice"||o==="multi_choice"){let i=r.choices,s=Array.isArray(i)?i.length:0;return s>0?`(${o}: ${s} option${s===1?"":"s"})`:`(${o})`}return`(${o})`}catch{return e}}function dce(e){return e.replace(/[\r\n]+/g," ")}var uce={"(":")","{":"}","[":"]"};function eH(e,t,n="\u2026"){let r=e.charAt(0),o=uce[r];return!(o&&e.endsWith(o)&&e.length>=2)||X(e)<=t?le(e,t,n):t<3?t>=2?r+o:le(e,t,n):le(e,t-1,n)+o}function jr(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=Tu(Z1(r,n[2]??"")),i=or(r),{color:s,glyph:a}=ol(r),l=_k(i),c=l?` [${l}]`:"";if(t!==void 0){let u=(a+" ").length+r.length+c.length,m=Math.max(1,t-u);o=eH(o,m)}o=dce(o);let d=s(a+" ")+s.bold(r)+p.toolArg(o);return l?d+p.dim(c):d}return p.chrome("\u25CF ")+p.toolArg(e)}G();var tH=8,Sy=30;function pce(){let e=v.AFK_DIFF_LINES;if(e===void 0)return Sy;let t=e.trim();if(!/^\d+$/.test(t))return Sy;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Sy}function mce(){let e=v.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}function fce(e){let t=p.diffAdd(`+${e.addedLines}`),n=p.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=p.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var gce=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function hce(e){let t=Oe(e.text).replace(gce,"");return e.kind==="+"?p.diffAdd("+ "+t):e.kind==="-"?p.diffRemove("- "+t):p.dim(" "+t)}var lx=new WeakMap;function Hr(e,t,n){if(mce())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?tH:pce(),o=t+"|"+n+"|"+r,i=lx.get(e);if(i!==void 0){let f=i.get(o);if(f!==void 0)return f}let s=[];s.push(n+fce(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:p.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:hce(h)})}if(r===0){for(let f of a)s.push(n+f.text);return ax(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 ax(e,o,s),s}let c=0;for(let f of a)f.kind==="header"?s.push(n+f.text):c<r&&(s.push(n+f.text),c++);let d=l-r,u=`line${d===1?"":"s"}`,m=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return s.push(n+p.dim(`\u2026 +${d} more diff ${u}${m}`)),ax(e,o,s),s}function ax(e,t,n){let r=lx.get(e);r===void 0&&(r=new Map,lx.set(e,r)),r.set(t,n)}function Wo(e){return e?p.error("\u2717"):p.success("\u2713")}var Eu=3,nH=2,rH=3;function oH(e){switch(or(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 yce(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 Wr(e,t,n=60,r){let o=e.isError?p.error:p.dim,i=t??v.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=by()?wy(a,e.persistedPath):a;return o(`saved \u2192 ${l}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${yce(r,e.lineCount)}`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(Fe(s))}function cs(e){return!e||typeof e.batchSize!="number"||typeof e.batchIndex!="number"||e.batchSize<=1?"":p.dim(` \u2225${e.batchIndex}/${e.batchSize}`)}G();function xu(e,t){if(e.length<=t)return e;let n=e.length-t,r=e.slice(0,n),o=e.slice(n),i=sH(r);return[{kind:"overflow",count:r.length,text:i},...o]}function bce(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var wce=5,iH=60;function sH(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=>Je.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=Fe(d);if(!u){s=!0;break}let m=u.length>iH?u.slice(0,iH-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;i.push({display:m,entries:f})}if(!s&&i.length>0){let a=i.slice(0,wce),l=a.map(({display:m,entries:f})=>f>1?`${m} \xD7${f}`:m),c=a.reduce((m,f)=>m+f.entries,0),d=n-c,u=l.join(", ")+(d>0?` (+${d})`:"");return`\u2026 +${n} more: ${u}`}}let o=[];for(let[i,s]of t)o.push(`${s} ${bce(i,s)}`);return`\u2026 +${n} (${o.join(", ")})`}function vy(e,t=Bn()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function cx(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function dx(e){if(e.length===0)return[];let t=new Map;for(let o of e){let i=aH(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=aH(o),s=t.get(i);s.length>=Sce(o.toolName)?r.has(i)||(n.push({kind:"group",toolName:o.toolName,label:Je.has(o.toolName)?o.toolInput:"",entries:s}),r.add(i)):n.push(o)}return n}function ux(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,i;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),i=l.join(", ")}else o===t?i=`${t} done`:o===0?i=`${t} running`:i=`${o}/${t} done`;return jr(e.toolName+e.label)+p.dim(` \xD7${t} \u2014 ${i}`)}function aH(e){return Je.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function Sce(e){return Je.has(e)?nH:rH}function lH(e,t,n,r){return e>0||t?Rl([...n,!0],r):Rl(n,r)}function cH(e,t){return!Je.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&cH(r,t))}function ky(e,t,n,r=Z(),o=[],i=Bn(),s){let a=Rl(o,i),l=Ru(a,i),c=e.filter(h=>h.kind==="text"),d=e.filter(h=>h.kind==="tool").filter(h=>!cH(h,t)),u=dx(d),m=xu(u,Eu),f=vy(m,i);for(let{sibling:h,connector:y}of f){let b=p.dim(y),w=y===i.lastConnector;if(h.kind==="overflow")n.push(Ae(l+b+p.dim(h.text),r));else if(h.kind==="group")n.push(Ae(l+b+ux(h),r));else if(h.kind==="resultSummary")n.push(Ae(l+b+h.summary,r));else{let S=h,T=t.get(S.toolUseId);if(Je.has(S.toolName)&&T&&T.length>0){S.headerEmitted?n.push(Ae(l+b,r)):n.push(Ae(l+b+S.prefix,r));let E=s??w;if(ky(T,t,n,r,[...o,E],i,w),S.thinkingTail){let A=Ru(Rl([...o,E],i),i);n.push(Ae(A+p.thinking("\u2307 "+Fe(S.thinkingTail)),r))}}else if(!(Je.has(S.toolName)&&S.headerEmitted))if(S.result){if(n.push(Ae(l+b+S.prefix+p.dim(" \u2014 ")+Wo(S.result.isError)+" "+Wr(S.result,void 0,60,S.toolName),r)),S.diff&&!S.result.isError){let E=l+(w?i.spineClosed:p.dim(i.spine))+" ";for(let A of Hr(S.diff,"overlay",E))n.push(Ae(A,r))}}else{n.push(Ae(l+b+S.prefix,r));let E=l+(w?i.spineClosed:p.dim(i.spine))+" ";S.thinkingTail?n.push(Ae(E+p.thinking("\u2307 "+Fe(S.thinkingTail)),r)):n.push(Ae(E+p.dim(oH(S.toolName)),r))}}}let g=lH(d.length,!1,o,i);for(let h of c)for(let y of px(h.text,g,i))n.push(Ae(y,r))}function Au(e,t,n,r,o=Z(),i=[],s=Bn(),a){let l=Rl(i,s),c=Ru(l,s),d=[],u=e.filter(w=>w.kind==="text"),m=e.filter(w=>w.kind==="tool"),f=dx(m),g=xu(f,Eu),h=cx(g,r),y=vy(h,s);for(let{sibling:w,connector:S}of y){let T=p.dim(S),E=S===s.lastConnector;if(w.kind==="overflow")d.push(Ae(c+T+p.dim(w.text),o));else if(w.kind==="resultSummary")d.push(Ae(c+T+w.summary,o));else if(w.kind==="group")d.push(Ae(c+T+ux(w),o));else{let A=w,O=t.get(A.toolUseId);if(Je.has(A.toolName)&&O&&O.length>0){if(A.headerEmitted){let I=A.toolInput?`${A.toolName} ${Fe(A.toolInput)}`:A.toolName;d.push(Ae(c+T+p.dim("\u21B3 "+I),o))}else d.push(Ae(c+T+A.prefix,o));let R=a??E;d.push(...Au(O,t,n,void 0,o,[...i,R],s,E))}else if(A.result){if(d.push(Ae(c+T+A.prefix+p.dim(" \u2014 ")+Wo(A.result.isError)+" "+Wr(A.result,n,60,A.toolName),o)),A.diff&&!A.result.isError){let R=c+(E?s.spineClosed:p.dim(s.spine))+" ";for(let I of Hr(A.diff,"flush",R))d.push(Ae(I,o))}}else d.push(Ae(c+T+A.prefix,o))}}let b=lH(m.length,r!=null,i,s);for(let w of u)for(let S of px(w.text,b,s))d.push(Ae(S,o));return d}function dH(e){return e.agentResultSummary?p.dim(e.agentResultSummary)+cs(e.result):e.agentResultSummary}function Cu(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>Eu&&(c.push(Va(s.length)),l>0&&c.push(`${l} lines`));let d=p.dim(i.spine.repeat(o.length)),u=o,m=p.dim(i.turnRoot),f=Z(),g=Ae(c.length>0?d+m+e.prefix+p.dim(" \u2014 "+c.join(" \xB7 ")):d+m+e.prefix,f),h=Au(t,n,r,dH(e),f,u,i);return[g,...h].join(`
|
|
1605
|
-
`)}function mx(e,t=[]){let n=Bn(),r=p.dim(n.spine.repeat(t.length)),o=p.dim(n.turnRoot);return Ae(r+o+e.prefix,Z())}function _u(e,t,n,r,o=[]){let i=Bn(),s=o;return Au(t,n,r,dH(e),Z(),s,i)}function vce(e,t){let n=e.filter(i=>i.result),r=n.filter(i=>i.result.isError);if(r.length>0){let i=n.length-r.length,a=n.filter(c=>!c.result.isError).map(c=>c.result.lineCount).filter(c=>c!==void 0).reduce((c,d)=>c+d,0),l=[];return a>0&&l.push(`${a} lines`),i>0&&l.push(`${i} ok`),l.push(p.error(`${r.length} error${r.length>1?"s":""}`)),p.dim(" \u2014 ")+l.join(p.dim(", "))}let o=n.map(i=>i.result?.lineCount).filter(i=>i!==void 0);if(o.length===n.length&&o.length>0){if(o.every(a=>a===o[0]))return p.dim(` \u2014 ${o[0]} lines each`);let s=o.reduce((a,l)=>a+l,0);return p.dim(` \u2014 ${s} lines total`)}if(n.length>0){let i=n.map(s=>Wr(s.result,t,60,s.toolName));return p.dim(" \u2014 ")+i.join(p.dim(", "))}return""}function uH(e,t,n,r){let{color:o,glyph:i}=ol(e),s=" "+o(i+" ")+o.bold(e)+p.dim(` \xD7${t.length}`)+" ",a=vce(t,r),l=t.map(u=>Tu(Fe(u.toolInput)).trim()).join(", "),c=Math.max(0,n-X(s)-X(a)),d=le(p.toolArg(l),c);return Ae(s+d+a,n)}function Al(e,t,n){let r=[],o=Z();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+p.dim(" \u2014 ")+Wo(a.result.isError)+" "+Wr(a.result,n,60,a.toolName)+cs(a.result),o)),a.diff&&!a.result.isError)for(let l of Hr(a.diff,"flush"," "))r.push(Ae(l,o))}else r.push(Ae(" "+a.prefix,o))}else{r.push(uH(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=Fe(c.toolInput),u=Tu(d).trim()||d.trim();r.push(Ae(" "+p.dim(`\u2500\u2500 ${u} \u2500\u2500`),o))}for(let d of Hr(c.diff,"flush"," "))r.push(Ae(d,o))}}}return r}function Ae(e,t){return le(e,t)}var fx=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),kce=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),
|
|
1605
|
+
`)}function mx(e,t=[]){let n=Bn(),r=p.dim(n.spine.repeat(t.length)),o=p.dim(n.turnRoot);return Ae(r+o+e.prefix,Z())}function _u(e,t,n,r,o=[]){let i=Bn(),s=o;return Au(t,n,r,dH(e),Z(),s,i)}function vce(e,t){let n=e.filter(i=>i.result),r=n.filter(i=>i.result.isError);if(r.length>0){let i=n.length-r.length,a=n.filter(c=>!c.result.isError).map(c=>c.result.lineCount).filter(c=>c!==void 0).reduce((c,d)=>c+d,0),l=[];return a>0&&l.push(`${a} lines`),i>0&&l.push(`${i} ok`),l.push(p.error(`${r.length} error${r.length>1?"s":""}`)),p.dim(" \u2014 ")+l.join(p.dim(", "))}let o=n.map(i=>i.result?.lineCount).filter(i=>i!==void 0);if(o.length===n.length&&o.length>0){if(o.every(a=>a===o[0]))return p.dim(` \u2014 ${o[0]} lines each`);let s=o.reduce((a,l)=>a+l,0);return p.dim(` \u2014 ${s} lines total`)}if(n.length>0){let i=n.map(s=>Wr(s.result,t,60,s.toolName));return p.dim(" \u2014 ")+i.join(p.dim(", "))}return""}function uH(e,t,n,r){let{color:o,glyph:i}=ol(e),s=" "+o(i+" ")+o.bold(e)+p.dim(` \xD7${t.length}`)+" ",a=vce(t,r),l=t.map(u=>Tu(Fe(u.toolInput)).trim()).join(", "),c=Math.max(0,n-X(s)-X(a)),d=le(p.toolArg(l),c);return Ae(s+d+a,n)}function Al(e,t,n){let r=[],o=Z();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+p.dim(" \u2014 ")+Wo(a.result.isError)+" "+Wr(a.result,n,60,a.toolName)+cs(a.result),o)),a.diff&&!a.result.isError)for(let l of Hr(a.diff,"flush"," "))r.push(Ae(l,o))}else r.push(Ae(" "+a.prefix,o))}else{r.push(uH(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=Fe(c.toolInput),u=Tu(d).trim()||d.trim();r.push(Ae(" "+p.dim(`\u2500\u2500 ${u} \u2500\u2500`),o))}for(let d of Hr(c.diff,"flush"," "))r.push(Ae(d,o))}}}return r}function Ae(e,t){return le(e,t)}var fx=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),kce=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),EXe=fx.midConnector,xXe=fx.lastConnector;function Bn(){let e=v.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?kce:fx}function Rl(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function Ru(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?p.dim(o):o}return n}function px(e,t,n){if(!e||!e.trim())return[];let r=p.dim(n.textPrefix),o=Math.max(1,Z()-t.length-2-2),i=Ru(t,n),s=[];for(let a of e.split(`
|
|
1606
1606
|
`)){let l=bE(a),c=ye(l,o);for(let d of c.split(`
|
|
1607
1607
|
`))s.push(i+r+d)}return s}var pH=6,Iu=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=Oe(r),i=jr(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),Eo.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,i){let s=Oe(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=s,a.prefix=jr(n+s,i),o!==void 0&&(a.agentContext=o);return}let l=jr(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"||!Eo.has(o.toolName)||o.toolName==="Agent")return!1;let s=`(${Oe(n)})`;return o.toolName="Agent",o.toolInput=s,o.prefix=jr("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"&&Rd.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||Je.has(r.toolName)?void 0:r.toolName}}getOverlay(){let t=this.buildChildMap(),n=[],r=Bn(),o=Z(),i=u=>le(u,o),s=[];for(let u of this.order){let m=this.entries.get(u);!m||m.kind!=="tool"||m.agentContext||s.push(m)}let a=s,l=0;if(s.length>pH){let u=s.filter(h=>!h.result),m=s.filter(h=>h.result),f=Math.max(0,pH-u.length),g=new Set(m.slice(-f));l=m.length-g.size,a=s.filter(h=>!h.result||g.has(h))}let d=a.some(u=>Je.has(u.toolName))?p.dim(r.turnRoot):" ";for(let u of a){let m=t.get(u.toolUseId);if(Je.has(u.toolName)&&m&&m.length>0)u.headerEmitted?n.push(i(p.dim(r.turnRoot))):n.push(i(p.dim(r.turnRoot)+u.prefix)),ky(m,t,n,o,void 0,r),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+Fe(u.thinkingTail))));else if(!(Je.has(u.toolName)&&u.headerEmitted))if(Je.has(u.toolName))u.result?n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2014 ")+Wo(u.result.isError)+" "+Wr(u.result,void 0,60,u.toolName)+cs(u.result))):n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+Fe(u.thinkingTail))));else if(u.result){if(n.push(i(d+u.prefix+p.dim(" \u2014 ")+Wo(u.result.isError)+" "+Wr(u.result,void 0,60,u.toolName)+cs(u.result))),u.diff&&!u.result.isError)for(let f of Hr(u.diff,"overlay"," "))n.push(i(f))}else n.push(i(d+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+Fe(u.thinkingTail))))}return l>0&&n.push(i(" "+p.dim(`\u2026 +${l} done`))),n.join(`
|
|
1608
1608
|
`)}ancestorDepthOf(t){let n=new Set([t]),r=0,o=t,i=32;for(;o!==void 0&&r<i;){let s=this.entries.get(o);if(!s||s.kind!=="tool")break;let a=s.agentContext;if(a===void 0||n.has(a))break;n.add(a);let l=this.entries.get(a);if(!l||l.kind!=="tool")break;r+=1,o=a}return r}flushSource(t,n){let r=this.entries.get(t);if(!r||r.kind!=="tool")return[];let o=Array.from({length:this.ancestorDepthOf(t)},()=>!1),i=[];{let m=[],f=new Set([t]),g=r.agentContext;for(;g!==void 0&&!f.has(g);){f.add(g);let h=this.entries.get(g);if(!h||h.kind!=="tool")break;m.push({entry:h,depth:this.ancestorDepthOf(h.toolUseId)}),g=h.agentContext}m.reverse();for(let{entry:h,depth:y}of m)h.headerEmitted||(i.push(mx(h,Array.from({length:y},()=>!1))),h.headerEmitted=!0)}let s=new Set([t]),a=[t];for(;a.length>0;){let m=a.shift();for(let[f,g]of this.entries){if(s.has(f))continue;(g.kind==="tool",g.agentContext)===m&&(s.add(f),g.kind==="tool"&&a.push(f))}}let l=new Map;for(let m of this.order){if(!s.has(m))continue;let f=this.entries.get(m);if(!f)continue;let g=(f.kind==="tool",f.agentContext);if(!g)continue;let h=l.get(g);h||(h=[],l.set(g,h)),h.push(f)}let c=l.get(r.toolUseId)??[],d=r.headerEmitted?_u(r,c,l,n,o).join(`
|
|
@@ -1773,7 +1773,7 @@ ${T}
|
|
|
1773
1773
|
${E}`})}return{fileBlocks:l,warnings:c}}async function qK(e,t,n,r,o="summary",i,s){let a=k1(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),fl(process.stdout,iu(process.cwd(),!0));let l="",c=0,d=!1,u=!1,m=!1,f=!1,g=!1,h,y=!1,b=!1,w={abort:null},S=0,T=3e3,E=[],A=new Map,O=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,R=()=>{let L=r.subagentControl;L?.hasPromotableForeground()&&L.promoteActiveForeground().then(H=>{for(let M of H)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${M.jobId}: ${M.label}`))}).catch(()=>{})},I=r.getCompositor?r.getCompositor():null,C=()=>new Ml({out:Ol(i),thinkingMode:o,...O?{activeSkillName:O}:{},onCancel:()=>{t.interrupt().catch(L=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),L)})},...r.subagentControl?{onBackground:R}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...I?{compositor:I}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=C(),F=async()=>{if(!f){f=!0;try{await P.dispose()}catch{}}},W=async()=>{await P.arm();let L=P.getCompositor();if(i&&L){let H=L;i.fn=M=>H.commitAbove(M),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(L),r.setInterruptNotifier?.(H=>P.setInterrupting(H)),r.rearmStatus?.()};try{I?I.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{y=!0,P.setSoftStopping(!0),t.interrupt().catch(_=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),_)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(_=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),_)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch($=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),$)})}),await W(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(R);let{fileBlocks:L,warnings:H}=GK(e.text,{rootDir:process.cwd()});for(let $ of H)(i??{fn:console.log}).fn(p.dim(` @-file: ${$}`));let M=L.length>0||e.attachments.length>0?KK(e.text,e.attachments,void 0,L):e.text,U=t.sendMessageStream(M);if(await ra(($,_)=>{P.process($,_)},async()=>{for await(let $ of U){if(y||b)break;if($.type==="chunk"&&$.chunk.type==="content"?(l=d?HK(l,$.chunk.content):l+$.chunk.content,d=!1,u=!0):$.type==="message"&&!u&&(l=$.message.content),$.type==="stream_retry"&&(l=l.slice(0,c),d=l.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let _=$.chunk,B={toolName:_.toolName,toolUseId:_.toolUseId,input:_.toolInput,..._.toolInputRaw!==void 0&&{inputRaw:_.toolInputRaw}};A.set(_.toolUseId,B),E.push(B)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let _=$.chunk;c=l.length,d=!0;let B=A.get(_.toolUseId);if(B&&(B.result=_.content,B.isError=_.isError,A.delete(_.toolUseId)),r.onContextProgress){let K=Date.now();if(K-S>=T){S=K;try{let Q=r.onContextProgress();Q instanceof Promise&&await Q}catch(Q){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),Q)}}}}if($.type==="paused"){if(r.setPausedState?.(!0),await F(),I&&$.autoResume===!0){let _=new AbortController;w.abort=_;let B=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,K=B?`Keep waiting \u2014 auto-resumes at ${B}`:"Keep waiting \u2014 auto-resume in progress",Q="Switch model / provider (type /model after)",ee="Stop waiting",ge=[p.warning(" \u23F3 Usage limit reached.")+(B?p.dim(` Auto-resumes at ${B}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];dr(I,{header:ge,options:[K,Q,ee],signal:_.signal,initialIndex:0}).then(z=>{if(w.abort=null,!z)return;let re=z[0];re===void 0||re===K||(b=!0,re===Q&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(ae=>{Ke()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),ae)}))}).catch(z=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),z)})}else(i??{fn:console.log}).fn(AC({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),w.abort?.abort(),w.abort=null;let _=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,u=!1,E.length=0,A.clear(),g=!1,h=void 0,m=!1,P=C(),f=!1,await W(),(i??{fn:console.log}).fn(p.success(_));continue}if($.type==="error"){await F(),Bs(Os($.error)),m=!0;continue}P.process($),$.type==="done"&&(g=!0,h=$.metadata)}}),await F(),y){let $=i?i.fn:console.log,_=I?I.getPendingCount():0,B=_>0?` \xB7 ${_} queued`:"";$(p.warning(`\u23F8 Stopped${B} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),$("")}if(b){let $=i?i.fn:console.log;$(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(g&&!y&&!b){zi(n,a,l,h,E),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),ml(process.stdout),sU(process.stdout,"afk: turn complete");let $=B=>{i?i.fn(B):console.log(B)},_=gb(l);if(_){$(WK(_)),$("");let B=OU(E);if(r.onTerminalState)try{r.onTerminalState(_,{doneHasCorroboratingEvidence:B})}catch{}if(n.permissionMode==="autonomous"){let K=_.kind==="done"&&Lc().verifyDone===!0&&!B;DU(_,void 0,{unverified:K})}}if(Yme(h,n,$),r.onAfterTurn){let B=r.onAfterTurn();B instanceof Promise&&await B.catch(()=>{})}}}catch(L){await F(),m||Bs(Os(L))}finally{await F(),fl(process.stdout,iu(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 Vme(e,t){let n=Math.round(e*100),r=ue(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ue(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 Yme(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(Re(e.durationMs)),e.totalCostUsd!==void 0&&r.push(it(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ue(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=DE(t),a=qt(t.model),l=Vme(s,a);if(l.text!==null){let d=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(d(l.text))}let c=jK(Hh(Gg()),new Date,{autoResume:F_()});if(c.text!==null){let d=c.tier==="over"||c.tier==="near"?p.error:c.tier==="caution"?p.warning:p.dim;n(d(c.text))}n("")}var Xme=5e3,Qme=3,Zme="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function efe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function zK(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async O=>{Ke()&&(f=zh(O)),await Ou(e.session.current),Ke()&&(g=qx())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,T,E,A=0;for(m.onInjectable=()=>{A>=Qme||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,ml(process.stdout),h={text:Zme,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let M of g)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),g=[]}let O=u.drainNotifications();for(let{job:M,result:U}of O){let N=U.errorReason===void 0?"\u2713":"\u2717",$=U.errorReason==="abort"?"killed":U.errorReason==="timeout"?"timed out":U.errorReason==="signal-killed"?"killed by signal":`exit ${U.exitCode??0}`,_=Math.max(0,Math.round(U.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${N} [${M.id}] ${$} \xB7 ${_}s \xB7 `)+M.command)}let R=m.drainNotifications();for(let{job:M}of R){let U=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",N=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,$=M.label.length>60?`${M.label.slice(0,60)}\u2026`:M.label;e.replRenderer.writeLine(p.dim(` ${U} [${M.jobId}] subagent ${M.status} \xB7 ${N}s \xB7 `)+$)}let I=l.renderIfChanged(e.stats.sessionId);if(I.length>0){for(let M of I)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let C,P;if(h===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,h={text:M.message,attachments:[]})}if(h!==void 0){let M=h;h=void 0;let U=Ll(e.stats.permissionMode),N=ns({buffer:M.text,promptText:U,isTTY:!!process.stdout.isTTY,attachmentSummary:Tl([...M.attachments])});e.replRenderer.writeLine(N),C=M.text.trim(),P=M.attachments}else{let M=y;y=void 0;let U=await o.readLine({promptFn:()=>Ll(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},onSigint:r,onShiftTab:()=>{ub(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});C=U.text.trim(),P=U.attachments}if(!C&&P.length===0)continue;if(C.startsWith("!")){let M=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(b||(b=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(C))){e.statusLine.rearm();continue}}let F=!1;if(C.startsWith("/")){let M=await SU(C,e.slashCtx,P);if(M.handled){if(M.result==="exit"){e.rl.close();return}if((C==="/clear"||C.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){h={text:M.result.message,attachments:P??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){y=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}F=!0}a.push(C),await efe(e,C);let W=C;if(F){let M=$E(C);if(M){let U=M.name.replace(/^\//,"").split(":").pop()??"";if(U&&Hx(U)){let N={skillName:U,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},$=e.session.current.sessionId,_=ps($),B=Date.now();j(`[afk trace] preflight.start commandName=${U}`);let K=!1,Q=await us(N,{cwd:e.stats.cwd??process.cwd(),artifactDir:_},ee=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${U}) failed: `)+(ee instanceof Error?ee.message:String(ee)))});K=Q!==null,j(`[afk trace] preflight.end commandName=${U} durationMs=${Date.now()-B} success=${K}`),W=Kx(Q?.manifestBlock,C)}}}let L=u.drainInjections();L.length>0&&(W=L+W);let H=m.drainInjections();if(H.length>0&&(W=H+W),S!==void 0&&(W=S+`
|
|
1774
1774
|
|
|
1775
1775
|
`+W,S=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:W,sessionId:e.stats.sessionId},U=await e.hookRegistry.dispatch(M);U.injectContext&&(W=U.injectContext+W)}catch(M){if(M instanceof Ee){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(M.reason?p.dim(`: ${Ar(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Vn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(T=void 0,E=void 0,await qK({text:W,attachments:P},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onTurnComplete(M,U){if(await t.appendTurn(M,U),e.stats.sessionId)try{Do(e.stats)}catch(N){w||(w=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(N instanceof Error?N.message:String(N))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,U)=>{d?.push(M),T=M.kind,E=U?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Nn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:M=>c.repaint(M)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ll(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...T!==void 0?{terminalState:T}:{},...E!==void 0?{doneHasCorroboratingEvidence:E}:{}},void 0,Xme);M.injectContext&&M.injectContext.trim().length>0&&(S=M.injectContext)}catch(M){if(M instanceof ct)throw M;M instanceof Vn?(j("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):M instanceof Ee?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${Ar(M.reason??"no reason given")}`)):j("[stop hook] unexpected error: "+String(M))}}}function tfe(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 JK(e,t,n,r){let o=await EK(),i=new db({rl:e.rl,history:o,statusLine:e.statusLine}),s=tfe(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await _K(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=BK(e,n),await zK(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Mc();pa();import{execFile as nfe}from"node:child_process";import{dirname as rfe,isAbsolute as ofe,resolve as ife}from"node:path";import{promisify as sfe}from"node:util";var VK=sfe(nfe),afe=3e3,lfe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function cfe(){let t=(await VK("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=ofe(t)?t:ife(process.cwd(),t);return rfe(n)}async function YK(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await cfe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),afe)});try{let o=un({execFile:VK,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=>lfe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Fp();Mc();import{promises as dfe}from"node:fs";import{dirname as ufe,join as ZK}from"node:path";import{randomBytes as pfe}from"node:crypto";var mfe=["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(`
|
|
1776
|
-
`),XK=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,hR=30,ffe=1024,gfe=8e3,hfe="haiku";async function yfe(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=vfe(n,ffe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??gfe),s=t.signal?kfe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ks({token:t.token,model:t.model??hfe,system:mfe,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=bfe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=ufe(t.worktreePath);return await wfe(l,c)}function bfe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(XK.test(t)&&t.length<=hR)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>hR)break;o=s}return XK.test(o)?o:null}async function wfe(e,t){if(!await Sfe(ZK(t,e)))return e;let n=pfe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,hR-5)}-${n}`}async function Sfe(e){try{return await dfe.access(e),!0}catch{return!1}}function vfe(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 kfe(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 eG(e){let t,n,r=ZK(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await yfe(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=`${Zp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return QK(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 QK(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 QK(e,t){e&&e.setCwd(t),Tfe(t)}function Tfe(e){try{process.chdir(e)}catch{}}Ht();q();import{spawn as nG}from"child_process";import{existsSync as rG,mkdirSync as Cfe,readFileSync as oG,unlinkSync as tG,writeFileSync as iG}from"fs";import{get as _fe}from"https";import{join as sG}from"path";import{readFileSync as Efe}from"fs";import{dirname as xfe,join as Rfe}from"path";import{fileURLToPath as Afe}from"url";function gr(){try{return"5.84.
|
|
1776
|
+
`),XK=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,hR=30,ffe=1024,gfe=8e3,hfe="haiku";async function yfe(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=vfe(n,ffe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??gfe),s=t.signal?kfe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ks({token:t.token,model:t.model??hfe,system:mfe,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=bfe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=ufe(t.worktreePath);return await wfe(l,c)}function bfe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(XK.test(t)&&t.length<=hR)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>hR)break;o=s}return XK.test(o)?o:null}async function wfe(e,t){if(!await Sfe(ZK(t,e)))return e;let n=pfe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,hR-5)}-${n}`}async function Sfe(e){try{return await dfe.access(e),!0}catch{return!1}}function vfe(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 kfe(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 eG(e){let t,n,r=ZK(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await yfe(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=`${Zp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return QK(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 QK(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 QK(e,t){e&&e.setCwd(t),Tfe(t)}function Tfe(e){try{process.chdir(e)}catch{}}Ht();q();import{spawn as nG}from"child_process";import{existsSync as rG,mkdirSync as Cfe,readFileSync as oG,unlinkSync as tG,writeFileSync as iG}from"fs";import{get as _fe}from"https";import{join as sG}from"path";import{readFileSync as Efe}from"fs";import{dirname as xfe,join as Rfe}from"path";import{fileURLToPath as Afe}from"url";function gr(){try{return"5.84.10"}catch{}try{let e=xfe(Afe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Efe(Rfe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var Ife=64*1024,Pfe=10800*1e3,Mfe=800,Ofe=3600*1e3,$fe="update-check.json",Dfe="pending-update.json";function yR(){return sG(Is(),$fe)}function Bu(){return sG(Is(),Dfe)}function bR(){let e=Is();rG(e)||Cfe(e,{recursive:!0})}function aG(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 lG(){try{let e=oG(yR(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cG(){try{bR();let e=`
|
|
1777
1777
|
const https = require('https');
|
|
1778
1778
|
const fs = require('fs');
|
|
1779
1779
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|
|
@@ -1934,7 +1934,7 @@ Multiple chats found:`)),o.forEach((l,c)=>{let d=l.username?`@${l.username}`:l.f
|
|
|
1934
1934
|
`).slice(-o-1);console.log(i.join(`
|
|
1935
1935
|
`))})}function whe(e){if(console.log(p.heading("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${p.success("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${She(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${p.error("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(p.heading("Recent log entries:"));for(let t of e.logTail)console.log(p.meta(` ${t}`))}}function She(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 Vhe}from"node:child_process";import{promisify as Yhe}from"node:util";q();import{execFile as vhe}from"node:child_process";import{randomBytes as khe}from"node:crypto";import{promises as Hl}from"node:fs";import{join as Ab}from"node:path";import{promisify as The}from"node:util";var Ehe=The(vhe),f2=16;var At=class extends Error{cause;code;constructor(t,n,r){super(t),this.name="WorktreeError",this.cause=n,this.code=r}};function BR(e,t=40){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||"task"}function xhe(){return khe(4).toString("hex").slice(0,4)}function Rhe(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 Ahe(e,t={}){let n=(t.now??(()=>new Date))(),r=(t.randomSuffix??xhe)();return`${Rhe(n)}-${BR(e,32)}-${r}`}async function ws(e,t){try{let n=await Ehe("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 Che(e){let{stdout:t}=await ws(e,["rev-parse","--show-toplevel"]);if(!t)throw new At(`not a git repository: ${e}`);return t}async function _he(e,t){if(t){let{stdout:o}=await ws(e,["rev-parse",t]);return{sha:o}}let{stdout:n}=await ws(e,["rev-parse","HEAD"]),r;try{let{stdout:o}=await ws(e,["symbolic-ref","--quiet","HEAD"]);o&&(r=o)}catch{}return{sha:n,branch:r}}function Ihe(e,t,n){let r=n?BR(n,32):`branch-${t}`;return`afk/farm/${e}/${t}-${r}`}function Phe(e,t){return Ab(e,`branch-${t}`)}async function Mhe(e,t){try{await ws(e,["worktree","remove","--force",t])}catch{}}async function Ohe(e,t){try{await ws(e,["branch","-D",t])}catch{}}async function g2(e){if(e.count<1||e.count>f2)throw new At(`count must be between 1 and ${f2}, 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 Che(t),{sha:r,branch:o}=await _he(n,e.baseRef),i=(e.now??(()=>new Date))(),s=e.taskSlug??Ahe(e.taskName,{now:()=>i,randomSuffix:e.randomSuffix}),a=e.taskSlug??s,l=hw(s);try{throw await Hl.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 Hl.mkdir(l,{recursive:!0});let c=[];try{for(let u=1;u<=e.count;u++){let m=e.labels?.[u-1],f=Ihe(s,u,m),g=Phe(l,u);await ws(n,["worktree","add","-b",f,g,r]),c.push({index:u,label:m?BR(m,32):void 0,path:g,branch:f})}}catch(u){for(let m of c.slice().reverse())await Mhe(n,m.path),await Ohe(n,m.branch);throw await Hl.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 Hl.writeFile(Ab(l,"farm.json"),JSON.stringify(d,null,2)+`
|
|
1936
1936
|
`,"utf8"),d}function $he(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 Dhe(e){let t=Ab(hw(e),"farm.json");try{let n=await Hl.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 $he(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 h2(e,t){let n=await Dhe(e);if(!n)throw new At(`farm not found: ${e}`);return n.memoryFactId=t,n.schemaVersion=3,await Hl.writeFile(Ab(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
|
|
1937
|
-
`,"utf8"),n}Xe();import{spawn as Fhe}from"child_process";import{promises as Cb}from"fs";import{join as Wu,dirname as
|
|
1937
|
+
`,"utf8"),n}Xe();import{spawn as Fhe}from"child_process";import{promises as Cb}from"fs";import{join as Wu,dirname as dut}from"path";var Lhe=1,_b=12e4;async function S2(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=_b,_spawn:i=Fhe,_readPackageJson:s=Nhe,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await Bhe(t,s),d=0,u=0,m=0,f;if(c){let b=await k2(c,t,o,i,a);m=b.durationMs,b.timedOut?(u=1,f=`tests timed out after ${o}ms`):b.crashed?(u=1,f=`test runner crashed: ${Hhe(b.stderr,200)}`):b.exitCode===0?d=1:u=1}else f="no test command found (no package.json scripts.test)";let g=await Uhe(t,o,i,a),h=await jhe(t,n,i),y={schemaVersion:Lhe,pass:d,fail:u,loc_delta:h,lint_ok:g,duration_ms:m,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(y.error=f),c!==void 0&&(y.testCmd=c),y}async function v2(e,t,n){let r=Wu(e,"scores");await Cb.mkdir(r,{recursive:!0});let o=Wu(r,`branch-${t}.json`);return await Cb.writeFile(o,JSON.stringify(n,null,2)+`
|
|
1938
1938
|
`,"utf8"),o}function Ku(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=y2(i),l=y2(s);if(a!==l)return l-a;let c=b2(i.lint_ok),d=b2(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 Nhe(e){try{let t=await Cb.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function Bhe(e,t){let n=await t(Wu(e,"package.json"));if(!w2(n))return;let r=n.scripts;return!w2(r)||typeof r.test!="string"?void 0:await T2(Wu(e,"pnpm-lock.yaml"))?"pnpm test":"npm test"}async function k2(e,t,n,r,o){let i=o();return new Promise(s=>{let a;try{a=r(e,{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],env:{...process.env,CI:"1"}})}catch(m){s({exitCode:null,durationMs:o()-i,stderr:m instanceof Error?m.message:String(m),timedOut:!1,crashed:!0});return}let l="",c=!1,d=!1,u=setTimeout(()=>{c=!0,a.kill("SIGKILL")},n);a.stderr?.on("data",m=>{l+=String(m),l.length>64e3&&(l=l.slice(-32e3))}),a.on("error",m=>{d||(d=!0,clearTimeout(u),s({exitCode:null,durationMs:o()-i,stderr:m.message,timedOut:!1,crashed:!0}))}),a.on("close",m=>{d||(d=!0,clearTimeout(u),s({exitCode:m,durationMs:o()-i,stderr:l,timedOut:c,crashed:!1}))})})}async function Uhe(e,t,n,r){if(!await T2(Wu(e,"tsconfig.json")))return null;let o=await k2("npx --no-install tsc --noEmit",e,t,n,r);return o.crashed||o.timedOut?null:o.exitCode===0}async function jhe(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 y2(e){let t=e.pass+e.fail;return t===0?0:e.pass/t}function b2(e){return e===!0?2:e===!1?1:0}function Hhe(e,t){return e.length<=t?e:e.slice(0,t)+"\u2026"}function w2(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function T2(e){try{return await Cb.access(e),!0}catch{return!1}}Rm();function E2(e,t){let n;try{n=t?._store??new ut}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r=Whe(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 Whe(e){let t=Khe(e.branches),n=e.winner??null,r=Ghe(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 Khe(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 Ghe(e,t){let{winner:n,branches:r}=e;if(n==null)return r.some(m=>m.score!=null)?`no winner: all ${r.length} branches failed tests`:"no winner: scoring data unavailable";let o=t.find(u=>u.index===n);if(!o)return`branch-${n} wins`;let i=o.pass>0?"\u2713":"\u2717",s=o.lint_ok===!0?"\u2713":o.lint_ok===!1?"\u2717":"?",a=o.loc_delta>=0?`+${o.loc_delta}`:String(o.loc_delta),c=t.filter(u=>u.index!==n).map(u=>u.loc_delta>=0?`+${u.loc_delta}`:String(u.loc_delta)),d=c.length>0?` (vs ${c.join(", ")} LoC)`:"";return`branch-${n} wins: tests${i}, lint${s}, ${a} LoC${d}`}var qhe="afk:f:";var zhe=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function Gu(e,t){if(!zhe.test(t))throw new Error(`buildFarmCallback: invalid taskSlug ${JSON.stringify(t)}`);let n=`${qhe}${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 x2(e){return{inline_keyboard:[[{text:"\u2705 Open PR",callback_data:Gu("p",e)},{text:"\u{1F501} Respawn from winner",callback_data:Gu("r",e)}],[{text:"\u{1F50D} Full diff",callback_data:Gu("d",e)},{text:"\u274C Discard all",callback_data:Gu("x",e)}]]}}function Jhe(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=Ku(d),m=new Map(o.map(b=>[b.index,b])),f=[];f.push(`\u{1F331} Farm complete: ${c}/${l} branches \u2014 ${t}`),f.push("");let g=1;for(let b of u){let w=m.get(b);if(!w)continue;let S=i!==void 0&&i===w.index,T=w.label?` (${w.label})`:"",E=w.score??null,A=E===null?"\u2014":E.pass>0?"\u2713":"\u2717",O=E===null?"\u2014":E.lint_ok===!0?"\u2713":E.lint_ok===!1?"\u2717":"?",R=E===null?"?":E.loc_delta>0?`+${E.loc_delta}`:E.loc_delta<0?`${E.loc_delta}`:"0",I=S?" \u2190 winner":"";f.push(`#${g} ${w.branch}${T} tests${A} lint${O} ${R} LoC${I}`),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(`
|
|
1939
1939
|
`)}async function R2(e,t){let n=Jhe(e),r=x2(e.taskSlug),o=t?._push??await Promise.resolve().then(()=>(Tr(),RS)).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 A2=Yhe(Vhe);async function Xhe(e,t){try{let{stdout:n}=await A2("git",["-C",e,"rev-list",`${t}..HEAD`,"--count"],{maxBuffer:4194304});return parseInt(n.trim(),10)||0}catch{return 0}}async function Qhe(e){try{let{stdout:t}=await A2("git",["-C",e,"status","--porcelain"],{maxBuffer:4194304});return t.trim()?t.trim().split(`
|
|
1940
1940
|
`).filter(Boolean):[]}catch{return[]}}var UR=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
|
|
@@ -1979,7 +1979,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
|
|
|
1979
1979
|
`)){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 cq(e){let t=jn(e),n={name:e,label:Vu(e),installed:abe(t),configPath:t,logFile:ql(e)};if(!n.installed)return n;try{let r=sbe("systemctl",["--user","show",Bt(e),"--property=MainPID,ExecMainStatus,ActiveState,LoadState"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:zl}),o=lbe(r);o.pid!==void 0&&(n.pid=o.pid),o.lastExitStatus!==void 0&&(n.lastExitStatus=o.lastExitStatus)}catch{}return n}var uq={backend:"systemd",configKind:"systemd user unit",install(e,t={}){return sq(e,t)},uninstall(e){return aq(e)},status(e){return cq(e)},restart(e){if(!dq(jn(e)))return{kind:"not-installed",configPath:jn(e)};try{return cbe("systemctl",["--user","restart",Bt(e)],{stdio:["ignore","pipe","pipe"],timeout:zl}),{kind:"restarted",label:Vu(e)}}catch(t){let n=t.stderr;return{kind:"failed",reason:n&&n.toString().trim()||t.message}}},isInstalled(e){return dq(jn(e))},configPath(e){return jn(e)},logPath(e){return ql(e)},label(e){return Vu(e)},readConfigFile(e){return lq(e)}};var Yl=["telegram","daemon"];function pq(e=process.platform){switch(e){case"darwin":return Z2;case"linux":return uq;default:return null}}var mq="macOS (launchd) and Linux (systemd --user)";function Yu(){let e=pq();if(!e)throw new Error(`'afk service' is not supported on ${process.platform}. Supported: ${mq}.`);return e}function Ub(e){let t=e.toLowerCase();if(Yl.includes(t))return t;throw new Error(`Unknown service '${e}'. Supported: ${Yl.join(", ")}.`)}function gq(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 <${Yl.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=Yu(),i=Ub(n),s=o.install(i,{noWatch:r.watch===!1,dryRun:!!r.dryRun});s.kind==="already-installed"&&(console.log(p.warning(`\u26A0 ${s.label} already installed at ${s.configPath}`)),console.log(p.meta(` Run 'afk service uninstall ${i}' first to reinstall.`)),process.exit(1)),s.kind==="failed"&&(console.error(p.error(`\u2717 Install failed: ${s.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Installed ${s.label}`)),console.log(p.meta(` Config: ${s.configPath} (${o.configKind})`)),console.log(p.meta(` Log: ${o.logPath(i)}`)),s.autoRestartOnRebuild?console.log(p.meta(" Auto-restart on rebuild: on")):console.log(p.meta(` Auto-restart on rebuild: off \u2014 run 'afk service restart ${i}' after updates.`));for(let a of s.notes??[])console.log(p.info(` ${a}`));r.dryRun||console.log(p.meta(` Status: afk service status ${i}`))}catch(o){V(o)}}),t.command("uninstall <name>").description("Stop the service and remove its config (LaunchAgent plist / systemd unit)").action(n=>{try{let r=Yu(),o=Ub(n),i=r.uninstall(o);if(i.kind==="not-installed"){console.log(p.warning(`\u26A0 ${r.label(o)} is not installed (no config at ${i.configPath})`));return}i.kind==="failed"&&(console.error(p.error(`\u2717 Uninstall failed: ${i.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Uninstalled ${r.label(o)}`)),console.log(p.meta(` Removed: ${i.configPath}`))}catch(r){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=Yu();if(n){fq(r.status(Ub(n)),r.configKind);return}for(let o of Yl)fq(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=Yu();console.log(p.heading(`AFK services (${n.backend}):`));for(let r of Yl){let o=n.isInstalled(r),i=o?p.success("\u25CF"):p.dim("\u25CB"),s=o?p.meta("installed"):p.meta("not installed");console.log(` ${i} ${r.padEnd(10)} ${s} ${p.meta(n.configPath(r))}`)}}catch(n){V(n)}}),t.command("restart <name>").description("Restart the service (launchctl kickstart -k / systemctl --user restart)").action(n=>{try{let r=Yu(),o=Ub(n),i=r.restart(o);i.kind==="not-installed"&&(console.error(p.error(`\u2717 ${r.label(o)} is not installed. Run 'afk service install ${o}' first.`)),process.exit(1)),i.kind==="failed"&&(console.error(p.error(`\u2717 Restart failed: ${i.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Restarted ${i.label}`))}catch(r){V(r)}})}function fq(e,t){if(console.log(p.heading(`${e.label}`)),!e.installed){console.log(` ${p.dim("\u25CB")} Not installed`),console.log(p.meta(` Config: ${e.configPath} (${t})`)),console.log(p.meta(` Install: afk service install ${e.name}`));return}e.pid!==void 0?console.log(` ${p.success("\u25CF")} Running (PID ${e.pid})`):(console.log(` ${p.warning("\u25CF")} Installed but not running`),e.lastExitStatus!==void 0&&e.lastExitStatus!==0&&console.log(p.meta(` Last exit status: ${e.lastExitStatus}`))),console.log(p.meta(` Config: ${e.configPath} (${t})`)),console.log(p.meta(` Log: ${e.logFile}`))}import{execFileSync as dbe}from"child_process";import{chmodSync as ube,existsSync as Xu,mkdirSync as bq,readdirSync as pbe,readFileSync as mbe,renameSync as wq,writeFileSync as Sq}from"fs";import{basename as fbe,dirname as XR,join as QR}from"path";import{randomBytes as vq}from"crypto";import{createInterface as gbe}from"node:readline";Bm();q();function hbe(e){let t=gbe({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,()=>{t.close(),n()})})}var Xo="chrome-devtools",YR=["stable","beta","canary","dev"];function ybe(e="stable"){let t=["chrome-devtools-mcp@latest","--autoConnect"];return e!=="stable"&&t.push("--channel",e),{command:"npx",args:t}}function hq(e){if(!Xu(e))return{mcpServers:{}};let t;try{t=mbe(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 yq(e,t){bq(XR(e),{recursive:!0});let n=QR(XR(e),`.mcp.json.${process.pid}.${vq(4).toString("hex")}.tmp`);Sq(n,`${JSON.stringify(t,null,2)}
|
|
1980
1980
|
`,"utf-8"),wq(n,e)}function bbe(){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=dbe(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 wbe(){let e=bbe();console.log(""),console.log(p.heading("Drive your real Chrome \u2014 one-time setup:")),e===null?console.log(p.meta(" \u2022 Chrome not detected. autoConnect requires Chrome \u2265 144.")):e<144?console.log(p.warning(` \u2022 Detected Chrome ${e} \u2014 autoConnect requires \u2265 144. Please update Chrome.`)):console.log(p.meta(` \u2022 Detected Chrome ${e} \u2713 (autoConnect needs \u2265 144)`)),console.log(p.meta(" 1. In Chrome, open chrome://inspect/#remote-debugging and enable it (one time).")),console.log(p.meta(' 2. The first time the agent drives Chrome, click "Allow" on the prompt.')),console.log(p.meta(' 3. Chrome shows a "being controlled by automated test software" banner while active.')),console.log(""),console.log(p.meta("The agent gains mcp__chrome-devtools__* tools (navigate, click, fill, take_snapshot, \u2026)")),console.log(p.meta("driving your REAL, logged-in profile. Run `/mcp` in the REPL to confirm it connected.")),console.log(p.meta("Undo anytime with `afk browser disconnect`."))}function kq(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 (${YR.join("|")})`,"stable").action(n=>{try{let r=(n.channel??"stable").toLowerCase();if(!YR.includes(r))throw new Error(`--channel must be one of ${YR.join(", ")} (got "${n.channel}")`);let o=Vi(),i=hq(o);i.mcpServers===void 0&&(i.mcpServers={});let s=ybe(r),a=i.mcpServers[Xo];if(a!==void 0&&JSON.stringify(a)===JSON.stringify(s))console.log(p.success(`\u2713 "${Xo}" already configured`)),console.log(p.meta(` Config: ${o}`));else{i.mcpServers[Xo]=s,yq(o,i);let l=a===void 0?"Added":"Updated";console.log(p.success(`\u2713 ${l} "${Xo}" MCP server`)),console.log(p.meta(` Config: ${o}`)),console.log(p.meta(` Runs: npx ${s.args?.join(" ")??""}`))}wbe()}catch(r){V(r)}}),t.command("disconnect").description("Remove the chrome-devtools server from your MCP config").action(()=>{try{let n=Vi();if(!Xu(n)){console.log(p.warning(`\u26A0 No MCP config at ${n} \u2014 nothing to remove.`));return}let r=hq(n);if(r.mcpServers===void 0||r.mcpServers[Xo]===void 0){console.log(p.warning(`\u26A0 "${Xo}" is not configured \u2014 nothing to remove.`));return}delete r.mcpServers[Xo],yq(n,r),console.log(p.success(`\u2713 Removed "${Xo}" 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();pc(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=mc(o),{chromium:a}=await import("playwright");console.log(p.meta(`Launching a browser for profile "${o}"\u2026`));let l=await a.launch({headless:!1}).catch(f=>{throw Qc(f,!1)}),c=await l.newContext(Xu(s)?{storageState:s}:{});await(await c.newPage()).goto(n,{waitUntil:"load"}).catch(()=>{}),console.log(""),console.log(p.heading("Log in to the site in the opened browser window.")),console.log(p.meta("When fully logged in, return here and press Enter to save the session.")),console.log(p.meta("(Do NOT close the browser window yourself \u2014 this command closes it for you.)")),await hbe("Press Enter to save the session\u2026 ");let u=await c.storageState();bq(Tw(o),{recursive:!0});let m=QR(XR(s),`.${fbe(s)}.${process.pid}.${vq(4).toString("hex")}.tmp`);Sq(m,JSON.stringify(u),{mode:384}),ube(m,384),wq(m,s),await l.close().catch(()=>{}),console.log(p.success(`\u2713 Saved session for profile "${o}"`)),console.log(p.meta(` Vault: ${s} (0600 \u2014 treat as a credential)`)),console.log(p.meta(" Point the agent at it:")),console.log(p.meta(` export AFK_BROWSER_DEFAULT_PROFILE=${o}`))}catch(o){V(o)}}),t.command("profiles").description("List saved browser session-vault profiles").action(()=>{try{let n=kw(),r=Xu(n)?pbe(n,{withFileTypes:!0}).filter(o=>o.isDirectory()):[];if(r.length===0){console.log(p.meta("No saved profiles. Create one with `afk browser login <url> --profile <name>`."));return}console.log(p.heading("Saved browser profiles:"));for(let o of r){let i=Xu(QR(n,o.name,"storageState.json")),s=i?p.success("\u25CF"):p.meta("\u25CB"),a=i?"":p.meta(" (no saved session)");console.log(` ${s} ${o.name}${a}`)}console.log(""),console.log(p.meta("Use one: export AFK_BROWSER_DEFAULT_PROFILE=<name>"))}catch(n){V(n)}})}import{readFileSync as Sbe,readdirSync as vbe,statSync as kbe}from"fs";import{join as nA}from"path";q();import{join as et}from"path";function jb(){return et(Ct(),"improve")}function Qo(){return et(jb(),"failure-cards")}function Tq(){return et(Qo(),".index.jsonl")}function Qu(e){return et(Qo(),`${e}.json`)}function Hb(e){return et(Qo(),`${e}.md`)}function Eq(){return et(me(),"witness")}function vs(){return et(jb(),"proposals")}function xq(){return et(vs(),".index.jsonl")}function ZR(e){return et(vs(),`${e}.json`)}function Rq(e){return et(vs(),`${e}.md`)}function Zo(){return et(jb(),"eval-cases")}function Aq(){return et(Zo(),".index.jsonl")}function eA(e){return et(Zo(),`${e}.json`)}function tA(e){return et(Zo(),`${e}.fixture.jsonl`)}function Cq(e){return et(Zo(),`${e}.md`)}function Xl(){return et(jb(),"eval-runs")}function _q(){return et(Xl(),".index.jsonl")}function Iq(e){return et(Xl(),`${e}.json`)}function Pq(e){return et(Xl(),`${e}.md`)}G();function Mq(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 Oq(e={}){let t=e.witnessRoot??Eq(),n=e.afkHome??v.AFK_HOME??Tbe(),r=e.sinceMs,o={sessionsScanned:0,sessionsSkippedOld:0,sessionsSkippedEmpty:0,invalidLineCount:0,sessions:[]},i;try{i=vbe(t)}catch{return o}for(let s of i){if(s.startsWith("."))continue;let a=nA(t,s),l;try{l=kbe(a)}catch{continue}if(!l.isDirectory())continue;if(r!==void 0&&l.mtimeMs<r){o.sessionsSkippedOld+=1;continue}let c=nA(a,"trace.jsonl"),d;try{d=Sbe(c,"utf-8")}catch{o.sessionsSkippedEmpty+=1;continue}let u=Ebe(c,n),m=Ql({sessionId:s,tracePath:c,relativeTracePath:u,content:d,sessionMtimeMs:l.mtimeMs});o.sessions.push(m),o.sessionsScanned+=1,o.invalidLineCount+=m.invalidLineCount}return o}function Ql(e){let{sessionId:t,tracePath:n,relativeTracePath:r,content:o,sessionMtimeMs:i}=e,s=[],a=0,l=o.split(`
|
|
1981
1981
|
`);for(let c=0;c<l.length;c+=1){let d=l[c]??"";if(d.trim()==="")continue;let u;try{u=JSON.parse(d)}catch{a+=1;continue}let m=gh.safeParse(u);if(!m.success){a+=1;continue}s.push({sessionId:t,tracePath:n,relativeTracePath:r,lineNumber:c+1,rawLine:d,event:m.data})}return{sessionId:t,tracePath:n,relativeTracePath:r,sessionMtimeMs:i,events:s,invalidLineCount:a}}function Tbe(){let e=v.AFK_HOME;return e&&e.length>0?e:nA(v.HOME??"",".afk")}function Ebe(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 xbe}from"crypto";var Jr=4,Rbe=8,Abe="v1-bytes-tuple";function Wb(e,t={}){let n=t.minRepeats??Jr;if(n<2)throw new Error(`minRepeats must be >= 2 (got ${n})`);let r=[];for(let o of e){let i=Cbe(o,n);r.push(...i)}return r}function Cbe(e,t){let n=_be(e.events),r=Ibe(n),o=[];for(let[i,s]of r.entries()){let a=Pbe(s,t);for(let l of a)o.push(Obe(e,l,i))}return o}function _be(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=Mbe({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 Ibe(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 Pbe(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 Mbe(e){let t=[e.name,String(e.inputBytes),String(e.resultBytes),e.isError?"1":"0",e.subagentId??""].join("|");return xbe("sha256").update(t).digest("hex")}function Obe(e,t,n){let r=t[0];if(!r)throw new Error("repeated-tool-use: empty run");let o=Nbe(r.name,r.fingerprint),i=new Date().toISOString(),s=t.slice(0,Rbe),a=[{sessionId:e.sessionId,tracePath:e.relativeTracePath,eventIndices:s.map(l=>l.completedSeq),excerpt:$be(s),annotation:Dbe(t,n)}];return{slug:o,title:Fbe(r.name,t.length),pattern:"repeated-tool-use",severity:Lbe(t.length),observedAt:i,evidence:a,detail:{detector:"repeated-tool-use@v1",fingerprintAlgorithm:Abe,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 $be(e){let t=e.map(n=>n.rawLine).join(`
|
|
1982
|
-
`);return t.length<=2e3?t:t.slice(0,1997)+"..."}function Dbe(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 Fbe(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function Lbe(e){return e>=10?"high":e>=4?"medium":"low"}function Nbe(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 Bbe=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function Kb(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(!Bbe.has(l))continue;let c={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,finalCostUsd:a.payload.finalCostUsd,finalTurnCount:a.payload.finalTurnCount},d=r.get(l);d?d.push(c):r.set(l,[c])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(jbe(i,s));return o}var Ube=8;function jbe(e,t){let n=Wbe(e),r=new Date().toISOString(),i=t.slice(0,Ube).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Kbe(l.rawLine),annotation:`closure.reason='${l.reason}' \xB7 cost=${Gbe(l.finalCostUsd)} \xB7 turns=${l.finalTurnCount}`})),s=t.reduce((l,c)=>l+c.finalCostUsd,0),a=t.reduce((l,c)=>l+c.finalTurnCount,0)/t.length;return{slug:n,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:Hbe(e,t.length),observedAt:r,evidence:i,detail:{detector:"closure-anomaly@v1",closureReason:e,affectedSessions:t.length,totalCostUsd:$q(s),avgTurnCount:qbe(a),maxCostUsd:$q(Math.max(...t.map(l=>l.finalCostUsd))),sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function Hbe(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 Wbe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function Kbe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Gbe(e){return`$${e.toFixed(4)}`}function $q(e){return Math.round(e*1e4)/1e4}function qbe(e){return Math.round(e*100)/100}import{createHash as zbe}from"crypto";var ks=2,Jbe="v1-hook-reason-tuple",Vbe=8;function Dq(e,t={}){let n=t.minOccurrences??ks;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=Ybe({hookEvent:a.payload.hookEvent,reason:l,blockedTool:c}),u={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,blockedTool:c,injectedContextBytes:a.payload.injectedContextBytes},m=r.get(d);m?m.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Qbe(i,s));return o}function Ybe(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return zbe("sha256").update(t).digest("hex")}function Xbe(e){return`subagent-block-${e.slice(0,12)}`}function Qbe(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=Xbe(e),o=new Date().toISOString(),s=t.slice(0,Vbe).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:nwe(l.rawLine),annotation:twe(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:ewe(n.reason,t.length,a),pattern:"subagent-block",severity:Zbe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:Jbe,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 Zbe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function ewe(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 twe(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 nwe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as rwe}from"crypto";var Ts=2,owe="v1-pretooluse-read-normreason",iwe=8,swe=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function awe(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function Fq(e,t={}){let n=t.minOccurrences??Ts;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||!swe.has(l))continue;let c=a.payload.reason??"",d=awe(c),u=lwe({hookEvent:a.payload.hookEvent,normalizedReason:d}),m={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:d,blockedTool:l},f=r.get(u);f?f.push(m):r.set(u,[m])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(dwe(i,s));return o}function lwe(e){let t=[e.hookEvent,e.normalizedReason].join("|");return rwe("sha256").update(t).digest("hex")}function cwe(e){return`subagent-read-denial-${e.slice(0,12)}`}function dwe(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=cwe(e),o=new Date().toISOString(),s=t.slice(0,iwe).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:fwe(c.rawLine),annotation:mwe(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:pwe(t.length,a),pattern:"subagent-read-denial",severity:uwe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v1",fingerprintAlgorithm:owe,fingerprint:e,hookEvent:"PreToolUse",normalizedReason:n.normalizedReason,reason:n.reason,blockedTools:l,denialCount:t.length,distinctSessions:a,sessionIds:[...new Set(t.map(c=>c.sessionId))],seqs:t.map(c=>c.seq)}}}function uwe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function pwe(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function mwe(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function fwe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var gwe=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined"]),Es=3,xs=.25,hwe=8;function Zl(e,t={}){let n=t.minFailures??Es,r=t.minFailureRate??xs;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=ywe(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&gwe.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(bwe(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function ywe(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 bwe(e,t){let n=vwe(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,hwe).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:kwe(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:Swe(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:wwe(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:Twe(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:Ewe(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function wwe(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function Swe(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function vwe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function kwe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Twe(e){return Math.round(e*1e4)/1e4}function Ewe(e){return Math.round(e*100)/100}var Gb=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Jr})`,run:(e,t)=>Wb(e,{minRepeats:t.minRepeats??Jr})},{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)=>Kb(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${ks})`,enabledByDefault:!1,run:(e,t)=>Dq(e,{minOccurrences:t.subagentBlockMinOccurrences??ks})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${Es} failures, ${xs} rate)`,enabledByDefault:!0,run:(e,t)=>Zl(e,{minFailures:t.toolFailureMinFailures??Es,minFailureRate:t.toolFailureMinRate??xs})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${Ts})`,enabledByDefault:!1,run:(e,t)=>Fq(e,{minOccurrences:t.subagentReadDenialMinOccurrences??Ts})}]);function Lq(e,t,n,r){let o=[];for(let i of Gb){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 qb(){return Gb.map(e=>e.name)}function Nq(){return Gb.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function ec(){return Gb.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as tp,mkdirSync as zq,readFileSync as Hwe,readdirSync as Jq,renameSync as Vq,writeFileSync as iA}from"fs";import{join as Yq}from"path";import{z as D}from"zod";var tc=D.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),zb=D.enum(["low","medium","high"]),xwe=D.enum(["open","deferred","resolved"]),Bq=D.object({sessionId:D.string().min(1),tracePath:D.string().min(1),eventIndices:D.array(D.number().int().nonnegative()).min(1),excerpt:D.string().max(2e3),annotation:D.string().optional()}),Jb=D.object({at:D.string().datetime(),text:D.string()}),ep=D.object({schemaVersion:D.literal(1),slug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:D.string().min(1).max(200),pattern:tc,severity:zb,status:xwe,firstSeen:D.string().datetime(),lastSeen:D.string().datetime(),occurrenceCount:D.number().int().nonnegative(),evidence:D.array(Bq).min(1),detail:D.record(D.string(),D.unknown()),notes:D.array(Jb).default([])}),Kmt=D.object({slug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:D.string().min(1).max(200),pattern:tc,severity:zb,observedAt:D.string().datetime(),evidence:D.array(Bq).min(1),detail:D.record(D.string(),D.unknown())}),Uq=D.object({timestamp:D.string().datetime(),event:D.enum(["created","updated","merged-noop"]),slug:D.string(),pattern:tc,occurrenceCount:D.number().int().nonnegative(),evidenceAdded:D.number().int().nonnegative()}),Rwe=D.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"]),Awe=D.enum(["safe","moderate","high","forbidden"]),Cwe=D.enum(["low","medium","high"]),_we=D.object({cardSlug:D.string(),eventIndices:D.array(D.number().int().nonnegative()).min(1),annotation:D.string().optional()}),Iwe=D.object({path:D.string().min(1),rationale:D.string(),riskTier:Awe,confidence:Cwe}),Pwe=D.object({unitTests:D.array(D.string()),evalCases:D.array(D.string()),smokeChecks:D.array(D.string()),manualChecks:D.array(D.string())}),Mwe=D.object({forbiddenPaths:D.array(D.string()),requiresExplicitApproval:D.boolean()}),Owe=D.enum(["draft","approved","rejected","superseded"]),rA=D.object({schemaVersion:D.literal(1),proposalId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),cardSlug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:D.string().min(1).max(200),hypothesis:D.string().min(1),rootCauseClass:Rwe,evidenceRefs:D.array(_we).min(1),fixSketch:D.string().min(1),likelyFiles:D.array(Iwe),riskLevel:zb,validationPlan:Pwe,scopeFreeze:Mwe,generatedBy:D.enum(["template","llm"]),createdAt:D.string().datetime(),status:Owe,notes:D.array(Jb).default([])}),jq=D.object({timestamp:D.string().datetime(),event:D.enum(["created","triaged","superseded"]),proposalId:D.string(),cardSlug:D.string(),generatedBy:D.enum(["template","llm"]),riskLevel:zb}),$we=D.object({sourceSessionId:D.string().min(1),sourceTracePath:D.string().min(1),fixturePath:D.string().min(1),evidenceRowIndex:D.number().int().nonnegative(),evidenceEventIndices:D.array(D.number().int().nonnegative()).min(1),sliceLineRange:D.object({startLine:D.number().int().positive(),endLine:D.number().int().positive()}),sliceLineCount:D.number().int().positive(),sliceSha256:D.string().regex(/^[0-9a-f]{64}$/,"sliceSha256 must be 64 lowercase hex chars")}),Dwe=D.object({kind:D.literal("pattern-absent"),patternId:tc,detectorVersion:D.string().min(1),rationale:D.string().min(1)}),Fwe=D.object({detectorAtGeneration:D.string().min(1),fingerprintAtGeneration:D.string().nullable(),cardOccurrenceCountAtGeneration:D.number().int().nonnegative(),cardLastSeenAtGeneration:D.string().datetime(),generatedBy:D.literal("replay-fixture")}),Lwe=D.enum(["draft","approved","rejected","superseded"]),Vb=D.object({schemaVersion:D.literal(1),evalCaseId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalCaseId must be lowercase alphanumeric with hyphens"),cardSlug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),proposalId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/).nullable(),title:D.string().min(1).max(200),createdAt:D.string().datetime(),kind:D.literal("replay"),replay:$we,assertion:Dwe,provenance:Fwe,status:Lwe,notes:D.array(Jb).default([])}),Hq=D.object({timestamp:D.string().datetime(),event:D.enum(["created","triaged","superseded"]),evalCaseId:D.string(),cardSlug:D.string(),proposalId:D.string().nullable(),kind:D.literal("replay")}),Nwe=D.enum(["pass","fail","skipped"]),Bwe=D.object({name:D.string().min(1),description:D.string().min(1),status:Nwe,expected:D.string(),actual:D.string()}),Uwe=D.enum(["config-value","observed-behavior","source-symbol","fixture"]),jwe=D.object({kind:Uwe,ref:D.string().min(1),detail:D.string()}),Wq=D.enum(["pass","fail","unsupported","error"]),oA=D.object({schemaVersion:D.literal(1),evalRunId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalRunId must be lowercase alphanumeric with hyphens"),evalCaseId:D.string().min(1),cardSlug:D.string().min(1),patternId:tc,contract:D.string().min(1).nullable(),status:Wq,createdAt:D.string().datetime(),durationMs:D.number().int().nonnegative(),checks:D.array(Bwe),evidence:D.array(jwe),runner:D.object({version:D.string().min(1),mode:D.literal("deterministic")}),notes:D.array(Jb).default([])}),Kq=D.object({timestamp:D.string().datetime(),event:D.literal("created"),evalRunId:D.string(),evalCaseId:D.string(),cardSlug:D.string(),patternId:tc,contract:D.string().nullable(),status:Wq}),Gq=Object.freeze(["**/auth/**","**/billing/**","**/secrets/**","**/credentials*",".env",".env.*","pnpm-lock.yaml","package-lock.json","yarn.lock",".github/workflows/**","dist/**","build/**","node_modules/**",".git/**","**/.afk/config/**","**/.afk/state/**"]);function Xq(e){let t=Qo();tp(t)||zq(t,{recursive:!0});let n=Qu(e.slug),r=Hb(e.slug),o=nc(n),i=Wwe(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=ep.parse(i);return qwe(n,c),zwe(r,np(c)),Gwe({timestamp:Jwe(),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 nc(e){if(tp(e))try{let t=Hwe(e,"utf-8"),n=JSON.parse(t),r=ep.safeParse(n);return r.success?r.data:void 0}catch{return}}function Wwe(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=Kwe(e.evidence,t.evidence),r=Vwe(e.firstSeen,t.observedAt),o=Ywe(e.lastSeen,t.observedAt),i=Xwe(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:i,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function Kwe(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 np(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(`
|
|
1982
|
+
`);return t.length<=2e3?t:t.slice(0,1997)+"..."}function Dbe(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 Fbe(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function Lbe(e){return e>=10?"high":e>=4?"medium":"low"}function Nbe(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 Bbe=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function Kb(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(!Bbe.has(l))continue;let c={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,finalCostUsd:a.payload.finalCostUsd,finalTurnCount:a.payload.finalTurnCount},d=r.get(l);d?d.push(c):r.set(l,[c])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(jbe(i,s));return o}var Ube=8;function jbe(e,t){let n=Wbe(e),r=new Date().toISOString(),i=t.slice(0,Ube).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Kbe(l.rawLine),annotation:`closure.reason='${l.reason}' \xB7 cost=${Gbe(l.finalCostUsd)} \xB7 turns=${l.finalTurnCount}`})),s=t.reduce((l,c)=>l+c.finalCostUsd,0),a=t.reduce((l,c)=>l+c.finalTurnCount,0)/t.length;return{slug:n,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:Hbe(e,t.length),observedAt:r,evidence:i,detail:{detector:"closure-anomaly@v1",closureReason:e,affectedSessions:t.length,totalCostUsd:$q(s),avgTurnCount:qbe(a),maxCostUsd:$q(Math.max(...t.map(l=>l.finalCostUsd))),sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function Hbe(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 Wbe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function Kbe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Gbe(e){return`$${e.toFixed(4)}`}function $q(e){return Math.round(e*1e4)/1e4}function qbe(e){return Math.round(e*100)/100}import{createHash as zbe}from"crypto";var ks=2,Jbe="v1-hook-reason-tuple",Vbe=8;function Dq(e,t={}){let n=t.minOccurrences??ks;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=Ybe({hookEvent:a.payload.hookEvent,reason:l,blockedTool:c}),u={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,blockedTool:c,injectedContextBytes:a.payload.injectedContextBytes},m=r.get(d);m?m.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Qbe(i,s));return o}function Ybe(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return zbe("sha256").update(t).digest("hex")}function Xbe(e){return`subagent-block-${e.slice(0,12)}`}function Qbe(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=Xbe(e),o=new Date().toISOString(),s=t.slice(0,Vbe).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:nwe(l.rawLine),annotation:twe(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:ewe(n.reason,t.length,a),pattern:"subagent-block",severity:Zbe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:Jbe,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 Zbe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function ewe(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 twe(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 nwe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as rwe}from"crypto";var Ts=2,owe="v1-pretooluse-read-normreason",iwe=8,swe=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function awe(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function Fq(e,t={}){let n=t.minOccurrences??Ts;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||!swe.has(l))continue;let c=a.payload.reason??"",d=awe(c),u=lwe({hookEvent:a.payload.hookEvent,normalizedReason:d}),m={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:d,blockedTool:l},f=r.get(u);f?f.push(m):r.set(u,[m])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(dwe(i,s));return o}function lwe(e){let t=[e.hookEvent,e.normalizedReason].join("|");return rwe("sha256").update(t).digest("hex")}function cwe(e){return`subagent-read-denial-${e.slice(0,12)}`}function dwe(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=cwe(e),o=new Date().toISOString(),s=t.slice(0,iwe).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:fwe(c.rawLine),annotation:mwe(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:pwe(t.length,a),pattern:"subagent-read-denial",severity:uwe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v1",fingerprintAlgorithm:owe,fingerprint:e,hookEvent:"PreToolUse",normalizedReason:n.normalizedReason,reason:n.reason,blockedTools:l,denialCount:t.length,distinctSessions:a,sessionIds:[...new Set(t.map(c=>c.sessionId))],seqs:t.map(c=>c.seq)}}}function uwe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function pwe(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function mwe(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function fwe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var gwe=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined"]),Es=3,xs=.25,hwe=8;function Zl(e,t={}){let n=t.minFailures??Es,r=t.minFailureRate??xs;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=ywe(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&gwe.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(bwe(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function ywe(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 bwe(e,t){let n=vwe(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,hwe).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:kwe(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:Swe(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:wwe(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:Twe(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:Ewe(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function wwe(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function Swe(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function vwe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function kwe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function Twe(e){return Math.round(e*1e4)/1e4}function Ewe(e){return Math.round(e*100)/100}var Gb=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Jr})`,run:(e,t)=>Wb(e,{minRepeats:t.minRepeats??Jr})},{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)=>Kb(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${ks})`,enabledByDefault:!1,run:(e,t)=>Dq(e,{minOccurrences:t.subagentBlockMinOccurrences??ks})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${Es} failures, ${xs} rate)`,enabledByDefault:!0,run:(e,t)=>Zl(e,{minFailures:t.toolFailureMinFailures??Es,minFailureRate:t.toolFailureMinRate??xs})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${Ts})`,enabledByDefault:!1,run:(e,t)=>Fq(e,{minOccurrences:t.subagentReadDenialMinOccurrences??Ts})}]);function Lq(e,t,n,r){let o=[];for(let i of Gb){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 qb(){return Gb.map(e=>e.name)}function Nq(){return Gb.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function ec(){return Gb.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as tp,mkdirSync as zq,readFileSync as Hwe,readdirSync as Jq,renameSync as Vq,writeFileSync as iA}from"fs";import{join as Yq}from"path";import{z as D}from"zod";var tc=D.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),zb=D.enum(["low","medium","high"]),xwe=D.enum(["open","deferred","resolved"]),Bq=D.object({sessionId:D.string().min(1),tracePath:D.string().min(1),eventIndices:D.array(D.number().int().nonnegative()).min(1),excerpt:D.string().max(2e3),annotation:D.string().optional()}),Jb=D.object({at:D.string().datetime(),text:D.string()}),ep=D.object({schemaVersion:D.literal(1),slug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:D.string().min(1).max(200),pattern:tc,severity:zb,status:xwe,firstSeen:D.string().datetime(),lastSeen:D.string().datetime(),occurrenceCount:D.number().int().nonnegative(),evidence:D.array(Bq).min(1),detail:D.record(D.string(),D.unknown()),notes:D.array(Jb).default([])}),qmt=D.object({slug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:D.string().min(1).max(200),pattern:tc,severity:zb,observedAt:D.string().datetime(),evidence:D.array(Bq).min(1),detail:D.record(D.string(),D.unknown())}),Uq=D.object({timestamp:D.string().datetime(),event:D.enum(["created","updated","merged-noop"]),slug:D.string(),pattern:tc,occurrenceCount:D.number().int().nonnegative(),evidenceAdded:D.number().int().nonnegative()}),Rwe=D.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"]),Awe=D.enum(["safe","moderate","high","forbidden"]),Cwe=D.enum(["low","medium","high"]),_we=D.object({cardSlug:D.string(),eventIndices:D.array(D.number().int().nonnegative()).min(1),annotation:D.string().optional()}),Iwe=D.object({path:D.string().min(1),rationale:D.string(),riskTier:Awe,confidence:Cwe}),Pwe=D.object({unitTests:D.array(D.string()),evalCases:D.array(D.string()),smokeChecks:D.array(D.string()),manualChecks:D.array(D.string())}),Mwe=D.object({forbiddenPaths:D.array(D.string()),requiresExplicitApproval:D.boolean()}),Owe=D.enum(["draft","approved","rejected","superseded"]),rA=D.object({schemaVersion:D.literal(1),proposalId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),cardSlug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:D.string().min(1).max(200),hypothesis:D.string().min(1),rootCauseClass:Rwe,evidenceRefs:D.array(_we).min(1),fixSketch:D.string().min(1),likelyFiles:D.array(Iwe),riskLevel:zb,validationPlan:Pwe,scopeFreeze:Mwe,generatedBy:D.enum(["template","llm"]),createdAt:D.string().datetime(),status:Owe,notes:D.array(Jb).default([])}),jq=D.object({timestamp:D.string().datetime(),event:D.enum(["created","triaged","superseded"]),proposalId:D.string(),cardSlug:D.string(),generatedBy:D.enum(["template","llm"]),riskLevel:zb}),$we=D.object({sourceSessionId:D.string().min(1),sourceTracePath:D.string().min(1),fixturePath:D.string().min(1),evidenceRowIndex:D.number().int().nonnegative(),evidenceEventIndices:D.array(D.number().int().nonnegative()).min(1),sliceLineRange:D.object({startLine:D.number().int().positive(),endLine:D.number().int().positive()}),sliceLineCount:D.number().int().positive(),sliceSha256:D.string().regex(/^[0-9a-f]{64}$/,"sliceSha256 must be 64 lowercase hex chars")}),Dwe=D.object({kind:D.literal("pattern-absent"),patternId:tc,detectorVersion:D.string().min(1),rationale:D.string().min(1)}),Fwe=D.object({detectorAtGeneration:D.string().min(1),fingerprintAtGeneration:D.string().nullable(),cardOccurrenceCountAtGeneration:D.number().int().nonnegative(),cardLastSeenAtGeneration:D.string().datetime(),generatedBy:D.literal("replay-fixture")}),Lwe=D.enum(["draft","approved","rejected","superseded"]),Vb=D.object({schemaVersion:D.literal(1),evalCaseId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalCaseId must be lowercase alphanumeric with hyphens"),cardSlug:D.string().regex(/^[a-z0-9][a-z0-9-]*$/),proposalId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/).nullable(),title:D.string().min(1).max(200),createdAt:D.string().datetime(),kind:D.literal("replay"),replay:$we,assertion:Dwe,provenance:Fwe,status:Lwe,notes:D.array(Jb).default([])}),Hq=D.object({timestamp:D.string().datetime(),event:D.enum(["created","triaged","superseded"]),evalCaseId:D.string(),cardSlug:D.string(),proposalId:D.string().nullable(),kind:D.literal("replay")}),Nwe=D.enum(["pass","fail","skipped"]),Bwe=D.object({name:D.string().min(1),description:D.string().min(1),status:Nwe,expected:D.string(),actual:D.string()}),Uwe=D.enum(["config-value","observed-behavior","source-symbol","fixture"]),jwe=D.object({kind:Uwe,ref:D.string().min(1),detail:D.string()}),Wq=D.enum(["pass","fail","unsupported","error"]),oA=D.object({schemaVersion:D.literal(1),evalRunId:D.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalRunId must be lowercase alphanumeric with hyphens"),evalCaseId:D.string().min(1),cardSlug:D.string().min(1),patternId:tc,contract:D.string().min(1).nullable(),status:Wq,createdAt:D.string().datetime(),durationMs:D.number().int().nonnegative(),checks:D.array(Bwe),evidence:D.array(jwe),runner:D.object({version:D.string().min(1),mode:D.literal("deterministic")}),notes:D.array(Jb).default([])}),Kq=D.object({timestamp:D.string().datetime(),event:D.literal("created"),evalRunId:D.string(),evalCaseId:D.string(),cardSlug:D.string(),patternId:tc,contract:D.string().nullable(),status:Wq}),Gq=Object.freeze(["**/auth/**","**/billing/**","**/secrets/**","**/credentials*",".env",".env.*","pnpm-lock.yaml","package-lock.json","yarn.lock",".github/workflows/**","dist/**","build/**","node_modules/**",".git/**","**/.afk/config/**","**/.afk/state/**"]);function Xq(e){let t=Qo();tp(t)||zq(t,{recursive:!0});let n=Qu(e.slug),r=Hb(e.slug),o=nc(n),i=Wwe(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=ep.parse(i);return qwe(n,c),zwe(r,np(c)),Gwe({timestamp:Jwe(),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 nc(e){if(tp(e))try{let t=Hwe(e,"utf-8"),n=JSON.parse(t),r=ep.safeParse(n);return r.success?r.data:void 0}catch{return}}function Wwe(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=Kwe(e.evidence,t.evidence),r=Vwe(e.firstSeen,t.observedAt),o=Ywe(e.lastSeen,t.observedAt),i=Xwe(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:i,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function Kwe(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 np(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(`
|
|
1983
1983
|
`)}function Gwe(e){let t=Uq.parse(e),n=Tq(),r=Qo();tp(r)||zq(r,{recursive:!0});try{iA(n,JSON.stringify(t)+`
|
|
1984
1984
|
`,{flag:"a"})}catch{}}function qwe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;iA(n,JSON.stringify(t,null,2)),Vq(n,e)}function zwe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;iA(n,t),Vq(n,e)}function Jwe(){return new Date().toISOString()}function Vwe(e,t){return e<=t?e:t}function Ywe(e,t){return e>=t?e:t}var qq={low:0,medium:1,high:2};function Xwe(e,t){return qq[e]>=qq[t]?e:t}function Qq(){let e=Qo();if(!tp(e))return[];let t=[];for(let n of Jq(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=nc(Yq(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 Yb(e){return nc(Qu(e))}function Zq(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 Qwe(e){if(e.status!=="resolved"&&e.status!=="deferred")return!1;let t=Zq(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 Zwe(e){let t=[];for(let n of e){if(!Qwe(n))continue;let r=Zq(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 ez(){let e=Qo();if(!tp(e))return[];let t=[];for(let n of Jq(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=nc(Yq(e,n));r&&t.push(r)}return Zwe(t)}import{existsSync as eSe,mkdirSync as tSe,renameSync as tz,writeFileSync as nz}from"fs";import{dirname as nSe}from"path";var Rs=class extends Error{constructor(n,r){super(r);this.code=n;this.name="TriageError"}code};function rz(e,t){let n=Qu(e),r=Hb(e),o=nc(n);if(!o)throw new Rs("card-not-found",`No failure card found for slug '${e}'`);if(t.note!==void 0&&t.note.trim().length===0)throw new Rs("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 Rs("no-change","triage requires at least --note or --status to differ from current");let l=(t.now??(()=>new Date))().toISOString(),c=s?[...o.notes,{at:l,text:i}]:o.notes,d=a?t.status:o.status,u={...o,status:d,notes:c},m=ep.parse(u);return rSe(n),oSe(n,m),iSe(r,np(m)),{slug:e,card:m,noteAdded:s,statusChanged:a?{from:o.status,to:d}:void 0,jsonPath:n,markdownPath:r}}function rSe(e){let t=nSe(e);eSe(t)||tSe(t,{recursive:!0})}function oSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;nz(n,JSON.stringify(t,null,2)),tz(n,e)}function iSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;nz(n,t),tz(n,e)}var sSe={"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(`
|
|
1985
1985
|
`),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(`
|
|
@@ -1990,7 +1990,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
|
|
|
1990
1990
|
`)}function dz(){let e=vs();if(!Xb(e))return[];let t=[];for(let n of gSe(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=uz(hSe(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 aA(e){return uz(ZR(e))}function uz(e){if(Xb(e))try{let t=fSe(e,"utf-8"),n=JSON.parse(t),r=rA.safeParse(n);return r.success?r.data:void 0}catch{return}}function bSe(e){let t=jq.parse(e),n=xq(),r=vs();Xb(r)||sz(r,{recursive:!0});try{sA(n,JSON.stringify(t)+`
|
|
1991
1991
|
`,{flag:"a"})}catch{}}function wSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;sA(n,JSON.stringify(t,null,2)),az(n,e)}function SSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;sA(n,t),az(n,e)}import{createHash as pz}from"crypto";import{existsSync as vSe,readFileSync as kSe}from"fs";var wn=class extends Error{code;constructor(t,n){super(t),this.name="EvalGenError",this.code=n}};function mz(e,t){if(!vSe(e))throw new wn(`replay-fixture: source trace not found: ${e}`,"source-not-found");let n=t.startLine??1;if(n!==1)throw new wn(`replay-fixture: only startLine=1 (prefix slice) is supported in Sprint 3 (got ${n})`,"unsupported-window");let r=kSe(e);if(r.length===0)throw new wn(`replay-fixture: source trace is empty: ${e}`,"source-empty");let o=TSe(r),i=o.length,s=-1;for(let u=0;u<o.length;u++){let m=o[u];if(m.contentEnd===m.start)continue;let f=r.subarray(m.start,m.contentEnd).toString("utf8"),g;try{g=JSON.parse(f)}catch{continue}if(g!==null&&typeof g=="object"&&"seq"in g&&typeof g.seq=="number"&&g.seq===t.endSeq){s=u+1;break}}if(s===-1)throw new wn(`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=pz("sha256").update(c).digest("hex");return{bytes:c,startLine:1,endLine:s,sliceLineCount:s,sliceSha256:d,sourceLineCount:i}}function Zb(e){return pz("sha256").update(e).digest("hex")}function TSe(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 ESe}from"crypto";import{existsSync as ew,mkdirSync as fz,readFileSync as gz,readdirSync as xSe,renameSync as lA,writeFileSync as tw}from"fs";import{join as hz,relative as RSe}from"path";q();function yz(e,t={}){let n=(t.now??(()=>new Date))(),r=ASe(n),o=t.randomSuffix!==void 0?t.randomSuffix():ESe(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 ASe(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 bz(e,t){if(t.evidenceRowIndex<0||t.evidenceRowIndex>=e.evidence.length)throw new wn(`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 wn(`buildEvalCase: evidence row ${t.evidenceRowIndex} has no eventIndices`,"seq-not-found");let r=Math.max(...n.eventIndices),i=(t.resolveTraceAbsPath??CSe)(n.tracePath),s=mz(i,{endSeq:r}),a=(t.now??(()=>new Date))().toISOString(),l=tA(t.evalCaseId),c=RSe(he(),l),d=typeof e.detail.detector=="string"?e.detail.detector:e.pattern,u=typeof e.detail.fingerprint=="string"?e.detail.fingerprint:null,m=t.proposalId??null,f={schemaVersion:1,evalCaseId:t.evalCaseId,cardSlug:e.slug,proposalId:m,title:_Se(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:ISe({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 Vb.parse(f),{evalCase:f,sliceBytes:s.bytes}}function CSe(e){return hz(he(),e)}function _Se(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 ISe(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 wz(e,t){let n=Vb.parse(e),r=Zo();ew(r)||fz(r,{recursive:!0});let o=eA(n.evalCaseId),i=tA(n.evalCaseId),s=Cq(n.evalCaseId);$Se(i,t);let a=Zb(gz(i));if(a!==n.replay.sliceSha256)throw new wn(`writeEvalCase: fixture sha256 mismatch after write (expected ${n.replay.sliceSha256}, got ${a}, path ${i})`,"fixture-mismatch");return MSe(o,n),OSe(s,nw(n)),PSe({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 nw(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(`
|
|
1992
1992
|
`)}function cA(){let e=Zo();if(!ew(e))return[];let t=[];for(let n of xSe(e)){if(!n.endsWith(".json")||n.startsWith(".")||n.endsWith(".fixture.jsonl"))continue;let r=vz(hz(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 rw(e){return vz(eA(e))}function Sz(e){return cA().filter(t=>t.cardSlug===e).map(t=>rw(t.evalCaseId)).filter(t=>t!==void 0)}function vz(e){if(ew(e))try{let t=gz(e,"utf-8"),n=JSON.parse(t),r=Vb.safeParse(n);return r.success?r.data:void 0}catch{return}}function PSe(e){let t=Hq.parse(e),n=Aq(),r=Zo();ew(r)||fz(r,{recursive:!0});try{tw(n,JSON.stringify(t)+`
|
|
1993
|
-
`,{flag:"a"})}catch{}}function MSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;tw(n,JSON.stringify(t,null,2)),lA(n,e)}function OSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;tw(n,t),lA(n,e)}function $Se(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;tw(n,t),lA(n,e)}import{randomBytes as ZSe}from"crypto";import{existsSync as gA,mkdirSync as $z,readFileSync as eve,readdirSync as
|
|
1993
|
+
`,{flag:"a"})}catch{}}function MSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;tw(n,JSON.stringify(t,null,2)),lA(n,e)}function OSe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;tw(n,t),lA(n,e)}function $Se(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;tw(n,t),lA(n,e)}import{randomBytes as ZSe}from"crypto";import{existsSync as gA,mkdirSync as $z,readFileSync as eve,readdirSync as Uft,renameSync as Dz,writeFileSync as hA}from"fs";import{join as tve}from"path";q();ca();Ik();Xg();var kz=400;function Qt(e){let n=(typeof e=="string"?e:String(e)).replace(/\s+/g," ").trim();return n.length>kz?n.slice(0,kz-1)+"\u2026":n}function Ie(e){return{name:e.name,description:e.description,status:e.status??(e.pass?"pass":"fail"),expected:Qt(e.expected),actual:Qt(e.actual)}}var rp="eval_run_probe_tool";async function DSe(){let e=la,t=0,n=async()=>(t+=1,{content:"probe-ok"}),r=new $t({handlers:new Map([[rp,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[rp]}}),o=new AbortController().signal,i=h=>({id:"eval-run-probe",name:rp,input:h,signal:o}),s={probe:"byte-identical-input"},a=[];for(let h=0;h<e-1;h++)a.push(await r.execute(i(s)));let l=t,c=await r.execute(i(s)),d=t,u=await r.execute(i({probe:"a-different-input"})),m=a.every(h=>h.isError!==!0&&h.circuitBreaker!==!0),f=[Ie({name:"executes-below-threshold",description:`First ${e-1} byte-identical calls execute without tripping`,pass:m&&l===e-1,expected:`${e-1} clean executions; handler runs ${e-1}\xD7`,actual:`${a.filter(h=>h.isError!==!0).length} clean; handler ran ${l}\xD7`}),Ie({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`}),Ie({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(rp),expected:`mentions "circuit breaker" and the tool name "${rp}"`,actual:c.content}),Ie({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 FSe(){let n=Jf(3,3);return{checks:[Ie({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}),Ie({name:"recovery-hint-present",description:"Refusal carries the recovery hint clause",pass:n.includes(Ca),expected:"contains SKILL_MAX_DEPTH_RECOVERY_HINT",actual:n}),Ie({name:"hint-directs-inline-work",description:"Hint tells the model to work inline instead of delegating further",pass:/perform the work inline/i.test(Ca)&&/skill\/agent\/compose/i.test(Ca),expected:'hint mentions "perform the work inline" and "skill/agent/compose"',actual:Ca})],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 As="tool-failure-density",Hn="flaky_tool",rc="refusal_only_tool",oc="tool-failure-flaky-tool",LSe="tool-failure-refusal-only-tool";async function NSe(){let e=Nq(),t=ec(),n=[Ie({name:"in-default-enabled-set",description:`${As} runs in a default scan`,pass:e.includes(As),expected:`defaultEnabledDetectorNames() includes "${As}"`,actual:`[${e.join(", ")}]`}),Ie({name:"not-opt-in",description:`${As} is not in the disabled-by-default set`,pass:!t.includes(As),expected:`disabledByDefaultDetectorNames() excludes "${As}"`,actual:`[${t.join(", ")}]`})],r=[{kind:"config-value",ref:"DETECTOR_REGISTRY['tool-failure-density'].enabledByDefault",detail:String(e.includes(As))}];return{checks:n,evidence:r}}function mt(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 dA(e,t){let n=`state/witness/${e}/trace.jsonl`;return Ql({sessionId:e,tracePath:n,relativeTracePath:n,content:t.join(`
|
|
1994
1994
|
`)+`
|
|
1995
1995
|
`,sessionMtimeMs:0})}function BSe(){let e=dA("tfd-sess-a",[mt(0,Hn,{isError:!1}),mt(1,Hn,{isError:!0,failureClass:"timeout"}),mt(2,Hn,{isError:!0}),mt(3,Hn,{isError:!0,failureClass:"policy-refusal"}),mt(4,Hn,{isError:!0,circuitBreaker:!0})]),t=dA("tfd-sess-b",[mt(0,Hn,{isError:!0}),mt(1,Hn,{isError:!1}),mt(2,Hn,{isError:!0,failureClass:"permission-denied"}),mt(3,Hn,{isError:!0,failureClass:"abort"}),mt(4,Hn,{isError:!0,failureClass:"hook-block"}),mt(5,Hn,{isError:!0,failureClass:"elicitation-declined"})]),n=dA("tfd-sess-c",[mt(0,rc,{isError:!1}),mt(1,rc,{isError:!0,failureClass:"policy-refusal"}),mt(2,rc,{isError:!0,failureClass:"policy-refusal"}),mt(3,rc,{isError:!0,failureClass:"permission-denied"}),mt(4,rc,{isError:!0,failureClass:"hook-block"}),mt(5,rc,{isError:!0,failureClass:"abort"})]);return[e,t,n]}function ow(e,t){let n=e[t];return typeof n=="number"?n:void 0}function uA(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 Tz(e,t){let n=uA(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 USe(e){return Array.isArray(e)?e.filter(t=>typeof t=="number"):[]}function jSe(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function HSe(){let e=BSe(),t=Zl(e,{}),n=t.find(E=>E.slug===oc),r=t.find(E=>E.slug===LSe),o=n?.detail??{},i=ow(o,"failureCount"),s=ow(o,"totalCalls"),a=ow(o,"failureRate"),l=ow(o,"affectedSessionCount"),c=uA(o.failureClassBreakdown),d=uA(o.excludedByClass),u=jSe(o.sessionIds).slice().sort(),m=USe(o.seqs),f=Zl(e,{minFailures:4}),g=Zl(e,{minFailureRate:.7}),h=!f.some(E=>E.slug===oc),y=!g.some(E=>E.slug===oc),b={"policy-refusal":1,"permission-denied":1,abort:1,"hook-block":1,"elicitation-declined":1},w={timeout:1,unclassified:2},S=[Ie({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 '${oc}' with failureCount=3, totalCalls=5, failureRate=0.6`,actual:n===void 0?`no '${oc}' card; ${t.length} card(s): [${t.map(E=>E.slug).join(", ")}]`:`${t.length} card(s); failureCount=${i}, totalCalls=${s}, failureRate=${a}`}),Ie({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:Tz(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"}`}),Ie({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(", ")}]`}),Ie({name:"classification-counts-timeout-and-unclassified",description:"timeout and unclassified (no failureClass) failures DO count toward the failure stats",pass:Tz(c,w),expected:"failureClassBreakdown={timeout:1,unclassified:2}",actual:`failureClassBreakdown=${JSON.stringify(c)}`}),Ie({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"}`}),Ie({name:"classification-reports-affected-sessions-and-seqs",description:"The card reports the distinct affected sessions and per-failure seqs in deterministic order",pass:l===2&&JSON.stringify(u)===JSON.stringify(["tfd-sess-a","tfd-sess-b"])&&JSON.stringify(m)===JSON.stringify([1,2,0]),expected:"affectedSessionCount=2; sessionIds=[tfd-sess-a,tfd-sess-b]; seqs=[1,2,0]",actual:`affectedSessionCount=${l}; sessionIds=[${u.join(",")}]; seqs=[${m.join(",")}]`})],T=[{kind:"source-symbol",ref:"src/improve/scan/detectors/tool-failure-density.ts#detectToolFailureDensity",detail:n===void 0?`synthetic corpus \u2192 ${t.length} card(s); '${oc}' 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:T}}async function WSe(){let e=await NSe(),t=HSe();return{checks:[...e.checks,...t.checks],evidence:[...e.evidence,...t.evidence]}}async function KSe(){let e=Ki("abort"),t=Ki("model_end_turn"),n=[Ie({name:"abort-closure-has-guidance",description:"An abort closure maps to a non-empty recovery hint",pass:typeof e=="string"&&e.trim().length>0,expected:"non-empty guidance string for reason=abort",actual:e===null?"null (no guidance)":Qt(e)}),Ie({name:"guidance-names-a-recovery-action",description:"The abort hint names a concrete next action (resume / re-run)",pass:e!==null&&/\b(resume|re-run|rerun|retry)\b/i.test(e),expected:"hint mentions resume / re-run",actual:e===null?"null":Qt(e)}),Ie({name:"guidance-is-the-canonical-constant",description:"The wired hint is the exported CLOSURE_ABORT_RECOVERY_HINT (no drift)",pass:e===ZT,expected:'buildClosureGuidance("abort") === CLOSURE_ABORT_RECOVERY_HINT',actual:e===null?"null":Qt(e)}),Ie({name:"benign-closure-has-no-guidance",description:"A clean model_end_turn close carries no false-positive guidance",pass:t===null,expected:"null for reason=model_end_turn",actual:t===null?"null":Qt(t)})],r=[{kind:"source-symbol",ref:"src/agent/session/closure-guidance.ts#buildClosureGuidance",detail:e===null?"null":Qt(e)},{kind:"source-symbol",ref:"src/agent/session/agent-session.ts (emitClosure: attaches guidance to closure event)",detail:"buildClosureGuidance(reason) \u2192 closure payload .guidance"}];return{checks:n,evidence:r}}var pA=Object.freeze([{id:"repeat-loop-circuit-breaker",patternId:"repeated-tool-use",title:"Repeat-loop circuit breaker trips at the consecutive-identical threshold",run:DSe},{id:"skill-max-depth-recovery-hint",patternId:"subagent-block",title:"Skill max-depth refusal carries an actionable recovery hint",run:FSe},{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:WSe},{id:"closure-abort-recovery-hint",patternId:"closure-anomaly",title:"Anomalous abort closure carries an actionable recovery hint",run:KSe}]);function Ez(e){return pA.find(t=>t.patternId===e)}function xz(){return pA.map(e=>e.patternId)}function Rz(){return pA.map(e=>e.id)}ca();Xg();var sw="replay:",Az=`${sw}fixture-reproduces-pattern`,Pz=`${sw}guardrail-neutralizes-recorded-loop`,Cz=`${sw}fixture-reproduces-closure-anomaly`,Mz=`${sw}guardrail-guides-recorded-closure`,_z="The committed fixture still reproduces the recorded repeated-tool-use loop when re-scanned by the detector",GSe=Object.freeze({replay:"byte-identical-input"}),qSe=async(e,t)=>{let n=async()=>({content:"replay-probe-ok"}),r=new $t({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:GSe,signal:o},c=await r.execute(l);if(s=a,c.circuitBreaker===!0){i=a;break}}return{trippedAtCall:i,callsDriven:s}};function iw(e){let t=e.detail.runLength;return typeof t=="number"?t:0}async function zSe(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=Ql({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=Wb([s],{minRepeats:Jr}),l=e.provenance.fingerprintAtGeneration,c=l?a.find(w=>w.detail.fingerprint===l):void 0,d=[...a].sort((w,S)=>iw(S)-iw(w))[0],u=c??d;if(u===void 0)return r.push(Ie({name:Az,description:_z,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(Ie({name:Az,description:_z,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${iw(u)}`}));let m=String(u.detail.toolName),f=iw(u),g=n.driveLoop??qSe,h=Math.min(f,la),y=await g(m,h),b=y.trippedAtCall!==null&&y.trippedAtCall<=f;return r.push(Ie({name:Pz,description:"Re-driving the recorded loop through the live guardrail trips the circuit breaker at or before the recorded length",pass:b,expected:`circuit breaker trips at call \u2264 ${f} (recorded run length)`,actual:y.trippedAtCall===null?`no trip within ${y.callsDriven} call(s) \u2014 recorded loop of ${f} would still complete`:`tripped at call ${y.trippedAtCall}`})),o.push({kind:"observed-behavior",ref:"SessionToolDispatcher.execute (repeat-loop circuit breaker)",detail:`'${m}' recorded \xD7${f}; live breaker ${y.trippedAtCall===null?"did NOT trip":`tripped at call ${y.trippedAtCall}`} (threshold ${la})`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded loop on '${m}' (run length ${f})`}),{checks:r,evidence:o}}function JSe(e){let t=e.detail.closureReason;return typeof t=="string"?t:null}function VSe(e){let t=e.detail.seqs;return Array.isArray(t)?t.filter(n=>typeof n=="number"):[]}var Iz="The committed fixture still reproduces the recorded anomalous closure when re-scanned by the detector";async function YSe(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=Ql({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=Kb([s],{minOccurrences:1}),l=Math.max(...e.replay.evidenceEventIndices),d=a.find(h=>VSe(h).includes(l))??a[0];if(d===void 0)return r.push(Ie({name:Cz,description:Iz,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=JSe(d)??"";r.push(Ie({name:Cz,description:Iz,pass:!0,expected:"detector finds \u22651 anomalous closure in the fixture",actual:`found closure.reason='${u}' (seq ${l})`}));let f=(n.buildGuidance??Ki)(u),g=f!==null&&f.trim().length>0;return r.push(Ie({name:Mz,description:"Re-driving the recorded closure reason through the live guardrail yields actionable recovery guidance",pass:g,expected:`buildClosureGuidance('${u}') returns a non-empty recovery hint`,actual:g?Qt(f):`no guidance for reason '${u}' \u2014 the recorded closure anomaly would still surface with no recovery path`})),o.push({kind:"observed-behavior",ref:"buildClosureGuidance (closure-anomaly recovery hint)",detail:`closure.reason='${u}'; live guardrail ${g?"returned a recovery hint":"returned no guidance"}`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded closure reason '${u}'`}),{checks:r,evidence:o}}var XSe=Object.freeze([{patternId:"repeated-tool-use",run:zSe},{patternId:"closure-anomaly",run:YSe}]),QSe=[Pz,Mz];function mA(e){return QSe.includes(e)}function Oz(e){return XSe.find(t=>t.patternId===e)}var nve="eval-run@v1";function Fz(e,t={}){let n=(t.now??(()=>new Date))(),r=rve(n),o=t.randomSuffix!==void 0?t.randomSuffix():ZSe(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 rve(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 Lz(e,t){let r=(t.now??(()=>new Date))().toISOString(),o=t.clockMs??(()=>Date.now()),i=o(),s=[],a=[],l=[],c=ive(e,t);s.push(c.check),c.evidence&&a.push(c.evidence);let d=Ez(e.assertion.patternId),u=null,m=!1;if(!d)l.push({at:r,text:`No deterministic validation contract is registered for pattern '${e.assertion.patternId}'. Supported: ${xz().join(", ")}.`});else{u=d.id;try{let T=await d.run();s.push(...T.checks),a.push(...T.evidence)}catch(T){m=!0;let E=T instanceof Error?T.message:String(T);l.push({at:r,text:`Contract '${d.id}' threw during execution: ${Qt(E)}`})}}let f=Oz(e.assertion.patternId),g=!1;if(f&&c.bytes!==void 0&&c.check.status==="pass")try{let T=await f.run(e,c.bytes,{...t.driveLoop?{driveLoop:t.driveLoop}:{}});s.push(...T.checks),a.push(...T.evidence),g=!0}catch(T){m=!0;let E=T instanceof Error?T.message:String(T);l.push({at:r,text:`Fixture-replay for '${e.assertion.patternId}' threw during execution: ${Qt(E)}`})}let h=s.some(T=>mA(T.name)),y=f!==void 0&&c.check.status==="pass"&&g&&!h,b=ove({hasContract:d!==void 0||g,contractThrew:m,checks:s,replayInconclusive:y}),w=Math.max(0,Math.round(o()-i)),S={schemaVersion:1,evalRunId:t.evalRunId,evalCaseId:e.evalCaseId,cardSlug:e.cardSlug,patternId:e.assertion.patternId,contract:u,status:b,createdAt:r,durationMs:w,checks:s,evidence:a,runner:{version:nve,mode:"deterministic"},notes:l};return oA.parse(S),S}function ove(e){return e.contractThrew?"error":e.checks.some(t=>t.status==="fail")?"fail":!e.hasContract||e.replayInconclusive===!0?"unsupported":"pass"}function ive(e,t){let r=(t.resolveFixtureAbsPath??(d=>tve(he(),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(!gA(r))return{check:Ie({name:i,description:s,pass:!1,expected:`fixture present at ${e.replay.fixturePath}`,actual:"fixture file not found on disk"})};let a;try{a=eve(r)}catch(d){let u=d instanceof Error?d.message:String(d);return{check:Ie({name:i,description:s,pass:!1,expected:`readable fixture (${o})`,actual:`read error: ${Qt(u)}`})}}let l=Zb(a),c=l===o;return{check:Ie({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 Nz(e){let t=oA.parse(e),n=Xl();gA(n)||$z(n,{recursive:!0});let r=Iq(t.evalRunId),o=Pq(t.evalRunId);return cve(r,t),dve(o,yA(t)),lve({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 sve={pass:"\u2713 PASS",fail:"\u2717 FAIL",unsupported:"\u2013 UNSUPPORTED",error:"\u26A0 ERROR"},ave={pass:"\u2713",fail:"\u2717",skipped:"\u2013"};function yA(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=>mA(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: ${sve[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(`| ${fA(s.name)} | ${ave[s.status]} ${s.status} | ${fA(s.expected)} | ${fA(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(`
|
|
1996
1996
|
`)}function fA(e){return e.replace(/\|/g,"\\|").replace(/\n/g," ")}function lve(e){let t=Kq.parse(e),n=Xl();gA(n)||$z(n,{recursive:!0});try{hA(_q(),JSON.stringify(t)+`
|