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/cli.mjs
CHANGED
|
@@ -87,7 +87,7 @@ Subagents return their final assistant message verbatim \u2014 instruct them exp
|
|
|
87
87
|
|
|
88
88
|
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.
|
|
89
89
|
|
|
90
|
-
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"]}},ls={name:"skill",category:"skill",concurrencySafe:!0,description:"Invoke a registered skill by name.
|
|
90
|
+
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"]}},ls={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"]}},cs={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.
|
|
91
91
|
|
|
92
92
|
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.
|
|
93
93
|
|
|
@@ -314,7 +314,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
314
314
|
|
|
315
315
|
${t}`}var Pse,GE=y(()=>{"use strict";Pse=new Set(["script","style","noscript","template","svg"])});function $se(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function zF(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Dse(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function VF(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??$se,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!Ose.has(d.status)||u===o)return d;let m=Dse(d,s)??zF(u,i,s);U("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:m}),await d.body?.cancel().catch(()=>{}),await a(m,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let m=zF(u,i,s);U("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Ose,JF=y(()=>{"use strict";fe();Ose=new Set([429,502,503,504])});import{BlockList as Fse,isIP as zE}from"node:net";import{lookup as Lse}from"node:dns/promises";import{Agent as Nse}from"undici";function XF(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Wse(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function qE(e){let t=zE(e);return t===0?!1:jse.check(e,t===4?"ipv4":"ipv6")}async function QF(e){return Lse(e,{all:!0,verbatim:!0})}async function VE(e,t={}){if(t.allowPrivateHosts??XF())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" 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=Wse(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(zE(r)!==0)return qE(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??QF,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(qE(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Md(e,t={}){let n=await VE(e,t);if(!n.allowed)throw new zn(n.reason)}async function oh(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=YF;s++){await Md(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??XF())?{dispatcher:Hse}:{}},l=await VF(e,i,a,r.retry??{});if(!Kse.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new zn(`too many redirects (>${YF}) starting from ${t}`)}var Bse,Use,jse,zn,Hse,YF,Kse,JE=y(()=>{"use strict";H();JF();Bse=[["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]],Use=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],jse=(()=>{let e=new Fse;for(let[t,n]of Bse)e.addSubnet(t,n,"ipv4");for(let[t,n]of Use)e.addSubnet(t,n,"ipv6");return e})(),zn=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};Hse=new Nse({connect:{lookup(e,t,n){QF(e).then(r=>{let o=r.find(s=>qE(s.address));if(o!==void 0){n(new zn(`refusing to connect to ${e} (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 i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,zE(i.address))},r=>n(r,"",0))}}});YF=20,Kse=new Set([301,302,303,307,308])});import{readFileSync as Gse}from"node:fs";import{join as qse}from"path";function zse(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function ZF(e,t){return zse(t).test(e)}function Yse(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(Vse.has(t))return!0;if(Jse.has(t))return!1}return!1}function eL(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Xse(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function tL(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Nu(t),t}function Qse(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Zse(e){try{return Gse(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function eae(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=tL(t.defaultProfile)),n}function nL(e){let t=e?.env??k,n=e?.readFileSync??Zse,r=e?.surface??t.AGENT_SURFACE,o=Yse(t.AFK_BROWSER_HEADLESS,r),i=eL(t.AFK_BROWSER_ALLOWED_DOMAINS),s=eL(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Qse(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Xse(t.AFK_BROWSER_BACKEND),c=tL(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,m=d!==void 0&&d.trim()!==""?d.trim():qse(Wn(),"browser.json"),f=n(m);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${m}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=eae(u,g);return h.configPath=m,h}function ih(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(ZF(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>ZF(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Vse,Jse,sh=y(()=>{"use strict";H();q();Vse=new Set(["daemon","subagent","telegram","afk"]),Jse=new Set(["repl","interactive","cli"])});import{existsSync as tae,readFileSync as nae}from"node:fs";import{createRequire as rae}from"node:module";import{dirname as oae,join as iae}from"node:path";function iL(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<aae&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function zt(e){let t=iL(e);return oL.some(n=>t.includes(n))}function lae(){try{let t=rae(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(nae(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=iae(oae(t),o);return tae(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Od(){return rL??=lae()??sae,rL}function YE(e){return e.includes("install chromium")}function xn(e,t){let n=iL(e),r=t?.latched===!0?` ${cae}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.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: ${Od()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Od()}). Or pick a different tool.${r}`}function $d(e,t,n=!1){if(!zt(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
316
316
|
|
|
317
|
-
${xn(e,{headless:t,latched:n})}`,{cause:e})}var oL,sae,aae,rL,cae,ah=y(()=>{"use strict";oL=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],sae="pnpm exec playwright install chromium",aae=4;cae="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 ws from"node:fs";import lh from"node:path";import{randomBytes as uae}from"node:crypto";import{chromium as dae}from"playwright";function pae(){try{return"5.110.2"}catch{}try{let e=lh.resolve(import.meta.dirname,"../../../package.json"),t=ws.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var mae,ch,sL=y(()=>{"use strict";ah();q();fe();mae=pae(),ch=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}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=dae.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=$d(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{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",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(m){throw i??m}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${mae}`}}loadStorageState(t){let n=Bu(t);try{if(!ws.existsSync(n))return;let r=JSON.parse(ws.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Bu(t);if(!ws.existsSync(r))return;let o=await n.storageState(),i=lh.join(lh.dirname(r),`.${lh.basename(r)}.${process.pid}.${uae(4).toString("hex")}.tmp`);ws.writeFileSync(i,JSON.stringify(o),{mode:384}),ws.chmodSync(i,384),ws.renameSync(i,r),U("[browser/vault] saved session",{profile:t,file:r})}catch(r){U("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as fae}from"crypto";function aL(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&gae.test(e.label))}function lL(e){return fae("sha256").update(e,"utf8").digest("hex").slice(0,8)}function cL(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var gae,uh=y(()=>{"use strict";gae=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as hae}from"node:crypto";function yae(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function bae(e,t,n){return`el_${hae("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function wae(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function uL(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function pL(e,t){let n=e.role??"",r=e.name??"";dL.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])pL(i,t)}async function Sae(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},mL).catch(()=>[])}async function vae(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},mL).catch(()=>[])}function kae(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function dh(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=kae(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Sae(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,m,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],pL(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await vae(e)).filter(F=>dL.has(F.role??"")));let S=new Map;for(let P of m){let F=uL(P.name),V=S.get(F);(!V||V.bbox.w===0&&P.bbox.w>0)&&S.set(F,P)}let v=b.map(P=>({ax:P,dom:S.get(uL(P.name??""))})),E=r?v:v.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,F)=>{let V=P.dom?.bbox.y??0,$=F.dom?.bbox.y??0;if(V!==$)return V-$;let W=P.dom?.bbox.x??0,K=F.dom?.bbox.x??0;return W-K}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((P,F)=>{let V=P.ax.role??"generic",$=P.ax.name??"",W=bae(V,$,F),K=P.dom?.bbox??{x:0,y:0,w:0,h:0},I=P.dom?.type??null,L=null;P.ax.value!==void 0&&P.ax.value!==null&&(L=String(P.ax.value)),P.ax.checked!==void 0&&(L=String(P.ax.checked)),aL({role:V,kind:I})&&(L="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let D;P.dom?.testId?D=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(D=`#${P.dom.id}`);let B={id:W,role:V,label:yae($),kind:I,value:L,state:M,bbox:K};return D!==void 0&&(B.selector=D),B}),O="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?O="loading":P==="interactive"?O="navigating":O="idle"}catch{O="navigating"}O!=="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 _=wae(f),A=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:_,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:O,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var dL,mL,fL=y(()=>{"use strict";uh();dL=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);mL="a[href], button, input, select, textarea, [role], [tabindex], label"});async function gL(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function XE(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>gL(e,i)))).filter(o=>o!==null)}async function Tae(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function QE(e,t,n){switch(t.kind){case"element_id":return Eae(e,t,n);case"selector":return Rae(e,t);case"semantic":return xae(e,t)}}async function Eae(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await XE(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Rae(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await XE(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function xae(e,t){return t.role!==void 0?Aae(e,t.text,t.role):Cae(e,t.text,t)}async function Aae(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await XE(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Cae(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Tae(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=d.slice(0,5),f=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let w=await gL(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var hL=y(()=>{"use strict"});async function ZE(e,t,n,r){let o=e.url();if(o===n)return null;let i=ih(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var yL=y(()=>{"use strict";sh()});import{randomBytes as _ae}from"crypto";import{mkdir as Iae,stat as Pae,writeFile as Mae}from"fs/promises";import{join as eR}from"path";import{gzip as Oae}from"zlib";import{promisify as $ae}from"util";function Dae(e){return eR(ur(e),"browser")}function Fae(e){return eR(Dae(e),"screenshots")}function Lae(){return new Date().toISOString().replace(/[:.]/g,"-")}function Nae(){return _ae(3).toString("hex")}async function tR(e,t,n){if(t.length>bL)throw new Error(`writeScreenshotSidecar: buffer exceeds ${bL} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Fae(e);await Iae(r,{recursive:!0});let o=`${Lae()}-${Nae()}-${n}.png`,i=eR(r,o);await Mae(i,t);let{size:s}=await Pae(i);return{path:i,bytes:s}}var tGe,bL,wL=y(()=>{"use strict";q();uh();tGe=$ae(Oae);bL=5*1024*1024});var vL={};$o(vL,{PlaywrightProvider:()=>nR});function SL(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var nR,kL=y(()=>{"use strict";sL();fL();hL();sh();yL();wL();nR=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new ch(t)}async open(t){let n=ih(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await ZE(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await dh(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await dh(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await QE(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${SL(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await ZE(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await dh(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await QE(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${SL(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await tR(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await tR(n,o,r);return i}catch{return null}}}});var vs={};$o(vs,{__resetBrowserRegistryForTests:()=>Hae,browserProviderActive:()=>jae,closeBrowserProvider:()=>rR,getBrowserProvider:()=>Uae,peekBrowserProvider:()=>Wae});function TL(){Promise.resolve(rR()).then(()=>{process.exit(130)})}function EL(){Promise.resolve(rR()).then(()=>{process.exit(143)})}function RL(){xr=null}function Bae(){ph||(process.on("SIGINT",TL),process.on("SIGTERM",EL),process.on("exit",RL),ph=!0)}function xL(){ph&&(process.removeListener("SIGINT",TL),process.removeListener("SIGTERM",EL),process.removeListener("exit",RL),ph=!1)}async function Uae(e){return xr!==null?xr:(Ss!==null||(Ss=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(kL(),vL)),n=nL(e),r=new t(n);return Bae(),xr=r,Ss=null,r})()),Ss)}async function rR(){if(xr===null)return;let e=xr;xr=null,Ss=null,xL(),await e.shutdown()}function jae(){return xr!==null}function Wae(){return xr}function Hae(){xr=null,Ss=null,xL()}var xr,Ss,ph,ks=y(()=>{"use strict";sh();xr=null,Ss=null,ph=!1});async function AL(e,t){try{return await KF(e,t)}catch(n){return U("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Jae(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ks(),vs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function CL(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Jae,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await oh(n,e,{headers:Vae,signal:t.signal},o);l=d.status,a=d.url||e;let m=d.headers.get("content-type")??"";if(d.ok){if(zae.test(m))throw new Error(`web_scrape markdown mode received binary content (${m.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(qae.test(m)&&!Gae.test(m))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await AL(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof zn||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=KE({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Md(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Md(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Md(d.finalUrl,o);let m=await AL(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||m.textLength>=i.textLength){let f=KE({html:d.html,extractedTextLength:m.textLength});return{title:m.title,markdown:m.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof zn)throw d;if(i===null){let m=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${m}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Gae,qae,zae,Vae,_L=y(()=>{"use strict";GF();GE();JE();fe();Gae=/(text\/html|application\/xhtml\+xml)/i,qae=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,zae=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Vae={"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 Qae(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Yae,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Xae),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=Ye(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function IL(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Qae({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function PL(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
317
|
+
${xn(e,{headless:t,latched:n})}`,{cause:e})}var oL,sae,aae,rL,cae,ah=y(()=>{"use strict";oL=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],sae="pnpm exec playwright install chromium",aae=4;cae="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 ws from"node:fs";import lh from"node:path";import{randomBytes as uae}from"node:crypto";import{chromium as dae}from"playwright";function pae(){try{return"5.110.3"}catch{}try{let e=lh.resolve(import.meta.dirname,"../../../package.json"),t=ws.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var mae,ch,sL=y(()=>{"use strict";ah();q();fe();mae=pae(),ch=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}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=dae.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=$d(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{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",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(m){throw i??m}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${mae}`}}loadStorageState(t){let n=Bu(t);try{if(!ws.existsSync(n))return;let r=JSON.parse(ws.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Bu(t);if(!ws.existsSync(r))return;let o=await n.storageState(),i=lh.join(lh.dirname(r),`.${lh.basename(r)}.${process.pid}.${uae(4).toString("hex")}.tmp`);ws.writeFileSync(i,JSON.stringify(o),{mode:384}),ws.chmodSync(i,384),ws.renameSync(i,r),U("[browser/vault] saved session",{profile:t,file:r})}catch(r){U("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as fae}from"crypto";function aL(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&gae.test(e.label))}function lL(e){return fae("sha256").update(e,"utf8").digest("hex").slice(0,8)}function cL(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var gae,uh=y(()=>{"use strict";gae=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as hae}from"node:crypto";function yae(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function bae(e,t,n){return`el_${hae("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function wae(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function uL(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function pL(e,t){let n=e.role??"",r=e.name??"";dL.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])pL(i,t)}async function Sae(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},mL).catch(()=>[])}async function vae(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},mL).catch(()=>[])}function kae(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function dh(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=kae(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Sae(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,m,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],pL(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await vae(e)).filter(F=>dL.has(F.role??"")));let S=new Map;for(let P of m){let F=uL(P.name),V=S.get(F);(!V||V.bbox.w===0&&P.bbox.w>0)&&S.set(F,P)}let v=b.map(P=>({ax:P,dom:S.get(uL(P.name??""))})),E=r?v:v.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);E.sort((P,F)=>{let V=P.dom?.bbox.y??0,$=F.dom?.bbox.y??0;if(V!==$)return V-$;let W=P.dom?.bbox.x??0,K=F.dom?.bbox.x??0;return W-K}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((P,F)=>{let V=P.ax.role??"generic",$=P.ax.name??"",W=bae(V,$,F),K=P.dom?.bbox??{x:0,y:0,w:0,h:0},I=P.dom?.type??null,L=null;P.ax.value!==void 0&&P.ax.value!==null&&(L=String(P.ax.value)),P.ax.checked!==void 0&&(L=String(P.ax.checked)),aL({role:V,kind:I})&&(L="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let D;P.dom?.testId?D=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(D=`#${P.dom.id}`);let B={id:W,role:V,label:yae($),kind:I,value:L,state:M,bbox:K};return D!==void 0&&(B.selector=D),B}),O="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?O="loading":P==="interactive"?O="navigating":O="idle"}catch{O="navigating"}O!=="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 _=wae(f),A=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:A,url:g,title:h,textSummary:_,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:O,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var dL,mL,fL=y(()=>{"use strict";uh();dL=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);mL="a[href], button, input, select, textarea, [role], [tabindex], label"});async function gL(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function XE(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>gL(e,i)))).filter(o=>o!==null)}async function Tae(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function QE(e,t,n){switch(t.kind){case"element_id":return Eae(e,t,n);case"selector":return Rae(e,t);case"semantic":return xae(e,t)}}async function Eae(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await XE(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Rae(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await XE(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function xae(e,t){return t.role!==void 0?Aae(e,t.text,t.role):Cae(e,t.text,t)}async function Aae(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await XE(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Cae(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Tae(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=d.slice(0,5),f=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let w=await gL(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var hL=y(()=>{"use strict"});async function ZE(e,t,n,r){let o=e.url();if(o===n)return null;let i=ih(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var yL=y(()=>{"use strict";sh()});import{randomBytes as _ae}from"crypto";import{mkdir as Iae,stat as Pae,writeFile as Mae}from"fs/promises";import{join as eR}from"path";import{gzip as Oae}from"zlib";import{promisify as $ae}from"util";function Dae(e){return eR(ur(e),"browser")}function Fae(e){return eR(Dae(e),"screenshots")}function Lae(){return new Date().toISOString().replace(/[:.]/g,"-")}function Nae(){return _ae(3).toString("hex")}async function tR(e,t,n){if(t.length>bL)throw new Error(`writeScreenshotSidecar: buffer exceeds ${bL} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Fae(e);await Iae(r,{recursive:!0});let o=`${Lae()}-${Nae()}-${n}.png`,i=eR(r,o);await Mae(i,t);let{size:s}=await Pae(i);return{path:i,bytes:s}}var tGe,bL,wL=y(()=>{"use strict";q();uh();tGe=$ae(Oae);bL=5*1024*1024});var vL={};$o(vL,{PlaywrightProvider:()=>nR});function SL(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var nR,kL=y(()=>{"use strict";sL();fL();hL();sh();yL();wL();nR=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new ch(t)}async open(t){let n=ih(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await ZE(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await dh(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await dh(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await QE(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${SL(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await ZE(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await dh(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await QE(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${SL(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await tR(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await tR(n,o,r);return i}catch{return null}}}});var vs={};$o(vs,{__resetBrowserRegistryForTests:()=>Hae,browserProviderActive:()=>jae,closeBrowserProvider:()=>rR,getBrowserProvider:()=>Uae,peekBrowserProvider:()=>Wae});function TL(){Promise.resolve(rR()).then(()=>{process.exit(130)})}function EL(){Promise.resolve(rR()).then(()=>{process.exit(143)})}function RL(){xr=null}function Bae(){ph||(process.on("SIGINT",TL),process.on("SIGTERM",EL),process.on("exit",RL),ph=!0)}function xL(){ph&&(process.removeListener("SIGINT",TL),process.removeListener("SIGTERM",EL),process.removeListener("exit",RL),ph=!1)}async function Uae(e){return xr!==null?xr:(Ss!==null||(Ss=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(kL(),vL)),n=nL(e),r=new t(n);return Bae(),xr=r,Ss=null,r})()),Ss)}async function rR(){if(xr===null)return;let e=xr;xr=null,Ss=null,xL(),await e.shutdown()}function jae(){return xr!==null}function Wae(){return xr}function Hae(){xr=null,Ss=null,xL()}var xr,Ss,ph,ks=y(()=>{"use strict";sh();xr=null,Ss=null,ph=!1});async function AL(e,t){try{return await KF(e,t)}catch(n){return U("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Jae(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ks(),vs));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function CL(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Jae,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await oh(n,e,{headers:Vae,signal:t.signal},o);l=d.status,a=d.url||e;let m=d.headers.get("content-type")??"";if(d.ok){if(zae.test(m))throw new Error(`web_scrape markdown mode received binary content (${m.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(qae.test(m)&&!Gae.test(m))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await AL(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof zn||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=KE({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Md(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Md(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Md(d.finalUrl,o);let m=await AL(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||m.textLength>=i.textLength){let f=KE({html:d.html,extractedTextLength:m.textLength});return{title:m.title,markdown:m.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof zn)throw d;if(i===null){let m=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${m}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Gae,qae,zae,Vae,_L=y(()=>{"use strict";GF();GE();JE();fe();Gae=/(text\/html|application\/xhtml\+xml)/i,qae=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,zae=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Vae={"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 Qae(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Yae,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Xae),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=Ye(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function IL(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Qae({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function PL(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
318
318
|
|
|
319
319
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
320
320
|
`).trimEnd()}var Yae,Xae,ML=y(()=>{"use strict";kr();Yae="https://api.exa.ai/search",Xae=10});function mh(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var Ts=y(()=>{"use strict";ah()});function ole(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=Zae;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,ele)}let a=tle;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,nle)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function oR(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Yr(e,t),truncated:!0}}function ile(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=ole(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let m=await VE(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!m.allowed)return{content:`web_scrape blocked: ${m.reason}`,isError:!0}}if(s.mode==="raw"){let m;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};m=await oh(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof zn?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!m.ok)return{content:`web_scrape HTTP ${m.status} ${m.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await m.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=oR(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let m=await CL(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(m.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=oR(qF(m.markdown,m.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(m){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(m instanceof zn)return{content:`web_scrape blocked: ${m.message}`,isError:!0};let f=m instanceof Error?m.message:String(m),g=zt(m)&&!YE(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Od()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=IL({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let m=await d.search(s.query,{limit:rle,timeoutMs:s.timeoutMs,signal:a.signal}),f=oR(PL(s.query,m),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(m){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${m instanceof Error?m.message:String(m)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var Zae,ele,tle,nle,rle,OL,$L=y(()=>{"use strict";_L();ML();JE();Go();GE();Ts();Zae=3e4,ele=12e4,tle=1e5,nle=1e6,rle=10;OL=ile()});import{existsSync as FL,mkdirSync as sle,readFileSync as ale,renameSync as lle,unlinkSync as cle,writeFileSync as ule}from"node:fs";import{dirname as DL,join as dle}from"node:path";import{randomBytes as ple}from"node:crypto";function An(e){let t=e??zk();if(!FL(t))return[];try{let n=ale(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Es(e,t){let n=t??zk();sle(DL(n),{recursive:!0});let r=dle(DL(n),`.schedules.json.${process.pid}.${ple(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{ule(r,o,"utf-8"),lle(r,n)}catch(i){try{FL(r)&&cle(r)}catch{}throw i}}function fh(e,t){let n=An(t),r=n.map(l=>l.id),o=mle(e.name),i=fle(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Es(n,t),a}function gh(e,t){let n=An(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Es(o,t),!0)}function Dd(e,t){return An(t).find(n=>n.id===e)}function mle(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function fle(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function LL(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var hh=y(()=>{"use strict";q()});import{existsSync as gle,readFileSync as hle}from"node:fs";import{join as yle}from"node:path";async function Vn(e,t,n){let r;try{let o=yle(Rf("default"),"port");if(!gle(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=hle(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var Yo,iR=y(()=>{"use strict";q();Yo="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 ble}from"node:fs";import{readFile as wle}from"node:fs/promises";var NL,BL,UL,jL,WL=y(()=>{"use strict";hh();q();iR();NL=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=fh({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await Vn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await Vn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:Yo}})}},BL=async(e,t)=>{let n=An();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})))}},UL=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=cr();if(!ble(i))return{content:JSON.stringify([])};let s;try{let c=await wle(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1253,7 +1253,7 @@ ${t}`:i,a=new ke({parentAbortSignal:n?.abortSignal,...r?.traceWriter!==void 0?{t
|
|
|
1253
1253
|
`);continue}let g=[...a,f].join(":"),h=Lx(d,t);if(!h.body)try{let b=Ny(ufe(d,"utf-8"));b.startsWith(`---
|
|
1254
1254
|
`)||(h.body=b.trim())}catch{continue}if(!h.body||h.body.length===0){k.AFK_DEBUG&&process.stderr.write(`[afk] skipping command with empty body: ${Ye(d)}
|
|
1255
1255
|
`);continue}o.push({...h,name:g,origin:"command"})}}return i(n,[],0),o.sort((s,a)=>s.name<a.name?-1:s.name>a.name?1:0),o}var ffe,gfe,EW=y(()=>{"use strict";Fl();Dx();H();kr();ffe=10,gfe=/[\u0000-\u001F\u007F-\u009F]/});import{existsSync as hfe,readFileSync as yfe}from"fs";import{join as bfe}from"path";function yo(e){let t=bfe(e,".claude-plugin","plugin.json");if(!hfe(t))return{name:null,version:null};try{let n=JSON.parse(yfe(t,"utf8"));return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():null,version:typeof n.version=="string"&&n.version.trim()?n.version.trim():null}}catch{return{name:null,version:null}}}var kp=y(()=>{"use strict"});import{z as X}from"zod";var Tp,wfe,Sfe,PA,RW,xW,AW,CW,Ep,yb=y(()=>{"use strict";Tp=1,wfe=X.object({toolName:X.string(),toolUseId:X.string().optional(),input:X.string().optional(),inputRaw:X.string().optional(),result:X.string().optional(),isError:X.boolean().optional()}).passthrough(),Sfe=X.object({user:X.string().default(""),assistant:X.string().default(""),timestamp:X.number().optional(),toolEvents:X.array(wfe).optional()}).passthrough(),PA=X.object({sessionId:X.string().optional(),name:X.string().optional(),source:X.enum(["cli","telegram","web"]).optional(),telegramChatId:X.number().optional(),model:X.string(),startedAt:X.number(),savedAt:X.number(),totalTurns:X.number(),totalCostUsd:X.number().optional(),totalTokens:X.number().optional(),totalDurationMs:X.number().optional(),turns:X.array(Sfe).default([]),forkedFrom:X.string().optional(),forkedAt:X.number().optional()}).passthrough(),RW=X.enum(["fully_achieved","partially_achieved","not_achieved","aborted"]),xW=X.enum(["not_persisted","persisted","unknown"]),AW=X.object({tool:X.string(),label:X.string().optional()}),CW=X.object({files_written:X.number().int(),files_edited:X.number().int(),bash_commands:X.number().int(),commits:X.number().int(),mutated:X.boolean()}),Ep=X.object({facet_version:X.number().int(),session_id:X.string(),source:X.enum(["cli","telegram","web","unknown"]),model:X.string(),derived_at:X.string(),derived_from:X.literal("afk-session"),source_session_path:X.string(),source_session_mtime_ms:X.number(),subagent_persistence:xW,start_time:X.string(),end_time:X.string(),duration_minutes:X.number(),underlying_goal:X.string(),first_prompt:X.string(),goal_categories:X.record(X.string(),X.number()),session_type:X.string(),brief_summary:X.string(),total_turns:X.number().int(),user_message_count:X.number().int(),assistant_message_count:X.number().int(),tool_counts:X.record(X.string(),X.number()),commands:X.array(X.string()),skills:X.array(X.string()),subagents:X.array(AW),tool_errors:X.number().int(),tool_error_categories:X.record(X.string(),X.number()),friction_counts:X.record(X.string(),X.number()),friction_detail:X.string(),outcome:RW,primary_success:X.string(),world_changes:CW,decisions:X.array(X.string()),evidence_pointers:X.array(X.string())}).passthrough()});import{basename as vfe}from"path";function Afe(e){if(e)try{let t=JSON.parse(e);return t&&typeof t=="object"?t:void 0}catch{return}}function bb(e){return typeof e=="string"?e:void 0}function wb(e,t){let n=e.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n}function Cfe(e){return e.replace(/[-_]+/g," ").trim()}function _fe(e,t){return IW.test(e)?"slash_command":t==="telegram"?"chat":"task"}function Ife(e){let t=new Map,n=[];for(let r of e)r.toolUseId===void 0?n.push(r):t.set(r.toolUseId,r);return[...t.values(),...n]}function Rp(e,t={}){let n=e.turns??[],r=Ife(n.flatMap(K=>K.toolEvents??[])),o={},i={},s=[],a=[],l=[],c=0,u=0,d=0,m=0,f=0;for(let K of r){let I=K.toolName;o[I]=(o[I]??0)+1,K.isError===!0&&(c+=1,i[I]=(i[I]??0)+1);let L=Afe(K.inputRaw??K.input);if(I==="write_file"&&(u+=1),I==="edit_file"&&(d+=1),I==="bash"){m+=1;let M=bb(L?.command)??K.input;M&&xfe.test(M)&&(f+=1)}if(Tfe.has(I)){let M=bb(L?.file_path);M&&!l.includes(M)&&l.length<Rfe&&l.push(M)}if(kfe.has(I)){let M;I==="skill"?(M=bb(L?.name),M&&!a.includes(M)&&a.push(M)):I==="agent"?M=bb(L?.id_prefix):M="compose",s.push(M?{tool:I,label:M}:{tool:I})}}let g=n[0]?.user??"",h=e.source??"cli",b=_fe(g,h),w=[];for(let K of n){let L=IW.exec(K.user??"")?.[1];L&&!w.includes(L)&&w.push(L)}let S=n.filter(K=>(K.user??"").trim().length>0).length,v=n.filter(K=>(K.assistant??"").trim().length>0).length,E=[...n].reverse().find(K=>(K.assistant??"").trim().length>0)?.assistant??"",T;n.length===0?T="aborted":E.trim().length===0?T="partially_achieved":T="fully_achieved";let O=T==="fully_achieved"||T==="partially_achieved"?wb(E||g||b,160)||b:"none",_=c>0?`${c} tool error(s): ${Object.entries(i).map(([K,I])=>`${K}\xD7${I}`).join(", ")}`:"",A=e.name?Cfe(e.name):wb(g,80),C=wb(E||g,Efe),P=wb(A?`${A} \u2014 ${C}`:C,400)||"empty session",F=e.sessionId??(t.sourceSessionPath?vfe(t.sourceSessionPath,".json"):"unknown"),V=e.totalDurationMs&&e.totalDurationMs>0?e.totalDurationMs:Math.max(0,e.savedAt-e.startedAt),$=t.sourceSessionPath?[...l,t.sourceSessionPath]:l,W={facet_version:Tp,session_id:F,source:h==="telegram"?"telegram":h==="web"?"web":"cli",model:e.model,derived_at:(t.derivedAt??new Date).toISOString(),derived_from:"afk-session",source_session_path:t.sourceSessionPath??"",source_session_mtime_ms:t.sourceSessionMtimeMs??e.savedAt,subagent_persistence:"not_persisted",start_time:new Date(e.startedAt).toISOString(),end_time:new Date(e.savedAt).toISOString(),duration_minutes:Number((V/6e4).toFixed(2)),underlying_goal:g.slice(0,_W),first_prompt:g.slice(0,_W),goal_categories:{[b]:1},session_type:b,brief_summary:P,total_turns:n.length,user_message_count:S,assistant_message_count:v,tool_counts:o,commands:w,skills:a,subagents:s,tool_errors:c,tool_error_categories:i,friction_counts:{...i},friction_detail:_,outcome:T,primary_success:O,world_changes:{files_written:u,files_edited:d,bash_commands:m,commits:f,mutated:u>0||d>0||f>0},decisions:[],evidence_pointers:$};return Ep.parse(W)}var kfe,Tfe,_W,Efe,Rfe,xfe,IW,MA=y(()=>{"use strict";yb();kfe=new Set(["agent","compose","skill"]),Tfe=new Set(["read_file","write_file","edit_file"]),_W=1e3,Efe=240,Rfe=50,xfe=/\bgit\s+commit(?![\w-])/,IW=/^\s*\/([a-zA-Z][\w-]*)/});import{existsSync as Sb,mkdirSync as Pfe,readFileSync as PW,readdirSync as Mfe,renameSync as Ofe,statSync as $fe,writeFileSync as Dfe}from"fs";import{basename as Ffe,dirname as Lfe,join as MW}from"path";function OW(e,t){return Ef(e),MW(t,`${e}.json`)}function Nfe(e,t){return Ef(e),MW(t,`${e}.json`)}function vb(e,t=tt()){let n=OW(e,t);if(Sb(n))try{let r=JSON.parse(PW(n,"utf8")),o=PA.safeParse(r);return o.success?o.data:void 0}catch{return}}function Bfe(e){if(Sb(e))try{let t=JSON.parse(PW(e,"utf8")),n=Ep.safeParse(t);return n.success?n.data:void 0}catch{return}}function Ufe(e,t){Pfe(Lfe(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;Dfe(n,`${JSON.stringify(t,null,2)}
|
|
1256
|
-
`,"utf8"),Ofe(n,e)}function jfe(e,t){return e.facet_version===Tp&&e.source_session_mtime_ms===t}function OA(e,t={}){let n=t.sessionsDir??tt(),r=t.cacheDir??g0(),o=OW(e,n);if(!Sb(o))return;let i=$fe(o).mtimeMs,s=Nfe(e,r);if(!t.force){let c=Bfe(s);if(c&&jfe(c,i))return c}let a=vb(e,n);if(!a)return;let l=Rp(a,{sourceSessionPath:o,sourceSessionMtimeMs:i});return Ufe(s,l),l}function $A(e={}){let t=e.sessionsDir??tt();return Sb(t)?Mfe(t).filter(n=>n.endsWith(".json")).map(n=>Ffe(n,".json")):[]}var $W=y(()=>{"use strict";q();MA();yb()});var DW=y(()=>{"use strict";yb();MA();$W()});import{readFileSync as Wfe}from"node:fs";import{join as Hfe}from"node:path";function My(e,t){let n=Is(e,t),r=t?.excludeName,i=(r!==void 0&&r.length>0?n.filter(a=>a.name!==r&&!a.name.endsWith(`:${r}`)):n).filter(a=>a.source!=="command");if(i.length===0)return"";let s=[];for(let a of i){let l=a.argumentHint?`${a.argumentHint}`:"",c=l?`- \`${a.name} ${l}\`: ${a.description}`:`- ${a.name}: ${a.description}`;s.push(c),a.whenToUse&&s.push(` When to use: ${a.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either
|
|
1256
|
+
`,"utf8"),Ofe(n,e)}function jfe(e,t){return e.facet_version===Tp&&e.source_session_mtime_ms===t}function OA(e,t={}){let n=t.sessionsDir??tt(),r=t.cacheDir??g0(),o=OW(e,n);if(!Sb(o))return;let i=$fe(o).mtimeMs,s=Nfe(e,r);if(!t.force){let c=Bfe(s);if(c&&jfe(c,i))return c}let a=vb(e,n);if(!a)return;let l=Rp(a,{sourceSessionPath:o,sourceSessionMtimeMs:i});return Ufe(s,l),l}function $A(e={}){let t=e.sessionsDir??tt();return Sb(t)?Mfe(t).filter(n=>n.endsWith(".json")).map(n=>Ffe(n,".json")):[]}var $W=y(()=>{"use strict";q();MA();yb()});var DW=y(()=>{"use strict";yb();MA();$W()});import{readFileSync as Wfe}from"node:fs";import{join as Hfe}from"node:path";function My(e,t){let n=Is(e,t),r=t?.excludeName,i=(r!==void 0&&r.length>0?n.filter(a=>a.name!==r&&!a.name.endsWith(`:${r}`)):n).filter(a=>a.source!=="command");if(i.length===0)return"";let s=[];for(let a of i){let l=a.argumentHint?`${a.argumentHint}`:"",c=l?`- \`${a.name} ${l}\`: ${a.description}`:`- ${a.name}: ${a.description}`;s.push(c),a.whenToUse&&s.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.","",...s].join(`
|
|
1257
1257
|
`)}function Is(e,t){let n=[],r=new Set,o=k.AFK_INTERNAL==="1",i=qn(cn());ho(Mu(),"user"),RB("project"),ho(bf(t?.cwd),"project");for(let{dir:l,origin:c}of i.skillRoots)ho(l,c);for(let l of Cr()){let c=Qe(l);Mn(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 s=e??kb(t),a=jy();for(let l of s){if(l.type!=="local")continue;let c=[...Fx(l.path,a),...IA(l.path,a)];for(let u of c)!u.name||r.has(u.name)||Mn({audience:u.audience},o)&&(n.push({name:u.name,description:u.description??`Skill from plugin at ${l.path}`,source:u.origin==="command"?"command":"plugin",argumentHint:u.argumentHint}),r.add(u.name))}return n}function yp(e,t){let n=new Map,r=e??kb(t),o=jy();for(let i of r){if(i.type!=="local")continue;let s=[...Fx(i.path,o),...IA(i.path,o)];for(let a of s)a.name&&a.body&&a.body.length>0&&!n.has(a.name)&&n.set(a.name,{body:a.body,pluginPath:i.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 FW(e,t=()=>{}){let n=e??kb(),r=[],o=new Set;for(let i of n){if(i.type!=="local")continue;let s=yo(i.path).name;if(s!==null)for(let a of Ky(Hfe(i.path,"agents"))){let l=Ye(a),c;try{c=Wfe(a,"utf8")}catch(m){let f=Ye(m instanceof Error?m.message:String(m));t(`[afk] agents: cannot read ${l}: ${f}`);continue}let u=$s(c,m=>t(`[afk] agents: ${l}: ${m}`));if(u===void 0)continue;let d=`${s}:${u.name}`;o.has(d)||(o.add(d),r.push({name:d,definition:u.definition,source:`plugin:${s}`,filePath:a,...u.bashReadOnly===!0?{bashReadOnly:!0}:{},...u.ignoredKeys!==void 0?{ignoredKeys:u.ignoredKeys}:{}}))}}return r}function kb(e){return[...nr(wf(e?.cwd)),...nr(),...nr(Ma()),...qn(cn()).pluginRoots.flatMap(({dir:t,binary:n})=>nr(t,{trustAll:!0,sourceEnabled:xF(n)}))]}async function Xl(){await kW(kb(),{pluginApi:{registerSkill:Vt,listSkills:Cr,getSkill:Qe,loadSkillPrompts:ze,env:k,SubagentManager:ke,describeFailure:Ft,discoverPluginSkillBodies:yp,getAgentFrameworkDir:_t,getSkillsDir:Mu,getSessionsDir:tt,getOrDeriveFacet:OA,listSessionIds:$A,deriveSessionFacet:Rp,loadStoredSession:vb}})}var Xn=y(()=>{"use strict";_A();Jt();Pn();CA();mo();TW();Fl();EW();kp();dp();qx();kr();ot();bt();DW();q();H();no()});function Ql(e,t,n){let r=ad({cwd:t,...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=[e.toolBase];return e.userSystem&&o.push(e.userSystem),o.push(e.memoryPrompt),e.hotMemory.length>0&&o.push(e.hotMemory),o.push(r),e.manifest.length>0&&o.push(e.manifest),o.join(`
|
|
1258
1258
|
|
|
1259
1259
|
`)}var Tb=y(()=>{"use strict";Mt()});function LW(e){let{config:t,cwd:n}=e,r=e.hasSkillExecutor?My(void 0,{cwd:n,...typeof t.skillDispatchName=="string"&&t.skillDispatchName.length>0?{excludeName:t.skillDispatchName}:{}}):"",o=Zh(t.isSkillDispatch),i=ey(e.readOnlyMemory),s={surface:e.surface,sessionId:t.sessionId,depth:t.depth,maxDepth:t.maxDepth,workspace:e.runtimeStateSource.getWorkspace()},a={toolBase:o,memoryPrompt:i,hotMemory:t.hotMemory??"",manifest:r,userSystem:e.userSystem};return{stableSystemPrefix:a,toolSystemAppend:Ql(a,n,s)}}var NW=y(()=>{"use strict";Xn();zR();Tb()});import Kfe from"@anthropic-ai/sdk";function BW(e){if(e===void 0)return null;if(typeof e=="string")return e.length>0?e:null;if(typeof e=="object"&&e!==null&&"append"in e){let t=e.append;return t&&t.length>0?t:null}return null}function UW(e,t,n,r){let o=t.config,{localMode:i,token:s}=eB(o);if(!s||s.length===0)throw new Error(`${n} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let a=Jf(s),{client:l,throttleQueue:c,systemPrefix:u,tokenRefresher:d}=pB({config:o,token:s,authMode:a,localMode:i,factory:e.providerFactory??Gh(),createClient:A=>new Kfe(A)}),m=BW(o.systemPrompt),f=typeof o.model=="string"&&o.model.length>0?Tt(o.model)??o.model:r,g=ng(o,f),h=o.permissionMode??"default";e.setCurrentPermissionMode(h),e.ensureSharedRoots(o.cwd),o.cwd&&e.setCurrentCwd(o.cwd);let b=e.getSharedReadRoots(),w=e.getSharedWriteRoots();o.readRoots&&b&&b.length<=1&&(b.length=0,b.push(...o.readRoots)),o.writeRoots&&w&&w.length<=1&&(w.length=0,w.push(...o.writeRoots));let{queryDispatcher:S,runtimeStateSource:v,toolDefs:E,resolvedSessionId:T}=kB({config:o,model:f,permissionMode:h,surface:e.surface,providerName:n,externalTools:e.externalTools,sharedReadRoots:b,sharedWriteRoots:w,getCwd:()=>e.getCurrentCwd()||o.cwd||process.cwd(),getMcpTools:()=>e.mcpManager?.getMcpTools()??[],getSubagents:()=>e.subagentExecutor?e.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]},getMintedSessionId:()=>e.getMintedSessionId(),setMintedSessionId:A=>{e.setMintedSessionId(A)},getPresenceSessionId:()=>e.getPresenceSessionId(),setPresenceSessionId:A=>{e.setPresenceSessionId(A)},buildDispatcher:(A,C)=>e.buildDispatcher(A,C)}),x=o.cwd||process.cwd(),{stableSystemPrefix:O,toolSystemAppend:_}=LW({config:o,cwd:x,surface:e.surface,readOnlyMemory:e.readOnlyMemory,hasSkillExecutor:!!e.skillExecutor,runtimeStateSource:v,userSystem:m});return vO({prompt:t.prompt,options:{model:f,maxTokens:g,system:_},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:i,model:f,maxTokens:g,cwd:x,systemPrefix:u,throttleQueue:c,tokenRefresher:d,queryDispatcher:S,runtimeStateSource:v,toolDefs:E,resolvedSessionId:T,stableSystemPrefix:O,toolSystemAppend:_}}var DA=y(()=>{"use strict";es();kn();ig();tB();qh();mB();TB();NW();jo()});function jW(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var WW=y(()=>{"use strict"});function xp(e){if(typeof e?.baseUrl=="string"&&e.baseUrl.length>0)return!1;let t=k.AFK_DISABLE_PROMPT_CACHE;if(t===void 0||t.length===0)return!0;let n=t.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function Bs(){let e=k.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":e==="1h"?"1h":Gfe}function Eb(e){return xp(e)&&Bs()==="1h"}function HW(e,t){if(e.length===0)return e;let n=e[e.length-1],r=GW(n,t);return r===n?e:[...e.slice(0,-1),r]}function KW(e,t){if(e.length===0)return e;let n=e[e.length-1],r=qfe(n,t);return r===n?e:[...e.slice(0,-1),r]}function qfe(e,t){let n=e.content;if(typeof n=="string")return n.length===0?e:{...e,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:t}}]};if(!Array.isArray(n)||n.length===0)return e;let r=n[n.length-1],o=GW(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function GW(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}var Gfe,Zl=y(()=>{"use strict";H();Gfe="1h"});var FA=y(()=>{"use strict";bs()});function Jfe(e){let t=n=>n===void 0?void 0:n*LA;return{inputPerMTok:e.inputPerMTok*LA,outputPerMTok:e.outputPerMTok*LA,...t(e.cacheWrite5mPerMTok)!==void 0?{cacheWrite5mPerMTok:t(e.cacheWrite5mPerMTok)}:{},...t(e.cacheWrite1hPerMTok)!==void 0?{cacheWrite1hPerMTok:t(e.cacheWrite1hPerMTok)}:{},...t(e.cacheReadPerMTok)!==void 0?{cacheReadPerMTok:t(e.cacheReadPerMTok)}:{}}}function Yfe(e){return e.responseSpeed??e.requestSpeed??"standard"}function Xfe(e){let t=NA.get(e);if(t)return t;let n=e.replace(zfe,"");return n===e?void 0:NA.get(n)}function BA(e,t,n,r,o,i,s={}){let a=Xfe(e);if(!a)return;let l=Yfe(s)==="fast"&&Vfe.test(e)?Jfe(a):a,c=1e6,u=C=>Number.isFinite(C)&&C>=0?C:0,d=u(t),m=u(n),f=u(r),g=u(o),h=d/c*l.inputPerMTok,b=m/c*l.outputPerMTok,w=l.cacheWrite5mPerMTok??l.inputPerMTok*1.25,S=l.cacheWrite1hPerMTok??l.inputPerMTok*2,v=l.cacheReadPerMTok??l.inputPerMTok*.1,E=i??{ephemeral5m:g,ephemeral1h:0},T=u(E.ephemeral5m),x=u(E.ephemeral1h),O=Math.max(0,g-(T+x)),_=T/c*w+x/c*S+O/c*S,A=f/c*v;return h+b+_+A}var NA,zfe,LA,Vfe,UA=y(()=>{"use strict";NA=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}]]),zfe=/-\d{8}$/,LA=2,Vfe=/^claude-opus-(?:5|4-8)(?:-|$)/});function Qfe(e){let t=e.speed;return t==="fast"||t==="standard"?t:void 0}function Zfe(e){let t=o=>Number.isFinite(o)&&o>=0?o:0,n=e.cache_creation;if(n)return{ephemeral5m:t(n.ephemeral_5m_input_tokens??0),ephemeral1h:t(n.ephemeral_1h_input_tokens??0)};let r=t(e.cache_creation_input_tokens??0);return Bs()==="1h"?{ephemeral5m:0,ephemeral1h:r}:{ephemeral5m:r,ephemeral1h:0}}function jA(e,t,n,r){if(!e)return{stopReason:t??null};let o=Qfe(e),i={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null,raw:{...e,...o?{speed:o}:{}}};if(e.cache_read_input_tokens!=null&&(i.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(i.cacheCreationTokens=e.cache_creation_input_tokens),i.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let s=BA(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0,Zfe(e),{...r?{requestSpeed:r}:{},...o?{responseSpeed:o}:{}});s!==void 0&&(i.totalCostUsd=s)}return i}var qW=y(()=>{"use strict";Zl();UA()});var WA=y(()=>{"use strict";UA();qW();VR()});function Ap(e){return e>2147483647?2147483647:e}var HA=y(()=>{"use strict"});function VW(){let e=k.AFK_MODEL_TTFB_TIMEOUT_MS;if(e===void 0||e.trim()==="")return zW;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?zW:Ap(t)}function JW(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?void 0:(e<nge?e:rge)+tge}function YW(e,t){if(t<=0)return{signal:e,timedOut:()=>!1,firstByteSeen:()=>{},extend:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([e,n.signal]),o=!1,i=!1,s=Date.now()+t,a,l=d=>{a=setTimeout(()=>{o=!0,n.abort(new Error(ege))},Ap(d)),a.unref()};l(t);let c=()=>{i||(i=!0,clearTimeout(a))};return{signal:r,timedOut:()=>o,firstByteSeen:c,extend:d=>{i||o||typeof d!="number"||!Number.isFinite(d)||d<=0||(s+=d,clearTimeout(a),l(Math.max(1,s-Date.now())))},dispose:c}}var zW,ege,tge,nge,rge,KA=y(()=>{"use strict";H();HA();zW=18e4;ege="model_ttfb_timeout",tge=3e4,nge=6e4,rge=8e3});function QW(){let e=k.AFK_MODEL_STALL_TIMEOUT_MS;if(e===void 0||e.trim()==="")return XW;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?XW:Ap(t)}function eH(e){return e instanceof Error&&e.message===ZW}function GA(e){return new Error(`Model stream stalled: no output for ${Math.round(e/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 tH(e,t,n){if(t<=0)return{signal:e,timedOut:()=>!1,progress:()=>{},dispose:()=>{}};let r=new AbortController,o=AbortSignal.any([e,r.signal]),i,s=!1,a=!1,l=d=>{if(!(a||s)){s=!0,i=void 0;try{n?.({stallTimeoutMs:t,elapsedSinceLastProgressMs:Date.now()-d})}catch{}r.signal.aborted||r.abort(new Error(ZW))}};return{signal:o,timedOut:()=>s,progress:()=>{if(a||s)return;i!==void 0&&clearTimeout(i);let d=Date.now(),m=setTimeout(()=>l(d),t);m.unref(),i=m},dispose:()=>{a||(a=!0,i!==void 0&&clearTimeout(i),i=void 0)}}}var XW,ZW,Rb=y(()=>{"use strict";H();HA();XW=12e5;ZW="model_stream_stall_timeout"});function xb(e,t=Math.random){return e+Math.floor(t()*e*age)}function rH(e=Math.random){let t=sge-nH;return nH+Math.floor(e()*t)}function oH(e){return e.type==="turn.completed"&&e.usage.stopReason===mn}function iH(e){let t=k.AFK_OVERLOAD_PAUSE_MS;if(t!==void 0&&t.trim()!==""){let n=Number(t);if(Number.isFinite(n)&&n>=0)return Math.min(Math.floor(n),ige)}return e!==void 0&&lge.has(e)?oge:0}var qA,oge,ige,nH,sge,age,lge,Cp=y(()=>{"use strict";H();Ul();Ul();qA="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.",oge=600*1e3,ige=7200*1e3,nH=60*1e3,sge=120*1e3,age=.25;lge=new Set(["cli","repl","telegram","web"])});function sH(e){if(!Number.isFinite(e)||e<=0)return 0;let t=Math.floor(e*2/3);return Math.max(1,t)}function aH(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function _p(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}var Ab,Ip=y(()=>{"use strict";Ab=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*uge(e,t,n){re(e.traceWriter,{phase:"ttfb_timeout",durationMs:Date.now()-t,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:e.model,attempt:n}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId}}async function*VA(e,{input:t,turn:n,retry:r,requestStartedAt:o}){return e==="ttfb"?(r.ttfbRetries+=1,yield*uge(t,o,r.ttfbRetries),"continue"):e==="overload"?(r.overloadRetries+=1,re(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:r.overloadRetries}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},yield*lH(xb(5e3*Math.pow(2,r.overloadRetries-1)),t,n),t.signal.aborted?"terminated":"continue"):(r.streamIncompleteRetries+=1,re(t.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:r.streamIncompleteRetries}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},yield*lH(1e3*Math.pow(2,r.streamIncompleteRetries-1),t,n),t.signal.aborted?"terminated":"continue")}async function*lH(e,t,n){await dn(e,t.signal),t.signal.aborted&&(yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId})}var cH=y(()=>{"use strict";pe();Ms();Cp();Ip()});function dH(e){let t=e.fastModeController?.snapshotTurn({resolvedModelId:e.model,providerFamily:"anthropic-direct",hasCustomEndpoint:e.baseUrl!==void 0,executionPath:"top-level"}),n=t?.effective===!0,r=Wo(e.authMode,e.sessionId,e.requestId,e.effort!==void 0,Eb(e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{}),n);return{decision:t,runInput:{client:e.client,messages:e.messages,system:e.system,tools:e.tools,toolDispatcher:e.toolDispatcher,model:e.model,maxTokens:e.maxTokens,headers:r,signal:e.signal,ctx:{sessionId:e.sessionId},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...n?{fastMode:!0}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.softDeadlineMs!==void 0?{softDeadlineMs:e.softDeadlineMs}:{},...e.traceWriter?{traceWriter:e.traceWriter}:{},...e.subagentId!==void 0?{subagentId:e.subagentId}:{},...e.throttleQueue?{throttleQueue:e.throttleQueue}:{},...e.onUsageProgress?{onUsageProgress:e.onUsageProgress}:{}}}}function Cb(e,t){let n=e instanceof Error?e:new Error(String(e));if(!t||n.message.startsWith(uH))return n;let r=new Error(`${uH} ${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 i=Object.getOwnPropertyDescriptor(n,o);i!==void 0&&Object.defineProperty(r,o,i)}return r}var uH,JA=y(()=>{"use strict";es();Zl();uH="[Fast mode requested; no standard-mode fallback will be attempted]"});async function*pH(e,t,n){let r=t.throttleQueue;if(!r)return await e;r.resetAttempts();let o=Symbol("create-done"),i=!1,s=e.then(a=>(i=!0,a),a=>{throw i=!0,a});for(;;){for(let l of r.takeAll())n?.(l.retryAfterMs),yield{type:"rate_limit",sessionId:t.ctx.sessionId,status:l.status,attempt:l.attempt,...l.retryAfterMs!==void 0?{retryAfterMs:l.retryAfterMs}:{}};if(i)return await s;await Promise.race([s.then(()=>o,()=>o),r.waitForItem().then(()=>{})])}}var mH=y(()=>{"use strict"});function fH(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let i=o.content;for(let s=0;s<i.length;s++){let a=i[s];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:s,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var gH=y(()=>{"use strict"});function dge(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}async function pge(e,t,n,r,o){for(let i=0;;i++){if(i>0){let s=xb(5e3*Math.pow(2,i-1));if(await dn(s,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let a=s instanceof Error?s:new Error(String(s));if(aH(a)){if(i<3)continue;throw new _b}throw a}}}function mge(e){return{model:e.model,max_tokens:e.maxTokens,messages:e.messages,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0?{tools:e.tools.map(dge)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{},...e.fastMode===!0?{speed:"fast"}:{}}}async function*hH({input:e,turn:t,retry:n,ttfbTimeoutMs:r,stallTimeoutMs:o}){let i=xp({baseUrl:e.baseUrl})?KW(e.messages,Bs()):e.messages,s=mge({...e,messages:i,tools:t.windDownReason!==null?null:e.tools}),a=Date.now(),l=YW(e.signal,r),c=tH(l.signal,o,u=>{re(e.traceWriter,{phase:"idle_watchdog_fired",durationMs:u.elapsedSinceLastProgressMs,resolvedModel:e.model,metadata:{source:"model-stream",stallTimeoutMs:u.stallTimeoutMs,elapsedSinceLastProgressMs:u.elapsedSinceLastProgressMs}})});try{return{kind:"opened",events:yield*pH(pge(e.client,s,e.headers,c.signal,e.signal),e,d=>{let m=JW(d);m!==void 0&&l.extend(m)}),ttfb:l,stall:c,requestStartedAt:a}}catch(u){if(l.timedOut()&&!e.signal.aborted&&n.canRetryTtfb())return l.dispose(),c.dispose(),{kind:"retry-ttfb",requestStartedAt:a};if(l.dispose(),c.dispose(),e.signal.aborted)return yield{type:"turn.completed",usage:t.terminalUsage(),sessionId:e.ctx.sessionId},{kind:"terminated"};if(u instanceof _b)return{kind:"overload-exhausted"};let d=Cb(u,e.fastMode===!0);return d.message.includes("thinking")&&fH(e.messages,d),yield{type:"error",error:d},{kind:"terminated"}}}var _b,yH=y(()=>{"use strict";JA();Zl();pe();Ms();KA();Rb();Cp();Ip();mH();gH();_b=class extends Error{constructor(){super("Connection-phase overload budget exhausted"),this.name="ConnectionOverloadExhaustedError"}}});function bH(e,t){return e||t!==null}function wH(){return new fr("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 SH=y(()=>{"use strict";Ue()});function fge(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function gge(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:fge(a.partialJson)}));let i=a=>a.type==="tool_use",s=r.filter(i);return{stopReason:t,assistantBlocks:r,toolUseBlocks:s,usage:n,text:o.join("")}}async function*vH(e,t,n){let r=[],o=null,i=null,s=!1,a=!!k.AFK_TELEGRAM_TRACE;try{a&&console.log("[translate] starting SDK event iteration");for await(let l of e){switch(a&&console.log("[translate] SDK evt:",l.type),l.type){case"message_start":{let c=l.message?.usage;c&&(i={...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:t.sessionId}});break}case"content_block_delta":{let c=r[l.index],u=l.delta;u.type==="text_delta"?(c&&c.kind==="text"&&(c.text+=u.text),yield{kind:"event",event:{type:"delta.text",text:u.text,sessionId:t.sessionId}}):u.type==="input_json_delta"?(c&&c.kind==="tool_use"&&(c.partialJson+=u.partial_json),n?.()):u.type==="thinking_delta"?(c&&c.kind==="thinking"&&(c.thinking+=u.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:u.thinking,sessionId:t.sessionId}}):(u.type==="signature_delta"&&c&&c.kind==="thinking"&&(c.signature=u.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:t.sessionId}});break}case"message_delta":{l.delta&&l.delta.stop_reason!==void 0&&(o=l.delta.stop_reason);let c=l.usage;c&&(i!==null?(i.output_tokens=c.output_tokens,c.cache_creation_input_tokens!=null&&(i.cache_creation_input_tokens=c.cache_creation_input_tokens),c.cache_read_input_tokens!=null&&(i.cache_read_input_tokens=c.cache_read_input_tokens),c.input_tokens!=null&&(i.input_tokens=c.input_tokens)):i={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":{s=!0;break}default:break}if(s)break}a&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}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(!bH(s,o)){yield{kind:"event",event:{type:"error",error:wH()}};return}a&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:gge(r,o,i)}}var kH=y(()=>{"use strict";H();SH()});async function*TH({events:e,input:t,turn:n,retry:r,ttfb:o,stall:i,stallTimeoutMs:s,requestStartedAt:a}){let l=null,c=!1,u=!1,d=!1,m=!1,f=!1,g=!1;try{k.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let h of vH(Ol(e,t.signal),t.ctx,()=>i.progress()))if(!g&&(h.kind==="turn-result"||h.event.type!=="error")&&(g=!0,o.firstByteSeen(),re(t.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-a,resolvedModel:t.model})),i.progress(),k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",h.kind,h.kind==="event"?h.event.type:""),h.kind==="event"){if(h.event.type==="error"){if(o.timedOut()&&!t.signal.aborted&&r.canRetryTtfb()&&!g){u=!0;break}if(i.timedOut()&&!t.signal.aborted){yield{type:"error",error:GA(s)},c=!0;break}if(_p(h.event.error)&&r.canRetryOverload()&&!t.signal.aborted){d=!0;break}if(_p(h.event.error)&&!t.signal.aborted){f=!0;break}if(t.signal.aborted)break;if(h.event.error instanceof fr&&r.canRetryStreamIncomplete()&&!t.signal.aborted){m=!0;break}yield h.event,c=!0;break}yield h.event}else{l=h.result;break}k.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",l?"set":"null")}catch(h){if(o.timedOut()&&!t.signal.aborted&&r.canRetryTtfb()&&!g)o.dispose(),i.dispose(),u=!0;else{if(o.dispose(),i.dispose(),t.signal.aborted)return yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId},{kind:"terminated"};let b=h instanceof Error?h:new Error(String(h));if((i.timedOut()||eH(b))&&!t.signal.aborted)return yield{type:"error",error:GA(s)},{kind:"terminated"};if(_p(b)&&r.canRetryOverload()&&!t.signal.aborted)d=!0;else if(_p(b)&&!t.signal.aborted)f=!0;else return yield{type:"error",error:b},{kind:"terminated"}}}return o.dispose(),i.dispose(),u?{kind:"retry",reason:"ttfb"}:d?{kind:"retry",reason:"overload"}:m?{kind:"retry",reason:"stream-incomplete"}:f?{kind:"overload-exhausted"}:c?{kind:"translator-errored"}:{kind:"streamed",turnResult:l}}var EH=y(()=>{"use strict";kH();Ue();my();pe();H();Rb();Ip()});async function*RH(e,t,n){let r=[],o=new Map;for(let s of e.toolUseBlocks)r.push({id:s.id,name:s.name,input:s.input,signal:t.signal}),o.set(s.id,Date.now()),Xi(t.traceWriter,vy({toolUseId:s.id,name:s.name,input:s.input,subagentId:t.subagentId})),yield{type:"tool.use.start",toolUseId:s.id,toolName:s.name,toolInput:oi(s.name,s.input),toolInputRaw:Sy(s.input),sessionId:t.ctx.sessionId};if(t.signal.aborted){let s=r.map(a=>({type:"tool_result",tool_use_id:a.id,content:"Tool call aborted",is_error:!0}));return t.messages.push({role:"user",content:s}),yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId},{kind:"aborted"}}let i;if(t.toolDispatcher.executeBatch)try{i=await t.toolDispatcher.executeBatch(r)}catch(s){i=r.map(()=>({content:`Tool batch execution failed: ${s instanceof Error?s.message:String(s)}`,isError:!0}))}else{i=[];for(let s of r){if(t.signal.aborted){i.push({content:"Tool call aborted",isError:!0,failureClass:jt(t.signal)});continue}try{i.push(await t.toolDispatcher.execute(s))}catch(a){let l=a instanceof Error?a.message:String(a);i.push({content:`Tool execution threw: ${l}`,isError:!0})}}}return{kind:"dispatched",calls:r,results:i,startTimes:o}}var xH=y(()=>{"use strict";ss();pe();Sx();op();Ty()});async function*AH(e,t,n,r){let o=[];for(let l=0;l<e.length;l++){let c=e[l],u=t[l],d=n.get(c.id),m=typeof d=="number"?Date.now()-d:0,f=u.truncated===!0||u.content.includes("[output truncated");Xi(r.traceWriter,ky({toolUseId:c.id,name:c.name,result:u,truncated:f,durationMs:m,subagentId:r.subagentId})),yield{type:"tool.output",toolUseId:c.id,toolName:c.name,content:u.content,...u.isError===!0?{isError:!0}:{},...f?{truncated:!0}:{},...u.incomplete===!0?{incomplete:!0}:{},...u.incompleteReason?{incompleteReason:u.incompleteReason}:{},...typeof u.batchIndex=="number"&&typeof u.batchSize=="number"?{batchIndex:u.batchIndex,batchSize:u.batchSize}:{},...u.failureClass?{failureClass:u.failureClass}:{},sessionId:r.ctx.sessionId},u.render?.diff&&(yield{type:"tool.diff",toolUseId:c.id,diff:u.render.diff,sessionId:r.ctx.sessionId});let{content:g,isError:h,image:b}=u,w=b!==void 0?[{type:"image",source:{type:"base64",media_type:b.mediaType,data:b.data}},...g.length>0?[{type:"text",text:g}]:[]]:g;o.push({type:"tool_result",tool_use_id:c.id,content:w,...h===!0?{is_error:!0}:{}})}let i=t.flatMap(l=>l.harnessUserMessage?.kind==="queued_user_message"?[{type:"text",text:l.harnessUserMessage.text}]:[]),s={role:"user",content:[...o,...i]};r.messages.push(s);let a=t.find(l=>l.failureClass===nl);return a?(yield{type:"error",error:new Fa(a.content)},"denial-tripped"):"committed"}var CH=y(()=>{"use strict";pe();Ty();Ig();Ue()});async function*_H(e,t,n,r,o){let i=t.messages.length;t.messages.push({role:"assistant",content:e.assistantBlocks});try{n.toolCallCount+=e.toolUseBlocks.length;let u=yield*RH(e,t,n);if(u.kind==="aborted"||(yield*AH(u.calls,u.results,u.startTimes,t))==="denial-tripped")return"terminated"}catch(u){throw t.messages.splice(i),u}n.iterations+=1;let s=e.toolUseBlocks[e.toolUseBlocks.length-1],a=s?`${s.name}${oi(s.name,s.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:n.taskId,description:"Working",summary:`${Ay(n.iterations,r)}: ${a}`,lastToolName:s?.name,totalTokens:n.usage.totalTokens??0,toolUses:n.toolCallCount,durationMs:Date.now()-n.startedAt},sessionId:t.ctx.sessionId},n.windDownReason!==null)return yield{type:"turn.completed",usage:n.withDuration({...n.usage,stopReason:n.windDownReason}),sessionId:t.ctx.sessionId},"terminated";let l=xy(n.iterations,r),c=Iy(n.startedAt,o);if(l||c){let u=l?Ey:Cy,d=t.messages[t.messages.length-1];d!==void 0&&d.role==="user"&&Array.isArray(d.content)&&d.content.push({type:"text",text:u}),n.windDownReason=l?Qn:Zn}return"continue"}var IH=y(()=>{"use strict";op();ii();$l();xH();CH()});function*PH(e,t,n){if(e.stopReason==="refusal"){yield{type:"assistant.message",text:e.text.length>0?e.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:t.ctx.sessionId},yield{type:"turn.completed",usage:n.terminalUsage(),sessionId:t.ctx.sessionId};return}let r=_r(e.stopReason)?ny(e.toolUseBlocks.map(i=>i.name),e.stopReason):null;e.text.length>0&&(yield{type:"assistant.message",text:r?`${e.text}
|
|
@@ -1860,7 +1860,7 @@ ${E}
|
|
|
1860
1860
|
${T}`})}return{fileBlocks:l,warnings:c}}function Y6(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function X6(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}sS();async function Q6(e,t,n,r,o="summary",i,s){let a=vV(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),Ac(process.stdout,Jp(process.cwd(),!0));let l="",c=0,u=!1,d=!1,m=!1,f=!1,g=!1,h,b=!1,w=!1,S={abort:null},v=0,E=3e3,T=[],x=new Map,O=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,_=()=>{let $=r.subagentControl;$?.hasPromotableForeground()&&X6($,A,r.onQueuedUserMessage).then(({jobs:W,flushedText:K,flushedPreview:I})=>{let L=(i??{fn:console.log}).fn;for(let M of W)L(p.dim(` \u2192 subagent backgrounded as ${M.jobId}: ${M.label}`));K!==void 0&&L(p.dim(` \u2192 queued message sent to this turn: ${Y6(I??K)}`))}).catch(()=>{})},A=r.getCompositor?r.getCompositor():null,C=()=>new Xc({out:Qc(i),thinkingMode:o,...O?{activeSkillName:O}:{},onCancel:()=>{t.interrupt().catch($=>{Ge()&&console.error(" "+p.error("session.interrupt() failed:"),$)})},...r.subagentControl?{onBackground:_}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...A?{compositor:A}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=C(),F=async()=>{if(!f){f=!0;try{await P.dispose()}catch{}}},V=async()=>{await P.arm();let $=P.getCompositor();if(i&&$){let W=$;i.fn=K=>W.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.($),r.setInterruptNotifier?.(W=>P.setInterrupting(W)),r.rearmStatus?.()};try{A?A.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{b=!0,P.setSoftStopping(!0),t.interrupt().catch(D=>{Ge()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),D)});let M=r.subagentControl;M?.hasActiveForeground()&&M.cancelActiveForeground().catch(D=>{Ge()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),D)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{w=!0,t.interrupt().catch(M=>{Ge()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),M)})}),await V(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(_);let{fileBlocks:$,warnings:W}=J6(e.text,{rootDir:process.cwd()});for(let M of W)(i??{fn:console.log}).fn(p.dim(` @-file: ${M}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let K=$.length>0||e.attachments.length>0?await V6(e.text,e.attachments,void 0,$,t.sessionId):e.text,I=t.sendMessageStream(K);if(await El((M,D)=>{P.process(M,D)},async()=>{for await(let M of I){if(b||w)break;if(M.type==="chunk"&&M.chunk.type==="content"?(l=u?q6(l,M.chunk.content):l+M.chunk.content,u=!1,d=!0):M.type==="message"&&!d&&(l=M.message.content),M.type==="stream_retry"&&(l=l.slice(0,c),u=l.length>0),M.type==="chunk"&&M.chunk.type==="tool_use_detail"){let D=M.chunk,B={toolName:D.toolName,toolUseId:D.toolUseId,input:D.toolInput,...D.toolInputRaw!==void 0&&{inputRaw:D.toolInputRaw}};x.set(D.toolUseId,B),T.push(B)}else if(M.type==="chunk"&&M.chunk.type==="tool_result"){let D=M.chunk;c=l.length,u=!0;let B=x.get(D.toolUseId);if(B&&(B.result=D.content,B.isError=D.isError,x.delete(D.toolUseId)),r.onContextProgress){let Z=Date.now();if(Z-v>=E){v=Z;try{let ee=r.onContextProgress();ee instanceof Promise&&await ee}catch(ee){Ge()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),ee)}}}}if(M.type==="paused"){if(r.setPausedState?.(!0),await F(),A&&M.autoResume===!0){let D=new AbortController;S.abort=D;let B=M.resetsAt?M.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Z=B?`Keep waiting \u2014 auto-resumes at ${B}`:"Keep waiting \u2014 auto-resume in progress",ee="Switch model / provider (type /model after)",z="Stop waiting",se=[p.warning(" \u23F3 Usage limit reached.")+(B?p.dim(` Auto-resumes at ${B}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Bn(A,{header:se,options:[Z,ee,z],signal:D.signal,initialIndex:0}).then(G=>{if(S.abort=null,!G)return;let ie=G[0];ie===void 0||ie===Z||(w=!0,ie===ee&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(oe=>{Ge()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),oe)}))}).catch(G=>{Ge()&&console.error(" "+p.error("picker promise rejected:"),G)})}else(i??{fn:console.log}).fn(dO({reason:M.reason,...M.resetsAt!==void 0?{resetsAt:M.resetsAt}:{},...M.accountId!==void 0?{accountId:M.accountId}:{},...M.autoResume!==void 0?{autoResume:M.autoResume}:{}}));continue}if(M.type==="resumed"){r.setPausedState?.(!1),S.abort?.abort(),S.abort=null;let D=M.hotSwapped&&M.accountId?`\u25B6 Resumed on ${M.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,d=!1,T.length=0,x.clear(),g=!1,h=void 0,m=!1,P=C(),f=!1,await V(),(i??{fn:console.log}).fn(p.success(D));continue}if(M.type==="error"){await F(),Ka(La(M.error)),m=!0;continue}P.process(M),M.type==="done"&&(g=!0,h=M.metadata)}}),await F(),b){let M=i?i.fn:console.log,D=A?A.getPendingCount():0,B=D>0?` \xB7 ${D} queued`:"";M(p.warning(`\u23F8 Stopped${B} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),M("")}if(w){let M=i?i.fn:console.log;M(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),M("")}if(g&&!b&&!w){zs(n,a,l,h,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),xc(process.stdout),qq(process.stdout,"afk: turn complete");let M=B=>{i?i.fn(B):console.log(B)},D=Wv(l);if(D){M(z6(D)),M("");let B=R4(T);if(r.onTerminalState)try{r.onTerminalState(D,{doneHasCorroboratingEvidence:B})}catch{}if(n.permissionMode==="autonomous"){let Z=D.kind==="done"&&Id().verifyDone===!0&&!B;A4(D,void 0,{unverified:Z})}}if(NCe(h,n,M),r.onAfterTurn){let B=r.onAfterTurn();B instanceof Promise&&await B.catch(()=>{})}}}catch($){await F(),m||Ka(La($))}finally{await F(),Ac(process.stdout,Jp(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),S.abort?.abort(),S.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function LCe(e,t){let n=Math.round(e*100),r=be(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${be(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function NCe(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(_e(e.durationMs)),e.totalCostUsd!==void 0&&r.push(St(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(be(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=mI(t),a=rn(t.model),l=LCe(s,a);if(l.text!==null){let u=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(u(l.text))}let c=G6(DS(Xh()),new Date,{autoResume:DF()});if(c.text!==null){let u=c.tier==="over"||c.tier==="near"?p.error:c.tier==="caution"?p.warning:p.dim;n(u(c.text))}n("")}Ei();var BCe=5e3,UCe=3,jCe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function WCe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function Z6(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,verdictLedger:d,shellPassthrough:m,bgResultNotifier:f}=s,g=null,h=[];e.session.current.waitForInitialization().then(async _=>{Ge()&&(g=ev(_)),await Tm(e.session.current),h=lI()}).catch(()=>{});let b=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,S=!1,v=!1,E,T,x,O=0;for(f.onInjectable=()=>{O>=UCe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(O++,xc(process.stdout),b={text:jCe,attachments:[]},o.abortPendingRead())};;){if(g&&(e.replRenderer.writeLine(g),e.replRenderer.writeLine(""),g=null),h.length>0){for(let I of h)e.replRenderer.writeLine(I);e.replRenderer.writeLine(""),h=[]}let _=m.drainNotifications();for(let{job:I,result:L}of _){let M=L.errorReason===void 0?"\u2713":"\u2717",D=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,B=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${M} [${I.id}] ${D} \xB7 ${B}s \xB7 `)+I.command)}let A=f.drainNotifications();for(let{job:I}of A){let L=I.status==="completed"?"\u2713":I.status==="failed"?"\u2717":"\u2298",M=I.endedAt!==void 0?Math.max(0,Math.round((I.endedAt-I.startedAt)/100)/10):0,D=ce(I.label,60);e.replRenderer.writeLine(p.dim(` ${L} [${I.jobId}] subagent ${I.status} \xB7 ${M}s \xB7 `)+D)}let C=l.renderIfChanged(e.stats.sessionId);if(C.length>0){for(let I of C)e.replRenderer.writeLine(I);e.replRenderer.writeLine("")}let P,F;if(b===void 0){let I=await e.session.current.takePendingPlanExitSeed();I!==void 0&&(e.stats.permissionMode=I.mode,b={text:I.message,attachments:[]})}if(b!==void 0){let I=b;b=void 0;let L=su(e.stats.permissionMode),M=Qs({buffer:I.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:Bc([...I.attachments])});e.replRenderer.writeLine(M),P=I.text.trim(),F=I.attachments}else{let I=w;w=void 0;let L=await o.readLine({promptFn:()=>su(e.stats.permissionMode),...I!==void 0?{initialBuffer:I}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{Lv(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});P=L.text.trim(),F=L.attachments}if(!P&&F.length===0)continue;if(P.startsWith("!")){let I=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!I&&(S||(S=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await m.dispatch(P))){e.statusLine.rearm();continue}}let V=!1;if(P.startsWith("/")){let I=await Jq(P,e.slashCtx,F);if(I.handled){if(I.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((P==="/clear"||P.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),E=void 0),I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="submit"){b={text:I.result.message,attachments:F??[]},e.statusLine.rearm();continue}if(I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="prefill"){w=I.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}V=!0}a.push(P),await WCe(e,P);let $=P;if(V){let I=GC(P);if(I){let L=I.name.replace(/^\//,"").split(":").pop()??"";if(L&&rI(L)){let M={skillName:L,rawArgs:I.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},D=e.session.current.sessionId,B=ca(D),Z=Date.now();U(`[afk trace] preflight.start commandName=${L}`);let ee=!1,z=await la(M,{cwd:e.stats.cwd??process.cwd(),artifactDir:B},se=>{Ge()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${L}) failed: `)+(se instanceof Error?se.message:String(se)))});ee=z!==null,U(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-Z} success=${ee}`),$=sI(z?.manifestBlock,P)}}}let W=m.drainInjections();W.length>0&&($=W+$);let K=f.drainInjections();if(K.length>0&&($=K+$),E!==void 0&&($=E+`
|
|
1861
1861
|
|
|
1862
1862
|
`+$,E=void 0),e.hookRegistry)try{let I={event:"UserPromptSubmit",prompt:$,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(I);L.injectContext&&($=L.injectContext+$)}catch(I){if(I instanceof Ae){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(I.reason?p.dim(`: ${Ye(I.reason)}`):"")),e.statusLine.rearm();continue}if(I instanceof br){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${I.timeoutMs}ms`)),e.statusLine.rearm();continue}throw I}if(T=void 0,x=void 0,await Q6({text:$,attachments:F},e.session.current,e.stats,{setInFlight(I){n.turnInFlight=I},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(I){await t.appendUser(I)},async onQueuedUserMessage(I){await t.appendQueuedUser(I)},async onTurnComplete(I,L){if(await t.appendTurn(I,L),e.stats.sessionId)try{Ti(e.stats)}catch(M){v||(v=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(M instanceof Error?M.message:String(M))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(I,L)=>{d?.push(I),T=I.kind,x=L?.doneHasCorroboratingEvidence},setActiveCompositor:I=>{n.activeCompositor=I},setInterruptNotifier:I=>{n.notifyInterrupting=I},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:I=>o.setBackgroundHandler(I),setSoftStopHandler:i,setPausedState:I=>o.setPausedState(I),setPauseInterruptHandler:I=>o.setPauseInterruptHandler(I),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(ir(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:(I,L)=>{c.repaint(I),u?.onStage(I,L)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(su(e.stats.permissionMode))),e.hookRegistry)try{let I=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...T!==void 0?{terminalState:T}:{},...x!==void 0?{doneHasCorroboratingEvidence:x}:{}},void 0,BCe);I.injectContext&&I.injectContext.trim().length>0&&(E=I.injectContext)}catch(I){if(I instanceof vt)throw I;I instanceof br?(U("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):I instanceof Ae?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${Ye(I.reason??"no reason given")}`)):U("[stop hook] unexpected error: "+String(I))}}}function HCe(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function e3(e,t,n,r){let o=await w6(),i=new Fv({rl:e.rl,history:o,statusLine:e.statusLine}),s=HCe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await x6(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=H6(e,n),await Z6(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}kd();yl();import{execFile as KCe}from"node:child_process";import{dirname as GCe,isAbsolute as qCe,resolve as zCe}from"node:path";import{promisify as VCe}from"node:util";var t3=VCe(KCe),JCe=3e3,YCe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function XCe(){let t=(await t3("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=qCe(t)?t:zCe(process.cwd(),t);return GCe(n)}async function n3(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await XCe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),JCe)});try{let o=_n({execFile:t3,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>YCe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Qf();kd();import{promises as QCe}from"node:fs";import{dirname as ZCe,join as i3}from"node:path";import{randomBytes as e_e}from"node:crypto";var t_e=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
1863
|
-
`),r3=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,BP=30,n_e=1024,r_e=8e3,o_e="haiku";async function i_e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=c_e(n,n_e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??r_e),s=t.signal?u_e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ja({token:t.token,model:t.model??o_e,system:t_e,user:r,maxTokens:32,signal:s})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=s_e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=ZCe(t.worktreePath);return await a_e(l,c)}function s_e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(r3.test(t)&&t.length<=BP)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>BP)break;o=s}return r3.test(o)?o:null}async function a_e(e,t){if(!await l_e(i3(t,e)))return e;let n=e_e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,BP-5)}-${n}`}async function l_e(e){try{return await QCe.access(e),!0}catch{return!1}}function c_e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function u_e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function s3(e){let t,n,r=i3(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await i_e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Yg(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return o3(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return o3(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function o3(e,t){e&&e.setCwd(t),d_e(t)}function d_e(e){try{process.chdir(e)}catch{}}at();Rt();Da();Br();q();import{spawn as l3}from"child_process";import{existsSync as c3,mkdirSync as h_e,readFileSync as u3,unlinkSync as a3,writeFileSync as d3}from"fs";import{get as y_e}from"https";import{join as p3}from"path";import{readFileSync as p_e}from"fs";import{dirname as m_e,join as f_e}from"path";import{fileURLToPath as g_e}from"url";function Wr(){try{return"5.110.
|
|
1863
|
+
`),r3=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,BP=30,n_e=1024,r_e=8e3,o_e="haiku";async function i_e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=c_e(n,n_e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??r_e),s=t.signal?u_e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ja({token:t.token,model:t.model??o_e,system:t_e,user:r,maxTokens:32,signal:s})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=s_e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=ZCe(t.worktreePath);return await a_e(l,c)}function s_e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(r3.test(t)&&t.length<=BP)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>BP)break;o=s}return r3.test(o)?o:null}async function a_e(e,t){if(!await l_e(i3(t,e)))return e;let n=e_e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,BP-5)}-${n}`}async function l_e(e){try{return await QCe.access(e),!0}catch{return!1}}function c_e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function u_e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function s3(e){let t,n,r=i3(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await i_e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Yg(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return o3(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return o3(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function o3(e,t){e&&e.setCwd(t),d_e(t)}function d_e(e){try{process.chdir(e)}catch{}}at();Rt();Da();Br();q();import{spawn as l3}from"child_process";import{existsSync as c3,mkdirSync as h_e,readFileSync as u3,unlinkSync as a3,writeFileSync as d3}from"fs";import{get as y_e}from"https";import{join as p3}from"path";import{readFileSync as p_e}from"fs";import{dirname as m_e,join as f_e}from"path";import{fileURLToPath as g_e}from"url";function Wr(){try{return"5.110.3"}catch{}try{let e=m_e(g_e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(p_e(f_e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}j();H();var b_e=64*1024,w_e=10800*1e3,S_e=800,v_e=3600*1e3,k_e="update-check.json",T_e="pending-update.json";function UP(){return p3(Oa(),k_e)}function Um(){return p3(Oa(),T_e)}function jP(){let e=Oa();c3(e)||h_e(e,{recursive:!0})}function m3(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function f3(){try{let e=u3(UP(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function g3(){try{jP();let e=`
|
|
1864
1864
|
const https = require('https');
|
|
1865
1865
|
const fs = require('fs');
|
|
1866
1866
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|