agent-afk 5.115.2 → 5.115.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/agent/abort-graph.d.ts +3 -3
- package/dist/agent/afk-mode-gate.d.ts +2 -2
- package/dist/agent/background-registry.d.ts +3 -3
- package/dist/agent/daemon/scheduler.d.ts +2 -1
- package/dist/agent/default-hook-registry.d.ts +2 -2
- package/dist/agent/mcp/manager.d.ts +2 -2
- package/dist/agent/providers/anthropic-direct/build-dispatcher.d.ts +2 -2
- package/dist/agent/providers/anthropic-direct/query/compact-handler.d.ts +1 -1
- package/dist/agent/providers/anthropic-direct/query-maintenance.d.ts +1 -1
- package/dist/agent/providers/anthropic-direct/query-options.d.ts +1 -1
- package/dist/agent/providers/anthropic-direct/query-turn-driver.d.ts +1 -1
- package/dist/agent/providers/anthropic-direct/request-types.d.ts +1 -1
- package/dist/agent/providers/anthropic-direct/tracing-fetch.d.ts +2 -2
- package/dist/agent/providers/openai-compatible/compact.d.ts +2 -2
- package/dist/agent/providers/openai-compatible/query/dispatch-append.d.ts +2 -2
- package/dist/agent/providers/openai-compatible/query/stream-drive.d.ts +2 -2
- package/dist/agent/providers/openai-compatible/query.d.ts +2 -2
- package/dist/agent/providers/shared/turn-trace.d.ts +2 -2
- package/dist/agent/query.d.ts +2 -0
- package/dist/agent/session/agent-session.d.ts +3 -2
- package/dist/agent/session/closure-emitter.d.ts +2 -2
- package/dist/agent/session/hooks-dispatch.d.ts +2 -2
- package/dist/agent/session/stream-consumer.d.ts +2 -2
- package/dist/agent/session/wire-executors.d.ts +3 -3
- package/dist/agent/subagent/fork-types.d.ts +2 -2
- package/dist/agent/subagent/handle.d.ts +2 -2
- package/dist/agent/subagent-hooks.d.ts +2 -2
- package/dist/agent/subagent.d.ts +2 -2
- package/dist/agent/tools/compose-executor.d.ts +3 -3
- package/dist/agent/tools/dispatcher.d.ts +2 -2
- package/dist/agent/tools/nesting.d.ts +2 -2
- package/dist/agent/tools/skill-executor/types.d.ts +2 -2
- package/dist/agent/tools/skill-executor.d.ts +2 -2
- package/dist/agent/tools/subagent/child-config.d.ts +2 -2
- package/dist/agent/tools/subagent/foreground-promotion.d.ts +2 -2
- package/dist/agent/tools/subagent-executor.d.ts +3 -3
- package/dist/agent/tools/types.d.ts +2 -2
- package/dist/agent/trace/emit.d.ts +13 -13
- package/dist/agent/trace/index.d.ts +1 -1
- package/dist/agent/trace/writer.d.ts +3 -1
- package/dist/agent/types/config-types.d.ts +2 -2
- package/dist/cli/commands/daemon.d.ts +1 -1
- package/dist/cli/commands/interactive/boot-warning-recorder.d.ts +2 -2
- package/dist/cli/commands/interactive/bootstrap-hooks.d.ts +2 -2
- package/dist/cli/commands/interactive/bootstrap-mcp.d.ts +2 -2
- package/dist/cli.mjs +349 -349
- package/dist/index.mjs +3 -3
- package/dist/skills/index.d.ts +2 -2
- package/dist/skills/mint/_phases/build.d.ts +2 -2
- package/dist/skills/mint/_phases/heal.d.ts +2 -2
- package/dist/skills/mint/_phases/parallelize-dispatch.d.ts +2 -2
- package/dist/skills/mint/_phases/plan.d.ts +2 -2
- package/dist/skills/mint/_phases/research.d.ts +2 -2
- package/dist/skills/mint/_phases/ship.d.ts +2 -2
- package/dist/skills/mint/_phases/spec.d.ts +2 -2
- package/dist/skills/mint/_phases/verify.d.ts +2 -2
- package/dist/telegram/construct-session.d.ts +1 -1
- package/dist/telegram.mjs +4 -4
- package/package.json +1 -1
package/dist/telegram.mjs
CHANGED
|
@@ -211,7 +211,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
|
|
|
211
211
|
|
|
212
212
|
${e}`}var aB,gf=h(()=>{"use strict";aB=new Set(["script","style","noscript","template","svg"])});function dB(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 kv(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function uB(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 Ev(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??dB,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(!cB.has(u.status)||d===o)return u;let p=uB(u,i)??kv(d,s,i);N("[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=kv(d,s,i);N("[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 cB,_v=h(()=>{"use strict";fe();cB=new Set([429,502,503,504])});import{BlockList as pB,isIP as yf}from"node:net";import{lookup as fB}from"node:dns/promises";import{Agent as mB}from"undici";function Av(){let t=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function bB(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function hf(t){let e=yf(t);return e===0?!1:yB.check(t,e===4?"ipv4":"ipv6")}async function Rv(t){return fB(t,{all:!0,verbatim:!0})}async function bf(t,e={}){if(e.allowPrivateHosts??Av())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=bB(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(yf(r)!==0)return hf(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??Rv,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(hf(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function ws(t,e={}){let n=await bf(t,e);if(!n.allowed)throw new bt(n.reason)}async function ul(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<=Tv;i++){await ws(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??Av())?{dispatcher:wB}:{}},l=await Ev(t,s,a,r.retry??{});if(!SB.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 bt(`too many redirects (>${Tv}) starting from ${e}`)}var gB,hB,yB,bt,wB,Tv,SB,wf=h(()=>{"use strict";U();_v();gB=[["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]],hB=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],yB=(()=>{let t=new pB;for(let[e,n]of gB)t.addSubnet(e,n,"ipv4");for(let[e,n]of hB)t.addSubnet(e,n,"ipv6");return t})(),bt=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};wB=new mB({connect:{lookup(t,e,n){Rv(t).then(r=>{let o=r.find(i=>hf(i.address));if(o!==void 0){n(new bt(`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,yf(s.address))},r=>n(r,"",0))}}});Tv=20,SB=new Set([301,302,303,307,308])});import{readFileSync as vB}from"node:fs";import{join as kB}from"path";function EB(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function xv(t,e){return EB(e).test(t)}function AB(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(_B.has(e))return!0;if(TB.has(e))return!1}return!1}function Cv(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function RB(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 Iv(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Du(e),e}function xB(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function CB(t){try{return vB(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function IB(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=Iv(e.defaultProfile)),n}function Pv(t){let e=t?.env??v,n=t?.readFileSync??CB,r=t?.surface??e.AGENT_SURFACE,o=AB(e.AFK_BROWSER_HEADLESS,r),s=Cv(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Cv(e.AFK_BROWSER_BLOCKED_DOMAINS),a=xB(e.AFK_BROWSER_DOM_SNAPSHOTS),l=RB(e.AFK_BROWSER_BACKEND),c=Iv(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():kB(Ht(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=IB(d,m);return g.configPath=p,g}function pl(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(xv(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>xv(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var _B,TB,fl=h(()=>{"use strict";U();j();_B=new Set(["daemon","subagent","telegram","afk"]),TB=new Set(["repl","interactive","cli"])});import{existsSync as PB,readFileSync as MB}from"node:fs";import{createRequire as OB}from"node:module";import{dirname as DB,join as FB}from"node:path";function Dv(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<NB&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function je(t){let e=Dv(t);return Ov.some(n=>e.includes(n))}function $B(){try{let e=OB(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(MB(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=FB(DB(e),o);return PB(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function Ss(){return Mv??=$B()??LB,Mv}function Sf(t){return t.includes("install chromium")}function lt(t,e){let n=Dv(t),r=e?.latched===!0?` ${UB}`:"";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: ${Ss()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Ss()}). Or pick a different tool.${r}`}function vf(t,e,n=!1){if(!je(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
|
|
213
213
|
|
|
214
|
-
${lt(t,{headless:e,latched:n})}`,{cause:t})}var Ov,LB,NB,Mv,UB,kf=h(()=>{"use strict";Ov=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],LB="pnpm exec playwright install chromium",NB=4;UB="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 Zn from"node:fs";import ml from"node:path";import{randomBytes as BB}from"node:crypto";import{chromium as jB}from"playwright";function HB(){try{return"5.115.2"}catch{}try{let t=ml.resolve(import.meta.dirname,"../../../package.json"),e=Zn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var WB,gl,Fv=h(()=>{"use strict";kf();j();fe();WB=HB(),gl=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=jB.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=vf(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/${WB}`}}loadStorageState(e){let n=Fu(e);try{if(!Zn.existsSync(n))return;let r=JSON.parse(Zn.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Fu(e);if(!Zn.existsSync(r))return;let o=await n.storageState(),s=ml.join(ml.dirname(r),`.${ml.basename(r)}.${process.pid}.${BB(4).toString("hex")}.tmp`);Zn.writeFileSync(s,JSON.stringify(o),{mode:384}),Zn.chmodSync(s,384),Zn.renameSync(s,r),N("[browser/vault] saved session",{profile:e,file:r})}catch(r){N("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as KB}from"crypto";function Lv(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&GB.test(t.label))}function Nv(t){return KB("sha256").update(t,"utf8").digest("hex").slice(0,8)}function $v(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var GB,hl=h(()=>{"use strict";GB=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as qB}from"node:crypto";function zB(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function VB(t,e,n){return`el_${qB("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function JB(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Uv(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function jv(t,e){let n=t.role??"",r=t.name??"";Bv.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])jv(s,e)}async function YB(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},Hv).catch(()=>[])}async function XB(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},Hv).catch(()=>[])}function QB(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function yl(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=QB(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=YB(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]),y,w=!1;u!==null?(y=[],jv(u,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await XB(t)).filter($=>Bv.has($.role??"")));let E=new Map;for(let I of p){let $=Uv(I.name),V=E.get($);(!V||V.bbox.w===0&&I.bbox.w>0)&&E.set($,I)}let _=y.map(I=>({ax:I,dom:E.get(Uv(I.name??""))})),k=r?_:_.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,$)=>{let V=I.dom?.bbox.y??0,P=$.dom?.bbox.y??0;if(V!==P)return V-P;let B=I.dom?.bbox.x??0,L=$.dom?.bbox.x??0;return B-L}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=k.slice(0,n).map((I,$)=>{let V=I.ax.role??"generic",P=I.ax.name??"",B=VB(V,P,$),L=I.dom?.bbox??{x:0,y:0,w:0,h:0},M=I.dom?.type??null,F=null;I.ax.value!==void 0&&I.ax.value!==null&&(F=String(I.ax.value)),I.ax.checked!==void 0&&(F=String(I.ax.checked)),Lv({role:V,kind:M})&&(F="[redacted]");let H={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(H.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(H.selected=I.ax.selected),I.ax.expanded!==void 0&&(H.expanded=I.ax.expanded);let X;I.dom?.testId?X=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(X=`#${I.dom.id}`);let te={id:B,role:V,label:zB(P),kind:M,value:F,state:H,bbox:L};return X!==void 0&&(te.selector=X),te}),C="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let x=JB(f),S=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:S,url:m,title:g,textSummary:x,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:C,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var Bv,Hv,Wv=h(()=>{"use strict";hl();Bv=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Hv="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Kv(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 Ef(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Kv(t,s)))).filter(o=>o!==null)}async function ZB(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 _f(t,e,n){switch(e.kind){case"element_id":return ej(t,e,n);case"selector":return tj(t,e);case"semantic":return nj(t,e)}}async function ej(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 Ef(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function tj(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 Ef(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function nj(t,e){return e.role!==void 0?rj(t,e.text,e.role):oj(t,e.text,e)}async function rj(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 Ef(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function oj(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 ZB(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 y=p[g];if(y===void 0)continue;let w=await Kv(y.locator,y.index);if(w!==null){let E=`${w.role}:${w.label}:${g}`,_=0;for(let k=0;k<E.length;k++)_=_*31+E.charCodeAt(k)>>>0;f.push({...w,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Gv=h(()=>{"use strict"});async function Tf(t,e,n,r){let o=t.url();if(o===n)return null;let s=pl(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 qv=h(()=>{"use strict";fl()});import{randomBytes as sj}from"crypto";import{mkdir as ij,stat as aj,writeFile as lj}from"fs/promises";import{join as Af}from"path";import{gzip as cj}from"zlib";import{promisify as dj}from"util";function uj(t){return Af(Et(t),"browser")}function pj(t){return Af(uj(t),"screenshots")}function fj(){return new Date().toISOString().replace(/[:.]/g,"-")}function mj(){return sj(3).toString("hex")}async function Rf(t,e,n){if(e.length>zv)throw new Error(`writeScreenshotSidecar: buffer exceeds ${zv} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=pj(t);await ij(r,{recursive:!0});let o=`${fj()}-${mj()}-${n}.png`,s=Af(r,o);await lj(s,e);let{size:i}=await aj(s);return{path:s,bytes:i}}var see,zv,Vv=h(()=>{"use strict";j();hl();see=dj(cj);zv=5*1024*1024});var Yv={};Au(Yv,{PlaywrightProvider:()=>xf});function Jv(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 xf,Xv=h(()=>{"use strict";Fv();Wv();Gv();fl();qv();Vv();xf=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new gl(e)}async open(e){let n=pl(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 Tf(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 yl(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 yl(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 _f(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${Jv(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(y){c=y}else c=g}let u=await Tf(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 yl(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 _f(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${Jv(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 Rf(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 Rf(n,o,r);return s}catch{return null}}}});var tr={};Au(tr,{__resetBrowserRegistryForTests:()=>wj,browserProviderActive:()=>yj,closeBrowserProvider:()=>Cf,getBrowserProvider:()=>hj,peekBrowserProvider:()=>bj});function Qv(){Promise.resolve(Cf()).then(()=>{process.exit(130)})}function Zv(){Promise.resolve(Cf()).then(()=>{process.exit(143)})}function ek(){Ft=null}function gj(){bl||(process.on("SIGINT",Qv),process.on("SIGTERM",Zv),process.on("exit",ek),bl=!0)}function tk(){bl&&(process.removeListener("SIGINT",Qv),process.removeListener("SIGTERM",Zv),process.removeListener("exit",ek),bl=!1)}async function hj(t){return Ft!==null?Ft:(er!==null||(er=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(Xv(),Yv)),n=Pv(t),r=new e(n);return gj(),Ft=r,er=null,r})()),er)}async function Cf(){if(Ft===null)return;let t=Ft;Ft=null,er=null,tk(),await t.shutdown()}function yj(){return Ft!==null}function bj(){return Ft}function wj(){Ft=null,er=null,tk()}var Ft,er,bl,nr=h(()=>{"use strict";fl();Ft=null,er=null,bl=!1});async function nk(t,e){try{return await wv(t,e)}catch(n){return N("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Tj(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(nr(),tr));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function rk(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??Tj,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,l=null,c=null;try{let u=await ul(n,t,{headers:_j,signal:e.signal},o);l=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(Ej.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(kj.test(p)&&!vj.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await nk(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof bt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;c=u}if(!(s===null||s.textLength<200)&&s!==null){let u=mf({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ws(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ws(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ws(u.finalUrl,o);let p=await nk(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=mf({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof bt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${l??"error"}).`)}var vj,kj,Ej,_j,ok=h(()=>{"use strict";Sv();gf();wf();fe();vj=/(text\/html|application\/xhtml\+xml)/i,kj=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Ej=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,_j={"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 xj(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(Aj,{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),Rj),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=ne(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 sk(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?xj({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 ik(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
214
|
+
${lt(t,{headless:e,latched:n})}`,{cause:t})}var Ov,LB,NB,Mv,UB,kf=h(()=>{"use strict";Ov=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],LB="pnpm exec playwright install chromium",NB=4;UB="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 Zn from"node:fs";import ml from"node:path";import{randomBytes as BB}from"node:crypto";import{chromium as jB}from"playwright";function HB(){try{return"5.115.3"}catch{}try{let t=ml.resolve(import.meta.dirname,"../../../package.json"),e=Zn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var WB,gl,Fv=h(()=>{"use strict";kf();j();fe();WB=HB(),gl=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=jB.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=vf(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/${WB}`}}loadStorageState(e){let n=Fu(e);try{if(!Zn.existsSync(n))return;let r=JSON.parse(Zn.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Fu(e);if(!Zn.existsSync(r))return;let o=await n.storageState(),s=ml.join(ml.dirname(r),`.${ml.basename(r)}.${process.pid}.${BB(4).toString("hex")}.tmp`);Zn.writeFileSync(s,JSON.stringify(o),{mode:384}),Zn.chmodSync(s,384),Zn.renameSync(s,r),N("[browser/vault] saved session",{profile:e,file:r})}catch(r){N("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as KB}from"crypto";function Lv(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&GB.test(t.label))}function Nv(t){return KB("sha256").update(t,"utf8").digest("hex").slice(0,8)}function $v(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var GB,hl=h(()=>{"use strict";GB=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as qB}from"node:crypto";function zB(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function VB(t,e,n){return`el_${qB("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function JB(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Uv(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function jv(t,e){let n=t.role??"",r=t.name??"";Bv.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])jv(s,e)}async function YB(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},Hv).catch(()=>[])}async function XB(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},Hv).catch(()=>[])}function QB(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function yl(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=QB(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=YB(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]),y,w=!1;u!==null?(y=[],jv(u,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await XB(t)).filter($=>Bv.has($.role??"")));let E=new Map;for(let I of p){let $=Uv(I.name),V=E.get($);(!V||V.bbox.w===0&&I.bbox.w>0)&&E.set($,I)}let _=y.map(I=>({ax:I,dom:E.get(Uv(I.name??""))})),k=r?_:_.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,$)=>{let V=I.dom?.bbox.y??0,P=$.dom?.bbox.y??0;if(V!==P)return V-P;let B=I.dom?.bbox.x??0,L=$.dom?.bbox.x??0;return B-L}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=k.slice(0,n).map((I,$)=>{let V=I.ax.role??"generic",P=I.ax.name??"",B=VB(V,P,$),L=I.dom?.bbox??{x:0,y:0,w:0,h:0},M=I.dom?.type??null,F=null;I.ax.value!==void 0&&I.ax.value!==null&&(F=String(I.ax.value)),I.ax.checked!==void 0&&(F=String(I.ax.checked)),Lv({role:V,kind:M})&&(F="[redacted]");let H={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(H.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(H.selected=I.ax.selected),I.ax.expanded!==void 0&&(H.expanded=I.ax.expanded);let X;I.dom?.testId?X=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(X=`#${I.dom.id}`);let te={id:B,role:V,label:zB(P),kind:M,value:F,state:H,bbox:L};return X!==void 0&&(te.selector=X),te}),C="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?C="loading":I==="interactive"?C="navigating":C="idle"}catch{C="navigating"}C!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let x=JB(f),S=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:S,url:m,title:g,textSummary:x,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:C,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var Bv,Hv,Wv=h(()=>{"use strict";hl();Bv=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Hv="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Kv(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 Ef(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Kv(t,s)))).filter(o=>o!==null)}async function ZB(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 _f(t,e,n){switch(e.kind){case"element_id":return ej(t,e,n);case"selector":return tj(t,e);case"semantic":return nj(t,e)}}async function ej(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 Ef(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function tj(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 Ef(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function nj(t,e){return e.role!==void 0?rj(t,e.text,e.role):oj(t,e.text,e)}async function rj(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 Ef(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function oj(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 ZB(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 y=p[g];if(y===void 0)continue;let w=await Kv(y.locator,y.index);if(w!==null){let E=`${w.role}:${w.label}:${g}`,_=0;for(let k=0;k<E.length;k++)_=_*31+E.charCodeAt(k)>>>0;f.push({...w,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Gv=h(()=>{"use strict"});async function Tf(t,e,n,r){let o=t.url();if(o===n)return null;let s=pl(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 qv=h(()=>{"use strict";fl()});import{randomBytes as sj}from"crypto";import{mkdir as ij,stat as aj,writeFile as lj}from"fs/promises";import{join as Af}from"path";import{gzip as cj}from"zlib";import{promisify as dj}from"util";function uj(t){return Af(Et(t),"browser")}function pj(t){return Af(uj(t),"screenshots")}function fj(){return new Date().toISOString().replace(/[:.]/g,"-")}function mj(){return sj(3).toString("hex")}async function Rf(t,e,n){if(e.length>zv)throw new Error(`writeScreenshotSidecar: buffer exceeds ${zv} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=pj(t);await ij(r,{recursive:!0});let o=`${fj()}-${mj()}-${n}.png`,s=Af(r,o);await lj(s,e);let{size:i}=await aj(s);return{path:s,bytes:i}}var see,zv,Vv=h(()=>{"use strict";j();hl();see=dj(cj);zv=5*1024*1024});var Yv={};Au(Yv,{PlaywrightProvider:()=>xf});function Jv(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 xf,Xv=h(()=>{"use strict";Fv();Wv();Gv();fl();qv();Vv();xf=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new gl(e)}async open(e){let n=pl(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 Tf(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 yl(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 yl(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 _f(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${Jv(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(y){c=y}else c=g}let u=await Tf(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 yl(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 _f(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${Jv(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 Rf(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 Rf(n,o,r);return s}catch{return null}}}});var tr={};Au(tr,{__resetBrowserRegistryForTests:()=>wj,browserProviderActive:()=>yj,closeBrowserProvider:()=>Cf,getBrowserProvider:()=>hj,peekBrowserProvider:()=>bj});function Qv(){Promise.resolve(Cf()).then(()=>{process.exit(130)})}function Zv(){Promise.resolve(Cf()).then(()=>{process.exit(143)})}function ek(){Ft=null}function gj(){bl||(process.on("SIGINT",Qv),process.on("SIGTERM",Zv),process.on("exit",ek),bl=!0)}function tk(){bl&&(process.removeListener("SIGINT",Qv),process.removeListener("SIGTERM",Zv),process.removeListener("exit",ek),bl=!1)}async function hj(t){return Ft!==null?Ft:(er!==null||(er=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(Xv(),Yv)),n=Pv(t),r=new e(n);return gj(),Ft=r,er=null,r})()),er)}async function Cf(){if(Ft===null)return;let t=Ft;Ft=null,er=null,tk(),await t.shutdown()}function yj(){return Ft!==null}function bj(){return Ft}function wj(){Ft=null,er=null,tk()}var Ft,er,bl,nr=h(()=>{"use strict";fl();Ft=null,er=null,bl=!1});async function nk(t,e){try{return await wv(t,e)}catch(n){return N("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Tj(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(nr(),tr));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function rk(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??Tj,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,l=null,c=null;try{let u=await ul(n,t,{headers:_j,signal:e.signal},o);l=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(Ej.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(kj.test(p)&&!vj.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await nk(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof bt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;c=u}if(!(s===null||s.textLength<200)&&s!==null){let u=mf({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ws(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ws(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ws(u.finalUrl,o);let p=await nk(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=mf({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof bt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${l??"error"}).`)}var vj,kj,Ej,_j,ok=h(()=>{"use strict";Sv();gf();wf();fe();vj=/(text\/html|application\/xhtml\+xml)/i,kj=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Ej=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,_j={"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 xj(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(Aj,{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),Rj),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=ne(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 sk(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?xj({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 ik(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
215
215
|
|
|
216
216
|
(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(`
|
|
217
217
|
`).trimEnd()}var Aj,Rj,ak=h(()=>{"use strict";Mt();Aj="https://api.exa.ai/search",Rj=10});function wl(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var rr=h(()=>{"use strict";kf()});function Dj(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=Cj;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,Ij)}let a=Pj;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,Mj)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function If(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:qt(t,e),truncated:!0}}function Fj(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=Dj(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 bf(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 ul(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof bt?{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=If(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await rk(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=If(vv(p.markdown,p.advisory),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof bt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=je(p)&&!Sf(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Ss()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=sk({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:Oj,timeoutMs:i.timeoutMs,signal:a.signal}),f=If(ik(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 Cj,Ij,Pj,Mj,Oj,lk,ck=h(()=>{"use strict";ok();ak();wf();un();gf();rr();Cj=3e4,Ij=12e4,Pj=1e5,Mj=1e6,Oj=10;lk=Fj()});import{existsSync as uk,mkdirSync as Lj,readFileSync as Nj,renameSync as $j,unlinkSync as Uj,writeFileSync as Bj}from"node:fs";import{dirname as dk,join as jj}from"node:path";import{randomBytes as Hj}from"node:crypto";function Kr(t){let e=t??Pu();if(!uk(e))return[];try{let n=Nj(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 Sl(t,e){let n=e??Pu();Lj(dk(n),{recursive:!0});let r=jj(dk(n),`.schedules.json.${process.pid}.${Hj(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{Bj(r,o,"utf-8"),$j(r,n)}catch(s){try{uk(r)&&Uj(r)}catch{}throw s}}function pk(t,e){let n=Kr(e),r=n.map(l=>l.id),o=Wj(t.name),s=Kj(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),Sl(n,e),a}function fk(t,e){let n=Kr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(Sl(o,e),!0)}function mk(t,e){return Kr(e).find(n=>n.id===t)}function Wj(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Kj(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}var gk=h(()=>{"use strict";j()});import{existsSync as Gj,readFileSync as qj}from"node:fs";import{join as zj}from"node:path";async function vs(t,e,n){let r;try{let o=zj(Ey("default"),"port");if(!Gj(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=qj(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 Pf,hk=h(()=>{"use strict";j();Pf="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 Vj}from"node:fs";import{readFile as Jj}from"node:fs/promises";var yk,bk,wk,Sk,vk=h(()=>{"use strict";gk();j();hk();yk=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=pk({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 vs("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 vs("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:Pf}})}},bk=async(t,e)=>{let n=Kr();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})))}},wk=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=Ui();if(!Vj(s))return{content:JSON.stringify([])};let i;try{let c=await Jj(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
|
|
@@ -909,13 +909,13 @@ ${t}`:e:[{type:"text",text:e},...t]}var Ql,Z_=h(()=>{"use strict";wm();Sm();fe()
|
|
|
909
909
|
`);if(a.length>0&&a[a.length-1]===""&&a.pop(),a.length<=n)return r;let l=a.slice(a.length-n),c=a.length-l.length;return o=`${t}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`,await LK(o,l.join(`
|
|
910
910
|
`)+`
|
|
911
911
|
`,{mode:384}),await NK(o,t),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await $K(o)}catch{}return r}}var RT,xT,IT=h(()=>{"use strict";RT=5*1024*1024,xT=5e3});import{readdir as OT,stat as Am,rm as UK,writeFile as BK}from"node:fs/promises";import{join as cc}from"node:path";function MT(t,e){let n=Number.parseFloat(t??"");return Number.isFinite(n)&&n>0?n:e}async function GK(t){let e=0,n=0,r=async o=>{let s=await OT(o,{withFileTypes:!0});for(let i of s){let a=cc(o,i.name);if(i.isDirectory()){await r(a);continue}try{let l=await Am(a);n+=l.size,l.mtimeMs>e&&(e=l.mtimeMs)}catch{}}};if(await r(t),e===0)try{e=(await Am(t)).mtimeMs}catch{e=Date.now()}return{newestMtimeMs:e,bytes:n}}async function qK(t,e){try{let n=await Am(cc(t,DT));return e-n.mtimeMs<KK}catch{return!1}}async function FT(t={}){if(v.AFK_WITNESS_RETENTION_DISABLE==="1")return PT();let e=t.root??Co(),n=Date.now();try{if(t.force!==!0&&await qK(e,n))return PT();let r=MT(t.maxAgeDays?.toString()??v.AFK_WITNESS_MAX_AGE_DAYS,jK)*24*60*60*1e3,o=MT(t.maxBytes?.toString()??v.AFK_WITNESS_MAX_BYTES,HK),i=(await OT(e,{withFileTypes:!0})).filter(p=>p.isDirectory()&&p.name!==t.activeLabel),a=[];for(let p of i){let f=cc(e,p.name);try{a.push({label:p.name,path:f,...await GK(f)})}catch{}}a.sort((p,f)=>p.newestMtimeMs-f.newestMtimeMs);let l=a.filter(p=>n-p.newestMtimeMs>=WK),c=a.reduce((p,f)=>p+f.bytes,0),d=new Set;for(let p of l)n-p.newestMtimeMs>r&&d.add(p.label);for(let p of l){if(c<=o)break;if(d.has(p.label)){c-=p.bytes;continue}d.add(p.label),c-=p.bytes}let u={skipped:!1,scanned:a.length,evicted:0,freedBytes:0,evictedLabels:[]};for(let p of a)if(d.has(p.label))try{await UK(p.path,{recursive:!0,force:!0}),u.evicted+=1,u.freedBytes+=p.bytes,u.evictedLabels.push(p.label)}catch{}try{await BK(cc(e,DT),`${new Date(n).toISOString()}
|
|
912
|
-
`,{mode:384})}catch{}return u}catch{return{skipped:!1,scanned:0,evicted:0,freedBytes:0,evictedLabels:[]}}}var jK,HK,WK,KK,DT,PT,LT,NT=h(()=>{"use strict";U();j();jK=30,HK=2*1024*1024*1024,WK=3600*1e3,KK=360*60*1e3,DT=".last-sweep",PT=()=>({skipped:!0,scanned:0,evicted:0,freedBytes:0,evictedLabels:[]});LT=5e3});import{z as zK}from"zod";var cr,$T=h(()=>{"use strict";fe();bm();Q_();ue();Y();ye();Z_();Fe();km();Bn();rT();ue();dT();Em();wm();pT();fT();rt();Dn();zn();Ne();Sm();hT();yT();AT();j();IT();NT();cr=class
|
|
912
|
+
`,{mode:384})}catch{}return u}catch{return{skipped:!1,scanned:0,evicted:0,freedBytes:0,evictedLabels:[]}}}var jK,HK,WK,KK,DT,PT,LT,NT=h(()=>{"use strict";U();j();jK=30,HK=2*1024*1024*1024,WK=3600*1e3,KK=360*60*1e3,DT=".last-sweep",PT=()=>({skipped:!0,scanned:0,evicted:0,freedBytes:0,evictedLabels:[]});LT=5e3});import{z as zK}from"zod";var cr,$T=h(()=>{"use strict";fe();bm();Q_();ue();Y();ye();Z_();Fe();km();Bn();rT();ue();dT();Em();wm();pT();fT();rt();Dn();zn();Ne();Sm();hT();yT();AT();j();IT();NT();cr=class{ownedTraceWriter;config;planExit=new ac;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;inboundMessageCount=0;subagentOutputRecorder;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;ownsTraceSeal;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new ic;constructor(e,n){this.ownsTraceSeal=n!==void 0&&e.traceWriter===n,this.ownedTraceWriter=this.ownsTraceSeal?n:void 0,this.config=e.parentSessionId===void 0&&e.planExitControls===void 0?{...e,planExitControls:{setPermissionMode:o=>this.setPermissionMode(o),requestImplementSeed:(o,s)=>this.planExit.requestImplementSeed(o,s),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:e,this.abortController=new AbortController,this._hookRegistry=e.hookRegistry,mT(e.abortSignal,this.abortController,()=>{this.onAbort()});let r=String(e.model);G(e.traceWriter,{phase:"session_init_start",model:r,resolvedModel:Ee(e.model)??r,origin:rn(e.surface),actor:ta(e.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&(CT(Ki(),{maxBytes:RT,keepTailLines:xT}),setTimeout(()=>{FT({activeLabel:wr(this.config.traceWriter?.getTracePath())??void 0})},LT).unref())}initSdkLifecycle(){this.config.models&&ba(this.config.models),Xl(this.config);let e=Ee(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=gT(this.config,e);this.stateManager=new lc(n,r),this.inputStream=new Jr(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)N(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{N("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let i=this.config.providerFactory?this.config.providerFactory:a=>UT(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new Ql({prompt:o,config:this.config},{resolveProvider:i,providerNameForModel:a=>z(a),resolveApiKey:a=>ae(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{let e=await tT(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId,parentSessionId:this.config.parentSessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});for(e&&this.config.parentSessionId===void 0&&this.queueFrameworkContext(e);;){let n=await this.providerIterator.next();if(n.done){this.stateManager.resolveInitializationIfNeeded();return}let r=n.value,o=Tm(r,this.buildTransformDeps());if(r.type==="session.init"){await G(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(o&&o.type==="error"){this.sawProviderError=!0;return}}}catch(e){let n=e instanceof Error?e:new Error(String(e));n instanceof ee&&(this.hookBlocked=!0),this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{_successfulToolNames:[],conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:e=>this.stateManager.setSessionMetadata(e),updateSessionIdentity:e=>this.stateManager.updateSessionIdentity(e),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:e=>{this.lastResponseMetadata=e,typeof e.totalCostUsd=="number"&&Number.isFinite(e.totalCostUsd)&&(this.sessionRunningCostUsd+=e.totalCostUsd);let n=e.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let a=r[s];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[i]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof e.stopReason=="string"&&(this.lastStopReason=e.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:e=>{this.abortController.signal.aborted||this.abortController.abort(e)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(e){if(e==="closed"||e.startsWith("Budget ")||e.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${e}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(e)}async sendMessage(e,n={}){this.assertCanSend();let r=this.config.timeoutMs??eT,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(e)){if(a.type==="chunk"&&a.chunk.type==="content"&&(i+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(s=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(s)return{...s,metadata:a.metadata};if(i)return{role:"assistant",content:i,metadata:a.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await Zl(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async sendMessageStructured(e,n,r={}){let{maxRetries:o=2,injectSchemaPrompt:s=!0,...i}=r,a=s?"\n\nRespond with ONLY a JSON object (optionally in a ```json fence) that conforms to this JSON Schema:\n```json\n"+JSON.stringify(zK.toJSONSchema(n,{target:"openapi-3.0"}))+"\n```":"",l="";for(let c=0;c<=o;c++){let d=c===0?e+a:`Your previous response did not match the required JSON schema.
|
|
913
913
|
Validation error: ${l}
|
|
914
914
|
Respond again with ONLY a JSON object (optionally in a \`\`\`json fence) that satisfies the schema.`+a,u=await this.sendMessage(d,i),p=sc(u.content),f=n.safeParse(p);if(f.success)return f.data;l=f.error.message}throw new Error(`structured output did not match schema after ${o+1} attempt(s): ${l}`)}async*sendMessageStream(e){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(e)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(e){this.initPromise&&await this.initPromise,this.planExit.clearModeBeforeDefault();let n=this.withPendingFrameworkContext(e),r=typeof n=="string"?n:this.summarizeContentBlocks(n),o={role:"user",content:r,timestamp:new Date};this.conversationHistory.push(o),this.inputStream.pushUserMessage(n),this.ensureLedger(),this.ledger.recordUser(r);let s=++this.inboundMessageCount;z_({sessionId:wr(this.config.traceWriter?.getTracePath())??this.sessionId,subagentId:this.config.subagentId,isSubagentFork:this.config.isSubagentFork===!0,model:this.config.model===void 0?void 0:String(this.config.model),turn:s,prompt:r});let i=this.buildTransformDeps();this.subagentOutputRecorder===void 0&&(this.subagentOutputRecorder=X_({sessionId:wr(this.config.traceWriter?.getTracePath())??this.sessionId,subagentId:this.config.subagentId,isSubagentFork:this.config.isSubagentFork===!0,model:this.config.model===void 0?void 0:String(this.config.model)}));let a=this.subagentOutputRecorder;try{for(;;){let l=await this.providerIterator.next();if(l.done)break;let c=l.value,d=Tm(c,i);if(d&&(a?.observe(d),d.type==="done"?(this.turnCount++,this.sawProviderError=!1):d.type==="error"&&(this.sawProviderError=!0),this.ledger.recordEvent(d),yield d,d.type==="done"||d.type==="error"))break}a?.end("stream_complete")}finally{this.currentState==="streaming"&&(a?.end("aborted_or_incomplete"),this.currentState="idle")}}ensureLedger(){this.ledger.ensure({depth:this.config.depth,parentSessionId:this.config.parentSessionId,sessionId:this.sessionId,fallbackModel:String(this.config.model),tracePath:this.config.traceWriter?.getTracePath(),getMetadata:()=>this.getSessionMetadata()})}recordLedgerElicitation(e,n){this.ledger.recordElicitation(e,n)}summarizeContentBlocks(e){let n=[],r=0;for(let s of e)s.type==="text"?n.push(s.text):s.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new Je("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset"),await this.ledger.seal("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,vm))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(e){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async onAbort(){this.ledger.seal("abort");try{await this.providerQuery.interrupt(lp(this.abortController.signal.reason))}catch{}}async setModel(e){let n=Ee(e);typeof e=="string"&&e.length>0&&await this.providerQuery.setModel(e),n&&this.stateManager.setSessionMetadata(r=>({...r,model:n}))}async setPermissionMode(e){let n=this.stateManager.getSessionMetadata().permissionMode;this.planExit.recordModeTransition(e,n),await this.providerQuery.setPermissionMode(e),this.stateManager.setSessionMetadata(r=>({...r,permissionMode:e}))}getPrePlanMode(){return this.planExit.getPrePlanMode()}async takePendingPlanExitSeed(){let e=this.planExit.takeSeed();if(e!==void 0){try{await this.setPermissionMode(e.mode)}catch(n){N(`\u26A0\uFE0F AgentSession: deferred plan-exit mode flip to '${e.mode}' rejected; dropping implement-seed (staying in plan mode): ${n instanceof Error?n.message:String(n)}`);return}return{message:e.message,mode:e.mode}}}setSystemPrompt(e){return this.config={...this.config,systemPrompt:e},this.providerQuery.setSystemPrompt?.(e)??!1}setCwd(e){this.config={...this.config,cwd:e},this.providerQuery.setCwd?.(e),this.config.sessionId!==void 0&&Ew(this.config.sessionId,e)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(e,n){return this.providerQuery.rewindFiles(e,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let e=this.providerQuery.compact?.bind(this.providerQuery);if(!e)return{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0};this.currentState="compacting";try{return await e()}finally{this.currentState="idle"}}listRewindTargets(){return this.currentState==="closed"?[]:this.providerQuery.listRewindTargets?.()??[]}async rewindConversation(e){if(this.currentState==="closed")throw new Error("Cannot rewind: session is closed");if(this.currentState!=="idle")return{rewound:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let n=this.providerQuery.rewindConversation?.bind(this.providerQuery);return n?n(e):{rewound:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}queueFrameworkContext(e){let n=e.trim();n.length!==0&&(this.pendingFrameworkContext.push(n),N(`AgentSession: queued framework context (${n.length} chars) for the next user message`))}withPendingFrameworkContext(e){if(this.pendingFrameworkContext.length===0)return e;let n=this.pendingFrameworkContext.join(`
|
|
915
915
|
|
|
916
916
|
`);return this.pendingFrameworkContext=[],typeof e=="string"?`${n}
|
|
917
917
|
|
|
918
|
-
${e}`:[{type:"text",text:n},...e]}getInputStreamRef(){return{pushUserMessage:e=>this.inputStream.pushUserMessage(e),queueFrameworkContext:e=>this.queueFrameworkContext(e)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",await this.ledger.seal("close"),this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,vm))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(e){if(this.sessionEndDispatched)return;this.sessionEndDispatched=!0,this.config.drainSubagents!==void 0&&await this.config.drainSubagents(e).catch(()=>{});let n=this.closureSignals(e);await lT(this.config.traceWriter,{...n,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,runningTokens:this.sessionRunningTokens}).catch(()=>{}),this.ownsTraceSeal&&await cT(this.
|
|
918
|
+
${e}`:[{type:"text",text:n},...e]}getInputStreamRef(){return{pushUserMessage:e=>this.inputStream.pushUserMessage(e),queueFrameworkContext:e=>this.queueFrameworkContext(e)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",await this.ledger.seal("close"),this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,vm))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(e){if(this.sessionEndDispatched)return;this.sessionEndDispatched=!0,this.config.drainSubagents!==void 0&&await this.config.drainSubagents(e).catch(()=>{});let n=this.closureSignals(e);await lT(this.config.traceWriter,{...n,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,runningTokens:this.sessionRunningTokens}).catch(()=>{}),this.ownsTraceSeal&&await cT(this.ownedTraceWriter,{...n,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,subagentCompletedCount:this.subagentCompletedCount,subagentRunningTokens:this.subagentRunningTokens,subagentRunningCostUsd:this.subagentRunningCostUsd}).catch(()=>{}),await nT(this._hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:e,parentSessionId:this.config.parentSessionId,...this.config.traceWriter?{tracePath:this.config.traceWriter.getTracePath()}:{}},this.config.traceWriter&&!this.ownsTraceSeal?{traceWriter:this.config.traceWriter}:{})}closureSignals(e){return{dispatchReason:e,signal:this.abortController.signal,maxTurnsHit:this.maxTurnsHit,hookBlocked:this.hookBlocked,lastStopReason:this.lastStopReason,sawProviderError:this.sawProviderError}}recordSubagentCompletion(e,n){if(this.subagentCompletedCount++,e){let r=(o,s)=>{typeof o=="number"&&Number.isFinite(o)&&o>0&&(this.subagentRunningTokens[s]+=o)};r(e.inputTokens,"input"),r(e.outputTokens,"output"),r(e.cacheReadTokens,"cacheRead"),r(e.cacheCreationTokens,"cacheCreation")}typeof n=="number"&&Number.isFinite(n)&&n>0&&(this.subagentRunningCostUsd+=n)}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new Je("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming"||this.currentState==="compacting")throw new Error("Cannot send message: session is busy");if(this.config.maxTurns&&this.turnCount>=this.config.maxTurns)throw this.maxTurnsHit=!0,new Error(`Maximum turns (${this.config.maxTurns}) exceeded`)}}});var Rm=h(()=>{"use strict";$T()});import{AsyncLocalStorage as VK}from"node:async_hooks";function jT(t,e){return BT.run(t,e)}function St(){return BT.getStore()}var BT,dr=h(()=>{"use strict";BT=new VK});import{randomUUID as JK}from"node:crypto";import{promises as Ms}from"node:fs";import{join as YK,resolve as XK,sep as Cm}from"node:path";function Xr(t){let e=XK(t),n=e.indexOf(xm);if(n===-1)return;let o=e.slice(n+xm.length).split(Cm)[0];if(o)return e.slice(0,n+xm.length)+o}async function Im(t,e){let n=Xr(t);if(n===void 0||e?.()===!0)return;let r=YK(n,QK),o=`${r}.${process.pid}.${JK()}.tmp`;try{let s={};try{s=JSON.parse(await Ms.readFile(r,"utf-8"))}catch{s={owner:"agent"}}if(s.pid=process.pid,s.createdAt=new Date().toISOString(),await Ms.writeFile(o,JSON.stringify(s,null,2),"utf-8"),e?.()===!0){await Ms.rm(o,{force:!0}).catch(()=>{});return}await Ms.rename(o,r)}catch{await Ms.rm(o,{force:!0}).catch(()=>{})}}function HT(t,e=ZK){let n,r=!1,o=()=>{r=!0,n!==void 0&&(clearInterval(n),n=void 0)};return Xr(t)===void 0||(n=setInterval(()=>{Im(t,()=>r)},e),n.unref()),o}var QK,xm,ZK,Pm=h(()=>{"use strict";QK=".afk-worktree-meta.json",xm=`${Cm}.afk-worktrees${Cm}`,ZK=6e5});import{execFile as e1}from"node:child_process";import{promisify as t1}from"node:util";import yn from"node:path";function o1(t){let e=yn.resolve(t),n=`${yn.sep}.afk-worktrees${yn.sep}`,r=e.indexOf(n);if(!(r<=0))return e.slice(0,r)}async function WT(t,e=r1){if(!(t===void 0||t===""))try{let{stdout:n}=await e("git",["-C",t,"rev-parse","--git-common-dir","--show-toplevel"]),r=n.split(`
|
|
919
919
|
`).map(c=>c.trim()),o=r[0],s=r[1];if(!o||!s)return;let i=yn.isAbsolute(o)?o:yn.resolve(t,o),a=yn.resolve(yn.dirname(i)),l=yn.resolve(s);return a===l?void 0:a}catch(n){let r=o1(t);if(r!==void 0)return N(`[worktree-read-root] git rev-parse failed for cwd=${t}; recovered main root lexically as ${r} (afk worktree layout) \u2014 ${n instanceof Error?n.message:String(n)}`),r;N(`[worktree-read-root] git rev-parse failed for cwd=${t}; child confined to worktree only \u2014 ${n instanceof Error?n.message:String(n)}`);return}}var n1,r1,KT=h(()=>{"use strict";fe();n1=t1(e1),r1=(t,e)=>n1(t,e)});import bn from"path";function s1(t){let e=bn.resolve(t??process.cwd());return bn.parse(e).root||bn.sep}function wn(t,e){if(t!==void 0)return Os({parentReadRoots:t.parentReadRoots,parentCwd:t.parentCwd,childCwd:e})}function Os(t){let{parentReadRoots:e,parentCwd:n,childCwd:r,worktreeMainRoot:o,afkStateRoot:s,afkFrameworkRoot:i}=t,a=r!==void 0&&r!==""?bn.resolve(r):void 0;if(e===void 0&&n===void 0)return a!==void 0?[s1(a)]:void 0;let l=e??(n!==void 0?[n]:[]),c=new Set;a!==void 0&&c.add(a);for(let d of l)d!==void 0&&d!==""&&c.add(bn.resolve(d));if(o!==void 0&&o!==""&&c.add(bn.resolve(o)),s!==void 0&&s!==""&&c.add(bn.resolve(s)),i!==void 0&&i!==""&&c.add(bn.resolve(i)),c.size!==0&&!(c.size===1&&a!==void 0&&c.has(a)))return[...c]}var ur=h(()=>{"use strict"});function dc(t){return t?GT:d1}function uc(t){return t?p1:u1}var GT,i1,a1,l1,c1,d1,u1,p1,Mm=h(()=>{"use strict";GT=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
|
|
920
920
|
|
|
921
921
|
- Use read_file before editing to verify the exact content you want to change.
|
|
@@ -1444,7 +1444,7 @@ ${r}`}ye();Js();st();_t();Oe();ir();function bO(t){return ae(t)}function wO(t){l
|
|
|
1444
1444
|
`)){let o=r.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1)continue;let i=o.slice(0,s).trim(),a=o.slice(s+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),e.set(i,a)}}catch{}return e}function kO(t,e){if(t!=="TELEGRAM_BOT_TOKEN")return e;let n=e.indexOf(":");return n===-1?`${e.slice(0,4)}***`:`${e.slice(0,n+1)}***`}function EO(t,e=console.log){let n=xY(t);for(let r of RY){let o=n.get(r);if(o===void 0)continue;let s=process.env[r];s!==void 0&&s!==o&&e(`\u{1F527} ${r}: file value (${kO(r,o)}) overrides shell value (${kO(r,s)})`),process.env[r]=o}}U();cn();hs();function Kh(t){return t==="openai-compatible"||t==="openai-codex"}function _O(t,e={}){let{openaiApiKey:n=v.OPENAI_API_KEY,codexApiKey:r=v.CODEX_API_KEY,loadAnthropicCredential:o=tl,detectMode:s=_r}=e;if(Kh(t))return{kind:"openai",notices:[n||r?"\u{1F4DD} Using OPENAI_API_KEY / CODEX_API_KEY for OpenAI auth":"\u{1F4DD} Will attempt API key from ~/.codex/auth.json (run `afk provider auth diagnose` for details)"]};let i=o();if(!i||i.length===0)return{kind:"missing",errors:["\u274C Claude models require ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN."," Set one in your environment, run `afk login`, or sign in to Claude Code."]};let a=s(i)==="oauth"?"CLAUDE_CODE_OAUTH_TOKEN":"ANTHROPIC_API_KEY";return{kind:"anthropic",credential:i,envVar:a,notices:[a==="CLAUDE_CODE_OAUTH_TOKEN"?"\u{1F4DD} Using CLAUDE_CODE_OAUTH_TOKEN for Anthropic auth (OAuth, auto-refresh on 401)":"\u{1F4DD} Using ANTHROPIC_API_KEY for Anthropic auth"]}}function TO(t,e,n={}){let r=n.log??console.log,o=n.error??console.error;if(t.kind==="missing"){for(let s of t.errors)o(s);return!1}t.kind==="anthropic"&&(process.env[t.envVar]=t.credential,e.apiKey=t.credential);for(let s of t.notices)r(s);return!0}import{readFileSync as CY}from"fs";import{dirname as IY,join as PY}from"path";import{fileURLToPath as MY}from"url";var Ci="unknown",OY=["../package.json","../../package.json"];function du(t=IY(MY(import.meta.url)),e=n=>CY(n,"utf8")){for(let n of OY)try{let r=JSON.parse(e(PY(t,n)));if(typeof r.version=="string"&&r.version.length>0)return r.version}catch{}return Ci}ye();rt();Rm();U();j();import{randomUUID as c4}from"node:crypto";import{readFileSync as d4,existsSync as u4}from"node:fs";import{createHash as r4}from"crypto";import{appendFileSync as o4}from"fs";import{mkdir as s4,open as i4,writeFile as a4}from"fs/promises";import{join as HO}from"path";import{z as b}from"zod";var AO=["policy-refusal","timeout","budget","permission-denied","hook-block","abort","elicitation-declined","denial-breaker","repeat-failure","no-such-target"],RO=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined","no-such-target"]);var DY=b.object({phase:b.literal("started"),toolUseId:b.string(),name:b.string(),inputBytes:b.number().int().nonnegative(),subagentId:b.string().optional()}),xO=b.enum(AO),FY=b.object({phase:b.literal("completed"),toolUseId:b.string(),name:b.string(),resultBytes:b.number().int().nonnegative(),isError:b.boolean(),truncated:b.boolean(),durationMs:b.number().nonnegative(),incomplete:b.boolean().optional(),incompleteReason:b.string().optional(),circuitBreaker:b.boolean().optional(),failureClass:xO.optional(),batchIndex:b.number().int().positive().optional(),batchSize:b.number().int().positive().optional(),subagentId:b.string().optional()}),CO=b.discriminatedUnion("phase",[DY,FY]),LY=b.enum(["PreToolUse","PostToolUse","PostToolUseFailure","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),IO=b.object({hookEvent:LY,decision:b.union([b.literal("block"),b.literal("approve")]).optional(),reason:b.string().optional(),blockedTool:b.string().optional(),subagentId:b.string().optional(),injectedContextBytes:b.number().int().nonnegative().optional(),durationMs:b.number().nonnegative().optional(),approvalOutcome:b.enum(["carve-out","approved","denied","unrecognised","timeout","decline","cancel","hard-block"]).optional()}),NY=b.object({transition:b.literal("started"),subagentId:b.string(),parentId:b.string(),model:b.string(),allowedTools:b.array(b.string()).readonly().optional(),systemPromptHash:b.string().optional(),promptHead:b.string().optional(),agentType:b.string().optional(),resolvedAgentType:b.string().optional()}),$Y=b.object({transition:b.literal("succeeded"),subagentId:b.string(),durationMs:b.number().nonnegative(),turnCount:b.number().int().nonnegative(),totalCostUsd:b.number().nonnegative().optional(),outputBytes:b.number().int().nonnegative(),stopReason:b.string().optional()}),UY=b.object({transition:b.literal("failed"),subagentId:b.string(),errorClass:b.string(),errorMessage:b.string(),partialOutputBytes:b.number().int().nonnegative(),failureClass:xO.optional()}),BY=b.object({transition:b.literal("cancelled"),subagentId:b.string(),source:b.enum(["cascade","explicit"]),timeout:b.boolean().optional()}),PO=b.discriminatedUnion("transition",[NY,$Y,UY,BY]),jY=b.object({transition:b.literal("started"),jobId:b.string(),subagentId:b.string(),label:b.string(),model:b.string()}),HY=b.object({transition:b.literal("completed"),jobId:b.string(),subagentId:b.string(),durationMs:b.number().nonnegative(),outputBytes:b.number().int().nonnegative()}),WY=b.object({transition:b.literal("failed"),jobId:b.string(),subagentId:b.string(),durationMs:b.number().nonnegative(),errorClass:b.string(),errorMessage:b.string()}),KY=b.object({transition:b.literal("cancelled"),jobId:b.string(),subagentId:b.string(),source:b.enum(["explicit","cascade"])}),GY=b.object({transition:b.literal("joined"),jobId:b.string(),subagentId:b.string(),jobStatus:b.enum(["completed","failed","cancelled"])}),qY=b.object({transition:b.literal("delivered"),jobId:b.string(),subagentId:b.string(),jobStatus:b.enum(["completed","failed","cancelled"])}),MO=b.discriminatedUnion("transition",[jY,HY,WY,KY,GY,qY]),OO=b.object({kind:b.literal("monetary"),runningCostUsd:b.number().nonnegative(),maxBudgetUsd:b.number().nonnegative(),lastTurnCostUsd:b.number().nonnegative()}),zY=b.enum(["user_signal","cascade","timeout","budget","hook_block"]),DO=b.object({origin:zY,cascadedTo:b.array(b.string()).readonly(),reason:b.string().optional()}),FO=b.enum(["manual","token_threshold","turn_count"]),VY=b.object({path:b.string(),sizeBytes:b.number().int().nonnegative(),sha256:b.string().regex(/^[0-9a-f]{64}$/)}),JY=b.object({trigger:FO,preCompactionMessages:b.array(b.unknown()),summary:b.string(),keptTailCount:b.number().int().nonnegative(),keepLastNConfig:b.number().int().nonnegative(),messagesBefore:b.number().int().nonnegative(),messagesAfter:b.number().int().nonnegative(),tokensSavedEstimate:b.number().nonnegative().optional(),summarizationTokens:b.object({input:b.number().int().nonnegative(),output:b.number().int().nonnegative()}).optional()}),YY=b.object({trigger:FO,preCompactionMessagesRef:VY,summary:b.string(),keptTailCount:b.number().int().nonnegative(),keepLastNConfig:b.number().int().nonnegative(),messagesBefore:b.number().int().nonnegative(),messagesAfter:b.number().int().nonnegative(),tokensSavedEstimate:b.number().nonnegative().optional(),summarizationTokens:b.object({input:b.number().int().nonnegative(),output:b.number().int().nonnegative()}).optional()}),XY=b.enum(["model_end_turn","truncated","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),LO=b.object({reason:XY,finalTurnCount:b.number().int().nonnegative(),finalCostUsd:b.number().nonnegative(),finalTokens:b.object({input:b.number().int().nonnegative().optional(),output:b.number().int().nonnegative().optional(),cacheRead:b.number().int().nonnegative().optional(),cacheCreation:b.number().int().nonnegative().optional()}),lastStopReason:b.string().optional(),guidance:b.string().optional()}),NO=b.object({source:b.string(),assertion:b.string(),evidence:b.array(b.string()).readonly(),confidence:b.number().min(0).max(1),dissent:b.string().optional()}),QY=b.enum(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),ZY=b.enum(["click","fill","press","select","hover","scroll_to","wait_for"]),e4=b.object({kind:b.enum(["semantic","element_id","selector"]),text:b.string().max(80).optional(),role:b.string().optional(),elementId:b.string().optional(),selectorHash:b.string().regex(/^[0-9a-f]{8}$/).optional()}),$O=b.object({jobId:b.string(),subagentId:b.string(),byteLength:b.number().int().nonnegative()}),UO=b.object({tool:QY,action:ZY.optional(),toolUseId:b.string(),target:e4.optional(),urlBefore:b.string().nullable(),urlAfter:b.string().nullable(),status:b.enum(["ok","error","ambiguous_target","blocked_by_policy"]),screenshotPath:b.string().optional(),observationSummary:b.string().max(500).optional(),error:b.object({reason:b.string(),recoverable:b.boolean()}).optional(),durationMs:b.number().nonnegative()}),t4=b.enum(["bootstrap_start","bootstrap_done","session_init_start","session_init_done","mcp_connect_start","mcp_connect_done","mcp_server_start","mcp_server_done","loop_start","loop_end","model_ttfb","interrupt_halt","rate_limit","ttfb_timeout","usage_limit_pause","usage_limit_resume","overload_pause","overload_resume","idle_watchdog_fired","pause_extension_granted","suspected_loop","compaction_disabled","boot_warning"]),BO=b.object({phase:t4,durationMs:b.number().nonnegative().optional(),metadata:b.record(b.string(),b.union([b.string(),b.number(),b.boolean()])).optional(),model:b.string().optional(),resolvedModel:b.string().optional(),origin:b.enum(["cli","telegram","daemon","web","unknown"]).optional(),actor:b.enum(["main","subagent"]).optional()}),n4=b.object({status:b.enum(["succeeded","failed","cancelled"]),finalCostUsd:b.number().nonnegative(),finalTurnCount:b.number().int().nonnegative(),closedAt:b.string().datetime(),incomplete:b.boolean().optional(),subagentCount:b.number().int().nonnegative().optional(),subagentTokens:b.object({input:b.number().int().nonnegative().optional(),output:b.number().int().nonnegative().optional(),cacheRead:b.number().int().nonnegative().optional(),cacheCreation:b.number().int().nonnegative().optional()}).optional(),subagentCostUsd:b.number().nonnegative().optional()}),jO=b.discriminatedUnion("kind",[b.object({kind:b.literal("tool_call"),payload:CO}),b.object({kind:b.literal("hook_decision"),payload:IO}),b.object({kind:b.literal("subagent_lifecycle"),payload:PO}),b.object({kind:b.literal("background_agent"),payload:MO}),b.object({kind:b.literal("budget"),payload:OO}),b.object({kind:b.literal("abort"),payload:DO}),b.object({kind:b.literal("compaction"),payload:JY}),b.object({kind:b.literal("closure"),payload:LO}),b.object({kind:b.literal("claim"),payload:NO}),b.object({kind:b.literal("browser_event"),payload:UO}),b.object({kind:b.literal("queued_user_message"),payload:$O}),b.object({kind:b.literal("session_phase"),payload:BO})]),uTe=b.discriminatedUnion("kind",[b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("tool_call"),payload:CO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("hook_decision"),payload:IO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("subagent_lifecycle"),payload:PO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("background_agent"),payload:MO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("budget"),payload:OO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("abort"),payload:DO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("compaction"),payload:YY}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("closure"),payload:LO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("claim"),payload:NO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("browser_event"),payload:UO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("queued_user_message"),payload:$O}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("session_phase"),payload:BO}),b.object({ts:b.string().datetime(),seq:b.number().int().nonnegative(),kind:b.literal("session_sealed"),payload:n4})]);var uu=new Set,WO=!1;function l4(){WO||(WO=!0,process.on("exit",()=>{for(let t of uu)t.sealOnProcessExit()}))}var pu=class{traceDir;tracePath;seq;sealed=!1;sealRecordPersisted=!1;fh=null;writeQueue=Promise.resolve();constructor(e){this.traceDir=e.traceDir,this.tracePath=HO(this.traceDir,"trace.jsonl"),this.seq=e.startSeq??0}getTracePath(){return this.tracePath}async write(e){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return jO.parse(e),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(e);await this.appendLine(n)})}async seal(e){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{if(await this.ensureOpen(),this.sealRecordPersisted)return;let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:e};await this.appendLine(n),this.sealRecordPersisted=!0,this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(e){let n=this.writeQueue.then(e,e);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await s4(this.traceDir,{recursive:!0}),this.fh=await i4(this.tracePath,"a"),uu.add(this),l4())}async closeHandle(){if(uu.delete(this),!this.fh)return;let e=this.fh;this.fh=null,await e.close()}sealOnProcessExit(){if(this.sealRecordPersisted||this.seq===0)return;this.sealed=!0,uu.delete(this);try{let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:{status:"failed",finalCostUsd:0,finalTurnCount:0,closedAt:new Date().toISOString(),incomplete:!0}};o4(this.tracePath,`${JSON.stringify(n)}
|
|
1445
1445
|
`),this.sealRecordPersisted=!0}catch{}let e=this.fh;this.fh=null,e&&e.close().catch(()=>{})}async appendLine(e){if(!this.fh)throw new Error("NdjsonTraceWriter: file handle missing");await this.fh.appendFile(`${JSON.stringify(e)}
|
|
1446
1446
|
`)}async materializePersistedEvent(e){let n=new Date().toISOString(),r=this.seq++;if(e.kind==="compaction"){let o=await this.persistCompactionSidecar(e.payload,r,n);return{ts:n,seq:r,kind:"compaction",payload:o}}return{ts:n,seq:r,kind:e.kind,payload:e.payload}}async persistCompactionSidecar(e,n,r){let o=r.replace(/[:.]/g,"-"),s=HO(this.traceDir,`${String(n).padStart(6,"0")}-${o}-pre-compaction.json`),i=JSON.stringify(e.preCompactionMessages),a=Buffer.byteLength(i,"utf8"),l=r4("sha256").update(i).digest("hex");await a4(s,i,{encoding:"utf8",flag:"w"});let c={path:s,sizeBytes:a,sha256:l};return{trigger:e.trigger,preCompactionMessagesRef:c,summary:e.summary,keptTailCount:e.keptTailCount,keepLastNConfig:e.keepLastNConfig,messagesBefore:e.messagesBefore,messagesAfter:e.messagesAfter,...e.tokensSavedEstimate!==void 0?{tokensSavedEstimate:e.tokensSavedEstimate}:{},...e.summarizationTokens!==void 0?{summarizationTokens:e.summarizationTokens}:{}}}};function p4(t){if(!u4(t))return;let n=d4(t,"utf8").split(`
|
|
1447
|
-
`).filter(r=>r.trim().length>0);if(n.length!==0)try{let r=n[n.length-1]??"",s=JSON.parse(r).seq;return typeof s=="number"?s:void 0}catch{return}}function Gh(t={}){if(v.AFK_TRACE_DISABLED==="1")return null;let e=t.sessionLabel??c4(),n=Et(e),r=`${n}/trace.jsonl`,o=p4(r),s=new pu({traceDir:n,...o!==void 0?{startSeq:o+1}:{}});return{writer:s,tracePath:s.getTracePath(),sessionLabel:e}}function KO(t=Gh){return t()?.writer??null}function fu(t,e={}){let n="traceWriter"in e?e.traceWriter??null:(e.createTraceWriter??Gh)()?.writer??null,r=n?{traceWriter:n,...t,surface:"telegram"}:{...t,surface:"telegram"};return(e.newSession??(s=>new cr(s)))(r)}import{Client as ZO}from"@modelcontextprotocol/sdk/client/index.js";import{CallToolResultSchema as k4}from"@modelcontextprotocol/sdk/types.js";import{StreamableHTTPError as n0}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{UnauthorizedError as Xh}from"@modelcontextprotocol/sdk/client/auth.js";import{StdioClientTransport as m4}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as g4}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{SSEClientTransport as h4}from"@modelcontextprotocol/sdk/client/sse.js";var f4=/\$(\$)?\{([A-Z_][A-Z0-9_]*)\}/gi;function mu(t,e=process.env){let n=[];return{value:t.replace(f4,(o,s,i)=>{if(s==="$")return`\${${i}}`;let a=e[i];return a===void 0||a===""?(n.push(i),""):a}),missing:n}}function qh(t,e=process.env){if(t===void 0)return{value:{},missing:[]};let n={},r=new Set;for(let[o,s]of Object.entries(t)){let{value:i,missing:a}=mu(s,e);n[o]=i;for(let l of a)r.add(l)}return{value:n,missing:[...r]}}function y4(t){return t==="localhost"||t==="127.0.0.1"||t==="[::1]"||t==="::1"||t==="0.0.0.0"}function b4(){let t=["PATH","HOME","USER","USERNAME","LOGNAME","SHELL","TERM","TMPDIR","TEMP","TMP","LANG","LC_ALL","SYSTEMROOT","APPDATA","LOCALAPPDATA","PROGRAMDATA","PROGRAMFILES","NODE_PATH"],e={};for(let n of t){let r=process.env[n];typeof r=="string"&&(e[n]=r)}return e}function GO(t,e=process.env){if(t===void 0)return{headers:{},missing:[]};let n={},r=new Set;for(let[o,s]of Object.entries(t)){let{value:i,missing:a}=mu(s,e);if(a.length>0)for(let l of a)r.add(l);else n[o]=i}return{headers:n,missing:[...r]}}function gu(t,e,n){let r=e.type??(e.command?"stdio":"streamable-http");if(r==="stdio"){if(typeof e.command!="string"||e.command.length===0)throw new Error(`McpTransport(${t}): stdio requires \`command\``);let{value:o,missing:s}=qh(e.env);s.length>0&&console.warn(`[mcp:${t}] missing env vars (passing as empty): ${s.join(", ")}`);let i={command:e.command,...e.args?{args:e.args}:{},env:{...b4(),...o}};return{transport:new m4(i),isSSE:!1}}if(r==="streamable-http"||r==="sse"){if(typeof e.url!="string"||e.url.length===0)throw new Error(`McpTransport(${t}): ${r} requires \`url\``);let o=new URL(e.url);if(o.protocol!=="https:"&&!y4(o.hostname))throw new Error(`McpTransport(${t}): refusing ${r} URL ${o.protocol}//${o.hostname} \u2014 credentials and tool I/O would transit in plaintext. Use https:, or point the URL at localhost / 127.0.0.1.`);let{headers:s,missing:i}=GO(e.headers);return i.length>0&&console.warn(`[mcp:${t}] missing header vars (passing as omitted): ${i.join(", ")}`),r==="sse"?(process.stderr.write(`[mcp:${t}] WARNING: SSE transport is deprecated. Upgrade your MCP server to use streamable-HTTP.
|
|
1447
|
+
`).filter(r=>r.trim().length>0);if(n.length!==0)try{let r=n[n.length-1]??"",s=JSON.parse(r).seq;return typeof s=="number"?s:void 0}catch{return}}function Gh(t={}){if(v.AFK_TRACE_DISABLED==="1")return null;let e=t.sessionLabel??c4(),n=Et(e),r=`${n}/trace.jsonl`,o=p4(r),s=new pu({traceDir:n,...o!==void 0?{startSeq:o+1}:{}});return{writer:s,tracePath:s.getTracePath(),sessionLabel:e}}function KO(t=Gh){return t()?.writer??null}function fu(t,e={}){let n="traceWriter"in e?e.traceWriter??null:(e.createTraceWriter??Gh)()?.writer??null,r=n?{traceWriter:n,...t,surface:"telegram"}:{...t,surface:"telegram"};return(e.newSession??((s,i)=>new cr(s,i)))(r,t.traceWriter===void 0?n??void 0:void 0)}import{Client as ZO}from"@modelcontextprotocol/sdk/client/index.js";import{CallToolResultSchema as k4}from"@modelcontextprotocol/sdk/types.js";import{StreamableHTTPError as n0}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{UnauthorizedError as Xh}from"@modelcontextprotocol/sdk/client/auth.js";import{StdioClientTransport as m4}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as g4}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{SSEClientTransport as h4}from"@modelcontextprotocol/sdk/client/sse.js";var f4=/\$(\$)?\{([A-Z_][A-Z0-9_]*)\}/gi;function mu(t,e=process.env){let n=[];return{value:t.replace(f4,(o,s,i)=>{if(s==="$")return`\${${i}}`;let a=e[i];return a===void 0||a===""?(n.push(i),""):a}),missing:n}}function qh(t,e=process.env){if(t===void 0)return{value:{},missing:[]};let n={},r=new Set;for(let[o,s]of Object.entries(t)){let{value:i,missing:a}=mu(s,e);n[o]=i;for(let l of a)r.add(l)}return{value:n,missing:[...r]}}function y4(t){return t==="localhost"||t==="127.0.0.1"||t==="[::1]"||t==="::1"||t==="0.0.0.0"}function b4(){let t=["PATH","HOME","USER","USERNAME","LOGNAME","SHELL","TERM","TMPDIR","TEMP","TMP","LANG","LC_ALL","SYSTEMROOT","APPDATA","LOCALAPPDATA","PROGRAMDATA","PROGRAMFILES","NODE_PATH"],e={};for(let n of t){let r=process.env[n];typeof r=="string"&&(e[n]=r)}return e}function GO(t,e=process.env){if(t===void 0)return{headers:{},missing:[]};let n={},r=new Set;for(let[o,s]of Object.entries(t)){let{value:i,missing:a}=mu(s,e);if(a.length>0)for(let l of a)r.add(l);else n[o]=i}return{headers:n,missing:[...r]}}function gu(t,e,n){let r=e.type??(e.command?"stdio":"streamable-http");if(r==="stdio"){if(typeof e.command!="string"||e.command.length===0)throw new Error(`McpTransport(${t}): stdio requires \`command\``);let{value:o,missing:s}=qh(e.env);s.length>0&&console.warn(`[mcp:${t}] missing env vars (passing as empty): ${s.join(", ")}`);let i={command:e.command,...e.args?{args:e.args}:{},env:{...b4(),...o}};return{transport:new m4(i),isSSE:!1}}if(r==="streamable-http"||r==="sse"){if(typeof e.url!="string"||e.url.length===0)throw new Error(`McpTransport(${t}): ${r} requires \`url\``);let o=new URL(e.url);if(o.protocol!=="https:"&&!y4(o.hostname))throw new Error(`McpTransport(${t}): refusing ${r} URL ${o.protocol}//${o.hostname} \u2014 credentials and tool I/O would transit in plaintext. Use https:, or point the URL at localhost / 127.0.0.1.`);let{headers:s,missing:i}=GO(e.headers);return i.length>0&&console.warn(`[mcp:${t}] missing header vars (passing as omitted): ${i.join(", ")}`),r==="sse"?(process.stderr.write(`[mcp:${t}] WARNING: SSE transport is deprecated. Upgrade your MCP server to use streamable-HTTP.
|
|
1448
1448
|
`),{transport:new h4(o,{...Object.keys(s).length>0?{requestInit:{headers:s}}:{},...n?{authProvider:n}:{}}),isSSE:!0}):{transport:new g4(o,{...Object.keys(s).length>0?{requestInit:{headers:s}}:{},...n?{authProvider:n}:{}}),isSSE:!1}}throw new Error(`McpTransport(${t}): unknown transport type "${String(r)}"`)}j();import{existsSync as zh,mkdirSync as YO,readFileSync as Vh,writeFileSync as Jh}from"node:fs";import{execFileSync as qO}from"node:child_process";import{randomUUID as w4}from"node:crypto";import{homedir as zO,userInfo as VO}from"node:os";import{join as JO,dirname as XO}from"node:path";var BTe=600*1e3;function S4(){let t=process.platform==="darwin",e=process.platform==="linux";return{read(){if(t)try{return qO("security",["find-generic-password","-s","Claude Code-credentials","-a",VO().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()||void 0}catch{return}if(e){let n=JO(zO(),".claude",".credentials.json");if(!zh(n))return;try{return Vh(n,"utf-8")}catch{return}}},write(n){if(t)qO("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",VO().username,"-w",n],{stdio:["ignore","ignore","ignore"]});else if(e){let r=JO(zO(),".claude",".credentials.json");YO(XO(r),{recursive:!0}),Jh(r,n,{encoding:"utf-8",mode:384})}}}}function QO(t){let e=Vi();if(!zh(e))return;let n;try{n=JSON.parse(Vh(e,"utf-8"))}catch{return}t in n&&(delete n[t],Jh(e,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}))}function v4(t,e){let n=Vi();YO(XO(n),{recursive:!0});let r={};if(zh(n))try{r=JSON.parse(Vh(n,"utf-8"))}catch{}let o=new URL(e),s=o.origin+o.pathname;r[t]={status:"oauth_pending",authorizationUrl:s,timestamp:Date.now()},Jh(n,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384})}var Ii=class{serverName;backend;constructor(e,n=S4()){this.serverName=e,this.backend=n}get redirectUrl(){return"http://localhost:3000/oauth/callback"}get clientMetadata(){return{redirect_uris:[this.redirectUrl],client_name:"agent-afk",grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}clientInformation(){return this._readSlot().clientInfo}saveClientInformation(e){this._updateSlot(n=>({...n,clientInfo:e}))}tokens(){return this._readSlot().tokens}saveTokens(e){this._updateSlot(n=>({...n,tokens:e}));try{QO(this.serverName)}catch{}}saveCodeVerifier(e){this._updateSlot(n=>({...n,codeVerifier:e}))}codeVerifier(){let e=this._readSlot().codeVerifier;if(!e)throw new Error(`[mcp:${this.serverName}] no PKCE code verifier stored`);return e}state(){let e=this._readSlot().state;if(e)return e;let n=w4();return this._updateSlot(r=>({...r,state:n})),n}saveDiscoveryState(e){this._updateSlot(n=>({...n,discoveryState:e}))}discoveryState(){return this._readSlot().discoveryState}invalidateCredentials(e){this._updateSlot(n=>{if(e==="all")return{};let r={...n};return e==="client"&&delete r.clientInfo,e==="tokens"&&delete r.tokens,e==="verifier"&&(delete r.codeVerifier,delete r.state),e==="discovery"&&delete r.discoveryState,r})}async redirectToAuthorization(e){let n=e.toString(),r=`\u{1F510} MCP server "${this.serverName}" requires authorization.
|
|
1449
1449
|
|
|
1450
1450
|
Open this URL to authorize:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-afk",
|
|
3
|
-
"version": "5.115.
|
|
3
|
+
"version": "5.115.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",
|