agent-afk 5.49.2 → 5.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/daemon/scheduler.d.ts +5 -0
- package/dist/agent/daemon.d.ts +1 -0
- package/dist/agent/session/stream-consumer.d.ts +1 -0
- package/dist/agent/types/message-types.d.ts +1 -0
- package/dist/cli/commands/daemon.d.ts +1 -1
- package/dist/cli/config/types.d.ts +2 -0
- package/dist/cli.mjs +412 -412
- package/dist/index.mjs +5 -5
- package/dist/telegram.mjs +5 -5
- package/package.json +1 -1
package/dist/telegram.mjs
CHANGED
|
@@ -152,7 +152,7 @@ Send a message to start one, or /new for a fresh session.`}function qf(t){return
|
|
|
152
152
|
`)}return n.accessToken}function gm(){if(process.platform==="darwin")try{return um("security",["find-generic-password","-s","Claude Code-credentials","-a",fm().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let t=mm(pm(),".claude",".credentials.json");if(!ET(t))return;try{return AT(t,"utf-8")}catch{return}}}function hm(t){let e;try{e=JSON.parse(t)}catch{return}if(typeof e!="object"||e===null)return;let n=e.claudeAiOauth;if(typeof n!="object"||n===null)return;let r=n,o=r.accessToken;if(typeof o!="string"||o.length===0)return;let s={accessToken:o},i=r.refreshToken;typeof i=="string"&&i.length>0&&(s.refreshToken=i);let a=r.expiresAt;return typeof a=="number"&&(s.expiresAt=a),s}async function CT(t){try{let e=await fetch(RT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:xT})});if(!e.ok)return;let n=await e.json(),r=n.access_token,o=n.expires_in;if(typeof r!="string"||typeof o!="number")return;let s=n.refresh_token;return{accessToken:r,expiresAt:Date.now()+o*1e3,...typeof s=="string"&&s.length>0?{refreshToken:s}:{}}}catch{return}}function xr(t){if(!t||t.length<3)return"token:(unknown)";try{let n=t.split(".");if(n.length<2)throw new Error("not a JWT");let r=Buffer.from(n[1],"base64url").toString("utf-8"),o=JSON.parse(r),s=typeof o.email=="string"&&o.email||typeof o.sub=="string"&&o.sub||typeof o.account_id=="string"&&o.account_id||typeof o.preferred_username=="string"&&o.preferred_username;if(s)return s}catch{}return`token:${t.length>=8?t.slice(-8):t}`}function PT(t){if(process.platform==="darwin")um("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",fm().username,"-w",t],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let e=mm(pm(),".claude",".credentials.json");MT(e,t)}}function MT(t,e){TT(t,e,{encoding:"utf-8",mode:384})}var xT,RT,IT,Rr=b(()=>{"use strict";xT="9d1c250a-e61b-44d9-88ed-5944d1962f5e",RT="https://platform.claude.com/v1/oauth/token",IT=300*1e3});function ue(t,e){if(t===null||typeof t!="object")return;let n=t.headers;if(n==null)return;if(typeof n.get=="function")return n.get(e)??void 0;if(typeof n=="object"){let o=n,s=o[e]??o[e.toUpperCase()];return typeof s=="string"?s:void 0}}function Yt(t){let e=ue(t,"retry-after-ms");if(e!==void 0){let r=Number(e);if(Number.isFinite(r)&&r>=0)return r}let n=ue(t,"retry-after");if(n!==void 0){let r=Number(n);if(Number.isFinite(r)&&r>=0)return Math.round(r*1e3);let o=Date.parse(n);if(!Number.isNaN(o)){let s=o-Date.now();if(s>=0)return s}}}var oc=b(()=>{"use strict"});function ym(t){if(!Number.isFinite(t)||t<=0)return;let e=t*1e3;if(!(e>DT))return new Date(e)}function Ts(t){if(!("status"in t))return null;let e=t.status;if(e===429){let n=t.message.split("|");if(n.length>=2){let l=ym(parseInt(n[1].trim(),10));if(l!==void 0)return{kind:"oauth-limit",resetsAt:l}}let r=ue(t,"anthropic-ratelimit-unified-representative-claim"),o=ue(t,"anthropic-ratelimit-unified-overage-status"),s=ue(t,"anthropic-ratelimit-unified-status");if(r!==void 0||o!==void 0||s==="rejected"){let l=ue(t,"anthropic-ratelimit-unified-reset");if(l!==void 0){let c=ym(Number(l));if(c!==void 0)return{kind:"oauth-limit",resetsAt:c}}return{kind:"oauth-limit-no-ts"}}if(ue(t,"anthropic-ratelimit-requests-remaining")!==void 0||ue(t,"anthropic-ratelimit-requests-limit")!==void 0||ue(t,"anthropic-ratelimit-requests-reset")!==void 0||ue(t,"anthropic-ratelimit-input-tokens-remaining")!==void 0||ue(t,"anthropic-ratelimit-input-tokens-limit")!==void 0||ue(t,"anthropic-ratelimit-input-tokens-reset")!==void 0||ue(t,"anthropic-ratelimit-output-tokens-remaining")!==void 0||ue(t,"anthropic-ratelimit-output-tokens-limit")!==void 0||ue(t,"anthropic-ratelimit-output-tokens-reset")!==void 0)return{kind:"rate-limit-transient",retryAfterMs:Yt(t)};let a=Yt(t);return a!==void 0&&a<=OT?{kind:"rate-limit-transient",retryAfterMs:a}:{kind:"oauth-limit-no-ts"}}return e===400&&t.message.includes("invalid_request_error")&&t.message.includes("credit balance")?{kind:"credit-exhausted"}:null}async function bm(t){let{resetsAt:e,signal:n,readToken:r=Ue}=t,o=r(),s=e.getTime()+3e4;return new Promise(i=>{let a,l=!1,c=p=>{l||(l=!0,a!==void 0&&clearInterval(a),n.removeEventListener("abort",d),i(p))},d=()=>{c("aborted")},u=()=>n.aborted?(c("aborted"),!0):Date.now()>=s?(c("timer"),!0):r()!==o?(c("hot-swap"),!0):!1;u()||(a=setInterval(()=>{u()},3e4),a.unref(),n.addEventListener("abort",d,{once:!0}))})}async function wm(t){let{signal:e,readToken:n=Ue,retryAfterMs:r}=t,o=n(),s=r!==void 0?Date.now()+r:void 0;return new Promise(i=>{let a,l=!1,c=p=>{l||(l=!0,a!==void 0&&clearInterval(a),e.removeEventListener("abort",d),i(p))},d=()=>{c("aborted")},u=()=>e.aborted?(c("aborted"),!0):n()!==o?(c("hot-swap"),!0):s!==void 0&&Date.now()>=s?(c("timer"),!0):!1;u()||(a=setInterval(()=>{u()},3e4),a.unref(),e.addEventListener("abort",d,{once:!0}))})}var OT,DT,xs=b(()=>{"use strict";Rr();oc();OT=300*1e3,DT=864e13});function sc(t,e=fetch,n){return!t&&!n?e:async(r,o)=>{let s=await e(r,o);if(FT.has(s.status)){let i=Yt({headers:s.headers});if(n)try{n({status:s.status,...i!==void 0?{retryAfterMs:i}:{}})}catch{}if(t){let a={status:s.status,reason:s.status===429?"rate-limit":"overloaded",source:"sdk-fetch"};i!==void 0&&(a.retryAfterMs=i),Q(t,{phase:"rate_limit",...i!==void 0?{durationMs:i}:{},metadata:a})}}return s}}var FT,Sm=b(()=>{"use strict";X();xs();FT=new Set([429,503,529])});var Rs,vm=b(()=>{"use strict";Rs=class{items=[];waiter=null;attempts=0;push(e){this.attempts+=1;let n={status:e.status,attempt:this.attempts,...e.retryAfterMs!==void 0?{retryAfterMs:e.retryAfterMs}:{}};this.items.push(n);let r=this.waiter;this.waiter=null,r&&r()}takeAll(){return this.items.length===0?[]:this.items.splice(0,this.items.length)}waitForItem(){return this.items.length>0?Promise.resolve():new Promise(e=>{this.waiter=e})}resetAttempts(){this.attempts=0}}});function ze(t){return t==="bypassPermissions"||t==="autonomous"}var Ir=b(()=>{"use strict"});function Is(t){if(typeof t?.baseUrl=="string"&&t.baseUrl.length>0)return!1;let e=E.AFK_DISABLE_PROMPT_CACHE;if(e===void 0||e.length===0)return!0;let n=e.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function Cs(){let t=E.AFK_PROMPT_CACHE_TTL;return t==="5m"?"5m":t==="1h"?"1h":LT}function km(t,e){if(t.length===0)return t;let n=t[t.length-1],r=Em(n,e);return r===n?t:[...t.slice(0,-1),r]}function _m(t,e){if(t.length===0)return t;let n=t[t.length-1],r=NT(n,e);return r===n?t:[...t.slice(0,-1),r]}function NT(t,e){let n=t.content;if(typeof n=="string")return n.length===0?t:{...t,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:e}}]};if(!Array.isArray(n)||n.length===0)return t;let r=n[n.length-1],o=Em(r,e);return o===r?t:{...t,content:[...n.slice(0,-1),o]}}function Em(t,e){return t.type==="thinking"||t.type==="redacted_thinking"?t:{...t,cache_control:{type:"ephemeral",ttl:e}}}var LT,ic=b(()=>{"use strict";j();LT="1h"});function ac(t){return t!=="plan"?null:{type:"text",text:Ps}}var Ps,lc=b(()=>{"use strict";Ps=["## Plan mode is active","","File and memory write tools (`write_file`, `edit_file`, `memory_update`, `procedure_write`) are refused at the hook layer.","`bash` runs for read-only investigation (git status/log/diff, ls, cat, grep, find \u2014 chained or not); state-mutating bash (file writes, rm, installs, commits, pushes) is refused while planning. The user has asked you to plan, not yet to act \u2014 exit plan mode to make changes.","Treat this turn as planning work.","","Traverse the shape that matches the work \u2014 skip steps the terrain already covers, do not skip steps the terrain hides:",""," unknown field \u2192 ground the current terrain \u2192 gather missing codebase context \u2192"," research missing external context \u2192 reveal chaos / constraints / risks \u2192"," name the failure geometry \u2192 form a candidate plan \u2192 apply adversarial pressure \u2192 embody the final plan","","Reach for these skills (invoke via the `skill` tool) when the cost of skipping exceeds the cost of dispatching:"," - `ground-state` \u2014 survey git, infra, memory before non-trivial work"," - `gather` \u2014 parallel context-gathering for a code area"," - `research` \u2014 parallel external + local context for the current task"," - `devils-advocate` \u2014 generate alternatives and rank them before committing"," - `shadow-verify` \u2014 independently re-derive load-bearing claims","","Do not declare readiness silently. When the plan is ready, state: chosen approach, risks named, and alternatives considered.","","Then, IF the task requires implementation (writing code or files), call the `exit_plan_mode` tool to present your plan. The user picks how to proceed (approve and implement, or keep planning). After calling it, END YOUR TURN \u2014 on approval you will receive a separate instruction to save the plan to a file and implement it. Do NOT use `ask_question` to ask whether the plan is OK; that is exactly what `exit_plan_mode` does \u2014 use `ask_question` only to resolve open requirement questions first. For research / read-only tasks that need no code changes, do NOT call `exit_plan_mode` \u2014 just answer.","","Manual fallbacks remain: the user can exit with `/plan off` (same save-and-implement handoff), and Shift+Tab advances the permission-mode ring without saving or implementing. Keep the plan concrete and complete enough to act on directly."].join(`
|
|
153
153
|
`)});var Am=b(()=>{"use strict";lc()});function cc(t){return t!=="autonomous"?null:{type:"text",text:Ms}}var Ms,dc=b(()=>{"use strict";Ms=["## AFK mode is active","","The operator is away from keyboard. Your channel to them is Telegram via the `send_telegram` tool \u2014 not this transcript, which no one is watching live. At the end of each turn, push your terminal state (Done / Blocked / Asking) to Telegram so the operator can review asynchronously.","","Posture \u2014 bounded autonomy, not unchecked action:"," - Proceed autonomously on reversible work. Do not stop to confirm actions you are already authorized to take and can undo (edits, reads, tests, local commits, non-force pushes, installs)."," - At a one-way door \u2014 anything irreversible, externally visible, credential- or payment-touching, or where multiple readings lead to materially different work \u2014 do NOT guess. Push a concise Asking summary to Telegram naming the decision and your recommended default, then stop and end the turn in the Asking state."," - A mechanical gate refuses high-risk and irreversible operations at the hook layer regardless of this text. Treat a gate refusal as a signal to surface the decision to the operator, not an obstacle to work around.","","Communication discipline:"," - Batch updates. Send a Telegram message at terminal state (and at a genuinely blocking fork), not a play-by-play \u2014 the operator gets a push notification for every message."," - Keep pushes short and scannable: what happened, what changed, what (if anything) you need. Never paste raw tool output, logs, secrets, or full file contents into a push.","","Exit: the operator returns and runs `/afk off` (or Shift+Tab) to restore default permissions and terminal-channel interaction."].join(`
|
|
154
154
|
`)});var Tm=b(()=>{"use strict";dc()});function Os(t,e=()=>{}){let n=new Set;if(!t)return n;for(let r of t.split(",")){let o=r.trim();if(o){if(!/^-?\d+$/.test(o)){e("[allowlist] Ignoring non-numeric chat ID:",o);continue}n.add(Number(o))}}return n}function xm(t,e=()=>{}){return async(n,r)=>{let o=n.chat?.id;if(o===void 0||!t.has(o)){e("[allowlist] Rejecting update from chat:",o??"<unknown>");return}await r()}}var Ds=b(()=>{"use strict"});var Mn,uc,pc=b(()=>{"use strict";Mn={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},uc="bypassPermissions"});function Cr(){return E.ANTHROPIC_API_KEY||E.CLAUDE_CODE_OAUTH_TOKEN||Ue()}function Fs(){return E.OPENAI_API_KEY||E.CODEX_API_KEY||void 0}function Z(t){let e=J(t);return e==="openai-compatible"||e==="openai-codex"?Fs():Cr()}var me=b(()=>{"use strict";ge();Rr();j()});import{existsSync as $T}from"fs";import{join as UT}from"path";import{config as BT}from"dotenv";function Ls(){return Cr()}function Cm(t){let e=t.trim();if(!e)return e;let n="/chat/completions";if(e.endsWith(n)){let r=e.slice(0,-n.length);return Im.has(e)||(Im.add(e),console.warn(`[afk] AFK_OPENAI_BASE_URL: stripped trailing "/chat/completions" \u2014 the OpenAI SDK appends it automatically.
|
|
155
|
-
Effective base URL: ${r}`)),r}return e}function Pm(){if(fc!==void 0)return fc;if(!Rm){let o=[UT(process.cwd(),".env"),Kt(),ef()];for(let s of o)$T(s)&&BT({path:s,override:!1});Rm=!0}let t={},e=E.AFK_MODEL??E.CLAUDE_MODEL;if(e){let o=e.toLowerCase();t.model=Tr(o)?o:e}if(J(e)==="anthropic-direct"){let o=Ls();o!==void 0&&(t.apiKey=o)}let r=E.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(t.baseUrl=r,t.apiKey=E.AFK_LOCAL_API_KEY||"local"),E.AFK_MAX_TOKENS){let o=Number(E.AFK_MAX_TOKENS);Number.isInteger(o)&&(t.maxTokens=o)}if(E.AFK_TEMPERATURE){let o=Number(E.AFK_TEMPERATURE);Number.isFinite(o)&&(t.temperature=o)}if(E.AFK_SYSTEM_PROMPT&&(t.systemPrompt=E.AFK_SYSTEM_PROMPT),E.AFK_AUTO_ROUTING){let o=E.AFK_AUTO_ROUTING.toLowerCase()==="true";t.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return E.AFK_OPENAI_BASE_URL&&(t.openaiBaseUrl=Cm(E.AFK_OPENAI_BASE_URL)),fc=t,t}var Rm,fc,Im,mc=b(()=>{"use strict";Me();ge();W();me();j();Rm=!1;Im=new Set});var gc=b(()=>{"use strict";j();W()});var Mm=b(()=>{"use strict";j();gc()});import{execFile as jT}from"node:child_process";import{promisify as HT}from"node:util";function Dm(t,e){if(t.length>Om)throw new Error(`Invalid branch prefix from ${e}: length ${t.length} exceeds ${Om}.`);if(!WT.test(t))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 only [A-Za-z0-9_-./] are allowed.`);if(t.startsWith("-"))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);return t}function Fm(t,e){if(t.trim().length===0)throw new Error(`Invalid worktree base ref from ${e}: '' \u2014 base ref cannot be empty.`);if(t.startsWith("-"))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);if(t.includes("\0"))throw new Error(`Invalid worktree base ref from ${e}: contains a NUL byte.`);if(/\s/.test(t))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not contain whitespace.`)}var rW,WT,Om,Lm=b(()=>{"use strict";j();gc();Mm();rW=HT(jT),WT=/^[A-Za-z0-9_\-./]*$/,Om=64});import{existsSync as Mr,readdirSync as iW,readFileSync as Nm,realpathSync as aW,statSync as lW}from"fs";import{homedir as $m}from"os";import{join as at}from"path";function hc(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e={};for(let n of Um){let r=t[n];if(r!==void 0){if(r===!0){e[n]={plugins:!0,skills:!0,mcp:!0};continue}if(r!==!1&&typeof r=="object"&&r!==null&&!Array.isArray(r)){let o=r;e[n]={plugins:o.plugins===!0,skills:o.skills===!0,mcp:o.mcp===!0}}}}return Object.keys(e).length>0?e:void 0}function yc(){return[St(),es()]}function Or(t=yc()){for(let e of t)if(Mr(e))try{let n=JSON.parse(Nm(e,"utf-8")),r=hc(n.importFrom);if(r!==void 0)return r}catch{}}function Dr(t,e=$m()){let n={pluginRoots:[],skillRoots:[],mcpConfigs:[]};if(!t)return n;for(let r of Um){let o=t[r];if(!o)continue;let s=Ns[r];if(o.plugins)for(let i of s.pluginRoots(e))Mr(i)&&n.pluginRoots.push({dir:i,binary:r});if(o.skills){let i=`imported:${r}`;for(let a of s.skillRoots(e))Mr(a)&&n.skillRoots.push({dir:a,origin:i})}if(o.mcp){let i=KT(s.mcpConfigCandidates(e));i&&n.mcpConfigs.push({source:i,format:s.mcpFormat})}}return n}function Bm(t,e=$m()){return Ns[t].pluginEnabledState(e)}function KT(t){for(let e of t)if(Mr(e))return e;return null}function GT(t){let e=at(t,".claude","settings.json");if(!Mr(e))return Pr;let n;try{n=JSON.parse(Nm(e,"utf-8"))}catch{return Pr}if(!n||typeof n!="object")return Pr;let r=n.enabledPlugins;if(!r||typeof r!="object"||Array.isArray(r))return Pr;let o=new Map;for(let[s,i]of Object.entries(r))typeof i=="boolean"&&o.set(s,i);return o}var Um,Pr,Ns,pW,$s=b(()=>{"use strict";W();Um=["claude-code","codex"],Pr=new Map,Ns={"claude-code":{label:"Claude Code",pluginRoots:t=>[at(t,".claude","plugins")],skillRoots:t=>[at(t,".claude","skills")],mcpConfigCandidates:t=>[at(t,".claude","mcp.json"),at(t,".claude",".mcp.json"),at(t,".claude","claude-code","mcp.json")],mcpFormat:"json",pluginEnabledState:t=>GT(t)},codex:{label:"Codex",pluginRoots:t=>[at(t,".codex","plugins")],skillRoots:t=>[at(t,".codex","skills")],mcpConfigCandidates:t=>[at(t,".codex","config.toml")],mcpFormat:"toml",pluginEnabledState:()=>Pr}},pW={"claude-code":Ns["claude-code"].label,codex:Ns.codex.label}});import{readFileSync as qT,existsSync as zT}from"fs";import{join as JT}from"path";function bc(){if(Us!==void 0)return Us;let t=[JT(process.cwd(),"afk.config.json"),St(),es()],e=!1;for(let r of t)if(zT(r))try{let o=qT(r,"utf-8"),s=JSON.parse(o),i={},a=nm(s.models);if(typeof s.model=="string"&&s.model.length>0){let c=s.model.toLowerCase();i.model=Tr(c)?c:s.model}if(typeof s.maxTokens=="number"&&(i.maxTokens=s.maxTokens),typeof s.temperature=="number"&&(i.temperature=s.temperature),typeof s.systemPrompt=="string"&&s.systemPrompt.length>0&&(i.systemPrompt=s.systemPrompt),typeof s.permissionMode=="string"){let c=s.permissionMode;(c==="default"||c==="plan"||c==="autonomous"||c==="bypassPermissions")&&(i.permissionMode=c)}if(s.autoRouting&&typeof s.autoRouting=="object"){let c={};typeof s.autoRouting.interactive=="boolean"&&(c.interactive=s.autoRouting.interactive),typeof s.autoRouting.chat=="boolean"&&(c.chat=s.autoRouting.chat),typeof s.autoRouting.telegram=="boolean"&&(c.telegram=s.autoRouting.telegram),typeof s.autoRouting.daemon=="boolean"&&(c.daemon=s.autoRouting.daemon),i.autoRouting=c}if(s.daemon&&typeof s.daemon=="object"){let c={};typeof s.daemon.task=="string"&&(c.task=s.daemon.task),typeof s.daemon.taskId=="string"&&(c.taskId=s.daemon.taskId);let d=s.daemon.worktreePrune;d&&typeof d=="object"&&(c.worktreePrune={enabled:typeof d.enabled=="boolean"?d.enabled:!0,cron:typeof d.cron=="string"?d.cron:"0 4 * * *",maxAgeDaysClean:typeof d.maxAgeDaysClean=="number"?d.maxAgeDaysClean:14,maxAgeDaysDirty:typeof d.maxAgeDaysDirty=="number"?d.maxAgeDaysDirty:30,scope:typeof d.scope=="string"?d.scope:"all"}),i.daemon=c}if(s.telegram&&typeof s.telegram=="object"){let c={},d=s.telegram.notify;if(d&&typeof d=="object"){let u={};if((d.mode==="primary"||d.mode==="broadcast"||d.mode==="custom")&&(u.mode=d.mode),typeof d.primaryChatId=="number"&&Number.isFinite(d.primaryChatId)&&(u.primaryChatId=d.primaryChatId),Array.isArray(d.targets)){let p=d.targets.filter(f=>typeof f=="number"&&Number.isFinite(f));p.length>0&&(u.targets=p)}c.notify=u}typeof s.telegram.verifyDone=="boolean"&&(c.verifyDone=s.telegram.verifyDone),i.telegram=c}if(s.updatePolicy&&["notify","auto","off"].includes(s.updatePolicy)&&(i.updatePolicy=s.updatePolicy),typeof s.autoResumeOnUsageLimit=="boolean"&&(i.autoResumeOnUsageLimit=s.autoResumeOnUsageLimit),typeof s.enforceDoneEvidence=="boolean"&&(i.enforceDoneEvidence=s.enforceDoneEvidence),typeof s.bgSummaries=="boolean"&&(i.bgSummaries=s.bgSummaries),typeof s.maxSummaryCallsPerSession=="number"&&(i.maxSummaryCallsPerSession=Math.min(500,Math.max(1,s.maxSummaryCallsPerSession))),s.hooks!==null&&typeof s.hooks=="object"&&!Array.isArray(s.hooks)&&(i.hooks=s.hooks),typeof s.enableShellHooks=="boolean"&&(i.enableShellHooks=s.enableShellHooks),yc().includes(r)){let c=hc(s.importFrom);c!==void 0&&(i.importFrom=c)}if(s.interactive&&typeof s.interactive=="object"){let c={};typeof s.interactive.worktreeAutoname=="boolean"&&(c.worktreeAutoname=s.interactive.worktreeAutoname),typeof s.interactive.worktreeBranchPrefix=="string"&&(c.worktreeBranchPrefix=Dm(s.interactive.worktreeBranchPrefix,`${r}#/interactive/worktreeBranchPrefix`)),typeof s.interactive.worktreeBase=="string"&&s.interactive.worktreeBase.trim().length>0&&(Fm(s.interactive.worktreeBase,`${r}#/interactive/worktreeBase`),c.worktreeBase=s.interactive.worktreeBase),typeof s.interactive.suggestGhost=="boolean"&&(c.suggestGhost=s.interactive.suggestGhost),(s.interactive.thinkingUi==="summary"||s.interactive.thinkingUi==="live"||s.interactive.thinkingUi==="digest"||s.interactive.thinkingUi==="off")&&(c.thinkingUi=s.interactive.thinkingUi),Object.keys(c).length>0&&(i.interactive=c)}let l={config:i,sourcePath:r,modelsPartial:a};return e||(Us=l),l}catch(o){console.error(`Warning: Failed to parse ${r}:`,o),e=!0}let n={config:{},sourcePath:void 0,modelsPartial:{}};return e||(Us=n),n}var Us,jm=b(()=>{"use strict";Me();Pe();W();Lm();$s()});import{readFileSync as VT,existsSync as YT}from"fs";import{join as Hm}from"path";function Wm(){if(On!==void 0)return On.value;let t=[Hm(process.cwd(),"AFK.md"),Hm(ie(),"AFK.md")];for(let e of t)if(YT(e))try{let n=VT(e,"utf-8").trim();if(n.length>0)return On={value:{content:n,path:e}},On.value}catch{}return On={value:null},On.value}var On,Km=b(()=>{"use strict";W()});function Gm(){return bc().config.telegram??{}}function wc(t){let e=Pm(),{config:n,sourcePath:r,modelsPartial:o}=bc(),s={...Mn,...e,...n,...t},i;if(e.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=Wm();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??Mn.model,maxTokens:s.maxTokens??Mn.maxTokens,temperature:s.temperature??Mn.temperature,updatePolicy:s.updatePolicy??Mn.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??uc,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.enforceDoneEvidence!==void 0?{enforceDoneEvidence:s.enforceDoneEvidence}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=t?.models??tc(o);if(Es(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var Bs=b(()=>{"use strict";Me();Pe();ge();pc();mc();jm();Km();pc();mc()});function XT(t,e){return e!==void 0&&Number.isFinite(e)&&e!==0?e:t.find(r=>r>0)??t[0]}function QT(t,e={}){let n=[...t],r=e.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(e.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=XT(n,e.primaryChatId);return o!==void 0?[o]:[]}function ZT(t){if(!t)return;let e=t.trim();if(!/^-?\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)&&n!==0?n:void 0}function ex(t){if(!t)return;let e=t.trim().toLowerCase();return e==="primary"||e==="broadcast"||e==="custom"?e:void 0}function tx(){let t=Gm().notify??{},e=t.mode??ex(E.AFK_TELEGRAM_NOTIFY_MODE),n=t.primaryChatId??ZT(E.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...e!==void 0?{mode:e}:{},...n!==void 0?{primaryChatId:n}:{},...t.targets!==void 0?{targets:t.targets}:{}}}function js(){let t=Os(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return QT(t,tx())}var Sc=b(()=>{"use strict";Ds();Bs();j()});var zm={};Al(zm,{push:()=>Dn,pushIfConfigured:()=>Fr,pushMarkdown:()=>qm});async function Dn(t){if(!t.token)throw new Error("push: token is required");if(t.chatId===""||t.chatId==null||t.chatId===0)throw new Error("push: chatId is required");let e=t.fetchImpl??fetch,r=`${t.apiBase??nx}/bot${t.token}/sendMessage`,o={chat_id:t.chatId,text:t.text.slice(0,4096)};t.parseMode&&(o.parse_mode=t.parseMode),t.replyMarkup&&(o.reply_markup=t.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await e(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function qm(t){let e=Gt(t.text),n=Ie(e),r={ok:!0,status:200};for(let o of n)if(r=await Dn({...t,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?Dn({...t}):r;return r}async function Fr(t,e={}){let n=E.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=js();if(r.length===0)return null;let o=Ie(t),s=[];for(let i of r)for(let a=0;a<o.length;a++){let l={token:n,chatId:i,text:o[a]??"",...e.replyMarkup!==void 0&&a===0?{replyMarkup:e.replyMarkup}:{},...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}};s.push(e.markdown?await qm(l):await Dn({...l,...e.parseMode!==void 0?{parseMode:e.parseMode}:{}}))}return s}var nx,Lr=b(()=>{"use strict";Sc();Le();j();nx="https://api.telegram.org"});function rx(t){return t.length<=Jm?t:`${t.slice(0,Jm)}\u2026(truncated)`}function ox(t){try{let n=[`\u{1F514} AFK needs you \u2014 stuck on: ${t.title??t.serverName}`,rx(t.message)];t.url!==void 0&&t.url!==""&&n.push(t.url),Fr(n.join(`
|
|
155
|
+
Effective base URL: ${r}`)),r}return e}function Pm(){if(fc!==void 0)return fc;if(!Rm){let o=[UT(process.cwd(),".env"),Kt(),ef()];for(let s of o)$T(s)&&BT({path:s,override:!1});Rm=!0}let t={},e=E.AFK_MODEL??E.CLAUDE_MODEL;if(e){let o=e.toLowerCase();t.model=Tr(o)?o:e}if(J(e)==="anthropic-direct"){let o=Ls();o!==void 0&&(t.apiKey=o)}let r=E.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(t.baseUrl=r,t.apiKey=E.AFK_LOCAL_API_KEY||"local"),E.AFK_MAX_TOKENS){let o=Number(E.AFK_MAX_TOKENS);Number.isInteger(o)&&(t.maxTokens=o)}if(E.AFK_TEMPERATURE){let o=Number(E.AFK_TEMPERATURE);Number.isFinite(o)&&(t.temperature=o)}if(E.AFK_SYSTEM_PROMPT&&(t.systemPrompt=E.AFK_SYSTEM_PROMPT),E.AFK_AUTO_ROUTING){let o=E.AFK_AUTO_ROUTING.toLowerCase()==="true";t.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return E.AFK_OPENAI_BASE_URL&&(t.openaiBaseUrl=Cm(E.AFK_OPENAI_BASE_URL)),fc=t,t}var Rm,fc,Im,mc=b(()=>{"use strict";Me();ge();W();me();j();Rm=!1;Im=new Set});var gc=b(()=>{"use strict";j();W()});var Mm=b(()=>{"use strict";j();gc()});import{execFile as jT}from"node:child_process";import{promisify as HT}from"node:util";function Dm(t,e){if(t.length>Om)throw new Error(`Invalid branch prefix from ${e}: length ${t.length} exceeds ${Om}.`);if(!WT.test(t))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 only [A-Za-z0-9_-./] are allowed.`);if(t.startsWith("-"))throw new Error(`Invalid branch prefix from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);return t}function Fm(t,e){if(t.trim().length===0)throw new Error(`Invalid worktree base ref from ${e}: '' \u2014 base ref cannot be empty.`);if(t.startsWith("-"))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not start with '-' (would be parsed by git as a flag).`);if(t.includes("\0"))throw new Error(`Invalid worktree base ref from ${e}: contains a NUL byte.`);if(/\s/.test(t))throw new Error(`Invalid worktree base ref from ${e}: '${t}' \u2014 must not contain whitespace.`)}var rW,WT,Om,Lm=b(()=>{"use strict";j();gc();Mm();rW=HT(jT),WT=/^[A-Za-z0-9_\-./]*$/,Om=64});import{existsSync as Mr,readdirSync as iW,readFileSync as Nm,realpathSync as aW,statSync as lW}from"fs";import{homedir as $m}from"os";import{join as at}from"path";function hc(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e={};for(let n of Um){let r=t[n];if(r!==void 0){if(r===!0){e[n]={plugins:!0,skills:!0,mcp:!0};continue}if(r!==!1&&typeof r=="object"&&r!==null&&!Array.isArray(r)){let o=r;e[n]={plugins:o.plugins===!0,skills:o.skills===!0,mcp:o.mcp===!0}}}}return Object.keys(e).length>0?e:void 0}function yc(){return[St(),es()]}function Or(t=yc()){for(let e of t)if(Mr(e))try{let n=JSON.parse(Nm(e,"utf-8")),r=hc(n.importFrom);if(r!==void 0)return r}catch{}}function Dr(t,e=$m()){let n={pluginRoots:[],skillRoots:[],mcpConfigs:[]};if(!t)return n;for(let r of Um){let o=t[r];if(!o)continue;let s=Ns[r];if(o.plugins)for(let i of s.pluginRoots(e))Mr(i)&&n.pluginRoots.push({dir:i,binary:r});if(o.skills){let i=`imported:${r}`;for(let a of s.skillRoots(e))Mr(a)&&n.skillRoots.push({dir:a,origin:i})}if(o.mcp){let i=KT(s.mcpConfigCandidates(e));i&&n.mcpConfigs.push({source:i,format:s.mcpFormat})}}return n}function Bm(t,e=$m()){return Ns[t].pluginEnabledState(e)}function KT(t){for(let e of t)if(Mr(e))return e;return null}function GT(t){let e=at(t,".claude","settings.json");if(!Mr(e))return Pr;let n;try{n=JSON.parse(Nm(e,"utf-8"))}catch{return Pr}if(!n||typeof n!="object")return Pr;let r=n.enabledPlugins;if(!r||typeof r!="object"||Array.isArray(r))return Pr;let o=new Map;for(let[s,i]of Object.entries(r))typeof i=="boolean"&&o.set(s,i);return o}var Um,Pr,Ns,pW,$s=b(()=>{"use strict";W();Um=["claude-code","codex"],Pr=new Map,Ns={"claude-code":{label:"Claude Code",pluginRoots:t=>[at(t,".claude","plugins")],skillRoots:t=>[at(t,".claude","skills")],mcpConfigCandidates:t=>[at(t,".claude","mcp.json"),at(t,".claude",".mcp.json"),at(t,".claude","claude-code","mcp.json")],mcpFormat:"json",pluginEnabledState:t=>GT(t)},codex:{label:"Codex",pluginRoots:t=>[at(t,".codex","plugins")],skillRoots:t=>[at(t,".codex","skills")],mcpConfigCandidates:t=>[at(t,".codex","config.toml")],mcpFormat:"toml",pluginEnabledState:()=>Pr}},pW={"claude-code":Ns["claude-code"].label,codex:Ns.codex.label}});import{readFileSync as qT,existsSync as zT}from"fs";import{join as JT}from"path";function bc(){if(Us!==void 0)return Us;let t=[JT(process.cwd(),"afk.config.json"),St(),es()],e=!1;for(let r of t)if(zT(r))try{let o=qT(r,"utf-8"),s=JSON.parse(o),i={},a=nm(s.models);if(typeof s.model=="string"&&s.model.length>0){let c=s.model.toLowerCase();i.model=Tr(c)?c:s.model}if(typeof s.maxTokens=="number"&&(i.maxTokens=s.maxTokens),typeof s.temperature=="number"&&(i.temperature=s.temperature),typeof s.systemPrompt=="string"&&s.systemPrompt.length>0&&(i.systemPrompt=s.systemPrompt),typeof s.permissionMode=="string"){let c=s.permissionMode;(c==="default"||c==="plan"||c==="autonomous"||c==="bypassPermissions")&&(i.permissionMode=c)}if(s.autoRouting&&typeof s.autoRouting=="object"){let c={};typeof s.autoRouting.interactive=="boolean"&&(c.interactive=s.autoRouting.interactive),typeof s.autoRouting.chat=="boolean"&&(c.chat=s.autoRouting.chat),typeof s.autoRouting.telegram=="boolean"&&(c.telegram=s.autoRouting.telegram),typeof s.autoRouting.daemon=="boolean"&&(c.daemon=s.autoRouting.daemon),i.autoRouting=c}if(s.daemon&&typeof s.daemon=="object"){let c={};typeof s.daemon.task=="string"&&(c.task=s.daemon.task),typeof s.daemon.taskId=="string"&&(c.taskId=s.daemon.taskId);let d=s.daemon.worktreePrune;d&&typeof d=="object"&&(c.worktreePrune={enabled:typeof d.enabled=="boolean"?d.enabled:!0,cron:typeof d.cron=="string"?d.cron:"0 4 * * *",maxAgeDaysClean:typeof d.maxAgeDaysClean=="number"?d.maxAgeDaysClean:14,maxAgeDaysDirty:typeof d.maxAgeDaysDirty=="number"?d.maxAgeDaysDirty:30,scope:typeof d.scope=="string"?d.scope:"all"}),typeof s.daemon.verifyDone=="boolean"&&(c.verifyDone=s.daemon.verifyDone),i.daemon=c}if(s.telegram&&typeof s.telegram=="object"){let c={},d=s.telegram.notify;if(d&&typeof d=="object"){let u={};if((d.mode==="primary"||d.mode==="broadcast"||d.mode==="custom")&&(u.mode=d.mode),typeof d.primaryChatId=="number"&&Number.isFinite(d.primaryChatId)&&(u.primaryChatId=d.primaryChatId),Array.isArray(d.targets)){let p=d.targets.filter(f=>typeof f=="number"&&Number.isFinite(f));p.length>0&&(u.targets=p)}c.notify=u}typeof s.telegram.verifyDone=="boolean"&&(c.verifyDone=s.telegram.verifyDone),i.telegram=c}if(s.updatePolicy&&["notify","auto","off"].includes(s.updatePolicy)&&(i.updatePolicy=s.updatePolicy),typeof s.autoResumeOnUsageLimit=="boolean"&&(i.autoResumeOnUsageLimit=s.autoResumeOnUsageLimit),typeof s.enforceDoneEvidence=="boolean"&&(i.enforceDoneEvidence=s.enforceDoneEvidence),typeof s.bgSummaries=="boolean"&&(i.bgSummaries=s.bgSummaries),typeof s.maxSummaryCallsPerSession=="number"&&(i.maxSummaryCallsPerSession=Math.min(500,Math.max(1,s.maxSummaryCallsPerSession))),s.hooks!==null&&typeof s.hooks=="object"&&!Array.isArray(s.hooks)&&(i.hooks=s.hooks),typeof s.enableShellHooks=="boolean"&&(i.enableShellHooks=s.enableShellHooks),yc().includes(r)){let c=hc(s.importFrom);c!==void 0&&(i.importFrom=c)}if(s.interactive&&typeof s.interactive=="object"){let c={};typeof s.interactive.worktreeAutoname=="boolean"&&(c.worktreeAutoname=s.interactive.worktreeAutoname),typeof s.interactive.worktreeBranchPrefix=="string"&&(c.worktreeBranchPrefix=Dm(s.interactive.worktreeBranchPrefix,`${r}#/interactive/worktreeBranchPrefix`)),typeof s.interactive.worktreeBase=="string"&&s.interactive.worktreeBase.trim().length>0&&(Fm(s.interactive.worktreeBase,`${r}#/interactive/worktreeBase`),c.worktreeBase=s.interactive.worktreeBase),typeof s.interactive.suggestGhost=="boolean"&&(c.suggestGhost=s.interactive.suggestGhost),(s.interactive.thinkingUi==="summary"||s.interactive.thinkingUi==="live"||s.interactive.thinkingUi==="digest"||s.interactive.thinkingUi==="off")&&(c.thinkingUi=s.interactive.thinkingUi),Object.keys(c).length>0&&(i.interactive=c)}let l={config:i,sourcePath:r,modelsPartial:a};return e||(Us=l),l}catch(o){console.error(`Warning: Failed to parse ${r}:`,o),e=!0}let n={config:{},sourcePath:void 0,modelsPartial:{}};return e||(Us=n),n}var Us,jm=b(()=>{"use strict";Me();Pe();W();Lm();$s()});import{readFileSync as VT,existsSync as YT}from"fs";import{join as Hm}from"path";function Wm(){if(On!==void 0)return On.value;let t=[Hm(process.cwd(),"AFK.md"),Hm(ie(),"AFK.md")];for(let e of t)if(YT(e))try{let n=VT(e,"utf-8").trim();if(n.length>0)return On={value:{content:n,path:e}},On.value}catch{}return On={value:null},On.value}var On,Km=b(()=>{"use strict";W()});function Gm(){return bc().config.telegram??{}}function wc(t){let e=Pm(),{config:n,sourcePath:r,modelsPartial:o}=bc(),s={...Mn,...e,...n,...t},i;if(e.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=Wm();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??Mn.model,maxTokens:s.maxTokens??Mn.maxTokens,temperature:s.temperature??Mn.temperature,updatePolicy:s.updatePolicy??Mn.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??uc,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.enforceDoneEvidence!==void 0?{enforceDoneEvidence:s.enforceDoneEvidence}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=t?.models??tc(o);if(Es(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var Bs=b(()=>{"use strict";Me();Pe();ge();pc();mc();jm();Km();pc();mc()});function XT(t,e){return e!==void 0&&Number.isFinite(e)&&e!==0?e:t.find(r=>r>0)??t[0]}function QT(t,e={}){let n=[...t],r=e.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(e.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=XT(n,e.primaryChatId);return o!==void 0?[o]:[]}function ZT(t){if(!t)return;let e=t.trim();if(!/^-?\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)&&n!==0?n:void 0}function ex(t){if(!t)return;let e=t.trim().toLowerCase();return e==="primary"||e==="broadcast"||e==="custom"?e:void 0}function tx(){let t=Gm().notify??{},e=t.mode??ex(E.AFK_TELEGRAM_NOTIFY_MODE),n=t.primaryChatId??ZT(E.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...e!==void 0?{mode:e}:{},...n!==void 0?{primaryChatId:n}:{},...t.targets!==void 0?{targets:t.targets}:{}}}function js(){let t=Os(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return QT(t,tx())}var Sc=b(()=>{"use strict";Ds();Bs();j()});var zm={};Al(zm,{push:()=>Dn,pushIfConfigured:()=>Fr,pushMarkdown:()=>qm});async function Dn(t){if(!t.token)throw new Error("push: token is required");if(t.chatId===""||t.chatId==null||t.chatId===0)throw new Error("push: chatId is required");let e=t.fetchImpl??fetch,r=`${t.apiBase??nx}/bot${t.token}/sendMessage`,o={chat_id:t.chatId,text:t.text.slice(0,4096)};t.parseMode&&(o.parse_mode=t.parseMode),t.replyMarkup&&(o.reply_markup=t.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await e(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function qm(t){let e=Gt(t.text),n=Ie(e),r={ok:!0,status:200};for(let o of n)if(r=await Dn({...t,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?Dn({...t}):r;return r}async function Fr(t,e={}){let n=E.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=js();if(r.length===0)return null;let o=Ie(t),s=[];for(let i of r)for(let a=0;a<o.length;a++){let l={token:n,chatId:i,text:o[a]??"",...e.replyMarkup!==void 0&&a===0?{replyMarkup:e.replyMarkup}:{},...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}};s.push(e.markdown?await qm(l):await Dn({...l,...e.parseMode!==void 0?{parseMode:e.parseMode}:{}}))}return s}var nx,Lr=b(()=>{"use strict";Sc();Le();j();nx="https://api.telegram.org"});function rx(t){return t.length<=Jm?t:`${t.slice(0,Jm)}\u2026(truncated)`}function ox(t){try{let n=[`\u{1F514} AFK needs you \u2014 stuck on: ${t.title??t.serverName}`,rx(t.message)];t.url!==void 0&&t.url!==""&&n.push(t.url),Fr(n.join(`
|
|
156
156
|
`)).catch(()=>{})}catch{}}var Fn,Jm,vc,Te,Xt=b(()=>{"use strict";Lr();Fn={action:"decline"},Jm=300;vc=class{handler=null;queue=Promise.resolve();queueDepth=0;install(e){this.handler=e}uninstall(){this.handler=null}hasHandler(){return this.handler!==null}pendingCount(){return this.queueDepth}route(e,n){if(n.signal.aborted)return Promise.resolve(Fn);this.queueDepth+=1;let r,o=new Promise(i=>{r=i}),s=this.handler;return this.queue=this.queue.then(async()=>{try{if(n.signal.aborted){r(Fn);return}if(!s){ox(e),r(Fn);return}let i,a=new Promise(l=>{i=()=>l(Fn),n.signal.addEventListener("abort",i,{once:!0})});try{try{n.onActive?.()}catch{}let l=await Promise.race([s(e,n).catch(()=>Fn),a]);r(l)}finally{n.signal.removeEventListener("abort",i)}}finally{this.queueDepth-=1,r(Fn)}}).catch(()=>{}),o}},Te=new vc});function Vm(t){return["The user has switched off plan mode. Writes are now permitted. Do two things, in order:","",`1. Save the plan. Write the plan you developed in this conversation to a new markdown file under \`${t}/\` \u2014 pick a short, descriptive kebab-case filename (e.g. \`${t}/refactor-auth-flow.md\`). Capture the full plan: the chosen approach, the concrete step-by-step changes, the risks named, and the alternatives considered. This is the durable record.`,"","2. Implement the plan. Work through the steps you just recorded, verifying as you go \u2014 run the project's lint/test gates where they apply. End in a terminal state: Done with evidence, Blocked with the exact unblock condition, or Asking one precise question."].join(`
|
|
157
157
|
`)}var Ym=b(()=>{"use strict"});function ix(t){switch(t){case"bypassPermissions":return"Approve \u2014 implement now (restore bypass mode: no prompts, read/write any path)";case"acceptEdits":return"Approve \u2014 implement now (restore accept-edits mode: edits auto-approved)";case"dontAsk":case"auto":return"Approve \u2014 implement now (restore your previous mode: no approval prompts)";default:return"Approve \u2014 implement now (restore default mode: writes ask for confirmation, contained to the workspace)"}}function Ws(t){return async(e,n,r)=>{let o=t.getPrePlanMode()??"default",s=ix(o),a={serverName:"agent",origin:"agent",type:"choice",message:"Plan ready. How do you want to proceed? (Your plan is in the conversation above.)",choices:o==="bypassPermissions"?[s,kc]:[s,sx,kc]},l=await Te.route(a,{signal:n});if(l.action!=="accept")return{content:"Plan exit not confirmed (the user did not approve). Stay in plan mode \u2014 keep refining the plan; do not implement. Call exit_plan_mode again when ready."};let c=typeof l.content?.value=="string"?l.content.value:"";if(c.startsWith("Keep")||c===kc)return{content:"User chose to keep planning. Stay in plan mode and refine the plan; do not implement. Call exit_plan_mode again when ready."};let d=c.includes("bypass")?"bypassPermissions":o,u=qp(r?.resolveBase??r?.cwd??process.cwd());return t.requestImplementSeed(Vm(u),d),{content:`Plan approved (mode=${d}). The implementation instruction will follow as a new message \u2014 end your turn now.`}}}var Oe,sx,kc,Hs,Qt=b(()=>{"use strict";Xt();Ym();W();Oe="exit_plan_mode",sx="Approve \u2014 implement now (bypass mode: no prompts, read/write any path)",kc="Keep planning";Hs={name:Oe,category:"other",concurrencySafe:!1,description:`Signal that your plan is ready and present it to the user for approval. The user is shown a picker: approve and implement (you pick neither mode \u2014 the user does), or keep planning.
|
|
158
158
|
|
|
@@ -793,10 +793,10 @@ Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${t}${r}
|
|
|
793
793
|
`),this.errored=!0,this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null}}}_writeLine(e){if(!(!this.stream||this.errored))try{this.stream.write(e,n=>{n&&(process.stderr.write(`[afk] session-ledger: write error for ${this.sessionId}: ${String(n)}
|
|
794
794
|
`),this.errored=!0)})}catch(n){process.stderr.write(`[afk] session-ledger: write threw for ${this.sessionId}: ${String(n)}
|
|
795
795
|
`),this.errored=!0}}async close(e){if(!this.closed)return this.record({kind:"closed",...e!==void 0?{reason:e}:{}}),this.closed=!0,this.readyPromise&&await this.readyPromise,new Promise(n=>{if(!this.stream){n();return}this.stream.end(()=>n())})}};bx=250});var Zs,hg=b(()=>{"use strict";j();W();Qs();Zs=class{writer=null;initAttempted=!1;ensure(e){if(this.initAttempted||(this.initAttempted=!0,e.depth!==void 0||e.parentSessionId!==void 0)||E.AFK_SESSION_LEDGER_DISABLED==="1")return;let n=e.sessionId;if(!n)return;let r=new Tt(n);if(!r.active)return;this.writer=r;let o=e.getMetadata();r.record({kind:"meta",sessionId:n,model:o.model??e.fallbackModel,...o.cwd!==void 0?{cwd:o.cwd}:{},traceLabel:Yp(e.tracePath)})}recordUser(e){this.writer?.recordUser(e)}recordEvent(e){this.writer?.recordEvent(e)}recordElicitation(e,n){this.writer?.record({kind:"elicitation",reqId:e,request:n})}seal(e){let n=this.writer;return n?(this.writer=null,this.initAttempted=!1,n.close(e)):Promise.resolve()}}});var ei,yg=b(()=>{"use strict";ei=class{pendingSeed;prePlanMode;modeBeforeDefault;recordModeTransition(e,n){if(e==="plan"){if(n!=="plan"){let r=n==="default"&&this.modeBeforeDefault!==void 0?this.modeBeforeDefault:n;this.prePlanMode=r==="autonomous"?void 0:r}}else e==="default"?this.modeBeforeDefault=n!=="default"&&n!=="plan"?n:void 0:this.modeBeforeDefault=void 0}clearModeBeforeDefault(){this.modeBeforeDefault=void 0}getPrePlanMode(){return this.prePlanMode}requestImplementSeed(e,n){this.pendingSeed={message:e,mode:n}}takeSeed(){let e=this.pendingSeed;return this.pendingSeed=void 0,e}}});import{mkdir as wx,writeFile as bg,unlink as FK,readdir as Sx,readFile as wg}from"fs/promises";import{unlinkSync as vx,existsSync as kx}from"fs";import{join as Sg}from"path";function Cc(t){return Sg(Vo(),`${t}.json`)}async function _x(){try{return await wx(Vo(),{recursive:!0}),!0}catch{return!1}}async function Nr(t){try{if(!await _x())return;let n=Cc(t.sessionId);await bg(n,JSON.stringify(t,null,2),"utf8")}catch{}}async function vg(t,e){try{let n=Cc(t),r=await wg(n,"utf8"),o=JSON.parse(r);o.cwd=e,await bg(n,JSON.stringify(o,null,2),"utf8")}catch{}}function ct(t){try{let e=Cc(t);kx(e)&&vx(e)}catch{}}async function Zt(){let t=Vo(),e;try{e=await Sx(t)}catch{return[]}let n=[];for(let r of e){if(!r.endsWith(".json"))continue;let o=Sg(t,r);try{let s=await wg(o,"utf8"),i=JSON.parse(s);i!==null&&typeof i=="object"&&"sessionId"in i&&typeof i.sessionId=="string"&&n.push({...i,path:o})}catch{}}return n}var Bn=b(()=>{"use strict";W()});function kg(t,e,n){t&&(t.aborted?e.abort(t.reason):t.addEventListener("abort",()=>{e.signal.aborted||e.abort(t.reason)},{once:!0})),e.signal.addEventListener("abort",n,{once:!0})}function _g(t,e){let n=t.permissionMode??"default",r=t.persistSession??!0,o={sessionId:t.sessionId,configuredSessionId:t.sessionId,resume:t.resume,resumeSessionAt:t.resumeSessionAt,continue:t.continue,forkSession:t.forkSession,persistSession:r},s={sessionId:t.sessionId,model:e,permissionMode:n};return{sessionIdentity:o,metadata:s}}var Eg=b(()=>{"use strict"});var ti,Ag=b(()=>{"use strict";ti=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(e,n){this.sessionIdentity=e,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(e){e&&(this.sessionIdentity={...this.sessionIdentity,sessionId:e},this.sessionMetadata={...this.sessionMetadata,sessionId:e})}setSessionMetadata(e){this.sessionMetadata=e(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(e){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(e))}isInitializationSettled(){return this.initializationSettled}}});function Tg(t){try{let e=JSON.parse(t);if(!Array.isArray(e))return null;let n=e.length;if(n===0)return"no results";let r=0,o=0;for(let a of e)if(a&&typeof a=="object"){let l=a.type;l==="fact"?r++:l==="procedure"&&o++}let s=`${n} result${n===1?"":"s"}`;if(r+o!==n)return s;let i=[];return r>0&&i.push(`${r} fact${r===1?"":"s"}`),o>0&&i.push(`${o} procedure${o===1?"":"s"}`),i.length===0?s:`${s} (${i.join(", ")})`}catch{return null}}function xg(t){try{let e=JSON.parse(t);if(!e||typeof e!="object")return null;let n=e;if(n.target==="hot"&&n.saved===!0){if(n.truncated===!0)return"hot memory saved (truncated to fit cap)";let r=n.usage;if(r&&typeof r=="object"){let o=r.pct;if(typeof o=="number")return`hot memory saved (${o}% of cap)`}return"hot memory saved"}if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function Rg(t){try{let e=JSON.parse(t);if(!e||typeof e!="object")return null;let n=e;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}var Ig=b(()=>{"use strict"});function Pc(t){let e=t.trim();if(e.length===0)return null;let n=e[0];if(n!=="{"&&n!=="[")return null;let r=e[e.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(e)}catch{return null}return Array.isArray(o)?Cg(Ex(o)):o!==null&&typeof o=="object"?Cg(Ax(o)):null}function Ex(t){return t.length===0?"[empty array]":t.length===1?"[1 item]":`[${t.length} items]`}function Ax(t){let e=Object.keys(t);if(e.length===0)return"{empty object}";let n=e.slice(0,4),r=e.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function Cg(t){return t.length<=80?t:t.slice(0,79)+"\u2026"}var Pg=b(()=>{"use strict"});function jn(t){return t.replace(Mg,"").replace(Tx," ").trim()}function dt(t){return t.replace(Mg,"")}var Mg,Tx,en=b(()=>{"use strict";Mg=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B[P^_X][^\x1B]*\x1B\\|\x1B\[[0-?]*[ -/]*[@-~]|\x9B[0-?]*[ -/]*[@-~]|\x1B[@-_]/g,Tx=/[\x00-\x1F\x7F-\x9F]/g});function Og(t,e){if(!t)return null;let n=xx.get(t);if(!n)return null;try{let r=n(e);if(r===null)return null;let o=jn(r);return o.length>0?o:null}catch{return null}}var xx,Dg=b(()=>{"use strict";Ig();Pg();en();xx=new Map([["memory_search",Tg],["memory_update",xg],["procedure_write",Rg],["bash",Pc],["Bash",Pc]])});function Rx(t){let e=/Output too large \((\d+(?:\.\d+)?)\s*(B|KB|MB|GB)\)\.\s*Full output saved to:\s*(\/[^\n]+)/,n=t.match(e);if(!n||!n[1]||!n[2]||!n[3])return null;let r=n[1],o=n[2],s=n[3],i=parseFloat(r),a=i;o==="KB"?a=i*1024:o==="MB"?a=i*1024*1024:o==="GB"&&(a=i*1024*1024*1024);let l=r;return i%1===0&&(l=String(Math.floor(i))),l+=o,{sizeLabel:l,sizeBytes:Math.round(a),absolutePath:s.trim()}}function Ix(t){if(t<1024)return`${t}B`;let e=t/1024;if(e<1024)return e%1===0?`${Math.floor(e)}KB`:`${e.toFixed(1)}KB`;let n=e/1024;if(n<1024)return n%1===0?`${Math.floor(n)}MB`:`${n.toFixed(1)}MB`;let r=n/1024;return r%1===0?`${Math.floor(r)}GB`:`${r.toFixed(1)}GB`}function Cx(t){let e=Buffer.byteLength(t,"utf8"),n=Ix(e),r=t.split(`
|
|
796
|
-
`);if(r.length<=1&&t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};if(r.length<=1)return t.length<=80?{content:t,truncated:!1,sizeBytes:e,sizeLabel:n}:{content:t.substring(0,80)+"\u2026",truncated:!0,sizeBytes:e,sizeLabel:n};if(t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};let o=r[0]??"",s=o;return o.length>80&&(s=o.substring(0,80)+"\u2026"),{content:s+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:e,sizeLabel:n}}function Px(t,e){let n={...t.raw??{}};return t.inputTokens!==void 0&&(n.input_tokens=t.inputTokens),t.outputTokens!==void 0&&(n.output_tokens=t.outputTokens),t.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=t.cachedInputTokens),t.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=t.cacheCreationTokens),t.totalTokens!==void 0&&(n.total_tokens=t.totalTokens),t.contextWindowTokens!==void 0&&(n.context_window_tokens=t.contextWindowTokens),{sessionId:e,stopReason:t.stopReason??void 0,resultSubtype:t.resultSubtype,durationMs:t.durationMs,durationApiMs:t.durationApiMs,totalCostUsd:t.totalCostUsd,isError:t.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:t.modelUsage,permissionDenials:t.permissionDenials,errors:t.errors}}function Mx(t){let e=t.isError===!0?null:Og(t.toolName,t.content),n=e!==null?{display:e}:{},r=typeof t.batchIndex=="number"&&typeof t.batchSize=="number"?{batchIndex:t.batchIndex,batchSize:t.batchSize}:{},o=Rx(t.content);if(o)return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${o.sizeLabel}) \u2192 ${o.absolutePath}`,isError:t.isError===!0,persistedPath:o.absolutePath,sizeBytes:o.sizeBytes,sizeLabel:o.sizeLabel,...n,...r}};let{content:s,lineCount:i,sizeBytes:a,sizeLabel:l}=Cx(t.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:s,isError:t.isError===!0,sizeBytes:a,sizeLabel:l,...t.truncated===!0&&{truncated:!0},...i!==void 0&&{lineCount:i},...n,...r}}}function Mc(t,e){switch(t.type){case"session.init":{let n=t.info;return e.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization(),null}case"session.status":return e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(t.sessionId&&e.updateSessionIdentity(t.sessionId),t.text){let n={role:"assistant",content:t.text,timestamp:new Date};return e.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput,toolInputRaw:t.toolInputRaw}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}};case"tool.output":return Mx(t);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:t.toolUseId,diff:t.diff}};case"progress":return{type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:t.suggestion};case"turn.completed":{let n=Px(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(e.maxBudgetUsd!==void 0&&e.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(e._runningCostUsd=(e._runningCostUsd??0)+n.totalCostUsd,e._runningCostUsd>=e.maxBudgetUsd)){lm(e.traceWriter,{kind:"monetary",runningCostUsd:e._runningCostUsd,maxBudgetUsd:e.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new En(e._runningCostUsd,e.maxBudgetUsd);return e.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:t.error};case"paused":return{type:"paused",reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:t.hotSwapped,...t.accountId!==void 0?{accountId:t.accountId}:{}};case"stream.retry":return{type:"stream_retry"};case"rate_limit":return{type:"rate_limit",...t.retryAfterMs!==void 0?{retryAfterMs:t.retryAfterMs}:{}};default:return null}}var Fg=b(()=>{"use strict";ae();X();Dg()});import{stat as Ox,readFile as Dx,writeFile as Fx,rename as Lx,unlink as Nx}from"node:fs/promises";async function $g(t,{maxBytes:e,keepTailLines:n}){let r={trimmed:!1,removedLines:0},o;try{if((await Ox(t)).size<=e)return r;let a=(await Dx(t,"utf8")).split(`
|
|
796
|
+
`);if(r.length<=1&&t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};if(r.length<=1)return t.length<=80?{content:t,truncated:!1,sizeBytes:e,sizeLabel:n}:{content:t.substring(0,80)+"\u2026",truncated:!0,sizeBytes:e,sizeLabel:n};if(t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};let o=r[0]??"",s=o;return o.length>80&&(s=o.substring(0,80)+"\u2026"),{content:s+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:e,sizeLabel:n}}function Px(t,e){let n={...t.raw??{}};return t.inputTokens!==void 0&&(n.input_tokens=t.inputTokens),t.outputTokens!==void 0&&(n.output_tokens=t.outputTokens),t.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=t.cachedInputTokens),t.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=t.cacheCreationTokens),t.totalTokens!==void 0&&(n.total_tokens=t.totalTokens),t.contextWindowTokens!==void 0&&(n.context_window_tokens=t.contextWindowTokens),{sessionId:e,stopReason:t.stopReason??void 0,resultSubtype:t.resultSubtype,durationMs:t.durationMs,durationApiMs:t.durationApiMs,totalCostUsd:t.totalCostUsd,isError:t.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:t.modelUsage,permissionDenials:t.permissionDenials,errors:t.errors}}function Mx(t){let e=t.isError===!0?null:Og(t.toolName,t.content),n=e!==null?{display:e}:{},r=typeof t.batchIndex=="number"&&typeof t.batchSize=="number"?{batchIndex:t.batchIndex,batchSize:t.batchSize}:{},o=Rx(t.content);if(o)return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${o.sizeLabel}) \u2192 ${o.absolutePath}`,isError:t.isError===!0,persistedPath:o.absolutePath,sizeBytes:o.sizeBytes,sizeLabel:o.sizeLabel,...n,...r}};let{content:s,lineCount:i,sizeBytes:a,sizeLabel:l}=Cx(t.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:s,isError:t.isError===!0,sizeBytes:a,sizeLabel:l,...t.truncated===!0&&{truncated:!0},...i!==void 0&&{lineCount:i},...n,...r}}}function Mc(t,e){switch(t.type){case"session.init":{let n=t.info;return e.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization(),null}case"session.status":return e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(t.sessionId&&e.updateSessionIdentity(t.sessionId),t.text){let n={role:"assistant",content:t.text,timestamp:new Date};return e.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput,toolInputRaw:t.toolInputRaw}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}};case"tool.output":return t.isError!==!0&&t.toolName&&(e._successfulToolNames??=[]).push(t.toolName),Mx(t);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:t.toolUseId,diff:t.diff}};case"progress":return{type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:t.suggestion};case"turn.completed":{let n=Px(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e._successfulToolNames!==void 0&&e._successfulToolNames.length>0&&(n.successfulToolNames=[...e._successfulToolNames]),e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(e.maxBudgetUsd!==void 0&&e.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(e._runningCostUsd=(e._runningCostUsd??0)+n.totalCostUsd,e._runningCostUsd>=e.maxBudgetUsd)){lm(e.traceWriter,{kind:"monetary",runningCostUsd:e._runningCostUsd,maxBudgetUsd:e.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new En(e._runningCostUsd,e.maxBudgetUsd);return e.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:t.error};case"paused":return{type:"paused",reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:t.hotSwapped,...t.accountId!==void 0?{accountId:t.accountId}:{}};case"stream.retry":return{type:"stream_retry"};case"rate_limit":return{type:"rate_limit",...t.retryAfterMs!==void 0?{retryAfterMs:t.retryAfterMs}:{}};default:return null}}var Fg=b(()=>{"use strict";ae();X();Dg()});import{stat as Ox,readFile as Dx,writeFile as Fx,rename as Lx,unlink as Nx}from"node:fs/promises";async function $g(t,{maxBytes:e,keepTailLines:n}){let r={trimmed:!1,removedLines:0},o;try{if((await Ox(t)).size<=e)return r;let a=(await Dx(t,"utf8")).split(`
|
|
797
797
|
`);if(a.length>0&&a[a.length-1]===""&&a.pop(),a.length<=n)return r;let l=a.slice(a.length-n),c=a.length-l.length;return o=`${t}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`,await Fx(o,l.join(`
|
|
798
798
|
`)+`
|
|
799
|
-
`,{mode:384}),await Lx(o,t),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await Nx(o)}catch{}return r}}var Lg,Ng,Ug=b(()=>{"use strict";Lg=5*1024*1024,Ng=5e3});import{z as $x}from"zod";var tn,Bg=b(()=>{"use strict";oe();ae();X();ge();eg();me();Rc();og();ae();ug();Ic();Ac();hg();yg();Me();kt();Bn();Pe();Tc();Eg();Ag();Fg();W();Ug();tn=class{config;planExit=new ei;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new Zs;constructor(e){this.config=e.parentSessionId===void 0&&e.planExitControls===void 0?{...e,planExitControls:{setPermissionMode:r=>this.setPermissionMode(r),requestImplementSeed:(r,o)=>this.planExit.requestImplementSeed(r,o),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:e,this.abortController=new AbortController,this._hookRegistry=e.hookRegistry,kg(e.abortSignal,this.abortController,()=>{this.onAbort()});let n=String(e.model);Q(e.traceWriter,{phase:"session_init_start",model:n,resolvedModel:de(e.model)??n,origin:vt(e.surface),actor:cs(e.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&$g(Xo(),{maxBytes:Lg,keepTailLines:Ng})}initSdkLifecycle(){this.config.models&&Es(this.config.models),Gs(this.config);let e=de(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=_g(this.config,e);this.stateManager=new ti(n,r),this.inputStream=new Nn(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)U(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{U("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let i=this.config.providerFactory?this.config.providerFactory:a=>jg(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new qs({prompt:o,config:this.config},{resolveProvider:i,providerNameForModel:a=>J(a),resolveApiKey:a=>Z(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{for(await ng(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});;){let e=await this.providerIterator.next();if(e.done){this.stateManager.resolveInitializationIfNeeded();return}let n=e.value,r=Mc(n,this.buildTransformDeps());if(n.type==="session.init"){await Q(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(r&&r.type==="error"){this.sawProviderError=!0;return}}}catch(e){let n=e instanceof Error?e:new Error(String(e));n instanceof Y&&(this.hookBlocked=!0),this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:e=>this.stateManager.setSessionMetadata(e),updateSessionIdentity:e=>this.stateManager.updateSessionIdentity(e),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:e=>{this.lastResponseMetadata=e,typeof e.totalCostUsd=="number"&&Number.isFinite(e.totalCostUsd)&&(this.sessionRunningCostUsd+=e.totalCostUsd);let n=e.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let a=r[s];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[i]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof e.stopReason=="string"&&(this.lastStopReason=e.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:e=>{this.abortController.signal.aborted||this.abortController.abort(e)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(e){if(e==="closed"||e.startsWith("Budget ")||e.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${e}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(e)}async sendMessage(e,n={}){this.assertCanSend();let r=this.config.timeoutMs??tg,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(e)){if(a.type==="chunk"&&a.chunk.type==="content"&&(i+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(s=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(s)return{...s,metadata:a.metadata};if(i)return{role:"assistant",content:i,metadata:a.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await zs(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async sendMessageStructured(e,n,r={}){let{maxRetries:o=2,injectSchemaPrompt:s=!0,...i}=r,a=s?"\n\nRespond with ONLY a JSON object (optionally in a ```json fence) that conforms to this JSON Schema:\n```json\n"+JSON.stringify($x.toJSONSchema(n,{target:"openapi-3.0"}))+"\n```":"",l="";for(let c=0;c<=o;c++){let d=c===0?e+a:`Your previous response did not match the required JSON schema.
|
|
799
|
+
`,{mode:384}),await Lx(o,t),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await Nx(o)}catch{}return r}}var Lg,Ng,Ug=b(()=>{"use strict";Lg=5*1024*1024,Ng=5e3});import{z as $x}from"zod";var tn,Bg=b(()=>{"use strict";oe();ae();X();ge();eg();me();Rc();og();ae();ug();Ic();Ac();hg();yg();Me();kt();Bn();Pe();Tc();Eg();Ag();Fg();W();Ug();tn=class{config;planExit=new ei;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new Zs;constructor(e){this.config=e.parentSessionId===void 0&&e.planExitControls===void 0?{...e,planExitControls:{setPermissionMode:r=>this.setPermissionMode(r),requestImplementSeed:(r,o)=>this.planExit.requestImplementSeed(r,o),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:e,this.abortController=new AbortController,this._hookRegistry=e.hookRegistry,kg(e.abortSignal,this.abortController,()=>{this.onAbort()});let n=String(e.model);Q(e.traceWriter,{phase:"session_init_start",model:n,resolvedModel:de(e.model)??n,origin:vt(e.surface),actor:cs(e.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&$g(Xo(),{maxBytes:Lg,keepTailLines:Ng})}initSdkLifecycle(){this.config.models&&Es(this.config.models),Gs(this.config);let e=de(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=_g(this.config,e);this.stateManager=new ti(n,r),this.inputStream=new Nn(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)U(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{U("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let i=this.config.providerFactory?this.config.providerFactory:a=>jg(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new qs({prompt:o,config:this.config},{resolveProvider:i,providerNameForModel:a=>J(a),resolveApiKey:a=>Z(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{for(await ng(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});;){let e=await this.providerIterator.next();if(e.done){this.stateManager.resolveInitializationIfNeeded();return}let n=e.value,r=Mc(n,this.buildTransformDeps());if(n.type==="session.init"){await Q(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(r&&r.type==="error"){this.sawProviderError=!0;return}}}catch(e){let n=e instanceof Error?e:new Error(String(e));n instanceof Y&&(this.hookBlocked=!0),this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{_successfulToolNames:[],conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:e=>this.stateManager.setSessionMetadata(e),updateSessionIdentity:e=>this.stateManager.updateSessionIdentity(e),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:e=>{this.lastResponseMetadata=e,typeof e.totalCostUsd=="number"&&Number.isFinite(e.totalCostUsd)&&(this.sessionRunningCostUsd+=e.totalCostUsd);let n=e.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let a=r[s];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[i]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof e.stopReason=="string"&&(this.lastStopReason=e.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:e=>{this.abortController.signal.aborted||this.abortController.abort(e)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(e){if(e==="closed"||e.startsWith("Budget ")||e.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${e}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(e)}async sendMessage(e,n={}){this.assertCanSend();let r=this.config.timeoutMs??tg,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(e)){if(a.type==="chunk"&&a.chunk.type==="content"&&(i+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(s=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(s)return{...s,metadata:a.metadata};if(i)return{role:"assistant",content:i,metadata:a.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await zs(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async sendMessageStructured(e,n,r={}){let{maxRetries:o=2,injectSchemaPrompt:s=!0,...i}=r,a=s?"\n\nRespond with ONLY a JSON object (optionally in a ```json fence) that conforms to this JSON Schema:\n```json\n"+JSON.stringify($x.toJSONSchema(n,{target:"openapi-3.0"}))+"\n```":"",l="";for(let c=0;c<=o;c++){let d=c===0?e+a:`Your previous response did not match the required JSON schema.
|
|
800
800
|
Validation error: ${l}
|
|
801
801
|
Respond again with ONLY a JSON object (optionally in a \`\`\`json fence) that satisfies the schema.`+a,u=await this.sendMessage(d,i),p=Vs(u.content),f=n.safeParse(p);if(f.success)return f.data;l=f.error.message}throw new Error(`structured output did not match schema after ${o+1} attempt(s): ${l}`)}async*sendMessageStream(e){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(e)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(e){this.initPromise&&await this.initPromise,this.planExit.clearModeBeforeDefault();let n=this.withPendingFrameworkContext(e),r=typeof n=="string"?n:this.summarizeContentBlocks(n),o={role:"user",content:r,timestamp:new Date};this.conversationHistory.push(o),this.inputStream.pushUserMessage(n),this.ensureLedger(),this.ledger.recordUser(r);let s=this.buildTransformDeps();try{for(;;){let i=await this.providerIterator.next();if(i.done)break;let a=i.value,l=Mc(a,s);if(l&&(l.type==="done"?(this.turnCount++,this.sawProviderError=!1):l.type==="error"&&(this.sawProviderError=!0),this.ledger.recordEvent(l),yield l,l.type==="done"||l.type==="error"))break}}finally{this.currentState==="streaming"&&(this.currentState="idle")}}ensureLedger(){this.ledger.ensure({depth:this.config.depth,parentSessionId:this.config.parentSessionId,sessionId:this.sessionId,fallbackModel:String(this.config.model),tracePath:this.config.traceWriter?.getTracePath(),getMetadata:()=>this.getSessionMetadata()})}recordLedgerElicitation(e,n){this.ledger.recordElicitation(e,n)}summarizeContentBlocks(e){let n=[],r=0;for(let s of e)s.type==="text"?n.push(s.text):s.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new Ae("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset"),await this.ledger.seal("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,xc))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(e){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async onAbort(){this.ledger.seal("abort");try{await this.providerQuery.interrupt()}catch{}}async setModel(e){let n=de(e);typeof e=="string"&&e.length>0&&await this.providerQuery.setModel(e),n&&this.stateManager.setSessionMetadata(r=>({...r,model:n}))}async setPermissionMode(e){let n=this.stateManager.getSessionMetadata().permissionMode;this.planExit.recordModeTransition(e,n),await this.providerQuery.setPermissionMode(e),this.stateManager.setSessionMetadata(r=>({...r,permissionMode:e}))}getPrePlanMode(){return this.planExit.getPrePlanMode()}async takePendingPlanExitSeed(){let e=this.planExit.takeSeed();if(e!==void 0){try{await this.setPermissionMode(e.mode)}catch(n){U(`\u26A0\uFE0F AgentSession: deferred plan-exit mode flip to '${e.mode}' rejected; dropping implement-seed (staying in plan mode): ${n instanceof Error?n.message:String(n)}`);return}return{message:e.message,mode:e.mode}}}setCwd(e){this.config={...this.config,cwd:e},this.providerQuery.setCwd?.(e),this.config.sessionId!==void 0&&vg(this.config.sessionId,e)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(e,n){return this.providerQuery.rewindFiles(e,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let e=this.providerQuery.compact?.bind(this.providerQuery);if(!e)return{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0};this.currentState="compacting";try{return await e()}finally{this.currentState="idle"}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}queueFrameworkContext(e){let n=e.trim();n.length!==0&&(this.pendingFrameworkContext.push(n),U(`AgentSession: queued framework context (${n.length} chars) for the next user message`))}withPendingFrameworkContext(e){if(this.pendingFrameworkContext.length===0)return e;let n=this.pendingFrameworkContext.join(`
|
|
802
802
|
|
|
@@ -847,7 +847,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
|
|
|
847
847
|
Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:k});return}if(v===2){let k=qn(g.trim());d({content:`grep error: ${k.content}`,isError:!0,...k.truncated?{truncated:!0}:{}});return}let x=dt(m.trimEnd()),T=qn(x);d({content:T.content,...T.truncated?{truncated:!0}:{}})}),f.on("error",v=>{let x;if(p===void 0&&Wr(v))try{x=Gn(v,process.cwd())}catch{x=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${v.message}`}else x=Gn(v,p);d({content:`Failed to execute grep: ${x}`,isError:!0})})})}}var xh,Rh=b(()=>{"use strict";Ye();ft();en();Qc();Zc();xh=cd()});import{promises as IC}from"fs";function dd(t){return(e,n,r)=>CC(e,n,r,t)}var CC,Ih,Ch=b(()=>{"use strict";ft();CC=async(t,e,n,r)=>{if(!t||typeof t!="object")throw new Error("Invalid input: expected an object");let s=t.path;if(typeof s!="string")throw new Error("Invalid input: path must be a string");let i;try{i=Fe(s,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await IC.readdir(i,{withFileTypes:!0}),l=a.filter(p=>p.isDirectory()).map(p=>`${p.name}/`),c=a.filter(p=>!p.isDirectory()).map(p=>p.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
|
|
848
848
|
`)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${i}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${i}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${i}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};Ih=dd()});function PC(t=Dn){return async(e,n)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let o=e.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Ph)return{content:`Invalid input: message exceeds Telegram's ${Ph}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=E.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=js();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await t({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var Ph,Mh,Oh=b(()=>{"use strict";j();Lr();Sc();Ph=4096;Mh=PC()});async function MC(){let[{JSDOM:t},{Readability:e},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:t,Readability:e,turndown:r}}function OC(){return ud===null&&(ud=MC()),ud}function Dh(t){return t.replace(/\n{3,}/g,`
|
|
849
849
|
|
|
850
|
-
`).trim()}function DC(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Fh(t,e){let{JSDOM:n,Readability:r,turndown:o}=await OC(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Dh(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Dh(o.turndown(d));return{title:a,markdown:u,textLength:DC(c),usedFallback:!0}}var ud,Lh=b(()=>{"use strict";ud=null});function LC(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function Nh(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function NC(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function _i(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??LC,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!FC.has(u.status)||d===o)return u;let p=NC(u,i)??Nh(d,s,i);U("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=Nh(d,s,i);U("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var FC,pd=b(()=>{"use strict";oe();FC=new Set([429,502,503,504])});import{readFileSync as $C}from"node:fs";import{join as UC}from"path";function BC(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function $h(t,e){return BC(e).test(t)}function WC(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(jC.has(e))return!0;if(HC.has(e))return!1}return!1}function Uh(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function KC(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Bh(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Ml(e),e}function GC(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function qC(t){try{return $C(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function zC(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Bh(e.defaultProfile)),n}function jh(t){let e=t?.env??E,n=t?.readFileSync??qC,r=t?.surface??e.AGENT_SURFACE,o=WC(e.AFK_BROWSER_HEADLESS,r),s=Uh(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Uh(e.AFK_BROWSER_BLOCKED_DOMAINS),a=GC(e.AFK_BROWSER_DOM_SNAPSHOTS),l=KC(e.AFK_BROWSER_BACKEND),c=Bh(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():UC(ot(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=zC(d,m);return g.configPath=p,g}function fd(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if($h(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>$h(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var jC,HC,md=b(()=>{"use strict";j();W();jC=new Set(["daemon","subagent","telegram","afk"]),HC=new Set(["repl","interactive","cli"])});import un from"node:fs";import Ei from"node:path";import{randomBytes as JC}from"node:crypto";import{chromium as VC}from"playwright";function YC(){try{return"5.49.2"}catch{}try{let t=Ei.resolve(import.meta.dirname,"../../../package.json"),e=un.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var XC,Ai,Hh=b(()=>{"use strict";W();oe();XC=YC(),Ai=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(e){this.config=e}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=VC.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,e)).catch(e=>{throw this.launchPromise=void 0,e}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{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 i=await o.newPage(),a=await i.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${XC}`}}loadStorageState(e){let n=Ol(e);try{if(!un.existsSync(n))return;let r=JSON.parse(un.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Ol(e);if(!un.existsSync(r))return;let o=await n.storageState(),s=Ei.join(Ei.dirname(r),`.${Ei.basename(r)}.${process.pid}.${JC(4).toString("hex")}.tmp`);un.writeFileSync(s,JSON.stringify(o),{mode:384}),un.chmodSync(s,384),un.renameSync(s,r),U("[browser/vault] saved session",{profile:e,file:r})}catch(r){U("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as QC}from"crypto";function gd(t){if(t.length===0)return t;let e=t;for(let{regex:n,name:r}of ZC)r==="form-password"?e=e.replace(n,"password=[redacted]"):e=e.replace(n,"[redacted]");return e}function Wh(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&eP.test(t.label))}function Kh(t){return QC("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Gh(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var ZC,eP,Jr=b(()=>{"use strict";ZC=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];eP=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as tP}from"node:crypto";function nP(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function rP(t,e,n){return`el_${tP("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function oP(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function qh(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Jh(t,e){let n=t.role??"",r=t.name??"";zh.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Jh(s,e)}async function sP(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Vh).catch(()=>[])}async function iP(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Vh).catch(()=>[])}function aP(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ti(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=aP(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=sP(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),y,S=!1;u!==null?(y=[],Jh(u,y)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,y=(await iP(t)).filter(B=>zh.has(B.role??"")));let w=new Map;for(let R of p){let B=qh(R.name),H=w.get(B);(!H||H.bbox.w===0&&R.bbox.w>0)&&w.set(B,R)}let _=y.map(R=>({ax:R,dom:w.get(qh(R.name??""))})),v=r?_:_.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);v.sort((R,B)=>{let H=R.dom?.bbox.y??0,F=B.dom?.bbox.y??0;if(H!==F)return H-F;let N=R.dom?.bbox.x??0,O=B.dom?.bbox.x??0;return N-O}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=v.slice(0,n).map((R,B)=>{let H=R.ax.role??"generic",F=R.ax.name??"",N=rP(H,F,B),O=R.dom?.bbox??{x:0,y:0,w:0,h:0},C=R.dom?.type??null,P=null;R.ax.value!==void 0&&R.ax.value!==null&&(P=String(R.ax.value)),R.ax.checked!==void 0&&(P=String(R.ax.checked)),Wh({role:H,kind:C})&&(P="[redacted]");let L={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(L.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(L.selected=R.ax.selected),R.ax.expanded!==void 0&&(L.expanded=R.ax.expanded);let $;R.dom?.testId?$=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&($=`#${R.dom.id}`);let G={id:N,role:H,label:nP(F),kind:C,value:P,state:L,bbox:O};return $!==void 0&&(G.selector=$),G}),k="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?k="loading":R==="interactive"?k="navigating":k="idle"}catch{k="navigating"}k!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let A=oP(f),M=`obs_${e.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:M,url:m,title:g,textSummary:A,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:k,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:I}}var zh,Vh,Yh=b(()=>{"use strict";Jr();zh=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Vh="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Xh(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function hd(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Xh(t,s)))).filter(o=>o!==null)}async function lP(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function yd(t,e,n){switch(e.kind){case"element_id":return cP(t,e,n);case"selector":return dP(t,e);case"semantic":return uP(t,e)}}async function cP(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await hd(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function dP(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await hd(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function uP(t,e){return e.role!==void 0?pP(t,e.text,e.role):fP(t,e.text,e)}async function pP(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await hd(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function fP(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await lP(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let S=await Xh(y.locator,y.index);if(S!==null){let w=`${S.role}:${S.label}:${g}`,_=0;for(let v=0;v<w.length;v++)_=_*31+w.charCodeAt(v)>>>0;f.push({...S,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Qh=b(()=>{"use strict"});import{randomBytes as mP}from"crypto";import{mkdir as gP,stat as hP,writeFile as yP}from"fs/promises";import{join as bd}from"path";import{gzip as bP}from"zlib";import{promisify as wP}from"util";function SP(t){return bd(Zo(t),"browser")}function vP(t){return bd(SP(t),"screenshots")}function kP(){return new Date().toISOString().replace(/[:.]/g,"-")}function _P(){return mP(3).toString("hex")}async function wd(t,e,n){if(e.length>Zh)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Zh} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=vP(t);await gP(r,{recursive:!0});let o=`${kP()}-${_P()}-${n}.png`,s=bd(r,o);await yP(s,e);let{size:i}=await hP(s);return{path:s,bytes:i}}var xz,Zh,ey=b(()=>{"use strict";W();Jr();xz=wP(bP);Zh=5*1024*1024});var ny={};Al(ny,{PlaywrightProvider:()=>Sd});function ty(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Sd,ry=b(()=>{"use strict";Hh();Yh();Qh();md();Jr();ey();Sd=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Ai(e)}async open(e){let n=fd(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(c){a=c}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Ti(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Ti(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await yd(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ty(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":{let g=gd(e.value??"");await l.fill(e.value??"");break}case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){c=y}else c=g}let u=r.url();if(u!==s){let g=fd(u,this.config);if(!g.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:g.reason}}let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ti(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await yd(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ty(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await wd(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await wd(n,o,r);return s}catch{return null}}}});var fn={};Al(fn,{__resetBrowserRegistryForTests:()=>RP,browserProviderActive:()=>TP,closeBrowserProvider:()=>vd,getBrowserProvider:()=>AP,peekBrowserProvider:()=>xP});function oy(){Promise.resolve(vd()).then(()=>{process.exit(130)})}function sy(){Promise.resolve(vd()).then(()=>{process.exit(143)})}function iy(){Ze=null}function EP(){xi||(process.on("SIGINT",oy),process.on("SIGTERM",sy),process.on("exit",iy),xi=!0)}function ay(){xi&&(process.removeListener("SIGINT",oy),process.removeListener("SIGTERM",sy),process.removeListener("exit",iy),xi=!1)}async function AP(t){return Ze!==null?Ze:(pn!==null||(pn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(ry(),ny)),n=jh(t),r=new e(n);return EP(),Ze=r,pn=null,r})()),pn)}async function vd(){if(Ze===null)return;let t=Ze;Ze=null,pn=null,ay(),await t.shutdown()}function TP(){return Ze!==null}function xP(){return Ze}function RP(){Ze=null,pn=null,ay()}var Ze,pn,xi,mn=b(()=>{"use strict";md();Ze=null,pn=null,xi=!1});async function ly(t,e){try{return await Fh(t,e)}catch(n){return U("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function DP(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(mn(),fn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function cy(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??DP,o=null,s=t,i=null,a=null;try{let c=await _i(n,t,{headers:OP,redirect:"follow",signal:e.signal});i=c.status,s=c.url||t;let d=c.headers.get("content-type")??"";if(c.ok){if(MP.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(PP.test(d)&&!CP.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};if(o=await ly(u,s),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(c){if(e.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=await ly(c.html,c.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(e.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var CP,PP,MP,OP,dy=b(()=>{"use strict";Lh();pd();oe();CP=/(text\/html|application\/xhtml\+xml)/i,PP=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,MP=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,OP={"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 NP(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(FP,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),LP),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=jn(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function uy(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?NP({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function py(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
850
|
+
`).trim()}function DC(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Fh(t,e){let{JSDOM:n,Readability:r,turndown:o}=await OC(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Dh(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Dh(o.turndown(d));return{title:a,markdown:u,textLength:DC(c),usedFallback:!0}}var ud,Lh=b(()=>{"use strict";ud=null});function LC(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function Nh(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function NC(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function _i(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??LC,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!FC.has(u.status)||d===o)return u;let p=NC(u,i)??Nh(d,s,i);U("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=Nh(d,s,i);U("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var FC,pd=b(()=>{"use strict";oe();FC=new Set([429,502,503,504])});import{readFileSync as $C}from"node:fs";import{join as UC}from"path";function BC(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function $h(t,e){return BC(e).test(t)}function WC(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(jC.has(e))return!0;if(HC.has(e))return!1}return!1}function Uh(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function KC(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Bh(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Ml(e),e}function GC(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function qC(t){try{return $C(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function zC(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Bh(e.defaultProfile)),n}function jh(t){let e=t?.env??E,n=t?.readFileSync??qC,r=t?.surface??e.AGENT_SURFACE,o=WC(e.AFK_BROWSER_HEADLESS,r),s=Uh(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Uh(e.AFK_BROWSER_BLOCKED_DOMAINS),a=GC(e.AFK_BROWSER_DOM_SNAPSHOTS),l=KC(e.AFK_BROWSER_BACKEND),c=Bh(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():UC(ot(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=zC(d,m);return g.configPath=p,g}function fd(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if($h(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>$h(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var jC,HC,md=b(()=>{"use strict";j();W();jC=new Set(["daemon","subagent","telegram","afk"]),HC=new Set(["repl","interactive","cli"])});import un from"node:fs";import Ei from"node:path";import{randomBytes as JC}from"node:crypto";import{chromium as VC}from"playwright";function YC(){try{return"5.50.0"}catch{}try{let t=Ei.resolve(import.meta.dirname,"../../../package.json"),e=un.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var XC,Ai,Hh=b(()=>{"use strict";W();oe();XC=YC(),Ai=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(e){this.config=e}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=VC.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,e)).catch(e=>{throw this.launchPromise=void 0,e}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{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 i=await o.newPage(),a=await i.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${XC}`}}loadStorageState(e){let n=Ol(e);try{if(!un.existsSync(n))return;let r=JSON.parse(un.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Ol(e);if(!un.existsSync(r))return;let o=await n.storageState(),s=Ei.join(Ei.dirname(r),`.${Ei.basename(r)}.${process.pid}.${JC(4).toString("hex")}.tmp`);un.writeFileSync(s,JSON.stringify(o),{mode:384}),un.chmodSync(s,384),un.renameSync(s,r),U("[browser/vault] saved session",{profile:e,file:r})}catch(r){U("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as QC}from"crypto";function gd(t){if(t.length===0)return t;let e=t;for(let{regex:n,name:r}of ZC)r==="form-password"?e=e.replace(n,"password=[redacted]"):e=e.replace(n,"[redacted]");return e}function Wh(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&eP.test(t.label))}function Kh(t){return QC("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Gh(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var ZC,eP,Jr=b(()=>{"use strict";ZC=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];eP=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as tP}from"node:crypto";function nP(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function rP(t,e,n){return`el_${tP("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function oP(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function qh(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Jh(t,e){let n=t.role??"",r=t.name??"";zh.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Jh(s,e)}async function sP(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Vh).catch(()=>[])}async function iP(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Vh).catch(()=>[])}function aP(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ti(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=aP(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=sP(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),y,S=!1;u!==null?(y=[],Jh(u,y)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,y=(await iP(t)).filter(B=>zh.has(B.role??"")));let w=new Map;for(let R of p){let B=qh(R.name),H=w.get(B);(!H||H.bbox.w===0&&R.bbox.w>0)&&w.set(B,R)}let _=y.map(R=>({ax:R,dom:w.get(qh(R.name??""))})),v=r?_:_.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);v.sort((R,B)=>{let H=R.dom?.bbox.y??0,F=B.dom?.bbox.y??0;if(H!==F)return H-F;let N=R.dom?.bbox.x??0,O=B.dom?.bbox.x??0;return N-O}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=v.slice(0,n).map((R,B)=>{let H=R.ax.role??"generic",F=R.ax.name??"",N=rP(H,F,B),O=R.dom?.bbox??{x:0,y:0,w:0,h:0},C=R.dom?.type??null,P=null;R.ax.value!==void 0&&R.ax.value!==null&&(P=String(R.ax.value)),R.ax.checked!==void 0&&(P=String(R.ax.checked)),Wh({role:H,kind:C})&&(P="[redacted]");let L={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(L.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(L.selected=R.ax.selected),R.ax.expanded!==void 0&&(L.expanded=R.ax.expanded);let $;R.dom?.testId?$=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&($=`#${R.dom.id}`);let G={id:N,role:H,label:nP(F),kind:C,value:P,state:L,bbox:O};return $!==void 0&&(G.selector=$),G}),k="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?k="loading":R==="interactive"?k="navigating":k="idle"}catch{k="navigating"}k!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let A=oP(f),M=`obs_${e.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:M,url:m,title:g,textSummary:A,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:k,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:I}}var zh,Vh,Yh=b(()=>{"use strict";Jr();zh=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Vh="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Xh(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function hd(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Xh(t,s)))).filter(o=>o!==null)}async function lP(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function yd(t,e,n){switch(e.kind){case"element_id":return cP(t,e,n);case"selector":return dP(t,e);case"semantic":return uP(t,e)}}async function cP(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await hd(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function dP(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await hd(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function uP(t,e){return e.role!==void 0?pP(t,e.text,e.role):fP(t,e.text,e)}async function pP(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await hd(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function fP(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await lP(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let S=await Xh(y.locator,y.index);if(S!==null){let w=`${S.role}:${S.label}:${g}`,_=0;for(let v=0;v<w.length;v++)_=_*31+w.charCodeAt(v)>>>0;f.push({...S,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Qh=b(()=>{"use strict"});import{randomBytes as mP}from"crypto";import{mkdir as gP,stat as hP,writeFile as yP}from"fs/promises";import{join as bd}from"path";import{gzip as bP}from"zlib";import{promisify as wP}from"util";function SP(t){return bd(Zo(t),"browser")}function vP(t){return bd(SP(t),"screenshots")}function kP(){return new Date().toISOString().replace(/[:.]/g,"-")}function _P(){return mP(3).toString("hex")}async function wd(t,e,n){if(e.length>Zh)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Zh} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=vP(t);await gP(r,{recursive:!0});let o=`${kP()}-${_P()}-${n}.png`,s=bd(r,o);await yP(s,e);let{size:i}=await hP(s);return{path:s,bytes:i}}var xz,Zh,ey=b(()=>{"use strict";W();Jr();xz=wP(bP);Zh=5*1024*1024});var ny={};Al(ny,{PlaywrightProvider:()=>Sd});function ty(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Sd,ry=b(()=>{"use strict";Hh();Yh();Qh();md();Jr();ey();Sd=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Ai(e)}async open(e){let n=fd(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(c){a=c}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Ti(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Ti(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await yd(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ty(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":{let g=gd(e.value??"");await l.fill(e.value??"");break}case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){c=y}else c=g}let u=r.url();if(u!==s){let g=fd(u,this.config);if(!g.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:g.reason}}let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ti(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await yd(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ty(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await wd(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await wd(n,o,r);return s}catch{return null}}}});var fn={};Al(fn,{__resetBrowserRegistryForTests:()=>RP,browserProviderActive:()=>TP,closeBrowserProvider:()=>vd,getBrowserProvider:()=>AP,peekBrowserProvider:()=>xP});function oy(){Promise.resolve(vd()).then(()=>{process.exit(130)})}function sy(){Promise.resolve(vd()).then(()=>{process.exit(143)})}function iy(){Ze=null}function EP(){xi||(process.on("SIGINT",oy),process.on("SIGTERM",sy),process.on("exit",iy),xi=!0)}function ay(){xi&&(process.removeListener("SIGINT",oy),process.removeListener("SIGTERM",sy),process.removeListener("exit",iy),xi=!1)}async function AP(t){return Ze!==null?Ze:(pn!==null||(pn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(ry(),ny)),n=jh(t),r=new e(n);return EP(),Ze=r,pn=null,r})()),pn)}async function vd(){if(Ze===null)return;let t=Ze;Ze=null,pn=null,ay(),await t.shutdown()}function TP(){return Ze!==null}function xP(){return Ze}function RP(){Ze=null,pn=null,ay()}var Ze,pn,xi,mn=b(()=>{"use strict";md();Ze=null,pn=null,xi=!1});async function ly(t,e){try{return await Fh(t,e)}catch(n){return U("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function DP(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(mn(),fn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function cy(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??DP,o=null,s=t,i=null,a=null;try{let c=await _i(n,t,{headers:OP,redirect:"follow",signal:e.signal});i=c.status,s=c.url||t;let d=c.headers.get("content-type")??"";if(c.ok){if(MP.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(PP.test(d)&&!CP.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};if(o=await ly(u,s),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(c){if(e.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=await ly(c.html,c.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(e.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var CP,PP,MP,OP,dy=b(()=>{"use strict";Lh();pd();oe();CP=/(text\/html|application\/xhtml\+xml)/i,PP=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,MP=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,OP={"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 NP(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(FP,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),LP),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=jn(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function uy(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?NP({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function py(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
851
851
|
|
|
852
852
|
(no results)`;let n=[`# Search results for "${t}"`,""];return e.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
853
853
|
`).trimEnd()}var FP,LP,fy=b(()=>{"use strict";en();FP="https://api.exa.ai/search",LP=10});function GP(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=$P;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,UP)}let a=BP;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,jP)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function kd(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+HP}function qP(t){let e=[],n=t;for(let o=0;o<4&&n instanceof Error;o++)e.push(n.message),n=n.cause;let r=e.join(" | ");return KP.some(o=>r.includes(o))}function zP(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=GP(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let d=i.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let u;try{u=await _i(e,s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(f){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await u.text()}catch(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:kd(p,s.maxBytes)}}if(s.mode==="markdown")try{let u=await cy(s.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:kd(u.markdown,s.maxBytes)}}catch(u){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=u instanceof Error?u.message:String(u),f=qP(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${f}`,isError:!0}}let d=uy({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(s.query,{limit:WP,timeoutMs:s.timeoutMs,signal:i.signal});return{content:kd(py(s.query,u),s.maxBytes)}}catch(u){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var $P,UP,BP,jP,HP,WP,KP,my,gy=b(()=>{"use strict";dy();fy();pd();$P=3e4,UP=12e4,BP=1e6,jP=1e7,HP=`
|
|
@@ -866,7 +866,7 @@ Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2
|
|
|
866
866
|
`),Li(t,o,384)}function Ky(t,e){if(!Yr(t))return!1;let n=Fi(t,"utf-8"),r=new RegExp(`^${Di(e)}=.*$
|
|
867
867
|
?`,"m");if(!r.test(n))return!1;let o=n.replace(r,"");return Li(t,o,384),!0}function Gy(t,e){if(!Yr(t))return;let r=Fi(t,"utf-8").match(new RegExp(`^${Di(e)}=(.*)$`,"m"));return r?r[1]:void 0}function qy(t){let e={};if(!Yr(t))return e;let n=Fi(t,"utf-8");for(let r of n.split(`
|
|
868
868
|
`)){let o=r.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s<=0)continue;let i=o.slice(0,s).trim(),a=o.slice(s+1);e[i]=a}return e}var Fd=b(()=>{"use strict"});function Ni(t){let e=Go(t);return e?JM.has(t)?"non-config":e.secret?"secret":VM.has(t)||t.endsWith("_BASE_URL")?"protected":"settable":"unknown"}function zy(t,e){if(e.includes(`
|
|
869
|
-
`))return{ok:!1,error:`value for ${t.name} must not contain newlines`};switch(t.type){case"number":{let n=Number(e);return Number.isFinite(n)?{ok:!0,value:e.trim()}:{ok:!1,error:`${t.name} expects a number, got ${JSON.stringify(e)}`}}case"boolean":{let n=e.trim().toLowerCase();return["true","false","1","0","yes","no","on","off"].includes(n)?{ok:!0,value:n}:{ok:!1,error:`${t.name} expects a boolean (true/false/1/0/yes/no/on/off), got ${JSON.stringify(e)}`}}case"json":{try{JSON.parse(e)}catch{return{ok:!1,error:`${t.name} expects valid JSON`}}return{ok:!0,value:e}}default:return{ok:!0,value:e}}}function Vy(t){return Jy.get(t)}function Ld(t){let e=Jy.get(t);return e?e.tier:"unknown"}function Yy(t,e){switch(t.type){case"boolean":{if(typeof e=="boolean")return{ok:!0,value:e};if(typeof e=="string"){let n=e.trim().toLowerCase();if(["true","1","yes","on"].includes(n))return{ok:!0,value:!0};if(["false","0","no","off"].includes(n))return{ok:!0,value:!1}}return{ok:!1,error:`${t.path} expects a boolean`}}case"number":{let n=typeof e=="number"?e:typeof e=="string"?Number(e):NaN;return Number.isFinite(n)?t.clamp?t.clamp.integer&&!Number.isInteger(n)?{ok:!1,error:`${t.path} expects an integer`}:{ok:!0,value:Math.min(t.clamp.max,Math.max(t.clamp.min,n))}:{ok:!0,value:n}:{ok:!1,error:`${t.path} expects a number`}}case"enum":return typeof e=="string"&&t.enumValues?.includes(e)?{ok:!0,value:e}:{ok:!1,error:`${t.path} expects one of: ${t.enumValues?.join(", ")}`};case"number-array":{let n;if(Array.isArray(e))n=e;else if(typeof e=="string")n=e.split(",").map(o=>o.trim()).filter(o=>o.length>0).map(o=>Number(o));else return{ok:!1,error:`${t.path} expects an array of numbers`};let r=[];for(let o of n){let s=typeof o=="number"?o:Number(o);if(!Number.isFinite(s))return{ok:!1,error:`${t.path} contains a non-number`};r.push(s)}return{ok:!0,value:r}}case"model-slot":{if(typeof e=="string")return e.trim().length===0?{ok:!1,error:`${t.path} must not be empty`}:{ok:!0,value:e.trim()};let n=om(e);return n.ok?{ok:!0,value:n.value}:{ok:!1,error:`${t.path}: ${n.error}`}}default:return typeof e!="string"?{ok:!1,error:`${t.path} expects a string`}:e.trim().length===0?{ok:!1,error:`${t.path} must not be empty`}:{ok:!0,value:e}}}function Xy(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object")return;n=n[r]}return n}function Qy(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++){let i=r[s],a=o[i];(a===null||typeof a!="object"||Array.isArray(a))&&(o[i]={}),o=o[i]}o[r[r.length-1]]=n}function Zy(t,e){let n=e.split("."),r=[t],o=t;for(let i=0;i<n.length-1;i++){let a=n[i],l=o[a];if(l===null||typeof l!="object"||Array.isArray(l))return!1;o=l,r.push(o)}let s=n[n.length-1];if(!(s in o))return!1;delete o[s];for(let i=r.length-1;i>=1;i--){let a=r[i];if(Object.keys(a).length===0){let l=n[i-1];delete r[i-1][l]}else break}return!0}var JM,VM,YM,Jy,eb=b(()=>{"use strict";j();Pe();JM=new Set(["HOME","PATH","SHELL","PAGER","NODE_ENV","CI","VITEST","DEBUG","FORCE_COLOR","NO_COLOR","AGENT_SURFACE","AFK_SESSION_ID","NO_UPDATE_NOTIFIER","SCRIPT","ASCIINEMA_REC"]),VM=new Set(["AFK_MODEL_SMALL_BASE_URL","AFK_MODEL_MEDIUM_BASE_URL","AFK_MODEL_LARGE_BASE_URL","AFK_LOCAL_BASE_URL","AFK_OPENAI_BASE_URL","AFK_SYSTEM_PROMPT","AFK_DAEMON_TASK","AFK_DAEMON_TASK_ID","AFK_DAEMON_CWD","AFK_DAEMON_HOST","AFK_BROWSER_ALLOWED_DOMAINS","AFK_BROWSER_BLOCKED_DOMAINS","AFK_BROWSER_CONFIG","AFK_ALLOW_PROJECT_MCP","AFK_INTERNAL","AFK_WORKTREE_BASE","AFK_WORKTREE_BRANCH_PREFIX","AFK_TELEGRAM_ALLOWED_CHAT_IDS","AFK_TELEGRAM_NOTIFY_MODE","AFK_TELEGRAM_PRIMARY_CHAT_ID","AFK_HOME","AFK_STATE_DIR","AFK_FRAMEWORK_DIR","TELEGRAM_DATA_DIR","AFK_TELEGRAM_CWD"]);YM=[{path:"model",tier:"agent",type:"string",description:"Default model id / alias."},{path:"models.local",tier:"agent",type:"model-slot",description:"Local-tier model id (OpenAI-compatible shim: Ollama, LM Studio, vLLM, MLX). Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.small",tier:"agent",type:"model-slot",description:"Small-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.medium",tier:"agent",type:"model-slot",description:"Medium-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.large",tier:"agent",type:"model-slot",description:"Large-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"maxTokens",tier:"agent",type:"number",clamp:{min:1,max:1e6,integer:!0},description:"Deprecated and inert: not read by the generation path. Use AFK_MAX_OUTPUT_TOKENS or --max-output-tokens to cap per-response output."},{path:"temperature",tier:"agent",type:"number",clamp:{min:0,max:2},description:"Sampling temperature."},{path:"autoRouting.interactive",tier:"agent",type:"boolean",description:"Auto-route model in the REPL."},{path:"autoRouting.chat",tier:"agent",type:"boolean",description:"Auto-route model for chat."},{path:"autoRouting.telegram",tier:"agent",type:"boolean",description:"Auto-route model for Telegram."},{path:"autoRouting.daemon",tier:"agent",type:"boolean",description:"Auto-route model for the daemon."},{path:"telegram.notify.mode",tier:"human",type:"enum",enumValues:["primary","broadcast","custom"],description:"Telegram notify routing mode (human-tier: notification-redirect vector)."},{path:"telegram.notify.primaryChatId",tier:"human",type:"number",clamp:{min:-1e15,max:1e15,integer:!0},description:"Primary Telegram chat id (human-tier: notification-redirect vector)."},{path:"telegram.notify.targets",tier:"human",type:"number-array",description:"Custom Telegram target chat ids (human-tier: notification-redirect vector)."},{path:"telegram.verifyDone",tier:"human",type:"boolean",description:`Opt-in AFK "Done" verification gate (human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as enableShellHooks/permissionMode).`},{path:"enforceDoneEvidence",tier:"human",type:"boolean",description:'Opt-in AFK terminal-state enforcement gate: in autonomous mode a turn that self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) gets a framework correction injected into the next turn, which must substantiate or downgrade the claim (issue #237). Human-tier: a self-honesty check the agent must not be able to disable on its own config, same rationale as telegram.verifyDone. Sibling of telegram.verifyDone (which only relabels the Telegram push; this one bounces the turn).'},{path:"interactive.worktreeAutoname",tier:"agent",type:"boolean",description:"Auto-name worktrees."},{path:"interactive.suggestGhost",tier:"agent",type:"boolean",description:"Ghost-text suggestions in the REPL."},{path:"interactive.thinkingUi",tier:"agent",type:"enum",enumValues:["summary","live","digest","off"],description:"Default REPL thinking-display mode."},{path:"updatePolicy",tier:"human",type:"enum",enumValues:["notify","auto","off"],description:"Self-update policy (human-tier: auto self-update is scope-widening)."},{path:"autoResumeOnUsageLimit",tier:"agent",type:"boolean",description:"Auto-resume after a usage-limit pause."},{path:"bgSummaries",tier:"agent",type:"boolean",description:"Background summarisation."},{path:"maxSummaryCallsPerSession",tier:"agent",type:"number",clamp:{min:1,max:500,integer:!0},description:"Cap on summary calls per session."},{path:"systemPrompt",tier:"human",type:"string",description:"Operator system-prompt overlay."},{path:"permissionMode",tier:"human",type:"enum",enumValues:["default","plan","autonomous","bypassPermissions"],description:"Session permission mode for afk chat/interactive (human-tier: privilege-escalation vector). Unset \u2192 bypassPermissions (new-install default); set `default` to re-enable path containment + the approval prompt."},{path:"enableShellHooks",tier:"human",type:"boolean",description:"Enable shell hooks (trust gate)."},{path:"interactive.worktreeBranchPrefix",tier:"human",type:"string",description:"Worktree branch prefix (git-flag sensitive)."},{path:"interactive.worktreeBase",tier:"human",type:"string",description:"Worktree base ref (git-flag sensitive)."},{path:"daemon.task",tier:"human",type:"string",description:"Daemon task prompt."},{path:"daemon.taskId",tier:"human",type:"string",description:"Daemon task id."}],Jy=new Map(YM.map(t=>[t.path,t]))});import{existsSync as tb,readFileSync as XM,copyFileSync as QM,chmodSync as ZM}from"fs";function jd(t){return t===void 0||t.length===0?"<unset>":t.length<=4?"set (****)":`set (****${t.slice(-4)})`}function Bi(t){return t?.filePath??Kt()}function nb(t,e,n){let r=Ni(t);if(r==="unknown")throw new Xr(t);if(r==="non-config")throw new Nd(t);if(r==="secret"&&!e)throw new $d(t);if(r==="protected"&&!n)throw new Ud(t);return r}function rb(t,e,n){let r=nb(t,n?.allowSecret,n?.allowProtected),o=Go(t),s=zy(o,e);if(!s.ok)throw new $i(s.error);let i=Bi(n);return Dd(i,t,s.value),{key:t,class:r,persistedTo:i,display:r==="secret"?jd(s.value):s.value}}function ob(t,e){let n=nb(t,e?.allowSecret,e?.allowProtected),r=Bi(e),o=Ky(r,t);return{key:t,class:n,removed:o,persistedTo:r}}function sb(t,e){let n=Ni(t);if(n==="unknown")throw new Xr(t);let r=Bi(e),o=Gy(r,t),s=Tl(t),i=n==="secret"?o!==void 0?jd(o):void 0:o;return{key:t,class:n,persisted:i,activeInProcess:s}}function ib(t){let e=Bi(t),n=qy(e),r=[];for(let o of Ko){let s=o.name,i=Ni(s),a=n[s],l=Tl(s);if(!t?.all&&a===void 0&&!l)continue;let c=i==="secret"?a!==void 0?jd(a):void 0:a;r.push({key:s,class:i,persisted:c,activeInProcess:l})}return r}function ji(t){return t?.filePath??St()}function Hi(t){if(!tb(t))return{};let e;try{e=JSON.parse(XM(t,"utf-8"))}catch{throw new Ui(t)}if(e===null||typeof e!="object"||Array.isArray(e))throw new Ui(t);return e}function ab(t,e){if(tb(t))try{QM(t,`${t}.bak`),ZM(`${t}.bak`,384)}catch{}Li(t,JSON.stringify(e,null,2)+`
|
|
869
|
+
`))return{ok:!1,error:`value for ${t.name} must not contain newlines`};switch(t.type){case"number":{let n=Number(e);return Number.isFinite(n)?{ok:!0,value:e.trim()}:{ok:!1,error:`${t.name} expects a number, got ${JSON.stringify(e)}`}}case"boolean":{let n=e.trim().toLowerCase();return["true","false","1","0","yes","no","on","off"].includes(n)?{ok:!0,value:n}:{ok:!1,error:`${t.name} expects a boolean (true/false/1/0/yes/no/on/off), got ${JSON.stringify(e)}`}}case"json":{try{JSON.parse(e)}catch{return{ok:!1,error:`${t.name} expects valid JSON`}}return{ok:!0,value:e}}default:return{ok:!0,value:e}}}function Vy(t){return Jy.get(t)}function Ld(t){let e=Jy.get(t);return e?e.tier:"unknown"}function Yy(t,e){switch(t.type){case"boolean":{if(typeof e=="boolean")return{ok:!0,value:e};if(typeof e=="string"){let n=e.trim().toLowerCase();if(["true","1","yes","on"].includes(n))return{ok:!0,value:!0};if(["false","0","no","off"].includes(n))return{ok:!0,value:!1}}return{ok:!1,error:`${t.path} expects a boolean`}}case"number":{let n=typeof e=="number"?e:typeof e=="string"?Number(e):NaN;return Number.isFinite(n)?t.clamp?t.clamp.integer&&!Number.isInteger(n)?{ok:!1,error:`${t.path} expects an integer`}:{ok:!0,value:Math.min(t.clamp.max,Math.max(t.clamp.min,n))}:{ok:!0,value:n}:{ok:!1,error:`${t.path} expects a number`}}case"enum":return typeof e=="string"&&t.enumValues?.includes(e)?{ok:!0,value:e}:{ok:!1,error:`${t.path} expects one of: ${t.enumValues?.join(", ")}`};case"number-array":{let n;if(Array.isArray(e))n=e;else if(typeof e=="string")n=e.split(",").map(o=>o.trim()).filter(o=>o.length>0).map(o=>Number(o));else return{ok:!1,error:`${t.path} expects an array of numbers`};let r=[];for(let o of n){let s=typeof o=="number"?o:Number(o);if(!Number.isFinite(s))return{ok:!1,error:`${t.path} contains a non-number`};r.push(s)}return{ok:!0,value:r}}case"model-slot":{if(typeof e=="string")return e.trim().length===0?{ok:!1,error:`${t.path} must not be empty`}:{ok:!0,value:e.trim()};let n=om(e);return n.ok?{ok:!0,value:n.value}:{ok:!1,error:`${t.path}: ${n.error}`}}default:return typeof e!="string"?{ok:!1,error:`${t.path} expects a string`}:e.trim().length===0?{ok:!1,error:`${t.path} must not be empty`}:{ok:!0,value:e}}}function Xy(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object")return;n=n[r]}return n}function Qy(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++){let i=r[s],a=o[i];(a===null||typeof a!="object"||Array.isArray(a))&&(o[i]={}),o=o[i]}o[r[r.length-1]]=n}function Zy(t,e){let n=e.split("."),r=[t],o=t;for(let i=0;i<n.length-1;i++){let a=n[i],l=o[a];if(l===null||typeof l!="object"||Array.isArray(l))return!1;o=l,r.push(o)}let s=n[n.length-1];if(!(s in o))return!1;delete o[s];for(let i=r.length-1;i>=1;i--){let a=r[i];if(Object.keys(a).length===0){let l=n[i-1];delete r[i-1][l]}else break}return!0}var JM,VM,YM,Jy,eb=b(()=>{"use strict";j();Pe();JM=new Set(["HOME","PATH","SHELL","PAGER","NODE_ENV","CI","VITEST","DEBUG","FORCE_COLOR","NO_COLOR","AGENT_SURFACE","AFK_SESSION_ID","NO_UPDATE_NOTIFIER","SCRIPT","ASCIINEMA_REC"]),VM=new Set(["AFK_MODEL_SMALL_BASE_URL","AFK_MODEL_MEDIUM_BASE_URL","AFK_MODEL_LARGE_BASE_URL","AFK_LOCAL_BASE_URL","AFK_OPENAI_BASE_URL","AFK_SYSTEM_PROMPT","AFK_DAEMON_TASK","AFK_DAEMON_TASK_ID","AFK_DAEMON_CWD","AFK_DAEMON_HOST","AFK_BROWSER_ALLOWED_DOMAINS","AFK_BROWSER_BLOCKED_DOMAINS","AFK_BROWSER_CONFIG","AFK_ALLOW_PROJECT_MCP","AFK_INTERNAL","AFK_WORKTREE_BASE","AFK_WORKTREE_BRANCH_PREFIX","AFK_TELEGRAM_ALLOWED_CHAT_IDS","AFK_TELEGRAM_NOTIFY_MODE","AFK_TELEGRAM_PRIMARY_CHAT_ID","AFK_HOME","AFK_STATE_DIR","AFK_FRAMEWORK_DIR","TELEGRAM_DATA_DIR","AFK_TELEGRAM_CWD"]);YM=[{path:"model",tier:"agent",type:"string",description:"Default model id / alias."},{path:"models.local",tier:"agent",type:"model-slot",description:"Local-tier model id (OpenAI-compatible shim: Ollama, LM Studio, vLLM, MLX). Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.small",tier:"agent",type:"model-slot",description:"Small-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.medium",tier:"agent",type:"model-slot",description:"Medium-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.large",tier:"agent",type:"model-slot",description:"Large-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"maxTokens",tier:"agent",type:"number",clamp:{min:1,max:1e6,integer:!0},description:"Deprecated and inert: not read by the generation path. Use AFK_MAX_OUTPUT_TOKENS or --max-output-tokens to cap per-response output."},{path:"temperature",tier:"agent",type:"number",clamp:{min:0,max:2},description:"Sampling temperature."},{path:"autoRouting.interactive",tier:"agent",type:"boolean",description:"Auto-route model in the REPL."},{path:"autoRouting.chat",tier:"agent",type:"boolean",description:"Auto-route model for chat."},{path:"autoRouting.telegram",tier:"agent",type:"boolean",description:"Auto-route model for Telegram."},{path:"autoRouting.daemon",tier:"agent",type:"boolean",description:"Auto-route model for the daemon."},{path:"telegram.notify.mode",tier:"human",type:"enum",enumValues:["primary","broadcast","custom"],description:"Telegram notify routing mode (human-tier: notification-redirect vector)."},{path:"telegram.notify.primaryChatId",tier:"human",type:"number",clamp:{min:-1e15,max:1e15,integer:!0},description:"Primary Telegram chat id (human-tier: notification-redirect vector)."},{path:"telegram.notify.targets",tier:"human",type:"number-array",description:"Custom Telegram target chat ids (human-tier: notification-redirect vector)."},{path:"telegram.verifyDone",tier:"human",type:"boolean",description:`Opt-in AFK "Done" verification gate (human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as enableShellHooks/permissionMode).`},{path:"enforceDoneEvidence",tier:"human",type:"boolean",description:'Opt-in AFK terminal-state enforcement gate: in autonomous mode a turn that self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) gets a framework correction injected into the next turn, which must substantiate or downgrade the claim (issue #237). Human-tier: a self-honesty check the agent must not be able to disable on its own config, same rationale as telegram.verifyDone. Sibling of telegram.verifyDone (which only relabels the Telegram push; this one bounces the turn).'},{path:"interactive.worktreeAutoname",tier:"agent",type:"boolean",description:"Auto-name worktrees."},{path:"interactive.suggestGhost",tier:"agent",type:"boolean",description:"Ghost-text suggestions in the REPL."},{path:"interactive.thinkingUi",tier:"agent",type:"enum",enumValues:["summary","live","digest","off"],description:"Default REPL thinking-display mode."},{path:"updatePolicy",tier:"human",type:"enum",enumValues:["notify","auto","off"],description:"Self-update policy (human-tier: auto self-update is scope-widening)."},{path:"autoResumeOnUsageLimit",tier:"agent",type:"boolean",description:"Auto-resume after a usage-limit pause."},{path:"bgSummaries",tier:"agent",type:"boolean",description:"Background summarisation."},{path:"maxSummaryCallsPerSession",tier:"agent",type:"number",clamp:{min:1,max:500,integer:!0},description:"Cap on summary calls per session."},{path:"systemPrompt",tier:"human",type:"string",description:"Operator system-prompt overlay."},{path:"permissionMode",tier:"human",type:"enum",enumValues:["default","plan","autonomous","bypassPermissions"],description:"Session permission mode for afk chat/interactive (human-tier: privilege-escalation vector). Unset \u2192 bypassPermissions (new-install default); set `default` to re-enable path containment + the approval prompt."},{path:"enableShellHooks",tier:"human",type:"boolean",description:"Enable shell hooks (trust gate)."},{path:"interactive.worktreeBranchPrefix",tier:"human",type:"string",description:"Worktree branch prefix (git-flag sensitive)."},{path:"interactive.worktreeBase",tier:"human",type:"string",description:"Worktree base ref (git-flag sensitive)."},{path:"daemon.task",tier:"human",type:"string",description:"Daemon task prompt."},{path:"daemon.taskId",tier:"human",type:"string",description:"Daemon task id."},{path:"daemon.verifyDone",tier:"human",type:"boolean",description:`Opt-in daemon-surface "Done" verification gate: a cron-tick completion push whose response self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) is relabelled "\u26A0\uFE0F Done (unverified)" with a caveat line. The daemon analog of telegram.verifyDone (which is REPL-only); the daemon is single-turn-per-tick, so the only honest enforcement is relabelling the outgoing push rather than bouncing a next turn. Human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as telegram.verifyDone.`}],Jy=new Map(YM.map(t=>[t.path,t]))});import{existsSync as tb,readFileSync as XM,copyFileSync as QM,chmodSync as ZM}from"fs";function jd(t){return t===void 0||t.length===0?"<unset>":t.length<=4?"set (****)":`set (****${t.slice(-4)})`}function Bi(t){return t?.filePath??Kt()}function nb(t,e,n){let r=Ni(t);if(r==="unknown")throw new Xr(t);if(r==="non-config")throw new Nd(t);if(r==="secret"&&!e)throw new $d(t);if(r==="protected"&&!n)throw new Ud(t);return r}function rb(t,e,n){let r=nb(t,n?.allowSecret,n?.allowProtected),o=Go(t),s=zy(o,e);if(!s.ok)throw new $i(s.error);let i=Bi(n);return Dd(i,t,s.value),{key:t,class:r,persistedTo:i,display:r==="secret"?jd(s.value):s.value}}function ob(t,e){let n=nb(t,e?.allowSecret,e?.allowProtected),r=Bi(e),o=Ky(r,t);return{key:t,class:n,removed:o,persistedTo:r}}function sb(t,e){let n=Ni(t);if(n==="unknown")throw new Xr(t);let r=Bi(e),o=Gy(r,t),s=Tl(t),i=n==="secret"?o!==void 0?jd(o):void 0:o;return{key:t,class:n,persisted:i,activeInProcess:s}}function ib(t){let e=Bi(t),n=qy(e),r=[];for(let o of Ko){let s=o.name,i=Ni(s),a=n[s],l=Tl(s);if(!t?.all&&a===void 0&&!l)continue;let c=i==="secret"?a!==void 0?jd(a):void 0:a;r.push({key:s,class:i,persisted:c,activeInProcess:l})}return r}function ji(t){return t?.filePath??St()}function Hi(t){if(!tb(t))return{};let e;try{e=JSON.parse(XM(t,"utf-8"))}catch{throw new Ui(t)}if(e===null||typeof e!="object"||Array.isArray(e))throw new Ui(t);return e}function ab(t,e){if(tb(t))try{QM(t,`${t}.bak`),ZM(`${t}.bak`,384)}catch{}Li(t,JSON.stringify(e,null,2)+`
|
|
870
870
|
`,384)}function lb(t,e){let n=Ld(t);if(n==="unknown")throw new Xr(t);if(n==="human"&&!e)throw new Bd(t);return n}function cb(t,e,n){let r=lb(t,n?.allowHumanOnly),o=Vy(t),s=Yy(o,e);if(!s.ok)throw new $i(s.error);let i=ji(n),a=Hi(i);return Qy(a,t,s.value),ab(i,a),{path:t,class:r,value:s.value,persistedTo:i}}function db(t,e){let n=lb(t,e?.allowHumanOnly),r=ji(e),o=Hi(r),s=Zy(o,t);return s&&ab(r,o),{path:t,class:n,removed:s,persistedTo:r}}function ub(t,e){let n=Ld(t),r=ji(e),o=Hi(r);return{path:t,class:n,value:Xy(o,t)}}function pb(t){return Hi(ji(t))}var Qr,Xr,Nd,$d,Ud,Bd,$i,Ui,fb=b(()=>{"use strict";W();j();Fd();eb();Qr="effective on the next session/daemon restart; the current session is unchanged",Xr=class extends Error{constructor(e){super(`unknown config key: ${e}`),this.name="UnknownKeyError"}},Nd=class extends Error{constructor(e){super(`${e} is a process/inherited env var and is not afk-configurable`),this.name="NonConfigKeyError"}},$d=class extends Error{constructor(e){super(`${e} holds a credential; the agent cannot set it. A human must run \`afk config env set ${e}\` (the value is entered masked and never enters the model context).`),this.name="SecretWriteRefused"}},Ud=class extends Error{constructor(e){super(`${e} controls identity, safety, capability, autonomous runs, request routing, or where AFK's own state lives; the agent cannot set it. A human must run \`afk config env set ${e}\`.`),this.name="ProtectedEnvKeyRefused"}},Bd=class extends Error{constructor(e){super(`${e} is human-gated (prompt/hooks/identity); the agent cannot set it. A human must run \`afk config set ${e}\`.`),this.name="HumanOnlyKeyRefused"}},$i=class extends Error{constructor(e){super(e),this.name="ConfigValidationError"}},Ui=class extends Error{constructor(e){super(`refusing to write: existing ${e} is not valid JSON (fix or remove it by hand first)`),this.name="MalformedConfigError"}}});function mb(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function gb(t){return t==="env"||t==="config"?t:void 0}function mt(t){return{content:t,isError:!0}}var hb,yb,bb=b(()=>{"use strict";fb();hb=async t=>{let e=mb(t);if(!e)return mt("config_get: expected an object input");let n=gb(e.target);if(!n)return mt("config_get: `target` must be 'env' or 'config'");let r=typeof e.key=="string"?e.key:void 0,o=e.all===!0;try{if(n==="env"){if(r){let s=sb(r);return{content:JSON.stringify(s,null,2)}}return{content:JSON.stringify(ib({all:o}),null,2)}}if(r){let s=ub(r);return{content:JSON.stringify(s,null,2)}}return{content:JSON.stringify(pb(),null,2)}}catch(s){return mt(`config_get: ${s.message}`)}},yb=async t=>{let e=mb(t);if(!e)return mt("config_set: expected an object input");let n=gb(e.target);if(!n)return mt("config_set: `target` must be 'env' or 'config'");let r=typeof e.key=="string"?e.key:void 0;if(!r)return mt("config_set: `key` is required");let o=e.action==="unset"?"unset":"set",s=e.value;try{if(o==="unset"){if(n==="env"){let l=ob(r);return{content:l.removed?`Removed ${l.key} from afk.env (${l.persistedTo}). ${Qr}.`:`${l.key} was not set in afk.env; nothing to remove.`}}let a=db(r);return{content:a.removed?`Removed ${a.path} from afk.config.json (${a.persistedTo}). ${Qr}.`:`${a.path} was not set in afk.config.json; nothing to remove.`}}if(s==null)return mt(`config_set: \`value\` is required to set ${r}`);if(n==="env"){if(typeof s!="string"&&typeof s!="number"&&typeof s!="boolean")return mt("config_set: env values must be a string, number, or boolean");let a=rb(r,String(s));return{content:`Set ${a.key} = ${a.display} in afk.env (${a.persistedTo}). ${Qr}.`}}let i=cb(r,s);return{content:`Set ${i.path} = ${JSON.stringify(i.value)} in afk.config.json (${i.persistedTo}). ${Qr}.`}}catch(i){return mt(`config_set: ${i.message}`)}}});var wb,Sb=b(()=>{"use strict";Xt();wb=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let n=t,r=n.question;if(typeof r!="string"||r.trim()==="")return{content:"Invalid input: question must be a non-empty string",isError:!0};let o=new Set(["text","confirm","choice","multi_choice","number"]),s=n.type??"text";if(typeof s!="string"||!o.has(s))return{content:"Invalid input: type must be one of: text, confirm, choice, multi_choice, number",isError:!0};if(s==="choice"||s==="multi_choice"){let f=n.choices;if(!Array.isArray(f)||f.length===0)return{content:`Invalid input: choices array is required and must be non-empty for type "${s}"`,isError:!0};if(f.length>100)return{content:`Invalid input: choices array must not exceed 100 items, got ${f.length}`,isError:!0};for(let m of f)if(typeof m!="string")return{content:"Invalid input: all choices must be strings",isError:!0}}let i=n.min,a=n.max;if(i!==void 0&&(typeof i!="number"||!Number.isFinite(i)))return{content:"Invalid input: min must be a finite number",isError:!0};if(a!==void 0&&(typeof a!="number"||!Number.isFinite(a)))return{content:"Invalid input: max must be a finite number",isError:!0};if(i!==void 0&&a!==void 0&&i>a)return{content:`Invalid input: min (${i}) must be \u2264 max (${a})`,isError:!0};let l=n.min_length,c=n.max_length;if(l!==void 0&&typeof l!="number")return{content:"Invalid input: min_length must be a number",isError:!0};if(c!==void 0&&typeof c!="number")return{content:"Invalid input: max_length must be a number",isError:!0};if((l!==void 0||c!==void 0)&&s!=="text")return{content:`Invalid input: min_length/max_length are only valid for type "text", got "${s}"`,isError:!0};if(n.allow_custom!==void 0&&s!=="choice"&&s!=="multi_choice")return{content:`Invalid input: allow_custom is only valid for type "choice" or "multi_choice", got "${s}"`,isError:!0};let d={serverName:"agent",message:r.trim(),origin:"agent",type:s,...n.choices!==void 0&&{choices:n.choices},...n.context!==void 0&&typeof n.context=="string"&&{context:n.context},...n.default!==void 0&&{questionDefault:n.default},...l!==void 0&&{minLength:l},...c!==void 0&&{maxLength:c},...i!==void 0&&{min:i},...a!==void 0&&{max:a},...n.allow_skip!==void 0&&{allowSkip:!!n.allow_skip},...n.allow_custom!==void 0&&{allowCustom:!!n.allow_custom}},u=await Te.route(d,{signal:e}),p=u.action==="decline"||u.action==="cancel";return{content:JSON.stringify(u),...p&&{isError:!0,failureClass:"elicitation-declined"}}}});function Wi(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}function et(t){return eO.some(e=>t.includes(e))}function tt(t){return t.includes("Executable doesn't exist")?"browser tools require the Playwright chromium binary. Install via: pnpm exec playwright install chromium.":"browser tools require the optional `playwright` peer dependency. Install via: pnpm add playwright (then pnpm exec playwright install chromium). Or pick a different tool."}var eO,Yn=b(()=>{"use strict";eO=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"]});function tO(t){if(!t||typeof t!="object")return{error:"browser_open: input must be an object"};let e=t,n=e.url;if(typeof n!="string"||n.length===0)return{error:'browser_open: "url" is required and must be a non-empty string'};let r;try{r=new URL(n)}catch{return{error:`browser_open: "${n}" is not a valid absolute URL`}}if(r.protocol!=="http:"&&r.protocol!=="https:")return{error:`browser_open: protocol "${r.protocol}" is not supported (http/https only)`};let o;if(e.wait_for!==void 0){if(!vb.includes(e.wait_for))return{error:`browser_open: "wait_for" must be one of ${vb.map(a=>`"${a}"`).join(", ")} (got ${JSON.stringify(e.wait_for)})`};o=e.wait_for}let s;if(e.screenshot!==void 0){if(typeof e.screenshot!="boolean")return{error:'browser_open: "screenshot" must be a boolean'};s=e.screenshot}let i;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:'browser_open: "timeout_ms" must be a positive finite number'};i=e.timeout_ms}return{url:r.toString(),waitFor:o,screenshot:s,timeoutMs:i}}function nO(t={}){return async(e,n,r)=>{if(n.aborted){let l=n.reason;return{content:`browser_open aborted: ${l instanceof Error?l.message:String(l??"aborted")}`,isError:!0,failureClass:"abort"}}let o=tO(e);if("error"in o)return{content:o.error,isError:!0};let s=E.AFK_SESSION_ID??"default";if(!/^[a-zA-Z0-9_-]+$/.test(s))return{content:`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(s)}`,isError:!0};let i;try{if(t.getBrowserProvider)i=await t.getBrowserProvider();else{let{getBrowserProvider:l}=await Promise.resolve().then(()=>(mn(),fn));i=await l()}}catch(l){let c=l instanceof Error?l.message:String(l);return et(c)?{content:tt(c),isError:!0}:{content:`browser_open failed to get provider: ${c}`,isError:!0}}let a=Date.now();try{let l=await i.open({sessionId:s,url:o.url,waitFor:o.waitFor,screenshot:o.screenshot,timeoutMs:o.timeoutMs}),c=Date.now()-a;if("outcome"in l&&l.outcome==="blocked_by_policy")return le(r?.traceWriter,{tool:"browser_open",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"blocked_by_policy",durationMs:c}),{content:`browser_open blocked: ${l.reason}`,isError:!0,failureClass:"policy-refusal"};let d=l;return le(r?.traceWriter,{tool:"browser_open",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:d.url,status:"ok",durationMs:c,...d.screenshotPath!==null?{screenshotPath:d.screenshotPath}:{}}),{content:JSON.stringify(d,null,2)}}catch(l){let c=Date.now()-a,d=l instanceof Error?l.message:String(l);le(r?.traceWriter,{tool:"browser_open",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"error",durationMs:c,error:{reason:d,recoverable:!1}});let u=Wi(l);return{content:`browser_open failed: ${d}`,isError:!0,...u?{failureClass:u}:{}}}}}var vb,kb,_b=b(()=>{"use strict";j();X();Yn();vb=["load","domcontentloaded","networkidle"];kb=nO()});function rO(t){if(t!=null&&typeof t!="object")return{error:"browser_observe: input must be an object or omitted"};if(!t)return{};let e=t,n;if(e.screenshot!==void 0){if(typeof e.screenshot!="boolean")return{error:'browser_observe: "screenshot" must be a boolean'};n=e.screenshot}let r;if(e.include_hidden!==void 0){if(typeof e.include_hidden!="boolean")return{error:'browser_observe: "include_hidden" must be a boolean'};r=e.include_hidden}let o;if(e.max_elements!==void 0){if(typeof e.max_elements!="number"||!Number.isFinite(e.max_elements)||e.max_elements<=0||!Number.isInteger(e.max_elements))return{error:'browser_observe: "max_elements" must be a positive integer'};o=e.max_elements}return{screenshot:n,includeHidden:r,maxElements:o}}function oO(t={}){return async(e,n,r)=>{if(n.aborted){let l=n.reason;return{content:`browser_observe aborted: ${l instanceof Error?l.message:String(l??"aborted")}`,isError:!0}}let o=rO(e);if("error"in o)return{content:o.error,isError:!0};let s=E.AFK_SESSION_ID??"default";if(!/^[a-zA-Z0-9_-]+$/.test(s))return{content:`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(s)}`,isError:!0};let i;try{if(t.getBrowserProvider)i=await t.getBrowserProvider();else{let{getBrowserProvider:l}=await Promise.resolve().then(()=>(mn(),fn));i=await l()}}catch(l){let c=l instanceof Error?l.message:String(l);return et(c)?{content:tt(c),isError:!0}:{content:`browser_observe failed to get provider: ${c}`,isError:!0}}let a=Date.now();try{let l=await i.observe({sessionId:s,screenshot:o.screenshot,includeHidden:o.includeHidden,maxElements:o.maxElements}),c=Date.now()-a;return le(r?.traceWriter,{tool:"browser_observe",toolUseId:r?.toolUseId??"",urlBefore:l.url,urlAfter:l.url,status:"ok",durationMs:c,...l.screenshotPath!==null?{screenshotPath:l.screenshotPath}:{}}),{content:JSON.stringify(l,null,2)}}catch(l){let c=Date.now()-a,d=l instanceof Error?l.message:String(l);return le(r?.traceWriter,{tool:"browser_observe",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"error",durationMs:c,error:{reason:d,recoverable:!1}}),{content:`browser_observe failed: ${d}`,isError:!0}}}}var Eb,Ab=b(()=>{"use strict";j();X();Yn();Eb=oO()});function sO(t){if(!t||typeof t!="object")return{error:"browser_act: input must be an object"};let e=t;if(typeof e.action!="string")return{error:'browser_act: "action" is required and must be a string'};if(!Tb.includes(e.action))return{error:`browser_act: "action" must be one of ${Tb.map(d=>`"${d}"`).join(", ")} (got ${JSON.stringify(e.action)})`};let n=e.action,r=e.target;if(!r||typeof r!="object")return{error:'browser_act: "target" is required and must be an object'};let o=r;if(typeof o.kind!="string"||!xb.includes(o.kind))return{error:`browser_act: "target.kind" must be one of ${xb.map(d=>`"${d}"`).join(", ")} (got ${JSON.stringify(o.kind)})`};let s,i=o.kind;if(i==="semantic"){if(typeof o.text!="string"||o.text.length===0)return{error:'browser_act: target.kind=semantic requires "target.text" (non-empty string)'};s={kind:"semantic",text:o.text,...typeof o.role=="string"&&o.role.length>0?{role:o.role}:{}}}else if(i==="element_id"){if(typeof o.element_id!="string"||o.element_id.length===0)return{error:'browser_act: target.kind=element_id requires "target.element_id" (non-empty string)'};s={kind:"element_id",elementId:o.element_id}}else{if(typeof o.selector!="string"||o.selector.length===0)return{error:'browser_act: target.kind=selector requires "target.selector" (non-empty string)'};s={kind:"selector",selector:o.selector}}let a;if(e.value!==void 0){if(typeof e.value!="string")return{error:'browser_act: "value" must be a string when provided'};a=e.value}let l;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:'browser_act: "timeout_ms" must be a positive finite number'};l=e.timeout_ms}let c;if(e.screenshot!==void 0){if(typeof e.screenshot!="boolean")return{error:'browser_act: "screenshot" must be a boolean'};c=e.screenshot}return{action:n,target:s,value:a,timeoutMs:l,screenshot:c}}function iO(t,e){let n=t.role?`"${t.text}" (role: ${t.role})`:`"${t.text}"`;return[`browser_act: ambiguous target \u2014 ${e.length} elements matched ${n}.`,'Retry with target.kind="element_id" using one of the following:',...e.map(o=>` id=${o.id} role=${o.role} label=${o.label}`)].join(`
|
|
871
871
|
`)}function aO(t){return t.kind==="semantic"?{kind:"semantic",text:Gh(t.text),...t.role!==void 0?{role:t.role}:{}}:t.kind==="element_id"?{kind:"element_id",elementId:t.elementId}:{kind:"selector",selectorHash:Kh(t.selector)}}function lO(t={}){return async(e,n,r)=>{if(n.aborted){let c=n.reason;return{content:`browser_act aborted: ${c instanceof Error?c.message:String(c??"aborted")}`,isError:!0,failureClass:"abort"}}let o=sO(e);if("error"in o)return{content:o.error,isError:!0};let s=aO(o.target),i=E.AFK_SESSION_ID??"default";if(!/^[a-zA-Z0-9_-]+$/.test(i))return{content:`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(i)}`,isError:!0};let a;try{if(t.getBrowserProvider)a=await t.getBrowserProvider();else{let{getBrowserProvider:c}=await Promise.resolve().then(()=>(mn(),fn));a=await c()}}catch(c){let d=c instanceof Error?c.message:String(c);return et(d)?{content:tt(d),isError:!0}:{content:`browser_act failed to get provider: ${d}`,isError:!0}}let l=Date.now();try{let c=await a.act({sessionId:i,action:o.action,target:o.target,value:o.value,timeoutMs:o.timeoutMs,screenshot:o.screenshot}),d=Date.now()-l;if("outcome"in c){if(c.outcome==="ambiguous_target")return le(r?.traceWriter,{tool:"browser_act",action:o.action,toolUseId:r?.toolUseId??"",target:s,urlBefore:null,urlAfter:null,status:"ambiguous_target",durationMs:d}),{content:iO(c.query,c.candidates),isError:!0};if(c.outcome==="blocked_by_policy")return le(r?.traceWriter,{tool:"browser_act",action:o.action,toolUseId:r?.toolUseId??"",target:s,urlBefore:null,urlAfter:null,status:"blocked_by_policy",durationMs:d}),{content:`browser_act blocked: ${c.reason}`,isError:!0,failureClass:"policy-refusal"}}return le(r?.traceWriter,{tool:"browser_act",action:o.action,toolUseId:r?.toolUseId??"",target:s,urlBefore:c.url,urlAfter:c.url,status:"ok",durationMs:d,...c.screenshotPath!==null?{screenshotPath:c.screenshotPath}:{}}),{content:JSON.stringify(c,null,2)}}catch(c){let d=Date.now()-l,u=c instanceof Error?c.message:String(c);le(r?.traceWriter,{tool:"browser_act",action:o.action,toolUseId:r?.toolUseId??"",target:s,urlBefore:null,urlAfter:null,status:"error",durationMs:d,error:{reason:u,recoverable:!1}});let p=Wi(c);return{content:`browser_act failed: ${u}`,isError:!0,...p?{failureClass:p}:{}}}}}var Tb,xb,Rb,Ib=b(()=>{"use strict";Jr();j();X();Yn();Tb=["click","fill","press","select","hover","scroll_to","wait_for"],xb=["semantic","element_id","selector"];Rb=lO()});function cO(t){if(typeof t.kind!="string"||!Cb.includes(t.kind))return{error:`browser_screenshot: "target.kind" must be one of ${Cb.map(n=>`"${n}"`).join(", ")} (got ${JSON.stringify(t.kind)})`};let e=t.kind;return e==="semantic"?typeof t.text!="string"||t.text.length===0?{error:'browser_screenshot: target.kind=semantic requires "target.text" (non-empty string)'}:{kind:"semantic",text:t.text,...typeof t.role=="string"&&t.role.length>0?{role:t.role}:{}}:e==="element_id"?typeof t.element_id!="string"||t.element_id.length===0?{error:'browser_screenshot: target.kind=element_id requires "target.element_id" (non-empty string)'}:{kind:"element_id",elementId:t.element_id}:typeof t.selector!="string"||t.selector.length===0?{error:'browser_screenshot: target.kind=selector requires "target.selector" (non-empty string)'}:{kind:"selector",selector:t.selector}}function dO(t){if(t!=null&&typeof t!="object")return{error:"browser_screenshot: input must be an object or omitted"};if(!t)return{};let e=t,n;if(e.target!==void 0){if(!e.target||typeof e.target!="object")return{error:'browser_screenshot: "target" must be an object when provided'};let o=cO(e.target);if("error"in o)return o;n=o}let r;if(e.full_page!==void 0){if(typeof e.full_page!="boolean")return{error:'browser_screenshot: "full_page" must be a boolean'};r=e.full_page}return{target:n,fullPage:r}}function uO(t={}){return async(e,n,r)=>{if(n.aborted){let l=n.reason;return{content:`browser_screenshot aborted: ${l instanceof Error?l.message:String(l??"aborted")}`,isError:!0}}let o=dO(e);if("error"in o)return{content:o.error,isError:!0};let s=E.AFK_SESSION_ID??"default";if(!/^[a-zA-Z0-9_-]+$/.test(s))return{content:`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(s)}`,isError:!0};let i;try{if(t.getBrowserProvider)i=await t.getBrowserProvider();else{let{getBrowserProvider:l}=await Promise.resolve().then(()=>(mn(),fn));i=await l()}}catch(l){let c=l instanceof Error?l.message:String(l);return et(c)?{content:tt(c),isError:!0}:{content:`browser_screenshot failed to get provider: ${c}`,isError:!0}}let a=Date.now();try{let l=await i.screenshot({sessionId:s,target:o.target,fullPage:o.fullPage}),c=Date.now()-a,{dataBase64:d,mediaType:u,...p}=l;return le(r?.traceWriter,{tool:"browser_screenshot",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"ok",durationMs:c,screenshotPath:p.path}),p.width>Hd||p.height>Hd?{content:JSON.stringify({...p,imageOmitted:`dimensions ${p.width}x${p.height}px exceed the ${Hd}px model-vision limit; the PNG was saved to the sidecar path but not attached. Use full_page:false (viewport) or target a specific element for a model-visible image.`},null,2)}:{content:JSON.stringify(p,null,2),image:{mediaType:u,data:d}}}catch(l){let c=Date.now()-a,d=l instanceof Error?l.message:String(l);return le(r?.traceWriter,{tool:"browser_screenshot",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"error",durationMs:c,error:{reason:d,recoverable:!1}}),{content:`browser_screenshot failed: ${d}`,isError:!0}}}}var Cb,Hd,Pb,Mb=b(()=>{"use strict";j();X();Yn();Cb=["semantic","element_id","selector"],Hd=8e3;Pb=uO()});function pO(t={}){return async(e,n,r)=>{if(n.aborted){let a=n.reason;return{content:`browser_close aborted: ${a instanceof Error?a.message:String(a??"aborted")}`,isError:!0}}let o=E.AFK_SESSION_ID??"default";if(!/^[a-zA-Z0-9_-]+$/.test(o))return{content:`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(o)}`,isError:!0};let s;try{if(t.getBrowserProvider)s=await t.getBrowserProvider();else{let{getBrowserProvider:a}=await Promise.resolve().then(()=>(mn(),fn));s=await a()}}catch(a){let l=a instanceof Error?a.message:String(a);return et(l)?{content:tt(l),isError:!0}:{content:`browser_close failed to get provider: ${l}`,isError:!0}}let i=Date.now();try{await s.close({sessionId:o});let a=Date.now()-i;return le(r?.traceWriter,{tool:"browser_close",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"ok",durationMs:a}),{content:"Browser session closed."}}catch(a){let l=Date.now()-i,c=a instanceof Error?a.message:String(a);return le(r?.traceWriter,{tool:"browser_close",toolUseId:r?.toolUseId??"",urlBefore:null,urlAfter:null,status:"error",durationMs:l,error:{reason:c,recoverable:!1}}),{content:`browser_close failed: ${c}`,isError:!0}}}}var Ob,Db=b(()=>{"use strict";j();X();Yn();Ob=pO()});function Ki(t,e){let n=t!==void 0?vi(t,e):e!==void 0?vi("default",e):mh,r=e!==void 0?ld(e):Ah,o=e!==void 0?cd(e):xh,s=e!==void 0?od(e):hh,i=e!==void 0?id(e):wh,a=e!==void 0?ad(e):vh,l=e!==void 0?dd(e):Ih,c=xd(),d=Hy(e);return new Map([["bash",n],["read_file",s],["write_file",i],["edit_file",a],["glob",r],["grep",o],["list_directory",l],["send_telegram",Mh],["web_scrape",my],["create_schedule",_y],["list_schedules",Ey],["get_schedule_history",Ay],["cancel_schedule",Ty],["worktree",d],["terminal_font_size",c],["config_get",hb],["config_set",yb],["ask_question",wb],["browser_open",kb],["browser_observe",Eb],["browser_act",Rb],["browser_screenshot",Pb],["browser_close",Ob]])}var Wd=b(()=>{"use strict";gh();yh();Sh();kh();Th();Rh();Ch();Oh();gy();xy();Py();Wy();bb();Sb();_b();Ab();Ib();Mb();Db()});function Gi(t){return t?Fb:hO}function qi(t){return t?bO:yO}var Fb,fO,mO,gO,hO,yO,bO,Kd=b(()=>{"use strict";Fb=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
|
|
872
872
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-afk",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.50.0",
|
|
4
4
|
"description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
|
|
5
5
|
"main": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|