agent-afk 5.36.0 → 5.36.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/plugins/tool-injector.d.ts +1 -0
- package/dist/agent/tools/nesting.d.ts +1 -1
- package/dist/agent/tools/skill-bridge.d.ts +1 -0
- package/dist/agent/tools/skill-executor/fork-dispatch.d.ts +1 -1
- package/dist/cli.mjs +6 -6
- package/dist/index.mjs +3 -3
- package/dist/telegram.mjs +5 -5
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -859,7 +859,7 @@ ${n.join(`
|
|
|
859
859
|
Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:C});return}if(S===2){let C=Rs(h.trim());d({content:`grep error: ${C.content}`,isError:!0,...C.truncated?{truncated:!0}:{}});return}let x=kr(g.trimEnd()),T=Rs(x);d({content:T.content,...T.truncated?{truncated:!0}:{}})}),m.on("error",S=>{let x;if(p===void 0&&Gl(S))try{x=xs(S,process.cwd())}catch{x=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${S.message}`}else x=xs(S,p);d({content:`Failed to execute grep: ${x}`,isError:!0})})})}}var cC,dC=R(()=>{"use strict";Hn();eo();ti();Ob();$b();cC=Wb()});import{promises as mz}from"fs";function Kb(e){return(t,n,r)=>fz(t,n,r,e)}var fz,uC,pC=R(()=>{"use strict";eo();fz=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=un(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await mz.readdir(s,{withFileTypes:!0}),l=a.filter(p=>p.isDirectory()).map(p=>`${p.name}/`),c=a.filter(p=>!p.isDirectory()).map(p=>p.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
|
|
860
860
|
`)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};uC=Kb()});function gz(e=hs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>mC)return{content:`Invalid input: message exceeds Telegram's ${mC}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=k.TELEGRAM_BOT_TOKEN;if(!i)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let s=gs();if(s.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of s){let c=await e({token:i,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===s.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${s.length-a.length}/${s.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:s.length===1?`Sent Telegram message to chat ${s[0]}.`:`Sent Telegram message to ${s.length} chats.`}}}var mC,fC,gC=R(()=>{"use strict";q();yr();Iu();mC=4096;fC=gz()});import{JSDOM as hz}from"jsdom";import{Readability as yz}from"@mozilla/readability";import bz from"turndown";function hC(e){return e.replace(/\n{3,}/g,`
|
|
861
861
|
|
|
862
|
-
`).trim()}function wz(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function bC(e,t){let r=new hz(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new yz(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=hC(Gb.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=hC(Gb.turndown(a));return{title:o,markdown:l,textLength:wz(s),usedFallback:!0}}var yC,Gb,wC=R(()=>{"use strict";yC=200,Gb=new bz({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Gb.remove(["script","style","noscript","iframe"])});function vz(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 SC(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function kz(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 lp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??vz,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(!Sz.has(u.status)||d===o)return u;let p=kz(u,s)??SC(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=SC(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Sz,qb=R(()=>{"use strict";ve();Sz=new Set([429,502,503,504])});import{readFileSync as Ez}from"node:fs";import{join as Tz}from"path";function xz(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function vC(e,t){return xz(t).test(e)}function Az(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(Rz.has(t))return!0;if(Cz.has(t))return!1}return!1}function kC(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function _z(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 EC(e){let t=e===void 0||e.trim()===""?"default":e.trim();return wl(t),t}function Iz(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Pz(e){try{return Ez(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Mz(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=EC(t.defaultProfile)),n}function TC(e){let t=e?.env??k,n=e?.readFileSync??Pz,r=e?.surface??t.AGENT_SURFACE,o=Az(t.AFK_BROWSER_HEADLESS,r),i=kC(t.AFK_BROWSER_ALLOWED_DOMAINS),s=kC(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Iz(t.AFK_BROWSER_DOM_SNAPSHOTS),l=_z(t.AFK_BROWSER_BACKEND),c=EC(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():Tz(wn(),"browser.json"),m=n(p);if(m===void 0)return d;let g;try{g=JSON.parse(m)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Mz(d,g);return h.configPath=p,h}function zb(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(vC(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>vC(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Rz,Cz,Jb=R(()=>{"use strict";q();G();Rz=new Set(["daemon","subagent","telegram","afk"]),Cz=new Set(["repl","interactive","cli"])});import ri from"node:fs";import cp from"node:path";import{randomBytes as Oz}from"node:crypto";import{chromium as $z}from"playwright";function Dz(){try{return"5.36.0"}catch{}try{let e=cp.resolve(import.meta.dirname,"../../../package.json"),t=ri.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Fz,dp,xC=R(()=>{"use strict";G();ve();Fz=Dz(),dp=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=$z.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${Fz}`}}loadStorageState(t){let n=Sl(t);try{if(!ri.existsSync(n))return;let r=JSON.parse(ri.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=Sl(t);if(!ri.existsSync(r))return;let o=await n.storageState(),i=cp.join(cp.dirname(r),`.${cp.basename(r)}.${process.pid}.${Oz(4).toString("hex")}.tmp`);ri.writeFileSync(i,JSON.stringify(o),{mode:384}),ri.chmodSync(i,384),ri.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 Lz}from"crypto";function Vb(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of Nz)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function RC(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Bz.test(e.label))}function CC(e){return Lz("sha256").update(e,"utf8").digest("hex").slice(0,8)}function AC(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Nz,Bz,Jl=R(()=>{"use strict";Nz=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];Bz=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Uz}from"node:crypto";function jz(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Hz(e,t,n){return`el_${Uz("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Wz(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function _C(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function PC(e,t){let n=e.role??"",r=e.name??"";IC.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])PC(i,t)}async function Kz(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},MC).catch(()=>[])}async function Gz(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,p=i.disabled??!1,m=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),m!==void 0&&(g.checked=m),o.push(g)}return o},MC).catch(()=>[])}function qz(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function up(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=qz(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Kz(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,m,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],PC(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await Gz(e)).filter(_=>IC.has(_.role??"")));let w=new Map;for(let I of p){let _=_C(I.name),D=w.get(_);(!D||D.bbox.w===0&&I.bbox.w>0)&&w.set(_,I)}let v=y.map(I=>({ax:I,dom:w.get(_C(I.name??""))})),S=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);S.sort((I,_)=>{let D=I.dom?.bbox.y??0,F=_.dom?.bbox.y??0;if(D!==F)return D-F;let U=I.dom?.bbox.x??0,H=_.dom?.bbox.x??0;return U-H}),S.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=S.slice(0,n).map((I,_)=>{let D=I.ax.role??"generic",F=I.ax.name??"",U=Hz(D,F,_),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},N=I.dom?.type??null,P=null;I.ax.value!==void 0&&I.ax.value!==null&&(P=String(I.ax.value)),I.ax.checked!==void 0&&(P=String(I.ax.checked)),RC({role:D,kind:N})&&(P="[redacted]");let M={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(M.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(M.selected=I.ax.selected),I.ax.expanded!==void 0&&(M.expanded=I.ax.expanded);let O;I.dom?.testId?O=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(O=`#${I.dom.id}`);let j={id:U,role:D,label:jz(F),kind:N,value:P,state:M,bbox:H};return O!==void 0&&(j.selector=O),j}),C="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="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 A=Wz(m),B=`obs_${t.observationCounter.toString(36)}`,$=new Date().toISOString();return{observationId:B,url:g,title:h,textSummary:A,interactive:T,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:$}}var IC,MC,OC=R(()=>{"use strict";Jl();IC=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);MC="a[href], button, input, select, textarea, [role], [tabindex], label"});async function $C(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 Yb(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>$C(e,i)))).filter(o=>o!==null)}async function zz(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 Xb(e,t,n){switch(t.kind){case"element_id":return Jz(e,t,n);case"selector":return Vz(e,t);case"semantic":return Yz(e,t)}}async function Jz(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 Yb(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Vz(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 Yb(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Yz(e,t){return t.role!==void 0?Xz(e,t.text,t.role):Zz(e,t.text,t)}async function Xz(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 Yb(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Zz(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 zz(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),m=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await $C(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,v=0;for(let S=0;S<w.length;S++)v=v*31+w.charCodeAt(S)>>>0;m.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var DC=R(()=>{"use strict"});import{randomBytes as Qz}from"crypto";import{mkdir as eJ,stat as tJ,writeFile as nJ}from"fs/promises";import{join as Zb}from"path";import{gzip as rJ}from"zlib";import{promisify as oJ}from"util";function iJ(e){return Zb(jo(e),"browser")}function sJ(e){return Zb(iJ(e),"screenshots")}function aJ(){return new Date().toISOString().replace(/[:.]/g,"-")}function lJ(){return Qz(3).toString("hex")}async function Qb(e,t,n){if(t.length>FC)throw new Error(`writeScreenshotSidecar: buffer exceeds ${FC} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=sJ(e);await eJ(r,{recursive:!0});let o=`${aJ()}-${lJ()}-${n}.png`,i=Zb(r,o);await nJ(i,t);let{size:s}=await tJ(i);return{path:i,bytes:s}}var Ewe,FC,LC=R(()=>{"use strict";G();Jl();Ewe=oJ(rJ);FC=5*1024*1024});var BC={};Hd(BC,{PlaywrightProvider:()=>ew});function NC(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 ew,UC=R(()=>{"use strict";xC();OC();DC();Jb();Jl();LC();ew=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dp(t)}async open(t){let n=zb(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 up(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 up(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 Xb(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${NC(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Vb(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=zb(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await up(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}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 Xb(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${NC(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 Qb(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 Qb(n,o,r);return i}catch{return null}}}});var ii={};Hd(ii,{__resetBrowserRegistryForTests:()=>mJ,browserProviderActive:()=>uJ,closeBrowserProvider:()=>tw,getBrowserProvider:()=>dJ,peekBrowserProvider:()=>pJ});function jC(){Promise.resolve(tw()).then(()=>{process.exit(130)})}function HC(){Promise.resolve(tw()).then(()=>{process.exit(143)})}function WC(){Kn=null}function cJ(){pp||(process.on("SIGINT",jC),process.on("SIGTERM",HC),process.on("exit",WC),pp=!0)}function KC(){pp&&(process.removeListener("SIGINT",jC),process.removeListener("SIGTERM",HC),process.removeListener("exit",WC),pp=!1)}async function dJ(e){return Kn!==null?Kn:(oi!==null||(oi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(UC(),BC)),n=TC(e),r=new t(n);return cJ(),Kn=r,oi=null,r})()),oi)}async function tw(){if(Kn===null)return;let e=Kn;Kn=null,oi=null,KC(),await e.shutdown()}function uJ(){return Kn!==null}function pJ(){return Kn}function mJ(){Kn=null,oi=null,KC()}var Kn,oi,pp,si=R(()=>{"use strict";Jb();Kn=null,oi=null,pp=!1});function GC(e,t){try{return bC(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function bJ(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(si(),ii));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function qC(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??bJ,o=null,i=e,s=null,a=null;try{let c=await lp(n,e,{headers:yJ,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(hJ.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(gJ.test(d)&&!fJ.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=GC(u,i)}}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<yC)&&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=GC(c.html,c.finalUrl);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"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}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 fJ,gJ,hJ,yJ,zC=R(()=>{"use strict";wC();qb();ve();fJ=/(text\/html|application\/xhtml\+xml)/i,gJ=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,hJ=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,yJ={"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 vJ(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(wJ,{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),SJ),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=ei(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 JC(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?vJ({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 VC(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
862
|
+
`).trim()}function wz(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function bC(e,t){let r=new hz(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new yz(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=hC(Gb.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=hC(Gb.turndown(a));return{title:o,markdown:l,textLength:wz(s),usedFallback:!0}}var yC,Gb,wC=R(()=>{"use strict";yC=200,Gb=new bz({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Gb.remove(["script","style","noscript","iframe"])});function vz(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 SC(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function kz(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 lp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??vz,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(!Sz.has(u.status)||d===o)return u;let p=kz(u,s)??SC(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=SC(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Sz,qb=R(()=>{"use strict";ve();Sz=new Set([429,502,503,504])});import{readFileSync as Ez}from"node:fs";import{join as Tz}from"path";function xz(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function vC(e,t){return xz(t).test(e)}function Az(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(Rz.has(t))return!0;if(Cz.has(t))return!1}return!1}function kC(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function _z(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 EC(e){let t=e===void 0||e.trim()===""?"default":e.trim();return wl(t),t}function Iz(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Pz(e){try{return Ez(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Mz(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=EC(t.defaultProfile)),n}function TC(e){let t=e?.env??k,n=e?.readFileSync??Pz,r=e?.surface??t.AGENT_SURFACE,o=Az(t.AFK_BROWSER_HEADLESS,r),i=kC(t.AFK_BROWSER_ALLOWED_DOMAINS),s=kC(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Iz(t.AFK_BROWSER_DOM_SNAPSHOTS),l=_z(t.AFK_BROWSER_BACKEND),c=EC(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():Tz(wn(),"browser.json"),m=n(p);if(m===void 0)return d;let g;try{g=JSON.parse(m)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Mz(d,g);return h.configPath=p,h}function zb(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(vC(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>vC(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Rz,Cz,Jb=R(()=>{"use strict";q();G();Rz=new Set(["daemon","subagent","telegram","afk"]),Cz=new Set(["repl","interactive","cli"])});import ri from"node:fs";import cp from"node:path";import{randomBytes as Oz}from"node:crypto";import{chromium as $z}from"playwright";function Dz(){try{return"5.36.1"}catch{}try{let e=cp.resolve(import.meta.dirname,"../../../package.json"),t=ri.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Fz,dp,xC=R(()=>{"use strict";G();ve();Fz=Dz(),dp=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=$z.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${Fz}`}}loadStorageState(t){let n=Sl(t);try{if(!ri.existsSync(n))return;let r=JSON.parse(ri.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=Sl(t);if(!ri.existsSync(r))return;let o=await n.storageState(),i=cp.join(cp.dirname(r),`.${cp.basename(r)}.${process.pid}.${Oz(4).toString("hex")}.tmp`);ri.writeFileSync(i,JSON.stringify(o),{mode:384}),ri.chmodSync(i,384),ri.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 Lz}from"crypto";function Vb(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of Nz)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function RC(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Bz.test(e.label))}function CC(e){return Lz("sha256").update(e,"utf8").digest("hex").slice(0,8)}function AC(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Nz,Bz,Jl=R(()=>{"use strict";Nz=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];Bz=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Uz}from"node:crypto";function jz(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Hz(e,t,n){return`el_${Uz("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Wz(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function _C(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function PC(e,t){let n=e.role??"",r=e.name??"";IC.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])PC(i,t)}async function Kz(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},MC).catch(()=>[])}async function Gz(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,p=i.disabled??!1,m=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),m!==void 0&&(g.checked=m),o.push(g)}return o},MC).catch(()=>[])}function qz(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function up(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=qz(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Kz(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,m,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],PC(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await Gz(e)).filter(_=>IC.has(_.role??"")));let w=new Map;for(let I of p){let _=_C(I.name),D=w.get(_);(!D||D.bbox.w===0&&I.bbox.w>0)&&w.set(_,I)}let v=y.map(I=>({ax:I,dom:w.get(_C(I.name??""))})),S=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);S.sort((I,_)=>{let D=I.dom?.bbox.y??0,F=_.dom?.bbox.y??0;if(D!==F)return D-F;let U=I.dom?.bbox.x??0,H=_.dom?.bbox.x??0;return U-H}),S.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=S.slice(0,n).map((I,_)=>{let D=I.ax.role??"generic",F=I.ax.name??"",U=Hz(D,F,_),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},N=I.dom?.type??null,P=null;I.ax.value!==void 0&&I.ax.value!==null&&(P=String(I.ax.value)),I.ax.checked!==void 0&&(P=String(I.ax.checked)),RC({role:D,kind:N})&&(P="[redacted]");let M={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(M.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(M.selected=I.ax.selected),I.ax.expanded!==void 0&&(M.expanded=I.ax.expanded);let O;I.dom?.testId?O=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(O=`#${I.dom.id}`);let j={id:U,role:D,label:jz(F),kind:N,value:P,state:M,bbox:H};return O!==void 0&&(j.selector=O),j}),C="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="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 A=Wz(m),B=`obs_${t.observationCounter.toString(36)}`,$=new Date().toISOString();return{observationId:B,url:g,title:h,textSummary:A,interactive:T,status:{httpStatus:t.httpStatus??null,loadingState:C,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:$}}var IC,MC,OC=R(()=>{"use strict";Jl();IC=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);MC="a[href], button, input, select, textarea, [role], [tabindex], label"});async function $C(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 Yb(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>$C(e,i)))).filter(o=>o!==null)}async function zz(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 Xb(e,t,n){switch(t.kind){case"element_id":return Jz(e,t,n);case"selector":return Vz(e,t);case"semantic":return Yz(e,t)}}async function Jz(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 Yb(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Vz(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 Yb(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Yz(e,t){return t.role!==void 0?Xz(e,t.text,t.role):Zz(e,t.text,t)}async function Xz(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 Yb(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Zz(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 zz(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),m=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await $C(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,v=0;for(let S=0;S<w.length;S++)v=v*31+w.charCodeAt(S)>>>0;m.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var DC=R(()=>{"use strict"});import{randomBytes as Qz}from"crypto";import{mkdir as eJ,stat as tJ,writeFile as nJ}from"fs/promises";import{join as Zb}from"path";import{gzip as rJ}from"zlib";import{promisify as oJ}from"util";function iJ(e){return Zb(jo(e),"browser")}function sJ(e){return Zb(iJ(e),"screenshots")}function aJ(){return new Date().toISOString().replace(/[:.]/g,"-")}function lJ(){return Qz(3).toString("hex")}async function Qb(e,t,n){if(t.length>FC)throw new Error(`writeScreenshotSidecar: buffer exceeds ${FC} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=sJ(e);await eJ(r,{recursive:!0});let o=`${aJ()}-${lJ()}-${n}.png`,i=Zb(r,o);await nJ(i,t);let{size:s}=await tJ(i);return{path:i,bytes:s}}var Ewe,FC,LC=R(()=>{"use strict";G();Jl();Ewe=oJ(rJ);FC=5*1024*1024});var BC={};Hd(BC,{PlaywrightProvider:()=>ew});function NC(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 ew,UC=R(()=>{"use strict";xC();OC();DC();Jb();Jl();LC();ew=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dp(t)}async open(t){let n=zb(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 up(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 up(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 Xb(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${NC(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Vb(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=zb(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await up(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}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 Xb(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${NC(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 Qb(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 Qb(n,o,r);return i}catch{return null}}}});var ii={};Hd(ii,{__resetBrowserRegistryForTests:()=>mJ,browserProviderActive:()=>uJ,closeBrowserProvider:()=>tw,getBrowserProvider:()=>dJ,peekBrowserProvider:()=>pJ});function jC(){Promise.resolve(tw()).then(()=>{process.exit(130)})}function HC(){Promise.resolve(tw()).then(()=>{process.exit(143)})}function WC(){Kn=null}function cJ(){pp||(process.on("SIGINT",jC),process.on("SIGTERM",HC),process.on("exit",WC),pp=!0)}function KC(){pp&&(process.removeListener("SIGINT",jC),process.removeListener("SIGTERM",HC),process.removeListener("exit",WC),pp=!1)}async function dJ(e){return Kn!==null?Kn:(oi!==null||(oi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(UC(),BC)),n=TC(e),r=new t(n);return cJ(),Kn=r,oi=null,r})()),oi)}async function tw(){if(Kn===null)return;let e=Kn;Kn=null,oi=null,KC(),await e.shutdown()}function uJ(){return Kn!==null}function pJ(){return Kn}function mJ(){Kn=null,oi=null,KC()}var Kn,oi,pp,si=R(()=>{"use strict";Jb();Kn=null,oi=null,pp=!1});function GC(e,t){try{return bC(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function bJ(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(si(),ii));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function qC(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??bJ,o=null,i=e,s=null,a=null;try{let c=await lp(n,e,{headers:yJ,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(hJ.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(gJ.test(d)&&!fJ.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=GC(u,i)}}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<yC)&&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=GC(c.html,c.finalUrl);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"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}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 fJ,gJ,hJ,yJ,zC=R(()=>{"use strict";wC();qb();ve();fJ=/(text\/html|application\/xhtml\+xml)/i,gJ=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,hJ=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,yJ={"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 vJ(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(wJ,{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),SJ),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=ei(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 JC(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?vJ({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 VC(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
863
863
|
|
|
864
864
|
(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(`
|
|
865
865
|
`).trimEnd()}var wJ,SJ,YC=R(()=>{"use strict";ti();wJ="https://api.exa.ai/search",SJ=10});function _J(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=kJ;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,EJ)}let a=TJ;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,xJ)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function nw(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+RJ}function IJ(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return AJ.some(o=>r.includes(o))}function PJ(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=_J(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 lp(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(m){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let p;try{p=await u.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:nw(p,i.maxBytes)}}if(i.mode==="markdown")try{let u=await qC(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0}:{content:nw(u.markdown,i.maxBytes)}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=u instanceof Error?u.message:String(u),m=IJ(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${m}`,isError:!0}}let d=JC({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:CJ,timeoutMs:i.timeoutMs,signal:s.signal});return{content:nw(VC(i.query,u),i.maxBytes)}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var kJ,EJ,TJ,xJ,RJ,CJ,AJ,XC,ZC=R(()=>{"use strict";zC();YC();qb();kJ=3e4,EJ=12e4,TJ=1e6,xJ=1e7,RJ=`
|
|
@@ -980,7 +980,7 @@ ${t}`)}var iS=R(()=>{"use strict"});function wI(e){return typeof e=="string"&&e.
|
|
|
980
980
|
---`);if(o===-1)return{};let i=r.slice(0,o),s=r.slice(o+4).trim(),a={},l=i.split(`
|
|
981
981
|
`);for(let c=0;c<l.length;c++){let d=l[c];if(!d)continue;let u=d.indexOf(":");if(u===-1)continue;let p=d.slice(0,u).trim(),m=d.slice(u+1).trim();if(p==="name")a.name=m.replace(/^["']|["']$/g,"");else if(p==="description")a.description=m.replace(/^["']|["']$/g,"");else if(p==="argumentHint")a.argumentHint=m.replace(/^["']|["']$/g,"");else if(p==="tools"){let g=l.slice(c+1),h=wm(m,g),y=x4(t),b=[];for(let w of h){let v=yc(w,y);v!==void 0?b.includes(v)||b.push(v):process.stderr.write(`[afk] plugin skill at ${e}: unknown tool "${w}" in \`tools:\` frontmatter \u2014 ignored
|
|
982
982
|
`)}b.length===0&&h.length>0&&process.stderr.write(`[afk] plugin skill at ${e}: \`tools:\` declared but no valid tools resolved \u2014 subagent will be blocked from all tools
|
|
983
|
-
`),a.allowedTools=b}else if(p==="audience"){let g=m.replace(/^["']|["']$/g,"");(g==="public"||g==="internal")&&(a.audience=g)}else p==="context"
|
|
983
|
+
`),a.allowedTools=b}else if(p==="audience"){let g=m.replace(/^["']|["']$/g,"");(g==="public"||g==="internal")&&(a.audience=g)}else if(p==="context")a.context=m.replace(/^["']|["']$/g,"");else if(p==="read-only"||p==="readOnly")m.replace(/^["']|["']$/g,"").trim()==="true"&&(a.readOnly=!0);else if(p==="model"){let g=m.replace(/^["']|["']$/g,"").trim();g.length>0&&(a.model=g)}}return s.length>0&&(a.body=s),a}catch{return{}}}function x4(e){return e!==void 0?e:new Set([...Mt,...st,"memory_search","agent","skill"])}var E4,bc=R(()=>{"use strict";ln();dn();E4={read:"read_file",edit:"edit_file",write:"write_file",bash:"bash",grep:"grep",glob:"glob",ls:"list_directory",list:"list_directory",webfetch:"web_scrape",websearch:"web_scrape",webbrowse:"web_scrape"}});function Bs(e){let t=e.trim();return t.startsWith('"')&&t.endsWith('"')&&t.length>=2||t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1).trim():t}function C4(e,t,n){let r=Bs(e);(r===">"||r===">-"||r==="|"||r==="|-")&&(r="");let i=0;for(let s=n;s<t.length;s++){let a=t[s];if(a===void 0||!/^\s+\S/.test(a))break;let l=a.trim();if(l.startsWith("- "))break;r=r.length>0?`${r} ${l}`:l,i++}return{value:r,consumed:i}}function ui(e,t=()=>{}){if(!e.startsWith("---")){t("missing frontmatter (file must start with ---)");return}let n=e.slice(3),r=n.indexOf(`
|
|
984
984
|
---`);if(r===-1){t("unterminated frontmatter (no closing ---)");return}let o=n.slice(0,r),i=n.slice(r+4),s=i.startsWith(`
|
|
985
985
|
`)?i.slice(1):i,a=o.split(`
|
|
986
986
|
`),l,c,d,u,p,m,g,h,y=[];for(let v=0;v<a.length;v++){let S=a[v];if(S===void 0||S.trim().length===0||/^\s/.test(S))continue;let x=S.indexOf(":");if(x===-1)continue;let T=S.slice(0,x).trim(),C=T.toLowerCase(),A=S.slice(x+1),B=a.slice(v+1);switch(C){case"name":{l=Bs(A);break}case"description":{let{value:$,consumed:I}=C4(A,a,v+1);c=$,v+=I;break}case"tools":case"allowed-tools":{g=vI(wm(A,B));break}case"disallowedtools":case"disallowed-tools":{h=vI(wm(A,B));break}case"model":{let $=Bs(A);$.length>0&&(d=$);break}case"maxturns":case"max-turns":{let $=Number.parseInt(Bs(A),10);Number.isFinite($)&&$>0?u=$:t(`invalid ${T} value ${JSON.stringify(A.trim())} \u2014 ignored`);break}case"maxtooluseiterations":case"max-tool-use-iterations":{let $=Number.parseInt(Bs(A),10);Number.isFinite($)&&$>0?p=$:t(`invalid ${T} value ${JSON.stringify(A.trim())} \u2014 ignored`);break}case"bash":{let $=Bs(A).toLowerCase();$==="read-only"||$==="readonly"?m=!0:t(`unrecognized bash value ${JSON.stringify(A.trim())} \u2014 ignored`);break}default:{R4.has(C)?y.push(T):t(`unknown frontmatter key ${JSON.stringify(T)} \u2014 ignored`);break}}}if(l===void 0||l.length===0){t('missing required frontmatter field "name"');return}if(c===void 0||c.length===0){t(`agent ${JSON.stringify(l)}: missing required frontmatter field "description"`);return}let b=s.trim();if(b.length===0){t(`agent ${JSON.stringify(l)}: empty body \u2014 an agent file's body is its system prompt`);return}let w={description:c,prompt:b,...g!==void 0&&g.length>0?{tools:g}:{},...h!==void 0&&h.length>0?{disallowedTools:h}:{},...d!==void 0?{model:d}:{},...u!==void 0?{maxTurns:u}:{},...p!==void 0?{maxToolUseIterations:p}:{}};return{name:l,definition:w,...m===!0?{bashReadOnly:!0}:{},...y.length>0?{ignoredKeys:y}:{}}}function vI(e){let t=[];for(let n of e){if(n.includes("(")){t.push(n);continue}for(let r of n.split(/\s+/))r.length>0&&t.push(r)}return t}var R4,wc=R(()=>{"use strict";bc();R4=new Set(["permissionmode","permission-mode","skills","mcpservers","mcp-servers","hooks","memory","background","effort","isolation","color","initialprompt","initial-prompt"])});function I4(e){let t=e.trim();if(t.length===0)return null;let n=t.indexOf("(");if(n!==-1){if(t=t.slice(0,n).trim(),t.length===0)return null}else if(t.endsWith(")"))return null;if(t.startsWith("mcp__"))return t;let r=_4[t.toLowerCase()];return r!==void 0?r:yc(t,A4)}function kI(e){let t=[],n=new Set,r=[];for(let o of e){let i=I4(o);if(i!==null){if(i===void 0){r.push(o.trim());continue}n.has(i)||(n.add(i),t.push(i))}}return{names:t,dropped:r}}function P4(e){let t=[],n=0,r="";for(let o of e)o==="("?(n++,r+=o):o===")"?(n=Math.max(0,n-1),r+=o):o===","&&n===0?(t.push(r),r=""):r+=o;return r.length>0&&t.push(r),t}function M4(e){let t=P4(e.join(",")),n=!1,r=!1,o=new Set;for(let i of t){let s=i.trim();if(s.length===0)continue;let a=s.indexOf("("),l=(a===-1?s:s.slice(0,a)).trim().toLowerCase();if(l!=="agent"&&l!=="task")continue;if(a===-1){n=!0;continue}r=!0;let c=s.slice(a+1).replace(/\)\s*$/,"");for(let d of c.split(",")){let u=d.trim();u.length>0&&o.add(u)}}if(!n){if(o.size>0)return[...o];if(r)return[]}}function aS(e,t){let{tools:n,disallowedTools:r}=e.definition,o=e.bashReadOnly===!0,i=r!==void 0?kI(r):void 0,s=n!==void 0?kI(n):void 0,a=[...s?.dropped??[],...i?.dropped??[]];if(s===void 0&&i===void 0)return{allowedTools:void 0,bashReadOnly:o,droppedTokens:a};let l=new Set(i?.names??[]),d=(s?.names??[...t]).filter(p=>!l.has(p)),u=n!==void 0&&d.includes("agent")?M4(n):void 0;return{allowedTools:d,bashReadOnly:o,droppedTokens:a,...u!==void 0?{nestedAgentTypes:u}:{}}}var A4,_4,EI=R(()=>{"use strict";bc();ln();dn();A4=new Set([...Mt,...st,"memory_search","agent","skill"]),_4={task:"agent",agent:"agent",skill:"skill"}});import{fileURLToPath as O4}from"node:url";import{dirname as $4}from"node:path";var D4,RTe,fo,lS=R(()=>{"use strict";D4=O4(import.meta.url),RTe=$4(D4),fo={name:"research-agent",systemPrompt:`---
|
|
@@ -1066,9 +1066,9 @@ Available agent types (pass via \`agent_type\`):
|
|
|
1066
1066
|
`)}finally{h&&await h.close().catch(()=>{})}}async function u(){let h=await e.readMeta(t);if(!h||!(h.status!=="running"))return!1;try{let b=await at.stat(r);return s>=b.size}catch{return!0}}if(o)yield*d();else try{s=(await at.stat(r)).size}catch{}if(await u())return;let p=null,m=null,g=()=>new Promise(h=>{m=h;let y=setTimeout(()=>{m=null,h()},c);p=()=>{clearTimeout(y),m=null,h()}});try{l=Ws.watch(i,{persistent:!1},()=>{p?.(),p=null})}catch{}try{for(;await g(),yield*d(),!await u(););}finally{m?.(),l?.close()}}}});import{EventEmitter as J4}from"node:events";import*as ho from"node:fs/promises";import*as LI from"node:path";import{createHash as V4}from"node:crypto";function hS(e){Le(e).catch(()=>{})}var Y4,DI,FI,X4,Sc,Rm,yS=R(()=>{"use strict";Et();ve();xe();xm();G();Hn();Y4=300*1e3,DI=4096;FI=5e3,X4=10,Sc=class extends Error{constructor(t,n){super(`Background job cap reached (${t}/${n} running). Wait for existing jobs to finish or cancel them before spawning more.`),this.name="BackgroundJobCapError"}},Rm=class extends J4{jobs=new Map;counter=Math.floor(Math.random()*65536);traceWriter;maxConcurrentJobs;constructor(t={}){super(),this.traceWriter=t.traceWriter,this.maxConcurrentJobs=t.maxConcurrentJobs??X4,setTimeout(()=>this._sweepOldJobs().catch(r=>process.stderr.write(`[afk] bg sweep error: ${String(r)}
|
|
1067
1067
|
`)),5e3).unref()}register(t){let{job:n,jobId:r,writer:o,metaRecord:i}=this.createJobEntry(t);return t.handle.runInBackground(t.prompt,s=>{this.markTerminal(r,s,o,i).catch(a=>W(`markTerminal (register) rejected for ${r}: ${String(a)}`))},s=>{o.write(s),s.type==="chunk"&&s.chunk.type==="content"&&this.appendTranscript(r,s.chunk.content)}),this.snapshot(n)}adoptRunning(t){let{job:n,jobId:r,writer:o,metaRecord:i}=this.createJobEntry(t);return t.runPromise.then(s=>this.markTerminal(r,s,o,i)).catch(s=>(W("adoptRunning: unexpected rejection from in-flight runPromise",s),this.markTerminal(r,gm(t.handle.id,"failed",s,gc()),o,i))),this.snapshot(n)}createJobEntry(t){let n=[...this.jobs.values()].filter(u=>u.status==="running").length;if(n>=this.maxConcurrentJobs)throw new Sc(n,this.maxConcurrentJobs);let r=this.nextJobId(),o=t.prompt.trim().slice(0,80),i=Date.now(),s,a=new Promise(u=>{s=u}),l={jobId:r,subagentId:t.handle.id,label:o,model:t.model,startedAt:i,status:"running",handle:t.handle,joiners:[],terminalSettled:a,settle:s,transcriptTail:"",parentSessionId:t.parentSessionId};this.jobs.set(r,l),qo(this.traceWriter,{transition:"started",jobId:r,subagentId:t.handle.id,label:o,model:t.model}),this.emit("started",this.snapshot(l));let c=new Tm(r),d={jobId:r,subagentId:t.handle.id,label:o,promptHash:V4("sha256").update(t.prompt).digest("hex"),model:t.model,startedAt:i,status:"running",...t.parentSessionId!==void 0?{parentSessionId:t.parentSessionId}:{},schemaVersion:1};return c.writeMeta(d),{job:l,jobId:r,writer:c,metaRecord:d}}get(t){let n=this.jobs.get(t);return n?this.snapshot(n):void 0}list(){return[...this.jobs.values()].map(t=>this.snapshot(t))}async join(t){let n=this.jobs.get(t);if(!n)throw new Error(`Background job not found: "${t}". Completed and cancelled jobs are evicted from the registry ~5 minutes after they settle. If the jobId looks correct, the job may have already been evicted.`);let r=await n.terminalSettled;return qo(this.traceWriter,{transition:"joined",jobId:t,subagentId:n.subagentId,jobStatus:n.status}),this.emit("joined",this.snapshot(n)),r}markDelivered(t){let n=this.jobs.get(t);!n||n.status==="running"||qo(this.traceWriter,{transition:"delivered",jobId:t,subagentId:n.subagentId,jobStatus:n.status})}async cancelJob(t){let n=this.jobs.get(t);return!n||n.status!=="running"?!1:(n.cancelSource="explicit",await n.handle.cancel(),!0)}async cancelAll(){let t=[...this.jobs.values()].filter(n=>n.status==="running");for(let n of t)n.cancelSource="cascade";await Promise.allSettled(t.map(n=>n.handle.cancel())),await Promise.allSettled(t.map(n=>{let r=new Promise(o=>setTimeout(()=>{console.warn(`[BackgroundAgentRegistry] cancelAll: job ${n.jobId} did not settle within ${FI}ms \u2014 continuing teardown`),o()},FI).unref());return Promise.race([n.terminalSettled,r])}))}appendTranscript(t,n){let r=this.jobs.get(t);if(!r)return;let o=r.transcriptTail+n;o.length<=DI?r.transcriptTail=o:r.transcriptTail=o.slice(o.length-DI)}getTranscript(t){return this.jobs.get(t)?.transcriptTail}nextJobId(){return this.counter+=1,`bg-${Date.now().toString(36)}-${this.counter}`}async markTerminal(t,n,r,o){let i=this.jobs.get(t);if(!i||i.status!=="running")return;i.result=n,i.endedAt=Date.now();let s=i.endedAt-i.startedAt;if(i.status=this.statusFromResult(n.status),i.status==="completed"){let l=n.message?.content,c=typeof l=="string"?l:l!==void 0?JSON.stringify(l):"";qo(this.traceWriter,{transition:"completed",jobId:t,subagentId:i.subagentId,durationMs:s,outputBytes:Buffer.byteLength(c,"utf8")}),hS({event:"subagent.completed",subagent_id:i.subagentId,parent_session_id:i.parentSessionId,status:n.status,duration_ms:s,content_chars:c.length}),this.emit("settled",this.snapshot(i))}else if(i.status==="failed"){let l=n.error;qo(this.traceWriter,{transition:"failed",jobId:t,subagentId:i.subagentId,durationMs:s,errorClass:l?.name??"Error",errorMessage:l?.message??"unknown"}),hS({event:"subagent.failed",subagent_id:i.subagentId,parent_session_id:i.parentSessionId,status:n.status,duration_ms:s,error_message:l?.message}),this.emit("settled",this.snapshot(i))}else qo(this.traceWriter,{transition:"cancelled",jobId:t,subagentId:i.subagentId,source:i.cancelSource??"explicit"}),hS({event:"subagent.failed",subagent_id:i.subagentId,parent_session_id:i.parentSessionId,status:n.status,duration_ms:s}),this.emit("settled",this.snapshot(i));if(i.settle(n),r&&o){let l=i.status,c=i.endedAt;r.writeMeta({...o,status:l,...c!==void 0?{endedAt:c}:{}}).then(()=>r.close())}setTimeout(()=>{this.jobs.delete(t)},Y4).unref();try{await i.handle.teardown()}catch(l){W(`markTerminal: handle.teardown() failed for job ${t}: ${String(l)}`)}}async _sweepOldJobs(){let n=bl(),r;try{r=await ho.readdir(n)}catch{return}for(let o of r){let i=Ho(o),s=LI.join(i,"meta.json");try{if(!(await ho.lstat(i)).isDirectory()){process.stderr.write(`[afk] bg sweep: skipping non-directory entry ${o}
|
|
1068
1068
|
`);continue}let l=await ho.readFile(s,"utf8"),c=JSON.parse(l);if(c.status==="running"||c.endedAt===void 0||Date.now()-c.endedAt<6048e5)continue;await ho.rm(i,{recursive:!0,force:!0})}catch(a){if(a.code==="ENOENT")continue;process.stderr.write(`[afk] bg sweep: error evicting ${o}: ${String(a)}
|
|
1069
|
-
`)}}}statusFromResult(t){return t==="succeeded"?"completed":t==="failed"?"failed":t==="cancelled"?"cancelled":"failed"}snapshot(t){return{jobId:t.jobId,subagentId:t.subagentId,label:t.label,model:t.model,startedAt:t.startedAt,status:t.status,...t.result!==void 0?{result:t.result}:{},...t.endedAt!==void 0?{endedAt:t.endedAt}:{}}}}});async function NI(e){let{handle:t,registry:n,prompt:r,model:o,parentSessionId:i}=e;if(!n)return await t.teardown().catch(l=>W("subagent-executor: handle teardown failed: "+(l instanceof Error?l.message:String(l)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let s;try{s=n.register({handle:t,prompt:r,model:o??"sonnet",parentSessionId:i})}catch(l){if(l instanceof Sc)return await t.teardown().catch(c=>W("subagent-executor: handle teardown failed after cap error: "+(c instanceof Error?c.message:String(c)))),{content:l.message,isError:!0};throw l}let a={status:"running",jobId:s.jobId,subagentId:s.subagentId,label:s.label,message:`Background subagent started (jobId=${s.jobId}). It is running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${s.jobId} remains available for manual replay.`};return{content:JSON.stringify(a)}}var BI=R(()=>{"use strict";yS();ve()});async function UI(e){let{handle:t,signal:n,prompt:r,idPrefix:o,model:i,childManager:s,identity:a,depth:l,parentSessionId:c,registry:d,promotionTriggers:u,activeForegroundHandles:p}=e,m=()=>{t.cancel()};n.addEventListener("abort",m,{once:!0});let g=Date.now(),h=!1,y,b=new Promise(T=>{y=T}),w,v=new Promise(T=>{w=T});u.set(t.id,{fire:y,ready:v}),p.set(t.id,t);let S,x=t.runToResult(r);try{let T=await Promise.race([x.then(I=>({kind:"result",result:I})),b.then(()=>({kind:"promote"}))]);if(T.kind==="promote")if(d)try{let I=d.adoptRunning({handle:t,runPromise:x,prompt:r,model:i??"sonnet",parentSessionId:c});return h=!0,n.removeEventListener("abort",m),w({jobId:I.jobId,label:I.label}),{content:JSON.stringify({status:"running",jobId:I.jobId,subagentId:I.subagentId,label:I.label,message:`Subagent backgrounded by user (jobId=${I.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${I.jobId} remains available for manual replay.`})}}catch(I){W("subagent-executor: promotion failed, staying foreground: "+(I instanceof Error?I.message:String(I))),w(null)}else w(null);let C=T.kind==="result"?T.result:await x;if(C.status==="succeeded"&&C.message){let I=C.message.content,_=typeof I=="string"?I:JSON.stringify(I),D=C.trace;return Hs({...a,event:"subagent.completed",subagent_id:t.id,parent_session_id:c,status:C.status,duration_ms:Date.now()-g,content_chars:_.length,depth:l,tool_call_count:D?.toolCalls.length,thinking_present:D?.thinkingPresent,tool_names:D?.toolCalls.length?JSON.stringify([...new Set(D.toolCalls.map(F=>F.name))]):void 0}),S={content:mo(_,C.stopReason)},S}let A=C.error?.message??"Subagent failed with no output",B=C.trace;Hs({...a,event:"subagent.failed",subagent_id:t.id,id_prefix:o,parent_session_id:c,status:C.status,duration_ms:Date.now()-g,error_message:go(A),schema_error:C.schemaError?go(C.schemaError.message):void 0,partial_output_chars:fS(C.partialOutput),depth:l,tool_call_count:B?.toolCalls.length,thinking_present:B?.thinkingPresent,tool_names:B?.toolCalls.length?JSON.stringify([...new Set(B.toolCalls.map(I=>I.name))]):void 0});let $=PI({status:C.status,errorMessage:A,schemaErrorMessage:C.schemaError?.message,partialOutput:C.partialOutput,subagentId:t.id});return S={content:JSON.stringify($),isError:!0},S}catch(T){let C=T instanceof Error?T.message:String(T);throw Hs({...a,event:"subagent.failed",subagent_id:t.id,id_prefix:o,parent_session_id:c,status:"failed",duration_ms:Date.now()-g,error_message:go(C),depth:l}),T}finally{if(u.delete(t.id),p.delete(t.id),w(null),!h){n.removeEventListener("abort",m),await s?.teardownAll(),await t.teardown({deferInjectContextToCaller:!0});let T=t.getLastStopInjectContext?.();if(hm(S,T),e.isolationTeardown){let{repoRoot:C,worktreePath:A}=e.isolationTeardown,B=await hA({repoRoot:C,worktreePath:A});B.preserved&&W(`[isolation] preserved worktree ${A} (${B.reason}) \u2014 locked so the sweep will not reap it; recover via the worktree tool`)}}}}var jI=R(()=>{"use strict";Et();ve();gS();iS();Sp()});var Xn,vc=R(()=>{"use strict";Ke();fb();An();js();ti();io();_I();gS();OI();BI();jI();Sp();ve();An();Xn=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 mS(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=AI(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??fi,a=this.ctx.surface!==void 0?{origin:oo(this.ctx.surface),actor:zn(i)}:{},l=this.ctx.subagentManager.getReadScopeInputs?.()??{parentReadRoots:void 0,parentCwd:void 0},c=Fu({parentReadRoots:l.parentReadRoots,parentCwd:l.parentCwd,childCwd:n.cwd??this.currentCwd}),{childConfig:d,childParentSession:u,childManager:p,childWriteCapable:m}=MI({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(!m)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 gA({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=HI);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"?kr(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":kr(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:!0}),u!==void 0&&(u.sessionId=h.id)}catch(y){let b=y instanceof Error?y.message:String(y);return Hs({...a,event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:go(b),depth:i}),{content:`Failed to fork subagent: ${b}`,isError:!0}}return n.mode==="background"?NI({handle:h,registry:this.ctx.backgroundRegistry,prompt:n.prompt,model:d.model,parentSessionId:this.ctx.parentSession.sessionId}):UI({handle:h,signal:t.signal,prompt:n.prompt,idPrefix:n.id_prefix,model:d.model,childManager:p,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 bS(e,t,n,r=!1,o){let{ctx:i,currentCwd:s}=e,a=i.depth??0,l=i.maxDepth??fi,c={...t},d=r&&o!==void 0?o.filter(h=>Cm.includes(h)):r?[...Cm]:o,u=r;if(!i.childProviderFactory||a>=l)return r?c.provider=KI(c.model,i.openaiBaseUrl):d!==void 0&&(c.provider=Em(d,c.model,u,i.openaiBaseUrl)),{childConfig:c,childManager:void 0};let p=new se({parentAbortSignal:n,...i.traceWriter!==void 0?{traceWriter:i.traceWriter}:{},...s!==void 0?{cwd:s}:{}}),m=new Xn({subagentManager:p,parentSession:mi(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}:{}}),g=i.childSkillExecutorFactory?i.childSkillExecutorFactory(a+1,l,n,s):void 0;return c.provider=i.childProviderFactory({childExecutor:m,...g!==void 0?{childSkillExecutor:g}:{},...c.model!==void 0?{model:c.model}:{},...d!==void 0?{allowedTools:d}:{},...u?{readOnlyBash:!0}:{}}),{childConfig:c,childManager:p}}var WI=R(()=>{"use strict";Ke();An();vc()});async function GI(e,t,n,r){let{ctx:o,currentCwd:i}=e;if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};let s=t.readOnly===!0||Am.has(t.name),a;try{if(a=Ue(t.name)["system.md"],!a)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 l=t.model??o.defaultSubagentModel??o.defaultModel??"sonnet",c=hc({childModel:l,resolved:o.resolveApiKeyForModel?o.resolveApiKeyForModel(l):Fe(l),parentApiKey:o.apiKey}),d=new se({parentAbortSignal:r.signal,apiKey:c,parentModel:l,...o.baseUrl!==void 0?{baseUrl:o.baseUrl}:{},...o.traceWriter!==void 0?{traceWriter:o.traceWriter}:{},progressSink:an(),...i!==void 0?{cwd:i}:{}}),{childConfig:u,childManager:p}=bS(e,{model:l,systemPrompt:a,isSkillDispatch:!0,...o.traceWriter!==void 0?{traceWriter:o.traceWriter}:{}},r.signal,s);return zI(e,{manager:d,childManager:p,childConfig:u,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 qI(e,t,n,r,o,i,s=!1,a){let{ctx:l,currentCwd:c}=e;if(i.signal.aborted)return{content:"Skill call aborted",isError:!0};let d=l.defaultSubagentModel??l.defaultModel??"sonnet",u=hc({childModel:d,resolved:l.resolveApiKeyForModel?l.resolveApiKeyForModel(d):Fe(d),parentApiKey:l.apiKey}),p=new se({parentAbortSignal:i.signal,apiKey:u,parentModel:d,...l.baseUrl!==void 0?{baseUrl:l.baseUrl}:{},...l.traceWriter!==void 0?{traceWriter:l.traceWriter}:{},progressSink:an(),...c!==void 0?{cwd:c}:{}}),m={model:d,systemPrompt:mm(n,o),env:{PLUGIN_ROOT:r},isSkillDispatch:!0,...l.traceWriter!==void 0?{traceWriter:l.traceWriter}:{}},{childConfig:g,childManager:h}=bS(e,m,i.signal,s,a);return zI(e,{manager:p,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 zI(e,t){let{manager:n,childManager:r,childConfig:o,label:i,idPrefix:s,parentId:a,args:l,noOutputError:c,errorPrefix:d}=t,u,p;try{u=await n.forkSubagent({parent:e.ctx.parentSession,config:o,idPrefix:s,parentId:a,agentType:i});let m=l&&l.length>0?l:`Run the ${i} skill now, following the instructions in your system prompt.`,g=await u.runToResult(m);return g.status==="succeeded"&&g.message?(p={content:mo(g.message.content,g.stopReason)},p):g.status==="cancelled"&&typeof g.partialOutput=="string"&&g.partialOutput.length>0?(p={content:`[skill cancelled mid-flight \u2014 partial output preserved below]
|
|
1069
|
+
`)}}}statusFromResult(t){return t==="succeeded"?"completed":t==="failed"?"failed":t==="cancelled"?"cancelled":"failed"}snapshot(t){return{jobId:t.jobId,subagentId:t.subagentId,label:t.label,model:t.model,startedAt:t.startedAt,status:t.status,...t.result!==void 0?{result:t.result}:{},...t.endedAt!==void 0?{endedAt:t.endedAt}:{}}}}});async function NI(e){let{handle:t,registry:n,prompt:r,model:o,parentSessionId:i}=e;if(!n)return await t.teardown().catch(l=>W("subagent-executor: handle teardown failed: "+(l instanceof Error?l.message:String(l)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let s;try{s=n.register({handle:t,prompt:r,model:o??"sonnet",parentSessionId:i})}catch(l){if(l instanceof Sc)return await t.teardown().catch(c=>W("subagent-executor: handle teardown failed after cap error: "+(c instanceof Error?c.message:String(c)))),{content:l.message,isError:!0};throw l}let a={status:"running",jobId:s.jobId,subagentId:s.subagentId,label:s.label,message:`Background subagent started (jobId=${s.jobId}). It is running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${s.jobId} remains available for manual replay.`};return{content:JSON.stringify(a)}}var BI=R(()=>{"use strict";yS();ve()});async function UI(e){let{handle:t,signal:n,prompt:r,idPrefix:o,model:i,childManager:s,identity:a,depth:l,parentSessionId:c,registry:d,promotionTriggers:u,activeForegroundHandles:p}=e,m=()=>{t.cancel()};n.addEventListener("abort",m,{once:!0});let g=Date.now(),h=!1,y,b=new Promise(T=>{y=T}),w,v=new Promise(T=>{w=T});u.set(t.id,{fire:y,ready:v}),p.set(t.id,t);let S,x=t.runToResult(r);try{let T=await Promise.race([x.then(I=>({kind:"result",result:I})),b.then(()=>({kind:"promote"}))]);if(T.kind==="promote")if(d)try{let I=d.adoptRunning({handle:t,runPromise:x,prompt:r,model:i??"sonnet",parentSessionId:c});return h=!0,n.removeEventListener("abort",m),w({jobId:I.jobId,label:I.label}),{content:JSON.stringify({status:"running",jobId:I.jobId,subagentId:I.subagentId,label:I.label,message:`Subagent backgrounded by user (jobId=${I.jobId}). It keeps running detached; its result will be delivered into this context automatically with the next user message once it finishes. /bgsub:join ${I.jobId} remains available for manual replay.`})}}catch(I){W("subagent-executor: promotion failed, staying foreground: "+(I instanceof Error?I.message:String(I))),w(null)}else w(null);let C=T.kind==="result"?T.result:await x;if(C.status==="succeeded"&&C.message){let I=C.message.content,_=typeof I=="string"?I:JSON.stringify(I),D=C.trace;return Hs({...a,event:"subagent.completed",subagent_id:t.id,parent_session_id:c,status:C.status,duration_ms:Date.now()-g,content_chars:_.length,depth:l,tool_call_count:D?.toolCalls.length,thinking_present:D?.thinkingPresent,tool_names:D?.toolCalls.length?JSON.stringify([...new Set(D.toolCalls.map(F=>F.name))]):void 0}),S={content:mo(_,C.stopReason)},S}let A=C.error?.message??"Subagent failed with no output",B=C.trace;Hs({...a,event:"subagent.failed",subagent_id:t.id,id_prefix:o,parent_session_id:c,status:C.status,duration_ms:Date.now()-g,error_message:go(A),schema_error:C.schemaError?go(C.schemaError.message):void 0,partial_output_chars:fS(C.partialOutput),depth:l,tool_call_count:B?.toolCalls.length,thinking_present:B?.thinkingPresent,tool_names:B?.toolCalls.length?JSON.stringify([...new Set(B.toolCalls.map(I=>I.name))]):void 0});let $=PI({status:C.status,errorMessage:A,schemaErrorMessage:C.schemaError?.message,partialOutput:C.partialOutput,subagentId:t.id});return S={content:JSON.stringify($),isError:!0},S}catch(T){let C=T instanceof Error?T.message:String(T);throw Hs({...a,event:"subagent.failed",subagent_id:t.id,id_prefix:o,parent_session_id:c,status:"failed",duration_ms:Date.now()-g,error_message:go(C),depth:l}),T}finally{if(u.delete(t.id),p.delete(t.id),w(null),!h){n.removeEventListener("abort",m),await s?.teardownAll(),await t.teardown({deferInjectContextToCaller:!0});let T=t.getLastStopInjectContext?.();if(hm(S,T),e.isolationTeardown){let{repoRoot:C,worktreePath:A}=e.isolationTeardown,B=await hA({repoRoot:C,worktreePath:A});B.preserved&&W(`[isolation] preserved worktree ${A} (${B.reason}) \u2014 locked so the sweep will not reap it; recover via the worktree tool`)}}}}var jI=R(()=>{"use strict";Et();ve();gS();iS();Sp()});var Xn,vc=R(()=>{"use strict";Ke();fb();An();js();ti();io();_I();gS();OI();BI();jI();Sp();ve();An();Xn=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 mS(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=AI(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??fi,a=this.ctx.surface!==void 0?{origin:oo(this.ctx.surface),actor:zn(i)}:{},l=this.ctx.subagentManager.getReadScopeInputs?.()??{parentReadRoots:void 0,parentCwd:void 0},c=Fu({parentReadRoots:l.parentReadRoots,parentCwd:l.parentCwd,childCwd:n.cwd??this.currentCwd}),{childConfig:d,childParentSession:u,childManager:p,childWriteCapable:m}=MI({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(!m)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 gA({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=HI);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"?kr(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":kr(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:!0}),u!==void 0&&(u.sessionId=h.id)}catch(y){let b=y instanceof Error?y.message:String(y);return Hs({...a,event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:go(b),depth:i}),{content:`Failed to fork subagent: ${b}`,isError:!0}}return n.mode==="background"?NI({handle:h,registry:this.ctx.backgroundRegistry,prompt:n.prompt,model:d.model,parentSessionId:this.ctx.parentSession.sessionId}):UI({handle:h,signal:t.signal,prompt:n.prompt,idPrefix:n.id_prefix,model:d.model,childManager:p,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 bS(e,t,n,r=!1,o){let{ctx:i,currentCwd:s}=e,a=i.depth??0,l=i.maxDepth??fi,c={...t},d=r&&o!==void 0?o.filter(h=>Cm.includes(h)):r?[...Cm]:o,u=r;if(!i.childProviderFactory||a>=l)return r?c.provider=KI(c.model,i.openaiBaseUrl,d):d!==void 0&&(c.provider=Em(d,c.model,u,i.openaiBaseUrl)),{childConfig:c,childManager:void 0};let p=new se({parentAbortSignal:n,...i.traceWriter!==void 0?{traceWriter:i.traceWriter}:{},...s!==void 0?{cwd:s}:{}}),m=new Xn({subagentManager:p,parentSession:mi(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}:{}}),g=i.childSkillExecutorFactory?i.childSkillExecutorFactory(a+1,l,n,s):void 0;return c.provider=i.childProviderFactory({childExecutor:m,...g!==void 0?{childSkillExecutor:g}:{},...c.model!==void 0?{model:c.model}:{},...d!==void 0?{allowedTools:d}:{},...u?{readOnlyBash:!0}:{}}),{childConfig:c,childManager:p}}var WI=R(()=>{"use strict";Ke();An();vc()});async function GI(e,t,n,r){let{ctx:o,currentCwd:i}=e;if(r.signal.aborted)return{content:"Skill call aborted",isError:!0};let s=t.readOnly===!0||Am.has(t.name),a;try{if(a=Ue(t.name)["system.md"],!a)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 l=t.model??o.defaultSubagentModel??o.defaultModel??"sonnet",c=hc({childModel:l,resolved:o.resolveApiKeyForModel?o.resolveApiKeyForModel(l):Fe(l),parentApiKey:o.apiKey}),d=new se({parentAbortSignal:r.signal,apiKey:c,parentModel:l,...o.baseUrl!==void 0?{baseUrl:o.baseUrl}:{},...o.traceWriter!==void 0?{traceWriter:o.traceWriter}:{},progressSink:an(),...i!==void 0?{cwd:i}:{}}),{childConfig:u,childManager:p}=bS(e,{model:l,systemPrompt:a,isSkillDispatch:!0,...o.traceWriter!==void 0?{traceWriter:o.traceWriter}:{}},r.signal,s);return zI(e,{manager:d,childManager:p,childConfig:u,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 qI(e,t,n,r,o,i,s=!1,a,l){let{ctx:c,currentCwd:d}=e;if(i.signal.aborted)return{content:"Skill call aborted",isError:!0};let u=l??c.defaultSubagentModel??c.defaultModel??"sonnet",p=hc({childModel:u,resolved:c.resolveApiKeyForModel?c.resolveApiKeyForModel(u):Fe(u),parentApiKey:c.apiKey}),m=new se({parentAbortSignal:i.signal,apiKey:p,parentModel:u,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...c.traceWriter!==void 0?{traceWriter:c.traceWriter}:{},progressSink:an(),...d!==void 0?{cwd:d}:{}}),g={model:u,systemPrompt:mm(n,o),env:{PLUGIN_ROOT:r},isSkillDispatch:!0,...c.traceWriter!==void 0?{traceWriter:c.traceWriter}:{}},{childConfig:h,childManager:y}=bS(e,g,i.signal,s,a);return zI(e,{manager:m,childManager:y,childConfig:h,label:t,idPrefix:`skill-${t}`,parentId:i.id,args:o,noOutputError:"Plugin skill failed with no output",errorPrefix:"Plugin skill execution error"})}async function zI(e,t){let{manager:n,childManager:r,childConfig:o,label:i,idPrefix:s,parentId:a,args:l,noOutputError:c,errorPrefix:d}=t,u,p;try{u=await n.forkSubagent({parent:e.ctx.parentSession,config:o,idPrefix:s,parentId:a,agentType:i});let m=l&&l.length>0?l:`Run the ${i} skill now, following the instructions in your system prompt.`,g=await u.runToResult(m);return g.status==="succeeded"&&g.message?(p={content:mo(g.message.content,g.stopReason)},p):g.status==="cancelled"&&typeof g.partialOutput=="string"&&g.partialOutput.length>0?(p={content:`[skill cancelled mid-flight \u2014 partial output preserved below]
|
|
1070
1070
|
|
|
1071
|
-
${g.partialOutput}`},p):(p={content:g.error?.message??c,isError:!0},p)}catch(m){let g=m instanceof Error?m.message:String(m);return{content:`${d}: ${g}`,isError:!0}}finally{u&&await u.teardown({deferInjectContextToCaller:!0}).catch(W);let m=u?.getLastStopInjectContext?.();hm(p,m),await r?.teardownAll(),await n.teardownAll()}}var JI=R(()=>{"use strict";Ke();Et();iS();An();ym();Ut();wr();on();ve();WI();nS()});function Z4(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 Q4(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 Zn,kc=R(()=>{"use strict";Pt();Jn();An();Yw();Hn();Xw();eS();tS();nS();JI();Zn=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??fi;if(n>=r){let c=Z4(t.input);return Le({...Ns(this.ctx),event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:n,requested_name:c}).catch(()=>{}),{content:um(n,r),isError:!0}}let o;try{o=Q4(t.input)}catch(c){return{content:`Skill tool input validation failed: ${c instanceof Error?c.message:String(c)}`,isError:!0}}let i;try{i=Ve(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||Am.has(o.name);return await qI(this.internals(),o.name,s.body,s.pluginPath,o.arguments,t,d,s.allowedTools)}let c=s.body.replace(/\$\{PLUGIN_ROOT(?::-(?:[^{}]|\$\{[^{}]*\})*)?\}|\$PLUGIN_ROOT\b/g,()=>s.pluginPath);return uI(this.internals(),o.name,c,o.arguments,t)}let l=gi(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 GI(this.internals(),t,n,r);if(t.context==="load")return dI(this.internals(),t,n,r);let o=eI(t.name);o&&sI(t.name);let i=this.ctx.depth??0;Le({...Ns(this.ctx),event:"skill.dispatched",requested_name:t.name,parent_session_id:this.ctx.parentSession.sessionId,depth:i,...pm(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}:{}})}catch(d){a=d}finally{let d=Date.now()-s;o&&iI({skillName:t.name,durationMs:d,...a!==void 0?{isError:!0}:{}});let u=a!==void 0?a instanceof Error?a.message:String(a):void 0,p=a===void 0?typeof l=="string"?l.length:l!=null?JSON.stringify(l).length:0:void 0;Le({...Ns(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,...p!==void 0?{content_chars:p}:{},...u!==void 0?{error_message:aI(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=Ec(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 mi(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}function Ks(e={}){return({childExecutor:t,childSkillExecutor:n,model:r,allowedTools:o,readOnlyBash:i})=>{let s={permissions:{allowedTools:o??km},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{},...i===!0?{readOnlyBash:!0}:{}};return re(typeof r=="string"?r:void 0)==="openai-compatible"?new zt({...s,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{},readOnlyMemory:!0}):new tt({...s,readOnlyMemory:!0})}}function KI(e,t){let n={allowedTools:[...Cm]};return re(typeof e=="string"?e:void 0)==="openai-compatible"?new zt({permissions:n,readOnlyBash:!0,readOnlyMemory:!0,...t!==void 0?{baseURL:t}:{}}):new tt({permissions:n,readOnlyBash:!0,readOnlyMemory:!0})}function Gs(e,t,n,r,o,i,s,a,l,c,d,u){let p=(m,g,h,y)=>{let b=y??s;return new Zn({parentSession:mi(h),defaultModel:e,...c!==void 0?{defaultSubagentModel:c}:{},apiKey:t,...r!==void 0?{baseUrl:r}:{},...u!==void 0?{openaiBaseUrl:u}:{},depth:m,maxDepth:g,childProviderFactory:n,childSkillExecutorFactory:p,...o!==void 0?{traceWriter:o}:{},...i!==void 0?{backgroundRegistry:i}:{},...b!==void 0?{cwd:b}:{},...a!==void 0?{resolveApiKeyForModel:a}:{},...l!==void 0?{surface:l}:{},...d!==void 0?{agentRegistry:d}:{}})};return p}function Em(e,t,n=!1,r){let o={allowedTools:[...e]};return re(typeof t=="string"?t:void 0)==="openai-compatible"?new zt({permissions:o,...n?{readOnlyBash:!0}:{},...r!==void 0?{baseURL:r}:{}}):new tt({permissions:o,...n?{readOnlyBash:!0}:{}})}function VI(e,t){let n={allowedTools:[...X_]};return re(typeof t=="string"?t:void 0)==="openai-compatible"?new zt({permissions:n}):new tt({permissions:n})}var fi,km,Cm,Am,An=R(()=>{"use strict";hi();uc();Je();ln();dn();fc();kc();fi=3;km=[...Mt,...st,"memory_search","agent","skill"],Cm=["read_file","glob","grep","list_directory","config_get","bash","web_scrape",...st,"memory_search","agent","skill"],Am=new Set(["ground-state"])});async function _m(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 tn(`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 YI,wS,SS=R(()=>{"use strict";pt();YI=0,wS=5e3});var Im,XI=R(()=>{"use strict";ve();SS();wr();Du();xe();Et();Im=class{constructor(t,n,r,o,i,s,a,l,c,d,u,p,m,g,h){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.progressSink=p,this.parentId=m}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;onSubagentSucceeded;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;lastStopInjectContext;progressSink;parentId;currentTrace=gc();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=_m(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 Go(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){throw this.lastDurationMs=Date.now()-r,this.currentStatus!=="cancelled"&&(this.controller.signal.aborted?(await Go(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(await Go(this.traceWriter,{transition:"failed",subagentId:this.id,errorClass:i instanceof Error?i.constructor.name:"Unknown",errorMessage:i instanceof Error?i.message:String(i),partialOutputBytes:Buffer.byteLength(this.lastStreamedContent,"utf8")}),this.currentStatus="failed",this.latestTerminalStatus="failed")),this.onTerminal(),i}finally{this.inFlight=null}}async streamToFinalMessage(t,n){let r,o;this.lastStreamedContent="",this.currentTrace=gc();let i=n??this.progressSink??an(),s={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let a of this.session.sendMessageStream(t)){if(i&&i(a,s),a.type==="chunk"){let l=a.chunk;l.type==="content"?this.lastStreamedContent+=l.content:l.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(a.type==="message")r=a.message,this.currentTrace.turnCount++;else if(a.type==="error"){o=a.error;break}else if(a.type==="done"){if(typeof a.metadata?.stopReason=="string"&&(this.lastStopReason=a.metadata.stopReason),typeof a.metadata?.usage=="object"&&a.metadata.usage!==null){let l=a.metadata.usage;this.currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}if(o)throw o;if(r)return r;if(this.lastStreamedContent.length>0)return this.lastStopReason??=oS,{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 new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t,n){try{let r=await this.run(t,n);return yI(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace,this.lastStopReason)}catch(r){let o=gm(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??an();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",Go(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 dR(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()}}});var e8,t8,n8,HI,se,Ke=R(()=>{"use strict";aR();qs();Du();xe();Hn();wr();mb();yR();fb();An();ym();Je();XI();e8=async(e,t)=>({action:"decline"}),t8=50,n8=20*6e4,HI=60*6e4,se=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentProvider;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.parentCwd=t.cwd,this.parentReadRoots=t.parentReadRoots,this.parentTraceWriter=t.traceWriter,this.parentSurface=t.surface,this.onSubagentSucceededCb=t.onSubagentSucceeded,this.abortGraph=new $u(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 hR(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 cR(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 S=!(this.parentReadRoots===void 0&&this.parentCwd===void 0)&&a!==void 0?await this.resolveMainRootForCwd(a):void 0;l=Fu({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,childCwd:a,worktreeMainRoot:S})}let c;if(t.config.writeRoots!==void 0&&t.config.writeRoots.length>0){let v=a!==void 0?[a]:[];c=[...new Set([...v,...t.config.writeRoots])]}let d={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:SI({childModel:t.config.model,configApiKey:t.config.apiKey,parentApiKey:this.parentApiKey,parentProvider:this.parentProvider}),baseUrl:t.config.baseUrl??(re(t.config.model)==="openai-compatible"?void 0:this.parentBaseUrl),isNonInteractive:t.config.isNonInteractive??!0,maxToolUseIterations:t.config.maxToolUseIterations??t8,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:e8},...t.phaseRole==="read-only"?{provider:VI("read-only",t.config.model)}:{}};d.cwd!==void 0&&gR(d.cwd);let u;try{u=new Tt(d)}catch(v){throw this.abortGraph.dispose(n),v}let p=t.parent.getInputStreamRef?.(),m=t.parent.abortSignal,g=this.progressSink??an(),h=t.agentType?.trim()||void 0,y=t.parentId?.trim()||void 0,b=new Im(n,u,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??n8,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},p,m,h??t.idPrefix,g,y??t.parent.sessionId,i,this.onSubagentSucceededCb);this.active.set(n,b);let w=typeof t.config.model=="string"?t.config.model:JSON.stringify(t.config.model);return Go(i,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:w,...d.tools?.allowedTools?{allowedTools:[...d.tools.allowedTools]}:{}}),await Le({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:w,parent_session_id:t.parent.sessionId}),b}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 ZI(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 vs(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 p=e[u];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(e.map(l=>l.handle.teardown())),i}var QI=R(()=>{"use strict";Hu()});function eP(e){let t=new Set;for(let n of e){let r=yc(n,r8);r!==void 0&&t.add(r)}return t}var r8,tP=R(()=>{"use strict";bc();ln();tp();r8=new Set([...Mt,...st,"memory_search","agent","skill"])});import{existsSync as rP,mkdirSync as o8,readFileSync as i8,renameSync as s8,writeFileSync as a8,unlinkSync as l8}from"fs";import{dirname as nP,join as c8}from"path";import{randomBytes as d8}from"crypto";function Ce(e=pe()){if(!rP(e))return Pm();try{let t=i8(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return Pm();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 Pm()}catch{return Pm()}}function Tc(e,t=pe()){o8(nP(t),{recursive:!0});let n=c8(nP(t),`.index.json.${process.pid}.${d8(4).toString("hex")}.tmp`),r=JSON.stringify(e,null,2);try{a8(n,r,"utf8"),s8(n,t)}catch(o){try{rP(n)&&l8(n)}catch{}throw o}}function yo(e,t,n=pe()){let r=Ce(n);return r.plugins[e]=t,Tc(r,n),r}function oP(e,t=pe()){let n=Ce(t);return e in n.plugins&&(delete n.plugins[e],Tc(n,t)),n}function kS(e,t,n=pe()){let r=Ce(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(),Tc(r,n),r}function xc(e,t,n=pe()){let r=Ce(n);return r.marketplaces[e]=t,Tc(r,n),r}function iP(e,t=pe()){let n=Ce(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&&Tc(n,t),n}function Pm(){return{version:2,plugins:{},marketplaces:{}}}var Jt=R(()=>{"use strict";G()});import{existsSync as ES,readFileSync as lP,readdirSync as u8,realpathSync as p8,statSync as m8}from"fs";import{join as Js,resolve as sP}from"path";function Cr(){zs=void 0}function Ar(e=Qe(),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}`}zs||(zs=new Map);let i=zs.get(o);if(i)return[...i];if(!ES(e))return zs.set(o,[]),[];let s=e===Qe()?pe():Js(e,".index.json"),a=Ce(s),l=[];return cP(e,e,0,l,new Set,a.plugins,n,r),zs.set(o,l),[...l]}function cP(e,t,n,r,o,i,s,a){if(n>f8)return;let l;try{l=p8(t)}catch{l=t}if(o.has(l))return;if(o.add(l),ES(Js(t,".claude-plugin","plugin.json"))){let d=TS(e,t);if(d===null){Mm(r,t);return}if(s){if(a&&a.get(h8(d))===!1)return;Mm(r,t);return}if(d.layout==="cache"){let p=i[d.key];if(!p||p.enabled===!1)return;Mm(r,t);return}let u=i[d.key];if(u&&u.enabled===!1)return;Mm(r,t);return}let c;try{c=u8(t)}catch{return}for(let d of c){if(d.startsWith("."))continue;let u=Js(t,d),p;try{p=m8(u)}catch{continue}p.isDirectory()&&cP(e,u,n+1,r,o,i,s,a)}}function g8(e){try{let t=lP(Js(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 Mm(e,t){let n=g8(t);e.push(n!==void 0?{type:"local",path:t,main:n}:{type:"local",path:t})}function h8(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 TS(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]===aP&&r.length>=3){let i=r[1];if(i){let s=Js(e,aP,i),l=y8(s,t)??r[2];if(l)return{layout:"cache",key:`${i}:${l}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function y8(e,t){let n=Js(e,".claude-plugin","marketplace.json");if(!ES(n))return null;let r;try{r=JSON.parse(lP(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let i=sP(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("../"))&&sP(e,a.source)===i)return a.name}return null}var f8,aP,zs,bo=R(()=>{"use strict";G();Jt();f8=5,aP="cache"});import{existsSync as wo,readdirSync as b8,readFileSync as w8}from"fs";import{join as _r}from"path";function uP(e=_e()){let t=[],n=_r(e,"skills");if(wo(n))for(let r of Om(n)){let o=_r(n,r,"SKILL.md");wo(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of dP){let o=_r(e,`${r}s`);if(wo(o))for(let i of Om(o))i.endsWith(".md")&&t.push({path:_r(o,i),type:r,source:"user"})}return t}function pP(e=Qe()){if(!wo(e))return[];let t=[],n=Ar(e);for(let r of n){let i=TS(e,r.path)?.key,s=_r(r.path,"skills");if(wo(s))for(let a of Om(s)){let l=_r(s,a,"SKILL.md");if(!wo(l))continue;let c={path:l,type:"skill",source:"plugin"};i&&(c.plugin_key=i),t.push(c)}for(let a of dP){let l=_r(r.path,`${a}s`);if(wo(l))for(let c of Om(l)){if(!c.endsWith(".md"))continue;let d={path:_r(l,c),type:a,source:"plugin"};i&&(d.plugin_key=i),t.push(d)}}}return t}function mP(e=_r(_e(),"settings.json")){if(!wo(e))return[];try{let t=w8(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 Om(e){try{return b8(e).filter(t=>!t.startsWith("."))}catch{return[]}}var dP,fP=R(()=>{"use strict";G();bo();dP=["command","agent"]});import{z as Ne}from"zod";import{mkdir as gP,appendFile as hP}from"fs/promises";import{join as xS}from"path";function k8(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function E8(e){let t=()=>{let i={};for(let s of wP)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 T8(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function x8(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(`
|
|
1071
|
+
${g.partialOutput}`},p):(p={content:g.error?.message??c,isError:!0},p)}catch(m){let g=m instanceof Error?m.message:String(m);return{content:`${d}: ${g}`,isError:!0}}finally{u&&await u.teardown({deferInjectContextToCaller:!0}).catch(W);let m=u?.getLastStopInjectContext?.();hm(p,m),await r?.teardownAll(),await n.teardownAll()}}var JI=R(()=>{"use strict";Ke();Et();iS();An();ym();Ut();wr();on();ve();WI();nS()});function Z4(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 Q4(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 Zn,kc=R(()=>{"use strict";Pt();Jn();An();Yw();Hn();Xw();eS();tS();nS();JI();Zn=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??fi;if(n>=r){let c=Z4(t.input);return Le({...Ns(this.ctx),event:"delegation.skipped",parent_session_id:this.ctx.parentSession.sessionId,reason:"max_depth",depth:n,requested_name:c}).catch(()=>{}),{content:um(n,r),isError:!0}}let o;try{o=Q4(t.input)}catch(c){return{content:`Skill tool input validation failed: ${c instanceof Error?c.message:String(c)}`,isError:!0}}let i;try{i=Ve(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||Am.has(o.name);return await qI(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 uI(this.internals(),o.name,c,o.arguments,t)}let l=gi(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 GI(this.internals(),t,n,r);if(t.context==="load")return dI(this.internals(),t,n,r);let o=eI(t.name);o&&sI(t.name);let i=this.ctx.depth??0;Le({...Ns(this.ctx),event:"skill.dispatched",requested_name:t.name,parent_session_id:this.ctx.parentSession.sessionId,depth:i,...pm(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}:{}})}catch(d){a=d}finally{let d=Date.now()-s;o&&iI({skillName:t.name,durationMs:d,...a!==void 0?{isError:!0}:{}});let u=a!==void 0?a instanceof Error?a.message:String(a):void 0,p=a===void 0?typeof l=="string"?l.length:l!=null?JSON.stringify(l).length:0:void 0;Le({...Ns(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,...p!==void 0?{content_chars:p}:{},...u!==void 0?{error_message:aI(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=Ec(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 mi(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}function Ks(e={}){return({childExecutor:t,childSkillExecutor:n,model:r,allowedTools:o,readOnlyBash:i})=>{let s={permissions:{allowedTools:o??km},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{},...i===!0?{readOnlyBash:!0}:{}};return re(typeof r=="string"?r:void 0)==="openai-compatible"?new zt({...s,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{},readOnlyMemory:!0}):new tt({...s,readOnlyMemory:!0})}}function KI(e,t,n){let r={allowedTools:[...n??Cm]};return re(typeof e=="string"?e:void 0)==="openai-compatible"?new zt({permissions:r,readOnlyBash:!0,readOnlyMemory:!0,...t!==void 0?{baseURL:t}:{}}):new tt({permissions:r,readOnlyBash:!0,readOnlyMemory:!0})}function Gs(e,t,n,r,o,i,s,a,l,c,d,u){let p=(m,g,h,y)=>{let b=y??s;return new Zn({parentSession:mi(h),defaultModel:e,...c!==void 0?{defaultSubagentModel:c}:{},apiKey:t,...r!==void 0?{baseUrl:r}:{},...u!==void 0?{openaiBaseUrl:u}:{},depth:m,maxDepth:g,childProviderFactory:n,childSkillExecutorFactory:p,...o!==void 0?{traceWriter:o}:{},...i!==void 0?{backgroundRegistry:i}:{},...b!==void 0?{cwd:b}:{},...a!==void 0?{resolveApiKeyForModel:a}:{},...l!==void 0?{surface:l}:{},...d!==void 0?{agentRegistry:d}:{}})};return p}function Em(e,t,n=!1,r){let o={allowedTools:[...e]};return re(typeof t=="string"?t:void 0)==="openai-compatible"?new zt({permissions:o,...n?{readOnlyBash:!0}:{},...r!==void 0?{baseURL:r}:{}}):new tt({permissions:o,...n?{readOnlyBash:!0}:{}})}function VI(e,t){let n={allowedTools:[...X_]};return re(typeof t=="string"?t:void 0)==="openai-compatible"?new zt({permissions:n}):new tt({permissions:n})}var fi,km,Cm,Am,An=R(()=>{"use strict";hi();uc();Je();ln();dn();fc();kc();fi=3;km=[...Mt,...st,"memory_search","agent","skill"],Cm=["read_file","glob","grep","list_directory","config_get","bash","web_scrape",...st,"memory_search","agent","skill"],Am=new Set(["ground-state"])});async function _m(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 tn(`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 YI,wS,SS=R(()=>{"use strict";pt();YI=0,wS=5e3});var Im,XI=R(()=>{"use strict";ve();SS();wr();Du();xe();Et();Im=class{constructor(t,n,r,o,i,s,a,l,c,d,u,p,m,g,h){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.progressSink=p,this.parentId=m}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;onSubagentSucceeded;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;lastStopInjectContext;progressSink;parentId;currentTrace=gc();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=_m(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 Go(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){throw this.lastDurationMs=Date.now()-r,this.currentStatus!=="cancelled"&&(this.controller.signal.aborted?(await Go(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(await Go(this.traceWriter,{transition:"failed",subagentId:this.id,errorClass:i instanceof Error?i.constructor.name:"Unknown",errorMessage:i instanceof Error?i.message:String(i),partialOutputBytes:Buffer.byteLength(this.lastStreamedContent,"utf8")}),this.currentStatus="failed",this.latestTerminalStatus="failed")),this.onTerminal(),i}finally{this.inFlight=null}}async streamToFinalMessage(t,n){let r,o;this.lastStreamedContent="",this.currentTrace=gc();let i=n??this.progressSink??an(),s={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let a of this.session.sendMessageStream(t)){if(i&&i(a,s),a.type==="chunk"){let l=a.chunk;l.type==="content"?this.lastStreamedContent+=l.content:l.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(a.type==="message")r=a.message,this.currentTrace.turnCount++;else if(a.type==="error"){o=a.error;break}else if(a.type==="done"){if(typeof a.metadata?.stopReason=="string"&&(this.lastStopReason=a.metadata.stopReason),typeof a.metadata?.usage=="object"&&a.metadata.usage!==null){let l=a.metadata.usage;this.currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}if(o)throw o;if(r)return r;if(this.lastStreamedContent.length>0)return this.lastStopReason??=oS,{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 new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t,n){try{let r=await this.run(t,n);return yI(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace,this.lastStopReason)}catch(r){let o=gm(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??an();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",Go(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 dR(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()}}});var e8,t8,n8,HI,se,Ke=R(()=>{"use strict";aR();qs();Du();xe();Hn();wr();mb();yR();fb();An();ym();Je();XI();e8=async(e,t)=>({action:"decline"}),t8=50,n8=20*6e4,HI=60*6e4,se=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentProvider;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.parentCwd=t.cwd,this.parentReadRoots=t.parentReadRoots,this.parentTraceWriter=t.traceWriter,this.parentSurface=t.surface,this.onSubagentSucceededCb=t.onSubagentSucceeded,this.abortGraph=new $u(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 hR(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 cR(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 S=!(this.parentReadRoots===void 0&&this.parentCwd===void 0)&&a!==void 0?await this.resolveMainRootForCwd(a):void 0;l=Fu({parentReadRoots:this.parentReadRoots,parentCwd:this.parentCwd,childCwd:a,worktreeMainRoot:S})}let c;if(t.config.writeRoots!==void 0&&t.config.writeRoots.length>0){let v=a!==void 0?[a]:[];c=[...new Set([...v,...t.config.writeRoots])]}let d={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:SI({childModel:t.config.model,configApiKey:t.config.apiKey,parentApiKey:this.parentApiKey,parentProvider:this.parentProvider}),baseUrl:t.config.baseUrl??(re(t.config.model)==="openai-compatible"?void 0:this.parentBaseUrl),isNonInteractive:t.config.isNonInteractive??!0,maxToolUseIterations:t.config.maxToolUseIterations??t8,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:e8},...t.phaseRole==="read-only"?{provider:VI("read-only",t.config.model)}:{}};d.cwd!==void 0&&gR(d.cwd);let u;try{u=new Tt(d)}catch(v){throw this.abortGraph.dispose(n),v}let p=t.parent.getInputStreamRef?.(),m=t.parent.abortSignal,g=this.progressSink??an(),h=t.agentType?.trim()||void 0,y=t.parentId?.trim()||void 0,b=new Im(n,u,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??n8,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},p,m,h??t.idPrefix,g,y??t.parent.sessionId,i,this.onSubagentSucceededCb);this.active.set(n,b);let w=typeof t.config.model=="string"?t.config.model:JSON.stringify(t.config.model);return Go(i,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:w,...d.tools?.allowedTools?{allowedTools:[...d.tools.allowedTools]}:{}}),await Le({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:w,parent_session_id:t.parent.sessionId}),b}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 ZI(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 vs(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 p=e[u];p&&p.handle.status==="running"&&p.handle.cancel().catch(()=>{})}}}),r&&await Promise.allSettled(e.map(l=>l.handle.teardown())),i}var QI=R(()=>{"use strict";Hu()});function eP(e){let t=new Set;for(let n of e){let r=yc(n,r8);r!==void 0&&t.add(r)}return t}var r8,tP=R(()=>{"use strict";bc();ln();tp();r8=new Set([...Mt,...st,"memory_search","agent","skill"])});import{existsSync as rP,mkdirSync as o8,readFileSync as i8,renameSync as s8,writeFileSync as a8,unlinkSync as l8}from"fs";import{dirname as nP,join as c8}from"path";import{randomBytes as d8}from"crypto";function Ce(e=pe()){if(!rP(e))return Pm();try{let t=i8(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return Pm();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 Pm()}catch{return Pm()}}function Tc(e,t=pe()){o8(nP(t),{recursive:!0});let n=c8(nP(t),`.index.json.${process.pid}.${d8(4).toString("hex")}.tmp`),r=JSON.stringify(e,null,2);try{a8(n,r,"utf8"),s8(n,t)}catch(o){try{rP(n)&&l8(n)}catch{}throw o}}function yo(e,t,n=pe()){let r=Ce(n);return r.plugins[e]=t,Tc(r,n),r}function oP(e,t=pe()){let n=Ce(t);return e in n.plugins&&(delete n.plugins[e],Tc(n,t)),n}function kS(e,t,n=pe()){let r=Ce(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(),Tc(r,n),r}function xc(e,t,n=pe()){let r=Ce(n);return r.marketplaces[e]=t,Tc(r,n),r}function iP(e,t=pe()){let n=Ce(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&&Tc(n,t),n}function Pm(){return{version:2,plugins:{},marketplaces:{}}}var Jt=R(()=>{"use strict";G()});import{existsSync as ES,readFileSync as lP,readdirSync as u8,realpathSync as p8,statSync as m8}from"fs";import{join as Js,resolve as sP}from"path";function Cr(){zs=void 0}function Ar(e=Qe(),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}`}zs||(zs=new Map);let i=zs.get(o);if(i)return[...i];if(!ES(e))return zs.set(o,[]),[];let s=e===Qe()?pe():Js(e,".index.json"),a=Ce(s),l=[];return cP(e,e,0,l,new Set,a.plugins,n,r),zs.set(o,l),[...l]}function cP(e,t,n,r,o,i,s,a){if(n>f8)return;let l;try{l=p8(t)}catch{l=t}if(o.has(l))return;if(o.add(l),ES(Js(t,".claude-plugin","plugin.json"))){let d=TS(e,t);if(d===null){Mm(r,t);return}if(s){if(a&&a.get(h8(d))===!1)return;Mm(r,t);return}if(d.layout==="cache"){let p=i[d.key];if(!p||p.enabled===!1)return;Mm(r,t);return}let u=i[d.key];if(u&&u.enabled===!1)return;Mm(r,t);return}let c;try{c=u8(t)}catch{return}for(let d of c){if(d.startsWith("."))continue;let u=Js(t,d),p;try{p=m8(u)}catch{continue}p.isDirectory()&&cP(e,u,n+1,r,o,i,s,a)}}function g8(e){try{let t=lP(Js(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 Mm(e,t){let n=g8(t);e.push(n!==void 0?{type:"local",path:t,main:n}:{type:"local",path:t})}function h8(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 TS(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]===aP&&r.length>=3){let i=r[1];if(i){let s=Js(e,aP,i),l=y8(s,t)??r[2];if(l)return{layout:"cache",key:`${i}:${l}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function y8(e,t){let n=Js(e,".claude-plugin","marketplace.json");if(!ES(n))return null;let r;try{r=JSON.parse(lP(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let i=sP(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("../"))&&sP(e,a.source)===i)return a.name}return null}var f8,aP,zs,bo=R(()=>{"use strict";G();Jt();f8=5,aP="cache"});import{existsSync as wo,readdirSync as b8,readFileSync as w8}from"fs";import{join as _r}from"path";function uP(e=_e()){let t=[],n=_r(e,"skills");if(wo(n))for(let r of Om(n)){let o=_r(n,r,"SKILL.md");wo(o)&&t.push({path:o,type:"skill",source:"user"})}for(let r of dP){let o=_r(e,`${r}s`);if(wo(o))for(let i of Om(o))i.endsWith(".md")&&t.push({path:_r(o,i),type:r,source:"user"})}return t}function pP(e=Qe()){if(!wo(e))return[];let t=[],n=Ar(e);for(let r of n){let i=TS(e,r.path)?.key,s=_r(r.path,"skills");if(wo(s))for(let a of Om(s)){let l=_r(s,a,"SKILL.md");if(!wo(l))continue;let c={path:l,type:"skill",source:"plugin"};i&&(c.plugin_key=i),t.push(c)}for(let a of dP){let l=_r(r.path,`${a}s`);if(wo(l))for(let c of Om(l)){if(!c.endsWith(".md"))continue;let d={path:_r(l,c),type:a,source:"plugin"};i&&(d.plugin_key=i),t.push(d)}}}return t}function mP(e=_r(_e(),"settings.json")){if(!wo(e))return[];try{let t=w8(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 Om(e){try{return b8(e).filter(t=>!t.startsWith("."))}catch{return[]}}var dP,fP=R(()=>{"use strict";G();bo();dP=["command","agent"]});import{z as Ne}from"zod";import{mkdir as gP,appendFile as hP}from"fs/promises";import{join as xS}from"path";function k8(e){return{runUserDiscovery:e!=="plugin",runPluginDiscovery:e!=="user",runHookInspector:e!=="plugin"}}function E8(e){let t=()=>{let i={};for(let s of wP)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 T8(e){return e.verdict==="misfit"&&e.confidence==="high"&&e.source==="user"}function x8(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(`
|
|
1072
1072
|
`)}function R8(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(`
|
|
1073
1073
|
`);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(`
|
|
1074
1074
|
`)}function C8(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 A8(e,t,n){let r=n?.apiKey,o=n?.defaultSubagentModel??n?.defaultModel??"sonnet",i=n?.callId,s=typeof e=="object"&&e!==null?e:{},a=S8.parse(s),l=a.writeBriefs??!0,c=a.scope??"all",d=k8(c);if(!t?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let u=t.sessionId,p=Ue("audit-fit"),m={skill:p["01-skill-inspector.md"],command:p["02-command-inspector.md"],agent:p["03-agent-inspector.md"],hook:p["04-hook-inspector.md"]};for(let F of wP)if(!m[F])throw new Error(`audit-fit skill missing inspector prompt for ${F}`);let g=d.runUserDiscovery?uP():[],h=d.runPluginDiscovery?pP():[],y={skill:[],command:[],agent:[]};for(let F of[...g,...h])y[F.type].push(F);let b=new se({apiKey:r,...n?.defaultModel!==void 0?{parentModel:n.defaultModel}:{},...n?.traceWriter!==void 0?{traceWriter:n.traceWriter}:{}}),w=eP(fo.allowedTools),v=()=>async F=>w.has(F)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${F} not allowed for audit-fit inspectors. Allowed tools: ${[...w].join(", ")}`},S=[];for(let F of v8){let U=y[F];if(U.length===0)continue;let H=m[F];H&&S.push({type:F,prompt:`${H}
|
|
@@ -1325,7 +1325,7 @@ ${t.body}`)}var t5,OS=R(()=>{"use strict";t5=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9
|
|
|
1325
1325
|
`),0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let i;try{i=o5(QP(e,o.name,"SKILL.md"),"utf-8")}catch(c){let d=c;d.code!=="ENOENT"&&process.stderr.write(`[afk] skipping skill ${o.name}: ${d.message}
|
|
1326
1326
|
`);continue}let s=s5(i,o.name);if(!s)continue;s.dir=QP(e,o.name);let l={name:l5(s.name,t),description:s.description,handler:a5(s),origin:t};s.argumentHint&&(l.argumentHint=s.argumentHint),s.flags&&s.flags.length>0&&(l.flags=s.flags),s.context!=="fork"&&(l.context="load",l.loadBody=s.body.replace(/\$\{?SKILL_ROOT\}?/g,()=>s.dir)),It(l),r++}return r}function $S(){return Pr(fl(),"user")}var eM,DS=R(()=>{"use strict";G();Pt();OS();Ke();eM=1024});var FS=R(()=>{"use strict";SP();vP();VP();YP();XP();DS()});import{isAbsolute as c5,resolve as d5}from"path";import{pathToFileURL as u5}from"url";async function nM(e,t={}){let n=t.importer??(r=>import(r));for(let r of e){if(r.main===void 0)continue;let o=c5(r.main)?r.main:d5(r.path,r.main);if(!tM.has(o)){tM.add(o);try{let s=(await n(u5(o).href))?.default;typeof s=="function"&&await s(t.pluginApi)}catch(i){t.onError?.(r,i)}}}}var tM,rM=R(()=>{"use strict";tM=new Set});import{existsSync as p5,readFileSync as m5}from"fs";import{join as f5}from"path";function Mr(e){let t=f5(e,".claude-plugin","plugin.json");if(!p5(t))return{name:null,version:null};try{let n=JSON.parse(m5(t,"utf8"));return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():null,version:typeof n.version=="string"&&n.version.trim()?n.version.trim():null}}catch{return{name:null,version:null}}}var Cc=R(()=>{"use strict"});import{z}from"zod";var Ac,g5,h5,LS,oM,iM,sM,aM,_c,Nm=R(()=>{"use strict";Ac=1,g5=z.object({toolName:z.string(),toolUseId:z.string().optional(),input:z.string().optional(),inputRaw:z.string().optional(),result:z.string().optional(),isError:z.boolean().optional()}).passthrough(),h5=z.object({user:z.string().default(""),assistant:z.string().default(""),timestamp:z.number().optional(),toolEvents:z.array(g5).optional()}).passthrough(),LS=z.object({sessionId:z.string().optional(),name:z.string().optional(),source:z.enum(["cli","telegram"]).optional(),telegramChatId:z.number().optional(),model:z.string(),startedAt:z.number(),savedAt:z.number(),totalTurns:z.number(),totalCostUsd:z.number().optional(),totalTokens:z.number().optional(),totalDurationMs:z.number().optional(),turns:z.array(h5).default([]),forkedFrom:z.string().optional(),forkedAt:z.number().optional()}).passthrough(),oM=z.enum(["fully_achieved","partially_achieved","not_achieved","aborted"]),iM=z.enum(["not_persisted","persisted","unknown"]),sM=z.object({tool:z.string(),label:z.string().optional()}),aM=z.object({files_written:z.number().int(),files_edited:z.number().int(),bash_commands:z.number().int(),commits:z.number().int(),mutated:z.boolean()}),_c=z.object({facet_version:z.number().int(),session_id:z.string(),source:z.enum(["cli","telegram","unknown"]),model:z.string(),derived_at:z.string(),derived_from:z.literal("afk-session"),source_session_path:z.string(),source_session_mtime_ms:z.number(),subagent_persistence:iM,start_time:z.string(),end_time:z.string(),duration_minutes:z.number(),underlying_goal:z.string(),first_prompt:z.string(),goal_categories:z.record(z.string(),z.number()),session_type:z.string(),brief_summary:z.string(),total_turns:z.number().int(),user_message_count:z.number().int(),assistant_message_count:z.number().int(),tool_counts:z.record(z.string(),z.number()),commands:z.array(z.string()),skills:z.array(z.string()),subagents:z.array(sM),tool_errors:z.number().int(),tool_error_categories:z.record(z.string(),z.number()),friction_counts:z.record(z.string(),z.number()),friction_detail:z.string(),outcome:oM,primary_success:z.string(),world_changes:aM,decisions:z.array(z.string()),evidence_pointers:z.array(z.string())}).passthrough()});import{basename as y5}from"path";function E5(e){if(e)try{let t=JSON.parse(e);return t&&typeof t=="object"?t:void 0}catch{return}}function Bm(e){return typeof e=="string"?e:void 0}function Um(e,t){let n=e.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n}function T5(e){return e.replace(/[-_]+/g," ").trim()}function x5(e,t){return cM.test(e)?"slash_command":t==="telegram"?"chat":"task"}function R5(e){let t=new Map,n=[];for(let r of e)r.toolUseId===void 0?n.push(r):t.set(r.toolUseId,r);return[...t.values(),...n]}function Ic(e,t={}){let n=e.turns??[],r=R5(n.flatMap(H=>H.toolEvents??[])),o={},i={},s=[],a=[],l=[],c=0,d=0,u=0,p=0,m=0;for(let H of r){let N=H.toolName;o[N]=(o[N]??0)+1,H.isError===!0&&(c+=1,i[N]=(i[N]??0)+1);let P=E5(H.inputRaw??H.input);if(N==="write_file"&&(d+=1),N==="edit_file"&&(u+=1),N==="bash"){p+=1;let M=Bm(P?.command)??H.input;M&&k5.test(M)&&(m+=1)}if(w5.has(N)){let M=Bm(P?.file_path);M&&!l.includes(M)&&l.length<v5&&l.push(M)}if(b5.has(N)){let M;N==="skill"?(M=Bm(P?.name),M&&!a.includes(M)&&a.push(M)):N==="agent"?M=Bm(P?.id_prefix):M="compose",s.push(M?{tool:N,label:M}:{tool:N})}}let g=n[0]?.user??"",h=e.source??"cli",y=x5(g,h),b=[];for(let H of n){let P=cM.exec(H.user??"")?.[1];P&&!b.includes(P)&&b.push(P)}let w=n.filter(H=>(H.user??"").trim().length>0).length,v=n.filter(H=>(H.assistant??"").trim().length>0).length,S=[...n].reverse().find(H=>(H.assistant??"").trim().length>0)?.assistant??"",x;n.length===0?x="aborted":S.trim().length===0?x="partially_achieved":x="fully_achieved";let C=x==="fully_achieved"||x==="partially_achieved"?Um(S||g||y,160)||y:"none",A=c>0?`${c} tool error(s): ${Object.entries(i).map(([H,N])=>`${H}\xD7${N}`).join(", ")}`:"",B=e.name?T5(e.name):Um(g,80),$=Um(S||g,S5),I=Um(B?`${B} \u2014 ${$}`:$,400)||"empty session",_=e.sessionId??(t.sourceSessionPath?y5(t.sourceSessionPath,".json"):"unknown"),D=e.totalDurationMs&&e.totalDurationMs>0?e.totalDurationMs:Math.max(0,e.savedAt-e.startedAt),F=t.sourceSessionPath?[...l,t.sourceSessionPath]:l,U={facet_version:Ac,session_id:_,source:h==="telegram"?"telegram":"cli",model:e.model,derived_at:(t.derivedAt??new Date).toISOString(),derived_from:"afk-session",source_session_path:t.sourceSessionPath??"",source_session_mtime_ms:t.sourceSessionMtimeMs??e.savedAt,subagent_persistence:"not_persisted",start_time:new Date(e.startedAt).toISOString(),end_time:new Date(e.savedAt).toISOString(),duration_minutes:Number((D/6e4).toFixed(2)),underlying_goal:g.slice(0,lM),first_prompt:g.slice(0,lM),goal_categories:{[y]:1},session_type:y,brief_summary:I,total_turns:n.length,user_message_count:w,assistant_message_count:v,tool_counts:o,commands:b,skills:a,subagents:s,tool_errors:c,tool_error_categories:i,friction_counts:{...i},friction_detail:A,outcome:x,primary_success:C,world_changes:{files_written:d,files_edited:u,bash_commands:p,commits:m,mutated:d>0||u>0||m>0},decisions:[],evidence_pointers:F};return _c.parse(U)}var b5,w5,lM,S5,v5,k5,cM,NS=R(()=>{"use strict";Nm();b5=new Set(["agent","compose","skill"]),w5=new Set(["read_file","write_file","edit_file"]),lM=1e3,S5=240,v5=50,k5=/\bgit\s+commit(?![\w-])/,cM=/^\s*\/([a-zA-Z][\w-]*)/});import{existsSync as jm,mkdirSync as C5,readFileSync as dM,readdirSync as A5,renameSync as _5,statSync as I5,writeFileSync as P5}from"fs";import{basename as M5,dirname as O5,join as uM}from"path";function pM(e,t){return Xd(e),uM(t,`${e}.json`)}function $5(e,t){return Xd(e),uM(t,`${e}.json`)}function Hm(e,t=wt()){let n=pM(e,t);if(jm(n))try{let r=JSON.parse(dM(n,"utf8")),o=LS.safeParse(r);return o.success?o.data:void 0}catch{return}}function D5(e){if(jm(e))try{let t=JSON.parse(dM(e,"utf8")),n=_c.safeParse(t);return n.success?n.data:void 0}catch{return}}function F5(e,t){C5(O5(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;P5(n,`${JSON.stringify(t,null,2)}
|
|
1327
1327
|
`,"utf8"),_5(n,e)}function L5(e,t){return e.facet_version===Ac&&e.source_session_mtime_ms===t}function BS(e,t={}){let n=t.sessionsDir??wt(),r=t.cacheDir??bT(),o=pM(e,n);if(!jm(o))return;let i=I5(o).mtimeMs,s=$5(e,r);if(!t.force){let c=D5(s);if(c&&L5(c,i))return c}let a=Hm(e,n);if(!a)return;let l=Ic(a,{sourceSessionPath:o,sourceSessionMtimeMs:i});return F5(s,l),l}function US(e={}){let t=e.sessionsDir??wt();return jm(t)?A5(t).filter(n=>n.endsWith(".json")).map(n=>M5(n,".json")):[]}var mM=R(()=>{"use strict";G();NS();Nm()});var fM=R(()=>{"use strict";Nm();NS();mM()});import{readFileSync as N5}from"node:fs";import{join as B5}from"node:path";function dm(e,t){let n=gi(e,t);if(n.length===0)return"";let r=[];for(let o of n){let i=o.argumentHint?`${o.argumentHint}`:"",s=i?`- \`${o.name} ${i}\`: ${o.description}`:`- ${o.name}: ${o.description}`;r.push(s),o.whenToUse&&r.push(` When to use: ${o.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either dispatches one or more context-isolated subagents (delegation \u2014 preserves the main session's context) or loads its instructions directly into your current context (`load` mode). Calling `skill` is the entry point for both; the executor picks the mode per skill. Prefer a skill over inline investigation when the task shape matches.","",...r].join(`
|
|
1328
|
-
`)}function gi(e,t){let n=[],r=new Set,o=k.AFK_INTERNAL==="1",i=En(jt());Pr(fl(),"user"),sR("project"),Pr(Kd(t?.cwd),"project");for(let{dir:a,origin:l}of i.skillRoots)Pr(a,l);for(let a of Bn()){let l=Ve(a);sn(l,o)&&(n.push({name:a,description:l.description,source:l.origin==="user"?"user":l.origin==="project"?"project":l.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:l.argumentHint,whenToUse:l.whenToUse}),r.add(a))}let s=e??Wm(t);for(let a of s){if(a.type!=="local")continue;let l=sS(a.path);for(let c of l)!c.name||r.has(c.name)||sn({audience:c.audience},o)&&(n.push({name:c.name,description:c.description??`Skill from plugin at ${a.path}`,source:"plugin"}),r.add(c.name))}return n}function Ec(e,t){let n=new Map,r=e??Wm(t);for(let o of r){if(o.type!=="local")continue;let i=sS(o.path);for(let s of i)s.name&&s.body&&s.body.length>0&&!n.has(s.name)&&n.set(s.name,{body:s.body,pluginPath:o.path,...s.allowedTools!==void 0?{allowedTools:s.allowedTools}:{},...s.context!==void 0?{context:s.context}:{},...s.readOnly===!0?{readOnly:!0}:{}})}return n}function oa(e){let t=e??Wm(),n=[],r=new Set;for(let o of t){if(o.type!=="local")continue;let i=Mr(o.path).name;if(i!==null)for(let s of vm(B5(o.path,"agents"))){let a;try{a=N5(s,"utf8")}catch{continue}let l=ui(a);if(l===void 0)continue;let c=`${i}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${i}`,filePath:s,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function Wm(e){return[...Ar(Gd(e?.cwd)),...Ar(),...Ar(Yi()),...En(jt()).pluginRoots.flatMap(({dir:t,binary:n})=>Ar(t,{trustAll:!0,sourceEnabled:zx(n)}))]}async function ia(){await nM(Wm(),{pluginApi:{registerSkill:It,listSkills:Bn,getSkill:Ve,loadSkillPrompts:Ue,env:k,SubagentManager:se,describeFailure:yt,discoverPluginSkillBodies:Ec,getAgentFrameworkDir:Nt,getSkillsDir:fl,getSessionsDir:wt,getOrDeriveFacet:BS,listSessionIds:US,deriveSessionFacet:Ic,loadStoredSession:Hm}})}var Jn=R(()=>{"use strict";FS();Pt();on();DS();bo();rM();bc();Cc();wc();pS();Ke();Et();fM();G();q();hr()});function cm(){try{let e=gi();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),n}))}catch{return Promise.resolve([])}}var zw=R(()=>{"use strict";Jn()});function gM(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let i of n)i.type==="tool_use"&&typeof i.id=="string"&&r.push(i.id);if(r.length===0)return;let o={role:"user",content:r.map(i=>({type:"tool_result",tool_use_id:i,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}var hM=R(()=>{"use strict"});function yM(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var bM=R(()=>{"use strict"});var U5,Km,wM=R(()=>{"use strict";U5="__closed__",Km=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(U5)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}}});function H5(e,t,n,r,o){let i=j5.get(e);if(!i)return;let s=1e6,l=Math.max(0,t-r-o)/s*i.inputPerMTok,c=n/s*i.outputPerMTok,d=i.cacheWritePerMTok??i.inputPerMTok*1.25,u=i.cacheReadPerMTok??i.inputPerMTok*.1,p=o/s*d,m=r/s*u;return l+c+p+m}function SM(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=H5(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var j5,vM=R(()=>{"use strict";Cw();j5=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]])});function W5(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function K5(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:W5(a.partialJson)}));let i=a=>a.type==="tool_use",s=r.filter(i);return{stopReason:t,assistantBlocks:r,toolUseBlocks:s,usage:n,text:o.join("")}}async function*kM(e,t){let n=[],r=null,o=null,i=!1,s=!!k.AFK_TELEGRAM_TRACE;try{s&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(s&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}s&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(a){s&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}s&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:K5(n,r,o)}}var EM=R(()=>{"use strict";q()});import{randomUUID as G5}from"node:crypto";function q5(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}function z5(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function TM(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}async function J5(e,t,n,r){for(let o=0;;o++){if(o>0){let i=xM*Math.pow(2,o-1);if(await lo(i,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let s=i instanceof Error?i:new Error(String(i));if(z5(s)&&o<jS)continue;throw s}}}async function*HS(e){let t=rm(e.maxToolUseIterations),n={stopReason:null},r=0,o=0,i=!1,s=0,a=G5(),l=Date.now(),c=d=>({...d,durationMs:Date.now()-l});ge(e.traceWriter,{phase:"loop_start"});try{for(;;){if(e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let d=bu({baseUrl:e.baseUrl})?Tx(e.messages,wu()):e.messages,u={model:e.model,max_tokens:e.maxTokens,messages:d,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0&&!i?{tools:e.tools.map(q5)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{}},p=Date.now(),m;try{m=await J5(e.client,u,e.headers,e.signal)}catch(T){if(e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let C=T instanceof Error?T:new Error(String(T));C.message.includes("thinking")&&V5(e.messages,C),yield{type:"error",error:C};return}let g=null,h=!1,y=!1,b=!1;try{k.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let T of kM(m,e.ctx))if(b||(b=!0,ge(e.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-p,resolvedModel:e.model})),k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",T.kind,T.kind==="event"?T.event.type:""),T.kind==="event"){if(T.event.type==="error"){if(TM(T.event.error)&&s<jS&&!e.signal.aborted){y=!0;break}yield T.event,h=!0;break}yield T.event}else{g=T.result;break}k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",g?"set":"null")}catch(T){if(e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let C=T instanceof Error?T:new Error(String(T));if(TM(C)&&s<jS&&!e.signal.aborted)y=!0;else{yield{type:"error",error:C};return}}if(y){if(s+=1,ge(e.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:s}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},await lo(xM*Math.pow(2,s-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}continue}if(s=0,h){e.signal.aborted&&(yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId});return}if(g===null){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let w=SM(g.usage,g.stopReason,e.model);if(n=ec(n,w),n.contextWindowTokens=(w.inputTokens??0)+(w.outputTokens??0)+(w.cachedInputTokens??0)+(w.cacheCreationTokens??0),e.onUsageProgress?.(n),g.stopReason!=="tool_use"){if(g.stopReason==="refusal"){yield{type:"assistant.message",text:g.text.length>0?g.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:e.ctx.sessionId},yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}g.text.length>0&&(yield{type:"assistant.message",text:g.text,sessionId:e.ctx.sessionId},g.text.length<=200&&(yield{type:"suggestion",suggestion:g.text,sessionId:e.ctx.sessionId}));let T=g.assistantBlocks.filter(C=>C.type!=="tool_use");T.length>0&&e.messages.push({role:"assistant",content:T}),yield{type:"turn.completed",usage:c(i?{...n,stopReason:ao}:n),sessionId:e.ctx.sessionId};return}let v=e.messages.length;e.messages.push({role:"assistant",content:g.assistantBlocks});try{o+=g.toolUseBlocks.length;let T=[],C=new Map;for(let I of g.toolUseBlocks){T.push({id:I.id,name:I.name,input:I.input,signal:e.signal});let _=Date.now();C.set(I.id,_),ns(e.traceWriter,{phase:"started",toolUseId:I.id,name:I.name,inputBytes:Buffer.byteLength(JSON.stringify(I.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:I.id,toolName:I.name,toolInput:di(I.name,I.input),toolInputRaw:tm(I.input),sessionId:e.ctx.sessionId}}if(e.signal.aborted){let I=T.map(_=>({type:"tool_result",tool_use_id:_.id,content:"Tool call aborted",is_error:!0}));e.messages.push({role:"user",content:I}),yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let A;if(e.toolDispatcher.executeBatch)try{A=await e.toolDispatcher.executeBatch(T)}catch(I){A=T.map(()=>({content:`Tool batch execution failed: ${I instanceof Error?I.message:String(I)}`,isError:!0}))}else{A=[];for(let I of T){if(e.signal.aborted){A.push({content:"Tool call aborted",isError:!0});continue}try{A.push(await e.toolDispatcher.execute(I))}catch(_){let D=_ instanceof Error?_.message:String(_);A.push({content:`Tool execution threw: ${D}`,isError:!0})}}}let B=[];for(let I=0;I<T.length;I++){let _=T[I],D=A[I],F=C.get(_.id),U=typeof F=="number"?Date.now()-F:0,H=D.truncated===!0||D.content.includes("[output truncated");ns(e.traceWriter,{phase:"completed",toolUseId:_.id,name:_.name,resultBytes:Buffer.byteLength(D.content,"utf8"),isError:D.isError===!0,truncated:H,durationMs:U,...D.circuitBreaker===!0?{circuitBreaker:!0}:{},...D.failureClass?{failureClass:D.failureClass}:{},...typeof D.batchIndex=="number"&&typeof D.batchSize=="number"?{batchIndex:D.batchIndex,batchSize:D.batchSize}:{}}),yield{type:"tool.output",toolUseId:_.id,toolName:_.name,content:D.content,...D.isError===!0?{isError:!0}:{},...H?{truncated:!0}:{},...typeof D.batchIndex=="number"&&typeof D.batchSize=="number"?{batchIndex:D.batchIndex,batchSize:D.batchSize}:{},sessionId:e.ctx.sessionId},D.render?.diff&&(yield{type:"tool.diff",toolUseId:_.id,diff:D.render.diff,sessionId:e.ctx.sessionId});let{content:N,isError:P,image:M}=D,O=M!==void 0?[{type:"image",source:{type:"base64",media_type:M.mediaType,data:M.data}},...N.length>0?[{type:"text",text:N}]:[]]:N;B.push({type:"tool_result",tool_use_id:_.id,content:O,...P===!0?{is_error:!0}:{}})}let $={role:"user",content:B};e.messages.push($)}catch(T){throw e.messages.splice(v),T}r+=1;let S=g.toolUseBlocks[g.toolUseBlocks.length-1],x=S?`${S.name}${di(S.name,S.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:a,description:"Working",summary:`round ${r}: ${x}`,lastToolName:S?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-l},sessionId:e.ctx.sessionId},i){yield{type:"turn.completed",usage:c({...n,stopReason:ao}),sessionId:e.ctx.sessionId};return}if(om(r,t)){let T=e.messages[e.messages.length-1];T!==void 0&&T.role==="user"&&Array.isArray(T.content)&&T.content.push({type:"text",text:nm}),i=!0;continue}}}finally{ge(e.traceWriter,{phase:"loop_end",durationMs:Date.now()-l})}}function V5(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let i=o.content;for(let s=0;s<i.length;s++){let a=i[s];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:s,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var jS,xM,RM=R(()=>{"use strict";vM();Ny();EM();xe();Lw();q();am();em();dc();dc();jS=3,xM=5e3});var CM=R(()=>{"use strict";cs()});import{randomUUID as Gm}from"node:crypto";var AM,Y5,X5,Z5,Q5,eX,qm,_M=R(()=>{"use strict";RM();rs();Fy();CM();am();xe();AM=7200*1e3,Y5=3,X5=12e4,Z5=5e3,Q5=1e3,eX=60*1e3,qm=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(t){this._client=t.client,this._authMode=t.authMode,this.initSessionId=t.initSessionId,this.tokenRefresher=t.tokenRefresher,this.autoResumeOnUsageLimit=t.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let t=kt(),n=null;try{if(this.refreshPromise)n=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{n=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{return this.refreshPromise=null,null}if(!n)return null;this._client=n;let r=kt();return{accountId:Yr(r??""),swapped:t!==r}}async*turnWithRetries(t,n){yield*this.turnWithUsageLimitRetry(t,n)}async*turnWithUsageLimitRetry(t,n){let r=null,o=null,i=!1,s=0;for(;;){let d,u=!1;for await(let g of this.turnWithAuthRetry(t,n)){if(g.type==="error"){let h=Dy(g.error);if(h&&h.kind==="oauth-limit"){o=h.resetsAt,r=g;break}if(h&&h.kind==="oauth-limit-no-ts"){i=!0,r=g;break}if(h&&h.kind==="rate-limit-transient"&&s<Y5){u=!0,d=h.retryAfterMs;break}}yield g}if(!u)break;if(s+=1,n()||t.signal.aborted)return;let m=Math.min(d??Z5,X5)+Math.floor(Math.random()*Q5);if(ge(t.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:s,waitMs:m}}),await lo(m,t.signal),n()||t.signal.aborted)return;t.headers=vn(this._authMode,this.initSessionId,Gm())}if(!r)return;if(i){let d=Yr(kt()??"");if(yield{type:"paused",reason:"usage-limit",accountId:d,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let u=Date.now(),p=!1;for(;;){let m;if(this.usageLimitWaitPromise)m="aborted";else{this.usageLimitWaitPromise=vx({signal:t.signal,retryAfterMs:eX});try{m=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(m==="aborted")return;let g=d;if(m==="hot-swap"){let y=await this.forceClientRefresh();y&&(t.client=this._client,g=y.accountId)}t.headers=vn(this._authMode,this.initSessionId,Gm());let h=null;for await(let y of this.turnWithAuthRetry(t,n)){if(!p&&y.type==="error"){let b=Dy(y.error);if(b&&(b.kind==="oauth-limit"||b.kind==="oauth-limit-no-ts")){h=y;break}}p||(yield{type:"resumed",hotSwapped:m==="hot-swap",accountId:g},p=!0),yield y}if(!h)return;if(Date.now()-u>AM){yield h;return}}}if(!o)return;if(o.getTime()-Date.now()>AM){yield r;return}let a=Yr(kt()??"");if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let l;if(this.usageLimitWaitPromise)l=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Sx({resetsAt:o,signal:t.signal});try{l=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(l==="aborted")return;let c=a;if(l==="hot-swap"){let d=await this.forceClientRefresh();d&&(t.client=this._client,c=d.accountId)}t.headers=vn(this._authMode,this.initSessionId,Gm()),yield{type:"resumed",hotSwapped:l==="hot-swap",accountId:c},yield*this.turnWithAuthRetry(t,n)}async*turnWithAuthRetry(t,n){let r=null;for await(let i of HS(t)){if(n())return;if(i.type==="error"&&this.isRetryableAuth(i.error)){r=i;break}yield i}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}t.client=this._client,t.headers=vn(this._authMode,this.initSessionId,Gm()),yield*HS(t)}isRetryableAuth(t){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}}});function tX(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function nX(e){let n=[(e.role==="user"?"User":"Assistant")+":"];if(typeof e.content=="string")n.push(e.content);else if(Array.isArray(e.content))for(let r of e.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let i=r.name??"unknown",s=$M(r.input);n.push(`[tool call: ${i} ${s}]`)}else if(o==="tool_result"){let i=r.content;n.push(`[tool result: ${DM(i)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
|
|
1328
|
+
`)}function gi(e,t){let n=[],r=new Set,o=k.AFK_INTERNAL==="1",i=En(jt());Pr(fl(),"user"),sR("project"),Pr(Kd(t?.cwd),"project");for(let{dir:a,origin:l}of i.skillRoots)Pr(a,l);for(let a of Bn()){let l=Ve(a);sn(l,o)&&(n.push({name:a,description:l.description,source:l.origin==="user"?"user":l.origin==="project"?"project":l.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:l.argumentHint,whenToUse:l.whenToUse}),r.add(a))}let s=e??Wm(t);for(let a of s){if(a.type!=="local")continue;let l=sS(a.path);for(let c of l)!c.name||r.has(c.name)||sn({audience:c.audience},o)&&(n.push({name:c.name,description:c.description??`Skill from plugin at ${a.path}`,source:"plugin"}),r.add(c.name))}return n}function Ec(e,t){let n=new Map,r=e??Wm(t);for(let o of r){if(o.type!=="local")continue;let i=sS(o.path);for(let s of i)s.name&&s.body&&s.body.length>0&&!n.has(s.name)&&n.set(s.name,{body:s.body,pluginPath:o.path,...s.allowedTools!==void 0?{allowedTools:s.allowedTools}:{},...s.context!==void 0?{context:s.context}:{},...s.readOnly===!0?{readOnly:!0}:{},...s.model!==void 0?{model:s.model}:{}})}return n}function oa(e){let t=e??Wm(),n=[],r=new Set;for(let o of t){if(o.type!=="local")continue;let i=Mr(o.path).name;if(i!==null)for(let s of vm(B5(o.path,"agents"))){let a;try{a=N5(s,"utf8")}catch{continue}let l=ui(a);if(l===void 0)continue;let c=`${i}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${i}`,filePath:s,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function Wm(e){return[...Ar(Gd(e?.cwd)),...Ar(),...Ar(Yi()),...En(jt()).pluginRoots.flatMap(({dir:t,binary:n})=>Ar(t,{trustAll:!0,sourceEnabled:zx(n)}))]}async function ia(){await nM(Wm(),{pluginApi:{registerSkill:It,listSkills:Bn,getSkill:Ve,loadSkillPrompts:Ue,env:k,SubagentManager:se,describeFailure:yt,discoverPluginSkillBodies:Ec,getAgentFrameworkDir:Nt,getSkillsDir:fl,getSessionsDir:wt,getOrDeriveFacet:BS,listSessionIds:US,deriveSessionFacet:Ic,loadStoredSession:Hm}})}var Jn=R(()=>{"use strict";FS();Pt();on();DS();bo();rM();bc();Cc();wc();pS();Ke();Et();fM();G();q();hr()});function cm(){try{let e=gi();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),n}))}catch{return Promise.resolve([])}}var zw=R(()=>{"use strict";Jn()});function gM(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let i of n)i.type==="tool_use"&&typeof i.id=="string"&&r.push(i.id);if(r.length===0)return;let o={role:"user",content:r.map(i=>({type:"tool_result",tool_use_id:i,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}var hM=R(()=>{"use strict"});function yM(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var bM=R(()=>{"use strict"});var U5,Km,wM=R(()=>{"use strict";U5="__closed__",Km=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(U5)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}}});function H5(e,t,n,r,o){let i=j5.get(e);if(!i)return;let s=1e6,l=Math.max(0,t-r-o)/s*i.inputPerMTok,c=n/s*i.outputPerMTok,d=i.cacheWritePerMTok??i.inputPerMTok*1.25,u=i.cacheReadPerMTok??i.inputPerMTok*.1,p=o/s*d,m=r/s*u;return l+c+p+m}function SM(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=H5(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var j5,vM=R(()=>{"use strict";Cw();j5=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]])});function W5(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function K5(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:W5(a.partialJson)}));let i=a=>a.type==="tool_use",s=r.filter(i);return{stopReason:t,assistantBlocks:r,toolUseBlocks:s,usage:n,text:o.join("")}}async function*kM(e,t){let n=[],r=null,o=null,i=!1,s=!!k.AFK_TELEGRAM_TRACE;try{s&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(s&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}s&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(a){s&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}s&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:K5(n,r,o)}}var EM=R(()=>{"use strict";q()});import{randomUUID as G5}from"node:crypto";function q5(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}function z5(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function TM(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}async function J5(e,t,n,r){for(let o=0;;o++){if(o>0){let i=xM*Math.pow(2,o-1);if(await lo(i,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let s=i instanceof Error?i:new Error(String(i));if(z5(s)&&o<jS)continue;throw s}}}async function*HS(e){let t=rm(e.maxToolUseIterations),n={stopReason:null},r=0,o=0,i=!1,s=0,a=G5(),l=Date.now(),c=d=>({...d,durationMs:Date.now()-l});ge(e.traceWriter,{phase:"loop_start"});try{for(;;){if(e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let d=bu({baseUrl:e.baseUrl})?Tx(e.messages,wu()):e.messages,u={model:e.model,max_tokens:e.maxTokens,messages:d,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0&&!i?{tools:e.tools.map(q5)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{}},p=Date.now(),m;try{m=await J5(e.client,u,e.headers,e.signal)}catch(T){if(e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let C=T instanceof Error?T:new Error(String(T));C.message.includes("thinking")&&V5(e.messages,C),yield{type:"error",error:C};return}let g=null,h=!1,y=!1,b=!1;try{k.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let T of kM(m,e.ctx))if(b||(b=!0,ge(e.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-p,resolvedModel:e.model})),k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",T.kind,T.kind==="event"?T.event.type:""),T.kind==="event"){if(T.event.type==="error"){if(TM(T.event.error)&&s<jS&&!e.signal.aborted){y=!0;break}yield T.event,h=!0;break}yield T.event}else{g=T.result;break}k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",g?"set":"null")}catch(T){if(e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let C=T instanceof Error?T:new Error(String(T));if(TM(C)&&s<jS&&!e.signal.aborted)y=!0;else{yield{type:"error",error:C};return}}if(y){if(s+=1,ge(e.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:s}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},await lo(xM*Math.pow(2,s-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}continue}if(s=0,h){e.signal.aborted&&(yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId});return}if(g===null){yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let w=SM(g.usage,g.stopReason,e.model);if(n=ec(n,w),n.contextWindowTokens=(w.inputTokens??0)+(w.outputTokens??0)+(w.cachedInputTokens??0)+(w.cacheCreationTokens??0),e.onUsageProgress?.(n),g.stopReason!=="tool_use"){if(g.stopReason==="refusal"){yield{type:"assistant.message",text:g.text.length>0?g.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:e.ctx.sessionId},yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}g.text.length>0&&(yield{type:"assistant.message",text:g.text,sessionId:e.ctx.sessionId},g.text.length<=200&&(yield{type:"suggestion",suggestion:g.text,sessionId:e.ctx.sessionId}));let T=g.assistantBlocks.filter(C=>C.type!=="tool_use");T.length>0&&e.messages.push({role:"assistant",content:T}),yield{type:"turn.completed",usage:c(i?{...n,stopReason:ao}:n),sessionId:e.ctx.sessionId};return}let v=e.messages.length;e.messages.push({role:"assistant",content:g.assistantBlocks});try{o+=g.toolUseBlocks.length;let T=[],C=new Map;for(let I of g.toolUseBlocks){T.push({id:I.id,name:I.name,input:I.input,signal:e.signal});let _=Date.now();C.set(I.id,_),ns(e.traceWriter,{phase:"started",toolUseId:I.id,name:I.name,inputBytes:Buffer.byteLength(JSON.stringify(I.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:I.id,toolName:I.name,toolInput:di(I.name,I.input),toolInputRaw:tm(I.input),sessionId:e.ctx.sessionId}}if(e.signal.aborted){let I=T.map(_=>({type:"tool_result",tool_use_id:_.id,content:"Tool call aborted",is_error:!0}));e.messages.push({role:"user",content:I}),yield{type:"turn.completed",usage:c(n),sessionId:e.ctx.sessionId};return}let A;if(e.toolDispatcher.executeBatch)try{A=await e.toolDispatcher.executeBatch(T)}catch(I){A=T.map(()=>({content:`Tool batch execution failed: ${I instanceof Error?I.message:String(I)}`,isError:!0}))}else{A=[];for(let I of T){if(e.signal.aborted){A.push({content:"Tool call aborted",isError:!0});continue}try{A.push(await e.toolDispatcher.execute(I))}catch(_){let D=_ instanceof Error?_.message:String(_);A.push({content:`Tool execution threw: ${D}`,isError:!0})}}}let B=[];for(let I=0;I<T.length;I++){let _=T[I],D=A[I],F=C.get(_.id),U=typeof F=="number"?Date.now()-F:0,H=D.truncated===!0||D.content.includes("[output truncated");ns(e.traceWriter,{phase:"completed",toolUseId:_.id,name:_.name,resultBytes:Buffer.byteLength(D.content,"utf8"),isError:D.isError===!0,truncated:H,durationMs:U,...D.circuitBreaker===!0?{circuitBreaker:!0}:{},...D.failureClass?{failureClass:D.failureClass}:{},...typeof D.batchIndex=="number"&&typeof D.batchSize=="number"?{batchIndex:D.batchIndex,batchSize:D.batchSize}:{}}),yield{type:"tool.output",toolUseId:_.id,toolName:_.name,content:D.content,...D.isError===!0?{isError:!0}:{},...H?{truncated:!0}:{},...typeof D.batchIndex=="number"&&typeof D.batchSize=="number"?{batchIndex:D.batchIndex,batchSize:D.batchSize}:{},sessionId:e.ctx.sessionId},D.render?.diff&&(yield{type:"tool.diff",toolUseId:_.id,diff:D.render.diff,sessionId:e.ctx.sessionId});let{content:N,isError:P,image:M}=D,O=M!==void 0?[{type:"image",source:{type:"base64",media_type:M.mediaType,data:M.data}},...N.length>0?[{type:"text",text:N}]:[]]:N;B.push({type:"tool_result",tool_use_id:_.id,content:O,...P===!0?{is_error:!0}:{}})}let $={role:"user",content:B};e.messages.push($)}catch(T){throw e.messages.splice(v),T}r+=1;let S=g.toolUseBlocks[g.toolUseBlocks.length-1],x=S?`${S.name}${di(S.name,S.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:a,description:"Working",summary:`round ${r}: ${x}`,lastToolName:S?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-l},sessionId:e.ctx.sessionId},i){yield{type:"turn.completed",usage:c({...n,stopReason:ao}),sessionId:e.ctx.sessionId};return}if(om(r,t)){let T=e.messages[e.messages.length-1];T!==void 0&&T.role==="user"&&Array.isArray(T.content)&&T.content.push({type:"text",text:nm}),i=!0;continue}}}finally{ge(e.traceWriter,{phase:"loop_end",durationMs:Date.now()-l})}}function V5(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let i=o.content;for(let s=0;s<i.length;s++){let a=i[s];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:s,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var jS,xM,RM=R(()=>{"use strict";vM();Ny();EM();xe();Lw();q();am();em();dc();dc();jS=3,xM=5e3});var CM=R(()=>{"use strict";cs()});import{randomUUID as Gm}from"node:crypto";var AM,Y5,X5,Z5,Q5,eX,qm,_M=R(()=>{"use strict";RM();rs();Fy();CM();am();xe();AM=7200*1e3,Y5=3,X5=12e4,Z5=5e3,Q5=1e3,eX=60*1e3,qm=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(t){this._client=t.client,this._authMode=t.authMode,this.initSessionId=t.initSessionId,this.tokenRefresher=t.tokenRefresher,this.autoResumeOnUsageLimit=t.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let t=kt(),n=null;try{if(this.refreshPromise)n=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{n=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{return this.refreshPromise=null,null}if(!n)return null;this._client=n;let r=kt();return{accountId:Yr(r??""),swapped:t!==r}}async*turnWithRetries(t,n){yield*this.turnWithUsageLimitRetry(t,n)}async*turnWithUsageLimitRetry(t,n){let r=null,o=null,i=!1,s=0;for(;;){let d,u=!1;for await(let g of this.turnWithAuthRetry(t,n)){if(g.type==="error"){let h=Dy(g.error);if(h&&h.kind==="oauth-limit"){o=h.resetsAt,r=g;break}if(h&&h.kind==="oauth-limit-no-ts"){i=!0,r=g;break}if(h&&h.kind==="rate-limit-transient"&&s<Y5){u=!0,d=h.retryAfterMs;break}}yield g}if(!u)break;if(s+=1,n()||t.signal.aborted)return;let m=Math.min(d??Z5,X5)+Math.floor(Math.random()*Q5);if(ge(t.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:s,waitMs:m}}),await lo(m,t.signal),n()||t.signal.aborted)return;t.headers=vn(this._authMode,this.initSessionId,Gm())}if(!r)return;if(i){let d=Yr(kt()??"");if(yield{type:"paused",reason:"usage-limit",accountId:d,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let u=Date.now(),p=!1;for(;;){let m;if(this.usageLimitWaitPromise)m="aborted";else{this.usageLimitWaitPromise=vx({signal:t.signal,retryAfterMs:eX});try{m=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(m==="aborted")return;let g=d;if(m==="hot-swap"){let y=await this.forceClientRefresh();y&&(t.client=this._client,g=y.accountId)}t.headers=vn(this._authMode,this.initSessionId,Gm());let h=null;for await(let y of this.turnWithAuthRetry(t,n)){if(!p&&y.type==="error"){let b=Dy(y.error);if(b&&(b.kind==="oauth-limit"||b.kind==="oauth-limit-no-ts")){h=y;break}}p||(yield{type:"resumed",hotSwapped:m==="hot-swap",accountId:g},p=!0),yield y}if(!h)return;if(Date.now()-u>AM){yield h;return}}}if(!o)return;if(o.getTime()-Date.now()>AM){yield r;return}let a=Yr(kt()??"");if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let l;if(this.usageLimitWaitPromise)l=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Sx({resetsAt:o,signal:t.signal});try{l=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(l==="aborted")return;let c=a;if(l==="hot-swap"){let d=await this.forceClientRefresh();d&&(t.client=this._client,c=d.accountId)}t.headers=vn(this._authMode,this.initSessionId,Gm()),yield{type:"resumed",hotSwapped:l==="hot-swap",accountId:c},yield*this.turnWithAuthRetry(t,n)}async*turnWithAuthRetry(t,n){let r=null;for await(let i of HS(t)){if(n())return;if(i.type==="error"&&this.isRetryableAuth(i.error)){r=i;break}yield i}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}t.client=this._client,t.headers=vn(this._authMode,this.initSessionId,Gm()),yield*HS(t)}isRetryableAuth(t){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}}});function tX(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function nX(e){let n=[(e.role==="user"?"User":"Assistant")+":"];if(typeof e.content=="string")n.push(e.content);else if(Array.isArray(e.content))for(let r of e.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let i=r.name??"unknown",s=$M(r.input);n.push(`[tool call: ${i} ${s}]`)}else if(o==="tool_result"){let i=r.content;n.push(`[tool result: ${DM(i)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
|
|
1329
1329
|
`)}function rX(e){let t=0;if(typeof e.content=="string")t+=e.content.length;else if(Array.isArray(e.content))for(let n of e.content){let r=n.type;r==="text"&&"text"in n?t+=n.text.length:r==="tool_use"?t+=$M(n.input).length:r==="tool_result"&&(t+=DM(n.content).length)}return t}function IM(e,t){return Pw(e,t,zm)}function PM(e,t,n){let r=Mw(e,zm);return{model:t,max_tokens:n,system:Vp,messages:[{role:"user",content:Yp(r)}],stream:!0}}function MM(e,t,n){return Ow(e,t,n,zm)}function OM(e,t,n){return $w(e,t,n,zm)}function $M(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function DM(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}var zm,FM=R(()=>{"use strict";Xp();zm={isFreshUserTurn:tX,renderMessage:nX,buildPreamble(e){return[{role:"user",content:lc+`
|
|
1330
1330
|
|
|
1331
1331
|
`+e},{role:"assistant",content:cc}]},countChars:rX}});import{randomUUID as oX}from"node:crypto";async function LM(e){let{state:t,abort:n,retry:r,initSessionId:o,traceWriter:i}=e,s=t.messages.length;if(t.closed)return{compacted:!1,reason:"session-closed",messagesBefore:s,messagesAfter:s};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:s,messagesAfter:s};let a=lX(),l=IM(t.messages,a);if(l<0)return{compacted:!1,reason:"history-too-short",messagesBefore:s,messagesAfter:s};if(l===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:s,messagesAfter:s};let c=t.messages.slice(0,l),d=cX(),u=PM(c,d,aX),p=n.begin(),m;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:s,messagesAfter:s};let b=vn(r.authMode,o,oX()),w=r.client,v=await Promise.resolve(w.messages.create(u,{headers:b,signal:p.signal}));m=await dX(v)}catch(b){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:s,messagesAfter:s}:{compacted:!1,reason:"summarization-failed: "+(b instanceof Error?b.message:String(b)),messagesBefore:s,messagesAfter:s}}finally{n.clear(p)}if(m.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:s,messagesAfter:s};let g=OM(t.messages,l,m),h=MM(t.messages,l,m);t.messages.splice(0,t.messages.length,...h);let y=t.messages.length;return pu(i,{trigger:"manual",preCompactionMessages:c,summary:m,keptTailCount:s-l,keepLastNConfig:a,messagesBefore:s,messagesAfter:y,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:s,messagesAfter:y,tokensSavedEstimate:g}}function lX(){let e=k.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return iX}function cX(){let e=k.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?vt(e)??e:sX}async function dX(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}var iX,sX,aX,NM=R(()=>{"use strict";rs();FM();xe();kn();q();iX=2,sX="claude-haiku-4-5-20251001",aX=1024});var BM=R(()=>{"use strict";zp()});import{randomUUID as UM}from"node:crypto";var uX,Jm,jM=R(()=>{"use strict";_l();rs();Ny();Rx();Cx();Vo();zw();Ds();kn();hM();bM();wM();_M();NM();BM();pt();uX=[{value:"claude-sonnet-5",displayName:"Claude Sonnet 5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],Jm=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;maxToolUseIterations;traceWriter;state;abort;retry;cwdDependentsFactory;onPermissionMode;mcpManager;hookRegistry;constructor(t){this.initSessionId=t.sessionId??UM(),this.promptStream=t.promptStream,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.thinking=t.thinking,t.effort!==void 0&&(this.effort=t.effort),t.baseUrl!==void 0&&(this.baseUrl=t.baseUrl),t.maxToolUseIterations!==void 0&&(this.maxToolUseIterations=t.maxToolUseIterations),this.traceWriter=t.traceWriter,this.cwdDependentsFactory=t.cwdDependentsFactory,this.onPermissionMode=t.onPermissionMode,this.mcpManager=t.mcpManager,t.hookRegistry!==void 0&&(this.hookRegistry=t.hookRegistry),this.retry=new qm({client:t.client,authMode:t.authMode,initSessionId:this.initSessionId,...t.tokenRefresher?{tokenRefresher:t.tokenRefresher}:{},autoResumeOnUsageLimit:t.autoResumeOnUsageLimit??!0}),this.state=yM({model:t.model,...t.requestedModel!==void 0?{requestedModel:t.requestedModel}:{},permissionMode:t.permissionMode??"default",userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,...t.initialMessages?{initialMessages:t.initialMessages}:{},...t.autoCompactThreshold!==void 0?{autoCompactThreshold:t.autoCompactThreshold}:{}}),this.abort=new Km}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.state.currentModel,permissionMode:this.state.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:this.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.retry.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.state.closed;){let r=await Promise.race([n.next(),this.abort.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let i=o.value,s=this.abort.begin();if(s.signal.aborted){this.abort.clear(s);return}gM(this.state.messages),this.state.messages.push({role:"user",content:i.content});let a=this.composeSystem(),l=vn(this.retry.authMode,this.initSessionId,UM(),this.effort!==void 0),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.state.currentPermissionMode==="plan"?this.tools:this.tools?.filter(u=>u.name!==Wt)??null,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:s.signal,ctx:{sessionId:this.initSessionId},...this.thinking!==void 0?{thinking:this.thinking}:{},...this.effort!==void 0?{effort:this.effort}:{},...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{},...this.maxToolUseIterations!==void 0?{maxToolUseIterations:this.maxToolUseIterations}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{},onUsageProgress:u=>{this.state.lastUsage=u}},d=!1;try{for await(let u of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;u.type==="turn.completed"&&(this.state.lastUsage=u.usage,this.abort.clear(s)),(u.type==="turn.completed"||u.type==="error")&&(d=!0),yield u}}catch(u){if(this.state.closed)return;if(s.signal.aborted){this.abort.clear(s),d||(yield this.makeInterruptedTurnEvent());continue}yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abort.clear(s)}if(this.state.closed)return;if(s.signal.aborted){d||(yield this.makeInterruptedTurnEvent());continue}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let u=this.state.lastUsage,p=Kp(this.state.requestedModel);if(u!==null&&p>0){let m=so(u);if(ac(m,p,this.state.autoCompactThreshold))try{this.hookRegistry&&await this.hookRegistry.dispatch({event:"PreCompact",sessionId:this.initSessionId,trigger:"auto"}),await this.compact()}catch(g){if(!(g instanceof me))throw g}}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let t=this.systemPrefix,n=this.state.userSystem,r=[];t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n});let o=By(this.state.currentPermissionMode);o!==null&&r.push(o);let i=jy(this.state.currentPermissionMode);return i!==null&&r.push(i),r.length===0?null:bu({baseUrl:this.baseUrl})?Ex(r,wu()):r}async interrupt(){this.abort.requestAbort("interrupted")}makeInterruptedTurnEvent(){return{type:"turn.completed",usage:{stopReason:"interrupted",resultSubtype:"interrupted",isError:!1},sessionId:this.initSessionId}}async setModel(t){t!==void 0&&t.length>0&&(this.state.requestedModel=t,this.state.currentModel=vt(t)??t)}async setPermissionMode(t){this.state.currentPermissionMode=t;let n=Ln(t);this.state.toolDispatcher.setAllowAll?.(n),this.onPermissionMode?.(t)}setCwd(t){if(this.state.toolDispatcher.setResolveBase?.(t),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(t);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){return cm()}async supportedModels(){return uX.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.state.lastUsage,n=qt(this.state.requestedModel),r;if(t&&n>0){let s=so(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=sc(t);return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:i,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return LM({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}}});function WS(e,t){let n=nc(t),r=e.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let i=`max:${t}:${o}`;return Vm.has(i)||(Vm.add(i),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${t} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function HM(e){if(!e||e.length===0)return;let t=[];for(let n of e)n.user.length>0&&t.push({role:"user",content:n.user}),n.assistant.length>0&&t.push({role:"assistant",content:n.assistant});return t.length>0?t:void 0}function KS(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&mX(n))return{type:"adaptive",display:"summarized"};let r=Math.floor(t*fX),o=Math.max(1024,t-1-r),i=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.floor(e.budgetTokens):void 0,s=Math.min(Math.max(i??o,1024),o);if(i!==void 0&&i>o){let a=`think:${n??"default"}:${i}:${t}`;Vm.has(a)||(Vm.add(a),console.warn(`[afk] thinking budgetTokens ${i} leaves too little of max_tokens ${t} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:s,display:"summarized"}}}}function GS(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[678]|(claude-)?sonnet-5/.test(n))return"max"}var pX,mX,Vm,fX,qS=R(()=>{"use strict";Ds();zp();pX=e=>/opus-4-(7|[89])/.test(e),mX=e=>pX(e)||/(claude-)?sonnet-5/.test(e),Vm=new Set,fX=.25});import{mkdirSync as gX,appendFileSync as hX,existsSync as yX}from"fs";import{resolve as bX}from"path";import{dirname as wX}from"path";function Ze(e){let t=e;for(let[n,r]of kX)t=t.replace(n,(...o)=>{let i=o.slice(0,o.length-2);return r(i)});return t}function zS(e){return typeof e=="string"?Ze(e):Array.isArray(e)?e.map(zS):e}function EX(e){if(e===null||typeof e!="object")return e;let t=e,n={...t},r=t.env;if(r&&typeof r=="object"){let o={};for(let[i,s]of Object.entries(r))vX.test(i)&&typeof s=="string"?o[i]=`<REDACTED length=${s.length}>`:o[i]=s;n.env=o}return"system"in t&&(n.system=zS(t.system)),"systemPrompt"in t&&(n.systemPrompt=zS(t.systemPrompt)),n}function TX(e){if(e==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof e=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(e))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof e=="object"){let t=e;if(t.type==="preset"&&t.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof t.append=="string"&&(n.append={length:t.append.length}),t.excludeDynamicSections===!0&&(n.excludeDynamicSections=!0),n}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}function WM(e){let t=k.AFK_DUMP_PROMPT;if(!t||t===""||t==="0"||t.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
|
|
@@ -1769,7 +1769,7 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
|
|
|
1769
1769
|
${S}${w}
|
|
1770
1770
|
${v}
|
|
1771
1771
|
${S}`})}return{fileBlocks:a,warnings:l}}async function DB(e,t,n,r,o="summary",i,s){let a=RF(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,p=!1,m=!1,g,h=!1,y=!1,b={abort:null},w=0,v=3e3,S=[],x=new Map,T=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,C=()=>{let D=r.subagentControl;D?.hasPromotableForeground()&&D.promoteActiveForeground().then(F=>{for(let U of F)(i??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${U.jobId}: ${U.label}`))}).catch(()=>{})},A=r.getCompositor?r.getCompositor():null,B=()=>new Ba({out:Ua(i),thinkingMode:o,...T?{activeSkillName:T}:{},onCancel:()=>{t.interrupt().catch(D=>{We()&&console.error(" "+f.error("session.interrupt() failed:"),D)})},...r.subagentControl?{onBackground:C}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...A?{compositor:A}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),$=B(),I=async()=>{if(!p){p=!0;try{await $.dispose()}catch{}}},_=async()=>{await $.arm();let D=$.getCompositor();if(i&&D){let F=D;i.fn=U=>F.commitAbove(U),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(D),r.setInterruptNotifier?.(F=>$.setInterrupting(F)),r.rearmStatus?.()};try{A?A.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(M=>{We()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{We()&&console.error(" "+f.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{We()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),P)})}),await _(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(C);let{fileBlocks:D,warnings:F}=$B(e.text,{rootDir:process.cwd()});for(let P of F)(i??{fn:console.log}).fn(f.dim(` @-file: ${P}`));let U=D.length>0||e.attachments.length>0?MB(e.text,e.attachments,void 0,D):e.text,H=t.sendMessageStream(U);if(await ws((P,M)=>{$.process(P,M)},async()=>{for await(let P of H){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,O={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};x.set(M.toolUseId,O),S.push(O)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let O=x.get(M.toolUseId);if(O&&(O.result=M.content,O.isError=M.isError,x.delete(M.toolUseId)),r.onContextProgress){let j=Date.now();if(j-w>=v){w=j;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){We()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),Y)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await I(),A&&P.autoResume===!0){let M=new AbortController;b.abort=M;let O=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,j=O?`Keep waiting \u2014 auto-resumes at ${O}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",ee="Stop waiting",te=[f.warning(" \u23F3 Usage limit reached.")+(O?f.dim(` Auto-resumes at ${O}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];or(A,{header:te,options:[j,Y,ee],signal:M.signal,initialIndex:0}).then(oe=>{if(b.abort=null,!oe)return;let K=oe[0];K===void 0||K===j||(y=!0,K===Y&&(i??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(ye=>{We()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),ye)}))}).catch(oe=>{We()&&console.error(" "+f.error("picker promise rejected:"),oe)})}else(i??{fn:console.log}).fn(zT({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,S.length=0,x.clear(),m=!1,g=void 0,u=!1,$=B(),p=!1,await _(),(i??{fn:console.log}).fn(f.success(M));continue}if(P.type==="error"){await I(),ts(Xi(P.error)),u=!0;continue}$.process(P),P.type==="done"&&(m=!0,g=P.metadata)}}),await I(),h){let P=i?i.fn:console.log;P(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(m&&!h&&!y){wi(n,a,l,g,S),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Ea(process.stdout);let P=O=>{i?i.fn(O):console.log(O)},M=IB(l);if(M){if(P(PB(M)),P(""),r.onTerminalState)try{r.onTerminalState(M)}catch{}if(n.permissionMode==="autonomous"){let O=M.kind==="done"&&_u().verifyDone===!0&&!V$(S);X$(M,void 0,{unverified:O})}}if(Soe(g,n,P),r.onAfterTurn){let O=r.onAfterTurn();O instanceof Promise&&await O.catch(()=>{})}}}catch(D){await I(),u||ts(Xi(D))}finally{await I(),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 Soe(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(he(e.durationMs)),e.totalCostUsd!==void 0&&r.push(lt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(le(o+i)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let s=kv(t),a=qt(t.model);if(s>=1){let l=Math.round((s-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${le(l)} tok \u2014 model output may be silently truncated`))}else if(s>.5){let l=s>.8?f.error:f.warning;n(l(` context ${Math.round(s*100)}% used of ${le(a)}`))}n("")}var voe=5e3,koe=3,Eoe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Toe(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(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function FB(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:p}=s,m=null,g=[];e.session.current.waitForInitialization().then(async v=>{We()&&(m=Kf(v)),await gd(e.session.current),We()&&(g=Mk())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y=!1,b=!1,w=0;for(p.onInjectable=()=>{w>=koe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(w++,Ea(process.stdout),h={text:Eoe,attachments:[]},o.abortPendingRead())};;){if(m&&(e.replRenderer.writeLine(m),e.replRenderer.writeLine(""),m=null),g.length>0){for(let _ of g)e.replRenderer.writeLine(_);e.replRenderer.writeLine(""),g=[]}let v=u.drainNotifications();for(let{job:_,result:D}of v){let F=D.errorReason===void 0?"\u2713":"\u2717",U=D.errorReason==="abort"?"killed":D.errorReason==="timeout"?"timed out":D.errorReason==="signal-killed"?"killed by signal":`exit ${D.exitCode??0}`,H=Math.max(0,Math.round(D.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${F} [${_.id}] ${U} \xB7 ${H}s \xB7 `)+_.command)}let S=p.drainNotifications();for(let{job:_}of S){let D=_.status==="completed"?"\u2713":_.status==="failed"?"\u2717":"\u2298",F=_.endedAt!==void 0?Math.max(0,Math.round((_.endedAt-_.startedAt)/100)/10):0,U=_.label.length>60?`${_.label.slice(0,60)}\u2026`:_.label;e.replRenderer.writeLine(f.dim(` ${D} [${_.jobId}] subagent ${_.status} \xB7 ${F}s \xB7 `)+U)}let x=l.renderIfChanged(e.stats.sessionId);if(x.length>0){for(let _ of x)e.replRenderer.writeLine(_);e.replRenderer.writeLine("")}let T,C;if(h===void 0){let _=await e.session.current.takePendingPlanExitSeed();_!==void 0&&(e.stats.permissionMode=_.mode,h={text:_.message,attachments:[]})}if(h!==void 0){let _=h;h=void 0;let D=Ka(e.stats.permissionMode),F=Ci({buffer:_.text,promptText:D,isTTY:!!process.stdout.isTTY,attachmentSummary:Ia([..._.attachments])});e.replRenderer.writeLine(F),T=_.text.trim(),C=_.attachments}else{let _=await o.readLine({promptFn:()=>Ka(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{oh(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});T=_.text.trim(),C=_.attachments}if(!T&&C.length===0)continue;if(T.startsWith("!")){let _=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!_&&(y||(y=!0,e.replRenderer.writeLine(f.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(T))){e.statusLine.rearm();continue}}let A=!1;if(T.startsWith("/")){let _=await N$(T,e.slashCtx,C);if(_.handled){if(_.result==="exit"){e.rl.close();return}if((T==="/clear"||T.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),d.reset()),_.result!==null&&typeof _.result=="object"&&"kind"in _.result&&_.result.kind==="submit"){h={text:_.result.message,attachments:C??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}A=!0}a.push(T),await Toe(e,T);let B=T;if(A){let _=vv(T);if(_){let D=_.name.replace(/^\//,"").split(":").pop()??"";if(D&&Ak(D)){let F={skillName:D,rawArgs:_.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},U=e.session.current.sessionId,H=Di(U),N=Date.now();W(`[afk trace] preflight.start commandName=${D}`);let P=!1,M=await $i(F,{cwd:e.stats.cwd??process.cwd(),artifactDir:H},O=>{We()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${D}) failed: `)+(O instanceof Error?O.message:String(O)))});P=M!==null,W(`[afk trace] preflight.end commandName=${D} durationMs=${Date.now()-N} success=${P}`),B=Ik(M?.manifestBlock,T)}}}let $=u.drainInjections();$.length>0&&(B=$+B);let I=p.drainInjections();if(I.length>0&&(B=I+B),e.hookRegistry)try{let _={event:"UserPromptSubmit",prompt:B,sessionId:e.stats.sessionId},D=await e.hookRegistry.dispatch(_);D.injectContext&&(B=D.injectContext+B)}catch(_){if(_ instanceof me){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(_.reason?f.dim(`: ${ei(_.reason)}`):"")),e.statusLine.rearm();continue}if(_ instanceof Un){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${_.timeoutMs}ms`)),e.statusLine.rearm();continue}throw _}if(await DB({text:B,attachments:C},e.session.current,e.stats,{setInFlight(_){n.turnInFlight=_},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(_){await t.appendUser(_)},async onTurnComplete(_,D){if(await t.appendTurn(_,D),e.stats.sessionId)try{er(e.stats)}catch(F){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(F instanceof Error?F.message:String(F))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:_=>d?.push(_),setActiveCompositor:_=>{n.activeCompositor=_},setInterruptNotifier:_=>{n.notifyInterrupting=_},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:_=>o.setBackgroundHandler(_),setSoftStopHandler:i,setPausedState:_=>o.setPausedState(_),setPauseInterruptHandler:_=>o.setPauseInterruptHandler(_),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(rr(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:_=>c.repaint(_)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ka(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,voe)}catch(_){if(_ instanceof ut)throw _;_ instanceof Un?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):_ instanceof me?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${ei(_.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(_))}}}function xoe(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 LB(e,t,n,r){let o=await fB(),i=new rh({rl:e.rl,history:o,statusLine:e.statusLine}),s=xoe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await wB(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=_B(e,n),await FB(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)}}Il();As();import{execFile as Roe}from"node:child_process";import{dirname as Coe,isAbsolute as Aoe,resolve as _oe}from"node:path";import{promisify as Ioe}from"node:util";var NB=Ioe(Roe),Poe=3e3,Moe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Ooe(){let t=(await NB("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Aoe(t)?t:_oe(process.cwd(),t);return Coe(n)}async function BB(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Ooe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Poe)});try{let o=mn({execFile:NB,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=>Moe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}yu();Il();import{promises as $oe}from"node:fs";import{dirname as Doe,join as HB}from"node:path";import{randomBytes as Foe}from"node:crypto";var Loe=["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(`
|
|
1772
|
-
`),UB=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,eE=30,Noe=1024,Boe=8e3,Uoe="haiku";async function joe(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=Goe(n,Noe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Boe),s=t.signal?qoe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ls({token:t.token,model:t.model??Uoe,system:Loe,user:r,maxTokens:32,signal:s})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Hoe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Doe(t.worktreePath);return await Woe(l,c)}function Hoe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(UB.test(t)&&t.length<=eE)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>eE)break;o=s}return UB.test(o)?o:null}async function Woe(e,t){if(!await Koe(HB(t,e)))return e;let n=Foe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,eE-5)}-${n}`}async function Koe(e){try{return await $oe.access(e),!0}catch{return!1}}function Goe(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 qoe(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 WB(e){let t,n,r=HB(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await joe(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=`${Tu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return jB(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 jB(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 jB(e,t){e&&e.setCwd(t),zoe(t)}function zoe(e){try{process.chdir(e)}catch{}}Vt();Ht();G();import{spawn as GB}from"child_process";import{existsSync as qB,mkdirSync as Zoe,readFileSync as zB,unlinkSync as KB,writeFileSync as JB}from"fs";import{get as Qoe}from"https";import{join as VB}from"path";import{readFileSync as Joe}from"fs";import{dirname as Voe,join as Yoe}from"path";import{fileURLToPath as Xoe}from"url";function cr(){try{return"5.36.
|
|
1772
|
+
`),UB=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,eE=30,Noe=1024,Boe=8e3,Uoe="haiku";async function joe(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=Goe(n,Noe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Boe),s=t.signal?qoe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ls({token:t.token,model:t.model??Uoe,system:Loe,user:r,maxTokens:32,signal:s})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Hoe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Doe(t.worktreePath);return await Woe(l,c)}function Hoe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(UB.test(t)&&t.length<=eE)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>eE)break;o=s}return UB.test(o)?o:null}async function Woe(e,t){if(!await Koe(HB(t,e)))return e;let n=Foe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,eE-5)}-${n}`}async function Koe(e){try{return await $oe.access(e),!0}catch{return!1}}function Goe(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 qoe(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 WB(e){let t,n,r=HB(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await joe(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=`${Tu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return jB(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 jB(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 jB(e,t){e&&e.setCwd(t),zoe(t)}function zoe(e){try{process.chdir(e)}catch{}}Vt();Ht();G();import{spawn as GB}from"child_process";import{existsSync as qB,mkdirSync as Zoe,readFileSync as zB,unlinkSync as KB,writeFileSync as JB}from"fs";import{get as Qoe}from"https";import{join as VB}from"path";import{readFileSync as Joe}from"fs";import{dirname as Voe,join as Yoe}from"path";import{fileURLToPath as Xoe}from"url";function cr(){try{return"5.36.1"}catch{}try{let e=Voe(Xoe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Joe(Yoe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}q();var eie=64*1024,tie=10800*1e3,nie=800,rie=3600*1e3,oie="update-check.json",iie="pending-update.json";function tE(){return VB(zd(),oie)}function vd(){return VB(zd(),iie)}function nE(){let e=zd();qB(e)||Zoe(e,{recursive:!0})}function YB(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 XB(){try{let e=zB(tE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function ZB(){try{nE();let e=`
|
|
1773
1773
|
const https = require('https');
|
|
1774
1774
|
const fs = require('fs');
|
|
1775
1775
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|