agent-afk 5.160.0 → 5.162.0
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/agent/subagent/completed-cache.d.ts +4 -3
- package/dist/cli/commands/interactive/task-view.d.ts +5 -0
- package/dist/cli/commands/interactive/turn-record-renderer.d.ts +9 -0
- package/dist/cli/render/compact-diff-view.d.ts +16 -0
- package/dist/cli/render/index.d.ts +3 -0
- package/dist/cli/render/tool-card.d.ts +15 -0
- package/dist/cli.mjs +584 -586
- package/dist/index.mjs +3 -3
- package/dist/telegram.mjs +3 -3
- package/dist/web-server/frontend/app-chrome.d.ts +3 -0
- package/dist/web-ui-assets/app.js +24 -24
- package/dist/web-ui-assets/index.html +2 -0
- package/dist/web-ui-assets/styles.css +47 -0
- package/package.json +1 -1
package/dist/telegram.mjs
CHANGED
|
@@ -281,7 +281,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
|
|
|
281
281
|
|
|
282
282
|
${e}`}var pG,kg=g(()=>{"use strict";pG=new Set(["script","style","noscript","template","svg"])});function gG(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function sE(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function hG(t,e){let n=t.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,e)}async function iE(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??gG,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!mG.has(u.status)||d===o)return u;let p=hG(u,i)??sE(d,s,i);O("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=sE(d,s,i);O("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var mG,aE=g(()=>{"use strict";se();mG=new Set([429,502,503,504])});import{BlockList as yG,isIP as Ag}from"node:net";import{lookup as bG}from"node:dns/promises";import{Agent as wG}from"undici";function lE(){let t=S.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function _G(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function _g(t){let e=Ag(t);return e===0?!1:kG.check(t,e===4?"ipv4":"ipv6")}async function dE(t){return bG(t,{all:!0,verbatim:!0})}async function Eg(t,e={}){if(e.allowPrivateHosts??lE())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" 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=_G(n.hostname),o=(a,c)=>`refusing to fetch ${c} \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(Ag(r)!==0)return _g(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??dE,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(_g(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function yi(t,e={}){let n=await Eg(t,e);if(!n.allowed)throw new kt(n.reason)}async function Fl(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=cE;i++){await yi(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??lE())?{dispatcher:AG}:{}},c=await iE(t,s,a,r.retry??{});if(!EG.has(c.status))return c;let l=c.headers.get("location");if(l===null||l.trim()==="")return c;let d;try{d=new URL(l,c.url||s).toString()}catch{return c}await c.body?.cancel().catch(()=>{}),s=d}throw new kt(`too many redirects (>${cE}) starting from ${e}`)}var SG,vG,kG,kt,AG,cE,EG,Tg=g(()=>{"use strict";L();aE();SG=[["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]],vG=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],kG=(()=>{let t=new yG;for(let[e,n]of SG)t.addSubnet(e,n,"ipv4");for(let[e,n]of vG)t.addSubnet(e,n,"ipv6");return t})(),kt=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};AG=new wG({connect:{lookup(t,e,n){dE(t).then(r=>{let o=r.find(i=>_g(i.address));if(o!==void 0){n(new kt(`refusing to connect to ${t} (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 s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,Ag(s.address))},r=>n(r,"",0))}}});cE=20,EG=new Set([301,302,303,307,308])});import{readFileSync as TG}from"node:fs";import{join as xG}from"path";function RG(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function uE(t,e){return RG(e).test(t)}function PG(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(IG.has(e))return!0;if(CG.has(e))return!1}return!1}function pE(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function MG(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function fE(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Tf(e),e}function OG(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function DG(t){try{return TG(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function FG(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=fE(e.defaultProfile)),n}function mE(t){let e=t?.env??S,n=t?.readFileSync??DG,r=t?.surface??e.AGENT_SURFACE,o=PG(e.AFK_BROWSER_HEADLESS,r),s=pE(e.AFK_BROWSER_ALLOWED_DOMAINS),i=pE(e.AFK_BROWSER_BLOCKED_DOMAINS),a=OG(e.AFK_BROWSER_DOM_SNAPSHOTS),c=MG(e.AFK_BROWSER_BACKEND),l=fE(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():xG(zt(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let h=FG(d,m);return h.configPath=p,h}function Ll(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if(uE(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>uE(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var IG,CG,Nl=g(()=>{"use strict";L();j();IG=new Set(["daemon","subagent","telegram","afk"]),CG=new Set(["repl","interactive","cli"])});import{existsSync as LG,readFileSync as NG}from"node:fs";import{createRequire as UG}from"node:module";import{dirname as $G,join as BG}from"node:path";function yE(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<HG&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function He(t){let e=yE(t);return hE.some(n=>e.includes(n))}function WG(){try{let e=UG(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(NG(e,"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 s=BG($G(e),o);return LG(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function bi(){return gE??=WG()??jG,gE}function xg(t){return t.includes("install chromium")}function ct(t,e){let n=yE(t),r=e?.latched===!0?` ${KG}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.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: ${bi()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${bi()}). Or pick a different tool.${r}`}function Rg(t,e,n=!1){if(!He(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
|
|
283
283
|
|
|
284
|
-
${ct(t,{headless:e,latched:n})}`,{cause:t})}var hE,jG,HG,gE,KG,Ig=g(()=>{"use strict";hE=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],jG="pnpm exec playwright install chromium",HG=4;KG="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 ur from"node:fs";import Ul from"node:path";import{randomBytes as GG}from"node:crypto";import{chromium as qG}from"playwright";function XG(){try{return"5.160.0"}catch{}try{let t=Ul.resolve(import.meta.dirname,"../../../package.json"),e=ur.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var zG,$l,bE=g(()=>{"use strict";Ig();j();se();zG=XG(),$l=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}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=qG.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Rg(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);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(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),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 e=[...this.sessions.keys()];if(await Promise.all(e.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/${zG}`}}loadStorageState(e){let n=xf(e);try{if(!ur.existsSync(n))return;let r=JSON.parse(ur.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=xf(e);if(!ur.existsSync(r))return;let o=await n.storageState(),s=Ul.join(Ul.dirname(r),`.${Ul.basename(r)}.${process.pid}.${GG(4).toString("hex")}.tmp`);ur.writeFileSync(s,JSON.stringify(o),{mode:384}),ur.chmodSync(s,384),ur.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as VG}from"crypto";function wE(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&JG.test(t.label))}function SE(t){return VG("sha256").update(t,"utf8").digest("hex").slice(0,8)}function vE(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var JG,Bl=g(()=>{"use strict";JG=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as YG}from"node:crypto";function QG(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function ZG(t,e,n){return`el_${YG("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function eq(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function kE(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AE(t,e){let n=t.role??"",r=t.name??"";_E.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])AE(s,e)}async function tq(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},EE).catch(()=>[])}async function nq(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},EE).catch(()=>[])}function rq(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function jl(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=rq(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tq(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,h]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],AE(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await nq(t)).filter(M=>_E.has(M.role??"")));let k=new Map;for(let C of p){let M=kE(C.name),q=k.get(M);(!q||q.bbox.w===0&&C.bbox.w>0)&&k.set(M,C)}let _=y.map(C=>({ax:C,dom:k.get(kE(C.name??""))})),E=r?_:_.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);E.sort((C,M)=>{let q=C.dom?.bbox.y??0,P=M.dom?.bbox.y??0;if(q!==P)return q-P;let $=C.dom?.bbox.x??0,D=M.dom?.bbox.x??0;return $-D}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=E.slice(0,n).map((C,M)=>{let q=C.ax.role??"generic",P=C.ax.name??"",$=ZG(q,P,M),D=C.dom?.bbox??{x:0,y:0,w:0,h:0},N=C.dom?.type??null,B=null;C.ax.value!==void 0&&C.ax.value!==null&&(B=String(C.ax.value)),C.ax.checked!==void 0&&(B=String(C.ax.checked)),wE({role:q,kind:N})&&(B="[redacted]");let K={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(K.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(K.selected=C.ax.selected),C.ax.expanded!==void 0&&(K.expanded=C.ax.expanded);let Q;C.dom?.testId?Q=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(Q=`#${C.dom.id}`);let Ne={id:$,role:q,label:QG(P),kind:N,value:B,state:K,bbox:D};return Q!==void 0&&(Ne.selector=Q),Ne}),I="idle";try{let C=await t.evaluate(()=>document.readyState);C==="loading"?I="loading":C==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="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=eq(f),v=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:v,url:m,title:h,textSummary:R,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var _E,EE,TE=g(()=>{"use strict";Bl();_E=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);EE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function xE(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,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}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>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 Cg(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>xE(t,s)))).filter(o=>o!==null)}async function oq(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Pg(t,e,n){switch(e.kind){case"element_id":return sq(t,e,n);case"selector":return iq(t,e);case"semantic":return aq(t,e)}}async function sq(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Cg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function iq(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Cg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function aq(t,e){return e.role!==void 0?cq(t,e.text,e.role):lq(t,e.text,e)}async function cq(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Cg(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function lq(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await oq(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await xE(y.locator,y.index);if(b!==null){let k=`${b.role}:${b.label}:${h}`,_=0;for(let E=0;E<k.length;E++)_=_*31+k.charCodeAt(E)>>>0;f.push({...b,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var RE=g(()=>{"use strict"});async function Mg(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ll(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var IE=g(()=>{"use strict";Nl()});import{randomBytes as dq}from"crypto";import{mkdir as uq,stat as pq,writeFile as fq}from"fs/promises";import{join as Og}from"path";import{gzip as mq}from"zlib";import{promisify as gq}from"util";function hq(t){return Og(It(t),"browser")}function yq(t){return Og(hq(t),"screenshots")}function bq(){return new Date().toISOString().replace(/[:.]/g,"-")}function wq(){return dq(3).toString("hex")}async function Dg(t,e,n){if(e.length>CE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${CE} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=yq(t);await uq(r,{recursive:!0});let o=`${bq()}-${wq()}-${n}.png`,s=Og(r,o);await fq(s,e);let{size:i}=await pq(s);return{path:s,bytes:i}}var Ule,CE,PE=g(()=>{"use strict";j();Bl();Ule=gq(mq);CE=5*1024*1024});var OE={};hf(OE,{PlaywrightProvider:()=>Fg});function ME(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Fg,DE=g(()=>{"use strict";bE();TE();RE();Nl();IE();PE();Fg=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new $l(e)}async open(e){let n=Ll(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await Mg(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await jl(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,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),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await jl(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,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),s=r.url(),i=e.timeoutMs??3e4,a=await Pg(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ME(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await Mg(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await jl(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,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),s;if(e.target!==void 0){let d=await Pg(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ME(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);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(e){let n=this.sessions.get(e);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(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var fr={};hf(fr,{__resetBrowserRegistryForTests:()=>Aq,browserProviderActive:()=>kq,closeBrowserProvider:()=>Lg,getBrowserProvider:()=>vq,peekBrowserProvider:()=>_q});function FE(){Promise.resolve(Lg()).then(()=>{process.exit(130)})}function LE(){Promise.resolve(Lg()).then(()=>{process.exit(143)})}function NE(){Bt=null}function Sq(){Hl||(process.on("SIGINT",FE),process.on("SIGTERM",LE),process.on("exit",NE),Hl=!0)}function UE(){Hl&&(process.removeListener("SIGINT",FE),process.removeListener("SIGTERM",LE),process.removeListener("exit",NE),Hl=!1)}async function vq(t){return Bt!==null?Bt:(pr!==null||(pr=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(DE(),OE)),n=mE(t),r=new e(n);return Sq(),Bt=r,pr=null,r})()),pr)}async function Lg(){if(Bt===null)return;let t=Bt;Bt=null,pr=null,UE(),await t.shutdown()}function kq(){return Bt!==null}function _q(){return Bt}function Aq(){Bt=null,pr=null,UE()}var Bt,pr,Hl,mr=g(()=>{"use strict";Nl();Bt=null,pr=null,Hl=!1});async function $E(t,e){try{return await nE(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Cq(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(mr(),fr));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function BE(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??Cq,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Fl(n,t,{headers:Iq,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(Rq.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(xq.test(p)&&!Tq.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await $E(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof kt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=vg({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await yi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>yi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await yi(u.finalUrl,o);let p=await $E(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=vg({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof kt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var Tq,xq,Rq,Iq,jE=g(()=>{"use strict";rE();kg();Tg();se();Tq=/(text\/html|application\/xhtml\+xml)/i,xq=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Rq=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Iq={"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 Oq(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(Pq,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Mq),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Z(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function HE(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?Oq({apiKey:t.exaApiKey,fetchFn:t.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 WE(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
284
|
+
${ct(t,{headless:e,latched:n})}`,{cause:t})}var hE,jG,HG,gE,KG,Ig=g(()=>{"use strict";hE=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],jG="pnpm exec playwright install chromium",HG=4;KG="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 ur from"node:fs";import Ul from"node:path";import{randomBytes as GG}from"node:crypto";import{chromium as qG}from"playwright";function XG(){try{return"5.162.0"}catch{}try{let t=Ul.resolve(import.meta.dirname,"../../../package.json"),e=ur.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var zG,$l,bE=g(()=>{"use strict";Ig();j();se();zG=XG(),$l=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}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=qG.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Rg(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);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(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),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 e=[...this.sessions.keys()];if(await Promise.all(e.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/${zG}`}}loadStorageState(e){let n=xf(e);try{if(!ur.existsSync(n))return;let r=JSON.parse(ur.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=xf(e);if(!ur.existsSync(r))return;let o=await n.storageState(),s=Ul.join(Ul.dirname(r),`.${Ul.basename(r)}.${process.pid}.${GG(4).toString("hex")}.tmp`);ur.writeFileSync(s,JSON.stringify(o),{mode:384}),ur.chmodSync(s,384),ur.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as VG}from"crypto";function wE(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&JG.test(t.label))}function SE(t){return VG("sha256").update(t,"utf8").digest("hex").slice(0,8)}function vE(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var JG,Bl=g(()=>{"use strict";JG=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as YG}from"node:crypto";function QG(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function ZG(t,e,n){return`el_${YG("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function eq(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function kE(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AE(t,e){let n=t.role??"",r=t.name??"";_E.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])AE(s,e)}async function tq(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},EE).catch(()=>[])}async function nq(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},EE).catch(()=>[])}function rq(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function jl(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=rq(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tq(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,h]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],AE(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await nq(t)).filter(M=>_E.has(M.role??"")));let k=new Map;for(let C of p){let M=kE(C.name),q=k.get(M);(!q||q.bbox.w===0&&C.bbox.w>0)&&k.set(M,C)}let _=y.map(C=>({ax:C,dom:k.get(kE(C.name??""))})),E=r?_:_.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);E.sort((C,M)=>{let q=C.dom?.bbox.y??0,P=M.dom?.bbox.y??0;if(q!==P)return q-P;let $=C.dom?.bbox.x??0,D=M.dom?.bbox.x??0;return $-D}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=E.slice(0,n).map((C,M)=>{let q=C.ax.role??"generic",P=C.ax.name??"",$=ZG(q,P,M),D=C.dom?.bbox??{x:0,y:0,w:0,h:0},N=C.dom?.type??null,B=null;C.ax.value!==void 0&&C.ax.value!==null&&(B=String(C.ax.value)),C.ax.checked!==void 0&&(B=String(C.ax.checked)),wE({role:q,kind:N})&&(B="[redacted]");let K={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(K.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(K.selected=C.ax.selected),C.ax.expanded!==void 0&&(K.expanded=C.ax.expanded);let Q;C.dom?.testId?Q=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(Q=`#${C.dom.id}`);let Ne={id:$,role:q,label:QG(P),kind:N,value:B,state:K,bbox:D};return Q!==void 0&&(Ne.selector=Q),Ne}),I="idle";try{let C=await t.evaluate(()=>document.readyState);C==="loading"?I="loading":C==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="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=eq(f),v=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:v,url:m,title:h,textSummary:R,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var _E,EE,TE=g(()=>{"use strict";Bl();_E=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);EE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function xE(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,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}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>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 Cg(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>xE(t,s)))).filter(o=>o!==null)}async function oq(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Pg(t,e,n){switch(e.kind){case"element_id":return sq(t,e,n);case"selector":return iq(t,e);case"semantic":return aq(t,e)}}async function sq(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Cg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function iq(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Cg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function aq(t,e){return e.role!==void 0?cq(t,e.text,e.role):lq(t,e.text,e)}async function cq(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Cg(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function lq(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await oq(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await xE(y.locator,y.index);if(b!==null){let k=`${b.role}:${b.label}:${h}`,_=0;for(let E=0;E<k.length;E++)_=_*31+k.charCodeAt(E)>>>0;f.push({...b,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var RE=g(()=>{"use strict"});async function Mg(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ll(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var IE=g(()=>{"use strict";Nl()});import{randomBytes as dq}from"crypto";import{mkdir as uq,stat as pq,writeFile as fq}from"fs/promises";import{join as Og}from"path";import{gzip as mq}from"zlib";import{promisify as gq}from"util";function hq(t){return Og(It(t),"browser")}function yq(t){return Og(hq(t),"screenshots")}function bq(){return new Date().toISOString().replace(/[:.]/g,"-")}function wq(){return dq(3).toString("hex")}async function Dg(t,e,n){if(e.length>CE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${CE} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=yq(t);await uq(r,{recursive:!0});let o=`${bq()}-${wq()}-${n}.png`,s=Og(r,o);await fq(s,e);let{size:i}=await pq(s);return{path:s,bytes:i}}var Ule,CE,PE=g(()=>{"use strict";j();Bl();Ule=gq(mq);CE=5*1024*1024});var OE={};hf(OE,{PlaywrightProvider:()=>Fg});function ME(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Fg,DE=g(()=>{"use strict";bE();TE();RE();Nl();IE();PE();Fg=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new $l(e)}async open(e){let n=Ll(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await Mg(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await jl(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,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),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await jl(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,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),s=r.url(),i=e.timeoutMs??3e4,a=await Pg(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ME(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await Mg(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await jl(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,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),s;if(e.target!==void 0){let d=await Pg(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ME(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);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(e){let n=this.sessions.get(e);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(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var fr={};hf(fr,{__resetBrowserRegistryForTests:()=>Aq,browserProviderActive:()=>kq,closeBrowserProvider:()=>Lg,getBrowserProvider:()=>vq,peekBrowserProvider:()=>_q});function FE(){Promise.resolve(Lg()).then(()=>{process.exit(130)})}function LE(){Promise.resolve(Lg()).then(()=>{process.exit(143)})}function NE(){Bt=null}function Sq(){Hl||(process.on("SIGINT",FE),process.on("SIGTERM",LE),process.on("exit",NE),Hl=!0)}function UE(){Hl&&(process.removeListener("SIGINT",FE),process.removeListener("SIGTERM",LE),process.removeListener("exit",NE),Hl=!1)}async function vq(t){return Bt!==null?Bt:(pr!==null||(pr=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(DE(),OE)),n=mE(t),r=new e(n);return Sq(),Bt=r,pr=null,r})()),pr)}async function Lg(){if(Bt===null)return;let t=Bt;Bt=null,pr=null,UE(),await t.shutdown()}function kq(){return Bt!==null}function _q(){return Bt}function Aq(){Bt=null,pr=null,UE()}var Bt,pr,Hl,mr=g(()=>{"use strict";Nl();Bt=null,pr=null,Hl=!1});async function $E(t,e){try{return await nE(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Cq(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(mr(),fr));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function BE(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??Cq,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Fl(n,t,{headers:Iq,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(Rq.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(xq.test(p)&&!Tq.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await $E(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof kt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=vg({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await yi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>yi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await yi(u.finalUrl,o);let p=await $E(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=vg({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof kt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var Tq,xq,Rq,Iq,jE=g(()=>{"use strict";rE();kg();Tg();se();Tq=/(text\/html|application\/xhtml\+xml)/i,xq=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Rq=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Iq={"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 Oq(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(Pq,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Mq),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Z(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function HE(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?Oq({apiKey:t.exaApiKey,fetchFn:t.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 WE(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
285
285
|
|
|
286
286
|
(no results)`;let n=[`# Search results for "${t}"`,""];return e.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(`
|
|
287
287
|
`).trimEnd()}var Pq,Mq,KE=g(()=>{"use strict";ht();Pq="https://api.exa.ai/search",Mq=10});function Wl(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var gr=g(()=>{"use strict";Ig()});function $q(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.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,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=Dq;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,Fq)}let a=Lq;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,Nq)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ng(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:er(t,e),truncated:!0}}function Bq(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=$q(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,c=()=>{a.abort(s.reason)},l,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",c,{once:!0}),l=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await Eg(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Fl(e,i.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:h instanceof kt?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let m=Ng(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await BE(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=Ng(oE(p.markdown,p.advisory),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof kt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=He(p)&&!xg(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${bi()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=HE({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:Uq,timeoutMs:i.timeoutMs,signal:a.signal}),f=Ng(WE(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),s.removeEventListener("abort",c)}}}var Dq,Fq,Lq,Nq,Uq,GE,qE=g(()=>{"use strict";jE();KE();Tg();bn();kg();gr();Dq=3e4,Fq=12e4,Lq=1e5,Nq=1e6,Uq=10;GE=Bq()});import{existsSync as zE,mkdirSync as jq,readFileSync as Hq,renameSync as Wq,unlinkSync as Kq,writeFileSync as Gq}from"node:fs";import{dirname as XE,join as qq}from"node:path";import{randomBytes as Xq}from"node:crypto";function hr(t){let e=t??Sf();if(!zE(e))return[];try{let n=Hq(e,"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 ${e}: ${r}`),[]}}function wi(t,e){let n=e??Sf();jq(XE(n),{recursive:!0});let r=qq(XE(n),`.schedules.json.${process.pid}.${Xq(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{Gq(r,o,"utf-8"),Wq(r,n)}catch(s){try{zE(r)&&Kq(r)}catch{}throw s}}function VE(t,e){let n=hr(e),r=n.map(c=>c.id),o=zq(t.name),s=Vq(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),wi(n,e),a}function JE(t,e){let n=hr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(wi(o,e),!0)}function YE(t,e){return hr(e).find(n=>n.id===t)}function zq(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Vq(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function QE(t){return{taskId:t.id,command:t.command,trigger:t.trigger??"cron",...t.cron!==void 0?{cronExpression:t.cron}:{},...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{},...t.notifyChat!==void 0?{notifyChat:t.notifyChat}:{}}}var ZE=g(()=>{"use strict";j()});import{existsSync as Jq,readFileSync as Yq}from"node:fs";import{join as Qq}from"node:path";async function yo(t,e,n){let r,o;try{let s=Qq(uS("default"),"port");if(!Jq(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=Yq(s,"utf-8").trim(),a=Zq(i);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let s=r.includes(":")?`[${r}]`:r,i=await fetch(`http://${s}:${o}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return i.ok?{synced:!0,detail:"synced"}:t==="POST"&&i.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&i.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${i.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function Zq(t){let e=parseInt(t,10);if(String(e)===t&&!Number.isNaN(e))return e<1||e>65535?null:{host:"localhost",port:e};let n=t.lastIndexOf(":");if(n<1)return null;let r=t.slice(0,n),o=t.slice(n+1);if(!/^\d+$/.test(o))return null;let s=parseInt(o,10);return Number.isNaN(s)||s<1||s>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:s}}var Ug,eT=g(()=>{"use strict";j();Ug="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 e2}from"node:fs";import{readFile as t2}from"node:fs/promises";var tT,nT,rT,oT,sT=g(()=>{"use strict";ZE();j();eT();tT=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;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 s=VE({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}),i=s.enabled?await yo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await yo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:Ug}})}},nT=async(t,e)=>{let n=hr();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})))}},rT=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;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,s=Ja();if(!e2(s))return{content:JSON.stringify([])};let i;try{let l=await t2(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
|
|
@@ -1156,9 +1156,9 @@ ${c}`:f,h=await u.runToResult(m);return p=NM(h,l),p}catch(f){let m=f instanceof
|
|
|
1156
1156
|
|
|
1157
1157
|
${n}`}:{...t,systemPrompt:n};if(r&&typeof r=="object"&&"type"in r&&r.type==="preset"){let o=r.append??"";return{...t,systemPrompt:{...r,append:o.length>0?`${o}
|
|
1158
1158
|
|
|
1159
|
-
${n}`:n}}}return{...t,systemPrompt:n}}var VM=g(()=>{"use strict"});function sa(){let t=S.AFK_SUBAGENT_TIMEOUT_MS;if(t===void 0||t.trim()==="")return lb;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?lb:e}function JM(){let t=S.AFK_SUBAGENT_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return db;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?db:e}var ub,pb,lb,db,ib,YM,ia=g(()=>{"use strict";L();ub=async(t,e)=>({action:"decline"}),pb=50,lb=45*6e4;db=8*6e4;ib=60*6e4,YM=5e3});function QM(t){let{options:e,id:n,resume:r,registry:o,effectiveChildModel:s,effectiveTimeoutMs:i,inheritedReadRoots:a,composedWriteRoots:c,childController:l,parentCwd:d,parentApiKey:u,parentBaseUrl:p,parentProvider:f,parentTraceWriter:m,parentSurface:h,parentCanUseTool:y}=t,b=r??(typeof e.config.systemPrompt=="string"?e.config.systemPrompt:""),k=t.workspaceStore?t.workspaceStore.queryRelevant(null,b):[],_=zM({...e.config,isSubagentFork:!0,model:s,resume:r,forkSession:r?!0:e.config.forkSession,subagentId:n,subagentToolOutputCapBytes:1e5,abortSignal:l.signal,apiKey:gP({childModel:s,configApiKey:e.config.apiKey,parentApiKey:u,parentProvider:f}),baseUrl:e.config.baseUrl??(G(s)==="openai-compatible"?void 0:p),isNonInteractive:e.config.isNonInteractive??!0,maxToolUseIterations:e.config.maxToolUseIterations??pb,softDeadlineMs:e.config.softDeadlineMs??Rd(i),autoResumeOnUsageLimit:e.config.autoResumeOnUsageLimit??!1,...e.config.parentSessionId===void 0&&e.parent.sessionId!==void 0?{parentSessionId:e.parent.sessionId}:{},...e.config.phaseRole===void 0&&e.phaseRole!==void 0?{phaseRole:e.phaseRole}:{},...e.config.cwd===void 0&&d!==void 0?{cwd:d}:{},...a!==void 0?{readRoots:a}:{},...c!==void 0?{writeRoots:c}:{},...e.config.traceWriter===void 0&&m!==void 0?{traceWriter:m}:{},...e.config.surface===void 0&&h!==void 0?{surface:h}:{},hookRegistry:o,permissionBubbler:e.config.permissionBubbler??(y!==void 0&&e.config.canUseTool===void 0?{canUseTool:y}:void 0),...e.denyElicitations===!1?{}:{onElicitation:ub},...e.phaseRole==="read-only"?{provider:XM("read-only",s)}:{}});return t.workspaceStore?dm(_,k):_}var ZM=g(()=>{"use strict";ue();Tt();bn();Su();VM();zn();ia();_n()});function eO(t){let{effectiveTraceWriter:e,id:n,parentSessionId:r,rootId:o,effectiveChildModel:s,childConfig:i,promptHead:a,effectiveAgentType:c,effectiveResolvedAgentType:l}=t,d=typeof s=="string"?s:JSON.stringify(s);return Qn(e,{transition:"started",subagentId:n,parentId:r??o,model:d,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{},...a&&a.trim()!==""?{promptHead:a.slice(0,80)}:{},...c?{agentType:c}:{},...l?{resolvedAgentType:l}:{}}),d}async function tO(t){let{modelString:e,id:n,idPrefix:r,parentSessionId:o,effectiveResolvedAgentType:s}=t;await te({event:"subagent.dispatched",subagent_id:n,id_prefix:r,model:e,parent_session_id:o,resolved_agent_type:s})}var nO=g(()=>{"use strict";V();vt()});function aa(t,e=Date.now()){if(t.type==="paused")return t.resetsAt===void 0?void 0:t.resetsAt.getTime()-e+3e4;if(t.type==="rate_limit"){let n=t.retryAfterMs;return typeof n!="number"||!Number.isFinite(n)||n<=0?void 0:n+3e4}}function rO(t){if(t.type==="paused"){let e=t.resetsAt!==void 0?t.resetsAt.toISOString():"unknown";return`paused (${t.reason}, resetsAt=${e})`}if(t.type==="rate_limit"){let e=t.retryAfterMs;return`rate_limit (retryAfterMs=${typeof e=="number"?e:"unknown"})`}}var fb=g(()=>{"use strict"});var mb,a5,Xu,oO=g(()=>{"use strict";fb();mb=120*6e4,a5=1e3,Xu=class{constructor(e,n=mb,r){this.baseTimeoutMs=e;this.maxExtensionMs=n;this.onGrant=r}baseTimeoutMs;maxExtensionMs;pauseStartedAtMs;pauseWindowCapMs=0;closedCreditMs=0;lastPauseDescription;grantedMs=0;grantCount=0;onGrant;onEvent(e){if(e.type==="resumed"){this.closePause();return}if(e.type!=="paused"&&e.type!=="rate_limit")return;this.closeExpiredPause();let n=aa(e);if(n===void 0||n<=0)return;let r=Date.now();if(this.pauseStartedAtMs===void 0)this.pauseStartedAtMs=r,this.pauseWindowCapMs=n;else{let o=r-this.pauseStartedAtMs;this.pauseWindowCapMs=Math.max(this.pauseWindowCapMs,o+n)}this.lastPauseDescription=rO(e)}openPauseCreditMs(){if(this.pauseStartedAtMs===void 0)return 0;let e=Date.now()-this.pauseStartedAtMs;return Math.max(0,Math.min(e,this.pauseWindowCapMs))}closePause(){this.pauseStartedAtMs!==void 0&&(this.closedCreditMs+=this.openPauseCreditMs(),this.pauseStartedAtMs=void 0,this.pauseWindowCapMs=0)}closeExpiredPause(){this.pauseStartedAtMs!==void 0&&Date.now()-this.pauseStartedAtMs>=this.pauseWindowCapMs&&this.closePause()}onDeadline(){let e=this.maxExtensionMs-this.grantedMs;if(!(e>0))return 0;this.closeExpiredPause();let r=this.closedCreditMs+this.openPauseCreditMs()-this.grantedMs;if(r<=0)return 0;let o=Math.min(Math.max(r,a5),e);if(this.grantedMs+=o,this.grantCount+=1,this.onGrant)try{this.onGrant({grantMs:o,totalGrantedMs:this.grantedMs,remainingCapMs:this.maxExtensionMs-this.grantedMs,grantCount:this.grantCount,pauseDescription:this.lastPauseDescription})}catch{}return o}describe(){if(this.lastPauseDescription===void 0)return;let e=[`base budget ${this.baseTimeoutMs}ms`,`pause extension granted ${this.grantedMs}ms across ${this.grantCount} extension${this.grantCount===1?"":"s"} (cap ${this.maxExtensionMs}ms${this.grantedMs>=this.maxExtensionMs?", EXHAUSTED":""})`,`last provider pause: ${this.lastPauseDescription}`];if(this.pauseStartedAtMs!==void 0){let r=Date.now()-this.pauseStartedAtMs>=this.pauseWindowCapMs?"expired":"still open";e.push(`last pause ${r}, opened ${new Date(this.pauseStartedAtMs).toISOString()} (reported window ${this.pauseWindowCapMs}ms)`)}return`[pause-aware ceiling: ${e.join("; ")}]`}get totalGrantedMs(){return this.grantedMs}}});var zu,sO=g(()=>{"use strict";re();fb();zu=class{constructor(e,n,r,o){this.controller=e;this.idleTimeoutMs=n;this.label=r;this.onFire=o;this.isEnabled()&&this.arm(this.idleTimeoutMs,"none")}controller;idleTimeoutMs;label;onFire;timer;disposed=!1;fired=!1;inFlightTools=new Set;isEnabled(){return Number.isFinite(this.idleTimeoutMs)&&this.idleTimeoutMs>0}onEvent(e){if(!(!this.isEnabled()||this.disposed||this.fired)){if(e.type==="chunk"){if(e.chunk.type==="tool_use_detail"){this.inFlightTools.add(e.chunk.toolUseId),this.clearTimer();return}if(e.chunk.type==="tool_result"){this.inFlightTools.delete(e.chunk.toolUseId),this.inFlightTools.size===0&&this.arm(this.idleTimeoutMs,e.chunk.type);return}}if(!(this.inFlightTools.size>0)){if(e.type==="paused"){this.arm(this.pausedWindowMs(e),e.type);return}if(e.type==="rate_limit"){let n=aa(e);if(n!==void 0&&n>0){this.arm(n,e.type);return}}this.arm(this.idleTimeoutMs,e.type)}}}pausedWindowMs(e){let n=aa(e);return n===void 0?this.idleTimeoutMs:Math.max(this.idleTimeoutMs,n)}arm(e,n){this.timer!==void 0&&clearTimeout(this.timer);let r=e>0?e:this.idleTimeoutMs,o=Date.now(),s=setTimeout(()=>{this.fire(Date.now()-o,n)},r);s.unref(),this.timer=s}clearTimer(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0)}fire(e,n){if(!(this.fired||this.disposed)){this.fired=!0,this.timer=void 0;try{this.onFire?.({idleTimeoutMs:this.idleTimeoutMs,elapsedSinceLastProgressMs:e,lastEventType:n})}catch{}this.controller.signal.aborted||this.controller.abort(new Oc(`subagent ${this.label} idle-watchdog fired: no observable progress for ${this.idleTimeoutMs}ms (last event: ${n}). The child stream produced no output for the idle window \u2014 typically a stalled model call under provider throttling with no detectable backoff bracket. Aborting so partial output (if any) is returned; the parent should retry or fall back.`,this.idleTimeoutMs))}}dispose(){this.disposed||(this.disposed=!0,this.inFlightTools.clear(),this.clearTimer())}}});function iO(t,e){let n=e.length,r=n>0?`subagent ${t} stream cut off after ${n} tool result(s); see partialOutput.`:`subagent ${t} produced no output \u2014 stream ended without a terminal message (stream_incomplete). No findings were produced; retry or fall back.`,o=new nt(r);return n>0&&(o.toolResultsGathered=n),o}function aO(t,e){if(e.length===0)return;let n=e.reduce((s,i)=>s+(i.sizeBytes??0),0),r=e.filter(s=>s.isError).length,o=r>0?` (${r} errored)`:"";return`[Stream cut off before any assistant text was produced. Subagent ${t} completed ${e.length} tool result(s)${o} (~${n} bytes total) before the cut. The run is failed \u2014 no final answer was produced \u2014 but tool evidence is available via result.trace for recovery or retry decisions.]`}var cO=g(()=>{"use strict";re()});async function lO(t,e,n){let r,o;t._lastStreamedContent="",t._currentTrace=Xo();let s=n??t._progressSink??At(),i={subagentId:t.id,...t._parentId!==void 0&&{parentId:t._parentId},...t._agentType!==void 0&&{agentType:t._agentType}},a=new zu(t._controller,t._idleTimeoutMs,t.id,c=>{W(t._traceWriter,{phase:"idle_watchdog_fired",metadata:{idleTimeoutMs:c.idleTimeoutMs,elapsedSinceLastProgressMs:c.elapsedSinceLastProgressMs,lastEventType:c.lastEventType}})});try{for await(let c of t.session.sendMessageStream(e)){if(s&&s(c,i),t._logWriter?.write(c),a.onEvent(c),t._pauseCeiling?.onEvent(c),c.type==="chunk"){let l=c.chunk;l.type==="content"?t._lastStreamedContent+=l.content:l.type==="tool_use_detail"?t._currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?t._currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(t._currentTrace.thinkingPresent=!0)}if(c.type==="message")r=c.message,t._currentTrace.turnCount++;else if(c.type==="error"){o=c.error;break}else if(c.type==="done"){if(typeof c.metadata?.stopReason=="string"&&(t._lastStopReason=c.metadata.stopReason),typeof c.metadata?.usage=="object"&&c.metadata.usage!==null){let l=c.metadata.usage;t._currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}}finally{a.dispose()}if(o)throw o;if(r)return r;if(t._lastStreamedContent.length>0)return t._lastStopReason??=Go,{role:"assistant",content:t._lastStreamedContent,timestamp:new Date};if(t._lastStopReason===Et||t._lastStopReason===_t){let c=t._lastStopReason===Et?"tool-use iteration cap":"wall-clock budget";return{role:"assistant",content:`[subagent ${t.id} reached its ${c} before producing a final message; returning a partial result]`,timestamp:new Date}}throw t._controller.signal.aborted||t._currentStatus==="cancelled"?new Error(`Subagent ${t.id} produced no terminal message`):(t._lastStopReason=Go,iO(t.id,t._currentTrace.toolResults))}async function dO(t,e,n){try{let r=await t.run(e,n);return nM(t.id,t._currentStatus,r,t._outputSchema,t._currentTrace,t._lastStopReason)}catch(r){let o=Lu(t.id,t._currentStatus,r,t._currentTrace,t._lastStopReason);if(t._lastStreamedContent.length>0)o.partialOutput=t._lastStreamedContent;else if(r instanceof nt){let s=aO(t.id,t._currentTrace.toolResults);s!==void 0&&(o.partialOutput=s)}return o}}function uO(t,e,n,r){let o;if(r){let s=t._progressSink??At();o=(i,a)=>{r(i),s?.(i,a)}}t.runToResult(e,o).then(s=>{n?.(s)}).catch(s=>{O("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async function gb(t,e,n){if(t._stopDispatched){t._onTerminal();return}t._stopDispatched=!0;let r=await wk(t._hookRegistry,{event:"SubagentStop",subagentId:t.id,status:e,lastMessage:t._lastMessage,agentType:t._agentType,durationMs:t._lastDurationMs,trace:t._currentTrace},t._traceWriter?{traceWriter:t._traceWriter}:{});if(r.injectContext){if(t._parentAbortSignal?.aborted)O(`Skipping SubagentStop injectContext for ${t.id}: parent is aborted`);else if(n?.deferInjectContextToCaller)t._lastStopInjectContext=r.injectContext;else if(t._parentInputStreamRef)try{let o=t._parentInputStreamRef;o.queueFrameworkContext?o.queueFrameworkContext(r.injectContext):o.pushUserMessage(r.injectContext)}catch(o){O(`Failed to inject context from SubagentStop handler: ${String(o)}`)}}t._onTerminal()}var pO=g(()=>{"use strict";se();re();kr();Jc();V();sO();Lo();_n();_e();cO()});var Vu,fO=g(()=>{"use strict";re();Ch();V();oO();_e();pO();Vu=class{constructor(e,n,r,o,s,i,a,c,l,d,u,p,f,m,h,y=0){this.id=e;this.session=n;this._controller=r;this.abortGraph=o;this._outputSchema=s;this.timeoutMs=i;this._hookRegistry=a;this._onTerminal=c;this._parentInputStreamRef=l;this._parentAbortSignal=d;this._agentType=u;this._traceWriter=m;this.onSubagentSucceeded=h;this._idleTimeoutMs=y;this._progressSink=p,this._parentId=f}id;session;_controller;abortGraph;_outputSchema;timeoutMs;_hookRegistry;_onTerminal;_parentInputStreamRef;_parentAbortSignal;_agentType;_traceWriter;onSubagentSucceeded;_idleTimeoutMs;_currentStatus="idle";inFlight=null;_lastMessage;_lastDurationMs;latestTerminalStatus;_stopDispatched=!1;_lastStopInjectContext;_progressSink;_parentId;_currentTrace=Xo();_lastStreamedContent="";_pauseCeiling;_lastStopReason;_logWriter;get status(){return this._currentStatus}async run(e,n){if(this._currentStatus==="running")throw new Error(`Subagent ${this.id} is already running`);if(this._lastStopReason=void 0,this._currentStatus==="cancelled")throw new Error(`Subagent ${this.id} is cancelled`);this._currentStatus="running";let r=Date.now(),o=Number.isFinite(this.timeoutMs)&&this.timeoutMs>0?new Xu(this.timeoutMs,mb,i=>{W(this._traceWriter,{phase:"pause_extension_granted",metadata:{subagentId:this.id,grantMs:i.grantMs,totalGrantedMs:i.totalGrantedMs,remainingCapMs:i.remainingCapMs,grantCount:i.grantCount,...i.pauseDescription!==void 0&&{pauseDescription:i.pauseDescription}}})}):void 0;this._pauseCeiling=o;let s=Ed(lO(this,e,n),this.timeoutMs,{controller:this._controller,label:this.id,...o!==void 0&&{extender:o}});this.inFlight=s;try{let i=await s;this._lastMessage=i.content,this._lastDurationMs=Date.now()-r,this._currentStatus="succeeded",this.latestTerminalStatus="succeeded",await Qn(this._traceWriter,{transition:"succeeded",subagentId:this.id,durationMs:this._lastDurationMs,turnCount:this._currentTrace.turnCount,outputBytes:Buffer.byteLength(this._lastMessage,"utf8"),...this._lastStopReason!==void 0&&{stopReason:this._lastStopReason}});let a=typeof i.metadata?.totalCostUsd=="number"?i.metadata.totalCostUsd:void 0;return this.onSubagentSucceeded?.(this._currentTrace.usage,a),this._onTerminal(),i}catch(i){this._lastDurationMs=Date.now()-r;let a=this._controller.signal.aborted&&this._controller.signal.reason instanceof Ee&&!this.abortGraph.isCascading(this.id)?this._controller.signal.reason:void 0,c=a??i;if(this._currentStatus!=="cancelled")if(this._controller.signal.aborted&&a===void 0){let l=this._controller.signal.reason instanceof Ee;await Qn(this._traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade",...l?{timeout:!0}:{}}),this._currentStatus="cancelled",this.latestTerminalStatus="cancelled"}else await Qn(this._traceWriter,{transition:"failed",subagentId:this.id,errorClass:c instanceof Error?c.constructor.name:"Unknown",errorMessage:c instanceof Error?c.message:String(c),partialOutputBytes:Buffer.byteLength(this._lastStreamedContent,"utf8"),...a!==void 0?{failureClass:"timeout"}:{}}),this._currentStatus="failed",this.latestTerminalStatus="failed";throw this._onTerminal(),c}finally{this.inFlight=null}}async runToResult(e,n){return dO(this,e,n)}runInBackground(e,n,r){return uO(this,e,n,r)}async cancel(){if(this._currentStatus==="cancelled"||this._stopDispatched)return;let e=this.latestTerminalStatus??"cancelled";this._currentStatus="cancelled",Qn(this._traceWriter,{transition:"cancelled",subagentId:this.id,source:"explicit"});try{this.abortGraph.abort(this.id,"cancelled")}catch{}try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await gb(this,e)}}async teardown(e){if(this._stopDispatched)return;let n=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await gb(this,n,e)}}getLastStopInjectContext(){return this._lastStopInjectContext}}});function mO(t){return Gd(Mt(t))}function gO(t,e){return t===void 0||!mO(t)||G(t)!=="openai-compatible"?{model:t}:e===void 0||mO(e)||G(e)!=="openai-compatible"?{model:t}:{model:e,coercedFrom:t}}var hO=g(()=>{"use strict";ue();qd();Ce()});function yO(t){let{options:e,counter:n,managerHookRegistry:r,parentTraceWriter:o,parentModel:s}=t,i=`${e.idPrefix??"subagent"}-${Date.now()}-${n}`,a=e.parent.sessionId,c=e.config.hookRegistry??r??e.parent.hookRegistry,l=e.config.traceWriter??o,d=gO(e.config.model,s),u=d.model??e.config.model,p=e.config.timeoutMs??sa();return{id:i,resume:a,registry:c,effectiveTraceWriter:l,effectiveChildModel:u,coercedFrom:d.coercedFrom,effectiveTimeoutMs:p}}var bO=g(()=>{"use strict";hO();ia()});var Ju,wO=g(()=>{"use strict";Ju=class{entries=new Map;capacity;constructor(e=30){this.capacity=Math.max(1,e)}add(e,n,r){this.entries.delete(e),this.entries.set(e,{handle:n,result:r,completedAt:Date.now()}),this.evictIfNeeded()}get(e){return this.entries.get(e)}list(){return[...this.entries.values()].reverse()}get size(){return this.entries.size}delete(e){return this.entries.delete(e)}clear(){this.entries.clear()}evictIfNeeded(){for(;this.entries.size>this.capacity;){let e=this.entries.keys().next().value;if(e!==void 0)this.entries.delete(e);else break}}}});import*as Jo from"node:fs";var SO,ca,vO=g(()=>{"use strict";L();j();SO=1048576,ca=class{constructor(e,n){this.sessionLabel=e;this.subagentId=n;this.logPath=SS(e,n);try{Jo.mkdirSync(Ef(e),{recursive:!0})}catch{this.errored=!0}}sessionLabel;subagentId;logPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;bytesWritten=0;static isEnabled(){return S.AFK_SUBAGENT_LOG!=="0"}write(e){if(this.errored||this.closed||this.bytesWritten>=SO)return;let n=JSON.stringify(e)+`
|
|
1159
|
+
${n}`:n}}}return{...t,systemPrompt:n}}var VM=g(()=>{"use strict"});function sa(){let t=S.AFK_SUBAGENT_TIMEOUT_MS;if(t===void 0||t.trim()==="")return lb;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?lb:e}function JM(){let t=S.AFK_SUBAGENT_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return db;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?db:e}var ub,pb,lb,db,ib,YM,ia=g(()=>{"use strict";L();ub=async(t,e)=>({action:"decline"}),pb=50,lb=45*6e4;db=8*6e4;ib=60*6e4,YM=5e3});function QM(t){let{options:e,id:n,resume:r,registry:o,effectiveChildModel:s,effectiveTimeoutMs:i,inheritedReadRoots:a,composedWriteRoots:c,childController:l,parentCwd:d,parentApiKey:u,parentBaseUrl:p,parentProvider:f,parentTraceWriter:m,parentSurface:h,parentCanUseTool:y}=t,b=r??(typeof e.config.systemPrompt=="string"?e.config.systemPrompt:""),k=t.workspaceStore?t.workspaceStore.queryRelevant(null,b):[],_=zM({...e.config,isSubagentFork:!0,model:s,resume:r,forkSession:r?!0:e.config.forkSession,subagentId:n,subagentToolOutputCapBytes:1e5,abortSignal:l.signal,apiKey:gP({childModel:s,configApiKey:e.config.apiKey,parentApiKey:u,parentProvider:f}),baseUrl:e.config.baseUrl??(G(s)==="openai-compatible"?void 0:p),isNonInteractive:e.config.isNonInteractive??!0,maxToolUseIterations:e.config.maxToolUseIterations??pb,softDeadlineMs:e.config.softDeadlineMs??Rd(i),autoResumeOnUsageLimit:e.config.autoResumeOnUsageLimit??!1,...e.config.parentSessionId===void 0&&e.parent.sessionId!==void 0?{parentSessionId:e.parent.sessionId}:{},...e.config.phaseRole===void 0&&e.phaseRole!==void 0?{phaseRole:e.phaseRole}:{},...e.config.cwd===void 0&&d!==void 0?{cwd:d}:{},...a!==void 0?{readRoots:a}:{},...c!==void 0?{writeRoots:c}:{},...e.config.traceWriter===void 0&&m!==void 0?{traceWriter:m}:{},...e.config.surface===void 0&&h!==void 0?{surface:h}:{},hookRegistry:o,permissionBubbler:e.config.permissionBubbler??(y!==void 0&&e.config.canUseTool===void 0?{canUseTool:y}:void 0),...e.denyElicitations===!1?{}:{onElicitation:ub},...e.phaseRole==="read-only"?{provider:XM("read-only",s)}:{}});return t.workspaceStore?dm(_,k):_}var ZM=g(()=>{"use strict";ue();Tt();bn();Su();VM();zn();ia();_n()});function eO(t){let{effectiveTraceWriter:e,id:n,parentSessionId:r,rootId:o,effectiveChildModel:s,childConfig:i,promptHead:a,effectiveAgentType:c,effectiveResolvedAgentType:l}=t,d=typeof s=="string"?s:JSON.stringify(s);return Qn(e,{transition:"started",subagentId:n,parentId:r??o,model:d,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{},...a&&a.trim()!==""?{promptHead:a.slice(0,80)}:{},...c?{agentType:c}:{},...l?{resolvedAgentType:l}:{}}),d}async function tO(t){let{modelString:e,id:n,idPrefix:r,parentSessionId:o,effectiveResolvedAgentType:s}=t;await te({event:"subagent.dispatched",subagent_id:n,id_prefix:r,model:e,parent_session_id:o,resolved_agent_type:s})}var nO=g(()=>{"use strict";V();vt()});function aa(t,e=Date.now()){if(t.type==="paused")return t.resetsAt===void 0?void 0:t.resetsAt.getTime()-e+3e4;if(t.type==="rate_limit"){let n=t.retryAfterMs;return typeof n!="number"||!Number.isFinite(n)||n<=0?void 0:n+3e4}}function rO(t){if(t.type==="paused"){let e=t.resetsAt!==void 0?t.resetsAt.toISOString():"unknown";return`paused (${t.reason}, resetsAt=${e})`}if(t.type==="rate_limit"){let e=t.retryAfterMs;return`rate_limit (retryAfterMs=${typeof e=="number"?e:"unknown"})`}}var fb=g(()=>{"use strict"});var mb,a5,Xu,oO=g(()=>{"use strict";fb();mb=120*6e4,a5=1e3,Xu=class{constructor(e,n=mb,r){this.baseTimeoutMs=e;this.maxExtensionMs=n;this.onGrant=r}baseTimeoutMs;maxExtensionMs;pauseStartedAtMs;pauseWindowCapMs=0;closedCreditMs=0;lastPauseDescription;grantedMs=0;grantCount=0;onGrant;onEvent(e){if(e.type==="resumed"){this.closePause();return}if(e.type!=="paused"&&e.type!=="rate_limit")return;this.closeExpiredPause();let n=aa(e);if(n===void 0||n<=0)return;let r=Date.now();if(this.pauseStartedAtMs===void 0)this.pauseStartedAtMs=r,this.pauseWindowCapMs=n;else{let o=r-this.pauseStartedAtMs;this.pauseWindowCapMs=Math.max(this.pauseWindowCapMs,o+n)}this.lastPauseDescription=rO(e)}openPauseCreditMs(){if(this.pauseStartedAtMs===void 0)return 0;let e=Date.now()-this.pauseStartedAtMs;return Math.max(0,Math.min(e,this.pauseWindowCapMs))}closePause(){this.pauseStartedAtMs!==void 0&&(this.closedCreditMs+=this.openPauseCreditMs(),this.pauseStartedAtMs=void 0,this.pauseWindowCapMs=0)}closeExpiredPause(){this.pauseStartedAtMs!==void 0&&Date.now()-this.pauseStartedAtMs>=this.pauseWindowCapMs&&this.closePause()}onDeadline(){let e=this.maxExtensionMs-this.grantedMs;if(!(e>0))return 0;this.closeExpiredPause();let r=this.closedCreditMs+this.openPauseCreditMs()-this.grantedMs;if(r<=0)return 0;let o=Math.min(Math.max(r,a5),e);if(this.grantedMs+=o,this.grantCount+=1,this.onGrant)try{this.onGrant({grantMs:o,totalGrantedMs:this.grantedMs,remainingCapMs:this.maxExtensionMs-this.grantedMs,grantCount:this.grantCount,pauseDescription:this.lastPauseDescription})}catch{}return o}describe(){if(this.lastPauseDescription===void 0)return;let e=[`base budget ${this.baseTimeoutMs}ms`,`pause extension granted ${this.grantedMs}ms across ${this.grantCount} extension${this.grantCount===1?"":"s"} (cap ${this.maxExtensionMs}ms${this.grantedMs>=this.maxExtensionMs?", EXHAUSTED":""})`,`last provider pause: ${this.lastPauseDescription}`];if(this.pauseStartedAtMs!==void 0){let r=Date.now()-this.pauseStartedAtMs>=this.pauseWindowCapMs?"expired":"still open";e.push(`last pause ${r}, opened ${new Date(this.pauseStartedAtMs).toISOString()} (reported window ${this.pauseWindowCapMs}ms)`)}return`[pause-aware ceiling: ${e.join("; ")}]`}get totalGrantedMs(){return this.grantedMs}}});var zu,sO=g(()=>{"use strict";re();fb();zu=class{constructor(e,n,r,o){this.controller=e;this.idleTimeoutMs=n;this.label=r;this.onFire=o;this.isEnabled()&&this.arm(this.idleTimeoutMs,"none")}controller;idleTimeoutMs;label;onFire;timer;disposed=!1;fired=!1;inFlightTools=new Set;isEnabled(){return Number.isFinite(this.idleTimeoutMs)&&this.idleTimeoutMs>0}onEvent(e){if(!(!this.isEnabled()||this.disposed||this.fired)){if(e.type==="chunk"){if(e.chunk.type==="tool_use_detail"){this.inFlightTools.add(e.chunk.toolUseId),this.clearTimer();return}if(e.chunk.type==="tool_result"){this.inFlightTools.delete(e.chunk.toolUseId),this.inFlightTools.size===0&&this.arm(this.idleTimeoutMs,e.chunk.type);return}}if(!(this.inFlightTools.size>0)){if(e.type==="paused"){this.arm(this.pausedWindowMs(e),e.type);return}if(e.type==="rate_limit"){let n=aa(e);if(n!==void 0&&n>0){this.arm(n,e.type);return}}this.arm(this.idleTimeoutMs,e.type)}}}pausedWindowMs(e){let n=aa(e);return n===void 0?this.idleTimeoutMs:Math.max(this.idleTimeoutMs,n)}arm(e,n){this.timer!==void 0&&clearTimeout(this.timer);let r=e>0?e:this.idleTimeoutMs,o=Date.now(),s=setTimeout(()=>{this.fire(Date.now()-o,n)},r);s.unref(),this.timer=s}clearTimer(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0)}fire(e,n){if(!(this.fired||this.disposed)){this.fired=!0,this.timer=void 0;try{this.onFire?.({idleTimeoutMs:this.idleTimeoutMs,elapsedSinceLastProgressMs:e,lastEventType:n})}catch{}this.controller.signal.aborted||this.controller.abort(new Oc(`subagent ${this.label} idle-watchdog fired: no observable progress for ${this.idleTimeoutMs}ms (last event: ${n}). The child stream produced no output for the idle window \u2014 typically a stalled model call under provider throttling with no detectable backoff bracket. Aborting so partial output (if any) is returned; the parent should retry or fall back.`,this.idleTimeoutMs))}}dispose(){this.disposed||(this.disposed=!0,this.inFlightTools.clear(),this.clearTimer())}}});function iO(t,e){let n=e.length,r=n>0?`subagent ${t} stream cut off after ${n} tool result(s); see partialOutput.`:`subagent ${t} produced no output \u2014 stream ended without a terminal message (stream_incomplete). No findings were produced; retry or fall back.`,o=new nt(r);return n>0&&(o.toolResultsGathered=n),o}function aO(t,e){if(e.length===0)return;let n=e.reduce((s,i)=>s+(i.sizeBytes??0),0),r=e.filter(s=>s.isError).length,o=r>0?` (${r} errored)`:"";return`[Stream cut off before any assistant text was produced. Subagent ${t} completed ${e.length} tool result(s)${o} (~${n} bytes total) before the cut. The run is failed \u2014 no final answer was produced \u2014 but tool evidence is available via result.trace for recovery or retry decisions.]`}var cO=g(()=>{"use strict";re()});async function lO(t,e,n){let r,o;t._lastStreamedContent="",t._currentTrace=Xo();let s=n??t._progressSink??At(),i={subagentId:t.id,...t._parentId!==void 0&&{parentId:t._parentId},...t._agentType!==void 0&&{agentType:t._agentType}},a=new zu(t._controller,t._idleTimeoutMs,t.id,c=>{W(t._traceWriter,{phase:"idle_watchdog_fired",metadata:{idleTimeoutMs:c.idleTimeoutMs,elapsedSinceLastProgressMs:c.elapsedSinceLastProgressMs,lastEventType:c.lastEventType}})});try{for await(let c of t.session.sendMessageStream(e)){if(s&&s(c,i),t._logWriter?.write(c),a.onEvent(c),t._pauseCeiling?.onEvent(c),c.type==="chunk"){let l=c.chunk;l.type==="content"?t._lastStreamedContent+=l.content:l.type==="tool_use_detail"?t._currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?t._currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(t._currentTrace.thinkingPresent=!0)}if(c.type==="message")r=c.message,t._currentTrace.turnCount++;else if(c.type==="error"){o=c.error;break}else if(c.type==="done"){if(typeof c.metadata?.stopReason=="string"&&(t._lastStopReason=c.metadata.stopReason),typeof c.metadata?.usage=="object"&&c.metadata.usage!==null){let l=c.metadata.usage;t._currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}}finally{a.dispose()}if(o)throw o;if(r)return r;if(t._lastStreamedContent.length>0)return t._lastStopReason??=Go,{role:"assistant",content:t._lastStreamedContent,timestamp:new Date};if(t._lastStopReason===Et||t._lastStopReason===_t){let c=t._lastStopReason===Et?"tool-use iteration cap":"wall-clock budget";return{role:"assistant",content:`[subagent ${t.id} reached its ${c} before producing a final message; returning a partial result]`,timestamp:new Date}}throw t._controller.signal.aborted||t._currentStatus==="cancelled"?new Error(`Subagent ${t.id} produced no terminal message`):(t._lastStopReason=Go,iO(t.id,t._currentTrace.toolResults))}async function dO(t,e,n){try{let r=await t.run(e,n);return nM(t.id,t._currentStatus,r,t._outputSchema,t._currentTrace,t._lastStopReason)}catch(r){let o=Lu(t.id,t._currentStatus,r,t._currentTrace,t._lastStopReason);if(t._lastStreamedContent.length>0)o.partialOutput=t._lastStreamedContent;else if(r instanceof nt){let s=aO(t.id,t._currentTrace.toolResults);s!==void 0&&(o.partialOutput=s)}return o}}function uO(t,e,n,r){let o;if(r){let s=t._progressSink??At();o=(i,a)=>{r(i),s?.(i,a)}}t.runToResult(e,o).then(s=>{n?.(s)}).catch(s=>{O("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async function gb(t,e,n){if(t._stopDispatched){t._onTerminal();return}t._stopDispatched=!0;let r=await wk(t._hookRegistry,{event:"SubagentStop",subagentId:t.id,status:e,lastMessage:t._lastMessage,agentType:t._agentType,durationMs:t._lastDurationMs,trace:t._currentTrace},t._traceWriter?{traceWriter:t._traceWriter}:{});if(r.injectContext){if(t._parentAbortSignal?.aborted)O(`Skipping SubagentStop injectContext for ${t.id}: parent is aborted`);else if(n?.deferInjectContextToCaller)t._lastStopInjectContext=r.injectContext;else if(t._parentInputStreamRef)try{let o=t._parentInputStreamRef;o.queueFrameworkContext?o.queueFrameworkContext(r.injectContext):o.pushUserMessage(r.injectContext)}catch(o){O(`Failed to inject context from SubagentStop handler: ${String(o)}`)}}t._onTerminal()}var pO=g(()=>{"use strict";se();re();kr();Jc();V();sO();Lo();_n();_e();cO()});var Vu,fO=g(()=>{"use strict";re();Ch();V();oO();_e();pO();Vu=class{constructor(e,n,r,o,s,i,a,c,l,d,u,p,f,m,h,y=0){this.id=e;this.session=n;this._controller=r;this.abortGraph=o;this._outputSchema=s;this.timeoutMs=i;this._hookRegistry=a;this._onTerminal=c;this._parentInputStreamRef=l;this._parentAbortSignal=d;this._agentType=u;this._traceWriter=m;this.onSubagentSucceeded=h;this._idleTimeoutMs=y;this._progressSink=p,this._parentId=f}id;session;_controller;abortGraph;_outputSchema;timeoutMs;_hookRegistry;_onTerminal;_parentInputStreamRef;_parentAbortSignal;_agentType;_traceWriter;onSubagentSucceeded;_idleTimeoutMs;_currentStatus="idle";inFlight=null;_lastMessage;_lastDurationMs;latestTerminalStatus;_stopDispatched=!1;_lastStopInjectContext;_progressSink;_parentId;_currentTrace=Xo();_lastStreamedContent="";_pauseCeiling;_lastStopReason;_logWriter;get status(){return this._currentStatus}async run(e,n){if(this._currentStatus==="running")throw new Error(`Subagent ${this.id} is already running`);if(this._lastStopReason=void 0,this._currentStatus==="cancelled")throw new Error(`Subagent ${this.id} is cancelled`);this._currentStatus="running";let r=Date.now(),o=Number.isFinite(this.timeoutMs)&&this.timeoutMs>0?new Xu(this.timeoutMs,mb,i=>{W(this._traceWriter,{phase:"pause_extension_granted",metadata:{subagentId:this.id,grantMs:i.grantMs,totalGrantedMs:i.totalGrantedMs,remainingCapMs:i.remainingCapMs,grantCount:i.grantCount,...i.pauseDescription!==void 0&&{pauseDescription:i.pauseDescription}}})}):void 0;this._pauseCeiling=o;let s=Ed(lO(this,e,n),this.timeoutMs,{controller:this._controller,label:this.id,...o!==void 0&&{extender:o}});this.inFlight=s;try{let i=await s;this._lastMessage=i.content,this._lastDurationMs=Date.now()-r,this._currentStatus="succeeded",this.latestTerminalStatus="succeeded",await Qn(this._traceWriter,{transition:"succeeded",subagentId:this.id,durationMs:this._lastDurationMs,turnCount:this._currentTrace.turnCount,outputBytes:Buffer.byteLength(this._lastMessage,"utf8"),...this._lastStopReason!==void 0&&{stopReason:this._lastStopReason}});let a=typeof i.metadata?.totalCostUsd=="number"?i.metadata.totalCostUsd:void 0;return this.onSubagentSucceeded?.(this._currentTrace.usage,a),this._onTerminal(),i}catch(i){this._lastDurationMs=Date.now()-r;let a=this._controller.signal.aborted&&this._controller.signal.reason instanceof Ee&&!this.abortGraph.isCascading(this.id)?this._controller.signal.reason:void 0,c=a??i;if(this._currentStatus!=="cancelled")if(this._controller.signal.aborted&&a===void 0){let l=this._controller.signal.reason instanceof Ee;await Qn(this._traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade",...l?{timeout:!0}:{}}),this._currentStatus="cancelled",this.latestTerminalStatus="cancelled"}else await Qn(this._traceWriter,{transition:"failed",subagentId:this.id,errorClass:c instanceof Error?c.constructor.name:"Unknown",errorMessage:c instanceof Error?c.message:String(c),partialOutputBytes:Buffer.byteLength(this._lastStreamedContent,"utf8"),...a!==void 0?{failureClass:"timeout"}:{}}),this._currentStatus="failed",this.latestTerminalStatus="failed";throw this._onTerminal(),c}finally{this.inFlight=null}}async runToResult(e,n){return dO(this,e,n)}runInBackground(e,n,r){return uO(this,e,n,r)}async cancel(){if(this._currentStatus==="cancelled"||this._stopDispatched)return;let e=this.latestTerminalStatus??"cancelled";this._currentStatus="cancelled",Qn(this._traceWriter,{transition:"cancelled",subagentId:this.id,source:"explicit"});try{this.abortGraph.abort(this.id,"cancelled")}catch{}try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await gb(this,e)}}async teardown(e){if(this._stopDispatched)return;let n=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await gb(this,n,e)}}getLastStopInjectContext(){return this._lastStopInjectContext}}});function mO(t){return Gd(Mt(t))}function gO(t,e){return t===void 0||!mO(t)||G(t)!=="openai-compatible"?{model:t}:e===void 0||mO(e)||G(e)!=="openai-compatible"?{model:t}:{model:e,coercedFrom:t}}var hO=g(()=>{"use strict";ue();qd();Ce()});function yO(t){let{options:e,counter:n,managerHookRegistry:r,parentTraceWriter:o,parentModel:s}=t,i=`${e.idPrefix??"subagent"}-${Date.now()}-${n}`,a=e.parent.sessionId,c=e.config.hookRegistry??r??e.parent.hookRegistry,l=e.config.traceWriter??o,d=gO(e.config.model,s),u=d.model??e.config.model,p=e.config.timeoutMs??sa();return{id:i,resume:a,registry:c,effectiveTraceWriter:l,effectiveChildModel:u,coercedFrom:d.coercedFrom,effectiveTimeoutMs:p}}var bO=g(()=>{"use strict";hO();ia()});var Ju,wO=g(()=>{"use strict";Ju=class{entries=new Map;capacity;constructor(e=30){this.capacity=Math.max(1,e)}add(e,n,r){this.entries.delete(e),this.entries.set(e,{handle:n,result:r,completedAt:Date.now()}),this.evictIfNeeded()}recordHandle(e,n,r,o,s){let i=r==="succeeded"?{id:e,status:r,trace:o,...s!==void 0&&{stopReason:s}}:{id:e,status:r,error:new Error(`subagent terminated with status: ${r}`),trace:o,...s!==void 0&&{stopReason:s}};this.add(e,n,i)}get(e){return this.entries.get(e)}list(){return[...this.entries.values()].reverse()}get size(){return this.entries.size}delete(e){return this.entries.delete(e)}clear(){this.entries.clear()}evictIfNeeded(){for(;this.entries.size>this.capacity;){let e=this.entries.keys().next().value;if(e!==void 0)this.entries.delete(e);else break}}}});import*as Jo from"node:fs";var SO,ca,vO=g(()=>{"use strict";L();j();SO=1048576,ca=class{constructor(e,n){this.sessionLabel=e;this.subagentId=n;this.logPath=SS(e,n);try{Jo.mkdirSync(Ef(e),{recursive:!0})}catch{this.errored=!0}}sessionLabel;subagentId;logPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;bytesWritten=0;static isEnabled(){return S.AFK_SUBAGENT_LOG!=="0"}write(e){if(this.errored||this.closed||this.bytesWritten>=SO)return;let n=JSON.stringify(e)+`
|
|
1160
1160
|
`;if(!this.stream){this.pendingLines.push(n),this.openStream();return}if(!this.streamReady){this.pendingLines.push(n);return}this.writeLine(n)}async close(){if(!this.closed)return this.closed=!0,this.readyPromise&&await this.readyPromise,new Promise(e=>{if(!this.stream||this.errored){e();return}this.stream.end(()=>e())})}openStream(){if(!this.stream){this.readyPromise=new Promise(e=>{this.readyResolve=e});try{let e=Jo.createWriteStream(this.logPath,{flags:"a",encoding:"utf8",mode:384});this.stream=e,e.once("open",()=>{this.streamReady=!0;for(let n of this.pendingLines)this.writeLine(n);this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null}),e.once("error",()=>{this.errored=!0,this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null})}catch{this.errored=!0,this.readyResolve?.(),this.readyResolve=null}}}writeLine(e){this.errored||!this.stream||this.bytesWritten>=SO||(this.bytesWritten+=Buffer.byteLength(e,"utf8"),this.stream.write(e))}}});var J,he=g(()=>{"use strict";CR();Nh();Jc();kr();jh();BI();WI();ue();GI();ZM();nO();fO();bO();wO();vO();ia();J=class{active=new Map;completed=new Ju;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentProvider;parentModel;parentCwd;parentReadRoots;worktreeMainRootCache=new Map;parentTraceWriter;parentSurface;parentAbortSignal;workspaceStore;sessionLabel;abortGraph;rootId;rootController;counter=0;onSubagentSucceededCb;constructor(e={}){if(this.parentCanUseTool=e.canUseTool,this.hookRegistry=e.hookRegistry,this.progressSink=e.progressSink,this.parentApiKey=e.apiKey,this.parentBaseUrl=e.baseUrl,this.parentProvider=e.parentModel!==void 0?G(e.parentModel):void 0,this.parentModel=e.parentModel,this.parentCwd=e.cwd,this.parentReadRoots=e.parentReadRoots,this.parentTraceWriter=e.traceWriter,this.parentSurface=e.surface,this.parentAbortSignal=e.parentAbortSignal,this.onSubagentSucceededCb=e.onSubagentSucceeded,this.workspaceStore=e.workspaceStore,this.sessionLabel=e.sessionLabel,this.abortGraph=new wd(e.traceWriter),this.rootId=`manager-root-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,this.rootController=new AbortController,this.abortGraph.register(this.rootId,this.rootController),e.parentAbortSignal){let n=e.parentAbortSignal;n.aborted?this.rootController.abort(n.reason):n.addEventListener("abort",()=>{this.rootController.signal.aborted||this.rootController.abort(n.reason)},{once:!0})}}list(){return[...this.active.values()].map(e=>({id:e.id,status:e.status}))}get(e){return this.active.get(e)??this.completed.get(e)?.handle}onChildAborted(e){return this.abortGraph.onChildAborted(this.rootId,e)}setOnSubagentSucceeded(e){this.onSubagentSucceededCb=e}setCwd(e){this.parentCwd=e,this.worktreeMainRootCache.delete(e)}setTraceWriter(e){this.parentTraceWriter=e,this.abortGraph.setTraceWriter(e)}getReadScopeInputs(){return{parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd}}async resolveMainRootForCwd(e){if(this.worktreeMainRootCache.has(e))return this.worktreeMainRootCache.get(e);let n=await $I(e);return this.worktreeMainRootCache.set(e,n),n}abortAll(e,n="user_signal"){this.abortGraph.abort(this.rootId,e,n)}async forkSubagent(e){KI(e);let{id:n,resume:r,registry:o,effectiveTraceWriter:s,effectiveChildModel:i,coercedFrom:a,effectiveTimeoutMs:c}=yO({options:e,counter:++this.counter,managerHookRegistry:this.hookRegistry,parentTraceWriter:this.parentTraceWriter,parentModel:this.parentModel});o&&await bk(o,{event:"SubagentStart",subagentId:n,parentSessionId:e.parent.sessionId},{signal:this.rootController.signal,...s?{traceWriter:s}:{}}),a!==void 0&&process.stderr.write(`[afk] subagent: child model "${a}" cannot run on this session's OpenAI/ChatGPT backend \u2014 running it as "${i??""}" instead (set AFK_DEFAULT_SUBAGENT_MODEL to choose a different one).
|
|
1161
|
-
`);let l=new AbortController;this.abortGraph.register(n,l),this.abortGraph.linkChild(this.rootId,n);let d=e.config.cwd??this.parentCwd,u=await jI({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,effectiveChildCwd:d,callerReadRoots:e.config.readRoots,callerExtraReadRoots:e.config.extraReadRoots,resolveMainRoot:E=>this.resolveMainRootForCwd(E)}),p=HI(e.config.writeRoots,d),f=QM({options:e,id:n,resume:r,registry:o,effectiveChildModel:i,effectiveTimeoutMs:c,inheritedReadRoots:u,composedWriteRoots:p,childController:l,parentCwd:this.parentCwd,parentApiKey:this.parentApiKey,parentBaseUrl:this.parentBaseUrl,parentProvider:this.parentProvider,parentTraceWriter:this.parentTraceWriter,parentSurface:this.parentSurface,parentCanUseTool:this.parentCanUseTool,workspaceStore:this.workspaceStore}),m=()=>{};f.cwd!==void 0&&(Bh(f.cwd),m=UI(f.cwd));let h,y,b,k;try{h=new vr(f);let E=e.parent.getInputStreamRef?.(),x=e.parent.abortSignal,T=this.progressSink??At();b=e.agentType?.trim()||void 0,k=e.resolvedAgentType?.trim()||void 0;let I=e.parentId?.trim()||void 0,R=this.sessionLabel??e.parent.sessionId,v=ca.isEnabled()&&R?new ca(R,n):void 0;y=new Vu(n,h,l,this.abortGraph,e.outputSchema,c,o,()=>{m(),this.completed.add(n,y,{id:n,status:y._currentStatus==="running"?"succeeded":y._currentStatus}),this.active.delete(n),this.abortGraph.dispose(n),v?.close()},E,x,b??e.idPrefix,T,I??e.parent.sessionId,s,this.onSubagentSucceededCb,e.config.idleTimeoutMs??JM()),v&&(y._logWriter=v),this.active.set(n,y)}catch(E){throw m(),this.abortGraph.dispose(n),E}let _=eO({effectiveTraceWriter:s,id:n,parentSessionId:e.parent.sessionId,rootId:this.rootId,effectiveChildModel:i,childConfig:f,promptHead:e.promptHead,effectiveAgentType:b,effectiveResolvedAgentType:k});return await tO({modelString:_,id:n,idPrefix:e.idPrefix,parentSessionId:e.parent.sessionId,effectiveResolvedAgentType:k}),y}async kill(e){let n=this.active.get(e);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(e=>e.cancel()))}async abortAllAndDrain(e,n="user_signal",r=YM,o=!1){let s=[...this.active.values()];if(s.length===0)return o&&this.rootController.signal.aborted&&this.rearmRoot(),{drained:0,timedOut:!1};this.abortGraph.abort(this.rootId,e,n);let i=!1,a=new Promise(c=>setTimeout(()=>{i=!0,c()},r).unref());return await Promise.race([Promise.allSettled(s.map(c=>c.cancel())),a]),i&&console.warn(`[SubagentManager] abortAllAndDrain: ${s.length} child(ren) did not settle within ${r}ms \u2014 sealing anyway; their terminal rows may be missing`),o&&this.rearmRoot(),{drained:s.length,timedOut:i}}rearmRoot(){this.rootController=new AbortController,this.abortGraph.rearm(this.rootId,this.rootController),this.parentAbortSignal?.aborted&&this.rootController.abort(this.parentAbortSignal.reason)}async teardownAll(){await Promise.allSettled([...this.active.values()].map(e=>e.teardown()))}}});async function kO(t,e={}){let{failFast:n=!0,teardown:r=!0,maxConcurrency:o=Xs()}=e;if(t.length===0)return[];let s=new Array(t.length),i=new Set(t.map((c,l)=>l)),a=!1;return await eo(t.map((c,l)=>l),o,async c=>{let l=t[c];n&&a&&await l.handle.cancel().catch(()=>{});let d=await l.handle.runToResult(l.prompt);if(s[c]=d,i.delete(c),n&&d.status!=="succeeded"){a=!0;for(let u of i){let p=t[u];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(t.map(c=>c.handle.teardown())),s}var _O=g(()=>{"use strict";ul()});function AO(t){let e=new Set;for(let n of t){let r=Qi(n,c5);r!==void 0&&e.add(r)}return e}var c5,EO=g(()=>{"use strict";jo();st();sl();c5=new Set([...wt,...Me,"memory_search","agent","skill"])});import{existsSync as Ln,readdirSync as l5,readFileSync as d5}from"fs";import{join as sn}from"path";function xO(t=ne()){let e=[],n=sn(t,"skills");if(Ln(n))for(let r of Yu(n)){let o=sn(n,r,"SKILL.md");Ln(o)&&e.push({path:o,type:"skill",source:"user"})}for(let r of TO){let o=sn(t,`${r}s`);if(Ln(o))for(let s of Yu(o))s.endsWith(".md")&&e.push({path:sn(o,s),type:r,source:"user"})}return e}function RO(t=Rt()){if(!Ln(t))return[];let e=[],n=tn(t);for(let r of n){let s=Iy(t,r.path)?.key,i=sn(r.path,"skills");if(Ln(i))for(let a of Yu(i)){let c=sn(i,a,"SKILL.md");if(!Ln(c))continue;let l={path:c,type:"skill",source:"plugin"};s&&(l.plugin_key=s),e.push(l)}for(let a of TO){let c=sn(r.path,`${a}s`);if(Ln(c))for(let l of Yu(c)){if(!l.endsWith(".md"))continue;let d={path:sn(c,l),type:a,source:"plugin"};s&&(d.plugin_key=s),e.push(d)}}}return e}function IO(t=sn(ne(),"settings.json")){if(!Ln(t))return[];try{let e=d5(t,"utf8"),r=JSON.parse(e).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[s,i]of Object.entries(r))if(Array.isArray(i))for(let a=0;a<i.length;a++)o.push({event:s,index:a,raw:i[a]});return o}catch{return[]}}function Yu(t){try{return l5(t).filter(e=>!e.startsWith("."))}catch{return[]}}var TO,CO=g(()=>{"use strict";j();Bo();TO=["command","agent"]});import{z as ce}from"zod";import{mkdir as PO,appendFile as MO}from"fs/promises";import{join as hb}from"path";function f5(t){return{runUserDiscovery:t!=="plugin",runPluginDiscovery:t!=="user",runHookInspector:t!=="plugin"}}function m5(t){let e=()=>{let s={};for(let i of FO)s[i]={correct:0,misfit:0,outlier:0};return s},n={user:e(),plugin:e()};for(let s of t)n[s.source][s.type][s.verdict]+=1;let r={high:0,med:1,low:2},o=t.filter(s=>s.verdict==="misfit").slice().sort((s,i)=>r[s.confidence]-r[i.confidence]);return{inventory:n,misfits:o}}function g5(t){return t.verdict==="misfit"&&t.confidence==="high"&&t.source==="user"}function h5(t){let e=t.filter(o=>o.source==="user"),n=t.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),e.length===0)r.push("(none discovered)");else for(let o of e)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let s=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${s})`)}return r.join(`
|
|
1161
|
+
`);let l=new AbortController;this.abortGraph.register(n,l),this.abortGraph.linkChild(this.rootId,n);let d=e.config.cwd??this.parentCwd,u=await jI({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,effectiveChildCwd:d,callerReadRoots:e.config.readRoots,callerExtraReadRoots:e.config.extraReadRoots,resolveMainRoot:E=>this.resolveMainRootForCwd(E)}),p=HI(e.config.writeRoots,d),f=QM({options:e,id:n,resume:r,registry:o,effectiveChildModel:i,effectiveTimeoutMs:c,inheritedReadRoots:u,composedWriteRoots:p,childController:l,parentCwd:this.parentCwd,parentApiKey:this.parentApiKey,parentBaseUrl:this.parentBaseUrl,parentProvider:this.parentProvider,parentTraceWriter:this.parentTraceWriter,parentSurface:this.parentSurface,parentCanUseTool:this.parentCanUseTool,workspaceStore:this.workspaceStore}),m=()=>{};f.cwd!==void 0&&(Bh(f.cwd),m=UI(f.cwd));let h,y,b,k;try{h=new vr(f);let E=e.parent.getInputStreamRef?.(),x=e.parent.abortSignal,T=this.progressSink??At();b=e.agentType?.trim()||void 0,k=e.resolvedAgentType?.trim()||void 0;let I=e.parentId?.trim()||void 0,R=this.sessionLabel??e.parent.sessionId,v=ca.isEnabled()&&R?new ca(R,n):void 0;y=new Vu(n,h,l,this.abortGraph,e.outputSchema,c,o,()=>{m(),this.completed.add(n,y,{id:n,status:y._currentStatus==="running"?"succeeded":y._currentStatus}),this.active.delete(n),this.abortGraph.dispose(n),v?.close(),this.completed.recordHandle(n,y,y._currentStatus,y._currentTrace,y._lastStopReason)},E,x,b??e.idPrefix,T,I??e.parent.sessionId,s,this.onSubagentSucceededCb,e.config.idleTimeoutMs??JM()),v&&(y._logWriter=v),this.active.set(n,y)}catch(E){throw m(),this.abortGraph.dispose(n),E}let _=eO({effectiveTraceWriter:s,id:n,parentSessionId:e.parent.sessionId,rootId:this.rootId,effectiveChildModel:i,childConfig:f,promptHead:e.promptHead,effectiveAgentType:b,effectiveResolvedAgentType:k});return await tO({modelString:_,id:n,idPrefix:e.idPrefix,parentSessionId:e.parent.sessionId,effectiveResolvedAgentType:k}),y}async kill(e){let n=this.active.get(e);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(e=>e.cancel()))}async abortAllAndDrain(e,n="user_signal",r=YM,o=!1){let s=[...this.active.values()];if(s.length===0)return o&&this.rootController.signal.aborted&&this.rearmRoot(),{drained:0,timedOut:!1};this.abortGraph.abort(this.rootId,e,n);let i=!1,a=new Promise(c=>setTimeout(()=>{i=!0,c()},r).unref());return await Promise.race([Promise.allSettled(s.map(c=>c.cancel())),a]),i&&console.warn(`[SubagentManager] abortAllAndDrain: ${s.length} child(ren) did not settle within ${r}ms \u2014 sealing anyway; their terminal rows may be missing`),o&&this.rearmRoot(),{drained:s.length,timedOut:i}}rearmRoot(){this.rootController=new AbortController,this.abortGraph.rearm(this.rootId,this.rootController),this.parentAbortSignal?.aborted&&this.rootController.abort(this.parentAbortSignal.reason)}async teardownAll(){await Promise.allSettled([...this.active.values()].map(e=>e.teardown()))}}});async function kO(t,e={}){let{failFast:n=!0,teardown:r=!0,maxConcurrency:o=Xs()}=e;if(t.length===0)return[];let s=new Array(t.length),i=new Set(t.map((c,l)=>l)),a=!1;return await eo(t.map((c,l)=>l),o,async c=>{let l=t[c];n&&a&&await l.handle.cancel().catch(()=>{});let d=await l.handle.runToResult(l.prompt);if(s[c]=d,i.delete(c),n&&d.status!=="succeeded"){a=!0;for(let u of i){let p=t[u];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(t.map(c=>c.handle.teardown())),s}var _O=g(()=>{"use strict";ul()});function AO(t){let e=new Set;for(let n of t){let r=Qi(n,c5);r!==void 0&&e.add(r)}return e}var c5,EO=g(()=>{"use strict";jo();st();sl();c5=new Set([...wt,...Me,"memory_search","agent","skill"])});import{existsSync as Ln,readdirSync as l5,readFileSync as d5}from"fs";import{join as sn}from"path";function xO(t=ne()){let e=[],n=sn(t,"skills");if(Ln(n))for(let r of Yu(n)){let o=sn(n,r,"SKILL.md");Ln(o)&&e.push({path:o,type:"skill",source:"user"})}for(let r of TO){let o=sn(t,`${r}s`);if(Ln(o))for(let s of Yu(o))s.endsWith(".md")&&e.push({path:sn(o,s),type:r,source:"user"})}return e}function RO(t=Rt()){if(!Ln(t))return[];let e=[],n=tn(t);for(let r of n){let s=Iy(t,r.path)?.key,i=sn(r.path,"skills");if(Ln(i))for(let a of Yu(i)){let c=sn(i,a,"SKILL.md");if(!Ln(c))continue;let l={path:c,type:"skill",source:"plugin"};s&&(l.plugin_key=s),e.push(l)}for(let a of TO){let c=sn(r.path,`${a}s`);if(Ln(c))for(let l of Yu(c)){if(!l.endsWith(".md"))continue;let d={path:sn(c,l),type:a,source:"plugin"};s&&(d.plugin_key=s),e.push(d)}}}return e}function IO(t=sn(ne(),"settings.json")){if(!Ln(t))return[];try{let e=d5(t,"utf8"),r=JSON.parse(e).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[s,i]of Object.entries(r))if(Array.isArray(i))for(let a=0;a<i.length;a++)o.push({event:s,index:a,raw:i[a]});return o}catch{return[]}}function Yu(t){try{return l5(t).filter(e=>!e.startsWith("."))}catch{return[]}}var TO,CO=g(()=>{"use strict";j();Bo();TO=["command","agent"]});import{z as ce}from"zod";import{mkdir as PO,appendFile as MO}from"fs/promises";import{join as hb}from"path";function f5(t){return{runUserDiscovery:t!=="plugin",runPluginDiscovery:t!=="user",runHookInspector:t!=="plugin"}}function m5(t){let e=()=>{let s={};for(let i of FO)s[i]={correct:0,misfit:0,outlier:0};return s},n={user:e(),plugin:e()};for(let s of t)n[s.source][s.type][s.verdict]+=1;let r={high:0,med:1,low:2},o=t.filter(s=>s.verdict==="misfit").slice().sort((s,i)=>r[s.confidence]-r[i.confidence]);return{inventory:n,misfits:o}}function g5(t){return t.verdict==="misfit"&&t.confidence==="high"&&t.source==="user"}function h5(t){let e=t.filter(o=>o.source==="user"),n=t.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),e.length===0)r.push("(none discovered)");else for(let o of e)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let s=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${s})`)}return r.join(`
|
|
1162
1162
|
`)}function y5(t,e){let n=["","## Discovered hooks (audit only these)",""];if(n.push(`Settings file (use this absolute path verbatim in each verdict's \`path\` field): \`${t}\``),n.push(""),e.length===0)return n.push("(no hooks discovered)"),n.join(`
|
|
1163
1163
|
`);for(let r of e){let o=`${r.event}-${r.index}`;n.push(`### Hook \`${o}\``),n.push(""),n.push("```json"),n.push(JSON.stringify(r.raw,null,2)),n.push("```"),n.push("")}return n.join(`
|
|
1164
1164
|
`)}function b5(t,e){if(!e)return{kind:"failure",message:`${t}: no result`};if(e.schemaError)return{kind:"failure",message:`${t}: schema mismatch \u2014 ${e.schemaError.message}`};if(e.status!=="succeeded"){let n=e.error?` \u2014 ${e.error.message}`:"";return{kind:"failure",message:`${t}: ${e.status}${n}`}}return e.output?{kind:"success",output:e.output}:{kind:"failure",message:`${t}: no output`}}async function w5(t,e,n){let r=n?.apiKey,o=n?.defaultSubagentModel??n?.defaultModel??"sonnet",s=n?.callId,i=typeof t=="object"&&t!==null?t:{},a=u5.parse(i),c=a.writeBriefs??!0,l=a.scope??"all",d=f5(l);if(!e?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let u=e.sessionId,p=le("audit-fit"),f={skill:p["01-skill-inspector.md"],command:p["02-command-inspector.md"],agent:p["03-agent-inspector.md"],hook:p["04-hook-inspector.md"]};for(let P of FO)if(!f[P])throw new Error(`audit-fit skill missing inspector prompt for ${P}`);let m=d.runUserDiscovery?xO():[],h=d.runPluginDiscovery?RO():[],y={skill:[],command:[],agent:[]};for(let P of[...m,...h])y[P.type].push(P);let b=new J({apiKey:r,...n?.defaultModel!==void 0?{parentModel:n.defaultModel}:{},...n?.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},...n?.workspaceStore!==void 0?{workspaceStore:n.workspaceStore}:{}}),k=AO(Wt.allowedTools),_=()=>async P=>k.has(P)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${P} not allowed for audit-fit inspectors. Allowed tools: ${[...k].join(", ")}`},E=[];for(let P of p5){let $=y[P];if($.length===0)continue;let D=f[P];D&&E.push({type:P,prompt:`${D}
|