agent-afk 5.110.2 → 5.110.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/cli.mjs +4 -4
- package/dist/index.mjs +3 -3
- package/dist/telegram.mjs +3 -3
- package/package.json +1 -1
package/dist/telegram.mjs
CHANGED
|
@@ -168,7 +168,7 @@ Subagents return their final assistant message verbatim \u2014 instruct them exp
|
|
|
168
168
|
|
|
169
169
|
Foreground vs. background: by default (mode="foreground") this tool waits for the subagent to finish and returns its final message. Pass mode="background" to fire-and-forget \u2014 the tool returns a jobId immediately so you can keep working in the same turn. When a background job finishes, its result is delivered automatically into your context with the next user message, wrapped in a <background-subagent-result> block; you do not need to poll or join. The \`/bgsub:join <jobId>\` slash command remains available for manual replay. Use background mode for long investigations the user does not need to wait on; use foreground for anything whose result you need to reason about in the same turn.
|
|
170
170
|
|
|
171
|
-
Do not use this tool for: trivial one-file edits, conversational answers, direct tool calls the user explicitly requested, or tasks where dispatch overhead exceeds the work.`,input_schema:{type:"object",properties:{prompt:{type:"string",description:"The task for the agent to perform."},attachments:{type:"array",items:{type:"string"},description:"Optional inbound image ids shown as [image img_xxxxxx \xB7 \u2026] or absolute image paths. Bytes are resolved by the runtime \u2014 NEVER paste base64 into the tool call."},model:{type:"string",description:"Model for the agent. Defaults to parent session model. Override per-call to right-size cost vs. capability \u2014 `haiku` (cheapest/fastest), `sonnet` (general-use), `opus` (most capable). Append `_1m` (e.g. `sonnet_1m`) for 1M-context variants. Full model IDs are also accepted."},max_turns:{type:"number",description:"Maximum conversation turns. Default 0 = unlimited (no ceiling) \u2014 omit to let the subagent run to natural completion. Set a positive integer to cap turns. A named agent (agent_type) may also set its own default via `maxTurns` frontmatter; an explicit value here overrides it."},max_tool_use_iterations:{type:"number",description:"Maximum tool-use rounds within the subagent's single turn \u2014 the anti-hang ceiling on a tool-call loop. Default 0 = unlimited. Set a positive integer to bound a runaway loop. When the cap is hit the subagent gets one final tools-stripped round to summarize what it gathered (no silent mid-loop stop). A named agent may set its own default via `maxToolUseIterations` frontmatter (explicit value here wins). Honored uniformly by both the anthropic-direct and openai-compatible providers."},id_prefix:{type:"string",description:"Label prefix for log correlation."},mode:{type:"string",enum:["foreground","background"],description:'Execution mode. "foreground" (default) waits for the subagent to finish and returns its output. "background" returns a jobId immediately and leaves the subagent running detached \u2014 its result is auto-delivered into this context with the next user message when it settles (/bgsub:join remains available for manual replay). Background jobs are cancelled when the parent session ends.'},cwd:{type:"string",description:"Optional absolute path for the subagent to run in. When omitted, the child inherits the parent's working directory (e.g. an `afk -w` worktree). When provided, the child's file/shell tools (bash, grep, glob, read_file, write_file, edit_file) anchor at this path instead. Use to dispatch a subagent into a pre-existing git worktree you created with the `worktree` tool (action \"create\" \u2014 preferred over raw `git worktree add`, which produces unmanaged ghost worktrees the background sweep may reap) so the subagent can work in isolation from the parent. Must be absolute (no relative paths) and must not contain `..` segments. Existence is not checked at dispatch time \u2014 a non-existent path surfaces as an error on the child's first cwd-relative tool call. Does not auto-propagate to further nested subagents \u2014 each `agent` call must specify `cwd` explicitly to operate in a worktree. To NOT set a cwd, omit the field entirely; a blank value is treated as omitted, never as a path. A filesystem root, your home directory, or an ancestor of it is refused; when the child only needs to READ files outside its tree, keep cwd and add readRoots instead of relocating cwd."},writeRoots:{type:"array",items:{type:"string"},description:'Optional extra write roots to pre-grant to the forked child. By default a fork can only write inside its cwd/worktree; out-of-root writes are auto-denied. Each entry must be an absolute path with no `..` segments. Composed WITH (never replaces) the child cwd. Mutually exclusive with isolation:"worktree".'},readRoots:{type:"array",items:{type:"string"},description:'Optional extra read roots to pre-grant to the forked child. Use when the task data lives OUTSIDE the repo \u2014 e.g. `~/Downloads`, a scratch data dir. Each entry must be an absolute path with no `..` segments (and not a filesystem root or your home dir). An entry may be a DIRECTORY or a single FILE \u2014 a file grants exactly that file, which is how to read home-root dotfiles (`~/.zshrc`, `~/.gitconfig`) given the home dir itself is refused; list the files rather than guessing at a directory that encloses them. Composed WITH (never replaces) the fork\'s inherited read scope, so the child keeps its repo/worktree/state reach AND gains the named dirs. Writes stay confined. Grandchildren must be re-granted (not inherited). Unlike writeRoots, NOT mutually exclusive with isolation:"worktree" \u2014 widening reads inside an isolated worktree is legitimate.'},isolation:{type:"string",enum:["none","worktree"],description:'Filesystem isolation for the subagent. "none" (default) runs the child in the parent\'s working tree. "worktree" creates a fresh afk-managed git worktree + branch under .afk-worktrees/ and runs the child there, so several parallel write-capable subagents (e.g. speculative fixes, refactor lanes) never corrupt each other\'s edits or test runs. The worktree is torn down when the child finishes; a dirty or commits-ahead tree is preserved and locked instead of removed, so work in progress is never destroyed (recover it via the `worktree` tool). Mutually exclusive with `cwd` (the runtime owns the child\'s cwd when isolating) \u2014 to isolate, omit `cwd` rather than blanking it. Ignored for read-only agents such as research-agent \u2014 they have nothing to isolate. Not supported together with mode:"background" in this release.'}},required:["prompt"]}},$n={name:"skill",category:"skill",concurrencySafe:!0,description:"Invoke a registered skill by name.
|
|
171
|
+
Do not use this tool for: trivial one-file edits, conversational answers, direct tool calls the user explicitly requested, or tasks where dispatch overhead exceeds the work.`,input_schema:{type:"object",properties:{prompt:{type:"string",description:"The task for the agent to perform."},attachments:{type:"array",items:{type:"string"},description:"Optional inbound image ids shown as [image img_xxxxxx \xB7 \u2026] or absolute image paths. Bytes are resolved by the runtime \u2014 NEVER paste base64 into the tool call."},model:{type:"string",description:"Model for the agent. Defaults to parent session model. Override per-call to right-size cost vs. capability \u2014 `haiku` (cheapest/fastest), `sonnet` (general-use), `opus` (most capable). Append `_1m` (e.g. `sonnet_1m`) for 1M-context variants. Full model IDs are also accepted."},max_turns:{type:"number",description:"Maximum conversation turns. Default 0 = unlimited (no ceiling) \u2014 omit to let the subagent run to natural completion. Set a positive integer to cap turns. A named agent (agent_type) may also set its own default via `maxTurns` frontmatter; an explicit value here overrides it."},max_tool_use_iterations:{type:"number",description:"Maximum tool-use rounds within the subagent's single turn \u2014 the anti-hang ceiling on a tool-call loop. Default 0 = unlimited. Set a positive integer to bound a runaway loop. When the cap is hit the subagent gets one final tools-stripped round to summarize what it gathered (no silent mid-loop stop). A named agent may set its own default via `maxToolUseIterations` frontmatter (explicit value here wins). Honored uniformly by both the anthropic-direct and openai-compatible providers."},id_prefix:{type:"string",description:"Label prefix for log correlation."},mode:{type:"string",enum:["foreground","background"],description:'Execution mode. "foreground" (default) waits for the subagent to finish and returns its output. "background" returns a jobId immediately and leaves the subagent running detached \u2014 its result is auto-delivered into this context with the next user message when it settles (/bgsub:join remains available for manual replay). Background jobs are cancelled when the parent session ends.'},cwd:{type:"string",description:"Optional absolute path for the subagent to run in. When omitted, the child inherits the parent's working directory (e.g. an `afk -w` worktree). When provided, the child's file/shell tools (bash, grep, glob, read_file, write_file, edit_file) anchor at this path instead. Use to dispatch a subagent into a pre-existing git worktree you created with the `worktree` tool (action \"create\" \u2014 preferred over raw `git worktree add`, which produces unmanaged ghost worktrees the background sweep may reap) so the subagent can work in isolation from the parent. Must be absolute (no relative paths) and must not contain `..` segments. Existence is not checked at dispatch time \u2014 a non-existent path surfaces as an error on the child's first cwd-relative tool call. Does not auto-propagate to further nested subagents \u2014 each `agent` call must specify `cwd` explicitly to operate in a worktree. To NOT set a cwd, omit the field entirely; a blank value is treated as omitted, never as a path. A filesystem root, your home directory, or an ancestor of it is refused; when the child only needs to READ files outside its tree, keep cwd and add readRoots instead of relocating cwd."},writeRoots:{type:"array",items:{type:"string"},description:'Optional extra write roots to pre-grant to the forked child. By default a fork can only write inside its cwd/worktree; out-of-root writes are auto-denied. Each entry must be an absolute path with no `..` segments. Composed WITH (never replaces) the child cwd. Mutually exclusive with isolation:"worktree".'},readRoots:{type:"array",items:{type:"string"},description:'Optional extra read roots to pre-grant to the forked child. Use when the task data lives OUTSIDE the repo \u2014 e.g. `~/Downloads`, a scratch data dir. Each entry must be an absolute path with no `..` segments (and not a filesystem root or your home dir). An entry may be a DIRECTORY or a single FILE \u2014 a file grants exactly that file, which is how to read home-root dotfiles (`~/.zshrc`, `~/.gitconfig`) given the home dir itself is refused; list the files rather than guessing at a directory that encloses them. Composed WITH (never replaces) the fork\'s inherited read scope, so the child keeps its repo/worktree/state reach AND gains the named dirs. Writes stay confined. Grandchildren must be re-granted (not inherited). Unlike writeRoots, NOT mutually exclusive with isolation:"worktree" \u2014 widening reads inside an isolated worktree is legitimate.'},isolation:{type:"string",enum:["none","worktree"],description:'Filesystem isolation for the subagent. "none" (default) runs the child in the parent\'s working tree. "worktree" creates a fresh afk-managed git worktree + branch under .afk-worktrees/ and runs the child there, so several parallel write-capable subagents (e.g. speculative fixes, refactor lanes) never corrupt each other\'s edits or test runs. The worktree is torn down when the child finishes; a dirty or commits-ahead tree is preserved and locked instead of removed, so work in progress is never destroyed (recover it via the `worktree` tool). Mutually exclusive with `cwd` (the runtime owns the child\'s cwd when isolating) \u2014 to isolate, omit `cwd` rather than blanking it. Ignored for read-only agents such as research-agent \u2014 they have nothing to isolate. Not supported together with mode:"background" in this release.'}},required:["prompt"]}},$n={name:"skill",category:"skill",concurrencySafe:!0,description:"Invoke a registered skill by name. A skill either forks an isolated subagent or loads its instructions into your current context for you to execute directly \u2014 the mode is fixed per-skill, not per-call. To run a skill N times in parallel with isolation, dispatch N subagents (via `agent` or `compose`) that each call `skill` once. Check the system prompt for the list of available skills and their descriptions.",input_schema:{type:"object",properties:{name:{type:"string",description:'Skill name (e.g., "mint", "diagnose", "shadow-verify").'},arguments:{type:"string",description:"Arguments to pass to the skill."}},required:["name"]}},Un={name:"compose",category:"dag",concurrencySafe:!0,description:`Execute multiple subagent tasks as a DAG (directed acyclic graph). Nodes with no dependencies run in parallel; nodes with edges wait for their upstream dependencies to complete. Use when you need to orchestrate independent or dependent subagent work in a single call \u2014 e.g., diagnose in parallel with a fix, or research \u2192 implement \u2192 verify as a pipeline.
|
|
172
172
|
|
|
173
173
|
Each node is a subagent task with its own prompt and optional model. Edges declare "from must finish before to starts." Omit edges entirely for pure parallel fan-out.
|
|
174
174
|
|
|
@@ -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 sU,ef=h(()=>{"use strict";sU=new Set(["script","style","noscript","template","svg"])});function lU(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 tv(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function cU(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 nv(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??lU,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(!aU.has(u.status)||d===o)return u;let p=cU(u,i)??tv(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=tv(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 aU,rv=h(()=>{"use strict";de();aU=new Set([429,502,503,504])});import{BlockList as dU,isIP as nf}from"node:net";import{lookup as uU}from"node:dns/promises";import{Agent as pU}from"undici";function sv(){let t=S.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function hU(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function tf(t){let e=nf(t);return e===0?!1:gU.check(t,e===4?"ipv4":"ipv6")}async function iv(t){return uU(t,{all:!0,verbatim:!0})}async function rf(t,e={}){if(e.allowPrivateHosts??sv())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=hU(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(nf(r)!==0)return tf(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??iv,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(tf(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function ls(t,e={}){let n=await rf(t,e);if(!n.allowed)throw new mt(n.reason)}async function el(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<=ov;i++){await ls(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??sv())?{dispatcher:yU}:{}},l=await nv(t,s,a,r.retry??{});if(!bU.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 mt(`too many redirects (>${ov}) starting from ${e}`)}var fU,mU,gU,mt,yU,ov,bU,of=h(()=>{"use strict";$();rv();fU=[["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]],mU=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],gU=(()=>{let t=new dU;for(let[e,n]of fU)t.addSubnet(e,n,"ipv4");for(let[e,n]of mU)t.addSubnet(e,n,"ipv6");return t})(),mt=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};yU=new pU({connect:{lookup(t,e,n){iv(t).then(r=>{let o=r.find(i=>tf(i.address));if(o!==void 0){n(new mt(`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,nf(s.address))},r=>n(r,"",0))}}});ov=20,bU=new Set([301,302,303,307,308])});import{readFileSync as wU}from"node:fs";import{join as SU}from"path";function vU(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function av(t,e){return vU(e).test(t)}function _U(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(kU.has(e))return!0;if(EU.has(e))return!1}return!1}function lv(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function AU(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 cv(t){let e=t===void 0||t.trim()===""?"default":t.trim();return vu(e),e}function TU(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function RU(t){try{return wU(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function xU(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=cv(e.defaultProfile)),n}function dv(t){let e=t?.env??S,n=t?.readFileSync??RU,r=t?.surface??e.AGENT_SURFACE,o=_U(e.AFK_BROWSER_HEADLESS,r),s=lv(e.AFK_BROWSER_ALLOWED_DOMAINS),i=lv(e.AFK_BROWSER_BLOCKED_DOMAINS),a=TU(e.AFK_BROWSER_DOM_SNAPSHOTS),l=AU(e.AFK_BROWSER_BACKEND),c=cv(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():SU(Dt(),"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=xU(d,m);return g.configPath=p,g}function tl(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(av(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>av(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var kU,EU,nl=h(()=>{"use strict";$();B();kU=new Set(["daemon","subagent","telegram","afk"]),EU=new Set(["repl","interactive","cli"])});import{existsSync as CU,readFileSync as PU}from"node:fs";import{createRequire as IU}from"node:module";import{dirname as MU,join as OU}from"node:path";function fv(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<FU&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function $e(t){let e=fv(t);return pv.some(n=>e.includes(n))}function LU(){try{let e=IU(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(PU(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=OU(MU(e),o);return CU(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function cs(){return uv??=LU()??DU,uv}function sf(t){return t.includes("install chromium")}function st(t,e){let n=fv(t),r=e?.latched===!0?` ${NU}`:"";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: ${cs()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${cs()}). Or pick a different tool.${r}`}function af(t,e,n=!1){if(!$e(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
|
|
213
213
|
|
|
214
|
-
${st(t,{headless:e,latched:n})}`,{cause:t})}var pv,DU,FU,uv,NU,lf=h(()=>{"use strict";pv=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],DU="pnpm exec playwright install chromium",FU=4;NU="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 qn from"node:fs";import rl from"node:path";import{randomBytes as $U}from"node:crypto";import{chromium as UU}from"playwright";function BU(){try{return"5.110.2"}catch{}try{let t=rl.resolve(import.meta.dirname,"../../../package.json"),e=qn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var jU,ol,mv=h(()=>{"use strict";lf();B();de();jU=BU(),ol=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=UU.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=af(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/${jU}`}}loadStorageState(e){let n=ku(e);try{if(!qn.existsSync(n))return;let r=JSON.parse(qn.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=ku(e);if(!qn.existsSync(r))return;let o=await n.storageState(),s=rl.join(rl.dirname(r),`.${rl.basename(r)}.${process.pid}.${$U(4).toString("hex")}.tmp`);qn.writeFileSync(s,JSON.stringify(o),{mode:384}),qn.chmodSync(s,384),qn.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 HU}from"crypto";function gv(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&WU.test(t.label))}function hv(t){return HU("sha256").update(t,"utf8").digest("hex").slice(0,8)}function yv(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var WU,sl=h(()=>{"use strict";WU=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as KU}from"node:crypto";function GU(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function qU(t,e,n){return`el_${KU("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function zU(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function bv(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Sv(t,e){let n=t.role??"",r=t.name??"";wv.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Sv(s,e)}async function VU(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},vv).catch(()=>[])}async function JU(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},vv).catch(()=>[])}function YU(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function il(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=YU(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=VU(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=[],Sv(u,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await JU(t)).filter(U=>wv.has(U.role??"")));let k=new Map;for(let P of p){let U=bv(P.name),J=k.get(U);(!J||J.bbox.w===0&&P.bbox.w>0)&&k.set(U,P)}let A=y.map(P=>({ax:P,dom:k.get(bv(P.name??""))})),E=r?A:A.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,U)=>{let J=P.dom?.bbox.y??0,I=U.dom?.bbox.y??0;if(J!==I)return J-I;let j=P.dom?.bbox.x??0,L=U.dom?.bbox.x??0;return j-L}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=E.slice(0,n).map((P,U)=>{let J=P.ax.role??"generic",I=P.ax.name??"",j=qU(J,I,U),L=P.dom?.bbox??{x:0,y:0,w:0,h:0},M=P.dom?.type??null,F=null;P.ax.value!==void 0&&P.ax.value!==null&&(F=String(P.ax.value)),P.ax.checked!==void 0&&(F=String(P.ax.checked)),gv({role:J,kind:M})&&(F="[redacted]");let H={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(H.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(H.selected=P.ax.selected),P.ax.expanded!==void 0&&(H.expanded=P.ax.expanded);let X;P.dom?.testId?X=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(X=`#${P.dom.id}`);let ee={id:j,role:J,label:GU(I),kind:M,value:F,state:H,bbox:L};return X!==void 0&&(ee.selector=X),ee}),C="idle";try{let P=await t.evaluate(()=>document.readyState);P==="loading"?C="loading":P==="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=zU(f),v=`obs_${e.observationCounter.toString(36)}`,R=new Date().toISOString();return{observationId:v,url:m,title:g,textSummary:x,interactive:_,status:{httpStatus:e.httpStatus??null,loadingState:C,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:R}}var wv,vv,kv=h(()=>{"use strict";sl();wv=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);vv="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Ev(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 cf(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Ev(t,s)))).filter(o=>o!==null)}async function XU(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 df(t,e,n){switch(e.kind){case"element_id":return QU(t,e,n);case"selector":return ZU(t,e);case"semantic":return eB(t,e)}}async function QU(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 cf(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function ZU(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 cf(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function eB(t,e){return e.role!==void 0?tB(t,e.text,e.role):nB(t,e.text,e)}async function tB(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 cf(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function nB(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 XU(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 Ev(y.locator,y.index);if(w!==null){let k=`${w.role}:${w.label}:${g}`,A=0;for(let E=0;E<k.length;E++)A=A*31+k.charCodeAt(E)>>>0;f.push({...w,id:`el_${A.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var _v=h(()=>{"use strict"});async function uf(t,e,n,r){let o=t.url();if(o===n)return null;let s=tl(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 Av=h(()=>{"use strict";nl()});import{randomBytes as rB}from"crypto";import{mkdir as oB,stat as sB,writeFile as iB}from"fs/promises";import{join as pf}from"path";import{gzip as aB}from"zlib";import{promisify as lB}from"util";function cB(t){return pf(En(t),"browser")}function dB(t){return pf(cB(t),"screenshots")}function uB(){return new Date().toISOString().replace(/[:.]/g,"-")}function pB(){return rB(3).toString("hex")}async function ff(t,e,n){if(e.length>Tv)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Tv} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=dB(t);await oB(r,{recursive:!0});let o=`${uB()}-${pB()}-${n}.png`,s=pf(r,o);await iB(s,e);let{size:i}=await sB(s);return{path:s,bytes:i}}var O7,Tv,Rv=h(()=>{"use strict";B();sl();O7=lB(aB);Tv=5*1024*1024});var Cv={};fu(Cv,{PlaywrightProvider:()=>mf});function xv(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 mf,Pv=h(()=>{"use strict";mv();kv();_v();nl();Av();Rv();mf=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new ol(e)}async open(e){let n=tl(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 uf(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 il(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 il(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 df(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${xv(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 uf(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 il(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 df(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${xv(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 ff(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 ff(n,o,r);return s}catch{return null}}}});var Vn={};fu(Vn,{__resetBrowserRegistryForTests:()=>yB,browserProviderActive:()=>gB,closeBrowserProvider:()=>gf,getBrowserProvider:()=>mB,peekBrowserProvider:()=>hB});function Iv(){Promise.resolve(gf()).then(()=>{process.exit(130)})}function Mv(){Promise.resolve(gf()).then(()=>{process.exit(143)})}function Ov(){xt=null}function fB(){al||(process.on("SIGINT",Iv),process.on("SIGTERM",Mv),process.on("exit",Ov),al=!0)}function Dv(){al&&(process.removeListener("SIGINT",Iv),process.removeListener("SIGTERM",Mv),process.removeListener("exit",Ov),al=!1)}async function mB(t){return xt!==null?xt:(zn!==null||(zn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(Pv(),Cv)),n=dv(t),r=new e(n);return fB(),xt=r,zn=null,r})()),zn)}async function gf(){if(xt===null)return;let t=xt;xt=null,zn=null,Dv(),await t.shutdown()}function gB(){return xt!==null}function hB(){return xt}function yB(){xt=null,zn=null,Dv()}var xt,zn,al,Jn=h(()=>{"use strict";nl();xt=null,zn=null,al=!1});async function Fv(t,e){try{return await QS(t,e)}catch(n){return N("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function EB(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Jn(),Vn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function Lv(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??EB,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,l=null,c=null;try{let u=await el(n,t,{headers:kB,signal:e.signal},o);l=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(vB.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(SB.test(p)&&!wB.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await Fv(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof mt||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=Zp({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ls(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ls(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ls(u.finalUrl,o);let p=await Fv(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=Zp({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 mt)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 wB,SB,vB,kB,Nv=h(()=>{"use strict";ZS();ef();of();de();wB=/(text\/html|application\/xhtml\+xml)/i,SB=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,vB=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,kB={"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 TB(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(_B,{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),AB),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=ke(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 $v(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?TB({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 Uv(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
214
|
+
${st(t,{headless:e,latched:n})}`,{cause:t})}var pv,DU,FU,uv,NU,lf=h(()=>{"use strict";pv=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],DU="pnpm exec playwright install chromium",FU=4;NU="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 qn from"node:fs";import rl from"node:path";import{randomBytes as $U}from"node:crypto";import{chromium as UU}from"playwright";function BU(){try{return"5.110.3"}catch{}try{let t=rl.resolve(import.meta.dirname,"../../../package.json"),e=qn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var jU,ol,mv=h(()=>{"use strict";lf();B();de();jU=BU(),ol=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=UU.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=af(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/${jU}`}}loadStorageState(e){let n=ku(e);try{if(!qn.existsSync(n))return;let r=JSON.parse(qn.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=ku(e);if(!qn.existsSync(r))return;let o=await n.storageState(),s=rl.join(rl.dirname(r),`.${rl.basename(r)}.${process.pid}.${$U(4).toString("hex")}.tmp`);qn.writeFileSync(s,JSON.stringify(o),{mode:384}),qn.chmodSync(s,384),qn.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 HU}from"crypto";function gv(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&WU.test(t.label))}function hv(t){return HU("sha256").update(t,"utf8").digest("hex").slice(0,8)}function yv(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var WU,sl=h(()=>{"use strict";WU=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as KU}from"node:crypto";function GU(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function qU(t,e,n){return`el_${KU("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function zU(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function bv(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Sv(t,e){let n=t.role??"",r=t.name??"";wv.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Sv(s,e)}async function VU(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},vv).catch(()=>[])}async function JU(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},vv).catch(()=>[])}function YU(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function il(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=YU(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=VU(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=[],Sv(u,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await JU(t)).filter(U=>wv.has(U.role??"")));let k=new Map;for(let P of p){let U=bv(P.name),J=k.get(U);(!J||J.bbox.w===0&&P.bbox.w>0)&&k.set(U,P)}let A=y.map(P=>({ax:P,dom:k.get(bv(P.name??""))})),E=r?A:A.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,U)=>{let J=P.dom?.bbox.y??0,I=U.dom?.bbox.y??0;if(J!==I)return J-I;let j=P.dom?.bbox.x??0,L=U.dom?.bbox.x??0;return j-L}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=E.slice(0,n).map((P,U)=>{let J=P.ax.role??"generic",I=P.ax.name??"",j=qU(J,I,U),L=P.dom?.bbox??{x:0,y:0,w:0,h:0},M=P.dom?.type??null,F=null;P.ax.value!==void 0&&P.ax.value!==null&&(F=String(P.ax.value)),P.ax.checked!==void 0&&(F=String(P.ax.checked)),gv({role:J,kind:M})&&(F="[redacted]");let H={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(H.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(H.selected=P.ax.selected),P.ax.expanded!==void 0&&(H.expanded=P.ax.expanded);let X;P.dom?.testId?X=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(X=`#${P.dom.id}`);let ee={id:j,role:J,label:GU(I),kind:M,value:F,state:H,bbox:L};return X!==void 0&&(ee.selector=X),ee}),C="idle";try{let P=await t.evaluate(()=>document.readyState);P==="loading"?C="loading":P==="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=zU(f),v=`obs_${e.observationCounter.toString(36)}`,R=new Date().toISOString();return{observationId:v,url:m,title:g,textSummary:x,interactive:_,status:{httpStatus:e.httpStatus??null,loadingState:C,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:R}}var wv,vv,kv=h(()=>{"use strict";sl();wv=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);vv="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Ev(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 cf(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Ev(t,s)))).filter(o=>o!==null)}async function XU(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 df(t,e,n){switch(e.kind){case"element_id":return QU(t,e,n);case"selector":return ZU(t,e);case"semantic":return eB(t,e)}}async function QU(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 cf(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function ZU(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 cf(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function eB(t,e){return e.role!==void 0?tB(t,e.text,e.role):nB(t,e.text,e)}async function tB(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 cf(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function nB(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 XU(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 Ev(y.locator,y.index);if(w!==null){let k=`${w.role}:${w.label}:${g}`,A=0;for(let E=0;E<k.length;E++)A=A*31+k.charCodeAt(E)>>>0;f.push({...w,id:`el_${A.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var _v=h(()=>{"use strict"});async function uf(t,e,n,r){let o=t.url();if(o===n)return null;let s=tl(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 Av=h(()=>{"use strict";nl()});import{randomBytes as rB}from"crypto";import{mkdir as oB,stat as sB,writeFile as iB}from"fs/promises";import{join as pf}from"path";import{gzip as aB}from"zlib";import{promisify as lB}from"util";function cB(t){return pf(En(t),"browser")}function dB(t){return pf(cB(t),"screenshots")}function uB(){return new Date().toISOString().replace(/[:.]/g,"-")}function pB(){return rB(3).toString("hex")}async function ff(t,e,n){if(e.length>Tv)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Tv} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=dB(t);await oB(r,{recursive:!0});let o=`${uB()}-${pB()}-${n}.png`,s=pf(r,o);await iB(s,e);let{size:i}=await sB(s);return{path:s,bytes:i}}var O7,Tv,Rv=h(()=>{"use strict";B();sl();O7=lB(aB);Tv=5*1024*1024});var Cv={};fu(Cv,{PlaywrightProvider:()=>mf});function xv(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 mf,Pv=h(()=>{"use strict";mv();kv();_v();nl();Av();Rv();mf=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new ol(e)}async open(e){let n=tl(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 uf(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 il(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 il(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 df(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${xv(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 uf(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 il(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 df(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${xv(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 ff(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 ff(n,o,r);return s}catch{return null}}}});var Vn={};fu(Vn,{__resetBrowserRegistryForTests:()=>yB,browserProviderActive:()=>gB,closeBrowserProvider:()=>gf,getBrowserProvider:()=>mB,peekBrowserProvider:()=>hB});function Iv(){Promise.resolve(gf()).then(()=>{process.exit(130)})}function Mv(){Promise.resolve(gf()).then(()=>{process.exit(143)})}function Ov(){xt=null}function fB(){al||(process.on("SIGINT",Iv),process.on("SIGTERM",Mv),process.on("exit",Ov),al=!0)}function Dv(){al&&(process.removeListener("SIGINT",Iv),process.removeListener("SIGTERM",Mv),process.removeListener("exit",Ov),al=!1)}async function mB(t){return xt!==null?xt:(zn!==null||(zn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(Pv(),Cv)),n=dv(t),r=new e(n);return fB(),xt=r,zn=null,r})()),zn)}async function gf(){if(xt===null)return;let t=xt;xt=null,zn=null,Dv(),await t.shutdown()}function gB(){return xt!==null}function hB(){return xt}function yB(){xt=null,zn=null,Dv()}var xt,zn,al,Jn=h(()=>{"use strict";nl();xt=null,zn=null,al=!1});async function Fv(t,e){try{return await QS(t,e)}catch(n){return N("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function EB(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Jn(),Vn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function Lv(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??EB,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,l=null,c=null;try{let u=await el(n,t,{headers:kB,signal:e.signal},o);l=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(vB.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(SB.test(p)&&!wB.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await Fv(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof mt||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=Zp({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ls(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ls(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ls(u.finalUrl,o);let p=await Fv(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=Zp({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 mt)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 wB,SB,vB,kB,Nv=h(()=>{"use strict";ZS();ef();of();de();wB=/(text\/html|application\/xhtml\+xml)/i,SB=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,vB=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,kB={"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 TB(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(_B,{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),AB),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=ke(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 $v(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?TB({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 Uv(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 _B,AB,Bv=h(()=>{"use strict";Ut();_B="https://api.exa.ai/search",AB=10});function ll(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 Yn=h(()=>{"use strict";lf()});function MB(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=RB;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,xB)}let a=CB;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,PB)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function hf(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:Nt(t,e),truncated:!0}}function OB(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=MB(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 rf(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 el(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof mt?{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=hf(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await Lv(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=hf(ev(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 mt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=$e(p)&&!sf(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${cs()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=$v({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:IB,timeoutMs:i.timeoutMs,signal:a.signal}),f=hf(Uv(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 RB,xB,CB,PB,IB,jv,Hv=h(()=>{"use strict";Nv();Bv();of();tn();ef();Yn();RB=3e4,xB=12e4,CB=1e5,PB=1e6,IB=10;jv=OB()});import{existsSync as Kv,mkdirSync as DB,readFileSync as FB,renameSync as LB,unlinkSync as NB,writeFileSync as $B}from"node:fs";import{dirname as Wv,join as UB}from"node:path";import{randomBytes as BB}from"node:crypto";function Dr(t){let e=t??bu();if(!Kv(e))return[];try{let n=FB(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 cl(t,e){let n=e??bu();DB(Wv(n),{recursive:!0});let r=UB(Wv(n),`.schedules.json.${process.pid}.${BB(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{$B(r,o,"utf-8"),LB(r,n)}catch(s){try{Kv(r)&&NB(r)}catch{}throw s}}function Gv(t,e){let n=Dr(e),r=n.map(l=>l.id),o=jB(t.name),s=HB(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),cl(n,e),a}function qv(t,e){let n=Dr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(cl(o,e),!0)}function zv(t,e){return Dr(e).find(n=>n.id===t)}function jB(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function HB(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}var Vv=h(()=>{"use strict";B()});import{existsSync as WB,readFileSync as KB}from"node:fs";import{join as GB}from"node:path";async function ds(t,e,n){let r;try{let o=GB(ay("default"),"port");if(!WB(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=KB(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 yf,Jv=h(()=>{"use strict";B();yf="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 qB}from"node:fs";import{readFile as zB}from"node:fs/promises";var Yv,Xv,Qv,Zv,ek=h(()=>{"use strict";Vv();B();Jv();Yv=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=Gv({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 ds("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 ds("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:yf}})}},Xv=async(t,e)=>{let n=Dr();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})))}},Qv=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=Ri();if(!qB(s))return{content:JSON.stringify([])};let i;try{let c=await zB(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
|
|
@@ -1181,7 +1181,7 @@ ${e}`:s,a=new Q({parentAbortSignal:n?.abortSignal,...r?.traceWriter!==void 0?{tr
|
|
|
1181
1181
|
`);continue}let m=[...a,f].join(":"),g=eg(u,e);if(!g.body)try{let y=Fc(Rq(u,"utf-8"));y.startsWith(`---
|
|
1182
1182
|
`)||(g.body=y.trim())}catch{continue}if(!g.body||g.body.length===0){S.AFK_DEBUG&&process.stderr.write(`[afk] skipping command with empty body: ${ke(u)}
|
|
1183
1183
|
`);continue}o.push({...g,name:m,origin:"command"})}}return s(n,[],0),o.sort((i,a)=>i.name<a.name?-1:i.name>a.name?1:0),o}var Iq,Mq,Kx=h(()=>{"use strict";Qr();Qm();$();Ut();Iq=10,Mq=/[\u0000-\u001F\u007F-\u009F]/});import{existsSync as Oq,readFileSync as Dq}from"fs";import{join as Fq}from"path";function Gx(t){let e=Fq(t,".claude-plugin","plugin.json");if(!Oq(e))return{name:null,version:null};try{let n=JSON.parse(Dq(e,"utf8"));return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():null,version:typeof n.version=="string"&&n.version.trim()?n.version.trim():null}}catch{return{name:null,version:null}}}var qx=h(()=>{"use strict"});import{z as O}from"zod";var Js,Lq,Nq,jg,zx,Vx,Jx,Yx,Ys,pd=h(()=>{"use strict";Js=1,Lq=O.object({toolName:O.string(),toolUseId:O.string().optional(),input:O.string().optional(),inputRaw:O.string().optional(),result:O.string().optional(),isError:O.boolean().optional()}).passthrough(),Nq=O.object({user:O.string().default(""),assistant:O.string().default(""),timestamp:O.number().optional(),toolEvents:O.array(Lq).optional()}).passthrough(),jg=O.object({sessionId:O.string().optional(),name:O.string().optional(),source:O.enum(["cli","telegram","web"]).optional(),telegramChatId:O.number().optional(),model:O.string(),startedAt:O.number(),savedAt:O.number(),totalTurns:O.number(),totalCostUsd:O.number().optional(),totalTokens:O.number().optional(),totalDurationMs:O.number().optional(),turns:O.array(Nq).default([]),forkedFrom:O.string().optional(),forkedAt:O.number().optional()}).passthrough(),zx=O.enum(["fully_achieved","partially_achieved","not_achieved","aborted"]),Vx=O.enum(["not_persisted","persisted","unknown"]),Jx=O.object({tool:O.string(),label:O.string().optional()}),Yx=O.object({files_written:O.number().int(),files_edited:O.number().int(),bash_commands:O.number().int(),commits:O.number().int(),mutated:O.boolean()}),Ys=O.object({facet_version:O.number().int(),session_id:O.string(),source:O.enum(["cli","telegram","web","unknown"]),model:O.string(),derived_at:O.string(),derived_from:O.literal("afk-session"),source_session_path:O.string(),source_session_mtime_ms:O.number(),subagent_persistence:Vx,start_time:O.string(),end_time:O.string(),duration_minutes:O.number(),underlying_goal:O.string(),first_prompt:O.string(),goal_categories:O.record(O.string(),O.number()),session_type:O.string(),brief_summary:O.string(),total_turns:O.number().int(),user_message_count:O.number().int(),assistant_message_count:O.number().int(),tool_counts:O.record(O.string(),O.number()),commands:O.array(O.string()),skills:O.array(O.string()),subagents:O.array(Jx),tool_errors:O.number().int(),tool_error_categories:O.record(O.string(),O.number()),friction_counts:O.record(O.string(),O.number()),friction_detail:O.string(),outcome:zx,primary_success:O.string(),world_changes:Yx,decisions:O.array(O.string()),evidence_pointers:O.array(O.string())}).passthrough()});import{basename as $q}from"path";function Kq(t){if(t)try{let e=JSON.parse(t);return e&&typeof e=="object"?e:void 0}catch{return}}function fd(t){return typeof t=="string"?t:void 0}function md(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}function Gq(t){return t.replace(/[-_]+/g," ").trim()}function qq(t,e){return Qx.test(t)?"slash_command":e==="telegram"?"chat":"task"}function zq(t){let e=new Map,n=[];for(let r of t)r.toolUseId===void 0?n.push(r):e.set(r.toolUseId,r);return[...e.values(),...n]}function Xs(t,e={}){let n=t.turns??[],r=zq(n.flatMap(L=>L.toolEvents??[])),o={},s={},i=[],a=[],l=[],c=0,d=0,u=0,p=0,f=0;for(let L of r){let M=L.toolName;o[M]=(o[M]??0)+1,L.isError===!0&&(c+=1,s[M]=(s[M]??0)+1);let F=Kq(L.inputRaw??L.input);if(M==="write_file"&&(d+=1),M==="edit_file"&&(u+=1),M==="bash"){p+=1;let H=fd(F?.command)??L.input;H&&Wq.test(H)&&(f+=1)}if(Bq.has(M)){let H=fd(F?.file_path);H&&!l.includes(H)&&l.length<Hq&&l.push(H)}if(Uq.has(M)){let H;M==="skill"?(H=fd(F?.name),H&&!a.includes(H)&&a.push(H)):M==="agent"?H=fd(F?.id_prefix):H="compose",i.push(H?{tool:M,label:H}:{tool:M})}}let m=n[0]?.user??"",g=t.source??"cli",y=qq(m,g),w=[];for(let L of n){let F=Qx.exec(L.user??"")?.[1];F&&!w.includes(F)&&w.push(F)}let k=n.filter(L=>(L.user??"").trim().length>0).length,A=n.filter(L=>(L.assistant??"").trim().length>0).length,E=[...n].reverse().find(L=>(L.assistant??"").trim().length>0)?.assistant??"",T;n.length===0?T="aborted":E.trim().length===0?T="partially_achieved":T="fully_achieved";let C=T==="fully_achieved"||T==="partially_achieved"?md(E||m||y,160)||y:"none",x=c>0?`${c} tool error(s): ${Object.entries(s).map(([L,M])=>`${L}\xD7${M}`).join(", ")}`:"",v=t.name?Gq(t.name):md(m,80),R=md(E||m,jq),P=md(v?`${v} \u2014 ${R}`:R,400)||"empty session",U=t.sessionId??(e.sourceSessionPath?$q(e.sourceSessionPath,".json"):"unknown"),J=t.totalDurationMs&&t.totalDurationMs>0?t.totalDurationMs:Math.max(0,t.savedAt-t.startedAt),I=e.sourceSessionPath?[...l,e.sourceSessionPath]:l,j={facet_version:Js,session_id:U,source:g==="telegram"?"telegram":g==="web"?"web":"cli",model:t.model,derived_at:(e.derivedAt??new Date).toISOString(),derived_from:"afk-session",source_session_path:e.sourceSessionPath??"",source_session_mtime_ms:e.sourceSessionMtimeMs??t.savedAt,subagent_persistence:"not_persisted",start_time:new Date(t.startedAt).toISOString(),end_time:new Date(t.savedAt).toISOString(),duration_minutes:Number((J/6e4).toFixed(2)),underlying_goal:m.slice(0,Xx),first_prompt:m.slice(0,Xx),goal_categories:{[y]:1},session_type:y,brief_summary:P,total_turns:n.length,user_message_count:k,assistant_message_count:A,tool_counts:o,commands:w,skills:a,subagents:i,tool_errors:c,tool_error_categories:s,friction_counts:{...s},friction_detail:x,outcome:T,primary_success:C,world_changes:{files_written:d,files_edited:u,bash_commands:p,commits:f,mutated:d>0||u>0||f>0},decisions:[],evidence_pointers:I};return Ys.parse(j)}var Uq,Bq,Xx,jq,Hq,Wq,Qx,Hg=h(()=>{"use strict";pd();Uq=new Set(["agent","compose","skill"]),Bq=new Set(["read_file","write_file","edit_file"]),Xx=1e3,jq=240,Hq=50,Wq=/\bgit\s+commit(?![\w-])/,Qx=/^\s*\/([a-zA-Z][\w-]*)/});import{existsSync as gd,mkdirSync as Vq,readFileSync as Zx,readdirSync as Jq,renameSync as Yq,statSync as Xq,writeFileSync as Qq}from"fs";import{basename as Zq,dirname as e2,join as eC}from"path";function tC(t,e){return Oi(t),eC(e,`${t}.json`)}function t2(t,e){return Oi(t),eC(e,`${t}.json`)}function hd(t,e=Re()){let n=tC(t,e);if(gd(n))try{let r=JSON.parse(Zx(n,"utf8")),o=jg.safeParse(r);return o.success?o.data:void 0}catch{return}}function n2(t){if(gd(t))try{let e=JSON.parse(Zx(t,"utf8")),n=Ys.safeParse(e);return n.success?n.data:void 0}catch{return}}function r2(t,e){Vq(e2(t),{recursive:!0});let n=`${t}.${process.pid}.tmp`;Qq(n,`${JSON.stringify(e,null,2)}
|
|
1184
|
-
`,"utf8"),Yq(n,t)}function o2(t,e){return t.facet_version===Js&&t.source_session_mtime_ms===e}function Wg(t,e={}){let n=e.sessionsDir??Re(),r=e.cacheDir??Yh(),o=tC(t,n);if(!gd(o))return;let s=Xq(o).mtimeMs,i=t2(t,r);if(!e.force){let c=n2(i);if(c&&o2(c,s))return c}let a=hd(t,n);if(!a)return;let l=Xs(a,{sourceSessionPath:o,sourceSessionMtimeMs:s});return r2(i,l),l}function Kg(t={}){let e=t.sessionsDir??Re();return gd(e)?Jq(e).filter(n=>n.endsWith(".json")).map(n=>Zq(n,".json")):[]}var nC=h(()=>{"use strict";B();Hg();pd()});var rC=h(()=>{"use strict";pd();Hg();nC()});import{readFileSync as s2}from"node:fs";import{join as i2}from"node:path";function xc(t,e){let n=Es(t,e),r=e?.excludeName,s=(r!==void 0&&r.length>0?n.filter(a=>a.name!==r&&!a.name.endsWith(`:${r}`)):n).filter(a=>a.source!=="command");if(s.length===0)return"";let i=[];for(let a of s){let l=a.argumentHint?`${a.argumentHint}`:"",c=l?`- \`${a.name} ${l}\`: ${a.description}`:`- ${a.name}: ${a.description}`;i.push(c),a.whenToUse&&i.push(` When to use: ${a.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either
|
|
1184
|
+
`,"utf8"),Yq(n,t)}function o2(t,e){return t.facet_version===Js&&t.source_session_mtime_ms===e}function Wg(t,e={}){let n=e.sessionsDir??Re(),r=e.cacheDir??Yh(),o=tC(t,n);if(!gd(o))return;let s=Xq(o).mtimeMs,i=t2(t,r);if(!e.force){let c=n2(i);if(c&&o2(c,s))return c}let a=hd(t,n);if(!a)return;let l=Xs(a,{sourceSessionPath:o,sourceSessionMtimeMs:s});return r2(i,l),l}function Kg(t={}){let e=t.sessionsDir??Re();return gd(e)?Jq(e).filter(n=>n.endsWith(".json")).map(n=>Zq(n,".json")):[]}var nC=h(()=>{"use strict";B();Hg();pd()});var rC=h(()=>{"use strict";pd();Hg();nC()});import{readFileSync as s2}from"node:fs";import{join as i2}from"node:path";function xc(t,e){let n=Es(t,e),r=e?.excludeName,s=(r!==void 0&&r.length>0?n.filter(a=>a.name!==r&&!a.name.endsWith(`:${r}`)):n).filter(a=>a.source!=="command");if(s.length===0)return"";let i=[];for(let a of s){let l=a.argumentHint?`${a.argumentHint}`:"",c=l?`- \`${a.name} ${l}\`: ${a.description}`:`- ${a.name}: ${a.description}`;i.push(c),a.whenToUse&&i.push(` When to use: ${a.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either forks an isolated subagent (delegation \u2014 preserves the main session's context) or loads its instructions directly into your current context for you to execute directly. The mode is fixed per-skill, not per-call. To run a skill N times in parallel with isolation, dispatch N subagents (via `agent` or `compose`) that each call `skill` once. Prefer a skill over inline investigation when the task shape matches.","",...i].join(`
|
|
1185
1185
|
`)}function Es(t,e){let n=[],r=new Set,o=S.AFK_INTERNAL==="1",s=rs(ns());zs(xi(),"user"),ZE("project"),zs(Qh(e?.cwd),"project");for(let{dir:l,origin:c}of s.skillRoots)zs(l,c);for(let l of Xf()){let c=Ht(l);Yf(c,o)&&(n.push({name:l,description:c.description,source:c.origin==="user"?"user":c.origin==="project"?"project":c.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:c.argumentHint,whenToUse:c.whenToUse}),r.add(l))}let i=t??yd(e),a=$c();for(let l of i){if(l.type!=="local")continue;let c=[...Zm(l.path,a),...Bg(l.path,a)];for(let d of c)!d.name||r.has(d.name)||Yf({audience:d.audience},o)&&(n.push({name:d.name,description:d.description??`Skill from plugin at ${l.path}`,source:d.origin==="command"?"command":"plugin",argumentHint:d.argumentHint}),r.add(d.name))}return n}function Ks(t,e){let n=new Map,r=t??yd(e),o=$c();for(let s of r){if(s.type!=="local")continue;let i=[...Zm(s.path,o),...Bg(s.path,o)];for(let a of i)a.name&&a.body&&a.body.length>0&&!n.has(a.name)&&n.set(a.name,{body:a.body,pluginPath:s.path,...a.allowedTools!==void 0?{allowedTools:a.allowedTools}:{},...a.context!==void 0?{context:a.context}:{},...a.readOnly===!0?{readOnly:!0}:{},...a.model!==void 0?{model:a.model}:{}})}return n}function oC(t,e=()=>{}){let n=t??yd(),r=[],o=new Set;for(let s of n){if(s.type!=="local")continue;let i=Gx(s.path).name;if(i!==null)for(let a of jc(i2(s.path,"agents"))){let l=ke(a),c;try{c=s2(a,"utf8")}catch(p){let f=ke(p instanceof Error?p.message:String(p));e(`[afk] agents: cannot read ${l}: ${f}`);continue}let d=ir(c,p=>e(`[afk] agents: ${l}: ${p}`));if(d===void 0)continue;let u=`${i}:${d.name}`;o.has(u)||(o.add(u),r.push({name:u,definition:d.definition,source:`plugin:${i}`,filePath:a,...d.bashReadOnly===!0?{bashReadOnly:!0}:{},...d.ignoredKeys!==void 0?{ignoredKeys:d.ignoredKeys}:{}}))}}return r}function yd(t){return[...Gt(Zh(t?.cwd)),...Gt(),...Gt(ty()),...rs(ns()).pluginRoots.flatMap(({dir:e,binary:n})=>Gt(e,{trustAll:!0,sourceEnabled:FS(n)}))]}async function sC(){await Hx(yd(),{pluginApi:{registerSkill:Ue,listSkills:Xf,getSkill:Ht,loadSkillPrompts:ue,env:S,SubagentManager:Q,describeFailure:Ae,discoverPluginSkillBodies:Ks,getAgentFrameworkDir:ct,getSkillsDir:xi,getSessionsDir:Re,getOrDeriveFacet:Wg,listSessionIds:Kg,deriveSessionFacet:Xs,loadStoredSession:hd}})}var un=h(()=>{"use strict";Bx();Ct();lt();Ug();ld();Wx();Qr();Kx();qx();Us();cg();Ut();we();Te();rC();B();$();Ya()});function co(t,e,n){let r=Bo({cwd:e,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:n.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:n.workspace}),o=[t.toolBase];return t.userSystem&&o.push(t.userSystem),o.push(t.memoryPrompt),t.hotMemory.length>0&&o.push(t.hotMemory),o.push(r),t.manifest.length>0&&o.push(t.manifest),o.join(`
|
|
1186
1186
|
|
|
1187
1187
|
`)}var bd=h(()=>{"use strict";Ce()});function iC(t){let{config:e,cwd:n}=t,r=t.hasSkillExecutor?xc(void 0,{cwd:n,...typeof e.skillDispatchName=="string"&&e.skillDispatchName.length>0?{excludeName:e.skillDispatchName}:{}}):"",o=Zl(e.isSkillDispatch),s=ec(t.readOnlyMemory),i={surface:t.surface,sessionId:e.sessionId,depth:e.depth,maxDepth:e.maxDepth,workspace:t.runtimeStateSource.getWorkspace()},a={toolBase:o,memoryPrompt:s,hotMemory:e.hotMemory??"",manifest:r,userSystem:t.userSystem};return{stableSystemPrefix:a,toolSystemAppend:co(a,n,i)}}var aC=h(()=>{"use strict";un();fm();bd()});import a2 from"@anthropic-ai/sdk";function lC(t){if(t===void 0)return null;if(typeof t=="string")return t.length>0?t:null;if(typeof t=="object"&&t!==null&&"append"in t){let e=t.append;return e&&e.length>0?e:null}return null}function cC(t,e,n,r){let o=e.config,{localMode:s,token:i}=RE(o);if(!i||i.length===0)throw new Error(`${n} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let a=gr(i),{client:l,throttleQueue:c,systemPrefix:d,tokenRefresher:u}=BE({config:o,token:i,authMode:a,localMode:s,factory:t.providerFactory??Pl(),createClient:v=>new a2(v)}),p=lC(o.systemPrompt),f=typeof o.model=="string"&&o.model.length>0?Se(o.model)??o.model:r,m=da(o,f),g=o.permissionMode??"default";t.setCurrentPermissionMode(g),t.ensureSharedRoots(o.cwd),o.cwd&&t.setCurrentCwd(o.cwd);let y=t.getSharedReadRoots(),w=t.getSharedWriteRoots();o.readRoots&&y&&y.length<=1&&(y.length=0,y.push(...o.readRoots)),o.writeRoots&&w&&w.length<=1&&(w.length=0,w.push(...o.writeRoots));let{queryDispatcher:k,runtimeStateSource:A,toolDefs:E,resolvedSessionId:T}=YE({config:o,model:f,permissionMode:g,surface:t.surface,providerName:n,externalTools:t.externalTools,sharedReadRoots:y,sharedWriteRoots:w,getCwd:()=>t.getCurrentCwd()||o.cwd||process.cwd(),getMcpTools:()=>t.mcpManager?.getMcpTools()??[],getSubagents:()=>t.subagentExecutor?t.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]},getMintedSessionId:()=>t.getMintedSessionId(),setMintedSessionId:v=>{t.setMintedSessionId(v)},getPresenceSessionId:()=>t.getPresenceSessionId(),setPresenceSessionId:v=>{t.setPresenceSessionId(v)},buildDispatcher:(v,R)=>t.buildDispatcher(v,R)}),_=o.cwd||process.cwd(),{stableSystemPrefix:C,toolSystemAppend:x}=iC({config:o,cwd:_,surface:t.surface,readOnlyMemory:t.readOnlyMemory,hasSkillExecutor:!!t.skillExecutor,runtimeStateSource:A,userSystem:p});return t_({prompt:e.prompt,options:{model:f,maxTokens:m,system:x},provenance:{systemPrompt:{source:o.systemPromptSource??"none",shape:typeof o.systemPrompt=="string"?"string":Array.isArray(o.systemPrompt)?"string[]":o.systemPrompt!=null?"preset":"undefined",...typeof o.systemPrompt=="string"?{length:o.systemPrompt.length}:{}},...o.apiKey?{apiKey:{source:"config"}}:{}}}),{client:l,authMode:a,localMode:s,model:f,maxTokens:m,cwd:_,systemPrefix:d,throttleQueue:c,tokenRefresher:u,queryDispatcher:k,runtimeStateSource:A,toolDefs:E,resolvedSessionId:T,stableSystemPrefix:C,toolSystemAppend:x}}var Gg=h(()=>{"use strict";Zt();et();fa();xE();Il();jE();XE();aC();bs()});function dC(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,requestedModel:t.requestedModel??t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var uC=h(()=>{"use strict"});function Qs(t){if(typeof t?.baseUrl=="string"&&t.baseUrl.length>0)return!1;let e=S.AFK_DISABLE_PROMPT_CACHE;if(e===void 0||e.length===0)return!0;let n=e.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function cr(){let t=S.AFK_PROMPT_CACHE_TTL;return t==="5m"?"5m":t==="1h"?"1h":l2}function wd(t){return Qs(t)&&cr()==="1h"}function pC(t,e){if(t.length===0)return t;let n=t[t.length-1],r=mC(n,e);return r===n?t:[...t.slice(0,-1),r]}function fC(t,e){if(t.length===0)return t;let n=t[t.length-1],r=c2(n,e);return r===n?t:[...t.slice(0,-1),r]}function c2(t,e){let n=t.content;if(typeof n=="string")return n.length===0?t:{...t,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:e}}]};if(!Array.isArray(n)||n.length===0)return t;let r=n[n.length-1],o=mC(r,e);return o===r?t:{...t,content:[...n.slice(0,-1),o]}}function mC(t,e){return t.type==="thinking"||t.type==="redacted_thinking"?t:{...t,cache_control:{type:"ephemeral",ttl:e}}}var l2,uo=h(()=>{"use strict";$();l2="1h"});var qg=h(()=>{"use strict";Mr()});function p2(t){let e=n=>n===void 0?void 0:n*zg;return{inputPerMTok:t.inputPerMTok*zg,outputPerMTok:t.outputPerMTok*zg,...e(t.cacheWrite5mPerMTok)!==void 0?{cacheWrite5mPerMTok:e(t.cacheWrite5mPerMTok)}:{},...e(t.cacheWrite1hPerMTok)!==void 0?{cacheWrite1hPerMTok:e(t.cacheWrite1hPerMTok)}:{},...e(t.cacheReadPerMTok)!==void 0?{cacheReadPerMTok:e(t.cacheReadPerMTok)}:{}}}function f2(t){return t.responseSpeed??t.requestSpeed??"standard"}function m2(t){let e=Vg.get(t);if(e)return e;let n=t.replace(d2,"");return n===t?void 0:Vg.get(n)}function Jg(t,e,n,r,o,s,i={}){let a=m2(t);if(!a)return;let l=f2(i)==="fast"&&u2.test(t)?p2(a):a,c=1e6,d=R=>Number.isFinite(R)&&R>=0?R:0,u=d(e),p=d(n),f=d(r),m=d(o),g=u/c*l.inputPerMTok,y=p/c*l.outputPerMTok,w=l.cacheWrite5mPerMTok??l.inputPerMTok*1.25,k=l.cacheWrite1hPerMTok??l.inputPerMTok*2,A=l.cacheReadPerMTok??l.inputPerMTok*.1,E=s??{ephemeral5m:m,ephemeral1h:0},T=d(E.ephemeral5m),_=d(E.ephemeral1h),C=Math.max(0,m-(T+_)),x=T/c*w+_/c*k+C/c*k,v=f/c*A;return g+y+x+v}var Vg,d2,zg,u2,Yg=h(()=>{"use strict";Vg=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-opus-4-8",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-opus-4-7",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-opus-4-6",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-sonnet-4-6",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:5,outputPerMTok:25,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,cacheReadPerMTok:.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWrite5mPerMTok:1,cacheWrite1hPerMTok:1.6,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWrite5mPerMTok:18.75,cacheWrite1hPerMTok:30,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWrite5mPerMTok:.3,cacheWrite1hPerMTok:.5,cacheReadPerMTok:.03}]]),d2=/-\d{8}$/,zg=2,u2=/^claude-opus-(?:5|4-8)(?:-|$)/});function g2(t){let e=t.speed;return e==="fast"||e==="standard"?e:void 0}function h2(t){let e=o=>Number.isFinite(o)&&o>=0?o:0,n=t.cache_creation;if(n)return{ephemeral5m:e(n.ephemeral_5m_input_tokens??0),ephemeral1h:e(n.ephemeral_1h_input_tokens??0)};let r=e(t.cache_creation_input_tokens??0);return cr()==="1h"?{ephemeral5m:0,ephemeral1h:r}:{ephemeral5m:r,ephemeral1h:0}}function Xg(t,e,n,r){if(!t)return{stopReason:e??null};let o=g2(t),s={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null,raw:{...t,...o?{speed:o}:{}}};if(t.cache_read_input_tokens!=null&&(s.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(s.cacheCreationTokens=t.cache_creation_input_tokens),s.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let i=Jg(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0,h2(t),{...r?{requestSpeed:r}:{},...o?{responseSpeed:o}:{}});i!==void 0&&(s.totalCostUsd=i)}return s}var gC=h(()=>{"use strict";uo();Yg()});var Qg=h(()=>{"use strict";Yg();gC();mm()});function Zs(t){return t>2147483647?2147483647:t}var Zg=h(()=>{"use strict"});function yC(){let t=S.AFK_MODEL_TTFB_TIMEOUT_MS;if(t===void 0||t.trim()==="")return hC;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?hC:Zs(e)}function bC(t){return typeof t!="number"||!Number.isFinite(t)||t<=0?void 0:(t<w2?t:S2)+b2}function wC(t,e){if(e<=0)return{signal:t,timedOut:()=>!1,firstByteSeen:()=>{},extend:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([t,n.signal]),o=!1,s=!1,i=Date.now()+e,a,l=u=>{a=setTimeout(()=>{o=!0,n.abort(new Error(y2))},Zs(u)),a.unref()};l(e);let c=()=>{s||(s=!0,clearTimeout(a))};return{signal:r,timedOut:()=>o,firstByteSeen:c,extend:u=>{s||o||typeof u!="number"||!Number.isFinite(u)||u<=0||(i+=u,clearTimeout(a),l(Math.max(1,i-Date.now())))},dispose:c}}var hC,y2,b2,w2,S2,eh=h(()=>{"use strict";$();Zg();hC=18e4;y2="model_ttfb_timeout",b2=3e4,w2=6e4,S2=8e3});function vC(){let t=S.AFK_MODEL_STALL_TIMEOUT_MS;if(t===void 0||t.trim()==="")return SC;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?SC:Zs(e)}function EC(t){return t instanceof Error&&t.message===kC}function th(t){return new Error(`Model stream stalled: no output for ${Math.round(t/1e3)}s after the response had already started streaming. The round was aborted rather than left hanging (issue #762: two sessions hung 38 and 63 minutes with no terminal event). A round that keeps producing output is never cut off, no matter how long it runs. Raise AFK_MODEL_STALL_TIMEOUT_MS, or set it to 0 to disable this bound.`)}function _C(t,e,n){if(e<=0)return{signal:t,timedOut:()=>!1,progress:()=>{},dispose:()=>{}};let r=new AbortController,o=AbortSignal.any([t,r.signal]),s,i=!1,a=!1,l=u=>{if(!(a||i)){i=!0,s=void 0;try{n?.({stallTimeoutMs:e,elapsedSinceLastProgressMs:Date.now()-u})}catch{}r.signal.aborted||r.abort(new Error(kC))}};return{signal:o,timedOut:()=>i,progress:()=>{if(a||i)return;s!==void 0&&clearTimeout(s);let u=Date.now(),p=setTimeout(()=>l(u),e);p.unref(),s=p},dispose:()=>{a||(a=!0,s!==void 0&&clearTimeout(s),s=void 0)}}}var SC,kC,Sd=h(()=>{"use strict";$();Zg();SC=12e5;kC="model_stream_stall_timeout"});function vd(t,e=Math.random){return t+Math.floor(e()*t*_2)}function TC(t=Math.random){let e=E2-AC;return AC+Math.floor(t()*e)}function RC(t){return t.type==="turn.completed"&&t.usage.stopReason===Ye}function xC(t){let e=S.AFK_OVERLOAD_PAUSE_MS;if(e!==void 0&&e.trim()!==""){let n=Number(e);if(Number.isFinite(n)&&n>=0)return Math.min(Math.floor(n),k2)}return t!==void 0&&A2.has(t)?v2:0}var nh,v2,k2,AC,E2,_2,A2,ei=h(()=>{"use strict";$();Ur();Ur();nh="Anthropic is overloaded (HTTP 529) and did not recover within this turn's retry budget. This is an upstream capacity event, not an afk error. The turn was committed, so the conversation so far is preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state once capacity frees up.",v2=600*1e3,k2=7200*1e3,AC=60*1e3,E2=120*1e3,_2=.25;A2=new Set(["cli","repl","telegram","web"])});function CC(t){if(!Number.isFinite(t)||t<=0)return 0;let e=Math.floor(t*2/3);return Math.max(1,e)}function PC(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function ti(t){if(t===null||typeof t!="object")return!1;let e=t;if(e.status===529||e.status===503)return!0;let n=e.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}var kd,ni=h(()=>{"use strict";kd=class{overloadRetries=0;streamIncompleteRetries=0;ttfbRetries=0;canRetryOverload(){return this.overloadRetries<3}canRetryStreamIncomplete(){return this.streamIncompleteRetries<2}canRetryTtfb(){return this.ttfbRetries<2}reset(){this.overloadRetries=0,this.streamIncompleteRetries=0,this.ttfbRetries=0}}});async function*R2(t,e,n){W(t.traceWriter,{phase:"ttfb_timeout",durationMs:Date.now()-e,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:t.model,attempt:n}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId}}async function*oh(t,{input:e,turn:n,retry:r,requestStartedAt:o}){return t==="ttfb"?(r.ttfbRetries+=1,yield*R2(e,o,r.ttfbRetries),"continue"):t==="overload"?(r.overloadRetries+=1,W(e.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:r.overloadRetries}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},yield*IC(vd(5e3*Math.pow(2,r.overloadRetries-1)),e,n),e.signal.aborted?"terminated":"continue"):(r.streamIncompleteRetries+=1,W(e.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:r.streamIncompleteRetries}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},yield*IC(1e3*Math.pow(2,r.streamIncompleteRetries-1),e,n),e.signal.aborted?"terminated":"continue")}async function*IC(t,e,n){await Xe(t,e.signal),e.signal.aborted&&(yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:e.ctx.sessionId})}var MC=h(()=>{"use strict";Y();sr();ei();ni()});function DC(t){let e=t.fastModeController?.snapshotTurn({resolvedModelId:t.model,providerFamily:"anthropic-direct",hasCustomEndpoint:t.baseUrl!==void 0,executionPath:"top-level"}),n=e?.effective===!0,r=Qt(t.authMode,t.sessionId,t.requestId,t.effort!==void 0,wd(t.baseUrl!==void 0?{baseUrl:t.baseUrl}:{}),n);return{decision:e,runInput:{client:t.client,messages:t.messages,system:t.system,tools:t.tools,toolDispatcher:t.toolDispatcher,model:t.model,maxTokens:t.maxTokens,headers:r,signal:t.signal,ctx:{sessionId:t.sessionId},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{effort:t.effort}:{},...n?{fastMode:!0}:{},...t.baseUrl!==void 0?{baseUrl:t.baseUrl}:{},...t.maxToolUseIterations!==void 0?{maxToolUseIterations:t.maxToolUseIterations}:{},...t.softDeadlineMs!==void 0?{softDeadlineMs:t.softDeadlineMs}:{},...t.traceWriter?{traceWriter:t.traceWriter}:{},...t.subagentId!==void 0?{subagentId:t.subagentId}:{},...t.throttleQueue?{throttleQueue:t.throttleQueue}:{},...t.onUsageProgress?{onUsageProgress:t.onUsageProgress}:{}}}}function Ed(t,e){let n=t instanceof Error?t:new Error(String(t));if(!e||n.message.startsWith(OC))return n;let r=new Error(`${OC} ${n.message}`,{cause:n});r.name=n.name,n.stack!==void 0&&(r.stack=n.stack);for(let o of Object.getOwnPropertyNames(n)){if(o==="message"||o==="stack")continue;let s=Object.getOwnPropertyDescriptor(n,o);s!==void 0&&Object.defineProperty(r,o,s)}return r}var OC,sh=h(()=>{"use strict";Zt();uo();OC="[Fast mode requested; no standard-mode fallback will be attempted]"});async function*FC(t,e,n){let r=e.throttleQueue;if(!r)return await t;r.resetAttempts();let o=Symbol("create-done"),s=!1,i=t.then(a=>(s=!0,a),a=>{throw s=!0,a});for(;;){for(let l of r.takeAll())n?.(l.retryAfterMs),yield{type:"rate_limit",sessionId:e.ctx.sessionId,status:l.status,attempt:l.attempt,...l.retryAfterMs!==void 0?{retryAfterMs:l.retryAfterMs}:{}};if(s)return await i;await Promise.race([i.then(()=>o,()=>o),r.waitForItem().then(()=>{})])}}var LC=h(()=>{"use strict"});function NC(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var $C=h(()=>{"use strict"});function x2(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}async function C2(t,e,n,r,o){for(let s=0;;s++){if(s>0){let i=vd(5e3*Math.pow(2,s-1));if(await Xe(i,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let a=i instanceof Error?i:new Error(String(i));if(PC(a)){if(s<3)continue;throw new _d}throw a}}}function P2(t){return{model:t.model,max_tokens:t.maxTokens,messages:t.messages,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0?{tools:t.tools.map(x2)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{},...t.fastMode===!0?{speed:"fast"}:{}}}async function*UC({input:t,turn:e,retry:n,ttfbTimeoutMs:r,stallTimeoutMs:o}){let s=Qs({baseUrl:t.baseUrl})?fC(t.messages,cr()):t.messages,i=P2({...t,messages:s,tools:e.windDownReason!==null?null:t.tools}),a=Date.now(),l=wC(t.signal,r),c=_C(l.signal,o,d=>{W(t.traceWriter,{phase:"idle_watchdog_fired",durationMs:d.elapsedSinceLastProgressMs,resolvedModel:t.model,metadata:{source:"model-stream",stallTimeoutMs:d.stallTimeoutMs,elapsedSinceLastProgressMs:d.elapsedSinceLastProgressMs}})});try{return{kind:"opened",events:yield*FC(C2(t.client,i,t.headers,c.signal,t.signal),t,u=>{let p=bC(u);p!==void 0&&l.extend(p)}),ttfb:l,stall:c,requestStartedAt:a}}catch(d){if(l.timedOut()&&!t.signal.aborted&&n.canRetryTtfb())return l.dispose(),c.dispose(),{kind:"retry-ttfb",requestStartedAt:a};if(l.dispose(),c.dispose(),t.signal.aborted)return yield{type:"turn.completed",usage:e.terminalUsage(),sessionId:t.ctx.sessionId},{kind:"terminated"};if(d instanceof _d)return{kind:"overload-exhausted"};let u=Ed(d,t.fastMode===!0);return u.message.includes("thinking")&&NC(t.messages,u),yield{type:"error",error:u},{kind:"terminated"}}}var _d,BC=h(()=>{"use strict";sh();uo();Y();sr();eh();Sd();ei();ni();LC();$C();_d=class extends Error{constructor(){super("Connection-phase overload budget exhausted"),this.name="ConnectionOverloadExhaustedError"}}});function jC(t,e){return t||e!==null}function HC(){return new St("the model stream ended without a terminal message (no message_stop and no stop_reason): the turn is incomplete. The cause is not knowable at this layer \u2014 a client-side abort carrying an AbortError reason (including the SDK request timeout) and an upstream peer close are indistinguishable here. Check the trace for a preceding ttfb_timeout, idle_watchdog_fired, or rate_limit phase before suspecting the network.")}var WC=h(()=>{"use strict";ae()});function I2(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function M2(t,e,n){let r=[],o=[];for(let a of t)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:I2(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*KC(t,e,n){let r=[],o=null,s=null,i=!1,a=!!S.AFK_TELEGRAM_TRACE;try{a&&console.log("[translate] starting SDK event iteration");for await(let l of t){switch(a&&console.log("[translate] SDK evt:",l.type),l.type){case"message_start":{let c=l.message?.usage;c&&(s={...c});break}case"content_block_start":{let c=l.content_block;c.type==="text"?r[l.index]={kind:"text",text:""}:c.type==="thinking"?r[l.index]={kind:"thinking",thinking:"",signature:""}:c.type==="redacted_thinking"?r[l.index]={kind:"redacted_thinking",data:c.data}:c.type==="tool_use"&&(r[l.index]={kind:"tool_use",id:c.id,name:c.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:c.id,toolName:c.name,toolInput:" \u2026",pending:!0,sessionId:e.sessionId}});break}case"content_block_delta":{let c=r[l.index],d=l.delta;d.type==="text_delta"?(c&&c.kind==="text"&&(c.text+=d.text),yield{kind:"event",event:{type:"delta.text",text:d.text,sessionId:e.sessionId}}):d.type==="input_json_delta"?(c&&c.kind==="tool_use"&&(c.partialJson+=d.partial_json),n?.()):d.type==="thinking_delta"?(c&&c.kind==="thinking"&&(c.thinking+=d.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:d.thinking,sessionId:e.sessionId}}):(d.type==="signature_delta"&&c&&c.kind==="thinking"&&(c.signature=d.signature),n?.());break}case"content_block_stop":{let c=r[l.index];c&&c.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:c.name,toolUseIds:[c.id],sessionId:e.sessionId}});break}case"message_delta":{l.delta&&l.delta.stop_reason!==void 0&&(o=l.delta.stop_reason);let c=l.usage;c&&(s!==null?(s.output_tokens=c.output_tokens,c.cache_creation_input_tokens!=null&&(s.cache_creation_input_tokens=c.cache_creation_input_tokens),c.cache_read_input_tokens!=null&&(s.cache_read_input_tokens=c.cache_read_input_tokens),c.input_tokens!=null&&(s.input_tokens=c.input_tokens)):s={cache_creation:null,cache_creation_input_tokens:c.cache_creation_input_tokens??null,cache_read_input_tokens:c.cache_read_input_tokens??null,inference_geo:null,input_tokens:c.input_tokens??0,output_tokens:c.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}a&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(l){a&&console.log("[translate] SDK iteration threw:",l.message),yield{kind:"event",event:{type:"error",error:l instanceof Error?l:new Error(String(l))}};return}if(!jC(i,o)){yield{kind:"event",event:{type:"error",error:HC()}};return}a&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:M2(r,o,s)}}var GC=h(()=>{"use strict";$();WC()});async function*qC({events:t,input:e,turn:n,retry:r,ttfb:o,stall:s,stallTimeoutMs:i,requestStartedAt:a}){let l=null,c=!1,d=!1,u=!1,p=!1,f=!1,m=!1;try{S.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let g of KC(Jr(t,e.signal),e.ctx,()=>s.progress()))if(!m&&(g.kind==="turn-result"||g.event.type!=="error")&&(m=!0,o.firstByteSeen(),W(e.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-a,resolvedModel:e.model})),s.progress(),S.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",g.kind,g.kind==="event"?g.event.type:""),g.kind==="event"){if(g.event.type==="error"){if(o.timedOut()&&!e.signal.aborted&&r.canRetryTtfb()&&!m){d=!0;break}if(s.timedOut()&&!e.signal.aborted){yield{type:"error",error:th(i)},c=!0;break}if(ti(g.event.error)&&r.canRetryOverload()&&!e.signal.aborted){u=!0;break}if(ti(g.event.error)&&!e.signal.aborted){f=!0;break}if(e.signal.aborted)break;if(g.event.error instanceof St&&r.canRetryStreamIncomplete()&&!e.signal.aborted){p=!0;break}yield g.event,c=!0;break}yield g.event}else{l=g.result;break}S.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",l?"set":"null")}catch(g){if(o.timedOut()&&!e.signal.aborted&&r.canRetryTtfb()&&!m)o.dispose(),s.dispose(),d=!0;else{if(o.dispose(),s.dispose(),e.signal.aborted)return yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:e.ctx.sessionId},{kind:"terminated"};let y=g instanceof Error?g:new Error(String(g));if((s.timedOut()||EC(y))&&!e.signal.aborted)return yield{type:"error",error:th(i)},{kind:"terminated"};if(ti(y)&&r.canRetryOverload()&&!e.signal.aborted)u=!0;else if(ti(y)&&!e.signal.aborted)f=!0;else return yield{type:"error",error:y},{kind:"terminated"}}}return o.dispose(),s.dispose(),d?{kind:"retry",reason:"ttfb"}:u?{kind:"retry",reason:"overload"}:p?{kind:"retry",reason:"stream-incomplete"}:f?{kind:"overload-exhausted"}:c?{kind:"translator-errored"}:{kind:"streamed",turnResult:l}}var zC=h(()=>{"use strict";GC();ae();pc();Y();$();Sd();ni()});async function*VC(t,e,n){let r=[],o=new Map;for(let i of t.toolUseBlocks)r.push({id:i.id,name:i.name,input:i.input,signal:e.signal}),o.set(i.id,Date.now()),Ln(e.traceWriter,Sc({toolUseId:i.id,name:i.name,input:i.input,subagentId:e.subagentId})),yield{type:"tool.use.start",toolUseId:i.id,toolName:i.name,toolInput:fn(i.name,i.input),toolInputRaw:wc(i.input),sessionId:e.ctx.sessionId};if(e.signal.aborted){let i=r.map(a=>({type:"tool_result",tool_use_id:a.id,content:"Tool call aborted",is_error:!0}));return e.messages.push({role:"user",content:i}),yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:e.ctx.sessionId},{kind:"aborted"}}let s;if(e.toolDispatcher.executeBatch)try{s=await e.toolDispatcher.executeBatch(r)}catch(i){s=r.map(()=>({content:`Tool batch execution failed: ${i instanceof Error?i.message:String(i)}`,isError:!0}))}else{s=[];for(let i of r){if(e.signal.aborted){s.push({content:"Tool call aborted",isError:!0,failureClass:Fe(e.signal)});continue}try{s.push(await e.toolDispatcher.execute(i))}catch(a){let l=a instanceof Error?a.message:String(a);s.push({content:`Tool execution threw: ${l}`,isError:!0})}}}return{kind:"dispatched",calls:r,results:s,startTimes:o}}var JC=h(()=>{"use strict";On();Y();jm();Ds();kc()});async function*YC(t,e,n,r){let o=[];for(let l=0;l<t.length;l++){let c=t[l],d=e[l],u=n.get(c.id),p=typeof u=="number"?Date.now()-u:0,f=d.truncated===!0||d.content.includes("[output truncated");Ln(r.traceWriter,vc({toolUseId:c.id,name:c.name,result:d,truncated:f,durationMs:p,subagentId:r.subagentId})),yield{type:"tool.output",toolUseId:c.id,toolName:c.name,content:d.content,...d.isError===!0?{isError:!0}:{},...f?{truncated:!0}:{},...d.incomplete===!0?{incomplete:!0}:{},...d.incompleteReason?{incompleteReason:d.incompleteReason}:{},...typeof d.batchIndex=="number"&&typeof d.batchSize=="number"?{batchIndex:d.batchIndex,batchSize:d.batchSize}:{},...d.failureClass?{failureClass:d.failureClass}:{},sessionId:r.ctx.sessionId},d.render?.diff&&(yield{type:"tool.diff",toolUseId:c.id,diff:d.render.diff,sessionId:r.ctx.sessionId});let{content:m,isError:g,image:y}=d,w=y!==void 0?[{type:"image",source:{type:"base64",media_type:y.mediaType,data:y.data}},...m.length>0?[{type:"text",text:m}]:[]]:m;o.push({type:"tool_result",tool_use_id:c.id,content:w,...g===!0?{is_error:!0}:{}})}let s=e.flatMap(l=>l.harnessUserMessage?.kind==="queued_user_message"?[{type:"text",text:l.harnessUserMessage.text}]:[]),i={role:"user",content:[...o,...s]};r.messages.push(i);let a=e.find(l=>l.failureClass===_r);return a?(yield{type:"error",error:new mr(a.content)},"denial-tripped"):"committed"}var XC=h(()=>{"use strict";Y();kc();Da();ae()});async function*QC(t,e,n,r,o){let s=e.messages.length;e.messages.push({role:"assistant",content:t.assistantBlocks});try{n.toolCallCount+=t.toolUseBlocks.length;let d=yield*VC(t,e,n);if(d.kind==="aborted"||(yield*YC(d.calls,d.results,d.startTimes,e))==="denial-tripped")return"terminated"}catch(d){throw e.messages.splice(s),d}n.iterations+=1;let i=t.toolUseBlocks[t.toolUseBlocks.length-1],a=i?`${i.name}${fn(i.name,i.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:n.taskId,description:"Working",summary:`${Tc(n.iterations,r)}: ${a}`,lastToolName:i?.name,totalTokens:n.usage.totalTokens??0,toolUses:n.toolCallCount,durationMs:Date.now()-n.startedAt},sessionId:e.ctx.sessionId},n.windDownReason!==null)return yield{type:"turn.completed",usage:n.withDuration({...n.usage,stopReason:n.windDownReason}),sessionId:e.ctx.sessionId},"terminated";let l=Ac(n.iterations,r),c=Kl(n.startedAt,o);if(l||c){let d=l?Ec:Hl,u=e.messages[e.messages.length-1];u!==void 0&&u.role==="user"&&Array.isArray(u.content)&&u.content.push({type:"text",text:d}),n.windDownReason=l?yt:gt}return"continue"}var ZC=h(()=>{"use strict";Ds();sn();Yr();JC();XC()});function*eP(t,e,n){if(t.stopReason==="refusal"){yield{type:"assistant.message",text:t.text.length>0?t.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:e.ctx.sessionId},yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:e.ctx.sessionId};return}let r=Pt(t.stopReason)?Gl(t.toolUseBlocks.map(s=>s.name),t.stopReason):null;t.text.length>0&&(yield{type:"assistant.message",text:r?`${t.text}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-afk",
|
|
3
|
-
"version": "5.110.
|
|
3
|
+
"version": "5.110.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",
|