agent-afk 5.84.2 → 5.84.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/telegram.mjs CHANGED
@@ -862,7 +862,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
862
862
 
863
863
  `).trim()}function Y0(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Cw(t,e){let{JSDOM:n,Readability:r,turndown:o}=await V0(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Rw(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Rw(o.turndown(d));return{title:a,markdown:u,textLength:Y0(c),usedFallback:!0}}var Ku,Iw=y(()=>{"use strict";Ku=null});function Q0(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function Pw(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function Z0(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function Mw(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??Q0,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 t(e,n);if(!X0.has(u.status)||d===o)return u;let p=Z0(u,i)??Pw(d,s,i);F("[web/retryFetch] retrying",{url:e,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=Pw(d,s,i);F("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var X0,Ow=y(()=>{"use strict";me();X0=new Set([429,502,503,504])});import{BlockList as eD,isIP as qu}from"node:net";import{lookup as tD}from"node:dns/promises";import{Agent as nD}from"undici";function Fw(){let t=_.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function iD(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function Gu(t){let e=qu(t);return e===0?!1:sD.check(t,e===4?"ipv4":"ipv6")}async function Lw(t){return tD(t,{all:!0,verbatim:!0})}async function zu(t,e={}){if(e.allowPrivateHosts??Fw())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=iD(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(qu(r)!==0)return Gu(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??Lw,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(Gu(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Fo(t,e={}){let n=await zu(t,e);if(!n.allowed)throw new st(n.reason)}async function xa(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=Dw;i++){await Fo(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??Fw())?{dispatcher:aD}:{}},l=await Mw(t,s,a,r.retry??{});if(!lD.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let d;try{d=new URL(c,l.url||s).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),s=d}throw new st(`too many redirects (>${Dw}) starting from ${e}`)}var rD,oD,sD,st,aD,Dw,lD,Ju=y(()=>{"use strict";B();Ow();rD=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],oD=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],sD=(()=>{let t=new eD;for(let[e,n]of rD)t.addSubnet(e,n,"ipv4");for(let[e,n]of oD)t.addSubnet(e,n,"ipv6");return t})(),st=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};aD=new nD({connect:{lookup(t,e,n){Lw(t).then(r=>{let o=r.find(i=>Gu(i.address));if(o!==void 0){n(new st(`refusing to connect to ${t} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,qu(s.address))},r=>n(r,"",0))}}});Dw=20,lD=new Set([301,302,303,307,308])});import{readFileSync as cD}from"node:fs";import{join as dD}from"path";function uD(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function Nw(t,e){return uD(e).test(t)}function mD(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(pD.has(e))return!0;if(fD.has(e))return!1}return!1}function $w(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function gD(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Uw(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Zc(e),e}function hD(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function yD(t){try{return cD(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function bD(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Uw(e.defaultProfile)),n}function Bw(t){let e=t?.env??_,n=t?.readFileSync??yD,r=t?.surface??e.AGENT_SURFACE,o=mD(e.AFK_BROWSER_HEADLESS,r),s=$w(e.AFK_BROWSER_ALLOWED_DOMAINS),i=$w(e.AFK_BROWSER_BLOCKED_DOMAINS),a=hD(e.AFK_BROWSER_DOM_SNAPSHOTS),l=gD(e.AFK_BROWSER_BACKEND),c=Uw(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():dD(Et(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(h){throw new Error(`Failed to parse browser config at ${p}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=bD(d,m);return g.configPath=p,g}function Ra(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if(Nw(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>Nw(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var pD,fD,Ca=y(()=>{"use strict";B();G();pD=new Set(["daemon","subagent","telegram","afk"]),fD=new Set(["repl","interactive","cli"])});import{existsSync as wD,readFileSync as SD}from"node:fs";import{createRequire as vD}from"node:module";import{dirname as kD,join as _D}from"node:path";function Ww(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<AD&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Pe(t){let e=Ww(t);return jw.some(n=>e.includes(n))}function TD(){try{let e=vD(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(SD(e,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let s=_D(kD(e),o);return wD(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function Lo(){return Hw??=TD()??ED,Hw}function Vu(t){return t.includes("install chromium")}function Ze(t,e){let n=Ww(t),r=e?.latched===!0?` ${xD}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${Lo()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Lo()}). Or pick a different tool.${r}`}function Yu(t,e,n=!1){if(!Pe(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
864
864
 
865
- ${Ze(t,{headless:e,latched:n})}`,{cause:t})}var jw,ED,AD,Hw,xD,Xu=y(()=>{"use strict";jw=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],ED="pnpm exec playwright install chromium",AD=4;xD="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Fn from"node:fs";import Ia from"node:path";import{randomBytes as RD}from"node:crypto";import{chromium as CD}from"playwright";function ID(){try{return"5.84.2"}catch{}try{let t=Ia.resolve(import.meta.dirname,"../../../package.json"),e=Fn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var PD,Pa,Kw=y(()=>{"use strict";Xu();G();me();PD=ID(),Pa=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=CD.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Yu(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){s=l,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let c=await a.content();if(s!==void 0)throw s;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${PD}`}}loadStorageState(e){let n=ed(e);try{if(!Fn.existsSync(n))return;let r=JSON.parse(Fn.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=ed(e);if(!Fn.existsSync(r))return;let o=await n.storageState(),s=Ia.join(Ia.dirname(r),`.${Ia.basename(r)}.${process.pid}.${RD(4).toString("hex")}.tmp`);Fn.writeFileSync(s,JSON.stringify(o),{mode:384}),Fn.chmodSync(s,384),Fn.renameSync(s,r),F("[browser/vault] saved session",{profile:e,file:r})}catch(r){F("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as MD}from"crypto";function Gw(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&OD.test(t.label))}function qw(t){return MD("sha256").update(t,"utf8").digest("hex").slice(0,8)}function zw(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var OD,Ma=y(()=>{"use strict";OD=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as DD}from"node:crypto";function FD(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function LD(t,e,n){return`el_${DD("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function ND(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Jw(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Yw(t,e){let n=t.role??"",r=t.name??"";Vw.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Yw(s,e)}async function $D(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),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(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Xw).catch(()=>[])}async function UD(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Xw).catch(()=>[])}function BD(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Oa(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=BD(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=$D(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],Yw(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await UD(t)).filter(N=>Vw.has(N.role??"")));let k=new Map;for(let P of p){let N=Jw(P.name),W=k.get(N);(!W||W.bbox.w===0&&P.bbox.w>0)&&k.set(N,P)}let E=h.map(P=>({ax:P,dom:k.get(Jw(P.name??""))})),v=r?E:E.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,N)=>{let W=P.dom?.bbox.y??0,D=N.dom?.bbox.y??0;if(W!==D)return W-D;let U=P.dom?.bbox.x??0,$=N.dom?.bbox.x??0;return U-$}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=v.slice(0,n).map((P,N)=>{let W=P.ax.role??"generic",D=P.ax.name??"",U=LD(W,D,N),$=P.dom?.bbox??{x:0,y:0,w:0,h:0},A=P.dom?.type??null,M=null;P.ax.value!==void 0&&P.ax.value!==null&&(M=String(P.ax.value)),P.ax.checked!==void 0&&(M=String(P.ax.checked)),Gw({role:W,kind:A})&&(M="[redacted]");let L={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(L.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(L.selected=P.ax.selected),P.ax.expanded!==void 0&&(L.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let Z={id:U,role:W,label:FD(D),kind:A,value:M,state:L,bbox:$};return z!==void 0&&(Z.selector=z),Z}),R="idle";try{let P=await t.evaluate(()=>document.readyState);P==="loading"?R="loading":P==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=ND(f),C=`obs_${e.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:C,url:m,title:g,textSummary:S,interactive:x,status:{httpStatus:e.httpStatus??null,loadingState:R,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:I}}var Vw,Xw,Qw=y(()=>{"use strict";Ma();Vw=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Xw="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Zw(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,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}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Qu(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Zw(t,s)))).filter(o=>o!==null)}async function HD(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Zu(t,e,n){switch(e.kind){case"element_id":return jD(t,e,n);case"selector":return WD(t,e);case"semantic":return KD(t,e)}}async function jD(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Qu(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function WD(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Qu(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function KD(t,e){return e.role!==void 0?GD(t,e.text,e.role):qD(t,e.text,e)}async function GD(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Qu(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function qD(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await HD(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await Zw(h.locator,h.index);if(w!==null){let k=`${w.role}:${w.label}:${g}`,E=0;for(let v=0;v<k.length;v++)E=E*31+k.charCodeAt(v)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var eS=y(()=>{"use strict"});async function ep(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ra(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var tS=y(()=>{"use strict";Ca()});import{randomBytes as zD}from"crypto";import{mkdir as JD,stat as VD,writeFile as YD}from"fs/promises";import{join as tp}from"path";import{gzip as XD}from"zlib";import{promisify as QD}from"util";function ZD(t){return tp(Zs(t),"browser")}function eF(t){return tp(ZD(t),"screenshots")}function tF(){return new Date().toISOString().replace(/[:.]/g,"-")}function nF(){return zD(3).toString("hex")}async function np(t,e,n){if(e.length>nS)throw new Error(`writeScreenshotSidecar: buffer exceeds ${nS} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=eF(t);await JD(r,{recursive:!0});let o=`${tF()}-${nF()}-${n}.png`,s=tp(r,o);await YD(s,e);let{size:i}=await VD(s);return{path:s,bytes:i}}var c5,nS,rS=y(()=>{"use strict";G();Ma();c5=QD(XD);nS=5*1024*1024});var sS={};qc(sS,{PlaywrightProvider:()=>rp});function oS(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var rp,iS=y(()=>{"use strict";Kw();Qw();eS();Ca();tS();rS();rp=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Pa(e)}async open(e){let n=Ra(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await ep(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Oa(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Oa(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await Zu(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${oS(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await ep(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Oa(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await Zu(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${oS(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await np(n,s,"browser_screenshot"),l=0,c=0;if(e.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:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await np(n,o,r);return s}catch{return null}}}});var Nn={};qc(Nn,{__resetBrowserRegistryForTests:()=>aF,browserProviderActive:()=>sF,closeBrowserProvider:()=>op,getBrowserProvider:()=>oF,peekBrowserProvider:()=>iF});function aS(){Promise.resolve(op()).then(()=>{process.exit(130)})}function lS(){Promise.resolve(op()).then(()=>{process.exit(143)})}function cS(){wt=null}function rF(){Da||(process.on("SIGINT",aS),process.on("SIGTERM",lS),process.on("exit",cS),Da=!0)}function dS(){Da&&(process.removeListener("SIGINT",aS),process.removeListener("SIGTERM",lS),process.removeListener("exit",cS),Da=!1)}async function oF(t){return wt!==null?wt:(Ln!==null||(Ln=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(iS(),sS)),n=Bw(t),r=new e(n);return rF(),wt=r,Ln=null,r})()),Ln)}async function op(){if(wt===null)return;let t=wt;wt=null,Ln=null,dS(),await t.shutdown()}function sF(){return wt!==null}function iF(){return wt}function aF(){wt=null,Ln=null,dS()}var wt,Ln,Da,$n=y(()=>{"use strict";Ca();wt=null,Ln=null,Da=!1});async function uS(t,e){try{return await Cw(t,e)}catch(n){return F("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function fF(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>($n(),Nn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function pS(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??fF,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i=t,a=null,l=null;try{let d=await xa(n,t,{headers:pF,signal:e.signal},o);a=d.status,i=d.url||t;let u=d.headers.get("content-type")??"";if(d.ok){if(uF.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if(dF.test(u)&&!cF.test(u))return{title:"",markdown:p.trim(),finalUrl:i,usedRender:!1};if(s=await uS(p,i),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(d){if(e.signal.aborted||d instanceof st||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(s===null||s.textLength<200)&&s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};try{await Fo(t,o);let d=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:p=>Fo(p,o)});d.finalUrl!==t&&/^https?:\/\//i.test(d.finalUrl)&&await Fo(d.finalUrl,o);let u=await uS(d.html,d.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||u.textLength>=s.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(e.signal.aborted||d instanceof st)throw d;if(s===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${t}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${a??"error"}).`)}var cF,dF,uF,pF,fS=y(()=>{"use strict";Iw();Ju();me();cF=/(text\/html|application\/xhtml\+xml)/i,dF=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uF=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,pF={"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 hF(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(mF,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),gF),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=hr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.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 mS(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?hF({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function gS(t,e){if(e.length===0)return`# Search results for "${t}"
865
+ ${Ze(t,{headless:e,latched:n})}`,{cause:t})}var jw,ED,AD,Hw,xD,Xu=y(()=>{"use strict";jw=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],ED="pnpm exec playwright install chromium",AD=4;xD="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Fn from"node:fs";import Ia from"node:path";import{randomBytes as RD}from"node:crypto";import{chromium as CD}from"playwright";function ID(){try{return"5.84.3"}catch{}try{let t=Ia.resolve(import.meta.dirname,"../../../package.json"),e=Fn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var PD,Pa,Kw=y(()=>{"use strict";Xu();G();me();PD=ID(),Pa=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=CD.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Yu(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){s=l,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let c=await a.content();if(s!==void 0)throw s;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${PD}`}}loadStorageState(e){let n=ed(e);try{if(!Fn.existsSync(n))return;let r=JSON.parse(Fn.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=ed(e);if(!Fn.existsSync(r))return;let o=await n.storageState(),s=Ia.join(Ia.dirname(r),`.${Ia.basename(r)}.${process.pid}.${RD(4).toString("hex")}.tmp`);Fn.writeFileSync(s,JSON.stringify(o),{mode:384}),Fn.chmodSync(s,384),Fn.renameSync(s,r),F("[browser/vault] saved session",{profile:e,file:r})}catch(r){F("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as MD}from"crypto";function Gw(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&OD.test(t.label))}function qw(t){return MD("sha256").update(t,"utf8").digest("hex").slice(0,8)}function zw(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var OD,Ma=y(()=>{"use strict";OD=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as DD}from"node:crypto";function FD(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function LD(t,e,n){return`el_${DD("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function ND(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Jw(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Yw(t,e){let n=t.role??"",r=t.name??"";Vw.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Yw(s,e)}async function $D(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),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(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Xw).catch(()=>[])}async function UD(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Xw).catch(()=>[])}function BD(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Oa(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=BD(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=$D(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],Yw(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await UD(t)).filter(N=>Vw.has(N.role??"")));let k=new Map;for(let P of p){let N=Jw(P.name),W=k.get(N);(!W||W.bbox.w===0&&P.bbox.w>0)&&k.set(N,P)}let E=h.map(P=>({ax:P,dom:k.get(Jw(P.name??""))})),v=r?E:E.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);v.sort((P,N)=>{let W=P.dom?.bbox.y??0,D=N.dom?.bbox.y??0;if(W!==D)return W-D;let U=P.dom?.bbox.x??0,$=N.dom?.bbox.x??0;return U-$}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=v.slice(0,n).map((P,N)=>{let W=P.ax.role??"generic",D=P.ax.name??"",U=LD(W,D,N),$=P.dom?.bbox??{x:0,y:0,w:0,h:0},A=P.dom?.type??null,M=null;P.ax.value!==void 0&&P.ax.value!==null&&(M=String(P.ax.value)),P.ax.checked!==void 0&&(M=String(P.ax.checked)),Gw({role:W,kind:A})&&(M="[redacted]");let L={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(L.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(L.selected=P.ax.selected),P.ax.expanded!==void 0&&(L.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let Z={id:U,role:W,label:FD(D),kind:A,value:M,state:L,bbox:$};return z!==void 0&&(Z.selector=z),Z}),R="idle";try{let P=await t.evaluate(()=>document.readyState);P==="loading"?R="loading":P==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=ND(f),C=`obs_${e.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:C,url:m,title:g,textSummary:S,interactive:x,status:{httpStatus:e.httpStatus??null,loadingState:R,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:I}}var Vw,Xw,Qw=y(()=>{"use strict";Ma();Vw=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Xw="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Zw(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,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}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Qu(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Zw(t,s)))).filter(o=>o!==null)}async function HD(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Zu(t,e,n){switch(e.kind){case"element_id":return jD(t,e,n);case"selector":return WD(t,e);case"semantic":return KD(t,e)}}async function jD(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Qu(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function WD(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Qu(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function KD(t,e){return e.role!==void 0?GD(t,e.text,e.role):qD(t,e.text,e)}async function GD(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Qu(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function qD(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await HD(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await Zw(h.locator,h.index);if(w!==null){let k=`${w.role}:${w.label}:${g}`,E=0;for(let v=0;v<k.length;v++)E=E*31+k.charCodeAt(v)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var eS=y(()=>{"use strict"});async function ep(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ra(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var tS=y(()=>{"use strict";Ca()});import{randomBytes as zD}from"crypto";import{mkdir as JD,stat as VD,writeFile as YD}from"fs/promises";import{join as tp}from"path";import{gzip as XD}from"zlib";import{promisify as QD}from"util";function ZD(t){return tp(Zs(t),"browser")}function eF(t){return tp(ZD(t),"screenshots")}function tF(){return new Date().toISOString().replace(/[:.]/g,"-")}function nF(){return zD(3).toString("hex")}async function np(t,e,n){if(e.length>nS)throw new Error(`writeScreenshotSidecar: buffer exceeds ${nS} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=eF(t);await JD(r,{recursive:!0});let o=`${tF()}-${nF()}-${n}.png`,s=tp(r,o);await YD(s,e);let{size:i}=await VD(s);return{path:s,bytes:i}}var c5,nS,rS=y(()=>{"use strict";G();Ma();c5=QD(XD);nS=5*1024*1024});var sS={};qc(sS,{PlaywrightProvider:()=>rp});function oS(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var rp,iS=y(()=>{"use strict";Kw();Qw();eS();Ca();tS();rS();rp=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Pa(e)}async open(e){let n=Ra(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await ep(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Oa(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Oa(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await Zu(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${oS(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await ep(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Oa(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await Zu(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${oS(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await np(n,s,"browser_screenshot"),l=0,c=0;if(e.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:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await np(n,o,r);return s}catch{return null}}}});var Nn={};qc(Nn,{__resetBrowserRegistryForTests:()=>aF,browserProviderActive:()=>sF,closeBrowserProvider:()=>op,getBrowserProvider:()=>oF,peekBrowserProvider:()=>iF});function aS(){Promise.resolve(op()).then(()=>{process.exit(130)})}function lS(){Promise.resolve(op()).then(()=>{process.exit(143)})}function cS(){wt=null}function rF(){Da||(process.on("SIGINT",aS),process.on("SIGTERM",lS),process.on("exit",cS),Da=!0)}function dS(){Da&&(process.removeListener("SIGINT",aS),process.removeListener("SIGTERM",lS),process.removeListener("exit",cS),Da=!1)}async function oF(t){return wt!==null?wt:(Ln!==null||(Ln=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(iS(),sS)),n=Bw(t),r=new e(n);return rF(),wt=r,Ln=null,r})()),Ln)}async function op(){if(wt===null)return;let t=wt;wt=null,Ln=null,dS(),await t.shutdown()}function sF(){return wt!==null}function iF(){return wt}function aF(){wt=null,Ln=null,dS()}var wt,Ln,Da,$n=y(()=>{"use strict";Ca();wt=null,Ln=null,Da=!1});async function uS(t,e){try{return await Cw(t,e)}catch(n){return F("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function fF(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>($n(),Nn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function pS(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??fF,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i=t,a=null,l=null;try{let d=await xa(n,t,{headers:pF,signal:e.signal},o);a=d.status,i=d.url||t;let u=d.headers.get("content-type")??"";if(d.ok){if(uF.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if(dF.test(u)&&!cF.test(u))return{title:"",markdown:p.trim(),finalUrl:i,usedRender:!1};if(s=await uS(p,i),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(d){if(e.signal.aborted||d instanceof st||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(s===null||s.textLength<200)&&s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};try{await Fo(t,o);let d=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:p=>Fo(p,o)});d.finalUrl!==t&&/^https?:\/\//i.test(d.finalUrl)&&await Fo(d.finalUrl,o);let u=await uS(d.html,d.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||u.textLength>=s.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(e.signal.aborted||d instanceof st)throw d;if(s===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${t}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${a??"error"}).`)}var cF,dF,uF,pF,fS=y(()=>{"use strict";Iw();Ju();me();cF=/(text\/html|application\/xhtml\+xml)/i,dF=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uF=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,pF={"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 hF(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(mF,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),gF),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=hr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.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 mS(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?hF({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function gS(t,e){if(e.length===0)return`# Search results for "${t}"
866
866
 
867
867
  (no results)`;let n=[`# Search results for "${t}"`,""];return e.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
868
868
  `).trimEnd()}var mF,gF,hS=y(()=>{"use strict";kn();mF="https://api.exa.ai/search",gF=10});function Fa(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var Un=y(()=>{"use strict";Xu()});function kF(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(e.url)}catch{return{error:`Invalid input: "${e.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 i=yF;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,bF)}let a=wF;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,SF)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function sp(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:It(t,e),truncated:!0}}function _F(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=kF(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(s.reason)},c,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await zu(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let g={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await xa(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof st?{content:`web_scrape blocked: ${g.message}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let m=sp(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await pS(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=sp(p.markdown,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof st)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=Pe(p)&&!Vu(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Lo()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=mS({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:vF,timeoutMs:i.timeoutMs,signal:a.signal}),f=sp(gS(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),s.removeEventListener("abort",l)}}}var yF,bF,wF,SF,vF,yS,bS=y(()=>{"use strict";fS();hS();Ju();Cn();Un();yF=3e4,bF=12e4,wF=1e5,SF=1e6,vF=10;yS=_F()});import{existsSync as SS,mkdirSync as EF,readFileSync as AF,renameSync as TF,unlinkSync as xF,writeFileSync as RF}from"node:fs";import{dirname as wS,join as CF}from"node:path";import{randomBytes as IF}from"node:crypto";function _r(t){let e=t??Yc();if(!SS(e))return[];try{let n=AF(e,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${e}: ${r}`),[]}}function La(t,e){let n=e??Yc();EF(wS(n),{recursive:!0});let r=CF(wS(n),`.schedules.json.${process.pid}.${IF(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{RF(r,o,"utf-8"),TF(r,n)}catch(s){try{SS(r)&&xF(r)}catch{}throw s}}function vS(t,e){let n=_r(e),r=n.map(l=>l.id),o=PF(t.name),s=MF(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),La(n,e),a}function kS(t,e){let n=_r(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(La(o,e),!0)}function _S(t,e){return _r(e).find(n=>n.id===t)}function PF(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function MF(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}var ES=y(()=>{"use strict";G()});import{existsSync as OF,readFileSync as DF}from"node:fs";import{join as FF}from"node:path";async function No(t,e,n){let r;try{let o=FF(ig("default"),"port");if(!OF(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=DF(o,"utf-8").trim();if(r=parseInt(s,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:t==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var ip,AS=y(()=>{"use strict";G();ip="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as LF}from"node:fs";import{readFile as NF}from"node:fs/promises";var TS,xS,RS,CS,IS=y(()=>{"use strict";ES();G();AS();TS=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let s=vS({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),i=s.enabled?await No("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await No("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:ip}})}},xS=async(t,e)=>{let n=_r();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},RS=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,s=qs();if(!LF(s))return{content:JSON.stringify([])};let i;try{let c=await NF(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
@@ -1113,7 +1113,7 @@ ${e}`:s,a=new te({parentAbortSignal:n?.abortSignal,...r?.traceWriter!==void 0?{t
1113
1113
  `),0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let s;try{s=nB(XE(t,o.name,"SKILL.md"),"utf-8")}catch(c){let d=c;d.code!=="ENOENT"&&process.stderr.write(`[afk] skipping skill ${o.name}: ${d.message}
1114
1114
  `);continue}let i=oB(s,o.name);if(!i)continue;i.dir=XE(t,o.name);let l={name:iB(i.name,e),description:i.description,handler:sB(i),origin:e};i.argumentHint&&(l.argumentHint=i.argumentHint),i.flags&&i.flags.length>0&&(l.flags=i.flags),i.context!=="fork"&&(l.context="load",l.loadBody=i.body.replace(/\$\{?SKILL_ROOT\}?/g,()=>i.dir)),Ie(l),r++}return r}var QE,Kf=y(()=>{"use strict";G();ft();YE();be();QE=1024});var ZE=y(()=>{"use strict";wE();SE();GE();qE();zE();Kf()});import{isAbsolute as aB,resolve as lB}from"path";import{pathToFileURL as cB}from"url";async function tA(t,e={}){let n=e.importer??(r=>import(r));for(let r of t){if(r.main===void 0)continue;let o=aB(r.main)?r.main:lB(r.path,r.main);if(!eA.has(o)){eA.add(o);try{let i=(await n(cB(o).href))?.default;typeof i=="function"&&await i(e.pluginApi)}catch(s){e.onError?.(r,s)}}}}var eA,nA=y(()=>{"use strict";eA=new Set});import{existsSync as dB,readFileSync as uB}from"fs";import{join as pB}from"path";function rA(t){let e=pB(t,".claude-plugin","plugin.json");if(!dB(e))return{name:null,version:null};try{let n=JSON.parse(uB(e,"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 oA=y(()=>{"use strict"});import{z as O}from"zod";var ws,fB,mB,Gf,sA,iA,aA,lA,Ss,tc=y(()=>{"use strict";ws=1,fB=O.object({toolName:O.string(),toolUseId:O.string().optional(),input:O.string().optional(),inputRaw:O.string().optional(),result:O.string().optional(),isError:O.boolean().optional()}).passthrough(),mB=O.object({user:O.string().default(""),assistant:O.string().default(""),timestamp:O.number().optional(),toolEvents:O.array(fB).optional()}).passthrough(),Gf=O.object({sessionId:O.string().optional(),name:O.string().optional(),source:O.enum(["cli","telegram"]).optional(),telegramChatId:O.number().optional(),model:O.string(),startedAt:O.number(),savedAt:O.number(),totalTurns:O.number(),totalCostUsd:O.number().optional(),totalTokens:O.number().optional(),totalDurationMs:O.number().optional(),turns:O.array(mB).default([]),forkedFrom:O.string().optional(),forkedAt:O.number().optional()}).passthrough(),sA=O.enum(["fully_achieved","partially_achieved","not_achieved","aborted"]),iA=O.enum(["not_persisted","persisted","unknown"]),aA=O.object({tool:O.string(),label:O.string().optional()}),lA=O.object({files_written:O.number().int(),files_edited:O.number().int(),bash_commands:O.number().int(),commits:O.number().int(),mutated:O.boolean()}),Ss=O.object({facet_version:O.number().int(),session_id:O.string(),source:O.enum(["cli","telegram","unknown"]),model:O.string(),derived_at:O.string(),derived_from:O.literal("afk-session"),source_session_path:O.string(),source_session_mtime_ms:O.number(),subagent_persistence:iA,start_time:O.string(),end_time:O.string(),duration_minutes:O.number(),underlying_goal:O.string(),first_prompt:O.string(),goal_categories:O.record(O.string(),O.number()),session_type:O.string(),brief_summary:O.string(),total_turns:O.number().int(),user_message_count:O.number().int(),assistant_message_count:O.number().int(),tool_counts:O.record(O.string(),O.number()),commands:O.array(O.string()),skills:O.array(O.string()),subagents:O.array(aA),tool_errors:O.number().int(),tool_error_categories:O.record(O.string(),O.number()),friction_counts:O.record(O.string(),O.number()),friction_detail:O.string(),outcome:sA,primary_success:O.string(),world_changes:lA,decisions:O.array(O.string()),evidence_pointers:O.array(O.string())}).passthrough()});import{basename as gB}from"path";function vB(t){if(t)try{let e=JSON.parse(t);return e&&typeof e=="object"?e:void 0}catch{return}}function nc(t){return typeof t=="string"?t:void 0}function rc(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}function kB(t){return t.replace(/[-_]+/g," ").trim()}function _B(t,e){return dA.test(t)?"slash_command":e==="telegram"?"chat":"task"}function EB(t){let e=new Map,n=[];for(let r of t)r.toolUseId===void 0?n.push(r):e.set(r.toolUseId,r);return[...e.values(),...n]}function vs(t,e={}){let n=t.turns??[],r=EB(n.flatMap($=>$.toolEvents??[])),o={},s={},i=[],a=[],l=[],c=0,d=0,u=0,p=0,f=0;for(let $ of r){let A=$.toolName;o[A]=(o[A]??0)+1,$.isError===!0&&(c+=1,s[A]=(s[A]??0)+1);let M=vB($.inputRaw??$.input);if(A==="write_file"&&(d+=1),A==="edit_file"&&(u+=1),A==="bash"){p+=1;let L=nc(M?.command)??$.input;L&&SB.test(L)&&(f+=1)}if(yB.has(A)){let L=nc(M?.file_path);L&&!l.includes(L)&&l.length<wB&&l.push(L)}if(hB.has(A)){let L;A==="skill"?(L=nc(M?.name),L&&!a.includes(L)&&a.push(L)):A==="agent"?L=nc(M?.id_prefix):L="compose",i.push(L?{tool:A,label:L}:{tool:A})}}let m=n[0]?.user??"",g=t.source??"cli",h=_B(m,g),w=[];for(let $ of n){let M=dA.exec($.user??"")?.[1];M&&!w.includes(M)&&w.push(M)}let k=n.filter($=>($.user??"").trim().length>0).length,E=n.filter($=>($.assistant??"").trim().length>0).length,v=[...n].reverse().find($=>($.assistant??"").trim().length>0)?.assistant??"",T;n.length===0?T="aborted":v.trim().length===0?T="partially_achieved":T="fully_achieved";let R=T==="fully_achieved"||T==="partially_achieved"?rc(v||m||h,160)||h:"none",S=c>0?`${c} tool error(s): ${Object.entries(s).map(([$,A])=>`${$}\xD7${A}`).join(", ")}`:"",C=t.name?kB(t.name):rc(m,80),I=rc(v||m,bB),P=rc(C?`${C} \u2014 ${I}`:I,400)||"empty session",N=t.sessionId??(e.sourceSessionPath?gB(e.sourceSessionPath,".json"):"unknown"),W=t.totalDurationMs&&t.totalDurationMs>0?t.totalDurationMs:Math.max(0,t.savedAt-t.startedAt),D=e.sourceSessionPath?[...l,e.sourceSessionPath]:l,U={facet_version:ws,session_id:N,source:g==="telegram"?"telegram":"cli",model:t.model,derived_at:(e.derivedAt??new Date).toISOString(),derived_from:"afk-session",source_session_path:e.sourceSessionPath??"",source_session_mtime_ms:e.sourceSessionMtimeMs??t.savedAt,subagent_persistence:"not_persisted",start_time:new Date(t.startedAt).toISOString(),end_time:new Date(t.savedAt).toISOString(),duration_minutes:Number((W/6e4).toFixed(2)),underlying_goal:m.slice(0,cA),first_prompt:m.slice(0,cA),goal_categories:{[h]:1},session_type:h,brief_summary:P,total_turns:n.length,user_message_count:k,assistant_message_count:E,tool_counts:o,commands:w,skills:a,subagents:i,tool_errors:c,tool_error_categories:s,friction_counts:{...s},friction_detail:S,outcome:T,primary_success:R,world_changes:{files_written:d,files_edited:u,bash_commands:p,commits:f,mutated:d>0||u>0||f>0},decisions:[],evidence_pointers:D};return Ss.parse(U)}var hB,yB,cA,bB,wB,SB,dA,qf=y(()=>{"use strict";tc();hB=new Set(["agent","compose","skill"]),yB=new Set(["read_file","write_file","edit_file"]),cA=1e3,bB=240,wB=50,SB=/\bgit\s+commit(?![\w-])/,dA=/^\s*\/([a-zA-Z][\w-]*)/});import{existsSync as oc,mkdirSync as AB,readFileSync as uA,readdirSync as TB,renameSync as xB,statSync as RB,writeFileSync as CB}from"fs";import{basename as IB,dirname as PB,join as pA}from"path";function fA(t,e){return Qs(t),pA(e,`${t}.json`)}function MB(t,e){return Qs(t),pA(e,`${t}.json`)}function sc(t,e=Ae()){let n=fA(t,e);if(oc(n))try{let r=JSON.parse(uA(n,"utf8")),o=Gf.safeParse(r);return o.success?o.data:void 0}catch{return}}function OB(t){if(oc(t))try{let e=JSON.parse(uA(t,"utf8")),n=Ss.safeParse(e);return n.success?n.data:void 0}catch{return}}function DB(t,e){AB(PB(t),{recursive:!0});let n=`${t}.${process.pid}.tmp`;CB(n,`${JSON.stringify(e,null,2)}
1115
1115
  `,"utf8"),xB(n,t)}function FB(t,e){return t.facet_version===ws&&t.source_session_mtime_ms===e}function zf(t,e={}){let n=e.sessionsDir??Ae(),r=e.cacheDir??Xm(),o=fA(t,n);if(!oc(o))return;let s=RB(o).mtimeMs,i=MB(t,r);if(!e.force){let c=OB(i);if(c&&FB(c,s))return c}let a=sc(t,n);if(!a)return;let l=vs(a,{sourceSessionPath:o,sourceSessionMtimeMs:s});return DB(i,l),l}function Jf(t={}){let e=t.sessionsDir??Ae();return oc(e)?TB(e).filter(n=>n.endsWith(".json")).map(n=>IB(n,".json")):[]}var mA=y(()=>{"use strict";G();qf();tc()});var gA=y(()=>{"use strict";tc();qf();mA()});import{readFileSync as LB}from"node:fs";import{join as NB}from"node:path";function Al(t,e){let n=ms(t,e),r=e?.excludeName,o=r!==void 0&&r.length>0?n.filter(i=>i.name!==r&&!i.name.endsWith(`:${r}`)):n;if(o.length===0)return"";let s=[];for(let i of o){let a=i.argumentHint?`${i.argumentHint}`:"",l=a?`- \`${i.name} ${a}\`: ${i.description}`:`- ${i.name}: ${i.description}`;s.push(l),i.whenToUse&&s.push(` When to use: ${i.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.","",...s].join(`
1116
- `)}function ms(t,e){let n=[],r=new Set,o=_.AFK_INTERNAL==="1",s=_o(ko());bs(zs(),"user"),Oy("project"),bs(Zm(e?.cwd),"project");for(let{dir:a,origin:l}of s.skillRoots)bs(a,l);for(let a of ou()){let l=Ct(a);ru(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 i=t??ic(e);for(let a of i){if(a.type!=="local")continue;let l=mf(a.path);for(let c of l)!c.name||r.has(c.name)||ru({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 gs(t,e){let n=new Map,r=t??ic(e);for(let o of r){if(o.type!=="local")continue;let s=mf(o.path);for(let i of s)i.name&&i.body&&i.body.length>0&&!n.has(i.name)&&n.set(i.name,{body:i.body,pluginPath:o.path,...i.allowedTools!==void 0?{allowedTools:i.allowedTools}:{},...i.context!==void 0?{context:i.context}:{},...i.readOnly===!0?{readOnly:!0}:{},...i.model!==void 0?{model:i.model}:{}})}return n}function hA(t){let e=t??ic(),n=[],r=new Set;for(let o of e){if(o.type!=="local")continue;let s=rA(o.path).name;if(s!==null)for(let i of Fl(NB(o.path,"agents"))){let a;try{a=LB(i,"utf8")}catch{continue}let l=Kn(a);if(l===void 0)continue;let c=`${s}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${s}`,filePath:i,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function ic(t){return[...Ft(eg(t?.cwd)),...Ft(),...Ft(ng()),..._o(ko()).pluginRoots.flatMap(({dir:e,binary:n})=>Ft(e,{trustAll:!0,sourceEnabled:by(n)}))]}async function yA(){await tA(ic(),{pluginApi:{registerSkill:Ie,listSkills:ou,getSkill:Ct,loadSkillPrompts:fe,env:_,SubagentManager:te,describeFailure:Ee,discoverPluginSkillBodies:gs,getAgentFrameworkDir:_t,getSkillsDir:zs,getSessionsDir:Ae,getOrDeriveFacet:zf,listSessionIds:Jf,deriveSessionFacet:vs,loadStoredSession:sc}})}var en=y(()=>{"use strict";ZE();ft();Ve();Kf();Xl();nA();ds();oA();us();Ef();be();Re();gA();G();B();qi()});function El(){try{let t=ms();return Promise.resolve(t.map(e=>{let n={name:e.name,description:e.description};return e.argumentHint&&(n.argumentHint=e.argumentHint),n}))}catch{return Promise.resolve([])}}var of=y(()=>{"use strict";en()});function ac(t){if(t.length===0)return;let e=t[t.length-1];if(!e||e.role!=="assistant"||typeof e.content=="string")return;let n=e.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};t.push(o)}var Vf=y(()=>{"use strict"});function bA(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,requestedModel:t.requestedModel??t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var wA=y(()=>{"use strict"});function UB(t,e,n,r,o){let s=$B.get(t);if(!s)return;let i=1e6,l=Math.max(0,e-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,f=r/i*u;return l+c+p+f}function SA(t,e,n){if(!t)return{stopReason:e??null};let r={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null};if(t.cache_read_input_tokens!=null&&(r.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=t.cache_creation_input_tokens),r.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let o=UB(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var $B,vA=y(()=>{"use strict";Pp();$B=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5}],["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 BB(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function HB(t,e,n){let r=[],o=[];for(let a of t)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:BB(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*kA(t,e,n){let r=[],o=null,s=null,i=!1,a=!!_.AFK_TELEGRAM_TRACE;try{a&&console.log("[translate] starting SDK event iteration");for await(let l of t){switch(a&&console.log("[translate] SDK evt:",l.type),l.type){case"message_start":{let c=l.message?.usage;c&&(s={...c});break}case"content_block_start":{let c=l.content_block;c.type==="text"?r[l.index]={kind:"text",text:""}:c.type==="thinking"?r[l.index]={kind:"thinking",thinking:"",signature:""}:c.type==="redacted_thinking"?r[l.index]={kind:"redacted_thinking",data:c.data}:c.type==="tool_use"&&(r[l.index]={kind:"tool_use",id:c.id,name:c.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:c.id,toolName:c.name,toolInput:" \u2026",sessionId:e.sessionId}});break}case"content_block_delta":{let c=r[l.index],d=l.delta;d.type==="text_delta"?(c&&c.kind==="text"&&(c.text+=d.text),yield{kind:"event",event:{type:"delta.text",text:d.text,sessionId:e.sessionId}}):d.type==="input_json_delta"?(c&&c.kind==="tool_use"&&(c.partialJson+=d.partial_json),n?.()):d.type==="thinking_delta"?(c&&c.kind==="thinking"&&(c.thinking+=d.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:d.thinking,sessionId:e.sessionId}}):(d.type==="signature_delta"&&c&&c.kind==="thinking"&&(c.signature=d.signature),n?.());break}case"content_block_stop":{let c=r[l.index];c&&c.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:c.name,toolUseIds:[c.id],sessionId:e.sessionId}});break}case"message_delta":{l.delta&&l.delta.stop_reason!==void 0&&(o=l.delta.stop_reason);let c=l.usage;c&&(s!==null?(s.output_tokens=c.output_tokens,c.cache_creation_input_tokens!=null&&(s.cache_creation_input_tokens=c.cache_creation_input_tokens),c.cache_read_input_tokens!=null&&(s.cache_read_input_tokens=c.cache_read_input_tokens),c.input_tokens!=null&&(s.input_tokens=c.input_tokens)):s={cache_creation:null,cache_creation_input_tokens:c.cache_creation_input_tokens??null,cache_read_input_tokens:c.cache_read_input_tokens??null,inference_geo:null,input_tokens:c.input_tokens??0,output_tokens:c.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}a&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(l){a&&console.log("[translate] SDK iteration threw:",l.message),yield{kind:"event",event:{type:"error",error:l instanceof Error?l:new Error(String(l))}};return}if(!i&&o===null){yield{kind:"event",event:{type:"error",error:new dt("the model stream ended without a terminal message (no message_stop and no stop_reason): the response was cut off mid-stream, typically an intermediary closing the connection. The turn is incomplete.")}};return}a&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:HB(r,o,s)}}var _A=y(()=>{"use strict";B();pe()});function lc(t){return t>2147483647?2147483647:t}var Yf=y(()=>{"use strict"});function AA(){let t=_.AFK_MODEL_TTFB_TIMEOUT_MS;if(t===void 0||t.trim()==="")return EA;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?EA:lc(e)}function TA(t,e){if(e<=0)return{signal:t,timedOut:()=>!1,firstByteSeen:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([t,n.signal]),o=!1,s=!1,i=setTimeout(()=>{o=!0,n.abort(new Error(jB))},e);i.unref();let a=()=>{s||(s=!0,clearTimeout(i))};return{signal:r,timedOut:()=>o,firstByteSeen:a,dispose:a}}var EA,jB,xA=y(()=>{"use strict";B();Yf();EA=18e4;jB="model_ttfb_timeout"});function CA(){let t=_.AFK_MODEL_STALL_TIMEOUT_MS;if(t===void 0||t.trim()==="")return RA;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?RA:lc(e)}function PA(t){return t instanceof Error&&t.message===IA}function Xf(t){return new Error(`Model stream stalled: no output for ${Math.round(t/1e3)}s after the response had already started streaming. The round was aborted rather than left hanging (issue #762: two sessions hung 38 and 63 minutes with no terminal event). A round that keeps producing output is never cut off, no matter how long it runs. Raise AFK_MODEL_STALL_TIMEOUT_MS, or set it to 0 to disable this bound.`)}function MA(t,e,n){if(e<=0)return{signal:t,timedOut:()=>!1,progress:()=>{},dispose:()=>{}};let r=new AbortController,o=AbortSignal.any([t,r.signal]),s,i=!1,a=!1,l=u=>{if(!(a||i)){i=!0,s=void 0;try{n?.({stallTimeoutMs:e,elapsedSinceLastProgressMs:Date.now()-u})}catch{}r.signal.aborted||r.abort(new Error(IA))}};return{signal:o,timedOut:()=>i,progress:()=>{if(a||i)return;s!==void 0&&clearTimeout(s);let u=Date.now(),p=setTimeout(()=>l(u),e);p.unref(),s=p},dispose:()=>{a||(a=!0,s!==void 0&&clearTimeout(s),s=void 0)}}}var RA,IA,OA=y(()=>{"use strict";B();Yf();RA=12e5;IA="model_stream_stall_timeout"});import{randomUUID as WB}from"node:crypto";function KB(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}function zB(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function cc(t){if(t===null||typeof t!="object")return!1;let e=t;if(e.status===529||e.status===503)return!0;let n=e.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 JB(t,e,n,r,o){for(let s=0;;s++){if(s>0){let i=cu(FA*Math.pow(2,s-1));if(await St(i,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let a=i instanceof Error?i:new Error(String(i));if(zB(a)&&s<dc)continue;throw a}}}async function*DA(t,e){J(t.traceWriter,{phase:"ttfb_timeout",durationMs:Date.now()-e,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:t.model}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId}}async function*VB(t,e){let n=e.throttleQueue;if(!n)return await t;n.resetAttempts();let r=Symbol("create-done"),o=!1,s=t.then(i=>(o=!0,i),i=>{throw o=!0,i});for(;;){for(let a of n.takeAll())yield{type:"rate_limit",sessionId:e.ctx.sessionId,status:a.status,attempt:a.attempt,...a.retryAfterMs!==void 0?{retryAfterMs:a.retryAfterMs}:{}};if(o)return await s;await Promise.race([s.then(()=>r,()=>r),n.waitForItem().then(()=>{})])}}async function*Qf(t){let e=Sl(t.maxToolUseIterations),n={stopReason:null},r=0,o=0,s=!1,i=0,a=0,l=AA(),c=!1,d=CA(),u=WB(),p=Date.now(),f=h=>({...h,durationMs:Date.now()-p});J(t.traceWriter,{phase:"loop_start"});let m=t.signal.aborted?Date.now():null,g=()=>{m===null&&(m=Date.now())};t.traceWriter&&!t.signal.aborted&&t.signal.addEventListener("abort",g,{once:!0});try{for(;;){if(t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let h=uo({baseUrl:t.baseUrl})?Bh(t.messages,po()):t.messages,w={model:t.model,max_tokens:t.maxTokens,messages:h,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0&&!s?{tools:t.tools.map(KB)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{}},k=Date.now(),E=TA(t.signal,l),v=MA(E.signal,d,A=>{J(t.traceWriter,{phase:"idle_watchdog_fired",durationMs:A.elapsedSinceLastProgressMs,resolvedModel:t.model,metadata:{source:"model-stream",stallTimeoutMs:A.stallTimeoutMs,elapsedSinceLastProgressMs:A.elapsedSinceLastProgressMs}})}),T=!1,x;try{x=yield*VB(JB(t.client,w,t.headers,v.signal,t.signal),t)}catch(A){if(E.timedOut()&&!t.signal.aborted&&!c)E.dispose(),v.dispose(),T=!0;else{if(E.dispose(),v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let M=A instanceof Error?A:new Error(String(A));M.message.includes("thinking")&&YB(t.messages,M),yield{type:"error",error:M};return}}if(T){yield*DA(t,k),c=!0;continue}let R=null,S=!1,C=!1,I=!1,P=!1,N=!1;try{_.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let A of kA(Or(x,t.signal),t.ctx,()=>v.progress()))if(!N&&(A.kind==="turn-result"||A.event.type!=="error")&&(N=!0,E.firstByteSeen(),J(t.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-k,resolvedModel:t.model})),v.progress(),_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",A.kind,A.kind==="event"?A.event.type:""),A.kind==="event"){if(A.event.type==="error"){if(E.timedOut()&&!t.signal.aborted&&!c&&!N){T=!0;break}if(v.timedOut()&&!t.signal.aborted){yield{type:"error",error:Xf(d)},S=!0;break}if(cc(A.event.error)&&i<dc&&!t.signal.aborted){C=!0;break}if(cc(A.event.error)&&!t.signal.aborted){P=!0;break}if(t.signal.aborted)break;if(A.event.error instanceof dt&&a<GB&&!t.signal.aborted){I=!0;break}yield A.event,S=!0;break}yield A.event}else{R=A.result;break}_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",R?"set":"null")}catch(A){if(E.timedOut()&&!t.signal.aborted&&!c&&!N)E.dispose(),v.dispose(),T=!0;else{if(E.dispose(),v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let M=A instanceof Error?A:new Error(String(A));if((v.timedOut()||PA(M))&&!t.signal.aborted){yield{type:"error",error:Xf(d)};return}if(cc(M)&&i<dc&&!t.signal.aborted)C=!0;else if(cc(M)&&!t.signal.aborted)P=!0;else{yield{type:"error",error:M};return}}}if(E.dispose(),v.dispose(),T){yield*DA(t,k),c=!0;continue}if(C){if(i+=1,J(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:i}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await St(cu(FA*Math.pow(2,i-1)),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}continue}if(I){if(a+=1,J(t.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:a}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await St(qB*Math.pow(2,a-1),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}continue}if(i=0,a=0,c=!1,P){J(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:dc,exhausted:!0}}),yield{type:"assistant.message",text:Hy,sessionId:t.ctx.sessionId},yield{type:"turn.completed",usage:f({...n,stopReason:mt}),sessionId:t.ctx.sessionId};return}if(S){t.signal.aborted&&(yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId});return}if(R===null){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let W=SA(R.usage,R.stopReason,t.model);if(n=Ho(n,W),n.contextWindowTokens=(W.inputTokens??0)+(W.outputTokens??0)+(W.cachedInputTokens??0)+(W.cacheCreationTokens??0),t.onUsageProgress?.(n),R.stopReason!=="tool_use"){if(R.stopReason==="refusal"){yield{type:"assistant.message",text:R.text.length>0?R.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:t.ctx.sessionId},yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}R.text.length>0&&(yield{type:"assistant.message",text:R.text,sessionId:t.ctx.sessionId},R.text.length<=200&&(yield{type:"suggestion",suggestion:R.text,sessionId:t.ctx.sessionId}));let A=R.assistantBlocks.filter(M=>M.type!=="tool_use");A.length>0&&t.messages.push({role:"assistant",content:A}),yield{type:"turn.completed",usage:f(s?{...n,stopReason:Zt}:n),sessionId:t.ctx.sessionId};return}let D=t.messages.length;t.messages.push({role:"assistant",content:R.assistantBlocks});try{o+=R.toolUseBlocks.length;let A=[],M=new Map;for(let j of R.toolUseBlocks){A.push({id:j.id,name:j.name,input:j.input,signal:t.signal});let X=Date.now();M.set(j.id,X),or(t.traceWriter,yl({toolUseId:j.id,name:j.name,input:j.input,subagentId:t.subagentId})),yield{type:"tool.use.start",toolUseId:j.id,toolName:j.name,toolInput:Wn(j.name,j.input),toolInputRaw:hl(j.input),sessionId:t.ctx.sessionId}}if(t.signal.aborted){let j=A.map(X=>({type:"tool_result",tool_use_id:X.id,content:"Tool call aborted",is_error:!0}));t.messages.push({role:"user",content:j}),yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let L;if(t.toolDispatcher.executeBatch)try{L=await t.toolDispatcher.executeBatch(A)}catch(j){L=A.map(()=>({content:`Tool batch execution failed: ${j instanceof Error?j.message:String(j)}`,isError:!0}))}else{L=[];for(let j of A){if(t.signal.aborted){L.push({content:"Tool call aborted",isError:!0});continue}try{L.push(await t.toolDispatcher.execute(j))}catch(X){let ee=X instanceof Error?X.message:String(X);L.push({content:`Tool execution threw: ${ee}`,isError:!0})}}}let z=[];for(let j=0;j<A.length;j++){let X=A[j],ee=L[j],Fe=M.get(X.id),$t=typeof Fe=="number"?Date.now()-Fe:0,oe=ee.truncated===!0||ee.content.includes("[output truncated");or(t.traceWriter,bl({toolUseId:X.id,name:X.name,result:ee,truncated:oe,durationMs:$t,subagentId:t.subagentId})),yield{type:"tool.output",toolUseId:X.id,toolName:X.name,content:ee.content,...ee.isError===!0?{isError:!0}:{},...oe?{truncated:!0}:{},...ee.incomplete===!0?{incomplete:!0}:{},...ee.incompleteReason?{incompleteReason:ee.incompleteReason}:{},...typeof ee.batchIndex=="number"&&typeof ee.batchSize=="number"?{batchIndex:ee.batchIndex,batchSize:ee.batchSize}:{},sessionId:t.ctx.sessionId},ee.render?.diff&&(yield{type:"tool.diff",toolUseId:X.id,diff:ee.render.diff,sessionId:t.ctx.sessionId});let{content:ae,isError:q,image:ne}=ee,ce=ne!==void 0?[{type:"image",source:{type:"base64",media_type:ne.mediaType,data:ne.data}},...ae.length>0?[{type:"text",text:ae}]:[]]:ae;z.push({type:"tool_result",tool_use_id:X.id,content:ce,...q===!0?{is_error:!0}:{}})}let Z={role:"user",content:z};t.messages.push(Z);let K=L.find(j=>j.failureClass===wr);if(K){yield{type:"error",error:new Qn(K.content)};return}}catch(A){throw t.messages.splice(D),A}r+=1;let U=R.toolUseBlocks[R.toolUseBlocks.length-1],$=U?`${U.name}${Wn(U.name,U.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:u,description:"Working",summary:`round ${r}: ${$}`,lastToolName:U?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-p},sessionId:t.ctx.sessionId},s){yield{type:"turn.completed",usage:f({...n,stopReason:Zt}),sessionId:t.ctx.sessionId};return}if(vl(r,e)){let A=t.messages[t.messages.length-1];A!==void 0&&A.role==="user"&&Array.isArray(A.content)&&A.content.push({type:"text",text:wl}),s=!0;continue}}}finally{t.signal.removeEventListener("abort",g),m!==null&&t.signal.reason==="interrupted"&&J(t.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-m,metadata:{provider:"anthropic-direct"}}),J(t.traceWriter,{phase:"loop_end",durationMs:Date.now()-p})}}function YB(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var dc,FA,GB,qB,LA=y(()=>{"use strict";vA();Mi();_A();pe();dl();ie();Qp();B();kl();xA();OA();gl();os();Zp();ka();pe();fr();os();dc=3,FA=5e3,GB=2,qB=1e3});var NA=y(()=>{"use strict";sr()});import{randomUUID as XB}from"node:crypto";var $A,QB,ZB,eH,tH,nH,uc,UA=y(()=>{"use strict";LA();fn();Mi();Ri();fr();NA();kl();ie();$A=7200*1e3,QB=3,ZB=12e4,eH=5e3,tH=1e3,nH=60*1e3,uc=class{_client;_authMode;initSessionId;baseUrl;tokenRefresher;autoResumeOnUsageLimit;surface;refreshPromise=null;usageLimitWaitPromise=null;constructor(e){this._client=e.client,this._authMode=e.authMode,this.initSessionId=e.initSessionId,this.baseUrl=e.baseUrl,this.tokenRefresher=e.tokenRefresher,this.autoResumeOnUsageLimit=e.autoResumeOnUsageLimit,e.surface!==void 0&&(this.surface=e.surface)}get client(){return this._client}rotateHeaders(){return Wt(this._authMode,this.initSessionId,XB(),void 0,Pi({...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{}}))}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let e=Be(),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=Be();return{accountId:lo(r??""),swapped:e!==r}}async*turnWithRetries(e,n){yield*this.turnWithOverloadPause(e,n)}async*turnWithOverloadPause(e,n){let r=Ky(this.surface),o=null,s=!1;for(;;){let i=null;for await(let l of this.turnWithUsageLimitRetry(e,n)){if(Wy(l)){i=l;break}yield l}if(!i){s&&o!==null&&J(e.traceWriter,{phase:"overload_resume",durationMs:Date.now()-o,metadata:{source:"retry-layer",outcome:"recovered"}});return}if(n()||e.signal.aborted||r===0){yield i;return}o??=Date.now();let a=r-(Date.now()-o);if(a<=0){s&&J(e.traceWriter,{phase:"overload_resume",durationMs:Date.now()-o,metadata:{source:"retry-layer",outcome:"ceiling-reached"}}),yield i;return}if(s||(J(e.traceWriter,{phase:"overload_pause",metadata:{reason:"overloaded",source:"retry-layer",hasResetTimestamp:!1,ceilingMs:r,surface:this.surface??"unknown"}}),s=!0),await St(Math.min(jy(),a),e.signal),n()||e.signal.aborted)return;e.headers=this.rotateHeaders(),yield{type:"stream.retry",sessionId:e.ctx.sessionId}}}async*turnWithUsageLimitRetry(e,n){let r=null,o=null,s=!1,i=0;for(;;){let u,p=!1;for await(let g of this.turnWithAuthRetry(e,n)){if(g.type==="error"){let h=xi(g.error);if(h&&h.kind==="oauth-limit"){o=h.resetsAt,r=g;break}if(h&&h.kind==="oauth-limit-no-ts"){s=!0,r=g;break}if(h&&h.kind==="rate-limit-transient"&&i<QB){p=!0,u=h.retryAfterMs;break}}yield g}if(!p)break;if(i+=1,n()||e.signal.aborted)return;let m=Math.min(u??eH,ZB)+Math.floor(Math.random()*tH);if(J(e.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:i,waitMs:m}}),await St(m,e.signal),n()||e.signal.aborted)return;e.headers=this.rotateHeaders()}if(!r)return;if(s){let u=lo(Be()??"");if(yield{type:"paused",reason:"usage-limit",accountId:u,autoResume:this.autoResumeOnUsageLimit},J(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!1,autoResume:this.autoResumeOnUsageLimit}}),!this.autoResumeOnUsageLimit){yield r;return}let p=Date.now(),f=!1;for(;;){let m;if(this.usageLimitWaitPromise)m="aborted";else{this.usageLimitWaitPromise=Ih({signal:e.signal,retryAfterMs:nH});try{m=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(m==="aborted")return;let g=u;if(m==="hot-swap"){let w=await this.forceClientRefresh();w&&(e.client=this._client,g=w.accountId)}e.headers=this.rotateHeaders();let h=null;for await(let w of this.turnWithAuthRetry(e,n)){if(!f&&w.type==="error"){let k=xi(w.error);if(k&&(k.kind==="oauth-limit"||k.kind==="oauth-limit-no-ts")){h=w;break}}f||(yield{type:"resumed",hotSwapped:m==="hot-swap",accountId:g},J(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-p,metadata:{source:"retry-layer",hotSwapped:m==="hot-swap"}}),f=!0),yield w}if(!h)return;if(Date.now()-p>$A){yield h;return}}}if(!o)return;if(o.getTime()-Date.now()>$A){yield r;return}let a=lo(Be()??""),l=Date.now();if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},J(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!0,autoResume:this.autoResumeOnUsageLimit,resetsAt:o.toISOString()}}),!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Ch({resetsAt:o,signal:e.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let d=a;if(c==="hot-swap"){let u=await this.forceClientRefresh();u&&(e.client=this._client,d=u.accountId)}e.headers=this.rotateHeaders(),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:d},J(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-l,metadata:{source:"retry-layer",hotSwapped:c==="hot-swap"}}),yield*this.turnWithAuthRetry(e,n)}async*turnWithAuthRetry(e,n){let r=null;for await(let s of Qf(e)){if(n())return;if(s.type==="error"&&this.isRetryableAuth(s.error)){r=s;break}yield s}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}e.client=this._client,e.headers=this.rotateHeaders(),yield*Qf(e)}isRetryableAuth(e){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in e&&e.status===401}}});function rH(t){if(t.role!=="user")return!1;let e=t.content;if(typeof e=="string")return!0;if(!Array.isArray(e))return!1;for(let n of e)if(n.type==="tool_result")return!1;return!0}function oH(t){let n=[(t.role==="user"?"User":"Assistant")+":"];if(typeof t.content=="string")n.push(t.content);else if(Array.isArray(t.content))for(let r of t.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let s=r.name??"unknown",i=GA(r.input);n.push(`[tool call: ${s} ${i}]`)}else if(o==="tool_result"){let s=r.content;n.push(`[tool result: ${qA(s)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
1116
+ `)}function ms(t,e){let n=[],r=new Set,o=_.AFK_INTERNAL==="1",s=_o(ko());bs(zs(),"user"),Oy("project"),bs(Zm(e?.cwd),"project");for(let{dir:a,origin:l}of s.skillRoots)bs(a,l);for(let a of ou()){let l=Ct(a);ru(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 i=t??ic(e);for(let a of i){if(a.type!=="local")continue;let l=mf(a.path);for(let c of l)!c.name||r.has(c.name)||ru({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 gs(t,e){let n=new Map,r=t??ic(e);for(let o of r){if(o.type!=="local")continue;let s=mf(o.path);for(let i of s)i.name&&i.body&&i.body.length>0&&!n.has(i.name)&&n.set(i.name,{body:i.body,pluginPath:o.path,...i.allowedTools!==void 0?{allowedTools:i.allowedTools}:{},...i.context!==void 0?{context:i.context}:{},...i.readOnly===!0?{readOnly:!0}:{},...i.model!==void 0?{model:i.model}:{}})}return n}function hA(t){let e=t??ic(),n=[],r=new Set;for(let o of e){if(o.type!=="local")continue;let s=rA(o.path).name;if(s!==null)for(let i of Fl(NB(o.path,"agents"))){let a;try{a=LB(i,"utf8")}catch{continue}let l=Kn(a);if(l===void 0)continue;let c=`${s}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${s}`,filePath:i,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function ic(t){return[...Ft(eg(t?.cwd)),...Ft(),...Ft(ng()),..._o(ko()).pluginRoots.flatMap(({dir:e,binary:n})=>Ft(e,{trustAll:!0,sourceEnabled:by(n)}))]}async function yA(){await tA(ic(),{pluginApi:{registerSkill:Ie,listSkills:ou,getSkill:Ct,loadSkillPrompts:fe,env:_,SubagentManager:te,describeFailure:Ee,discoverPluginSkillBodies:gs,getAgentFrameworkDir:_t,getSkillsDir:zs,getSessionsDir:Ae,getOrDeriveFacet:zf,listSessionIds:Jf,deriveSessionFacet:vs,loadStoredSession:sc}})}var en=y(()=>{"use strict";ZE();ft();Ve();Kf();Xl();nA();ds();oA();us();Ef();be();Re();gA();G();B();qi()});function El(){try{let t=ms();return Promise.resolve(t.map(e=>{let n={name:e.name,description:e.description};return e.argumentHint&&(n.argumentHint=e.argumentHint),n}))}catch{return Promise.resolve([])}}var of=y(()=>{"use strict";en()});function ac(t){if(t.length===0)return;let e=t[t.length-1];if(!e||e.role!=="assistant"||typeof e.content=="string")return;let n=e.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};t.push(o)}var Vf=y(()=>{"use strict"});function bA(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,requestedModel:t.requestedModel??t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var wA=y(()=>{"use strict"});function UB(t,e,n,r,o){let s=$B.get(t);if(!s)return;let i=1e6,l=Math.max(0,e-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,f=r/i*u;return l+c+p+f}function SA(t,e,n){if(!t)return{stopReason:e??null};let r={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null};if(t.cache_read_input_tokens!=null&&(r.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=t.cache_creation_input_tokens),r.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let o=UB(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var $B,vA=y(()=>{"use strict";Pp();$B=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5}],["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 BB(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function HB(t,e,n){let r=[],o=[];for(let a of t)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:BB(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*kA(t,e,n){let r=[],o=null,s=null,i=!1,a=!!_.AFK_TELEGRAM_TRACE;try{a&&console.log("[translate] starting SDK event iteration");for await(let l of t){switch(a&&console.log("[translate] SDK evt:",l.type),l.type){case"message_start":{let c=l.message?.usage;c&&(s={...c});break}case"content_block_start":{let c=l.content_block;c.type==="text"?r[l.index]={kind:"text",text:""}:c.type==="thinking"?r[l.index]={kind:"thinking",thinking:"",signature:""}:c.type==="redacted_thinking"?r[l.index]={kind:"redacted_thinking",data:c.data}:c.type==="tool_use"&&(r[l.index]={kind:"tool_use",id:c.id,name:c.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:c.id,toolName:c.name,toolInput:" \u2026",sessionId:e.sessionId}});break}case"content_block_delta":{let c=r[l.index],d=l.delta;d.type==="text_delta"?(c&&c.kind==="text"&&(c.text+=d.text),yield{kind:"event",event:{type:"delta.text",text:d.text,sessionId:e.sessionId}}):d.type==="input_json_delta"?(c&&c.kind==="tool_use"&&(c.partialJson+=d.partial_json),n?.()):d.type==="thinking_delta"?(c&&c.kind==="thinking"&&(c.thinking+=d.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:d.thinking,sessionId:e.sessionId}}):(d.type==="signature_delta"&&c&&c.kind==="thinking"&&(c.signature=d.signature),n?.());break}case"content_block_stop":{let c=r[l.index];c&&c.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:c.name,toolUseIds:[c.id],sessionId:e.sessionId}});break}case"message_delta":{l.delta&&l.delta.stop_reason!==void 0&&(o=l.delta.stop_reason);let c=l.usage;c&&(s!==null?(s.output_tokens=c.output_tokens,c.cache_creation_input_tokens!=null&&(s.cache_creation_input_tokens=c.cache_creation_input_tokens),c.cache_read_input_tokens!=null&&(s.cache_read_input_tokens=c.cache_read_input_tokens),c.input_tokens!=null&&(s.input_tokens=c.input_tokens)):s={cache_creation:null,cache_creation_input_tokens:c.cache_creation_input_tokens??null,cache_read_input_tokens:c.cache_read_input_tokens??null,inference_geo:null,input_tokens:c.input_tokens??0,output_tokens:c.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}a&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(l){a&&console.log("[translate] SDK iteration threw:",l.message),yield{kind:"event",event:{type:"error",error:l instanceof Error?l:new Error(String(l))}};return}if(!i&&o===null){yield{kind:"event",event:{type:"error",error:new dt("the model stream ended without a terminal message (no message_stop and no stop_reason): the response was cut off mid-stream, typically an intermediary closing the connection. The turn is incomplete.")}};return}a&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:HB(r,o,s)}}var _A=y(()=>{"use strict";B();pe()});function lc(t){return t>2147483647?2147483647:t}var Yf=y(()=>{"use strict"});function AA(){let t=_.AFK_MODEL_TTFB_TIMEOUT_MS;if(t===void 0||t.trim()==="")return EA;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?EA:lc(e)}function TA(t,e){if(e<=0)return{signal:t,timedOut:()=>!1,firstByteSeen:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([t,n.signal]),o=!1,s=!1,i=setTimeout(()=>{o=!0,n.abort(new Error(jB))},e);i.unref();let a=()=>{s||(s=!0,clearTimeout(i))};return{signal:r,timedOut:()=>o,firstByteSeen:a,dispose:a}}var EA,jB,xA=y(()=>{"use strict";B();Yf();EA=18e4;jB="model_ttfb_timeout"});function CA(){let t=_.AFK_MODEL_STALL_TIMEOUT_MS;if(t===void 0||t.trim()==="")return RA;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?RA:lc(e)}function PA(t){return t instanceof Error&&t.message===IA}function Xf(t){return new Error(`Model stream stalled: no output for ${Math.round(t/1e3)}s after the response had already started streaming. The round was aborted rather than left hanging (issue #762: two sessions hung 38 and 63 minutes with no terminal event). A round that keeps producing output is never cut off, no matter how long it runs. Raise AFK_MODEL_STALL_TIMEOUT_MS, or set it to 0 to disable this bound.`)}function MA(t,e,n){if(e<=0)return{signal:t,timedOut:()=>!1,progress:()=>{},dispose:()=>{}};let r=new AbortController,o=AbortSignal.any([t,r.signal]),s,i=!1,a=!1,l=u=>{if(!(a||i)){i=!0,s=void 0;try{n?.({stallTimeoutMs:e,elapsedSinceLastProgressMs:Date.now()-u})}catch{}r.signal.aborted||r.abort(new Error(IA))}};return{signal:o,timedOut:()=>i,progress:()=>{if(a||i)return;s!==void 0&&clearTimeout(s);let u=Date.now(),p=setTimeout(()=>l(u),e);p.unref(),s=p},dispose:()=>{a||(a=!0,s!==void 0&&clearTimeout(s),s=void 0)}}}var RA,IA,OA=y(()=>{"use strict";B();Yf();RA=12e5;IA="model_stream_stall_timeout"});import{randomUUID as WB}from"node:crypto";function KB(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}function zB(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function cc(t){if(t===null||typeof t!="object")return!1;let e=t;if(e.status===529||e.status===503)return!0;let n=e.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 JB(t,e,n,r,o){for(let s=0;;s++){if(s>0){let i=cu(FA*Math.pow(2,s-1));if(await St(i,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let a=i instanceof Error?i:new Error(String(i));if(zB(a)&&s<dc)continue;throw a}}}async function*DA(t,e){J(t.traceWriter,{phase:"ttfb_timeout",durationMs:Date.now()-e,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:t.model}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId}}async function*VB(t,e){let n=e.throttleQueue;if(!n)return await t;n.resetAttempts();let r=Symbol("create-done"),o=!1,s=t.then(i=>(o=!0,i),i=>{throw o=!0,i});for(;;){for(let a of n.takeAll())yield{type:"rate_limit",sessionId:e.ctx.sessionId,status:a.status,attempt:a.attempt,...a.retryAfterMs!==void 0?{retryAfterMs:a.retryAfterMs}:{}};if(o)return await s;await Promise.race([s.then(()=>r,()=>r),n.waitForItem().then(()=>{})])}}async function*Qf(t){let e=Sl(t.maxToolUseIterations),n={stopReason:null},r=0,o=0,s=!1,i=0,a=0,l=AA(),c=!1,d=CA(),u=WB(),p=Date.now(),f=h=>({...h,durationMs:Date.now()-p});J(t.traceWriter,{phase:"loop_start"});let m=t.signal.aborted?Date.now():null,g=()=>{m===null&&(m=Date.now())};t.traceWriter&&!t.signal.aborted&&t.signal.addEventListener("abort",g,{once:!0});try{for(;;){if(t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let h=uo({baseUrl:t.baseUrl})?Bh(t.messages,po()):t.messages,w={model:t.model,max_tokens:t.maxTokens,messages:h,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0&&!s?{tools:t.tools.map(KB)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{}},k=Date.now(),E=TA(t.signal,l),v=MA(E.signal,d,A=>{J(t.traceWriter,{phase:"idle_watchdog_fired",durationMs:A.elapsedSinceLastProgressMs,resolvedModel:t.model,metadata:{source:"model-stream",stallTimeoutMs:A.stallTimeoutMs,elapsedSinceLastProgressMs:A.elapsedSinceLastProgressMs}})}),T=!1,x;try{x=yield*VB(JB(t.client,w,t.headers,v.signal,t.signal),t)}catch(A){if(E.timedOut()&&!t.signal.aborted&&!c)E.dispose(),v.dispose(),T=!0;else{if(E.dispose(),v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let M=A instanceof Error?A:new Error(String(A));M.message.includes("thinking")&&YB(t.messages,M),yield{type:"error",error:M};return}}if(T){yield*DA(t,k),c=!0;continue}let R=null,S=!1,C=!1,I=!1,P=!1,N=!1;try{_.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let A of kA(Or(x,t.signal),t.ctx,()=>v.progress()))if(!N&&(A.kind==="turn-result"||A.event.type!=="error")&&(N=!0,E.firstByteSeen(),J(t.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-k,resolvedModel:t.model})),v.progress(),_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",A.kind,A.kind==="event"?A.event.type:""),A.kind==="event"){if(A.event.type==="error"){if(E.timedOut()&&!t.signal.aborted&&!c&&!N){T=!0;break}if(v.timedOut()&&!t.signal.aborted){yield{type:"error",error:Xf(d)},S=!0;break}if(cc(A.event.error)&&i<dc&&!t.signal.aborted){C=!0;break}if(cc(A.event.error)&&!t.signal.aborted){P=!0;break}if(t.signal.aborted)break;if(A.event.error instanceof dt&&a<GB&&!t.signal.aborted){I=!0;break}yield A.event,S=!0;break}yield A.event}else{R=A.result;break}_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",R?"set":"null")}catch(A){if(E.timedOut()&&!t.signal.aborted&&!c&&!N)E.dispose(),v.dispose(),T=!0;else{if(E.dispose(),v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let M=A instanceof Error?A:new Error(String(A));if((v.timedOut()||PA(M))&&!t.signal.aborted){yield{type:"error",error:Xf(d)};return}if(cc(M)&&i<dc&&!t.signal.aborted)C=!0;else if(cc(M)&&!t.signal.aborted)P=!0;else{yield{type:"error",error:M};return}}}if(E.dispose(),v.dispose(),T){yield*DA(t,k),c=!0;continue}if(C){if(i+=1,J(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:i}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await St(cu(FA*Math.pow(2,i-1)),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}continue}if(I){if(a+=1,J(t.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:a}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await St(qB*Math.pow(2,a-1),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}continue}if(i=0,a=0,c=!1,P){J(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:dc,exhausted:!0}}),yield{type:"assistant.message",text:Hy,sessionId:t.ctx.sessionId},yield{type:"turn.completed",usage:f({...n,stopReason:mt}),sessionId:t.ctx.sessionId};return}if(S){t.signal.aborted&&(yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId});return}if(R===null){yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let W=SA(R.usage,R.stopReason,t.model);if(n=Ho(n,W),n.contextWindowTokens=(W.inputTokens??0)+(W.outputTokens??0)+(W.cachedInputTokens??0)+(W.cacheCreationTokens??0),t.onUsageProgress?.(n),R.stopReason!=="tool_use"){if(R.stopReason==="refusal"){yield{type:"assistant.message",text:R.text.length>0?R.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:t.ctx.sessionId},yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}R.text.length>0&&(yield{type:"assistant.message",text:R.text,sessionId:t.ctx.sessionId},R.text.length<=200&&(yield{type:"suggestion",suggestion:R.text,sessionId:t.ctx.sessionId}));let A=R.assistantBlocks.filter(M=>M.type!=="tool_use");A.length>0&&t.messages.push({role:"assistant",content:A}),yield{type:"turn.completed",usage:f(s?{...n,stopReason:Zt}:n),sessionId:t.ctx.sessionId};return}let D=t.messages.length;t.messages.push({role:"assistant",content:R.assistantBlocks});try{o+=R.toolUseBlocks.length;let A=[],M=new Map;for(let j of R.toolUseBlocks){A.push({id:j.id,name:j.name,input:j.input,signal:t.signal});let X=Date.now();M.set(j.id,X),or(t.traceWriter,yl({toolUseId:j.id,name:j.name,input:j.input,subagentId:t.subagentId})),yield{type:"tool.use.start",toolUseId:j.id,toolName:j.name,toolInput:Wn(j.name,j.input),toolInputRaw:hl(j.input),sessionId:t.ctx.sessionId}}if(t.signal.aborted){let j=A.map(X=>({type:"tool_result",tool_use_id:X.id,content:"Tool call aborted",is_error:!0}));t.messages.push({role:"user",content:j}),yield{type:"turn.completed",usage:f(n),sessionId:t.ctx.sessionId};return}let L;if(t.toolDispatcher.executeBatch)try{L=await t.toolDispatcher.executeBatch(A)}catch(j){L=A.map(()=>({content:`Tool batch execution failed: ${j instanceof Error?j.message:String(j)}`,isError:!0}))}else{L=[];for(let j of A){if(t.signal.aborted){L.push({content:"Tool call aborted",isError:!0});continue}try{L.push(await t.toolDispatcher.execute(j))}catch(X){let ee=X instanceof Error?X.message:String(X);L.push({content:`Tool execution threw: ${ee}`,isError:!0})}}}let z=[];for(let j=0;j<A.length;j++){let X=A[j],ee=L[j],Fe=M.get(X.id),$t=typeof Fe=="number"?Date.now()-Fe:0,oe=ee.truncated===!0||ee.content.includes("[output truncated");or(t.traceWriter,bl({toolUseId:X.id,name:X.name,result:ee,truncated:oe,durationMs:$t,subagentId:t.subagentId})),yield{type:"tool.output",toolUseId:X.id,toolName:X.name,content:ee.content,...ee.isError===!0?{isError:!0}:{},...oe?{truncated:!0}:{},...ee.incomplete===!0?{incomplete:!0}:{},...ee.incompleteReason?{incompleteReason:ee.incompleteReason}:{},...typeof ee.batchIndex=="number"&&typeof ee.batchSize=="number"?{batchIndex:ee.batchIndex,batchSize:ee.batchSize}:{},sessionId:t.ctx.sessionId},ee.render?.diff&&(yield{type:"tool.diff",toolUseId:X.id,diff:ee.render.diff,sessionId:t.ctx.sessionId});let{content:ae,isError:q,image:ne}=ee,ce=ne!==void 0?[{type:"image",source:{type:"base64",media_type:ne.mediaType,data:ne.data}},...ae.length>0?[{type:"text",text:ae}]:[]]:ae;z.push({type:"tool_result",tool_use_id:X.id,content:ce,...q===!0?{is_error:!0}:{}})}let Z={role:"user",content:z};t.messages.push(Z);let K=L.find(j=>j.failureClass===wr);if(K){yield{type:"error",error:new Qn(K.content)};return}}catch(A){throw t.messages.splice(D),A}r+=1;let U=R.toolUseBlocks[R.toolUseBlocks.length-1],$=U?`${U.name}${Wn(U.name,U.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:u,description:"Working",summary:`round ${r}: ${$}`,lastToolName:U?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-p},sessionId:t.ctx.sessionId},s){yield{type:"turn.completed",usage:f({...n,stopReason:Zt}),sessionId:t.ctx.sessionId};return}if(vl(r,e)){let A=t.messages[t.messages.length-1];A!==void 0&&A.role==="user"&&Array.isArray(A.content)&&A.content.push({type:"text",text:wl}),s=!0;continue}}}finally{t.signal.removeEventListener("abort",g),m!==null&&t.signal.reason==="interrupted"&&J(t.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-m,metadata:{provider:"anthropic-direct"}}),J(t.traceWriter,{phase:"loop_end",durationMs:Date.now()-p})}}function YB(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var dc,FA,GB,qB,LA=y(()=>{"use strict";vA();Mi();_A();pe();dl();ie();Qp();B();kl();xA();OA();gl();os();Zp();ka();pe();fr();os();dc=3,FA=5e3,GB=2,qB=1e3});var NA=y(()=>{"use strict";sr()});import{randomUUID as XB}from"node:crypto";var $A,QB,ZB,eH,tH,nH,uc,UA=y(()=>{"use strict";LA();fn();Mi();Ri();fr();NA();kl();ie();$A=7200*1e3,QB=3,ZB=12e4,eH=5e3,tH=1e3,nH=60*1e3,uc=class{_client;_authMode;initSessionId;baseUrl;tokenRefresher;autoResumeOnUsageLimit;surface;refreshPromise=null;usageLimitWaitPromise=null;credentialSnapshotStale=!1;constructor(e){this._client=e.client,this._authMode=e.authMode,this.initSessionId=e.initSessionId,this.baseUrl=e.baseUrl,this.tokenRefresher=e.tokenRefresher,this.autoResumeOnUsageLimit=e.autoResumeOnUsageLimit,e.surface!==void 0&&(this.surface=e.surface)}get client(){return this._client}rotateHeaders(){return Wt(this._authMode,this.initSessionId,XB(),void 0,Pi({...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{}}))}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let e=Be(),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=Be();return{accountId:lo(r??""),swapped:e!==r}}async*turnWithRetries(e,n){this.credentialSnapshotStale&&(await this.forceClientRefresh()&&(e.client=this._client,e.headers=this.rotateHeaders()),this.credentialSnapshotStale=!1),yield*this.turnWithOverloadPause(e,n)}async*turnWithOverloadPause(e,n){let r=Ky(this.surface),o=null,s=!1;for(;;){let i=null;for await(let l of this.turnWithUsageLimitRetry(e,n)){if(Wy(l)){i=l;break}yield l}if(!i){s&&o!==null&&J(e.traceWriter,{phase:"overload_resume",durationMs:Date.now()-o,metadata:{source:"retry-layer",outcome:"recovered"}});return}if(n()||e.signal.aborted||r===0){yield i;return}o??=Date.now();let a=r-(Date.now()-o);if(a<=0){s&&J(e.traceWriter,{phase:"overload_resume",durationMs:Date.now()-o,metadata:{source:"retry-layer",outcome:"ceiling-reached"}}),yield i;return}if(s||(J(e.traceWriter,{phase:"overload_pause",metadata:{reason:"overloaded",source:"retry-layer",hasResetTimestamp:!1,ceilingMs:r,surface:this.surface??"unknown"}}),s=!0),await St(Math.min(jy(),a),e.signal),n()||e.signal.aborted)return;e.headers=this.rotateHeaders(),yield{type:"stream.retry",sessionId:e.ctx.sessionId}}}async*turnWithUsageLimitRetry(e,n){let r=null,o=null,s=!1,i=0;for(;;){let u,p=!1;for await(let g of this.turnWithAuthRetry(e,n)){if(g.type==="error"){let h=xi(g.error);if(h&&h.kind==="oauth-limit"){o=h.resetsAt,r=g;break}if(h&&h.kind==="oauth-limit-no-ts"){s=!0,r=g;break}if(h&&h.kind==="rate-limit-transient"&&i<QB){p=!0,u=h.retryAfterMs;break}}yield g}if(!p)break;if(i+=1,n()||e.signal.aborted)return;let m=Math.min(u??eH,ZB)+Math.floor(Math.random()*tH);if(J(e.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:i,waitMs:m}}),await St(m,e.signal),n()||e.signal.aborted)return;e.headers=this.rotateHeaders()}if(!r)return;if(s){let u=lo(Be()??"");if(yield{type:"paused",reason:"usage-limit",accountId:u,autoResume:this.autoResumeOnUsageLimit},J(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!1,autoResume:this.autoResumeOnUsageLimit}}),!this.autoResumeOnUsageLimit){this.credentialSnapshotStale=!0,yield r;return}let p=Date.now(),f=!1;for(;;){let m;if(this.usageLimitWaitPromise)m="aborted";else{this.usageLimitWaitPromise=Ih({signal:e.signal,retryAfterMs:nH});try{m=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(m==="aborted")return;let g=u;if(m==="hot-swap"){let w=await this.forceClientRefresh();w&&(e.client=this._client,g=w.accountId)}e.headers=this.rotateHeaders();let h=null;for await(let w of this.turnWithAuthRetry(e,n)){if(!f&&w.type==="error"){let k=xi(w.error);if(k&&(k.kind==="oauth-limit"||k.kind==="oauth-limit-no-ts")){h=w;break}}f||(yield{type:"resumed",hotSwapped:m==="hot-swap",accountId:g},J(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-p,metadata:{source:"retry-layer",hotSwapped:m==="hot-swap"}}),f=!0),yield w}if(!h)return;if(Date.now()-p>$A){yield h;return}}}if(!o)return;if(o.getTime()-Date.now()>$A){this.credentialSnapshotStale=!0,yield r;return}let a=lo(Be()??""),l=Date.now();if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},J(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!0,autoResume:this.autoResumeOnUsageLimit,resetsAt:o.toISOString()}}),!this.autoResumeOnUsageLimit){this.credentialSnapshotStale=!0,yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Ch({resetsAt:o,signal:e.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let d=a;if(c==="hot-swap"){let u=await this.forceClientRefresh();u&&(e.client=this._client,d=u.accountId)}e.headers=this.rotateHeaders(),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:d},J(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-l,metadata:{source:"retry-layer",hotSwapped:c==="hot-swap"}}),yield*this.turnWithAuthRetry(e,n)}async*turnWithAuthRetry(e,n){let r=null;for await(let s of Qf(e)){if(n())return;if(s.type==="error"&&this.isRetryableAuth(s.error)){r=s;break}yield s}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}e.client=this._client,e.headers=this.rotateHeaders(),yield*Qf(e)}isRetryableAuth(e){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in e&&e.status===401}}});function rH(t){if(t.role!=="user")return!1;let e=t.content;if(typeof e=="string")return!0;if(!Array.isArray(e))return!1;for(let n of e)if(n.type==="tool_result")return!1;return!0}function oH(t){let n=[(t.role==="user"?"User":"Assistant")+":"];if(typeof t.content=="string")n.push(t.content);else if(Array.isArray(t.content))for(let r of t.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let s=r.name??"unknown",i=GA(r.input);n.push(`[tool call: ${s} ${i}]`)}else if(o==="tool_result"){let s=r.content;n.push(`[tool result: ${qA(s)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
1117
1117
  `)}function sH(t){let e=0;if(typeof t.content=="string")e+=t.content.length;else if(Array.isArray(t.content))for(let n of t.content){let r=n.type;r==="text"&&"text"in n?e+=n.text.length:r==="tool_use"?e+=GA(n.input).length:r==="tool_result"&&(e+=qA(n.content).length)}return e}function iH(t){if(typeof t=="string")return jn(t);if(Array.isArray(t)){let e=0;for(let n of t)n.type==="text"&&"text"in n&&(e+=jn(n.text));return e}return 0}function aH(t){if(typeof t=="string")return Pr(t);if(Array.isArray(t)){for(let e of t)if(e.type==="text"&&"text"in e)return Pr(e.text)}return!1}function BA(t,e){return il(t,lH,e??{})}function HA(t,e,n,r){return Hp(t,e,pc,n,r)}function jA(t,e,n){let r=jp(t,pc);return{model:e,max_tokens:n,system:Xo,messages:[{role:"user",content:es(r)}],stream:!0}}function WA(t,e,n){return Wp(t,e,n,pc)}function KA(t,e,n){return Kp(t,e,n,pc)}function GA(t){try{let e=JSON.stringify(t);return e.length>240?e.slice(0,237)+"...":e}catch{return"{}"}}function qA(t){if(typeof t=="string")return t.length>320?t.slice(0,317)+"...":t;if(Array.isArray(t)){let e=[];for(let r of t)r.type==="text"&&"text"in r&&e.push(r.text);let n=e.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}var pc,lH,zA=y(()=>{"use strict";ts();pc={isFreshUserTurn:rH,renderMessage:oH,buildPreamble(t){return[{role:"user",content:Qo+`
1118
1118
 
1119
1119
  `+t},{role:"assistant",content:Zo}]},countChars:sH};lH={listToolResults(t){let e=[];for(let n of t){if(n.role!=="user"||!Array.isArray(n.content))continue;let r=n.content;for(let o of r){if(o.type!=="tool_result")continue;let s=o;e.push({byteLength:iH(s.content),isPlaceholder:aH(s.content),clear(i){s.content=i}})}}return e}}});import{randomUUID as cH}from"node:crypto";async function VA(t){let{state:e,abort:n,retry:r,initSessionId:o,traceWriter:s}=t,i=e.messages.length;if(e.closed)return{compacted:!1,reason:"session-closed",messagesBefore:i,messagesAfter:i};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:i,messagesAfter:i};let a=fH(),l=Vo(at(e.lastUsage??{}),Hn(e.requestedModel)),c=HA(e.messages,a,l,mH());if(c<0)return JA(e,i,"history-too-short");if(c===0)return JA(e,i,"nothing-to-summarize");let d=e.messages.slice(0,c),u=hH(),p=jA(d,u,pH),f=n.begin(),m;try{if(f.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let k=Wt(r.authMode,o,cH()),E=r.client,v=await Promise.resolve(E.messages.create(p,{headers:k,signal:f.signal}));m=await yH(v)}catch(k){return f.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(k instanceof Error?k.message:String(k)),messagesBefore:i,messagesAfter:i}}finally{n.clear(f)}if(m.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let g=KA(e.messages,c,m),h=WA(e.messages,c,m);e.messages.splice(0,e.messages.length,...h);let w=e.messages.length;return Ti(s,{trigger:"manual",preCompactionMessages:d,summary:m,keptTailCount:i-c,keepLastNConfig:a,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:g}}function fH(){let t=_.AFK_COMPACT_KEEP_LAST_TURNS;if(t!==void 0&&t.length>0){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return dH}function mH(){let t=_.AFK_COMPACT_SHRINK_FRACTION;if(t!==void 0&&t.length>0){let e=Number.parseFloat(t);if(Number.isFinite(e)&&e>0&&e<1)return e}return Ir}function JA(t,e,n){let r=gH(),{blocksCleared:o,bytesReclaimed:s}=BA(t.messages,r);return o>0?{compacted:!1,reason:"microcompacted",messagesBefore:e,messagesAfter:t.messages.length,microcompaction:{blocksCleared:o,bytesReclaimed:s}}:{compacted:!1,reason:n,messagesBefore:e,messagesAfter:e}}function gH(){return Mr(_.AFK_MICROCOMPACT_TOOL_RESULT_BYTES,_.AFK_MICROCOMPACT_KEEP_LAST)}function hH(){let t=_.AFK_COMPACT_MODEL;return t!==void 0&&t.length>0?Se(t)??t:uH}async function yH(t){let e="";for await(let n of t)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(e+=r.text)}return e}var dH,uH,pH,YA=y(()=>{"use strict";fn();zA();ts();Yo();Tr();ie();ze();B();dH=2,uH="claude-haiku-4-5-20251001",pH=1024});function Zf(t){if(typeof t=="string")return t;let e=[];for(let n of t)n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join(" ")}function QA(t){return t.role!=="user"?!1:Zf(t.content).trim().length>0}function bH(t){let e=t.replace(/\s+/g," ").trim();return e.length<=XA?e:e.slice(0,XA-1)+"\u2026"}function ZA(t){let e=[];for(let n=0;n<t.length;n++){let r=t[n];r&&QA(r)&&e.push({turnIndex:n,preview:bH(Zf(r.content))})}return e.reverse()}function eT(t,e){let{state:n,abort:r}=t,o=n.messages.length;if(n.closed)return{rewound:!1,reason:"session-closed",messagesBefore:o,messagesAfter:o};if(!r.isIdle())return{rewound:!1,reason:"turn-in-flight",messagesBefore:o,messagesAfter:o};if(!Number.isInteger(e)||e<0||e>=o)return{rewound:!1,reason:"invalid-target",messagesBefore:o,messagesAfter:o};let s=n.messages[e];if(!s||!QA(s))return{rewound:!1,reason:"invalid-target",messagesBefore:o,messagesAfter:o};let i=Zf(s.content);return n.messages.splice(e),ac(n.messages),{rewound:!0,reloadText:i,messagesBefore:o,messagesAfter:n.messages.length}}var XA,tT=y(()=>{"use strict";Vf();XA=72});var nT=y(()=>{"use strict";Yo()});import{randomUUID as rT}from"node:crypto";var wH,fc,oT=y(()=>{"use strict";co();fn();Mi();jh();Wh();Zh();vn();of();Tr();ze();Vf();wA();Up();UA();YA();tT();nT();pe();wH=[{value:"claude-sonnet-5",displayName:"Claude Sonnet 5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-5",displayName:"Claude Opus 5",description:"Highest-capability Claude for agentic coding"},{value:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],fc=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;maxToolUseIterations;traceWriter;subagentId;state;abort;retry;cwdDependentsFactory;onPermissionMode;mcpManager;hookRegistry;throttleQueue;constructor(e){this.initSessionId=e.sessionId??rT(),this.promptStream=e.promptStream,this.maxTokens=e.maxTokens,this.tools=e.tools,this.systemPrefix=e.systemPrefix,this.thinking=e.thinking,e.effort!==void 0&&(this.effort=e.effort),e.baseUrl!==void 0&&(this.baseUrl=e.baseUrl),e.maxToolUseIterations!==void 0&&(this.maxToolUseIterations=e.maxToolUseIterations),this.traceWriter=e.traceWriter,e.subagentId!==void 0&&(this.subagentId=e.subagentId),this.cwdDependentsFactory=e.cwdDependentsFactory,this.onPermissionMode=e.onPermissionMode,this.mcpManager=e.mcpManager,e.hookRegistry!==void 0&&(this.hookRegistry=e.hookRegistry),e.throttleQueue!==void 0&&(this.throttleQueue=e.throttleQueue),this.retry=new uc({client:e.client,authMode:e.authMode,initSessionId:this.initSessionId,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.tokenRefresher?{tokenRefresher:e.tokenRefresher}:{},autoResumeOnUsageLimit:e.autoResumeOnUsageLimit??!0,...e.surface!==void 0?{surface:e.surface}:{}}),this.state=bA({model:e.model,...e.requestedModel!==void 0?{requestedModel:e.requestedModel}:{},permissionMode:e.permissionMode??"default",userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,...e.initialMessages?{initialMessages:e.initialMessages}:{},...e.autoCompactThreshold!==void 0?{autoCompactThreshold:e.autoCompactThreshold}:{}}),this.abort=new Cr}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 s=o.value,i=this.abort.begin();if(i.signal.aborted){this.abort.clear(i);return}ac(this.state.messages),this.state.messages.push({role:"user",content:s.content});let a=this.composeSystem(),l=Wt(this.retry.authMode,this.initSessionId,rT(),this.effort!==void 0,Pi({...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{}})),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.state.currentPermissionMode==="plan"?this.tools:this.tools?.filter(u=>u.name!==Je)??null,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:i.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}:{},...this.subagentId!==void 0?{subagentId:this.subagentId}:{},...this.throttleQueue?{throttleQueue:this.throttleQueue}:{},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(i)),(u.type==="turn.completed"||u.type==="error")&&(d=!0),yield u}}catch(u){if(this.state.closed)return;if(i.signal.aborted){this.abort.clear(i),d||(yield this.makeInterruptedTurnEvent());continue}yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abort.clear(i)}if(this.state.closed)return;if(i.signal.aborted){d||(yield this.makeInterruptedTurnEvent());continue}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let u=this.state.lastUsage,p=Hn(this.state.requestedModel);if(u!==null&&p>0){let f=at(u);if(Jo(f,p,this.state.autoCompactThreshold))try{this.hookRegistry&&await this.hookRegistry.dispatch({event:"PreCompact",sessionId:this.initSessionId,trigger:"auto"}),await this.compact()}catch(m){if(!(m instanceof re))throw m}}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){this.state.userSystem&&(this.state.userSystem=Qh(this.state.userSystem));let e=this.systemPrefix,n=this.state.userSystem,r=[];e&&e.length>0&&r.push(...e),n&&n.length>0&&r.push({type:"text",text:n});let o=xd(this.state.currentPermissionMode);o!==null&&r.push(o);let s=Cd(this.state.currentPermissionMode);return s!==null&&r.push(s),r.length===0?null:uo({baseUrl:this.baseUrl})?Uh(r,po()):r}async interrupt(){this.abort.requestAbort("interrupted")}makeInterruptedTurnEvent(){return{type:"turn.completed",usage:{stopReason:"interrupted",resultSubtype:"interrupted",isError:!1},sessionId:this.initSessionId}}async setModel(e){e!==void 0&&e.length>0&&(this.state.requestedModel=e,this.state.currentModel=Se(e)??e)}async setPermissionMode(e){this.state.currentPermissionMode=e;let n=ut(e);this.state.toolDispatcher.setAllowAll?.(n),this.onPermissionMode?.(e)}setCwd(e){if(this.state.toolDispatcher.setResolveBase?.(e),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(e);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){return El()}async supportedModels(){return wH.map(e=>({...e}))}async supportedAgents(){return[]}async getContextUsage(){let e=this.state.lastUsage,n=Wo(this.state.requestedModel),r;if(e&&n>0){let i=at(e);r=Math.min(100,Math.max(0,i/n*100))}let{totalTokens:o,apiUsage:s}=zo(e);return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:s,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(e=>({name:e.serverName,status:e.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(e,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return VA({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}listRewindTargets(){return ZA(this.state.messages)}async rewindConversation(e){return eT({state:this.state,abort:this.abort},e)}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}}});function em(t,e){let n=el(e),r=t.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let s=`max:${e}:${o}`;return mc.has(s)||(mc.add(s),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${e} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function sT(t){if(!t||t.length===0)return;let e=[];for(let n of t)n.user.length>0&&e.push({role:"user",content:n.user}),n.assistant.length>0&&e.push({role:"assistant",content:n.assistant});return e.length>0?e:void 0}function tm(t,e,n){switch(t.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&vH(n))return{type:"adaptive",display:"summarized"};let r=Math.floor(e*kH),o=Math.max(1024,e-1-r),s=t.budgetTokens!==void 0&&Number.isFinite(t.budgetTokens)?Math.floor(t.budgetTokens):void 0,i=Math.min(Math.max(s??o,1024),o);if(s!==void 0&&s>o){let a=`think:${n??"default"}:${s}:${e}`;mc.has(a)||(mc.add(a),console.warn(`[afk] thinking budgetTokens ${s} leaves too little of max_tokens ${e} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:i,display:"summarized"}}}}function nm(t,e){if(t!==void 0)return t;let n=e.toLowerCase();if(/(claude-)?(opus|sonnet)-(4-[678]|5)/.test(n))return"max"}var SH,vH,mc,kH,rm=y(()=>{"use strict";Tr();Yo();SH=t=>/opus-4-(7|[89])/.test(t),vH=t=>SH(t)||/(claude-)?(opus|sonnet)-5/.test(t),mc=new Set,kH=.25});import{mkdirSync as _H,appendFileSync as EH,existsSync as AH}from"fs";import{resolve as TH}from"path";import{dirname as xH}from"path";function sm(t){let e=t;for(let[n,r]of IH)e=e.replace(n,(...o)=>{let s=o.slice(0,o.length-2);return r(s)});return e}function om(t){return typeof t=="string"?sm(t):Array.isArray(t)?t.map(om):t}function PH(t){if(t===null||typeof t!="object")return t;let e=t,n={...e},r=e.env;if(r&&typeof r=="object"){let o={};for(let[s,i]of Object.entries(r))CH.test(s)&&typeof i=="string"?o[s]=`<REDACTED length=${i.length}>`:o[s]=i;n.env=o}return"system"in e&&(n.system=om(e.system)),"systemPrompt"in e&&(n.systemPrompt=om(e.systemPrompt)),n}function MH(t){if(t==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof t=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(t))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof t=="object"){let e=t;if(e.type==="preset"&&e.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof e.append=="string"&&(n.append={length:e.append.length}),e.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 iT(t){let e=_.AFK_DUMP_PROMPT;if(!e||e===""||e==="0"||e.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.84.2",
3
+ "version": "5.84.3",
4
4
  "description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
5
5
  "main": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",