agent-afk 5.81.4 → 5.81.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -5,6 +5,7 @@ import { type ZodType } from 'zod';
|
|
|
5
5
|
import type { AccountInfo, AgentConfig, AgentInfo, AgentModelInput, IAgentSession, InputStreamRef, McpServerStatus, Message, ModelInfo, OutputEvent, PermissionMode, ResponseMetadata, RewindFilesResult, SDKControlGetContextUsageResponse, SendMessageOptions, SessionIdentity, SessionMetadata, SessionState, SlashCommand, StructuredMessageOptions } from '../types.js';
|
|
6
6
|
import type { ElicitationRequest } from '../types/sdk-types.js';
|
|
7
7
|
export declare class AgentSession implements IAgentSession {
|
|
8
|
+
private static readonly claimedTraceWriters;
|
|
8
9
|
private config;
|
|
9
10
|
private readonly planExit;
|
|
10
11
|
private currentState;
|
|
@@ -19,6 +20,7 @@ export declare class AgentSession implements IAgentSession {
|
|
|
19
20
|
private readonly abortController;
|
|
20
21
|
private readonly _hookRegistry;
|
|
21
22
|
private sessionEndDispatched;
|
|
23
|
+
private readonly ownsTraceSeal;
|
|
22
24
|
private stateManager;
|
|
23
25
|
private sessionRunningCostUsd;
|
|
24
26
|
private sessionRunningTokens;
|
|
@@ -68,6 +68,7 @@ export interface AgentConfig {
|
|
|
68
68
|
hookRegistry?: HookRegistry;
|
|
69
69
|
planExitControls?: PlanExitControls;
|
|
70
70
|
traceWriter?: TraceWriter;
|
|
71
|
+
isSubagentFork?: true;
|
|
71
72
|
provider?: ModelProvider;
|
|
72
73
|
providerFactory?: (model: string | undefined) => ModelProvider;
|
|
73
74
|
maxBudgetUsd?: number;
|
package/dist/cli.mjs
CHANGED
|
@@ -870,7 +870,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
|
|
|
870
870
|
|
|
871
871
|
`).trim()}function O4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function nI(e,t){let{JSDOM:n,Readability:r,turndown:o}=await M4(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=tI(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=tI(o.turndown(d));return{title:a,markdown:u,textLength:O4(c),usedFallback:!0}}var IS,rI=x(()=>{"use strict";IS=null});function D4(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function oI(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function F4(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function wm(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??D4,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!$4.has(u.status)||d===o)return u;let m=F4(u,s)??oI(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=oI(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var $4,PS=x(()=>{"use strict";ye();$4=new Set([429,502,503,504])});import{readFileSync as L4}from"node:fs";import{join as N4}from"path";function B4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function iI(e,t){return B4(t).test(e)}function H4(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(U4.has(t))return!0;if(j4.has(t))return!1}return!1}function sI(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function W4(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function aI(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tc(t),t}function K4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function G4(e){try{return L4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function q4(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=aI(t.defaultProfile)),n}function lI(e){let t=e?.env??v,n=e?.readFileSync??G4,r=e?.surface??t.AGENT_SURFACE,o=H4(t.AFK_BROWSER_HEADLESS,r),i=sI(t.AFK_BROWSER_ALLOWED_DOMAINS),s=sI(t.AFK_BROWSER_BLOCKED_DOMAINS),a=K4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=W4(t.AFK_BROWSER_BACKEND),c=aI(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():N4(vn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=q4(d,g);return h.configPath=m,h}function MS(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(iI(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>iI(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var U4,j4,OS=x(()=>{"use strict";G();q();U4=new Set(["daemon","subagent","telegram","afk"]),j4=new Set(["repl","interactive","cli"])});import{existsSync as z4,readFileSync as J4}from"node:fs";import{createRequire as Y4}from"node:module";import{dirname as V4,join as X4}from"node:path";function uI(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Z4&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function Ft(e){let t=uI(e);return dI.some(n=>t.includes(n))}function e8(){try{let t=Y4(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(J4(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=X4(V4(t),o);return z4(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Fc(){return cI??=e8()??Q4,cI}function $S(e){return e.includes("install chromium")}function dn(e,t){if(uI(e).includes("Executable doesn't exist")){let r="";return t?.headless===!0?r=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(r=" 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: ${Fc()}.${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Fc()}). Or pick a different tool.`}function Lc(e,t){if(!Ft(e))return e;let n=e instanceof Error?e.message:String(e);return new Error(`${n}
|
|
872
872
|
|
|
873
|
-
${dn(e,{headless:t})}`,{cause:e})}var dI,Q4,Z4,cI,Sm=x(()=>{"use strict";dI=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Q4="pnpm exec playwright install chromium",Z4=4});import yi from"node:fs";import vm from"node:path";import{randomBytes as t8}from"node:crypto";import{chromium as n8}from"playwright";function r8(){try{return"5.81.4"}catch{}try{let e=vm.resolve(import.meta.dirname,"../../../package.json"),t=yi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var o8,km,pI=x(()=>{"use strict";Sm();q();ye();o8=r8(),km=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=n8.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,Lc(t,this.config.headless)}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${o8}`}}loadStorageState(t){let n=nc(t);try{if(!yi.existsSync(n))return;let r=JSON.parse(yi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nc(t);if(!yi.existsSync(r))return;let o=await n.storageState(),i=vm.join(vm.dirname(r),`.${vm.basename(r)}.${process.pid}.${t8(4).toString("hex")}.tmp`);yi.writeFileSync(i,JSON.stringify(o),{mode:384}),yi.chmodSync(i,384),yi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as i8}from"crypto";function mI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&s8.test(e.label))}function fI(e){return i8("sha256").update(e,"utf8").digest("hex").slice(0,8)}function gI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var s8,Tm=x(()=>{"use strict";s8=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as a8}from"node:crypto";function l8(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function c8(e,t,n){return`el_${a8("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function d8(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function hI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function bI(e,t){let n=e.role??"",r=e.name??"";yI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])bI(i,t)}async function u8(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},wI).catch(()=>[])}async function p8(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},wI).catch(()=>[])}function m8(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Em(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=m8(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=u8(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],bI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await p8(e)).filter(B=>yI.has(B.role??"")));let w=new Map;for(let O of m){let B=hI(O.name),j=w.get(B);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(B,O)}let S=y.map(O=>({ax:O,dom:w.get(hI(O.name??""))})),T=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,B)=>{let j=O.dom?.bbox.y??0,$=B.dom?.bbox.y??0;if(j!==$)return j-$;let H=O.dom?.bbox.x??0,C=B.dom?.bbox.x??0;return H-C}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,B)=>{let j=O.ax.role??"generic",$=O.ax.name??"",H=c8(j,$,B),C=O.dom?.bbox??{x:0,y:0,w:0,h:0},L=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),mI({role:j,kind:L})&&(P="[redacted]");let M={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(M.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(M.selected=O.ax.selected),O.ax.expanded!==void 0&&(M.expanded=O.ax.expanded);let I;O.dom?.testId?I=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(I=`#${O.dom.id}`);let U={id:H,role:j,label:l8($),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(U.selector=I),U}),F="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?F="loading":O==="interactive"?F="navigating":F="idle"}catch{F="navigating"}F!=="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=d8(f),D=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:F,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var yI,wI,SI=x(()=>{"use strict";Tm();yI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);wI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function vI(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function DS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>vI(e,i)))).filter(o=>o!==null)}async function f8(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function FS(e,t,n){switch(t.kind){case"element_id":return g8(e,t,n);case"selector":return h8(e,t);case"semantic":return y8(e,t)}}async function g8(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await DS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function h8(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await DS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function y8(e,t){return t.role!==void 0?b8(e,t.text,t.role):w8(e,t.text,t)}async function b8(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await DS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function w8(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await f8(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await vI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var kI=x(()=>{"use strict"});import{randomBytes as S8}from"crypto";import{mkdir as v8,stat as k8,writeFile as T8}from"fs/promises";import{join as LS}from"path";import{gzip as E8}from"zlib";import{promisify as x8}from"util";function R8(e){return LS(Qo(e),"browser")}function A8(e){return LS(R8(e),"screenshots")}function C8(){return new Date().toISOString().replace(/[:.]/g,"-")}function _8(){return S8(3).toString("hex")}async function NS(e,t,n){if(t.length>TI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${TI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=A8(e);await v8(r,{recursive:!0});let o=`${C8()}-${_8()}-${n}.png`,i=LS(r,o);await T8(i,t);let{size:s}=await k8(i);return{path:i,bytes:s}}var CRe,TI,EI=x(()=>{"use strict";q();Tm();CRe=x8(E8);TI=5*1024*1024});var RI={};Hu(RI,{PlaywrightProvider:()=>BS});function xI(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var BS,AI=x(()=>{"use strict";pI();SI();kI();OS();EI();BS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new km(t)}async open(t){let n=MS(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Em(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Em(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await FS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${xI(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=MS(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Em(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await FS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${xI(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await NS(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await NS(n,o,r);return i}catch{return null}}}});var wi={};Hu(wi,{__resetBrowserRegistryForTests:()=>$8,browserProviderActive:()=>M8,closeBrowserProvider:()=>US,getBrowserProvider:()=>P8,peekBrowserProvider:()=>O8});function CI(){Promise.resolve(US()).then(()=>{process.exit(130)})}function _I(){Promise.resolve(US()).then(()=>{process.exit(143)})}function II(){er=null}function I8(){xm||(process.on("SIGINT",CI),process.on("SIGTERM",_I),process.on("exit",II),xm=!0)}function PI(){xm&&(process.removeListener("SIGINT",CI),process.removeListener("SIGTERM",_I),process.removeListener("exit",II),xm=!1)}async function P8(e){return er!==null?er:(bi!==null||(bi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(AI(),RI)),n=lI(e),r=new t(n);return I8(),er=r,bi=null,r})()),bi)}async function US(){if(er===null)return;let e=er;er=null,bi=null,PI(),await e.shutdown()}function M8(){return er!==null}function O8(){return er}function $8(){er=null,bi=null,PI()}var er,bi,xm,Si=x(()=>{"use strict";OS();er=null,bi=null,xm=!1});async function MI(e,t){try{return await nI(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function U8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Si(),wi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function OI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??U8,o=null,i=e,s=null,a=null;try{let c=await wm(n,e,{headers:B8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(N8.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(L8.test(d)&&!F8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await MI(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await MI(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var F8,L8,N8,B8,$I=x(()=>{"use strict";rI();PS();ye();F8=/(text\/html|application\/xhtml\+xml)/i,L8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,N8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,B8={"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 W8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(j8,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),H8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function DI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?W8({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function FI(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
873
|
+
${dn(e,{headless:t})}`,{cause:e})}var dI,Q4,Z4,cI,Sm=x(()=>{"use strict";dI=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Q4="pnpm exec playwright install chromium",Z4=4});import yi from"node:fs";import vm from"node:path";import{randomBytes as t8}from"node:crypto";import{chromium as n8}from"playwright";function r8(){try{return"5.81.5"}catch{}try{let e=vm.resolve(import.meta.dirname,"../../../package.json"),t=yi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var o8,km,pI=x(()=>{"use strict";Sm();q();ye();o8=r8(),km=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=n8.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,Lc(t,this.config.headless)}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${o8}`}}loadStorageState(t){let n=nc(t);try{if(!yi.existsSync(n))return;let r=JSON.parse(yi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nc(t);if(!yi.existsSync(r))return;let o=await n.storageState(),i=vm.join(vm.dirname(r),`.${vm.basename(r)}.${process.pid}.${t8(4).toString("hex")}.tmp`);yi.writeFileSync(i,JSON.stringify(o),{mode:384}),yi.chmodSync(i,384),yi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as i8}from"crypto";function mI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&s8.test(e.label))}function fI(e){return i8("sha256").update(e,"utf8").digest("hex").slice(0,8)}function gI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var s8,Tm=x(()=>{"use strict";s8=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as a8}from"node:crypto";function l8(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function c8(e,t,n){return`el_${a8("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function d8(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function hI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function bI(e,t){let n=e.role??"",r=e.name??"";yI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])bI(i,t)}async function u8(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},wI).catch(()=>[])}async function p8(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},wI).catch(()=>[])}function m8(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Em(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=m8(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=u8(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],bI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await p8(e)).filter(B=>yI.has(B.role??"")));let w=new Map;for(let O of m){let B=hI(O.name),j=w.get(B);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(B,O)}let S=y.map(O=>({ax:O,dom:w.get(hI(O.name??""))})),T=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,B)=>{let j=O.dom?.bbox.y??0,$=B.dom?.bbox.y??0;if(j!==$)return j-$;let H=O.dom?.bbox.x??0,C=B.dom?.bbox.x??0;return H-C}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,B)=>{let j=O.ax.role??"generic",$=O.ax.name??"",H=c8(j,$,B),C=O.dom?.bbox??{x:0,y:0,w:0,h:0},L=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),mI({role:j,kind:L})&&(P="[redacted]");let M={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(M.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(M.selected=O.ax.selected),O.ax.expanded!==void 0&&(M.expanded=O.ax.expanded);let I;O.dom?.testId?I=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(I=`#${O.dom.id}`);let U={id:H,role:j,label:l8($),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(U.selector=I),U}),F="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?F="loading":O==="interactive"?F="navigating":F="idle"}catch{F="navigating"}F!=="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=d8(f),D=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:F,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var yI,wI,SI=x(()=>{"use strict";Tm();yI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);wI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function vI(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function DS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>vI(e,i)))).filter(o=>o!==null)}async function f8(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function FS(e,t,n){switch(t.kind){case"element_id":return g8(e,t,n);case"selector":return h8(e,t);case"semantic":return y8(e,t)}}async function g8(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await DS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function h8(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await DS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function y8(e,t){return t.role!==void 0?b8(e,t.text,t.role):w8(e,t.text,t)}async function b8(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await DS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function w8(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await f8(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await vI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var kI=x(()=>{"use strict"});import{randomBytes as S8}from"crypto";import{mkdir as v8,stat as k8,writeFile as T8}from"fs/promises";import{join as LS}from"path";import{gzip as E8}from"zlib";import{promisify as x8}from"util";function R8(e){return LS(Qo(e),"browser")}function A8(e){return LS(R8(e),"screenshots")}function C8(){return new Date().toISOString().replace(/[:.]/g,"-")}function _8(){return S8(3).toString("hex")}async function NS(e,t,n){if(t.length>TI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${TI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=A8(e);await v8(r,{recursive:!0});let o=`${C8()}-${_8()}-${n}.png`,i=LS(r,o);await T8(i,t);let{size:s}=await k8(i);return{path:i,bytes:s}}var CRe,TI,EI=x(()=>{"use strict";q();Tm();CRe=x8(E8);TI=5*1024*1024});var RI={};Hu(RI,{PlaywrightProvider:()=>BS});function xI(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var BS,AI=x(()=>{"use strict";pI();SI();kI();OS();EI();BS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new km(t)}async open(t){let n=MS(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Em(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Em(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await FS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${xI(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=MS(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Em(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await FS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${xI(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await NS(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await NS(n,o,r);return i}catch{return null}}}});var wi={};Hu(wi,{__resetBrowserRegistryForTests:()=>$8,browserProviderActive:()=>M8,closeBrowserProvider:()=>US,getBrowserProvider:()=>P8,peekBrowserProvider:()=>O8});function CI(){Promise.resolve(US()).then(()=>{process.exit(130)})}function _I(){Promise.resolve(US()).then(()=>{process.exit(143)})}function II(){er=null}function I8(){xm||(process.on("SIGINT",CI),process.on("SIGTERM",_I),process.on("exit",II),xm=!0)}function PI(){xm&&(process.removeListener("SIGINT",CI),process.removeListener("SIGTERM",_I),process.removeListener("exit",II),xm=!1)}async function P8(e){return er!==null?er:(bi!==null||(bi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(AI(),RI)),n=lI(e),r=new t(n);return I8(),er=r,bi=null,r})()),bi)}async function US(){if(er===null)return;let e=er;er=null,bi=null,PI(),await e.shutdown()}function M8(){return er!==null}function O8(){return er}function $8(){er=null,bi=null,PI()}var er,bi,xm,Si=x(()=>{"use strict";OS();er=null,bi=null,xm=!1});async function MI(e,t){try{return await nI(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function U8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Si(),wi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function OI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??U8,o=null,i=e,s=null,a=null;try{let c=await wm(n,e,{headers:B8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(N8.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(L8.test(d)&&!F8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await MI(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await MI(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var F8,L8,N8,B8,$I=x(()=>{"use strict";rI();PS();ye();F8=/(text\/html|application\/xhtml\+xml)/i,L8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,N8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,B8={"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 W8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(j8,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),H8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function DI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?W8({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function FI(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
874
874
|
|
|
875
875
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
876
876
|
`).trimEnd()}var j8,H8,LI=x(()=>{"use strict";po();j8="https://api.exa.ai/search",H8=10});function Rm(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var vi=x(()=>{"use strict";Sm()});function Y8(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=K8;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,G8)}let a=q8;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,z8)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function jS(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ar(e,t),truncated:!0}}function V8(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=Y8(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await wm(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(g){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let f=jS(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await OI(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});if(u.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let m=jS(u.markdown,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),f=Ft(u)&&!$S(m)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Fc()}\`)`:"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let d=DI({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:J8,timeoutMs:i.timeoutMs,signal:s.signal}),m=jS(FI(i.query,u),i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var K8,G8,q8,z8,J8,NI,BI=x(()=>{"use strict";$I();LI();PS();Js();vi();K8=3e4,G8=12e4,q8=1e5,z8=1e6,J8=10;NI=V8()});import{existsSync as jI,mkdirSync as X8,readFileSync as Q8,renameSync as Z8,unlinkSync as e5,writeFileSync as t5}from"node:fs";import{dirname as UI,join as n5}from"node:path";import{randomBytes as r5}from"node:crypto";function un(e){let t=e??Nb();if(!jI(t))return[];try{let n=Q8(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function ki(e,t){let n=t??Nb();X8(UI(n),{recursive:!0});let r=n5(UI(n),`.schedules.json.${process.pid}.${r5(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{t5(r,o,"utf-8"),Z8(r,n)}catch(i){try{jI(r)&&e5(r)}catch{}throw i}}function Am(e,t){let n=un(t),r=n.map(l=>l.id),o=o5(e.name),i=i5(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),ki(n,t),a}function Cm(e,t){let n=un(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(ki(o,t),!0)}function Nc(e,t){return un(t).find(n=>n.id===e)}function o5(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function i5(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function HI(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var _m=x(()=>{"use strict";q()});import{existsSync as s5,readFileSync as a5}from"node:fs";import{join as l5}from"node:path";async function An(e,t,n){let r;try{let o=l5(Xu("default"),"port");if(!s5(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=a5(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var ho,HS=x(()=>{"use strict";q();ho="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 c5}from"node:fs";import{readFile as d5}from"node:fs/promises";var WI,KI,GI,qI,zI=x(()=>{"use strict";_m();q();HS();WI=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=Am({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await An("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await An("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:ho}})}},KI=async(e,t)=>{let n=un();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})))}},GI=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=jn();if(!c5(i))return{content:JSON.stringify([])};let s;try{let c=await d5(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1031,7 +1031,7 @@ ${hd}`:hd,baseUrl:u?void 0:a.baseUrl,maxTurns:w,maxToolUseIterations:S,depth:r+1
|
|
|
1031
1031
|
${e}`}async function x0(e){let{handle:t,signal:n,prompt:r,idPrefix:o,model:i,parentModel:s,childManager:a,identity:l,depth:c,parentSessionId:d,registry:u,promotionTriggers:m,activeForegroundHandles:f}=e,g=()=>{t.cancel()};n.addEventListener("abort",g,{once:!0});let h=Date.now(),y=!1,b,w=new Promise(F=>{b=F}),S,T=new Promise(F=>{S=F});m.set(t.id,{fire:b,ready:T}),f.set(t.id,t);let k,A=t.runToResult(r);try{let F=await Promise.race([A.then(B=>({kind:"result",result:B})),w.then(()=>({kind:"promote"}))]);if(F.kind==="promote")if(u)try{let B=u.adoptRunning({handle:t,runPromise:A,prompt:r,model:i??"sonnet",parentSessionId:d});return y=!0,n.removeEventListener("abort",g),S({jobId:B.jobId,label:B.label}),{content:JSON.stringify({status:"running",jobId:B.jobId,subagentId:B.subagentId,label:B.label,message:`Subagent backgrounded by user (jobId=${B.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${B.jobId} remains available for manual replay.`})}}catch(B){W("subagent-executor: promotion failed, staying foreground: "+(B instanceof Error?B.message:String(B))),S(null)}else S(null);let R=F.kind==="result"?F.result:await A;if(R.status==="succeeded"&&R.message){let B=R.message.content,j=typeof B=="string"?B:JSON.stringify(B),$=R.trace;return va({...l,event:"subagent.completed",subagent_id:t.id,parent_session_id:d,status:R.status,duration_ms:Date.now()-h,content_chars:j.length,stop_reason:R.stopReason!==void 0?fn(R.stopReason,64):void 0,depth:c,tool_call_count:$?.toolCalls.length,thinking_present:$?.thinkingPresent,tool_names:$?.toolCalls.length?JSON.stringify([...new Set($.toolCalls.map(H=>H.name))]):void 0}),k={content:xX(Mn(j,R.stopReason),i,s),...Ci(R.stopReason)},k}let D=R.error?.message??"Subagent failed with no output",_=R.trace;va({...l,event:"subagent.failed",subagent_id:t.id,id_prefix:o,parent_session_id:d,status:R.status,duration_ms:Date.now()-h,error_message:fn(D),schema_error:R.schemaError?fn(R.schemaError.message):void 0,partial_output_chars:ik(R.partialOutput),stop_reason:R.stopReason!==void 0?fn(R.stopReason,64):void 0,depth:c,tool_call_count:_?.toolCalls.length,thinking_present:_?.thinkingPresent,tool_names:_?.toolCalls.length?JSON.stringify([...new Set(_.toolCalls.map(B=>B.name))]):void 0});let O=h0({status:R.status,errorMessage:D,schemaErrorMessage:R.schemaError?.message,partialOutput:R.partialOutput,subagentId:t.id});return k={content:JSON.stringify(O),isError:!0,...Ci(R.stopReason)},k}catch(F){let R=F instanceof Error?F.message:String(F);throw va({...l,event:"subagent.failed",subagent_id:t.id,id_prefix:o,parent_session_id:d,status:"failed",duration_ms:Date.now()-h,error_message:fn(R),depth:c}),F}finally{if(m.delete(t.id),f.delete(t.id),S(null),!y){n.removeEventListener("abort",g),await a?.teardownAll(),await t.teardown({deferInjectContextToCaller:!0});let F=t.getLastStopInjectContext?.();if(Ff(k,F),e.isolationTeardown){let{repoRoot:R,worktreePath:D}=e.isolationTeardown,_=await rP({repoRoot:R,worktreePath:D});_.preserved&&W(`[isolation] preserved worktree ${D} (${_.reason}) \u2014 locked so the sweep will not reap it; recover via the worktree tool`)}}}}var R0=x(()=>{"use strict";pt();ye();Wf();Jv();$m()});var sr,bd=x(()=>{"use strict";Ge();ui();On();Sa();po();wo();f0();Wf();b0();E0();R0();$m();ye();On();sr=class e{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;currentCwd;isolationCounter=0;setCwd(t){this.currentCwd=t,this.ctx.subagentManager.setCwd(t)}describeAgentTool(){return ok(this.ctx.agentRegistry)}promotionTriggers=new Map;activeForegroundHandles=new Map;hasPromotableForeground(){return this.ctx.backgroundRegistry!==void 0&&this.promotionTriggers.size>0}hasActiveForeground(){return this.activeForegroundHandles.size>0}async cancelActiveForeground(){let t=[...this.activeForegroundHandles.values()];return t.length===0?0:(await Promise.all(t.map(n=>n.cancel().catch(()=>{}))),t.length)}async promoteActiveForeground(){let t=[...this.promotionTriggers.values()];return t.forEach(r=>r.fire()),(await Promise.all(t.map(r=>r.ready))).filter(r=>r!==null)}getSubagentsLite(){let t=this.ctx.subagentManager.list().map(r=>({id:r.id,status:r.status})),n=this.ctx.backgroundRegistry?this.ctx.backgroundRegistry.list().map(r=>({jobId:r.jobId,status:r.status,startedAt:new Date(r.startedAt).toISOString(),label:r.label.length>0?r.label:null})):[];return{active:t,backgroundJobs:n}}async execute(t){if(t.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=m0(t.input)}catch(y){return{content:`Agent tool input validation failed: ${y instanceof Error?y.message:String(y)}`,isError:!0}}let r;if(n.agent_type!==void 0&&(r=this.ctx.agentRegistry?.get(n.agent_type),r===void 0)){let y=[...this.ctx.agentRegistry?.keys()??[]].sort().join(", ");return{content:`Agent type "${n.agent_type}" not found. Available agent types: ${y.length>0?y:"(none)"}`,isError:!0}}let o=this.ctx.nestedAgentAllowlist;if(o!==void 0){let y=n.agent_type;if(y===void 0||!o.includes(y))return{content:o.length===0?"This agent is not permitted to dispatch any nested agents (its definition granted the dispatch tool but named zero allowed types, e.g. `Agent()`). Complete the task with your own tools.":`This agent may only dispatch the following agent type(s): ${o.join(", ")}. `+(y===void 0?"A bare dispatch with no agent_type is not permitted here \u2014 set agent_type to one of the allowed types, or complete the task with your own tools.":`agent_type "${y}" is out of scope.`),isError:!0}}let i=this.ctx.depth,s=this.ctx.maxDepth??Mi,a=this.ctx.surface!==void 0?{origin:bo(this.ctx.surface),actor:tr(i)}:{},l=this.ctx.subagentManager.getReadScopeInputs?.()??{parentReadRoots:void 0,parentCwd:void 0},c=Ec({parentReadRoots:l.parentReadRoots,parentCwd:l.parentCwd,childCwd:n.cwd??this.currentCwd}),{childConfig:d,childParentSession:u,childManager:m,childWriteCapable:f}=y0({parsed:n,namedAgent:r,depth:i,maxDepth:s,currentCwd:this.currentCwd,...c!==void 0?{childInheritedReadRoots:c}:{},signal:t.signal,defaultConfig:this.ctx.defaultConfig,...this.ctx.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:this.ctx.resolveApiKeyForModel}:{},defaultSubagentModel:this.ctx.defaultSubagentModel,...this.ctx.childProviderFactory!==void 0?{childProviderFactory:this.ctx.childProviderFactory}:{},...this.ctx.childSkillExecutorFactory!==void 0?{childSkillExecutorFactory:this.ctx.childSkillExecutorFactory}:{},...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{},...this.ctx.allowedTools!==void 0?{allowedTools:this.ctx.allowedTools}:{},...this.ctx.readOnlyBash!==void 0?{readOnlyBash:this.ctx.readOnlyBash}:{},...this.ctx.agentRegistry!==void 0?{agentRegistry:this.ctx.agentRegistry}:{},...this.ctx.parentModel!==void 0?{parentModel:this.ctx.parentModel}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},createChildExecutor:y=>new e(y)}),g;if(n.isolation==="worktree")if(!f)W(`[isolation] skipped worktree for read-only dispatch (agent_type=${n.agent_type??"generic"}) \u2014 nothing to isolate`);else{let y=this.currentCwd??process.cwd();try{let b=await nP({cwd:y,slugHint:`iso-${n.id_prefix}-${++this.isolationCounter}-${Math.random().toString(36).slice(2,8)}`});d.cwd=b.path,g={repoRoot:b.repoRoot,worktreePath:b.path}}catch(b){return{content:`Failed to create isolated worktree for the subagent: ${b instanceof Error?b.message:String(b)}. isolation:"worktree" requires the dispatching session to run inside a git repository.`,isError:!0}}}n.mode==="background"&&d.timeoutMs===void 0&&(d.timeoutMs=A0);let h;try{h=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,parentId:t.id,config:d,idPrefix:n.id_prefix,agentType:r!==void 0?r.name:n.id_prefix&&n.id_prefix!=="agent-tool"?Qn(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":Qn(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",...r!==void 0?{resolvedAgentType:r.name}:{},promptHead:Qn(n.prompt).replace(/[\r\n]+/g," ").slice(0,80).trim(),denyElicitations:!0}),u!==void 0&&(u.sessionId=h.id)}catch(y){let b=y instanceof Error?y.message:String(y);return va({...a,event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:fn(b),depth:i}),{content:`Failed to fork subagent: ${b}`,isError:!0}}return n.mode==="background"?T0({handle:h,registry:this.ctx.backgroundRegistry,prompt:n.prompt,model:d.model,parentSessionId:this.ctx.parentSession.sessionId}):x0({handle:h,signal:t.signal,prompt:n.prompt,idPrefix:n.id_prefix,model:d.model,...this.ctx.parentModel!==void 0?{parentModel:this.ctx.parentModel}:{},childManager:m,identity:a,depth:i,parentSessionId:this.ctx.parentSession.sessionId,registry:this.ctx.backgroundRegistry,promotionTriggers:this.promotionTriggers,activeForegroundHandles:this.activeForegroundHandles,...g!==void 0?{isolationTeardown:g}:{}})}}});function ck(e,t,n,r=!1,o){let{ctx:i,currentCwd:s}=e,a=i.depth??0,l=i.maxDepth??Mi,c={...t},d=r&&o!==void 0?o.filter(y=>Yf.includes(y)):r?[...Yf]:o,u=r;if(!i.childProviderFactory||a>=l)return r?c.provider=_0(c.model,i.openaiBaseUrl,d):d!==void 0&&(c.provider=Gf(d,c.model,u,i.openaiBaseUrl)),{childConfig:c,childManager:void 0};let m=lo(i.getReadScopeInputs?.(),s),f=new le({parentAbortSignal:n,...i.traceWriter!==void 0?{traceWriter:i.traceWriter}:{},...i.surface!==void 0?{surface:i.surface}:{},...s!==void 0?{cwd:s}:{},...m!==void 0?{parentReadRoots:m}:{}}),g=new sr({subagentManager:f,parentSession:Pi(n),defaultConfig:{model:c.model,apiKey:i.apiKey,...i.baseUrl!==void 0?{baseUrl:i.baseUrl}:{},...i.openaiBaseUrl!==void 0?{openaiBaseUrl:i.openaiBaseUrl}:{}},...i.surface!==void 0?{surface:i.surface}:{},defaultSubagentModel:i.defaultSubagentModel,childProviderFactory:i.childProviderFactory,childSkillExecutorFactory:i.childSkillExecutorFactory,...i.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:i.resolveApiKeyForModel}:{},depth:a+1,maxDepth:l,...s!==void 0?{cwd:s}:{},...i.traceWriter!==void 0?{traceWriter:i.traceWriter}:{},...i.backgroundRegistry!==void 0?{backgroundRegistry:i.backgroundRegistry}:{},...d!==void 0?{allowedTools:d}:{},...u?{readOnlyBash:!0}:{},...i.agentRegistry!==void 0?{agentRegistry:i.agentRegistry}:{},...c.model!==void 0?{parentModel:c.model}:{}}),h=i.childSkillExecutorFactory?i.childSkillExecutorFactory(a+1,l,n,s,{parentReadRoots:m,parentCwd:s}):void 0;return c.provider=i.childProviderFactory({childExecutor:g,...h!==void 0?{childSkillExecutor:h}:{},...c.model!==void 0?{model:c.model}:{},...d!==void 0?{allowedTools:d}:{},...u?{readOnlyBash:!0}:{}}),{childConfig:c,childManager:f}}var C0=x(()=>{"use strict";Ge();ui();On();bd()});function I0(e,t){let{ctx:n,currentCwd:r}=e,o=lo(n.getReadScopeInputs?.(),r);return new le({parentAbortSignal:t.parentAbortSignal,apiKey:t.apiKey,parentModel:t.parentModel,...n.baseUrl!==void 0?{baseUrl:n.baseUrl}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},...n.surface!==void 0?{surface:n.surface}:{},progressSink:Rn(),...r!==void 0?{cwd:r}:{},...o!==void 0?{parentReadRoots:o}:{}})}async function P0(e,t,n,r){let{ctx:o}=e;if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};let i=t.readOnly===!0||Vf.has(t.name),s;try{if(s=Ue(t.name)["system.md"],!s)return{content:`Skill "${t.name}" has context: "fork" but no prompts/system.md found`,isError:!0}}catch(m){return{content:`Failed to load skill prompts: ${m instanceof Error?m.message:String(m)}`,isError:!0}}let a=t.model??o.defaultSubagentModel??o.defaultModel??"sonnet",l=pd({childModel:a,resolved:o.resolveApiKeyForModel?o.resolveApiKeyForModel(a):Pe(a),parentApiKey:o.apiKey}),c=I0(e,{apiKey:l,parentModel:a,parentAbortSignal:r.signal}),{childConfig:d,childManager:u}=ck(e,{model:a,systemPrompt:s,isSkillDispatch:!0,...o.traceWriter!==void 0?{traceWriter:o.traceWriter}:{}},r.signal,i);return O0(e,{manager:c,childManager:u,childConfig:d,label:t.name,idPrefix:`skill-fork-${t.name}`,parentId:r.id,args:n,noOutputError:"Forked skill failed with no output",errorPrefix:"Forked skill execution error"})}async function M0(e,t,n,r,o,i,s=!1,a,l){let{ctx:c}=e;if(i.signal.aborted)return{content:"Skill call aborted",isError:!0};let d=l??c.defaultSubagentModel??c.defaultModel??"sonnet",u=pd({childModel:d,resolved:c.resolveApiKeyForModel?c.resolveApiKeyForModel(d):Pe(d),parentApiKey:c.apiKey}),m=I0(e,{apiKey:u,parentModel:d,parentAbortSignal:i.signal}),f={model:d,systemPrompt:Mf(n,o),env:{PLUGIN_ROOT:r},isSkillDispatch:!0,...c.traceWriter!==void 0?{traceWriter:c.traceWriter}:{}},{childConfig:g,childManager:h}=ck(e,f,i.signal,s,a);return O0(e,{manager:m,childManager:h,childConfig:g,label:t,idPrefix:`skill-${t}`,parentId:i.id,args:o,noOutputError:"Plugin skill failed with no output",errorPrefix:"Plugin skill execution error"})}async function O0(e,t){let{manager:n,childManager:r,childConfig:o,label:i,idPrefix:s,parentId:a,args:l,noOutputError:c,errorPrefix:d}=t,u,m;try{u=await n.forkSubagent({parent:e.ctx.parentSession,config:o,idPrefix:s,parentId:a,agentType:i});let f=l&&l.length>0?l:`Run the ${i} skill now, following the instructions in your system prompt.`,g=await u.runToResult(f);return g.status==="succeeded"&&g.message?(m={content:Mn(g.message.content,g.stopReason),...Ci(g.stopReason)},m):g.status==="cancelled"&&typeof g.partialOutput=="string"&&g.partialOutput.length>0?(m={content:`[skill cancelled mid-flight \u2014 partial output preserved below]
|
|
1032
1032
|
|
|
1033
1033
|
${g.partialOutput}`,...Ci(g.stopReason)},m):(m={content:g.error?.message??c,isError:!0,...Ci(g.stopReason)},m)}catch(f){let g=f instanceof Error?f.message:String(f);return{content:`${d}: ${g}`,isError:!0}}finally{u&&await u.teardown({deferInjectContextToCaller:!0}).catch(W);let f=u?.getLastStopInjectContext?.();Ff(m,f),await r?.teardownAll(),await n.teardownAll()}}var $0=x(()=>{"use strict";Ge();ui();pt();Jv();On();Lf();Et();Rr();nn();ye();C0();qv()});function RX(e){if(typeof e!="object"||e===null)return;let t=e.name;if(typeof t!="string")return;let n=t.trim();return n.length>0?n:void 0}function AX(e){if(typeof e!="object"||e===null)throw new Error("Skill tool input must be an object");let t=e,n=t.name;if(typeof n!="string"||n.trim().length===0)throw new Error('Skill tool input must have a non-empty "name" field');let r,o=t.arguments;if(o!==void 0){if(typeof o!="string")throw new Error('Skill tool "arguments" must be a string');r=o}return{name:n.trim(),arguments:r}}var ar,wd=x(()=>{"use strict";$t();rr();On();Uv();Vn();jv();Kv();Gv();qv();$0();ar=class{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;pluginBodies=null;currentCwd;setCwd(t){this.currentCwd=t,this.pluginBodies=null}internals(){return{ctx:this.ctx,currentCwd:this.currentCwd}}async execute(t){if(t.signal.aborted)return{content:"Skill tool call aborted",isError:!0};let n=this.ctx.depth??0,r=this.ctx.maxDepth??Mi;if(n>=r){let c=RX(t.input);return $e({...ya(this.ctx),event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:n,requested_name:c}).catch(()=>{}),{content:If(n,r),isError:!0}}let o;try{o=AX(t.input)}catch(c){return{content:`Skill tool input validation failed: ${c instanceof Error?c.message:String(c)}`,isError:!0}}let i;try{i=ze(o.name)}catch{}if(i)return await this.executeRegistrySkill(i,o.arguments,t);let s=this.getPluginSkillBody(o.name);if(s){if(s.context==="fork"){let d=s.readOnly===!0||Vf.has(o.name);return await M0(this.internals(),o.name,s.body,s.pluginPath,o.arguments,t,d,s.allowedTools,s.model)}let c=s.body.replace(/\$\{PLUGIN_ROOT(?::-(?:[^{}]|\$\{[^{}]*\})*)?\}|\$PLUGIN_ROOT\b/g,()=>s.pluginPath);return XM(this.internals(),o.name,c,o.arguments,t)}let l=Oi(this.ctx.pluginConfigs,this.currentCwd!==void 0?{cwd:this.currentCwd}:void 0).map(c=>c.name).join(", ");return{content:`Skill "${o.name}" not found. Available skills: ${l||"(none)"}`,isError:!0}}async executeRegistrySkill(t,n,r){if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};if(t.context==="fork")return P0(this.internals(),t,n,r);if(t.context==="load")return VM(this.internals(),t,n,r);let o=UM(t.name);o&&qM(t.name);let i=this.ctx.depth??0;$e({...ya(this.ctx),event:"skill.dispatched",requested_name:t.name,parent_session_id:this.ctx.parentSession.sessionId,depth:i,...Pf(t.name)?{is_gate:!0}:{},...t.model!==void 0?{model:t.model}:{}}).catch(()=>{});let s=Date.now(),a,l;try{l=await t.handler(n&&n.length>0?n:void 0,this.ctx.parentSession,{apiKey:this.ctx.apiKey,defaultModel:this.ctx.defaultModel,defaultSubagentModel:this.ctx.defaultSubagentModel,callId:r.id,dispatchSkill:this.createDispatchSkillCallback(r),...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},...this.ctx.getReadScopeInputs!==void 0?{getReadScopeInputs:this.ctx.getReadScopeInputs}:{}})}catch(d){a=d}finally{let d=Date.now()-s;o&&GM({skillName:t.name,durationMs:d,...a!==void 0?{isError:!0}:{}});let u=a!==void 0?a instanceof Error?a.message:String(a):void 0,m=a===void 0?typeof l=="string"?l.length:l!=null?JSON.stringify(l).length:0:void 0;$e({...ya(this.ctx),event:"skill.completed",requested_name:t.name,parent_session_id:this.ctx.parentSession.sessionId,status:a!==void 0?"failed":"succeeded",duration_ms:d,depth:i,...m!==void 0?{content_chars:m}:{},...u!==void 0?{error_message:zM(u)}:{},...t.model!==void 0?{model:t.model}:{}}).catch(()=>{})}return a!==void 0?{content:`Skill execution error: ${a instanceof Error?a.message:String(a)}`,isError:!0}:{content:typeof l=="string"?l:l!=null?JSON.stringify(l):"Skill completed successfully."}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=Sd(this.ctx.pluginConfigs,this.currentCwd!==void 0?{cwd:this.currentCwd}:void 0)),this.pluginBodies.get(t)}createDispatchSkillCallback(t){return async(n,r)=>{let o={id:`${t.id}-dispatch-${n}`,name:"skill",input:{name:n,...r!==void 0?{arguments:r}:{}},signal:t.signal},i=await this.execute(o);if(i.isError)throw new Error(i.content);return i.content}}}});function Pi(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}function Ta(e={}){return({childExecutor:t,childSkillExecutor:n,model:r,allowedTools:o,readOnlyBash:i})=>{let s={permissions:{allowedTools:o??Kf},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{},...i===!0?{readOnlyBash:!0}:{}};return re(typeof r=="string"?r:void 0)==="openai-compatible"?new Jt({...s,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{},readOnlyMemory:!0}):new Qe({...s,readOnlyMemory:!0})}}function _0(e,t,n){let r={allowedTools:[...n??Yf]};return re(typeof e=="string"?e:void 0)==="openai-compatible"?new Jt({permissions:r,readOnlyBash:!0,readOnlyMemory:!0,...t!==void 0?{baseURL:t}:{}}):new Qe({permissions:r,readOnlyBash:!0,readOnlyMemory:!0})}function Ea(e,t,n,r,o,i,s,a,l,c,d,u){let m=(f,g,h,y,b)=>{let w=y??s;return new ar({parentSession:Pi(h),defaultModel:e,...c!==void 0?{defaultSubagentModel:c}:{},apiKey:t,...r!==void 0?{baseUrl:r}:{},...u!==void 0?{openaiBaseUrl:u}:{},depth:f,maxDepth:g,childProviderFactory:n,childSkillExecutorFactory:m,...o!==void 0?{traceWriter:o}:{},...i!==void 0?{backgroundRegistry:i}:{},...w!==void 0?{cwd:w}:{},...a!==void 0?{resolveApiKeyForModel:a}:{},...l!==void 0?{surface:l}:{},...d!==void 0?{agentRegistry:d}:{},...b!==void 0?{getReadScopeInputs:()=>b}:{}})};return m}function Gf(e,t,n=!1,r){let o={allowedTools:[...e]};return re(typeof t=="string"?t:void 0)==="openai-compatible"?new Jt({permissions:o,...n?{readOnlyBash:!0}:{},...r!==void 0?{baseURL:r}:{}}):new Qe({permissions:o,...n?{readOnlyBash:!0}:{}})}function D0(e,t){let n={allowedTools:[...LM]};return re(typeof t=="string"?t:void 0)==="openai-compatible"?new Jt({permissions:n}):new Qe({permissions:n})}var Mi,Kf,Yf,Vf,On=x(()=>{"use strict";$i();ad();Be();on();an();dd();wd();Mi=3;Kf=[...Dt,...ot,"memory_search","agent","skill"],Yf=["read_file","glob","grep","list_directory","config_get","bash","web_scrape",...ot,"memory_search","agent","skill"],Vf=new Set(["ground-state"])});async function Xf(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((i,s)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new yt(`Operation timed out after ${t}ms${a}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),s(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}var F0,dk,uk=x(()=>{"use strict";Fe();F0=0,dk=5e3});var L0,Qf,N0=x(()=>{"use strict";Fe();L0=3e4,Qf=class{constructor(t,n,r,o){this.controller=t;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(t){if(!(!this.isEnabled()||this.disposed||this.fired)){if(t.type==="chunk"){if(t.chunk.type==="tool_use_detail"){this.inFlightTools.add(t.chunk.toolUseId),this.clearTimer();return}if(t.chunk.type==="tool_result"){this.inFlightTools.delete(t.chunk.toolUseId),this.inFlightTools.size===0&&this.arm(this.idleTimeoutMs,t.chunk.type);return}}if(!(this.inFlightTools.size>0)){if(t.type==="paused"){this.arm(this.pausedWindowMs(t.resetsAt),t.type);return}if(t.type==="rate_limit"&&typeof t.retryAfterMs=="number"&&t.retryAfterMs>0){this.arm(t.retryAfterMs+L0,t.type);return}this.arm(this.idleTimeoutMs,t.type)}}}pausedWindowMs(t){if(t===void 0)return this.idleTimeoutMs;let n=t.getTime()-Date.now();return Math.max(this.idleTimeoutMs,n+L0)}arm(t,n){this.timer!==void 0&&clearTimeout(this.timer);let r=t>0?t:this.idleTimeoutMs,o=Date.now(),i=setTimeout(()=>{this.fire(Date.now()-o,n)},r);i.unref(),this.timer=i}clearTimer(){this.timer!==void 0&&(clearTimeout(this.timer),this.timer=void 0)}fire(t,n){if(!(this.fired||this.disposed)){this.fired=!0,this.timer=void 0;try{this.onFire?.({idleTimeoutMs:this.idleTimeoutMs,elapsedSinceLastProgressMs:t,lastEventType:n})}catch{}this.controller.signal.aborted||this.controller.abort(new ip(`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())}}});var Zf,B0=x(()=>{"use strict";ye();Fe();uk();Rr();qp();xe();N0();pt();Zf=class{constructor(t,n,r,o,i,s,a,l,c,d,u,m,f,g,h,y=0){this.id=t;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=i;this.timeoutMs=s;this.hookRegistry=a;this.onTerminal=l;this.parentInputStreamRef=c;this.parentAbortSignal=d;this.agentType=u;this.traceWriter=g;this.onSubagentSucceeded=h;this.idleTimeoutMs=y;this.progressSink=m,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=ud();lastStreamedContent="";lastStopReason;get status(){return this.currentStatus}async run(t,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=Xf(this.streamToFinalMessage(t,n),this.timeoutMs,{controller:this.controller,label:this.id});this.inFlight=o;try{let i=await o;this.lastMessage=i.content,this.lastDurationMs=Date.now()-r,this.currentStatus="succeeded",this.latestTerminalStatus="succeeded",await ni(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 s=typeof i.metadata?.totalCostUsd=="number"?i.metadata.totalCostUsd:void 0;return this.onSubagentSucceeded?.(this.currentTrace.usage,s),this.onTerminal(),i}catch(i){this.lastDurationMs=Date.now()-r;let s=this.controller.signal.aborted&&this.controller.signal.reason instanceof yt&&!this.abortGraph.isCascading(this.id)?this.controller.signal.reason:void 0,a=s??i;if(this.currentStatus!=="cancelled")if(this.controller.signal.aborted&&s===void 0){let l=this.controller.signal.reason instanceof yt;await ni(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade",...l?{timeout:!0}:{}}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"}else await ni(this.traceWriter,{transition:"failed",subagentId:this.id,errorClass:a instanceof Error?a.constructor.name:"Unknown",errorMessage:a instanceof Error?a.message:String(a),partialOutputBytes:Buffer.byteLength(this.lastStreamedContent,"utf8"),...s!==void 0?{failureClass:"timeout"}:{}}),this.currentStatus="failed",this.latestTerminalStatus="failed";throw this.onTerminal(),a}finally{this.inFlight=null}}async streamToFinalMessage(t,n){let r,o;this.lastStreamedContent="",this.currentTrace=ud();let i=n??this.progressSink??Rn(),s={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}},a=new Qf(this.controller,this.idleTimeoutMs,this.id,l=>{ie(this.traceWriter,{phase:"idle_watchdog_fired",metadata:{idleTimeoutMs:l.idleTimeoutMs,elapsedSinceLastProgressMs:l.elapsedSinceLastProgressMs,lastEventType:l.lastEventType}})});try{for await(let l of this.session.sendMessageStream(t)){if(i&&i(l,s),a.onEvent(l),l.type==="chunk"){let c=l.chunk;c.type==="content"?this.lastStreamedContent+=c.content:c.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:c.toolUseId,name:c.toolName,inputBytes:Buffer.byteLength(c.toolInput,"utf8")}):c.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:c.toolUseId,isError:c.isError,truncated:c.truncated,sizeBytes:c.sizeBytes}):c.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(l.type==="message")r=l.message,this.currentTrace.turnCount++;else if(l.type==="error"){o=l.error;break}else if(l.type==="done"){if(typeof l.metadata?.stopReason=="string"&&(this.lastStopReason=l.metadata.stopReason),typeof l.metadata?.usage=="object"&&l.metadata.usage!==null){let c=l.metadata.usage;this.currentTrace.usage={inputTokens:typeof c.input_tokens=="number"?c.input_tokens:void 0,outputTokens:typeof c.output_tokens=="number"?c.output_tokens:void 0,cacheReadTokens:typeof c.cache_read_input_tokens=="number"?c.cache_read_input_tokens:void 0,cacheCreationTokens:typeof c.cache_creation_input_tokens=="number"?c.cache_creation_input_tokens:void 0}}break}}}finally{a.dispose()}if(o)throw o;if(r)return r;if(this.lastStreamedContent.length>0)return this.lastStopReason??=$f,{role:"assistant",content:this.lastStreamedContent,timestamp:new Date};if(this.lastStopReason==="tool_use_loop_capped")return{role:"assistant",content:`[subagent ${this.id} reached its tool-use iteration cap before producing a final message; returning a capped partial result]`,timestamp:new Date};throw this.controller.signal.aborted||this.currentStatus==="cancelled"?new Error(`Subagent ${this.id} produced no terminal message`):(this.lastStopReason=$f,new Wn(`subagent ${this.id} produced no output \u2014 its model stream ended without a terminal message (stream_incomplete), and no partial text was streamed. This is typically a first-token timeout while the provider was overloaded (the connection was aborted mid retry-backoff). No findings were produced; the parent should retry or fall back.`))}async runToResult(t,n){try{let r=await this.run(t,n);return r0(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace,this.lastStopReason)}catch(r){let o=Df(this.id,this.currentStatus,r,this.currentTrace,this.lastStopReason);return this.lastStreamedContent.length>0&&(o.partialOutput=this.lastStreamedContent),o}}runInBackground(t,n,r){let o;if(r){let i=this.progressSink??Rn();o=(s,a)=>{r(s),i?.(s,a)}}this.runToResult(t,o).then(i=>{n?.(i)}).catch(i=>{W("runInBackground: unexpected rejection after runToResult",i),console.error("Subagent runInBackground failed unexpectedly:",i)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled",ni(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 this.dispatchStopAndRelease(t)}}async teardown(t){if(this.stopDispatched)return;let n=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(n,t)}}getLastStopInjectContext(){return this.lastStopInjectContext}async dispatchStopAndRelease(t,n){if(this.stopDispatched){this.onTerminal();return}this.stopDispatched=!0;let r=await NC(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:t,lastMessage:this.lastMessage,agentType:this.agentType,durationMs:this.lastDurationMs,trace:this.currentTrace},this.traceWriter?{traceWriter:this.traceWriter}:{});if(r.injectContext){if(this.parentAbortSignal?.aborted)W(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else if(n?.deferInjectContextToCaller)this.lastStopInjectContext=r.injectContext;else if(this.parentInputStreamRef)try{let o=this.parentInputStreamRef;o.queueFrameworkContext?o.queueFrameworkContext(r.injectContext):o.pushUserMessage(r.injectContext)}catch(o){W(`Failed to inject context from SubagentStop handler: ${String(o)}`)}}this.onTerminal()}}});function U0(e,t){return e===void 0||!Jc(e)||re(e)!=="openai-compatible"?{model:e}:t===void 0||Jc(t)||re(t)!=="openai-compatible"?{model:e}:{model:t,coercedFrom:e}}var j0=x(()=>{"use strict";Be();af()});import CX from"path";function PX(){let e=v.AFK_SUBAGENT_TIMEOUT_MS;if(e===void 0||e.trim()==="")return H0;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?H0:t}function MX(){let e=v.AFK_SUBAGENT_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return W0;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?W0:t}var _X,IX,H0,W0,A0,le,Ge=x(()=>{"use strict";DC();xa();qp();xe();Vn();Rr();nS();GC();ui();q();G();On();Js();Lf();Be();B0();j0();_X=async(e,t)=>({action:"decline"}),IX=50,H0=45*6e4;W0=8*6e4;A0=60*6e4,le=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentProvider;parentModel;parentCwd;parentReadRoots;worktreeMainRootCache=new Map;parentTraceWriter;parentSurface;abortGraph;rootId;rootController;counter=0;onSubagentSucceededCb;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,this.parentBaseUrl=t.baseUrl,this.parentProvider=t.parentModel!==void 0?re(t.parentModel):void 0,this.parentModel=t.parentModel,this.parentCwd=t.cwd,this.parentReadRoots=t.parentReadRoots,this.parentTraceWriter=t.traceWriter,this.parentSurface=t.surface,this.onSubagentSucceededCb=t.onSubagentSucceeded,this.abortGraph=new Gp(t.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),t.parentAbortSignal){let n=t.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(t=>({id:t.id,status:t.status}))}get(t){return this.active.get(t)}onChildAborted(t){return this.abortGraph.onChildAborted(this.rootId,t)}setOnSubagentSucceeded(t){this.onSubagentSucceededCb=t}setCwd(t){this.parentCwd=t,this.worktreeMainRootCache.delete(t)}getReadScopeInputs(){return{parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd}}async resolveMainRootForCwd(t){if(this.worktreeMainRootCache.has(t))return this.worktreeMainRootCache.get(t);let n=await KC(t);return this.worktreeMainRootCache.set(t,n),n}abortAll(t,n="user_signal"){this.abortGraph.abort(this.rootId,t,n)}async forkSubagent(t){if(t.phaseRole!==void 0&&t.phaseRole!=="read-write"&&t.config.provider!==void 0)throw new Error(`SubagentManager.forkSubagent: phaseRole "${t.phaseRole}" is mutually exclusive with config.provider. Remove one \u2014 either let the manager construct the phase-restricted provider, or use config.provider with phaseRole: "read-write" (default).`);let n=`${t.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=t.parent.sessionId,o=t.config.hookRegistry??this.hookRegistry??t.parent.hookRegistry,i=t.config.traceWriter??this.parentTraceWriter;o&&await LC(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal,...i?{traceWriter:i}:{}});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let a=t.config.cwd??this.parentCwd,l;if(t.config.readRoots===void 0){let A=this.parentReadRoots===void 0&&this.parentCwd===void 0,F;!A&&a!==void 0&&(F=await this.resolveMainRootForCwd(a),F===void 0&&this.parentCwd!==void 0&&this.parentCwd!==a&&(F=await this.resolveMainRootForCwd(this.parentCwd))),l=Ec({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,childCwd:a,worktreeMainRoot:F,...A?{}:{afkStateRoot:Se()}})}if(t.config.readRoots===void 0&&t.config.extraReadRoots!==void 0&&t.config.extraReadRoots.length>0&&(l!==void 0||a!==void 0)){let F=l??(a!==void 0?[a]:[]);l=[...new Set([...F,...t.config.extraReadRoots.map(R=>CX.resolve(R))])]}let c;if(t.config.writeRoots!==void 0&&t.config.writeRoots.length>0){let A=a!==void 0?[a]:[];c=[...new Set([...A,...t.config.writeRoots])]}let d=U0(t.config.model,this.parentModel),u=d.model??t.config.model;d.coercedFrom!==void 0&&process.stderr.write(`[afk] subagent: child model "${d.coercedFrom}" cannot run on this session's OpenAI/ChatGPT backend \u2014 running it as "${u??""}" instead (set AFK_DEFAULT_SUBAGENT_MODEL to choose a different one).
|
|
1034
|
-
`);let m={...t.config,model:u,resume:r,forkSession:r?!0:t.config.forkSession,subagentId:n,subagentToolOutputCapBytes:1e5,abortSignal:s.signal,apiKey:s0({childModel:u,configApiKey:t.config.apiKey,parentApiKey:this.parentApiKey,parentProvider:this.parentProvider}),baseUrl:t.config.baseUrl??(re(u)==="openai-compatible"?void 0:this.parentBaseUrl),isNonInteractive:t.config.isNonInteractive??!0,maxToolUseIterations:t.config.maxToolUseIterations??IX,autoResumeOnUsageLimit:t.config.autoResumeOnUsageLimit??!1,...t.config.parentSessionId===void 0&&t.parent.sessionId!==void 0?{parentSessionId:t.parent.sessionId}:{},...t.config.phaseRole===void 0&&t.phaseRole!==void 0?{phaseRole:t.phaseRole}:{},...t.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},...l!==void 0?{readRoots:l}:{},...c!==void 0?{writeRoots:c}:{},...t.config.traceWriter===void 0&&this.parentTraceWriter!==void 0?{traceWriter:this.parentTraceWriter}:{},...t.config.surface===void 0&&this.parentSurface!==void 0?{surface:this.parentSurface}:{},hookRegistry:o,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...t.denyElicitations===!1?{}:{onElicitation:_X},...t.phaseRole==="read-only"?{provider:D0("read-only",u)}:{}};m.cwd!==void 0&&WC(m.cwd);let f;try{f=new At(m)}catch(A){throw this.abortGraph.dispose(n),A}let g=t.parent.getInputStreamRef?.(),h=t.parent.abortSignal,y=this.progressSink??Rn(),b=t.agentType?.trim()||void 0,w=t.resolvedAgentType?.trim()||void 0,S=t.parentId?.trim()||void 0,T=new Zf(n,f,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??PX(),o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},g,h,b??t.idPrefix,y,S??t.parent.sessionId,i,this.onSubagentSucceededCb,t.config.idleTimeoutMs??MX());this.active.set(n,T);let k=typeof u=="string"?u:JSON.stringify(u);return ni(i,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:k,...m.tools?.allowedTools?{allowedTools:[...m.tools.allowedTools]}:{},...t.promptHead&&t.promptHead.trim()!==""?{promptHead:t.promptHead.slice(0,80)}:{},...b?{agentType:b}:{},...w?{resolvedAgentType:w}:{}}),await $e({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:k,parent_session_id:t.parent.sessionId,resolved_agent_type:w}),T}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}}});async function K0(e,t={}){let{failFast:n=!0,teardown:r=!0,maxConcurrency:o=8}=t;if(e.length===0)return[];let i=new Array(e.length),s=new Set(e.map((l,c)=>c)),a=!1;return await qs(e.map((l,c)=>c),o,async l=>{let c=e[l];n&&a&&await c.handle.cancel().catch(()=>{});let d=await c.handle.runToResult(c.prompt);if(i[l]=d,s.delete(l),n&&d.status!=="succeeded"){a=!0;for(let u of s){let m=e[u];m&&m.handle.status==="running"&&m.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(e.map(l=>l.handle.teardown())),i}var G0=x(()=>{"use strict";Qp()});function q0(e){let t=new Set;for(let n of e){let r=md(n,OX);r!==void 0&&t.add(r)}return t}var OX,z0=x(()=>{"use strict";fd();on();pm();OX=new Set([...Dt,...ot,"memory_search","agent","skill"])});import{existsSync as Y0,mkdirSync as $X,readFileSync as DX,renameSync as FX,writeFileSync as LX,unlinkSync as NX}from"fs";import{dirname as J0,join as BX}from"path";import{randomBytes as UX}from"crypto";function Re(e=ge()){if(!Y0(e))return eg();try{let t=DX(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return eg();let r=n,o=r.plugins&&typeof r.plugins=="object"?r.plugins:{};if(r.version===1)return{version:2,plugins:o,marketplaces:{}};if(r.version===2){let i=r.marketplaces&&typeof r.marketplaces=="object"?r.marketplaces:{};return{version:2,plugins:o,marketplaces:i}}return eg()}catch{return eg()}}function vd(e,t=ge()){$X(J0(t),{recursive:!0});let n=BX(J0(t),`.index.json.${process.pid}.${UX(4).toString("hex")}.tmp`),r=JSON.stringify(e,null,2);try{LX(n,r,"utf8"),FX(n,t)}catch(o){try{Y0(n)&&NX(n)}catch{}throw o}}function Ro(e,t,n=ge()){let r=Re(n);return r.plugins[e]=t,vd(r,n),r}function V0(e,t=ge()){let n=Re(t);return e in n.plugins&&(delete n.plugins[e],vd(n,t)),n}function mk(e,t,n=ge()){let r=Re(n),o=r.plugins[e];if(!o)throw new Error(`plugin "${e}" is not in the index`);return o.enabled=t,o.updatedAt=new Date().toISOString(),vd(r,n),r}function kd(e,t,n=ge()){let r=Re(n);return r.marketplaces[e]=t,vd(r,n),r}function X0(e,t=ge()){let n=Re(t),r=!1;e in n.marketplaces&&(delete n.marketplaces[e],r=!0);for(let[o,i]of Object.entries(n.plugins))i.marketplace===e&&(delete n.plugins[o],r=!0);return r&&vd(n,t),n}function eg(){return{version:2,plugins:{},marketplaces:{}}}var Yt=x(()=>{"use strict";q()});import{existsSync as fk,readFileSync as eO,readdirSync as jX,realpathSync as HX,statSync as WX}from"fs";import{join as Aa,resolve as Q0}from"path";function Or(){Ra=void 0}function $n(e=He(),t={}){let n=t.trustAll===!0,r=t.sourceEnabled,o=n?`${e}\0trustAll`:e;if(n&&r&&r.size>0){let c=[...r.entries()].map(([d,u])=>`${d}=${u?1:0}`).sort().join(",");o=`${o}\0${c}`}Ra||(Ra=new Map);let i=Ra.get(o);if(i)return[...i];if(!fk(e))return Ra.set(o,[]),[];let s=e===He()?ge():Aa(e,".index.json"),a=Re(s),l=[];return tO(e,e,0,l,new Set,a.plugins,n,r),Ra.set(o,l),[...l]}function tO(e,t,n,r,o,i,s,a){if(n>KX)return;let l;try{l=HX(t)}catch{l=t}if(o.has(l))return;if(o.add(l),fk(Aa(t,".claude-plugin","plugin.json"))){let d=gk(e,t);if(d===null){tg(r,t);return}if(s){if(a&&a.get(qX(d))===!1)return;tg(r,t);return}if(d.layout==="cache"){let m=i[d.key];if(!m||m.enabled===!1)return;tg(r,t);return}let u=i[d.key];if(u&&u.enabled===!1)return;tg(r,t);return}let c;try{c=jX(t)}catch{return}for(let d of c){if(d.startsWith("."))continue;let u=Aa(t,d),m;try{m=WX(u)}catch{continue}m.isDirectory()&&tO(e,u,n+1,r,o,i,s,a)}}function GX(e){try{let t=eO(Aa(e,".claude-plugin","plugin.json"),"utf8"),n=JSON.parse(t);if(n!==null&&typeof n=="object"&&"main"in n){let r=n.main;if(typeof r=="string"&&r.trim()!=="")return r}}catch{}}function tg(e,t){let n=GX(t);e.push(n!==void 0?{type:"local",path:t,main:n}:{type:"local",path:t})}function qX(e){if(e.layout!=="cache")return e.key;let t=e.key.indexOf(":");if(t<=0)return e.key;let n=e.key.slice(0,t);return`${e.key.slice(t+1)}@${n}`}function gk(e,t){if(!t.startsWith(e))return null;let n=t.slice(e.length).replace(/^\/+/,"");if(!n)return null;let r=n.split("/").filter(i=>i.length>0);if(r.length===0)return null;if(r[0]===Z0&&r.length>=3){let i=r[1];if(i){let s=Aa(e,Z0,i),l=zX(s,t)??r[2];if(l)return{layout:"cache",key:`${i}:${l}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function zX(e,t){let n=Aa(e,".claude-plugin","marketplace.json");if(!fk(n))return null;let r;try{r=JSON.parse(eO(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let i=Q0(t);for(let s of o){if(!s||typeof s!="object")continue;let a=s;if(!(typeof a.name!="string"||typeof a.source!="string")&&!(!a.source.startsWith("./")&&!a.source.startsWith("../"))&&Q0(e,a.source)===i)return a.name}return null}var KX,Z0,Ra,$r=x(()=>{"use strict";q();Yt();KX=5,Z0="cache"});import{existsSync as Ao,readdirSync as JX,readFileSync as YX}from"fs";import{join as Dr}from"path";function rO(e=Ce()){let t=[],n=Dr(e,"skills");if(Ao(n))for(let r of ng(n)){let o=Dr(n,r,"SKILL.md");Ao(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of nO){let o=Dr(e,`${r}s`);if(Ao(o))for(let i of ng(o))i.endsWith(".md")&&t.push({path:Dr(o,i),type:r,source:"user"})}return t}function oO(e=He()){if(!Ao(e))return[];let t=[],n=$n(e);for(let r of n){let i=gk(e,r.path)?.key,s=Dr(r.path,"skills");if(Ao(s))for(let a of ng(s)){let l=Dr(s,a,"SKILL.md");if(!Ao(l))continue;let c={path:l,type:"skill",source:"plugin"};i&&(c.plugin_key=i),t.push(c)}for(let a of nO){let l=Dr(r.path,`${a}s`);if(Ao(l))for(let c of ng(l)){if(!c.endsWith(".md"))continue;let d={path:Dr(l,c),type:a,source:"plugin"};i&&(d.plugin_key=i),t.push(d)}}}return t}function iO(e=Dr(Ce(),"settings.json")){if(!Ao(e))return[];try{let t=YX(e,"utf8"),r=JSON.parse(t).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[i,s]of Object.entries(r))if(Array.isArray(s))for(let a=0;a<s.length;a++)o.push({event:i,index:a,raw:s[a]});return o}catch{return[]}}function ng(e){try{return JX(e).filter(t=>!t.startsWith("."))}catch{return[]}}var nO,sO=x(()=>{"use strict";q();$r();nO=["command","agent"]});import{z as Le}from"zod";import{mkdir as aO,appendFile as lO}from"fs/promises";import{join as hk}from"path";function QX(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function ZX(e){let t=()=>{let i={};for(let s of uO)i[s]={correct:0,misfit:0,outlier:0};return i},n={user:t(),plugin:t()};for(let i of e)n[i.source][i.type][i.verdict]+=1;let r={high:0,med:1,low:2},o=e.filter(i=>i.verdict==="misfit").slice().sort((i,s)=>r[i.confidence]-r[s.confidence]);return{inventory:n,misfits:o}}function e9(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function t9(e){let t=e.filter(o=>o.source==="user"),n=e.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),t.length===0)r.push("(none discovered)");else for(let o of t)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 i=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${i})`)}return r.join(`
|
|
1034
|
+
`);let m={...t.config,isSubagentFork:!0,model:u,resume:r,forkSession:r?!0:t.config.forkSession,subagentId:n,subagentToolOutputCapBytes:1e5,abortSignal:s.signal,apiKey:s0({childModel:u,configApiKey:t.config.apiKey,parentApiKey:this.parentApiKey,parentProvider:this.parentProvider}),baseUrl:t.config.baseUrl??(re(u)==="openai-compatible"?void 0:this.parentBaseUrl),isNonInteractive:t.config.isNonInteractive??!0,maxToolUseIterations:t.config.maxToolUseIterations??IX,autoResumeOnUsageLimit:t.config.autoResumeOnUsageLimit??!1,...t.config.parentSessionId===void 0&&t.parent.sessionId!==void 0?{parentSessionId:t.parent.sessionId}:{},...t.config.phaseRole===void 0&&t.phaseRole!==void 0?{phaseRole:t.phaseRole}:{},...t.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},...l!==void 0?{readRoots:l}:{},...c!==void 0?{writeRoots:c}:{},...t.config.traceWriter===void 0&&this.parentTraceWriter!==void 0?{traceWriter:this.parentTraceWriter}:{},...t.config.surface===void 0&&this.parentSurface!==void 0?{surface:this.parentSurface}:{},hookRegistry:o,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...t.denyElicitations===!1?{}:{onElicitation:_X},...t.phaseRole==="read-only"?{provider:D0("read-only",u)}:{}};m.cwd!==void 0&&WC(m.cwd);let f;try{f=new At(m)}catch(A){throw this.abortGraph.dispose(n),A}let g=t.parent.getInputStreamRef?.(),h=t.parent.abortSignal,y=this.progressSink??Rn(),b=t.agentType?.trim()||void 0,w=t.resolvedAgentType?.trim()||void 0,S=t.parentId?.trim()||void 0,T=new Zf(n,f,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??PX(),o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},g,h,b??t.idPrefix,y,S??t.parent.sessionId,i,this.onSubagentSucceededCb,t.config.idleTimeoutMs??MX());this.active.set(n,T);let k=typeof u=="string"?u:JSON.stringify(u);return ni(i,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:k,...m.tools?.allowedTools?{allowedTools:[...m.tools.allowedTools]}:{},...t.promptHead&&t.promptHead.trim()!==""?{promptHead:t.promptHead.slice(0,80)}:{},...b?{agentType:b}:{},...w?{resolvedAgentType:w}:{}}),await $e({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:k,parent_session_id:t.parent.sessionId,resolved_agent_type:w}),T}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}}});async function K0(e,t={}){let{failFast:n=!0,teardown:r=!0,maxConcurrency:o=8}=t;if(e.length===0)return[];let i=new Array(e.length),s=new Set(e.map((l,c)=>c)),a=!1;return await qs(e.map((l,c)=>c),o,async l=>{let c=e[l];n&&a&&await c.handle.cancel().catch(()=>{});let d=await c.handle.runToResult(c.prompt);if(i[l]=d,s.delete(l),n&&d.status!=="succeeded"){a=!0;for(let u of s){let m=e[u];m&&m.handle.status==="running"&&m.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(e.map(l=>l.handle.teardown())),i}var G0=x(()=>{"use strict";Qp()});function q0(e){let t=new Set;for(let n of e){let r=md(n,OX);r!==void 0&&t.add(r)}return t}var OX,z0=x(()=>{"use strict";fd();on();pm();OX=new Set([...Dt,...ot,"memory_search","agent","skill"])});import{existsSync as Y0,mkdirSync as $X,readFileSync as DX,renameSync as FX,writeFileSync as LX,unlinkSync as NX}from"fs";import{dirname as J0,join as BX}from"path";import{randomBytes as UX}from"crypto";function Re(e=ge()){if(!Y0(e))return eg();try{let t=DX(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return eg();let r=n,o=r.plugins&&typeof r.plugins=="object"?r.plugins:{};if(r.version===1)return{version:2,plugins:o,marketplaces:{}};if(r.version===2){let i=r.marketplaces&&typeof r.marketplaces=="object"?r.marketplaces:{};return{version:2,plugins:o,marketplaces:i}}return eg()}catch{return eg()}}function vd(e,t=ge()){$X(J0(t),{recursive:!0});let n=BX(J0(t),`.index.json.${process.pid}.${UX(4).toString("hex")}.tmp`),r=JSON.stringify(e,null,2);try{LX(n,r,"utf8"),FX(n,t)}catch(o){try{Y0(n)&&NX(n)}catch{}throw o}}function Ro(e,t,n=ge()){let r=Re(n);return r.plugins[e]=t,vd(r,n),r}function V0(e,t=ge()){let n=Re(t);return e in n.plugins&&(delete n.plugins[e],vd(n,t)),n}function mk(e,t,n=ge()){let r=Re(n),o=r.plugins[e];if(!o)throw new Error(`plugin "${e}" is not in the index`);return o.enabled=t,o.updatedAt=new Date().toISOString(),vd(r,n),r}function kd(e,t,n=ge()){let r=Re(n);return r.marketplaces[e]=t,vd(r,n),r}function X0(e,t=ge()){let n=Re(t),r=!1;e in n.marketplaces&&(delete n.marketplaces[e],r=!0);for(let[o,i]of Object.entries(n.plugins))i.marketplace===e&&(delete n.plugins[o],r=!0);return r&&vd(n,t),n}function eg(){return{version:2,plugins:{},marketplaces:{}}}var Yt=x(()=>{"use strict";q()});import{existsSync as fk,readFileSync as eO,readdirSync as jX,realpathSync as HX,statSync as WX}from"fs";import{join as Aa,resolve as Q0}from"path";function Or(){Ra=void 0}function $n(e=He(),t={}){let n=t.trustAll===!0,r=t.sourceEnabled,o=n?`${e}\0trustAll`:e;if(n&&r&&r.size>0){let c=[...r.entries()].map(([d,u])=>`${d}=${u?1:0}`).sort().join(",");o=`${o}\0${c}`}Ra||(Ra=new Map);let i=Ra.get(o);if(i)return[...i];if(!fk(e))return Ra.set(o,[]),[];let s=e===He()?ge():Aa(e,".index.json"),a=Re(s),l=[];return tO(e,e,0,l,new Set,a.plugins,n,r),Ra.set(o,l),[...l]}function tO(e,t,n,r,o,i,s,a){if(n>KX)return;let l;try{l=HX(t)}catch{l=t}if(o.has(l))return;if(o.add(l),fk(Aa(t,".claude-plugin","plugin.json"))){let d=gk(e,t);if(d===null){tg(r,t);return}if(s){if(a&&a.get(qX(d))===!1)return;tg(r,t);return}if(d.layout==="cache"){let m=i[d.key];if(!m||m.enabled===!1)return;tg(r,t);return}let u=i[d.key];if(u&&u.enabled===!1)return;tg(r,t);return}let c;try{c=jX(t)}catch{return}for(let d of c){if(d.startsWith("."))continue;let u=Aa(t,d),m;try{m=WX(u)}catch{continue}m.isDirectory()&&tO(e,u,n+1,r,o,i,s,a)}}function GX(e){try{let t=eO(Aa(e,".claude-plugin","plugin.json"),"utf8"),n=JSON.parse(t);if(n!==null&&typeof n=="object"&&"main"in n){let r=n.main;if(typeof r=="string"&&r.trim()!=="")return r}}catch{}}function tg(e,t){let n=GX(t);e.push(n!==void 0?{type:"local",path:t,main:n}:{type:"local",path:t})}function qX(e){if(e.layout!=="cache")return e.key;let t=e.key.indexOf(":");if(t<=0)return e.key;let n=e.key.slice(0,t);return`${e.key.slice(t+1)}@${n}`}function gk(e,t){if(!t.startsWith(e))return null;let n=t.slice(e.length).replace(/^\/+/,"");if(!n)return null;let r=n.split("/").filter(i=>i.length>0);if(r.length===0)return null;if(r[0]===Z0&&r.length>=3){let i=r[1];if(i){let s=Aa(e,Z0,i),l=zX(s,t)??r[2];if(l)return{layout:"cache",key:`${i}:${l}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function zX(e,t){let n=Aa(e,".claude-plugin","marketplace.json");if(!fk(n))return null;let r;try{r=JSON.parse(eO(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let i=Q0(t);for(let s of o){if(!s||typeof s!="object")continue;let a=s;if(!(typeof a.name!="string"||typeof a.source!="string")&&!(!a.source.startsWith("./")&&!a.source.startsWith("../"))&&Q0(e,a.source)===i)return a.name}return null}var KX,Z0,Ra,$r=x(()=>{"use strict";q();Yt();KX=5,Z0="cache"});import{existsSync as Ao,readdirSync as JX,readFileSync as YX}from"fs";import{join as Dr}from"path";function rO(e=Ce()){let t=[],n=Dr(e,"skills");if(Ao(n))for(let r of ng(n)){let o=Dr(n,r,"SKILL.md");Ao(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of nO){let o=Dr(e,`${r}s`);if(Ao(o))for(let i of ng(o))i.endsWith(".md")&&t.push({path:Dr(o,i),type:r,source:"user"})}return t}function oO(e=He()){if(!Ao(e))return[];let t=[],n=$n(e);for(let r of n){let i=gk(e,r.path)?.key,s=Dr(r.path,"skills");if(Ao(s))for(let a of ng(s)){let l=Dr(s,a,"SKILL.md");if(!Ao(l))continue;let c={path:l,type:"skill",source:"plugin"};i&&(c.plugin_key=i),t.push(c)}for(let a of nO){let l=Dr(r.path,`${a}s`);if(Ao(l))for(let c of ng(l)){if(!c.endsWith(".md"))continue;let d={path:Dr(l,c),type:a,source:"plugin"};i&&(d.plugin_key=i),t.push(d)}}}return t}function iO(e=Dr(Ce(),"settings.json")){if(!Ao(e))return[];try{let t=YX(e,"utf8"),r=JSON.parse(t).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[i,s]of Object.entries(r))if(Array.isArray(s))for(let a=0;a<s.length;a++)o.push({event:i,index:a,raw:s[a]});return o}catch{return[]}}function ng(e){try{return JX(e).filter(t=>!t.startsWith("."))}catch{return[]}}var nO,sO=x(()=>{"use strict";q();$r();nO=["command","agent"]});import{z as Le}from"zod";import{mkdir as aO,appendFile as lO}from"fs/promises";import{join as hk}from"path";function QX(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function ZX(e){let t=()=>{let i={};for(let s of uO)i[s]={correct:0,misfit:0,outlier:0};return i},n={user:t(),plugin:t()};for(let i of e)n[i.source][i.type][i.verdict]+=1;let r={high:0,med:1,low:2},o=e.filter(i=>i.verdict==="misfit").slice().sort((i,s)=>r[i.confidence]-r[s.confidence]);return{inventory:n,misfits:o}}function e9(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function t9(e){let t=e.filter(o=>o.source==="user"),n=e.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),t.length===0)r.push("(none discovered)");else for(let o of t)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 i=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${i})`)}return r.join(`
|
|
1035
1035
|
`)}function n9(e,t){let n=["","## Discovered hooks (audit only these)",""];if(n.push(`Settings file (use this absolute path verbatim in each verdict's \`path\` field): \`${e}\``),n.push(""),t.length===0)return n.push("(no hooks discovered)"),n.join(`
|
|
1036
1036
|
`);for(let r of t){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(`
|
|
1037
1037
|
`)}function r9(e,t){if(!t)return{kind:"failure",message:`${e}: no result`};if(t.schemaError)return{kind:"failure",message:`${e}: schema mismatch \u2014 ${t.schemaError.message}`};if(t.status!=="succeeded"){let n=t.error?` \u2014 ${t.error.message}`:"";return{kind:"failure",message:`${e}: ${t.status}${n}`}}return t.output?{kind:"success",output:t.output}:{kind:"failure",message:`${e}: no output`}}async function o9(e,t,n){let r=n?.apiKey,o=n?.defaultSubagentModel??n?.defaultModel??"sonnet",i=n?.callId,s=typeof e=="object"&&e!==null?e:{},a=VX.parse(s),l=a.writeBriefs??!0,c=a.scope??"all",d=QX(c);if(!t?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let u=t.sessionId,m=Ue("audit-fit"),f={skill:m["01-skill-inspector.md"],command:m["02-command-inspector.md"],agent:m["03-agent-inspector.md"],hook:m["04-hook-inspector.md"]};for(let $ of uO)if(!f[$])throw new Error(`audit-fit skill missing inspector prompt for ${$}`);let g=d.runUserDiscovery?rO():[],h=d.runPluginDiscovery?oO():[],y={skill:[],command:[],agent:[]};for(let $ of[...g,...h])y[$.type].push($);let b=new le({apiKey:r,...n?.defaultModel!==void 0?{parentModel:n.defaultModel}:{},...n?.traceWriter!==void 0?{traceWriter:n.traceWriter}:{}}),w=q0(Eo.allowedTools),S=()=>async $=>w.has($)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${$} not allowed for audit-fit inspectors. Allowed tools: ${[...w].join(", ")}`},T=[];for(let $ of XX){let H=y[$];if(H.length===0)continue;let C=f[$];C&&T.push({type:$,prompt:`${C}
|
|
@@ -1156,13 +1156,13 @@ ${e}`:t:[{type:"text",text:t},...e]}var vg,V$=x(()=>{"use strict";jk();Hk();ye()
|
|
|
1156
1156
|
`);if(r.length<=1&&e.length<=80)return{content:e,truncated:!1,sizeBytes:t,sizeLabel:n};if(r.length<=1)return e.length<=80?{content:e,truncated:!1,sizeBytes:t,sizeLabel:n}:{content:e.substring(0,80)+"\u2026",truncated:!0,sizeBytes:t,sizeLabel:n};if(e.length<=80)return{content:e,truncated:!1,sizeBytes:t,sizeLabel:n};let o=r[0]??"",i=o;return o.length>80&&(i=o.substring(0,80)+"\u2026"),{content:i+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:t,sizeLabel:n}}function EQ(e,t){let n={...e.raw??{}};return e.inputTokens!==void 0&&(n.input_tokens=e.inputTokens),e.outputTokens!==void 0&&(n.output_tokens=e.outputTokens),e.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=e.cachedInputTokens),e.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=e.cacheCreationTokens),e.totalTokens!==void 0&&(n.total_tokens=e.totalTokens),e.contextWindowTokens!==void 0&&(n.context_window_tokens=e.contextWindowTokens),{sessionId:t,stopReason:e.stopReason??void 0,resultSubtype:e.resultSubtype,durationMs:e.durationMs,durationApiMs:e.durationApiMs,totalCostUsd:e.totalCostUsd,isError:e.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:e.modelUsage,permissionDenials:e.permissionDenials,errors:e.errors}}function xQ(e){let t=e.isError===!0?null:kD(e.toolName,e.content),n=t!==null?{display:t}:{},r=typeof e.batchIndex=="number"&&typeof e.batchSize=="number"?{batchIndex:e.batchIndex,batchSize:e.batchSize}:{},o=vQ(e.content);if(o)return{type:"chunk",chunk:{type:"tool_result",toolUseId:e.toolUseId,content:`Output persisted (${o.sizeLabel}) \u2192 ${o.absolutePath}`,isError:e.isError===!0,persistedPath:o.absolutePath,sizeBytes:o.sizeBytes,sizeLabel:o.sizeLabel,...n,...r}};let{content:i,lineCount:s,sizeBytes:a,sizeLabel:l}=TQ(e.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:e.toolUseId,content:i,isError:e.isError===!0,sizeBytes:a,sizeLabel:l,...e.truncated===!0&&{truncated:!0},...s!==void 0&&{lineCount:s},...n,...r}}}function qk(e,t){switch(e.type){case"session.init":{let n=e.info;return t.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),t.updateSessionIdentity(n.sessionId),t.resolveInitialization(),null}case"session.status":return t.setSessionMetadata(n=>({...n,sessionId:e.sessionId,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{permissionMode:n.permissionMode},...e.status!==void 0?{status:e.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:e.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:e.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(e.sessionId&&t.updateSessionIdentity(e.sessionId),e.text){let n={role:"assistant",content:e.text,timestamp:new Date};return t.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:e.toolUseId,toolName:e.toolName,toolInput:e.toolInput,toolInputRaw:e.toolInputRaw}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:e.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:e.toolUseIds}}};case"tool.output":return e.isError!==!0&&e.toolName&&(t._successfulToolNames??=[]).push(e.toolName),xQ(e);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:e.toolUseId,diff:e.diff}};case"progress":return{type:"progress",progress:{taskId:e.progress.taskId,description:e.progress.description,...e.progress.summary!==void 0?{summary:e.progress.summary}:{},...e.progress.lastToolName!==void 0?{lastToolName:e.progress.lastToolName}:{},totalTokens:e.progress.totalTokens,toolUses:e.progress.toolUses,durationMs:e.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:e.suggestion};case"turn.completed":{let n=EQ(e.usage,e.sessionId??t.getSessionMetadata().sessionId);t._successfulToolNames!==void 0&&t._successfulToolNames.length>0&&(n.successfulToolNames=[...t._successfulToolNames]),t.setLastResponseMetadata(n);for(let r=t.conversationHistory.length-1;r>=0;r--){let o=t.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(t.maxBudgetUsd!==void 0&&t.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(t._runningCostUsd=(t._runningCostUsd??0)+n.totalCostUsd,t._runningCostUsd>=t.maxBudgetUsd)){wA(t.traceWriter,{kind:"monetary",runningCostUsd:t._runningCostUsd,maxBudgetUsd:t.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new Zr(t._runningCostUsd,t.maxBudgetUsd);return t.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:e.error};case"paused":return{type:"paused",reason:e.reason,...e.resetsAt!==void 0?{resetsAt:e.resetsAt}:{},...e.accountId!==void 0?{accountId:e.accountId}:{},...e.autoResume!==void 0?{autoResume:e.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:e.hotSwapped,...e.accountId!==void 0?{accountId:e.accountId}:{}};case"stream.retry":return{type:"stream_retry"};case"rate_limit":return{type:"rate_limit",...e.retryAfterMs!==void 0?{retryAfterMs:e.retryAfterMs}:{}};default:return null}}var ED=x(()=>{"use strict";Fe();xe();TD()});import{stat as RQ,readFile as AQ,writeFile as CQ,rename as _Q,unlink as IQ}from"node:fs/promises";async function AD(e,{maxBytes:t,keepTailLines:n}){let r={trimmed:!1,removedLines:0},o;try{if((await RQ(e)).size<=t)return r;let a=(await AQ(e,"utf8")).split(`
|
|
1157
1157
|
`);if(a.length>0&&a[a.length-1]===""&&a.pop(),a.length<=n)return r;let l=a.slice(a.length-n),c=a.length-l.length;return o=`${e}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`,await CQ(o,l.join(`
|
|
1158
1158
|
`)+`
|
|
1159
|
-
`,{mode:384}),await _Q(o,e),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await IQ(o)}catch{}return r}}var xD,RD,CD=x(()=>{"use strict";xD=5*1024*1024,RD=5e3});import{z as PQ}from"zod";var At,zk=x(()=>{"use strict";ye();Fe();xe();Be();V$();Et();uk();Z$();Fe();oD();zv();jk();dD();uD();En();wo();Hs();Pt();Hk();fD();gD();ED();q();CD();At=class{config;planExit=new Cg;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new Ag;constructor(t){this.config=t.parentSessionId===void 0&&t.planExitControls===void 0?{...t,planExitControls:{setPermissionMode:r=>this.setPermissionMode(r),requestImplementSeed:(r,o)=>this.planExit.requestImplementSeed(r,o),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:t,this.abortController=new AbortController,this._hookRegistry=t.hookRegistry,pD(t.abortSignal,this.abortController,()=>{this.onAbort()});let n=String(t.model);ie(t.traceWriter,{phase:"session_init_start",model:n,resolvedModel:Tt(t.model)??n,origin:bo(t.surface),actor:Zm(t.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&AD(Yu(),{maxBytes:xD,keepTailLines:RD})}initSdkLifecycle(){this.config.models&&yp(this.config.models),Sg(this.config);let t=Tt(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=mD(this.config,t);this.stateManager=new _g(n,r),this.inputStream=new Oa(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)W(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{W("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let s=this.config.providerFactory?this.config.providerFactory:a=>wg(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new vg({prompt:o,config:this.config},{resolveProvider:s,providerNameForModel:a=>re(a),resolveApiKey:a=>Pe(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let i=this.providerQuery;this.providerIterator=i[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{let t=await X$(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId,parentSessionId:this.config.parentSessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});for(t&&this.config.parentSessionId===void 0&&this.queueFrameworkContext(t);;){let n=await this.providerIterator.next();if(n.done){this.stateManager.resolveInitializationIfNeeded();return}let r=n.value,o=qk(r,this.buildTransformDeps());if(r.type==="session.init"){await ie(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(o&&o.type==="error"){this.sawProviderError=!0;return}}}catch(t){let n=t instanceof Error?t:new Error(String(t));n instanceof he&&(this.hookBlocked=!0),this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{_successfulToolNames:[],conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:t=>this.stateManager.setSessionMetadata(t),updateSessionIdentity:t=>this.stateManager.updateSessionIdentity(t),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:t=>{this.lastResponseMetadata=t,typeof t.totalCostUsd=="number"&&Number.isFinite(t.totalCostUsd)&&(this.sessionRunningCostUsd+=t.totalCostUsd);let n=t.usage;if(n&&typeof n=="object"){let r=n,o=(i,s)=>{let a=r[i];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[s]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof t.stopReason=="string"&&(this.lastStopReason=t.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:t=>{this.abortController.signal.aborted||this.abortController.abort(t)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(t){if(t==="closed"||t.startsWith("Budget ")||t.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${t}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(t)}async sendMessage(t,n={}){this.assertCanSend();let r=this.config.timeoutMs??F0,o=async()=>{let i=null,s="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(t)){if(a.type==="chunk"&&a.chunk.type==="content"&&(s+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(i=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(i)return{...i,metadata:a.metadata};if(s)return{role:"assistant",content:s,metadata:a.metadata,timestamp:new Date}}}if(i)return i;if(s)return{role:"assistant",content:s,timestamp:new Date};throw new Error("No assistant response received")};try{return await Xf(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async sendMessageStructured(t,n,r={}){let{maxRetries:o=2,injectSchemaPrompt:i=!0,...s}=r,a=i?"\n\nRespond with ONLY a JSON object (optionally in a ```json fence) that conforms to this JSON Schema:\n```json\n"+JSON.stringify(PQ.toJSONSchema(n,{target:"openapi-3.0"}))+"\n```":"",l="";for(let c=0;c<=o;c++){let d=c===0?t+a:`Your previous response did not match the required JSON schema.
|
|
1159
|
+
`,{mode:384}),await _Q(o,e),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await IQ(o)}catch{}return r}}var xD,RD,CD=x(()=>{"use strict";xD=5*1024*1024,RD=5e3});import{z as PQ}from"zod";var At,zk=x(()=>{"use strict";ye();Fe();xe();Be();V$();Et();uk();Z$();Fe();oD();zv();jk();dD();uD();En();wo();Hs();Pt();Hk();fD();gD();ED();q();CD();At=class e{static claimedTraceWriters=new WeakSet;config;planExit=new Cg;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;ownsTraceSeal;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new Ag;constructor(t){this.ownsTraceSeal=t.traceWriter!==void 0&&t.isSubagentFork!==!0&&!e.claimedTraceWriters.has(t.traceWriter),this.ownsTraceSeal&&e.claimedTraceWriters.add(t.traceWriter),this.config=t.parentSessionId===void 0&&t.planExitControls===void 0?{...t,planExitControls:{setPermissionMode:r=>this.setPermissionMode(r),requestImplementSeed:(r,o)=>this.planExit.requestImplementSeed(r,o),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:t,this.abortController=new AbortController,this._hookRegistry=t.hookRegistry,pD(t.abortSignal,this.abortController,()=>{this.onAbort()});let n=String(t.model);ie(t.traceWriter,{phase:"session_init_start",model:n,resolvedModel:Tt(t.model)??n,origin:bo(t.surface),actor:Zm(t.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&AD(Yu(),{maxBytes:xD,keepTailLines:RD})}initSdkLifecycle(){this.config.models&&yp(this.config.models),Sg(this.config);let t=Tt(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=mD(this.config,t);this.stateManager=new _g(n,r),this.inputStream=new Oa(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)W(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{W("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let s=this.config.providerFactory?this.config.providerFactory:a=>wg(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new vg({prompt:o,config:this.config},{resolveProvider:s,providerNameForModel:a=>re(a),resolveApiKey:a=>Pe(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let i=this.providerQuery;this.providerIterator=i[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{let t=await X$(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId,parentSessionId:this.config.parentSessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});for(t&&this.config.parentSessionId===void 0&&this.queueFrameworkContext(t);;){let n=await this.providerIterator.next();if(n.done){this.stateManager.resolveInitializationIfNeeded();return}let r=n.value,o=qk(r,this.buildTransformDeps());if(r.type==="session.init"){await ie(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(o&&o.type==="error"){this.sawProviderError=!0;return}}}catch(t){let n=t instanceof Error?t:new Error(String(t));n instanceof he&&(this.hookBlocked=!0),this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{_successfulToolNames:[],conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:t=>this.stateManager.setSessionMetadata(t),updateSessionIdentity:t=>this.stateManager.updateSessionIdentity(t),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:t=>{this.lastResponseMetadata=t,typeof t.totalCostUsd=="number"&&Number.isFinite(t.totalCostUsd)&&(this.sessionRunningCostUsd+=t.totalCostUsd);let n=t.usage;if(n&&typeof n=="object"){let r=n,o=(i,s)=>{let a=r[i];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[s]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof t.stopReason=="string"&&(this.lastStopReason=t.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:t=>{this.abortController.signal.aborted||this.abortController.abort(t)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(t){if(t==="closed"||t.startsWith("Budget ")||t.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${t}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(t)}async sendMessage(t,n={}){this.assertCanSend();let r=this.config.timeoutMs??F0,o=async()=>{let i=null,s="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(t)){if(a.type==="chunk"&&a.chunk.type==="content"&&(s+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(i=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(i)return{...i,metadata:a.metadata};if(s)return{role:"assistant",content:s,metadata:a.metadata,timestamp:new Date}}}if(i)return i;if(s)return{role:"assistant",content:s,timestamp:new Date};throw new Error("No assistant response received")};try{return await Xf(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async sendMessageStructured(t,n,r={}){let{maxRetries:o=2,injectSchemaPrompt:i=!0,...s}=r,a=i?"\n\nRespond with ONLY a JSON object (optionally in a ```json fence) that conforms to this JSON Schema:\n```json\n"+JSON.stringify(PQ.toJSONSchema(n,{target:"openapi-3.0"}))+"\n```":"",l="";for(let c=0;c<=o;c++){let d=c===0?t+a:`Your previous response did not match the required JSON schema.
|
|
1160
1160
|
Validation error: ${l}
|
|
1161
1161
|
Respond again with ONLY a JSON object (optionally in a \`\`\`json fence) that satisfies the schema.`+a,u=await this.sendMessage(d,s),m=Of(u.content),f=n.safeParse(m);if(f.success)return f.data;l=f.error.message}throw new Error(`structured output did not match schema after ${o+1} attempt(s): ${l}`)}async*sendMessageStream(t){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(t)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(t){this.initPromise&&await this.initPromise,this.planExit.clearModeBeforeDefault();let n=this.withPendingFrameworkContext(t),r=typeof n=="string"?n:this.summarizeContentBlocks(n),o={role:"user",content:r,timestamp:new Date};this.conversationHistory.push(o),this.inputStream.pushUserMessage(n),this.ensureLedger(),this.ledger.recordUser(r);let i=this.buildTransformDeps();try{for(;;){let s=await this.providerIterator.next();if(s.done)break;let a=s.value,l=qk(a,i);if(l&&(l.type==="done"?(this.turnCount++,this.sawProviderError=!1):l.type==="error"&&(this.sawProviderError=!0),this.ledger.recordEvent(l),yield l,l.type==="done"||l.type==="error"))break}}finally{this.currentState==="streaming"&&(this.currentState="idle")}}ensureLedger(){this.ledger.ensure({depth:this.config.depth,parentSessionId:this.config.parentSessionId,sessionId:this.sessionId,fallbackModel:String(this.config.model),tracePath:this.config.traceWriter?.getTracePath(),getMetadata:()=>this.getSessionMetadata()})}recordLedgerElicitation(t,n){this.ledger.recordElicitation(t,n)}summarizeContentBlocks(t){let n=[],r=0;for(let i of t)i.type==="text"?n.push(i.text):i.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new ct("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset"),await this.ledger.seal("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(t=>setTimeout(t,dk))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(t){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${t instanceof Error?t.message:String(t)}`,{cause:t})}}async onAbort(){this.ledger.seal("abort");try{await this.providerQuery.interrupt()}catch{}}async setModel(t){let n=Tt(t);typeof t=="string"&&t.length>0&&await this.providerQuery.setModel(t),n&&this.stateManager.setSessionMetadata(r=>({...r,model:n}))}async setPermissionMode(t){let n=this.stateManager.getSessionMetadata().permissionMode;this.planExit.recordModeTransition(t,n),await this.providerQuery.setPermissionMode(t),this.stateManager.setSessionMetadata(r=>({...r,permissionMode:t}))}getPrePlanMode(){return this.planExit.getPrePlanMode()}async takePendingPlanExitSeed(){let t=this.planExit.takeSeed();if(t!==void 0){try{await this.setPermissionMode(t.mode)}catch(n){W(`\u26A0\uFE0F AgentSession: deferred plan-exit mode flip to '${t.mode}' rejected; dropping implement-seed (staying in plan mode): ${n instanceof Error?n.message:String(n)}`);return}return{message:t.message,mode:t.mode}}}setCwd(t){this.config={...this.config,cwd:t},this.providerQuery.setCwd?.(t),this.config.sessionId!==void 0&&IC(this.config.sessionId,t)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(t,n){return this.providerQuery.rewindFiles(t,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let t=this.providerQuery.compact?.bind(this.providerQuery);if(!t)return{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0};this.currentState="compacting";try{return await t()}finally{this.currentState="idle"}}listRewindTargets(){return this.currentState==="closed"?[]:this.providerQuery.listRewindTargets?.()??[]}async rewindConversation(t){if(this.currentState==="closed")throw new Error("Cannot rewind: session is closed");if(this.currentState!=="idle")return{rewound:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let n=this.providerQuery.rewindConversation?.bind(this.providerQuery);return n?n(t):{rewound:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}queueFrameworkContext(t){let n=t.trim();n.length!==0&&(this.pendingFrameworkContext.push(n),W(`AgentSession: queued framework context (${n.length} chars) for the next user message`))}withPendingFrameworkContext(t){if(this.pendingFrameworkContext.length===0)return t;let n=this.pendingFrameworkContext.join(`
|
|
1162
1162
|
|
|
1163
1163
|
`);return this.pendingFrameworkContext=[],typeof t=="string"?`${n}
|
|
1164
1164
|
|
|
1165
|
-
${t}`:[{type:"text",text:n},...t]}getInputStreamRef(){return{pushUserMessage:t=>this.inputStream.pushUserMessage(t),queueFrameworkContext:t=>this.queueFrameworkContext(t)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",await this.ledger.seal("close"),this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(t=>setTimeout(t,dk))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(t){if(this.sessionEndDispatched)return;this.sessionEndDispatched=!0;let n=this.closureSignals(t);await nD(this.config.traceWriter,{...n,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,runningTokens:this.sessionRunningTokens}).catch(()=>{}),this.
|
|
1165
|
+
${t}`:[{type:"text",text:n},...t]}getInputStreamRef(){return{pushUserMessage:t=>this.inputStream.pushUserMessage(t),queueFrameworkContext:t=>this.queueFrameworkContext(t)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",await this.ledger.seal("close"),this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(t=>setTimeout(t,dk))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(t){if(this.sessionEndDispatched)return;this.sessionEndDispatched=!0;let n=this.closureSignals(t);await nD(this.config.traceWriter,{...n,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,runningTokens:this.sessionRunningTokens}).catch(()=>{}),this.ownsTraceSeal&&await rD(this.config.traceWriter,{...n,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,subagentCompletedCount:this.subagentCompletedCount,subagentRunningTokens:this.subagentRunningTokens,subagentRunningCostUsd:this.subagentRunningCostUsd}).catch(()=>{}),await Q$(this._hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:t,parentSessionId:this.config.parentSessionId,...this.config.traceWriter?{tracePath:this.config.traceWriter.getTracePath()}:{}},this.config.traceWriter?{traceWriter:this.config.traceWriter}:{})}closureSignals(t){return{dispatchReason:t,signal:this.abortController.signal,maxTurnsHit:this.maxTurnsHit,hookBlocked:this.hookBlocked,lastStopReason:this.lastStopReason,sawProviderError:this.sawProviderError}}recordSubagentCompletion(t,n){if(this.subagentCompletedCount++,t){let r=(o,i)=>{typeof o=="number"&&Number.isFinite(o)&&o>0&&(this.subagentRunningTokens[i]+=o)};r(t.inputTokens,"input"),r(t.outputTokens,"output"),r(t.cacheReadTokens,"cacheRead"),r(t.cacheCreationTokens,"cacheCreation")}typeof n=="number"&&Number.isFinite(n)&&n>0&&(this.subagentRunningCostUsd+=n)}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new ct("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming"||this.currentState==="compacting")throw new Error("Cannot send message: session is busy");if(this.config.maxTurns&&this.turnCount>=this.config.maxTurns)throw this.maxTurnsHit=!0,new Error(`Maximum turns (${this.config.maxTurns}) exceeded`)}}});var xa=x(()=>{"use strict";zk()});var cL={};Hu(cL,{KeychainOAuthProvider:()=>Qa,clearOauthPending:()=>uT,readOauthPending:()=>lL});import{existsSync as Xg,mkdirSync as sL,readFileSync as Qg,writeFileSync as dT}from"node:fs";import{execFileSync as nL}from"node:child_process";import{randomUUID as vte}from"node:crypto";import{homedir as rL,userInfo as oL}from"node:os";import{join as iL,dirname as aL}from"node:path";function Tte(){let e=process.platform==="darwin",t=process.platform==="linux";return{read(){if(e)try{return nL("security",["find-generic-password","-s","Claude Code-credentials","-a",oL().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()||void 0}catch{return}if(t){let n=iL(rL(),".claude",".credentials.json");if(!Xg(n))return;try{return Qg(n,"utf-8")}catch{return}}},write(n){if(e)nL("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",oL().username,"-w",n],{stdio:["ignore","ignore","ignore"]});else if(t){let r=iL(rL(),".claude",".credentials.json");sL(aL(r),{recursive:!0}),dT(r,n,{encoding:"utf-8",mode:384})}}}}function lL(){let e=ic();if(!Xg(e))return{};let t;try{t=JSON.parse(Qg(e,"utf-8"))}catch{return{}}if(t===null||typeof t!="object")return{};let n={};for(let[r,o]of Object.entries(t)){if(o===null||typeof o!="object")continue;let i=o;i.status==="oauth_pending"&&typeof i.authorizationUrl=="string"&&typeof i.timestamp=="number"&&Date.now()-i.timestamp<=kte&&(n[r]={status:"oauth_pending",authorizationUrl:i.authorizationUrl,timestamp:i.timestamp})}return n}function uT(e){let t=ic();if(!Xg(t))return;let n;try{n=JSON.parse(Qg(t,"utf-8"))}catch{return}e in n&&(delete n[e],dT(t,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}))}function Ete(e,t){let n=ic();sL(aL(n),{recursive:!0});let r={};if(Xg(n))try{r=JSON.parse(Qg(n,"utf-8"))}catch{}let o=new URL(t),i=o.origin+o.pathname;r[e]={status:"oauth_pending",authorizationUrl:i,timestamp:Date.now()},dT(n,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384})}var kte,Qa,Zg=x(()=>{"use strict";q();kte=600*1e3;Qa=class{serverName;backend;constructor(t,n=Tte()){this.serverName=t,this.backend=n}get redirectUrl(){return"http://localhost:3000/oauth/callback"}get clientMetadata(){return{redirect_uris:[this.redirectUrl],client_name:"agent-afk",grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}clientInformation(){return this._readSlot().clientInfo}saveClientInformation(t){this._updateSlot(n=>({...n,clientInfo:t}))}tokens(){return this._readSlot().tokens}saveTokens(t){this._updateSlot(n=>({...n,tokens:t}));try{uT(this.serverName)}catch{}}saveCodeVerifier(t){this._updateSlot(n=>({...n,codeVerifier:t}))}codeVerifier(){let t=this._readSlot().codeVerifier;if(!t)throw new Error(`[mcp:${this.serverName}] no PKCE code verifier stored`);return t}state(){let t=this._readSlot().state;if(t)return t;let n=vte();return this._updateSlot(r=>({...r,state:n})),n}saveDiscoveryState(t){this._updateSlot(n=>({...n,discoveryState:t}))}discoveryState(){return this._readSlot().discoveryState}invalidateCredentials(t){this._updateSlot(n=>{if(t==="all")return{};let r={...n};return t==="client"&&delete r.clientInfo,t==="tokens"&&delete r.tokens,t==="verifier"&&(delete r.codeVerifier,delete r.state),t==="discovery"&&delete r.discoveryState,r})}async redirectToAuthorization(t){let n=t.toString(),r=`\u{1F510} MCP server "${this.serverName}" requires authorization.
|
|
1166
1166
|
|
|
1167
1167
|
Open this URL to authorize:
|
|
1168
1168
|
${n}`;Ete(this.serverName,n);let o=!1;try{let{pushIfConfigured:i}=await Promise.resolve().then(()=>(Tr(),jw));o=await i(r)!==null}catch{}o||process.stderr.write(`[mcp:${this.serverName}] OAuth authorization required.
|
|
@@ -1754,7 +1754,7 @@ ${T}
|
|
|
1754
1754
|
${k}`})}return{fileBlocks:l,warnings:c}}async function aH(e,t,n,r,o="summary",i,s){let a=jB(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),nl(process.stdout,Ud(process.cwd(),!0));let l="",c=0,d=!1,u=!1,m=!1,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,T=[],k=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,F=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then($=>{for(let H of $)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${H.jobId}: ${H.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,D=()=>new Sl({out:vl(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(j=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:F}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...R?{compositor:R}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=D(),O=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let $=j;i.fn=H=>$.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.($=>_.setInterrupting($)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,_.setSoftStopping(!0),t.interrupt().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),P)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(F);let{fileBlocks:j,warnings:$}=sH(e.text,{rootDir:process.cwd()});for(let P of $)(i??{fn:console.log}).fn(p.dim(` @-file: ${P}`));let H=j.length>0||e.attachments.length>0?iH(e.text,e.attachments,void 0,j):e.text,C=t.sendMessageStream(H);if(await Gs((P,M)=>{_.process(P,M)},async()=>{for await(let P of C){if(h||y)break;if(P.type==="chunk"&&P.chunk.type==="content"?(l+=P.chunk.content,d=!0):P.type==="message"&&!d&&(l=P.message.content),P.type==="stream_retry"&&(l=l.slice(0,c)),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let M=P.chunk,I={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};k.set(M.toolUseId,I),T.push(I)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let I=k.get(M.toolUseId);if(I&&(I.result=M.content,I.isError=M.isError,k.delete(M.toolUseId)),r.onContextProgress){let U=Date.now();if(U-w>=S){w=U;try{let K=r.onContextProgress();K instanceof Promise&&await K}catch(K){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),K)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await O(),R&&P.autoResume===!0){let M=new AbortController;b.abort=M;let I=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,U=I?`Keep waiting \u2014 auto-resumes at ${I}`:"Keep waiting \u2014 auto-resume in progress",K="Switch model / provider (type /model after)",Z="Stop waiting",te=[p.warning(" \u23F3 Usage limit reached.")+(I?p.dim(` Auto-resumes at ${I}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];dr(R,{header:te,options:[U,K,Z],signal:M.signal,initialIndex:0}).then(se=>{if(b.abort=null,!se)return;let z=se[0];z===void 0||z===U||(y=!0,z===K&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(fe=>{Ke()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),fe)}))}).catch(se=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),se)})}else(i??{fn:console.log}).fn(gA({reason:P.reason,...P.resetsAt!==void 0?{resetsAt:P.resetsAt}:{},...P.accountId!==void 0?{accountId:P.accountId}:{},...P.autoResume!==void 0?{autoResume:P.autoResume}:{}}));continue}if(P.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,T.length=0,k.clear(),f=!1,g=void 0,u=!1,_=D(),m=!1,await B(),(i??{fn:console.log}).fn(p.success(M));continue}if(P.type==="error"){await O(),As(vs(P.error)),u=!0;continue}_.process(P),P.type==="done"&&(f=!0,g=P.metadata)}}),await O(),h){let P=i?i.fn:console.log,M=R?R.getPendingCount():0,I=M>0?` \xB7 ${M} queued`:"";P(p.warning(`\u23F8 Stopped${I} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(f&&!h&&!y){Li(n,a,l,g,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),tl(process.stdout),IL(process.stdout,"afk: turn complete");let P=I=>{i?i.fn(I):console.log(I)},M=Ny(l);if(M){P(oH(M)),P("");let I=tN(T);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:I})}catch{}if(n.permissionMode==="autonomous"){let U=M.kind==="done"&&bc().verifyDone===!0&&!I;rN(M,void 0,{unverified:U})}}if(qce(g,n,P),r.onAfterTurn){let I=r.onAfterTurn();I instanceof Promise&&await I.catch(()=>{})}}}catch(j){await O(),u||As(vs(j))}finally{await O(),nl(process.stdout,Ud(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function Gce(e,t){let n=Math.round(e*100),r=ue(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ue(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function qce(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ve(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ue(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=vT(t),a=zt(t.model),l=Gce(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var zce=5e3,Jce=3,Yce="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Vce(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function lH(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async F=>{Ke()&&(f=yh(F)),await fu(e.session.current),Ke()&&(g=OE())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,T,k,A=0;for(m.onInjectable=()=>{A>=Jce||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,tl(process.stdout),h={text:Yce,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let C of g)e.replRenderer.writeLine(C);e.replRenderer.writeLine(""),g=[]}let F=u.drainNotifications();for(let{job:C,result:L}of F){let P=L.errorReason===void 0?"\u2713":"\u2717",M=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,I=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${P} [${C.id}] ${M} \xB7 ${I}s \xB7 `)+C.command)}let R=m.drainNotifications();for(let{job:C}of R){let L=C.status==="completed"?"\u2713":C.status==="failed"?"\u2717":"\u2298",P=C.endedAt!==void 0?Math.max(0,Math.round((C.endedAt-C.startedAt)/100)/10):0,M=C.label.length>60?`${C.label.slice(0,60)}\u2026`:C.label;e.replRenderer.writeLine(p.dim(` ${L} [${C.jobId}] subagent ${C.status} \xB7 ${P}s \xB7 `)+M)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let C of D)e.replRenderer.writeLine(C);e.replRenderer.writeLine("")}let _,O;if(h===void 0){let C=await e.session.current.takePendingPlanExitSeed();C!==void 0&&(e.stats.permissionMode=C.mode,h={text:C.message,attachments:[]})}if(h!==void 0){let C=h;h=void 0;let L=xl(e.stats.permissionMode),P=qi({buffer:C.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:dl([...C.attachments])});e.replRenderer.writeLine(P),_=C.text.trim(),O=C.attachments}else{let C=y;y=void 0;let L=await o.readLine({promptFn:()=>xl(e.stats.permissionMode),...C!==void 0?{initialBuffer:C}:{},onSigint:r,onShiftTab:()=>{$y(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});_=L.text.trim(),O=L.attachments}if(!_&&O.length===0)continue;if(_.startsWith("!")){let C=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!C&&(b||(b=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(_))){e.statusLine.rearm();continue}}let B=!1;if(_.startsWith("/")){let C=await HL(_,e.slashCtx,O);if(C.handled){if(C.result==="exit"){e.rl.close();return}if((_==="/clear"||_.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="submit"){h={text:C.result.message,attachments:O??[]},e.statusLine.rearm();continue}if(C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="prefill"){y=C.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}a.push(_),await Vce(e,_);let j=_;if(B){let C=ST(_);if(C){let L=C.name.replace(/^\//,"").split(":").pop()??"";if(L&&_E(L)){let P={skillName:L,rawArgs:C.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,I=ts(M),U=Date.now();W(`[afk trace] preflight.start commandName=${L}`);let K=!1,Z=await es(P,{cwd:e.stats.cwd??process.cwd(),artifactDir:I},te=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${L}) failed: `)+(te instanceof Error?te.message:String(te)))});K=Z!==null,W(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-U} success=${K}`),j=PE(Z?.manifestBlock,_)}}}let $=u.drainInjections();$.length>0&&(j=$+j);let H=m.drainInjections();if(H.length>0&&(j=H+j),S!==void 0&&(j=S+`
|
|
1755
1755
|
|
|
1756
1756
|
`+j,S=void 0),e.hookRegistry)try{let C={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(C);L.injectContext&&(j=L.injectContext+j)}catch(C){if(C instanceof he){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(C.reason?p.dim(`: ${_r(C.reason)}`):"")),e.statusLine.rearm();continue}if(C instanceof Jn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${C.timeoutMs}ms`)),e.statusLine.rearm();continue}throw C}if(T=void 0,k=void 0,await aH({text:j,attachments:O},e.session.current,e.stats,{setInFlight(C){n.turnInFlight=C},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(C){await t.appendUser(C)},async onTurnComplete(C,L){if(await t.appendTurn(C,L),e.stats.sessionId)try{Oo(e.stats)}catch(P){w||(w=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(P instanceof Error?P.message:String(P))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(C,L)=>{d?.push(C),T=C.kind,k=L?.doneHasCorroboratingEvidence},setActiveCompositor:C=>{n.activeCompositor=C},setInterruptNotifier:C=>{n.notifyInterrupting=C},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:C=>o.setBackgroundHandler(C),setSoftStopHandler:i,setPausedState:C=>o.setPausedState(C),setPauseInterruptHandler:C=>o.setPauseInterruptHandler(C),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Dn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:C=>c.repaint(C)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(xl(e.stats.permissionMode))),e.hookRegistry)try{let C=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...T!==void 0?{terminalState:T}:{},...k!==void 0?{doneHasCorroboratingEvidence:k}:{}},void 0,zce);C.injectContext&&C.injectContext.trim().length>0&&(S=C.injectContext)}catch(C){if(C instanceof ct)throw C;C instanceof Jn?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):C instanceof he?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${_r(C.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(C))}}}function Xce(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function cH(e,t,n,r){let o=await H1(),i=new Oy({rl:e.rl,history:o,statusLine:e.statusLine}),s=Xce(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await z1(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=rH(e,n),await lH(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}fc();ta();import{execFile as Qce}from"node:child_process";import{dirname as Zce,isAbsolute as ede,resolve as tde}from"node:path";import{promisify as nde}from"node:util";var dH=nde(Qce),rde=3e3,ode=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function ide(){let t=(await dH("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=ede(t)?t:tde(process.cwd(),t);return Zce(n)}async function uH(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await ide()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),rde)});try{let o=pn({execFile:dH,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>ode.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}bp();fc();import{promises as sde}from"node:fs";import{dirname as ade,join as fH}from"node:path";import{randomBytes as lde}from"node:crypto";var cde=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
1757
|
-
`),pH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,nx=30,dde=1024,ude=8e3,pde="haiku";async function mde(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=yde(n,dde),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??ude),s=t.signal?bde([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await $s({token:t.token,model:t.model??pde,system:cde,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=fde(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=ade(t.worktreePath);return await gde(l,c)}function fde(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(pH.test(t)&&t.length<=nx)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>nx)break;o=s}return pH.test(o)?o:null}async function gde(e,t){if(!await hde(fH(t,e)))return e;let n=lde(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,nx-5)}-${n}`}async function hde(e){try{return await sde.access(e),!0}catch{return!1}}function yde(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function bde(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function gH(e){let t,n,r=fH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await mde(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ip(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return mH(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return mH(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function mH(e,t){e&&e.setCwd(t),wde(t)}function wde(e){try{process.chdir(e)}catch{}}Wt();q();import{spawn as yH}from"child_process";import{existsSync as bH,mkdirSync as Ede,readFileSync as wH,unlinkSync as hH,writeFileSync as SH}from"fs";import{get as xde}from"https";import{join as vH}from"path";import{readFileSync as Sde}from"fs";import{dirname as vde,join as kde}from"path";import{fileURLToPath as Tde}from"url";function gr(){try{return"5.81.
|
|
1757
|
+
`),pH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,nx=30,dde=1024,ude=8e3,pde="haiku";async function mde(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=yde(n,dde),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??ude),s=t.signal?bde([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await $s({token:t.token,model:t.model??pde,system:cde,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=fde(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=ade(t.worktreePath);return await gde(l,c)}function fde(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(pH.test(t)&&t.length<=nx)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>nx)break;o=s}return pH.test(o)?o:null}async function gde(e,t){if(!await hde(fH(t,e)))return e;let n=lde(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,nx-5)}-${n}`}async function hde(e){try{return await sde.access(e),!0}catch{return!1}}function yde(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function bde(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function gH(e){let t,n,r=fH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await mde(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ip(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return mH(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return mH(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function mH(e,t){e&&e.setCwd(t),wde(t)}function wde(e){try{process.chdir(e)}catch{}}Wt();q();import{spawn as yH}from"child_process";import{existsSync as bH,mkdirSync as Ede,readFileSync as wH,unlinkSync as hH,writeFileSync as SH}from"fs";import{get as xde}from"https";import{join as vH}from"path";import{readFileSync as Sde}from"fs";import{dirname as vde,join as kde}from"path";import{fileURLToPath as Tde}from"url";function gr(){try{return"5.81.5"}catch{}try{let e=vde(Tde(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Sde(kde(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var Rde=64*1024,Ade=10800*1e3,Cde=800,_de=3600*1e3,Ide="update-check.json",Pde="pending-update.json";function rx(){return vH(bs(),Ide)}function Su(){return vH(bs(),Pde)}function ox(){let e=bs();bH(e)||Ede(e,{recursive:!0})}function kH(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function TH(){try{let e=wH(rx(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function EH(){try{ox();let e=`
|
|
1758
1758
|
const https = require('https');
|
|
1759
1759
|
const fs = require('fs');
|
|
1760
1760
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|