agent-afk 3.20.2 → 3.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.mjs +65 -63
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- var Dv=Object.defineProperty;var io=(e,t)=>()=>(e&&(t=e(e=0)),t);var qu=(e,t)=>{for(var n in t)Dv(e,n,{get:t[n],enumerable:!0})};function Vu(e){return Ju.filter(t=>!t.required||e!==void 0&&t.category!==e?!1:process.env[t.name]===void 0||process.env[t.name]==="")}var Ju,E,H=io(()=>{"use strict";Ju=[{name:"AFK_COMPACT_KEEP_LAST_TURNS",description:"Number of recent turns the compactor keeps verbatim during /compact. Default tuned in compact-handler.ts.",type:"number",required:!1,example:"6",category:"model"},{name:"AFK_COMPACT_MODEL",description:"Override the model used by the /compact summarizer. Falls back to a cheap default (haiku-class).",type:"string",required:!1,example:"claude-haiku-4-5",category:"model"},{name:"AFK_DEFAULT_SUBAGENT_MODEL",description:"Override the default model used when a subagent is dispatched without an explicit model.",type:"string",required:!1,example:"sonnet",category:"model"},{name:"AFK_DISABLE_PROMPT_CACHE",description:"Disable Anthropic prompt caching when set to 1/true/yes/on. Unset = caching enabled.",type:"boolean",required:!1,default:"0",example:"1",category:"model"},{name:"AFK_EFFORT",description:"Reasoning-effort hint for the Codex provider. Accepts low | medium | high.",type:"string",required:!1,example:"medium",category:"model"},{name:"AFK_MAX_BUDGET_USD",description:"Per-turn USD budget ceiling. Aborts the turn when projected spend would exceed this.",type:"number",required:!1,default:"5.00",example:"10.00",category:"model"},{name:"AFK_MAX_OUTPUT_TOKENS",description:"Cap on output tokens per turn. Falls back to provider default when unset.",type:"number",required:!1,example:"8192",category:"model"},{name:"AFK_MAX_TOKENS",description:"Cap on total tokens per turn (input + output). Default 4096.",type:"number",required:!1,default:"4096",example:"8192",category:"model"},{name:"AFK_MODEL",description:"Default model for agent turns. Accepts short aliases (opus, sonnet, haiku) or full model IDs.",type:"string",required:!1,default:"sonnet",example:"claude-opus-4-5",category:"model"},{name:"AFK_PROMPT_CACHE_TTL",description:"TTL for Anthropic prompt-cache blocks. Accepts 5m or 1h.",type:"string",required:!1,default:"1h",example:"1h",category:"model"},{name:"AFK_TASK_BUDGET",description:"Per-task token budget ceiling. Aborts when cumulative usage would exceed it.",type:"number",required:!1,default:"100000",example:"200000",category:"model"},{name:"AFK_TEMPERATURE",description:"Numeric temperature override for model sampling. Provider default if unset.",type:"number",required:!1,example:"0.7",category:"model"},{name:"AFK_THINKING",description:"Extended-thinking toggle. Accepts on | off | <budget-tokens>. On by default.",type:"string",required:!1,default:"on",example:"on",category:"model"},{name:"AFK_TIMEOUT_MS",description:"Per-turn timeout in milliseconds. Provider/SDK default if unset.",type:"number",required:!1,example:"120000",category:"model"},{name:"CLAUDE_MODEL",description:"Legacy alias for AFK_MODEL \u2014 supported for back-compat with pre-AFK_* deployments.",type:"string",required:!1,example:"sonnet",category:"model"},{name:"AFK_SYSTEM_PROMPT",description:"Raw system-prompt string. Tier-1 source (highest priority over afk.config.json and AFK.md).",type:"string",required:!1,example:"You are a helpful agent.",category:"model"},{name:"AFK_DUMP_PROMPT",description:"Write the resolved system prompt to a file at startup. Accepts a path or 1 for default location.",type:"string",required:!1,example:"/tmp/afk-prompt.txt",category:"debug"},{name:"ANTHROPIC_API_KEY",description:"Anthropic API key. Tier-1 credential \u2014 overrides keychain OAuth and CLAUDE_CODE_OAUTH_TOKEN.",type:"string",required:!1,category:"auth",secret:!0},{name:"CLAUDE_CODE_OAUTH_TOKEN",description:"Claude Code OAuth token. Tier-2 credential \u2014 used when ANTHROPIC_API_KEY is unset; falls back to keychain.",type:"string",required:!1,category:"auth",secret:!0},{name:"OPENAI_API_KEY",description:"OpenAI API key for the openai-compatible provider (gpt-*, o1*, o3*, o4* models).",type:"string",required:!1,category:"auth",secret:!0},{name:"CODEX_API_KEY",description:"Codex API key for the @openai/codex-sdk provider when AFK_MODEL=codex-*.",type:"string",required:!1,category:"auth",secret:!0},{name:"AFK_LOCAL_API_KEY",description:"Placeholder API key for local Anthropic-compatible servers (vllm-mlx, etc.). Set when AFK_LOCAL_BASE_URL is configured.",type:"string",required:!1,default:"local",example:"local",category:"auth",secret:!0},{name:"AFK_LOCAL_BASE_URL",description:"Base URL for a self-hosted Anthropic-compatible server. When set, routes traffic away from api.anthropic.com.",type:"string",required:!1,example:"http://127.0.0.1:8080",category:"model"},{name:"AFK_OPENAI_BASE_URL",description:"Base URL override for the OpenAI-compatible provider. Used for local shims (mlx_lm.server, Ollama, vLLM, LM Studio).",type:"string",required:!1,example:"http://127.0.0.1:8000/v1",category:"model"},{name:"TELEGRAM_BOT_TOKEN",description:"Telegram bot token from @BotFather. Required to run the Telegram bot surface.",type:"string",required:!1,category:"telegram",secret:!0},{name:"AFK_TELEGRAM_BOT_TOKEN",description:"Alternative env var name for the Telegram bot token, accepted by the setup wizard.",type:"string",required:!1,category:"telegram",secret:!0},{name:"AFK_TELEGRAM_ALLOWED_CHAT_IDS",description:"Comma-separated list of Telegram chat IDs allowed to interact with the bot. Required when the bot is running.",type:"string",required:!1,example:"123456789,987654321",category:"telegram"},{name:"TELEGRAM_DATA_DIR",description:"Override the directory where Telegram bot state is stored. Defaults to ~/.afk/state/telegram/.",type:"string",required:!1,category:"telegram"},{name:"TELEGRAM_VERBOSE",description:"Set to 1 to log per-message details from the Telegram bot \u2014 chat IDs, message text, latency.",type:"boolean",required:!1,example:"1",category:"telegram"},{name:"AFK_TELEGRAM_TRACE",description:"Set to 1 to dump raw bridge traffic between the agent and the Telegram bot \u2014 debugging only.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AFK_TELEGRAM_CWD",description:"Override the working directory used by the Telegram bot when spawning agent sessions.",type:"string",required:!1,category:"telegram"},{name:"AFK_HOME",description:"Override the AFK home directory. Default: ~/.afk/.",type:"string",required:!1,default:"~/.afk",example:"/opt/afk",category:"paths"},{name:"AFK_STATE_DIR",description:"Override the AFK state directory. Default: $AFK_HOME/state/.",type:"string",required:!1,category:"paths"},{name:"AFK_FRAMEWORK_DIR",description:"Override the AFK agent-framework directory used for telemetry and briefs. Default: $AFK_HOME/agent-framework/.",type:"string",required:!1,category:"paths"},{name:"AFK_EVAL_HARNESS_ROOT",description:"Root path for the forge evaluation harness. Used by the L1/L2 capability-gate checks.",type:"string",required:!1,category:"paths"},{name:"HOME",description:"Standard Unix home directory. Used as the fallback when AFK_HOME is unset.",type:"string",required:!1,category:"process"},{name:"PATH",description:"System PATH. Read for executable resolution (git, gh, etc.) in tool handlers.",type:"string",required:!1,category:"process"},{name:"AFK_DAEMON_CWD",description:"Working directory used by the daemon process for spawned agent sessions.",type:"string",required:!1,category:"daemon"},{name:"AFK_DAEMON_TASK",description:"Default task description for the daemon. Falls back to afk.config.json daemon.task.",type:"string",required:!1,category:"daemon"},{name:"AFK_DAEMON_TASK_ID",description:"Task identifier the daemon uses to scope its state directory and telemetry.",type:"string",required:!1,category:"daemon"},{name:"AFK_SESSIONSTART_COOLDOWN_MS",description:"Cooldown in milliseconds between SessionStart trigger fires in the daemon. Prevents thundering-herd on rapid restarts.",type:"number",required:!1,category:"daemon"},{name:"AFK_WORKTREE_AUTONAME",description:"Auto-rename worktree branches based on the first user message in interactive mode. 1 = on (default), 0 = off.",type:"boolean",required:!1,default:"1",example:"0",category:"worktree"},{name:"AFK_WORKTREE_BRANCH_PREFIX",description:"Branch-name prefix for AFK-managed worktrees. Default afk/. Set to empty string to drop the prefix.",type:"string",required:!1,default:"afk/",example:"wt/",category:"worktree"},{name:"AFK_WORKTREE_BOOT_PRUNE",description:"When set, the daemon prunes stale worktrees at boot in addition to the cron-driven sweep.",type:"boolean",required:!1,category:"worktree"},{name:"AFK_WORKTREE_PRUNE_DISABLE",description:"Disable the worktree prune job entirely. Useful for long-running tests.",type:"boolean",required:!1,category:"worktree"},{name:"AFK_WORKTREE_MAX_AGE_CLEAN",description:"Maximum age (in days) before a clean worktree is auto-pruned. Default 14.",type:"number",required:!1,default:"14",category:"worktree"},{name:"AFK_WORKTREE_MAX_AGE_DIRTY",description:"Maximum age (in days) before a dirty worktree is auto-pruned. Default 30.",type:"number",required:!1,default:"30",category:"worktree"},{name:"AFK_WORKTREE_SWEEP_ROOT",description:"Override the root directory under which AFK worktrees are tracked for pruning.",type:"string",required:!1,category:"worktree"},{name:"AFK_THREADS_ALLOWED_USERNAMES",description:"Comma-separated allowlist of Threads usernames the agent will respond to.",type:"string",required:!1,example:"alice,bob",category:"threads"},{name:"AFK_THREADS_DRY_RUN",description:"Set to 1 to log Threads replies without actually posting them.",type:"boolean",required:!1,example:"1",category:"threads"},{name:"AFK_THREADS_POLL_INTERVAL_MS",description:"Poll interval for the Threads inbox watcher in milliseconds.",type:"number",required:!1,category:"threads"},{name:"AFK_THREADS_REPLY_MODE",description:"Threads reply mode. Accepts post (default) or other modes defined in src/threads.ts.",type:"string",required:!1,default:"post",example:"post",category:"threads"},{name:"AFK_ALLOW_PROJECT_MCP",description:"Allow loading MCP configuration from <cwd>/.mcp.json. Disabled by default \u2014 opt-in to mitigate config-injection risks.",type:"boolean",required:!1,example:"1",category:"mcp"},{name:"AFK_AUTO_ROUTING",description:"Auto-route bare slash inputs to matching skills. Applies to interactive, chat, telegram, and daemon surfaces.",type:"boolean",required:!1,example:"true",category:"misc"},{name:"AFK_BANNER_PLAIN",description:"Suppress the ANSI-colored banner at REPL startup. Useful for non-TTY captures and CI logs.",type:"boolean",required:!1,example:"1",category:"misc"},{name:"AFK_SPINNER_TIPS",description:"Show rotating tips in the loading spinner during long calls. 1 = on, 0 = off.",type:"boolean",required:!1,category:"misc"},{name:"AFK_SHOW_DIFFS",description:"Show inline diffs in the tool-lane output for edit/write tool calls. 1 = on, 0 = off.",type:"boolean",required:!1,category:"misc"},{name:"AFK_SKILL_STREAM_VERBOSE",description:"Verbose streaming output when a skill is dispatched. Logs sub-agent setup, intermediate events, and final result.",type:"boolean",required:!1,category:"debug"},{name:"FORCE_COLOR",description:"Standard Node convention. Force-enable ANSI color output even when stdout is not a TTY.",type:"string",required:!1,example:"1",category:"process"},{name:"NO_COLOR",description:"Standard convention (https://no-color.org). When set to any non-empty value, disables ANSI color output.",type:"string",required:!1,example:"1",category:"process"},{name:"AFK_DEBUG",description:"Enable verbose debug logging across the codebase. Accepts 1 to enable.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AFK_DEBUG_CLIPBOARD",description:"Debug bracketed-paste and image-paste handling in the interactive REPL.",type:"boolean",required:!1,category:"debug"},{name:"AFK_TRACE_DISABLED",description:"Disable the agent trace subsystem entirely. Set to 1 to skip trace file writes.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"DEBUG",description:"Standard Node `debug`-package convention. When set to 1, enables verbose logging in several modules alongside AFK_DEBUG.",type:"string",required:!1,category:"debug"},{name:"AGENT_AFK_ASCII",description:"Force the interactive REPL tool-lane renderer to ASCII-only glyphs instead of the default Unicode box-drawing set. Accepts 1/true/yes (case-insensitive). Useful for terminals whose font lacks \u2503\u251C\u2570\u251C glyphs.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AGENT_SURFACE",description:"Internal surface marker propagated to subprocesses. Identifies which AFK surface (cli, telegram, daemon, threads) spawned the process.",type:"string",required:!1,example:"cli",category:"process"},{name:"CI",description:"Standard CI-detection convention. Auto-set by GitHub Actions, CircleCI, etc. Used to switch off TTY-only UX.",type:"string",required:!1,example:"true",category:"process"},{name:"NODE_ENV",description:"Standard Node environment marker. test | development | production. Used by routing-telemetry.ts to suppress test-time writes.",type:"string",required:!1,example:"production",category:"process"},{name:"VITEST",description:"Set automatically by Vitest. Used at runtime to short-circuit code paths that should not fire in tests.",type:"string",required:!1,category:"process"},{name:"NO_UPDATE_NOTIFIER",description:"Disable the update-available notifier on CLI startup. Standard convention shared with many Node CLIs.",type:"boolean",required:!1,category:"process"},{name:"AFK_WRITE_DENYLIST",description:"Comma-separated list of additional path globs that the write_file tool refuses to write to.",type:"string",required:!1,example:"**/.env,**/secrets/**",category:"misc"},{name:"AFK_WRITE_DIFF",description:"Show a diff preview before each write_file tool call. Defaults provider-controlled when unset.",type:"boolean",required:!1,category:"misc"}],E={get AFK_COMPACT_KEEP_LAST_TURNS(){return process.env.AFK_COMPACT_KEEP_LAST_TURNS},get AFK_COMPACT_MODEL(){return process.env.AFK_COMPACT_MODEL},get AFK_DEFAULT_SUBAGENT_MODEL(){return process.env.AFK_DEFAULT_SUBAGENT_MODEL},get AFK_DISABLE_PROMPT_CACHE(){return process.env.AFK_DISABLE_PROMPT_CACHE},get AFK_EFFORT(){return process.env.AFK_EFFORT},get AFK_MAX_BUDGET_USD(){return process.env.AFK_MAX_BUDGET_USD},get AFK_MAX_OUTPUT_TOKENS(){return process.env.AFK_MAX_OUTPUT_TOKENS},get AFK_MAX_TOKENS(){return process.env.AFK_MAX_TOKENS},get AFK_MODEL(){return process.env.AFK_MODEL},get AFK_PROMPT_CACHE_TTL(){return process.env.AFK_PROMPT_CACHE_TTL},get AFK_TASK_BUDGET(){return process.env.AFK_TASK_BUDGET},get AFK_TEMPERATURE(){return process.env.AFK_TEMPERATURE},get AFK_THINKING(){return process.env.AFK_THINKING},get AFK_TIMEOUT_MS(){return process.env.AFK_TIMEOUT_MS},get CLAUDE_MODEL(){return process.env.CLAUDE_MODEL},get AFK_SYSTEM_PROMPT(){return process.env.AFK_SYSTEM_PROMPT},get AFK_DUMP_PROMPT(){return process.env.AFK_DUMP_PROMPT},get ANTHROPIC_API_KEY(){return process.env.ANTHROPIC_API_KEY},get CLAUDE_CODE_OAUTH_TOKEN(){return process.env.CLAUDE_CODE_OAUTH_TOKEN},get OPENAI_API_KEY(){return process.env.OPENAI_API_KEY},get CODEX_API_KEY(){return process.env.CODEX_API_KEY},get AFK_LOCAL_API_KEY(){return process.env.AFK_LOCAL_API_KEY},get AFK_LOCAL_BASE_URL(){return process.env.AFK_LOCAL_BASE_URL},get AFK_OPENAI_BASE_URL(){return process.env.AFK_OPENAI_BASE_URL},get TELEGRAM_BOT_TOKEN(){return process.env.TELEGRAM_BOT_TOKEN},get AFK_TELEGRAM_BOT_TOKEN(){return process.env.AFK_TELEGRAM_BOT_TOKEN},get AFK_TELEGRAM_ALLOWED_CHAT_IDS(){return process.env.AFK_TELEGRAM_ALLOWED_CHAT_IDS},get TELEGRAM_DATA_DIR(){return process.env.TELEGRAM_DATA_DIR},get TELEGRAM_VERBOSE(){return process.env.TELEGRAM_VERBOSE},get AFK_TELEGRAM_TRACE(){return process.env.AFK_TELEGRAM_TRACE},get AFK_TELEGRAM_CWD(){return process.env.AFK_TELEGRAM_CWD},get AFK_HOME(){return process.env.AFK_HOME},get AFK_STATE_DIR(){return process.env.AFK_STATE_DIR},get AFK_FRAMEWORK_DIR(){return process.env.AFK_FRAMEWORK_DIR},get AFK_EVAL_HARNESS_ROOT(){return process.env.AFK_EVAL_HARNESS_ROOT},get HOME(){return process.env.HOME},get PATH(){return process.env.PATH},get AFK_DAEMON_CWD(){return process.env.AFK_DAEMON_CWD},get AFK_DAEMON_TASK(){return process.env.AFK_DAEMON_TASK},get AFK_DAEMON_TASK_ID(){return process.env.AFK_DAEMON_TASK_ID},get AFK_SESSIONSTART_COOLDOWN_MS(){return process.env.AFK_SESSIONSTART_COOLDOWN_MS},get AFK_WORKTREE_AUTONAME(){return process.env.AFK_WORKTREE_AUTONAME},get AFK_WORKTREE_BRANCH_PREFIX(){return process.env.AFK_WORKTREE_BRANCH_PREFIX},get AFK_WORKTREE_BOOT_PRUNE(){return process.env.AFK_WORKTREE_BOOT_PRUNE},get AFK_WORKTREE_PRUNE_DISABLE(){return process.env.AFK_WORKTREE_PRUNE_DISABLE},get AFK_WORKTREE_MAX_AGE_CLEAN(){return process.env.AFK_WORKTREE_MAX_AGE_CLEAN},get AFK_WORKTREE_MAX_AGE_DIRTY(){return process.env.AFK_WORKTREE_MAX_AGE_DIRTY},get AFK_WORKTREE_SWEEP_ROOT(){return process.env.AFK_WORKTREE_SWEEP_ROOT},get AFK_THREADS_ALLOWED_USERNAMES(){return process.env.AFK_THREADS_ALLOWED_USERNAMES},get AFK_THREADS_DRY_RUN(){return process.env.AFK_THREADS_DRY_RUN},get AFK_THREADS_POLL_INTERVAL_MS(){return process.env.AFK_THREADS_POLL_INTERVAL_MS},get AFK_THREADS_REPLY_MODE(){return process.env.AFK_THREADS_REPLY_MODE},get AFK_ALLOW_PROJECT_MCP(){return process.env.AFK_ALLOW_PROJECT_MCP},get AFK_AUTO_ROUTING(){return process.env.AFK_AUTO_ROUTING},get AFK_BANNER_PLAIN(){return process.env.AFK_BANNER_PLAIN},get AFK_SPINNER_TIPS(){return process.env.AFK_SPINNER_TIPS},get AFK_SHOW_DIFFS(){return process.env.AFK_SHOW_DIFFS},get AFK_SKILL_STREAM_VERBOSE(){return process.env.AFK_SKILL_STREAM_VERBOSE},get FORCE_COLOR(){return process.env.FORCE_COLOR},get NO_COLOR(){return process.env.NO_COLOR},get AFK_DEBUG(){return process.env.AFK_DEBUG},get AFK_DEBUG_CLIPBOARD(){return process.env.AFK_DEBUG_CLIPBOARD},get AFK_TRACE_DISABLED(){return process.env.AFK_TRACE_DISABLED},get DEBUG(){return process.env.DEBUG},get AGENT_AFK_ASCII(){return process.env.AGENT_AFK_ASCII},get AGENT_SURFACE(){return process.env.AGENT_SURFACE},get CI(){return process.env.CI},get NODE_ENV(){return process.env.NODE_ENV},get VITEST(){return process.env.VITEST},get NO_UPDATE_NOTIFIER(){return process.env.NO_UPDATE_NOTIFIER},get AFK_WRITE_DENYLIST(){return process.env.AFK_WRITE_DENYLIST},get AFK_WRITE_DIFF(){return process.env.AFK_WRITE_DIFF}};(function(){for(let t of Ju){if(!t.secret)continue;let n=Object.getOwnPropertyDescriptor(E,t.name);n&&Object.defineProperty(E,t.name,{...n,enumerable:!1})}})()});import{existsSync as Yu,mkdirSync as Lv,renameSync as Fv,cpSync as Nv,rmSync as Uv}from"fs";import{join as Y,dirname as Qu,isAbsolute as jv}from"path";import{homedir as kl}from"os";import{fileURLToPath as Bv}from"url";function Re(){let e=E.AFK_HOME;if(e!==void 0&&e!==""){if(!jv(e)||e==="/")throw new Error(`AFK_HOME must be an absolute path that is not /, got: ${e}`);return e}return Y(kl(),".afk")}function pt(){return Y(Re(),"agent-framework")}function kt(){return Y(pt(),"forge-telemetry.jsonl")}function Kt(){return Y(pt(),"briefs")}function Ss(){return Y(pt(),"ceiling-ledger")}function ao(){return Y(Re(),"skills")}function _e(){return Y(Re(),"plugins")}function Zu(){return Y(process.cwd(),".afk")}function ep(){return Y(Zu(),"skills")}function wl(){return Y(Zu(),"plugins")}function re(){return Y(_e(),".index.json")}function Sl(){return Y(xn(),"schedules.json")}function Pt(){return Y(_e(),"cache")}function lo(e){return Y(Pt(),e)}function vl(){let e=Bv(import.meta.url),t=Qu(e);return Y(t,"bundled-plugins")}function xn(){return Y(Re(),"config")}function he(){return Y(Re(),"state")}function vs(){return Y(Re(),"cache")}function Gt(){return Y(Re(),"logs")}function zt(){return Y(he(),"sessions")}function Tl(){return Y(he(),"todos")}function Ts(){return Y(he(),"memory")}function wt(){return Y(he(),"queue")}function rr(){return Y(he(),"session-grants.jsonl")}function tp(){return Y(Re(),"farms")}function El(e){return Y(tp(),e)}function np(e){return Y(he(),"witness",e)}function or(e="default"){return Y(he(),"daemon",`agent-afk@${e}`)}function rp(){return Y(he(),"worktree-sweep.lock")}function Je(){return Y(xn(),"afk.env")}function Es(){return Y(xn(),"afk.config.json")}function op(){return Y(kl(),".afk.env")}function sp(){return Y(kl(),".afk.config.json")}function Wv(){return Y(Re(),"sessions")}function Hv(){return Y(Re(),"todos")}function ip(e,t){if(e!==t&&Yu(e)&&!Yu(t))try{Lv(Qu(t),{recursive:!0});try{Fv(e,t)}catch(n){if(n.code==="EXDEV")try{Nv(e,t,{recursive:!0}),Uv(e,{recursive:!0,force:!0})}catch(r){process.stderr.write(`[afk] migrateDirOnce: EXDEV fallback failed for ${e} \u2192 ${t}: ${String(r)}
3
- `)}}}catch{}}function ap(){ip(Wv(),zt())}function lp(){ip(Hv(),Tl())}function xl(){return Y(he(),"repl-history.jsonl")}function Gv(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid jobId: must be a non-empty string");if(e.length>Xu)throw new Error(`Invalid jobId: exceeds ${Xu} chars`);if(!Kv.test(e))throw new Error(`Invalid jobId: ${JSON.stringify(e)} contains characters outside [A-Za-z0-9_-]`)}function co(){return Y(he(),"bg")}function An(e){return Gv(e),Y(co(),e)}function xs(e){return Y(An(e),"events.jsonl")}function Al(e){return Y(An(e),"meta.json")}function uo(){return Y(he(),"mcp","server-status.json")}var Kv,Xu,F=io(()=>{"use strict";H();Kv=/^[A-Za-z0-9_-]+$/,Xu=128});function Qs(e,t=()=>{}){let n=new Set;if(!e)return n;for(let r of e.split(",")){let o=r.trim();if(o){if(!/^-?\d+$/.test(o)){t("[allowlist] Ignoring non-numeric chat ID:",o);continue}n.add(Number(o))}}return n}var sc=io(()=>{"use strict"});var ic={};qu(ic,{push:()=>Zs,pushIfConfigured:()=>ei});async function Zs(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??KA}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(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 ei(e,t={}){let n=E.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=Qs(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(r.size===0)return null;let o=[];for(let s of r)o.push(await Zs({token:n,chatId:s,text:e,...t.parseMode!==void 0?{parseMode:t.parseMode}:{},...t.replyMarkup!==void 0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}}));return o}var KA,So=io(()=>{"use strict";sc();H();KA="https://api.telegram.org"});var py={};qu(py,{KeychainOAuthProvider:()=>$r,clearOauthPending:()=>Zc,readOauthPending:()=>uy});import{existsSync as Wi,mkdirSync as cy,readFileSync as Hi,writeFileSync as Qc}from"node:fs";import{execFileSync as sy}from"node:child_process";import{homedir as iy,userInfo as ay}from"node:os";import{join as ly,dirname as dy}from"node:path";function BP(){let e=process.platform==="darwin",t=process.platform==="linux";return{read(){if(e)try{return sy("security",["find-generic-password","-s","Claude Code-credentials","-a",ay().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()||void 0}catch{return}if(t){let n=ly(iy(),".claude",".credentials.json");if(!Wi(n))return;try{return Hi(n,"utf-8")}catch{return}}},write(n){if(e)sy("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",ay().username,"-w",n],{stdio:["ignore","ignore","ignore"]});else if(t){let r=ly(iy(),".claude",".credentials.json");cy(dy(r),{recursive:!0}),Qc(r,n,{encoding:"utf-8",mode:384})}}}}function uy(){let e=uo();if(!Wi(e))return{};let t;try{t=JSON.parse(Hi(e,"utf-8"))}catch{return{}}if(t===null||typeof t!="object")return{};let n={};for(let[r,o]of Object.entries(t)){if(o===null||typeof o!="object")continue;let s=o;s.status==="oauth_pending"&&typeof s.authorizationUrl=="string"&&typeof s.timestamp=="number"&&Date.now()-s.timestamp<=jP&&(n[r]={status:"oauth_pending",authorizationUrl:s.authorizationUrl,timestamp:s.timestamp})}return n}function Zc(e){let t=uo();if(!Wi(t))return;let n;try{n=JSON.parse(Hi(t,"utf-8"))}catch{return}e in n&&(delete n[e],Qc(t,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}))}function WP(e,t){let n=uo();cy(dy(n),{recursive:!0});let r={};if(Wi(n))try{r=JSON.parse(Hi(n,"utf-8"))}catch{}let o=new URL(t),s=o.origin+o.pathname;r[e]={status:"oauth_pending",authorizationUrl:s,timestamp:Date.now()},Qc(n,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384})}var jP,$r,Ki=io(()=>{"use strict";F();jP=600*1e3;$r=class{serverName;backend;constructor(t,n=BP()){this.serverName=t,this.backend=n}get redirectUrl(){return"http://localhost:3000/oauth/callback"}get clientMetadata(){return{redirect_uris:[this.redirectUrl],client_name:"agent-afk",grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}clientInformation(){return this._readSlot().clientInfo}saveClientInformation(t){this._updateSlot(n=>({...n,clientInfo:t}))}tokens(){return this._readSlot().tokens}saveTokens(t){this._updateSlot(n=>({...n,tokens:t}));try{Zc(this.serverName)}catch{}}saveCodeVerifier(t){this._updateSlot(n=>({...n,codeVerifier:t}))}codeVerifier(){let t=this._readSlot().codeVerifier;if(!t)throw new Error(`[mcp:${this.serverName}] no PKCE code verifier stored`);return t}saveDiscoveryState(t){this._updateSlot(n=>({...n,discoveryState:t}))}discoveryState(){return this._readSlot().discoveryState}invalidateCredentials(t){this._updateSlot(n=>{if(t==="all")return{};let r={...n};return t==="client"&&delete r.clientInfo,t==="tokens"&&delete r.tokens,t==="verifier"&&delete r.codeVerifier,t==="discovery"&&delete r.discoveryState,r})}async redirectToAuthorization(t){let n=t.toString(),r=`\u{1F510} MCP server "${this.serverName}" requires authorization.
2
+ var Dv=Object.defineProperty;var io=(e,t)=>()=>(e&&(t=e(e=0)),t);var qu=(e,t)=>{for(var n in t)Dv(e,n,{get:t[n],enumerable:!0})};function Vu(e){return Ju.filter(t=>!t.required||e!==void 0&&t.category!==e?!1:process.env[t.name]===void 0||process.env[t.name]==="")}var Ju,E,K=io(()=>{"use strict";Ju=[{name:"AFK_COMPACT_KEEP_LAST_TURNS",description:"Number of recent turns the compactor keeps verbatim during /compact. Default tuned in compact-handler.ts.",type:"number",required:!1,example:"6",category:"model"},{name:"AFK_COMPACT_MODEL",description:"Override the model used by the /compact summarizer. Falls back to a cheap default (haiku-class).",type:"string",required:!1,example:"claude-haiku-4-5",category:"model"},{name:"AFK_DEFAULT_SUBAGENT_MODEL",description:"Override the default model used when a subagent is dispatched without an explicit model.",type:"string",required:!1,example:"sonnet",category:"model"},{name:"AFK_DISABLE_PROMPT_CACHE",description:"Disable Anthropic prompt caching when set to 1/true/yes/on. Unset = caching enabled.",type:"boolean",required:!1,default:"0",example:"1",category:"model"},{name:"AFK_EFFORT",description:"Reasoning-effort hint for the Codex provider. Accepts low | medium | high.",type:"string",required:!1,example:"medium",category:"model"},{name:"AFK_MAX_BUDGET_USD",description:"Per-turn USD budget ceiling. Aborts the turn when projected spend would exceed this.",type:"number",required:!1,default:"5.00",example:"10.00",category:"model"},{name:"AFK_MAX_OUTPUT_TOKENS",description:"Cap on output tokens per turn. Falls back to provider default when unset.",type:"number",required:!1,example:"8192",category:"model"},{name:"AFK_MAX_TOKENS",description:"Cap on total tokens per turn (input + output). Default 4096.",type:"number",required:!1,default:"4096",example:"8192",category:"model"},{name:"AFK_MODEL",description:"Default model for agent turns. Accepts short aliases (opus, sonnet, haiku) or full model IDs.",type:"string",required:!1,default:"sonnet",example:"claude-opus-4-5",category:"model"},{name:"AFK_PROMPT_CACHE_TTL",description:"TTL for Anthropic prompt-cache blocks. Accepts 5m or 1h.",type:"string",required:!1,default:"1h",example:"1h",category:"model"},{name:"AFK_TASK_BUDGET",description:"Per-task token budget ceiling. Aborts when cumulative usage would exceed it.",type:"number",required:!1,default:"100000",example:"200000",category:"model"},{name:"AFK_TEMPERATURE",description:"Numeric temperature override for model sampling. Provider default if unset.",type:"number",required:!1,example:"0.7",category:"model"},{name:"AFK_THINKING",description:"Extended-thinking toggle. Accepts on | off | <budget-tokens>. On by default.",type:"string",required:!1,default:"on",example:"on",category:"model"},{name:"AFK_TIMEOUT_MS",description:"Per-turn timeout in milliseconds. Provider/SDK default if unset.",type:"number",required:!1,example:"120000",category:"model"},{name:"CLAUDE_MODEL",description:"Legacy alias for AFK_MODEL \u2014 supported for back-compat with pre-AFK_* deployments.",type:"string",required:!1,example:"sonnet",category:"model"},{name:"AFK_SYSTEM_PROMPT",description:"Raw system-prompt string. Tier-1 source (highest priority over afk.config.json and AFK.md).",type:"string",required:!1,example:"You are a helpful agent.",category:"model"},{name:"AFK_DUMP_PROMPT",description:"Write the resolved system prompt to a file at startup. Accepts a path or 1 for default location.",type:"string",required:!1,example:"/tmp/afk-prompt.txt",category:"debug"},{name:"ANTHROPIC_API_KEY",description:"Anthropic API key. Tier-1 credential \u2014 overrides keychain OAuth and CLAUDE_CODE_OAUTH_TOKEN.",type:"string",required:!1,category:"auth",secret:!0},{name:"CLAUDE_CODE_OAUTH_TOKEN",description:"Claude Code OAuth token. Tier-2 credential \u2014 used when ANTHROPIC_API_KEY is unset; falls back to keychain.",type:"string",required:!1,category:"auth",secret:!0},{name:"OPENAI_API_KEY",description:"OpenAI API key for the openai-compatible provider (gpt-*, o1*, o3*, o4* models).",type:"string",required:!1,category:"auth",secret:!0},{name:"CODEX_API_KEY",description:"Codex API key for the @openai/codex-sdk provider when AFK_MODEL=codex-*.",type:"string",required:!1,category:"auth",secret:!0},{name:"AFK_LOCAL_API_KEY",description:"Placeholder API key for local Anthropic-compatible servers (vllm-mlx, etc.). Set when AFK_LOCAL_BASE_URL is configured.",type:"string",required:!1,default:"local",example:"local",category:"auth",secret:!0},{name:"AFK_LOCAL_BASE_URL",description:"Base URL for a self-hosted Anthropic-compatible server. When set, routes traffic away from api.anthropic.com.",type:"string",required:!1,example:"http://127.0.0.1:8080",category:"model"},{name:"AFK_OPENAI_BASE_URL",description:"Base URL override for the OpenAI-compatible provider. Used for local shims (mlx_lm.server, Ollama, vLLM, LM Studio).",type:"string",required:!1,example:"http://127.0.0.1:8000/v1",category:"model"},{name:"TELEGRAM_BOT_TOKEN",description:"Telegram bot token from @BotFather. Required to run the Telegram bot surface.",type:"string",required:!1,category:"telegram",secret:!0},{name:"AFK_TELEGRAM_BOT_TOKEN",description:"Alternative env var name for the Telegram bot token, accepted by the setup wizard.",type:"string",required:!1,category:"telegram",secret:!0},{name:"AFK_TELEGRAM_ALLOWED_CHAT_IDS",description:"Comma-separated list of Telegram chat IDs allowed to interact with the bot. Required when the bot is running.",type:"string",required:!1,example:"123456789,987654321",category:"telegram"},{name:"TELEGRAM_DATA_DIR",description:"Override the directory where Telegram bot state is stored. Defaults to ~/.afk/state/telegram/.",type:"string",required:!1,category:"telegram"},{name:"TELEGRAM_VERBOSE",description:"Set to 1 to log per-message details from the Telegram bot \u2014 chat IDs, message text, latency.",type:"boolean",required:!1,example:"1",category:"telegram"},{name:"AFK_TELEGRAM_TRACE",description:"Set to 1 to dump raw bridge traffic between the agent and the Telegram bot \u2014 debugging only.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AFK_TELEGRAM_CWD",description:"Override the working directory used by the Telegram bot when spawning agent sessions.",type:"string",required:!1,category:"telegram"},{name:"AFK_HOME",description:"Override the AFK home directory. Default: ~/.afk/.",type:"string",required:!1,default:"~/.afk",example:"/opt/afk",category:"paths"},{name:"AFK_STATE_DIR",description:"Override the AFK state directory. Default: $AFK_HOME/state/.",type:"string",required:!1,category:"paths"},{name:"AFK_FRAMEWORK_DIR",description:"Override the AFK agent-framework directory used for telemetry and briefs. Default: $AFK_HOME/agent-framework/.",type:"string",required:!1,category:"paths"},{name:"AFK_EVAL_HARNESS_ROOT",description:"Root path for the forge evaluation harness. Used by the L1/L2 capability-gate checks.",type:"string",required:!1,category:"paths"},{name:"HOME",description:"Standard Unix home directory. Used as the fallback when AFK_HOME is unset.",type:"string",required:!1,category:"process"},{name:"PATH",description:"System PATH. Read for executable resolution (git, gh, etc.) in tool handlers.",type:"string",required:!1,category:"process"},{name:"AFK_DAEMON_CWD",description:"Working directory used by the daemon process for spawned agent sessions.",type:"string",required:!1,category:"daemon"},{name:"AFK_DAEMON_TASK",description:"Default task description for the daemon. Falls back to afk.config.json daemon.task.",type:"string",required:!1,category:"daemon"},{name:"AFK_DAEMON_TASK_ID",description:"Task identifier the daemon uses to scope its state directory and telemetry.",type:"string",required:!1,category:"daemon"},{name:"AFK_SESSIONSTART_COOLDOWN_MS",description:"Cooldown in milliseconds between SessionStart trigger fires in the daemon. Prevents thundering-herd on rapid restarts.",type:"number",required:!1,category:"daemon"},{name:"AFK_WORKTREE_AUTONAME",description:"Auto-rename worktree branches based on the first user message in interactive mode. 1 = on (default), 0 = off.",type:"boolean",required:!1,default:"1",example:"0",category:"worktree"},{name:"AFK_WORKTREE_BRANCH_PREFIX",description:"Branch-name prefix for AFK-managed worktrees. Default afk/. Set to empty string to drop the prefix.",type:"string",required:!1,default:"afk/",example:"wt/",category:"worktree"},{name:"AFK_WORKTREE_BOOT_PRUNE",description:"When set, the daemon prunes stale worktrees at boot in addition to the cron-driven sweep.",type:"boolean",required:!1,category:"worktree"},{name:"AFK_WORKTREE_PRUNE_DISABLE",description:"Disable the worktree prune job entirely. Useful for long-running tests.",type:"boolean",required:!1,category:"worktree"},{name:"AFK_WORKTREE_MAX_AGE_CLEAN",description:"Maximum age (in days) before a clean worktree is auto-pruned. Default 14.",type:"number",required:!1,default:"14",category:"worktree"},{name:"AFK_WORKTREE_MAX_AGE_DIRTY",description:"Maximum age (in days) before a dirty worktree is auto-pruned. Default 30.",type:"number",required:!1,default:"30",category:"worktree"},{name:"AFK_WORKTREE_SWEEP_ROOT",description:"Override the root directory under which AFK worktrees are tracked for pruning.",type:"string",required:!1,category:"worktree"},{name:"AFK_THREADS_ALLOWED_USERNAMES",description:"Comma-separated allowlist of Threads usernames the agent will respond to.",type:"string",required:!1,example:"alice,bob",category:"threads"},{name:"AFK_THREADS_DRY_RUN",description:"Set to 1 to log Threads replies without actually posting them.",type:"boolean",required:!1,example:"1",category:"threads"},{name:"AFK_THREADS_POLL_INTERVAL_MS",description:"Poll interval for the Threads inbox watcher in milliseconds.",type:"number",required:!1,category:"threads"},{name:"AFK_THREADS_REPLY_MODE",description:"Threads reply mode. Accepts post (default) or other modes defined in src/threads.ts.",type:"string",required:!1,default:"post",example:"post",category:"threads"},{name:"AFK_ALLOW_PROJECT_MCP",description:"Allow loading MCP configuration from <cwd>/.mcp.json. Disabled by default \u2014 opt-in to mitigate config-injection risks.",type:"boolean",required:!1,example:"1",category:"mcp"},{name:"AFK_AUTO_ROUTING",description:"Auto-route bare slash inputs to matching skills. Applies to interactive, chat, telegram, and daemon surfaces.",type:"boolean",required:!1,example:"true",category:"misc"},{name:"AFK_BANNER_PLAIN",description:"Suppress the ANSI-colored banner at REPL startup. Useful for non-TTY captures and CI logs.",type:"boolean",required:!1,example:"1",category:"misc"},{name:"AFK_SPINNER_TIPS",description:"Show rotating tips in the loading spinner during long calls. 1 = on, 0 = off.",type:"boolean",required:!1,category:"misc"},{name:"AFK_SHOW_DIFFS",description:"Show inline diffs in the tool-lane output for edit/write tool calls. 1 = on, 0 = off.",type:"boolean",required:!1,category:"misc"},{name:"AFK_SKILL_STREAM_VERBOSE",description:"Verbose streaming output when a skill is dispatched. Logs sub-agent setup, intermediate events, and final result.",type:"boolean",required:!1,category:"debug"},{name:"FORCE_COLOR",description:"Standard Node convention. Force-enable ANSI color output even when stdout is not a TTY.",type:"string",required:!1,example:"1",category:"process"},{name:"NO_COLOR",description:"Standard convention (https://no-color.org). When set to any non-empty value, disables ANSI color output.",type:"string",required:!1,example:"1",category:"process"},{name:"AFK_DEBUG",description:"Enable verbose debug logging across the codebase. Accepts 1 to enable.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AFK_DEBUG_CLIPBOARD",description:"Debug bracketed-paste and image-paste handling in the interactive REPL.",type:"boolean",required:!1,category:"debug"},{name:"AFK_TRACE_DISABLED",description:"Disable the agent trace subsystem entirely. Set to 1 to skip trace file writes.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"DEBUG",description:"Standard Node `debug`-package convention. When set to 1, enables verbose logging in several modules alongside AFK_DEBUG.",type:"string",required:!1,category:"debug"},{name:"AGENT_AFK_ASCII",description:"Force the interactive REPL tool-lane renderer to ASCII-only glyphs instead of the default Unicode box-drawing set. Accepts 1/true/yes (case-insensitive). Useful for terminals whose font lacks \u2503\u251C\u2570\u251C glyphs.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AGENT_SURFACE",description:"Internal surface marker propagated to subprocesses. Identifies which AFK surface (cli, telegram, daemon, threads) spawned the process.",type:"string",required:!1,example:"cli",category:"process"},{name:"CI",description:"Standard CI-detection convention. Auto-set by GitHub Actions, CircleCI, etc. Used to switch off TTY-only UX.",type:"string",required:!1,example:"true",category:"process"},{name:"NODE_ENV",description:"Standard Node environment marker. test | development | production. Used by routing-telemetry.ts to suppress test-time writes.",type:"string",required:!1,example:"production",category:"process"},{name:"VITEST",description:"Set automatically by Vitest. Used at runtime to short-circuit code paths that should not fire in tests.",type:"string",required:!1,category:"process"},{name:"NO_UPDATE_NOTIFIER",description:"Disable the update-available notifier on CLI startup. Standard convention shared with many Node CLIs.",type:"boolean",required:!1,category:"process"},{name:"AFK_WRITE_DENYLIST",description:"Comma-separated list of additional path globs that the write_file tool refuses to write to.",type:"string",required:!1,example:"**/.env,**/secrets/**",category:"misc"},{name:"AFK_WRITE_DIFF",description:"Show a diff preview before each write_file tool call. Defaults provider-controlled when unset.",type:"boolean",required:!1,category:"misc"}],E={get AFK_COMPACT_KEEP_LAST_TURNS(){return process.env.AFK_COMPACT_KEEP_LAST_TURNS},get AFK_COMPACT_MODEL(){return process.env.AFK_COMPACT_MODEL},get AFK_DEFAULT_SUBAGENT_MODEL(){return process.env.AFK_DEFAULT_SUBAGENT_MODEL},get AFK_DISABLE_PROMPT_CACHE(){return process.env.AFK_DISABLE_PROMPT_CACHE},get AFK_EFFORT(){return process.env.AFK_EFFORT},get AFK_MAX_BUDGET_USD(){return process.env.AFK_MAX_BUDGET_USD},get AFK_MAX_OUTPUT_TOKENS(){return process.env.AFK_MAX_OUTPUT_TOKENS},get AFK_MAX_TOKENS(){return process.env.AFK_MAX_TOKENS},get AFK_MODEL(){return process.env.AFK_MODEL},get AFK_PROMPT_CACHE_TTL(){return process.env.AFK_PROMPT_CACHE_TTL},get AFK_TASK_BUDGET(){return process.env.AFK_TASK_BUDGET},get AFK_TEMPERATURE(){return process.env.AFK_TEMPERATURE},get AFK_THINKING(){return process.env.AFK_THINKING},get AFK_TIMEOUT_MS(){return process.env.AFK_TIMEOUT_MS},get CLAUDE_MODEL(){return process.env.CLAUDE_MODEL},get AFK_SYSTEM_PROMPT(){return process.env.AFK_SYSTEM_PROMPT},get AFK_DUMP_PROMPT(){return process.env.AFK_DUMP_PROMPT},get ANTHROPIC_API_KEY(){return process.env.ANTHROPIC_API_KEY},get CLAUDE_CODE_OAUTH_TOKEN(){return process.env.CLAUDE_CODE_OAUTH_TOKEN},get OPENAI_API_KEY(){return process.env.OPENAI_API_KEY},get CODEX_API_KEY(){return process.env.CODEX_API_KEY},get AFK_LOCAL_API_KEY(){return process.env.AFK_LOCAL_API_KEY},get AFK_LOCAL_BASE_URL(){return process.env.AFK_LOCAL_BASE_URL},get AFK_OPENAI_BASE_URL(){return process.env.AFK_OPENAI_BASE_URL},get TELEGRAM_BOT_TOKEN(){return process.env.TELEGRAM_BOT_TOKEN},get AFK_TELEGRAM_BOT_TOKEN(){return process.env.AFK_TELEGRAM_BOT_TOKEN},get AFK_TELEGRAM_ALLOWED_CHAT_IDS(){return process.env.AFK_TELEGRAM_ALLOWED_CHAT_IDS},get TELEGRAM_DATA_DIR(){return process.env.TELEGRAM_DATA_DIR},get TELEGRAM_VERBOSE(){return process.env.TELEGRAM_VERBOSE},get AFK_TELEGRAM_TRACE(){return process.env.AFK_TELEGRAM_TRACE},get AFK_TELEGRAM_CWD(){return process.env.AFK_TELEGRAM_CWD},get AFK_HOME(){return process.env.AFK_HOME},get AFK_STATE_DIR(){return process.env.AFK_STATE_DIR},get AFK_FRAMEWORK_DIR(){return process.env.AFK_FRAMEWORK_DIR},get AFK_EVAL_HARNESS_ROOT(){return process.env.AFK_EVAL_HARNESS_ROOT},get HOME(){return process.env.HOME},get PATH(){return process.env.PATH},get AFK_DAEMON_CWD(){return process.env.AFK_DAEMON_CWD},get AFK_DAEMON_TASK(){return process.env.AFK_DAEMON_TASK},get AFK_DAEMON_TASK_ID(){return process.env.AFK_DAEMON_TASK_ID},get AFK_SESSIONSTART_COOLDOWN_MS(){return process.env.AFK_SESSIONSTART_COOLDOWN_MS},get AFK_WORKTREE_AUTONAME(){return process.env.AFK_WORKTREE_AUTONAME},get AFK_WORKTREE_BRANCH_PREFIX(){return process.env.AFK_WORKTREE_BRANCH_PREFIX},get AFK_WORKTREE_BOOT_PRUNE(){return process.env.AFK_WORKTREE_BOOT_PRUNE},get AFK_WORKTREE_PRUNE_DISABLE(){return process.env.AFK_WORKTREE_PRUNE_DISABLE},get AFK_WORKTREE_MAX_AGE_CLEAN(){return process.env.AFK_WORKTREE_MAX_AGE_CLEAN},get AFK_WORKTREE_MAX_AGE_DIRTY(){return process.env.AFK_WORKTREE_MAX_AGE_DIRTY},get AFK_WORKTREE_SWEEP_ROOT(){return process.env.AFK_WORKTREE_SWEEP_ROOT},get AFK_THREADS_ALLOWED_USERNAMES(){return process.env.AFK_THREADS_ALLOWED_USERNAMES},get AFK_THREADS_DRY_RUN(){return process.env.AFK_THREADS_DRY_RUN},get AFK_THREADS_POLL_INTERVAL_MS(){return process.env.AFK_THREADS_POLL_INTERVAL_MS},get AFK_THREADS_REPLY_MODE(){return process.env.AFK_THREADS_REPLY_MODE},get AFK_ALLOW_PROJECT_MCP(){return process.env.AFK_ALLOW_PROJECT_MCP},get AFK_AUTO_ROUTING(){return process.env.AFK_AUTO_ROUTING},get AFK_BANNER_PLAIN(){return process.env.AFK_BANNER_PLAIN},get AFK_SPINNER_TIPS(){return process.env.AFK_SPINNER_TIPS},get AFK_SHOW_DIFFS(){return process.env.AFK_SHOW_DIFFS},get AFK_SKILL_STREAM_VERBOSE(){return process.env.AFK_SKILL_STREAM_VERBOSE},get FORCE_COLOR(){return process.env.FORCE_COLOR},get NO_COLOR(){return process.env.NO_COLOR},get AFK_DEBUG(){return process.env.AFK_DEBUG},get AFK_DEBUG_CLIPBOARD(){return process.env.AFK_DEBUG_CLIPBOARD},get AFK_TRACE_DISABLED(){return process.env.AFK_TRACE_DISABLED},get DEBUG(){return process.env.DEBUG},get AGENT_AFK_ASCII(){return process.env.AGENT_AFK_ASCII},get AGENT_SURFACE(){return process.env.AGENT_SURFACE},get CI(){return process.env.CI},get NODE_ENV(){return process.env.NODE_ENV},get VITEST(){return process.env.VITEST},get NO_UPDATE_NOTIFIER(){return process.env.NO_UPDATE_NOTIFIER},get AFK_WRITE_DENYLIST(){return process.env.AFK_WRITE_DENYLIST},get AFK_WRITE_DIFF(){return process.env.AFK_WRITE_DIFF}};(function(){for(let t of Ju){if(!t.secret)continue;let n=Object.getOwnPropertyDescriptor(E,t.name);n&&Object.defineProperty(E,t.name,{...n,enumerable:!1})}})()});import{existsSync as Yu,mkdirSync as Lv,renameSync as Fv,cpSync as Nv,rmSync as Uv}from"fs";import{join as Y,dirname as Qu,isAbsolute as jv}from"path";import{homedir as kl}from"os";import{fileURLToPath as Bv}from"url";function Re(){let e=E.AFK_HOME;if(e!==void 0&&e!==""){if(!jv(e)||e==="/")throw new Error(`AFK_HOME must be an absolute path that is not /, got: ${e}`);return e}return Y(kl(),".afk")}function pt(){return Y(Re(),"agent-framework")}function kt(){return Y(pt(),"forge-telemetry.jsonl")}function Kt(){return Y(pt(),"briefs")}function Ss(){return Y(pt(),"ceiling-ledger")}function ao(){return Y(Re(),"skills")}function _e(){return Y(Re(),"plugins")}function Zu(){return Y(process.cwd(),".afk")}function ep(){return Y(Zu(),"skills")}function wl(){return Y(Zu(),"plugins")}function re(){return Y(_e(),".index.json")}function Sl(){return Y(xn(),"schedules.json")}function Pt(){return Y(_e(),"cache")}function lo(e){return Y(Pt(),e)}function vl(){let e=Bv(import.meta.url),t=Qu(e);return Y(t,"bundled-plugins")}function xn(){return Y(Re(),"config")}function he(){return Y(Re(),"state")}function vs(){return Y(Re(),"cache")}function Gt(){return Y(Re(),"logs")}function zt(){return Y(he(),"sessions")}function Tl(){return Y(he(),"todos")}function Ts(){return Y(he(),"memory")}function wt(){return Y(he(),"queue")}function rr(){return Y(he(),"session-grants.jsonl")}function tp(){return Y(Re(),"farms")}function El(e){return Y(tp(),e)}function np(e){return Y(he(),"witness",e)}function or(e="default"){return Y(he(),"daemon",`agent-afk@${e}`)}function rp(){return Y(he(),"worktree-sweep.lock")}function Je(){return Y(xn(),"afk.env")}function Es(){return Y(xn(),"afk.config.json")}function op(){return Y(kl(),".afk.env")}function sp(){return Y(kl(),".afk.config.json")}function Wv(){return Y(Re(),"sessions")}function Hv(){return Y(Re(),"todos")}function ip(e,t){if(e!==t&&Yu(e)&&!Yu(t))try{Lv(Qu(t),{recursive:!0});try{Fv(e,t)}catch(n){if(n.code==="EXDEV")try{Nv(e,t,{recursive:!0}),Uv(e,{recursive:!0,force:!0})}catch(r){process.stderr.write(`[afk] migrateDirOnce: EXDEV fallback failed for ${e} \u2192 ${t}: ${String(r)}
3
+ `)}}}catch{}}function ap(){ip(Wv(),zt())}function lp(){ip(Hv(),Tl())}function xl(){return Y(he(),"repl-history.jsonl")}function Gv(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid jobId: must be a non-empty string");if(e.length>Xu)throw new Error(`Invalid jobId: exceeds ${Xu} chars`);if(!Kv.test(e))throw new Error(`Invalid jobId: ${JSON.stringify(e)} contains characters outside [A-Za-z0-9_-]`)}function co(){return Y(he(),"bg")}function An(e){return Gv(e),Y(co(),e)}function xs(e){return Y(An(e),"events.jsonl")}function Al(e){return Y(An(e),"meta.json")}function uo(){return Y(he(),"mcp","server-status.json")}var Kv,Xu,F=io(()=>{"use strict";K();Kv=/^[A-Za-z0-9_-]+$/,Xu=128});function Qs(e,t=()=>{}){let n=new Set;if(!e)return n;for(let r of e.split(",")){let o=r.trim();if(o){if(!/^-?\d+$/.test(o)){t("[allowlist] Ignoring non-numeric chat ID:",o);continue}n.add(Number(o))}}return n}var sc=io(()=>{"use strict"});var ic={};qu(ic,{push:()=>Zs,pushIfConfigured:()=>ei});async function Zs(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??KA}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(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 ei(e,t={}){let n=E.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=Qs(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(r.size===0)return null;let o=[];for(let s of r)o.push(await Zs({token:n,chatId:s,text:e,...t.parseMode!==void 0?{parseMode:t.parseMode}:{},...t.replyMarkup!==void 0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}}));return o}var KA,So=io(()=>{"use strict";sc();K();KA="https://api.telegram.org"});var py={};qu(py,{KeychainOAuthProvider:()=>$r,clearOauthPending:()=>Zc,readOauthPending:()=>uy});import{existsSync as Wi,mkdirSync as cy,readFileSync as Hi,writeFileSync as Qc}from"node:fs";import{execFileSync as sy}from"node:child_process";import{homedir as iy,userInfo as ay}from"node:os";import{join as ly,dirname as dy}from"node:path";function BP(){let e=process.platform==="darwin",t=process.platform==="linux";return{read(){if(e)try{return sy("security",["find-generic-password","-s","Claude Code-credentials","-a",ay().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()||void 0}catch{return}if(t){let n=ly(iy(),".claude",".credentials.json");if(!Wi(n))return;try{return Hi(n,"utf-8")}catch{return}}},write(n){if(e)sy("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",ay().username,"-w",n],{stdio:["ignore","ignore","ignore"]});else if(t){let r=ly(iy(),".claude",".credentials.json");cy(dy(r),{recursive:!0}),Qc(r,n,{encoding:"utf-8",mode:384})}}}}function uy(){let e=uo();if(!Wi(e))return{};let t;try{t=JSON.parse(Hi(e,"utf-8"))}catch{return{}}if(t===null||typeof t!="object")return{};let n={};for(let[r,o]of Object.entries(t)){if(o===null||typeof o!="object")continue;let s=o;s.status==="oauth_pending"&&typeof s.authorizationUrl=="string"&&typeof s.timestamp=="number"&&Date.now()-s.timestamp<=jP&&(n[r]={status:"oauth_pending",authorizationUrl:s.authorizationUrl,timestamp:s.timestamp})}return n}function Zc(e){let t=uo();if(!Wi(t))return;let n;try{n=JSON.parse(Hi(t,"utf-8"))}catch{return}e in n&&(delete n[e],Qc(t,JSON.stringify(n,null,2),{encoding:"utf-8",mode:384}))}function WP(e,t){let n=uo();cy(dy(n),{recursive:!0});let r={};if(Wi(n))try{r=JSON.parse(Hi(n,"utf-8"))}catch{}let o=new URL(t),s=o.origin+o.pathname;r[e]={status:"oauth_pending",authorizationUrl:s,timestamp:Date.now()},Qc(n,JSON.stringify(r,null,2),{encoding:"utf-8",mode:384})}var jP,$r,Ki=io(()=>{"use strict";F();jP=600*1e3;$r=class{serverName;backend;constructor(t,n=BP()){this.serverName=t,this.backend=n}get redirectUrl(){return"http://localhost:3000/oauth/callback"}get clientMetadata(){return{redirect_uris:[this.redirectUrl],client_name:"agent-afk",grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"}}clientInformation(){return this._readSlot().clientInfo}saveClientInformation(t){this._updateSlot(n=>({...n,clientInfo:t}))}tokens(){return this._readSlot().tokens}saveTokens(t){this._updateSlot(n=>({...n,tokens:t}));try{Zc(this.serverName)}catch{}}saveCodeVerifier(t){this._updateSlot(n=>({...n,codeVerifier:t}))}codeVerifier(){let t=this._readSlot().codeVerifier;if(!t)throw new Error(`[mcp:${this.serverName}] no PKCE code verifier stored`);return t}saveDiscoveryState(t){this._updateSlot(n=>({...n,discoveryState:t}))}discoveryState(){return this._readSlot().discoveryState}invalidateCredentials(t){this._updateSlot(n=>{if(t==="all")return{};let r={...n};return t==="client"&&delete r.clientInfo,t==="tokens"&&delete r.tokens,t==="verifier"&&delete r.codeVerifier,t==="discovery"&&delete r.discoveryState,r})}async redirectToAuthorization(t){let n=t.toString(),r=`\u{1F510} MCP server "${this.serverName}" requires authorization.
4
4
 
5
5
  Open this URL to authorize:
6
6
  ${n}`;WP(this.serverName,n);let o=!1;try{let{pushIfConfigured:s}=await Promise.resolve().then(()=>(So(),ic));o=await s(r)!==null}catch{}o||process.stderr.write(`[mcp:${this.serverName}] OAuth authorization required.
7
7
  Open this URL to authorize:
8
8
  ${n}
9
9
  Status written to: ${uo()}
10
- `)}_readSlot(){let t=this.backend.read();if(!t)return{};try{return JSON.parse(t).mcpOAuth?.[this.serverName]??{}}catch{return{}}}_updateSlot(t){let n=this.backend.read(),r={};if(n)try{r=JSON.parse(n)}catch{}let o=r.mcpOAuth??{},s=o[this.serverName]??{};o[this.serverName]=t(s),r.mcpOAuth=o,this.backend.write(JSON.stringify(r))}}});F();import{config as Gu}from"dotenv";F();import{randomBytes as zv}from"node:crypto";import{mkdirSync as qv,renameSync as Jv,rmSync as cp,writeFileSync as Vv}from"node:fs";import{dirname as Yv,isAbsolute as Xv,join as Qv}from"node:path";function As(){return Qv(he(),"last-cwd")}function dp(){try{cp(As(),{force:!0})}catch{}}function up(e){if(!Xv(e))throw new Error(`recordCdIntent: target must be an absolute path, got ${JSON.stringify(e)}`);if(/[\n\r\0]/.test(e))throw new Error(`recordCdIntent: target must not contain newline/CR/NUL, got ${JSON.stringify(e)}`);try{let t=As();qv(Yv(t),{recursive:!0});let n=`${t}.tmp.${process.pid}.${zv(6).toString("hex")}`;try{Vv(n,e,{encoding:"utf8",mode:384}),Jv(n,t)}catch(r){try{cp(n,{force:!0})}catch{}throw r}}catch{}}var Zv="AFK_SHELL_WRAPPER";function pp(){let e=process.env[Zv];return e==="1"||e==="true"}import{Command as vj}from"commander";H();import Rl from"chalk";function mp(){let e=E.FORCE_COLOR;if(e&&e.length>0)return;let t=E.NO_COLOR;if(t&&t.length>0){Rl.level=0;return}let n=E.CI;if(n&&n.length>0){Rl.level=0;return}process.stdout.isTTY||(Rl.level=0)}import Gh from"chalk";import EP from"ora";var nt=class extends Error{constructor(t){super(t),this.name="AbortError"}},rt=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},Te=class extends Error{constructor(n,r,o,s){super(n);this.event=r;this.reason=o;this.name="HookBlockedError",s?.cause!==void 0&&(this.cause=s.cause)}event;reason;cause};var qt=class extends Error{constructor(n,r,o){super(o??`Budget ceiling reached: $${n.toFixed(4)} cumulative >= $${r.toFixed(4)} limit`);this.runningCostUsd=n;this.maxBudgetUsd=r;this.name="BudgetExceededError"}runningCostUsd;maxBudgetUsd},Rs=class extends Error{constructor(n,r,o){super(o??`${n} provider does not support AgentConfig.${r}.`);this.provider=n;this.field=r;this.name="UnsupportedProviderConfigError"}provider;field};function fp(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("rate limit")||t.toLowerCase().includes("too many requests")}function gp(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("network")||t.toLowerCase().includes("connect")||t.toLowerCase().includes("timeout")}function sr(e){if(e instanceof qt)return{kind:"budget_exceeded",userMessage:`Session stopped: cost ceiling reached ($${e.runningCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit).`,exitCode:1,raw:e};if(e instanceof Rs)return{kind:"unsupported_config",userMessage:`The "${e.provider}" provider does not support this configuration option.`,hint:`Option "${e.field}" is not available for provider "${e.provider}". Switch to a compatible provider or remove the option.`,exitCode:1,raw:e};if(e instanceof Te)return{kind:"hook_blocked",userMessage:`A hook blocked the operation (event: ${e.event}).`,...e.reason!==void 0?{hint:e.reason}:{},exitCode:1,raw:e};if(e instanceof rt){let s=Math.round(e.timeoutMs/1e3);return{kind:"timeout",userMessage:`The operation timed out after ${s} second${s!==1?"s":""}.`,hint:`Timeout: ${e.timeoutMs}ms (${s}s). Increase the timeout or retry.`,exitCode:124,raw:e}}let t=e,n=e instanceof Error?e.message:String(e),r=n.toLowerCase();return t.status===401||e instanceof Error&&e.name==="AuthenticationError"?{kind:"auth",userMessage:"Authentication failed. Check that your API key is valid and has not expired.",hint:"Verify the ANTHROPIC_API_KEY environment variable or run `afk login`.",exitCode:1,raw:e}:t.status===429||fp(e)?{kind:"rate_limit",userMessage:"Anthropic rate limit reached. The request was rejected (HTTP 429).",hint:"Wait a moment and retry, or reduce the request frequency.",exitCode:1,raw:e}:t.status===529||t.status===503?{kind:"overloaded",userMessage:`Anthropic API is temporarily overloaded (HTTP ${t.status}). All retry attempts were exhausted.`,hint:"Wait a minute and try again, or switch to a less loaded model (e.g. sonnet).",exitCode:1,raw:e}:n==="Not in a git repository."||r.includes("not in a git repository")?{kind:"not_git_repo",userMessage:"This command must be run from inside a git repository.",hint:"Run `git init` to initialise a repository, or change to a directory that is already a git repo.",exitCode:1,raw:e}:gp(e)||r.includes("econnrefused")||r.includes("etimedout")?{kind:"network",userMessage:"Network error: unable to reach the API endpoint.",hint:"Check your internet connection and try again.",exitCode:1,raw:e}:{kind:"unknown",userMessage:(e instanceof Error?e.message:String(e))||"An unexpected error occurred.",exitCode:1,raw:e}}import{sep as Dl}from"node:path";import eT from"string-width";var _l=/\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[P^_X][^\x1B]*\x1B\\|[@-OQ-WYZ\\\-])/g,hp=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function Ve(e){return e.replace(_l,"")}function K(e){return eT(e)}function _s(e){return e.length===0?[]:hp?Array.from(hp.segment(e),t=>t.segment):Array.from(e)}function tT(e){let t=[],n=0,r;for(_l.lastIndex=0;(r=_l.exec(e))!==null;){if(r.index>n)for(let o of _s(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of _s(e.slice(n)))t.push({type:"text",value:o});return t}function Me(e,t){let n=Math.max(0,t-K(e));return e+" ".repeat(n)}function nT(e,t){let n=Math.max(0,t-K(e));return" ".repeat(n)+e}function Cl(e,t,n="left"){let r=Math.max(0,t-K(e));if(r===0)return e;if(n==="right")return nT(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return Me(e,t)}function ce(e,t,n="\u2026"){if(t<=0)return"";if(K(e)<=t)return e;let r=K(n),o=Math.max(0,t-r),s=0,i="",a=!1;for(let l of tT(e)){if(l.type==="ansi"){i+=l.value,a=!0;continue}let c=s+K(l.value);if(c>o)break;i+=l.value,s=c}return i+n+(a?"\x1B[0m":"")}function yp(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Il(e,t){let n=yp(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of _s(e)){let s=r+o.length;if(s>=n)return r;r=s}return r}function po(e,t){let n=yp(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of _s(e)){let s=r+o.length;if(r>=n||n>r&&n<s)return s;r=s}return e.length}H();H();import Cs from"chalk";import{Lexer as Sp}from"marked";import rT from"chalk";import{createEmphasize as oT,common as sT}from"emphasize";import ye from"chalk";var m={brand:ye.hex("#E67E4C"),goblin:ye.hex("#9CB04A"),user:ye.cyan,tool:ye.hex("#DCDCAA"),chrome:ye.hex("#B0B8C2"),syntaxString:ye.italic.hex("#8AB07A"),toolArg:ye.dim.white,thinking:ye.italic.hex("#9B8FB5"),success:ye.green,error:ye.red,warning:ye.yellow,plan:ye.hex("#9F7CE0"),meta:ye.blackBright,info:ye.hex("#5BA8FF"),fileRef:ye.hex("#56B5A8"),heading:ye.bold.white,label:ye.dim,dim:ye.dim,bold:ye.bold,italic:ye.italic,diffAdd:ye.green,diffRemove:ye.red,diffHunk:ye.blackBright};var bp={keyword:m.brand,built_in:m.brand,literal:m.brand,tag:m.brand,string:m.syntaxString,regexp:m.syntaxString,attr:m.syntaxString,comment:m.meta,meta:m.meta,quote:m.meta,number:m.warning,function:m.tool,title:m.tool,class:m.tool,"selector-tag":m.tool};var kp=oT(sT),iT=2048,aT=512,lT=32,Mt=new Map;function cT(e){let t=Mt.get(e);if(t!==void 0)return Mt.delete(e),Mt.set(e,t),t}function dT(e,t){if(Mt.has(e)&&Mt.delete(e),Mt.set(e,t),Mt.size>lT){let n=Mt.keys().next().value;n!==void 0&&Mt.delete(n)}}function wp(e,t){if(rT.level===0||e.length>iT)return e;let n=e.length<aT,r=n?`${t} ${e}`:"";if(n){let s=cT(r);if(s!==void 0)return s}let o;try{if(!t||!kp.registered(t))o=e;else{let s=kp.highlight(t,e,bp);o=typeof s?.value=="string"?s.value:e}}catch{o=e}return n&&dT(r,o),o}import uT from"wrap-ansi";function pe(e,t){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let n=Math.floor(t);return uT(e,n,{hard:!1,trim:!1,wordWrap:!0})}function Pl(e){return K(e)}function pT(e,t,n){return Cl(e,t,n??"left")}var vp=/^\/[A-Za-z][\w:-]*$/,mT=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|[,.:;!?]?$|[,.:;!?]\s)/g;function Jt(e){return e?e.map(t=>{switch(t.type){case"codespan":{let n=t.text;return vp.test(n)?m.brand(n):m.user(n)}case"strong":{let n=t;return m.bold(n.tokens?Jt(n.tokens):n.text)}case"em":{let n=t;return m.italic(n.tokens?Jt(n.tokens):n.text)}case"text":return t.text.replace(mT,n=>m.brand(n));case"link":{let n=t,r=n.tokens?Jt(n.tokens):n.text;return r===n.href?r:r+m.dim(` (${n.href})`)}case"escape":return t.text;default:return t.raw}}).join(""):""}var fT=new Set(["code","table","blockquote","hr","html"]);function Vt(e){let t=Sp.lex(e);return t.some(r=>fT.has(r.type))?e:t.map(r=>{switch(r.type){case"heading":{let o=r;return m.bold(Jt(o.tokens))}case"list":return r.items.map(s=>{let a=s.tokens[0]?.tokens??[];return"\u2022 "+Jt(a)}).join(", ");case"paragraph":return Jt(r.tokens);case"text":{let o=r;return o.tokens?Jt(o.tokens):o.text}case"space":return"";default:return r.raw}}).join("")}function St(e,t={}){let n=Sp.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(i){return Jt(i)}function s(i){return i.map(a=>{switch(a.type){case"heading":{let l=a,c=l.tokens?o(l.tokens):l.text;return l.depth===1?m.brand.bold(`
10
+ `)}_readSlot(){let t=this.backend.read();if(!t)return{};try{return JSON.parse(t).mcpOAuth?.[this.serverName]??{}}catch{return{}}}_updateSlot(t){let n=this.backend.read(),r={};if(n)try{r=JSON.parse(n)}catch{}let o=r.mcpOAuth??{},s=o[this.serverName]??{};o[this.serverName]=t(s),r.mcpOAuth=o,this.backend.write(JSON.stringify(r))}}});F();import{config as Gu}from"dotenv";F();import{randomBytes as zv}from"node:crypto";import{mkdirSync as qv,renameSync as Jv,rmSync as cp,writeFileSync as Vv}from"node:fs";import{dirname as Yv,isAbsolute as Xv,join as Qv}from"node:path";function As(){return Qv(he(),"last-cwd")}function dp(){try{cp(As(),{force:!0})}catch{}}function up(e){if(!Xv(e))throw new Error(`recordCdIntent: target must be an absolute path, got ${JSON.stringify(e)}`);if(/[\n\r\0]/.test(e))throw new Error(`recordCdIntent: target must not contain newline/CR/NUL, got ${JSON.stringify(e)}`);try{let t=As();qv(Yv(t),{recursive:!0});let n=`${t}.tmp.${process.pid}.${zv(6).toString("hex")}`;try{Vv(n,e,{encoding:"utf8",mode:384}),Jv(n,t)}catch(r){try{cp(n,{force:!0})}catch{}throw r}}catch{}}var Zv="AFK_SHELL_WRAPPER";function pp(){let e=process.env[Zv];return e==="1"||e==="true"}import{Command as vj}from"commander";K();import Rl from"chalk";function mp(){let e=E.FORCE_COLOR;if(e&&e.length>0)return;let t=E.NO_COLOR;if(t&&t.length>0){Rl.level=0;return}let n=E.CI;if(n&&n.length>0){Rl.level=0;return}process.stdout.isTTY||(Rl.level=0)}import Gh from"chalk";import EP from"ora";var nt=class extends Error{constructor(t){super(t),this.name="AbortError"}},rt=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},Te=class extends Error{constructor(n,r,o,s){super(n);this.event=r;this.reason=o;this.name="HookBlockedError",s?.cause!==void 0&&(this.cause=s.cause)}event;reason;cause};var qt=class extends Error{constructor(n,r,o){super(o??`Budget ceiling reached: $${n.toFixed(4)} cumulative >= $${r.toFixed(4)} limit`);this.runningCostUsd=n;this.maxBudgetUsd=r;this.name="BudgetExceededError"}runningCostUsd;maxBudgetUsd},Rs=class extends Error{constructor(n,r,o){super(o??`${n} provider does not support AgentConfig.${r}.`);this.provider=n;this.field=r;this.name="UnsupportedProviderConfigError"}provider;field};function fp(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("rate limit")||t.toLowerCase().includes("too many requests")}function gp(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("network")||t.toLowerCase().includes("connect")||t.toLowerCase().includes("timeout")}function sr(e){if(e instanceof qt)return{kind:"budget_exceeded",userMessage:`Session stopped: cost ceiling reached ($${e.runningCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit).`,exitCode:1,raw:e};if(e instanceof Rs)return{kind:"unsupported_config",userMessage:`The "${e.provider}" provider does not support this configuration option.`,hint:`Option "${e.field}" is not available for provider "${e.provider}". Switch to a compatible provider or remove the option.`,exitCode:1,raw:e};if(e instanceof Te)return{kind:"hook_blocked",userMessage:`A hook blocked the operation (event: ${e.event}).`,...e.reason!==void 0?{hint:e.reason}:{},exitCode:1,raw:e};if(e instanceof rt){let s=Math.round(e.timeoutMs/1e3);return{kind:"timeout",userMessage:`The operation timed out after ${s} second${s!==1?"s":""}.`,hint:`Timeout: ${e.timeoutMs}ms (${s}s). Increase the timeout or retry.`,exitCode:124,raw:e}}let t=e,n=e instanceof Error?e.message:String(e),r=n.toLowerCase();return t.status===401||e instanceof Error&&e.name==="AuthenticationError"?{kind:"auth",userMessage:"Authentication failed. Check that your API key is valid and has not expired.",hint:"Verify the ANTHROPIC_API_KEY environment variable or run `afk login`.",exitCode:1,raw:e}:t.status===429||fp(e)?{kind:"rate_limit",userMessage:"Anthropic rate limit reached. The request was rejected (HTTP 429).",hint:"Wait a moment and retry, or reduce the request frequency.",exitCode:1,raw:e}:t.status===529||t.status===503?{kind:"overloaded",userMessage:`Anthropic API is temporarily overloaded (HTTP ${t.status}). All retry attempts were exhausted.`,hint:"Wait a minute and try again, or switch to a less loaded model (e.g. sonnet).",exitCode:1,raw:e}:n==="Not in a git repository."||r.includes("not in a git repository")?{kind:"not_git_repo",userMessage:"This command must be run from inside a git repository.",hint:"Run `git init` to initialise a repository, or change to a directory that is already a git repo.",exitCode:1,raw:e}:gp(e)||r.includes("econnrefused")||r.includes("etimedout")?{kind:"network",userMessage:"Network error: unable to reach the API endpoint.",hint:"Check your internet connection and try again.",exitCode:1,raw:e}:{kind:"unknown",userMessage:(e instanceof Error?e.message:String(e))||"An unexpected error occurred.",exitCode:1,raw:e}}import{sep as Dl}from"node:path";import eT from"string-width";var _l=/\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[P^_X][^\x1B]*\x1B\\|[@-OQ-WYZ\\\-])/g,hp=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function Ve(e){return e.replace(_l,"")}function G(e){return eT(e)}function _s(e){return e.length===0?[]:hp?Array.from(hp.segment(e),t=>t.segment):Array.from(e)}function tT(e){let t=[],n=0,r;for(_l.lastIndex=0;(r=_l.exec(e))!==null;){if(r.index>n)for(let o of _s(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of _s(e.slice(n)))t.push({type:"text",value:o});return t}function Me(e,t){let n=Math.max(0,t-G(e));return e+" ".repeat(n)}function nT(e,t){let n=Math.max(0,t-G(e));return" ".repeat(n)+e}function Cl(e,t,n="left"){let r=Math.max(0,t-G(e));if(r===0)return e;if(n==="right")return nT(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return Me(e,t)}function ce(e,t,n="\u2026"){if(t<=0)return"";if(G(e)<=t)return e;let r=G(n),o=Math.max(0,t-r),s=0,i="",a=!1;for(let l of tT(e)){if(l.type==="ansi"){i+=l.value,a=!0;continue}let c=s+G(l.value);if(c>o)break;i+=l.value,s=c}return i+n+(a?"\x1B[0m":"")}function yp(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Il(e,t){let n=yp(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of _s(e)){let s=r+o.length;if(s>=n)return r;r=s}return r}function po(e,t){let n=yp(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of _s(e)){let s=r+o.length;if(r>=n||n>r&&n<s)return s;r=s}return e.length}K();K();import Cs from"chalk";import{Lexer as Sp}from"marked";import rT from"chalk";import{createEmphasize as oT,common as sT}from"emphasize";import ye from"chalk";var m={brand:ye.hex("#E67E4C"),goblin:ye.hex("#9CB04A"),user:ye.cyan,tool:ye.hex("#DCDCAA"),chrome:ye.hex("#B0B8C2"),syntaxString:ye.italic.hex("#8AB07A"),toolArg:ye.dim.white,thinking:ye.italic.hex("#9B8FB5"),success:ye.green,error:ye.red,warning:ye.yellow,plan:ye.hex("#9F7CE0"),meta:ye.blackBright,info:ye.hex("#5BA8FF"),fileRef:ye.hex("#56B5A8"),heading:ye.bold.white,label:ye.dim,dim:ye.dim,bold:ye.bold,italic:ye.italic,diffAdd:ye.green,diffRemove:ye.red,diffHunk:ye.blackBright};var bp={keyword:m.brand,built_in:m.brand,literal:m.brand,tag:m.brand,string:m.syntaxString,regexp:m.syntaxString,attr:m.syntaxString,comment:m.meta,meta:m.meta,quote:m.meta,number:m.warning,function:m.tool,title:m.tool,class:m.tool,"selector-tag":m.tool};var kp=oT(sT),iT=2048,aT=512,lT=32,Mt=new Map;function cT(e){let t=Mt.get(e);if(t!==void 0)return Mt.delete(e),Mt.set(e,t),t}function dT(e,t){if(Mt.has(e)&&Mt.delete(e),Mt.set(e,t),Mt.size>lT){let n=Mt.keys().next().value;n!==void 0&&Mt.delete(n)}}function wp(e,t){if(rT.level===0||e.length>iT)return e;let n=e.length<aT,r=n?`${t} ${e}`:"";if(n){let s=cT(r);if(s!==void 0)return s}let o;try{if(!t||!kp.registered(t))o=e;else{let s=kp.highlight(t,e,bp);o=typeof s?.value=="string"?s.value:e}}catch{o=e}return n&&dT(r,o),o}import uT from"wrap-ansi";function pe(e,t){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let n=Math.floor(t);return uT(e,n,{hard:!1,trim:!1,wordWrap:!0})}function Pl(e){return G(e)}function pT(e,t,n){return Cl(e,t,n??"left")}var vp=/^\/[A-Za-z][\w:-]*$/,mT=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|[,.:;!?]?$|[,.:;!?]\s)/g;function Jt(e){return e?e.map(t=>{switch(t.type){case"codespan":{let n=t.text;return vp.test(n)?m.brand(n):m.user(n)}case"strong":{let n=t;return m.bold(n.tokens?Jt(n.tokens):n.text)}case"em":{let n=t;return m.italic(n.tokens?Jt(n.tokens):n.text)}case"text":return t.text.replace(mT,n=>m.brand(n));case"link":{let n=t,r=n.tokens?Jt(n.tokens):n.text;return r===n.href?r:r+m.dim(` (${n.href})`)}case"escape":return t.text;default:return t.raw}}).join(""):""}var fT=new Set(["code","table","blockquote","hr","html"]);function Vt(e){let t=Sp.lex(e);return t.some(r=>fT.has(r.type))?e:t.map(r=>{switch(r.type){case"heading":{let o=r;return m.bold(Jt(o.tokens))}case"list":return r.items.map(s=>{let a=s.tokens[0]?.tokens??[];return"\u2022 "+Jt(a)}).join(", ");case"paragraph":return Jt(r.tokens);case"text":{let o=r;return o.tokens?Jt(o.tokens):o.text}case"space":return"";default:return r.raw}}).join("")}function St(e,t={}){let n=Sp.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(i){return Jt(i)}function s(i){return i.map(a=>{switch(a.type){case"heading":{let l=a,c=l.tokens?o(l.tokens):l.text;return l.depth===1?m.brand.bold(`
11
11
  `+c+`
12
12
  `):l.depth===2?m.heading(`
13
13
  `+c+`
@@ -38,29 +38,29 @@ Status written to: ${uo()}
38
38
  `+m.error(n.message)),n&&n.stack&&E.DEBUG&&(r+=`
39
39
  `+m.dim(n.stack)),r}formatSuccess(t){return m.success("\u2713 ")+t}formatInfo(t){return m.info("\u2139 ")+t}formatWarning(t){return m.warning("\u26A0 ")+t}formatCommand(t){return m.dim(t)}formatPrompt(t){return m.bold(m.plan(`afk (${t})`))+m.dim(" \u203A ")}formatModelInfo(t,n,r){return m.dim(`Model: ${Cs.white(t)} | Max tokens: ${Cs.white(n)} | Temperature: ${Cs.white(r)}`)}separator(t="\u2500",n=50){return m.dim(t.repeat(n))}formatHelp(t){let n=[];for(let r of t){n.push(m.heading(`
40
40
  ${r.title}`)),n.push(this.separator());for(let o of r.items)n.push(` ${o}`)}return n.join(`
41
- `)}formatStreaming(t){return this.useColors,t}},p1=new Ml;function te(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var Ps=new Set,Is=!1,Rn=null;function gT(){for(let e of Ps)try{e()}catch{}}function hT(){Rn!==null&&clearTimeout(Rn),Rn=setTimeout(()=>{Rn=null,gT()},150)}function Tp(){hT()}function yT(e){return Ps.add(e),Is||(process.stdout.on("resize",Tp),Is=!0),()=>{Ps.delete(e),Ps.size===0&&(Is&&(process.stdout.off("resize",Tp),Is=!1),Rn!==null&&(clearTimeout(Rn),Rn=null))}}var ot={subscribe:yT};H();import Ol from"chalk";var Ep={".":null,D:[74,92,36],M:[139,166,63],L:[178,197,88],Y:[245,213,71],K:[13,18,9],W:[238,238,222],X:[42,42,26]},Ms=[".......KKKKK.......","......WKKLKKW......",".....KKWMLMWKK.....","..DDKKWLMMMLWKKDD..","DDD..KMMMMMMMK..DDD","..DDKMMMMMMMMMKDD..","...KKMMKKKKKMMKK...","...KMMKKKKKKKMMK...","...KMMMYMDMYMMMK...","...KMMMMMMMMMMMK...","...KKMMXXXXXMMKK...","....KKMMWXXMMKK....",".....KKMWMMMKK.....",".....KKMMMMMKK.....","......KKMMMKK......",".......KKKKK......."],$l=19,mo=8;function bT(e,t){if(e.length!==t.length)throw new Error(`pixel row width mismatch: top=${e.length}, bot=${t.length}`);let n="";for(let r=0;r<e.length;r++){let o=Ep[e[r]??"."]??null,s=Ep[t[r]??"."]??null;!o&&!s?n+=" ":o&&!s?n+=Ol.rgb(o[0],o[1],o[2])("\u2580"):!o&&s?n+=Ol.rgb(s[0],s[1],s[2])("\u2584"):o&&s&&(n+=Ol.bgRgb(s[0],s[1],s[2]).rgb(o[0],o[1],o[2])("\u2580"))}return n}function kT(){if(Ms.length!==mo*2)throw new Error(`GOBLIN_GRID has ${Ms.length} pixel rows but MASCOT_HEIGHT*2 = ${mo*2}`);let e=[];for(let t=0;t<mo;t++){let n=Ms[t*2]??"",r=Ms[t*2+1]??"";e.push(bT(n,r))}return e}function xp(e="idle"){return E.AFK_BANNER_PLAIN==="1"?[]:kT()}function Ap(){return E.AFK_BANNER_PLAIN==="1"}function fo(){return Math.max(22,te()-6)}function Ll(e,t){return ce(e,t)}var wT={ok:m.success("\u25CF"),warn:m.warning("\u25CF"),error:m.error("\u25CF"),info:m.info("\u25C6")};function _p(e,t){let o=t.reduce((T,x)=>Math.max(T,K(x.label)),0),s=t.reduce((T,x)=>Math.max(T,K(x.value)),0),i=o+4+2+s,a=Math.min(te()-4,100),l=Math.max(44,K(e),i,a);l=Math.min(l,fo());let c=l+4,d=m.dim,u=d("\u256D"+"\u2500".repeat(c)+"\u256E"),p=d("\u251C"+"\u2500".repeat(c)+"\u2524"),f=d("\u2570"+"\u2500".repeat(c)+"\u256F"),g=d("\u2502"),b=pe(e,l).split(`
41
+ `)}formatStreaming(t){return this.useColors,t}},p1=new Ml;function te(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var Ps=new Set,Is=!1,Rn=null;function gT(){for(let e of Ps)try{e()}catch{}}function hT(){Rn!==null&&clearTimeout(Rn),Rn=setTimeout(()=>{Rn=null,gT()},150)}function Tp(){hT()}function yT(e){return Ps.add(e),Is||(process.stdout.on("resize",Tp),Is=!0),()=>{Ps.delete(e),Ps.size===0&&(Is&&(process.stdout.off("resize",Tp),Is=!1),Rn!==null&&(clearTimeout(Rn),Rn=null))}}var ot={subscribe:yT};K();import Ol from"chalk";var Ep={".":null,D:[74,92,36],M:[139,166,63],L:[178,197,88],Y:[245,213,71],K:[13,18,9],W:[238,238,222],X:[42,42,26]},Ms=[".......KKKKK.......","......WKKLKKW......",".....KKWMLMWKK.....","..DDKKWLMMMLWKKDD..","DDD..KMMMMMMMK..DDD","..DDKMMMMMMMMMKDD..","...KKMMKKKKKMMKK...","...KMMKKKKKKKMMK...","...KMMMYMDMYMMMK...","...KMMMMMMMMMMMK...","...KKMMXXXXXMMKK...","....KKMMWXXMMKK....",".....KKMWMMMKK.....",".....KKMMMMMKK.....","......KKMMMKK......",".......KKKKK......."],$l=19,mo=8;function bT(e,t){if(e.length!==t.length)throw new Error(`pixel row width mismatch: top=${e.length}, bot=${t.length}`);let n="";for(let r=0;r<e.length;r++){let o=Ep[e[r]??"."]??null,s=Ep[t[r]??"."]??null;!o&&!s?n+=" ":o&&!s?n+=Ol.rgb(o[0],o[1],o[2])("\u2580"):!o&&s?n+=Ol.rgb(s[0],s[1],s[2])("\u2584"):o&&s&&(n+=Ol.bgRgb(s[0],s[1],s[2]).rgb(o[0],o[1],o[2])("\u2580"))}return n}function kT(){if(Ms.length!==mo*2)throw new Error(`GOBLIN_GRID has ${Ms.length} pixel rows but MASCOT_HEIGHT*2 = ${mo*2}`);let e=[];for(let t=0;t<mo;t++){let n=Ms[t*2]??"",r=Ms[t*2+1]??"";e.push(bT(n,r))}return e}function xp(e="idle"){return E.AFK_BANNER_PLAIN==="1"?[]:kT()}function Ap(){return E.AFK_BANNER_PLAIN==="1"}function fo(){return Math.max(22,te()-6)}function Ll(e,t){return ce(e,t)}var wT={ok:m.success("\u25CF"),warn:m.warning("\u25CF"),error:m.error("\u25CF"),info:m.info("\u25C6")};function _p(e,t){let o=t.reduce((T,x)=>Math.max(T,G(x.label)),0),s=t.reduce((T,x)=>Math.max(T,G(x.value)),0),i=o+4+2+s,a=Math.min(te()-4,100),l=Math.max(44,G(e),i,a);l=Math.min(l,fo());let c=l+4,d=m.dim,u=d("\u256D"+"\u2500".repeat(c)+"\u256E"),p=d("\u251C"+"\u2500".repeat(c)+"\u2524"),f=d("\u2570"+"\u2500".repeat(c)+"\u256F"),g=d("\u2502"),b=pe(e,l).split(`
42
42
  `).map(T=>g+" "+Me(T,l)+" "+g),y=Math.max(1,l-o-4-2),S=t.map(T=>{let x=T.kind?wT[T.kind]+" ":" ",w=m.dim(Me(Ll(T.label,o),o)),v=" ".repeat(4),R=Ll(T.value,y),_=Me(R,y),C=w+v+x+_;return g+" "+C+" "+g});return[u,...b,p,...S,f].join(`
43
- `)}function Cp(e){let t=e.model!==void 0||e.worktree!==void 0||e.cwd!==void 0||e.version!==void 0;return t&&!Ap()?vT(e):Rp(t?ST(e):e)}function ST(e){let t=e.mode;e.model!==void 0&&e.model.length>0&&(t=`${e.model} \xB7 ${t}`),e.version!==void 0&&e.version.length>0&&(t=`${t} \xB7 ${Ip(e.version)}`);let n=[];e.worktree!==void 0&&e.worktree.length>0&&n.push(`branch ${e.worktree}`),e.cwd!==void 0&&e.cwd.length>0&&n.push(Pp(e.cwd));let r=n.join(" \xB7 "),o=e.metaLine!==void 0?e.metaLine:r.length>0?r:void 0,s={mode:t};return o!==void 0&&(s.metaLine=o),e.hintLine!==void 0&&(s.hintLine=e.hintLine),s}function Rp(e){let t="Agent AFK",n=" \xB7 ",r=m.bold(t)+m.dim(n)+e.mode,o=t+n+e.mode,s=Math.min(te()-4,120),i=Math.max(54,K(o)+4,s);i=Math.min(i,fo());let a=i+4,l=m.dim,c=l("\u256D"+"\u2500".repeat(a)+"\u256E"),u=pe(r,i).split(`
43
+ `)}function Cp(e){let t=e.model!==void 0||e.worktree!==void 0||e.cwd!==void 0||e.version!==void 0;return t&&!Ap()?vT(e):Rp(t?ST(e):e)}function ST(e){let t=e.mode;e.model!==void 0&&e.model.length>0&&(t=`${e.model} \xB7 ${t}`),e.version!==void 0&&e.version.length>0&&(t=`${t} \xB7 ${Ip(e.version)}`);let n=[];e.worktree!==void 0&&e.worktree.length>0&&n.push(`branch ${e.worktree}`),e.cwd!==void 0&&e.cwd.length>0&&n.push(Pp(e.cwd));let r=n.join(" \xB7 "),o=e.metaLine!==void 0?e.metaLine:r.length>0?r:void 0,s={mode:t};return o!==void 0&&(s.metaLine=o),e.hintLine!==void 0&&(s.hintLine=e.hintLine),s}function Rp(e){let t="Agent AFK",n=" \xB7 ",r=m.bold(t)+m.dim(n)+e.mode,o=t+n+e.mode,s=Math.min(te()-4,120),i=Math.max(54,G(o)+4,s);i=Math.min(i,fo());let a=i+4,l=m.dim,c=l("\u256D"+"\u2500".repeat(a)+"\u256E"),u=pe(r,i).split(`
44
44
  `).map(g=>l("\u2502")+" "+Me(g,i)+" "+l("\u2502")),p=l("\u2570"+"\u2500".repeat(a)+"\u256F"),f=[c,...u,p];return e.metaLine!==void 0&&f.push(...pe(m.dim(" "+e.metaLine),te()).split(`
45
45
  `)),e.hintLine!==void 0&&f.push(...pe(m.dim(" "+e.hintLine),te()).split(`
46
46
  `)),f.join(`
47
47
  `)}function vT(e){let t=te(),n=t>=42?" ":" ",r=t>=42?" ":" ",o=Math.max(1,t-r.length-$l-n.length),s=[],i=f=>{s.push(Ll(f,o))},a=m.bold(m.brand("Agent AFK")),l=e.version!==void 0?m.dim(" "+Ip(e.version)):"";i(a+l);let c=[];if(e.model!==void 0&&c.push(m.heading(e.model)),e.mode.length>0&&c.push(m.dim(e.mode)),c.length>0&&i(c.join(m.dim(" \xB7 "))),e.worktree!==void 0&&i(m.dim("branch ")+m.goblin(e.worktree)),e.cwd!==void 0){let f=Pp(e.cwd);i(m.dim(ET(f,o)))}e.metaLine!==void 0&&i(m.dim(e.metaLine));let d=xp("idle"),u=Math.max(d.length,s.length),p=[];for(let f=0;f<u;f++){let g=d[f]??" ".repeat($l),h=s[f]??"";p.push(r+g+n+h)}return e.hintLine!==void 0&&p.push(...pe(m.dim(r+TT(e.hintLine)),t).split(`
48
48
  `)),p.join(`
49
- `)}function Ip(e){return e.startsWith("v")?e:`v${e}`}function TT(e){return e.replace(/\s+·\s+/g," \xB7 ")}function Pp(e){let t=E.HOME;if(t===void 0||t.length===0)return e;if(e===t)return"~";let n=t.endsWith(Dl)?t:t+Dl;return e.startsWith(n)?"~"+Dl+e.slice(n.length):e}function ET(e,t){if(K(e)<=t)return e;let n="\u2026",r=Math.max(2,t-1),o=Math.ceil(r*.6),s=Math.max(1,r-o);return e.slice(0,s)+n+e.slice(e.length-o)}function Os(e,t){let n=Math.max(40,K(e),K(t??""))+4,r=Math.min(n,Math.min(te()-4,100));r=Math.min(r,fo());let o=m.error,s=m.bold(m.error(" Error ")),a="\u2500".repeat(r+4-1-K(" Error ")),l=o("\u256D\u2500")+s+o(a+"\u256E"),c=o("\u2570"+"\u2500".repeat(r+4)+"\u256F"),d=o("\u2502"),u=pe(e,r).split(`
49
+ `)}function Ip(e){return e.startsWith("v")?e:`v${e}`}function TT(e){return e.replace(/\s+·\s+/g," \xB7 ")}function Pp(e){let t=E.HOME;if(t===void 0||t.length===0)return e;if(e===t)return"~";let n=t.endsWith(Dl)?t:t+Dl;return e.startsWith(n)?"~"+Dl+e.slice(n.length):e}function ET(e,t){if(G(e)<=t)return e;let n="\u2026",r=Math.max(2,t-1),o=Math.ceil(r*.6),s=Math.max(1,r-o);return e.slice(0,s)+n+e.slice(e.length-o)}function Os(e,t){let n=Math.max(40,G(e),G(t??""))+4,r=Math.min(n,Math.min(te()-4,100));r=Math.min(r,fo());let o=m.error,s=m.bold(m.error(" Error ")),a="\u2500".repeat(r+4-1-G(" Error ")),l=o("\u256D\u2500")+s+o(a+"\u256E"),c=o("\u2570"+"\u2500".repeat(r+4)+"\u256F"),d=o("\u2502"),u=pe(e,r).split(`
50
50
  `),p=[l];for(let f of u)p.push(d+" "+Me(f,r)+" "+d);if(t!==void 0){let f=pe(m.dim(t),r).split(`
51
51
  `);for(let g of f)p.push(d+" "+Me(g,r)+" "+d)}return p.push(c),p.join(`
52
- `)}function Mp(e){let{resetsAt:t,reason:n,accountId:r,hotSwapped:o}=e,s=[];if(n==="usage-limit"){if(s.push("You've hit your Claude subscription limit for now."),t!==void 0){let y=Date.now(),S=t.getTime()-y,T=Math.max(0,Math.ceil(S/6e4)),x=t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});s.push(""),s.push(`Resets at ${x} (in ~${T} min).`)}s.push(""),s.push("Options:"),s.push(" \u2022 Wait, then send the message again."),s.push(" \u2022 Switch to API-key billing: export ANTHROPIC_API_KEY=..."),s.push(" \u2022 Log into another account in any terminal: claude login")}else s.push("Your Anthropic API credit balance is empty."),s.push(""),s.push("Top up at: https://console.anthropic.com/settings/billing"),s.push(""),s.push("Or switch to your Claude subscription on the server.");o===!0&&r!==void 0&&(s.push(""),s.push(`Resumed on ${r}.`));let i=" Usage paused ",a=s.reduce((y,S)=>Math.max(y,K(S)),0),l=Math.max(40,K(i),a)+4,c=Math.min(l,Math.min(te()-4,100));c=Math.min(c,fo());let d=m.warning,u=m.bold(m.warning(i)),p="\u2500".repeat(c+4-1-K(i)),f=d("\u256D\u2500")+u+d(p+"\u256E"),g=d("\u2570"+"\u2500".repeat(c+4)+"\u256F"),h=d("\u2502"),b=[f];for(let y of s){let S=pe(y,c).split(`
52
+ `)}function Mp(e){let{resetsAt:t,reason:n,accountId:r,hotSwapped:o}=e,s=[];if(n==="usage-limit"){if(s.push("You've hit your Claude subscription limit for now."),t!==void 0){let y=Date.now(),S=t.getTime()-y,T=Math.max(0,Math.ceil(S/6e4)),x=t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});s.push(""),s.push(`Resets at ${x} (in ~${T} min).`)}s.push(""),s.push("Options:"),s.push(" \u2022 Wait, then send the message again."),s.push(" \u2022 Switch to API-key billing: export ANTHROPIC_API_KEY=..."),s.push(" \u2022 Log into another account in any terminal: claude login")}else s.push("Your Anthropic API credit balance is empty."),s.push(""),s.push("Top up at: https://console.anthropic.com/settings/billing"),s.push(""),s.push("Or switch to your Claude subscription on the server.");o===!0&&r!==void 0&&(s.push(""),s.push(`Resumed on ${r}.`));let i=" Usage paused ",a=s.reduce((y,S)=>Math.max(y,G(S)),0),l=Math.max(40,G(i),a)+4,c=Math.min(l,Math.min(te()-4,100));c=Math.min(c,fo());let d=m.warning,u=m.bold(m.warning(i)),p="\u2500".repeat(c+4-1-G(i)),f=d("\u256D\u2500")+u+d(p+"\u256E"),g=d("\u2570"+"\u2500".repeat(c+4)+"\u256F"),h=d("\u2502"),b=[f];for(let y of s){let S=pe(y,c).split(`
53
53
  `);for(let T of S)b.push(h+" "+Me(T,c)+" "+h)}return b.push(g),b.join(`
54
54
  `)}var xT={plan:m.plan,status:m.info,checkpoint:m.success,diagnosis:m.warning},AT={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"};function Yt(e){let t=Array.isArray(e.body)?e.body:e.body.split(`
55
55
  `);if(e.kind==="user")return RT(t);let n=e.title??AT[e.kind];return _T(e.kind,n,t)}function RT(e){let t=te(),n=Math.max(20,t-4),r=[];for(let s of e)r.push(...pe(Vt(s),n).split(`
56
- `));let o=m.user("\u2502");return r.map(s=>{let i=K(s),a=Math.max(0,t-i-2);return" ".repeat(a)+s+" "+o}).join(`
57
- `)}function _T(e,t,n){let r=xT[e],o=n.map(Vt),s=` ${t} `,i=r.bold(s),a=Math.max(K(t)+4,...o.map(h=>K(h))),l=Math.max(40,a)+4,c=Math.min(l,Math.min(te()-4,100));c=Math.min(c,fo());let d="\u2500".repeat(c+4-1-K(s)),u=r("\u256D\u2500")+i+r(d+"\u256E"),p=r("\u2570"+"\u2500".repeat(c+4)+"\u256F"),f=r("\u2502"),g=[u];for(let h of o){let b=pe(h,c).split(`
56
+ `));let o=m.user("\u2502");return r.map(s=>{let i=G(s),a=Math.max(0,t-i-2);return" ".repeat(a)+s+" "+o}).join(`
57
+ `)}function _T(e,t,n){let r=xT[e],o=n.map(Vt),s=` ${t} `,i=r.bold(s),a=Math.max(G(t)+4,...o.map(h=>G(h))),l=Math.max(40,a)+4,c=Math.min(l,Math.min(te()-4,100));c=Math.min(c,fo());let d="\u2500".repeat(c+4-1-G(s)),u=r("\u256D\u2500")+i+r(d+"\u256E"),p=r("\u2570"+"\u2500".repeat(c+4)+"\u256F"),f=r("\u2502"),g=[u];for(let h of o){let b=pe(h,c).split(`
58
58
  `);for(let y of b)g.push(f+" "+Me(y,c)+" "+f)}return g.push(p),g.join(`
59
- `)}function be(e){let t=Math.min(te(),120);if(e===void 0)return m.dim("\u2500".repeat(t));let n=m.dim("\u2500\u2500")+" "+m.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-K(r));return n+m.dim("\u2500".repeat(o))}H();function He(){return E.AFK_DEBUG==="1"||E.DEBUG==="1"}function W(...e){He()&&console.log(...e)}function ir(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(Os(e.userMessage,e.hint)+`
59
+ `)}function be(e){let t=Math.min(te(),120);if(e===void 0)return m.dim("\u2500".repeat(t));let n=m.dim("\u2500\u2500")+" "+m.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-G(r));return n+m.dim("\u2500".repeat(o))}K();function He(){return E.AFK_DEBUG==="1"||E.DEBUG==="1"}function W(...e){He()&&console.log(...e)}function ir(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(Os(e.userMessage,e.hint)+`
60
60
  `);else{let o=e.hint?` (${e.hint})`:"";r(`afk: error: ${e.userMessage}${o}
61
61
  `)}He()&&e.raw instanceof Error&&e.raw.stack&&r(e.raw.stack+`
62
62
  `)}function U(e){let t=sr(e);ir(t),process.exit(t.exitCode)}import*as Jh from"node:os";import*as Vh from"node:path";async function Fl(e,t){if(e)try{await e.write({kind:"tool_call",payload:t})}catch(n){W(`trace.emit tool_call failed: ${Xt(n)}`)}}async function ar(e,t){if(e)try{await e.write({kind:"hook_decision",payload:t})}catch(n){W(`trace.emit hook_decision failed: ${Xt(n)}`)}}async function _n(e,t){if(e)try{await e.write({kind:"subagent_lifecycle",payload:t})}catch(n){W(`trace.emit subagent_lifecycle failed: ${Xt(n)}`)}}async function lr(e,t){if(e)try{await e.write({kind:"background_agent",payload:t})}catch(n){W(`trace.emit background_agent failed: ${Xt(n)}`)}}async function Op(e,t){if(e)try{await e.write({kind:"budget",payload:t})}catch(n){W(`trace.emit budget failed: ${Xt(n)}`)}}async function $p(e,t){if(e)try{await e.write({kind:"abort",payload:t})}catch(n){W(`trace.emit abort failed: ${Xt(n)}`)}}async function Dp(e,t){if(e)try{await e.write({kind:"compaction",payload:t})}catch(n){W(`trace.emit compaction failed: ${Xt(n)}`)}}async function Lp(e,t){if(e)try{await e.write({kind:"closure",payload:t})}catch(n){W(`trace.emit closure failed: ${Xt(n)}`)}}function Xt(e){return e instanceof Error?e.message:String(e)}import Lc from"path";import{appendFileSync as NC,mkdirSync as UC}from"fs";import{dirname as jC}from"path";import jg from"@anthropic-ai/sdk";var Fp="claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14",CT="effort-2025-11-24",IT="claude-cli/1.0.0 (external, cli)",PT="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;";function $s(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function go(e,t,n){let r=t==="oauth"?{authToken:e}:{apiKey:e};return typeof n=="string"&&n.length>0?{...r,baseURL:n}:r}function vt(e,t,n,r){return e!=="oauth"?{}:{"anthropic-beta":r?`${Fp},${CT}`:Fp,"x-app":"cli","User-Agent":IT,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function Np(e){return e!=="oauth"?null:[{type:"text",text:PT}]}import{execFileSync as Up}from"child_process";import{existsSync as MT,readFileSync as OT,writeFileSync as $T}from"fs";import{homedir as jp,userInfo as Bp}from"os";import{join as Wp}from"path";var DT="9d1c250a-e61b-44d9-88ed-5944d1962f5e",LT="https://platform.claude.com/v1/oauth/token",FT=300*1e3;function De(){let e=Hp();if(e===void 0)return;let t=Kp(e);if(t!==void 0){if(t.expiresAt!==void 0&&t.expiresAt<=Date.now()){process.stderr.write("agent-afk: Claude Code OAuth token in keychain is expired. Run `claude login` to refresh.\n");return}return t.accessToken}}async function Nl(){let e=Hp();if(e===void 0)return;let t=Kp(e);if(t===void 0)return;if(t.expiresAt!==void 0&&t.expiresAt>Date.now()+FT)return t.accessToken;if(!t.refreshToken){process.stderr.write("agent-afk: OAuth token expired and no refresh token available. Run `claude login` to refresh.\n");return}let n=await NT(t.refreshToken);if(!n){process.stderr.write("agent-afk: OAuth token refresh failed. Run `claude login` to refresh.\n");return}try{let r={};try{r=JSON.parse(e)}catch{}let o=r.claudeAiOauth??{};r.claudeAiOauth={...o,accessToken:n.accessToken,expiresAt:n.expiresAt,...n.refreshToken!==void 0?{refreshToken:n.refreshToken}:{}},UT(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
63
- `)}return n.accessToken}function Hp(){if(process.platform==="darwin")try{return Up("security",["find-generic-password","-s","Claude Code-credentials","-a",Bp().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let e=Wp(jp(),".claude",".credentials.json");if(!MT(e))return;try{return OT(e,"utf-8")}catch{return}}}function Kp(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!="object"||t===null)return;let n=t.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 NT(e){try{let t=await fetch(LT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:e,client_id:DT})});if(!t.ok)return;let n=await t.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 Qt(e){if(!e||e.length<3)return"token:(unknown)";try{let n=e.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:${e.length>=8?e.slice(-8):e}`}function UT(e){if(process.platform==="darwin")Up("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",Bp().username,"-w",e],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let t=Wp(jp(),".claude",".credentials.json");jT(t,e)}}function jT(e,t){$T(e,t,{encoding:"utf-8",mode:384})}import{randomUUID as Ng}from"node:crypto";H();var BT="1h";function Ds(e){if(typeof e?.baseUrl=="string"&&e.baseUrl.length>0)return!1;let t=E.AFK_DISABLE_PROMPT_CACHE;if(t===void 0||t.length===0)return!0;let n=t.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function Ls(){let e=E.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":e==="1h"?"1h":BT}function Gp(e,t){if(e.length===0)return e;let n=e[e.length-1],r=qp(n,t);return r===n?e:[...e.slice(0,-1),r]}function zp(e,t){if(e.length===0)return e;let n=e[e.length-1],r=WT(n,t);return r===n?e:[...e.slice(0,-1),r]}function WT(e,t){let n=e.content;if(typeof n=="string")return n.length===0?e:{...e,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:t}}]};if(!Array.isArray(n)||n.length===0)return e;let r=n[n.length-1],o=qp(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function qp(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}var HT=["## Plan mode is active","","Write-class tools (`write_file`, `edit_file`, write-intent `bash`) are refused at the hook layer.","The user has asked you to plan, not yet to act. 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. The user will exit plan mode (`/plan off`) when satisfied."].join(`
63
+ `)}return n.accessToken}function Hp(){if(process.platform==="darwin")try{return Up("security",["find-generic-password","-s","Claude Code-credentials","-a",Bp().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let e=Wp(jp(),".claude",".credentials.json");if(!MT(e))return;try{return OT(e,"utf-8")}catch{return}}}function Kp(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!="object"||t===null)return;let n=t.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 NT(e){try{let t=await fetch(LT,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:e,client_id:DT})});if(!t.ok)return;let n=await t.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 Qt(e){if(!e||e.length<3)return"token:(unknown)";try{let n=e.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:${e.length>=8?e.slice(-8):e}`}function UT(e){if(process.platform==="darwin")Up("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",Bp().username,"-w",e],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let t=Wp(jp(),".claude",".credentials.json");jT(t,e)}}function jT(e,t){$T(e,t,{encoding:"utf-8",mode:384})}import{randomUUID as Ng}from"node:crypto";K();var BT="1h";function Ds(e){if(typeof e?.baseUrl=="string"&&e.baseUrl.length>0)return!1;let t=E.AFK_DISABLE_PROMPT_CACHE;if(t===void 0||t.length===0)return!0;let n=t.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function Ls(){let e=E.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":e==="1h"?"1h":BT}function Gp(e,t){if(e.length===0)return e;let n=e[e.length-1],r=qp(n,t);return r===n?e:[...e.slice(0,-1),r]}function zp(e,t){if(e.length===0)return e;let n=e[e.length-1],r=WT(n,t);return r===n?e:[...e.slice(0,-1),r]}function WT(e,t){let n=e.content;if(typeof n=="string")return n.length===0?e:{...e,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:t}}]};if(!Array.isArray(n)||n.length===0)return e;let r=n[n.length-1],o=qp(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function qp(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}var HT=["## Plan mode is active","","Write-class tools (`write_file`, `edit_file`, write-intent `bash`) are refused at the hook layer.","The user has asked you to plan, not yet to act. 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. The user will exit plan mode (`/plan off`) when satisfied."].join(`
64
64
  `);function Jp(e){return e!=="plan"?null:{type:"text",text:HT}}import{z as we}from"zod";import{mkdir as ym,appendFile as bm}from"fs/promises";import{join as ql}from"path";var Vp={"audit-fit":{"01-skill-inspector.md":`# Skill Inspector
65
65
 
66
66
  You are an inspector auditing skills for correct type categorization. Skills come from two sources:
@@ -983,7 +983,7 @@ Don't refuse the flow; just clarify where the wizard runs.
983
983
 
984
984
  Be terse and operational. The user is doing one-time setup; they want it done, not narrated. Confirm each step in one line, don't over-explain. Use \`\u2713\` for success, \`\u2717\` for failure, and code fences for any command they should run.
985
985
  `}};function ke(e){let t=Vp[e];if(!t){let n=Object.keys(Vp).sort(),r=n.length>0?"Available: "+n.join(", "):"";throw new Error("Unknown skill: "+e+". "+r)}return t}var Fs=new Map;function Ke(e){Fs.set(e.name,e)}function Ce(e){let t=Fs.get(e);if(t)return t;let n=Array.from(Fs.keys()).sort(),r=n.length>0?`
986
- Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${e}${r}`)}function mt(){return Array.from(Fs.keys()).sort()}var Ns=class{nodes=new Map;traceWriter;constructor(t){this.traceWriter=t}register(t,n){this.nodes.has(t)||this.nodes.set(t,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(t){return this.nodes.has(t)}getController(t){return this.nodes.get(t)?.controller}childrenOf(t){let n=this.nodes.get(t);return n?Array.from(n.children):[]}linkChild(t,n){let r=this.nodes.get(t),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${t} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=t,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==t||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==t||s.cascading)return;let i=this.nodes.get(t);if(!i)return;let a={parentId:t,childId:n,reason:s.controller.signal.reason};for(let l of i.listeners)try{l(a)}catch{}},{once:!0})}onChildAborted(t,n){let r=this.nodes.get(t);if(!r)throw new Error(`AbortGraph: ${t} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(t,n,r="user_signal"){let o=this.nodes.get(t);if(!o||o.controller.signal.aborted)return;let s=[],i=[...o.children],a=new Set;for(;i.length;){let l=i.shift();if(a.has(l))continue;a.add(l);let c=this.nodes.get(l);if(c){c.cascading=!0,s.push(l);for(let d of c.children)i.push(d)}}$p(this.traceWriter,{origin:r,cascadedTo:s,...n!==void 0?{reason:KT(n)}:{}}),o.controller.abort(n);for(let l of s){let c=this.nodes.get(l);c&&!c.controller.signal.aborted&&c.controller.abort(n)}}dispose(t){let n=this.nodes.get(t);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(t);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(t)}}};function KT(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch{return String(e)}}var Us=0,Ul=5e3;async function js(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((s,i)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new rt(`Operation timed out after ${t}ms${a}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),i(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}var ho=3e4;function GT(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Cn(n,t)))},t);i.unref(),Promise.resolve(e).then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}var Cn=class extends Error{constructor(n,r){super(`hook handler timed out after ${r}ms during ${n}`);this.hookEvent=n;this.timeoutMs=r;this.name="HookHandlerTimeoutError"}hookEvent;timeoutMs;code="HOOK_HANDLER_TIMEOUT"},Bl=class{handlers=new Map;register(t,n){let r=this.handlers.get(t);return r||(r=[],this.handlers.set(t,r)),r.push(n),()=>{let o=this.handlers.get(t);if(!o)return;let s=o.indexOf(n);s>=0&&o.splice(s,1)}}count(t){return this.handlers.get(t)?.length??0}async dispatch(t,n,r=ho){jl(n,t.event);let o=this.handlers.get(t.event);if(!o||o.length===0)return{};let s=o.slice(),i={};for(let a of s){jl(n,t.event);let l;try{let c=a(t);l=r>0&&Number.isFinite(r)?await GT(c,r,t.event):await c}catch(c){throw c instanceof Cn?c:new Te(`hook handler threw during ${t.event}`,t.event,c instanceof Error?c.message:String(c),{cause:c})}if(jl(n,t.event),zT(l))throw new Te(`hook handler blocked ${t.event}${l.reason?`: ${l.reason}`:""}`,t.event,l.reason);i=l}return i}};function zT(e){return e.continue===!1||e.decision==="block"}function jl(e,t){if(e?.aborted){let n=e.reason,r=`aborted during ${t}${n?`: ${String(n)}`:""}`;throw new nt(r)}}function Yp(){return new Bl}async function Zt(e,t,n,r){if(!e)return;if(r.kind==="blocked"){await ar(e,{hookEvent:t,decision:"block",...r.err.reason!==void 0?{reason:r.err.reason}:{},...t==="PreToolUse"&&n.toolName!==void 0?{blockedTool:n.toolName}:{}});return}let o=r.decision;await ar(e,{hookEvent:t,decision:o.decision,...o.reason!==void 0?{reason:o.reason}:{},...o.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(o.injectContext,"utf8")}:{}})}async function Xp(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Zt(n.traceWriter,"SubagentStart",{},{kind:"decision",decision:r})}catch(r){throw r instanceof Te&&await Zt(n.traceWriter,"SubagentStart",{},{kind:"blocked",err:r}),r}}function qT(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Cn(n,t)))},t);i.unref(),e.then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}async function Qp(e,t,n={}){if(!e)return{};try{let r=await qT(e.dispatch(t,n.signal,ho),ho,"SubagentStop");return await Zt(n.traceWriter,"SubagentStop",{},{kind:"decision",decision:r}),r}catch(r){return r instanceof Cn?(console.warn(`[afk] SubagentStop hook timed out after ${ho}ms (subagentId=${t.subagentId}): ${r.message}`),n.onError?.(r),{}):(r instanceof Te&&await Zt(n.traceWriter,"SubagentStop",{},{kind:"blocked",err:r}),r instanceof Te||r instanceof nt?(W(`SubagentStop hook swallowed ${r.name}: ${r.message}`),n.onError?.(r),{}):(W(`SubagentStop hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r))),{}))}}async function Wl(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Zt(n.traceWriter,"PreToolUse",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){throw r instanceof Te&&await Zt(n.traceWriter,"PreToolUse",{toolName:t.toolName},{kind:"blocked",err:r}),r}}async function Zp(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Zt(n.traceWriter,"PostToolUse",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){if(r instanceof Te&&await Zt(n.traceWriter,"PostToolUse",{toolName:t.toolName},{kind:"blocked",err:r}),r instanceof Te||r instanceof nt){W(`PostToolUse hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}W(`PostToolUse hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}H();F();import{mkdir as JT,writeFile as VT}from"fs/promises";import{dirname as YT,join as XT}from"path";function QT(){return XT(pt(),"routing-decisions.jsonl")}async function Oe(e){if(!(E.VITEST||E.NODE_ENV==="test"))try{let t=QT();await JT(YT(t),{recursive:!0});let r={ts:new Date().toISOString().split(".")[0]+"Z",surface:"afk"};for(let[s,i]of Object.entries(e))i!==void 0&&(r[s]=i);let o=JSON.stringify(r)+`
986
+ Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${e}${r}`)}function mt(){return Array.from(Fs.keys()).sort()}var Ns=class{nodes=new Map;traceWriter;constructor(t){this.traceWriter=t}register(t,n){this.nodes.has(t)||this.nodes.set(t,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(t){return this.nodes.has(t)}getController(t){return this.nodes.get(t)?.controller}childrenOf(t){let n=this.nodes.get(t);return n?Array.from(n.children):[]}linkChild(t,n){let r=this.nodes.get(t),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${t} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=t,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==t||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==t||s.cascading)return;let i=this.nodes.get(t);if(!i)return;let a={parentId:t,childId:n,reason:s.controller.signal.reason};for(let l of i.listeners)try{l(a)}catch{}},{once:!0})}onChildAborted(t,n){let r=this.nodes.get(t);if(!r)throw new Error(`AbortGraph: ${t} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(t,n,r="user_signal"){let o=this.nodes.get(t);if(!o||o.controller.signal.aborted)return;let s=[],i=[...o.children],a=new Set;for(;i.length;){let l=i.shift();if(a.has(l))continue;a.add(l);let c=this.nodes.get(l);if(c){c.cascading=!0,s.push(l);for(let d of c.children)i.push(d)}}$p(this.traceWriter,{origin:r,cascadedTo:s,...n!==void 0?{reason:KT(n)}:{}}),o.controller.abort(n);for(let l of s){let c=this.nodes.get(l);c&&!c.controller.signal.aborted&&c.controller.abort(n)}}dispose(t){let n=this.nodes.get(t);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(t);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(t)}}};function KT(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch{return String(e)}}var Us=0,Ul=5e3;async function js(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((s,i)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new rt(`Operation timed out after ${t}ms${a}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),i(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}var ho=3e4;function GT(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Cn(n,t)))},t);i.unref(),Promise.resolve(e).then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}var Cn=class extends Error{constructor(n,r){super(`hook handler timed out after ${r}ms during ${n}`);this.hookEvent=n;this.timeoutMs=r;this.name="HookHandlerTimeoutError"}hookEvent;timeoutMs;code="HOOK_HANDLER_TIMEOUT"},Bl=class{handlers=new Map;register(t,n){let r=this.handlers.get(t);return r||(r=[],this.handlers.set(t,r)),r.push(n),()=>{let o=this.handlers.get(t);if(!o)return;let s=o.indexOf(n);s>=0&&o.splice(s,1)}}count(t){return this.handlers.get(t)?.length??0}async dispatch(t,n,r=ho){jl(n,t.event);let o=this.handlers.get(t.event);if(!o||o.length===0)return{};let s=o.slice(),i={};for(let a of s){jl(n,t.event);let l;try{let c=a(t);l=r>0&&Number.isFinite(r)?await GT(c,r,t.event):await c}catch(c){throw c instanceof Cn?c:new Te(`hook handler threw during ${t.event}`,t.event,c instanceof Error?c.message:String(c),{cause:c})}if(jl(n,t.event),zT(l))throw new Te(`hook handler blocked ${t.event}${l.reason?`: ${l.reason}`:""}`,t.event,l.reason);i=l}return i}};function zT(e){return e.continue===!1||e.decision==="block"}function jl(e,t){if(e?.aborted){let n=e.reason,r=`aborted during ${t}${n?`: ${String(n)}`:""}`;throw new nt(r)}}function Yp(){return new Bl}async function Zt(e,t,n,r){if(!e)return;if(r.kind==="blocked"){await ar(e,{hookEvent:t,decision:"block",...r.err.reason!==void 0?{reason:r.err.reason}:{},...t==="PreToolUse"&&n.toolName!==void 0?{blockedTool:n.toolName}:{}});return}let o=r.decision;await ar(e,{hookEvent:t,decision:o.decision,...o.reason!==void 0?{reason:o.reason}:{},...o.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(o.injectContext,"utf8")}:{}})}async function Xp(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Zt(n.traceWriter,"SubagentStart",{},{kind:"decision",decision:r})}catch(r){throw r instanceof Te&&await Zt(n.traceWriter,"SubagentStart",{},{kind:"blocked",err:r}),r}}function qT(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Cn(n,t)))},t);i.unref(),e.then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}async function Qp(e,t,n={}){if(!e)return{};try{let r=await qT(e.dispatch(t,n.signal,ho),ho,"SubagentStop");return await Zt(n.traceWriter,"SubagentStop",{},{kind:"decision",decision:r}),r}catch(r){return r instanceof Cn?(console.warn(`[afk] SubagentStop hook timed out after ${ho}ms (subagentId=${t.subagentId}): ${r.message}`),n.onError?.(r),{}):(r instanceof Te&&await Zt(n.traceWriter,"SubagentStop",{},{kind:"blocked",err:r}),r instanceof Te||r instanceof nt?(W(`SubagentStop hook swallowed ${r.name}: ${r.message}`),n.onError?.(r),{}):(W(`SubagentStop hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r))),{}))}}async function Wl(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Zt(n.traceWriter,"PreToolUse",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){throw r instanceof Te&&await Zt(n.traceWriter,"PreToolUse",{toolName:t.toolName},{kind:"blocked",err:r}),r}}async function Zp(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await Zt(n.traceWriter,"PostToolUse",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){if(r instanceof Te&&await Zt(n.traceWriter,"PostToolUse",{toolName:t.toolName},{kind:"blocked",err:r}),r instanceof Te||r instanceof nt){W(`PostToolUse hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}W(`PostToolUse hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}K();F();import{mkdir as JT,writeFile as VT}from"fs/promises";import{dirname as YT,join as XT}from"path";function QT(){return XT(pt(),"routing-decisions.jsonl")}async function Oe(e){if(!(E.VITEST||E.NODE_ENV==="test"))try{let t=QT();await JT(YT(t),{recursive:!0});let r={ts:new Date().toISOString().split(".")[0]+"Z",surface:"afk"};for(let[s,i]of Object.entries(e))i!==void 0&&(r[s]=i);let o=JSON.stringify(r)+`
987
987
  `;await VT(t,o,{flag:"a"})}catch{}}import{AsyncLocalStorage as ZT}from"node:async_hooks";var em=new ZT;function en(e,t){return em.run(e,t)}function st(){return em.getStore()}function tm(e){let t=eE(e);return t!==void 0?t:tE(e)}function eE(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return nm(n.trim())}function tE(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=nE(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=nm(r);if(o!==void 0)return o}}function nE(e,t){let n=0,r=!1,o=!1;for(let s=t;s>=0;s--){let i=e[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="}")n++;else if(i==="{"&&(n--,n===0))return s}return-1}function nm(e){try{return JSON.parse(e)}catch{return}}function Hl(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function rm(e,t,n,r,o){if(!r)return{id:e,status:t,message:n,trace:o};let s=tm(n.content),i=r.safeParse(s);return i.success?{id:e,status:t,message:n,output:i.data,trace:o}:{id:e,status:"failed",message:n,error:new Error(`structured output did not match schema: ${i.error.message}`,{cause:i.error}),schemaError:i.error,trace:o}}function om(e,t,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:e,status:t,error:o,trace:r}}function ve(e){return`${e.status}${e.error?`: ${e.error.message}`:""}`}function sm(e,t){let n=e;return t.partialOutput!==void 0&&t.partialOutput!==null&&(n.partialOutput=t.partialOutput),t.subagentId!==void 0&&(n.subagentId=t.subagentId),n}var Bs=class{constructor(t,n,r,o,s,i,a,l,c,d,u,p,f,g){this.id=t;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=i;this.hookRegistry=a;this.onTerminal=l;this.parentInputStreamRef=c;this.parentAbortSignal=d;this.agentType=u;this.traceWriter=g;this.progressSink=p,this.parentId=f}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;currentTrace=Hl();lastStreamedContent="";get status(){return this.currentStatus}async run(t,n){if(this.currentStatus==="running")throw new Error(`Subagent ${this.id} is already running`);if(this.currentStatus==="cancelled")throw new Error(`Subagent ${this.id} is cancelled`);this.currentStatus="running";let r=Date.now(),o=js(this.streamToFinalMessage(t,n),this.timeoutMs,{controller:this.controller,label:this.id});this.inFlight=o;try{let s=await o;return this.lastMessage=s.content,this.lastDurationMs=Date.now()-r,this.currentStatus="succeeded",this.latestTerminalStatus="succeeded",_n(this.traceWriter,{transition:"succeeded",subagentId:this.id,durationMs:this.lastDurationMs,turnCount:this.currentTrace.turnCount,outputBytes:Buffer.byteLength(this.lastMessage,"utf8")}),this.onTerminal(),s}catch(s){throw this.lastDurationMs=Date.now()-r,this.currentStatus!=="cancelled"&&(this.controller.signal.aborted?(_n(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(_n(this.traceWriter,{transition:"failed",subagentId:this.id,errorClass:s instanceof Error?s.constructor.name:"Unknown",errorMessage:s instanceof Error?s.message:String(s),partialOutputBytes:Buffer.byteLength(this.lastStreamedContent,"utf8")}),this.currentStatus="failed",this.latestTerminalStatus="failed")),this.onTerminal(),s}finally{this.inFlight=null}}async streamToFinalMessage(t,n){let r,o;this.lastStreamedContent="",this.currentTrace=Hl();let s=n??this.progressSink??st(),i={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let a of this.session.sendMessageStream(t)){if(s&&s(a,i),a.type==="chunk"){let l=a.chunk;l.type==="content"?this.lastStreamedContent+=l.content:l.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:l.toolUseId,name:l.toolName,inputBytes:Buffer.byteLength(l.toolInput,"utf8")}):l.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:l.toolUseId,isError:l.isError,truncated:l.truncated,sizeBytes:l.sizeBytes}):l.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(a.type==="message")r=a.message,this.currentTrace.turnCount++;else if(a.type==="error"){o=a.error;break}else if(a.type==="done"){if(typeof a.metadata?.usage=="object"&&a.metadata.usage!==null){let l=a.metadata.usage;this.currentTrace.usage={inputTokens:typeof l.input_tokens=="number"?l.input_tokens:void 0,outputTokens:typeof l.output_tokens=="number"?l.output_tokens:void 0,cacheReadTokens:typeof l.cache_read_input_tokens=="number"?l.cache_read_input_tokens:void 0,cacheCreationTokens:typeof l.cache_creation_input_tokens=="number"?l.cache_creation_input_tokens:void 0}}break}}if(o)throw o;if(r)return r;if(this.lastStreamedContent.length>0)return{role:"assistant",content:this.lastStreamedContent,timestamp:new Date};throw new Error(`Subagent ${this.id} produced no terminal message`)}async runToResult(t,n){try{let r=await this.run(t,n);return rm(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace)}catch(r){let o=om(this.id,this.currentStatus,r,this.currentTrace);return this.lastStreamedContent.length>0&&(o.partialOutput=this.lastStreamedContent),o}}runInBackground(t,n,r){let o;if(r){let s=this.progressSink??st();o=(i,a)=>{r(i),s?.(i,a)}}this.runToResult(t,o).then(s=>{n?.(s)}).catch(s=>{W("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled",_n(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"explicit"});try{this.abortGraph.abort(this.id,"cancelled")}catch{}try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(t)}}async teardown(){if(this.stopDispatched)return;let t=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(t)}}async dispatchStopAndRelease(t){if(this.stopDispatched){this.onTerminal();return}this.stopDispatched=!0;let n=await Qp(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:t,lastMessage:this.lastMessage,agentType:this.agentType,durationMs:this.lastDurationMs,trace:this.currentTrace},this.traceWriter?{traceWriter:this.traceWriter}:{});if(n.injectContext&&this.parentInputStreamRef)if(this.parentAbortSignal?.aborted)W(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else try{this.parentInputStreamRef.pushUserMessage(n.injectContext)}catch(r){W(`Failed to inject context from SubagentStop handler: ${String(r)}`)}this.onTerminal()}};var rE=async(e,t)=>({action:"decline"}),q=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentCwd;abortGraph;rootId;rootController;counter=0;constructor(t={}){if(this.parentCanUseTool=t.canUseTool,this.hookRegistry=t.hookRegistry,this.progressSink=t.progressSink,this.parentApiKey=t.apiKey,this.parentBaseUrl=t.baseUrl,this.parentCwd=t.cwd,this.abortGraph=new Ns(t.traceWriter),this.rootId=`manager-root-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,this.rootController=new AbortController,this.abortGraph.register(this.rootId,this.rootController),t.parentAbortSignal){let n=t.parentAbortSignal;n.aborted?this.rootController.abort(n.reason):n.addEventListener("abort",()=>{this.rootController.signal.aborted||this.rootController.abort(n.reason)},{once:!0})}}list(){return[...this.active.values()].map(t=>({id:t.id,status:t.status}))}get(t){return this.active.get(t)}onChildAborted(t){return this.abortGraph.onChildAborted(this.rootId,t)}abortAll(t,n="user_signal"){this.abortGraph.abort(this.rootId,t,n)}async forkSubagent(t){let n=`${t.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=t.parent.sessionId,o=t.config.hookRegistry??this.hookRegistry;o&&await Xp(o,{event:"SubagentStart",subagentId:n,parentSessionId:t.parent.sessionId},{signal:this.rootController.signal,...t.config.traceWriter?{traceWriter:t.config.traceWriter}:{}});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let i={...t.config,resume:r,forkSession:r?!0:t.config.forkSession,abortSignal:s.signal,apiKey:t.config.apiKey||this.parentApiKey,baseUrl:t.config.baseUrl??this.parentBaseUrl,...t.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},hookRegistry:t.config.hookRegistry??this.hookRegistry,permissionBubbler:t.config.permissionBubbler??(this.parentCanUseTool!==void 0&&t.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...t.denyElicitations===!0?{onElicitation:rE}:{}},a;try{a=new Ye(i)}catch(h){throw this.abortGraph.dispose(n),h}let l=t.parent.getInputStreamRef?.(),c=t.parent.abortSignal,d=this.progressSink??st(),u=t.agentType?.trim()||void 0,p=t.parentId?.trim()||void 0,f=new Bs(n,a,s,this.abortGraph,t.outputSchema,t.config.timeoutMs??Us,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},l,c,u??t.idPrefix,d,p??t.parent.sessionId,t.config.traceWriter);this.active.set(n,f);let g=typeof t.config.model=="string"?t.config.model:JSON.stringify(t.config.model);return _n(t.config.traceWriter,{transition:"started",subagentId:n,parentId:t.parent.sessionId??this.rootId,model:g,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{}}),await Oe({event:"subagent.dispatched",subagent_id:n,id_prefix:t.idPrefix,model:g,parent_session_id:t.parent.sessionId}),f}async kill(t){let n=this.active.get(t);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(t=>t.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(t=>t.teardown()))}};async function Ws(e,t={}){let{failFast:n=!0,teardown:r=!0}=t;if(e.length===0)return[];let o=new Array(e.length),s=new Set(e.map((a,l)=>l)),i=e.map((a,l)=>a.handle.runToResult(a.prompt).then(c=>{if(o[l]=c,s.delete(l),n&&c.status!=="succeeded")for(let d of s){let u=e[d];u&&u.handle.status==="running"&&u.handle.cancel().catch(()=>{})}}));return await Promise.all(i),r&&await Promise.allSettled(e.map(a=>a.handle.teardown())),o}import{fileURLToPath as oE}from"node:url";import{dirname as sE}from"node:path";var iE=oE(import.meta.url),FB=sE(iE),Xe={name:"research-agent",systemPrompt:`---
988
988
  name: research-agent
989
989
  description: Read-only sub-agent for research, validation, verification, and codebase inspection. Mechanically locked to Read, Grep, Glob, WebFetch, WebSearch \u2014 cannot Edit, Write, Bash, commit, or push. Delegates git queries to \`git-investigator\`. Use when the dispatched task is findings-only.
@@ -1044,9 +1044,9 @@ If \`scope_check\` flags implementation (non-git), the orchestrator should dispa
1044
1044
  ${AE($)}`,artifacts:$,runPrompt:`Inspect every ${M} listed in the artifact section.`})}if(c.runHookInspector){let M=p.hook;if(M){let $=ql(Re(),"settings.json"),N=hm($);S.push({type:"hook",prompt:`${M}
1045
1045
  ${RE($,N)}`,artifacts:[],runPrompt:`Inspect every hook listed in the Discovered hooks section. Settings file: ${$}.`})}}let T=[];if(S.length>0){let M=await Promise.all(S.map(j=>b.forkSubagent({parent:{sessionId:d},config:{model:"sonnet",systemPrompt:`${Xe.systemPrompt}
1046
1046
 
1047
- ${j.prompt}`,canUseTool:y()},idPrefix:`inspector-${j.type}`,outputSchema:we.array(wm),...o?{parentId:o}:{}}))),$=await Ws(S.map((j,G)=>{let V=M[G];if(!V)throw new Error(`audit-fit: missing handle for ${j.type} inspector`);return{handle:V,prompt:j.runPrompt}}),{failFast:!1}),N=[];for(let j=0;j<$.length;j++){let G=$[j],V=S[j];if(!V)continue;let I=_E(V.type,G);if(I.kind==="failure"){N.push(I.message);continue}let L=new Map;for(let B of V.artifacts)L.set(B.path,B.source);for(let B of I.output){if(V.type==="hook"){if(B.source!=="user"){N.push(`${V.type}: hook verdict has source=${B.source} (must be 'user')`);continue}}else{let ne=L.get(B.path);if(ne===void 0){N.push(`${V.type}: verdict for unknown path ${B.path} (not in discovered list)`);continue}if(B.source!==ne){N.push(`${V.type}: verdict source mismatch for ${B.path} (expected ${ne}, got ${B.source})`);continue}}T.push(B)}}if(N.length>0){let j=N.map(G=>` - ${G}`).join(`
1047
+ ${j.prompt}`,canUseTool:y()},idPrefix:`inspector-${j.type}`,outputSchema:we.array(wm),...o?{parentId:o}:{}}))),$=await Ws(S.map((j,z)=>{let V=M[z];if(!V)throw new Error(`audit-fit: missing handle for ${j.type} inspector`);return{handle:V,prompt:j.runPrompt}}),{failFast:!1}),N=[];for(let j=0;j<$.length;j++){let z=$[j],V=S[j];if(!V)continue;let I=_E(V.type,z);if(I.kind==="failure"){N.push(I.message);continue}let L=new Map;for(let B of V.artifacts)L.set(B.path,B.source);for(let B of I.output){if(V.type==="hook"){if(B.source!=="user"){N.push(`${V.type}: hook verdict has source=${B.source} (must be 'user')`);continue}}else{let ne=L.get(B.path);if(ne===void 0){N.push(`${V.type}: verdict for unknown path ${B.path} (not in discovered list)`);continue}if(B.source!==ne){N.push(`${V.type}: verdict source mismatch for ${B.path} (expected ${ne}, got ${B.source})`);continue}}T.push(B)}}if(N.length>0){let j=N.map(z=>` - ${z}`).join(`
1048
1048
  `);throw new Error(`audit-fit: ${N.length} inspector failure(s):
1049
- ${j}`)}}let{inventory:x,misfits:w}=EE(T),v=0;if(a){let M=Kt();await ym(M,{recursive:!0});for(let $ of w.filter(xE)){let N=$.path.replace(/[^a-z0-9]+/gi,"-").toLowerCase().slice(0,30),j=ql(M,`audit-fit-${N}.md`),G=`---
1049
+ ${j}`)}}let{inventory:x,misfits:w}=EE(T),v=0;if(a){let M=Kt();await ym(M,{recursive:!0});for(let $ of w.filter(xE)){let N=$.path.replace(/[^a-z0-9]+/gi,"-").toLowerCase().slice(0,30),j=ql(M,`audit-fit-${N}.md`),z=`---
1050
1050
  theme: audit-fit
1051
1051
  session_count: 1
1052
1052
  ---
@@ -1068,7 +1068,7 @@ ${$.rationale}
1068
1068
 
1069
1069
  ---
1070
1070
  Generated by audit-fit on ${new Date().toISOString().split(".")[0]}Z
1071
- `;await bm(j,G),v++}}let R=pt();await ym(R,{recursive:!0});let _=M=>{let $=0;for(let N of Object.values(M))for(let j of Object.values(N))$+=j;return $},C=M=>{let $=x.user[M]??{},N=x.plugin[M]??{},j=G=>Object.values(G).reduce((V,I)=>V+I,0);return j($)+j(N)},A={timestamp:new Date().toISOString(),surface:"afk",scope:l,total_artifacts:T.length,misfits_count:w.length,briefs_written:v,by_source:{user:_(x.user),plugin:_(x.plugin)},by_type:{skill:C("skill"),command:C("command"),agent:C("agent"),hook:C("hook")}},O=ql(R,"audit-fit-telemetry.jsonl");return await bm(O,JSON.stringify(A)+`
1071
+ `;await bm(j,z),v++}}let R=pt();await ym(R,{recursive:!0});let _=M=>{let $=0;for(let N of Object.values(M))for(let j of Object.values(N))$+=j;return $},C=M=>{let $=x.user[M]??{},N=x.plugin[M]??{},j=z=>Object.values(z).reduce((V,I)=>V+I,0);return j($)+j(N)},A={timestamp:new Date().toISOString(),surface:"afk",scope:l,total_artifacts:T.length,misfits_count:w.length,briefs_written:v,by_source:{user:_(x.user),plugin:_(x.plugin)},by_type:{skill:C("skill"),command:C("command"),agent:C("agent"),hook:C("hook")}},O=ql(R,"audit-fit-telemetry.jsonl");return await bm(O,JSON.stringify(A)+`
1072
1072
  `),{inventory:x,misfits:w,briefs_written:v,total_artifacts:T.length}}var IE={name:"audit-fit",description:"Audit ~/.afk artifacts (skills, commands, agents, hooks) for correct type categorization. Walks user-scope dirs (~/.afk/{skills,commands,agents}/) and every plugin installed under ~/.afk/plugins/ (flat and marketplace-cache layouts), plus ~/.afk/settings.json for hooks. Dispatches per-type inspectors in parallel, applies decision heuristics (progressive-disclosure value, isolation need, deterministic vs. reasoning), flags misfits. Generates migration briefs only for user-scope misfits (plugin misfits are inventory-only \u2014 refactoring vendored plugin code is the maintainer's job). Optional `scope` input filters to `user`, `plugin`, or `all` (default). Use for inventory audits after bulk authoring, imports, or periodic hygiene.",handler:CE,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"]};Ke(IE);import{z as X}from"zod";import{execFile as $E}from"node:child_process";import{promisify as DE}from"node:util";import{tmpdir as LE}from"node:os";import{join as Tm}from"node:path";function vm(e){return e.confidence<.5?{verify:!0,reason:`low confidence (${e.confidence.toFixed(2)} < ${.5})`}:e.boundary_flag&&e.boundary_flag.length>0?{verify:!0,reason:`boundary flag set: ${e.boundary_flag}`}:e.coverage_gaps&&e.coverage_gaps.length>0?{verify:!0,reason:`coverage gap${e.coverage_gaps.length===1?"":"s"}: ${e.coverage_gaps.length} unresolved`}:{verify:!1,reason:`confidence ${e.confidence.toFixed(2)} with no gaps or boundary`}}import{fileURLToPath as PE}from"node:url";import{dirname as ME}from"node:path";var OE=PE(import.meta.url),hW=ME(OE),Jl={name:"git-investigator",systemPrompt:'---\nname: git-investigator\ndescription: Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.\nmodel: sonnet\ntools: Bash, Read, Grep, Glob\n---\n\nYou are `git-investigator`, a leaf sub-agent specialized for read-only git queries.\n\nYou have Bash, Read, Grep, and Glob. You do not dispatch other sub-agents. You do not Edit or Write. Your Bash surface is restricted **by this prompt** to `git ...` invocations and benign output-shaping pipes.\n\n## Allowed commands\n\nRead-only git only:\n\n- `git status`, `git log`, `git diff`, `git show`\n- `git rev-parse`, `git rev-list`, `git reflog`\n- `git branch -v / -vv / -a` (list only)\n- `git remote -v`, `git ls-remote`\n- `git ls-files`, `git blame`\n- `git merge-base`, `git for-each-ref`, `git describe`\n- `git cat-file`, `git shortlog`\n- `git tag` (list/show only)\n- `git stash list`, `git stash show`\n- `git config --get`, `git config --get-all`, `git config --list`\n- `git worktree list` (read only)\n\nOutput-shaping pipes are fine: `| head`, `| tail`, `| wc`, `| grep`, `| jq`, `| awk \'NR==...\'` (for formatting only \u2014 no mutations).\n\n## Forbidden\n\nAnything that mutates repo or working tree state:\n\n- `commit`, `push`, `pull`, `fetch --prune`\n- `reset`, `revert`, `rebase`, `merge`, `cherry-pick`\n- `checkout` (except `checkout -- <path>` file-restore, and even that is mutation \u2014 avoid it, just report the need)\n- `restore`, `switch`\n- `branch -d / -D / -m / -M`, `branch <new>`\n- `stash push / pop / drop / apply / clear`\n- `tag -d`, creating a new tag\n- `remote add / remove / set-url`\n- `config --set`, `config --unset`\n- `gc`, `fsck`, `prune`, `reflog delete`, `reflog expire`\n- `filter-branch`, `filter-repo`\n- `worktree add / remove / move`\n- `hooks install`, `submodule add / update`\n- Any non-`git` command that mutates: `rm`, `mv`, `cp` (writes), `sed -i`, `> file`, `>> file`, `tee`, `curl`, `wget`, `pip install`, shell builtins that change state.\n\nIf the caller asks for any of the above, do not run it. Return `scope_check: "requires mutation: <reason>"` and stop.\n\n## Behavior\n\n- Run the minimum set of commands needed. Prefer `git log -n 5 --oneline -- <path>` over `git log -- <path>` when a count is fine.\n- Cite concrete evidence: commit SHAs (short form OK), ref names, `path:line` references from blame, diff hunks trimmed to the relevant range.\n- Use `Read`/`Grep`/`Glob` for follow-up inspection of files the git output identifies (e.g., `git show SHA:path | head` then `Read` the current file to diff mentally).\n- Do not speculate beyond what the commands show. If a question needs history the commands don\'t surface (deleted-file recovery, ancient reflog that has expired), say so in `caveats`.\n- Keep output compact \u2014 dispatchers merge your findings into a larger response. No preamble, no ceremony.\n\n## Return shape\n\n```\n{\n "findings": "<summary of what the git data shows>",\n "evidence": ["<SHA>", "<ref>", "<path:line>", ...],\n "git_commands_run": ["git log ...", "git diff ...", ...],\n "caveats": "<gaps, ambiguity, or \'none\'>",\n "scope_check": "pure git research" | "requires mutation: <reason>"\n}\n```\n\nBegin your response with the first schema field. No preamble.\n',sourcePath:"agent-framework-private/agents/git-investigator.md",allowedTools:["Bash","Read","Grep","Glob"],description:"Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.",model:"sonnet"};function Vl(e){let t={description:e.description,prompt:e.systemPrompt};return e.allowedTools&&(t.tools=[...e.allowedTools]),e.model&&(t.model=e.model),t}var Gs=DE($E),Am=X.object({id:X.string(),claim:X.string(),confidence:X.number().min(0).max(1),evidence_sources:X.array(X.string()),location:X.string().optional(),proposed_fix:X.string().optional(),coverage_gaps:X.array(X.string()).nullish().transform(e=>e??void 0),boundary_flag:X.string().nullish().transform(e=>e??void 0)}),FE=X.object({hypothesis_id:X.string(),claim:X.string(),verdict:X.enum(["VERIFIED","REFUTED","INCONCLUSIVE"]),evidence:X.string(),gate_reason:X.string()}),Rm=X.object({hypothesis_id:X.string(),reproducer_passed:X.boolean(),regressions:X.array(X.string()),confidence:X.number().min(0).max(1),verification_log:X.string()}),NE=X.enum(["crash","regression","logic-error","flaky","environment","unknown"]),UE=X.object({failure_type:NE,error_signature:X.string(),affected_area:X.string()}),jE=X.enum(["clear_winner","multiple_plausible","dissent","all_inconclusive","no_hypotheses"]),OW=X.object({reproducer:X.string().optional(),triage:UE.optional(),hypotheses:X.array(Am),premise_verifications:X.array(FE).optional(),winner:X.object({hypothesis_id:X.string(),verification_log:X.string(),proposed_fix:X.string()}).optional(),verification_results:X.array(Rm).optional(),outcome:jE.optional(),recommended_next_skill:X.enum(["spec"]).optional()});async function BE(e,t){let n=e.map(l=>({hypothesis:l,decision:vm(l)})).filter(l=>l.decision.verify);if(n.length===0)return{premise_verifications:[],hypotheses_to_test:e};let r=[],o;try{r=await t(n.map(l=>l.hypothesis.claim))}catch(l){o=l instanceof Error?l.message:String(l)}let s=n.map((l,c)=>{let d=r[c];return o!==void 0?{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:`shadow-verify dispatch failed: ${o}`,gate_reason:l.decision.reason}:d?{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:d.verdict,evidence:d.evidence,gate_reason:l.decision.reason}:{hypothesis_id:l.hypothesis.id,claim:l.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:"no verifier result for this claim",gate_reason:l.decision.reason}}),i=new Set(s.filter(l=>l.verdict==="REFUTED").map(l=>l.hypothesis_id)),a=i.size===0?e:e.filter(l=>!i.has(l.id));return{premise_verifications:s,hypotheses_to_test:a}}async function WE(e,t,n){let r=n?.apiKey,o=(()=>{if(typeof e=="string")return{failure:e,repoPath:process.cwd(),context:"",maxHypotheses:4};if(typeof e=="object"&&e!==null){let D=e;if(typeof D.failure=="string")return{failure:D.failure,repoPath:D.repoPath||process.cwd(),context:D.context||"",maxHypotheses:Math.min(D.maxHypotheses||4,4)}}throw new Error("diagnose handler requires input.failure (string) or a string argument")})();if(!t?.sessionId)throw new Error("diagnose requires a parent session with sessionId");let s=t.sessionId,i=ke("diagnose"),a=i["system.md"],l=i["research.md"],c=i["hypothesis.md"],d=i["verify.md"];if(!a||!l||!c||!d)throw new Error("diagnose skill missing required prompts (system.md, research.md, hypothesis.md, verify.md)");let u=new q({apiKey:r}),p=zE(o.context),f=HE(o.failure,o.context),g=`Triage:
1073
1073
  failure_type: ${f.failure_type}
1074
1074
  error_signature: ${f.error_signature}
@@ -1104,7 +1104,7 @@ ${JSON.stringify(R.git,null,2)}
1104
1104
 
1105
1105
  Original failure: ${o.failure}`,A;try{A=await _.runToResult(C)}finally{await _.teardown().catch(()=>{})}if(A.status!=="succeeded"||!A.output){if(A.schemaError){let D=A.message?.content||"(no response)";throw new Error(`hypothesis synthesis schema mismatch: ${A.schemaError.message}
1106
1106
  Raw response (first 500 chars): ${D.slice(0,500)}
1107
- Hint: model response must include a fenced JSON block with a hypotheses array.`)}throw new Error(`hypothesis synthesis failed: ${ve(A)}`)}let O=A.output.hypotheses.slice(0,o.maxHypotheses);if(O.length===0)return{reproducer:p,triage:f,hypotheses:[],verification_results:[],outcome:"no_hypotheses"};let{premise_verifications:M,hypotheses_to_test:$}=await BE(O,async D=>{if(!n?.dispatchSkill)throw new Error("shadow-verify dispatch unavailable (no dispatchSkill in ctx)");let P=JSON.stringify({claims:D,context:`Original failure: ${o.failure}`}),ie=await n.dispatchSkill("shadow-verify",P);return JSON.parse(ie).verifications});if($.length===0)return{reproducer:p,triage:f,hypotheses:O,premise_verifications:M,verification_results:[],outcome:"no_hypotheses"};let N=p||o.failure,j=$.map(D=>JE(D,N,o.repoPath,s,d,u,S)),G=await Promise.all(j),I=G.filter(D=>D.reproducer_passed&&D.regressions.length===0).slice().sort((D,P)=>P.confidence-D.confidence)[0]??G.find(D=>D.reproducer_passed),L=GE(O,G),B=I?O.find(D=>D.id===I.hypothesis_id):void 0,ne=L==="clear_winner"&&B&&KE(B)?"spec":void 0;return{reproducer:p,triage:f,hypotheses:O,premise_verifications:M.length>0?M:void 0,winner:I?{hypothesis_id:I.hypothesis_id,verification_log:I.verification_log,proposed_fix:B?.proposed_fix||""}:void 0,verification_results:G,outcome:L,recommended_next_skill:ne}}function HE(e,t){let n=`${e}
1107
+ Hint: model response must include a fenced JSON block with a hypotheses array.`)}throw new Error(`hypothesis synthesis failed: ${ve(A)}`)}let O=A.output.hypotheses.slice(0,o.maxHypotheses);if(O.length===0)return{reproducer:p,triage:f,hypotheses:[],verification_results:[],outcome:"no_hypotheses"};let{premise_verifications:M,hypotheses_to_test:$}=await BE(O,async D=>{if(!n?.dispatchSkill)throw new Error("shadow-verify dispatch unavailable (no dispatchSkill in ctx)");let P=JSON.stringify({claims:D,context:`Original failure: ${o.failure}`}),ie=await n.dispatchSkill("shadow-verify",P);return JSON.parse(ie).verifications});if($.length===0)return{reproducer:p,triage:f,hypotheses:O,premise_verifications:M,verification_results:[],outcome:"no_hypotheses"};let N=p||o.failure,j=$.map(D=>JE(D,N,o.repoPath,s,d,u,S)),z=await Promise.all(j),I=z.filter(D=>D.reproducer_passed&&D.regressions.length===0).slice().sort((D,P)=>P.confidence-D.confidence)[0]??z.find(D=>D.reproducer_passed),L=GE(O,z),B=I?O.find(D=>D.id===I.hypothesis_id):void 0,ne=L==="clear_winner"&&B&&KE(B)?"spec":void 0;return{reproducer:p,triage:f,hypotheses:O,premise_verifications:M.length>0?M:void 0,winner:I?{hypothesis_id:I.hypothesis_id,verification_log:I.verification_log,proposed_fix:B?.proposed_fix||""}:void 0,verification_results:z,outcome:L,recommended_next_skill:ne}}function HE(e,t){let n=`${e}
1108
1108
  ${t}`,r="unknown",o=n.toLowerCase();/flaky|non-?deterministic|intermittent|sometimes fails|race/.test(o)?r="flaky":/regression|used to work|worked before|broke in|ci.*green.*red|was passing/.test(o)?r="regression":/\b(uncaught|unhandled)\b|panic|segfault|exit(ed)? (with )?(code )?[1-9]|sigsegv|stack overflow|fatal|traceback|core dumped|abort(ed)?|\b(type|reference|range|syntax|internal|eval|uri)error\b/.test(o)?r="crash":/platform|node version|python version|dependency|version mismatch|works on .* not |env(ironment)?|config drift/.test(o)?r="environment":/expected .* but|got .* expected|wrong|incorrect|unexpected/.test(o)&&(r="logic-error");let s=/^(why|what|how|when|where|who|is|are|does|did|can|could|should|would)\b/i,i=/\b(error|exception|panic|throws?|traceback|fail(ed|ure|s)?|undefined|null|nan|segfault|sigsegv|stack ?overflow|abort(ed)?)\w*|:\s*\d+|\bat\s+\S|\bcore dumped\b/i,a=e.split(`
1109
1109
  `).map(u=>u.trim()).find(u=>u.length>0),l;a?s.test(a)&&!i.test(e)?l="prose-question":a.length>200?l=`${a.slice(0,197)}...`:l=a:l="unknown";let d=n.match(/(?:^|[\s'"`(])((?:\.{1,2}\/)?[\w@./-]+\.(?:ts|tsx|js|jsx|mjs|cjs|py|rb|go|rs|java|kt|cpp|c|h|hpp|md|json|yaml|yml)(?::\d+(?::\d+)?)?)/)?.[1]??"unknown";return{failure_type:r,error_signature:l,affected_area:d}}function KE(e){let n=`${e.proposed_fix??""}
1110
1110
  ${e.location??""}`.match(/(?:^|[\s'"`(])((?:\.{1,2}\/)?[\w@./-]+\.(?:ts|tsx|js|jsx|mjs|cjs|py|rb|go|rs|java|kt|cpp|c|h|hpp))/g);return n?new Set(n.map(o=>o.trim().replace(/^[\s'"`(]+/,"").split(":")[0])).size>2:!1}function GE(e,t){if(e.length===0)return"no_hypotheses";let n=t.filter(o=>o.reproducer_passed&&o.regressions.length===0);return n.length===1?"clear_winner":n.length>=2?"multiple_plausible":e.filter(o=>o.confidence>=.7).length>=2?"dissent":"all_inconclusive"}function zE(e){if(!e)return;let t=[/test:\s*(.+)/i,/command:\s*(.+)/i,/reproducer:\s*(.+)/i,/failing test:\s*(.+)/i];for(let n of t){let r=e.match(n);if(r)return r[1]}}function Em(){return async e=>Xe.allowedTools.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed. Allowed tools: ${Xe.allowedTools.join(", ")}`}}var xm=[...Xe.allowedTools,"Agent"];function qE(){return async e=>xm.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed for git orchestrator. Allowed tools: ${xm.join(", ")}`}}async function JE(e,t,n,r,o,s,i){let a=Tm(LE(),`diagnose-hyp-${e.id}-${Date.now()}`),l;try{await Gs("git",["worktree","add","--detach",a,"HEAD"],{cwd:n});try{let{writeFile:u}=await import("node:fs/promises"),p="",f="";try{p=(await Gs("git",["rev-parse","HEAD"],{cwd:n})).stdout.trim()}catch{}try{f=(await Gs("git",["symbolic-ref","--short","HEAD"],{cwd:n})).stdout.trim()}catch{}await u(Tm(a,".afk-worktree-meta.json"),JSON.stringify({owner:"diagnose",createdAt:new Date().toISOString(),baseSha:p,baseBranch:f},null,2),"utf-8")}catch{}l=await s.forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:`${o}
@@ -1356,7 +1356,7 @@ Be skeptical. Protect the plugin from fluff. Stage 2 catches patterns that are s
1356
1356
  `;return await Cm(t,o,{flag:"a"}),n}async function Im(){let e=Ss(),t=ox(e,"forge-thaw-history.jsonl");await _m(e,{recursive:!0});let r={timestamp:new Date().toISOString().split(".")[0]+"Z",surface:"afk",event:"forge.thaw_override",thaw_triggered:!0},o=JSON.stringify(r)+`
1357
1357
  `;await Cm(t,o,{flag:"a"})}F();import{readFile as Pm,readdir as sx,writeFile as ix,mkdir as ax,unlink as lx}from"fs/promises";import{join as zs}from"path";import{existsSync as cx}from"fs";async function Mm(e){let t=zs(Kt(),e+".md"),n=await Pm(t,"utf-8");return{id:e,content:n}}async function Om(){let e=Kt();return cx(e)?(await sx(e,{withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".md")).map(r=>r.name.slice(0,-3)):[]}async function Xl(e,t){let n=Kt(),r=zs(n,e+".md"),o=zs(n,t),s=zs(o,e+".md");await ax(o,{recursive:!0});let i=await Pm(r,"utf-8");await ix(s,i,"utf-8"),await lx(r)}var dx=/^(APPROVE|SALVAGE|REJECT)\b/,ux=/^(?:\w+\s+)*verdict(?:\s+\w+)*\s*[:\-—]\s*(APPROVE|SALVAGE|REJECT)\b/i,px=/\b(?:verdict|decision)\b/i;function Dm(e){return e.toUpperCase()}function $m(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];if(!r)continue;let o=r.match(t);if(o&&o[1])return{index:n,verdict:Dm(o[1])}}return null}function mx(e){let t=/\b(APPROVE|SALVAGE|REJECT)\b/g;for(let n=e.length-1;n>=0;n--){let r=e[n];if(!r||!px.test(r))continue;let o=Array.from(r.matchAll(t));if(o.length===1){let s=o[0]?.[1];if(s)return{index:n,verdict:Dm(s)}}}return null}function Lm(e){let t=e.split(`
1358
1358
  `).map(l=>l.trim()).filter(l=>l.length>0),n=t.map(l=>l.replace(/\*\*/g,"")),r=$m(n,dx)??$m(n,ux)??mx(n);if(!r)return{verdict:"REJECT",feedback:e};let o=e.match(/score:\s*(\d+)/i),s=o&&o[1]?parseInt(o[1],10):void 0,i=t.slice(r.index+1).join(`
1359
- `).trim(),a=t[r.index]??"";return{verdict:r.verdict,score:s,feedback:i||a}}F();H();var bx=gx(fx);function kx(e){let t=[],n=E.AFK_EVAL_HARNESS_ROOT;if(n){let i=Lt(n,"scripts","eval-harness","runner.py");if(t.push(i),qs(i))return i}let r=Lt(e,"../../.."),o=Lt(r,"..","awa-private","scripts","eval-harness","runner.py");if(t.push(o),qs(o))return o;let s=e;for(let i=0;i<12;i++){let a=Lt(s,"awa-private","scripts","eval-harness","runner.py");if(t.push(a),qs(a))return a;let l=Um(s);if(l===s)break;s=l}throw new Error(`Could not find eval-harness runner.py. Tried:
1359
+ `).trim(),a=t[r.index]??"";return{verdict:r.verdict,score:s,feedback:i||a}}F();K();var bx=gx(fx);function kx(e){let t=[],n=E.AFK_EVAL_HARNESS_ROOT;if(n){let i=Lt(n,"scripts","eval-harness","runner.py");if(t.push(i),qs(i))return i}let r=Lt(e,"../../.."),o=Lt(r,"..","awa-private","scripts","eval-harness","runner.py");if(t.push(o),qs(o))return o;let s=e;for(let i=0;i<12;i++){let a=Lt(s,"awa-private","scripts","eval-harness","runner.py");if(t.push(a),qs(a))return a;let l=Um(s);if(l===s)break;s=l}throw new Error(`Could not find eval-harness runner.py. Tried:
1360
1360
  - ${t.join(`
1361
1361
  - `)}`)}function wx(){let e=Um(yx(import.meta.url));return kx(e)}function Sx(e){return Lt(e,"..","..","..","plugins","awa-private")}function vx(){return Ss()}function Tx(e){let t=e.split(`
1362
1362
  `),n=[],r=/^\s+✗\s+(\S+):/;for(let o of t){let s=o.match(r);s&&s[1]&&n.push(s[1])}return n}async function Ex(e){let t=vx(),n=Lt(t,"qualifications.jsonl");await Fm(t,{recursive:!0});let o=new Date().toISOString().split(".")[0]+"Z",i=JSON.stringify({timestamp:o,surface:"afk",refers_to_run_id:e,source:"forge-gate-check-ts"})+`
@@ -1371,7 +1371,7 @@ Be skeptical. Protect the plugin from fluff. Stage 2 catches patterns that are s
1371
1371
 
1372
1372
  ${h}`);if(v.status!=="succeeded")throw new Error(`skill generation failed: ${ve(v)}`);let R=v.message?.content||"";if(!R)throw new Error("skill generation returned no output");for(let _=1;_<=l;_++){let C=Yl.systemPrompt;if(!C)throw new Error("qualify agent missing system prompt");let M=await(await new q({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:C},idPrefix:`forge-qualify-${_}`,...o?{parentId:o}:{}})).runToResult(`Evaluate this amplifier skill against the force-multiplier criteria:
1373
1373
 
1374
- ${R}`);if(M.status!=="succeeded")throw new Error(`qualify iteration ${_} failed: ${ve(M)}`);let $=M.message?.content||"",{verdict:N,score:j,feedback:G}=Lm($),V={iteration:_,verdict:N,score:j,feedback:G};if(d.push(V),c=await it({event:"forge.qualify_iteration",iteration:_,verdict:N,score:j||null,feedback:G||null}),N==="APPROVE"){u="APPROVED";break}else if(N==="SALVAGE"&&_<l){let I=y["qualify-rework.md"];if(!I)throw new Error("forge skill missing qualify-rework.md prompt");let L=I.replace("{feedback}",G).replace("{original_skill}",R),D=await(await new q({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:L},idPrefix:`forge-rework-${_}`,...o?{parentId:o}:{}})).runToResult("Refine the skill based on the feedback.");if(D.status!=="succeeded")throw new Error(`rework iteration ${_} failed: ${ve(D)}`);if(R=D.message?.content||"",!R)throw new Error(`rework iteration ${_} returned no output`)}else N==="REJECT"&&_>=l&&(u="MAX_ITERATIONS")}if(u==="APPROVED"){let _=_x(R);if(!_.ok)throw c=await it({event:"forge.write_failed",reason:_.reason,skill_name_attempted:_.skillNameAttempted}),new Error(`forge write-step invariant failed (${_.reason}): ${_.message}`);let C=_.skillName,A=Cx(C,{skillsDir:ao(),registeredSkills:mt()});if(A)throw c=await it({event:"forge.write_failed",reason:A.reason,skill_name_attempted:A.skillNameAttempted}),new Error(`forge write-step invariant failed (${A.reason}): ${A.message}`);let O=Lt(ao(),C);await Fm(O,{recursive:!0});let M=Lt(O,"SKILL.md");await Nm(M,R,"utf-8");let $;try{$=await hx(M,"utf-8")}catch{$=""}if(!$.startsWith("---"))throw c=await it({event:"forge.write_failed",reason:"readback_failed",skill_name_attempted:C}),new Error(`forge write-step invariant failed (readback_failed): written file at ${M} did not read back with expected frontmatter`);p=M,b&&f&&await Xl(f,"consumed"),c=await it({event:"forge.complete",status:"APPROVED",skill_name:C,iterations:d.length})}else u==="MAX_ITERATIONS"&&(b&&f&&await Xl(f,"failed"),c=await it({event:"forge.complete",status:"MAX_ITERATIONS",skill_name_attempted:h||null,iterations:d.length}))}catch(g){throw c=await it({event:"forge.error",error:g instanceof Error?g.message:String(g)}),g}return{status:u,skill_path:p,qualify_verdicts:d,brief_id:f,telemetry_ref:c}}var Px={name:"forge",description:'Creates new amplifier skills gated by forge-gate-check, with autonomous gap discovery, skill generation, and qualify iteration loop \u22643\xD7. Writes approved skills and appends telemetry to shared JSONL with surface: "afk".',handler:Ix,argumentHint:"[--brief <path>]",whenToUse:"When the user wants to grow the plugin with a new amplifier skill \u2014 autonomously generates and validates one.",flags:["--brief"]};Ke(Px);F();import yc from"path";import{appendFileSync as YR,mkdirSync as XR}from"fs";import{dirname as QR}from"path";import Zl from"path";import{appendFileSync as Vx,mkdirSync as Yx}from"fs";import{dirname as Xx}from"path";function Ql(e,t){return t?.allowedTools?t.allowedTools.includes(e)?{allowed:!0}:{allowed:!1,reason:`Tool "${e}" is not in the configured allowlist`}:{allowed:!0}}F();var Mx={name:"bash",category:"shell",concurrencySafe:!1,description:"Execute a shell command and return its stdout and stderr. Use for running programs, installing packages, git operations, and any task that requires a shell. Commands run in the user's default shell. Long-running commands should use timeout_ms. Output is capped at ~100KB; excess is truncated with a notice.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute."},timeout_ms:{type:"number",description:"Optional timeout in milliseconds (default 120000, max 600000). The command is killed if it exceeds this duration."}},required:["command"]}},Ox={name:"read_file",category:"read",concurrencySafe:!0,description:"Read a file from the filesystem. Returns the file content with line numbers. Use offset and limit to read specific sections of large files. When the read returns a partial view, the response ends with a `... (showing lines X-Y of Z [\u2014 pass offset=N to continue])` annotation indicating the full file size and how to continue. Binary files are detected and rejected. Missing files return an error.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-based). Defaults to 1."},limit:{type:"number",description:"Maximum number of lines to read. Defaults to 2000."}},required:["file_path"]}},$x={name:"write_file",category:"write",concurrencySafe:!1,description:"Write content to a file, creating it if it does not exist or overwriting if it does. Parent directories are created automatically. Prefer edit_file for modifying existing files \u2014 use write_file only for new files or complete rewrites.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"The full content to write to the file."}},required:["file_path","content"]}},Dx={name:"edit_file",category:"write",concurrencySafe:!1,description:"Perform an exact string replacement in a file. Finds old_string and replaces it with new_string. The edit fails if old_string is not found or matches multiple locations (unless replace_all is true). Always use read_file first to verify the exact content before editing.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to edit."},old_string:{type:"string",description:"The exact string to find and replace. Must match file content exactly."},new_string:{type:"string",description:"The replacement string."},replace_all:{type:"boolean",description:"If true, replace all occurrences. If false (default), fail when multiple matches exist."}},required:["file_path","old_string","new_string"]}},Lx={name:"glob",category:"read",concurrencySafe:!0,description:'Find files matching a glob pattern. Returns matching file paths, capped at 500 results. Use for discovering files before reading them. Patterns follow standard glob syntax (e.g., "src/**/*.ts", "*.json").',input_schema:{type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match (e.g., "src/**/*.ts").'},path:{type:"string",description:"Base directory to search from. Defaults to the current working directory."}},required:["pattern"]}},Fx={name:"grep",category:"read",concurrencySafe:!0,description:"Search file contents for lines matching a pattern. Returns matches in file:line:content format. Uses grep -rn (or ripgrep if available). Output is capped to prevent overflow. Use for finding symbols, strings, or patterns across the codebase.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Search pattern (basic regex by default)."},path:{type:"string",description:"Directory or file to search. Defaults to current working directory."},include:{type:"string",description:'File glob to restrict search (e.g., "*.ts"). Passed as --include to grep.'}},required:["pattern"]}},Nx={name:"list_directory",category:"read",concurrencySafe:!0,description:"List the contents of a directory. Returns file and subdirectory names with type annotations (directories end with /). Use for exploring project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Absolute path to the directory to list."}},required:["path"]}},Ux={name:"send_telegram",category:"web",concurrencySafe:!1,riskClass:"caution",description:"Send a Telegram message to the operator. Use to surface terminal-state notifications, blocking questions, or important status updates when the user is away from keyboard (AFK). The message is delivered through the same Telegram bot the operator uses to drive this session, to every chat ID in `AFK_TELEGRAM_ALLOWED_CHAT_IDS` (typically just the operator).\n\nPlain text only \u2014 Telegram's 4096-character limit per message is enforced. Returns an error if Telegram is not configured (missing `TELEGRAM_BOT_TOKEN` or empty allowlist) so the tool is safe to attempt unconditionally.\n\nUse sparingly: this is a real push notification to a human. Reserve for terminal states (Done/Blocked/Asking) and material progress, not running commentary. When running inside the Telegram bot, prefer replying normally \u2014 your response already reaches the operator through the bot. Use this tool only from CLI or daemon sessions.",input_schema:{type:"object",properties:{message:{type:"string",description:"Plain-text message body to send to the operator. Max 4096 characters (Telegram API limit). Must be non-empty."}},required:["message"]}},jx={name:"web_scrape",category:"web",concurrencySafe:!0,description:'Scrape a web page or run a web search and return text content suitable for reasoning over. Three modes:\n\n- `markdown` (default): converts the target URL to clean markdown via Jina Reader (https://r.jina.ai). Handles JS-rendered pages because rendering happens server-side. Use this for articles, docs, blog posts, and most "I want to read this page" cases.\n- `raw`: GETs the URL directly with no transformation. Use for JSON APIs, robots.txt, RSS, plain-text endpoints, or when you need the literal bytes.\n- `search`: queries Jina Web Search (https://s.jina.ai) and returns ranked markdown results. Use when you need to FIND a URL, not read one. Provide `query` instead of `url`.\n\nIf `JINA_API_KEY` is set in the environment, it is sent as a bearer token to the two Jina-backed modes \u2014 anonymous requests work but are heavily rate-limited.\n\nOutputs are capped at `max_bytes` UTF-8 bytes (default 1MB, ceiling 10MB) and the request is aborted after `timeout_ms` (default 30000, ceiling 120000).',input_schema:{type:"object",properties:{mode:{type:"string",enum:["markdown","raw","search"],description:'Fetch mode. Defaults to "markdown".'},url:{type:"string",description:"Absolute http(s) URL. Required for markdown and raw modes. Ignored in search mode."},query:{type:"string",description:"Search query string. Required for search mode. Ignored otherwise."},timeout_ms:{type:"number",description:"Request timeout in milliseconds (default 30000, clamped to 120000)."},max_bytes:{type:"number",description:"Maximum UTF-8 bytes returned. Content beyond this is truncated with a marker. Default 1000000, clamped to 10000000."}},required:[]}},In={name:"agent",category:"subagent",concurrencySafe:!0,description:`Dispatch an independent subagent with its own context window and tool access. Use for tasks that protect the main session's context: codebase exploration, multi-file inspection, repo search, verification, debugging, failing-test investigation, PR review, parallel hypothesis testing, independent re-derivation of a claim, audit work, stale-path detection, feature-wiring checks, and any research-shaped investigation.
1374
+ ${R}`);if(M.status!=="succeeded")throw new Error(`qualify iteration ${_} failed: ${ve(M)}`);let $=M.message?.content||"",{verdict:N,score:j,feedback:z}=Lm($),V={iteration:_,verdict:N,score:j,feedback:z};if(d.push(V),c=await it({event:"forge.qualify_iteration",iteration:_,verdict:N,score:j||null,feedback:z||null}),N==="APPROVE"){u="APPROVED";break}else if(N==="SALVAGE"&&_<l){let I=y["qualify-rework.md"];if(!I)throw new Error("forge skill missing qualify-rework.md prompt");let L=I.replace("{feedback}",z).replace("{original_skill}",R),D=await(await new q({apiKey:r}).forkSubagent({parent:{sessionId:t.sessionId},config:{model:"sonnet",systemPrompt:L},idPrefix:`forge-rework-${_}`,...o?{parentId:o}:{}})).runToResult("Refine the skill based on the feedback.");if(D.status!=="succeeded")throw new Error(`rework iteration ${_} failed: ${ve(D)}`);if(R=D.message?.content||"",!R)throw new Error(`rework iteration ${_} returned no output`)}else N==="REJECT"&&_>=l&&(u="MAX_ITERATIONS")}if(u==="APPROVED"){let _=_x(R);if(!_.ok)throw c=await it({event:"forge.write_failed",reason:_.reason,skill_name_attempted:_.skillNameAttempted}),new Error(`forge write-step invariant failed (${_.reason}): ${_.message}`);let C=_.skillName,A=Cx(C,{skillsDir:ao(),registeredSkills:mt()});if(A)throw c=await it({event:"forge.write_failed",reason:A.reason,skill_name_attempted:A.skillNameAttempted}),new Error(`forge write-step invariant failed (${A.reason}): ${A.message}`);let O=Lt(ao(),C);await Fm(O,{recursive:!0});let M=Lt(O,"SKILL.md");await Nm(M,R,"utf-8");let $;try{$=await hx(M,"utf-8")}catch{$=""}if(!$.startsWith("---"))throw c=await it({event:"forge.write_failed",reason:"readback_failed",skill_name_attempted:C}),new Error(`forge write-step invariant failed (readback_failed): written file at ${M} did not read back with expected frontmatter`);p=M,b&&f&&await Xl(f,"consumed"),c=await it({event:"forge.complete",status:"APPROVED",skill_name:C,iterations:d.length})}else u==="MAX_ITERATIONS"&&(b&&f&&await Xl(f,"failed"),c=await it({event:"forge.complete",status:"MAX_ITERATIONS",skill_name_attempted:h||null,iterations:d.length}))}catch(g){throw c=await it({event:"forge.error",error:g instanceof Error?g.message:String(g)}),g}return{status:u,skill_path:p,qualify_verdicts:d,brief_id:f,telemetry_ref:c}}var Px={name:"forge",description:'Creates new amplifier skills gated by forge-gate-check, with autonomous gap discovery, skill generation, and qualify iteration loop \u22643\xD7. Writes approved skills and appends telemetry to shared JSONL with surface: "afk".',handler:Ix,argumentHint:"[--brief <path>]",whenToUse:"When the user wants to grow the plugin with a new amplifier skill \u2014 autonomously generates and validates one.",flags:["--brief"]};Ke(Px);F();import yc from"path";import{appendFileSync as YR,mkdirSync as XR}from"fs";import{dirname as QR}from"path";import Zl from"path";import{appendFileSync as Vx,mkdirSync as Yx}from"fs";import{dirname as Xx}from"path";function Ql(e,t){return t?.allowedTools?t.allowedTools.includes(e)?{allowed:!0}:{allowed:!1,reason:`Tool "${e}" is not in the configured allowlist`}:{allowed:!0}}F();var Mx={name:"bash",category:"shell",concurrencySafe:!1,description:"Execute a shell command and return its stdout and stderr. Use for running programs, installing packages, git operations, and any task that requires a shell. Commands run in the user's default shell. Long-running commands should use timeout_ms. Output is capped at ~100KB; excess is truncated with a notice.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute."},timeout_ms:{type:"number",description:"Optional timeout in milliseconds (default 120000, max 600000). The command is killed if it exceeds this duration."}},required:["command"]}},Ox={name:"read_file",category:"read",concurrencySafe:!0,description:"Read a file from the filesystem. Returns the file content with line numbers. Use offset and limit to read specific sections of large files. When the read returns a partial view, the response ends with a `... (showing lines X-Y of Z [\u2014 pass offset=N to continue])` annotation indicating the full file size and how to continue. Binary files are detected and rejected. Missing files return an error.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-based). Defaults to 1."},limit:{type:"number",description:"Maximum number of lines to read. Defaults to 2000."}},required:["file_path"]}},$x={name:"write_file",category:"write",concurrencySafe:!1,description:"Write content to a file, creating it if it does not exist or overwriting if it does. Parent directories are created automatically. Prefer edit_file for modifying existing files \u2014 use write_file only for new files or complete rewrites.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"The full content to write to the file."}},required:["file_path","content"]}},Dx={name:"edit_file",category:"write",concurrencySafe:!1,description:"Perform an exact string replacement in a file. Finds old_string and replaces it with new_string. The edit fails if old_string is not found or matches multiple locations (unless replace_all is true). Always use read_file first to verify the exact content before editing.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to edit."},old_string:{type:"string",description:"The exact string to find and replace. Must match file content exactly."},new_string:{type:"string",description:"The replacement string."},replace_all:{type:"boolean",description:"If true, replace all occurrences. If false (default), fail when multiple matches exist."}},required:["file_path","old_string","new_string"]}},Lx={name:"glob",category:"read",concurrencySafe:!0,description:'Find files matching a glob pattern. Returns matching file paths, capped at 500 results. Use for discovering files before reading them. Patterns follow standard glob syntax (e.g., "src/**/*.ts", "*.json").',input_schema:{type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match (e.g., "src/**/*.ts").'},path:{type:"string",description:"Base directory to search from. Defaults to the current working directory."}},required:["pattern"]}},Fx={name:"grep",category:"read",concurrencySafe:!0,description:"Search file contents for lines matching a pattern. Returns matches in file:line:content format. Uses grep -rn (or ripgrep if available). Output is capped to prevent overflow. Use for finding symbols, strings, or patterns across the codebase.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Search pattern (basic regex by default)."},path:{type:"string",description:"Directory or file to search. Defaults to current working directory."},include:{type:"string",description:'File glob to restrict search (e.g., "*.ts"). Passed as --include to grep.'}},required:["pattern"]}},Nx={name:"list_directory",category:"read",concurrencySafe:!0,description:"List the contents of a directory. Returns file and subdirectory names with type annotations (directories end with /). Use for exploring project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Absolute path to the directory to list."}},required:["path"]}},Ux={name:"send_telegram",category:"web",concurrencySafe:!1,riskClass:"caution",description:"Send a Telegram message to the operator. Use to surface terminal-state notifications, blocking questions, or important status updates when the user is away from keyboard (AFK). The message is delivered through the same Telegram bot the operator uses to drive this session, to every chat ID in `AFK_TELEGRAM_ALLOWED_CHAT_IDS` (typically just the operator).\n\nPlain text only \u2014 Telegram's 4096-character limit per message is enforced. Returns an error if Telegram is not configured (missing `TELEGRAM_BOT_TOKEN` or empty allowlist) so the tool is safe to attempt unconditionally.\n\nUse sparingly: this is a real push notification to a human. Reserve for terminal states (Done/Blocked/Asking) and material progress, not running commentary. When running inside the Telegram bot, prefer replying normally \u2014 your response already reaches the operator through the bot. Use this tool only from CLI or daemon sessions.",input_schema:{type:"object",properties:{message:{type:"string",description:"Plain-text message body to send to the operator. Max 4096 characters (Telegram API limit). Must be non-empty."}},required:["message"]}},jx={name:"web_scrape",category:"web",concurrencySafe:!0,description:'Scrape a web page or run a web search and return text content suitable for reasoning over. Three modes:\n\n- `markdown` (default): converts the target URL to clean markdown via Jina Reader (https://r.jina.ai). Handles JS-rendered pages because rendering happens server-side. Use this for articles, docs, blog posts, and most "I want to read this page" cases.\n- `raw`: GETs the URL directly with no transformation. Use for JSON APIs, robots.txt, RSS, plain-text endpoints, or when you need the literal bytes.\n- `search`: queries Jina Web Search (https://s.jina.ai) and returns ranked markdown results. Use when you need to FIND a URL, not read one. Provide `query` instead of `url`.\n\nIf `JINA_API_KEY` is set in the environment, it is sent as a bearer token to the two Jina-backed modes \u2014 anonymous requests work but are heavily rate-limited.\n\nOutputs are capped at `max_bytes` UTF-8 bytes (default 1MB, ceiling 10MB) and the request is aborted after `timeout_ms` (default 30000, ceiling 120000).',input_schema:{type:"object",properties:{mode:{type:"string",enum:["markdown","raw","search"],description:'Fetch mode. Defaults to "markdown".'},url:{type:"string",description:"Absolute http(s) URL. Required for markdown and raw modes. Ignored in search mode."},query:{type:"string",description:"Search query string. Required for search mode. Ignored otherwise."},timeout_ms:{type:"number",description:"Request timeout in milliseconds (default 30000, clamped to 120000)."},max_bytes:{type:"number",description:"Maximum UTF-8 bytes returned. Content beyond this is truncated with a marker. Default 1000000, clamped to 10000000."}},required:[]}},In={name:"agent",category:"subagent",concurrencySafe:!0,description:`Dispatch an independent subagent with its own context window and tool access. Use for tasks that protect the main session's context: codebase exploration, multi-file inspection, repo search, verification, debugging, failing-test investigation, PR review, parallel hypothesis testing, independent re-derivation of a claim, audit work, stale-path detection, feature-wiring checks, and any research-shaped investigation.
1375
1375
 
1376
1376
  Parallelize: dispatch multiple \`agent\` calls in a single tool-use turn to run independent investigations concurrently.
1377
1377
 
@@ -1396,12 +1396,12 @@ SECURITY NOTE: upstream node output injected into downstream prompts is user-con
1396
1396
  [output truncated \u2014 exceeded 100KB]`),u({content:v,...R!==void 0?{testResult:R}:{}})}),p.on("error",w=>{u({content:`Failed to execute: ${w.message}`,isError:!0})})}))}}var Km=Js("default");import{promises as SA}from"fs";import tc from"path";function at(e,t,n="read"){let r=t?.resolveBase??t?.cwd,o=tc.isAbsolute(e)?e:tc.resolve(r??process.cwd(),e);if(r===void 0)return o;let s=n==="read"?t?.readRoots??[r]:t?.writeRoots??[r];for(let l of s)if(!tc.relative(l,o).startsWith(".."))return o;let i=s.map(l=>`\`${l}\``).join(", "),a=n==="read"?"read roots":"write roots";throw new Error(`Path \`${e}\` is outside the allowed ${a} [${i}].`)}var Gm=async(e,t,n)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let r=e,o=r.file_path,s=r.offset??1,i=r.limit??2e3;if(typeof o!="string")return{content:"Invalid input: file_path must be a string",isError:!0};if(typeof s!="number"||s<1)return{content:"Invalid input: offset must be a positive number",isError:!0};if(typeof i!="number"||i<1)return{content:"Invalid input: limit must be a positive number",isError:!0};let a;try{a=at(o,n,"read")}catch(l){return{content:l instanceof Error?l.message:String(l),isError:!0}}try{let l=await SA.readFile(a),c=Math.min(8192,l.length);for(let S=0;S<c;S++)if(l[S]===0)return{content:`File appears to be binary: ${a}`,isError:!0};let d=l.toString("utf-8");if(d.length===0)return{content:""};let u=d.split(`
1397
1397
  `),p=Math.max(0,s-1),f=Math.min(u.length,p+i),g=u.slice(p,f),h=u.length;if(g.length===0)return{content:`... (offset ${s} is past end of file \u2014 file has ${h} lines)`};let b=String(h).length,y=g.map((S,T)=>{let x=p+T+1;return`${String(x).padStart(b," ")} ${S}`}).join(`
1398
1398
  `);if(g.length<h){let S=p+1,T=p+g.length,x=T<h?` \u2014 pass offset=${T+1} to continue`:"";return{content:`${y}
1399
- ... (showing lines ${S}-${T} of ${h}${x})`}}return{content:y}}catch(l){if(l instanceof Error){let c=l;return c.code==="ENOENT"?{content:`File not found: ${a}`,isError:!0}:c.code==="EACCES"?{content:`Permission denied: ${a}`,isError:!0}:{content:`Error reading file: ${l.message}`,isError:!0}}return{content:"Unknown error reading file",isError:!0}}};H();import{readFile as _A,writeFile as CA,mkdir as IA,stat as PA}from"fs/promises";import{dirname as MA}from"path";H();import{realpathSync as zm}from"fs";import{dirname as vA,resolve as Vs,join as TA}from"path";import{homedir as sn}from"os";var EA=[`${sn()}/.ssh`,`${sn()}/.aws`,`${sn()}/.gnupg`,`${sn()}/.config/gcloud`,"/etc","/System","/private/etc","/usr/local/etc",`${sn()}/.afk/config`,`${sn()}/.afk/state`,`${sn()}/.npmrc`,`${sn()}/.docker/config.json`];function xA(){let e=E.AFK_WRITE_DENYLIST,t=e?e.split(":").map(n=>nc(Vs(n))).filter(Boolean):[];return[...EA.map(n=>nc(Vs(n))),...t]}function nc(e){let t=Vs(e);try{return zm(t)}catch{}let n=[],r=t;for(let o=0;o<64;o++){let s=vA(r);if(s===r)break;n.unshift(r.slice(s.length+1)),r=s;try{let i=zm(r);return TA(i,...n)}catch{}}return t}function Ys(e,t="write_file"){let n=nc(Vs(e));for(let r of xA())if(n===r||n.startsWith(r+"/"))throw new Error(`${t}: refusing to write to protected path: ${n} (matches denylist entry: ${r})`)}function qm(e){if(e==="")return[];let t=e.split(/\r?\n/);return t.length>0&&t[t.length-1]===""&&/\r?\n$/.test(e)&&t.pop(),t}function AA(e,t){let n=e.length,r=t.length;if((n+1)*(r+1)>=4e6){let c=[];for(let d of e)c.push({op:"del",text:d});for(let d of t)c.push({op:"add",text:d});return c}let o=r+1,s=new Int32Array((n+1)*o);for(let c=1;c<=n;c++)for(let d=1;d<=r;d++)if(e[c-1]===t[d-1])s[c*o+d]=s[(c-1)*o+(d-1)]+1;else{let u=s[(c-1)*o+d],p=s[c*o+(d-1)];s[c*o+d]=u>=p?u:p}let i=[],a=n,l=r;for(;a>0||l>0;)a>0&&l>0&&e[a-1]===t[l-1]?(i.push({op:"same",text:e[a-1]}),a--,l--):l>0&&(a===0||s[a*o+(l-1)]>=s[(a-1)*o+l])?(i.push({op:"add",text:t[l-1]}),l--):(i.push({op:"del",text:e[a-1]}),a--);return i.reverse(),i}function RA(e){let t=new Int32Array(e.length+1);t[e.length]=e.length;for(let i=e.length-1;i>=0;i--)t[i]=e[i].op==="same"?t[i+1]:i;let n=[],r=1,o=1,s=0;for(;s<e.length;){if(e[s].op==="same"){r++,o++,s++;continue}let i=s,a=0;for(;i>0&&e[i-1].op==="same"&&a<3;)i--,a++;let l=Math.max(1,r-a),c=Math.max(1,o-a),d=[],u=0,p=0;for(let g=i;g<s;g++)d.push({kind:" ",text:e[g].text}),u++,p++;let f=!1;for(;!f&&s<e.length;){let g=e[s];if(g.op==="same"){let h=t[s],b=h-s;if(h===e.length||b>6){for(let S=0;S<3&&s<e.length&&e[s].op==="same";S++)d.push({kind:" ",text:e[s].text}),u++,p++,r++,o++,s++;f=!0}else d.push({kind:" ",text:g.text}),u++,p++,r++,o++,s++}else g.op==="add"?(d.push({kind:"+",text:g.text}),p++,o++,s++):(d.push({kind:"-",text:g.text}),u++,r++,s++)}n.push({oldStart:l,oldLines:u,newStart:c,newLines:p,lines:d})}return n}function Xs(e,t){if(e===t)return null;let n=qm(e),r=qm(t),o=AA(n,r),s=RA(o);if(s.length===0)return null;let i=0,a=0;for(let l of s)for(let c of l.lines)c.kind==="+"?i++:c.kind==="-"&&a++;return{hunks:s,addedLines:i,removedLines:a}}function OA(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.content!="string")throw new Error('Input must have a "content" field of type string');return{file_path:t.file_path,content:t.content}}var Jm=async(e,t,n)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:r,content:o}=OA(e),s;try{s=at(r,n,"write")}catch(i){return{content:i instanceof Error?i.message:String(i),isError:!0}}try{Ys(s,"write_file");let i=(()=>{let p=E.AFK_WRITE_DIFF;if(p===void 0)return!1;let f=p.trim().toLowerCase();return f==="0"||f==="false"||f==="no"||f==="off"})(),a=10*1024*1024,l=null;if(!i)try{let p=await PA(s);if(p.size>a)E.AFK_DEBUG&&console.debug(`[write_file] skipping diff: prior file ${p.size} bytes > ${a}`);else{let f=await _A(s);try{l=new TextDecoder("utf-8",{fatal:!0}).decode(f)}catch{l=null}}}catch(p){p instanceof Error&&"code"in p&&p.code==="ENOENT"&&(l="")}let c=MA(s);await IA(c,{recursive:!0}),await CA(s,o,{signal:t});let d=null;if(l!==null&&!o.includes("\0")){let p=performance.now();d=Xs(l,o);let f=performance.now()-p;f>=500?console.warn(`[write_file] computeLineDiff took ${f.toFixed(1)}ms`):f>=50&&E.AFK_DEBUG&&console.debug(`[write_file] computeLineDiff took ${f.toFixed(1)}ms`)}return{content:`Wrote ${Buffer.byteLength(o,"utf8")} bytes to ${s}`,...d?{render:{diff:d}}:{}}}catch(i){return i instanceof Error?"code"in i&&i.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error writing file: ${i.message}`,isError:!0}:{content:"Unknown error writing file",isError:!0}}};H();import{readFile as $A,writeFile as DA}from"fs/promises";function LA(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.old_string!="string")throw new Error('Input must have an "old_string" field of type string');if(typeof t.new_string!="string")throw new Error('Input must have a "new_string" field of type string');let n=!1;if(t.replace_all!==void 0){if(typeof t.replace_all!="boolean")throw new Error("replace_all must be a boolean");n=t.replace_all}return{file_path:t.file_path,old_string:t.old_string,new_string:t.new_string,replace_all:n}}function FA(e,t){if(t.length===0)return 0;let n=0,r=0;for(;(r=e.indexOf(t,r))!==-1;)n++,r+=t.length;return n}var Vm=async(e,t,n)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:r,old_string:o,new_string:s,replace_all:i}=LA(e),a;try{a=at(r,n,"write")}catch(l){return{content:l instanceof Error?l.message:String(l),isError:!0}}try{Ys(a,"edit_file");let l=await $A(a,"utf-8"),c=FA(l,o);if(c===0)return{content:`old_string not found in ${a}`,isError:!0};if(c>1&&!i)return{content:`old_string matches ${c} locations in ${a}. Use replace_all: true or provide more context.`,isError:!0};let d;if(i)d=l.split(o).join(s);else{let h=l.indexOf(o);d=l.slice(0,h)+s+l.slice(h+o.length)}await DA(a,d,"utf-8");let u=c===1?`Replaced 1 occurrence in ${a}`:`Replaced ${c} occurrences in ${a}`,p=performance.now(),f=Xs(l,d),g=performance.now()-p;return g>=500?console.warn(`[edit_file] computeLineDiff took ${g.toFixed(1)}ms`):g>=50&&E.AFK_DEBUG&&console.debug(`[edit_file] computeLineDiff took ${g.toFixed(1)}ms`),{content:u,...f?{render:{diff:f}}:{}}}catch(l){return{content:`Error: ${l instanceof Error?l.message:String(l)}`,isError:!0}}};import{promises as Xm}from"fs";import NA from"path";function UA(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");if(r.includes("**")){let s=r.split("**"),i=0;for(let a=0;a<s.length;a++){let l=s[a]??"",c=Ym(l);if(a===0){let d=n.match(new RegExp(`^${c}`));if(!d)return!1;i=d[0].length}else if(a===s.length-1){let d=new RegExp(`${c}$`);if(!n.slice(i).match(d))return!1}else{let d=new RegExp(c),u=n.slice(i).match(d);if(!u)return!1;let p=u.index??0;i+=p+u[0].length}}return!0}return new RegExp(`^${Ym(r)}$`).test(n)}function Ym(e){return e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")}async function jA(e,t){let n=[];async function o(s,i){if(n.length>=500)return!0;try{let a=await Xm.readdir(s,{withFileTypes:!0});for(let l of a){if(n.length>=500)return!0;let c=NA.join(s,l.name),d=i?`${i}/${l.name}`:l.name;if(UA(d,t)&&n.push(d),l.isDirectory()&&await o(c,d))return!0}}catch{}return!1}return await o(e,""),n}function rc(e){return async(t,n,r)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t,s=o.pattern,i=o.path??r?.resolveBase??r?.cwd??e??process.cwd();if(typeof s!="string")return{content:"Invalid input: pattern must be a string",isError:!0};if(s.trim()==="")return{content:"Invalid input: pattern cannot be empty",isError:!0};if(typeof i!="string")return{content:"Invalid input: path must be a string",isError:!0};let a;try{a=at(i,r,"read")}catch(l){return{content:l instanceof Error?l.message:String(l),isError:!0}}try{if(!(await Xm.stat(a)).isDirectory())return{content:`Invalid input: path is not a directory: ${a}`,isError:!0};let c=await jA(a,s);if(c.length===0)return{content:`No files matched pattern '${s}' in ${a}`};let d=c.join(`
1399
+ ... (showing lines ${S}-${T} of ${h}${x})`}}return{content:y}}catch(l){if(l instanceof Error){let c=l;return c.code==="ENOENT"?{content:`File not found: ${a}`,isError:!0}:c.code==="EACCES"?{content:`Permission denied: ${a}`,isError:!0}:{content:`Error reading file: ${l.message}`,isError:!0}}return{content:"Unknown error reading file",isError:!0}}};K();import{readFile as _A,writeFile as CA,mkdir as IA,stat as PA}from"fs/promises";import{dirname as MA}from"path";K();import{realpathSync as zm}from"fs";import{dirname as vA,resolve as Vs,join as TA}from"path";import{homedir as sn}from"os";var EA=[`${sn()}/.ssh`,`${sn()}/.aws`,`${sn()}/.gnupg`,`${sn()}/.config/gcloud`,"/etc","/System","/private/etc","/usr/local/etc",`${sn()}/.afk/config`,`${sn()}/.afk/state`,`${sn()}/.npmrc`,`${sn()}/.docker/config.json`];function xA(){let e=E.AFK_WRITE_DENYLIST,t=e?e.split(":").map(n=>nc(Vs(n))).filter(Boolean):[];return[...EA.map(n=>nc(Vs(n))),...t]}function nc(e){let t=Vs(e);try{return zm(t)}catch{}let n=[],r=t;for(let o=0;o<64;o++){let s=vA(r);if(s===r)break;n.unshift(r.slice(s.length+1)),r=s;try{let i=zm(r);return TA(i,...n)}catch{}}return t}function Ys(e,t="write_file"){let n=nc(Vs(e));for(let r of xA())if(n===r||n.startsWith(r+"/"))throw new Error(`${t}: refusing to write to protected path: ${n} (matches denylist entry: ${r})`)}function qm(e){if(e==="")return[];let t=e.split(/\r?\n/);return t.length>0&&t[t.length-1]===""&&/\r?\n$/.test(e)&&t.pop(),t}function AA(e,t){let n=e.length,r=t.length;if((n+1)*(r+1)>=4e6){let c=[];for(let d of e)c.push({op:"del",text:d});for(let d of t)c.push({op:"add",text:d});return c}let o=r+1,s=new Int32Array((n+1)*o);for(let c=1;c<=n;c++)for(let d=1;d<=r;d++)if(e[c-1]===t[d-1])s[c*o+d]=s[(c-1)*o+(d-1)]+1;else{let u=s[(c-1)*o+d],p=s[c*o+(d-1)];s[c*o+d]=u>=p?u:p}let i=[],a=n,l=r;for(;a>0||l>0;)a>0&&l>0&&e[a-1]===t[l-1]?(i.push({op:"same",text:e[a-1]}),a--,l--):l>0&&(a===0||s[a*o+(l-1)]>=s[(a-1)*o+l])?(i.push({op:"add",text:t[l-1]}),l--):(i.push({op:"del",text:e[a-1]}),a--);return i.reverse(),i}function RA(e){let t=new Int32Array(e.length+1);t[e.length]=e.length;for(let i=e.length-1;i>=0;i--)t[i]=e[i].op==="same"?t[i+1]:i;let n=[],r=1,o=1,s=0;for(;s<e.length;){if(e[s].op==="same"){r++,o++,s++;continue}let i=s,a=0;for(;i>0&&e[i-1].op==="same"&&a<3;)i--,a++;let l=Math.max(1,r-a),c=Math.max(1,o-a),d=[],u=0,p=0;for(let g=i;g<s;g++)d.push({kind:" ",text:e[g].text}),u++,p++;let f=!1;for(;!f&&s<e.length;){let g=e[s];if(g.op==="same"){let h=t[s],b=h-s;if(h===e.length||b>6){for(let S=0;S<3&&s<e.length&&e[s].op==="same";S++)d.push({kind:" ",text:e[s].text}),u++,p++,r++,o++,s++;f=!0}else d.push({kind:" ",text:g.text}),u++,p++,r++,o++,s++}else g.op==="add"?(d.push({kind:"+",text:g.text}),p++,o++,s++):(d.push({kind:"-",text:g.text}),u++,r++,s++)}n.push({oldStart:l,oldLines:u,newStart:c,newLines:p,lines:d})}return n}function Xs(e,t){if(e===t)return null;let n=qm(e),r=qm(t),o=AA(n,r),s=RA(o);if(s.length===0)return null;let i=0,a=0;for(let l of s)for(let c of l.lines)c.kind==="+"?i++:c.kind==="-"&&a++;return{hunks:s,addedLines:i,removedLines:a}}function OA(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.content!="string")throw new Error('Input must have a "content" field of type string');return{file_path:t.file_path,content:t.content}}var Jm=async(e,t,n)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:r,content:o}=OA(e),s;try{s=at(r,n,"write")}catch(i){return{content:i instanceof Error?i.message:String(i),isError:!0}}try{Ys(s,"write_file");let i=(()=>{let p=E.AFK_WRITE_DIFF;if(p===void 0)return!1;let f=p.trim().toLowerCase();return f==="0"||f==="false"||f==="no"||f==="off"})(),a=10*1024*1024,l=null;if(!i)try{let p=await PA(s);if(p.size>a)E.AFK_DEBUG&&console.debug(`[write_file] skipping diff: prior file ${p.size} bytes > ${a}`);else{let f=await _A(s);try{l=new TextDecoder("utf-8",{fatal:!0}).decode(f)}catch{l=null}}}catch(p){p instanceof Error&&"code"in p&&p.code==="ENOENT"&&(l="")}let c=MA(s);await IA(c,{recursive:!0}),await CA(s,o,{signal:t});let d=null;if(l!==null&&!o.includes("\0")){let p=performance.now();d=Xs(l,o);let f=performance.now()-p;f>=500?console.warn(`[write_file] computeLineDiff took ${f.toFixed(1)}ms`):f>=50&&E.AFK_DEBUG&&console.debug(`[write_file] computeLineDiff took ${f.toFixed(1)}ms`)}return{content:`Wrote ${Buffer.byteLength(o,"utf8")} bytes to ${s}`,...d?{render:{diff:d}}:{}}}catch(i){return i instanceof Error?"code"in i&&i.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error writing file: ${i.message}`,isError:!0}:{content:"Unknown error writing file",isError:!0}}};K();import{readFile as $A,writeFile as DA}from"fs/promises";function LA(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.file_path!="string")throw new Error('Input must have a "file_path" field of type string');if(typeof t.old_string!="string")throw new Error('Input must have an "old_string" field of type string');if(typeof t.new_string!="string")throw new Error('Input must have a "new_string" field of type string');let n=!1;if(t.replace_all!==void 0){if(typeof t.replace_all!="boolean")throw new Error("replace_all must be a boolean");n=t.replace_all}return{file_path:t.file_path,old_string:t.old_string,new_string:t.new_string,replace_all:n}}function FA(e,t){if(t.length===0)return 0;let n=0,r=0;for(;(r=e.indexOf(t,r))!==-1;)n++,r+=t.length;return n}var Vm=async(e,t,n)=>{if(t.aborted)return{content:"Aborted",isError:!0};let{file_path:r,old_string:o,new_string:s,replace_all:i}=LA(e),a;try{a=at(r,n,"write")}catch(l){return{content:l instanceof Error?l.message:String(l),isError:!0}}try{Ys(a,"edit_file");let l=await $A(a,"utf-8"),c=FA(l,o);if(c===0)return{content:`old_string not found in ${a}`,isError:!0};if(c>1&&!i)return{content:`old_string matches ${c} locations in ${a}. Use replace_all: true or provide more context.`,isError:!0};let d;if(i)d=l.split(o).join(s);else{let h=l.indexOf(o);d=l.slice(0,h)+s+l.slice(h+o.length)}await DA(a,d,"utf-8");let u=c===1?`Replaced 1 occurrence in ${a}`:`Replaced ${c} occurrences in ${a}`,p=performance.now(),f=Xs(l,d),g=performance.now()-p;return g>=500?console.warn(`[edit_file] computeLineDiff took ${g.toFixed(1)}ms`):g>=50&&E.AFK_DEBUG&&console.debug(`[edit_file] computeLineDiff took ${g.toFixed(1)}ms`),{content:u,...f?{render:{diff:f}}:{}}}catch(l){return{content:`Error: ${l instanceof Error?l.message:String(l)}`,isError:!0}}};import{promises as Xm}from"fs";import NA from"path";function UA(e,t){let n=e.replace(/\\/g,"/"),r=t.replace(/\\/g,"/");if(r.includes("**")){let s=r.split("**"),i=0;for(let a=0;a<s.length;a++){let l=s[a]??"",c=Ym(l);if(a===0){let d=n.match(new RegExp(`^${c}`));if(!d)return!1;i=d[0].length}else if(a===s.length-1){let d=new RegExp(`${c}$`);if(!n.slice(i).match(d))return!1}else{let d=new RegExp(c),u=n.slice(i).match(d);if(!u)return!1;let p=u.index??0;i+=p+u[0].length}}return!0}return new RegExp(`^${Ym(r)}$`).test(n)}function Ym(e){return e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")}async function jA(e,t){let n=[];async function o(s,i){if(n.length>=500)return!0;try{let a=await Xm.readdir(s,{withFileTypes:!0});for(let l of a){if(n.length>=500)return!0;let c=NA.join(s,l.name),d=i?`${i}/${l.name}`:l.name;if(UA(d,t)&&n.push(d),l.isDirectory()&&await o(c,d))return!0}}catch{}return!1}return await o(e,""),n}function rc(e){return async(t,n,r)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t,s=o.pattern,i=o.path??r?.resolveBase??r?.cwd??e??process.cwd();if(typeof s!="string")return{content:"Invalid input: pattern must be a string",isError:!0};if(s.trim()==="")return{content:"Invalid input: pattern cannot be empty",isError:!0};if(typeof i!="string")return{content:"Invalid input: path must be a string",isError:!0};let a;try{a=at(i,r,"read")}catch(l){return{content:l instanceof Error?l.message:String(l),isError:!0}}try{if(!(await Xm.stat(a)).isDirectory())return{content:`Invalid input: path is not a directory: ${a}`,isError:!0};let c=await jA(a,s);if(c.length===0)return{content:`No files matched pattern '${s}' in ${a}`};let d=c.join(`
1400
1400
  `);return c.length>=500&&(d+=`
1401
1401
  [results capped at 500 entries]`),{content:d}}catch(l){return l instanceof Error?"code"in l&&l.code==="ENOENT"?{content:`Path not found: ${a}`,isError:!0}:"code"in l&&l.code==="EACCES"?{content:`Permission denied: ${a}`,isError:!0}:{content:`Error scanning directory: ${l.message}`,isError:!0}:{content:"Unknown error scanning directory",isError:!0}}}}var Qm=rc();import{spawn as BA}from"child_process";function WA(e,t,n){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let r=e;if(typeof r.pattern!="string")throw new Error('Input must have a "pattern" field of type string');let o=typeof r.path=="string"?r.path:t?.resolveBase??t?.cwd??n??process.cwd(),s=at(o,t,"read"),i;if(r.include!==void 0){if(typeof r.include!="string")throw new Error("include must be a string");i=r.include}return{pattern:r.pattern,path:s,include:i}}function Zm(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}function oc(e){return async(t,n,r)=>{let{pattern:o,path:s,include:i}=WA(t,r,e);return n.aborted?{content:"Search aborted",isError:!0}:new Promise(a=>{let l=!1;function c(T){l||(l=!0,n.removeEventListener("abort",S),a(T))}let d=["-rn"];i&&d.push(`--include=${i}`),d.push(o,s);let u=BA("grep",d,e!==void 0?{cwd:e}:{}),p="",f="",g=1e5,h=0,b=!1;function y(T){if(b||l||h<g)return;b=!0,console.warn(`[grep] overflow kill: stream=${T} totalBytes=${h} pattern=${o} path=${s}`),u.kill("SIGKILL");let x=(p+f).trimEnd();x=Zm(x),x.length>g&&(x=x.slice(0,g)),x+=`
1402
1402
  [output truncated]`,c({content:x})}u.stdout.on("data",T=>{let x=g-h,w=T.length<=x?T:T.subarray(0,Math.max(0,x));h+=w.length,p+=w.toString("utf8"),y("stdout")}),u.stderr.on("data",T=>{let x=g-h,w=T.length<=x?T:T.subarray(0,Math.max(0,x));h+=w.length,f+=w.toString("utf8"),y("stderr")});let S=()=>{u.kill(),c({content:"Search aborted",isError:!0})};n.addEventListener("abort",S),u.on("close",T=>{if(b)return;if(T===1){c({content:`No matches found for '${o}' in ${s}`});return}if(T===2){c({content:`grep error: ${f.trim()}`,isError:!0});return}let x=p.trimEnd();x=Zm(x),x.length>g&&(x=x.slice(0,g)+`
1403
1403
  [output truncated]`),c({content:x})}),u.on("error",T=>{c({content:`Failed to execute grep: ${T.message}`,isError:!0})})})}}var ef=oc();import{promises as HA}from"fs";var tf=async(e,t,n)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let o=e.path;if(typeof o!="string")throw new Error("Invalid input: path must be a string");let s;try{s=at(o,n,"read")}catch(i){return{content:i instanceof Error?i.message:String(i),isError:!0}}try{let i=await HA.readdir(s,{withFileTypes:!0}),a=i.filter(u=>u.isDirectory()).map(u=>`${u.name}/`),l=i.filter(u=>!u.isDirectory()).map(u=>u.name);a.sort(),l.sort();let c=[...a,...l];return c.length===0?{content:"(empty directory)"}:{content:c.join(`
1404
- `)}}catch(i){if(i instanceof Error){let a=i;return a.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${i.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};H();So();sc();var nf=4096;function GA(e=Zs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.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>nf)return{content:`Invalid input: message exceeds Telegram's ${nf}-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=Qs(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(i.size===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=[...i],l=[];for(let c of a){let d=await e({token:s,chatId:c,text:o});d.ok||l.push(`chat ${c}: ${d.errorMessage??`HTTP ${d.status}`}`)}return l.length===a.length?{content:`Failed to send Telegram message to any chat. ${l.join("; ")}`,isError:!0}:l.length>0?{content:`Sent Telegram message to ${a.length-l.length}/${a.length} chat(s); ${l.length} failed: ${l.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var rf=GA();var zA=`
1404
+ `)}}catch(i){if(i instanceof Error){let a=i;return a.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${i.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};K();So();sc();var nf=4096;function GA(e=Zs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.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>nf)return{content:`Invalid input: message exceeds Telegram's ${nf}-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=Qs(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(i.size===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=[...i],l=[];for(let c of a){let d=await e({token:s,chatId:c,text:o});d.ok||l.push(`chat ${c}: ${d.errorMessage??`HTTP ${d.status}`}`)}return l.length===a.length?{content:`Failed to send Telegram message to any chat. ${l.join("; ")}`,isError:!0}:l.length>0?{content:`Sent Telegram message to ${a.length-l.length}/${a.length} chat(s); ${l.length} failed: ${l.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var rf=GA();var zA=`
1405
1405
 
1406
1406
  [\u2026truncated by agent-afk web_scrape]`,qA="https://r.jina.ai/",JA="https://s.jina.ai/";function VA(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=3e4;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(t.timeout_ms,12e4)}let a=1e6;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,1e7)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function YA(e){return e.mode==="search"?`${JA}${encodeURIComponent(e.query)}`:e.mode==="markdown"?`${qA}${e.url}`:e.url}function XA(e,t){let n={"User-Agent":"agent-afk/web_scrape",Accept:e.mode==="raw"?"*/*":"text/plain, text/markdown, */*;q=0.5"};return(e.mode==="markdown"||e.mode==="search")&&t.JINA_API_KEY&&(n.Authorization=`Bearer ${t.JINA_API_KEY}`),n}function QA(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+zA}function ZA(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=VA(r);if("error"in s)return{content:s.error,isError:!0};let i=YA(s),a=XA(s,n);if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let l=new AbortController,c=()=>{l.abort(o.reason)},d;try{o.addEventListener("abort",c,{once:!0}),d=setTimeout(()=>{l.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let u;try{u=await t(i,{headers:a,signal:l.signal})}catch(g){if(l.signal.aborted){let h=l.signal.reason;return{content:`web_scrape aborted: ${h instanceof Error?h.message:String(h??"aborted")}`,isError:!0}}return{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i}`,isError:!0};let p;try{p=await u.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}return{content:QA(p,s.maxBytes)}}finally{d!==void 0&&clearTimeout(d),o.removeEventListener("abort",c)}}}var of=ZA();import{existsSync as cf,readFileSync as cR}from"node:fs";import{readFile as dR}from"node:fs/promises";import{join as uR}from"node:path";F();import{existsSync as af,mkdirSync as eR,readFileSync as tR,renameSync as nR,unlinkSync as rR,writeFileSync as oR}from"node:fs";import{dirname as sf,join as sR}from"node:path";import{randomBytes as iR}from"node:crypto";function lt(e){let t=e??Sl();if(!af(t))return[];try{let n=tR(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Dn(e,t){let n=t??Sl();eR(sf(n),{recursive:!0});let r=sR(sf(n),`.schedules.json.${process.pid}.${iR(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{oR(r,o,"utf-8"),nR(r,n)}catch(s){try{af(r)&&rR(r)}catch{}throw s}}function ti(e,t){let n=lt(t),r=n.map(l=>l.id),o=aR(e.name),s=lR(o,r),i=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),Dn(n,t),a}function ni(e,t){let n=lt(t),r=n.length,o=n.filter(s=>s.id!==e);return o.length===r?!1:(Dn(o,t),!0)}function vo(e,t){return lt(t).find(n=>n.id===e)}function aR(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function lR(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function lf(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{}}}F();async function ac(e,t,n){try{let r=uR(or("default"),"port");if(!cf(r))return;let o=cR(r,"utf-8").trim(),s=parseInt(o,10);if(Number.isNaN(s))return;await fetch(`http://localhost:${s}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)})}catch{}}var df=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=ti({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,enabled:typeof n.enabled=="boolean"?n.enabled:!0});return await ac("POST","/tasks",{taskId:o.id,command:o.command,cron:o.cron,trigger:o.trigger,notifyOn:o.notifyOn}),{content:JSON.stringify({id:o.id,name:o.name,cron:o.cron,enabled:o.enabled})}},uf=async(e,t)=>{let n=lt();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},pf=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,s=kt();if(!cf(s))return{content:JSON.stringify([])};let i;try{let c=await dR(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
1407
1407
  `),l=[];for(let c=a.length-1;c>=0;c-=1){let d=a[c];if(d)try{let u=JSON.parse(d);if(u.taskId!==r)continue;if(l.push(u),l.length>=o)break}catch{continue}}return{content:JSON.stringify(l.reverse())}},mf=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=n.permanent===!0;if(!vo(r))return{content:JSON.stringify({error:"task not found"})};if(o)ni(r),await ac("DELETE",`/tasks/${r}`);else{let a=lt().map(l=>l.id===r?{...l,enabled:!1,updatedAt:new Date().toISOString()}:l);Dn(a),await ac("DELETE",`/tasks/${r}`)}return{content:JSON.stringify({ok:!0,taskId:r,permanent:o})}};import{existsSync as gf}from"node:fs";import{readFile as hf,writeFile as pR,rename as mR}from"node:fs/promises";import{homedir as fR}from"node:os";import{join as gR}from"node:path";var lc=6,cc=60,hR=fR();function dc(e){return e.startsWith("~/")?gR(hR,e.slice(2)):e}function yR(){let e=[{name:"Cursor",path:"~/Library/Application Support/Cursor/User/settings.json"},{name:"VS Code",path:"~/Library/Application Support/Code/User/settings.json"},{name:"VS Code Insiders",path:"~/Library/Application Support/Code - Insiders/User/settings.json"}];return process.platform==="linux"&&e.push({name:"VS Code",path:"~/.config/Code/User/settings.json"},{name:"Cursor",path:"~/.config/Cursor/User/settings.json"}),e.filter(t=>gf(dc(t.path)))}function ff(e){return e.toLowerCase().replace(/\s+/g,"")}function uc(e={}){let t=e.discoverFn??yR,n=e.writeFn??pR;return async(r,o)=>{if(!r||typeof r!="object")return{content:"Invalid input: expected object",isError:!0};let s=r,i=s.action;if(i!=="get"&&i!=="set")return{content:'Invalid action. Use "action": "get" to read current font sizes, or "action": "set" with "size": <number> to update them.',isError:!0};let a;if(i==="set"){if(typeof s.size!="number")return{content:`Invalid input: "size" must be a number between ${lc} and ${cc}.`,isError:!0};if(a=s.size,a<lc||a>cc)return{content:`Invalid font size ${a}. Must be between ${lc} and ${cc}.`,isError:!0}}let l=typeof s.editor=="string"?s.editor:void 0,c=t();if(l!==void 0){let d=ff(l);if(!["cursor","vscode","vscodeinsiders"].includes(d))return{content:`Unknown editor "${l}". Supported editors: Cursor, VS Code, VS Code Insiders.`,isError:!0};c=c.filter(p=>ff(p.name)===d)}return c.length===0?{content:l!==void 0?`No settings.json found for editor "${l}".`:"No supported editors detected (Cursor or VS Code not installed, or settings file not found)."}:i==="get"?bR(c):kR(c,a,n)}}async function bR(e){let t=[];for(let n of e){let r=dc(n.path);if(!gf(r)){t.push(`${n.name}: terminal.integrated.fontSize = (default, ~12\u201314)`);continue}let o;try{o=await hf(r,"utf-8")}catch{t.push(`${n.name}: (could not read settings \u2014 file may contain comments or be malformed)`);continue}let s;try{s=JSON.parse(o)}catch{t.push(`${n.name}: (could not read settings \u2014 file may contain comments or be malformed)`);continue}let i=s["terminal.integrated.fontSize"];typeof i=="number"?t.push(`${n.name}: terminal.integrated.fontSize = ${i}`):t.push(`${n.name}: terminal.integrated.fontSize = (not set \u2014 editor default applies)`)}return{content:t.join(`
@@ -1524,7 +1524,7 @@ ${s}`}}}return{...e,systemPrompt:r}}function mc(e,t="cli"){return n=>{if(n.event
1524
1524
  --
1525
1525
  ${d.content}`,isError:!0}),i.push({call:c,result:d}),yield{type:"tool.output",toolUseId:c.id,content:d.content,...d.isError===!0?{isError:!0}:{},sessionId:this.initSessionId}}}this.priorTurns.push(Uf(t.assistantText,r));for(let a of jf(i))this.priorTurns.push(a)}async interrupt(){let t=this.abortController;if(t&&!t.signal.aborted){t.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(t){t!==void 0&&(this.currentModel=t)}async setPermissionMode(t){this.currentPermissionMode=Wf(t)}async supportedCommands(){try{return Fn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return[{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let t=this.lastUsage,n=Qe(this.currentModel),r;if(t&&n>0){let o=Co(t);r=Math.min(100,Math.max(0,o/n*100))}return{tools:[],agents:[],isAutoCompactEnabled:!1,apiUsage:this.lastUsage,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(t,n){return{canRewind:!1,error:`${hc} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0;let t=this.abortController;t&&!t.signal.aborted?t.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),W(`\u{1F7E2} ${hc}: closed`)}};function JR(e){let t={apiKey:e.apiKey};return e.baseURL!==void 0&&(t.baseURL=e.baseURL),new GR(t)}function VR(e){if(!e||typeof e!="object")return"";let t=e,n=t.file_path??t.path??t.filePath;if(typeof n=="string")return" "+n;let r=t.command??t.cmd;if(typeof r=="string"){let s=r.split(`
1526
1526
  `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=t.query??t.pattern??t.url??t.description;return typeof o=="string"?" "+o:""}function Hf(e,t,n={}){let r=Ro(e.apiKey),o=e.resume??`openai-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s=typeof e.model=="string"?e.model:"gpt-4o-mini",i={auth:r,model:s,synthesizedSessionId:o,promptStream:t,config:e};return n.baseURL!==void 0&&(i.baseURL=n.baseURL),n.toolDispatcher!==void 0&&(i.toolDispatcher=n.toolDispatcher),n.mcpManager!==void 0&&(i.mcpManager=n.mcpManager),new ai(i)}var ZR="openai-compatible",Tt=class{name=ZR;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;constructor(t={}){this.providerOpts=t,this.memoryStore=t.memoryStore??new Le;let n=[...Ft];t.subagentExecutor&&n.push(In),t.skillExecutor&&n.push(Pn),t.composeExecutor&&n.push(Mn),n.push(...on),this.schemas=n}query(t){let n=t.config,r=n.permissionMode??"default";this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o=this.providerOpts.tools??this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{}}),s={};return this.providerOpts.baseURL!==void 0&&(s.baseURL=this.providerOpts.baseURL),s.toolDispatcher=o,this.providerOpts.mcpManager!==void 0&&(s.mcpManager=this.providerOpts.mcpManager),Hf(n,t.prompt,s)}buildDispatcher(t,n){let r=ri(t,n.cwd),o=wo(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[a,l]of o)r.set(a,l);let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[a,l]of this.providerOpts.mcpManager.getMcpHandlers())r.set(a,l);let i={handlers:r,schemas:[...this.schemas,...s]};return this.providerOpts.hookRegistry!==void 0&&(i.hookRegistry=this.providerOpts.hookRegistry),this.providerOpts.permissions!==void 0&&(i.permissions=this.providerOpts.permissions),this.providerOpts.subagentExecutor!==void 0&&(i.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(i.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(i.composeExecutor=this.providerOpts.composeExecutor),n.cwd!==void 0&&(i.cwd=n.cwd),n.readRoots!==void 0&&(i.readRoots=n.readRoots),n.writeRoots!==void 0&&(i.writeRoots=n.writeRoots),n.sessionId!==void 0&&(i.sessionId=n.sessionId),n.traceWriter!==void 0&&(i.traceWriter=n.traceWriter),new $n(i)}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=yc.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=yc.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=yc.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[]}}appendProviderAuditLog(t){try{let n=rr();XR(QR(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});YR(n,r+`
1527
- `)}catch{}}close(){this.memoryStore.close()}},e_=new Tt;import{readFileSync as Zf,existsSync as vc}from"fs";import{join as ui}from"path";import{config as b_}from"dotenv";var li={opus:"claude-opus-4-7",opus_1m:"claude-opus-4-7",sonnet:"claude-sonnet-4-6",sonnet_1m:"claude-sonnet-4-6",haiku:"claude-haiku-4-5-20251001"};function ci(e){return e in li}function Kf(e){let t=li[e];if(!t)throw new Error(`Invalid model: ${e}`);return t}function Io(e){if(e!==void 0)return typeof e=="string"&&ci(e)?Kf(e):e}F();H();import{execFile as i_}from"node:child_process";import{promisify as a_}from"node:util";import{promises as Po}from"node:fs";import{dirname as kc,isAbsolute as l_,join as Mo,resolve as c_}from"node:path";import{randomBytes as d_}from"node:crypto";import{basename as Gf}from"node:path";function t_(e){return`'${e.replace(/'/g,"'\\''")}'`}function n_(e){return`'${e.replace(/\\/g,"\\\\").replace(/'/g,"'\\''")}'`}function r_(e){return`# >>> afk shell-init >>>
1527
+ `)}catch{}}close(){this.memoryStore.close()}},e_=new Tt;import{readFileSync as Zf,existsSync as vc}from"fs";import{join as ui}from"path";import{config as b_}from"dotenv";var li={opus:"claude-opus-4-7",opus_1m:"claude-opus-4-7",sonnet:"claude-sonnet-4-6",sonnet_1m:"claude-sonnet-4-6",haiku:"claude-haiku-4-5-20251001"};function ci(e){return e in li}function Kf(e){let t=li[e];if(!t)throw new Error(`Invalid model: ${e}`);return t}function Io(e){if(e!==void 0)return typeof e=="string"&&ci(e)?Kf(e):e}F();K();import{execFile as i_}from"node:child_process";import{promisify as a_}from"node:util";import{promises as Po}from"node:fs";import{dirname as kc,isAbsolute as l_,join as Mo,resolve as c_}from"node:path";import{randomBytes as d_}from"node:crypto";import{basename as Gf}from"node:path";function t_(e){return`'${e.replace(/'/g,"'\\''")}'`}function n_(e){return`'${e.replace(/\\/g,"\\\\").replace(/'/g,"'\\''")}'`}function r_(e){return`# >>> afk shell-init >>>
1528
1528
  # Auto-cd into a preserved worktree after \`afk\` exits.
1529
1529
  # REQUIRES: bash or zsh. Uses \`local\` (also works in dash/ash but
1530
1530
  # breaks in ksh93). For fish, use \`afk shell-init fish | source\`.
@@ -1580,7 +1580,7 @@ end
1580
1580
  `),s+=`${n}
1581
1581
  `,await Po.writeFile(t,s,"utf8")}function y_(e,t,n){if(!dr(e))return new Error(`git worktree add failed: ${String(e)}`);let r=e.stderr??"",o=e.message??"",s=`${r}
1582
1582
  ${o}`;return s.includes("already checked out")||s.includes("is already used by worktree")?new Error(`Branch '${t}' is already checked out in another worktree. Pick a different name.`):s.includes("already exists")?new Error(`Worktree path '${n}' already exists. Remove it or pick a different branch name.`):new Error(o||r||"git worktree add failed")}async function di(e,t){let n=t?.execFile??Jf,r=Vf(t?.branchPrefix),o=await g_(n),s=e===!0?f_(r):e;Yf(s);let i=s.replaceAll("/","-"),a=Mo(o,".afk-worktrees",i);await h_(o);try{await n("git",["-C",o,"worktree","add","-b",s,a])}catch(c){throw y_(c,s,a)}let l={path:a,branch:s,cleanup:async()=>{let c=l.path,d=l.branch,u;try{u=await n("git",["-C",c,"status","--porcelain"])}catch(p){let f=dr(p)?p.message||p.stderr||"":String(p);console.warn(`Worktree cleanup: could not check status at ${c} (${f}). Skipping removal \u2014 manual cleanup may be needed.`);return}if(u.stdout.trim().length>0){if(console.log(`Worktree preserved at ${c} (branch: ${d}) \u2014 uncommitted changes.`),up(c),!pp()){let f=bc(process.env.SHELL)==="fish"?"afk shell-init fish | source (add to ~/.config/fish/config.fish)":'eval "$(afk shell-init)" (add to ~/.zshrc or ~/.bashrc)';console.log(` \u2192 cd ${c}
1583
- \u2192 Or install one-time: ${f}`)}return}try{await n("git",["-C",o,"worktree","remove","--force",c])}catch(p){let f=dr(p)?p.message||p.stderr||"":String(p);console.warn(`Worktree cleanup: 'git worktree remove --force ${c}' failed (${f}). Manual removal may be needed.`);return}try{await n("git",["-C",o,"branch","-d",d])}catch(p){let f=dr(p)?p.message||p.stderr||"":String(p);console.warn(`Could not delete branch '${d}': ${f}`)}}};try{let c="",d="";try{c=(await n("git",["-C",o,"rev-parse","HEAD"])).stdout.trim()}catch{}try{d=(await n("git",["-C",o,"symbolic-ref","--short","HEAD"])).stdout.trim()}catch{}let u={owner:"interactive",pid:process.pid,createdAt:new Date().toISOString(),baseSha:c,baseBranch:d};await Po.writeFile(Mo(a,".afk-worktree-meta.json"),JSON.stringify(u,null,2),"utf-8")}catch{}return l}async function Xf(e,t,n){let r=n?.execFile??Jf,o=Vf(n?.branchPrefix),s=e.path,i=e.branch,a=`${o}${t}`;try{Yf(a)}catch(u){return{ok:!1,reason:u instanceof Error?u.message:String(u)}}let l=kc(s),c=kc(l),d=Mo(l,t);if(s===d&&i===a)return{ok:!1,reason:"rename would be a no-op (slug matches current state)"};try{await r("git",["-C",c,"worktree","move",s,d])}catch(u){return{ok:!1,reason:`worktree move failed: ${dr(u)?u.message||u.stderr||"":String(u)}`}}try{await r("git",["-C",d,"branch","-m",i,a])}catch(u){let p=dr(u)?u.message||u.stderr||"":String(u);return e.path=d,{ok:!1,reason:`branch rename failed (worktree moved successfully): ${p}`,partial:"branch",newPath:d}}e.path=d,e.branch=a;try{let u=Mo(d,".afk-worktree-meta.json"),p={};try{let g=await Po.readFile(u,"utf-8");p=JSON.parse(g)}catch{}let f={...p,worktreePath:d,branch:a};await Po.writeFile(u,JSON.stringify(f,null,2),"utf-8")}catch{}return{ok:!0,oldPath:s,newPath:d,oldBranch:i,newBranch:a}}H();var Oo={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},Qf=!1;function $o(){return E.ANTHROPIC_API_KEY||E.CLAUDE_CODE_OAUTH_TOKEN||De()}var Sc;function k_(){if(Sc!==void 0)return Sc;if(!Qf){let o=[ui(process.cwd(),".env"),Je(),op()];for(let s of o)vc(s)&&b_({path:s,override:!1});Qf=!0}let e={},t=$o();t!==void 0&&(e.apiKey=t);let n=E.AFK_MODEL??E.CLAUDE_MODEL;if(n){let o=n.toLowerCase();e.model=ci(o)?o:n}let r=E.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=E.AFK_LOCAL_API_KEY||"local"),E.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(E.AFK_MAX_TOKENS,10)),E.AFK_TEMPERATURE&&(e.temperature=parseFloat(E.AFK_TEMPERATURE)),E.AFK_SYSTEM_PROMPT&&(e.systemPrompt=E.AFK_SYSTEM_PROMPT),E.AFK_AUTO_ROUTING){let o=E.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return E.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=E.AFK_OPENAI_BASE_URL),Sc=e,e}var ur,pr;function w_(){if(ur!==void 0)return ur;let e=[ui(process.cwd(),"afk.config.json"),Es(),sp()];for(let t of e)if(vc(t))try{let n=Zf(t,"utf-8"),r=JSON.parse(n),o={};if(typeof r.model=="string"&&r.model.length>0){let s=r.model.toLowerCase();o.model=ci(s)?s:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),r.autoRouting&&typeof r.autoRouting=="object"){let s={};typeof r.autoRouting.interactive=="boolean"&&(s.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(s.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(s.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(s.daemon=r.autoRouting.daemon),o.autoRouting=s}if(r.daemon&&typeof r.daemon=="object"){let s={};typeof r.daemon.task=="string"&&(s.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(s.taskId=r.daemon.taskId);let i=r.daemon.worktreePrune;i&&typeof i=="object"&&(s.worktreePrune={enabled:typeof i.enabled=="boolean"?i.enabled:!0,cron:typeof i.cron=="string"?i.cron:"0 4 * * *",maxAgeDaysClean:typeof i.maxAgeDaysClean=="number"?i.maxAgeDaysClean:14,maxAgeDaysDirty:typeof i.maxAgeDaysDirty=="number"?i.maxAgeDaysDirty:30,scope:typeof i.scope=="string"?i.scope:"all"}),o.daemon=s}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.interactive&&typeof r.interactive=="object"){let s={};typeof r.interactive.worktreeAutoname=="boolean"&&(s.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(s.worktreeBranchPrefix=wc(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),Object.keys(s).length>0&&(o.interactive=s)}return ur={config:o,sourcePath:t},ur}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return ur={config:{},sourcePath:void 0},ur}function S_(){if(pr!==void 0)return pr.value;let e=[ui(process.cwd(),"AFK.md"),ui(Re(),"AFK.md")];for(let t of e)if(vc(t))try{let n=Zf(t,"utf-8").trim();if(n.length>0)return pr={value:{content:n,path:t}},pr.value}catch{}return pr={value:null},pr.value}function Ge(e){let t=k_(),{config:n,sourcePath:r}=w_(),o={...Oo,...t,...n,...e},s;if(t.systemPrompt!==void 0)s="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)s=`file:${r}`;else if(o.systemPrompt===void 0){let a=S_();a!==null&&(o.systemPrompt=a.content,s=`afk-md:${a.path}`)}let i={model:o.model??Oo.model,maxTokens:o.maxTokens??Oo.maxTokens,temperature:o.temperature??Oo.temperature,updatePolicy:o.updatePolicy??Oo.updatePolicy,...o.apiKey!==void 0?{apiKey:o.apiKey}:{},...o.baseUrl!==void 0?{baseUrl:o.baseUrl}:{},...o.openaiBaseUrl!==void 0?{openaiBaseUrl:o.openaiBaseUrl}:{},...o.systemPrompt!==void 0?{systemPrompt:o.systemPrompt}:{},...s!==void 0?{systemPromptSource:s}:{},...o.autoRouting!==void 0?{autoRouting:o.autoRouting}:{},...o.daemon!==void 0?{daemon:o.daemon}:{},...o.bgSummaries!==void 0?{bgSummaries:o.bgSummaries}:{},...o.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:o.maxSummaryCallsPerSession}:{}};if(typeof i.model=="string"&&i.model.toLowerCase().startsWith("local-")&&(i.baseUrl===void 0||i.baseUrl.length===0))throw new Error(`Model '${i.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 i}H();function mr(){return`# Agent AFK
1583
+ \u2192 Or install one-time: ${f}`)}return}try{await n("git",["-C",o,"worktree","remove","--force",c])}catch(p){let f=dr(p)?p.message||p.stderr||"":String(p);console.warn(`Worktree cleanup: 'git worktree remove --force ${c}' failed (${f}). Manual removal may be needed.`);return}try{await n("git",["-C",o,"branch","-d",d])}catch(p){let f=dr(p)?p.message||p.stderr||"":String(p);console.warn(`Could not delete branch '${d}': ${f}`)}}};try{let c="",d="";try{c=(await n("git",["-C",o,"rev-parse","HEAD"])).stdout.trim()}catch{}try{d=(await n("git",["-C",o,"symbolic-ref","--short","HEAD"])).stdout.trim()}catch{}let u={owner:"interactive",pid:process.pid,createdAt:new Date().toISOString(),baseSha:c,baseBranch:d};await Po.writeFile(Mo(a,".afk-worktree-meta.json"),JSON.stringify(u,null,2),"utf-8")}catch{}return l}async function Xf(e,t,n){let r=n?.execFile??Jf,o=Vf(n?.branchPrefix),s=e.path,i=e.branch,a=`${o}${t}`;try{Yf(a)}catch(u){return{ok:!1,reason:u instanceof Error?u.message:String(u)}}let l=kc(s),c=kc(l),d=Mo(l,t);if(s===d&&i===a)return{ok:!1,reason:"rename would be a no-op (slug matches current state)"};try{await r("git",["-C",c,"worktree","move",s,d])}catch(u){return{ok:!1,reason:`worktree move failed: ${dr(u)?u.message||u.stderr||"":String(u)}`}}try{await r("git",["-C",d,"branch","-m",i,a])}catch(u){let p=dr(u)?u.message||u.stderr||"":String(u);return e.path=d,{ok:!1,reason:`branch rename failed (worktree moved successfully): ${p}`,partial:"branch",newPath:d}}e.path=d,e.branch=a;try{let u=Mo(d,".afk-worktree-meta.json"),p={};try{let g=await Po.readFile(u,"utf-8");p=JSON.parse(g)}catch{}let f={...p,worktreePath:d,branch:a};await Po.writeFile(u,JSON.stringify(f,null,2),"utf-8")}catch{}return{ok:!0,oldPath:s,newPath:d,oldBranch:i,newBranch:a}}K();var Oo={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},Qf=!1;function $o(){return E.ANTHROPIC_API_KEY||E.CLAUDE_CODE_OAUTH_TOKEN||De()}var Sc;function k_(){if(Sc!==void 0)return Sc;if(!Qf){let o=[ui(process.cwd(),".env"),Je(),op()];for(let s of o)vc(s)&&b_({path:s,override:!1});Qf=!0}let e={},t=$o();t!==void 0&&(e.apiKey=t);let n=E.AFK_MODEL??E.CLAUDE_MODEL;if(n){let o=n.toLowerCase();e.model=ci(o)?o:n}let r=E.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=E.AFK_LOCAL_API_KEY||"local"),E.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(E.AFK_MAX_TOKENS,10)),E.AFK_TEMPERATURE&&(e.temperature=parseFloat(E.AFK_TEMPERATURE)),E.AFK_SYSTEM_PROMPT&&(e.systemPrompt=E.AFK_SYSTEM_PROMPT),E.AFK_AUTO_ROUTING){let o=E.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return E.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=E.AFK_OPENAI_BASE_URL),Sc=e,e}var ur,pr;function w_(){if(ur!==void 0)return ur;let e=[ui(process.cwd(),"afk.config.json"),Es(),sp()];for(let t of e)if(vc(t))try{let n=Zf(t,"utf-8"),r=JSON.parse(n),o={};if(typeof r.model=="string"&&r.model.length>0){let s=r.model.toLowerCase();o.model=ci(s)?s:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),r.autoRouting&&typeof r.autoRouting=="object"){let s={};typeof r.autoRouting.interactive=="boolean"&&(s.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(s.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(s.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(s.daemon=r.autoRouting.daemon),o.autoRouting=s}if(r.daemon&&typeof r.daemon=="object"){let s={};typeof r.daemon.task=="string"&&(s.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(s.taskId=r.daemon.taskId);let i=r.daemon.worktreePrune;i&&typeof i=="object"&&(s.worktreePrune={enabled:typeof i.enabled=="boolean"?i.enabled:!0,cron:typeof i.cron=="string"?i.cron:"0 4 * * *",maxAgeDaysClean:typeof i.maxAgeDaysClean=="number"?i.maxAgeDaysClean:14,maxAgeDaysDirty:typeof i.maxAgeDaysDirty=="number"?i.maxAgeDaysDirty:30,scope:typeof i.scope=="string"?i.scope:"all"}),o.daemon=s}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.interactive&&typeof r.interactive=="object"){let s={};typeof r.interactive.worktreeAutoname=="boolean"&&(s.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(s.worktreeBranchPrefix=wc(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),Object.keys(s).length>0&&(o.interactive=s)}return ur={config:o,sourcePath:t},ur}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return ur={config:{},sourcePath:void 0},ur}function S_(){if(pr!==void 0)return pr.value;let e=[ui(process.cwd(),"AFK.md"),ui(Re(),"AFK.md")];for(let t of e)if(vc(t))try{let n=Zf(t,"utf-8").trim();if(n.length>0)return pr={value:{content:n,path:t}},pr.value}catch{}return pr={value:null},pr.value}function Ge(e){let t=k_(),{config:n,sourcePath:r}=w_(),o={...Oo,...t,...n,...e},s;if(t.systemPrompt!==void 0)s="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)s=`file:${r}`;else if(o.systemPrompt===void 0){let a=S_();a!==null&&(o.systemPrompt=a.content,s=`afk-md:${a.path}`)}let i={model:o.model??Oo.model,maxTokens:o.maxTokens??Oo.maxTokens,temperature:o.temperature??Oo.temperature,updatePolicy:o.updatePolicy??Oo.updatePolicy,...o.apiKey!==void 0?{apiKey:o.apiKey}:{},...o.baseUrl!==void 0?{baseUrl:o.baseUrl}:{},...o.openaiBaseUrl!==void 0?{openaiBaseUrl:o.openaiBaseUrl}:{},...o.systemPrompt!==void 0?{systemPrompt:o.systemPrompt}:{},...s!==void 0?{systemPromptSource:s}:{},...o.autoRouting!==void 0?{autoRouting:o.autoRouting}:{},...o.daemon!==void 0?{daemon:o.daemon}:{},...o.bgSummaries!==void 0?{bgSummaries:o.bgSummaries}:{},...o.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:o.maxSummaryCallsPerSession}:{}};if(typeof i.model=="string"&&i.model.toLowerCase().startsWith("local-")&&(i.baseUrl===void 0||i.baseUrl.length===0))throw new Error(`Model '${i.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 i}K();function mr(){return`# Agent AFK
1584
1584
 
1585
1585
  ## What this process is
1586
1586
 
@@ -1816,7 +1816,7 @@ Create a ship-ready summary with next steps.`,c=await a.runToResult(l);if(c.stat
1816
1816
  `))return{};let n=t.slice(4),r=n.indexOf(`
1817
1817
  ---`);if(r===-1)return{};let o=n.slice(0,r),s=n.slice(r+4).trim(),i={},a=o.split(`
1818
1818
  `);for(let l of a){if(!l)continue;let c=l.indexOf(":");if(c===-1)continue;let d=l.slice(0,c).trim(),u=l.slice(c+1).trim();d==="name"?i.name=u.replace(/^["']|["']$/g,""):d==="description"?i.description=u.replace(/^["']|["']$/g,""):d==="argumentHint"&&(i.argumentHint=u.replace(/^["']|["']$/g,""))}return s.length>0&&(i.body=s),i}catch{return{}}}F();function Sg(e){let t=Fn(e);if(t.length===0)return"";let n=[];for(let r of t){let o=r.argumentHint?`${r.argumentHint}`:"",s=o?`- \`${r.name} ${o}\`: ${r.description}`:`- ${r.name}: ${r.description}`;n.push(s),r.whenToUse&&n.push(` When to use: ${r.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill dispatches one or more context-isolated subagents internally. Calling `skill` is a delegation primitive \u2014 it preserves the main session's context. Prefer a skill over inline investigation when the task shape matches.","",...n].join(`
1819
- `)}function Fn(e){let t=[],n=new Set;for(let o of mt()){let s=Ce(o);t.push({name:o,description:s.description,source:s.origin==="user"?"user":s.origin==="project"?"project":"builtin",argumentHint:s.argumentHint,whenToUse:s.whenToUse}),n.add(o)}let r=e??[...$t(wl()),...$t(),...$t(vl())];for(let o of r){if(o.type!=="local")continue;let s=Ic(o.path);for(let i of s)!i.name||n.has(i.name)||(t.push({name:i.name,description:i.description??`Skill from plugin at ${o.path}`,source:"plugin"}),n.add(i.name))}return t}function mi(e){let t=new Map,n=e??[...$t(wl()),...$t(),...$t(vl())];for(let r of n){if(r.type!=="local")continue;let o=Ic(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&!t.has(s.name)&&t.set(s.name,{body:s.body,pluginPath:r.path})}return t}function vg(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}function Tg(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var eC="__closed__",hi=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(eC)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}};import{randomUUID as Mc}from"node:crypto";import{randomUUID as sC}from"node:crypto";var tC=new Map([["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]]);function nC(e,t,n,r,o){let s=tC.get(e);if(!s)return;let i=1e6,l=Math.max(0,t-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,f=r/i*u;return l+c+p+f}function Eg(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=nC(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}H();function rC(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function oC(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):r.push({type:"tool_use",id:a.id,name:a.name,input:rC(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:t,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*xg(e,t){let n=[],r=null,o=null,s=!1,i=!!E.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(i&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}i&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){i&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:oC(n,r,o)}}H();var iC=0;function aC(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}var lC=3,cC=5e3;function dC(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function uC(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=setTimeout(n,e);r.unref(),t.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}async function pC(e,t,n,r){for(let o=0;;o++){if(o>0){let s=cC*Math.pow(2,o-1);if(await uC(s,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let i=s instanceof Error?s:new Error(String(s));if(dC(i)&&o<lC)continue;throw i}}}function mC(e){if(!e||typeof e!="object")return"";let t=e,n=t.file_path??t.path??t.filePath;if(typeof n=="string")return" "+n;let r=t.command??t.cmd;if(typeof r=="string"){let s=r.split(`
1819
+ `)}function Fn(e){let t=[],n=new Set;for(let o of mt()){let s=Ce(o);t.push({name:o,description:s.description,source:s.origin==="user"?"user":s.origin==="project"?"project":"builtin",argumentHint:s.argumentHint,whenToUse:s.whenToUse}),n.add(o)}let r=e??[...$t(wl()),...$t(),...$t(vl())];for(let o of r){if(o.type!=="local")continue;let s=Ic(o.path);for(let i of s)!i.name||n.has(i.name)||(t.push({name:i.name,description:i.description??`Skill from plugin at ${o.path}`,source:"plugin"}),n.add(i.name))}return t}function mi(e){let t=new Map,n=e??[...$t(wl()),...$t(),...$t(vl())];for(let r of n){if(r.type!=="local")continue;let o=Ic(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&!t.has(s.name)&&t.set(s.name,{body:s.body,pluginPath:r.path})}return t}function vg(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}function Tg(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var eC="__closed__",hi=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(eC)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}};import{randomUUID as Mc}from"node:crypto";import{randomUUID as sC}from"node:crypto";var tC=new Map([["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]]);function nC(e,t,n,r,o){let s=tC.get(e);if(!s)return;let i=1e6,l=Math.max(0,t-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,f=r/i*u;return l+c+p+f}function Eg(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=nC(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}K();function rC(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function oC(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):r.push({type:"tool_use",id:a.id,name:a.name,input:rC(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:t,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*xg(e,t){let n=[],r=null,o=null,s=!1,i=!!E.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(i&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}i&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){i&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:oC(n,r,o)}}K();var iC=0;function aC(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}var lC=3,cC=5e3;function dC(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function uC(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=setTimeout(n,e);r.unref(),t.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}async function pC(e,t,n,r){for(let o=0;;o++){if(o>0){let s=cC*Math.pow(2,o-1);if(await uC(s,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let i=s instanceof Error?s:new Error(String(s));if(dC(i)&&o<lC)continue;throw i}}}function mC(e){if(!e||typeof e!="object")return"";let t=e,n=t.file_path??t.path??t.filePath;if(typeof n=="string")return" "+n;let r=t.command??t.cmd;if(typeof r=="string"){let s=r.split(`
1820
1820
  `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=t.query??t.pattern??t.url??t.description;return typeof o=="string"?" "+o:""}async function*Pc(e){let t=e.maxToolUseIterations??iC,n={stopReason:null},r=0,o=sC(),s=Date.now(),i=a=>({...a,durationMs:Date.now()-s});for(;;){if(e.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId};return}let a=Ds({baseUrl:e.baseUrl})?zp(e.messages,Ls()):e.messages,l={model:e.model,max_tokens:e.maxTokens,messages:a,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0?{tools:e.tools.map(aC)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{}},c;try{c=await pC(e.client,l,e.headers,e.signal)}catch(g){if(e.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId};return}let h=g instanceof Error?g:new Error(String(g));h.message.includes("thinking")&&fC(e.messages,h),yield{type:"error",error:h};return}let d=null,u=!1;try{E.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let g of xg(c,e.ctx))if(E.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",g.kind,g.kind==="event"?g.event.type:""),g.kind==="event"){if(g.event.type==="error"){yield g.event,u=!0;break}yield g.event}else{d=g.result;break}E.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",d?"set":"null")}catch(g){if(e.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId};return}yield{type:"error",error:g instanceof Error?g:new Error(String(g))};return}if(u){e.signal.aborted&&(yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId});return}if(d===null){yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId};return}if(n=xo(n,Eg(d.usage,d.stopReason,e.model)),d.stopReason!=="tool_use"){d.text.length>0&&(yield{type:"assistant.message",text:d.text,sessionId:e.ctx.sessionId},d.text.length<=200&&(yield{type:"suggestion",suggestion:d.text,sessionId:e.ctx.sessionId}));let g=d.assistantBlocks.filter(h=>h.type!=="tool_use");g.length>0&&e.messages.push({role:"assistant",content:g}),yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId};return}let p=e.messages.length;e.messages.push({role:"assistant",content:d.assistantBlocks});try{let g=[],h=new Map;for(let T of d.toolUseBlocks){g.push({id:T.id,name:T.name,input:T.input,signal:e.signal});let x=Date.now();h.set(T.id,x),Fl(e.traceWriter,{phase:"started",toolUseId:T.id,name:T.name,inputBytes:Buffer.byteLength(JSON.stringify(T.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:T.id,toolName:T.name,toolInput:mC(T.input),sessionId:e.ctx.sessionId}}if(e.signal.aborted){let T=g.map(x=>({type:"tool_result",tool_use_id:x.id,content:"Tool call aborted",is_error:!0}));e.messages.push({role:"user",content:T}),yield{type:"turn.completed",usage:i(n),sessionId:e.ctx.sessionId};return}let b;if(e.toolDispatcher.executeBatch)try{b=await e.toolDispatcher.executeBatch(g)}catch(T){b=g.map(()=>({content:`Tool batch execution failed: ${T instanceof Error?T.message:String(T)}`,isError:!0}))}else{b=[];for(let T of g){if(e.signal.aborted){b.push({content:"Tool call aborted",isError:!0});continue}try{b.push(await e.toolDispatcher.execute(T))}catch(x){let w=x instanceof Error?x.message:String(x);b.push({content:`Tool execution threw: ${w}`,isError:!0})}}}let y=[];for(let T=0;T<g.length;T++){let x=g[T],w=b[T],v=h.get(x.id),R=typeof v=="number"?Date.now()-v:0;Fl(e.traceWriter,{phase:"completed",toolUseId:x.id,name:x.name,resultBytes:Buffer.byteLength(w.content,"utf8"),isError:w.isError===!0,truncated:w.content.includes("[output truncated"),durationMs:R}),yield{type:"tool.output",toolUseId:x.id,toolName:x.name,content:w.content,...w.isError===!0?{isError:!0}:{},sessionId:e.ctx.sessionId},w.render?.diff&&(yield{type:"tool.diff",toolUseId:x.id,diff:w.render.diff,sessionId:e.ctx.sessionId});let{content:_,isError:C}=w;y.push({type:"tool_result",tool_use_id:x.id,content:_,...C===!0?{is_error:!0}:{}})}let S={role:"user",content:y};e.messages.push(S)}catch(g){throw e.messages.splice(p),g}r+=1;let f=d.toolUseBlocks[d.toolUseBlocks.length-1];if(yield{type:"progress",progress:{taskId:o,description:"Tool-use loop",summary:`Iteration ${r}: used ${f?.name??"unknown"}`,lastToolName:f?.name,totalTokens:n.totalTokens??0,toolUses:r,durationMs:Date.now()-s},sessionId:e.ctx.sessionId},t>0&&r>=t){yield{type:"turn.completed",usage:i({...n,stopReason:"tool_use_loop_capped"}),sessionId:e.ctx.sessionId};return}}}function fC(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}function Ag(e){if(!("status"in e))return null;let t=e.status;if(t===429){let n=e.message.split("|");if(n.length>=2){let r=parseInt(n[1].trim(),10);if(!isNaN(r)&&r>0)return{kind:"oauth-limit",resetsAt:new Date(r*1e3)}}return{kind:"oauth-limit-no-ts"}}return t===400&&e.message.includes("invalid_request_error")&&e.message.includes("credit balance")?{kind:"credit-exhausted"}:null}async function Rg(e){let{resetsAt:t,signal:n,readToken:r=De}=e,o=r(),s=t.getTime()+3e4;return new Promise(i=>{let a=()=>n.aborted?(i("aborted"),!0):Date.now()>=s?(i("timer"),!0):r()!==o?(i("hot-swap"),!0):!1;if(a())return;let l=setInterval(()=>{a()&&clearInterval(l)},3e4);l.unref(),n.addEventListener("abort",()=>{clearInterval(l),i("aborted")},{once:!0})})}async function _g(e){let{signal:t,readToken:n=De}=e,r=n();return new Promise(o=>{let s=()=>t.aborted?(o("aborted"),!0):n()!==r?(o("hot-swap"),!0):!1;if(s())return;let i=setInterval(()=>{s()&&clearInterval(i)},3e4);t.addEventListener("abort",()=>{clearInterval(i),o("aborted")},{once:!0})})}var gC=7200*1e3,yi=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(t){this._client=t.client,this._authMode=t.authMode,this.initSessionId=t.initSessionId,this.tokenRefresher=t.tokenRefresher,this.autoResumeOnUsageLimit=t.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let t=De(),n=null;try{if(this.refreshPromise)n=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{n=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{return this.refreshPromise=null,null}if(!n)return null;this._client=n;let r=De();return{accountId:Qt(r??""),swapped:t!==r}}async*turnWithRetries(t,n){yield*this.turnWithUsageLimitRetry(t,n)}async*turnWithUsageLimitRetry(t,n){let r=null,o=null,s=!1;for await(let c of this.turnWithAuthRetry(t,n)){if(c.type==="error"){let d=Ag(c.error);if(d&&d.kind==="oauth-limit"){o=d.resetsAt,r=c;break}if(d&&d.kind==="oauth-limit-no-ts"){s=!0,r=c;break}}yield c}if(!r)return;if(s){if(yield{type:"paused",reason:"usage-limit",accountId:Qt(De()??"")},!this.autoResumeOnUsageLimit){yield r;return}let d;if(this.usageLimitWaitPromise)d="aborted";else{this.usageLimitWaitPromise=_g({signal:t.signal});try{d=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(d==="aborted")return;let u=await this.forceClientRefresh();if(!u){yield r;return}t.client=this._client,t.headers=vt(this._authMode,this.initSessionId,Mc()),yield{type:"resumed",hotSwapped:!0,accountId:u.accountId},yield*this.turnWithAuthRetry(t,n);return}if(!o)return;if(o.getTime()-Date.now()>gC){yield r;return}let i=Qt(De()??"");if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:i},!this.autoResumeOnUsageLimit){yield r;return}let a;if(this.usageLimitWaitPromise)a=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Rg({resetsAt:o,signal:t.signal});try{a=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(a==="aborted")return;let l=i;if(a==="hot-swap"){let c=await this.forceClientRefresh();c&&(t.client=this._client,l=c.accountId)}t.headers=vt(this._authMode,this.initSessionId,Mc()),yield{type:"resumed",hotSwapped:a==="hot-swap",accountId:l},yield*this.turnWithAuthRetry(t,n)}async*turnWithAuthRetry(t,n){let r=null;for await(let s of Pc(t)){if(n())return;if(s.type==="error"&&this.isRetryableAuth(s.error)){r=s;break}yield s}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}t.client=this._client,t.headers=vt(this._authMode,this.initSessionId,Mc()),yield*Pc(t)}isRetryableAuth(t){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}};import{randomUUID as wC}from"node:crypto";var hC=["You are a conversation-summarization assistant. The user will paste a","prior conversation between a user and an AI assistant that includes tool","calls and tool results. Produce a concise but complete summary that lets","the AI continue the conversation without losing track.","","Preserve, in this priority order:","1. The user's original intent, explicit asks, constraints, corrections,"," and preferences stated during the conversation.","2. Tool decisions and their outcomes \u2014 file paths read or written, shell"," commands run, search queries, URLs fetched, code edits made, tests"," run, errors observed, and whether each action succeeded or failed.","3. Current state: what has been completed, what remains unresolved, and"," the safest next action.","4. Open questions, pending decisions, blockers, and assumptions.","5. Key facts the assistant discovered (function locations, schemas,"," observed behaviors, important external findings).","","Drop prose narration, conversational filler, and exploratory dead-ends.","Drop verbatim tool output unless an exact snippet, error, path, command,","or result is needed for continuation.","Do not invent details. If something is uncertain, mark it explicitly.","Output plain text, no markdown headers. Aim for ~250 words; use up to","~400 only when needed to preserve tool state or unresolved tasks."].join(`
1821
1821
  `),Cg="[Compacted summary of earlier conversation]",Ig="Acknowledged. Continuing from the summary above.";function yC(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function Pg(e,t){if(t<=0)return e.length;let n=0;for(let r=e.length-1;r>=0;r--){let o=e[r];if(o&&yC(o)&&(n+=1,n===t))return r}return-1}function Mg(e,t,n){let r=bC(e);return{model:t,max_tokens:n,system:hC,messages:[{role:"user",content:`Summarize the following conversation transcript. Follow the system instructions exactly.
1822
1822
 
@@ -1825,7 +1825,7 @@ Create a ship-ready summary with next steps.`,c=await a.runToResult(l);if(c.stat
1825
1825
  </transcript>`}],stream:!0}}function Og(e,t,n){return[{role:"user",content:Cg+`
1826
1826
 
1827
1827
  `+n},{role:"assistant",content:Ig},...e.slice(t)]}function $g(e,t,n){let r=kC(e.slice(0,t)),o=Cg.length+2+n.length+Ig.length,s=Math.max(0,r-o);return Math.round(s/4)}function bC(e){let t=[];for(let n of e){let r=n.role==="user"?"User":"Assistant";if(t.push(r+":"),typeof n.content=="string")t.push(n.content);else if(Array.isArray(n.content))for(let o of n.content){let s=o.type;if(s==="text"&&"text"in o)t.push(o.text);else if(s==="tool_use"){let i=o.name??"unknown",a=Dg(o.input);t.push(`[tool call: ${i} ${a}]`)}else if(s==="tool_result"){let i=o.content;t.push(`[tool result: ${Lg(i)}]`)}else s==="image"?t.push("[image]"):s==="document"&&t.push("[document]")}t.push("")}return t.join(`
1828
- `).trim()}function Dg(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function Lg(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function kC(e){let t=0;for(let n of e)if(typeof n.content=="string")t+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?t+=r.text.length:o==="tool_use"?t+=Dg(r.input).length:o==="tool_result"&&(t+=Lg(r.content).length)}return t}H();var SC=2,vC="claude-haiku-4-5-20251001",TC=1024;async function Fg(e){let{state:t,abort:n,retry:r,initSessionId:o,traceWriter:s}=e,i=t.messages.length;if(t.closed)return{compacted:!1,reason:"session-closed",messagesBefore:i,messagesAfter:i};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:i,messagesAfter:i};let a=EC(),l=Pg(t.messages,a);if(l<0)return{compacted:!1,reason:"history-too-short",messagesBefore:i,messagesAfter:i};if(l===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:i,messagesAfter:i};let c=t.messages.slice(0,l),d=xC(),u=Mg(c,d,TC),p=n.begin(),f;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let y=vt(r.authMode,o,wC()),S=r.client,T=await Promise.resolve(S.messages.create(u,{headers:y,signal:p.signal}));f=await AC(T)}catch(y){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(y instanceof Error?y.message:String(y)),messagesBefore:i,messagesAfter:i}}finally{n.clear(p)}if(f.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let g=$g(t.messages,l,f),h=Og(t.messages,l,f);t.messages.splice(0,t.messages.length,...h);let b=t.messages.length;return Dp(s,{trigger:"manual",preCompactionMessages:c,summary:f,keptTailCount:i-l,keepLastNConfig:a,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}}function EC(){let e=E.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return SC}function xC(){let e=E.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?e:vC}async function AC(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}var RC=[{value:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],bi=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;traceWriter;state;abort;retry;cwdDependentsFactory;mcpManager;constructor(t){this.initSessionId=t.sessionId??Ng(),this.promptStream=t.promptStream,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.thinking=t.thinking,t.effort!==void 0&&(this.effort=t.effort),t.baseUrl!==void 0&&(this.baseUrl=t.baseUrl),this.traceWriter=t.traceWriter,this.cwdDependentsFactory=t.cwdDependentsFactory,this.mcpManager=t.mcpManager,this.retry=new yi({client:t.client,authMode:t.authMode,initSessionId:this.initSessionId,...t.tokenRefresher?{tokenRefresher:t.tokenRefresher}:{},autoResumeOnUsageLimit:t.autoResumeOnUsageLimit??!0}),this.state=Tg({model:t.model,permissionMode:t.permissionMode??"default",userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,...t.initialMessages?{initialMessages:t.initialMessages}:{},...t.autoCompactThreshold!==void 0?{autoCompactThreshold:t.autoCompactThreshold}:{}}),this.abort=new hi}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.state.currentModel,permissionMode:this.state.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:this.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.retry.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.state.closed;){let r=await Promise.race([n.next(),this.abort.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,i=this.abort.begin();if(i.signal.aborted){this.abort.clear(i);return}vg(this.state.messages),this.state.messages.push({role:"user",content:s.content});let a=this.composeSystem(),l=vt(this.retry.authMode,this.initSessionId,Ng(),this.effort!==void 0),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.tools,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:i.signal,ctx:{sessionId:this.initSessionId},...this.thinking!==void 0?{thinking:this.thinking}:{},...this.effort!==void 0?{effort:this.effort}:{},...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{}};try{for await(let d of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;d.type==="turn.completed"&&(this.state.lastUsage=d.usage,this.abort.clear(i)),yield d}}catch(d){if(i.signal.aborted)return;yield{type:"error",error:d instanceof Error?d:new Error(String(d))};return}finally{this.abort.clear(i)}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let d=this.state.lastUsage,u=Qe(this.state.currentModel);if(d!==null&&u>0){let p=Co(d);Bf(p,u,this.state.autoCompactThreshold)&&await this.compact()}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let t=this.systemPrefix,n=this.state.userSystem,r=[];t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n});let o=Jp(this.state.currentPermissionMode);return o!==null&&r.push(o),r.length===0?null:Ds({baseUrl:this.baseUrl})?Gp(r,Ls()):r}async interrupt(){this.abort.requestAbort("interrupted")}async setModel(t){t!==void 0&&t.length>0&&(this.state.currentModel=t)}async setPermissionMode(t){this.state.currentPermissionMode=t}setCwd(t){if(!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(t);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){try{return Fn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return RC.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.state.lastUsage,n=Qe(this.state.currentModel),r;if(t&&n>0){let o=Co(t);r=Math.min(100,Math.max(0,o/n*100))}return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:this.state.lastUsage,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return Fg({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}};var Oc=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1828
+ `).trim()}function Dg(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function Lg(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function kC(e){let t=0;for(let n of e)if(typeof n.content=="string")t+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?t+=r.text.length:o==="tool_use"?t+=Dg(r.input).length:o==="tool_result"&&(t+=Lg(r.content).length)}return t}K();var SC=2,vC="claude-haiku-4-5-20251001",TC=1024;async function Fg(e){let{state:t,abort:n,retry:r,initSessionId:o,traceWriter:s}=e,i=t.messages.length;if(t.closed)return{compacted:!1,reason:"session-closed",messagesBefore:i,messagesAfter:i};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:i,messagesAfter:i};let a=EC(),l=Pg(t.messages,a);if(l<0)return{compacted:!1,reason:"history-too-short",messagesBefore:i,messagesAfter:i};if(l===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:i,messagesAfter:i};let c=t.messages.slice(0,l),d=xC(),u=Mg(c,d,TC),p=n.begin(),f;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let y=vt(r.authMode,o,wC()),S=r.client,T=await Promise.resolve(S.messages.create(u,{headers:y,signal:p.signal}));f=await AC(T)}catch(y){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(y instanceof Error?y.message:String(y)),messagesBefore:i,messagesAfter:i}}finally{n.clear(p)}if(f.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let g=$g(t.messages,l,f),h=Og(t.messages,l,f);t.messages.splice(0,t.messages.length,...h);let b=t.messages.length;return Dp(s,{trigger:"manual",preCompactionMessages:c,summary:f,keptTailCount:i-l,keepLastNConfig:a,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:i,messagesAfter:b,tokensSavedEstimate:g}}function EC(){let e=E.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return SC}function xC(){let e=E.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?e:vC}async function AC(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}var RC=[{value:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-4-5-20250929",displayName:"Claude Opus 4.5",description:"Highest-capability Claude"},{value:"claude-haiku-4-5-20250929",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],bi=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;traceWriter;state;abort;retry;cwdDependentsFactory;mcpManager;constructor(t){this.initSessionId=t.sessionId??Ng(),this.promptStream=t.promptStream,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.thinking=t.thinking,t.effort!==void 0&&(this.effort=t.effort),t.baseUrl!==void 0&&(this.baseUrl=t.baseUrl),this.traceWriter=t.traceWriter,this.cwdDependentsFactory=t.cwdDependentsFactory,this.mcpManager=t.mcpManager,this.retry=new yi({client:t.client,authMode:t.authMode,initSessionId:this.initSessionId,...t.tokenRefresher?{tokenRefresher:t.tokenRefresher}:{},autoResumeOnUsageLimit:t.autoResumeOnUsageLimit??!0}),this.state=Tg({model:t.model,permissionMode:t.permissionMode??"default",userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,...t.initialMessages?{initialMessages:t.initialMessages}:{},...t.autoCompactThreshold!==void 0?{autoCompactThreshold:t.autoCompactThreshold}:{}}),this.abort=new hi}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.state.currentModel,permissionMode:this.state.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:this.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.retry.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.state.closed;){let r=await Promise.race([n.next(),this.abort.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,i=this.abort.begin();if(i.signal.aborted){this.abort.clear(i);return}vg(this.state.messages),this.state.messages.push({role:"user",content:s.content});let a=this.composeSystem(),l=vt(this.retry.authMode,this.initSessionId,Ng(),this.effort!==void 0),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.tools,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:i.signal,ctx:{sessionId:this.initSessionId},...this.thinking!==void 0?{thinking:this.thinking}:{},...this.effort!==void 0?{effort:this.effort}:{},...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{}};try{for await(let d of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;d.type==="turn.completed"&&(this.state.lastUsage=d.usage,this.abort.clear(i)),yield d}}catch(d){if(i.signal.aborted)return;yield{type:"error",error:d instanceof Error?d:new Error(String(d))};return}finally{this.abort.clear(i)}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let d=this.state.lastUsage,u=Qe(this.state.currentModel);if(d!==null&&u>0){let p=Co(d);Bf(p,u,this.state.autoCompactThreshold)&&await this.compact()}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let t=this.systemPrefix,n=this.state.userSystem,r=[];t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n});let o=Jp(this.state.currentPermissionMode);return o!==null&&r.push(o),r.length===0?null:Ds({baseUrl:this.baseUrl})?Gp(r,Ls()):r}async interrupt(){this.abort.requestAbort("interrupted")}async setModel(t){t!==void 0&&t.length>0&&(this.state.currentModel=t)}async setPermissionMode(t){this.state.currentPermissionMode=t}setCwd(t){if(!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(t);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){try{return Fn().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return RC.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.state.lastUsage,n=Qe(this.state.currentModel),r;if(t&&n>0){let o=Co(t);r=Math.min(100,Math.max(0,o/n*100))}return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:this.state.lastUsage,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return Fg({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}};var Oc=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1829
1829
 
1830
1830
  - Use read_file before editing to verify the exact content you want to change.
1831
1831
  - Prefer edit_file over write_file for modifying existing files \u2014 write_file is for new files or complete rewrites.
@@ -1864,12 +1864,12 @@ Do NOT store: ephemeral task details, information derivable from code or git, sp
1864
1864
  - Use action "supersede" (not set + remove) when updating an existing fact \u2014 preserves history.
1865
1865
 
1866
1866
  ## Procedures (procedure_write)
1867
- Save reusable multi-step workflows the user teaches you or that you discover work well. Name in kebab-case. Searchable via memory_search.`;H();import{mkdirSync as _C,appendFileSync as CC,existsSync as IC}from"fs";import{resolve as PC}from"path";import{dirname as MC}from"path";var OC=`# AFK PROMPT DUMP \u2014 May contain secrets. Inspect before sharing.
1867
+ Save reusable multi-step workflows the user teaches you or that you discover work well. Name in kebab-case. Searchable via memory_search.`;K();import{mkdirSync as _C,appendFileSync as CC,existsSync as IC}from"fs";import{resolve as PC}from"path";import{dirname as MC}from"path";var OC=`# AFK PROMPT DUMP \u2014 May contain secrets. Inspect before sharing.
1868
1868
  `,$C=/key|token|secret|password|credential|auth/i,DC=[[/sk-ant-[A-Za-z0-9_\-]{8,200}/g,e=>`<REDACTED sk-ant length=${e[0].length}>`],[/sk-(?!ant-)[A-Za-z0-9_\-]{20,200}/g,e=>`<REDACTED sk- length=${e[0].length}>`],[/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,e=>`<REDACTED Bearer length=${e[0].length}>`],[/AKIA[A-Z0-9]{16}/g,e=>`<REDACTED AKIA length=${e[0].length}>`],[/xox[baprs]-[A-Za-z0-9\-]{10,200}/g,e=>`<REDACTED xox token length=${e[0].length}>`],[/\d{8,12}:[A-Za-z0-9_\-]{35}/g,e=>`<REDACTED Telegram token length=${e[0].length}>`],[/([A-Za-z_]{3,}(?:[Kk][Ee][Yy]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|[Cc][Rr][Ee][Dd][Ee][Nn][Tt][Ii][Aa][Ll])[A-Za-z_]*)=([^\s]{16,})/g,e=>`${e[1]}=<REDACTED length=${e[2].length}>`],[/([A-Z_]{3,}(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*)=([^\s]{16,})/g,e=>`${e[1]}=<REDACTED length=${e[2].length}>`]];function Sr(e){let t=e;for(let[n,r]of DC)t=t.replace(n,(...o)=>{let s=o.slice(0,o.length-2);return r(s)});return t}function Dc(e){return typeof e=="string"?Sr(e):Array.isArray(e)?e.map(Dc):e}function LC(e){if(e===null||typeof e!="object")return e;let t=e,n={...t},r=t.env;if(r&&typeof r=="object"){let o={};for(let[s,i]of Object.entries(r))$C.test(s)&&typeof i=="string"?o[s]=`<REDACTED length=${i.length}>`:o[s]=i;n.env=o}return"system"in t&&(n.system=Dc(t.system)),"systemPrompt"in t&&(n.systemPrompt=Dc(t.systemPrompt)),n}function FC(e){if(e==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof e=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(e))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof e=="object"){let t=e;if(t.type==="preset"&&t.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof t.append=="string"&&(n.append={length:t.append.length}),t.excludeDynamicSections===!0&&(n.excludeDynamicSections=!0),n}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}function Ug(e){let t=E.AFK_DUMP_PROMPT;if(!t||t===""||t==="0"||t.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
1869
1869
  `);let n=e.options,r=typeof n=="object"&&n!==null?n.systemPrompt:void 0,o=FC(r),s={timestamp:new Date().toISOString(),prompt:e.prompt,options:LC(e.options),provenance:e.provenance,resolution:o};if(t==="1"||t.toLowerCase()==="true"||t.toLowerCase()==="stderr"){let l=JSON.stringify(s,null,2)+`
1870
1870
  `;process.stderr.write(l);return}let i=PC(t),a=MC(i);try{_C(a,{recursive:!0});let c=(!IC(i)?OC:"")+JSON.stringify(s)+`
1871
1871
  `;CC(i,c)}catch(l){let c=`[prompt-dump] Failed to write to ${i}: ${String(l)}
1872
- `;process.stderr.write(c)}}F();H();var Bg="anthropic-direct",BC="claude-sonnet-4-5-20250929",WC=e=>/opus-4-(7|[89])/.test(e),Wg=null;var Ne=class{name=Bg;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;subagentExecutor;composeExecutor;surface;mcpManager;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_mcpToolsCache=null;_mcpHandlersCache=null;constructor(t={}){let n=[...Ft];if(t.subagentExecutor&&n.push(In),t.skillExecutor&&n.push(Pn),t.composeExecutor&&n.push(Mn),n.push(...on),this.memoryStore=t.memoryStore??new Le,this.externalTools=t.tools,this.skillExecutor=t.skillExecutor,this.schemas=n,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.composeExecutor=t.composeExecutor,this.surface=t.surface??"cli",this.mcpManager=t.mcpManager,t.mcpManager){let r=t.mcpManager.onToolsRefreshed;t.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}t.clientFactory&&(this.providerFactory=t.clientFactory)}buildDispatcher(t,n){let r=ri(t,n?.cwd),o=wo(this.memoryStore,void 0,this.surface);for(let[i,a]of o)r.set(i,a);if(this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[i,a]of this._mcpHandlersCache)r.set(i,a)}let s=this._mcpToolsCache??[];return new $n({handlers:r,schemas:[...this.schemas,...s],hookRegistry:this.hookRegistry,permissions:this.permissions,subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,cwd:n?.cwd,readRoots:n?.readRoots,writeRoots:n?.writeRoots,...n?.env!==void 0?{env:n.env}:{},sessionId:n?.sessionId,...n?.traceWriter?{traceWriter:n.traceWriter}:{}})}close(){this.memoryStore.close()}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=Lc.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=Lc.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=Lc.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[]}}appendProviderAuditLog(t){try{let n=rr();UC(jC(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});NC(n,r+`
1872
+ `;process.stderr.write(c)}}F();K();var Bg="anthropic-direct",BC="claude-sonnet-4-5-20250929",WC=e=>/opus-4-(7|[89])/.test(e),Wg=null;var Ne=class{name=Bg;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;subagentExecutor;composeExecutor;surface;mcpManager;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_mcpToolsCache=null;_mcpHandlersCache=null;constructor(t={}){let n=[...Ft];if(t.subagentExecutor&&n.push(In),t.skillExecutor&&n.push(Pn),t.composeExecutor&&n.push(Mn),n.push(...on),this.memoryStore=t.memoryStore??new Le,this.externalTools=t.tools,this.skillExecutor=t.skillExecutor,this.schemas=n,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.subagentExecutor=t.subagentExecutor,this.composeExecutor=t.composeExecutor,this.surface=t.surface??"cli",this.mcpManager=t.mcpManager,t.mcpManager){let r=t.mcpManager.onToolsRefreshed;t.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}t.clientFactory&&(this.providerFactory=t.clientFactory)}buildDispatcher(t,n){let r=ri(t,n?.cwd),o=wo(this.memoryStore,void 0,this.surface);for(let[i,a]of o)r.set(i,a);if(this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[i,a]of this._mcpHandlersCache)r.set(i,a)}let s=this._mcpToolsCache??[];return new $n({handlers:r,schemas:[...this.schemas,...s],hookRegistry:this.hookRegistry,permissions:this.permissions,subagentExecutor:this.subagentExecutor,skillExecutor:this.skillExecutor,composeExecutor:this.composeExecutor,cwd:n?.cwd,readRoots:n?.readRoots,writeRoots:n?.writeRoots,...n?.env!==void 0?{env:n.env}:{},sessionId:n?.sessionId,...n?.traceWriter?{traceWriter:n.traceWriter}:{}})}close(){this.memoryStore.close()}ensureSharedRoots(t){if(!this._sharedReadRoots){let n=t?[t]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),t&&!this._initialResolveBase&&(this._initialResolveBase=t)}}addReadRoot(t,n="slash",r){this.ensureSharedRoots();let o=Lc.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(t,n="slash",r){this.ensureSharedRoots();let o=Lc.resolve(t);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this._sharedWriteRoots.includes(o)||this._sharedWriteRoots.push(o),this.appendProviderAuditLog({action:"grant-write",path:o,source:n,sessionId:r})}revokeRoot(t,n="slash",r){if(!this._sharedReadRoots)return;let o=Lc.resolve(t);if(this._initialResolveBase&&o===this._initialResolveBase)return;let s=this._sharedReadRoots.indexOf(o);if(s!==-1&&this._sharedReadRoots.splice(s,1),this._sharedWriteRoots){let i=this._sharedWriteRoots.indexOf(o);i!==-1&&this._sharedWriteRoots.splice(i,1)}this.appendProviderAuditLog({action:"revoke",path:o,source:n,sessionId:r})}getGrants(){return{resolveBase:this._initialResolveBase,readRoots:this._sharedReadRoots?.slice()??[],writeRoots:this._sharedWriteRoots?.slice()??[]}}appendProviderAuditLog(t){try{let n=rr();UC(jC(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:t.sessionId??null,action:t.action,path:t.path,source:t.source});NC(n,r+`
1873
1873
  `)}catch{}}query(t){let n=t.config,r=typeof n.baseUrl=="string"&&n.baseUrl.length>0,o=r?n.apiKey&&n.apiKey.length>0?n.apiKey:E.AFK_LOCAL_API_KEY||"local":n.apiKey&&n.apiKey.length>0?n.apiKey:E.ANTHROPIC_API_KEY||E.CLAUDE_CODE_OAUTH_TOKEN||"";if(!o||o.length===0)throw new Error(`${Bg} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let s=$s(o),i=go(o,s,n.baseUrl),a=this.providerFactory??Wg,l=a?a(i):new jg(i),c=r?null:Np(s),d=HC(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?Io(n.model)??n.model:BC,p=GC(n,u),f=n.permissionMode??"default";this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let g=this.externalTools??this.buildDispatcher(f,{cwd:n.cwd,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,traceWriter:n.traceWriter}),h=g instanceof $n?[...g.toolDefs]:[...Ft],b=this.skillExecutor?Sg():"",y=n.cwd||process.cwd(),S=[Oc,$c];S.push(`# Environment
1874
1874
  - Working directory: ${y}`),b.length>0&&S.push(b),d&&S.push(d);let T=S.join(`
1875
1875
 
@@ -1927,7 +1927,7 @@ ${PI}`}import un from"chalk";var MI={read:un.hex("#C9B584"),write:un.hex("#E8A33
1927
1927
 
1928
1928
  ${d.partialOutput}`}:{content:d.error?.message??"Forked skill failed with no output",isError:!0}}catch(l){return{content:`Forked skill execution error: ${l instanceof Error?l.message:String(l)}`,isError:!0}}finally{await a?.teardownAll(),await s.teardownAll()}}async executePluginSkill(t,n,r,o,s){if(s.signal.aborted)return{content:"Skill call aborted",isError:!0};let i=new q({parentAbortSignal:s.signal,apiKey:this.ctx.apiKey,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},progressSink:st()}),{childConfig:a,childManager:l}=this.buildForkedChildConfig({model:this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",systemPrompt:n,env:{PLUGIN_ROOT:r},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{}},s.signal);try{let c=await i.forkSubagent({parent:this.ctx.parentSession,config:a,idPrefix:`skill-${t}`,parentId:s.id,agentType:t}),d=o&&o.length>0?o:"Run the skill.",u=await c.runToResult(d);return u.status==="succeeded"&&u.message?{content:u.message.content}:u.status==="cancelled"&&typeof u.partialOutput=="string"&&u.partialOutput.length>0?{content:`[skill cancelled mid-flight \u2014 partial output preserved below]
1929
1929
 
1930
- ${u.partialOutput}`}:{content:u.error?.message??"Plugin skill failed with no output",isError:!0}}catch(c){return{content:`Plugin skill execution error: ${c instanceof Error?c.message:String(c)}`,isError:!0}}finally{await l?.teardownAll(),await i.teardownAll()}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=mi(this.ctx.pluginConfigs)),this.pluginBodies.get(t)}createDispatchSkillCallback(t){return async(n,r)=>{let o={id:`${t.id}-dispatch-${n}`,name:"skill",input:{name:n,...r!==void 0?{arguments:r}:{}},signal:t.signal},s=await this.execute(o);if(s.isError)throw new Error(s.content);return s.content}}};var Rr=3;function jo(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}var HI=[...rn,"agent","skill"];function _i(e={}){return({childExecutor:t,childSkillExecutor:n,model:r})=>{let o={permissions:{allowedTools:HI},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{}};return Ee(typeof r=="string"?r:void 0)==="openai-compatible"?new Tt({...o,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{}}):new Ne(o)}}function Ci(e,t,n,r,o){let s=(i,a,l)=>new mn({parentSession:jo(l),defaultModel:e,apiKey:t,...r!==void 0?{baseUrl:r}:{},depth:i,maxDepth:a,childProviderFactory:n,childSkillExecutorFactory:s,...o!==void 0?{traceWriter:o}:{}});return s}function xh(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}function KI(e){if(typeof e!="object"||e===null)throw new Error("Agent tool input must be an object");let t=e,n=t.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=t.model;if(o!==void 0){if(typeof o!="string")throw new Error("Agent tool model must be a string");r=o}let s=10,i=t.max_turns;if(i!==void 0){if(typeof i!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(i)))}let a="agent-tool",l=t.id_prefix;if(l!==void 0){if(typeof l!="string")throw new Error("Agent tool id_prefix must be a string");a=l}let c="foreground",d=t.mode;if(d!==void 0){if(d!=="foreground"&&d!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(d)}`);c=d}return{prompt:n,model:r,max_turns:s,id_prefix:a,mode:c}}function Ii(e){try{return Oe(e).catch(()=>{})}catch{return Promise.resolve()}}function _r(e,t=240){return e.length<=t?e:e.slice(0,t)+"\u2026"}function Rh(e){if(e!=null){if(typeof e=="string")return e.length;try{return JSON.stringify(e).length}catch{return}}}var GI=4096,Ah=1024;function zI(e){if(e==null)return;let t=Rh(e);return t!==void 0&&t>GI?{truncated:!0,chars:t}:e}function qI(e){let t={status:e.status,error:_r(e.errorMessage,Ah),subagent_id:e.subagentId};e.schemaErrorMessage&&(t.schemaError=_r(e.schemaErrorMessage,Ah));let n=zI(e.partialOutput);return n!==void 0&&(t.partialOutput=n),t}var fn=class e{constructor(t){this.ctx=t}ctx;async execute(t){if(t.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=KI(t.input)}catch(g){return{content:`Agent tool input validation failed: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let r=this.ctx.depth??0,o=this.ctx.maxDepth??Rr,s,i=n.model??this.ctx.defaultSubagentModel??"sonnet",a=Ee(i)==="openai-compatible",l={model:i,apiKey:a?void 0:this.ctx.defaultConfig.apiKey,systemPrompt:this.ctx.defaultConfig.systemPrompt,baseUrl:a?void 0:this.ctx.defaultConfig.baseUrl,maxTurns:n.max_turns},c;if(this.ctx.childProviderFactory&&r<o){s=new q({parentAbortSignal:t.signal}),c=jo(t.signal);let g=new e({subagentManager:s,parentSession:c,defaultConfig:this.ctx.defaultConfig,defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,depth:r+1,maxDepth:o}),h=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,t.signal):void 0;l.provider=this.ctx.childProviderFactory({childExecutor:g,...h!==void 0?{childSkillExecutor:h}:{},...l.model!==void 0?{model:l.model}:{}})}let d;try{d=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,parentId:t.id,config:l,idPrefix:n.id_prefix,agentType:n.id_prefix&&n.id_prefix!=="agent-tool"?xh(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":xh(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:n.mode==="background"}),c!==void 0&&(c.sessionId=d.id)}catch(g){let h=g instanceof Error?g.message:String(g);return Ii({event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:_r(h),depth:r}),{content:`Failed to fork subagent: ${h}`,isError:!0}}if(n.mode==="background"){let g=this.ctx.backgroundRegistry;if(!g)return await d.teardown().catch(y=>W("subagent-executor: handle teardown failed: "+(y instanceof Error?y.message:String(y)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let h;try{h=g.register({handle:d,prompt:n.prompt,model:l.model??"sonnet",parentSessionId:this.ctx.parentSession.sessionId})}catch(y){if(y instanceof Uo)return await d.teardown().catch(S=>W("subagent-executor: handle teardown failed after cap error: "+(S instanceof Error?S.message:String(S)))),{content:y.message,isError:!0};throw y}let b={status:"running",jobId:h.jobId,subagentId:h.subagentId,label:h.label,message:`Background subagent started (jobId=${h.jobId}). It is running detached and its result will NOT auto-inject into this context. Retrieve it later via /bgsub:join ${h.jobId} or ask the user to join.`};return{content:JSON.stringify(b)}}let u=()=>{d.cancel()};t.signal.addEventListener("abort",u,{once:!0});let p=Date.now(),f=this.ctx.parentSession.sessionId;try{let g=await d.runToResult(n.prompt);if(g.status==="succeeded"&&g.message){let S=g.message.content,T=typeof S=="string"?S:JSON.stringify(S),x=g.trace;return Ii({event:"subagent.completed",subagent_id:d.id,parent_session_id:f,status:g.status,duration_ms:Date.now()-p,content_chars:T.length,depth:r,tool_call_count:x?.toolCalls.length,thinking_present:x?.thinkingPresent,tool_names:x?.toolCalls.length?JSON.stringify([...new Set(x.toolCalls.map(w=>w.name))]):void 0}),{content:T}}let h=g.error?.message??"Subagent failed with no output",b=g.trace;Ii({event:"subagent.failed",subagent_id:d.id,id_prefix:n.id_prefix,parent_session_id:f,status:g.status,duration_ms:Date.now()-p,error_message:_r(h),schema_error:g.schemaError?_r(g.schemaError.message):void 0,partial_output_chars:Rh(g.partialOutput),depth:r,tool_call_count:b?.toolCalls.length,thinking_present:b?.thinkingPresent,tool_names:b?.toolCalls.length?JSON.stringify([...new Set(b.toolCalls.map(S=>S.name))]):void 0});let y=qI({status:g.status,errorMessage:h,schemaErrorMessage:g.schemaError?.message,partialOutput:g.partialOutput,subagentId:d.id});return{content:JSON.stringify(y),isError:!0}}catch(g){let h=g instanceof Error?g.message:String(g);throw Ii({event:"subagent.failed",subagent_id:d.id,id_prefix:n.id_prefix,parent_session_id:f,status:"failed",duration_ms:Date.now()-p,error_message:_r(h),depth:r}),g}finally{t.signal.removeEventListener("abort",u),await s?.teardownAll(),await d.teardown()}}};H();F();import{randomUUID as hP}from"node:crypto";import{createHash as pP}from"crypto";import{mkdir as mP,open as fP,writeFile as gP}from"fs/promises";import{join as Uh}from"path";import{z as k}from"zod";var JI=k.object({phase:k.literal("started"),toolUseId:k.string(),name:k.string(),inputBytes:k.number().int().nonnegative(),subagentId:k.string().optional()}),VI=k.object({phase:k.literal("completed"),toolUseId:k.string(),name:k.string(),resultBytes:k.number().int().nonnegative(),isError:k.boolean(),truncated:k.boolean(),durationMs:k.number().nonnegative(),subagentId:k.string().optional()}),_h=k.discriminatedUnion("phase",[JI,VI]),YI=k.enum(["PreToolUse","PostToolUse","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),Ch=k.object({hookEvent:YI,decision:k.union([k.literal("block"),k.literal("approve"),k.undefined()]),reason:k.string().optional(),blockedTool:k.string().optional(),injectedContextBytes:k.number().int().nonnegative().optional()}),XI=k.object({transition:k.literal("started"),subagentId:k.string(),parentId:k.string(),model:k.string(),allowedTools:k.array(k.string()).readonly().optional(),systemPromptHash:k.string().optional()}),QI=k.object({transition:k.literal("succeeded"),subagentId:k.string(),durationMs:k.number().nonnegative(),turnCount:k.number().int().nonnegative(),totalCostUsd:k.number().nonnegative().optional(),outputBytes:k.number().int().nonnegative()}),ZI=k.object({transition:k.literal("failed"),subagentId:k.string(),errorClass:k.string(),errorMessage:k.string(),partialOutputBytes:k.number().int().nonnegative()}),eP=k.object({transition:k.literal("cancelled"),subagentId:k.string(),source:k.enum(["cascade","explicit"])}),Ih=k.discriminatedUnion("transition",[XI,QI,ZI,eP]),tP=k.object({transition:k.literal("started"),jobId:k.string(),subagentId:k.string(),label:k.string(),model:k.string()}),nP=k.object({transition:k.literal("completed"),jobId:k.string(),subagentId:k.string(),durationMs:k.number().nonnegative(),outputBytes:k.number().int().nonnegative()}),rP=k.object({transition:k.literal("failed"),jobId:k.string(),subagentId:k.string(),durationMs:k.number().nonnegative(),errorClass:k.string(),errorMessage:k.string()}),oP=k.object({transition:k.literal("cancelled"),jobId:k.string(),subagentId:k.string(),source:k.enum(["explicit","cascade"])}),sP=k.object({transition:k.literal("joined"),jobId:k.string(),subagentId:k.string(),jobStatus:k.enum(["completed","failed","cancelled"])}),Ph=k.discriminatedUnion("transition",[tP,nP,rP,oP,sP]),Mh=k.object({kind:k.literal("monetary"),runningCostUsd:k.number().nonnegative(),maxBudgetUsd:k.number().nonnegative(),lastTurnCostUsd:k.number().nonnegative()}),iP=k.enum(["user_signal","cascade","timeout","budget","hook_block"]),Oh=k.object({origin:iP,cascadedTo:k.array(k.string()).readonly(),reason:k.string().optional()}),$h=k.enum(["manual","token_threshold","turn_count"]),aP=k.object({path:k.string(),sizeBytes:k.number().int().nonnegative(),sha256:k.string().regex(/^[0-9a-f]{64}$/)}),lP=k.object({trigger:$h,preCompactionMessages:k.array(k.unknown()),summary:k.string(),keptTailCount:k.number().int().nonnegative(),keepLastNConfig:k.number().int().nonnegative(),messagesBefore:k.number().int().nonnegative(),messagesAfter:k.number().int().nonnegative(),tokensSavedEstimate:k.number().nonnegative().optional(),summarizationTokens:k.object({input:k.number().int().nonnegative(),output:k.number().int().nonnegative()}).optional()}),cP=k.object({trigger:$h,preCompactionMessagesRef:aP,summary:k.string(),keptTailCount:k.number().int().nonnegative(),keepLastNConfig:k.number().int().nonnegative(),messagesBefore:k.number().int().nonnegative(),messagesAfter:k.number().int().nonnegative(),tokensSavedEstimate:k.number().nonnegative().optional(),summarizationTokens:k.object({input:k.number().int().nonnegative(),output:k.number().int().nonnegative()}).optional()}),dP=k.enum(["model_end_turn","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),Dh=k.object({reason:dP,finalTurnCount:k.number().int().nonnegative(),finalCostUsd:k.number().nonnegative(),finalTokens:k.object({input:k.number().int().nonnegative().optional(),output:k.number().int().nonnegative().optional(),cacheRead:k.number().int().nonnegative().optional(),cacheCreation:k.number().int().nonnegative().optional()}),lastStopReason:k.string().optional()}),Lh=k.object({source:k.string(),assertion:k.string(),evidence:k.array(k.string()).readonly(),confidence:k.number().min(0).max(1),dissent:k.string().optional()}),uP=k.object({status:k.enum(["succeeded","failed","cancelled"]),finalCostUsd:k.number().nonnegative(),finalTurnCount:k.number().int().nonnegative(),closedAt:k.string().datetime()}),Fh=k.discriminatedUnion("kind",[k.object({kind:k.literal("tool_call"),payload:_h}),k.object({kind:k.literal("hook_decision"),payload:Ch}),k.object({kind:k.literal("subagent_lifecycle"),payload:Ih}),k.object({kind:k.literal("background_agent"),payload:Ph}),k.object({kind:k.literal("budget"),payload:Mh}),k.object({kind:k.literal("abort"),payload:Oh}),k.object({kind:k.literal("compaction"),payload:lP}),k.object({kind:k.literal("closure"),payload:Dh}),k.object({kind:k.literal("claim"),payload:Lh})]),Nh=k.discriminatedUnion("kind",[k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("tool_call"),payload:_h}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("hook_decision"),payload:Ch}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("subagent_lifecycle"),payload:Ih}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("background_agent"),payload:Ph}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("budget"),payload:Mh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("abort"),payload:Oh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("compaction"),payload:cP}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("closure"),payload:Dh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("claim"),payload:Lh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("session_sealed"),payload:uP})]);var Pi=class{traceDir;tracePath;seq=0;sealed=!1;fh=null;writeQueue=Promise.resolve();constructor(t){this.traceDir=t.traceDir,this.tracePath=Uh(this.traceDir,"trace.jsonl")}getTracePath(){return this.tracePath}async write(t){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return Fh.parse(t),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(t);await this.appendLine(n)})}async seal(t){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{await this.ensureOpen();let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:t};await this.appendLine(n),this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(t){let n=this.writeQueue.then(t,t);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await mP(this.traceDir,{recursive:!0}),this.fh=await fP(this.tracePath,"a"))}async closeHandle(){if(!this.fh)return;let t=this.fh;this.fh=null,await t.close()}async appendLine(t){if(!this.fh)throw new Error("NdjsonTraceWriter: file handle missing");await this.fh.appendFile(`${JSON.stringify(t)}
1930
+ ${u.partialOutput}`}:{content:u.error?.message??"Plugin skill failed with no output",isError:!0}}catch(c){return{content:`Plugin skill execution error: ${c instanceof Error?c.message:String(c)}`,isError:!0}}finally{await l?.teardownAll(),await i.teardownAll()}}getPluginSkillBody(t){return this.pluginBodies||(this.pluginBodies=mi(this.ctx.pluginConfigs)),this.pluginBodies.get(t)}createDispatchSkillCallback(t){return async(n,r)=>{let o={id:`${t.id}-dispatch-${n}`,name:"skill",input:{name:n,...r!==void 0?{arguments:r}:{}},signal:t.signal},s=await this.execute(o);if(s.isError)throw new Error(s.content);return s.content}}};var Rr=3;function jo(e){return{sessionId:void 0,getInputStreamRef:()=>({pushUserMessage:()=>{}}),abortSignal:e}}var HI=[...rn,"agent","skill"];function _i(e={}){return({childExecutor:t,childSkillExecutor:n,model:r})=>{let o={permissions:{allowedTools:HI},subagentExecutor:t,...n!==void 0?{skillExecutor:n}:{}};return Ee(typeof r=="string"?r:void 0)==="openai-compatible"?new Tt({...o,...e.openaiBaseUrl!==void 0?{baseURL:e.openaiBaseUrl}:{}}):new Ne(o)}}function Ci(e,t,n,r,o){let s=(i,a,l)=>new mn({parentSession:jo(l),defaultModel:e,apiKey:t,...r!==void 0?{baseUrl:r}:{},depth:i,maxDepth:a,childProviderFactory:n,childSkillExecutorFactory:s,...o!==void 0?{traceWriter:o}:{}});return s}function xh(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}function KI(e){if(typeof e!="object"||e===null)throw new Error("Agent tool input must be an object");let t=e,n=t.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=t.model;if(o!==void 0){if(typeof o!="string")throw new Error("Agent tool model must be a string");r=o}let s=10,i=t.max_turns;if(i!==void 0){if(typeof i!="number")throw new Error("Agent tool max_turns must be a number");s=Math.max(1,Math.min(50,Math.floor(i)))}let a="agent-tool",l=t.id_prefix;if(l!==void 0){if(typeof l!="string")throw new Error("Agent tool id_prefix must be a string");a=l}let c="foreground",d=t.mode;if(d!==void 0){if(d!=="foreground"&&d!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(d)}`);c=d}return{prompt:n,model:r,max_turns:s,id_prefix:a,mode:c}}function Ii(e){try{return Oe(e).catch(()=>{})}catch{return Promise.resolve()}}function _r(e,t=240){return e.length<=t?e:e.slice(0,t)+"\u2026"}function Rh(e){if(e!=null){if(typeof e=="string")return e.length;try{return JSON.stringify(e).length}catch{return}}}var GI=4096,Ah=1024;function zI(e){if(e==null)return;let t=Rh(e);return t!==void 0&&t>GI?{truncated:!0,chars:t}:e}function qI(e){let t={status:e.status,error:_r(e.errorMessage,Ah),subagent_id:e.subagentId};e.schemaErrorMessage&&(t.schemaError=_r(e.schemaErrorMessage,Ah));let n=zI(e.partialOutput);return n!==void 0&&(t.partialOutput=n),t}var fn=class e{constructor(t){this.ctx=t}ctx;async execute(t){if(t.signal.aborted)return{content:"Agent tool call aborted",isError:!0};let n;try{n=KI(t.input)}catch(g){return{content:`Agent tool input validation failed: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let r=this.ctx.depth??0,o=this.ctx.maxDepth??Rr,s,i=n.model??this.ctx.defaultSubagentModel??"sonnet",a=Ee(i)==="openai-compatible",l={model:i,apiKey:a?void 0:this.ctx.defaultConfig.apiKey,systemPrompt:this.ctx.defaultConfig.systemPrompt,baseUrl:a?void 0:this.ctx.defaultConfig.baseUrl,maxTurns:n.max_turns},c;if(this.ctx.childProviderFactory&&r<o){s=new q({parentAbortSignal:t.signal}),c=jo(t.signal);let g=new e({subagentManager:s,parentSession:c,defaultConfig:this.ctx.defaultConfig,defaultSubagentModel:this.ctx.defaultSubagentModel,childProviderFactory:this.ctx.childProviderFactory,childSkillExecutorFactory:this.ctx.childSkillExecutorFactory,depth:r+1,maxDepth:o}),h=this.ctx.childSkillExecutorFactory?this.ctx.childSkillExecutorFactory(r+1,o,t.signal):void 0;l.provider=this.ctx.childProviderFactory({childExecutor:g,...h!==void 0?{childSkillExecutor:h}:{},...l.model!==void 0?{model:l.model}:{}})}let d;try{d=await this.ctx.subagentManager.forkSubagent({parent:this.ctx.parentSession,parentId:t.id,config:l,idPrefix:n.id_prefix,agentType:n.id_prefix&&n.id_prefix!=="agent-tool"?xh(n.id_prefix).replace(/[\r\n]+/g," ").trim()||"agent":xh(n.prompt).replace(/[\r\n]+/g," ").slice(0,40).trim()||"agent",denyElicitations:n.mode==="background"}),c!==void 0&&(c.sessionId=d.id)}catch(g){let h=g instanceof Error?g.message:String(g);return Ii({event:"subagent.failed",subagent_id:"unknown",id_prefix:n.id_prefix,parent_session_id:this.ctx.parentSession.sessionId,status:"failed",error_message:_r(h),depth:r}),{content:`Failed to fork subagent: ${h}`,isError:!0}}if(n.mode==="background"){let g=this.ctx.backgroundRegistry;if(!g)return await d.teardown().catch(y=>W("subagent-executor: handle teardown failed: "+(y instanceof Error?y.message:String(y)))),{content:'Background mode is not available in this session \u2014 no BackgroundAgentRegistry is wired. Re-issue the call with mode="foreground" or run inside `afk interactive`.',isError:!0};let h;try{h=g.register({handle:d,prompt:n.prompt,model:l.model??"sonnet",parentSessionId:this.ctx.parentSession.sessionId})}catch(y){if(y instanceof Uo)return await d.teardown().catch(S=>W("subagent-executor: handle teardown failed after cap error: "+(S instanceof Error?S.message:String(S)))),{content:y.message,isError:!0};throw y}let b={status:"running",jobId:h.jobId,subagentId:h.subagentId,label:h.label,message:`Background subagent started (jobId=${h.jobId}). It is running detached and its result will NOT auto-inject into this context. Retrieve it later via /bgsub:join ${h.jobId} or ask the user to join.`};return{content:JSON.stringify(b)}}let u=()=>{d.cancel()};t.signal.addEventListener("abort",u,{once:!0});let p=Date.now(),f=this.ctx.parentSession.sessionId;try{let g=await d.runToResult(n.prompt);if(g.status==="succeeded"&&g.message){let S=g.message.content,T=typeof S=="string"?S:JSON.stringify(S),x=g.trace;return Ii({event:"subagent.completed",subagent_id:d.id,parent_session_id:f,status:g.status,duration_ms:Date.now()-p,content_chars:T.length,depth:r,tool_call_count:x?.toolCalls.length,thinking_present:x?.thinkingPresent,tool_names:x?.toolCalls.length?JSON.stringify([...new Set(x.toolCalls.map(w=>w.name))]):void 0}),{content:T}}let h=g.error?.message??"Subagent failed with no output",b=g.trace;Ii({event:"subagent.failed",subagent_id:d.id,id_prefix:n.id_prefix,parent_session_id:f,status:g.status,duration_ms:Date.now()-p,error_message:_r(h),schema_error:g.schemaError?_r(g.schemaError.message):void 0,partial_output_chars:Rh(g.partialOutput),depth:r,tool_call_count:b?.toolCalls.length,thinking_present:b?.thinkingPresent,tool_names:b?.toolCalls.length?JSON.stringify([...new Set(b.toolCalls.map(S=>S.name))]):void 0});let y=qI({status:g.status,errorMessage:h,schemaErrorMessage:g.schemaError?.message,partialOutput:g.partialOutput,subagentId:d.id});return{content:JSON.stringify(y),isError:!0}}catch(g){let h=g instanceof Error?g.message:String(g);throw Ii({event:"subagent.failed",subagent_id:d.id,id_prefix:n.id_prefix,parent_session_id:f,status:"failed",duration_ms:Date.now()-p,error_message:_r(h),depth:r}),g}finally{t.signal.removeEventListener("abort",u),await s?.teardownAll(),await d.teardown()}}};K();F();import{randomUUID as hP}from"node:crypto";import{createHash as pP}from"crypto";import{mkdir as mP,open as fP,writeFile as gP}from"fs/promises";import{join as Uh}from"path";import{z as k}from"zod";var JI=k.object({phase:k.literal("started"),toolUseId:k.string(),name:k.string(),inputBytes:k.number().int().nonnegative(),subagentId:k.string().optional()}),VI=k.object({phase:k.literal("completed"),toolUseId:k.string(),name:k.string(),resultBytes:k.number().int().nonnegative(),isError:k.boolean(),truncated:k.boolean(),durationMs:k.number().nonnegative(),subagentId:k.string().optional()}),_h=k.discriminatedUnion("phase",[JI,VI]),YI=k.enum(["PreToolUse","PostToolUse","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),Ch=k.object({hookEvent:YI,decision:k.union([k.literal("block"),k.literal("approve"),k.undefined()]),reason:k.string().optional(),blockedTool:k.string().optional(),injectedContextBytes:k.number().int().nonnegative().optional()}),XI=k.object({transition:k.literal("started"),subagentId:k.string(),parentId:k.string(),model:k.string(),allowedTools:k.array(k.string()).readonly().optional(),systemPromptHash:k.string().optional()}),QI=k.object({transition:k.literal("succeeded"),subagentId:k.string(),durationMs:k.number().nonnegative(),turnCount:k.number().int().nonnegative(),totalCostUsd:k.number().nonnegative().optional(),outputBytes:k.number().int().nonnegative()}),ZI=k.object({transition:k.literal("failed"),subagentId:k.string(),errorClass:k.string(),errorMessage:k.string(),partialOutputBytes:k.number().int().nonnegative()}),eP=k.object({transition:k.literal("cancelled"),subagentId:k.string(),source:k.enum(["cascade","explicit"])}),Ih=k.discriminatedUnion("transition",[XI,QI,ZI,eP]),tP=k.object({transition:k.literal("started"),jobId:k.string(),subagentId:k.string(),label:k.string(),model:k.string()}),nP=k.object({transition:k.literal("completed"),jobId:k.string(),subagentId:k.string(),durationMs:k.number().nonnegative(),outputBytes:k.number().int().nonnegative()}),rP=k.object({transition:k.literal("failed"),jobId:k.string(),subagentId:k.string(),durationMs:k.number().nonnegative(),errorClass:k.string(),errorMessage:k.string()}),oP=k.object({transition:k.literal("cancelled"),jobId:k.string(),subagentId:k.string(),source:k.enum(["explicit","cascade"])}),sP=k.object({transition:k.literal("joined"),jobId:k.string(),subagentId:k.string(),jobStatus:k.enum(["completed","failed","cancelled"])}),Ph=k.discriminatedUnion("transition",[tP,nP,rP,oP,sP]),Mh=k.object({kind:k.literal("monetary"),runningCostUsd:k.number().nonnegative(),maxBudgetUsd:k.number().nonnegative(),lastTurnCostUsd:k.number().nonnegative()}),iP=k.enum(["user_signal","cascade","timeout","budget","hook_block"]),Oh=k.object({origin:iP,cascadedTo:k.array(k.string()).readonly(),reason:k.string().optional()}),$h=k.enum(["manual","token_threshold","turn_count"]),aP=k.object({path:k.string(),sizeBytes:k.number().int().nonnegative(),sha256:k.string().regex(/^[0-9a-f]{64}$/)}),lP=k.object({trigger:$h,preCompactionMessages:k.array(k.unknown()),summary:k.string(),keptTailCount:k.number().int().nonnegative(),keepLastNConfig:k.number().int().nonnegative(),messagesBefore:k.number().int().nonnegative(),messagesAfter:k.number().int().nonnegative(),tokensSavedEstimate:k.number().nonnegative().optional(),summarizationTokens:k.object({input:k.number().int().nonnegative(),output:k.number().int().nonnegative()}).optional()}),cP=k.object({trigger:$h,preCompactionMessagesRef:aP,summary:k.string(),keptTailCount:k.number().int().nonnegative(),keepLastNConfig:k.number().int().nonnegative(),messagesBefore:k.number().int().nonnegative(),messagesAfter:k.number().int().nonnegative(),tokensSavedEstimate:k.number().nonnegative().optional(),summarizationTokens:k.object({input:k.number().int().nonnegative(),output:k.number().int().nonnegative()}).optional()}),dP=k.enum(["model_end_turn","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),Dh=k.object({reason:dP,finalTurnCount:k.number().int().nonnegative(),finalCostUsd:k.number().nonnegative(),finalTokens:k.object({input:k.number().int().nonnegative().optional(),output:k.number().int().nonnegative().optional(),cacheRead:k.number().int().nonnegative().optional(),cacheCreation:k.number().int().nonnegative().optional()}),lastStopReason:k.string().optional()}),Lh=k.object({source:k.string(),assertion:k.string(),evidence:k.array(k.string()).readonly(),confidence:k.number().min(0).max(1),dissent:k.string().optional()}),uP=k.object({status:k.enum(["succeeded","failed","cancelled"]),finalCostUsd:k.number().nonnegative(),finalTurnCount:k.number().int().nonnegative(),closedAt:k.string().datetime()}),Fh=k.discriminatedUnion("kind",[k.object({kind:k.literal("tool_call"),payload:_h}),k.object({kind:k.literal("hook_decision"),payload:Ch}),k.object({kind:k.literal("subagent_lifecycle"),payload:Ih}),k.object({kind:k.literal("background_agent"),payload:Ph}),k.object({kind:k.literal("budget"),payload:Mh}),k.object({kind:k.literal("abort"),payload:Oh}),k.object({kind:k.literal("compaction"),payload:lP}),k.object({kind:k.literal("closure"),payload:Dh}),k.object({kind:k.literal("claim"),payload:Lh})]),Nh=k.discriminatedUnion("kind",[k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("tool_call"),payload:_h}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("hook_decision"),payload:Ch}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("subagent_lifecycle"),payload:Ih}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("background_agent"),payload:Ph}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("budget"),payload:Mh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("abort"),payload:Oh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("compaction"),payload:cP}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("closure"),payload:Dh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("claim"),payload:Lh}),k.object({ts:k.string().datetime(),seq:k.number().int().nonnegative(),kind:k.literal("session_sealed"),payload:uP})]);var Pi=class{traceDir;tracePath;seq=0;sealed=!1;fh=null;writeQueue=Promise.resolve();constructor(t){this.traceDir=t.traceDir,this.tracePath=Uh(this.traceDir,"trace.jsonl")}getTracePath(){return this.tracePath}async write(t){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return Fh.parse(t),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(t);await this.appendLine(n)})}async seal(t){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{await this.ensureOpen();let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:t};await this.appendLine(n),this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(t){let n=this.writeQueue.then(t,t);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await mP(this.traceDir,{recursive:!0}),this.fh=await fP(this.tracePath,"a"))}async closeHandle(){if(!this.fh)return;let t=this.fh;this.fh=null,await t.close()}async appendLine(t){if(!this.fh)throw new Error("NdjsonTraceWriter: file handle missing");await this.fh.appendFile(`${JSON.stringify(t)}
1931
1931
  `)}async materializePersistedEvent(t){let n=new Date().toISOString(),r=this.seq++;if(t.kind==="compaction"){let o=await this.persistCompactionSidecar(t.payload,r,n);return{ts:n,seq:r,kind:"compaction",payload:o}}return{ts:n,seq:r,kind:t.kind,payload:t.payload}}async persistCompactionSidecar(t,n,r){let o=r.replace(/[:.]/g,"-"),s=Uh(this.traceDir,`${String(n).padStart(6,"0")}-${o}-pre-compaction.json`),i=JSON.stringify(t.preCompactionMessages),a=Buffer.byteLength(i,"utf8"),l=pP("sha256").update(i).digest("hex");await gP(s,i,{encoding:"utf8",flag:"w"});let c={path:s,sizeBytes:a,sha256:l};return{trigger:t.trigger,preCompactionMessagesRef:c,summary:t.summary,keptTailCount:t.keptTailCount,keepLastNConfig:t.keepLastNConfig,messagesBefore:t.messagesBefore,messagesAfter:t.messagesAfter,...t.tokensSavedEstimate!==void 0?{tokensSavedEstimate:t.tokensSavedEstimate}:{},...t.summarizationTokens!==void 0?{summarizationTokens:t.summarizationTokens}:{}}}};function Mi(e={}){if(E.AFK_TRACE_DISABLED==="1")return null;let t=e.sessionLabel??hP(),n=np(t),r=new Pi({traceDir:n});return{writer:r,tracePath:r.getTracePath(),sessionLabel:t}}F();import{readFileSync as yP,writeFileSync as bP,existsSync as qc,mkdirSync as kP,readdirSync as wP,statSync as SP}from"fs";import{join as jh,basename as Bh,resolve as vP,sep as TP}from"path";function Oi(){return ap(),zt()}function Wh(e){return jh(Oi(),`${e}.json`)}function Hh(e){let t=e.includes("/")?e:Wh(e),n=Oi(),r=vP(t);if(!r.startsWith(n+TP)&&r!==n)throw new Error(`Session path escapes sessions directory: ${e}`);return r}function Cr(e,t){let n=Oi();qc(n)||kP(n,{recursive:!0});let r=t??e.sessionId??`session-${Date.now()}`,o={sessionId:e.sessionId,model:e.model,startedAt:e.sessionStartTime,savedAt:Date.now(),totalTurns:e.totalTurns,totalCostUsd:e.totalCostUsd,totalTokens:e.totalTokens,totalDurationMs:e.totalDurationMs,turns:e.turns},s=Wh(r);return bP(s,JSON.stringify(o,null,2)),s}function Bo(e){let t;try{t=Hh(e)}catch{return}if(qc(t))try{let n=yP(t,"utf-8");return JSON.parse(n)}catch{return}}function Ir(e){let t;try{t=Hh(e)}catch{return}let n=Bo(t);if(n)return{path:t,id:Bh(t,".json"),data:n};for(let r of Wo()){if(r.id!==e&&r.sessionId!==e)continue;let o=Bo(r.path);if(o)return{path:r.path,id:r.id,data:o}}}function Wo(){let e=Oi();if(!qc(e))return[];let t=[];for(let n of wP(e)){if(!n.endsWith(".json"))continue;let r=jh(e,n);try{if(!SP(r).isFile())continue;let s=Bo(r);if(!s||typeof s.savedAt!="number"||typeof s.model!="string")continue;t.push({path:r,id:Bh(n,".json"),sessionId:s.sessionId,model:s.model,startedAt:s.startedAt,savedAt:s.savedAt,totalTurns:s.totalTurns,totalCostUsd:s.totalCostUsd})}catch{}}return t.sort((n,r)=>r.savedAt-n.savedAt),t}function $i(e){if(e.resume&&e.continue)throw new Error("Use either --resume <id> or --continue, not both.");if(e.resume){let t=Ir(e.resume);return t?{id:t.id,resumeId:t.data.sessionId??t.id,stored:t.data}:{id:e.resume,resumeId:e.resume}}if(e.continue){let t=Wo()[0];if(!t)throw new Error("No saved sessions found for --continue. Run a session first or use /save.");let n=Bo(t.path);if(!n)throw new Error(`Could not load latest saved session: ${t.id}`);return{id:t.id,resumeId:n.sessionId??t.id,stored:n}}}function Pr(e){return e?{resume:e.resumeId,sessionId:e.resumeId,...e.stored?{resumeHistory:e.stored.turns.map(t=>({user:t.user,assistant:t.assistant}))}:{}}:{}}function Di(e){return{totalTurns:0,totalCostUsd:0,totalTokens:0,totalDurationMs:0,sessionStartTime:Date.now(),turnCosts:[],turnTokens:[],turns:[],model:e,planMode:!1}}function Kh(e){e.totalTurns=0,e.totalCostUsd=0,e.totalTokens=0,e.totalDurationMs=0,e.sessionStartTime=Date.now(),e.turnCosts.length=0,e.turnTokens.length=0,e.turns.length=0,delete e.sessionId,delete e.pendingPlanExit}function Un(e,t,n,r,o){let s=r?.totalCostUsd??0,i=r?.durationMs??0,a=Number(r?.usage?.input_tokens??0),l=Number(r?.usage?.output_tokens??0),c=a,d=l,u=Number(r?.usage?.cache_read_input_tokens??0)+Number(r?.usage?.cache_creation_input_tokens??0),p=r?.usage?.iterations;if(Array.isArray(p)&&p.length>0){let g=p[p.length-1];if(g&&typeof g=="object"){let h=g;c=Number(h.input_tokens??0),d=Number(h.output_tokens??0),u=Number(h.cache_read_input_tokens??0)+Number(h.cache_creation_input_tokens??0)}}e.totalTurns+=1,e.totalCostUsd+=s,e.totalDurationMs+=i,e.totalTokens+=a+l,e.turnCosts.push(s),e.turnTokens.push({input:c,output:d,cache:u}),r?.sessionId&&!e.sessionId&&(e.sessionId=String(r.sessionId));let f={user:t,assistant:n,timestamp:Date.now(),costUsd:s,durationMs:i,inputTokens:a,outputTokens:l,...o&&o.length>0?{toolEvents:o}:{}};return e.turns.push(f),f}function xP(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}var zh=10*1024*1024;function qh(){return new Promise((e,t)=>{let n=[],r=0;process.stdin.on("data",o=>{if(r+=o.length,r>zh){process.stdin.destroy(new Error(`stdin exceeds ${zh}-byte limit`));return}n.push(o)}),process.stdin.once("end",()=>{e(Buffer.concat(n).toString("utf-8").replace(/\n+$/,""))}),process.stdin.once("error",t),process.stdin.resume()})}function AP(e,t){return new Promise((n,r)=>{e.write(t,s=>{s&&r(s)})?n():e.once("drain",n)})}function Yh(e){e.command("chat").description("Send a message to the agent").argument("[message]","Message to send; use `-` or omit to read from stdin").option("-m, --model <model>","Model to use. Short aliases: opus|opus_1m|sonnet|sonnet_1m|haiku. Any other value (e.g. `auto` for cursor-api-proxy, or a full `claude-*` ID) passes through to the SDK/proxy untouched.",Fe()).option("-s, --stream","[no-op] reserved; use --format stream-json for headless streaming",!1).option("-f, --format <format>","Output format (text|json|stream-json)","text").option("--max-turns <number>","Maximum conversation turns","10").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'","enabled:max").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--max-budget-usd <usd>","Hard session cost ceiling in USD. Env: AFK_MAX_BUDGET_USD").option("--task-budget <tokens>","Soft per-task token budget. Env: AFK_TASK_BUDGET").option("--max-output-tokens <n|max>","Per-response output cap ('max' = model ceiling). Env: AFK_MAX_OUTPUT_TOKENS").option("--provider <name>","Provider to use: anthropic|anthropic-direct|openai|openai-compatible. Default: auto-selected by model").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').option("-w, --worktree [branch]","Create a git worktree for an isolated one-shot. Optional value sets the branch name; otherwise auto-named. On clean exit (no uncommitted changes) the worktree and branch are auto-removed; on dirty exit the worktree is preserved. Mirrors `afk interactive -w`.").option("--resume <id>","Resume a persisted session by id").option("--continue","Continue the most recent persisted session in cwd").option("--session-id <uuid>","Assign a specific UUID to this session (creates new; errors if already exists)").action(async(t,n)=>{if(n.resume&&n.continue){process.stderr.write(`Error: --resume and --continue are mutually exclusive
1932
1932
  `),process.exitCode=1;return}if(n.sessionId!==void 0&&(n.resume||n.continue)){process.stderr.write(`Error: --session-id is mutually exclusive with --resume and --continue
1933
1933
  `),process.exitCode=1;return}if(n.sessionId!==void 0&&!xP(n.sessionId)){process.stderr.write(`Error: --session-id must be a UUID (got: ${n.sessionId})
@@ -1936,13 +1936,13 @@ ${u.partialOutput}`}:{content:u.error?.message??"Plugin skill failed with no out
1936
1936
  `),process.exitCode=1;return}r=await qh()}else if(t===void 0&&o)r=await qh();else if(t!==void 0)r=t;else{process.stderr.write(`Error: missing message \u2014 pass a message argument or pipe via stdin
1937
1937
  `),process.exitCode=1;return}if(r.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
1938
1938
  `),process.exitCode=1;return}let s=EP("Initializing agent...").start(),i=null,a,l,c,d=!1,u,p=Di(n.model);try{if(n.worktree!==void 0)try{l=await di(n.worktree),c=l.path,s.text=`Worktree ready at ${l.path} (branch: ${l.branch})`}catch(P){s.fail("Failed to create worktree"),U(P)}let f,g,h,b,y,S;try{f=ln(n.thinking)??gr(),g=cn(n.effort)??hr(),h=yr(n.maxBudgetUsd)??Tc(),b=yr(n.taskBudget)??Ec(),y=br(n.maxOutputTokens)??Lo(),S=void 0}catch(P){s.fail("Invalid options"),U(P)}if(n.dumpPrompt!==void 0){let P=n.dumpPrompt===!0?Vh.join(Jh.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=P,n.provider!==void 0&&n.provider!=="anthropic"&&n.provider!=="anthropic-direct"&&console.error(`[--dump-prompt] WARNING: active provider (${n.provider}) does not support prompt dumping. No file will be written.`)}let T=oe(),x=fr()??mr(),w=Ge(),v=w.systemPromptSource,R=w.autoRouting?.chat??!1,_=Ei(x,R),C={},A=$i({resume:n.resume,continue:n.continue});if(n.resume&&A&&!A.stored){s.fail("Session not found"),process.stderr.write(`Error: session not found: ${n.resume}
1939
- `),process.exitCode=1;return}A&&(C=Pr(A),d=!0,u=A.id),n.sessionId!==void 0&&(C={sessionId:n.sessionId},d=!0,u=n.sessionId);let O=A?.stored?.model??n.model;p.model=O,A?.stored&&(p.totalTurns=A.stored.totalTurns,p.totalCostUsd=A.stored.totalCostUsd,p.totalTokens=A.stored.totalTokens,p.totalDurationMs=A.stored.totalDurationMs,p.turns=[...A.stored.turns],p.sessionId=A.stored.sessionId??A.resumeId,p.sessionStartTime=A.stored.startedAt??Date.now()),n.sessionId!==void 0&&(p.sessionId=n.sessionId);let M,$=Mi(),N=new q({apiKey:T,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},...c!==void 0?{cwd:c}:{}}),j=_i(w.openaiBaseUrl!==void 0?{openaiBaseUrl:w.openaiBaseUrl}:{}),G={get sessionId(){return M?.sessionId},getInputStreamRef(){return M?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return M?.abortSignal??new AbortController().signal}},V=Ci(n.model,T,j,w.baseUrl,$?.writer),I=new fn({subagentManager:N,parentSession:G,defaultConfig:{apiKey:T,systemPrompt:x,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{}},defaultSubagentModel:an(n.model),childProviderFactory:j,childSkillExecutorFactory:V}),L=new mn({parentSession:G,defaultModel:n.model,defaultSubagentModel:an(n.model),apiKey:T,childProviderFactory:j,childSkillExecutorFactory:V,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},...$?.writer!==void 0?{traceWriter:$.writer}:{}}),B=new Tr({parentSession:G,defaultModel:n.model,defaultSubagentModel:an(n.model),apiKey:T,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},systemPrompt:x??""});if(a=new Le,S=pi(n.provider,{subagentExecutor:I,skillExecutor:L,composeExecutor:B,memoryStore:a,model:String(n.model),...w.openaiBaseUrl!==void 0?{openaiBaseUrl:w.openaiBaseUrl}:{}})??new Ne({permissions:{allowedTools:[...rn,...On,"agent","skill","compose"]},subagentExecutor:I,skillExecutor:L,composeExecutor:B,memoryStore:a,surface:"cli"}),i=new Ye(Ln({model:O,apiKey:T,maxTurns:parseInt(n.maxTurns,10),hookRegistry:Er(P=>{console.log(xi(P))},"cli",a).registry,..._!==void 0?{systemPrompt:_}:{},...v!==void 0?{systemPromptSource:v}:{},...f!==void 0?{thinking:f}:{},...g!==void 0?{effort:g}:{},...h!==void 0?{maxBudgetUsd:h}:{},...b!==void 0?{taskBudget:b}:{},...y!==void 0?{maxOutputTokens:y}:{},...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},...$?{traceWriter:$.writer}:{},...w.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:w.autoResumeOnUsageLimit}:{},...c!==void 0?{cwd:c}:{},...C,provider:S})),M=i,s.text="Sending message...",n.format==="stream-json"){let P=(ge,Pe)=>Pe instanceof Date?Pe.toISOString():Pe instanceof Error?{message:Pe.message,name:Pe.name,stack:Pe.stack}:Pe;s.stop();let ie="",xe=i.sendMessageStream(r);for await(let ge of xe)if(await AP(process.stdout,JSON.stringify(ge,P)+`
1939
+ `),process.exitCode=1;return}A&&(C=Pr(A),d=!0,u=A.id),n.sessionId!==void 0&&(C={sessionId:n.sessionId},d=!0,u=n.sessionId);let O=A?.stored?.model??n.model;p.model=O,A?.stored&&(p.totalTurns=A.stored.totalTurns,p.totalCostUsd=A.stored.totalCostUsd,p.totalTokens=A.stored.totalTokens,p.totalDurationMs=A.stored.totalDurationMs,p.turns=[...A.stored.turns],p.sessionId=A.stored.sessionId??A.resumeId,p.sessionStartTime=A.stored.startedAt??Date.now()),n.sessionId!==void 0&&(p.sessionId=n.sessionId);let M,$=Mi(),N=new q({apiKey:T,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},...c!==void 0?{cwd:c}:{}}),j=_i(w.openaiBaseUrl!==void 0?{openaiBaseUrl:w.openaiBaseUrl}:{}),z={get sessionId(){return M?.sessionId},getInputStreamRef(){return M?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return M?.abortSignal??new AbortController().signal}},V=Ci(n.model,T,j,w.baseUrl,$?.writer),I=new fn({subagentManager:N,parentSession:z,defaultConfig:{apiKey:T,systemPrompt:x,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{}},defaultSubagentModel:an(n.model),childProviderFactory:j,childSkillExecutorFactory:V}),L=new mn({parentSession:z,defaultModel:n.model,defaultSubagentModel:an(n.model),apiKey:T,childProviderFactory:j,childSkillExecutorFactory:V,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},...$?.writer!==void 0?{traceWriter:$.writer}:{}}),B=new Tr({parentSession:z,defaultModel:n.model,defaultSubagentModel:an(n.model),apiKey:T,...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},systemPrompt:x??""});if(a=new Le,S=pi(n.provider,{subagentExecutor:I,skillExecutor:L,composeExecutor:B,memoryStore:a,model:String(n.model),...w.openaiBaseUrl!==void 0?{openaiBaseUrl:w.openaiBaseUrl}:{}})??new Ne({permissions:{allowedTools:[...rn,...On,"agent","skill","compose"]},subagentExecutor:I,skillExecutor:L,composeExecutor:B,memoryStore:a,surface:"cli"}),i=new Ye(Ln({model:O,apiKey:T,maxTurns:parseInt(n.maxTurns,10),hookRegistry:Er(P=>{console.log(xi(P))},"cli",a).registry,..._!==void 0?{systemPrompt:_}:{},...v!==void 0?{systemPromptSource:v}:{},...f!==void 0?{thinking:f}:{},...g!==void 0?{effort:g}:{},...h!==void 0?{maxBudgetUsd:h}:{},...b!==void 0?{taskBudget:b}:{},...y!==void 0?{maxOutputTokens:y}:{},...w.baseUrl!==void 0?{baseUrl:w.baseUrl}:{},...$?{traceWriter:$.writer}:{},...w.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:w.autoResumeOnUsageLimit}:{},...c!==void 0?{cwd:c}:{},...C,provider:S})),M=i,s.text="Sending message...",n.format==="stream-json"){let P=(ge,Pe)=>Pe instanceof Date?Pe.toISOString():Pe instanceof Error?{message:Pe.message,name:Pe.name,stack:Pe.stack}:Pe;s.stop();let ie="",xe=i.sendMessageStream(r);for await(let ge of xe)if(await AP(process.stdout,JSON.stringify(ge,P)+`
1940
1940
  `),ge.type==="chunk"&&ge.chunk.type==="content"&&(ie+=ge.chunk.content),ge.type==="done"&&(Un(p,r,ie,ge.metadata),ge.metadata?.sessionId&&!p.sessionId&&(p.sessionId=String(ge.metadata.sessionId))),ge.type==="error"){process.exitCode=1;break}return}let ne=await i.sendMessage(r,{stream:n.stream});s.succeed("Response received");let D=i.getLastResponseMetadata();if(Un(p,r,ne.content,D??void 0),D?.sessionId&&!p.sessionId&&(p.sessionId=String(D.sessionId)),n.format==="json"){let P=D?Number(D.usage?.input_tokens??0):0,ie=D?Number(D.usage?.output_tokens??0):0;console.log(JSON.stringify({success:!0,model:O,message:ne.content,timestamp:ne.timestamp,...D?.totalCostUsd!==void 0?{costUsd:D.totalCostUsd}:{},...D?.durationMs!==void 0?{durationMs:D.durationMs}:{},...P>0?{inputTokens:P}:{},...ie>0?{outputTokens:ie}:{}},null,2))}else{if(console.log(Gh.cyan(`
1941
1941
  \u{1F916} Claude:`)),console.log(St(ne.content)),D){let P=[];D.durationMs&&P.push(se(D.durationMs)),D.totalCostUsd!==void 0&&P.push(Ue(D.totalCostUsd));let ie=Number(D.usage?.input_tokens??0),xe=Number(D.usage?.output_tokens??0);ie+xe>0&&P.push(Q(ie+xe)+" tokens"),P.length>0&&console.log(Gh.dim(" \xB7 "+P.join(" \xB7 ")))}console.log("")}}catch(f){s.fail("Failed to send message"),U(f)}finally{if(d&&p.totalTurns>0)try{let g=Cr(p,u).replace(/\.json$/,"").split("/").pop()??u??p.sessionId??"unknown";process.stderr.write(`Continue with: afk chat <msg> --resume ${g}
1942
- `)}catch{}i&&await i.close(),a?.close(),l!==void 0&&await l.cleanup()}})}H();import OL from"ora";import*as Mw from"node:os";import*as Zn from"node:path";import{execFileSync as $L}from"node:child_process";var Li=new Set;function Mr(e){return Li.add(e),()=>{Li.delete(e)}}async function Jc(){await Promise.all([...Li].map(e=>e())),Li.clear()}var RP=/^[A-Za-z0-9_@%+=:,./-]+$/;function Xh(e){return RP.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function Or(e,t){let n=["afk","interactive"];return typeof t=="string"&&t.length>0&&n.push("--model",Xh(t)),n.push("--resume",Xh(e)),n.join(" ")}import{homedir as _P}from"node:os";import{sep as At}from"node:path";function Fi(e,t={}){if(!e)return"";let n=t.homedir??_P(),r=CP(e,n),o=t.maxWidth;if(o===void 0||o<=0||K(r)<=o)return r;let s=r.split(At).filter(u=>u.length>0);if(s.length<=1)return ce(r,o);let a=r.startsWith("~")?"~":s[0],l=1,c=s[s.length-1],d=[];for(let u=s.length-2;u>=l;u--){let p=s.slice(l,u+1),f=p.length>0?p.join(At)+At:"";d.push(`${a}${At}${f}\u2026${At}${c}`)}d.push(`${a}${At}\u2026${At}${c}`);for(let u of d)if(K(u)<=o)return u;return ce(d[d.length-1],o)}function CP(e,t){if(!t)return e;if(e===t)return"~";let n=t.endsWith(At)?t:t+At;return e.startsWith(n)?"~"+At+e.slice(n.length):e}import*as tw from"node:readline";function Qh(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?m.error:t>.5?m.warning:m.meta,r=20,o=Math.round(t*r),s=r-o,i="["+"\u2588".repeat(o)+"\u2591".repeat(s)+"]",a=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=Q(e.used)+"/"+Q(e.limit));let c=l?`${i} ${a} ${l}`:`${i} ${a}`,d=`${i} ${a}`,u=`ctx ${a}`,p=e.sparkline?m.meta(e.sparkline)+" ":"",f=e.sparkline?K(e.sparkline)+1:0,g=Math.max(0,e.width-f);if(K(c)<=g&&g>90)return p+n(c);if(K(d)<=g&&g>32)return p+n(d);if(K(u)<=g)return p+n(u);if(e.width>0){let h=p+n(u);return ce(h,e.width)}return n(a)}var Ni=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;lastPaintedRow=null;extraRows=0;constructor(t={}){this.stream=t.stream??process.stdout,this.force=t.force??!1,this.throttleMs=t.throttleMs??100}get enabled(){return this.force||!!this.stream.isTTY}start(){if(this.started||!this.enabled)return;this.started=!0,this.lastRepaint=0;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.resizeUnsub===null&&(this.resizeUnsub=ot.subscribe(()=>{this.onResize()}))}onResize(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.lastPaintedRow!==null&&this.lastPaintedRow!==this.paintRow(t)&&(this.stream.write(`\x1B[${this.lastPaintedRow};1H`),this.stream.write("\x1B[2K")),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}repaint(t){if(!this.enabled||!this.started){this.lastFields=t;return}let n=Date.now();if(n-this.lastRepaint<this.throttleMs){this.lastFields=t;return}this.lastRepaint=n,this.lastFields=t;let r=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.paintRow(r)};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatLine(t)),this.stream.write("\x1B[u"),this.lastPaintedRow=this.paintRow(r)}flush(){this.lastRepaint=0,this.lastFields&&this.repaint(this.lastFields)}setExtraRows(t){if(this.extraRows=t,this.started&&this.enabled){let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}getExtraRows(){return this.extraRows}rearm(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}withFullScrollRegion(t){if(!this.started||!this.enabled)return t();this.stream.write("\x1B[s"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u");try{return t()}finally{let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}stop(){if(this.resizeUnsub!==null&&(this.resizeUnsub(),this.resizeUnsub=null),!this.started||!this.enabled){this.started=!1;return}let t=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.lastPaintedRow??this.paintRow(t)};1H`),this.stream.write("\x1B[2K"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u"),this.started=!1,this.lastRepaint=0,this.lastPaintedRow=null}formatLine(t){let n=[],r=Math.max(4,(this.stream.columns??80)-2);if(t.cwd){let s=Math.max(8,Math.floor(r*.4)),i=Fi(t.cwd,{maxWidth:s});i&&n.push(m.dim(i))}if(n.push(m.brand(t.model)),t.planMode&&n.push(m.warning("\u25CF plan")),t.contextPct!==void 0){let s=Qh({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push(s)}t.cost!==void 0&&n.push(m.meta(`$${t.cost.toFixed(2)}`)),t.tokens!==void 0&&n.push(m.meta(`${IP(t.tokens)} tok`));let o=n.join(m.dim(" \xB7 "));return ce(o,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){let n=1+this.extraRows;if(t>n){this.stream.write(`\x1B[1;${t-n}r`);return}this.stream.write("\x1B[r")}};function IP(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}var et=new Map,jn=new Map;function de(e){if(et.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);et.set(e.name,e);for(let t of e.aliases??[]){if(jn.has(t)||et.has(t))throw new Error(`Slash alias collides: ${t}`);jn.set(t,e.name)}}function gn(e){if(et.has(e.name)){for(let[t,n]of jn.entries())n===e.name&&jn.delete(t);et.delete(e.name)}de(e)}function Zh(e){et.has(e.name)||de(e)}function ey(){et.clear(),jn.clear()}function je(){return[...et.values()].sort((e,t)=>e.name.localeCompare(t.name))}function ty(){let e=[];for(let[t,n]of jn.entries()){let r=et.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function PP(e){if(et.has(e))return et.get(e);let t=jn.get(e);return t?et.get(t):void 0}function MP(e,t){let n=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(0));for(let r=0;r<=e.length;r++)n[r][0]=r;for(let r=0;r<=t.length;r++)n[0][r]=r;for(let r=1;r<=e.length;r++)for(let o=1;o<=t.length;o++){let s=e[r-1]===t[o-1]?0:1;n[r][o]=Math.min(n[r-1][o]+1,n[r][o-1]+1,n[r-1][o-1]+s)}return n[e.length][t.length]}function OP(e,t=3){let n;for(let r of et.keys()){let o=MP(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function Vc(e){let t=e.trim();if(!t.startsWith("/"))return null;let n=t.indexOf(" ");return n===-1?{name:t,args:""}:{name:t.slice(0,n),args:t.slice(n+1).trim()}}async function ny(e,t,n){let r=Vc(e);if(r===null)return{handled:!1};let o=PP(r.name);if(!o){let a=OP(r.name);return a?t.out.warn(`Unknown command: ${r.name} (did you mean ${a}?)`):t.out.warn(`Unknown command: ${r.name} (type /help for commands)`),{handled:!0,result:"continue"}}let s=n??[];s.length>0&&o.acceptsAttachments!==!0&&t.out.warn(`\u26A0 Image attachments are ignored by ${r.name} (images only reach the model on skill commands like /forge, /mint).`);let i=await o.handler(t,r.args,o.acceptsAttachments===!0?s:void 0);return i==="forward"?{handled:!1}:{handled:!0,result:i}}import DP from"ora";function ry(e,t=5){if(e.length===0)return"";let n=e.slice(-t),r=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];return n.map(o=>{let s=Math.max(0,Math.min(1,o)),i=Math.min(7,Math.floor(s*8));return r[i]}).join("")}function Ui(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}var ji={stream:process.stdout,hideCursor:!1,discardStdin:!1};function Yc(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];return n?(n.input+n.output+n.cache)/Qe(e.model):0}function Ho(e,t){let n=Yc(e,t),r=Qe(e.model),o,s=t?.getDetail();if(s!==void 0)o=s.used;else{let a=e.turnTokens[e.turnTokens.length-1];a&&(o=a.input+a.output+a.cache)}let i;if(e.turnTokens.length>=2){let a=e.turnTokens.map(c=>(c.input+c.output+c.cache)/r),l=ry(a,5);l.length>0&&(i=l)}return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:n,contextLimit:r,contextUsedTokens:o,contextSparkline:i,planMode:e.planMode,...e.cwd!==void 0?{cwd:e.cwd}:{}}}var LP={name:"/exit",aliases:["/quit"],summary:"Exit the session",hint:"When you want to tear down the REPL \u2014 Ctrl+D on an empty prompt does the same.",async handler(){return"exit"}},FP={name:"/clear",summary:"Clear conversation history",hint:"When the current thread has drifted off-topic or you want a clean slate without restarting the session.",async handler(e){try{await e.session.current.reset(),e.ui.clearScreen(),Kh(e.stats),e.ledger?.clear(),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},NP={name:"/compact",summary:"Compact history (summarize older messages)",hint:"When context is filling up but you want to keep the thread \u2014 summarizes old turns and keeps the recent ones intact.",async handler(e){let t=DP({text:m.meta("Summarizing earlier turns..."),...ji}).start();try{let n=await e.session.current.compact();if(t.stop(),n.compacted){let r=n.tokensSavedEstimate?` (~${n.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${n.messagesBefore} \u2192 ${n.messagesAfter} messages${r}.`)}else{let r=n.reason??"unknown";r==="aborted"?e.out.info("Compaction cancelled."):r.startsWith("summarization-failed")?e.out.error(`Compaction failed: ${r}. History unchanged.`):r==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):r==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):e.out.info(`Nothing to compact (${r}).`)}}catch(n){t.stop(),e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},UP={name:"/help",summary:"Show this help",hint:"When you want the full command list with usage strings \u2014 broader than this inline dropdown.",async handler(e){let t=je(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(m.bold(m.brand("Commands"))),e.out.line(be());for(let r of t){let o=r.usage??r.name,s=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${m.warning(o)}${s} ${m.dim(r.summary)}`)}return e.out.line(),e.out.line(m.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(),"continue"}},oy=[LP,FP,NP,UP];function Xc(e,t=30){return!e||e.length===0?m.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${m.dim(`+${e.length-t} more`)}`}function dt(e,t){return` ${m.label(e.padEnd(16))} ${t}`}function Bi(e){let t=[];t.push(" "+be("Session Debug")),e.sessionId&&t.push(dt("session",e.sessionId)),e.model&&t.push(dt("model",e.model)),e.permissionMode&&t.push(dt("permission",e.permissionMode)),e.cwd&&t.push(dt("cwd",e.cwd)),e.claudeCodeVersion&&t.push(dt("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(dt("api key",e.apiKeySource)),e.outputStyle&&t.push(dt("output style",e.outputStyle));let n=e.tools?.length??0;t.push(dt(`tools (${n})`,Xc(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):m.dim("(none)");t.push(dt(`mcp (${r.length})`,o));let s=e.skills?.length??0;t.push(dt(`skills (${s})`,Xc(e.skills)));let i=e.plugins?.length??0,a=i?(e.plugins??[]).map(c=>c.name).join(", "):m.dim("(none)");t.push(dt(`plugins (${i})`,a));let l=e.slashCommands?.length??0;return t.push(dt(`slash (${l})`,Xc(e.slashCommands))),t.push(" "+be()),t.join(`
1942
+ `)}catch{}i&&await i.close(),a?.close(),l!==void 0&&await l.cleanup()}})}K();import OL from"ora";import*as Mw from"node:os";import*as Zn from"node:path";import{execFileSync as $L}from"node:child_process";var Li=new Set;function Mr(e){return Li.add(e),()=>{Li.delete(e)}}async function Jc(){await Promise.all([...Li].map(e=>e())),Li.clear()}var RP=/^[A-Za-z0-9_@%+=:,./-]+$/;function Xh(e){return RP.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function Or(e,t){let n=["afk","interactive"];return typeof t=="string"&&t.length>0&&n.push("--model",Xh(t)),n.push("--resume",Xh(e)),n.join(" ")}import{homedir as _P}from"node:os";import{sep as At}from"node:path";function Fi(e,t={}){if(!e)return"";let n=t.homedir??_P(),r=CP(e,n),o=t.maxWidth;if(o===void 0||o<=0||G(r)<=o)return r;let s=r.split(At).filter(u=>u.length>0);if(s.length<=1)return ce(r,o);let a=r.startsWith("~")?"~":s[0],l=1,c=s[s.length-1],d=[];for(let u=s.length-2;u>=l;u--){let p=s.slice(l,u+1),f=p.length>0?p.join(At)+At:"";d.push(`${a}${At}${f}\u2026${At}${c}`)}d.push(`${a}${At}\u2026${At}${c}`);for(let u of d)if(G(u)<=o)return u;return ce(d[d.length-1],o)}function CP(e,t){if(!t)return e;if(e===t)return"~";let n=t.endsWith(At)?t:t+At;return e.startsWith(n)?"~"+At+e.slice(n.length):e}import*as tw from"node:readline";function Qh(e){let t=Math.max(0,Math.min(1,e.ratio)),n=t>.8?m.error:t>.5?m.warning:m.meta,r=20,o=Math.round(t*r),s=r-o,i="["+"\u2588".repeat(o)+"\u2591".repeat(s)+"]",a=Math.round(t*100)+"%",l="";e.used!==void 0&&e.limit!==void 0&&(l=Q(e.used)+"/"+Q(e.limit));let c=l?`${i} ${a} ${l}`:`${i} ${a}`,d=`${i} ${a}`,u=`ctx ${a}`,p=e.sparkline?m.meta(e.sparkline)+" ":"",f=e.sparkline?G(e.sparkline)+1:0,g=Math.max(0,e.width-f);if(G(c)<=g&&g>90)return p+n(c);if(G(d)<=g&&g>32)return p+n(d);if(G(u)<=g)return p+n(u);if(e.width>0){let h=p+n(u);return ce(h,e.width)}return n(a)}var Ni=class{stream;force;throttleMs;started=!1;lastRepaint=0;lastFields=null;resizeUnsub=null;lastPaintedRow=null;extraRows=0;constructor(t={}){this.stream=t.stream??process.stdout,this.force=t.force??!1,this.throttleMs=t.throttleMs??100}get enabled(){return this.force||!!this.stream.isTTY}start(){if(this.started||!this.enabled)return;this.started=!0,this.lastRepaint=0;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.resizeUnsub===null&&(this.resizeUnsub=ot.subscribe(()=>{this.onResize()}))}onResize(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.lastPaintedRow!==null&&this.lastPaintedRow!==this.paintRow(t)&&(this.stream.write(`\x1B[${this.lastPaintedRow};1H`),this.stream.write("\x1B[2K")),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}repaint(t){if(!this.enabled||!this.started){this.lastFields=t;return}let n=Date.now();if(n-this.lastRepaint<this.throttleMs){this.lastFields=t;return}this.lastRepaint=n,this.lastFields=t;let r=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.paintRow(r)};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatLine(t)),this.stream.write("\x1B[u"),this.lastPaintedRow=this.paintRow(r)}flush(){this.lastRepaint=0,this.lastFields&&this.repaint(this.lastFields)}setExtraRows(t){if(this.extraRows=t,this.started&&this.enabled){let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}getExtraRows(){return this.extraRows}rearm(){if(!this.started||!this.enabled)return;let t=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(t),this.stream.write("\x1B[u"),this.flush()}withFullScrollRegion(t){if(!this.started||!this.enabled)return t();this.stream.write("\x1B[s"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u");try{return t()}finally{let n=this.currentRows();this.stream.write("\x1B[s"),this.writeScrollRegion(n),this.stream.write("\x1B[u"),this.flush()}}stop(){if(this.resizeUnsub!==null&&(this.resizeUnsub(),this.resizeUnsub=null),!this.started||!this.enabled){this.started=!1;return}let t=this.currentRows();this.stream.write("\x1B[s"),this.stream.write(`\x1B[${this.lastPaintedRow??this.paintRow(t)};1H`),this.stream.write("\x1B[2K"),this.stream.write("\x1B[r"),this.stream.write("\x1B[u"),this.started=!1,this.lastRepaint=0,this.lastPaintedRow=null}formatLine(t){let n=[],r=Math.max(4,(this.stream.columns??80)-2);if(t.cwd){let s=Math.max(8,Math.floor(r*.4)),i=Fi(t.cwd,{maxWidth:s});i&&n.push(m.dim(i))}if(n.push(m.brand(t.model)),t.planMode&&n.push(m.warning("\u25CF plan")),t.contextPct!==void 0){let s=Qh({ratio:t.contextPct,used:t.contextUsedTokens,limit:t.contextLimit,sparkline:t.contextSparkline,width:r});n.push(s)}t.cost!==void 0&&n.push(m.meta(`$${t.cost.toFixed(2)}`)),t.tokens!==void 0&&n.push(m.meta(`${IP(t.tokens)} tok`));let o=n.join(m.dim(" \xB7 "));return ce(o,r)}currentRows(){let t=this.stream.rows;return typeof t=="number"&&t>0?t:24}paintRow(t){return t>1?t:1}writeScrollRegion(t){let n=1+this.extraRows;if(t>n){this.stream.write(`\x1B[1;${t-n}r`);return}this.stream.write("\x1B[r")}};function IP(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}var et=new Map,jn=new Map;function de(e){if(et.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);et.set(e.name,e);for(let t of e.aliases??[]){if(jn.has(t)||et.has(t))throw new Error(`Slash alias collides: ${t}`);jn.set(t,e.name)}}function gn(e){if(et.has(e.name)){for(let[t,n]of jn.entries())n===e.name&&jn.delete(t);et.delete(e.name)}de(e)}function Zh(e){et.has(e.name)||de(e)}function ey(){et.clear(),jn.clear()}function je(){return[...et.values()].sort((e,t)=>e.name.localeCompare(t.name))}function ty(){let e=[];for(let[t,n]of jn.entries()){let r=et.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function PP(e){if(et.has(e))return et.get(e);let t=jn.get(e);return t?et.get(t):void 0}function MP(e,t){let n=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(0));for(let r=0;r<=e.length;r++)n[r][0]=r;for(let r=0;r<=t.length;r++)n[0][r]=r;for(let r=1;r<=e.length;r++)for(let o=1;o<=t.length;o++){let s=e[r-1]===t[o-1]?0:1;n[r][o]=Math.min(n[r-1][o]+1,n[r][o-1]+1,n[r-1][o-1]+s)}return n[e.length][t.length]}function OP(e,t=3){let n;for(let r of et.keys()){let o=MP(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function Vc(e){let t=e.trim();if(!t.startsWith("/"))return null;let n=t.indexOf(" ");return n===-1?{name:t,args:""}:{name:t.slice(0,n),args:t.slice(n+1).trim()}}async function ny(e,t,n){let r=Vc(e);if(r===null)return{handled:!1};let o=PP(r.name);if(!o){let a=OP(r.name);return a?t.out.warn(`Unknown command: ${r.name} (did you mean ${a}?)`):t.out.warn(`Unknown command: ${r.name} (type /help for commands)`),{handled:!0,result:"continue"}}let s=n??[];s.length>0&&o.acceptsAttachments!==!0&&t.out.warn(`\u26A0 Image attachments are ignored by ${r.name} (images only reach the model on skill commands like /forge, /mint).`);let i=await o.handler(t,r.args,o.acceptsAttachments===!0?s:void 0);return i==="forward"?{handled:!1}:{handled:!0,result:i}}import DP from"ora";function ry(e,t=5){if(e.length===0)return"";let n=e.slice(-t),r=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];return n.map(o=>{let s=Math.max(0,Math.min(1,o)),i=Math.min(7,Math.floor(s*8));return r[i]}).join("")}function Ui(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}var ji={stream:process.stdout,hideCursor:!1,discardStdin:!1};function Yc(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];return n?(n.input+n.output+n.cache)/Qe(e.model):0}function Ho(e,t){let n=Yc(e,t),r=Qe(e.model),o,s=t?.getDetail();if(s!==void 0)o=s.used;else{let a=e.turnTokens[e.turnTokens.length-1];a&&(o=a.input+a.output+a.cache)}let i;if(e.turnTokens.length>=2){let a=e.turnTokens.map(c=>(c.input+c.output+c.cache)/r),l=ry(a,5);l.length>0&&(i=l)}return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:n,contextLimit:r,contextUsedTokens:o,contextSparkline:i,planMode:e.planMode,...e.cwd!==void 0?{cwd:e.cwd}:{}}}var LP={name:"/exit",aliases:["/quit"],summary:"Exit the session",hint:"When you want to tear down the REPL \u2014 Ctrl+D on an empty prompt does the same.",async handler(){return"exit"}},FP={name:"/clear",summary:"Clear conversation history",hint:"When the current thread has drifted off-topic or you want a clean slate without restarting the session.",async handler(e){try{await e.session.current.reset(),e.ui.clearScreen(),Kh(e.stats),e.ledger?.clear(),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},NP={name:"/compact",summary:"Compact history (summarize older messages)",hint:"When context is filling up but you want to keep the thread \u2014 summarizes old turns and keeps the recent ones intact.",async handler(e){let t=DP({text:m.meta("Summarizing earlier turns..."),...ji}).start();try{let n=await e.session.current.compact();if(t.stop(),n.compacted){let r=n.tokensSavedEstimate?` (~${n.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${n.messagesBefore} \u2192 ${n.messagesAfter} messages${r}.`)}else{let r=n.reason??"unknown";r==="aborted"?e.out.info("Compaction cancelled."):r.startsWith("summarization-failed")?e.out.error(`Compaction failed: ${r}. History unchanged.`):r==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):r==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):e.out.info(`Nothing to compact (${r}).`)}}catch(n){t.stop(),e.out.error(n instanceof Error?n.message:"Unknown error")}return"continue"}},UP={name:"/help",summary:"Show this help",hint:"When you want the full command list with usage strings \u2014 broader than this inline dropdown.",async handler(e){let t=je(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(m.bold(m.brand("Commands"))),e.out.line(be());for(let r of t){let o=r.usage??r.name,s=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${m.warning(o)}${s} ${m.dim(r.summary)}`)}return e.out.line(),e.out.line(m.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(),"continue"}},oy=[LP,FP,NP,UP];function Xc(e,t=30){return!e||e.length===0?m.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${m.dim(`+${e.length-t} more`)}`}function dt(e,t){return` ${m.label(e.padEnd(16))} ${t}`}function Bi(e){let t=[];t.push(" "+be("Session Debug")),e.sessionId&&t.push(dt("session",e.sessionId)),e.model&&t.push(dt("model",e.model)),e.permissionMode&&t.push(dt("permission",e.permissionMode)),e.cwd&&t.push(dt("cwd",e.cwd)),e.claudeCodeVersion&&t.push(dt("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(dt("api key",e.apiKeySource)),e.outputStyle&&t.push(dt("output style",e.outputStyle));let n=e.tools?.length??0;t.push(dt(`tools (${n})`,Xc(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):m.dim("(none)");t.push(dt(`mcp (${r.length})`,o));let s=e.skills?.length??0;t.push(dt(`skills (${s})`,Xc(e.skills)));let i=e.plugins?.length??0,a=i?(e.plugins??[]).map(c=>c.name).join(", "):m.dim("(none)");t.push(dt(`plugins (${i})`,a));let l=e.slashCommands?.length??0;return t.push(dt(`slash (${l})`,Xc(e.slashCommands))),t.push(" "+be()),t.join(`
1943
1943
  `)}var ed=["opus","opus_1m","sonnet","sonnet_1m","haiku"],HP={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(be()),n.line(` total ${m.success(Ue(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(Ue(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(Ue).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),"continue"}};function KP(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,s=n?.cache_read_input_tokens??0,i=n?.cache_creation_input_tokens??0,a=r+o+s+i;e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(be()),e.line(` total ${m.success(Q(t.totalTokens))} of ${m.meta(Q(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(Q(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(Q(r))}`),e.line(` output ${m.meta(Q(o))}`),e.line(` cache read ${m.meta(Q(s))}`),e.line(` cache creat ${m.meta(Q(i))}`),e.line(` total ${m.meta(Q(a))}`);let l=t.categories??[];if(l.length>0){let p=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let f of p)e.line(` ${m.warning(f.name.padEnd(18))} ${m.meta(Q(f.tokens))}`)}let c=t.systemTools??[],d=t.mcpTools??[];if(c.length>0||d.length>0){e.line();let p=c.reduce((g,h)=>g+h.tokens,0),f=d.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(m.dim(` system tools ${c.length} tools, ${Q(p)} tokens`)),d.length>0&&e.line(m.dim(` MCP tools ${d.length} tools, ${Q(f)} tokens`))}let u=t.agents??[];if(u.length>0){let p=u.reduce((f,g)=>f+g.tokens,0);e.line(m.dim(` agents ${u.length} loaded, ${Q(p)} tokens`))}if(t.skills){let p=t.skills;e.line(m.dim(` skills ${p.includedSkills}/${p.totalSkills} included, ${Q(p.tokens)} tokens`))}if(t.slashCommands){let p=t.slashCommands;e.line(m.dim(` slash cmds ${p.includedCommands}/${p.totalCommands} included, ${Q(p.tokens)} tokens`))}e.line()}function GP(e,t){let n=t.turnTokens.reduce((c,d)=>c+d.input,0),r=t.turnTokens.reduce((c,d)=>c+d.output,0),o=t.turnTokens.reduce((c,d)=>c+d.cache,0),s=n+r,i=Qe(t.model),a=n+r+o,l=Math.round(a/i*100);e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(be()),e.line(` input ${m.meta(Q(n))}`),e.line(` output ${m.meta(Q(r))}`),e.line(` cache read ${m.meta(Q(o))}`),e.line(` total ${m.success(Q(s))}`),e.line(` context ${m.meta(`${l}% of ${Q(i)} (${t.model})`)}`),e.line()}var zP={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();KP(e.out,t)}catch{GP(e.out,e.stats)}return"continue"}},qP={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(be()),t.turns.forEach((r,o)=>{let s=m.meta(`#${o+1}`),i=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${s} ${m.user("\u25B6")} ${i}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}},JP={name:"/reset",summary:"Clear screen, history, and session stats",async handler(e){let{stats:t,ui:n,out:r}=e;try{await e.session.current.sendMessage("/clear")}catch{}return t.totalTurns=0,t.totalCostUsd=0,t.totalTokens=0,t.totalDurationMs=0,t.turnCosts.length=0,t.turnTokens.length=0,t.turns.length=0,t.sessionStartTime=Date.now(),n.clearScreen(),r.success("Session reset."),"continue"}},VP={name:"/model",usage:"/model <opus|opus_1m|sonnet|sonnet_1m|haiku|org/model>",summary:"Switch the active model mid-session",hint:"When you want to upgrade to opus for a hard problem or downshift to haiku for cheap iteration \u2014 context carries over. Also accepts full HuggingFace-style IDs (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(!n)return e.out.info(`Current model: ${m.brand(e.stats.model)}`),e.out.line(m.dim(` Aliases: ${ed.join(", ")} (or any org/model HF id)`)),"continue";let r=ed.includes(n),o=Ee(n)==="openai-compatible";if(!r&&!o)return e.out.warn(`Unknown model: ${n}. Aliases: ${ed.join(", ")} (or org/model for local/OpenAI-compatible)`),"continue";try{await e.session.current.setModel(n),e.stats.model=n,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(n)}`)}catch(s){e.out.error(`Failed to switch model: ${s instanceof Error?s.message:String(s)}`)}return"continue"}},YP={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(be());let r=3,o=Math.ceil(n.length/r),s=Math.max(...n.map(i=>i.length))+2;for(let i=0;i<o;i++){let a=[];for(let l=0;l<r;l++){let c=l*o+i;c<n.length&&a.push(n[c].padEnd(s))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},XP={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(Ki(),py)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(be());for(let[s,i]of Object.entries(o)){let a=Date.now()-i.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${s} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(i.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),s=o.indexOf(" ");if(s===-1||o.slice(0,s).length===0||o.slice(s+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let i=o.slice(0,s).trim(),a=o.slice(s+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${i}"\u2026`),await e.mcpManager.completeAuth(i,a),e.out.success(`OAuth complete for "${i}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${i}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(be());let s=0;for(let i of o){let a=typeof i=="string"?i:i.name??JSON.stringify(i),l=typeof i=="object"&&i!==null&&"status"in i?String(i.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&s++}e.out.line(),s>0&&(e.out.line(m.dim(` ${s} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},QP={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(be());for(let[t,n]of Object.entries(Ao)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(Q(n))}${r}`)}return e.out.line(),"continue"}},ZP={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(Bi(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},my=[HP,zP,qP,JP,VP,YP,XP,QP,ZP];var td=!1;async function gt(e,t,n={}){let r=e.stats.planMode,o=t!==void 0?t:!r;try{if(await e.session.current.setPermissionMode(o?"plan":"default"),e.stats.planMode=o,e.ui.repaintStatusLine(),o){let s=td?"":m.dim(" Shift+Tab or /plan to exit.");td||(td=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 write_file, edit_file, and write-intent bash are refused.")+s)}else n.closureSummarySkipped?e.out.success(m.success("\u25CB plan mode OFF")+m.dim(" \u2014 force-exit (closure summary skipped). Default permissions restored.")):e.out.success(m.success("\u25CB plan mode OFF")+m.dim(" \u2014 default permissions restored"))}catch(s){e.out.error(`Could not toggle plan mode: ${s instanceof Error?s.message:String(s)}`)}}async function fy(e){e.stats.pendingPlanExit&&(await gt(e,!1),e.stats.planMode||(e.stats.pendingPlanExit=!1))}var eM=["You are about to exit plan mode. Before I flip permissions back to default on the next turn, emit your final plan in three sections:",""," - **Chosen approach** \u2014 the plan you recommend, in one to three sentences."," - **Risks named** \u2014 the concrete failure modes, constraints, or unknowns this plan does not eliminate."," - **Alternatives considered** \u2014 the options you weighed and why you rejected them.","","This is the record. Be specific. Do not propose write actions in this turn \u2014 writes are still refused until the mode flips."].join(`
1944
- `);async function tM(e){return e.stats.pendingPlanExit=!0,e.ui.repaintStatusLine(),e.out.success(m.warning("\u25CF plan exit queued")+m.dim(" \u2014 plan mode still ON; writes still refused. Submitting closure summary (chosen approach, risks, alternatives); mode flips after the model responds. Force-exit now: /plan off again or Shift+Tab.")),{kind:"submit",message:eM}}async function nM(e){return e.stats.pendingPlanExit=!1,await gt(e,!1,{closureSummarySkipped:!0}),"continue"}async function rM(e){return e.stats.pendingPlanExit=!1,e.ui.repaintStatusLine(),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 plan exit cancelled, staying in plan mode.")),"continue"}function oM(e){e.out.info(m.dim("(plan exit cancelled \u2014 submitting your prompt instead.)"))}var gy={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode (write_file, edit_file, and write-intent bash refused)",hint:"When you want the model to think through an approach without touching files \u2014 refuses writes until you flip back. Shift+Tab toggles too.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();if(n!==""&&r!=="on"&&r!=="off"){let s=!!e.stats.pendingPlanExit;return e.stats.planMode||await gt(e,!0),s&&(e.stats.pendingPlanExit=!1,oM(e)),{kind:"submit",message:n}}return(r==="on"?!0:r==="off"?!1:!e.stats.planMode)===!0?e.stats.pendingPlanExit?rM(e):(e.stats.planMode||await gt(e,!0),"continue"):e.stats.planMode?e.stats.pendingPlanExit?nM(e):tM(e):(await gt(e,!1),"continue")}};F();import{readFileSync as sM,writeFileSync as iM,existsSync as hy,mkdirSync as aM}from"fs";import{join as lM}from"path";function yy(){return lp(),Tl()}function by(e){return lM(yy(),`${e}.json`)}function Gi(e){let t=by(e);if(!hy(t))return{sessionId:e,items:[]};try{let n=sM(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function Ko(e){let t=yy();hy(t)||aM(t,{recursive:!0}),iM(by(e.sessionId),JSON.stringify(e,null,2))}function ky(e,t){let r={id:e.items.reduce((o,s)=>Math.max(o,s.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function wy(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function Sy(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function vy(e){e.items.length=0}function zi(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,te());{let r=m.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+m.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?m.success("[x]"):m.dim("[ ]"),s=r.done?m.dim(r.text):Vt(r.text),a=` ${m.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-K(a)),c=pe(s,l).split(`
1945
- `);t.push(a+(c[0]??""));let d=" ".repeat(K(a));for(let u of c.slice(1))t.push(d+u)}{let r=Math.max(0,Math.min(n-1,120));t.push(m.dim("\u2514"+"\u2500".repeat(r)))}return t}function Ty(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
1944
+ `);async function tM(e){return e.stats.pendingPlanExit=!0,e.ui.repaintStatusLine(),e.out.success(m.warning("\u25CF plan exit queued")+m.dim(" \u2014 plan mode still ON; writes still refused. Submitting closure summary (chosen approach, risks, alternatives); mode flips after the model responds. Force-exit now: /plan off again or Shift+Tab.")),{kind:"submit",message:eM}}async function nM(e){return e.stats.pendingPlanExit=!1,await gt(e,!1,{closureSummarySkipped:!0}),"continue"}async function rM(e){return e.stats.pendingPlanExit=!1,e.ui.repaintStatusLine(),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 plan exit cancelled, staying in plan mode.")),"continue"}function oM(e){e.out.info(m.dim("(plan exit cancelled \u2014 submitting your prompt instead.)"))}var gy={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode (write_file, edit_file, and write-intent bash refused)",hint:"When you want the model to think through an approach without touching files \u2014 refuses writes until you flip back. Shift+Tab toggles too.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();if(n!==""&&r!=="on"&&r!=="off"){let s=!!e.stats.pendingPlanExit;return e.stats.planMode||await gt(e,!0),s&&(e.stats.pendingPlanExit=!1,oM(e)),{kind:"submit",message:n}}return(r==="on"?!0:r==="off"?!1:!e.stats.planMode)===!0?e.stats.pendingPlanExit?rM(e):(e.stats.planMode||await gt(e,!0),"continue"):e.stats.planMode?e.stats.pendingPlanExit?nM(e):tM(e):(await gt(e,!1),"continue")}};F();import{readFileSync as sM,writeFileSync as iM,existsSync as hy,mkdirSync as aM}from"fs";import{join as lM}from"path";function yy(){return lp(),Tl()}function by(e){return lM(yy(),`${e}.json`)}function Gi(e){let t=by(e);if(!hy(t))return{sessionId:e,items:[]};try{let n=sM(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function Ko(e){let t=yy();hy(t)||aM(t,{recursive:!0}),iM(by(e.sessionId),JSON.stringify(e,null,2))}function ky(e,t){let r={id:e.items.reduce((o,s)=>Math.max(o,s.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function wy(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function Sy(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function vy(e){e.items.length=0}function zi(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,te());{let r=m.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+m.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?m.success("[x]"):m.dim("[ ]"),s=r.done?m.dim(r.text):Vt(r.text),a=` ${m.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-G(a)),c=pe(s,l).split(`
1945
+ `);t.push(a+(c[0]??""));let d=" ".repeat(G(a));for(let u of c.slice(1))t.push(d+u)}{let r=Math.max(0,Math.min(n-1,120));t.push(m.dim("\u2514"+"\u2500".repeat(r)))}return t}function Ty(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
1946
1946
  `)}function Ey(e){let t=e.stats.sessionId??"unbound";return Gi(t)}function cM(e){let t=Ey(e),n=zi(t);if(n.length===0){e.out.info("No todos yet. Try /todo add buy milk");return}for(let r of n)e.out.line(r)}var xy={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",hint:"When you want a durable checklist the model and you both see \u2014 survives across turns and shows above each prompt.",async handler(e,t){let n=t.trim();if(!n||n==="list")return cM(e),"continue";let[r,...o]=n.split(/\s+/),s=o.join(" "),i=Ey(e);switch(r){case"add":{if(!s)return e.out.warn("Usage: /todo add <text>"),"continue";let a=ky(i,s);return Ko(i),e.out.success(`Added ${m.meta(`#${a.id}`)} ${a.text}`),"continue"}case"done":{let a=parseInt(s,10);if(!Number.isFinite(a))return e.out.warn("Usage: /todo done <id>"),"continue";let l=wy(i,a);return l?(Ko(i),e.out.success(`Marked done ${m.meta(`#${a}`)} ${l.text}`)):e.out.warn(`No todo with id ${a}`),"continue"}case"rm":case"remove":{let a=parseInt(s,10);return Number.isFinite(a)?(Sy(i,a)?(Ko(i),e.out.success(`Removed ${m.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return vy(i),Ko(i),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}};var Ay={name:"/save",usage:"/save [name]",hint:"When you want to checkpoint this conversation so /resume can pick it back up in a future session.",summary:"Save this session to disk (for /resume)",async handler(e,t){if(e.stats.totalTurns===0)return e.out.warn("Nothing to save \u2014 no turns in this session yet."),"continue";try{let n=t.trim()||void 0,r=Cr(e.stats,n);e.out.success(m.success("Saved")+m.dim(` ${r}`));let o=e.stats.sessionId??n;o&&e.out.line(m.dim(` Resume: ${Or(o,e.stats.model)}`))}catch(n){e.out.error(`Could not save: ${n instanceof Error?n.message:String(n)}`)}return"continue"}};function dM(e){if(typeof e!="number"||!Number.isFinite(e))return" \u2014 ";let t=new Date(e);return Number.isNaN(t.getTime())?" \u2014 ":t.toISOString().replace("T"," ").slice(0,16)}function uM(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}var Ry={name:"/resume",usage:"/resume [id]",hint:"When you want to continue a previously /saved session \u2014 runs interactively to pick one if no id is given.",summary:"List saved sessions, or swap the active session for a stored one",async handler(e,t){let n=t.trim();if(n){let o=Ir(n);if(!o)return e.out.warn(`No saved session: ${n}`),"continue";if(typeof e.requestResume=="function"){let a=e.session.current.sessionId,l=o.data.sessionId;if(a!==void 0&&l!==void 0&&a===l||a!==void 0&&a===o.id)return e.out.warn(`Already on session ${o.id}.`),"continue";e.out.info(`Resuming session ${o.id} \u2026`);let d=await e.requestResume(uM(o));return d.ok?e.out.success(`Resumed ${o.id} (sdk id: ${d.sessionId})`):e.out.warn(d.reason),"continue"}let s=o.data,i=s.sessionId??o.id;return e.out.line(),e.out.line(m.bold(`Session ${o.id}`)),e.out.line(be()),e.out.line(` model ${m.brand(s.model)}`),e.out.line(` turns ${m.meta(String(s.totalTurns))}`),e.out.line(` cost ${m.meta(Ue(s.totalCostUsd))}`),e.out.line(` sdk id ${m.meta(s.sessionId??"\u2014")}`),e.out.line(),e.out.line(m.dim(" Resume with:")),e.out.line(m.brand(` ${Or(i,s.model)}`)),e.out.line(),"continue"}let r=Wo();if(r.length===0)return e.out.info("No saved sessions found. Use /save first."),"continue";e.out.line(),e.out.line(m.bold(`Saved sessions (${r.length})`)),e.out.line(be());for(let o of r.slice(0,20)){let s=dM(o.savedAt),i=m.brand(o.model.padEnd(7)),a=m.meta(`${o.totalTurns} turn${o.totalTurns===1?"":"s"}`.padEnd(9)),l=m.meta(Ue(o.totalCostUsd).padStart(8)),c=m.warning(o.id);e.out.line(` ${s} ${i} ${a} ${l} ${c}`)}return e.out.line(),e.out.line(m.dim(" Resume with: /resume <id>")),e.out.line(),"continue"}};import{existsSync as bM,readFileSync as kM}from"node:fs";import{resolve as My}from"node:path";import{execFileSync as _y}from"node:child_process";import{readFileSync as pM,writeFileSync as mM}from"node:fs";import{resolve as fM}from"node:path";var gM={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},hM=["Added","Fixed","Changed","Deprecated","Removed","Security"];function Cy(e){let t;try{t=_y("git",["describe","--tags","--abbrev=0"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{t=""}let n=t?["log",`${t}..HEAD`,"--format=%h %s"]:["log","-50","--format=%h %s"],r=_y("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
1947
1947
  `).map(o=>{let s=o.indexOf(" "),i=o.slice(0,s),a=o.slice(s+1),l=a.match(/^(\w+(?:\+\w+)?)(?:\([^)]*\))?!?:\s*(.+)/);if(l){let c=l[1].toLowerCase(),d=gM[c]??"Changed";return{hash:i,subject:l[2],category:d}}return{hash:i,subject:a,category:"Changed"}}):[]}function Iy(e,t={}){let n=t.includeHash??!1,r=new Map;for(let s of e){let i=r.get(s.category)??[];i.push(s),r.set(s.category,i)}let o=[];for(let s of hM){let i=r.get(s);if(i?.length){o.push(`### ${s}`);for(let a of i)o.push(n?`- ${a.subject} (${a.hash})`:`- ${a.subject}`);o.push("")}}return o.join(`
1948
1948
  `)}function nd(e){return e.match(/## \[Unreleased\][^\n]*\n([\s\S]*?)(?=\n## \[|$)/)?.[1]?.trim()??""}function yM(e){let t=new Set;for(let n of e.split(`
@@ -1968,14 +1968,14 @@ ${d}`}function id(e,t){let n=Ny[t.status];e.out.line(` ${n} ${m.bold(t.jobId)}
1968
1968
 
1969
1969
  `),t&&(n=n.replace(/^\n+/,"").replace(/\n+$/,"")),n}function IM(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ud(e,t){let n=IM(t),r=new RegExp(`<${n}>`,"g"),o=r.test(e);r.lastIndex=0;let s=new RegExp(`(\\n|^)[ \\t]*<${n}>[ \\t]*\\n?`,"gm"),i=new RegExp(`(\\n|^)[ \\t]*</${n}>[ \\t]*\\n?`,"gm"),a=new RegExp(`</${n}>`,"g"),l=!1,c=e;return c=c.replace(s,(d,u)=>(l=!0,u)),c=c.replace(i,(d,u)=>(l=!0,u)),c=c.replace(r,()=>(l=!0,"")),c=c.replace(a,()=>(l=!0,"")),c=c.replace(/^[ \t]+$/gm,""),c=c.replace(/\n{3,}/g,`
1970
1970
 
1971
- `),l&&(c=c.replace(/^\n+/,"").replace(/\n+$/,"")),{text:c,found:o}}H();import{emitKeypressEvents as GM}from"readline";import{createLogUpdate as zM}from"log-update";import zo from"string-width";function Bn(e){let{buffer:t,promptText:n,isTTY:r,attachmentSummary:o}=e,s=o&&o.length>0?o:null;if(!r){let g=n+t;return s!==null?`${g} ${s}`:g}let i=e.terminalWidth??te(),a=t.includes(`
1971
+ `),l&&(c=c.replace(/^\n+/,"").replace(/\n+$/,"")),{text:c,found:o}}K();import{emitKeypressEvents as GM}from"readline";import{createLogUpdate as zM}from"log-update";import zo from"string-width";function Bn(e){let{buffer:t,promptText:n,isTTY:r,attachmentSummary:o}=e,s=o&&o.length>0?o:null;if(!r){let g=n+t;return s!==null?`${g} ${s}`:g}let i=e.terminalWidth??te(),a=t.includes(`
1972
1972
  `),l=zo(Ve(t)),c=l>=i-2,d;if(!a&&!c){let g=Math.max(0,i-l);d=" ".repeat(g)+t}else d=Yt({kind:"user",body:t});if(s===null)return d;let u=zo(s),p=Math.max(0,i-u),f=" ".repeat(p)+m.dim(s);return d+`
1973
1973
  `+f}function pd(e,t,n){let r=n||80,o=e.split(`
1974
1974
  `),s=0;for(let i=0;i<o.length;i++){let a=Ve(o[i]),l=(i===0?t:0)+zo(a);s+=Math.max(1,Math.ceil(l/r))}return Math.max(0,s-1)}function hn(e,t,n,r){let o=r||80,s=e.split(`
1975
1975
  `),i=0,a=0;for(let l=0;l<s.length;l++){let c=s[l],d=c.length+(l<s.length-1?1:0);if(t<=a+c.length){let p=t-a,f=Ve(c.slice(0,p)),g=(l===0?n:0)+zo(f),h=Math.floor(g/o),b=g%o;return{row:i+h,col:b}}let u=(l===0?n:0)+zo(Ve(c));i+=Math.max(1,Math.ceil(u/o)),a+=d}return{row:i,col:0}}function Wn(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Rt(e,t){let n=Wn(t,e.buffer.length);return n===e.cursor?e:{buffer:e.buffer,cursor:n}}function zy(e,t){let n=Wn(t,e.length);for(;n>0&&/\s/.test(e.charAt(n-1));)n--;for(;n>0&&!/\s/.test(e.charAt(n-1));)n--;return n}function qy(e,t){let n=e.length,r=Wn(t,n);for(;r<n&&/\s/.test(e.charAt(r));)r++;for(;r<n&&!/\s/.test(e.charAt(r));)r++;return r}function Jy(e,t){let n=Wn(t,e.length),r=n===0?-1:e.lastIndexOf(`
1976
1976
  `,n-1);return r<0?0:r+1}function Vy(e,t){let n=Wn(t,e.length),r=e.indexOf(`
1977
- `,n);return r<0?e.length:r}function yn(e,t,n){let r=Wn(t.start,e.buffer.length),o=Wn(t.end,e.buffer.length),s=Math.min(r,o),i=Math.max(r,o);if(s===i&&n.length===0)return e;let a=e.buffer.slice(0,s)+n+e.buffer.slice(i),l=s+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var z={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:yn,insert(e,t){return t.length===0?e:yn(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=Il(e.buffer,e.cursor);return yn(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=po(e.buffer,e.cursor);return yn(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=zy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=qy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=Jy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=Vy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:e.cursor,end:t},"")},moveLeft(e){return Rt(e,Il(e.buffer,e.cursor))},moveRight(e){return Rt(e,po(e.buffer,e.cursor))},moveHome(e){return Rt(e,0)},moveEnd(e){return Rt(e,e.buffer.length)},moveLineStart(e){return Rt(e,Jy(e.buffer,e.cursor))},moveLineEnd(e){return Rt(e,Vy(e.buffer,e.cursor))},moveWordBackward(e){return Rt(e,zy(e.buffer,e.cursor))},moveWordForward(e){return Rt(e,qy(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{row:o,col:s}=hn(e.buffer,e.cursor,n,r);if(o===0)return{moved:!1};let i=o-1,a=s,l=0,c=1/0;for(let u=0;u<=e.buffer.length;u++){let p=hn(e.buffer,u,n,r);if(p.row===i){let f=Math.abs(p.col-a);f<c&&(c=f,l=u)}else if(p.row>i)break}let d=Rt(e,l);return d===e?{moved:!1}:{moved:!0,state:d}},moveDownLine(e,t,n){let r=t||80,{row:o,col:s}=hn(e.buffer,e.cursor,n,r),i=hn(e.buffer,e.buffer.length,n,r);if(o>=i.row)return{moved:!1};let a=o+1,l=s,c=e.buffer.length,d=1/0;for(let p=0;p<e.buffer.length;p++){let f=hn(e.buffer,p,n,r);if(f.row===a){let g=Math.abs(f.col-l);g<d&&(d=g,c=p)}else if(f.row>a)break}i.row===a&&Math.abs(i.col-l)<d&&(c=e.buffer.length);let u=Rt(e,c);return u===e?{moved:!1}:{moved:!0,state:u}}};var Yy=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"];function md(){return Yy[Math.floor(Math.random()*Yy.length)]}H();var PM=[{id:"kbd:ctrl-b",text:"Ctrl+B during a turn detaches it to the background so you can keep typing \u2014 find it later with /tasks.",source:"static"},{id:"kbd:shift-tab",text:"Shift+Tab toggles plan mode (no file writes) without leaving the prompt.",source:"static"},{id:"kbd:ctrl-c",text:"Ctrl+C interrupts the current turn; press it twice in a row to exit the REPL.",source:"static"},{id:"kbd:at-path",text:"Type @ in the prompt to autocomplete a file path and attach its contents to your turn.",source:"static"},{id:"kbd:cmd-v",text:"Paste an image with Cmd+V (macOS) or Ctrl+V \u2014 clipboard images attach automatically.",source:"static"},{id:"env:tips-opt-out",text:"Set AFK_SPINNER_TIPS=0 to silence these loading-screen tips.",source:"static"}];function MM(){let e=[];for(let t of je())t.hint&&(t.name.includes(":")||e.push({id:`cmd:${t.name}`,text:`${t.name} \u2014 ${t.hint}`,source:"command"}));return e}function OM(e){let t=[];for(let n of mt()){let r=`cmd:/${n}`;if(e.has(r))continue;let o;try{o=Ce(n)}catch{continue}o.whenToUse&&t.push({id:`skill:${n}`,text:`/${n} \u2014 ${o.whenToUse}`,source:"skill"})}return t}function Zy(){if(E.AFK_SPINNER_TIPS==="0")return[];let e=MM(),t=new Set(e.map(r=>r.id)),n=OM(t);return[...PM,...e,...n]}var Xy=new Set,Qy=new Map;function eb(e,t){if(e.length===0)return null;let n=t.now??Date.now(),r=t.warmupMs??1500;if(n-t.startedAt<r)return null;let o=t.rotateMs??7e3,s=Math.floor((n-t.startedAt)/o),i=`${t.startedAt}:${s}`,a=Qy.get(i);if(a)return a;let l=null,c=e.filter(d=>!Xy.has(d.id));if(c.length>0){let d=(s%c.length+c.length)%c.length;l=c[d]??null}else{let d=(s%e.length+e.length)%e.length;l=e[d]??null}return l&&(Xy.add(l.id),Qy.set(i,l)),l}import $M from"chalk";import DM from"string-width";function tb(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=DM(e[r]),n>t)return e.slice(0,r)+m.dim("\u2026");return e}function oa(e,t,n,r){let o=t?">":" ",s=e.value,i=e.summary?` ${e.summary}`:"",a=`${s}${i}`,l=tb(a,n-4),c=` ${o} ${l}`;return t?$M.inverse(m.user(c)):m.meta(c)}function nb(e,t){if(!e)return null;let n=e.trim();if(n.length===0)return null;let r=tb(n,Math.max(0,t-7));return r.length===0?null:m.dim(` \u21B3 ${r}`)}import{readdirSync as LM,statSync as FM}from"fs";import{join as rb}from"path";function ob(e,t=process.cwd()){try{let n=e.lastIndexOf("/"),r=n===-1?"":e.slice(0,n),o=n===-1?e:e.slice(n+1),s=r?rb(t,r):t,i=LM(s),a=[];for(let l of i){if(!l.startsWith(o)||l.startsWith(".")&&!o.startsWith("."))continue;let c=r?`${r}/${l}`:l;try{FM(rb(s,l)).isDirectory()&&(c+="/")}catch{}if(a.push(c),a.length>=30)break}return a.sort()}catch{return[]}}async function sb(e){let t="",n=e.promptFn(),r=e.continuationPrompt??" \u203A ";for(;;){e.rl.setPrompt(n),e.rl.prompt();let o=await new Promise(s=>{e.rl.once("line",i=>s(i))});if(o.endsWith("\\")){t+=o.slice(0,-1)+`
1978
- `,n=r;continue}return t+=o,t}}function qo(e,t){let n=e.slice(0,t);if(/^\/[A-Za-z_-]*$/.test(n))return{kind:"slash",query:n.slice(1)};let r=n.split(/\s+/),o=r[r.length-1]??"";if(o.startsWith("@")&&/^@[^\s]*$/.test(o))return{kind:"file",query:o.slice(1)};let s=/^\/([A-Za-z][A-Za-z0-9_:-]*)\s+(?:.*\s)?--([a-z0-9-]*)$/.exec(n);if(s){let i=s[1],a=s[2],l=je().find(c=>c.name===`/${i}`);if(l?.flags&&l.flags.length>0)return{kind:"flag",command:i,query:a}}return null}function sa(e){let t=je(),n=t.filter(s=>s.name.slice(1).startsWith(e)).map(s=>({value:s.name,summary:s.summary,...s.hint?{hint:s.hint}:{}})),r=ty().filter(s=>s.alias.slice(1).startsWith(e)).map(s=>{let i=t.find(a=>a.name===s.canonical);return{value:s.alias,summary:s.summary,...i?.hint?{hint:i.hint}:{}}});return[...n,...r].sort((s,i)=>s.value.localeCompare(i.value)).slice(0,20)}function ia(e,t=process.cwd()){return ob(e,t).slice(0,20).map(n=>({value:"@"+n}))}function Jo(e,t){let n=je().find(s=>s.name===`/${e}`);if(!n?.flags||n.flags.length===0)return[];let r=t.startsWith("--")?t.slice(2):t;return n.flags.filter(s=>(s.startsWith("--")?s.slice(2):s).startsWith(r)).map(s=>({value:s})).sort((s,i)=>s.value.localeCompare(i.value)).slice(0,20)}var NM={"image/png":"PNG","image/jpeg":"JPEG","image/gif":"GIF","image/webp":"WEBP"};function UM(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}function aa(e){if(e.length===0)return"";let t=e.reduce((a,l)=>a+l.sizeBytes,0),n=UM(t),r=e.length===1?"image":"images",o=new Set,s=[];for(let a of e){let l=NM[a.mediaType];o.has(l)||(o.add(l),s.push(l))}let i=s.join(", ");return`[${e.length} ${r} attached \xB7 ${n} \xB7 ${i} \xB7 Ctrl+X to discard]`}function ib(e,t){if(t.length===0)return e;if(e){let n=t.length===1?"image":"images";return`${e} [+ ${t.length} ${n}]`}return t.length===1?"[image attached]":`[${t.length} images attached]`}function Dr(e){return e.length===0?"":e.length===1?"[image attached]":`[${e.length} images attached]`}H();import{spawn as ab}from"child_process";import{randomUUID as fd}from"crypto";import{readFile as lb,unlink as gd}from"fs/promises";import{tmpdir as cb}from"os";import{join as db}from"path";var Hn=!!E.AFK_DEBUG_CLIPBOARD;function Kn(e){process.stderr.write(`[afk-clipboard] ${e}
1977
+ `,n);return r<0?e.length:r}function yn(e,t,n){let r=Wn(t.start,e.buffer.length),o=Wn(t.end,e.buffer.length),s=Math.min(r,o),i=Math.max(r,o);if(s===i&&n.length===0)return e;let a=e.buffer.slice(0,s)+n+e.buffer.slice(i),l=s+n.length;return a===e.buffer&&l===e.cursor?e:{buffer:a,cursor:l}}var H={seed(e=""){return{buffer:e,cursor:e.length}},replaceRange:yn,insert(e,t){return t.length===0?e:yn(e,{start:e.cursor,end:e.cursor},t)},backspace(e){if(e.cursor===0)return e;let t=Il(e.buffer,e.cursor);return yn(e,{start:t,end:e.cursor},"")},deleteForward(e){if(e.cursor>=e.buffer.length)return e;let t=po(e.buffer,e.cursor);return yn(e,{start:e.cursor,end:t},"")},deleteWordBackward(e){if(e.cursor===0)return e;let t=zy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:t,end:e.cursor},"")},deleteWordForward(e){if(e.cursor>=e.buffer.length)return e;let t=qy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:e.cursor,end:t},"")},deleteToLineStart(e){let t=Jy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:t,end:e.cursor},"")},deleteToLineEnd(e){let t=Vy(e.buffer,e.cursor);return t===e.cursor?e:yn(e,{start:e.cursor,end:t},"")},moveLeft(e){return Rt(e,Il(e.buffer,e.cursor))},moveRight(e){return Rt(e,po(e.buffer,e.cursor))},moveHome(e){return Rt(e,0)},moveEnd(e){return Rt(e,e.buffer.length)},moveLineStart(e){return Rt(e,Jy(e.buffer,e.cursor))},moveLineEnd(e){return Rt(e,Vy(e.buffer,e.cursor))},moveWordBackward(e){return Rt(e,zy(e.buffer,e.cursor))},moveWordForward(e){return Rt(e,qy(e.buffer,e.cursor))},moveUpLine(e,t,n){let r=t||80,{row:o,col:s}=hn(e.buffer,e.cursor,n,r);if(o===0)return{moved:!1};let i=o-1,a=s,l=0,c=1/0;for(let u=0;u<=e.buffer.length;u++){let p=hn(e.buffer,u,n,r);if(p.row===i){let f=Math.abs(p.col-a);f<c&&(c=f,l=u)}else if(p.row>i)break}let d=Rt(e,l);return d===e?{moved:!1}:{moved:!0,state:d}},moveDownLine(e,t,n){let r=t||80,{row:o,col:s}=hn(e.buffer,e.cursor,n,r),i=hn(e.buffer,e.buffer.length,n,r);if(o>=i.row)return{moved:!1};let a=o+1,l=s,c=e.buffer.length,d=1/0;for(let p=0;p<e.buffer.length;p++){let f=hn(e.buffer,p,n,r);if(f.row===a){let g=Math.abs(f.col-l);g<d&&(d=g,c=p)}else if(f.row>a)break}i.row===a&&Math.abs(i.col-l)<d&&(c=e.buffer.length);let u=Rt(e,c);return u===e?{moved:!1}:{moved:!0,state:u}}};var Yy=["Stalking","Shadowing","Tailing","Casing","Sleuthing","Investigating","Deducing","Interrogating","Profiling","Canvassing","Prowling","Lurking","Scanning","Probing","Inspecting","Querying","Invoking","Parsing","Validating","Resolving","Compiling","Executing","Hunting","Sweeping","Tracing","Tracking","Triangulating","Decoding","Decrypting","Intercepting","Hacking","Bugging","Wiretapping","Dispatching","Deploying","Patching","Hooking","Unmasking","Cornering","Striking","Surveilling","Scouting"];function md(){return Yy[Math.floor(Math.random()*Yy.length)]}K();var PM=[{id:"kbd:ctrl-b",text:"Ctrl+B during a turn detaches it to the background so you can keep typing \u2014 find it later with /tasks.",source:"static"},{id:"kbd:shift-tab",text:"Shift+Tab toggles plan mode (no file writes) without leaving the prompt.",source:"static"},{id:"kbd:ctrl-c",text:"Ctrl+C interrupts the current turn; press it twice in a row to exit the REPL.",source:"static"},{id:"kbd:at-path",text:"Type @ in the prompt to autocomplete a file path and attach its contents to your turn.",source:"static"},{id:"kbd:cmd-v",text:"Paste an image with Cmd+V (macOS) or Ctrl+V \u2014 clipboard images attach automatically.",source:"static"},{id:"env:tips-opt-out",text:"Set AFK_SPINNER_TIPS=0 to silence these loading-screen tips.",source:"static"}];function MM(){let e=[];for(let t of je())t.hint&&(t.name.includes(":")||e.push({id:`cmd:${t.name}`,text:`${t.name} \u2014 ${t.hint}`,source:"command"}));return e}function OM(e){let t=[];for(let n of mt()){let r=`cmd:/${n}`;if(e.has(r))continue;let o;try{o=Ce(n)}catch{continue}o.whenToUse&&t.push({id:`skill:${n}`,text:`/${n} \u2014 ${o.whenToUse}`,source:"skill"})}return t}function Zy(){if(E.AFK_SPINNER_TIPS==="0")return[];let e=MM(),t=new Set(e.map(r=>r.id)),n=OM(t);return[...PM,...e,...n]}var Xy=new Set,Qy=new Map;function eb(e,t){if(e.length===0)return null;let n=t.now??Date.now(),r=t.warmupMs??1500;if(n-t.startedAt<r)return null;let o=t.rotateMs??7e3,s=Math.floor((n-t.startedAt)/o),i=`${t.startedAt}:${s}`,a=Qy.get(i);if(a)return a;let l=null,c=e.filter(d=>!Xy.has(d.id));if(c.length>0){let d=(s%c.length+c.length)%c.length;l=c[d]??null}else{let d=(s%e.length+e.length)%e.length;l=e[d]??null}return l&&(Xy.add(l.id),Qy.set(i,l)),l}import $M from"chalk";import DM from"string-width";function tb(e,t){if(t<=0)return"";let n=0;for(let r=0;r<e.length;r++)if(n+=DM(e[r]),n>t)return e.slice(0,r)+m.dim("\u2026");return e}function oa(e,t,n,r){let o=t?">":" ",s=e.value,i=e.summary?` ${e.summary}`:"",a=`${s}${i}`,l=tb(a,n-4),c=` ${o} ${l}`;return t?$M.inverse(m.user(c)):m.meta(c)}function nb(e,t){if(!e)return null;let n=e.trim();if(n.length===0)return null;let r=tb(n,Math.max(0,t-7));return r.length===0?null:m.dim(` \u21B3 ${r}`)}import{readdirSync as LM,statSync as FM}from"fs";import{join as rb}from"path";function ob(e,t=process.cwd()){try{let n=e.lastIndexOf("/"),r=n===-1?"":e.slice(0,n),o=n===-1?e:e.slice(n+1),s=r?rb(t,r):t,i=LM(s),a=[];for(let l of i){if(!l.startsWith(o)||l.startsWith(".")&&!o.startsWith("."))continue;let c=r?`${r}/${l}`:l;try{FM(rb(s,l)).isDirectory()&&(c+="/")}catch{}if(a.push(c),a.length>=30)break}return a.sort()}catch{return[]}}async function sb(e){let t="",n=e.promptFn(),r=e.continuationPrompt??" \u203A ";for(;;){e.rl.setPrompt(n),e.rl.prompt();let o=await new Promise(s=>{e.rl.once("line",i=>s(i))});if(o.endsWith("\\")){t+=o.slice(0,-1)+`
1978
+ `,n=r;continue}return t+=o,t}}function qo(e,t){let n=e.slice(0,t);if(/^\/[A-Za-z_-]*$/.test(n))return{kind:"slash",query:n.slice(1)};let r=n.split(/\s+/),o=r[r.length-1]??"";if(o.startsWith("@")&&/^@[^\s]*$/.test(o))return{kind:"file",query:o.slice(1)};let s=/^\/([A-Za-z][A-Za-z0-9_:-]*)\s+(?:.*\s)?--([a-z0-9-]*)$/.exec(n);if(s){let i=s[1],a=s[2],l=je().find(c=>c.name===`/${i}`);if(l?.flags&&l.flags.length>0)return{kind:"flag",command:i,query:a}}return null}function sa(e){let t=je(),n=t.filter(s=>s.name.slice(1).startsWith(e)).map(s=>({value:s.name,summary:s.summary,...s.hint?{hint:s.hint}:{}})),r=ty().filter(s=>s.alias.slice(1).startsWith(e)).map(s=>{let i=t.find(a=>a.name===s.canonical);return{value:s.alias,summary:s.summary,...i?.hint?{hint:i.hint}:{}}});return[...n,...r].sort((s,i)=>s.value.localeCompare(i.value)).slice(0,20)}function ia(e,t=process.cwd()){return ob(e,t).slice(0,20).map(n=>({value:"@"+n}))}function Jo(e,t){let n=je().find(s=>s.name===`/${e}`);if(!n?.flags||n.flags.length===0)return[];let r=t.startsWith("--")?t.slice(2):t;return n.flags.filter(s=>(s.startsWith("--")?s.slice(2):s).startsWith(r)).map(s=>({value:s})).sort((s,i)=>s.value.localeCompare(i.value)).slice(0,20)}var NM={"image/png":"PNG","image/jpeg":"JPEG","image/gif":"GIF","image/webp":"WEBP"};function UM(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}function aa(e){if(e.length===0)return"";let t=e.reduce((a,l)=>a+l.sizeBytes,0),n=UM(t),r=e.length===1?"image":"images",o=new Set,s=[];for(let a of e){let l=NM[a.mediaType];o.has(l)||(o.add(l),s.push(l))}let i=s.join(", ");return`[${e.length} ${r} attached \xB7 ${n} \xB7 ${i} \xB7 Ctrl+X to discard]`}function ib(e,t){if(t.length===0)return e;if(e){let n=t.length===1?"image":"images";return`${e} [+ ${t.length} ${n}]`}return t.length===1?"[image attached]":`[${t.length} images attached]`}function Dr(e){return e.length===0?"":e.length===1?"[image attached]":`[${e.length} images attached]`}K();import{spawn as ab}from"child_process";import{randomUUID as fd}from"crypto";import{readFile as lb,unlink as gd}from"fs/promises";import{tmpdir as cb}from"os";import{join as db}from"path";var Hn=!!E.AFK_DEBUG_CLIPBOARD;function Kn(e){process.stderr.write(`[afk-clipboard] ${e}
1979
1979
  `)}async function Gn(){if(process.platform!=="darwin")return null;Hn&&Kn("probing clipboard for image data");for(let e of["PNGf","TIFF"]){let t=db(cb(),`afk-clipboard-${fd()}.bin`);try{let{ok:n,exitCode:r,stderr:o}=await WM(e,t);if(Hn&&Kn(`class=${e} osascript exitCode=${r} stderr=${JSON.stringify(o)} ok=${n}`),!n)continue;let s=await lb(t);if(s.length===0)continue;if(jM(s)){Hn&&Kn(`class=${e} magic=TIFF detected, transcoding via sips`);let a=await BM(t);if(!a){Hn&&Kn(`class=${e} sips transcode failed, skipping`);continue}s=a}let i=KM(s);if(Hn&&Kn(`class=${e} magic-byte detection result: ${i??"unrecognized"}`),!i)continue;return Hn&&Kn(`probe success: mediaType=${i} size=${s.byteLength}`),{id:fd(),mediaType:i,bytes:s,sizeBytes:s.byteLength}}catch{}finally{gd(t).catch(()=>{})}}return Hn&&Kn("probe result: null (no image found on clipboard)"),null}function jM(e){return e.length<4?!1:e[0]===73&&e[1]===73&&e[2]===42&&e[3]===0||e[0]===77&&e[1]===77&&e[2]===0&&e[3]===42}async function BM(e){let t=db(cb(),`afk-clipboard-${fd()}.png`);if(!await new Promise(r=>{let o=ab("sips",["-s","format","png",e,"--out",t],{stdio:["ignore","ignore","ignore"]});o.on("error",()=>r(!1)),o.on("close",s=>r(s===0))}))return gd(t).catch(()=>{}),null;try{let r=await lb(t);return r.length>0?r:null}catch{return null}finally{gd(t).catch(()=>{})}}async function WM(e,t){let n=`
1980
1980
  try
1981
1981
  set imgData to the clipboard as \xABclass ${e}\xBB
@@ -1990,11 +1990,13 @@ ${d}`}function id(e,t){let n=Ny[t.status];e.out.line(` ${n} ${m.bold(t.jobId)}
1990
1990
  end try
1991
1991
  return "no"
1992
1992
  end try
1993
- `;return new Promise(r=>{let o=ab("osascript",["-e",n],{stdio:["ignore","pipe","pipe"]}),s="",i="";o.stdout?.on("data",a=>{s+=a.toString("utf8")}),o.stderr?.on("data",a=>{i+=a.toString("utf8")}),o.on("error",()=>r({ok:!1,exitCode:null,stderr:i})),o.on("close",a=>{r({ok:a===0&&s.trim()==="ok",exitCode:a,stderr:i})})})}function HM(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}function KM(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=4&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?"image/gif":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"image/webp":null}var ub=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],qM=5e3;function JM(e){let t=Date.now()-e;if(t<qM)return"";let n=Math.floor(t/1e3);if(n<60)return m.dim(` ${n}s`);let r=Math.floor(n/60),o=n%60;return m.dim(` ${r}m${o.toString().padStart(2,"0")}s`)}function VM(e,t){let n=" \u{1F4A1} ",r=Math.max(8,t-n.length-1),o=e.length>r?e.slice(0,r-1)+"\u2026":e;return m.dim(n+o)}var Lr=class e{stdout;stdin;onCancel;onBackground;onShiftTab;promptTextFn;history;autocompleteState;formatInputBuffer;scrollRegion;onSubmit;attachments=[];pasting=!1;pasteStartBufferLen=0;clipboardInFlight=!1;clipboardFailureMsg=null;inputMode="streaming";armed=!1;canceled=!1;backgrounded=!1;wasRaw=!1;logUpdate=null;overlay="";input=z.seed("");queued=!1;handleKeypress=null;resizeUnsub=null;spinner=null;spinnerInterval=null;committing=!1;static MAX_DROPDOWN_ROWS=6;constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.onBackground=t.onBackground,this.onShiftTab=t.onShiftTab;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+m.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.onSubmit=t.onSubmit}isArmed(){return this.armed}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnBackground(t){this.onBackground=t??void 0}setOnShiftTab(t){this.onShiftTab=t??void 0}setInputMode(t){let n=this.inputMode;if(this.inputMode=t,n==="idle"&&t==="streaming"){this.canceled=!1,this.backgrounded=!1,this.autocompleteState?.reset(),this.repaint();return}if(t==="idle"&&this.queued&&this.onSubmit){let r=this.input.buffer,o=[...this.attachments],s=this.onSubmit;this.queued=!1,this.input=z.seed(""),this.attachments=[],this.repaint(),s({text:r,attachments:o});return}n!==t&&this.repaint()}getInputMode(){return this.inputMode}async arm(){if(this.armed)throw new Error("TerminalCompositor: arm() called while already armed");if(!(!this.stdout.isTTY||!this.stdin.isTTY)){this.logUpdate||(this.logUpdate=zM(this.stdout)),this.wasRaw=this.stdin.isRaw??!1;try{this.stdin.setRawMode(!0)}catch{this.logUpdate=null,this.wasRaw=!1;return}if(this.stdin.resume(),GM(this.stdin),this.handleKeypress=(t,n)=>this.dispatchKey(t,n),this.stdin.on("keypress",this.handleKeypress),this.resizeUnsub=ot.subscribe(()=>{this.repaint()}),this.armed=!0,this.canceled=!1,this.stdout.isTTY){let t=this.stdout.rows??24,n=Math.max(1,t-1);this.stdout.write(`\x1B[${n};1H`)}this.repaint()}}disarm(){if(this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner=null,!this.armed){this.resetState();return}if(this.handleKeypress&&(this.stdin.removeListener("keypress",this.handleKeypress),this.handleKeypress=null),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.logUpdate)try{this.logUpdate.clear(),this.logUpdate.done()}catch{}if(this.stdout.isTTY&&this.stdin.isTTY)try{this.stdin.setRawMode(this.wasRaw)}catch{}this.armed=!1,this.resetState()}setOverlay(t){t!==this.overlay&&(this.overlay=t,this.repaint())}setSpinner(t){if(!this.stdout.isTTY)return;if(!t.enabled){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner&&(this.spinner=null,this.repaint());return}if(this.spinner)return;let n=t.rotateVerbEveryMs??3500,r=Date.now();this.spinner={frameIndex:0,verb:md(),nextVerbRotateAt:r+n,startedAt:r,tipPool:Zy(),currentTip:null},this.spinnerInterval=setInterval(()=>this.tickSpinner(n),80),this.repaint()}tickSpinner(t){if(!this.spinner)return;this.spinner.frameIndex=(this.spinner.frameIndex+1)%ub.length;let n=Date.now();n>=this.spinner.nextVerbRotateAt&&(this.spinner.verb=md(),this.spinner.nextVerbRotateAt=n+t),this.spinner.currentTip=eb(this.spinner.tipPool,{startedAt:this.spinner.startedAt,now:n}),this.repaint()}commitAbove(t){let n=r=>{this.scrollRegion?this.scrollRegion.withFullScrollRegion(r):r()};if(!this.armed||!this.logUpdate){n(()=>{this.stdout.write(t+`
1993
+ `;return new Promise(r=>{let o=ab("osascript",["-e",n],{stdio:["ignore","pipe","pipe"]}),s="",i="";o.stdout?.on("data",a=>{s+=a.toString("utf8")}),o.stderr?.on("data",a=>{i+=a.toString("utf8")}),o.on("error",()=>r({ok:!1,exitCode:null,stderr:i})),o.on("close",a=>{r({ok:a===0&&s.trim()==="ok",exitCode:a,stderr:i})})})}function HM(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}function KM(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=4&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?"image/gif":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"image/webp":null}var ub=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],qM=5e3;function JM(e){let t=Date.now()-e;if(t<qM)return"";let n=Math.floor(t/1e3);if(n<60)return m.dim(` ${n}s`);let r=Math.floor(n/60),o=n%60;return m.dim(` ${r}m${o.toString().padStart(2,"0")}s`)}function VM(e,t){let n=" \u{1F4A1} ",r=Math.max(8,t-n.length-1),o=e.length>r?e.slice(0,r-1)+"\u2026":e;return m.dim(n+o)}var Lr=class e{stdout;stdin;onCancel;onBackground;onShiftTab;promptTextFn;history;autocompleteState;formatInputBuffer;scrollRegion;onSubmit;attachments=[];pasting=!1;pasteStartBufferLen=0;clipboardInFlight=!1;clipboardFailureMsg=null;inputMode="streaming";armed=!1;canceled=!1;backgrounded=!1;wasRaw=!1;logUpdate=null;overlay="";input=H.seed("");queued=!1;handleKeypress=null;resizeUnsub=null;spinner=null;spinnerInterval=null;committing=!1;static MAX_DROPDOWN_ROWS=6;constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.onBackground=t.onBackground,this.onShiftTab=t.onShiftTab;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+m.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.onSubmit=t.onSubmit}isArmed(){return this.armed}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnBackground(t){this.onBackground=t??void 0}setOnShiftTab(t){this.onShiftTab=t??void 0}setInputMode(t){let n=this.inputMode;if(this.inputMode=t,n==="idle"&&t==="streaming"){this.canceled=!1,this.backgrounded=!1,this.autocompleteState?.reset(),this.repaint();return}if(t==="idle"&&this.queued&&this.onSubmit){let r=this.input.buffer,o=[...this.attachments],s=this.onSubmit;this.queued=!1,this.input=H.seed(""),this.attachments=[],this.repaint(),s({text:r,attachments:o});return}n!==t&&this.repaint()}getInputMode(){return this.inputMode}async arm(){if(this.armed)throw new Error("TerminalCompositor: arm() called while already armed");if(!(!this.stdout.isTTY||!this.stdin.isTTY)){this.logUpdate||(this.logUpdate=zM(this.stdout)),this.wasRaw=this.stdin.isRaw??!1;try{this.stdin.setRawMode(!0)}catch{this.logUpdate=null,this.wasRaw=!1;return}try{this.stdout.write("\x1B[?2004h")}catch{}if(this.stdin.resume(),GM(this.stdin),this.handleKeypress=(t,n)=>this.dispatchKey(t,n),this.stdin.on("keypress",this.handleKeypress),this.resizeUnsub=ot.subscribe(()=>{this.repaint()}),this.armed=!0,this.canceled=!1,this.stdout.isTTY){let t=this.stdout.rows??24,n=Math.max(1,t-1);this.stdout.write(`\x1B[${n};1H`)}this.repaint()}}disarm(){if(this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner=null,!this.armed){this.resetState();return}if(this.handleKeypress&&(this.stdin.removeListener("keypress",this.handleKeypress),this.handleKeypress=null),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.logUpdate)try{this.logUpdate.clear(),this.logUpdate.done()}catch{}if(this.stdout.isTTY&&this.stdin.isTTY){try{this.stdout.write("\x1B[?2004l")}catch{}try{this.stdin.setRawMode(this.wasRaw)}catch{}}this.armed=!1,this.resetState()}setOverlay(t){t!==this.overlay&&(this.overlay=t,this.repaint())}setSpinner(t){if(!this.stdout.isTTY)return;if(!t.enabled){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.spinner&&(this.spinner=null,this.repaint());return}if(this.spinner)return;let n=t.rotateVerbEveryMs??3500,r=Date.now();this.spinner={frameIndex:0,verb:md(),nextVerbRotateAt:r+n,startedAt:r,tipPool:Zy(),currentTip:null},this.spinnerInterval=setInterval(()=>this.tickSpinner(n),80),this.repaint()}tickSpinner(t){if(!this.spinner)return;this.spinner.frameIndex=(this.spinner.frameIndex+1)%ub.length;let n=Date.now();n>=this.spinner.nextVerbRotateAt&&(this.spinner.verb=md(),this.spinner.nextVerbRotateAt=n+t),this.spinner.currentTip=eb(this.spinner.tipPool,{startedAt:this.spinner.startedAt,now:n}),this.repaint()}commitAbove(t){let n=r=>{this.scrollRegion?this.scrollRegion.withFullScrollRegion(r):r()};if(!this.armed||!this.logUpdate){n(()=>{this.stdout.write(t+`
1994
1994
  `)});return}this.committing=!0;try{this.logUpdate.clear(),n(()=>{this.stdout.write(t+`
1995
1995
  `)})}finally{this.committing=!1}this.repaint()}getBuffer(){return{text:this.input.buffer,queued:this.queued}}getAttachments(){return[...this.attachments]}renderInputLine(){let n=this.input.buffer.slice(0,this.input.cursor),r=po(this.input.buffer,this.input.cursor),o=this.input.cursor<this.input.buffer.length?this.input.buffer.slice(this.input.cursor,r):" ",s=this.input.cursor<this.input.buffer.length?this.input.buffer.slice(r):"",i=this.formatInputBuffer?.(n)??n,a=this.formatInputBuffer?.(s)??s,l=m.user.inverse(o);return this.promptTextFn()+i+l+a+""}updateAutocomplete(){let t=this.autocompleteState;if(!t)return;t.trigger=qo(this.input.buffer,this.input.cursor);let n=`${this.input.cursor}:${this.input.buffer}`;t.suppressedSignature!==null&&t.suppressedSignature!==n&&(t.suppressedSignature=null),t.trigger&&t.suppressedSignature===null?(t.trigger.kind==="slash"?t.candidates=sa(t.trigger.query).slice(0,12):t.trigger.kind==="file"?t.candidates=ia(t.trigger.query).slice(0,12):t.candidates=Jo(t.trigger.command,t.trigger.query),t.dropdownOpen=t.candidates.length>0):(t.dropdownOpen=!1,t.candidates=[]),t.selectedIndex>=t.candidates.length&&(t.selectedIndex=Math.max(0,t.candidates.length-1)),t.viewportStart>t.selectedIndex&&(t.viewportStart=t.selectedIndex),t.selectedIndex>=t.viewportStart+e.MAX_DROPDOWN_ROWS&&(t.viewportStart=t.selectedIndex-e.MAX_DROPDOWN_ROWS+1)}renderDropdownRows(){let t=this.autocompleteState;if(!t?.dropdownOpen)return[];let n=this.stdout.columns||80;if(n<=40)return[];let r=Math.min(n-4,60),o=Math.min(t.candidates.length-t.viewportStart,e.MAX_DROPDOWN_ROWS),s=[];for(let i=0;i<o;i++){let a=t.viewportStart+i,l=t.candidates[a];if(!l)continue;let c=oa(l,a===t.selectedIndex,r,t.trigger?.kind),d=Ve(c).length,u=Math.max(0,Math.ceil(d/n)-1);s.push(c);for(let p=0;p<u;p++)s.push("")}return s}repaint(){if(!this.armed||!this.logUpdate||this.committing)return;let t=this.renderInputLine(),n=this.overlay?this.overlay.split(`
1996
1996
  `):[],r=this.spinner?m.meta(`${ub[this.spinner.frameIndex]} ${this.spinner.verb}...`)+JM(this.spinner.startedAt):null,o=this.spinner?.currentTip?VM(this.spinner.currentTip.text,this.stdout.columns??80):null,s=null;this.attachments.length>0?s=aa(this.attachments):this.clipboardFailureMsg!==null&&(s=m.dim(this.clipboardFailureMsg),this.clipboardFailureMsg=null);let i=this.renderDropdownRows(),a=Math.max(1,(this.stdout.rows??24)-1),l=(r?1:0)+(o?1:0)+(s?1:0)+1+i.length,c=Math.max(0,a-l),d=n.length>c?n.slice(-c):n,u=[];u.push(...d),r&&u.push(r),o&&u.push(o),s&&u.push(s),u.push(t),u.push(...i),this.logUpdate(u.join(`
1997
- `))}resetState(){this.overlay="",this.input=z.seed(""),this.queued=!1,this.canceled=!1,this.backgrounded=!1,this.attachments=[],this.pasting=!1,this.pasteStartBufferLen=0,this.clipboardFailureMsg=null,this.autocompleteState?.reset(),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null)}applyEdit(t){return t===this.input?!1:(this.input=t,this.queued=!1,this.updateAutocomplete(),this.pasting||this.repaint(),!0)}applyDropdownSelection(){let t=this.autocompleteState;if(!t?.dropdownOpen||t.candidates.length===0)return!1;let n=t.candidates[t.selectedIndex];if(!n)return!1;let r=this.input.buffer.slice(0,this.input.cursor),o=this.input.buffer.slice(this.input.cursor),s,i;if(t.trigger?.kind==="slash"){let l=/\/[A-Za-z_-]*$/.exec(r);s=l?r.length-l[0].length:this.input.cursor,i=n.value+(o.startsWith(" ")?"":" ")}else if(t.trigger?.kind==="flag"){let l=/--[a-z0-9-]*$/.exec(r);s=l?r.length-l[0].length:this.input.cursor,i=n.value+(o.startsWith(" ")?"":" ")}else{let l=r.search(/[^\s]*$/);s=l>=0?l:this.input.cursor,i=n.value}let a=z.replaceRange(this.input,{start:s,end:this.input.cursor},i);return a===this.input?!1:(this.input=a,t.dropdownOpen=!1,t.candidates=[],t.viewportStart=0,t.selectedIndex=0,this.queued=!1,this.updateAutocomplete(),this.repaint(),!0)}dispatchKey(t,n){if(!this.armed)return;let r=this.autocompleteState,o=n?.sequence??"";if(o==="\x1B[200~"){this.pasting=!0,this.pasteStartBufferLen=this.input.buffer.length;return}if(o==="\x1B[201~"){this.pasting=!1;let a=l=>{this.clipboardInFlight||(this.clipboardInFlight=!0,Gn().then(c=>{c?(this.clipboardFailureMsg=null,this.attachments.push(c),this.repaint()):l==="flag-missing"&&(this.clipboardFailureMsg="[clipboard: no image found]",this.repaint())}).catch(()=>{}).finally(()=>{this.clipboardInFlight=!1}))};this.input.buffer.length===this.pasteStartBufferLen?a("flag-missing"):(this.repaint(),a("silent"));return}if(n?.name==="escape"){if(r?.dropdownOpen){r.suppressedSignature=`${this.input.cursor}:${this.input.buffer}`,r.dropdownOpen=!1,r.candidates=[],this.repaint();return}if(this.inputMode==="idle"||this.canceled)return;this.canceled=!0,this.input.buffer.length>0&&!this.queued&&(this.queued=!0,this.repaint()),this.onCancel&&this.onCancel();return}if(n?.ctrl&&n?.name==="c"){if(this.inputMode==="idle"){this.onCancel&&this.onCancel();return}if(this.canceled)return;this.canceled=!0,this.input.buffer.length>0&&!this.queued&&(this.queued=!0,this.repaint()),this.onCancel&&this.onCancel();return}if(n?.ctrl&&n?.name==="v"){this.clipboardInFlight||(this.clipboardInFlight=!0,Gn().then(a=>{a?(this.clipboardFailureMsg=null,this.attachments.push(a)):this.clipboardFailureMsg="[clipboard: no image found]",this.repaint()}).catch(()=>{}).finally(()=>{this.clipboardInFlight=!1}));return}if(n?.ctrl&&n?.name==="p"||n?.name==="up"){if(r?.dropdownOpen){r.selectedIndex>0&&(r.selectedIndex--,r.selectedIndex<r.viewportStart&&(r.viewportStart=r.selectedIndex),this.repaint());return}if(this.history){let a=this.history.back(this.input.buffer);a!==null&&this.applyEdit(z.seed(a))}return}if(n?.ctrl&&n?.name==="n"||n?.name==="down"){if(r?.dropdownOpen){r.selectedIndex<r.candidates.length-1&&(r.selectedIndex++,r.selectedIndex>=r.viewportStart+e.MAX_DROPDOWN_ROWS&&(r.viewportStart=r.selectedIndex-e.MAX_DROPDOWN_ROWS+1),this.repaint());return}if(this.history){let a=this.history.forward();a!==null&&this.applyEdit(z.seed(a))}return}if(n?.name==="return"){let a=this.autocompleteState;if(a?.dropdownOpen){let l=a.trigger?.kind,c=this.applyDropdownSelection();if(l!=="slash"||!c)return}if(this.input.buffer.length===0&&this.attachments.length===0)return;if(this.inputMode==="idle"&&this.onSubmit){let l=this.input.buffer,c=[...this.attachments],d=this.onSubmit;this.queued=!1,this.input=z.seed(""),this.attachments=[],this.autocompleteState?.reset(),this.repaint(),d({text:l,attachments:c});return}this.queued||(this.queued=!0,this.repaint());return}if(n?.name==="backspace"){let a=z.backspace(this.input);a!==this.input?(this.history?.resetRecall(),this.applyEdit(a)):this.queued?(this.queued=!1,this.repaint()):this.attachments.length>0&&(this.attachments.pop(),this.repaint());return}if(n?.name==="left"){this.applyEdit(z.moveLeft(this.input));return}if(n?.name==="right"){this.applyEdit(z.moveRight(this.input));return}if(n?.name==="home"){this.applyEdit(z.moveHome(this.input));return}if(n?.name==="end"){this.applyEdit(z.moveEnd(this.input));return}if(n?.name==="delete"){this.history?.resetRecall(),this.applyEdit(z.deleteForward(this.input));return}if(n?.ctrl&&n?.name==="b"){if(this.inputMode==="idle"||this.backgrounded)return;this.backgrounded=!0,this.onBackground&&this.onBackground();return}if(n?.name==="tab"&&n?.shift){this.onShiftTab&&this.onShiftTab();return}if(n?.name==="tab"){this.applyDropdownSelection();return}let s=["tab","pageup","pagedown"];if(n?.name&&s.includes(n.name)||n?.ctrl||n?.meta)return;let i=typeof t=="string"&&t.length===1&&t>=" "?t:typeof n?.sequence=="string"&&n.sequence.length===1&&n.sequence>=" "?n.sequence:null;i!==null&&(this.history?.resetRecall(),this.applyEdit(z.insert(this.input,i)))}};import YM from"chalk";var XM=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,QM=/(?<=\s|^)(@[\w./-]*)(?=\s|$)/g;function zn(e,t){return YM.level===0?e:e.replace(XM,r=>{let o=r.slice(1);return t.has(o)?m.brand(r):m.meta(r)}).replace(QM,r=>m.fileRef(r))}H();var ZM=m.success("\u2713"),e0=m.error("\u2717");function Fr(e){return e?e0:ZM}var la=3,mb=2,fb=3;function gb(e){switch(Nn(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function bd(e){return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,"$1")}function t0(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}function n0(e,t){if(e==="bash"||e==="Bash")return t0(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,s=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let i=`${o} node${o===1?"":"s"}`,a=s>0?`, ${s} edge${s===1?"":"s"}`:"";return`(${i}${a})`}}}catch{}}return t}function hb(e){return e.replace(/[\r\n]+/g," ")}var r0={"(":")","{":"}","[":"]"};function o0(e,t,n="\u2026"){let r=e.charAt(0),o=r0[r];return!(o&&e.endsWith(o)&&e.length>=2)||K(e)<=t?ce(e,t,n):t<3?t>=2?r+o:ce(e,t,n):ce(e,t-1,n)+o}function bn(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=bd(n0(r,n[2]??"")),s=Nn(r),{color:i,glyph:a}=xr(r),l=Bc(s),c=l?` [${l}]`:"";if(t!==void 0){let u=(a+" ").length+r.length+c.length,p=Math.max(1,t-u);o=o0(o,p)}o=hb(o);let d=i(a+" ")+i.bold(r)+m.toolArg(o);return l?d+m.dim(c):d}return m.chrome("\u25CF ")+m.toolArg(e)}function s0(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function qn(e,t,n=60,r){let o=e.isError?m.error:m.dim,s=t??E.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(s)?"~"+e.persistedPath.slice(s.length):e.persistedPath;return o(`saved \u2192 ${a}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${s0(r,e.lineCount)}`);let i=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(hb(i))}var hd=8;function i0(){let e=E.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}var a0=/[\x00-\x08\x0B-\x1F\x7F]/g;function l0(e){let t=Ve(e.text).replace(a0,"");return e.kind==="+"?m.diffAdd("+ "+t):e.kind==="-"?m.diffRemove("- "+t):m.dim(" "+t)}var yd=new WeakMap;function Jn(e,t,n){if(i0())return[];let r=t+"|"+n,o=yd.get(e);if(o!==void 0){let a=o.get(r);if(a!==void 0)return a}let s=[],i=[];for(let a of e.hunks){let l=`@@ -${a.oldStart},${a.oldLines} +${a.newStart},${a.newLines} @@`;i.push({kind:"header",text:m.diffHunk(l)});for(let c of a.lines)i.push({kind:"body",text:l0(c)})}if(t==="overlay"){let a=i.filter(l=>l.kind!=="header");if(a.length>hd){let l=0,c=[];for(let u of i)u.kind==="header"?c.push(u):l<hd&&(c.push(u),l++);let d=a.length-hd;for(let u of c)s.push(n+u.text);return s.push(n+m.dim(`\u2026 +${d} more diff line${d===1?"":"s"}`)),pb(e,r,s),s}}for(let a of i)s.push(n+a.text);return pb(e,r,s),s}function pb(e,t,n){let r=yd.get(e);r===void 0&&(r=new Map,yd.set(e,r)),r.set(t,n)}H();function Ie(e,t){return ce(e,t)}var kd=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),c0=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "});function kn(){let e=E.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?c0:kd}function kb(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function wd(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?m.dim(o):o}return n}function wb(e,t,n){if(!e||!e.trim())return[];let r=m.dim(n.textPrefix),o=Math.max(1,te()-t.length-2-2),s=wd(t,n),i=[];for(let a of e.split(`
1997
+ `))}resetState(){this.overlay="",this.input=H.seed(""),this.queued=!1,this.canceled=!1,this.backgrounded=!1,this.attachments=[],this.pasting=!1,this.pasteStartBufferLen=0,this.clipboardFailureMsg=null,this.autocompleteState?.reset(),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null)}applyEdit(t){return t===this.input?!1:(this.input=t,this.queued=!1,this.updateAutocomplete(),this.pasting||this.repaint(),!0)}applyDropdownSelection(){let t=this.autocompleteState;if(!t?.dropdownOpen||t.candidates.length===0)return!1;let n=t.candidates[t.selectedIndex];if(!n)return!1;let r=this.input.buffer.slice(0,this.input.cursor),o=this.input.buffer.slice(this.input.cursor),s,i;if(t.trigger?.kind==="slash"){let l=/\/[A-Za-z_-]*$/.exec(r);s=l?r.length-l[0].length:this.input.cursor,i=n.value+(o.startsWith(" ")?"":" ")}else if(t.trigger?.kind==="flag"){let l=/--[a-z0-9-]*$/.exec(r);s=l?r.length-l[0].length:this.input.cursor,i=n.value+(o.startsWith(" ")?"":" ")}else{let l=r.search(/[^\s]*$/);s=l>=0?l:this.input.cursor,i=n.value}let a=H.replaceRange(this.input,{start:s,end:this.input.cursor},i);return a===this.input?!1:(this.input=a,t.dropdownOpen=!1,t.candidates=[],t.viewportStart=0,t.selectedIndex=0,this.queued=!1,this.updateAutocomplete(),this.repaint(),!0)}dispatchKey(t,n){if(!this.armed)return;let r=this.autocompleteState,o=n?.sequence??"";if(o==="\x1B[200~"){this.pasting=!0,this.pasteStartBufferLen=this.input.buffer.length;return}if(o==="\x1B[201~"){this.pasting=!1;let a=l=>{this.clipboardInFlight||(this.clipboardInFlight=!0,Gn().then(c=>{c?(this.clipboardFailureMsg=null,this.attachments.push(c),this.repaint()):l==="flag-missing"&&(this.clipboardFailureMsg="[clipboard: no image found]",this.repaint())}).catch(()=>{}).finally(()=>{this.clipboardInFlight=!1}))};this.input.buffer.length===this.pasteStartBufferLen?a("flag-missing"):(this.repaint(),a("silent"));return}if(n?.name==="escape"){if(r?.dropdownOpen){r.suppressedSignature=`${this.input.cursor}:${this.input.buffer}`,r.dropdownOpen=!1,r.candidates=[],this.repaint();return}if(this.inputMode==="idle"||this.canceled)return;this.canceled=!0,this.input.buffer.length>0&&!this.queued&&(this.queued=!0,this.repaint()),this.onCancel&&this.onCancel();return}if(n?.ctrl&&n?.name==="c"){if(this.inputMode==="idle"){this.onCancel&&this.onCancel();return}if(this.canceled)return;this.canceled=!0,this.input.buffer.length>0&&!this.queued&&(this.queued=!0,this.repaint()),this.onCancel&&this.onCancel();return}if(n?.ctrl&&n?.name==="v"){this.clipboardInFlight||(this.clipboardInFlight=!0,Gn().then(a=>{a?(this.clipboardFailureMsg=null,this.attachments.push(a)):this.clipboardFailureMsg="[clipboard: no image found]",this.repaint()}).catch(()=>{}).finally(()=>{this.clipboardInFlight=!1}));return}if(n?.ctrl&&n?.name==="p"||n?.name==="up"){if(r?.dropdownOpen){r.selectedIndex>0&&(r.selectedIndex--,r.selectedIndex<r.viewportStart&&(r.viewportStart=r.selectedIndex),this.repaint());return}if(this.history){let a=this.history.back(this.input.buffer);a!==null&&this.applyEdit(H.seed(a))}return}if(n?.ctrl&&n?.name==="n"||n?.name==="down"){if(r?.dropdownOpen){r.selectedIndex<r.candidates.length-1&&(r.selectedIndex++,r.selectedIndex>=r.viewportStart+e.MAX_DROPDOWN_ROWS&&(r.viewportStart=r.selectedIndex-e.MAX_DROPDOWN_ROWS+1),this.repaint());return}if(this.history){let a=this.history.forward();a!==null&&this.applyEdit(H.seed(a))}return}if(n?.name==="return"){let a=n?.shift===!0||o==="\x1B[13;2u",l=n?.meta===!0;if(a||l){this.history?.resetRecall(),this.applyEdit(H.insert(this.input,`
1998
+ `));return}if(this.pasting){this.input=H.insert(this.input,`
1999
+ `),this.queued=!1;return}let c=this.autocompleteState;if(c?.dropdownOpen){let d=c.trigger?.kind,u=this.applyDropdownSelection();if(d!=="slash"||!u)return}if(this.input.buffer.length===0&&this.attachments.length===0)return;if(this.inputMode==="idle"&&this.onSubmit){let d=this.input.buffer,u=[...this.attachments],p=this.onSubmit;this.queued=!1,this.input=H.seed(""),this.attachments=[],this.autocompleteState?.reset(),this.repaint(),p({text:d,attachments:u});return}this.queued||(this.queued=!0,this.repaint());return}if(n?.name==="backspace"){let a=H.backspace(this.input);a!==this.input?(this.history?.resetRecall(),this.applyEdit(a)):this.queued?(this.queued=!1,this.repaint()):this.attachments.length>0&&(this.attachments.pop(),this.repaint());return}if(n?.name==="left"){this.applyEdit(H.moveLeft(this.input));return}if(n?.name==="right"){this.applyEdit(H.moveRight(this.input));return}if(n?.name==="home"){this.applyEdit(H.moveHome(this.input));return}if(n?.name==="end"){this.applyEdit(H.moveEnd(this.input));return}if(n?.name==="delete"){this.history?.resetRecall(),this.applyEdit(H.deleteForward(this.input));return}if(n?.ctrl&&n?.name==="b"){if(this.inputMode==="idle"||this.backgrounded)return;this.backgrounded=!0,this.onBackground&&this.onBackground();return}if(n?.name==="tab"&&n?.shift){this.onShiftTab&&this.onShiftTab();return}if(n?.name==="tab"){this.applyDropdownSelection();return}let s=["tab","pageup","pagedown"];if(n?.name&&s.includes(n.name)||n?.ctrl||n?.meta)return;let i=typeof t=="string"&&t.length===1&&t>=" "?t:typeof n?.sequence=="string"&&n.sequence.length===1&&n.sequence>=" "?n.sequence:null;i!==null&&(this.history?.resetRecall(),this.applyEdit(H.insert(this.input,i)))}};import YM from"chalk";var XM=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,QM=/(?<=\s|^)(@[\w./-]*)(?=\s|$)/g;function zn(e,t){return YM.level===0?e:e.replace(XM,r=>{let o=r.slice(1);return t.has(o)?m.brand(r):m.meta(r)}).replace(QM,r=>m.fileRef(r))}K();var ZM=m.success("\u2713"),e0=m.error("\u2717");function Fr(e){return e?e0:ZM}var la=3,mb=2,fb=3;function gb(e){switch(Nn(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function bd(e){return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,"$1")}function t0(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}function n0(e,t){if(e==="bash"||e==="Bash")return t0(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,s=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let i=`${o} node${o===1?"":"s"}`,a=s>0?`, ${s} edge${s===1?"":"s"}`:"";return`(${i}${a})`}}}catch{}}return t}function hb(e){return e.replace(/[\r\n]+/g," ")}var r0={"(":")","{":"}","[":"]"};function o0(e,t,n="\u2026"){let r=e.charAt(0),o=r0[r];return!(o&&e.endsWith(o)&&e.length>=2)||G(e)<=t?ce(e,t,n):t<3?t>=2?r+o:ce(e,t,n):ce(e,t-1,n)+o}function bn(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=bd(n0(r,n[2]??"")),s=Nn(r),{color:i,glyph:a}=xr(r),l=Bc(s),c=l?` [${l}]`:"";if(t!==void 0){let u=(a+" ").length+r.length+c.length,p=Math.max(1,t-u);o=o0(o,p)}o=hb(o);let d=i(a+" ")+i.bold(r)+m.toolArg(o);return l?d+m.dim(c):d}return m.chrome("\u25CF ")+m.toolArg(e)}function s0(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function qn(e,t,n=60,r){let o=e.isError?m.error:m.dim,s=t??E.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(s)?"~"+e.persistedPath.slice(s.length):e.persistedPath;return o(`saved \u2192 ${a}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${s0(r,e.lineCount)}`);let i=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(hb(i))}var hd=8;function i0(){let e=E.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}var a0=/[\x00-\x08\x0B-\x1F\x7F]/g;function l0(e){let t=Ve(e.text).replace(a0,"");return e.kind==="+"?m.diffAdd("+ "+t):e.kind==="-"?m.diffRemove("- "+t):m.dim(" "+t)}var yd=new WeakMap;function Jn(e,t,n){if(i0())return[];let r=t+"|"+n,o=yd.get(e);if(o!==void 0){let a=o.get(r);if(a!==void 0)return a}let s=[],i=[];for(let a of e.hunks){let l=`@@ -${a.oldStart},${a.oldLines} +${a.newStart},${a.newLines} @@`;i.push({kind:"header",text:m.diffHunk(l)});for(let c of a.lines)i.push({kind:"body",text:l0(c)})}if(t==="overlay"){let a=i.filter(l=>l.kind!=="header");if(a.length>hd){let l=0,c=[];for(let u of i)u.kind==="header"?c.push(u):l<hd&&(c.push(u),l++);let d=a.length-hd;for(let u of c)s.push(n+u.text);return s.push(n+m.dim(`\u2026 +${d} more diff line${d===1?"":"s"}`)),pb(e,r,s),s}}for(let a of i)s.push(n+a.text);return pb(e,r,s),s}function pb(e,t,n){let r=yd.get(e);r===void 0&&(r=new Map,yd.set(e,r)),r.set(t,n)}K();function Ie(e,t){return ce(e,t)}var kd=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),c0=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "});function kn(){let e=E.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?c0:kd}function kb(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function wd(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?m.dim(o):o}return n}function wb(e,t,n){if(!e||!e.trim())return[];let r=m.dim(n.textPrefix),o=Math.max(1,te()-t.length-2-2),s=wd(t,n),i=[];for(let a of e.split(`
1998
2000
  `)){let l=pe(a,o);for(let c of l.split(`
1999
2001
  `))i.push(s+r+c)}return i}function yb(e){return Ze.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function d0(e){return Ze.has(e)?mb:fb}var A5=kd.midConnector,R5=kd.lastConnector;function Sb(e,t=kn()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function vb(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=e.slice(t),o=g0(r);return[...n,{kind:"overflow",count:r.length,text:o}]}function u0(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function Tb(e){if(e.length===0)return[];let t=new Map;for(let o of e){let s=yb(o),i=t.get(s);i||(i=[],t.set(s,i)),i.push(o)}let n=[],r=new Set;for(let o of e){let s=yb(o),i=t.get(s);i.length>=d0(o.toolName)?r.has(s)||(n.push({kind:"group",toolName:o.toolName,label:Ze.has(o.toolName)?o.toolInput:"",entries:i}),r.add(s)):n.push(o)}return n}function Eb(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,s;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),s=l.join(", ")}else o===t?s=`${t} done`:o===0?s=`${t} running`:s=`${o}/${t} done`;return bn(e.toolName+e.label)+m.dim(` \xD7${t} \u2014 ${s}`)}function p0(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var m0=5,bb=60;function f0(e){return e.replace(/[\r\n\x1b]+/g," ").replace(/ {2,}/g," ").trim()}function g0(e){let t=new Map,n=0;for(let s of e)s.kind==="group"?(t.set(s.toolName,(t.get(s.toolName)??0)+s.entries.length),n+=s.entries.length):(t.set(s.toolName,(t.get(s.toolName)??0)+1),n+=1);if(n===0)return"";if(e.length>0&&e.every(s=>Ze.has(s.toolName))&&new Set(e.map(s=>s.toolName)).size===1){let s=[],i=!1;for(let a of e){let c=(a.kind==="group"?a.label:a.toolInput).trim();if(!c.startsWith("(")||!c.endsWith(")")){i=!0;break}let d=c.slice(1,-1),u=f0(d);if(!u){i=!0;break}let p=u.length>bb?u.slice(0,bb-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;s.push({display:p,entries:f})}if(!i&&s.length>0){let a=s.slice(0,m0),l=a.map(({display:p,entries:f})=>f>1?`${p} \xD7${f}`:p),c=a.reduce((p,f)=>p+f.entries,0),d=n-c,u=l.join(", ")+(d>0?` (+${d})`:"");return`\u2026 +${n} more: ${u}`}}let o=[];for(let[s,i]of t)o.push(`${i} ${p0(s,i)}`);return`\u2026 +${n} (${o.join(", ")})`}function Sd(e,t,n,r=te(),o=[],s=kn()){let i=kb(o,s),a=wd(i,s),l=e.filter(f=>f.kind==="text"),c=e.filter(f=>f.kind==="tool"),d=Tb(c),u=vb(d,la),p=Sb(u,s);for(let{sibling:f,connector:g}of p){let h=m.dim(g),b=g===s.lastConnector;if(f.kind==="overflow")n.push(Ie(a+h+m.dim(f.text),r));else if(f.kind==="group")n.push(Ie(a+h+Eb(f),r));else if(f.kind==="resultSummary")n.push(Ie(a+h+m.dim(f.summary),r));else{let y=f,S=t.get(y.toolUseId);if(Ze.has(y.toolName)&&S&&S.length>0){if(y.headerEmitted){let T=y.toolInput?`${y.toolName} ${y.toolInput}`:y.toolName;n.push(Ie(a+h+m.dim("\u21B3 "+T),r))}else n.push(Ie(a+h+y.prefix,r));Sd(S,t,n,r,[...o,b],s),y.thinkingTail&&n.push(Ie(a+s.spineClosed+m.thinking("\u2307 "+y.thinkingTail),r))}else if(y.result){if(n.push(Ie(a+h+y.prefix+m.dim(" \u2014 ")+Fr(y.result.isError)+" "+qn(y.result,void 0,60,y.toolName),r)),y.diff&&!y.result.isError){let T=a+(b?s.spineClosed:m.dim(s.spine))+" ";for(let x of Jn(y.diff,"overlay",T))n.push(x)}}else{n.push(Ie(a+h+y.prefix,r));let T=a+(b?s.spineClosed:m.dim(s.spine))+" ";y.thinkingTail?n.push(Ie(T+m.thinking("\u2307 "+y.thinkingTail),r)):n.push(Ie(T+m.dim(gb(y.toolName)),r))}}}for(let f of l)n.push(...wb(f.text,i,s))}function vd(e,t,n,r,o=te(),s=[],i=kn()){let a=kb(s,i),l=wd(a,i),c=[],d=e.filter(b=>b.kind==="text"),u=e.filter(b=>b.kind==="tool"),p=Tb(u),f=vb(p,la),g=u0(f,r),h=Sb(g,i);for(let{sibling:b,connector:y}of h){let S=m.dim(y),T=y===i.lastConnector;if(b.kind==="overflow")c.push(Ie(l+S+m.dim(b.text),o));else if(b.kind==="resultSummary")c.push(Ie(l+S+m.dim(b.summary),o));else if(b.kind==="group")c.push(Ie(l+S+Eb(b),o));else{let x=b,w=t.get(x.toolUseId);if(Ze.has(x.toolName)&&w&&w.length>0){if(x.headerEmitted){let v=x.toolInput?`${x.toolName} ${x.toolInput}`:x.toolName;c.push(Ie(l+S+m.dim("\u21B3 "+v),o))}else c.push(Ie(l+S+x.prefix,o));c.push(...vd(w,t,n,void 0,o,[...s,T],i))}else if(x.result){if(c.push(Ie(l+S+x.prefix+m.dim(" \u2014 ")+Fr(x.result.isError)+" "+qn(x.result,n,60,x.toolName),o)),x.diff&&!x.result.isError){let v=l+(T?i.spineClosed:m.dim(i.spine))+" ";for(let R of Jn(x.diff,"flush",v))c.push(R)}}else c.push(Ie(l+S+x.prefix,o))}}for(let b of d)c.push(...wb(b.text,a,i));return c}function ca(e,t,n,r,o=0){let s=kn(),i=t.filter(h=>h.kind==="tool"),l=i.filter(h=>h.result).reduce((h,b)=>h+(b.result.lineCount??0),0),c=[];i.length>la&&(c.push(`${i.length} tools`),l>0&&c.push(`${l} lines`));let d=m.dim(s.spine.repeat(o)),u=Array.from({length:o},()=>!1),p=m.dim(s.turnRoot),f=c.length>0?d+p+e.prefix+m.dim(" \u2014 "+c.join(" \xB7 ")):d+p+e.prefix,g=vd(t,n,r,e.agentResultSummary,te(),u,s);return[f,...g].join(`
2000
2002
  `)}function xb(e,t=0){let n=kn(),r=m.dim(n.spine.repeat(t)),o=m.dim(n.turnRoot);return r+o+e.prefix}function da(e,t,n,r,o=0){let s=kn(),i=Array.from({length:o},()=>!1);return vd(t,n,r,e.agentResultSummary,te(),i,s)}function Vo(e,t,n){let r=[];for(let o of t){let s=e.get(o);if(s.length===1){let i=s[0];if(i.result){if(r.push(" "+i.prefix+m.dim(" \u2014 ")+Fr(i.result.isError)+" "+qn(i.result,n,60,i.toolName)),i.diff&&!i.result.isError)for(let a of Jn(i.diff,"flush"," "))r.push(a)}else r.push(" "+i.prefix)}else{r.push(h0(o,s,n));for(let i of s)if(i.diff&&i.result&&!i.result.isError)for(let a of Jn(i.diff,"flush"," "))r.push(a)}}return r}function h0(e,t,n){let{color:r,glyph:o}=xr(e),s=t.map(d=>bd(d.toolInput).trim()),i=r(o+" ")+r.bold(e)+m.dim(` \xD7${t.length}`)+" "+m.toolArg(s.join(", ")),a=t.filter(d=>d.result),l=a.filter(d=>d.result.isError);if(l.length>0){let d=a.length-l.length,p=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return p>0&&f.push(`${p} lines`),d>0&&f.push(`${d} ok`),f.push(m.error(`${l.length} error${l.length>1?"s":""}`))," "+i+m.dim(" \u2014 ")+f.join(m.dim(", "))}let c=a.map(d=>d.result?.lineCount).filter(d=>d!==void 0);if(c.length===a.length&&c.length>0){if(c.every(p=>p===c[0]))return" "+i+m.dim(` \u2014 ${c[0]} lines each`);let u=c.reduce((p,f)=>p+f,0);return" "+i+m.dim(` \u2014 ${u} lines total`)}if(a.length>0){let d=a.map(u=>qn(u.result,n,60,u.toolName));return" "+i+m.dim(" \u2014 ")+d.join(m.dim(", "))}return" "+i}var Ab=6,Yo=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=bn(n+r),s=this.agentIdStack.at(-1)??void 0,i={kind:"tool",toolUseId:t,toolName:n,toolInput:r,prefix:o,...s!==void 0?{agentContext:s}:{}};this.entries.set(t,i),this.order.push(t),vr.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,s){let i=this.entries.get(t);if(i?.kind==="tool"){i.toolInput=r,i.prefix=bn(n+r,s),o!==void 0&&(i.agentContext=o);return}let a=bn(n+r,s),l={kind:"tool",toolUseId:t,toolName:n,toolInput:r,prefix:a,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,l),this.order.push(t)}mergeAgentLabel(t,n,r){let o=this.entries.get(t);if(o?.kind!=="tool"||!vr.has(o.toolName)||o.toolName==="Agent")return!1;let s=`(${n})`;return o.toolName="Agent",o.toolInput=s,o.prefix=bn("Agent"+s,r),!0}setAgentContext(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.agentContext:r.agentContext=n)}setAgentResultSummary(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.agentResultSummary=n)}setThinkingTail(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.thinkingTail:r.thinkingTail=n)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}addDiff(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.diff=n)}upsertTextChild(t,n,r){let o=this.entries.get(t);if(o?.kind==="text"){o.text=r,o.agentContext=n;return}let s={kind:"text",toolUseId:t,text:r,agentContext:n};this.entries.set(t,s),this.order.push(t)}removeTextChildrenUnder(t){let n=[];for(let[r,o]of this.entries)o.kind==="text"&&o.agentContext===t&&n.push(r);for(let r of n)this.entries.delete(r);if(n.length>0){let r=new Set(n);this.order=this.order.filter(o=>!r.has(o))}}hasPending(){return this.entries.size>0}hasEntry(t){return this.entries.get(t)?.kind==="tool"}getOverlay(){let t=this.buildChildMap(),n=[],r=kn(),o=te(),s=c=>ce(c,o),i=[];for(let c of this.order){let d=this.entries.get(c);!d||d.kind!=="tool"||d.agentContext||i.push(d)}let a=i,l=0;if(i.length>Ab){let c=i.filter(f=>!f.result),d=i.filter(f=>f.result),u=Math.max(0,Ab-c.length),p=new Set(d.slice(-u));l=d.length-p.size,a=i.filter(f=>!f.result||p.has(f))}for(let c of a){let d=t.get(c.toolUseId);if(Ze.has(c.toolName)&&d&&d.length>0){if(c.headerEmitted){let u=c.toolInput?`${c.toolName} ${c.toolInput}`:c.toolName;n.push(s(m.dim(r.turnRoot)+m.dim("\u21B3 "+u)))}else n.push(s(m.dim(r.turnRoot)+c.prefix));Sd(d,t,n,void 0,void 0,r),c.thinkingTail&&n.push(s(" "+m.thinking("\u2307 "+c.thinkingTail)))}else if(!(Ze.has(c.toolName)&&c.headerEmitted))if(c.result){if(n.push(s(" "+c.prefix+m.dim(" \u2014 ")+Fr(c.result.isError)+" "+qn(c.result,void 0,60,c.toolName))),c.diff&&!c.result.isError)for(let u of Jn(c.diff,"overlay"," "))n.push(s(u))}else n.push(s(" "+c.prefix+m.dim(" \u2026"))),c.thinkingTail&&n.push(s(" "+m.thinking("\u2307 "+c.thinkingTail)))}return l>0&&n.push(s(" "+m.dim(`\u2026 +${l} done`))),n.join(`
@@ -2032,11 +2034,11 @@ An AFK.md already exists at \`${n}\`. Read it first \u2014 then update it with a
2032
2034
  A CLAUDE.md exists at \`${r}\`. Read it and incorporate relevant context (commands, conventions, architecture) into the AFK.md. Don't duplicate \u2014 adapt.`),t.trim()){let a=t.replace("--force","").trim();a&&(s+=`
2033
2035
 
2034
2036
  ## Additional context from user
2035
- ${a}`)}o.push({type:"text",text:s});let i=jr(e,{skillName:"init",out:Br(),onCancel:()=>{e.session.current.interrupt().catch(()=>{})}});try{await i.arm(),await en(i.sink,async()=>{for await(let a of e.session.current.sendMessageStream(o))i.sink(a)})}catch(a){e.out.line(),e.out.error(`init failed: ${a instanceof Error?a.message:String(a)}`)}finally{await i.dispose()}return"continue"}};import Wb from"chalk";var Ad=new Map;function Hb(e,t){let n=Ad.get(e);if(n){if(n.glyph===t.glyph&&n.color===t.color&&n.inFlightVerb===t.inFlightVerb)return;throw new Error(`Trusted skill "${e}" already registered with different config`)}Ad.set(e,t),yh(e)}function ga(e){return Ad.get(e)}function O0(e){return(e/1e3).toFixed(1)+"s"}function Kb(e,t){let n=ga(e.skillName),r=O0(e.durationMs);if(!n){let s=`[${e.skillName} \xB7 ${r}]`;return Wr(s,t?.columns)}if(t?.isTTY!==!1){let s;if(e.claimsTotal!==void 0){let a=e.claimsTotal===e.claimsConfirmed&&e.claimsRefuted===void 0&&e.claimsInconclusive===void 0,l;if(a)l=`${e.claimsTotal} claims \xB7 all confirmed`;else{let c=`${e.claimsTotal} claims`;e.claimsConfirmed!==void 0&&(c+=` \xB7 ${e.claimsConfirmed} confirmed`),e.claimsRefuted!==void 0&&(c+=` \xB7 ${e.claimsRefuted} refuted`),e.claimsInconclusive!==void 0&&(c+=` \xB7 ${e.claimsInconclusive} inconclusive`),l=c}s=`${n.glyph} ${e.skillName} \xB7 ${l} \xB7 ${r}`}else s=`${n.glyph} ${e.skillName} \xB7 ${r}`;let i=Wb.hex(n.color)(s);return Wr(i,t?.columns)}else{let s;if(e.claimsTotal!==void 0){let i=e.claimsConfirmed??0;s=`[${e.skillName} \xB7 ${i}/${e.claimsTotal} confirmed \xB7 ${r}]`}else s=`[${e.skillName} \xB7 ${r}]`;return Wr(s,t?.columns)}}function Wr(e,t){return t!==void 0&&K(e)>t?ce(e,t):e}function Gb(e,t){let n=ga(e);if(!n){let s=`[${e} \xB7 running\u2026]`;return Wr(s,t?.columns)}if(t?.isTTY!==!1){let s=`${n.glyph} ${e} \xB7 ${n.inFlightVerb}`,i=Wb.hex(n.color)(s);return Wr(i,t?.columns)}let o=`[${e} \xB7 ${n.inFlightVerb}]`;return Wr(o,t?.columns)}var zb={name:"/stats",summary:"Show session statistics including skill runs",async handler(e){let t=e.ledger;if(!t)return e.out.info("No skill stats available."),"continue";let n=t.summary();if(!n)return e.out.info("No skill runs recorded this session."),"continue";e.out.line(),e.out.line(m.bold("Skill runs"));for(let[r,o]of n){let s=ga(r)?.glyph??"",i=s?`${s} `:"",a=`${(o.totalDurationMs/1e3).toFixed(1)}s total`,l=`${o.runs} run${o.runs!==1?"s":""}`,c="";o.totalClaims!==void 0&&(c=` \xB7 ${o.totalClaims} claims`,o.totalConfirmed!==void 0&&(c+=` \xB7 ${o.totalConfirmed} confirmed`),o.totalRefuted!==void 0&&(c+=` \xB7 ${o.totalRefuted} refuted`),o.totalInconclusive!==void 0&&(c+=` \xB7 ${o.totalInconclusive} inconclusive`)),e.out.line(` ${i}${r} ${l}${c} \xB7 ${a}`)}return e.out.line(),"continue"}};function $0(e=pc){return{name:"/font-size",summary:"Get or set the terminal font size in Cursor / VS Code",usage:"/font-size [size] [editor]",hint:"Direct shortcut to the terminal_font_size tool \u2014 bypasses the LLM and the first-write permission prompt. Examples: `/font-size` (read all), `/font-size 18` (set all), `/font-size 14 cursor` (set Cursor only).",async handler(t,n){let r=n.split(/\s+/).filter(Boolean),o=new AbortController;if(r.length===0){let d=await e({action:"get"},o.signal);return d.isError?t.out.error(d.content):t.out.line(d.content),"continue"}let s=r[0],i=Number(s);if(!Number.isFinite(i))return t.out.error(`Invalid size: "${s}". Usage: /font-size [size] [editor]`),"continue";let a=r[1],l={action:"set",size:i};a!==void 0&&(l.editor=a);let c=await e(l,o.signal);return c.isError?t.out.error(c.content):t.out.success(c.content),"continue"}}}var qb=$0();import D0 from"path";import{statSync as L0}from"fs";var Vn;function Jb(e){Vn=e}var Vb={name:"/allow-dir",summary:"Manage per-session directory access grants for tool handlers",usage:"/allow-dir [--rw | --revoke] [<path>]",flags:["--rw","--revoke"],async handler(e,t){if(!Vn)return e.out.error("Directory grants not available in this session."),"continue";let n=t.trim();if(!n){let a=Vn.getGrants();return e.out.line(" Session directory grants:"),e.out.line(` resolveBase : ${a.resolveBase??"(none)"}`),e.out.line(` readRoots : ${a.readRoots.length>0?a.readRoots.join(", "):"(none)"}`),e.out.line(` writeRoots : ${a.writeRoots.length>0?a.writeRoots.join(", "):"(none)"}`),"continue"}let r="read",o=n;if(o.startsWith("--rw ")||o==="--rw"?(r="write",o=o.slice(5).trim()):(o.startsWith("--revoke ")||o==="--revoke")&&(r="revoke",o=o.slice(9).trim()),!o)return e.out.error("Usage: /allow-dir [--rw | --revoke] <path>"),"continue";let s=D0.resolve(process.cwd(),o);if(r!=="revoke")try{L0(s)}catch{return e.out.error(`Path does not exist: ${s}`),"continue"}let i=e.stats.sessionId;if(r==="revoke"){let a=Vn.getGrants();Vn.revokeRoot(s,"slash",i),a.resolveBase&&s===a.resolveBase?e.out.warn(`Cannot revoke the session's initial resolveBase: ${s}`):e.out.line(`\u2713 Revoked: ${s}`)}else r==="write"?(Vn.addWriteRoot(s,"slash",i),e.out.line(`\u2713 Read+write grant: ${s}`)):(Vn.addReadRoot(s,"slash",i),e.out.line(`\u2713 Read-only grant: ${s}`));return"continue"}};var Yb=[{group:"Navigation",rows:[["ctrl+a","Move to start of current line"],["ctrl+e","Move to end of current line"],["ctrl+b","Move one character backward (input mode) / Run turn in background (streaming mode)"],["ctrl+f","Move one character forward"],["alt+b","Move one word backward"],["alt+f","Move one word forward"],["\u2190 / \u2192","Character left / right"],["home / end","Buffer start / end"]]},{group:"Editing",rows:[["ctrl+u","Delete to start of current line"],["ctrl+k","Delete to end of current line"],["ctrl+w","Delete previous word"],["backspace","Delete previous character"],["delete","Delete next character"],["alt+backspace","Delete previous word (Option+Delete on macOS)"],["alt+delete","Delete next word (Option+Fn-Delete on macOS)"]]},{group:"History",rows:[["ctrl+p / \u2191","Previous history entry (or move up in multi-line draft)"],["ctrl+n / \u2193","Next history entry (or move down in multi-line draft)"]]},{group:"Multi-line",rows:[["shift+enter","Insert newline (no submit)"],["alt+enter","Insert newline (no submit)"],["<text>\\","Trailing \\ + Enter inserts newline (backwards-compat)"]]},{group:"Misc",rows:[["ctrl+l","Clear screen and repaint"],["ctrl+v","Paste image from clipboard"],["ctrl+x","Remove last attached image"],["ctrl+c","Interrupt running turn / exit (second press)"],["ctrl+d","EOF / exit (when buffer is empty)"],["tab","Accept autocomplete suggestion"],["enter","Submit prompt"]]}],Xb={name:"/keys",summary:"Show keybinding reference",async handler(e){e.out.line(),e.out.line(m.bold(m.brand("Keybindings"))),e.out.line(be());let n=Yb.flatMap(r=>r.rows).reduce((r,[o])=>Math.max(r,o.length),0);for(let{group:r,rows:o}of Yb){e.out.line(),e.out.line(m.bold(r));for(let[s,i]of o){let a=" ".repeat(Math.max(0,n-s.length));e.out.line(` ${m.warning(s)}${a} ${m.dim(i)}`)}}return e.out.line(),"continue"}};import{execFile as z0}from"node:child_process";import{promises as q0}from"node:fs";import{dirname as J0,isAbsolute as V0,join as Y0,resolve as X0}from"node:path";import{promisify as Q0}from"node:util";F();import{promises as ht,existsSync as Qb,createReadStream as F0}from"node:fs";import{join as ha}from"node:path";import{createInterface as N0}from"node:readline";var U0=36e5,j0=30*864e5;function B0(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function W0(e){let t=e.trim().split(/\n\n+/),n=[];for(let r of t){let o=r.split(`
2036
- `),s="",i="",a="",l=!1,c=!1,d=!1;for(let u of o)u.startsWith("worktree ")?s=u.slice(9).trim():u.startsWith("HEAD ")?i=u.slice(5).trim():u.startsWith("branch ")?a=u.slice(7).trim():u.trim()==="locked"?l=!0:u.trim()==="prunable"?c=!0:u.trim()==="bare"&&(d=!0);s&&n.push({path:s,head:i,branch:a,locked:l,prunable:c,isBare:d})}return n}function H0(e,t,n){if(e.locked)return"locked";let r=864e5,o=t*r,s=n*r;return e.ownerLiveness==="dead"&&!e.isDirty&&e.commitsAhead===0?"dead-owner":e.commitsAhead===0&&!e.isDirty&&e.ageMs>=U0?"empty":e.isDirty&&e.ageMs>s?"stale-dirty":!e.isDirty&&e.ageMs>o?"stale-clean":"active"}async function K0(e){if(!Qb(e))return 0;let t=0;try{let n=N0({input:F0(e),crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let s=JSON.parse(o);s.taskId==="worktree-prune"&&(s.status==="success"||s.status==="error")&&t++}catch{}}}catch{}return t}var ya=class extends Error{constructor(t){super(`Worktree sweep lock contested: ${t} \u2014 another sweep may be running.`),this.name="LockContestedError"}};async function G0(e){let t=ha(e,"..");await ht.mkdir(t,{recursive:!0}).catch(()=>{});let r=await(async()=>{try{return await ht.open(e,"wx")}catch(o){if(o.code!=="EEXIST")throw o;let i=null;try{let a=await ht.readFile(e,"utf-8");i=parseInt(a.trim(),10)}catch{}if(i!==null&&!Number.isNaN(i)){let a=!1;try{process.kill(i,0),a=!0}catch{}if(!a)return await ht.unlink(e).catch(()=>{}),await ht.open(e,"wx")}throw new ya(e)}})();return await r.writeFile(String(process.pid),"utf-8"),await r.close(),async()=>{await ht.unlink(e).catch(()=>{})}}async function _t(e){let{execFile:t,repoRoot:n,maxAgeDaysClean:r=14,maxAgeDaysDirty:o=30,scope:s="all",telemetryPath:i}=e,a=i??kt(),l=rp(),c={removed:[],warnings:[],dryRun:e.dryRun??!1,candidates:[]},d=e.bypassSoftLaunch?Number.POSITIVE_INFINITY:await K0(a),u=e.dryRun===!0||d<3;c.dryRun=u;let p=null;try{p=await G0(l)}catch(f){if(f instanceof ya)return c.warnings.push(`[WARN] ${f.message}`),c;throw f}try{let f=await t("git",["-C",n,"worktree","list","--porcelain"]),g=W0(f.stdout),h=ha(n,".afk-worktrees"),b=new Set(g.map(w=>w.path)),y=[];try{y=(await ht.readdir(h,{withFileTypes:!0})).filter(v=>v.isDirectory()).map(v=>ha(h,v.name))}catch{}let S=y.filter(w=>!b.has(w));if(s==="all"||s==="interactive")for(let w of S){let v=0;try{let R=await ht.stat(w);v=Date.now()-R.birthtimeMs}catch{}if(c.candidates.push({path:w,verdict:"orphaned-dir",owner:"interactive",ageMs:v}),!u)try{await ht.rm(w,{recursive:!0,force:!0}),c.removed.push(w)}catch(R){c.warnings.push(`[ERROR] Failed to remove orphaned dir ${w}: ${R instanceof Error?R.message:String(R)}`)}}let T=!1,x=g[0]?.path;for(let w of g){if(w.path===x||w.isBare||!w.path.startsWith(h))continue;let v;try{let j=await ht.readFile(ha(w.path,".afk-worktree-meta.json"),"utf-8");v=JSON.parse(j)}catch{}if(s!=="all"&&v?.owner!==s)continue;let R=v?.owner==="interactive"||v?.owner==="diagnose"?v.owner:"unknown";if(!Qb(w.path)){c.candidates.push({path:w.path,verdict:"orphaned-registration",owner:R,ageMs:0}),u||(T=!0);continue}let _=0,C=v?.createdAt;if(C)_=Date.now()-new Date(C).getTime();else try{let j=await ht.stat(w.path);_=Date.now()-j.birthtimeMs}catch{}let A=!1,O=0;try{A=(await t("git",["-C",w.path,"status","--porcelain"])).stdout.trim().length>0}catch{A=!0}if(!A&&w.head){let j=v?.baseSha??w.head;try{let G=await t("git",["-C",n,"rev-list",`${j}..${w.head}`,"--count"]);O=parseInt(G.stdout.trim(),10)||0}catch{O=0}}let M="unknown";typeof v?.pid=="number"&&Number.isInteger(v.pid)&&v.pid>0&&_<=j0&&(M=B0(v.pid)?"alive":"dead");let $={path:w.path,head:w.head,branch:w.branch,locked:w.locked,prunable:w.prunable,meta:v,ageMs:_,isDirty:A,commitsAhead:O,ownerLiveness:M},N=H0($,r,o);if(c.candidates.push({path:w.path,verdict:N,owner:R,ageMs:_}),!u)try{N==="empty"?(await t("git",["-C",n,"worktree","remove","--force",w.path]),w.branch&&await t("git",["-C",n,"branch","-d",w.branch]).catch(()=>{}),c.removed.push(w.path)):N==="dead-owner"?(await t("git",["-C",n,"worktree","remove","--force",w.path]),w.branch&&await t("git",["-C",n,"branch","-d",w.branch]).catch(()=>{}),c.removed.push(w.path)):N==="stale-clean"?(await t("git",["-C",n,"worktree","remove","--force",w.path]),c.removed.push(w.path)):N==="stale-dirty"&&c.warnings.push(`[WARN] stale-dirty worktree preserved (uncommitted changes): ${w.path}`)}catch(j){c.warnings.push(`[ERROR] Failed to process ${w.path} (${N}): ${j instanceof Error?j.message:String(j)}`)}}if(T&&!u)try{await t("git",["-C",n,"worktree","prune"])}catch(w){c.warnings.push(`[ERROR] git worktree prune failed: ${w instanceof Error?w.message:String(w)}`)}}finally{p&&await p()}return c}var Rd=Q0(z0),Zb=["interactive","diagnose","all"],ba=new Set(["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"]);async function ek(){let t=(await Rd("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=V0(t)?t:X0(process.cwd(),t);return J0(n)}function Z0(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function eO(e,t){return ba.has(e)?m.error(t):e==="stale-dirty"?m.warning(t):e==="locked"?m.dim(t):m.dim(t)}function tk(e,t){let n=e.split(/\s+/).map(o=>o.trim()).filter(o=>o.length>0),r={scope:t,apply:!1,unknown:[]};for(let o=0;o<n.length;o++){let s=n[o];if(s==="--apply")r.apply=!0;else if(s==="--scope"&&o+1<n.length){let i=n[o+1];o++,Zb.includes(i)?r.scope=i:r.unknown.push(`--scope=${i}`)}else if(s.startsWith("--scope=")){let i=s.slice(8);Zb.includes(i)?r.scope=i:r.unknown.push(s)}else r.unknown.push(s)}return r}async function tO(e){try{let t=await q0.readFile(Y0(e,".afk-worktree-meta.json"),"utf-8"),n=JSON.parse(t);if(typeof n.pid=="number"&&Number.isInteger(n.pid)&&n.pid>0)return n.pid}catch{}}async function nO(e,t,n){if(t.length===0){e.info("No afk-managed worktrees found.");return}let r=process.pid;e.line(),e.line(m.bold("Worktrees")),e.line(m.dim(" "+"PATH".padEnd(45)+" "+"OWNER".padEnd(12)+" "+"AGE".padEnd(5)+" "+"VERDICT".padEnd(22)+" PRUNE?"));for(let o of t){let a=n.get(o.path)===r?m.brand("\u2192 "):" ",l=o.path.slice(-44).padEnd(45),c=o.owner.padEnd(12),d=Z0(o.ageMs).padEnd(5),u=o.verdict.padEnd(22),p=ba.has(o.verdict)?m.error("yes"):o.verdict==="stale-dirty"?m.warning("warn"):m.dim("no"),f=eO(o.verdict,u);e.line(`${a}${l} ${c} ${d} ${f} ${p}`)}e.line(),e.line(m.dim(" \u2192 this session")),e.line()}async function rO(e){let t=new Map;for(let n of e)t.set(n.path,await tO(n.path));return t}async function oO(e,t){let n=tk(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await ek()}catch(i){return e.out.error(`Not in a git repository: ${i.message}`),"continue"}let o;try{let i={execFile:Rd,repoRoot:r,dryRun:!0,scope:n.scope};o=await _t(i)}catch(i){return e.out.error(`Sweep failed: ${i.message}`),"continue"}let s=await rO(o.candidates);await nO(e.out,o.candidates,s);for(let i of o.warnings)e.out.warn(i);return"continue"}async function sO(e,t){let n=tk(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await ek()}catch(a){return e.out.error(`Not in a git repository: ${a.message}`),"continue"}let o;try{let a={execFile:Rd,repoRoot:r,dryRun:!n.apply,scope:n.scope};o=await _t(a)}catch(a){return e.out.error(`Sweep failed: ${a.message}`),"continue"}let s={};for(let a of o.candidates)s[a.verdict]=(s[a.verdict]??0)+1;let i=Object.entries(s).sort(([a],[l])=>a.localeCompare(l)).map(([a,l])=>`${a}=${l}`);if(o.dryRun){let a=o.candidates.filter(l=>ba.has(l.verdict)).length;e.out.line(),e.out.line(m.warning("\u{1F50D} Dry-run \u2014 pass --apply to actually remove.")+` Would prune ${a} worktree(s).`+(i.length>0?` [${i.join(" ")}]`:""))}else{let a=o.warnings.filter(c=>c.startsWith("[WARN]")).length,l=o.warnings.filter(c=>c.startsWith("[ERROR]")).length;e.out.line(),e.out.success(`Removed ${o.removed.length}, warned ${a}, errors ${l}`+(i.length>0?` [${i.join(" ")}]`:""))}for(let a of o.candidates){let c=o.removed.includes(a.path)?m.error("\u2717"):ba.has(a.verdict)?m.warning("\u2022"):m.dim("\xB7");e.out.line(` ${c} [${a.verdict.padEnd(22)}] ${a.path}`)}for(let a of o.warnings)a.startsWith("[ERROR]")?e.out.error(a):e.out.warn(a);return e.out.line(),"continue"}var nk={name:"/worktree",summary:"List or prune afk-managed git worktrees",usage:"/worktree list | /worktree prune [--apply] [--scope <interactive|diagnose|all>]",async handler(e,t){let n=t.trim();return n.length===0||n.startsWith("list")?oO(e,n.replace(/^list\s*/,"")):n.startsWith("prune")?sO(e,n.replace(/^prune\s*/,"")):(e.out.error(`Unknown /worktree subcommand. Usage:
2037
+ ${a}`)}o.push({type:"text",text:s});let i=jr(e,{skillName:"init",out:Br(),onCancel:()=>{e.session.current.interrupt().catch(()=>{})}});try{await i.arm(),await en(i.sink,async()=>{for await(let a of e.session.current.sendMessageStream(o))i.sink(a)})}catch(a){e.out.line(),e.out.error(`init failed: ${a instanceof Error?a.message:String(a)}`)}finally{await i.dispose()}return"continue"}};import Wb from"chalk";var Ad=new Map;function Hb(e,t){let n=Ad.get(e);if(n){if(n.glyph===t.glyph&&n.color===t.color&&n.inFlightVerb===t.inFlightVerb)return;throw new Error(`Trusted skill "${e}" already registered with different config`)}Ad.set(e,t),yh(e)}function ga(e){return Ad.get(e)}function O0(e){return(e/1e3).toFixed(1)+"s"}function Kb(e,t){let n=ga(e.skillName),r=O0(e.durationMs);if(!n){let s=`[${e.skillName} \xB7 ${r}]`;return Wr(s,t?.columns)}if(t?.isTTY!==!1){let s;if(e.claimsTotal!==void 0){let a=e.claimsTotal===e.claimsConfirmed&&e.claimsRefuted===void 0&&e.claimsInconclusive===void 0,l;if(a)l=`${e.claimsTotal} claims \xB7 all confirmed`;else{let c=`${e.claimsTotal} claims`;e.claimsConfirmed!==void 0&&(c+=` \xB7 ${e.claimsConfirmed} confirmed`),e.claimsRefuted!==void 0&&(c+=` \xB7 ${e.claimsRefuted} refuted`),e.claimsInconclusive!==void 0&&(c+=` \xB7 ${e.claimsInconclusive} inconclusive`),l=c}s=`${n.glyph} ${e.skillName} \xB7 ${l} \xB7 ${r}`}else s=`${n.glyph} ${e.skillName} \xB7 ${r}`;let i=Wb.hex(n.color)(s);return Wr(i,t?.columns)}else{let s;if(e.claimsTotal!==void 0){let i=e.claimsConfirmed??0;s=`[${e.skillName} \xB7 ${i}/${e.claimsTotal} confirmed \xB7 ${r}]`}else s=`[${e.skillName} \xB7 ${r}]`;return Wr(s,t?.columns)}}function Wr(e,t){return t!==void 0&&G(e)>t?ce(e,t):e}function Gb(e,t){let n=ga(e);if(!n){let s=`[${e} \xB7 running\u2026]`;return Wr(s,t?.columns)}if(t?.isTTY!==!1){let s=`${n.glyph} ${e} \xB7 ${n.inFlightVerb}`,i=Wb.hex(n.color)(s);return Wr(i,t?.columns)}let o=`[${e} \xB7 ${n.inFlightVerb}]`;return Wr(o,t?.columns)}var zb={name:"/stats",summary:"Show session statistics including skill runs",async handler(e){let t=e.ledger;if(!t)return e.out.info("No skill stats available."),"continue";let n=t.summary();if(!n)return e.out.info("No skill runs recorded this session."),"continue";e.out.line(),e.out.line(m.bold("Skill runs"));for(let[r,o]of n){let s=ga(r)?.glyph??"",i=s?`${s} `:"",a=`${(o.totalDurationMs/1e3).toFixed(1)}s total`,l=`${o.runs} run${o.runs!==1?"s":""}`,c="";o.totalClaims!==void 0&&(c=` \xB7 ${o.totalClaims} claims`,o.totalConfirmed!==void 0&&(c+=` \xB7 ${o.totalConfirmed} confirmed`),o.totalRefuted!==void 0&&(c+=` \xB7 ${o.totalRefuted} refuted`),o.totalInconclusive!==void 0&&(c+=` \xB7 ${o.totalInconclusive} inconclusive`)),e.out.line(` ${i}${r} ${l}${c} \xB7 ${a}`)}return e.out.line(),"continue"}};function $0(e=pc){return{name:"/font-size",summary:"Get or set the terminal font size in Cursor / VS Code",usage:"/font-size [size] [editor]",hint:"Direct shortcut to the terminal_font_size tool \u2014 bypasses the LLM and the first-write permission prompt. Examples: `/font-size` (read all), `/font-size 18` (set all), `/font-size 14 cursor` (set Cursor only).",async handler(t,n){let r=n.split(/\s+/).filter(Boolean),o=new AbortController;if(r.length===0){let d=await e({action:"get"},o.signal);return d.isError?t.out.error(d.content):t.out.line(d.content),"continue"}let s=r[0],i=Number(s);if(!Number.isFinite(i))return t.out.error(`Invalid size: "${s}". Usage: /font-size [size] [editor]`),"continue";let a=r[1],l={action:"set",size:i};a!==void 0&&(l.editor=a);let c=await e(l,o.signal);return c.isError?t.out.error(c.content):t.out.success(c.content),"continue"}}}var qb=$0();import D0 from"path";import{statSync as L0}from"fs";var Vn;function Jb(e){Vn=e}var Vb={name:"/allow-dir",summary:"Manage per-session directory access grants for tool handlers",usage:"/allow-dir [--rw | --revoke] [<path>]",flags:["--rw","--revoke"],async handler(e,t){if(!Vn)return e.out.error("Directory grants not available in this session."),"continue";let n=t.trim();if(!n){let a=Vn.getGrants();return e.out.line(" Session directory grants:"),e.out.line(` resolveBase : ${a.resolveBase??"(none)"}`),e.out.line(` readRoots : ${a.readRoots.length>0?a.readRoots.join(", "):"(none)"}`),e.out.line(` writeRoots : ${a.writeRoots.length>0?a.writeRoots.join(", "):"(none)"}`),"continue"}let r="read",o=n;if(o.startsWith("--rw ")||o==="--rw"?(r="write",o=o.slice(5).trim()):(o.startsWith("--revoke ")||o==="--revoke")&&(r="revoke",o=o.slice(9).trim()),!o)return e.out.error("Usage: /allow-dir [--rw | --revoke] <path>"),"continue";let s=D0.resolve(process.cwd(),o);if(r!=="revoke")try{L0(s)}catch{return e.out.error(`Path does not exist: ${s}`),"continue"}let i=e.stats.sessionId;if(r==="revoke"){let a=Vn.getGrants();Vn.revokeRoot(s,"slash",i),a.resolveBase&&s===a.resolveBase?e.out.warn(`Cannot revoke the session's initial resolveBase: ${s}`):e.out.line(`\u2713 Revoked: ${s}`)}else r==="write"?(Vn.addWriteRoot(s,"slash",i),e.out.line(`\u2713 Read+write grant: ${s}`)):(Vn.addReadRoot(s,"slash",i),e.out.line(`\u2713 Read-only grant: ${s}`));return"continue"}};var Yb=[{group:"Navigation",rows:[["ctrl+a","Move to start of current line"],["ctrl+e","Move to end of current line"],["ctrl+b","Move one character backward (input mode) / Run turn in background (streaming mode)"],["ctrl+f","Move one character forward"],["alt+b","Move one word backward"],["alt+f","Move one word forward"],["\u2190 / \u2192","Character left / right"],["home / end","Buffer start / end"]]},{group:"Editing",rows:[["ctrl+u","Delete to start of current line"],["ctrl+k","Delete to end of current line"],["ctrl+w","Delete previous word"],["backspace","Delete previous character"],["delete","Delete next character"],["alt+backspace","Delete previous word (Option+Delete on macOS)"],["alt+delete","Delete next word (Option+Fn-Delete on macOS)"]]},{group:"History",rows:[["ctrl+p / \u2191","Previous history entry (or move up in multi-line draft)"],["ctrl+n / \u2193","Next history entry (or move down in multi-line draft)"]]},{group:"Multi-line",rows:[["shift+enter","Insert newline (no submit)"],["alt+enter","Insert newline (no submit)"],["<text>\\","Trailing \\ + Enter inserts newline (backwards-compat)"]]},{group:"Misc",rows:[["ctrl+l","Clear screen and repaint"],["ctrl+v","Paste image from clipboard"],["ctrl+x","Remove last attached image"],["ctrl+c","Interrupt running turn / exit (second press)"],["ctrl+d","EOF / exit (when buffer is empty)"],["tab","Accept autocomplete suggestion"],["enter","Submit prompt"]]}],Xb={name:"/keys",summary:"Show keybinding reference",async handler(e){e.out.line(),e.out.line(m.bold(m.brand("Keybindings"))),e.out.line(be());let n=Yb.flatMap(r=>r.rows).reduce((r,[o])=>Math.max(r,o.length),0);for(let{group:r,rows:o}of Yb){e.out.line(),e.out.line(m.bold(r));for(let[s,i]of o){let a=" ".repeat(Math.max(0,n-s.length));e.out.line(` ${m.warning(s)}${a} ${m.dim(i)}`)}}return e.out.line(),"continue"}};import{execFile as z0}from"node:child_process";import{promises as q0}from"node:fs";import{dirname as J0,isAbsolute as V0,join as Y0,resolve as X0}from"node:path";import{promisify as Q0}from"node:util";F();import{promises as ht,existsSync as Qb,createReadStream as F0}from"node:fs";import{join as ha}from"node:path";import{createInterface as N0}from"node:readline";var U0=36e5,j0=30*864e5;function B0(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function W0(e){let t=e.trim().split(/\n\n+/),n=[];for(let r of t){let o=r.split(`
2038
+ `),s="",i="",a="",l=!1,c=!1,d=!1;for(let u of o)u.startsWith("worktree ")?s=u.slice(9).trim():u.startsWith("HEAD ")?i=u.slice(5).trim():u.startsWith("branch ")?a=u.slice(7).trim():u.trim()==="locked"?l=!0:u.trim()==="prunable"?c=!0:u.trim()==="bare"&&(d=!0);s&&n.push({path:s,head:i,branch:a,locked:l,prunable:c,isBare:d})}return n}function H0(e,t,n){if(e.locked)return"locked";let r=864e5,o=t*r,s=n*r;return e.ownerLiveness==="dead"&&!e.isDirty&&e.commitsAhead===0?"dead-owner":e.commitsAhead===0&&!e.isDirty&&e.ageMs>=U0?"empty":e.isDirty&&e.ageMs>s?"stale-dirty":!e.isDirty&&e.ageMs>o?"stale-clean":"active"}async function K0(e){if(!Qb(e))return 0;let t=0;try{let n=N0({input:F0(e),crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let s=JSON.parse(o);s.taskId==="worktree-prune"&&(s.status==="success"||s.status==="error")&&t++}catch{}}}catch{}return t}var ya=class extends Error{constructor(t){super(`Worktree sweep lock contested: ${t} \u2014 another sweep may be running.`),this.name="LockContestedError"}};async function G0(e){let t=ha(e,"..");await ht.mkdir(t,{recursive:!0}).catch(()=>{});let r=await(async()=>{try{return await ht.open(e,"wx")}catch(o){if(o.code!=="EEXIST")throw o;let i=null;try{let a=await ht.readFile(e,"utf-8");i=parseInt(a.trim(),10)}catch{}if(i!==null&&!Number.isNaN(i)){let a=!1;try{process.kill(i,0),a=!0}catch{}if(!a)return await ht.unlink(e).catch(()=>{}),await ht.open(e,"wx")}throw new ya(e)}})();return await r.writeFile(String(process.pid),"utf-8"),await r.close(),async()=>{await ht.unlink(e).catch(()=>{})}}async function _t(e){let{execFile:t,repoRoot:n,maxAgeDaysClean:r=14,maxAgeDaysDirty:o=30,scope:s="all",telemetryPath:i}=e,a=i??kt(),l=rp(),c={removed:[],warnings:[],dryRun:e.dryRun??!1,candidates:[]},d=e.bypassSoftLaunch?Number.POSITIVE_INFINITY:await K0(a),u=e.dryRun===!0||d<3;c.dryRun=u;let p=null;try{p=await G0(l)}catch(f){if(f instanceof ya)return c.warnings.push(`[WARN] ${f.message}`),c;throw f}try{let f=await t("git",["-C",n,"worktree","list","--porcelain"]),g=W0(f.stdout),h=ha(n,".afk-worktrees"),b=new Set(g.map(w=>w.path)),y=[];try{y=(await ht.readdir(h,{withFileTypes:!0})).filter(v=>v.isDirectory()).map(v=>ha(h,v.name))}catch{}let S=y.filter(w=>!b.has(w));if(s==="all"||s==="interactive")for(let w of S){let v=0;try{let R=await ht.stat(w);v=Date.now()-R.birthtimeMs}catch{}if(c.candidates.push({path:w,verdict:"orphaned-dir",owner:"interactive",ageMs:v}),!u)try{await ht.rm(w,{recursive:!0,force:!0}),c.removed.push(w)}catch(R){c.warnings.push(`[ERROR] Failed to remove orphaned dir ${w}: ${R instanceof Error?R.message:String(R)}`)}}let T=!1,x=g[0]?.path;for(let w of g){if(w.path===x||w.isBare||!w.path.startsWith(h))continue;let v;try{let j=await ht.readFile(ha(w.path,".afk-worktree-meta.json"),"utf-8");v=JSON.parse(j)}catch{}if(s!=="all"&&v?.owner!==s)continue;let R=v?.owner==="interactive"||v?.owner==="diagnose"?v.owner:"unknown";if(!Qb(w.path)){c.candidates.push({path:w.path,verdict:"orphaned-registration",owner:R,ageMs:0}),u||(T=!0);continue}let _=0,C=v?.createdAt;if(C)_=Date.now()-new Date(C).getTime();else try{let j=await ht.stat(w.path);_=Date.now()-j.birthtimeMs}catch{}let A=!1,O=0;try{A=(await t("git",["-C",w.path,"status","--porcelain"])).stdout.trim().length>0}catch{A=!0}if(!A&&w.head){let j=v?.baseSha??w.head;try{let z=await t("git",["-C",n,"rev-list",`${j}..${w.head}`,"--count"]);O=parseInt(z.stdout.trim(),10)||0}catch{O=0}}let M="unknown";typeof v?.pid=="number"&&Number.isInteger(v.pid)&&v.pid>0&&_<=j0&&(M=B0(v.pid)?"alive":"dead");let $={path:w.path,head:w.head,branch:w.branch,locked:w.locked,prunable:w.prunable,meta:v,ageMs:_,isDirty:A,commitsAhead:O,ownerLiveness:M},N=H0($,r,o);if(c.candidates.push({path:w.path,verdict:N,owner:R,ageMs:_}),!u)try{N==="empty"?(await t("git",["-C",n,"worktree","remove","--force",w.path]),w.branch&&await t("git",["-C",n,"branch","-d",w.branch]).catch(()=>{}),c.removed.push(w.path)):N==="dead-owner"?(await t("git",["-C",n,"worktree","remove","--force",w.path]),w.branch&&await t("git",["-C",n,"branch","-d",w.branch]).catch(()=>{}),c.removed.push(w.path)):N==="stale-clean"?(await t("git",["-C",n,"worktree","remove","--force",w.path]),c.removed.push(w.path)):N==="stale-dirty"&&c.warnings.push(`[WARN] stale-dirty worktree preserved (uncommitted changes): ${w.path}`)}catch(j){c.warnings.push(`[ERROR] Failed to process ${w.path} (${N}): ${j instanceof Error?j.message:String(j)}`)}}if(T&&!u)try{await t("git",["-C",n,"worktree","prune"])}catch(w){c.warnings.push(`[ERROR] git worktree prune failed: ${w instanceof Error?w.message:String(w)}`)}}finally{p&&await p()}return c}var Rd=Q0(z0),Zb=["interactive","diagnose","all"],ba=new Set(["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"]);async function ek(){let t=(await Rd("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=V0(t)?t:X0(process.cwd(),t);return J0(n)}function Z0(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function eO(e,t){return ba.has(e)?m.error(t):e==="stale-dirty"?m.warning(t):e==="locked"?m.dim(t):m.dim(t)}function tk(e,t){let n=e.split(/\s+/).map(o=>o.trim()).filter(o=>o.length>0),r={scope:t,apply:!1,unknown:[]};for(let o=0;o<n.length;o++){let s=n[o];if(s==="--apply")r.apply=!0;else if(s==="--scope"&&o+1<n.length){let i=n[o+1];o++,Zb.includes(i)?r.scope=i:r.unknown.push(`--scope=${i}`)}else if(s.startsWith("--scope=")){let i=s.slice(8);Zb.includes(i)?r.scope=i:r.unknown.push(s)}else r.unknown.push(s)}return r}async function tO(e){try{let t=await q0.readFile(Y0(e,".afk-worktree-meta.json"),"utf-8"),n=JSON.parse(t);if(typeof n.pid=="number"&&Number.isInteger(n.pid)&&n.pid>0)return n.pid}catch{}}async function nO(e,t,n){if(t.length===0){e.info("No afk-managed worktrees found.");return}let r=process.pid;e.line(),e.line(m.bold("Worktrees")),e.line(m.dim(" "+"PATH".padEnd(45)+" "+"OWNER".padEnd(12)+" "+"AGE".padEnd(5)+" "+"VERDICT".padEnd(22)+" PRUNE?"));for(let o of t){let a=n.get(o.path)===r?m.brand("\u2192 "):" ",l=o.path.slice(-44).padEnd(45),c=o.owner.padEnd(12),d=Z0(o.ageMs).padEnd(5),u=o.verdict.padEnd(22),p=ba.has(o.verdict)?m.error("yes"):o.verdict==="stale-dirty"?m.warning("warn"):m.dim("no"),f=eO(o.verdict,u);e.line(`${a}${l} ${c} ${d} ${f} ${p}`)}e.line(),e.line(m.dim(" \u2192 this session")),e.line()}async function rO(e){let t=new Map;for(let n of e)t.set(n.path,await tO(n.path));return t}async function oO(e,t){let n=tk(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await ek()}catch(i){return e.out.error(`Not in a git repository: ${i.message}`),"continue"}let o;try{let i={execFile:Rd,repoRoot:r,dryRun:!0,scope:n.scope};o=await _t(i)}catch(i){return e.out.error(`Sweep failed: ${i.message}`),"continue"}let s=await rO(o.candidates);await nO(e.out,o.candidates,s);for(let i of o.warnings)e.out.warn(i);return"continue"}async function sO(e,t){let n=tk(t,"interactive");n.unknown.length>0&&e.out.warn(`Unknown args ignored: ${n.unknown.join(" ")}`);let r;try{r=await ek()}catch(a){return e.out.error(`Not in a git repository: ${a.message}`),"continue"}let o;try{let a={execFile:Rd,repoRoot:r,dryRun:!n.apply,scope:n.scope};o=await _t(a)}catch(a){return e.out.error(`Sweep failed: ${a.message}`),"continue"}let s={};for(let a of o.candidates)s[a.verdict]=(s[a.verdict]??0)+1;let i=Object.entries(s).sort(([a],[l])=>a.localeCompare(l)).map(([a,l])=>`${a}=${l}`);if(o.dryRun){let a=o.candidates.filter(l=>ba.has(l.verdict)).length;e.out.line(),e.out.line(m.warning("\u{1F50D} Dry-run \u2014 pass --apply to actually remove.")+` Would prune ${a} worktree(s).`+(i.length>0?` [${i.join(" ")}]`:""))}else{let a=o.warnings.filter(c=>c.startsWith("[WARN]")).length,l=o.warnings.filter(c=>c.startsWith("[ERROR]")).length;e.out.line(),e.out.success(`Removed ${o.removed.length}, warned ${a}, errors ${l}`+(i.length>0?` [${i.join(" ")}]`:""))}for(let a of o.candidates){let c=o.removed.includes(a.path)?m.error("\u2717"):ba.has(a.verdict)?m.warning("\u2022"):m.dim("\xB7");e.out.line(` ${c} [${a.verdict.padEnd(22)}] ${a.path}`)}for(let a of o.warnings)a.startsWith("[ERROR]")?e.out.error(a):e.out.warn(a);return e.out.line(),"continue"}var nk={name:"/worktree",summary:"List or prune afk-managed git worktrees",usage:"/worktree list | /worktree prune [--apply] [--scope <interactive|diagnose|all>]",async handler(e,t){let n=t.trim();return n.length===0||n.startsWith("list")?oO(e,n.replace(/^list\s*/,"")):n.startsWith("prune")?sO(e,n.replace(/^prune\s*/,"")):(e.out.error(`Unknown /worktree subcommand. Usage:
2037
2039
  /worktree list
2038
2040
  /worktree prune [--apply] [--scope <interactive|diagnose|all>]`),"continue")}};var rk={name:"/reauth",summary:"Re-read keychain credentials and swap the running session's client",usage:"/reauth [--check]",hint:"Force the running session to pick up a new keychain token (e.g. after `claude /login` in another terminal)",async handler(e,t){if(t.trim()==="--check"){let s=De();if(!s)return e.out.warn("No OAuth token found. Run `claude login` in a terminal to authenticate."),"continue";let i=Qt(s);return e.out.success(`Active keychain account: ${i}`),e.out.info("Note: --check only inspects the keychain. The running SDK client may still hold an older token \u2014 run `/reauth` (no args) to actually swap."),"continue"}let r=De();if(r){let s=Qt(r);e.out.info(`Current keychain account: ${s}`)}e.out.info("Rebuilding session client from keychain credentials\u2026");let o;try{o=await e.session.current.reauth()}catch(s){return e.out.error(`Client refresh failed: ${s instanceof Error?s.message:String(s)}`),e.out.warn("Run `claude login` in a terminal to re-authenticate."),"continue"}return o?(o.swapped?(e.out.success(`\u2713 Client swapped. Session now authenticated as: ${o.accountId}`),e.out.info("Next turn will use the new credential. If a usage-limit pause is active, it will resume automatically within ~30s (or send a message to retry immediately).")):e.out.success(`\u2713 Client refreshed. Authenticated as: ${o.accountId} (token unchanged)`),"continue"):(De()?e.out.warn("This session is not using OAuth (probably api-key mode) \u2014 nothing to refresh. The active credential is whatever ANTHROPIC_API_KEY held at session start."):e.out.warn("No OAuth credentials found in the keychain. Run `claude login` in a terminal to authenticate."),"continue")}};import{readdirSync as lO,readFileSync as cO,statSync as sk}from"fs";import{join as dO}from"path";F();var _d=[],iO={name:"/agents",summary:"List plugin-provided subagents (loads after session init)",async handler(e){return e.out.line(),e.out.line(m.dim(" Plugin agents are still loading \u2014 try again after the session is ready.")),e.out.line(),"continue"}};function aO(e){return{name:"/agents",summary:"List Task-tool subagents loaded by the SDK (plugin + user + project)",async handler(t){if(t.out.line(),e.length===0)return t.out.line(m.dim(" No plugin agents loaded. Agents come from `agents:` entries in plugin.json or from ~/.afk/agents/.")),t.out.line(),"continue";t.out.line(m.bold("Plugin agents")+m.dim(` (${e.length} loaded)`)),t.out.line(m.dim("\u2500".repeat(60)));let n=e.reduce((r,o)=>Math.max(r,o.name.length),0)+2;for(let r of e){let o=m.warning(r.name.padEnd(n)),s=r.model?m.dim(`[${r.model}]`):"",i=r.description?m.dim(` ${r.description}`):"";t.out.line(` ${o} ${s}${i}`)}return t.out.line(),t.out.line(m.dim(" Agents are dispatched by the model via the Task tool \u2014 not user-invoked.")),t.out.line(),"continue"}}}async function Cd(e){let t;try{t=await e.supportedAgents()}catch(n){return console.error(m.dim(" \u26A0 Plugin-agent discovery failed: ")+(n instanceof Error?n.message:String(n))),null}return _d=t.map(n=>{let r={name:n.name,description:n.description};return n.model&&(r.model=n.model),r}),gn(aO(_d)),_d.length}function ok(){de(iO)}function ka(e,t,n,r){let o=ra(e.name,t),s=e.context==="fork"?" This skill runs with context: 'fork' \u2014 the executor will fork a subagent.":"",i=`Use the \`skill\` tool with {"name": "${e.name}", "arguments": "${t}"} to dispatch this skill.${s}`,a=[];n&&n.trim().length>0&&a.push({type:"text",text:n}),a.push({type:"text",text:o}),a.push({type:"text",text:i});for(let l of r??[])a.push({type:"image",source:{type:"base64",media_type:l.mediaType,data:l.bytes.toString("base64")}});return a}var uO=new Set(["/exit","/quit","/clear","/compact","/help"]),wa={discovered:[],collisions:[],shadowedBareNames:new Set};function Hr(e){return e.includes(":")?e.split(":").pop():e}function lk(e){let t=e??Pt(),n=new Map;try{sk(t)}catch{return n}let r=(o,s)=>{if(s>8)return;let i;try{i=lO(o)}catch{return}for(let a of i){let l=dO(o,a),c;try{c=sk(l)}catch{continue}if(c.isDirectory()){r(l,s+1);continue}if(a!=="SKILL.md"||!c.isFile())continue;let d;try{d=cO(l,"utf-8")}catch{continue}let u=l.split("/"),p=u[u.length-2];if(!p)continue;let f=Fo(d),g=f.frontmatterFlags&&f.frontmatterFlags.length>0?f.frontmatterFlags:_c(f.body);if(g.length===0)continue;let h=n.get(p)??[],b=new Set([...h,...g]);n.set(p,Array.from(b).sort())}};return r(t,0),n}function pO(e){if(!e)return;let t=e.split(/(?<=[.!?])\s+/);for(let n of t){let r=/^(Use(?:d)? when\b.*|When\s+(?:the\s+user\s+|to\s+)?\b.*)$/i.exec(n.trim());if(r&&r[1]){let o=r[1].trim();if(o.length>=12)return o}}}function ik(e,t){let n=`/${e.name}`,r=e.argumentHint?`${n} ${e.argumentHint}`:void 0,o=pO(e.description);return{name:n,summary:e.description,...r!==void 0?{usage:r}:{},...o?{hint:o}:{},...t&&t.length>0?{flags:t}:{},async handler(s,i){let a={name:e.name,description:e.description,handler:async()=>{},context:"inline"},l=jr(s,{skillName:e.name,onCancel:()=>{s.session.current.interrupt().catch(()=>{})}});try{await l.arm();let c=ka(a,i);await en(l.sink,async()=>{for await(let d of s.session.current.sendMessageStream(c))l.sink(d)})}catch(c){s.out.line(),s.out.error(`${e.name} failed: ${c instanceof Error?c.message:String(c)}`)}finally{await l.dispose()}return"continue"}}}function mO(e){let t=new Map,n=o=>{let s=Hr(o.slashName.replace(/^\//,"")),i=t.get(s);i?i.alts.push(o):t.set(s,{main:o,alts:[]})};for(let o of mt()){let s=Ce(o),i=`/${o}`,a=s.argumentHint?`${i} ${s.argumentHint}`:i,l={slashName:i,display:a,description:s.description};s.origin==="user"&&(l.sourceLabel="user"),n(l)}let r=new Map(wa.collisions.map(o=>[o.bare,o.altSlash]));for(let o of e){let s=Hr(o.name),a=r.get(s)??`/${o.name}`,l=o.argumentHint?`${a} ${o.argumentHint}`:a;n({slashName:a,display:l,description:o.description,sourceLabel:"plugin"})}return t}function ak(e,t=80){let n=e.indexOf(". "),r=n>=0?e.slice(0,n+1):e,o=r.length<=t?r:e;return o.length<=t?o:o.slice(0,t-1)+"\u2026"}function fO(e,t,n){let r=t.main,o=m.warning(r.display.padEnd(n)),s=r.sourceLabel?m.dim(`(${r.sourceLabel}) `):"";e.out.line(` ${o} ${s}${m.dim(ak(r.description))}`);for(let i of t.alts){let a=m.warning(i.display.padEnd(Math.max(0,n-4))),l=i.sourceLabel?m.dim(`(${i.sourceLabel} alt) `):m.dim("(alt) ");e.out.line(` ${m.dim("\u2514")} ${a} ${l}${m.dim(ak(i.description))}`)}}function ck(e,t){let n=mO(t),r=Array.from(n.values()).reduce((i,a)=>i+1+a.alts.length,0);if(e.out.line(),n.size===0){e.out.line(m.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}e.out.line(m.bold("Skills")+m.dim(` (${r} loaded)`)),e.out.line(be());let o=Array.from(n.keys()).sort(),s=o.reduce((i,a)=>{let l=n.get(a);return Math.max(i,l.main.display.length)},0)+2;for(let i of o)fO(e,n.get(i),s);e.out.line(),e.out.line(m.dim(" Tip: /skills <name> for full details on a skill.")),e.out.line(m.dim(" Source: vendored (no badge), (user), (plugin). Shadowed entries listed under their winner.")),e.out.line()}function gO(e){try{return Ce(e)}catch{return}}function dk(e,t,n){let r=t.replace(/^\//,"").trim(),o=gO(r),s=n.find(g=>Hr(g.name)===r||g.name===r);if(!o&&!s){e.out.line(),e.out.line(m.dim(` No skill found matching "${r}".`)),e.out.line();return}let i=o?.name??Hr(s.name),a=o?.description??s.description,l=o?.argumentHint??s?.argumentHint,c=l?`/${i} ${l}`:`/${i}`,d=o?o.origin??"builtin":"plugin";e.out.line(),e.out.line(` ${m.warning(c)}`),e.out.line(),e.out.line(` ${a}`),o?.whenToUse&&(e.out.line(),e.out.line(` ${m.bold("When to use:")}`),e.out.line(` ${m.dim(o.whenToUse)}`));let u=o?.flags,p=lk().get(r),f=u??p;f&&f.length>0&&(e.out.line(),e.out.line(` ${m.bold("Flags:")} ${m.dim(f.join(", "))}`)),e.out.line(),e.out.line(` ${m.bold("Source:")} ${m.dim(d)}`),e.out.line()}var hO={name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",usage:"/skills [name]",hint:"When you want to browse every skill the session can dispatch \u2014 pass a name for full details on one.",async handler(e,t){return t.trim()?dk(e,t.trim(),[]):ck(e,[]),"continue"}};function yO(e){return{name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",usage:"/skills [name]",hint:"When you want to browse every skill the session can dispatch \u2014 pass a name for full details on one.",async handler(t,n){return n.trim()?dk(t,n.trim(),e):ck(t,e),"continue"}}}async function uk(e){let t;try{t=await e.supportedCommands()}catch(a){return console.error(m.dim(" \u26A0 Plugin-skill discovery failed: ")+(a instanceof Error?a.message:String(a))),null}let n=t.map(a=>({name:a.name,description:a.description,...a.argumentHint?{argumentHint:a.argumentHint}:{}})),r=lk(),o=new Set(mt().map(Hr)),s=[],i=new Set;for(let a of n){let l=`/${a.name}`;if(uO.has(l))continue;let c=Hr(a.name),d=r.get(c);if(o.has(c)){let u=a.name.includes(":")?a.name:`plugin:${a.name}`,p={...a,name:u};gn(ik(p,d)),s.push({bare:c,altSlash:`/${u}`,altDescription:a.description}),i.add(c);continue}gn(ik(a,d))}return wa={discovered:n,collisions:s,shadowedBareNames:i},gn(yO(n)),n.length}function pk(){return wa.collisions.length===0?[]:wa.collisions.map(e=>m.dim(` /${e.bare}: vendored or user skill wins; plugin form ${e.altSlash} stays reachable.`))}async function Sa(e){let[t,n]=await Promise.all([uk(e),Cd(e)]);return{skillCount:t,agentCount:n}}var bO={name:"/reload-plugins",summary:"Reload plugin skills from disk and refresh the slash registry",async handler(e){e.out.line(),e.out.info("Reloading plugins\u2026"),Ot();try{let r=e.session.current.getQuery();typeof r.reloadPlugins=="function"&&await r.reloadPlugins()}catch(r){e.out.warn(`Plugin reload failed: ${r instanceof Error?r.message:String(r)}`)}let[t,n]=await Promise.all([uk(e.session.current),Cd(e.session.current)]);if(t===null&&n===null)e.out.error("Could not refresh plugin skills or agents.");else{let r=[];t!==null&&r.push(`${t} skill${t===1?"":"s"}`),n!==null&&r.push(`${n} agent${n===1?"":"s"}`),e.out.success(`Reloaded ${r.join(" + ")}.`)}return e.out.line(),"continue"}};function mk(){de(hO),de(bO)}F();var va=new Map,fk=new Set;function gk(){for(let e of va.keys())fk.add(e)}function Id(e,t,n={}){if(!n.force&&fk.has(e)){process.stderr.write(`[afk preflight] \u26A0 Rejected attempt to overwrite first-party preflight "${e}". Use { force: true } in tests if this is intentional.
2039
- `);return}va.set(e,t)}function Pd(e){return va.get(e)}async function Qo(e,t,n){let r=va.get(e.skillName);if(!r)return null;try{return await r(e,t)}catch(o){return n&&n(o),null}}H();import{execFile as kO}from"child_process";import{promisify as wO}from"util";import{writeFileSync as SO}from"fs";import{join as vO}from"path";var TO=wO(kO),EO=4*1024*1024,Md=!1;function xO(e){let t=e.trim();if(!t)return null;if(/^#?\d+$/.test(t)){let r=t.replace(/^#/,""),o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number: ${r}. Must be 1\u2013999999.`);return r}let n=t.match(/github\.com\/[^/]+\/[^/]+\/pull\/(\d+)/);if(n&&n[1]){let r=n[1],o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number in URL: ${r}. Must be 1\u2013999999.`);return r}return null}async function AO(e,t,n){try{let{stdout:r}=await TO(e,t,{encoding:"utf-8",...n?.cwd?{cwd:n.cwd}:{},maxBuffer:n?.maxBuffer??EO,timeout:8e3});return r}catch(r){if(E.AFK_DEBUG==="1"&&r instanceof Error&&"stderr"in r){let s=String(r.stderr??"").replace(/\x1b\[[0-9;]*m/g,"").slice(0,200).trim();s&&process.stderr.write(`[afk preflight] ${e} stderr: ${s}
2041
+ `);return}va.set(e,t)}function Pd(e){return va.get(e)}async function Qo(e,t,n){let r=va.get(e.skillName);if(!r)return null;try{return await r(e,t)}catch(o){return n&&n(o),null}}K();import{execFile as kO}from"child_process";import{promisify as wO}from"util";import{writeFileSync as SO}from"fs";import{join as vO}from"path";var TO=wO(kO),EO=4*1024*1024,Md=!1;function xO(e){let t=e.trim();if(!t)return null;if(/^#?\d+$/.test(t)){let r=t.replace(/^#/,""),o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number: ${r}. Must be 1\u2013999999.`);return r}let n=t.match(/github\.com\/[^/]+\/[^/]+\/pull\/(\d+)/);if(n&&n[1]){let r=n[1],o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number in URL: ${r}. Must be 1\u2013999999.`);return r}return null}async function AO(e,t,n){try{let{stdout:r}=await TO(e,t,{encoding:"utf-8",...n?.cwd?{cwd:n.cwd}:{},maxBuffer:n?.maxBuffer??EO,timeout:8e3});return r}catch(r){if(E.AFK_DEBUG==="1"&&r instanceof Error&&"stderr"in r){let s=String(r.stderr??"").replace(/\x1b\[[0-9;]*m/g,"").slice(0,200).trim();s&&process.stderr.write(`[afk preflight] ${e} stderr: ${s}
2040
2042
  `)}return null}}async function RO(e,t,n={}){let r=n.exec??AO,o=n.writeFile??((f,g)=>SO(f,g,"utf-8")),[s,i,a]=await Promise.all([r("gh",["pr","view",e,"--json","title,baseRefName,headRefName,additions,deletions,changedFiles,files"],{cwd:t.cwd}),r("gh",["pr","diff",e],{cwd:t.cwd}),r("git",["status","--porcelain"],{cwd:t.cwd})]),l=null;if(s)try{l=JSON.parse(s)}catch{l=null}let c=null,d=null;if(i!==null){let f=vO(t.artifactDir,`pr-${e}.diff`);try{o(f,i),c=f,d=i.trimEnd().split(`
2041
2043
  `).length}catch{}}let u=a?a.split(`
2042
2044
  `).filter(f=>f.trim().length>0).length:0,p=u>0;return{pr:e,metadata:l,diffPath:c,diffLineCount:d,dirty:p,dirtyFiles:u}}function Ta(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/[\r\n]/g,"")}function _O(e){let t=[];if(t.push(`<preflight-context skill="review" pr="${e.pr}">`),e.metadata){let n=e.metadata;n.title&&t.push(`Title: ${Ta(n.title)}`),n.baseRefName&&n.headRefName&&t.push(`Branch: ${Ta(n.headRefName)} \u2192 ${Ta(n.baseRefName)}`);let r=[];if(n.additions!==void 0&&r.push(`+${n.additions}`),n.deletions!==void 0&&r.push(`-${n.deletions}`),n.changedFiles!==void 0&&r.push(`${n.changedFiles} file${n.changedFiles===1?"":"s"}`),r.length>0&&t.push(`Stats: ${r.join(" / ")}`),n.files&&n.files.length>0){let s=n.files.filter(i=>!!i.path);t.push("Files changed:");for(let i of s.slice(0,40)){let a=i.additions!==void 0?`+${i.additions}`:"",l=i.deletions!==void 0?`-${i.deletions}`:"",c=a||l?` (${[a,l].filter(Boolean).join("/")})`:"";t.push(` - ${Ta(i.path)}${c}`)}s.length>40&&t.push(` \u2026and ${s.length-40} more (see diff artifact)`)}}else t.push("PR metadata: UNAVAILABLE (gh pr view failed \u2014 check `gh auth status`)");return e.diffPath&&e.diffLineCount!==null?t.push(`Diff artifact: ${e.diffPath} (${e.diffLineCount} lines)`):t.push("Diff artifact: UNAVAILABLE (gh pr diff failed)"),e.dirty?(t.push(`Working tree: DIRTY (${e.dirtyFiles} uncommitted change${e.dirtyFiles===1?"":"s"})`),t.push(" \u2192 DO NOT stash, commit, reset, or otherwise mutate the working tree."),t.push(" \u2192 Review is read-only. The user is mid-work; preserve their state.")):(t.push("Working tree: clean"),t.push(" \u2192 Review is read-only. Do not stash, commit, or modify files.")),t.push("Capabilities: compose available, subagents available."),t.push("Use the diff artifact path above instead of re-running `gh pr diff`."),t.push("</preflight-context>"),t.join(`
@@ -2044,9 +2046,9 @@ ${a}`)}o.push({type:"text",text:s});let i=jr(e,{skillName:"init",out:Br(),onCanc
2044
2046
  ${e.replace(/<\/system-reminder>/gi,"")}
2045
2047
  </system-reminder>
2046
2048
 
2047
- ${t}`}var wk=!1;function Sk(){wk||(wk=!0,Id("review-pr",hk),gk())}H();function NO(e){let t=e??"builtin";switch(t){case"builtin":return"builtin";case"user":return"user";case"project":return"project";default:{let n=t;throw new Error(`[afk builtin-skills] Unhandled origin: ${String(n)}`)}}}function UO(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,acceptsAttachments:!0,...n!==void 0?{usage:n}:{},...e.whenToUse?{hint:e.whenToUse}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o,s){let i=jr(r,{skillName:e.name,onCancel:()=>{r.session.current.interrupt().catch(()=>{})}});try{await i.arm();let a={skillName:e.name,rawArgs:o,source:NO(e.origin),capabilities:{compose:!0,subagents:!0}},l=r.session.current.sessionId,c=Zo(l),d=await Qo(a,{cwd:r.stats.cwd??process.cwd(),artifactDir:c},p=>{E.AFK_SKILL_STREAM_VERBOSE==="1"&&r.out.warn(`preflight(${e.name}) failed: ${p instanceof Error?p.message:String(p)}`)}),u=ka(e,o,d?.manifestBlock,s);await en(i.sink,async()=>{for await(let p of r.session.current.sendMessageStream(u))i.sink(p)})}catch(a){r.out.line(),r.out.error(`${e.name} failed: ${a instanceof Error?a.message:String(a)}`)}finally{await i.dispose()}return"continue"}}}function vk(){Sk(),Cc(),gi(ep(),"project");for(let e of mt())gn(UO(Ce(e)))}F();import{existsSync as es,mkdirSync as w$,renameSync as S$,rmSync as v$,symlinkSync as T$,lstatSync as E$,unlinkSync as x$}from"fs";import{basename as A$,join as jd}from"path";F();import{existsSync as Tn,mkdirSync as t$,readFileSync as n$,realpathSync as Rk,renameSync as r$,rmSync as o$,symlinkSync as s$,lstatSync as i$,unlinkSync as a$}from"fs";import{basename as _k,dirname as l$,join as Yn,resolve as Ld,relative as c$}from"path";import{existsSync as Tk}from"fs";import{isAbsolute as jO,resolve as Ak}from"path";import{homedir as Ek}from"os";var BO=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|file:\/\/|git@[^:]+:)/,WO=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,HO=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/;function KO(e){return e==="~"?Ek():e.startsWith("~/")?Ak(Ek(),e.slice(2)):e}function Ea(e){if(!e.startsWith("https://"))throw new Error(`Plugin source must use https:// (got: ${e}). git://, http://, ssh://, file://, and git@ are rejected to avoid downgrade attacks and unauthenticated clones.`)}function Kr(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(GO(t)){let o=xk(t);if(!Tk(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(BO.test(t))return{type:"git",url:t};let n=HO.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=WO.exec(t);if(r&&r[1]&&r[2]){let o=r[1],s=r[2];return{type:"github",owner:o,repo:s,url:`https://github.com/${o}/${s}.git`}}if(Tk(t))return{type:"local",path:xk(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function GO(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function xk(e){let t=KO(e);return jO(t)?t:Ak(process.cwd(),t)}import{execFile as zO}from"child_process";import{promisify as qO}from"util";var JO=qO(zO),Gr=async(e,t,n)=>{try{let{stdout:r,stderr:o}=await JO("git",Array.from(e),{cwd:t,env:n,maxBuffer:20971520});return{stdout:r,stderr:o}}catch(r){throw VO(r)&&r.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):r}};function VO(e){return typeof e=="object"&&e!==null&&"code"in e}var YO=Object.freeze(["-c","core.hooksPath=/dev/null","-c","filter.process=","-c","filter.smudge=","-c","filter.clean="]);function Dd(e){return[...YO,...e]}async function xa(e,t,n={}){await(n.runner??Gr)(Dd(["clone","--",e,t]),void 0,n.env)}async function Aa(e,t={}){await(t.runner??Gr)(Dd(["fetch","--tags","--prune"]),e,t.env)}async function wn(e,t={}){let n=t.runner??Gr,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e,t.env);return r.split(`
2049
+ ${t}`}var wk=!1;function Sk(){wk||(wk=!0,Id("review-pr",hk),gk())}K();function NO(e){let t=e??"builtin";switch(t){case"builtin":return"builtin";case"user":return"user";case"project":return"project";default:{let n=t;throw new Error(`[afk builtin-skills] Unhandled origin: ${String(n)}`)}}}function UO(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,acceptsAttachments:!0,...n!==void 0?{usage:n}:{},...e.whenToUse?{hint:e.whenToUse}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o,s){let i=jr(r,{skillName:e.name,onCancel:()=>{r.session.current.interrupt().catch(()=>{})}});try{await i.arm();let a={skillName:e.name,rawArgs:o,source:NO(e.origin),capabilities:{compose:!0,subagents:!0}},l=r.session.current.sessionId,c=Zo(l),d=await Qo(a,{cwd:r.stats.cwd??process.cwd(),artifactDir:c},p=>{E.AFK_SKILL_STREAM_VERBOSE==="1"&&r.out.warn(`preflight(${e.name}) failed: ${p instanceof Error?p.message:String(p)}`)}),u=ka(e,o,d?.manifestBlock,s);await en(i.sink,async()=>{for await(let p of r.session.current.sendMessageStream(u))i.sink(p)})}catch(a){r.out.line(),r.out.error(`${e.name} failed: ${a instanceof Error?a.message:String(a)}`)}finally{await i.dispose()}return"continue"}}}function vk(){Sk(),Cc(),gi(ep(),"project");for(let e of mt())gn(UO(Ce(e)))}F();import{existsSync as es,mkdirSync as w$,renameSync as S$,rmSync as v$,symlinkSync as T$,lstatSync as E$,unlinkSync as x$}from"fs";import{basename as A$,join as jd}from"path";F();import{existsSync as Tn,mkdirSync as t$,readFileSync as n$,realpathSync as Rk,renameSync as r$,rmSync as o$,symlinkSync as s$,lstatSync as i$,unlinkSync as a$}from"fs";import{basename as _k,dirname as l$,join as Yn,resolve as Ld,relative as c$}from"path";import{existsSync as Tk}from"fs";import{isAbsolute as jO,resolve as Ak}from"path";import{homedir as Ek}from"os";var BO=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|file:\/\/|git@[^:]+:)/,WO=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,HO=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/;function KO(e){return e==="~"?Ek():e.startsWith("~/")?Ak(Ek(),e.slice(2)):e}function Ea(e){if(!e.startsWith("https://"))throw new Error(`Plugin source must use https:// (got: ${e}). git://, http://, ssh://, file://, and git@ are rejected to avoid downgrade attacks and unauthenticated clones.`)}function Kr(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(GO(t)){let o=xk(t);if(!Tk(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(BO.test(t))return{type:"git",url:t};let n=HO.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=WO.exec(t);if(r&&r[1]&&r[2]){let o=r[1],s=r[2];return{type:"github",owner:o,repo:s,url:`https://github.com/${o}/${s}.git`}}if(Tk(t))return{type:"local",path:xk(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function GO(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function xk(e){let t=KO(e);return jO(t)?t:Ak(process.cwd(),t)}import{execFile as zO}from"child_process";import{promisify as qO}from"util";var JO=qO(zO),Gr=async(e,t,n)=>{try{let{stdout:r,stderr:o}=await JO("git",Array.from(e),{cwd:t,env:n,maxBuffer:20971520});return{stdout:r,stderr:o}}catch(r){throw VO(r)&&r.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):r}};function VO(e){return typeof e=="object"&&e!==null&&"code"in e}var YO=Object.freeze(["-c","core.hooksPath=/dev/null","-c","filter.process=","-c","filter.smudge=","-c","filter.clean="]);function Dd(e){return[...YO,...e]}async function xa(e,t,n={}){await(n.runner??Gr)(Dd(["clone","--",e,t]),void 0,n.env)}async function Aa(e,t={}){await(t.runner??Gr)(Dd(["fetch","--tags","--prune"]),e,t.env)}async function wn(e,t={}){let n=t.runner??Gr,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e,t.env);return r.split(`
2048
2050
  `).map(o=>o.trim()).filter(Boolean)}async function Sn(e,t,n={}){await(n.runner??Gr)(Dd(["checkout","--detach",t]),e,n.env)}async function Ct(e,t={}){let n=t.runner??Gr,{stdout:r}=await n(["rev-parse","HEAD"],e,t.env);return r.trim()}async function It(e,t={}){let n=t.runner??Gr;try{let{stdout:r}=await n(["symbolic-ref","refs/remotes/origin/HEAD","--short"],e,t.env);return r.trim().replace(/^origin\//,"")||"main"}catch{return"main"}}var XO=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function QO(e){let t=XO.exec(e);if(!t)return null;let[,n,r,o,s]=t;return{raw:e,major:Number(n),minor:Number(r),patch:Number(o),prerelease:s??null}}function ZO(e,t){if(e===null&&t===null)return 0;if(e===null)return 1;if(t===null)return-1;let n=e.split("."),r=t.split("."),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s],a=r[s];if(i===void 0)return-1;if(a===void 0)return 1;let l=/^\d+$/.test(i),c=/^\d+$/.test(a);if(l&&c){let d=Number(i)-Number(a);if(d!==0)return d}else{if(l)return-1;if(c)return 1;if(i<a)return-1;if(i>a)return 1}}return 0}function e$(e,t){return e.major!==t.major?e.major-t.major:e.minor!==t.minor?e.minor-t.minor:e.patch!==t.patch?e.patch-t.patch:ZO(e.prerelease,t.prerelease)}function vn(e){let t=e.map(n=>QO(n.trim())).filter(n=>n!==null);return t.length===0?null:(t.sort((n,r)=>e$(r,n)),t[0]?.raw??null)}async function Ca(e,t={},n={}){let r=n.pluginsDir??_e(),o=n.indexPath??re(),s=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},a=n.confirm??!0,l=n.confirmDelayMs??3e3,c=Kr(e);if(t$(r,{recursive:!0}),c.type==="local")return d$(c,t,r,o,s);if(c.type==="marketplace-ref")throw new Error(`marketplace-ref source "${c.marketplace}:${c.plugin}" must be installed via the marketplace resolver, not installPlugin directly`);return Ea(c.url),u$(c,t,r,o,s,i,{confirm:a,confirmDelayMs:l})}function d$(e,t,n,r,o){Ck(e.path);let s=Ik(e.path),i=t.name??s??_k(e.path);jt(i);let a=Yn(n,i);Xn(a,n),Fd(a,t.force??!1),(Tn(a)||Nd(a))&&_a(a),s$(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,enabled:!0,installedAt:l,updatedAt:l,...s&&s!==i?{manifestName:s}:{}};return tn(i,c,r),Ot(),{name:i,dir:a,entry:c}}async function u$(e,t,n,r,o,s,i){let a=t.name??m$(e);jt(a);let l=Yn(n,a);Xn(l,n),Fd(l,t.force??!1),Tn(l)&&_a(l);let c=e.type==="github"?`${e.owner}/${e.repo}`:e.url;i.confirm&&await f$(e.url,i.confirmDelayMs),await xa(e.url,l,s);try{let d;if(t.ref)d=t.ref;else{let y=await wn(l,s);d=vn(y)??await It(l,s)}(t.ref||await p$(l,d,s))&&await Sn(l,d,s);let u=await Ct(l,s);Ck(l);let p=Ik(l),f=a,g=l;if(!t.name&&p&&p!==a){jt(p);let y=Yn(n,p);Xn(y,n),Fd(y,t.force??!1),Tn(y)&&_a(y),r$(l,y),f=p,g=y}let h=o().toISOString(),b={source:c,sourceType:e.type,ref:d,commit:u,enabled:!0,installedAt:h,updatedAt:h,...p&&p!==f?{manifestName:p}:{}};return tn(f,b,r),Ot(),{name:f,dir:g,entry:b}}catch(d){try{Tn(l)&&_a(l)}catch{}throw d}}async function p$(e,t,n){let r=await It(e,n);return t!==r}function m$(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):t}async function f$(e,t){let n="\u2550".repeat(70),r=o=>process.stderr.write(o+`
2049
- `);if(r(""),r(n),r(" \u26A0\uFE0F PLUGIN INSTALL WARNING \u2014 READ BEFORE CONTINUING"),r(n),r(""),r(` Source : ${e}`),r(""),r(" Installing a plugin grants ARBITRARY CODE EXECUTION to whoever controls"),r(" that git ref. The plugin's SKILL.md becomes a system prompt that runs"),r(" inside a subagent with full tool access (bash, write_file, web_scrape,"),r(" and any other tool enabled in your session)."),r(""),r(" \u25BA Audit the repository source code before proceeding."),r(" \u25BA Only install plugins from authors you trust."),r(" \u25BA Run `afk plugin install --yes <source>` to suppress this warning."),r(""),t>0){let o=Math.ceil(t/1e3);r(` Proceeding in ${o} second(s)\u2026 Press Ctrl-C to abort.`),r(""),await new Promise(s=>setTimeout(s,t))}r(n),r("")}function Ck(e){let t=Yn(e,".claude-plugin","plugin.json");if(Tn(t))return;let n=Yn(e,".claude-plugin","marketplace.json");if(Tn(n))throw new Error(`${e} contains .claude-plugin/marketplace.json instead of plugin.json. Use \`afk marketplace install <source>\` to install a marketplace, then \`afk plugin install <marketplace>:<plugin>\` to install a plugin from it.`)}function Ik(e){let t=Yn(e,".claude-plugin","plugin.json");if(!Tn(t))return null;try{let n=JSON.parse(n$(t,"utf8"));return typeof n.name=="string"&&n.name.trim()?n.name.trim():null}catch{return null}}var g$=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;function jt(e){if(!e||e.length>100||!g$.test(e))throw new Error(`Invalid plugin name "${e}": must be 1\u2013100 chars, starting with alphanumeric, containing only letters, digits, hyphens, or underscores.`)}function Xn(e,t){let n;try{n=Rk(Ld(t))}catch{n=Ld(t)}let r=Ld(e),o;try{o=Yn(Rk(l$(r)),_k(r))}catch{o=r}let s=c$(n,o);if(s.startsWith("..")||s==="")throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`);if(s.startsWith("/"))throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`)}function Fd(e,t){if(!(!Tn(e)&&!Nd(e))&&!t)throw new Error(`plugin directory already exists: ${e} (re-run with --force to replace)`)}function Nd(e){try{return i$(e).isSymbolicLink()}catch{return!1}}function _a(e){if(Nd(e)){a$(e);return}o$(e,{recursive:!0,force:!0})}import{existsSync as Mk,readFileSync as h$}from"fs";import{join as y$}from"path";var b$=".claude-plugin/marketplace.json";function Ok(e){return y$(e,b$)}function Ud(e){return Mk(Ok(e))}function Bt(e){let t=Ok(e);if(!Mk(t))throw new Error(`marketplace manifest not found: ${t}`);let n;try{n=h$(t,"utf8")}catch(o){throw new Error(`could not read marketplace manifest at ${t}: ${Pk(o)}`)}let r;try{r=JSON.parse(n)}catch(o){throw new Error(`marketplace manifest at ${t} is not valid JSON: ${Pk(o)}`)}return k$(r,t)}function $k(e){try{return Bt(e)}catch{return null}}function k$(e,t){if(!e||typeof e!="object")throw new Error(`marketplace manifest at ${t} must be a JSON object`);let n=e,r=n.name;if(typeof r!="string"||!r.trim())throw new Error(`marketplace manifest at ${t} is missing required "name" field`);let o=n.plugins;if(!Array.isArray(o))throw new Error(`marketplace manifest at ${t} is missing required "plugins" array`);let s=new Set,i=o.map((d,u)=>{if(!d||typeof d!="object")throw new Error(`marketplace manifest at ${t}: plugins[${u}] must be an object`);let p=d,f=p.name,g=p.source;if(typeof f!="string"||!f.trim())throw new Error(`marketplace manifest at ${t}: plugins[${u}] missing required "name"`);if(typeof g!="string"||!g.trim())throw new Error(`marketplace manifest at ${t}: plugins[${u}] missing required "source"`);let h=f.trim();if(s.has(h))throw new Error(`marketplace manifest at ${t}: duplicate plugin name "${h}"`);s.add(h);let b={name:h,source:g.trim()},y=p.description;return typeof y=="string"&&(b.description=y),b}),a={name:r.trim(),plugins:i},l=n.metadata;if(l&&typeof l=="object"){let d=l,u={};typeof d.description=="string"&&(u.description=d.description),Object.keys(u).length>0&&(a.metadata=u)}let c=n.owner;if(c&&typeof c=="object"){let d=c,u={};typeof d.name=="string"&&(u.name=d.name),typeof d.email=="string"&&(u.email=d.email),Object.keys(u).length>0&&(a.owner=u)}return a}function Pk(e){return e instanceof Error?e.message:String(e)}async function Pa(e,t={},n={}){let r=n.cacheDir??Pt(),o=n.indexPath??re(),s=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},a=Kr(e);if(a.type==="marketplace-ref")throw new Error(`marketplace source cannot itself be a marketplace reference ("${e}")`);return w$(r,{recursive:!0}),a.type==="local"?R$(a,t,r,o,s):_$(a,t,r,o,s,i)}function R$(e,t,n,r,o){let s=Bt(e.path),i=t.name??s.name;jt(i);let a=jd(n,i);Xn(a,n),Bd(a,t.force??!1),(es(a)||Wd(a))&&Ia(a),T$(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,installedAt:l,updatedAt:l};return bo(i,c,r),{name:i,dir:a,entry:c,plugins:s.plugins.map(Dk)}}async function _$(e,t,n,r,o,s){Ea(e.url);let i=t.name??I$(e);jt(i);let a=jd(n,i);Xn(a,n),Bd(a,t.force??!1),es(a)&&Ia(a);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await xa(e.url,a,s);try{let c;if(t.ref)c=t.ref;else{let b=await wn(a,s);c=vn(b)??await It(a,s)}(t.ref||await C$(a,c,s))&&await Sn(a,c,s);let d=await Ct(a,s),u=Bt(a),p=i,f=a;if(!t.name&&u.name!==i){jt(u.name);let b=jd(n,u.name);Xn(b,n),Bd(b,t.force??!1),es(b)&&Ia(b),S$(a,b),p=u.name,f=b}let g=o().toISOString(),h={source:l,sourceType:e.type,ref:c,commit:d,installedAt:g,updatedAt:g};return bo(p,h,r),{name:p,dir:f,entry:h,plugins:u.plugins.map(Dk)}}catch(c){try{es(a)&&Ia(a)}catch{}throw c}}async function C$(e,t,n){let r=await It(e,n);return t!==r}function I$(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):A$(t)}function Bd(e,t){if(!(!es(e)&&!Wd(e))&&!t)throw new Error(`marketplace directory already exists: ${e} (re-run with --force to replace)`)}function Wd(e){try{return E$(e).isSymbolicLink()}catch{return!1}}function Ia(e){if(Wd(e)){x$(e);return}v$(e,{recursive:!0,force:!0})}function Dk(e){return e.description?{name:e.name,description:e.description}:{name:e.name}}F();import{existsSync as P$,lstatSync as M$,rmSync as O$,unlinkSync as $$}from"fs";import{join as D$}from"path";function Ma(e,t={}){let n=t.cacheDir??Pt(),r=t.indexPath??re(),o=D$(n,e),s=!1;L$(o)?($$(o),s=!0):P$(o)&&(O$(o,{recursive:!0,force:!0}),s=!0);let i=me(r),a=Object.prototype.hasOwnProperty.call(i.marketplaces,e),l=Object.entries(i.plugins).filter(([,c])=>c.marketplace===e).map(([c])=>c);return(a||l.length>0)&&cm(e,r),{name:e,removedDir:s,removedIndexEntry:a,removedPluginEntries:l}}function L$(e){try{return M$(e).isSymbolicLink()}catch{return!1}}F();import{existsSync as F$}from"fs";import{join as N$}from"path";async function ts(e,t={},n={}){let r=n.indexPath??re(),o=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},a=me(r).marketplaces[e];if(!a)throw new Error(`marketplace "${e}" is not installed`);let l=n.cacheDir?N$(n.cacheDir,e):lo(e);if(!F$(l))return{name:e,status:"missing-dir",dir:l};if(a.sourceType==="local")return{name:e,status:"skipped-local"};let c=new Set(($k(l)?.plugins??[]).map(y=>y.name));await Aa(l,s);let d;if(t.ref)d=t.ref;else{let y=await wn(l,s);d=vn(y)??a.ref??await It(l,s)}if(d===a.ref){let y=await Ct(l,s);return{name:e,status:"up-to-date",ref:d,commit:y}}await Sn(l,d,s);let u=await Ct(l,s),p=o().toISOString(),f={...a,ref:d,commit:u,updatedAt:p};bo(e,f,r);let g=new Set(Bt(l).plugins.map(y=>y.name)),h=[...g].filter(y=>!c.has(y)),b=[...c].filter(y=>!g.has(y));return{name:e,status:"updated",fromRef:a.ref,toRef:d,commit:u,addedPlugins:h,removedPlugins:b}}async function Lk(e={}){let t=e.indexPath??re(),n=me(t),r=[];for(let o of Object.keys(n.marketplaces))try{r.push(await ts(o,{},e))}catch(s){let i=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:i})}return r}H();F();import{existsSync as Oa,statSync as U$}from"fs";import{isAbsolute as j$,join as B$,resolve as Fk}from"path";async function zr(e,t,n={},r={}){let o=r.marketplaceDirFor??lo,s=r.indexPath??re(),i=r.now??(()=>new Date),a=o(e);if(!Oa(a)||!Ud(a))throw new Error(`marketplace "${e}" is not installed (looked for manifest under ${a})`);let l=Bt(a),c=l.plugins.find(d=>d.name===t);if(!c){let d=l.plugins.map(u=>u.name).join(", ")||"(none)";throw new Error(`marketplace "${e}" does not list a plugin named "${t}". Available: ${d}`)}return W$(c.source)?H$(e,c,a,s,i,n):K$(e,c,n,r)}function $a(e,t={}){let n=t.marketplaceDirFor??lo,r=t.indexPath??re(),o=n(e);if(!Oa(o)||!Ud(o))throw new Error(`marketplace "${e}" is not installed`);let s=Bt(o),i=me(r);return s.plugins.map(a=>{let l=`${e}:${a.name}`,c=l in i.plugins||a.name in i.plugins&&i.plugins[a.name]?.marketplace===e,d={name:a.name,installed:c,key:l};return a.description&&(d.description=a.description),d})}function W$(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.startsWith("~")}function H$(e,t,n,r,o,s){let i=t.source,a=j$(i)||i.startsWith("~")?G$(i):Fk(n,i);if(!Oa(a))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path does not exist on disk`);if(!U$(a).isDirectory())throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path is not a directory`);let c=B$(a,".claude-plugin","plugin.json");if(!Oa(c))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but no .claude-plugin/plugin.json was found`);let d=`${e}:${t.name}`,u=me(r);if(!s.force&&d in u.plugins&&u.plugins[d]?.enabled)throw new Error(`plugin "${d}" is already installed (re-run with --force to overwrite)`);let p=o().toISOString(),f={source:`${e}:${t.name}`,sourceType:"marketplace",ref:null,commit:null,enabled:!0,installedAt:p,updatedAt:p,marketplace:e};return tn(d,f,r),{key:d,name:t.name,dir:a,entry:f}}async function K$(e,t,n,r){let o={name:t.name,...n.ref?{ref:n.ref}:{},...n.force?{force:!0}:{}},s=await Ca(t.source,o,r),i=r.indexPath??re(),a={...s.entry,marketplace:e};return tn(s.name,a,i),{key:s.name,name:s.name,dir:s.dir,entry:a}}function G$(e){if(e.startsWith("~")){let t=E.HOME??"";if(e==="~")return t;if(e.startsWith("~/"))return Fk(t,e.slice(2))}return e}var Nk=["add","plugins","install","remove","update"],z$={name:"/marketplaces",summary:"List installed plugin marketplaces",async handler(e){return J$(e),"continue"}},q$={name:"/marketplace",summary:"Manage plugin marketplaces (add | plugins | install | remove | update)",usage:"/marketplace <add|plugins|install|remove|update> [args]",async handler(e,t){let n=t.trim();if(!n)return V$(e),"continue";let[r,...o]=n.split(/\s+/);if(!r||!Nk.includes(r))return e.out.error(`Unknown subcommand "${r??""}". Try one of: ${Nk.join(", ")}.`),"continue";switch(r){case"add":return Y$(e,o);case"plugins":return X$(e,o);case"install":return Q$(e,o);case"remove":return Z$(e,o);case"update":return eD(e,o);default:return"continue"}}};function Uk(){de(z$),de(q$)}function J$(e){let t=me(),n=Object.entries(t.marketplaces).sort(([r],[o])=>r.localeCompare(o));if(e.out.line(),n.length===0){e.out.line(m.dim(" No marketplaces installed.")),e.out.line(m.dim(" Try: /marketplace add anthropics/claude-plugins-official")),e.out.line();return}e.out.line(m.bold("Installed marketplaces:"));for(let[r,o]of n){let s=o.ref?m.brand(o.ref):m.dim("(local)");e.out.line(` ${m.bold(r.padEnd(28))} ${s.padEnd(12)} ${m.dim(o.source)}`)}e.out.line()}function V$(e){e.out.line(),e.out.line(m.bold("/marketplace usage:")),e.out.line(` ${m.brand("/marketplace add")} <git-url|owner/repo|local-path>`),e.out.line(` ${m.brand("/marketplace plugins")} <marketplace>`),e.out.line(` ${m.brand("/marketplace install")} <marketplace> <plugin>`),e.out.line(` ${m.brand("/marketplace remove")} <marketplace>`),e.out.line(` ${m.brand("/marketplace update")} [<marketplace>]`),e.out.line()}async function Y$(e,t){if(t.length===0)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let[n,r,...o]=t;if(!n)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let s=tD(o);e.out.info(`Installing marketplace ${n}\u2026`);try{let i=await Pa(n,{...r&&!r.startsWith("-")?{name:r}:{},...s.ref?{ref:s.ref}:{},...s.force?{force:!0}:{}});e.out.success(`Installed marketplace ${i.name} (${i.plugins.length} plugin(s) available).`),e.out.line(m.dim(` Next: /marketplace plugins ${i.name}`))}catch(i){e.out.error(`Install failed: ${Da(i)}`)}return"continue"}function X$(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace plugins <marketplace>"),"continue";try{let r=$a(n);if(e.out.line(),r.length===0)return e.out.line(m.dim(` Marketplace "${n}" lists no plugins.`)),e.out.line(),"continue";e.out.line(m.bold(`Plugins in ${n}:`)),r.forEach((o,s)=>{let i=o.installed?m.brand("[\u2713]"):m.dim("[ ]"),a=o.description?m.dim(` \u2014 ${o.description}`):"";e.out.line(` ${i} ${m.bold(String(s+1).padStart(2))}. ${m.bold(o.name)}${a}`)}),e.out.line(),e.out.line(m.dim(` Install one: /marketplace install ${n} <plugin>`)),e.out.line()}catch(r){e.out.error(`List failed: ${Da(r)}`)}return"continue"}async function Q$(e,t){let n,r;if(t.length===1&&t[0]?.includes(":")){let o=t[0].split(":");o.length===2&&([n,r]=o)}else[n,r]=t;if(!n||!r)return e.out.error("Usage: /marketplace install <marketplace> <plugin>"),"continue";e.out.info(`Installing ${n}:${r}\u2026`);try{let o=await zr(n,r);e.out.success(`Installed ${o.key}.`),e.out.line(m.dim(" Run /reload-plugins to refresh this session's slash commands."))}catch(o){e.out.error(`Install failed: ${Da(o)}`)}return"continue"}function Z$(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace remove <marketplace>"),"continue";let r=Ma(n);if(!r.removedDir&&!r.removedIndexEntry&&r.removedPluginEntries.length===0)return e.out.line(m.dim(` No marketplace named "${n}" to remove.`)),"continue";let o=r.removedPluginEntries.length>0?` + ${r.removedPluginEntries.length} plugin(s)`:"";return e.out.success(`Removed marketplace ${n}${o}.`),"continue"}async function eD(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace update <marketplace>"),"continue";e.out.info(`Updating ${n}\u2026`);try{let r=await ts(n);switch(r.status){case"updated":{let o=r.addedPlugins.length>0?` +${r.addedPlugins.join(", ")}`:"",s=r.removedPlugins.length>0?` -${r.removedPlugins.join(", ")}`:"";e.out.success(`Updated ${n}: ${r.fromRef??"(none)"} \u2192 ${r.toRef}${o}${s}`);break}case"up-to-date":e.out.info(`${n} is up-to-date (${r.ref}).`);break;case"skipped-local":e.out.info(`${n} skipped (local source).`);break;case"missing-dir":e.out.warn(`${n}: marketplace dir missing (${r.dir}).`);break}}catch(r){e.out.error(`Update failed: ${Da(r)}`)}return"continue"}function tD(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];r==="-f"||r==="--force"?t.force=!0:(r==="-r"||r==="--ref")&&e[n+1]&&(t.ref=e[n+1],n+=1)}return t}function Da(e){return e instanceof Error?e.message:String(e)}Hb("shadow-verify",{glyph:"\u25C8",color:"#7B5EA7",inFlightVerb:"verifying\u2026"});function jk(){ey();for(let e of oy)de(e);for(let e of my)de(e);de(gy),de(xy),de(Ay),de(Ry),de(Oy),de(Dy);for(let e of Uy)de(e);de(Wy),de(Ky),de(Bb),de(zb),de(qb),de(Vb),de(nk),de(rk),vk(),Zh(Xb),mk(),ok(),Uk()}function Bk(e,t={}){if(!e.isTTY)return{writeLine:o=>{e.write(o+`
2051
+ `);if(r(""),r(n),r(" \u26A0\uFE0F PLUGIN INSTALL WARNING \u2014 READ BEFORE CONTINUING"),r(n),r(""),r(` Source : ${e}`),r(""),r(" Installing a plugin grants ARBITRARY CODE EXECUTION to whoever controls"),r(" that git ref. The plugin's SKILL.md becomes a system prompt that runs"),r(" inside a subagent with full tool access (bash, write_file, web_scrape,"),r(" and any other tool enabled in your session)."),r(""),r(" \u25BA Audit the repository source code before proceeding."),r(" \u25BA Only install plugins from authors you trust."),r(" \u25BA Run `afk plugin install --yes <source>` to suppress this warning."),r(""),t>0){let o=Math.ceil(t/1e3);r(` Proceeding in ${o} second(s)\u2026 Press Ctrl-C to abort.`),r(""),await new Promise(s=>setTimeout(s,t))}r(n),r("")}function Ck(e){let t=Yn(e,".claude-plugin","plugin.json");if(Tn(t))return;let n=Yn(e,".claude-plugin","marketplace.json");if(Tn(n))throw new Error(`${e} contains .claude-plugin/marketplace.json instead of plugin.json. Use \`afk marketplace install <source>\` to install a marketplace, then \`afk plugin install <marketplace>:<plugin>\` to install a plugin from it.`)}function Ik(e){let t=Yn(e,".claude-plugin","plugin.json");if(!Tn(t))return null;try{let n=JSON.parse(n$(t,"utf8"));return typeof n.name=="string"&&n.name.trim()?n.name.trim():null}catch{return null}}var g$=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;function jt(e){if(!e||e.length>100||!g$.test(e))throw new Error(`Invalid plugin name "${e}": must be 1\u2013100 chars, starting with alphanumeric, containing only letters, digits, hyphens, or underscores.`)}function Xn(e,t){let n;try{n=Rk(Ld(t))}catch{n=Ld(t)}let r=Ld(e),o;try{o=Yn(Rk(l$(r)),_k(r))}catch{o=r}let s=c$(n,o);if(s.startsWith("..")||s==="")throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`);if(s.startsWith("/"))throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`)}function Fd(e,t){if(!(!Tn(e)&&!Nd(e))&&!t)throw new Error(`plugin directory already exists: ${e} (re-run with --force to replace)`)}function Nd(e){try{return i$(e).isSymbolicLink()}catch{return!1}}function _a(e){if(Nd(e)){a$(e);return}o$(e,{recursive:!0,force:!0})}import{existsSync as Mk,readFileSync as h$}from"fs";import{join as y$}from"path";var b$=".claude-plugin/marketplace.json";function Ok(e){return y$(e,b$)}function Ud(e){return Mk(Ok(e))}function Bt(e){let t=Ok(e);if(!Mk(t))throw new Error(`marketplace manifest not found: ${t}`);let n;try{n=h$(t,"utf8")}catch(o){throw new Error(`could not read marketplace manifest at ${t}: ${Pk(o)}`)}let r;try{r=JSON.parse(n)}catch(o){throw new Error(`marketplace manifest at ${t} is not valid JSON: ${Pk(o)}`)}return k$(r,t)}function $k(e){try{return Bt(e)}catch{return null}}function k$(e,t){if(!e||typeof e!="object")throw new Error(`marketplace manifest at ${t} must be a JSON object`);let n=e,r=n.name;if(typeof r!="string"||!r.trim())throw new Error(`marketplace manifest at ${t} is missing required "name" field`);let o=n.plugins;if(!Array.isArray(o))throw new Error(`marketplace manifest at ${t} is missing required "plugins" array`);let s=new Set,i=o.map((d,u)=>{if(!d||typeof d!="object")throw new Error(`marketplace manifest at ${t}: plugins[${u}] must be an object`);let p=d,f=p.name,g=p.source;if(typeof f!="string"||!f.trim())throw new Error(`marketplace manifest at ${t}: plugins[${u}] missing required "name"`);if(typeof g!="string"||!g.trim())throw new Error(`marketplace manifest at ${t}: plugins[${u}] missing required "source"`);let h=f.trim();if(s.has(h))throw new Error(`marketplace manifest at ${t}: duplicate plugin name "${h}"`);s.add(h);let b={name:h,source:g.trim()},y=p.description;return typeof y=="string"&&(b.description=y),b}),a={name:r.trim(),plugins:i},l=n.metadata;if(l&&typeof l=="object"){let d=l,u={};typeof d.description=="string"&&(u.description=d.description),Object.keys(u).length>0&&(a.metadata=u)}let c=n.owner;if(c&&typeof c=="object"){let d=c,u={};typeof d.name=="string"&&(u.name=d.name),typeof d.email=="string"&&(u.email=d.email),Object.keys(u).length>0&&(a.owner=u)}return a}function Pk(e){return e instanceof Error?e.message:String(e)}async function Pa(e,t={},n={}){let r=n.cacheDir??Pt(),o=n.indexPath??re(),s=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},a=Kr(e);if(a.type==="marketplace-ref")throw new Error(`marketplace source cannot itself be a marketplace reference ("${e}")`);return w$(r,{recursive:!0}),a.type==="local"?R$(a,t,r,o,s):_$(a,t,r,o,s,i)}function R$(e,t,n,r,o){let s=Bt(e.path),i=t.name??s.name;jt(i);let a=jd(n,i);Xn(a,n),Bd(a,t.force??!1),(es(a)||Wd(a))&&Ia(a),T$(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,installedAt:l,updatedAt:l};return bo(i,c,r),{name:i,dir:a,entry:c,plugins:s.plugins.map(Dk)}}async function _$(e,t,n,r,o,s){Ea(e.url);let i=t.name??I$(e);jt(i);let a=jd(n,i);Xn(a,n),Bd(a,t.force??!1),es(a)&&Ia(a);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await xa(e.url,a,s);try{let c;if(t.ref)c=t.ref;else{let b=await wn(a,s);c=vn(b)??await It(a,s)}(t.ref||await C$(a,c,s))&&await Sn(a,c,s);let d=await Ct(a,s),u=Bt(a),p=i,f=a;if(!t.name&&u.name!==i){jt(u.name);let b=jd(n,u.name);Xn(b,n),Bd(b,t.force??!1),es(b)&&Ia(b),S$(a,b),p=u.name,f=b}let g=o().toISOString(),h={source:l,sourceType:e.type,ref:c,commit:d,installedAt:g,updatedAt:g};return bo(p,h,r),{name:p,dir:f,entry:h,plugins:u.plugins.map(Dk)}}catch(c){try{es(a)&&Ia(a)}catch{}throw c}}async function C$(e,t,n){let r=await It(e,n);return t!==r}function I$(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):A$(t)}function Bd(e,t){if(!(!es(e)&&!Wd(e))&&!t)throw new Error(`marketplace directory already exists: ${e} (re-run with --force to replace)`)}function Wd(e){try{return E$(e).isSymbolicLink()}catch{return!1}}function Ia(e){if(Wd(e)){x$(e);return}v$(e,{recursive:!0,force:!0})}function Dk(e){return e.description?{name:e.name,description:e.description}:{name:e.name}}F();import{existsSync as P$,lstatSync as M$,rmSync as O$,unlinkSync as $$}from"fs";import{join as D$}from"path";function Ma(e,t={}){let n=t.cacheDir??Pt(),r=t.indexPath??re(),o=D$(n,e),s=!1;L$(o)?($$(o),s=!0):P$(o)&&(O$(o,{recursive:!0,force:!0}),s=!0);let i=me(r),a=Object.prototype.hasOwnProperty.call(i.marketplaces,e),l=Object.entries(i.plugins).filter(([,c])=>c.marketplace===e).map(([c])=>c);return(a||l.length>0)&&cm(e,r),{name:e,removedDir:s,removedIndexEntry:a,removedPluginEntries:l}}function L$(e){try{return M$(e).isSymbolicLink()}catch{return!1}}F();import{existsSync as F$}from"fs";import{join as N$}from"path";async function ts(e,t={},n={}){let r=n.indexPath??re(),o=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},a=me(r).marketplaces[e];if(!a)throw new Error(`marketplace "${e}" is not installed`);let l=n.cacheDir?N$(n.cacheDir,e):lo(e);if(!F$(l))return{name:e,status:"missing-dir",dir:l};if(a.sourceType==="local")return{name:e,status:"skipped-local"};let c=new Set(($k(l)?.plugins??[]).map(y=>y.name));await Aa(l,s);let d;if(t.ref)d=t.ref;else{let y=await wn(l,s);d=vn(y)??a.ref??await It(l,s)}if(d===a.ref){let y=await Ct(l,s);return{name:e,status:"up-to-date",ref:d,commit:y}}await Sn(l,d,s);let u=await Ct(l,s),p=o().toISOString(),f={...a,ref:d,commit:u,updatedAt:p};bo(e,f,r);let g=new Set(Bt(l).plugins.map(y=>y.name)),h=[...g].filter(y=>!c.has(y)),b=[...c].filter(y=>!g.has(y));return{name:e,status:"updated",fromRef:a.ref,toRef:d,commit:u,addedPlugins:h,removedPlugins:b}}async function Lk(e={}){let t=e.indexPath??re(),n=me(t),r=[];for(let o of Object.keys(n.marketplaces))try{r.push(await ts(o,{},e))}catch(s){let i=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:i})}return r}K();F();import{existsSync as Oa,statSync as U$}from"fs";import{isAbsolute as j$,join as B$,resolve as Fk}from"path";async function zr(e,t,n={},r={}){let o=r.marketplaceDirFor??lo,s=r.indexPath??re(),i=r.now??(()=>new Date),a=o(e);if(!Oa(a)||!Ud(a))throw new Error(`marketplace "${e}" is not installed (looked for manifest under ${a})`);let l=Bt(a),c=l.plugins.find(d=>d.name===t);if(!c){let d=l.plugins.map(u=>u.name).join(", ")||"(none)";throw new Error(`marketplace "${e}" does not list a plugin named "${t}". Available: ${d}`)}return W$(c.source)?H$(e,c,a,s,i,n):K$(e,c,n,r)}function $a(e,t={}){let n=t.marketplaceDirFor??lo,r=t.indexPath??re(),o=n(e);if(!Oa(o)||!Ud(o))throw new Error(`marketplace "${e}" is not installed`);let s=Bt(o),i=me(r);return s.plugins.map(a=>{let l=`${e}:${a.name}`,c=l in i.plugins||a.name in i.plugins&&i.plugins[a.name]?.marketplace===e,d={name:a.name,installed:c,key:l};return a.description&&(d.description=a.description),d})}function W$(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.startsWith("~")}function H$(e,t,n,r,o,s){let i=t.source,a=j$(i)||i.startsWith("~")?G$(i):Fk(n,i);if(!Oa(a))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path does not exist on disk`);if(!U$(a).isDirectory())throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path is not a directory`);let c=B$(a,".claude-plugin","plugin.json");if(!Oa(c))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but no .claude-plugin/plugin.json was found`);let d=`${e}:${t.name}`,u=me(r);if(!s.force&&d in u.plugins&&u.plugins[d]?.enabled)throw new Error(`plugin "${d}" is already installed (re-run with --force to overwrite)`);let p=o().toISOString(),f={source:`${e}:${t.name}`,sourceType:"marketplace",ref:null,commit:null,enabled:!0,installedAt:p,updatedAt:p,marketplace:e};return tn(d,f,r),{key:d,name:t.name,dir:a,entry:f}}async function K$(e,t,n,r){let o={name:t.name,...n.ref?{ref:n.ref}:{},...n.force?{force:!0}:{}},s=await Ca(t.source,o,r),i=r.indexPath??re(),a={...s.entry,marketplace:e};return tn(s.name,a,i),{key:s.name,name:s.name,dir:s.dir,entry:a}}function G$(e){if(e.startsWith("~")){let t=E.HOME??"";if(e==="~")return t;if(e.startsWith("~/"))return Fk(t,e.slice(2))}return e}var Nk=["add","plugins","install","remove","update"],z$={name:"/marketplaces",summary:"List installed plugin marketplaces",async handler(e){return J$(e),"continue"}},q$={name:"/marketplace",summary:"Manage plugin marketplaces (add | plugins | install | remove | update)",usage:"/marketplace <add|plugins|install|remove|update> [args]",async handler(e,t){let n=t.trim();if(!n)return V$(e),"continue";let[r,...o]=n.split(/\s+/);if(!r||!Nk.includes(r))return e.out.error(`Unknown subcommand "${r??""}". Try one of: ${Nk.join(", ")}.`),"continue";switch(r){case"add":return Y$(e,o);case"plugins":return X$(e,o);case"install":return Q$(e,o);case"remove":return Z$(e,o);case"update":return eD(e,o);default:return"continue"}}};function Uk(){de(z$),de(q$)}function J$(e){let t=me(),n=Object.entries(t.marketplaces).sort(([r],[o])=>r.localeCompare(o));if(e.out.line(),n.length===0){e.out.line(m.dim(" No marketplaces installed.")),e.out.line(m.dim(" Try: /marketplace add anthropics/claude-plugins-official")),e.out.line();return}e.out.line(m.bold("Installed marketplaces:"));for(let[r,o]of n){let s=o.ref?m.brand(o.ref):m.dim("(local)");e.out.line(` ${m.bold(r.padEnd(28))} ${s.padEnd(12)} ${m.dim(o.source)}`)}e.out.line()}function V$(e){e.out.line(),e.out.line(m.bold("/marketplace usage:")),e.out.line(` ${m.brand("/marketplace add")} <git-url|owner/repo|local-path>`),e.out.line(` ${m.brand("/marketplace plugins")} <marketplace>`),e.out.line(` ${m.brand("/marketplace install")} <marketplace> <plugin>`),e.out.line(` ${m.brand("/marketplace remove")} <marketplace>`),e.out.line(` ${m.brand("/marketplace update")} [<marketplace>]`),e.out.line()}async function Y$(e,t){if(t.length===0)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let[n,r,...o]=t;if(!n)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let s=tD(o);e.out.info(`Installing marketplace ${n}\u2026`);try{let i=await Pa(n,{...r&&!r.startsWith("-")?{name:r}:{},...s.ref?{ref:s.ref}:{},...s.force?{force:!0}:{}});e.out.success(`Installed marketplace ${i.name} (${i.plugins.length} plugin(s) available).`),e.out.line(m.dim(` Next: /marketplace plugins ${i.name}`))}catch(i){e.out.error(`Install failed: ${Da(i)}`)}return"continue"}function X$(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace plugins <marketplace>"),"continue";try{let r=$a(n);if(e.out.line(),r.length===0)return e.out.line(m.dim(` Marketplace "${n}" lists no plugins.`)),e.out.line(),"continue";e.out.line(m.bold(`Plugins in ${n}:`)),r.forEach((o,s)=>{let i=o.installed?m.brand("[\u2713]"):m.dim("[ ]"),a=o.description?m.dim(` \u2014 ${o.description}`):"";e.out.line(` ${i} ${m.bold(String(s+1).padStart(2))}. ${m.bold(o.name)}${a}`)}),e.out.line(),e.out.line(m.dim(` Install one: /marketplace install ${n} <plugin>`)),e.out.line()}catch(r){e.out.error(`List failed: ${Da(r)}`)}return"continue"}async function Q$(e,t){let n,r;if(t.length===1&&t[0]?.includes(":")){let o=t[0].split(":");o.length===2&&([n,r]=o)}else[n,r]=t;if(!n||!r)return e.out.error("Usage: /marketplace install <marketplace> <plugin>"),"continue";e.out.info(`Installing ${n}:${r}\u2026`);try{let o=await zr(n,r);e.out.success(`Installed ${o.key}.`),e.out.line(m.dim(" Run /reload-plugins to refresh this session's slash commands."))}catch(o){e.out.error(`Install failed: ${Da(o)}`)}return"continue"}function Z$(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace remove <marketplace>"),"continue";let r=Ma(n);if(!r.removedDir&&!r.removedIndexEntry&&r.removedPluginEntries.length===0)return e.out.line(m.dim(` No marketplace named "${n}" to remove.`)),"continue";let o=r.removedPluginEntries.length>0?` + ${r.removedPluginEntries.length} plugin(s)`:"";return e.out.success(`Removed marketplace ${n}${o}.`),"continue"}async function eD(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace update <marketplace>"),"continue";e.out.info(`Updating ${n}\u2026`);try{let r=await ts(n);switch(r.status){case"updated":{let o=r.addedPlugins.length>0?` +${r.addedPlugins.join(", ")}`:"",s=r.removedPlugins.length>0?` -${r.removedPlugins.join(", ")}`:"";e.out.success(`Updated ${n}: ${r.fromRef??"(none)"} \u2192 ${r.toRef}${o}${s}`);break}case"up-to-date":e.out.info(`${n} is up-to-date (${r.ref}).`);break;case"skipped-local":e.out.info(`${n} skipped (local source).`);break;case"missing-dir":e.out.warn(`${n}: marketplace dir missing (${r.dir}).`);break}}catch(r){e.out.error(`Update failed: ${Da(r)}`)}return"continue"}function tD(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];r==="-f"||r==="--force"?t.force=!0:(r==="-r"||r==="--ref")&&e[n+1]&&(t.ref=e[n+1],n+=1)}return t}function Da(e){return e instanceof Error?e.message:String(e)}Hb("shadow-verify",{glyph:"\u25C8",color:"#7B5EA7",inFlightVerb:"verifying\u2026"});function jk(){ey();for(let e of oy)de(e);for(let e of my)de(e);de(gy),de(xy),de(Ay),de(Ry),de(Oy),de(Dy);for(let e of Uy)de(e);de(Wy),de(Ky),de(Bb),de(zb),de(qb),de(Vb),de(nk),de(rk),vk(),Zh(Xb),mk(),ok(),Uk()}function Bk(e,t={}){if(!e.isTTY)return{writeLine:o=>{e.write(o+`
2050
2052
  `)},setCompositor:()=>{}};let n=null,r=t.statusLine;return{writeLine(o){if(n?.isArmed()){n.commitAbove(o);return}r?r.withFullScrollRegion(()=>{e.write(o+`
2051
2053
  `)}):e.write(o+`
2052
2054
  `)},setCompositor(o){n=o}}}var La=class{entries=new Map;record(t){let n=this.entries.get(t.skillName);n?(n.runs+=1,n.totalDurationMs+=t.durationMs,t.claimsTotal!==void 0&&(n.totalClaims=(n.totalClaims??0)+t.claimsTotal),t.claimsConfirmed!==void 0&&(n.totalConfirmed=(n.totalConfirmed??0)+t.claimsConfirmed),t.claimsRefuted!==void 0&&(n.totalRefuted=(n.totalRefuted??0)+t.claimsRefuted),t.claimsInconclusive!==void 0&&(n.totalInconclusive=(n.totalInconclusive??0)+t.claimsInconclusive)):this.entries.set(t.skillName,{skillName:t.skillName,runs:1,totalDurationMs:t.durationMs,...t.claimsTotal!==void 0?{totalClaims:t.claimsTotal}:{},...t.claimsConfirmed!==void 0?{totalConfirmed:t.claimsConfirmed}:{},...t.claimsRefuted!==void 0?{totalRefuted:t.claimsRefuted}:{},...t.claimsInconclusive!==void 0?{totalInconclusive:t.claimsInconclusive}:{}})}summary(){return this.entries.size===0?null:new Map(this.entries)}clear(){this.entries=new Map}};var Fa=class{source;sampleEveryNTurns;cachedRatio;cachedDetail;inFlight=null;disposed=!1;generation=0;constructor(t,n={}){this.source=t,this.sampleEveryNTurns=n.sampleEveryNTurns??3}attach(t){return this.source=t,this.generation+=1,this.reset(),this}getRatio(){return this.cachedRatio}getDetail(){return this.cachedDetail}async refresh(){if(this.disposed)return;if(this.inFlight)return this.inFlight;let t=this.doFetch().finally(()=>{this.inFlight=null});return this.inFlight=t,t}async onTurn(t){this.disposed||t%this.sampleEveryNTurns===1&&await this.refresh()}reset(){this.cachedRatio=void 0,this.cachedDetail=void 0,this.inFlight=null}dispose(){this.disposed=!0}async doFetch(){let t=this.generation;try{let n=await this.source.getContextUsage();if(this.generation!==t)return;let r=nD(n.apiUsage),o=n.maxTokens??0,s=n.percentage;typeof s=="number"&&(this.cachedRatio=Math.min(1,Math.max(0,s/100)),this.cachedDetail={used:r,limit:o,percentage:s})}catch{}}};function nD(e){return e?e.input_tokens+e.output_tokens+e.cache_creation_input_tokens+e.cache_read_input_tokens:0}import rD from"@anthropic-ai/sdk";import{randomUUID as Wk}from"node:crypto";async function Na(e){let{token:t,model:n,system:r,user:o,maxTokens:s=64,signal:i,clientFactory:a}=e;if(!t)throw new Error("oneShotCompletion: token required");let l=$s(t),c=go(t,l),d=a?a(c):new rD(c),u=Wk(),p=Wk(),f=vt(l,u,p),g={};Object.keys(f).length>0&&(g.headers=f),i&&(g.signal=i);let h=await d.messages.create({model:n,max_tokens:s,system:r,messages:[{role:"user",content:o}]},Object.keys(g).length>0?g:void 0),b=[];for(let S of h.content)S.type==="text"&&b.push(S.text);let y=b.join("").trim();return y.length===0&&console.warn("oneShotCompletion: response contained no text blocks \u2014 returning empty string"),y}var oD="claude-haiku-4-5",sD=15e3,iD=1e3,aD=80,lD=200,cD=3e3,dD='Summarize what this background subagent is currently doing in \u226480 tokens. Be concrete: name specific tools used, files examined, decisions made. Avoid filler ("appears to be working on\u2026").';function uD(e){return e.replace(/\bauthorization:\s*bearer\s+\S+/gi,"Authorization: Bearer [REDACTED]").replace(/\bsk-ant-[A-Za-z0-9_-]{20,}/g,"[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,"[REDACTED]").replace(/\b(?:AKIA|ASIA|AROA|AIDA|AGPA|AIPA|ANPA|ANVA|APKA|ABIA|ACCA)[A-Z0-9]{16}\b/g,"[REDACTED]").replace(/(?<![/.\w])[A-Za-z0-9+/=_-]{32,}(?![/.\w])/g,"[REDACTED]")}var Ua=class{registry;apiKey;model;intervalMs;maxInputTokens;maxOutputTokens;maxCallsPerSession;callLLM;getTranscriptFn;summaries=new Map;jobIndexMap=new Map;jobIndexCounter=0;callsThisSession=0;lastRefreshedAt=new Map;abortController=new AbortController;tickTimer;tickIntervalMs;constructor(t){this.registry=t.registry,this.apiKey=t.apiKey,this.model=t.model??oD,this.intervalMs=t.intervalMs??sD,this.maxInputTokens=t.maxInputTokens??iD,this.maxOutputTokens=t.maxOutputTokens??aD,this.maxCallsPerSession=t.maxCallsPerSession??lD,this.tickIntervalMs=Math.max(1e3,Math.floor(this.intervalMs/10)),t.callLLM!==void 0?this.callLLM=t.callLLM:this.callLLM=(n,r)=>Na({token:this.apiKey,model:this.model,system:dD,user:n,maxTokens:this.maxOutputTokens,signal:r}),this.getTranscriptFn=t.getTranscript??(n=>this.registry.getTranscript(n)),this.registry.on("started",n=>{this.jobIndexMap.set(n.jobId,this.jobIndexCounter++)}),this.registry.on("settled",n=>{this.summaries.delete(n.jobId),this.jobIndexMap.delete(n.jobId),this.lastRefreshedAt.delete(n.jobId)})}start(){this.tickTimer===void 0&&(this.abortController=new AbortController,this.tickTimer=setInterval(()=>{this.tick()},this.tickIntervalMs))}stop(){this.tickTimer!==void 0&&(clearInterval(this.tickTimer),this.tickTimer=void 0),this.abortController.abort()}getSummary(t){return this.summaries.get(t)}async tick(){let t=Date.now(),n=this.registry.list().filter(o=>o.status==="running"),r=[];for(let o of n){let i=(this.jobIndexMap.get(o.jobId)??0)*cD%this.intervalMs,a=this.intervalMs-1e3-i,l=this.lastRefreshedAt.get(o.jobId)??0;if(!(t-l<a)){if(this.callsThisSession>=this.maxCallsPerSession){W(`[BackgroundSummarizer] budget cap (${this.callsThisSession}/${this.maxCallsPerSession}) \u2014 skipping ${o.jobId}`);continue}this.callsThisSession++,r.push(o.jobId)}}await Promise.allSettled(r.map(o=>this.refreshJob(o,t)))}async refreshJob(t,n){let r=!1;try{let o=this.getTranscriptFn(t);if(o===void 0||o.trim().length===0)return;let s=this.maxInputTokens*4,i=o.length>s?o.slice(-s):o,l=`Transcript tail:
@@ -2057,7 +2059,7 @@ ${uD(i)}
2057
2059
  `),this.client=a,this.connected=!0,this.pendingAuthTransport=void 0;let l=await Wa(this.client.listTools(),s,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${s}ms`),()=>a.close().catch(()=>{})),c=this.client.getServerVersion();return{tools:l.tools,serverInfo:c?{name:c.name,version:c.version}:void 0}}async listTools(){if(!this.client)throw new Error(`McpClient(${this.serverName}): not connected`);let t=this.config.timeout??Kd;return(await Wa(this.client.listTools(),t,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${t}ms`))).tools}async refreshTools(){return this.listTools()}async callTool(t,n,r){if(!this.client)return{content:`MCP server "${this.serverName}" is not connected`,isError:!0};if(r.aborted)return{content:"Tool call aborted",isError:!0};let o=this.config.timeout??Kd,s;try{s=await this.client.callTool({name:t,arguments:n??{}},bD,{signal:r,timeout:o})}catch(i){let a=i instanceof Error?i.message:String(i);return{content:`MCP tool "${this.serverName}.${t}" failed: ${a}`,isError:!0}}return kD(s)}async finishAuth(t){if(!this.pendingAuthTransport)throw new Error(`McpClient(${this.serverName}): no pending OAuth transport \u2014 server is not in oauth_pending state`);await this.pendingAuthTransport.finishAuth(t)}async disconnect(){if(this.pendingAuthTransport=void 0,!this.client)return;let t=this.client;this.client=void 0,this.connected=!1;try{await t.close()}catch{}}};function kD(e){let t=[];for(let r of e.content??[])if(r.type==="text")t.push(r.text);else if(r.type==="image")t.push(`[image block: mimeType=${r.mimeType}, ${r.data.length} bytes base64]`);else if(r.type==="resource"){let o="resource"in r&&typeof r.resource=="object"?r.resource.uri??"(unknown)":"(unknown)";t.push(`[resource block: ${o}]`)}else t.push(`[unknown block: ${JSON.stringify(r)}]`);let n=t.join(`
2058
2060
  `);return{content:n.length===0?"(empty tool result)":n,...e.isError?{isError:!0}:{}}}function wD(e,t,n){let r=t.type??(t.command?"stdio":"streamable-http");return{primary:Ba(e,t,n),fallback:r==="streamable-http"?()=>Ba(e,{...t,type:"sse"},n):null}}function SD(e){return e instanceof qk&&(e.code===404||e.code===405)}function vD(e){return e instanceof qk?e.code:void 0}function Wa(e,t,n,r){let o=null,s=new Promise((i,a)=>{o=setTimeout(()=>{if(r!==void 0)try{let l=r();l&&typeof l.then=="function"&&l.catch(()=>{})}catch{}a(n())},t)});return Promise.race([e,s]).finally(()=>{o!==null&&clearTimeout(o)})}import{createHash as TD}from"node:crypto";var Jk="mcp__",Vk="__",zd=64,ED=6;function ns(e){if(e.length===0)return"_";let n=e.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_{2,}/g,"_");return n.length===0?"_":n}function xD(e){return TD("sha256").update(e).digest("hex").slice(0,ED)}function Yk(e,t){let n=ns(e),r=ns(t),o=`${Jk}${n}${Vk}${r}`;if(o.length<=zd)return o;let i=`${`${Jk}${xD(e)}${Vk}`}${r}`;return i.length<=zd?i:i.slice(0,zd)}function rs(e){let t=new Map,n=new Map;for(let{serverName:o,toolNames:s}of e)for(let i of s){let a=Yk(o,i),l={serverName:o,originalToolName:i},c=t.get(a);if(c===void 0){t.set(a,l);continue}if(c.serverName===o&&c.originalToolName===i)continue;let d=n.get(a)??[c];d.push(l),n.set(a,d)}let r=[];for(let[o,s]of n)r.push({wireName:o,pairs:s});return{tools:t,conflicts:r}}var os=class e{records;nameRegistry;onToolsRefreshed;constructor(t){this.records=t;let n=[];for(let[o,s]of t)s.state.status==="connected"&&n.push({serverName:o,toolNames:s.tools.map(i=>i.name)});let r=rs(n);if(r.conflicts.length>0){let o=r.conflicts.map(s=>{let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");return` ${s.wireName} \u2190 ${i}`});throw new Error(`MCP tool name conflicts (rename one of the servers in mcp.json):
2059
2061
  ${o.join(`
2060
- `)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],s={manager:void 0};for(let[c,d]of Object.entries(t)){let u=ns(c);if(u!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${u}" for wire encoding`),d.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:d,status:"disabled",toolCount:0}});continue}let f={client:void 0,tools:[],state:{serverName:c,config:d,status:"connecting",toolCount:0}};r.set(c,f);let g=new qr(c,d);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=Ha(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{s.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{try{let{tools:b,serverInfo:y}=await g.connect();f.tools=b,f.state.status="connected",f.state.toolCount=b.length,f.state.lastListedAt=Date.now();let S=y?`${y.name}@${y.version}`:"unknown";console.log(`[mcp:${c}] connected (${S}) \u2014 ${b.length} tool(s)`)}catch(b){if(b instanceof Gd){f.state.status="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let y=b instanceof Error?b.message:String(b);if(f.state.status="error",f.state.error=Ha(y,200),d.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${y}`);console.warn(`[mcp:${c}] connect failed: ${y}`)}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return s.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);if(!s||s.state.status!=="connected")continue;let i=s.tools.find(a=>a.name===o);i&&t.push(AD(n,i))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);!s||s.state.status!=="connected"||t.set(n,async(i,a)=>s.client?s.client.callTool(o,i,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[s,i]of this.nameRegistry)i.serverName===t&&this.nameRegistry.delete(s);let o=rs([{serverName:t,toolNames:r.map(s=>s.name)}]);if(o.conflicts.length>0)for(let s of o.conflicts){let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${s.wireName} \u2190 ${i}`)}for(let[s,i]of o.tools)this.nameRegistry.set(s,i);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new qr(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=Ha(i.message,200),console.warn(`[mcp:${t}] transport error: ${i.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:i,serverInfo:a}=await o.connect();r.tools=i,r.state.status="connected",r.state.toolCount=i.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${i.length} tool(s)`)}catch(i){let a=i instanceof Error?i.message:String(i);throw r.state.status="error",r.state.error=Ha(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[i,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(i);let s=rs([{serverName:t,toolNames:r.tools.map(i=>i.name)}]);for(let[i,a]of s.tools)this.nameRegistry.set(i,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let s=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${s}`)}));await Promise.all(t)}};function AD(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Ha(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}H();F();import{existsSync as as,lstatSync as RD,readFileSync as _D,readdirSync as CD}from"node:fs";import{join as is}from"node:path";function Ka(){return is(xn(),"mcp.json")}function Xk(e=process.cwd()){return is(e,".mcp.json")}var ID=5;function qd(e=_e()){if(!as(e))return[];let t=[];return Qk(e,e,0,t,new Set),t}function Qk(e,t,n,r,o){if(n>ID||o.has(t))return;o.add(t);let s=is(t,".claude-plugin","plugin.json");if(as(s)){let a=is(t,".claude-plugin","mcp.json");as(a)&&r.push(a);return}let i;try{i=CD(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=is(t,a),c;try{c=RD(l)}catch{continue}c.isDirectory()&&Qk(e,l,n+1,r,o)}}function PD(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(s=>typeof s=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let s={};for(let[i,a]of Object.entries(n.env))typeof a=="string"&&(s[i]=a);o.env=s}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let s={};for(let[i,a]of Object.entries(n.headers))typeof a=="string"&&(s[i]=a);o.headers=s}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),{ok:!0,config:o}}function ss(e){if(!as(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(_D(e,"utf-8"))}catch(i){let a=i instanceof Error?i.message:String(i);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let s={};for(let[i,a]of Object.entries(o)){let l=PD(i,a);l.ok?s[i]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:s,sources:[e],warnings:t}}function Jd(e={}){let t=[],n=[];if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?qd(a):qd();for(let c of l)t.push({path:c,loaded:ss(c)})}if(!e.skipUserGlobal){let a=Ka();t.push({path:a,loaded:ss(a)})}if(!e.skipProjectLocal&&E.AFK_ALLOW_PROJECT_MCP!=="0"){let a=Xk(e.cwd);as(a)&&(t.push({path:a,loaded:ss(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:ss(e.cliOverride)});let r=new Map,o=[...n],s=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)s.includes(l)||s.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let d=r.get(l);d&&o.push(`mcp: server "${l}" defined in ${d.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let i={};for(let[a,l]of r)i[a]=l.config;return{mcpServers:i,sources:s,warnings:o}}Ki();function Vd(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function ls(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${Vd(r)}`))}async function Zk(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(i){let a=i instanceof Error?i.message:String(i);return{ok:!1,reason:`buildSession failed: ${Vd(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=Vd(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{ls(t.completionWriter,"new session close after init failure",a)});let i=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(m.warning(`\u26A0 ${i}`)),{ok:!1,reason:i}}await t.backgroundRegistry.cancelAll().catch(i=>{ls(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{ls(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(Ui(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.planMode=!1,delete t.stats.pendingPlanExit;try{t.onSwapped(e)}catch(i){ls(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await Sa(n).catch(i=>{ls(t.completionWriter,"autoRegisterPluginPassthroughs failed",i)});let s=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&s.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&s.push(Ue(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(Q(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),t.statusLine.repaint(Ho(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function ew(e){return new Ye(Ln({model:e.model,apiKey:oe(),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},provider:e.provider}))}async function nw(e,t){let n=$i(e),r=Pr(n),o=n?.stored?.model??e.model,s,i,a;s=ln(e.thinking)??gr(),i=cn(e.effort)??hr(),a=br(e.maxOutputTokens)??Lo();let l=fr()??mr(),c=Ge(),d=c.systemPromptSource,u=c.autoRouting?.interactive??!0,p=Ei(l,u),f={current:null},g=oe(),h=new q({apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),b=n?.stored?.sessionId,y=Mi(b?{sessionLabel:b}:{}),S=new Ri(y?{traceWriter:y.writer}:{});Ly(S);let x=c.bgSummaries===!0&&g?new Ua({registry:S,apiKey:g,maxCallsPerSession:c.maxSummaryCallsPerSession??200}):void 0;x?.start(),Fy(x);let w=_i(c.openaiBaseUrl!==void 0?{openaiBaseUrl:c.openaiBaseUrl}:{}),v={get sessionId(){return f.current?.sessionId},getInputStreamRef(){return f.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return f.current?.abortSignal??new AbortController().signal}},R=Ci(o,g,w,c.baseUrl,y?.writer),_=new fn({subagentManager:h,parentSession:v,defaultConfig:{apiKey:g,systemPrompt:l,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{}},defaultSubagentModel:an(o),childProviderFactory:w,childSkillExecutorFactory:R,backgroundRegistry:S}),C=new mn({parentSession:v,defaultModel:o,defaultSubagentModel:an(o),apiKey:g,childProviderFactory:w,childSkillExecutorFactory:R,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...y?.writer!==void 0?{traceWriter:y.writer}:{}}),A=new Tr({parentSession:v,defaultModel:o,defaultSubagentModel:an(o),apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},systemPrompt:l??""}),O=new Le,M;{let We=t?.cwd??process.cwd(),qe=Jd({cwd:We,...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),zu=Object.values(qe.mcpServers).filter(so=>!so.disabled).length;if(zu>0){let so=qe.sources.length===1?qe.sources[0]:`${qe.sources.length} source(s)`;console.log(m.dim(` mcp: ${zu} server(s) from ${so??Ka()}`)),M=await os.fromConfig(qe.mcpServers,{warnings:qe.warnings})}else if(qe.warnings.length>0)for(let so of qe.warnings)console.warn(`[mcp] ${so}`)}let $=pi(e.provider,{subagentExecutor:_,skillExecutor:C,composeExecutor:A,memoryStore:O,model:String(o),...c.openaiBaseUrl!==void 0?{openaiBaseUrl:c.openaiBaseUrl}:{},...M!==void 0?{mcpManager:M}:{}})??new Ne({permissions:{allowedTools:[...rn,...On,"agent","skill","compose",...M?.getMcpToolWireNames()??[]]},subagentExecutor:_,skillExecutor:C,composeExecutor:A,memoryStore:O,surface:"cli",...M!==void 0?{mcpManager:M}:{}}),N=Di(o);n?.stored&&Ui(N,n.stored,n.resumeId),N.cwd=t?.cwd??process.cwd(),y&&console.log(m.dim(` trace: ${y.tracePath}`));let j={fn:We=>console.log(We)},G=new Ni,V=Bk(process.stdout,{statusLine:G}),I=Er(We=>{j.fn(xi(We))},"cli",O,()=>N.planMode?"plan":"default").registry,L={model:o,resumeConfig:r,systemPrompt:p,systemPromptSource:d,thinking:s,effort:i,maxOutputTokens:a,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},provider:$,hookRegistry:I,traceWriter:y?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:c.autoResumeOnUsageLimit},B=ew(L);f.current=B;let ne=new La,D=Br(j),P=new Fa(B),ie={session:f,stats:N,out:D,ui:{clearScreen:()=>{G.stop(),P.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),G.start(),G.repaint(Ho(N,P))},repaintStatusLine:()=>G.repaint(Ho(N,P))},ledger:ne,...M!==void 0?{mcpManager:M}:{}},xe=We=>(ne.clear(),Zk(We,{sessionRef:f,stats:N,contextSampler:P,statusLine:G,backgroundRegistry:S,completionWriter:j,isInFlight:()=>ge.getInFlight?.()??!1,onSwapped:qe=>{ge.resumeTarget=qe,ge.clearVerdictLedger?.()},buildSession:qe=>ew({...L,model:qe.stored?.model??L.model,resumeConfig:Pr(qe)})})),ge={session:f,memoryStore:O,stats:N,statusLine:G,contextSampler:P,completionWriter:j,replRenderer:V,slashCtx:ie,rl:null,options:e,...n!==void 0?{resumeTarget:n}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:S,...x!==void 0?{bgSummarizer:x}:{},requestResume:xe,getInFlight:()=>!1,...M!==void 0?{mcpManager:M}:{}},Pe=We=>{j.fn(Gb(We,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},oo=We=>{j.fn(Kb(We,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),ne.record(We)};Sh(Pe),kh(oo),ge.teardownTrustedSkillEvents=()=>{vh(Pe),wh(oo)},jk(),$ instanceof Ne&&Jb($);let ws=tw.createInterface({input:process.stdin,output:process.stdout,terminal:!1});return ge.rl=ws,ie.requestResume=xe,ge}H();import{promises as cs}from"node:fs";import*as ow from"node:os";import*as Ga from"node:path";async function rw(e,t,n=!1){await cs.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=Ga.join(e,`${r}.md`),s=n?" (continued)":"";return await cs.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
2062
+ `)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],s={manager:void 0};for(let[c,d]of Object.entries(t)){let u=ns(c);if(u!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${u}" for wire encoding`),d.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:d,status:"disabled",toolCount:0}});continue}let f={client:void 0,tools:[],state:{serverName:c,config:d,status:"connecting",toolCount:0}};r.set(c,f);let g=new qr(c,d);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=Ha(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{s.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{try{let{tools:b,serverInfo:y}=await g.connect();f.tools=b,f.state.status="connected",f.state.toolCount=b.length,f.state.lastListedAt=Date.now();let S=y?`${y.name}@${y.version}`:"unknown";console.log(`[mcp:${c}] connected (${S}) \u2014 ${b.length} tool(s)`)}catch(b){if(b instanceof Gd){f.state.status="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let y=b instanceof Error?b.message:String(b);if(f.state.status="error",f.state.error=Ha(y,200),d.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${y}`);console.warn(`[mcp:${c}] connect failed: ${y}`)}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return s.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);if(!s||s.state.status!=="connected")continue;let i=s.tools.find(a=>a.name===o);i&&t.push(AD(n,i))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);!s||s.state.status!=="connected"||t.set(n,async(i,a)=>s.client?s.client.callTool(o,i,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[s,i]of this.nameRegistry)i.serverName===t&&this.nameRegistry.delete(s);let o=rs([{serverName:t,toolNames:r.map(s=>s.name)}]);if(o.conflicts.length>0)for(let s of o.conflicts){let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${s.wireName} \u2190 ${i}`)}for(let[s,i]of o.tools)this.nameRegistry.set(s,i);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new qr(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=Ha(i.message,200),console.warn(`[mcp:${t}] transport error: ${i.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:i,serverInfo:a}=await o.connect();r.tools=i,r.state.status="connected",r.state.toolCount=i.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${i.length} tool(s)`)}catch(i){let a=i instanceof Error?i.message:String(i);throw r.state.status="error",r.state.error=Ha(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[i,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(i);let s=rs([{serverName:t,toolNames:r.tools.map(i=>i.name)}]);for(let[i,a]of s.tools)this.nameRegistry.set(i,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let s=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${s}`)}));await Promise.all(t)}};function AD(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function Ha(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}K();F();import{existsSync as as,lstatSync as RD,readFileSync as _D,readdirSync as CD}from"node:fs";import{join as is}from"node:path";function Ka(){return is(xn(),"mcp.json")}function Xk(e=process.cwd()){return is(e,".mcp.json")}var ID=5;function qd(e=_e()){if(!as(e))return[];let t=[];return Qk(e,e,0,t,new Set),t}function Qk(e,t,n,r,o){if(n>ID||o.has(t))return;o.add(t);let s=is(t,".claude-plugin","plugin.json");if(as(s)){let a=is(t,".claude-plugin","mcp.json");as(a)&&r.push(a);return}let i;try{i=CD(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=is(t,a),c;try{c=RD(l)}catch{continue}c.isDirectory()&&Qk(e,l,n+1,r,o)}}function PD(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(s=>typeof s=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let s={};for(let[i,a]of Object.entries(n.env))typeof a=="string"&&(s[i]=a);o.env=s}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let s={};for(let[i,a]of Object.entries(n.headers))typeof a=="string"&&(s[i]=a);o.headers=s}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),{ok:!0,config:o}}function ss(e){if(!as(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(_D(e,"utf-8"))}catch(i){let a=i instanceof Error?i.message:String(i);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let s={};for(let[i,a]of Object.entries(o)){let l=PD(i,a);l.ok?s[i]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:s,sources:[e],warnings:t}}function Jd(e={}){let t=[],n=[];if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?qd(a):qd();for(let c of l)t.push({path:c,loaded:ss(c)})}if(!e.skipUserGlobal){let a=Ka();t.push({path:a,loaded:ss(a)})}if(!e.skipProjectLocal&&E.AFK_ALLOW_PROJECT_MCP!=="0"){let a=Xk(e.cwd);as(a)&&(t.push({path:a,loaded:ss(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:ss(e.cliOverride)});let r=new Map,o=[...n],s=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)s.includes(l)||s.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let d=r.get(l);d&&o.push(`mcp: server "${l}" defined in ${d.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let i={};for(let[a,l]of r)i[a]=l.config;return{mcpServers:i,sources:s,warnings:o}}Ki();function Vd(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function ls(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${Vd(r)}`))}async function Zk(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(i){let a=i instanceof Error?i.message:String(i);return{ok:!1,reason:`buildSession failed: ${Vd(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=Vd(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{ls(t.completionWriter,"new session close after init failure",a)});let i=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(m.warning(`\u26A0 ${i}`)),{ok:!1,reason:i}}await t.backgroundRegistry.cancelAll().catch(i=>{ls(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{ls(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(Ui(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.planMode=!1,delete t.stats.pendingPlanExit;try{t.onSwapped(e)}catch(i){ls(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await Sa(n).catch(i=>{ls(t.completionWriter,"autoRegisterPluginPassthroughs failed",i)});let s=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&s.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&s.push(Ue(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(Q(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),t.statusLine.repaint(Ho(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function ew(e){return new Ye(Ln({model:e.model,apiKey:oe(),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},provider:e.provider}))}async function nw(e,t){let n=$i(e),r=Pr(n),o=n?.stored?.model??e.model,s,i,a;s=ln(e.thinking)??gr(),i=cn(e.effort)??hr(),a=br(e.maxOutputTokens)??Lo();let l=fr()??mr(),c=Ge(),d=c.systemPromptSource,u=c.autoRouting?.interactive??!0,p=Ei(l,u),f={current:null},g=oe(),h=new q({apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),b=n?.stored?.sessionId,y=Mi(b?{sessionLabel:b}:{}),S=new Ri(y?{traceWriter:y.writer}:{});Ly(S);let x=c.bgSummaries===!0&&g?new Ua({registry:S,apiKey:g,maxCallsPerSession:c.maxSummaryCallsPerSession??200}):void 0;x?.start(),Fy(x);let w=_i(c.openaiBaseUrl!==void 0?{openaiBaseUrl:c.openaiBaseUrl}:{}),v={get sessionId(){return f.current?.sessionId},getInputStreamRef(){return f.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return f.current?.abortSignal??new AbortController().signal}},R=Ci(o,g,w,c.baseUrl,y?.writer),_=new fn({subagentManager:h,parentSession:v,defaultConfig:{apiKey:g,systemPrompt:l,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{}},defaultSubagentModel:an(o),childProviderFactory:w,childSkillExecutorFactory:R,backgroundRegistry:S}),C=new mn({parentSession:v,defaultModel:o,defaultSubagentModel:an(o),apiKey:g,childProviderFactory:w,childSkillExecutorFactory:R,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...y?.writer!==void 0?{traceWriter:y.writer}:{}}),A=new Tr({parentSession:v,defaultModel:o,defaultSubagentModel:an(o),apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},systemPrompt:l??""}),O=new Le,M;{let We=t?.cwd??process.cwd(),qe=Jd({cwd:We,...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),zu=Object.values(qe.mcpServers).filter(so=>!so.disabled).length;if(zu>0){let so=qe.sources.length===1?qe.sources[0]:`${qe.sources.length} source(s)`;console.log(m.dim(` mcp: ${zu} server(s) from ${so??Ka()}`)),M=await os.fromConfig(qe.mcpServers,{warnings:qe.warnings})}else if(qe.warnings.length>0)for(let so of qe.warnings)console.warn(`[mcp] ${so}`)}let $=pi(e.provider,{subagentExecutor:_,skillExecutor:C,composeExecutor:A,memoryStore:O,model:String(o),...c.openaiBaseUrl!==void 0?{openaiBaseUrl:c.openaiBaseUrl}:{},...M!==void 0?{mcpManager:M}:{}})??new Ne({permissions:{allowedTools:[...rn,...On,"agent","skill","compose",...M?.getMcpToolWireNames()??[]]},subagentExecutor:_,skillExecutor:C,composeExecutor:A,memoryStore:O,surface:"cli",...M!==void 0?{mcpManager:M}:{}}),N=Di(o);n?.stored&&Ui(N,n.stored,n.resumeId),N.cwd=t?.cwd??process.cwd(),y&&console.log(m.dim(` trace: ${y.tracePath}`));let j={fn:We=>console.log(We)},z=new Ni,V=Bk(process.stdout,{statusLine:z}),I=Er(We=>{j.fn(xi(We))},"cli",O,()=>N.planMode?"plan":"default").registry,L={model:o,resumeConfig:r,systemPrompt:p,systemPromptSource:d,thinking:s,effort:i,maxOutputTokens:a,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},provider:$,hookRegistry:I,traceWriter:y?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:c.autoResumeOnUsageLimit},B=ew(L);f.current=B;let ne=new La,D=Br(j),P=new Fa(B),ie={session:f,stats:N,out:D,ui:{clearScreen:()=>{z.stop(),P.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),z.start(),z.repaint(Ho(N,P))},repaintStatusLine:()=>z.repaint(Ho(N,P))},ledger:ne,...M!==void 0?{mcpManager:M}:{}},xe=We=>(ne.clear(),Zk(We,{sessionRef:f,stats:N,contextSampler:P,statusLine:z,backgroundRegistry:S,completionWriter:j,isInFlight:()=>ge.getInFlight?.()??!1,onSwapped:qe=>{ge.resumeTarget=qe,ge.clearVerdictLedger?.()},buildSession:qe=>ew({...L,model:qe.stored?.model??L.model,resumeConfig:Pr(qe)})})),ge={session:f,memoryStore:O,stats:N,statusLine:z,contextSampler:P,completionWriter:j,replRenderer:V,slashCtx:ie,rl:null,options:e,...n!==void 0?{resumeTarget:n}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:S,...x!==void 0?{bgSummarizer:x}:{},requestResume:xe,getInFlight:()=>!1,...M!==void 0?{mcpManager:M}:{}},Pe=We=>{j.fn(Gb(We,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},oo=We=>{j.fn(Kb(We,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),ne.record(We)};Sh(Pe),kh(oo),ge.teardownTrustedSkillEvents=()=>{vh(Pe),wh(oo)},jk(),$ instanceof Ne&&Jb($);let ws=tw.createInterface({input:process.stdin,output:process.stdout,terminal:!1});return ge.rl=ws,ie.requestResume=xe,ge}K();import{promises as cs}from"node:fs";import*as ow from"node:os";import*as Ga from"node:path";async function rw(e,t,n=!1){await cs.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=Ga.join(e,`${r}.md`),s=n?" (continued)":"";return await cs.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
2061
2063
 
2062
2064
  - model: ${t}
2063
2065
 
@@ -2087,28 +2089,28 @@ _ended: ${new Date().toISOString()}_
2087
2089
  `);return}let s=[];try{let i=await lw(t,"utf8");for(let a of i.split(`
2088
2090
  `)){let l=a.trim();if(l)try{let c=JSON.parse(l);c!==null&&typeof c=="object"&&"text"in c&&typeof c.text=="string"&&s.push(c)}catch{}}}catch{}if(Qn=s.length,s.length<ds-1){let i=await Yd(t,Xd|Qd|iw|Zd,384);try{await i.writeFile(r)}finally{await i.close()}Qn++}else{let i=s.slice(-(ds-1));i.push(n);let a=i.map(c=>JSON.stringify(c)).join(`
2089
2091
  `)+`
2090
- `,l=await Yd(t,Xd|Qd|DD|Zd,384);try{await l.writeFile(a)}finally{await l.close()}Qn=ds}})}async function dw(e){if(e.initialBuffer!==void 0&&e.initialBuffer.length>0)return{text:e.initialBuffer,attachments:[]};let t=null;if(e.onSigint){let n=e.onSigint;t=()=>n(),process.on("SIGINT",t)}try{return{text:await sb({rl:e.rl,promptFn:e.promptFn}),attachments:[]}}finally{t&&process.removeListener("SIGINT",t)}}import{emitKeypressEvents as WD}from"readline";import*as tt from"ansi-escapes";import eu from"string-width";var jD="\x1B[?2004h",BD="\x1B[?2004l";function uw(e,t){let n=e.isRaw;e.setRawMode(!0),e.resume(),t.write(jD);let r=!1;return{restore(){if(!r){r=!0;try{t.write(BD)}catch{}try{e.setRawMode(n)}catch{}}}}}function qa(){let e={dropdownOpen:!1,candidates:[],selectedIndex:0,viewportStart:0,suppressedSignature:null,trigger:null,reset(){e.dropdownOpen=!1,e.candidates=[],e.selectedIndex=0,e.viewportStart=0,e.suppressedSignature=null,e.trigger=null}};return e}async function pw(e){let t=process.stdin,n=process.stdout,r=e.compositor?.isArmed()?{restore:()=>{}}:uw(t,n),o=e.statusLine?.getExtraRows()??0;WD(t);let s=e.promptFn(),i=eu(Ve(s)),a=null,l=null;try{return e.statusLine?.setExtraRows(o+1),await new Promise((c,d)=>{let u=z.seed(e.initialBuffer??""),p=e.autocompleteState??qa();p.reset();let f=0,g=!1,h=!1,b=0,y=0,S=0,T=null,x=[],w=6,v=0,R=!1,_=8,C={has:V=>je().some(I=>I.name===`/${V}`)},A=()=>{if((S>0||y>0)&&n.write(tt.cursorUp(S+y)),n.write("\r"),n.write(tt.eraseDown),x.length>0)n.write(aa(x)+`
2092
+ `,l=await Yd(t,Xd|Qd|DD|Zd,384);try{await l.writeFile(a)}finally{await l.close()}Qn=ds}})}async function dw(e){if(e.initialBuffer!==void 0&&e.initialBuffer.length>0)return{text:e.initialBuffer,attachments:[]};let t=null;if(e.onSigint){let n=e.onSigint;t=()=>n(),process.on("SIGINT",t)}try{return{text:await sb({rl:e.rl,promptFn:e.promptFn}),attachments:[]}}finally{t&&process.removeListener("SIGINT",t)}}import{emitKeypressEvents as WD}from"readline";import*as tt from"ansi-escapes";import eu from"string-width";var jD="\x1B[?2004h",BD="\x1B[?2004l";function uw(e,t){let n=e.isRaw;e.setRawMode(!0),e.resume(),t.write(jD);let r=!1;return{restore(){if(!r){r=!0;try{t.write(BD)}catch{}try{e.setRawMode(n)}catch{}}}}}function qa(){let e={dropdownOpen:!1,candidates:[],selectedIndex:0,viewportStart:0,suppressedSignature:null,trigger:null,reset(){e.dropdownOpen=!1,e.candidates=[],e.selectedIndex=0,e.viewportStart=0,e.suppressedSignature=null,e.trigger=null}};return e}async function pw(e){let t=process.stdin,n=process.stdout,r=e.compositor?.isArmed()?{restore:()=>{}}:uw(t,n),o=e.statusLine?.getExtraRows()??0;WD(t);let s=e.promptFn(),i=eu(Ve(s)),a=null,l=null;try{return e.statusLine?.setExtraRows(o+1),await new Promise((c,d)=>{let u=H.seed(e.initialBuffer??""),p=e.autocompleteState??qa();p.reset();let f=0,g=!1,h=!1,b=0,y=0,S=0,T=null,x=[],w=6,v=0,R=!1,_=8,C={has:V=>je().some(I=>I.name===`/${V}`)},A=()=>{if((S>0||y>0)&&n.write(tt.cursorUp(S+y)),n.write("\r"),n.write(tt.eraseDown),x.length>0)n.write(aa(x)+`
2091
2093
  `),S=1;else if(T!==null){let P=T;T=null,n.write(P+`
2092
2094
  `),S=1}else S=0;n.write(s+zn(u.buffer,C)),p.trigger=qo(u.buffer,u.cursor);let V=`${u.cursor}:${u.buffer}`;p.suppressedSignature!==null&&p.suppressedSignature!==V&&(p.suppressedSignature=null),p.trigger&&p.suppressedSignature===null?(p.trigger.kind==="slash"?p.candidates=sa(p.trigger.query).slice(0,12):p.trigger.kind==="file"?p.candidates=ia(p.trigger.query).slice(0,12):p.candidates=Jo(p.trigger.command,p.trigger.query),p.dropdownOpen=p.candidates.length>0):(p.dropdownOpen=!1,p.candidates=[]),p.selectedIndex>=p.candidates.length&&(p.selectedIndex=Math.max(0,p.candidates.length-1)),p.viewportStart>p.selectedIndex&&(p.viewportStart=p.selectedIndex),p.selectedIndex>=p.viewportStart+w&&(p.viewportStart=p.selectedIndex-w+1);let I=n.columns||80;if(f=0,p.dropdownOpen&&I>40){let P=Math.min(I-4,60),ie=Math.min(p.candidates.length-p.viewportStart,w);for(let Pe=0;Pe<ie;Pe++){let oo=p.viewportStart+Pe,ws=oa(p.candidates[oo],oo===p.selectedIndex,P,p.trigger?.kind);n.write(`
2093
2095
  `+ws);let We=eu(Ve(ws));f+=Math.max(1,Math.ceil(We/I))}let xe=Math.min(I-4,80),ge=nb(p.candidates[p.selectedIndex]?.hint,xe);if(ge!==null){n.write(`
2094
- `+ge);let Pe=eu(Ve(ge));f+=Math.max(1,Math.ceil(Pe/I))}}let L=pd(u.buffer,i,I),{row:B,col:ne}=hn(u.buffer,u.cursor,i,I),D=Math.max(0,L-B+f);D>0&&n.write(tt.cursorUp(D)),n.write("\r"),ne>0&&n.write(tt.cursorForward(ne)),y=L},O=!1,M=()=>{R||(R=!0,setImmediate(()=>{R&&!O&&(R=!1,A())}))};A();let $=()=>{let V=p.candidates[p.selectedIndex];if(!V)return!1;let I=u.buffer.slice(0,u.cursor),L=u.buffer.slice(u.cursor),B,ne;if(p.trigger?.kind==="slash"){let D=/\/[A-Za-z_-]*$/.exec(I);B=D?I.length-D[0].length:u.cursor,ne=V.value+(L.startsWith(" ")?"":" ")}else if(p.trigger?.kind==="flag"){let D=/--[a-z0-9-]*$/.exec(I);B=D?I.length-D[0].length:u.cursor,ne=V.value+(L.startsWith(" ")?"":" ")}else{let D=I.search(/[^\s]*$/);B=D>=0?D:u.cursor,ne=V.value}return u=z.replaceRange(u,{start:B,end:u.cursor},ne),p.dropdownOpen=!1,p.viewportStart=0,p.selectedIndex=0,A(),!0},N=()=>{(S>0||y>0)&&n.write(tt.cursorUp(S+y)),n.write("\r"),n.write(tt.eraseDown),f=0;let V=Bn({buffer:zn(u.buffer,C),promptText:s,isTTY:!!n.isTTY,attachmentSummary:Dr(x)}),I=()=>n.write(V+`
2095
- `);e.statusLine?.withFullScrollRegion?e.statusLine.withFullScrollRegion(I):I(),G(),c({text:u.buffer,attachments:[...x]}),y=0},j=V=>{y>0&&n.write(tt.cursorUp(y)),f>0&&(n.write(tt.eraseDown),f=0),n.write(`
2096
- `),G(),d(V),y=0},G=()=>{O=!0,a&&t.removeListener("keypress",a),l&&n.removeListener("resize",l),a=null,l=null};a=(V,I)=>{let L=Date.now(),B=L-v<_;v=L;let ne=I?.sequence||"";if(ne==="\x1B[200~"){g=!0,b=u.buffer.length;return}if(ne==="\x1B[201~"){g=!1,u.buffer.length===b?h||(h=!0,Gn().then(P=>{P?(T=null,x.push(P)):T="[clipboard: no image found]",M()}).catch(()=>{}).finally(()=>{h=!1})):(A(),h||(h=!0,Gn().then(P=>{P&&(T=null,x.push(P),M())}).catch(()=>{}).finally(()=>{h=!1})));return}if(I?.ctrl&&I?.name==="c"){e.onSigint?e.onSigint():j(new Error("SIGINT"));return}if(I?.ctrl&&I?.name==="d"){u.buffer.length===0&&((S>0||y>0)&&n.write(tt.cursorUp(S+y)),f>0&&(n.write(tt.eraseDown),f=0),n.write(`
2097
- `),G(),c({text:"",attachments:[...x]}),y=0);return}if(I?.ctrl&&I?.name==="v"){h||(h=!0,Gn().then(P=>{P?(T=null,x.push(P)):T="[clipboard: no image found]",M()}).catch(()=>{}).finally(()=>{h=!1}));return}if(I?.name==="escape"){p.dropdownOpen&&(p.suppressedSignature=`${u.cursor}:${u.buffer}`,p.dropdownOpen=!1,p.candidates=[],A());return}if(I?.ctrl&&I?.name==="a"){let P=z.moveLineStart(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="e"){let P=z.moveLineEnd(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="b"){let P=z.moveLeft(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="f"){let P=z.moveRight(u);P!==u&&(u=P,A());return}if(I?.meta&&I?.name==="b"){let P=z.moveWordBackward(u);P!==u&&(u=P,A());return}if(I?.meta&&I?.name==="f"){let P=z.moveWordForward(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="w"){let P=z.deleteWordBackward(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.ctrl&&I?.name==="l"){y=0,S=0,n.write("\x1B[H\x1B[2J"),A();return}if(I?.ctrl&&I?.name==="p"||I?.name==="up"){if(p.dropdownOpen){p.selectedIndex>0&&(p.selectedIndex--,p.selectedIndex<p.viewportStart&&(p.viewportStart=p.selectedIndex),A());return}let P=n.columns||80,ie=z.moveUpLine(u,P,i);if(ie.moved)u=ie.state,e.history?.resetRecall(),A();else if(e.history){let xe=e.history.back(u.buffer);xe!==null&&(u=z.seed(xe),A())}return}if(I?.ctrl&&I?.name==="n"||I?.name==="down"){if(p.dropdownOpen){p.selectedIndex<p.candidates.length-1&&(p.selectedIndex++,p.selectedIndex>=p.viewportStart+w&&(p.viewportStart=p.selectedIndex-w+1),A());return}let P=n.columns||80,ie=z.moveDownLine(u,P,i);if(ie.moved)u=ie.state,e.history?.resetRecall(),A();else if(e.history){let xe=e.history.forward();xe!==null&&(u=z.seed(xe),A())}return}if(I?.name==="left"){let P=z.moveLeft(u);P!==u&&(u=P,A());return}if(I?.name==="right"){let P=z.moveRight(u);P!==u&&(u=P,A());return}if(I?.name==="home"){let P=z.moveHome(u);P!==u&&(u=P,A());return}if(I?.name==="end"){let P=z.moveEnd(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="u"){let P=z.deleteToLineStart(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.ctrl&&I?.name==="k"){let P=z.deleteToLineEnd(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.ctrl&&I?.name==="x"){x.length>0&&(x.pop(),A());return}if(I?.name==="backspace"){if(I?.meta){let ie=z.deleteWordBackward(u);ie!==u&&(u=ie,e.history?.resetRecall(),A());return}let P=z.backspace(u);P!==u?(u=P,e.history?.resetRecall(),A()):x.length>0&&(x.pop(),A());return}if(I?.name==="delete"){if(I?.meta){let ie=z.deleteWordForward(u);ie!==u&&(u=ie,e.history?.resetRecall(),A());return}let P=z.deleteForward(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.name==="return"){let P=I?.shift===!0||ne==="\x1B[13;2u",ie=I?.meta===!0;if(P||ie){u=z.insert(u,`
2098
- `),e.history?.resetRecall(),A();return}if(g){u=z.insert(u,`
2099
- `);return}if(B){u=z.insert(u,`
2100
- `),M();return}if(p.dropdownOpen){let xe=p.trigger?.kind,ge=$();xe==="slash"&&ge&&N()}else u.buffer.endsWith("\\")?(u=z.replaceRange(u,{start:u.buffer.length-1,end:u.buffer.length},`
2101
- `),A()):N();return}if(I?.shift&&I?.name==="tab"||I?.sequence==="\x1B[Z"){e.onShiftTab?.();return}if(I?.name==="tab"){p.dropdownOpen&&$();return}let D=typeof V=="string"&&V.length===1&&V>=" "&&!I?.ctrl&&!I?.meta?V:typeof I?.sequence=="string"&&I.sequence.length===1&&I.sequence>=" "&&!I?.ctrl&&!I?.meta?I.sequence:null;D!==null&&(u=z.insert(u,D),e.history?.resetRecall(),g||(B?M():A()))},l=()=>A(),t.on("keypress",a),n.on("resize",l)})}finally{e.statusLine?.setExtraRows(o),r.restore()}}async function mw(e){return!process.stdout.isTTY||!process.stdin.isTTY?dw(e):pw(e)}var Ja=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;pendingReadReject=null;constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=qa()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY)return;let o={has:i=>je().some(a=>a.name===`/${i}`)},s=new Lr({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onBackground:()=>{this.backgroundHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:i=>zn(i,o),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{}});await s.arm(),s.setInputMode("idle"),this.compositor=s,this.armedStdout=n}async dispose(){if(this.compositor){if(this.pendingReadReject){this.compositor.setOnSubmit(null);let t=this.pendingReadReject;this.pendingReadReject=null,t(new Error("InputSurface disposed while readLine was in progress"))}try{this.compositor.disarm()}catch{}this.compositor=null,this.armedStdout=null,this.backgroundHandler=null}}getCompositor(){return this.compositor}setBackgroundHandler(t){this.backgroundHandler=t}async readLine(t){if(this.compositor&&this.compositor.isArmed()){let n=this.compositor;return new Promise((r,o)=>{this.pendingReadReject=o;let s=i=>{n.setOnSubmit(null),this.pendingReadReject=null;let a=this.armedStdout??process.stdout,l=Bn({buffer:i.text,promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:Dr([...i.attachments])});for(let c of l.split(`
2096
+ `+ge);let Pe=eu(Ve(ge));f+=Math.max(1,Math.ceil(Pe/I))}}let L=pd(u.buffer,i,I),{row:B,col:ne}=hn(u.buffer,u.cursor,i,I),D=Math.max(0,L-B+f);D>0&&n.write(tt.cursorUp(D)),n.write("\r"),ne>0&&n.write(tt.cursorForward(ne)),y=L},O=!1,M=()=>{R||(R=!0,setImmediate(()=>{R&&!O&&(R=!1,A())}))};A();let $=()=>{let V=p.candidates[p.selectedIndex];if(!V)return!1;let I=u.buffer.slice(0,u.cursor),L=u.buffer.slice(u.cursor),B,ne;if(p.trigger?.kind==="slash"){let D=/\/[A-Za-z_-]*$/.exec(I);B=D?I.length-D[0].length:u.cursor,ne=V.value+(L.startsWith(" ")?"":" ")}else if(p.trigger?.kind==="flag"){let D=/--[a-z0-9-]*$/.exec(I);B=D?I.length-D[0].length:u.cursor,ne=V.value+(L.startsWith(" ")?"":" ")}else{let D=I.search(/[^\s]*$/);B=D>=0?D:u.cursor,ne=V.value}return u=H.replaceRange(u,{start:B,end:u.cursor},ne),p.dropdownOpen=!1,p.viewportStart=0,p.selectedIndex=0,A(),!0},N=()=>{(S>0||y>0)&&n.write(tt.cursorUp(S+y)),n.write("\r"),n.write(tt.eraseDown),f=0;let V=Bn({buffer:zn(u.buffer,C),promptText:s,isTTY:!!n.isTTY,attachmentSummary:Dr(x)}),I=()=>n.write(V+`
2097
+ `);e.statusLine?.withFullScrollRegion?e.statusLine.withFullScrollRegion(I):I(),z(),c({text:u.buffer,attachments:[...x]}),y=0},j=V=>{y>0&&n.write(tt.cursorUp(y)),f>0&&(n.write(tt.eraseDown),f=0),n.write(`
2098
+ `),z(),d(V),y=0},z=()=>{O=!0,a&&t.removeListener("keypress",a),l&&n.removeListener("resize",l),a=null,l=null};a=(V,I)=>{let L=Date.now(),B=L-v<_;v=L;let ne=I?.sequence||"";if(ne==="\x1B[200~"){g=!0,b=u.buffer.length;return}if(ne==="\x1B[201~"){g=!1,u.buffer.length===b?h||(h=!0,Gn().then(P=>{P?(T=null,x.push(P)):T="[clipboard: no image found]",M()}).catch(()=>{}).finally(()=>{h=!1})):(A(),h||(h=!0,Gn().then(P=>{P&&(T=null,x.push(P),M())}).catch(()=>{}).finally(()=>{h=!1})));return}if(I?.ctrl&&I?.name==="c"){e.onSigint?e.onSigint():j(new Error("SIGINT"));return}if(I?.ctrl&&I?.name==="d"){u.buffer.length===0&&((S>0||y>0)&&n.write(tt.cursorUp(S+y)),f>0&&(n.write(tt.eraseDown),f=0),n.write(`
2099
+ `),z(),c({text:"",attachments:[...x]}),y=0);return}if(I?.ctrl&&I?.name==="v"){h||(h=!0,Gn().then(P=>{P?(T=null,x.push(P)):T="[clipboard: no image found]",M()}).catch(()=>{}).finally(()=>{h=!1}));return}if(I?.name==="escape"){p.dropdownOpen&&(p.suppressedSignature=`${u.cursor}:${u.buffer}`,p.dropdownOpen=!1,p.candidates=[],A());return}if(I?.ctrl&&I?.name==="a"){let P=H.moveLineStart(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="e"){let P=H.moveLineEnd(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="b"){let P=H.moveLeft(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="f"){let P=H.moveRight(u);P!==u&&(u=P,A());return}if(I?.meta&&I?.name==="b"){let P=H.moveWordBackward(u);P!==u&&(u=P,A());return}if(I?.meta&&I?.name==="f"){let P=H.moveWordForward(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="w"){let P=H.deleteWordBackward(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.ctrl&&I?.name==="l"){y=0,S=0,n.write("\x1B[H\x1B[2J"),A();return}if(I?.ctrl&&I?.name==="p"||I?.name==="up"){if(p.dropdownOpen){p.selectedIndex>0&&(p.selectedIndex--,p.selectedIndex<p.viewportStart&&(p.viewportStart=p.selectedIndex),A());return}let P=n.columns||80,ie=H.moveUpLine(u,P,i);if(ie.moved)u=ie.state,e.history?.resetRecall(),A();else if(e.history){let xe=e.history.back(u.buffer);xe!==null&&(u=H.seed(xe),A())}return}if(I?.ctrl&&I?.name==="n"||I?.name==="down"){if(p.dropdownOpen){p.selectedIndex<p.candidates.length-1&&(p.selectedIndex++,p.selectedIndex>=p.viewportStart+w&&(p.viewportStart=p.selectedIndex-w+1),A());return}let P=n.columns||80,ie=H.moveDownLine(u,P,i);if(ie.moved)u=ie.state,e.history?.resetRecall(),A();else if(e.history){let xe=e.history.forward();xe!==null&&(u=H.seed(xe),A())}return}if(I?.name==="left"){let P=H.moveLeft(u);P!==u&&(u=P,A());return}if(I?.name==="right"){let P=H.moveRight(u);P!==u&&(u=P,A());return}if(I?.name==="home"){let P=H.moveHome(u);P!==u&&(u=P,A());return}if(I?.name==="end"){let P=H.moveEnd(u);P!==u&&(u=P,A());return}if(I?.ctrl&&I?.name==="u"){let P=H.deleteToLineStart(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.ctrl&&I?.name==="k"){let P=H.deleteToLineEnd(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.ctrl&&I?.name==="x"){x.length>0&&(x.pop(),A());return}if(I?.name==="backspace"){if(I?.meta){let ie=H.deleteWordBackward(u);ie!==u&&(u=ie,e.history?.resetRecall(),A());return}let P=H.backspace(u);P!==u?(u=P,e.history?.resetRecall(),A()):x.length>0&&(x.pop(),A());return}if(I?.name==="delete"){if(I?.meta){let ie=H.deleteWordForward(u);ie!==u&&(u=ie,e.history?.resetRecall(),A());return}let P=H.deleteForward(u);P!==u&&(u=P,e.history?.resetRecall(),A());return}if(I?.name==="return"){let P=I?.shift===!0||ne==="\x1B[13;2u",ie=I?.meta===!0;if(P||ie){u=H.insert(u,`
2100
+ `),e.history?.resetRecall(),A();return}if(g){u=H.insert(u,`
2101
+ `);return}if(B){u=H.insert(u,`
2102
+ `),M();return}if(p.dropdownOpen){let xe=p.trigger?.kind,ge=$();xe==="slash"&&ge&&N()}else u.buffer.endsWith("\\")?(u=H.replaceRange(u,{start:u.buffer.length-1,end:u.buffer.length},`
2103
+ `),A()):N();return}if(I?.shift&&I?.name==="tab"||I?.sequence==="\x1B[Z"){e.onShiftTab?.();return}if(I?.name==="tab"){p.dropdownOpen&&$();return}let D=typeof V=="string"&&V.length===1&&V>=" "&&!I?.ctrl&&!I?.meta?V:typeof I?.sequence=="string"&&I.sequence.length===1&&I.sequence>=" "&&!I?.ctrl&&!I?.meta?I.sequence:null;D!==null&&(u=H.insert(u,D),e.history?.resetRecall(),g||(B?M():A()))},l=()=>A(),t.on("keypress",a),n.on("resize",l)})}finally{e.statusLine?.setExtraRows(o),r.restore()}}async function mw(e){return!process.stdout.isTTY||!process.stdin.isTTY?dw(e):pw(e)}var Ja=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;pendingReadReject=null;constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=qa()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY)return;let o={has:i=>je().some(a=>a.name===`/${i}`)},s=new Lr({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onBackground:()=>{this.backgroundHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:i=>zn(i,o),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{}});await s.arm(),s.setInputMode("idle"),this.compositor=s,this.armedStdout=n}async dispose(){if(this.compositor){if(this.pendingReadReject){this.compositor.setOnSubmit(null);let t=this.pendingReadReject;this.pendingReadReject=null,t(new Error("InputSurface disposed while readLine was in progress"))}try{this.compositor.disarm()}catch{}this.compositor=null,this.armedStdout=null,this.backgroundHandler=null}}getCompositor(){return this.compositor}setBackgroundHandler(t){this.backgroundHandler=t}async readLine(t){if(this.compositor&&this.compositor.isArmed()){let n=this.compositor;return new Promise((r,o)=>{this.pendingReadReject=o;let s=i=>{n.setOnSubmit(null),this.pendingReadReject=null;let a=this.armedStdout??process.stdout,l=Bn({buffer:i.text,promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:Dr([...i.attachments])});for(let c of l.split(`
2102
2104
  `))n.commitAbove(c);r({text:i.text,attachments:[...i.attachments]})};n.setOnSubmit(s),n.setInputMode("idle")})}return mw({rl:this.rl,promptFn:t.promptFn,...t.onSigint?{onSigint:t.onSigint}:{},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.compositor?{compositor:t.compositor}:{},history:this.history,autocompleteState:this.autocompleteState,...this.statusLine?{statusLine:this.statusLine}:{}})}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};function fw(e){if(!e)return null;let t=e.split(`
2103
2105
  `),n=t.slice(Math.max(0,t.length-40)),r=-1,o=null;for(let l=n.length-1;l>=0;l--){let c=n[l]??"",d=HD(c);if(d){r=l,o=d;break}}if(o===null||r<0)return null;let s=n.slice(r+1).map(l=>l.trim());for(;s.length>0&&s[0]==="";)s.shift();for(;s.length>0&&s[s.length-1]==="";)s.pop();let i=KD(s),a=s.join(`
2104
- `).trim();return{kind:o,rawBody:a,...GD(o,i)}}function HD(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function KD(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),s=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let a=t[t.length-1];a.value=`${a.value} ${r}`.trim();continue}let i=s.indexOf(":");if(i>0&&i<60){let a=s.slice(0,i).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").toLowerCase(),l=s.slice(i+1).trim();t.push({label:a,value:l})}else t.push({label:"",value:s})}return t}function GD(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let s of r)if(o.label.includes(s))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let s=n("evidence","what changed","change","artifact","output");s!==void 0&&(r.evidence=s);let i=n("pending","deferred","follow-up","followup","next");return i!==void 0&&(r.deferred=i),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let s=n("unblock","must change","to unblock","condition");s!==void 0&&(r.unblockCondition=s);let i=n("already done","what has been done","progress");return i!==void 0&&(r.alreadyDone=i),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let s=n("assumption","resolves");s!==void 0&&(r.assumption=s);let i=n("once answered","follow-up","next","will do","after");return i!==void 0&&(r.followup=i),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let s=n("state was saved","state","saved","where");s!==void 0&&(r.stateLocation=s);let i=n("resumption","resume","requires");return i!==void 0&&(r.resumeRequires=i),r}}}var zD={done:{color:m.success,chip:"\u2713 Done",affordance:"Objective satisfied \u2014 review evidence and close."},blocked:{color:m.error,chip:"\u2298 Blocked",affordance:"External dependency \u2014 unblock above to resume."},asking:{color:m.warning,chip:"? Asking",affordance:"Waiting on you \u2014 answer above to continue."},interrupted:{color:m.meta,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved \u2014 resume when ready."}};function gw(e){let t=zD[e.kind],n=Math.max(40,Math.min(te()-4,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-K(` ${t.chip} `)))+"\u256E"),s=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),i=t.color("\u2502"),a=i+" ".repeat(n+4)+i,l=qD(e),c=l.reduce((f,g)=>Math.max(f,K(g.label)),0),d=Math.max(8,n-c-2),u=[o,a];if(l.length===0){let f=e.rawBody.split(`
2106
+ `).trim();return{kind:o,rawBody:a,...GD(o,i)}}function HD(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function KD(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),s=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let a=t[t.length-1];a.value=`${a.value} ${r}`.trim();continue}let i=s.indexOf(":");if(i>0&&i<60){let a=s.slice(0,i).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").toLowerCase(),l=s.slice(i+1).trim();t.push({label:a,value:l})}else t.push({label:"",value:s})}return t}function GD(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let s of r)if(o.label.includes(s))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let s=n("evidence","what changed","change","artifact","output");s!==void 0&&(r.evidence=s);let i=n("pending","deferred","follow-up","followup","next");return i!==void 0&&(r.deferred=i),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let s=n("unblock","must change","to unblock","condition");s!==void 0&&(r.unblockCondition=s);let i=n("already done","what has been done","progress");return i!==void 0&&(r.alreadyDone=i),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let s=n("assumption","resolves");s!==void 0&&(r.assumption=s);let i=n("once answered","follow-up","next","will do","after");return i!==void 0&&(r.followup=i),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let s=n("state was saved","state","saved","where");s!==void 0&&(r.stateLocation=s);let i=n("resumption","resume","requires");return i!==void 0&&(r.resumeRequires=i),r}}}var zD={done:{color:m.success,chip:"\u2713 Done",affordance:"Objective satisfied \u2014 review evidence and close."},blocked:{color:m.error,chip:"\u2298 Blocked",affordance:"External dependency \u2014 unblock above to resume."},asking:{color:m.warning,chip:"? Asking",affordance:"Waiting on you \u2014 answer above to continue."},interrupted:{color:m.meta,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved \u2014 resume when ready."}};function gw(e){let t=zD[e.kind],n=Math.max(40,Math.min(te()-4,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-G(` ${t.chip} `)))+"\u256E"),s=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),i=t.color("\u2502"),a=i+" ".repeat(n+4)+i,l=qD(e),c=l.reduce((f,g)=>Math.max(f,G(g.label)),0),d=Math.max(8,n-c-2),u=[o,a];if(l.length===0){let f=e.rawBody.split(`
2105
2107
  `).find(b=>b.trim().length>0)?.trim()??"",g=f.length>0?f:`${e.kind} (no structured fields)`,h=pe(Vt(g),n).split(`
2106
2108
  `);for(let b of h)u.push(i+" "+Me(b,n)+" "+i)}else for(let f of l){let g=m.dim(Me(f.label,c)),h=pe(Vt(f.value),d).split(`
2107
2109
  `),b=h[0]??"";u.push(i+" "+g+" "+Me(b,d)+" "+i);for(let y of h.slice(1))u.push(i+" "+" ".repeat(c)+" "+Me(y,d)+" "+i)}u.push(a);let p=m.dim(ce(t.affordance,n));return u.push(i+" "+Me(p,n)+" "+i),u.push(s),u.join(`
2108
2110
  `)}function qD(e){let t=[],n=(r,o)=>{o&&o.trim().length>0&&t.push({label:r,value:o.trim()})};switch(e.kind){case"done":n("done",e.whatWasDone),n("evidence",e.evidence),n("deferred",e.deferred);break;case"blocked":n("blocks",e.whatBlocks),n("unblock",e.unblockCondition),n("progress",e.alreadyDone);break;case"asking":n("question",e.question),n("resolves",e.assumption),n("after",e.followup);break;case"interrupted":n("was doing",e.whatWasInProgress),n("saved at",e.stateLocation),n("resume",e.resumeRequires);break}return t}function hw(e,t,n){let r=[];n&&n.trim().length>0&&r.push({type:"text",text:n}),e&&r.push({type:"text",text:e});for(let o of t)r.push({type:"image",source:{type:"base64",media_type:o.mediaType,data:o.bytes.toString("base64")}});return r}async function yw(e,t,n,r,o="summary",s,i,a){let l=ib(e.text,e.attachments);r.setInFlight(!0);let c="",d=!1,u=!1,p=!1,f=!1,g,h=!1,b=[],y=new Map,S=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,T=r.getCompositor?r.getCompositor():null,x=new Ur({out:Br(s),thinkingMode:o,...S?{activeSkillName:S}:{},onCancel:()=>{t.interrupt().catch(v=>{He()&&console.error(" "+m.error("session.interrupt() failed:"),v)})},...i?{onBackground:()=>{h=!0}}:{},...a?.history?{history:a.history}:{},...a?.autocompleteState?{autocompleteState:a.autocompleteState}:{},...a?.promptText!==void 0?{promptText:a.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...T?{compositor:T}:{}}),w=async()=>{if(!p){p=!0;try{await x.dispose()}catch{}}};try{T?T.commitAbove(""):console.log(),await x.arm();let v=x.getCompositor();if(s&&v){let C=v;s.fn=A=>C.commitAbove(A)}r.setActiveCompositor?.(v),i&&r.setBackgroundHandler&&r.setBackgroundHandler(()=>{h=!0}),r.rearmStatus?.();let R=e.attachments.length===0?e.text:hw(e.text,e.attachments),_=t.sendMessageStream(R);if(await en(x.sink,async()=>{for await(let C of _){if(h&&i){let A=S??e.text.slice(0,40),O=i.register(A),M=Ji(O,i);Vi(_,c,l,O,i,M,n,r.onTurnComplete,t.abortSignal),await w(),(s??{fn:console.log}).fn(m.dim(` \u2192 backgrounded as ${O.id}: ${O.label}`)),r.setInFlight(!1),r.rearmStatus?.();return}if(C.type==="chunk"&&C.chunk.type==="content"?(c+=C.chunk.content,d=!0):C.type==="message"&&!d&&(c=C.message.content),C.type==="chunk"&&C.chunk.type==="tool_use_detail"){let A=C.chunk,O={toolName:A.toolName,toolUseId:A.toolUseId,input:A.toolInput};y.set(A.toolUseId,O),b.push(O)}else if(C.type==="chunk"&&C.chunk.type==="tool_result"){let A=C.chunk,O=y.get(A.toolUseId);O&&(O.result=A.content,O.isError=A.isError,y.delete(A.toolUseId))}if(C.type==="paused"){await w(),(s??{fn:console.log}).fn(Mp({reason:C.reason,...C.resetsAt!==void 0?{resetsAt:C.resetsAt}:{},...C.accountId!==void 0?{accountId:C.accountId}:{}}));continue}if(C.type==="resumed"){let A=C.hotSwapped&&C.accountId?`\u25B6 Resumed on ${C.accountId}`:"\u25B6 Resumed";(s??{fn:console.log}).fn(m.success(A));continue}if(C.type==="error"){await w(),ir(sr(C.error)),u=!0;continue}x.process(C),C.type==="done"&&(f=!0,g=C.metadata)}}),await w(),f){Un(n,l,c,g,b),r.onTurnComplete&&await r.onTurnComplete(l,c).catch(()=>{});let C=O=>{s?s.fn(O):console.log(O)};d&&C(`
2109
- `);let A=fw(c);if(A&&(C(gw(A)),C(""),r.onTerminalState))try{r.onTerminalState(A)}catch{}if(JD(g,n,C),r.onAfterTurn){let O=r.onAfterTurn();O instanceof Promise&&await O.catch(()=>{})}}}catch(v){await w(),u||ir(sr(v))}finally{await w(),s&&(s.fn=v=>console.log(v)),r.setActiveCompositor?.(null),r.setBackgroundHandler?.(null),r.setInFlight(!1),r.rearmStatus?.()}}function JD(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(se(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Ue(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(Q(o+s)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Yc(t),a=Qe(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);console.log(m.error(` context OVER ${c}k tok by ~${Q(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?m.error:m.warning;n(l(` context ${Math.round(i*100)}% used of ${Q(a)}`))}n("")}function bw(e={}){let t=e.load??Gi,n=e.onResize??(i=>ot.subscribe(i)),r="",o,s=n(()=>{r=""});return{renderIfChanged(i){let a=i??"unbound",l=t(a),c=Ty(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:zi(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var tu={done:{glyph:"\u2713",color:m.success,label:"done"},blocked:{glyph:"\u2298",color:m.error,label:"blocked"},asking:{glyph:"?",color:m.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:m.meta,label:"interrupted"}};function kw(e={}){let t=Math.max(2,e.capacity??8),n=[];return{push(r){n.push(r.kind),n.length>t&&(n=n.slice(n.length-t))},reset(){n=[]},entries(){return n},render(){if(n.length===0)return null;let r=m.dim(" ledger "),o=m.dim(" \xB7 "),s=n.map(d=>{let u=tu[d];return u.color(`${u.glyph} ${u.label}`)}),i=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),a=r+s.join(o)+i,l=Math.max(20,te()-2);if(K(a)<=l)return a;let c=r+n.map(d=>tu[d].color(tu[d].glyph)).join(m.dim(" "))+i;return ce(c,l)}}}var nu=["\u25D0","\u25D1","\u25D2","\u25D3"],Va=class{stream;manager;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;updateHandler=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;onRowCountChange;constructor(t,n,r={}){this.manager=t,this.registry=n,this.stream=r.stream??process.stdout,this.throttleMs=r.throttleMs??200}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||(this.started=!0,this.updateHandler=()=>this.scheduleRepaint(),this.manager.on("update",this.updateHandler),this.manager.on("complete",this.updateHandler),this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=ot.subscribe(()=>this.repaint()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%nu.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.updateHandler&&(this.manager.removeListener("update",this.updateHandler),this.manager.removeListener("complete",this.updateHandler),this.updateHandler=null),this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=[...this.manager.running().map(s=>({kind:"turn",task:s})),...(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s}))],n=this.stream.rows??24,r=Math.max(0,Math.min(t.length,n-1));if(r!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=r,this.onRowCountChange?.(r)),r===0)return;let o=Math.max(1,n-r);this.stream.write("\x1B[s");for(let s=0;s<r;s++){let i=t[s],a=o+s;this.stream.write(`\x1B[${a};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(i))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=Math.min(this.rowCount,t-1),r=Math.max(1,t-n);this.stream.write("\x1B[s");for(let o=0;o<n;o++)this.stream.write(`\x1B[${r+o};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}formatItemLine(t){return t.kind==="turn"?this.formatTaskLine(t.task):this.formatJobLine(t.job)}formatTaskLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nu[this.spinnerIndex]),o=m.dim(t.id),s=m.bold(t.label),i=[r,o,s];t.progressDescription&&i.push(m.dim(t.progressDescription));let a=[];t.stats.toolUses>0&&a.push(`${t.stats.toolUses} tool${t.stats.toolUses===1?"":"s"}`),t.stats.tokens>0&&a.push(`${Q(t.stats.tokens)} tok`);let l=Date.now()-t.startedAt;return a.push(se(l)),a.length>0&&i.push(m.dim(a.join(" \xB7 "))),ce(" "+i.join(" "),n)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nu[this.spinnerIndex]),o=m.dim(t.jobId),s=m.bold(t.label||t.jobId),i=[r,o,s],a=Date.now()-t.startedAt;return i.push(m.dim(se(a))),ce(" "+i.join(" "),n)}};function Ya(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function ww(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async p=>{He()&&(o=Bi(p)),await Sa(e.session.current),He()&&(s=pk())}).catch(()=>{});let i=await cw(),a=new Ja({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,d,u;try{await a.armCompositor({promptFn:()=>Ya(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let h=e.slashCtx;h.stats.planMode&&h.stats.pendingPlanExit?(h.stats.pendingPlanExit=!1,gt(h,!1,{closureSummarySkipped:!0}).catch(()=>{})):gt(h).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine}),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor(),c=bw();let p=kw();e.clearVerdictLedger=()=>p.reset(),d=new qi,$y(d),jy(d),Hy(d),By(e.backgroundRegistry),u=new Va(d,e.backgroundRegistry),u.setRowCountChangeHandler(h=>{e.statusLine.setExtraRows(h)}),u.start();let f=50,g=[];for(d.on("complete",h=>{g.length>=f&&g.shift(),g.push(h)});;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let v of s)e.replRenderer.writeLine(v);e.replRenderer.writeLine(""),s=[]}for(;g.length>0;){let v=g.shift(),R=v.status==="succeeded"?"\u2713":"\u2717",_=[];if(v.resultText){let A=v.resultText.trim().split(`
2111
+ `);let A=fw(c);if(A&&(C(gw(A)),C(""),r.onTerminalState))try{r.onTerminalState(A)}catch{}if(JD(g,n,C),r.onAfterTurn){let O=r.onAfterTurn();O instanceof Promise&&await O.catch(()=>{})}}}catch(v){await w(),u||ir(sr(v))}finally{await w(),s&&(s.fn=v=>console.log(v)),r.setActiveCompositor?.(null),r.setBackgroundHandler?.(null),r.setInFlight(!1),r.rearmStatus?.()}}function JD(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(se(e.durationMs)),e.totalCostUsd!==void 0&&r.push(Ue(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(Q(o+s)+" tok"),r.length>0&&n(m.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Yc(t),a=Qe(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);console.log(m.error(` context OVER ${c}k tok by ~${Q(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?m.error:m.warning;n(l(` context ${Math.round(i*100)}% used of ${Q(a)}`))}n("")}function bw(e={}){let t=e.load??Gi,n=e.onResize??(i=>ot.subscribe(i)),r="",o,s=n(()=>{r=""});return{renderIfChanged(i){let a=i??"unbound",l=t(a),c=Ty(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:zi(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var tu={done:{glyph:"\u2713",color:m.success,label:"done"},blocked:{glyph:"\u2298",color:m.error,label:"blocked"},asking:{glyph:"?",color:m.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:m.meta,label:"interrupted"}};function kw(e={}){let t=Math.max(2,e.capacity??8),n=[];return{push(r){n.push(r.kind),n.length>t&&(n=n.slice(n.length-t))},reset(){n=[]},entries(){return n},render(){if(n.length===0)return null;let r=m.dim(" ledger "),o=m.dim(" \xB7 "),s=n.map(d=>{let u=tu[d];return u.color(`${u.glyph} ${u.label}`)}),i=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),a=r+s.join(o)+i,l=Math.max(20,te()-2);if(G(a)<=l)return a;let c=r+n.map(d=>tu[d].color(tu[d].glyph)).join(m.dim(" "))+i;return ce(c,l)}}}var nu=["\u25D0","\u25D1","\u25D2","\u25D3"],Va=class{stream;manager;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;updateHandler=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;onRowCountChange;constructor(t,n,r={}){this.manager=t,this.registry=n,this.stream=r.stream??process.stdout,this.throttleMs=r.throttleMs??200}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||(this.started=!0,this.updateHandler=()=>this.scheduleRepaint(),this.manager.on("update",this.updateHandler),this.manager.on("complete",this.updateHandler),this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=ot.subscribe(()=>this.repaint()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%nu.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.updateHandler&&(this.manager.removeListener("update",this.updateHandler),this.manager.removeListener("complete",this.updateHandler),this.updateHandler=null),this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=[...this.manager.running().map(s=>({kind:"turn",task:s})),...(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s}))],n=this.stream.rows??24,r=Math.max(0,Math.min(t.length,n-1));if(r!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=r,this.onRowCountChange?.(r)),r===0)return;let o=Math.max(1,n-r);this.stream.write("\x1B[s");for(let s=0;s<r;s++){let i=t[s],a=o+s;this.stream.write(`\x1B[${a};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(i))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=Math.min(this.rowCount,t-1),r=Math.max(1,t-n);this.stream.write("\x1B[s");for(let o=0;o<n;o++)this.stream.write(`\x1B[${r+o};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}formatItemLine(t){return t.kind==="turn"?this.formatTaskLine(t.task):this.formatJobLine(t.job)}formatTaskLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nu[this.spinnerIndex]),o=m.dim(t.id),s=m.bold(t.label),i=[r,o,s];t.progressDescription&&i.push(m.dim(t.progressDescription));let a=[];t.stats.toolUses>0&&a.push(`${t.stats.toolUses} tool${t.stats.toolUses===1?"":"s"}`),t.stats.tokens>0&&a.push(`${Q(t.stats.tokens)} tok`);let l=Date.now()-t.startedAt;return a.push(se(l)),a.length>0&&i.push(m.dim(a.join(" \xB7 "))),ce(" "+i.join(" "),n)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(nu[this.spinnerIndex]),o=m.dim(t.jobId),s=m.bold(t.label||t.jobId),i=[r,o,s],a=Date.now()-t.startedAt;return i.push(m.dim(se(a))),ce(" "+i.join(" "),n)}};function Ya(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function ww(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async p=>{He()&&(o=Bi(p)),await Sa(e.session.current),He()&&(s=pk())}).catch(()=>{});let i=await cw(),a=new Ja({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,d,u;try{await a.armCompositor({promptFn:()=>Ya(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let h=e.slashCtx;h.stats.planMode&&h.stats.pendingPlanExit?(h.stats.pendingPlanExit=!1,gt(h,!1,{closureSummarySkipped:!0}).catch(()=>{})):gt(h).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine}),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor(),c=bw();let p=kw();e.clearVerdictLedger=()=>p.reset(),d=new qi,$y(d),jy(d),Hy(d),By(e.backgroundRegistry),u=new Va(d,e.backgroundRegistry),u.setRowCountChangeHandler(h=>{e.statusLine.setExtraRows(h)}),u.start();let f=50,g=[];for(d.on("complete",h=>{g.length>=f&&g.shift(),g.push(h)});;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let v of s)e.replRenderer.writeLine(v);e.replRenderer.writeLine(""),s=[]}for(;g.length>0;){let v=g.shift(),R=v.status==="succeeded"?"\u2713":"\u2717",_=[];if(v.resultText){let A=v.resultText.trim().split(`
2110
2112
  `)[0]?.slice(0,80)??"";A&&_.push(A)}v.error&&_.push(v.error.message);let C=[v.stats.toolUses>0?`${v.stats.toolUses} tools`:"",v.stats.tokens>0?`${Math.round(v.stats.tokens/1e3)}k tok`:"",v.stats.durationMs>0?`${Math.round(v.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");C&&_.push(C),e.replRenderer.writeLine(Yt({kind:v.status==="succeeded"?"checkpoint":"diagnosis",title:`${R} ${v.id} ${v.label}`,body:_})),e.replRenderer.writeLine("")}let h=c.renderIfChanged(e.stats.sessionId);if(h.length>0){for(let v of h)e.replRenderer.writeLine(v);e.replRenderer.writeLine("")}let b=p.render();b&&e.replRenderer.writeLine(b);let y,S;if(l!==void 0){let v=l;l=void 0;let R=Ya(e.stats.model,e.stats.planMode),_=Bn({buffer:v.text,promptText:R,isTTY:!!process.stdout.isTTY,attachmentSummary:Dr([...v.attachments])});e.replRenderer.writeLine(_),y=v.text.trim(),S=v.attachments}else{let v=await a.readLine({promptFn:()=>Ya(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{let R=e.slashCtx;R.stats.planMode&&R.stats.pendingPlanExit?(R.stats.pendingPlanExit=!1,gt(R,!1,{closureSummarySkipped:!0}).catch(()=>{})):gt(R).catch(()=>{}),e.statusLine.rearm()}});y=v.text.trim(),S=v.attachments}if(!y&&S.length===0)continue;let T=!1;if(y.startsWith("/")){let v=await ny(y,e.slashCtx,S);if(v.handled){if(v.result==="exit"){e.rl.close();return}if((y==="/clear"||y.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset()),v.result!==null&&typeof v.result=="object"&&"kind"in v.result&&v.result.kind==="submit"){l={text:v.result.message,attachments:S??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}i.push(y);let x=y;if(T){let v=Vc(y);if(v){let R=v.name.replace(/^\//,"").split(":").pop()??"";if(R&&Pd(R)){let _={skillName:R,rawArgs:v.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},C=e.session.current.sessionId,A=Zo(C),O=Date.now();W(`[afk trace] preflight.start commandName=${R}`);let M=!1,$=await Qo(_,{cwd:e.stats.cwd??process.cwd(),artifactDir:A},N=>{He()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${R}) failed: `)+(N instanceof Error?N.message:String(N)))});M=$!==null,W(`[afk trace] preflight.end commandName=${R} durationMs=${Date.now()-O} success=${M}`),x=$d($?.manifestBlock,y)}}}let w;if(e.firstTurnHook&&e.stats.totalTurns===0){let v=e.firstTurnHook;e.firstTurnHook=void 0,w=Promise.resolve().then(()=>v(y)).catch(R=>{e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(R instanceof Error?R.message:String(R)))})}await yw({text:x,attachments:S},e.session.current,e.stats,{setInFlight(v){n.turnInFlight=v},async onTurnComplete(v,R){await t.appendTurn(v,R)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await fy(e.slashCtx),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:v=>p.push(v),setActiveCompositor:v=>{n.activeCompositor=v},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:v=>a.setBackgroundHandler(v)},e.options.thinkingUi,e.completionWriter,d,a.toRunTurnRefs(Ya(e.stats.model,e.stats.planMode))),w!==void 0&&await w}}finally{if(d!==void 0)for(let p of d.running())d.cancel(p.id);u?.stop(),c?.dispose(),await a.dispose()}}import{execFile as VD}from"node:child_process";import{dirname as YD,isAbsolute as XD,resolve as QD}from"node:path";import{promisify as ZD}from"node:util";var Sw=ZD(VD),eL=3e3,tL=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function nL(){let t=(await Sw("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=XD(t)?t:QD(process.cwd(),t);return YD(n)}async function vw(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await nL()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),eL)});try{let o=_t({execFile:Sw,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>tL.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as rL}from"node:fs";import{dirname as oL,join as sL}from"node:path";import{randomBytes as iL}from"node:crypto";var aL=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
2111
- `),Tw=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,ru=30,lL=1024,cL=8e3,dL="haiku";async function uL(e,t){let n=e.trim();if(n.length===0||n.startsWith("/"))return null;let r=gL(n,lL),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??cL),i=t.signal?hL([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Na({token:t.token,model:t.model??dL,system:aL,user:r,maxTokens:32,signal:i})}catch{return null}finally{clearTimeout(s)}let l=pL(a);if(l===null)return null;let c=oL(t.worktreePath);return await mL(l,c)}function pL(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Tw.test(t)&&t.length<=ru)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>ru)break;o=i}return Tw.test(o)?o:null}async function mL(e,t){if(!await fL(sL(t,e)))return e;let n=iL(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,ru-5)}-${n}`}async function fL(e){try{return await rL.access(e),!0}catch{return!1}}function gL(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function hL(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Ew(e){let t=await uL(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:e.handle.path,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{}});if(t===null)return{status:"skipped",reason:"slug generation returned null"};let r=await(e.renameFn??Xf)(e.handle,t,e.branchPrefix!==void 0?{branchPrefix:e.branchPrefix}:void 0);return r.ok?(e.session&&e.session.setCwd(r.newPath),{status:"renamed",oldPath:r.oldPath,newPath:r.newPath,oldBranch:r.oldBranch,newBranch:r.newBranch}):(r.partial==="branch"&&e.session&&e.session.setCwd(e.handle.path),{status:"failed",reason:r.reason,...r.partial!==void 0?{partial:r.partial}:{}})}F();import{spawn as xw}from"child_process";import{existsSync as SL,mkdirSync as vL,readFileSync as Aw,unlinkSync as TL,writeFileSync as EL}from"fs";import{get as xL}from"https";import{join as Rw}from"path";import{readFileSync as yL}from"fs";import{dirname as bL,join as kL}from"path";import{fileURLToPath as wL}from"url";function Wt(){try{return"3.20.2"}catch{}try{let e=bL(wL(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(yL(kL(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}H();var AL=64*1024,RL=1440*60*1e3,_L="update-check.json",CL="pending-update.json";function _w(){return Rw(vs(),_L)}function ou(){return Rw(vs(),CL)}function Cw(){let e=vs();SL(e)||vL(e,{recursive:!0})}function IL(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function PL(){try{let e=Aw(_w(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function ML(){try{Cw();let e=`
2113
+ `),Tw=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,ru=30,lL=1024,cL=8e3,dL="haiku";async function uL(e,t){let n=e.trim();if(n.length===0||n.startsWith("/"))return null;let r=gL(n,lL),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??cL),i=t.signal?hL([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Na({token:t.token,model:t.model??dL,system:aL,user:r,maxTokens:32,signal:i})}catch{return null}finally{clearTimeout(s)}let l=pL(a);if(l===null)return null;let c=oL(t.worktreePath);return await mL(l,c)}function pL(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Tw.test(t)&&t.length<=ru)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>ru)break;o=i}return Tw.test(o)?o:null}async function mL(e,t){if(!await fL(sL(t,e)))return e;let n=iL(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,ru-5)}-${n}`}async function fL(e){try{return await rL.access(e),!0}catch{return!1}}function gL(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function hL(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Ew(e){let t=await uL(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:e.handle.path,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{}});if(t===null)return{status:"skipped",reason:"slug generation returned null"};let r=await(e.renameFn??Xf)(e.handle,t,e.branchPrefix!==void 0?{branchPrefix:e.branchPrefix}:void 0);return r.ok?(e.session&&e.session.setCwd(r.newPath),{status:"renamed",oldPath:r.oldPath,newPath:r.newPath,oldBranch:r.oldBranch,newBranch:r.newBranch}):(r.partial==="branch"&&e.session&&e.session.setCwd(e.handle.path),{status:"failed",reason:r.reason,...r.partial!==void 0?{partial:r.partial}:{}})}F();import{spawn as xw}from"child_process";import{existsSync as SL,mkdirSync as vL,readFileSync as Aw,unlinkSync as TL,writeFileSync as EL}from"fs";import{get as xL}from"https";import{join as Rw}from"path";import{readFileSync as yL}from"fs";import{dirname as bL,join as kL}from"path";import{fileURLToPath as wL}from"url";function Wt(){try{return"3.20.3"}catch{}try{let e=bL(wL(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(yL(kL(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var AL=64*1024,RL=1440*60*1e3,_L="update-check.json",CL="pending-update.json";function _w(){return Rw(vs(),_L)}function ou(){return Rw(vs(),CL)}function Cw(){let e=vs();SL(e)||vL(e,{recursive:!0})}function IL(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function PL(){try{let e=Aw(_w(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function ML(){try{Cw();let e=`
2112
2114
  const https = require('https');
2113
2115
  const fs = require('fs');
2114
2116
  const url = 'https://registry.npmjs.org/agent-afk/latest';
@@ -2135,11 +2137,11 @@ ${r}Run \`npm install -g agent-afk\` to update${o}
2135
2137
  `+m.warning("\u26A0 Interrupted. Press Ctrl+C again to exit."),_=b.activeCompositor;if(_&&_.isArmed())try{_.commitAbove(R)}catch{console.log(R)}else console.log(R);return}if(v-b.lastSigintAt<y){d.rl.close();return}b.lastSigintAt=v,console.log(`
2136
2138
  `+m.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",S),Mr(async()=>{process.removeListener("SIGINT",S)});let T=!1,x=()=>{if(T)return;T=!0;try{d.rl.close()}catch{}setTimeout(()=>{Jc().finally(()=>process.exit(0))},2e3).unref()};if(process.on("SIGTERM",x),Mr(async()=>{process.removeListener("SIGTERM",x)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),Qa!==null){let{updateInfo:v,pendingMessage:R}=Qa;Qa=null,R!==null&&process.stderr.write(R),v!==null&&Xa(v)}let w=d.resumeTarget?`Resuming ${d.resumeTarget.id} \xB7 ${d.stats.totalTurns} prior turn${d.stats.totalTurns===1?"":"s"}`:void 0;console.log(`
2137
2139
  `+Cp({mode:"Interactive Mode",model:d.stats.model,version:Wt(),...l!==void 0?{worktree:l.branch}:{},cwd:a??process.cwd(),...w!==void 0?{metaLine:w}:{},hintLine:"/help \xB7 /model \xB7 /resume \xB7 Ctrl+C to interrupt \xB7 /exit to quit"})),c!==void 0&&console.log(m.dim(` ${c}`)),console.log(),d.statusLine.start(),d.slashCtx.ui.repaintStatusLine(),d.rl.on("close",async()=>{d.statusLine.stop(),FL(d,l,h),console.log(m.info("\u2139 ")+"Goodbye!"),await Jc(),process.exit(0)}),await ww(d,f,b,S)})}function FL(e,t,n){if(e.stats.totalTurns===0)return;console.log(`
2138
- `+be("Session Summary"));let r=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,se(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&r.push(Ue(e.stats.totalCostUsd)),e.stats.totalTokens>0&&r.push(Q(e.stats.totalTokens)+" tokens"),console.log(m.dim(" "+r.join(" \xB7 ")));let o=t?Zn.basename(t.path):"none";console.log(m.dim(` model: ${e.stats.model} \xB7 worktree: ${o}`));try{let i=e.stats.cwd??process.cwd(),l=$L("git",["diff","--shortstat","HEAD"],{cwd:i,encoding:"utf8",timeout:2e3}).trim();console.log(m.dim(` edits: ${l||"no files changed"}`))}catch{}let s=e.stats.sessionId;try{let i=n();!s&&i&&(s=Zn.basename(i,".json"))}catch{}s&&console.log(m.dim(" Continue with: ")+m.brand(Or(s,e.stats.model))),console.log()}H();import NL from"ora";function Dw(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=NL("Checking status...").start();try{let r=Fe(),o=Ee(r),s=ng(r),i=o==="openai-compatible"||o==="openai-codex";if(await new Ye({model:i?"gpt-4o-mini":"haiku",...s!==void 0?{apiKey:s}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`),t.format==="json"){let l=oe(),c=Do(),d=l?E.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,u=c?E.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!l,source:d},codex:{ok:!!c,source:u}},model:String(r),bypass:!0},null,2))}else console.log(`
2140
+ `+be("Session Summary"));let r=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,se(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&r.push(Ue(e.stats.totalCostUsd)),e.stats.totalTokens>0&&r.push(Q(e.stats.totalTokens)+" tokens"),console.log(m.dim(" "+r.join(" \xB7 ")));let o=t?Zn.basename(t.path):"none";console.log(m.dim(` model: ${e.stats.model} \xB7 worktree: ${o}`));try{let i=e.stats.cwd??process.cwd(),l=$L("git",["diff","--shortstat","HEAD"],{cwd:i,encoding:"utf8",timeout:2e3}).trim();console.log(m.dim(` edits: ${l||"no files changed"}`))}catch{}let s=e.stats.sessionId;try{let i=n();!s&&i&&(s=Zn.basename(i,".json"))}catch{}s&&console.log(m.dim(" Continue with: ")+m.brand(Or(s,e.stats.model))),console.log()}K();import NL from"ora";function Dw(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=NL("Checking status...").start();try{let r=Fe(),o=Ee(r),s=ng(r),i=o==="openai-compatible"||o==="openai-codex";if(await new Ye({model:i?"gpt-4o-mini":"haiku",...s!==void 0?{apiKey:s}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`),t.format==="json"){let l=oe(),c=Do(),d=l?E.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,u=c?E.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!l,source:d},codex:{ok:!!c,source:u}},model:String(r),bypass:!0},null,2))}else console.log(`
2139
2141
  `+_p("Agent AFK \xB7 Status",[{label:"Provider",value:o,kind:"info"},{label:"Auth",value:i?s?"Found (OPENAI_API_KEY / CODEX_API_KEY)":"Reading ~/.codex/auth.json (run `afk provider auth diagnose`)":s?"Found (ANTHROPIC_API_KEY)":"Falling back to Claude OAuth",kind:s?"ok":"warn"},{label:"Model",value:String(r),kind:"info"},{label:"Bypass",value:"Permissions disabled",kind:"warn"}])+`
2140
- `)}catch(r){n.fail("Connection failed"),U(r)}})}H();function Lw(e){e.command("config").description("View current configuration").option("-f, --format <format>","Output format (text|json)","text").action(t=>{let n=E.AFK_MODEL??E.CLAUDE_MODEL,r=n??"sonnet",o=Ee(n),s=E.ANTHROPIC_API_KEY||E.CLAUDE_CODE_OAUTH_TOKEN,i=E.OPENAI_API_KEY||E.CODEX_API_KEY,a=o==="anthropic"?s:i,l=s?E.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,c=i?E.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;if(t.format==="json")console.log(JSON.stringify({model:r,provider:o,apiKey:{present:!!a,source:o==="anthropic"?l:c},thinking:E.AFK_THINKING||null,effort:E.AFK_EFFORT||null,bypass:!0,raw_env:{AFK_MODEL:E.AFK_MODEL??null,AFK_THINKING:E.AFK_THINKING??null,AFK_EFFORT:E.AFK_EFFORT??null,ANTHROPIC_API_KEY:E.ANTHROPIC_API_KEY?"set":"unset",CLAUDE_CODE_OAUTH_TOKEN:E.CLAUDE_CODE_OAUTH_TOKEN?"set":"unset",OPENAI_API_KEY:E.OPENAI_API_KEY?"set":"unset",CODEX_API_KEY:E.CODEX_API_KEY?"set":"unset"}},null,2));else{console.log(m.info(`\u{1F4CB} Current Configuration:
2142
+ `)}catch(r){n.fail("Connection failed"),U(r)}})}K();function Lw(e){e.command("config").description("View current configuration").option("-f, --format <format>","Output format (text|json)","text").action(t=>{let n=E.AFK_MODEL??E.CLAUDE_MODEL,r=n??"sonnet",o=Ee(n),s=E.ANTHROPIC_API_KEY||E.CLAUDE_CODE_OAUTH_TOKEN,i=E.OPENAI_API_KEY||E.CODEX_API_KEY,a=o==="anthropic"?s:i,l=s?E.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,c=i?E.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;if(t.format==="json")console.log(JSON.stringify({model:r,provider:o,apiKey:{present:!!a,source:o==="anthropic"?l:c},thinking:E.AFK_THINKING||null,effort:E.AFK_EFFORT||null,bypass:!0,raw_env:{AFK_MODEL:E.AFK_MODEL??null,AFK_THINKING:E.AFK_THINKING??null,AFK_EFFORT:E.AFK_EFFORT??null,ANTHROPIC_API_KEY:E.ANTHROPIC_API_KEY?"set":"unset",CLAUDE_CODE_OAUTH_TOKEN:E.CLAUDE_CODE_OAUTH_TOKEN?"set":"unset",OPENAI_API_KEY:E.OPENAI_API_KEY?"set":"unset",CODEX_API_KEY:E.CODEX_API_KEY?"set":"unset"}},null,2));else{console.log(m.info(`\u{1F4CB} Current Configuration:
2141
2143
  `)),console.log(` Model: ${m.info(n?r:r+" (default)")}`),console.log(` Provider: ${m.plan(o)}`),console.log(o==="anthropic"?` API Key: ${a?m.success("\u2713 Set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):m.warning("\u26A0 Not set \u2014 subprocess will fall back to OAuth / keychain")}`:` API Key: ${a?m.success("\u2713 Set (OPENAI_API_KEY / CODEX_API_KEY)"):m.warning("\u26A0 Not set \u2014 falling back to `codex login` state")}`);let d=E.AFK_THINKING||"(unset \u2014 SDK default)";console.log(` Thinking: ${m.info(d)}`);let u=E.AFK_EFFORT||"(unset \u2014 SDK default)";console.log(` Effort: ${m.info(u)}`),console.log(` Bypass Permissions: ${m.warning("true (enabled)")}`),console.log(m.meta(`
2142
- Environment variables:`)),console.log(m.meta(" AFK_MODEL - Default model id (canonical; accepts short aliases or full ids)")),console.log(m.meta(" CLAUDE_MODEL - Legacy alias for AFK_MODEL (Claude-only deployments)")),console.log(m.meta(" ANTHROPIC_API_KEY - Anthropic API key (Claude models)")),console.log(m.meta(" CLAUDE_CODE_OAUTH_TOKEN - Anthropic OAuth token (Claude models)")),console.log(m.meta(" OPENAI_API_KEY / CODEX_API_KEY - OpenAI API key (Codex models)")),console.log(m.meta(" AFK_THINKING - Thinking mode (Claude only: adaptive|disabled|enabled:<N>)")),console.log(m.meta(" AFK_EFFORT - Effort level (low|medium|high|xhigh|max)")),console.log(m.meta(" AFK_TIMEOUT_MS - Per-tick daemon session timeout in ms")),console.log(m.meta(" AFK_SESSIONSTART_COOLDOWN_MS - Phase 6 cooldown between sessionstart fires (default 6h)")),console.log("")}})}H();import dF from"path";import uF from"os";import{createServer as QL}from"node:http";import{writeFileSync as ZL,unlinkSync as eF,mkdirSync as tF}from"node:fs";import{dirname as nF,join as rF}from"node:path";H();import{mkdirSync as zL,appendFileSync as qL}from"node:fs";import{dirname as JL}from"node:path";import{execFile as VL}from"node:child_process";import{promisify as YL}from"node:util";import*as Jw from"node-cron";var Za=class{_count=0;increment(){this._count++}decrement(){this._count>0&&this._count--}isIdle(){return this._count===0}count(){return this._count}};F();import{mkdirSync as Nw,readdirSync as Uw,readFileSync as UL,renameSync as jL,unlinkSync as jw,writeFileSync as BL}from"node:fs";import{randomBytes as Fw}from"node:crypto";import{join as cu}from"node:path";function Bw(e,t={},n=wt()){Nw(n,{recursive:!0});let o=Uw(n).filter(f=>f.endsWith(".json")).length+1,s=`q-${Date.now()}-${Fw(3).toString("hex")}`,i=new Date().toISOString(),a={id:s,command:e,enqueuedAt:i,sequence:o,...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}},c=`${String(o).padStart(4,"0")}-${s}.json`,d=cu(n,c),u=Fw(4).toString("hex"),p=cu(n,`.tmp-${u}.json`);try{BL(p,JSON.stringify(a),"utf-8"),jL(p,d)}catch(f){try{jw(p)}catch{}throw f}return a}function Ww(e=wt()){Nw(e,{recursive:!0});let n=Uw(e).filter(i=>i.endsWith(".json")&&!i.startsWith(".tmp-")).sort()[0];if(n===void 0)return null;let r=cu(e,n),o=UL(r,"utf-8"),s=JSON.parse(o);return jw(r),s}F();F();function Hw(e){if(!e.taskId)throw new Error("ScheduledTask.taskId is required");if(!e.command)throw new Error(`task ${e.taskId}: command is required`);if((e.trigger==="cron"||e.trigger==="both")&&!e.cronExpression)throw new Error(`task ${e.taskId}: cronExpression required for trigger=${e.trigger}`);if(e.trigger==="pull"&&e.cronExpression!==void 0)throw new Error(`task ${e.taskId}: cronExpression must not be set when trigger='pull' \u2014 pull tasks are dequeued from the queue directory, not scheduled via cron`)}F();import{existsSync as Kw,readFileSync as WL,readdirSync as HL}from"node:fs";var Gw=360*60*1e3;function zw(){return Kt()}function KL(e,t){if(!Kw(t))return null;let n;try{n=WL(t,"utf-8")}catch{return null}let r=n.split(`
2144
+ Environment variables:`)),console.log(m.meta(" AFK_MODEL - Default model id (canonical; accepts short aliases or full ids)")),console.log(m.meta(" CLAUDE_MODEL - Legacy alias for AFK_MODEL (Claude-only deployments)")),console.log(m.meta(" ANTHROPIC_API_KEY - Anthropic API key (Claude models)")),console.log(m.meta(" CLAUDE_CODE_OAUTH_TOKEN - Anthropic OAuth token (Claude models)")),console.log(m.meta(" OPENAI_API_KEY / CODEX_API_KEY - OpenAI API key (Codex models)")),console.log(m.meta(" AFK_THINKING - Thinking mode (Claude only: adaptive|disabled|enabled:<N>)")),console.log(m.meta(" AFK_EFFORT - Effort level (low|medium|high|xhigh|max)")),console.log(m.meta(" AFK_TIMEOUT_MS - Per-tick daemon session timeout in ms")),console.log(m.meta(" AFK_SESSIONSTART_COOLDOWN_MS - Phase 6 cooldown between sessionstart fires (default 6h)")),console.log("")}})}K();import dF from"path";import uF from"os";import{createServer as QL}from"node:http";import{writeFileSync as ZL,unlinkSync as eF,mkdirSync as tF}from"node:fs";import{dirname as nF,join as rF}from"node:path";K();import{mkdirSync as zL,appendFileSync as qL}from"node:fs";import{dirname as JL}from"node:path";import{execFile as VL}from"node:child_process";import{promisify as YL}from"node:util";import*as Jw from"node-cron";var Za=class{_count=0;increment(){this._count++}decrement(){this._count>0&&this._count--}isIdle(){return this._count===0}count(){return this._count}};F();import{mkdirSync as Nw,readdirSync as Uw,readFileSync as UL,renameSync as jL,unlinkSync as jw,writeFileSync as BL}from"node:fs";import{randomBytes as Fw}from"node:crypto";import{join as cu}from"node:path";function Bw(e,t={},n=wt()){Nw(n,{recursive:!0});let o=Uw(n).filter(f=>f.endsWith(".json")).length+1,s=`q-${Date.now()}-${Fw(3).toString("hex")}`,i=new Date().toISOString(),a={id:s,command:e,enqueuedAt:i,sequence:o,...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}},c=`${String(o).padStart(4,"0")}-${s}.json`,d=cu(n,c),u=Fw(4).toString("hex"),p=cu(n,`.tmp-${u}.json`);try{BL(p,JSON.stringify(a),"utf-8"),jL(p,d)}catch(f){try{jw(p)}catch{}throw f}return a}function Ww(e=wt()){Nw(e,{recursive:!0});let n=Uw(e).filter(i=>i.endsWith(".json")&&!i.startsWith(".tmp-")).sort()[0];if(n===void 0)return null;let r=cu(e,n),o=UL(r,"utf-8"),s=JSON.parse(o);return jw(r),s}F();F();function Hw(e){if(!e.taskId)throw new Error("ScheduledTask.taskId is required");if(!e.command)throw new Error(`task ${e.taskId}: command is required`);if((e.trigger==="cron"||e.trigger==="both")&&!e.cronExpression)throw new Error(`task ${e.taskId}: cronExpression required for trigger=${e.trigger}`);if(e.trigger==="pull"&&e.cronExpression!==void 0)throw new Error(`task ${e.taskId}: cronExpression must not be set when trigger='pull' \u2014 pull tasks are dequeued from the queue directory, not scheduled via cron`)}F();import{existsSync as Kw,readFileSync as WL,readdirSync as HL}from"node:fs";var Gw=360*60*1e3;function zw(){return Kt()}function KL(e,t){if(!Kw(t))return null;let n;try{n=WL(t,"utf-8")}catch{return null}let r=n.split(`
2143
2145
  `);for(let o=r.length-1;o>=0;o-=1){let s=r[o];if(s)try{let i=JSON.parse(s);if(i.taskId!==e||typeof i.triggeredAt!="string")continue;let a=Date.parse(i.triggeredAt);if(Number.isNaN(a))continue;return a}catch{continue}}return null}function GL(e){if(!Kw(e))return 0;try{return HL(e).filter(t=>!t.startsWith(".")).length}catch{return 0}}function qw(e){let t=KL(e.taskId,e.telemetryPath);if(t!==null&&e.cooldownMs>0){let r=e.nowMs-t;if(r<e.cooldownMs)return{fire:!1,skipReason:"cooldown",lastFiredAtMs:t,cooldownRemainingMs:e.cooldownMs-r}}let n=GL(e.briefsDir);return n>0?{fire:!1,skipReason:"briefs_pending",pendingBriefCount:n,...t!==null?{lastFiredAtMs:t}:{}}:{fire:!0,...t!==null?{lastFiredAtMs:t}:{}}}var XL=YL(VL),el=class{registry=new Map;options;defaultCooldownMs;briefsDir;now;idleDetector=new Za;pullPollTimer;isDequeuing=!1;queueDir;constructor(t={}){this.options=t,this.defaultCooldownMs=t.cooldownMs??Gw,this.briefsDir=t.briefsDir??zw(),this.now=t.now??Date.now,this.queueDir=t.queueDir??wt(),this.ensureTelemetrySink()}register(t){if(Hw(t),this.registry.has(t.taskId))throw new Error(`task ${t.taskId} is already registered`);let n;(t.trigger==="cron"||t.trigger==="both")&&(n=Jw.schedule(t.cronExpression,()=>{this.runOnce(t,"cron").catch(()=>{})},{name:t.taskId})),this.registry.set(t.taskId,{task:t,cronTask:n})}unregister(t){let n=this.registry.get(t);n&&(n.cronTask&&(Promise.resolve(n.cronTask.stop()).catch(()=>{}),Promise.resolve(n.cronTask.destroy()).catch(()=>{})),this.registry.delete(t))}list(){return Array.from(this.registry.values()).map(t=>t.task)}async tick(t){let n=this.registry.get(t);if(!n)throw new Error(`task ${t} is not registered`);return this.runOnce(n.task,"cron")}async fireOnStart(){let t=Array.from(this.registry.values()).map(r=>r.task).filter(r=>r.trigger==="sessionstart"||r.trigger==="both"),n=[];for(let r of t){let o=r.debounceMs??this.defaultCooldownMs,s=qw({taskId:r.taskId,cooldownMs:o,nowMs:this.now(),telemetryPath:this.telemetryPath(),briefsDir:this.briefsDir});s.fire?n.push(await this.runOnce(r,"sessionstart")):n.push(this.recordSkip(r,s))}return n}async stop(){this.pullPollTimer!==void 0&&(clearInterval(this.pullPollTimer),this.pullPollTimer=void 0);for(let t of Array.from(this.registry.keys()))this.unregister(t)}startPullLoop(){if(this.pullPollTimer!==void 0)return;let t=this.options.pullPollIntervalMs;!t||t<=0||(this.pullPollTimer=setInterval(()=>{this.pullTick()},t).unref())}async pullTick(){if(this.idleDetector.isIdle()&&!this.isDequeuing){this.isDequeuing=!0;try{let t=Ww(this.queueDir);if(t===null)return;let n={taskId:t.id,command:t.command,trigger:"pull",...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}};await this.runOnce(n,"pull")}catch{}finally{this.isDequeuing=!1}}}async runOnce(t,n){if(t.command==="__BUILTIN_WORKTREE_PRUNE__")return this.runBuiltinWorktreePrune(t,n);let r=new Date(this.now()),o=this.now(),s={taskId:t.taskId,command:Sr(t.command),trigger:n,...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString()},i=null,a=null;this.idleDetector.increment();try{let l=this.spawnSession();i=l.session,a=l.memoryStore;let c=await i.sendMessage(t.command),d={...s,durationMs:this.now()-o,status:"success",responseExcerpt:Sr(c.content.slice(0,280))};return this.writeTelemetry(d,t),d}catch(l){let c={...s,durationMs:this.now()-o,status:"error",errorMessage:Sr(l instanceof Error?l.message:String(l))};return this.writeTelemetry(c,t),c}finally{if(this.idleDetector.decrement(),i)try{await i.close()}catch{}a?.close()}}recordSkip(t,n){let r=new Date(this.now()),o={taskId:t.taskId,command:t.command,trigger:"sessionstart",...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString(),durationMs:0,status:"skipped",...n.skipReason!==void 0?{skipReason:n.skipReason}:{}};return this.writeTelemetry(o,t),o}async runBuiltinWorktreePrune(t,n){let r=new Date(this.now()),o=this.now(),s={taskId:t.taskId,command:t.command,trigger:n,...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString()};try{let i=E.AFK_WORKTREE_SWEEP_ROOT??process.cwd(),a=parseInt(E.AFK_WORKTREE_MAX_AGE_CLEAN??"",10)||14,l=parseInt(E.AFK_WORKTREE_MAX_AGE_DIRTY??"",10)||30,c=await _t({execFile:XL,repoRoot:i,dryRun:!1,maxAgeDaysClean:a,maxAgeDaysDirty:l,scope:"all",telemetryPath:this.telemetryPath()}),d=new Set(["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"]),u=c.dryRun?`\u{1F50D} worktree-prune (dry-run): would remove ${c.candidates.filter(f=>d.has(f.verdict)).length} worktree(s)`:`\u2702\uFE0F worktree-prune: removed ${c.removed.length}, warned ${c.warnings.length}`,p={...s,durationMs:this.now()-o,status:"success",responseExcerpt:u};return this.writeTelemetry(p,t),p}catch(i){let a={...s,durationMs:this.now()-o,status:"error",errorMessage:Sr(i instanceof Error?i.message:String(i))};return this.writeTelemetry(a,t),a}}spawnSession(){let{registry:t,memoryStore:n}=Er(void 0,"daemon"),r={model:"sonnet",permissionMode:"bypassPermissions",hookRegistry:t,...this.options.sessionConfig};return{session:this.options.sessionFactory?this.options.sessionFactory(r):new Ye(Ln(r)),memoryStore:n}}telemetryPath(){return this.options.telemetryPath??kt()}ensureTelemetrySink(){try{zL(JL(this.telemetryPath()),{recursive:!0})}catch{}}writeTelemetry(t,n){try{qL(this.telemetryPath(),`${JSON.stringify(t)}
2144
2146
  `,"utf-8"),this.fireOnTaskComplete(t,n)}catch(r){let o=r instanceof Error?r.message:String(r);console.error(`[daemon] telemetry write failed: ${o}`)}}fireOnTaskComplete(t,n){let r=this.options.onTaskComplete;if(r&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let o=r(t);o instanceof Promise&&o.catch(s=>{let i=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${i}`)})}catch(o){let s=o instanceof Error?o.message:String(o);console.error(`[daemon] onTaskComplete callback failed: ${s}`)}}};F();var oF=7777;async function Vw(e={}){let t=new el({...e.sessionConfig!==void 0?{sessionConfig:e.sessionConfig}:{},...e.telemetryPath!==void 0?{telemetryPath:e.telemetryPath}:{},...e.sessionFactory!==void 0?{sessionFactory:e.sessionFactory}:{},...e.cooldownMs!==void 0?{cooldownMs:e.cooldownMs}:{},...e.briefsDir!==void 0?{briefsDir:e.briefsDir}:{},...e.now!==void 0?{now:e.now}:{},...e.onTaskComplete!==void 0?{onTaskComplete:e.onTaskComplete}:{},...e.pullPollIntervalMs!==void 0?{pullPollIntervalMs:e.pullPollIntervalMs}:{},...e.queueDir!==void 0?{queueDir:e.queueDir}:{}});e.pullPollIntervalMs!==void 0&&e.pullPollIntervalMs>0&&t.startPullLoop();for(let s of e.tasks??[])t.register(s);let n=rF(or("default"),"port");tF(nF(n),{recursive:!0});let r=QL((s,i)=>iF(s,i,t)),o=await lF(r,e.port??oF);try{ZL(n,String(o),"utf-8")}catch{}return{port:o,scheduler:t,registerTask(s){t.register(s)},unregisterTask(s){t.unregister(s)},tickOnce(s){return t.tick(s)},fireOnStart(){return t.fireOnStart()},async stop(){await t.stop();try{eF(n)}catch{}await cF(r)}}}function sF(e){return new Promise((t,n)=>{let r=[];e.on("data",o=>r.push(o)),e.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),e.on("error",n)})}function iF(e,t,n){aF(e,t,n).catch(r=>{let o=r instanceof Error?r.message:String(r);t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:o}))})}async function aF(e,t,n){let r=e.url??"/";if(e.method==="GET"&&r==="/health"){let o=JSON.stringify({status:"ok",tasks:n.list().length});t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);return}if(e.method==="GET"&&r==="/tasks"){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(n.list()));return}if(e.method==="POST"&&r==="/tasks"){let o=await sF(e),s;try{s=JSON.parse(o)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"invalid JSON body"}));return}if(!s||typeof s!="object"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"body must be an object"}));return}let i=s;if(typeof i.taskId!="string"||typeof i.command!="string"||typeof i.cron!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron are required strings"}));return}let a={taskId:i.taskId,command:i.command,trigger:i.trigger??"cron",cronExpression:i.cron,...i.notifyOn!==void 0?{notifyOn:i.notifyOn}:{}};try{n.register(a)}catch(l){let c=l instanceof Error?l.message:String(l),d=c.includes("already registered")?409:400;t.writeHead(d,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:c}));return}t.writeHead(201,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}if(e.method==="DELETE"&&r.startsWith("/tasks/")){let o=r.slice(7);if(!o){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId required in URL"}));return}if(!n.list().some(i=>i.taskId===o)){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}));return}n.unregister(o),t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function lF(e,t){return new Promise((n,r)=>{e.once("error",r),e.listen(t,()=>{e.removeListener("error",r);let o=e.address();n(typeof o=="object"&&o?o.port:t)})})}function cF(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}F();So();function Yw(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<=0)throw new Error(`Invalid timeout-ms: '${n}' \u2014 must be a positive integer (milliseconds).`);return r}function Xw(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<0)throw new Error(`Invalid sessionstart-cooldown-ms: '${n}' \u2014 must be a non-negative integer (milliseconds).`);return r}function Qw(e,t){if(e!==void 0&&e!==""){if(e==="cron"||e==="sessionstart"||e==="both"||e==="pull")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both | pull.`)}return t!==void 0&&t!==""?"cron":"sessionstart"}var du="/forge-friction --auto",uu="default";function Jr(e){if(e!==void 0&&e.trim()!=="")return e}function Zw(e,t,n){return Jr(e)??Jr(t)??Jr(n)??du}function eS(e,t,n){return Jr(e)??Jr(t)??Jr(n)??uu}function pF(e){let t=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",n=(e.durationMs/1e3).toFixed(1),r=[`${t} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${n}s`];return e.skipReason&&r.push(`skipReason=${e.skipReason}`),e.errorMessage&&r.push(`error: ${e.errorMessage.slice(0,400)}`),e.responseExcerpt&&r.push("",e.responseExcerpt.slice(0,600)),r.join(`
2145
2147
  `)}function tS(e){e.command("daemon").description("Run agent-afk as a daemon that fires scheduled tasks (e.g. /forge-friction --auto)").option("-p, --port <number>","Control HTTP port","7777").option("-t, --task <command>",`Command to fire on each tick (default: ${du})`).option("-c, --cron <expression>",'Cron expression (e.g. "0 */6 * * *"). Required when --trigger includes cron.').option("-i, --task-id <id>",`Task identifier (default: ${uu})`).option("--once","Fire one tick and exit (for testing)",!1).option("--timeout-ms <ms>","Per-tick session timeout in ms. Overrides AFK_TIMEOUT_MS. Defaults to the session default (120000).").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--trigger <mode>","Trigger mode: cron | sessionstart | both | pull. Defaults to cron.").option("--sessionstart-cooldown-ms <ms>","Cooldown between Phase 6 sessionstart fires. Overrides AFK_SESSIONSTART_COOLDOWN_MS. Defaults to 6h.").option("--briefs-dir <path>","Override directory scanned for pending briefs (defaults to ~/.afk/agent-framework/briefs).").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').action(async t=>{let n=parseInt(t.port,10);(Number.isNaN(n)||n<=0)&&U(new Error(`Invalid port: ${t.port}`));let r=Ge(),o=Zw(t.task,E.AFK_DAEMON_TASK,r.daemon?.task),s=eS(t.taskId,E.AFK_DAEMON_TASK_ID,r.daemon?.taskId),i,a,l;try{i=Yw(t.timeoutMs,E.AFK_TIMEOUT_MS),a=Xw(t.sessionstartCooldownMs,E.AFK_SESSIONSTART_COOLDOWN_MS),l=Qw(t.trigger,t.cron)}catch(w){U(w)}(l==="cron"||l==="both")&&!t.cron&&U(new Error(`--cron is required when --trigger is '${l}'.`));let c,d;try{c=ln(t.thinking)??gr(),d=cn(t.effort)??hr()}catch(w){U(w)}let u=r.daemon?.worktreePrune,p=E.AFK_WORKTREE_PRUNE_DISABLE==="1",f=u?.cron??"0 4 * * *",g={taskId:"worktree-prune",command:"__BUILTIN_WORKTREE_PRUNE__",trigger:"cron",cronExpression:f},h=l==="pull"?[]:[{taskId:s,command:o,trigger:l,...t.cron!==void 0?{cronExpression:t.cron}:{}}];!p&&u?.enabled!==!1&&h.push(g);let b=lt();for(let w of b)w.enabled&&h.push(lf(w));if(t.dumpPrompt!==void 0&&t.dumpPrompt!==!1){let w=t.dumpPrompt===!0?dF.join(uF.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):t.dumpPrompt;process.env.AFK_DUMP_PROMPT=w}let y=0,S=6e4,T=(w,v)=>{let R=Date.now();if(R-y<S)return;y=R;let _=v instanceof Error?`${v.name}: ${v.message}`:String(v);ei(`\u{1F6D1} agent-afk daemon ${w}
@@ -2155,7 +2157,7 @@ ${_.slice(0,500)}`).catch(C=>{console.error("[daemon] crash notification push fa
2155
2157
  Installed plugins:`));for(let r of n){let o=e.plugins[r];if(!o)continue;let s=o.enabled?ae.green("enabled "):ae.yellow("disabled"),i=o.ref?ae.blue(o.ref):ae.gray("(local)"),a=ae.gray(o.source);t.log(` ${ae.bold(r.padEnd(30))} ${s} ${i.padEnd(12)} ${a}`)}t.log("")}function uS(e){switch(e.status){case"updated":return`${ae.green("\u2713")} ${ae.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}`;case"up-to-date":return`${ae.gray("\xB7")} ${ae.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${ae.gray("\xB7")} ${ae.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${ae.yellow("!")} ${ae.bold(e.name)}: plugin dir missing (${e.dir})`}}function CF(e,t){let n=uS(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}import ee from"chalk";import mu from"ora";F();function pS(e,t={}){let n=t.logger??console,r=t.cacheDir??Pt(),o=t.indexPath??re(),s={...t,cacheDir:r,indexPath:o},i=e.command("marketplace").description("Manage AFK plugin marketplaces (install / list / plugins / install-plugin / remove / update)");i.command("install <source> [name]").description("Clone or symlink a marketplace into the local plugin cache").option("-r, --ref <ref>","Install a specific tag, branch, or SHA").option("-f, --force","Replace an existing marketplace with the same name").action(async(a,l,c)=>{let d=mu(`Installing marketplace ${a}\u2026`).start();try{let u={...l?{name:l}:{},...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},p=await Pa(a,u,s),f=p.entry.ref?` (ref: ${p.entry.ref})`:"";d.succeed(ee.green(`Installed marketplace ${ee.bold(p.name)}`)+ee.gray(`${f} at ${p.dir}`)),n.log(ee.gray(` ${p.plugins.length} plugin(s) available \u2014 run \`afk marketplace plugins ${p.name}\` to list.`))}catch(u){d.fail("Failed"),U(u)}}),i.command("list").description("List installed marketplaces with their source and ref").option("-f, --format <format>","Output format (text|json)","text").action(a=>{let l=me(o),c=Object.entries(l.marketplaces);if(a.format==="json"){n.log(JSON.stringify({marketplaces:c.map(([d,u])=>({name:d,source:u.source,sourceType:u.sourceType,...u.ref?{ref:u.ref}:{}}))},null,2));return}if(c.length===0){n.log(ee.gray("No marketplaces installed.")),n.log(ee.gray(" Try: afk marketplace install griffinwork40/awa-private"));return}n.log(ee.cyan.bold(`
2156
2158
  Installed marketplaces:`));for(let[d,u]of c.sort()){let p=u.ref?ee.blue(u.ref):ee.gray("(local)"),f=ee.gray(u.source);n.log(` ${ee.bold(d.padEnd(30))} ${p.padEnd(12)} ${f}`)}n.log("")}),i.command("plugins <name>").description("List plugins inside a marketplace, with [installed] / [available] markers").option("-f, --format <format>","Output format (text|json)","text").action((a,l)=>{try{let c=$a(a,s);if(l.format==="json"){n.log(JSON.stringify({marketplace:a,plugins:c},null,2));return}if(c.length===0){n.log(ee.gray(`Marketplace "${a}" lists no plugins.`));return}n.log(ee.cyan.bold(`
2157
2159
  Plugins in ${a}:`)),c.forEach((d,u)=>{let p=d.installed?ee.green("[\u2713]"):ee.gray("[ ]"),f=d.description?ee.gray(` \u2014 ${d.description}`):"";n.log(` ${p} ${ee.bold((u+1).toString().padStart(2))}. ${ee.bold(d.name)}${f}`)}),n.log(ee.gray(`
2158
- Install one: afk plugin install ${a}:<plugin>`))}catch(c){U(c)}}),i.command("install-plugin <marketplace> <plugin>").description("Install a single plugin from a marketplace").option("-r, --ref <ref>","For git-sourced plugins, pin to a specific tag/branch/SHA").option("-f, --force","Replace an existing plugin with the same key").option("-y, --yes","Skip the install warning and countdown (non-interactive / CI)").action(async(a,l,c)=>{let d=process.stderr.isTTY===!0&&!c.yes,u=mu(`Installing ${a}:${l}\u2026`).start();try{let p=await zr(a,l,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},{...s,confirm:d});u.succeed(ee.green(`Installed ${ee.bold(p.key)}`)+ee.gray(` at ${p.dir}`))}catch(p){u.fail("Failed"),U(p)}}),i.command("remove <name>").description("Remove a marketplace and cascade-delete its installed plugins").action(a=>{let l=Ma(a,{cacheDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry&&l.removedPluginEntries.length===0){n.log(ee.gray(`No marketplace named "${a}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null,l.removedPluginEntries.length>0?`${l.removedPluginEntries.length} plugin entry`:null].filter(Boolean);if(n.log(ee.green(`Removed ${a}: ${c.join(" + ")}`)),l.removedPluginEntries.length>0)for(let d of l.removedPluginEntries)n.log(ee.gray(` - ${d}`))}),i.command("update [name]").description("Update one marketplace, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(a,l)=>{try{if(a){let c=mu(`Updating ${a}\u2026`).start(),d=await ts(a,l.ref?{ref:l.ref}:{},s);IF(d,c)}else{n.log(ee.cyan("Updating all marketplaces\u2026"));let c=await Lk(s);if(c.length===0){n.log(ee.gray(" (no marketplaces installed)"));return}for(let d of c)n.log(" "+mS(d))}}catch(c){U(c)}})}function mS(e){switch(e.status){case"updated":{let t=e.addedPlugins.length>0?` +${e.addedPlugins.join(", ")}`:"",n=e.removedPlugins.length>0?` -${e.removedPlugins.join(", ")}`:"";return`${ee.green("\u2713")} ${ee.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}${ee.gray(t+n)}`}case"up-to-date":return`${ee.gray("\xB7")} ${ee.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${ee.gray("\xB7")} ${ee.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${ee.yellow("!")} ${ee.bold(e.name)}: marketplace dir missing (${e.dir})`}}function IF(e,t){let n=mS(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}H();import{access as PF,constants as MF,mkdir as OF,readFile as $F}from"fs/promises";import{execSync as DF}from"child_process";F();async function LF(){return oe()?{name:"Anthropic API Key",state:"pass",detail:"ANTHROPIC_API_KEY set"}:{name:"Anthropic API Key",state:"fail",fix:"Set ANTHROPIC_API_KEY or run `afk login`"}}async function FF(){return Do()?{name:"Codex/OpenAI API Key",state:"pass",detail:"OPENAI_API_KEY or CODEX_API_KEY set"}:{name:"Codex/OpenAI API Key",state:"warn",fix:"Set OPENAI_API_KEY or CODEX_API_KEY to use Codex models"}}async function NF(){try{let t=`${DF("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(E.PATH??"").split(":").map(r=>r.replace(/\/$/,"")).includes(t)?{name:"npm bin on PATH",state:"pass",detail:t}:{name:"npm bin on PATH",state:"fail",detail:t,fix:`Add ${t} to PATH: echo 'export PATH="${t}:$PATH"' >> ~/.zshrc`}}catch{return{name:"npm bin on PATH",state:"warn",detail:"could not query npm prefix"}}}async function fu(e,t){let n=t();try{return await PF(n,MF.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await OF(n,{recursive:!0}),{name:e,state:"pass",detail:`${n} (created)`}}catch{return{name:e,state:"fail",detail:n,fix:`Unable to create or write to ${n}`}}}}async function UF(){let e=Es();try{let t=await $F(e,"utf-8");return JSON.parse(t),{name:"Config File",state:"pass",detail:`${e} (valid JSON)`}}catch(t){return t.code==="ENOENT"?{name:"Config File",state:"pass",detail:"no config file (using defaults)"}:{name:"Config File",state:"fail",detail:e,fix:`Unable to parse config file: ${t instanceof Error?t.message:"unknown error"}`}}}async function jF(){let e=Vu();return e.length===0?null:{name:"Required env vars",state:"fail",detail:`Missing: ${e.map(t=>t.name).join(", ")}`,fix:"Set these env vars before running. See docs/env-registry.md for descriptions."}}async function BF(){let e=E.AFK_TELEGRAM_BOT_TOKEN;if(!e)return null;try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://api.telegram.org/bot${e}/getMe`,{signal:t.signal});if(clearTimeout(n),r.ok){let s=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:s?`@${s}`:"connected"}}return{name:"Telegram Bot",state:"fail",fix:`Telegram API returned ${r.status}. Check AFK_TELEGRAM_BOT_TOKEN.`}}catch(t){return t.name==="AbortError"?{name:"Telegram Bot",state:"warn",detail:"connection timeout"}:{name:"Telegram Bot",state:"warn",detail:`network error: ${t instanceof Error?t.message:"unknown"}`}}}function fS(e){e.command("doctor").description("Check system health and configuration").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=[];n.push(await LF()),n.push(await FF()),n.push(await NF()),n.push(await fu("Config Directory",xn)),n.push(await fu("State Directory",he)),n.push(await fu("Logs Directory",Gt)),n.push(await UF());let r=await jF();r!==null&&n.push(r);let o=await BF();o!==null&&n.push(o);let s={passed:n.filter(i=>i.state==="pass").length,warned:n.filter(i=>i.state==="warn").length,failed:n.filter(i=>i.state==="fail").length};t.format==="json"?console.log(JSON.stringify({checks:n,summary:s},null,2)):(n.forEach(i=>{let a;i.state==="pass"?a=m.success("\u2713"):i.state==="warn"?a=m.warning("\u26A0"):a=m.error("\u2717");let l=`${a} ${i.name}`;i.detail&&(l+=` \u2014 ${i.detail}`),console.log(l),i.state==="fail"&&i.fix&&console.log(` Fix: ${i.fix}`)}),console.log(`
2160
+ Install one: afk plugin install ${a}:<plugin>`))}catch(c){U(c)}}),i.command("install-plugin <marketplace> <plugin>").description("Install a single plugin from a marketplace").option("-r, --ref <ref>","For git-sourced plugins, pin to a specific tag/branch/SHA").option("-f, --force","Replace an existing plugin with the same key").option("-y, --yes","Skip the install warning and countdown (non-interactive / CI)").action(async(a,l,c)=>{let d=process.stderr.isTTY===!0&&!c.yes,u=mu(`Installing ${a}:${l}\u2026`).start();try{let p=await zr(a,l,{...c.ref?{ref:c.ref}:{},...c.force?{force:!0}:{}},{...s,confirm:d});u.succeed(ee.green(`Installed ${ee.bold(p.key)}`)+ee.gray(` at ${p.dir}`))}catch(p){u.fail("Failed"),U(p)}}),i.command("remove <name>").description("Remove a marketplace and cascade-delete its installed plugins").action(a=>{let l=Ma(a,{cacheDir:r,indexPath:o});if(!l.removedDir&&!l.removedIndexEntry&&l.removedPluginEntries.length===0){n.log(ee.gray(`No marketplace named "${a}" to remove.`));return}let c=[l.removedDir?"directory":null,l.removedIndexEntry?"index entry":null,l.removedPluginEntries.length>0?`${l.removedPluginEntries.length} plugin entry`:null].filter(Boolean);if(n.log(ee.green(`Removed ${a}: ${c.join(" + ")}`)),l.removedPluginEntries.length>0)for(let d of l.removedPluginEntries)n.log(ee.gray(` - ${d}`))}),i.command("update [name]").description("Update one marketplace, or all if no name is given").option("-r, --ref <ref>","Pin to a specific ref instead of the latest tag").action(async(a,l)=>{try{if(a){let c=mu(`Updating ${a}\u2026`).start(),d=await ts(a,l.ref?{ref:l.ref}:{},s);IF(d,c)}else{n.log(ee.cyan("Updating all marketplaces\u2026"));let c=await Lk(s);if(c.length===0){n.log(ee.gray(" (no marketplaces installed)"));return}for(let d of c)n.log(" "+mS(d))}}catch(c){U(c)}})}function mS(e){switch(e.status){case"updated":{let t=e.addedPlugins.length>0?` +${e.addedPlugins.join(", ")}`:"",n=e.removedPlugins.length>0?` -${e.removedPlugins.join(", ")}`:"";return`${ee.green("\u2713")} ${ee.bold(e.name)}: ${e.fromRef??"(none)"} \u2192 ${e.toRef}${ee.gray(t+n)}`}case"up-to-date":return`${ee.gray("\xB7")} ${ee.bold(e.name)}: up-to-date (${e.ref})`;case"skipped-local":return`${ee.gray("\xB7")} ${ee.bold(e.name)}: skipped (local source)`;case"missing-dir":return`${ee.yellow("!")} ${ee.bold(e.name)}: marketplace dir missing (${e.dir})`}}function IF(e,t){let n=mS(e);e.status==="updated"?t.succeed(n):e.status==="up-to-date"||e.status==="skipped-local"?t.info(n):t.warn(n)}K();import{access as PF,constants as MF,mkdir as OF,readFile as $F}from"fs/promises";import{execSync as DF}from"child_process";F();async function LF(){return oe()?{name:"Anthropic API Key",state:"pass",detail:"ANTHROPIC_API_KEY set"}:{name:"Anthropic API Key",state:"fail",fix:"Set ANTHROPIC_API_KEY or run `afk login`"}}async function FF(){return Do()?{name:"Codex/OpenAI API Key",state:"pass",detail:"OPENAI_API_KEY or CODEX_API_KEY set"}:{name:"Codex/OpenAI API Key",state:"warn",fix:"Set OPENAI_API_KEY or CODEX_API_KEY to use Codex models"}}async function NF(){try{let t=`${DF("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(E.PATH??"").split(":").map(r=>r.replace(/\/$/,"")).includes(t)?{name:"npm bin on PATH",state:"pass",detail:t}:{name:"npm bin on PATH",state:"fail",detail:t,fix:`Add ${t} to PATH: echo 'export PATH="${t}:$PATH"' >> ~/.zshrc`}}catch{return{name:"npm bin on PATH",state:"warn",detail:"could not query npm prefix"}}}async function fu(e,t){let n=t();try{return await PF(n,MF.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await OF(n,{recursive:!0}),{name:e,state:"pass",detail:`${n} (created)`}}catch{return{name:e,state:"fail",detail:n,fix:`Unable to create or write to ${n}`}}}}async function UF(){let e=Es();try{let t=await $F(e,"utf-8");return JSON.parse(t),{name:"Config File",state:"pass",detail:`${e} (valid JSON)`}}catch(t){return t.code==="ENOENT"?{name:"Config File",state:"pass",detail:"no config file (using defaults)"}:{name:"Config File",state:"fail",detail:e,fix:`Unable to parse config file: ${t instanceof Error?t.message:"unknown error"}`}}}async function jF(){let e=Vu();return e.length===0?null:{name:"Required env vars",state:"fail",detail:`Missing: ${e.map(t=>t.name).join(", ")}`,fix:"Set these env vars before running. See docs/env-registry.md for descriptions."}}async function BF(){let e=E.AFK_TELEGRAM_BOT_TOKEN;if(!e)return null;try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://api.telegram.org/bot${e}/getMe`,{signal:t.signal});if(clearTimeout(n),r.ok){let s=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:s?`@${s}`:"connected"}}return{name:"Telegram Bot",state:"fail",fix:`Telegram API returned ${r.status}. Check AFK_TELEGRAM_BOT_TOKEN.`}}catch(t){return t.name==="AbortError"?{name:"Telegram Bot",state:"warn",detail:"connection timeout"}:{name:"Telegram Bot",state:"warn",detail:`network error: ${t instanceof Error?t.message:"unknown"}`}}}function fS(e){e.command("doctor").description("Check system health and configuration").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=[];n.push(await LF()),n.push(await FF()),n.push(await NF()),n.push(await fu("Config Directory",xn)),n.push(await fu("State Directory",he)),n.push(await fu("Logs Directory",Gt)),n.push(await UF());let r=await jF();r!==null&&n.push(r);let o=await BF();o!==null&&n.push(o);let s={passed:n.filter(i=>i.state==="pass").length,warned:n.filter(i=>i.state==="warn").length,failed:n.filter(i=>i.state==="fail").length};t.format==="json"?console.log(JSON.stringify({checks:n,summary:s},null,2)):(n.forEach(i=>{let a;i.state==="pass"?a=m.success("\u2713"):i.state==="warn"?a=m.warning("\u26A0"):a=m.error("\u2717");let l=`${a} ${i.name}`;i.detail&&(l+=` \u2014 ${i.detail}`),console.log(l),i.state==="fail"&&i.fix&&console.log(` Fix: ${i.fix}`)}),console.log(`
2159
2161
  Summary: ${s.passed} passed, ${s.warned} warned, ${s.failed} failed`)),process.exit(s.failed>0?1:0)})}function WF(e){let t=Ro(e),n=_o(t),r=t.apiKey===null?1:0,o={source:t.source,message:n,exitCode:r};return t.last4!==void 0&&(o.last4=t.last4),o}function gS(e){e.command("provider").description("Provider diagnostics and configuration").command("auth").description("Inspect provider auth state").command("diagnose").description("Report which OpenAI auth source would be used by the openai-compatible provider. Never prints raw tokens.").option("-f, --format <format>","Output format (text|json)","text").action(r=>{let o=WF(void 0);if(r.format==="json"){let s={source:o.source,message:o.message,ok:o.exitCode===0};o.last4!==void 0&&(s.last4=o.last4),console.log(JSON.stringify(s,null,2))}else{let s=o.exitCode===0?m.success("\u2713"):m.warning("\u26A0");console.log(`${s} ${o.message}`)}process.exit(o.exitCode)})}var HF=["chat","interactive","status","config","daemon","login","plugin","doctor","completion"],KF=["install","update","list","remove","enable","disable"],gu=["sonnet","opus","haiku"],hu=["json","text"],yu=["cron","sessionstart","both"];function yt(e){return e.join(" ")}function GF(){let e=yt(gu),t=yt(hu),n=yt(yu);return`#compdef afk
2160
2162
 
2161
2163
  _afk() {
@@ -2254,7 +2256,7 @@ complete -c afk -n '__fish_seen_subcommand_from plugin' -a 'disable' -d 'Disable
2254
2256
  complete -c afk -l model -s m -x -a '${e}' -d 'Model to use'
2255
2257
  complete -c afk -l format -s f -x -a '${t}' -d 'Output format'
2256
2258
  complete -c afk -l trigger -x -a '${n}' -d 'Trigger type'`}function hS(e){e.command("completion <shell>").description("Emit shell completion script (zsh|bash|fish)").action(t=>{let n=["zsh","bash","fish"];if(!n.includes(t)){e.error(`unknown shell: ${t}. Choose from: ${n.join(", ")}`);return}let r="";switch(t){case"zsh":r=GF();break;case"bash":r=zF();break;case"fish":r=qF();break}console.log(r)})}import fe from"chalk";import{spawn as lN}from"child_process";import{existsSync as cN,readFileSync as dN}from"fs";F();import{execFileSync as JF,spawn as VF}from"child_process";import{existsSync as Xr,mkdirSync as yS,readFileSync as rl,statSync as YF,unlinkSync as ol,writeFileSync as XF,openSync as bS}from"fs";import{join as Yr,dirname as bu}from"path";import{fileURLToPath as QF}from"url";var ZF=bu(QF(import.meta.url));function wu(){let e=Yr(he(),"telegram");return{pidFile:Yr(e,"bot.pid"),logFile:Yr(Gt(),"telegram.log")}}function us(e){if(!Xr(e))return null;let t=rl(e,"utf-8").trim(),n=Number.parseInt(t,10);if(!Number.isFinite(n)||n<=0)return ol(e),null;try{return process.kill(n,0),n}catch{return ol(e),null}}function Su(e=ZF,t=Xr){let n=[Yr(e,"telegram.mjs"),Yr(e,"..","telegram.js"),Yr(e,"..","telegram.ts")];for(let r of n)if(t(r))return r;throw new Error(`Telegram entrypoint not found. Searched: ${n.join(", ")}`)}async function vu(){let{pidFile:e,logFile:t}=wu(),n=us(e);if(n!==null)return{kind:"already-running",pid:n,message:`Bot already running (PID ${n}). Use 'afk telegram stop' first.`};yS(bu(e),{recursive:!0}),yS(bu(t),{recursive:!0});let r=Su(),o=bS(t,"a"),s=bS(t,"a"),i;try{i=VF(process.execPath,[r],{detached:!0,stdio:["ignore",o,s],env:process.env})}catch(a){return{kind:"spawn-failed",message:`Failed to spawn bot: ${a.message}`}}return i.pid===void 0?{kind:"spawn-failed",message:"Spawned child has no PID"}:(XF(e,String(i.pid),{mode:420}),i.unref(),await new Promise(a=>setTimeout(a,1500)),us(e)===null?{kind:"exited-immediately",logTail:ku(t,20),message:"Bot exited immediately after launch. Check the log for details."}:{kind:"started",pid:i.pid,logFile:t})}async function Tu(){let{pidFile:e}=wu(),t=us(e);if(t===null)return{kind:"not-running"};try{process.kill(t,"SIGTERM")}catch{return Xr(e)&&ol(e),{kind:"stopped",pid:t}}for(let n=0;n<50;n++)if(await new Promise(r=>setTimeout(r,100)),us(e)===null)return{kind:"stopped",pid:t};try{process.kill(t,"SIGKILL")}catch{}return Xr(e)&&ol(e),{kind:"force-killed",pid:t}}function Eu(){let{pidFile:e,logFile:t}=wu(),n=us(e),r={running:n!==null,pidFile:e,logFile:t};if(n===null)return{...r,logTail:ku(t,10)};let o=eN(n);return{...r,pid:n,...o,logTail:ku(t,10)}}function ku(e,t){if(!Xr(e))return[];try{let r=rl(e,"utf-8").split(`
2257
- `);return r.length>0&&r[r.length-1]===""&&r.pop(),r.slice(-t)}catch{return[]}}function eN(e){try{if(process.platform==="linux"){let t=`/proc/${e}/stat`;if(!Xr(t))return{};let r=rl(t,"utf-8").split(" "),o=Number.parseInt(r[21]??"0",10),l=YF("/proc/1").mtimeMs/1e3+o/100,c=Math.floor(Date.now()/1e3-l),u=rl(`/proc/${e}/status`,"utf-8").match(/VmRSS:\s+(\d+)\s+kB/),p=u?Math.round(Number.parseInt(u[1]??"0",10)/1024):void 0;return{uptimeSec:c,memoryMb:p}}if(process.platform==="darwin"){let t=JF("ps",["-p",String(e),"-o","etime=,rss="],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim(),[n,r]=t.split(/\s+/);return{uptimeSec:tN(n??""),memoryMb:r?Math.round(Number.parseInt(r,10)/1024):void 0}}}catch{}return{}}function tN(e){if(!e)return;let t=e.split("-"),n=0,r=e;t.length===2&&(n=Number.parseInt(t[0]??"0",10),r=t[1]??"");let o=r.split(":").map(l=>Number.parseInt(l,10));if(o.some(l=>!Number.isFinite(l)))return;let s=0,i=0,a=0;if(o.length===3)[s,i,a]=o;else if(o.length===2)[i,a]=o;else if(o.length===1)[a]=o;else return;return n*86400+s*3600+i*60+a}import{existsSync as nN,readFileSync as rN}from"fs";import{createInterface as oN}from"readline";import Se from"chalk";F();H();var wS="https://api.telegram.org";function SS(e,t){if(!nN(e))return;let n=rN(e,"utf-8");for(let r of n.split(`
2259
+ `);return r.length>0&&r[r.length-1]===""&&r.pop(),r.slice(-t)}catch{return[]}}function eN(e){try{if(process.platform==="linux"){let t=`/proc/${e}/stat`;if(!Xr(t))return{};let r=rl(t,"utf-8").split(" "),o=Number.parseInt(r[21]??"0",10),l=YF("/proc/1").mtimeMs/1e3+o/100,c=Math.floor(Date.now()/1e3-l),u=rl(`/proc/${e}/status`,"utf-8").match(/VmRSS:\s+(\d+)\s+kB/),p=u?Math.round(Number.parseInt(u[1]??"0",10)/1024):void 0;return{uptimeSec:c,memoryMb:p}}if(process.platform==="darwin"){let t=JF("ps",["-p",String(e),"-o","etime=,rss="],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim(),[n,r]=t.split(/\s+/);return{uptimeSec:tN(n??""),memoryMb:r?Math.round(Number.parseInt(r,10)/1024):void 0}}}catch{}return{}}function tN(e){if(!e)return;let t=e.split("-"),n=0,r=e;t.length===2&&(n=Number.parseInt(t[0]??"0",10),r=t[1]??"");let o=r.split(":").map(l=>Number.parseInt(l,10));if(o.some(l=>!Number.isFinite(l)))return;let s=0,i=0,a=0;if(o.length===3)[s,i,a]=o;else if(o.length===2)[i,a]=o;else if(o.length===1)[a]=o;else return;return n*86400+s*3600+i*60+a}import{existsSync as nN,readFileSync as rN}from"fs";import{createInterface as oN}from"readline";import Se from"chalk";F();K();var wS="https://api.telegram.org";function SS(e,t){if(!nN(e))return;let n=rN(e,"utf-8");for(let r of n.split(`
2258
2260
  `)){let o=r.trim();if(!o||o.startsWith("#"))continue;let s=o.indexOf("=");if(s===-1||o.slice(0,s).trim()!==t)continue;let a=o.slice(s+1).trim();return(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),a}}async function vS(e){let t=SS(e,"TELEGRAM_BOT_TOKEN");if(!t)return{set:!1,valid:!1,reason:"unset"};let n=await xu(t);return n?{set:!0,valid:!0,botId:n.id,...n.username!==void 0?{username:n.username}:{}}:{set:!0,valid:!1,reason:"unauthorized"}}async function TS(e,t={}){let n=SS(e,"TELEGRAM_BOT_TOKEN");if(!n)return{found:!1,chats:[],reason:"unset"};let r=t.timeoutSec??60,o=2e3,s=Math.max(1,Math.ceil(r*1e3/o)),i=await ES(n,{maxAttempts:s,intervalMs:o});return i.length===0?{found:!1,chats:[],reason:"timeout"}:{found:!0,chats:i}}async function xu(e){try{let t=await fetch(`${wS}/bot${e}/getMe`);if(!t.ok)return null;let n=await t.json();return!n.ok||!n.result?.id||!n.result?.first_name?null:{id:n.result.id,...n.result.username!==void 0?{username:n.result.username}:{},firstName:n.result.first_name}}catch{return null}}function sN(e){let t=new Map;for(let n of e){let o=(n.message??n.edited_message)?.chat;!o||typeof o.id!="number"||t.set(o.id,{chatId:o.id,type:o.type??"unknown",...o.username!==void 0?{username:o.username}:{},...o.first_name!==void 0?{firstName:o.first_name}:{}})}return[...t.values()].reverse()}async function iN(e){try{let t=await fetch(`${wS}/bot${e}/getUpdates`);if(!t.ok)return[];let n=await t.json();return!n.ok||!Array.isArray(n.result)?[]:n.result}catch{return[]}}async function ES(e,t={}){let n=t.maxAttempts??30,r=t.intervalMs??2e3;for(let o=0;o<n;o++){let s=await iN(e),i=sN(s);if(i.length>0)return i;o<n-1&&await new Promise(a=>setTimeout(a,r))}return[]}function kS(e){let t=oN({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,r=>{t.close(),n(r.trim())})})}function aN(e){return process.stdin.isTTY||(console.error(Se.red(`Cannot securely prompt for secret on a non-TTY stdin: "${e.trim()}"`)),console.error(Se.gray(" Supply TELEGRAM_BOT_TOKEN via environment variable or ~/.afk/config/afk.env instead.")),process.exit(1)),new Promise(t=>{process.stdout.write(e);let n=[];process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf-8");let r=o=>{o==="\r"||o===`
2259
2261
  `||o===""?(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",r),process.stdout.write(`
2260
2262
  `),t(n.join("").trim())):o===""?(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdout.write(`
@@ -2265,7 +2267,7 @@ Multiple chats found:`)),o.forEach((l,c)=>{let d=l.username?`@${l.username}`:l.f
2265
2267
  `),process.exit(2));let o=Je();Ht(o,"AFK_TELEGRAM_ALLOWED_CHAT_IDS",String(r)),process.stdout.write(JSON.stringify({ok:!0,path:o})+`
2266
2268
  `)}),t.command("start").description("Start the bot as a background daemon").action(async()=>{let n=await vu();if(n.kind==="started"){console.log(fe.green(`\u2713 Bot started (PID ${n.pid})`)),console.log(fe.gray(` Logs: ${n.logFile}`)),console.log(fe.gray(" Tail with: afk telegram logs --follow"));return}if(n.kind==="already-running"&&(console.log(fe.yellow(`\u26A0 ${n.message}`)),process.exit(1)),n.kind==="exited-immediately"){if(console.error(fe.red(`\u2717 ${n.message}`)),n.logTail&&n.logTail.length>0){console.error(""),console.error(fe.bold("Last log entries:"));for(let r of n.logTail)console.error(fe.gray(` ${r}`))}process.exit(1)}console.error(fe.red(`\u2717 ${n.message}`)),process.exit(1)}),t.command("stop").description("Stop the bot (SIGTERM, then SIGKILL after 5s)").action(async()=>{let n=await Tu();if(n.kind==="not-running"){console.log(fe.yellow("\u26A0 Bot is not running"));return}if(n.kind==="stopped"){console.log(fe.green(`\u2713 Bot stopped (PID ${n.pid})`));return}console.log(fe.yellow(`\u26A0 Bot force-killed (PID ${n.pid}); graceful shutdown timed out`))}),t.command("restart").description("Stop and restart the bot").action(async()=>{let n=await Tu();(n.kind==="stopped"||n.kind==="force-killed")&&console.log(fe.gray(`Stopped (PID ${n.pid})`));let r=await vu();if(r.kind==="started"){console.log(fe.green(`\u2713 Bot restarted (PID ${r.pid})`));return}console.error(fe.red(`\u2717 Restart failed: ${r.message}`)),process.exit(1)}),t.command("status").description("Show running state, uptime, memory, and recent log entries").action(()=>{let n=Eu();uN(n)}),t.command("logs").description("Show or follow the bot log").option("-f, --follow","Stream new log entries (like tail -f)",!1).option("-n, --lines <count>","Number of trailing lines to show","50").action(n=>{let{logFile:r}=Eu();if(!cN(r)){console.log(fe.yellow(`No log file at ${r}`)),console.log(fe.gray("Start the bot first: afk telegram start"));return}let o=Number.parseInt(n.lines??"50",10);if(n.follow){lN("tail",["-n",String(o),"-f",r],{stdio:"inherit"}).on("error",a=>{console.error(fe.red(`Failed to spawn tail: ${a.message}`))});return}let s=dN(r,"utf-8").split(`
2267
2269
  `).slice(-o-1);console.log(s.join(`
2268
- `))})}function uN(e){if(console.log(fe.bold("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${fe.green("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${pN(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${fe.red("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(fe.bold("Recent log entries:"));for(let t of e.logTail)console.log(fe.gray(` ${t}`))}}function pN(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m ${e%60}s`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}H();import J from"chalk";import{spawn as CN}from"child_process";import{existsSync as IN,readFileSync as PN}from"fs";F();import{execFileSync as mN,spawn as fN}from"child_process";import{existsSync as er,mkdirSync as RS,readFileSync as sl,statSync as gN,unlinkSync as il,writeFileSync as hN,openSync as _S}from"fs";import{join as ps,dirname as Ru}from"path";import{fileURLToPath as yN}from"url";var Au=Ru(yN(import.meta.url));function Cu(){let e=ps(he(),"threads");return{pidFile:ps(e,"poller.pid"),logFile:ps(Gt(),"threads.log")}}function ms(e){if(!er(e))return null;let t=sl(e,"utf-8").trim(),n=Number.parseInt(t,10);if(!Number.isFinite(n)||n<=0)return il(e),null;try{return process.kill(n,0),n}catch{return il(e),null}}function bN(){let e=ps(Au,"..","threads.js");if(er(e))return e;let t=ps(Au,"..","threads.ts");if(er(t))return t;throw new Error(`Threads entrypoint not found near ${Au}`)}async function Iu(){let{pidFile:e,logFile:t}=Cu(),n=ms(e);if(n!==null)return{kind:"already-running",pid:n,message:`Poller already running (PID ${n}). Use 'afk threads stop' first.`};RS(Ru(e),{recursive:!0}),RS(Ru(t),{recursive:!0});let r=bN(),o=_S(t,"a"),s=_S(t,"a"),i;try{i=fN(process.execPath,[r],{detached:!0,stdio:["ignore",o,s],env:process.env})}catch(a){return{kind:"spawn-failed",message:`Failed to spawn poller: ${a.message}`}}return i.pid===void 0?{kind:"spawn-failed",message:"Spawned child has no PID"}:(hN(e,String(i.pid),{mode:420}),i.unref(),await new Promise(a=>setTimeout(a,1500)),ms(e)===null?{kind:"exited-immediately",logTail:_u(t,20),message:"Poller exited immediately after launch. Check the log for details."}:{kind:"started",pid:i.pid,logFile:t})}async function Pu(){let{pidFile:e}=Cu(),t=ms(e);if(t===null)return{kind:"not-running"};try{process.kill(t,"SIGTERM")}catch{return er(e)&&il(e),{kind:"stopped",pid:t}}for(let n=0;n<50;n++)if(await new Promise(r=>setTimeout(r,100)),ms(e)===null)return{kind:"stopped",pid:t};try{process.kill(t,"SIGKILL")}catch{}return er(e)&&il(e),{kind:"force-killed",pid:t}}function Mu(){let{pidFile:e,logFile:t}=Cu(),n=ms(e),r={running:n!==null,pidFile:e,logFile:t};if(n===null)return{...r,logTail:_u(t,10)};let o=kN(n);return{...r,pid:n,...o,logTail:_u(t,10)}}function _u(e,t){if(!er(e))return[];try{let r=sl(e,"utf-8").split(`
2270
+ `))})}function uN(e){if(console.log(fe.bold("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${fe.green("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${pN(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${fe.red("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(fe.bold("Recent log entries:"));for(let t of e.logTail)console.log(fe.gray(` ${t}`))}}function pN(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m ${e%60}s`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}K();import J from"chalk";import{spawn as CN}from"child_process";import{existsSync as IN,readFileSync as PN}from"fs";F();import{execFileSync as mN,spawn as fN}from"child_process";import{existsSync as er,mkdirSync as RS,readFileSync as sl,statSync as gN,unlinkSync as il,writeFileSync as hN,openSync as _S}from"fs";import{join as ps,dirname as Ru}from"path";import{fileURLToPath as yN}from"url";var Au=Ru(yN(import.meta.url));function Cu(){let e=ps(he(),"threads");return{pidFile:ps(e,"poller.pid"),logFile:ps(Gt(),"threads.log")}}function ms(e){if(!er(e))return null;let t=sl(e,"utf-8").trim(),n=Number.parseInt(t,10);if(!Number.isFinite(n)||n<=0)return il(e),null;try{return process.kill(n,0),n}catch{return il(e),null}}function bN(){let e=ps(Au,"..","threads.js");if(er(e))return e;let t=ps(Au,"..","threads.ts");if(er(t))return t;throw new Error(`Threads entrypoint not found near ${Au}`)}async function Iu(){let{pidFile:e,logFile:t}=Cu(),n=ms(e);if(n!==null)return{kind:"already-running",pid:n,message:`Poller already running (PID ${n}). Use 'afk threads stop' first.`};RS(Ru(e),{recursive:!0}),RS(Ru(t),{recursive:!0});let r=bN(),o=_S(t,"a"),s=_S(t,"a"),i;try{i=fN(process.execPath,[r],{detached:!0,stdio:["ignore",o,s],env:process.env})}catch(a){return{kind:"spawn-failed",message:`Failed to spawn poller: ${a.message}`}}return i.pid===void 0?{kind:"spawn-failed",message:"Spawned child has no PID"}:(hN(e,String(i.pid),{mode:420}),i.unref(),await new Promise(a=>setTimeout(a,1500)),ms(e)===null?{kind:"exited-immediately",logTail:_u(t,20),message:"Poller exited immediately after launch. Check the log for details."}:{kind:"started",pid:i.pid,logFile:t})}async function Pu(){let{pidFile:e}=Cu(),t=ms(e);if(t===null)return{kind:"not-running"};try{process.kill(t,"SIGTERM")}catch{return er(e)&&il(e),{kind:"stopped",pid:t}}for(let n=0;n<50;n++)if(await new Promise(r=>setTimeout(r,100)),ms(e)===null)return{kind:"stopped",pid:t};try{process.kill(t,"SIGKILL")}catch{}return er(e)&&il(e),{kind:"force-killed",pid:t}}function Mu(){let{pidFile:e,logFile:t}=Cu(),n=ms(e),r={running:n!==null,pidFile:e,logFile:t};if(n===null)return{...r,logTail:_u(t,10)};let o=kN(n);return{...r,pid:n,...o,logTail:_u(t,10)}}function _u(e,t){if(!er(e))return[];try{let r=sl(e,"utf-8").split(`
2269
2271
  `);return r.length>0&&r[r.length-1]===""&&r.pop(),r.slice(-t)}catch{return[]}}function kN(e){try{if(process.platform==="linux"){let t=`/proc/${e}/stat`;if(!er(t))return{};let r=sl(t,"utf-8").split(" "),o=Number.parseInt(r[21]??"0",10),l=gN("/proc/1").mtimeMs/1e3+o/100,c=Math.floor(Date.now()/1e3-l),u=sl(`/proc/${e}/status`,"utf-8").match(/VmRSS:\s+(\d+)\s+kB/),p=u?Math.round(Number.parseInt(u[1]??"0",10)/1024):void 0;return{uptimeSec:c,memoryMb:p}}if(process.platform==="darwin"){let t=mN("ps",["-p",String(e),"-o","etime=,rss="],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim(),[n,r]=t.split(/\s+/);return{uptimeSec:wN(n??""),memoryMb:r?Math.round(Number.parseInt(r,10)/1024):void 0}}}catch{}return{}}function wN(e){if(!e)return;let t=e.split("-"),n=0,r=e;t.length===2&&(n=Number.parseInt(t[0]??"0",10),r=t[1]??"");let o=r.split(":").map(l=>Number.parseInt(l,10));if(o.some(l=>!Number.isFinite(l)))return;let s=0,i=0,a=0;if(o.length===3)[s,i,a]=o;else if(o.length===2)[i,a]=o;else if(o.length===1)[a]=o;else return;return n*86400+s*3600+i*60+a}import{existsSync as SN,readFileSync as vN}from"fs";import{homedir as TN}from"os";import{join as EN}from"path";function xN(){return EN(TN(),".config","threads-cli","config.json")}function CS(e,t){let r=(e??process.env).THREADS_ACCESS_TOKEN;if(r!==void 0&&r.trim().length>0)return{kind:"env",token:r.trim()};let o=t??xN();if(!SN(o))return{kind:"missing",path:o,reason:`No THREADS_ACCESS_TOKEN env var and no config file at ${o}. Run \`threads config set-token <token>\` or export THREADS_ACCESS_TOKEN.`};try{let s=vN(o,"utf-8"),a=JSON.parse(s).access_token;return typeof a!="string"||a.trim().length===0?{kind:"missing",path:o,reason:`Config file at ${o} has no .access_token string. Run \`threads config set-token <token>\`.`}:{kind:"file",token:a.trim(),path:o}}catch(s){return{kind:"missing",path:o,reason:`Config file at ${o} unreadable or not JSON: ${s.message}`}}}var al="https://graph.threads.net/v1.0",ut=class extends Error{constructor(n){super(n.message);this.detail=n;this.name="ThreadsApiError"}detail};function AN(e,t,n=al){let r=(e.fields??["id","username","text","timestamp","permalink","replied_to","root_post"]).join(","),o=new URLSearchParams;return o.set("fields",r),e.sinceSec!==void 0&&o.set("since",String(e.sinceSec)),e.limit!==void 0&&o.set("limit",String(e.limit)),o.set("access_token",t),`${n}/me/mentions?${o.toString()}`}function RN(e,t=al){let n=new URLSearchParams;return n.set("fields","id,username"),n.set("access_token",e),`${t}/me?${n.toString()}`}async function IS(e){let t="";try{t=await e.text()}catch{}let n=t||e.statusText||`HTTP ${e.status}`;if(e.status===401||e.status===403)return{kind:"auth",status:e.status,message:n};if(e.status===429){let r=e.headers.get("retry-after"),o=r?Number.parseInt(r,10):void 0;return{kind:"rate-limit",status:e.status,...Number.isFinite(o)?{retryAfterSec:o}:{},message:n}}return{kind:"http",status:e.status,message:n}}async function PS(e,t=fetch,n=al){let r;try{r=await t(RN(e,n))}catch(i){throw new ut({kind:"network",message:i.message})}if(!r.ok)throw new ut(await IS(r));let o;try{o=await r.json()}catch(i){throw new ut({kind:"parse",message:i.message})}if(typeof o!="object"||o===null||typeof o.id!="string"||typeof o.username!="string")throw new ut({kind:"parse",message:`/me did not return {id, username}: ${JSON.stringify(o).slice(0,200)}`});let s=o;return{id:s.id,username:s.username}}function _N(e){if(typeof e!="object"||e===null)return null;let t=e;if(typeof t.id!="string"||typeof t.username!="string")return null;let n={id:t.id,username:t.username,text:typeof t.text=="string"?t.text:"",timestamp:typeof t.timestamp=="string"?t.timestamp:"",permalink:typeof t.permalink=="string"?t.permalink:""},r=t.replied_to;if(typeof r=="object"&&r!==null){let s=r.id;typeof s=="string"&&(n.replyToId=s)}let o=t.root_post;if(typeof o=="object"&&o!==null){let s=o.id;typeof s=="string"&&(n.rootPostId=s)}return n}async function MS(e,t=fetch,n=al){let r=AN({...e.sinceSec!==void 0?{sinceSec:e.sinceSec}:{},...e.limit!==void 0?{limit:e.limit}:{}},e.accessToken,n),o;try{o=await t(r)}catch(l){throw new ut({kind:"network",message:l.message})}if(!o.ok)throw new ut(await IS(o));let s;try{s=await o.json()}catch(l){throw new ut({kind:"parse",message:l.message})}let i=Array.isArray(s.data)?s.data:[],a=[];for(let l of i){let c=_N(l);c!==null&&a.push(c)}return a}function OS(e,t=()=>{}){let n=new Set;if(!e)return n;for(let r of e.split(",")){let o=r.trim().replace(/^@/,"").toLowerCase();o&&(/^[a-z0-9._]{1,30}$/.test(o)||t("[threads-allowlist] Suspicious username (still added):",o),n.add(o))}return n}function $S(e,t){return e.has(t.trim().replace(/^@/,"").toLowerCase())}function DS(e){let t=e.command("threads").description("Manage the Agent AFK Threads mention poller (start, stop, status, test-fetch)");t.command("start").description("Start the poller as a background daemon").action(async()=>{let n=await Iu();if(n.kind==="started"){console.log(J.green(`\u2713 Poller started (PID ${n.pid})`)),console.log(J.gray(` Logs: ${n.logFile}`)),console.log(J.gray(" Tail with: afk threads logs --follow"));return}if(n.kind==="already-running"&&(console.log(J.yellow(`\u26A0 ${n.message}`)),process.exit(1)),n.kind==="exited-immediately"){if(console.error(J.red(`\u2717 ${n.message}`)),n.logTail&&n.logTail.length>0){console.error(""),console.error(J.bold("Last log entries:"));for(let r of n.logTail)console.error(J.gray(` ${r}`))}process.exit(1)}console.error(J.red(`\u2717 ${n.message}`)),process.exit(1)}),t.command("stop").description("Stop the poller (SIGTERM, then SIGKILL after 5s)").action(async()=>{let n=await Pu();if(n.kind==="not-running"){console.log(J.yellow("\u26A0 Poller is not running"));return}if(n.kind==="stopped"){console.log(J.green(`\u2713 Poller stopped (PID ${n.pid})`));return}console.log(J.yellow(`\u26A0 Poller force-killed (PID ${n.pid}); graceful shutdown timed out`))}),t.command("restart").description("Stop and restart the poller").action(async()=>{let n=await Pu();(n.kind==="stopped"||n.kind==="force-killed")&&console.log(J.gray(`Stopped (PID ${n.pid})`));let r=await Iu();if(r.kind==="started"){console.log(J.green(`\u2713 Poller restarted (PID ${r.pid})`));return}console.error(J.red(`\u2717 Restart failed: ${r.message}`)),process.exit(1)}),t.command("status").description("Show running state, uptime, memory, and recent log entries").action(()=>{let n=Mu();MN(n)}),t.command("logs").description("Show or follow the poller log").option("-f, --follow","Stream new log entries (like tail -f)",!1).option("-n, --lines <count>","Number of trailing lines to show","50").action(n=>{let{logFile:r}=Mu();if(!IN(r)){console.log(J.yellow(`No log file at ${r}`)),console.log(J.gray("Start the poller first: afk threads start"));return}let o=Number.parseInt(n.lines??"50",10);if(n.follow){CN("tail",["-n",String(o),"-f",r],{stdio:"inherit"}).on("error",a=>{console.error(J.red(`Failed to spawn tail: ${a.message}`))});return}let s=PN(r,"utf-8").split(`
2270
2272
  `).slice(-o-1);console.log(s.join(`
2271
2273
  `))}),t.command("test-fetch").description("One-shot: GET /me/mentions, print payload (verifies token + filtering, no agent dispatch)").option("--limit <n>","Max events to fetch","5").option("--no-filter","Skip allowlist + self-loop filter (dump every event)").action(async n=>{let r=CS();r.kind==="missing"&&(console.error(J.red("\u2717 "+r.reason)),process.exit(1));let o=r.token;console.log(J.gray(`Token: ${r.kind==="file"?r.path:"THREADS_ACCESS_TOKEN env"}`));let s;try{s=await PS(o)}catch(p){p instanceof ut?console.error(J.red(`\u2717 /me failed (${p.detail.kind}): ${p.detail.message}`)):console.error(J.red(`\u2717 /me failed: ${p.message}`)),process.exit(1)}console.log(J.gray(`Identity: @${s.username} (id ${s.id})`));let i=OS(E.AFK_THREADS_ALLOWED_USERNAMES),a=n.filter!==!1;a?i.size===0?(console.log(J.yellow("\u26A0 AFK_THREADS_ALLOWED_USERNAMES is empty \u2014 all events will be filtered out.")),console.log(J.gray(" Re-run with --no-filter to see raw payload."))):console.log(J.gray(`Allowlist: ${[...i].map(p=>"@"+p).join(", ")}`)):console.log(J.gray("Filter: OFF (dumping raw payload)")),console.log("");let l=Number.parseInt(n.limit??"5",10),c;try{c=await MS({accessToken:o,limit:l})}catch(p){p instanceof ut?console.error(J.red(`\u2717 /me/mentions failed (${p.detail.kind}): ${p.detail.message}`)):console.error(J.red(`\u2717 /me/mentions failed: ${p.message}`)),process.exit(1)}if(c.length===0){console.log(J.gray("No mentions returned.")),console.log(J.gray("Tag your account in a post (or have someone in the allowlist do it), then re-run."));return}let d=0,u=0;for(let p of c){let f=p.username.toLowerCase()===s.username.toLowerCase(),g=$S(i,p.username),h=!a||!f&&g,b=h?J.green("\u2713 KEEP "):J.gray("\u2717 FILTER "),y=h?"":f?" (self-loop)":g?"":" (not allowlisted)";console.log(`${b}@${p.username} ${J.gray("\u2022")} ${p.timestamp}${J.gray(y)}`),console.log(J.gray(` id=${p.id}`)),console.log(` ${p.text.slice(0,200)}${p.text.length>200?"\u2026":""}`),p.permalink&&console.log(J.gray(` ${p.permalink}`)),console.log(""),h?d++:u++}console.log(J.bold(`Summary: ${d} kept, ${u} filtered (of ${c.length} fetched)`))})}function MN(e){if(console.log(J.bold("\u{1F4CA} Threads Poller Status")),console.log(""),e.running?(console.log(` ${J.green("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${ON(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${J.red("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(J.bold("Recent log entries:"));for(let t of e.logTail)console.log(J.gray(` ${t}`))}}function ON(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m ${e%60}s`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}import{execFile as lU}from"node:child_process";import{promisify as cU}from"node:util";import le from"chalk";F();import{execFile as $N}from"node:child_process";import{randomBytes as DN}from"node:crypto";import{promises as Qr}from"node:fs";import{join as ll}from"node:path";import{promisify as LN}from"node:util";var FN=LN($N),LS=16;var Be=class extends Error{cause;code;constructor(t,n,r){super(t),this.name="WorktreeError",this.cause=n,this.code=r}};function Ou(e,t=40){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||"task"}function NN(){return DN(4).toString("hex").slice(0,4)}function UN(e){let t=n=>String(n).padStart(2,"0");return`${e.getUTCFullYear()}${t(e.getUTCMonth()+1)}${t(e.getUTCDate())}T${t(e.getUTCHours())}${t(e.getUTCMinutes())}${t(e.getUTCSeconds())}`}function jN(e,t={}){let n=(t.now??(()=>new Date))(),r=(t.randomSuffix??NN)();return`${UN(n)}-${Ou(e,32)}-${r}`}async function tr(e,t){try{let n=await FN("git",t,{cwd:e,maxBuffer:4194304});return{stdout:n.stdout.trim(),stderr:n.stderr.trim()}}catch(n){let r=n,o=(r.stderr??r.stdout??r.message??"").toString().trim();throw new Be(`git ${t.join(" ")} failed: ${o}`,n)}}async function BN(e){let{stdout:t}=await tr(e,["rev-parse","--show-toplevel"]);if(!t)throw new Be(`not a git repository: ${e}`);return t}async function WN(e,t){if(t){let{stdout:o}=await tr(e,["rev-parse",t]);return{sha:o}}let{stdout:n}=await tr(e,["rev-parse","HEAD"]),r;try{let{stdout:o}=await tr(e,["symbolic-ref","--quiet","HEAD"]);o&&(r=o)}catch{}return{sha:n,branch:r}}function HN(e,t,n){let r=n?Ou(n,32):`branch-${t}`;return`afk/farm/${e}/${t}-${r}`}function KN(e,t){return ll(e,`branch-${t}`)}async function GN(e,t){try{await tr(e,["worktree","remove","--force",t])}catch{}}async function zN(e,t){try{await tr(e,["branch","-D",t])}catch{}}async function FS(e){if(e.count<1||e.count>LS)throw new Be(`count must be between 1 and ${LS}, got ${e.count}`);if(e.labels&&e.labels.length!==e.count)throw new Be(`labels.length (${e.labels.length}) must equal count (${e.count})`);let t=e.cwd??process.cwd(),n=await BN(t),{sha:r,branch:o}=await WN(n,e.baseRef),s=(e.now??(()=>new Date))(),i=e.taskSlug??jN(e.taskName,{now:()=>s,randomSuffix:e.randomSuffix}),a=e.taskSlug??i,l=El(i);try{throw await Qr.access(l),new Be(`farm directory already exists: ${l}`)}catch(u){if(u.code!=="ENOENT")throw u instanceof Be?u:new Be(`failed to check farm dir ${l}`,u)}await Qr.mkdir(l,{recursive:!0});let c=[];try{for(let u=1;u<=e.count;u++){let p=e.labels?.[u-1],f=HN(i,u,p),g=KN(l,u);await tr(n,["worktree","add","-b",f,g,r]),c.push({index:u,label:p?Ou(p,32):void 0,path:g,branch:f})}}catch(u){for(let p of c.slice().reverse())await GN(n,p.path),await zN(n,p.branch);throw await Qr.rm(l,{recursive:!0,force:!0}).catch(()=>{}),u instanceof Be?u:new Be("farm creation failed",u)}let d={schemaVersion:3,taskId:a,taskSlug:i,taskName:e.taskName,repoRoot:n,baseRef:r,baseBranch:o,farmDir:l,createdAt:s.toISOString(),branches:c};return await Qr.writeFile(ll(l,"farm.json"),JSON.stringify(d,null,2)+`
@@ -2276,8 +2278,8 @@ Multiple chats found:`)),o.forEach((l,c)=>{let d=l.username?`@${l.username}`:l.f
2276
2278
  `).filter(Boolean):[]}catch{return[]}}var $u=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
2277
2279
  ${t.map(n=>` ${n}`).join(`
2278
2280
  `)}`),this.name="FarmIsolationViolation",this.dirtyFiles=t}};function pU(e,t){return e.length>=t?e:e+" ".repeat(t-e.length)}function mU(e){if(e===void 0)return le.dim("\u2014");if(e===null)return le.dim("skipped");let t=e.fail===0&&e.pass>0?le.green("tests\u2713"):le.red("tests\u2717"),n=e.lint_ok===!0?le.green("lint\u2713"):e.lint_ok===!1?le.red("lint\u2717"):le.dim("lint?"),r=e.loc_delta>0?"+":"",o=le.dim(`${r}${e.loc_delta} LoC`);return`${t} ${n} ${o}`}function fU(e,t,n,r){let o="\u2500".repeat(45);console.log(le.dim(o)),console.log(`farm: ${e}`),console.log(`slug: ${t}`),console.log("");let s=r.some(d=>d.score!=null),i=s?gs(r.map(d=>({index:d.index,score:d.score??null}))).map(d=>r.find(u=>u.index===d)):r;for(let d=0;d<i.length;d++){let u=i[d],p=n.find(S=>S.index===u.index),f=u.ok?le.green("\u2713"):le.red("\u2717"),g=pU(p.branch,40),h=u.ok?le.dim(`(${u.commitCount} commit${u.commitCount===1?"":"s"})`):le.red(`[error: ${u.error}]`),b=s?le.cyan(`#${d+1} `):"",y=s?` ${mU(u.score)}`:"";console.log(`${b}branch-${u.index} ${f} ${g} ${h}${y}`),console.log(le.dim(` worktree: ${p.path}`))}console.log(le.dim(o));let a=r.filter(d=>d.ok).length,l=r.length;console.log(`${a}/${l} branches completed.`);let c=r.some(d=>d.score!=null&&d.score.pass>0);s&&!c&&console.log(le.yellow("\u26A0 no branch passed tests \u2014 ranking falls back to lint + LoC"))}function gU(e,t,n){let r=t.map(a=>{let l=e.branches.find(d=>d.index===a.index),c={index:a.index,branch:l?.branch??`(unknown-${a.index})`,ok:a.ok,commitCount:a.commitCount};return l?.label!==void 0&&(c.label=l.label),a.error!==void 0&&(c.error=a.error),a.score!==void 0&&(c.score=a.score),c}),o=gs(t.map(a=>({index:a.index,score:a.score??null}))),s;for(let a of o){let l=t.find(c=>c.index===a);if(!(!l||!l.ok||!l.score)&&l.score.pass>0&&l.score.fail===0){s=a;break}}if(s===void 0)for(let a of o){let l=t.find(c=>c.index===a);if(l?.ok&&l.score){s=a;break}}let i={taskName:e.taskName,taskSlug:e.taskSlug,baseSha:e.baseRef,startedAt:n,completedAt:new Date().toISOString(),branches:r};return s!==void 0&&(i.winner=s),e.human_decision!==void 0&&(i.human_decision=e.human_decision),i}async function hU(e){let{task:t,branches:n,labels:r,model:o,baseRef:s,cwd:i=process.cwd(),failFast:a,taskSlug:l,score:c=!0,scoreTimeoutMs:d=dl,memoryWrite:u=!0,digest:p=!0,_createFarm:f=FS,_runSubagentDAG:g=vi,_getCommitCount:h=dU,_getSourceRepoDirtyFiles:b=uU,_scoreBranch:y=WS,_writeScore:S=HS,_writeFarmFact:T=zS,_sendFarmDigest:x=JS,_setFarmMemoryFactId:w=NS}=e,v=new Date().toISOString();(!Number.isInteger(n)||n<1||n>16)&&(console.error(le.red(`--branches must be between 1 and 16 (got ${n})`)),process.exit(1)),r!==void 0&&r.length!==n&&(console.error(le.red(`--labels count (${r.length}) must equal --branches (${n})`)),process.exit(1));let R;try{R=await f({taskName:t,count:n,labels:r,cwd:i,baseRef:s,taskSlug:l})}catch(L){console.error(le.red(`Farm creation failed: ${L instanceof Error?L.message:String(L)}`)),process.exit(1)}let _=R.baseRef,C=o??Fe(),A=fr()??mr()??"",O=R.branches.map(L=>({id:`branch-${L.index}`,agentType:`branch-${L.index}${L.label?` (${L.label})`:""}`,systemPrompt:A,promptBuilder:B=>(console.log(`[branch-${L.index}] started`),[`Task: ${t}`,"",`You are working in a dedicated git worktree. Your working directory has been set to: ${L.path}`,`Your branch is: ${L.branch}`,"","Complete the task. All file operations are restricted to this worktree by the runtime."].join(`
2279
- `)),model:C,idPrefix:`farm-${R.taskSlug}-branch-${L.index}`,cwd:L.path,readRoots:[L.path],writeRoots:[L.path]})),M=new AbortController,$=new q({parentAbortSignal:M.signal}),N={sessionId:`farm-${R.taskSlug}`,abortSignal:M.signal},j;try{j=await g({manager:$,parentSession:N,nodes:O,edges:[],failFast:a})}catch(L){throw console.error(le.red(`Farm dispatch failed: ${L instanceof Error?L.message:String(L)}`)),L}finally{M.abort()}let G=[];for(let L of R.branches){let B=j.failed.find(P=>P.id===`branch-${L.index}`),ne=j.skipped.includes(`branch-${L.index}`);if(B||ne){let P=B?B.error.message:"skipped";console.log(`[branch-${L.index}] \u2717 failed: ${P}`),G.push({index:L.index,ok:!1,commitCount:0,error:P});continue}let D=await h(L.path,_);if(D===0){let P="no commits made";console.log(`[branch-${L.index}] \u2717 failed: ${P}`),G.push({index:L.index,ok:!1,commitCount:0,error:P})}else console.log(`[branch-${L.index}] \u2713 done`),G.push({index:L.index,ok:!0,commitCount:D})}let V=await b(i);if(c)for(let L of G){if(!L.ok){L.score=null;continue}let B=R.branches.find(D=>D.index===L.index);console.log(`[branch-${L.index}] scoring\u2026`);let ne=await y({branchPath:B.path,baseSha:_,timeoutMs:d});L.score=ne;try{await S(R.farmDir,L.index,ne)}catch(D){console.error(le.yellow(`[branch-${L.index}] score.json write failed: ${D instanceof Error?D.message:String(D)}`))}}if(fU(t,R.taskSlug,R.branches,G),u||p){let L=gU(R,G,v);if(u){let B=T(L);if("skipped"in B)console.error(le.yellow(`[memory] write skipped: ${B.reason}`));else{let{factId:ne}=B;try{await w(R.taskSlug,ne)}catch(D){console.error(le.yellow(`[memory] setFarmMemoryFactId failed: ${D.message}`))}}}if(p){let B=await x(L);B.sent?console.log(le.dim(`[telegram] digest sent (${B.chatCount} chat${B.chatCount===1?"":"s"})`)):B.reason&&B.reason!=="telegram unconfigured"&&console.error(le.yellow(`[telegram] digest failed: ${B.reason}`))}}if(V.length>0){let L=new $u(V);console.error(le.red(`
2280
- \u26A0 ISOLATION VIOLATION`)),console.error(le.red(L.message)),process.exit(1)}let I=G.every(L=>L.ok);process.exit(I?0:1)}function YS(e){e.command("farm").description("Run a task across N speculative git worktree branches in parallel").argument("<task>","Task description to run on each branch").option("-n, --branches <number>","Number of branches to spawn (1-16)","3").option("--labels <labels>","Comma-separated branch labels (count must equal --branches)").option("-m, --model <model>","Model to use",Fe()).option("--base-ref <ref>","Base git ref (default: HEAD)").option("--cwd <path>","Source repo root (default: process.cwd())").option("--fail-fast","Abort remaining branches on first failure",!1).option("--task-slug <slug>","Deterministic task slug override (for tests)").option("--no-score","Skip the post-run scorer (tests + lint + LoC)").option("--score-timeout <ms>",`Per-branch test timeout in ms (default ${dl})`).option("--no-memory","Skip writing the farm-run fact to cross-session memory").option("--no-digest","Skip pushing the Telegram digest on completion").action(async(t,n)=>{let r=parseInt(n.branches,10),o=n.labels?n.labels.split(",").map(i=>i.trim()).filter(Boolean):void 0,s=n.scoreTimeout?parseInt(n.scoreTimeout,10):void 0;s!==void 0&&(!Number.isFinite(s)||s<1)&&(console.error(le.red(`--score-timeout must be a positive integer (got "${n.scoreTimeout}")`)),process.exit(1));try{await hU({task:t,branches:r,labels:o,model:n.model,baseRef:n.baseRef,cwd:n.cwd,failFast:n.failFast,taskSlug:n.taskSlug,score:n.score,memoryWrite:n.memory,digest:n.digest,...s!==void 0?{scoreTimeoutMs:s}:{}})}catch(i){console.error(i),process.exitCode=1}})}H();import bt from"chalk";import{execFile as yU}from"node:child_process";import{promisify as bU}from"node:util";var Du=bU(yU);async function XS(){try{return(await Du("git",["rev-parse","--show-toplevel"])).stdout.trim()}catch{throw new Error("Not in a git repository.")}}function kU(e){return["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"].includes(e)?bt.red("yes"):e==="stale-dirty"?bt.yellow("warn"):bt.green("no")}var QS=["interactive","diagnose","all"];function wU(e){if(QS.includes(e))return e;throw new Error(`Invalid --scope value: '${e}'. Allowed: ${QS.join(" | ")}.`)}function SU(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function ZS(e){let t=e.command("worktree").description("Manage git worktrees created by afk");t.command("list").description("List all afk-managed worktrees and show prune candidates (dry-run only)").action(async()=>{let n;try{n=await XS()}catch(s){U(s)}let r;try{r=await _t({execFile:Du,repoRoot:n,dryRun:!0})}catch(s){U(new Error(`Sweep failed: ${s.message}`))}let o=["PATH".padEnd(45),"OWNER".padEnd(12),"AGE".padEnd(6),"STATUS".padEnd(22),"PRUNE?"].join(" | ");console.log(bt.bold(o)),console.log("-".repeat(o.length));for(let s of r.candidates){let i=[s.path.slice(-44).padEnd(45),s.owner.padEnd(12),SU(s.ageMs).padEnd(6),s.verdict.padEnd(22),kU(s.verdict)].join(" | ");console.log(i)}if(r.candidates.length===0&&console.log(bt.dim(" (no afk-managed worktrees found)")),r.warnings.length>0){console.log("");for(let s of r.warnings)console.log(bt.yellow(s))}}),t.command("prune").description("Remove stale, empty, and orphaned worktrees").option("--apply","Execute removals (default is dry-run)",!1).option("--max-age-days-clean <n>","Max age (days) for clean worktrees before removal").option("--max-age-days-dirty <n>","Max age (days) for dirty worktrees before warning").option("--scope <scope>","Scope: interactive | diagnose | all","all").action(async n=>{let r;try{r=await XS()}catch(S){U(S)}let s=Ge().daemon?.worktreePrune,i=parseInt(E.AFK_WORKTREE_MAX_AGE_CLEAN??"",10),a=parseInt(E.AFK_WORKTREE_MAX_AGE_DIRTY??"",10),l=n.maxAgeDaysClean!==void 0?parseInt(n.maxAgeDaysClean,10):s?.maxAgeDaysClean??(Number.isNaN(i)?14:i),c=n.maxAgeDaysDirty!==void 0?parseInt(n.maxAgeDaysDirty,10):s?.maxAgeDaysDirty??(Number.isNaN(a)?30:a),d;try{d=wU(n.scope)}catch(S){U(S)}let u={execFile:Du,repoRoot:r,dryRun:!n.apply,maxAgeDaysClean:l,maxAgeDaysDirty:c,scope:d},p;try{p=await _t(u)}catch(S){U(new Error(`Sweep failed: ${S.message}`))}p.dryRun&&console.log(bt.yellow("\u{1F50D} Dry-run mode \u2014 no changes made."));let f={};for(let S of p.candidates)f[S.verdict]=(f[S.verdict]??0)+1;let g=p.warnings.filter(S=>S.startsWith("[WARN]")).length,h=p.warnings.filter(S=>S.startsWith("[ERROR]")).length,b=Object.entries(f).sort(([S],[T])=>S.localeCompare(T)).map(([S,T])=>`${S}=${T}`);console.log(`Removed: ${p.removed.length}, Warned: ${g}, Errors: ${h}`+(b.length>0?` [${b.join(" ")}]`:""));for(let S of p.candidates){let x=p.removed.includes(S.path)?bt.red("\u2717"):bt.green("\u2713");console.log(` ${x} [${S.verdict.padEnd(22)}] ${S.path}`)}if(p.warnings.length>0){console.log("");for(let S of p.warnings)S.startsWith("[ERROR]")?console.error(bt.red(S)):console.log(bt.yellow(S))}p.warnings.some(S=>S.startsWith("[ERROR]"))&&process.exit(1)})}import{spawn as vU}from"child_process";var TU=/^\d+\.\d+\.\d+(-[\da-z.]+)?$/i;function EU(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function ev(e){e.command("update").alias("upgrade").description("Update agent-afk to the latest published version").option("--check","Only check whether an update is available; do not install").option("--pin <version>","Install a specific version instead of latest (must be valid semver)").action(async t=>{let n=Wt();if(t.check===!0){process.stderr.write(`Checking for updates\u2026
2281
+ `)),model:C,idPrefix:`farm-${R.taskSlug}-branch-${L.index}`,cwd:L.path,readRoots:[L.path],writeRoots:[L.path]})),M=new AbortController,$=new q({parentAbortSignal:M.signal}),N={sessionId:`farm-${R.taskSlug}`,abortSignal:M.signal},j;try{j=await g({manager:$,parentSession:N,nodes:O,edges:[],failFast:a})}catch(L){throw console.error(le.red(`Farm dispatch failed: ${L instanceof Error?L.message:String(L)}`)),L}finally{M.abort()}let z=[];for(let L of R.branches){let B=j.failed.find(P=>P.id===`branch-${L.index}`),ne=j.skipped.includes(`branch-${L.index}`);if(B||ne){let P=B?B.error.message:"skipped";console.log(`[branch-${L.index}] \u2717 failed: ${P}`),z.push({index:L.index,ok:!1,commitCount:0,error:P});continue}let D=await h(L.path,_);if(D===0){let P="no commits made";console.log(`[branch-${L.index}] \u2717 failed: ${P}`),z.push({index:L.index,ok:!1,commitCount:0,error:P})}else console.log(`[branch-${L.index}] \u2713 done`),z.push({index:L.index,ok:!0,commitCount:D})}let V=await b(i);if(c)for(let L of z){if(!L.ok){L.score=null;continue}let B=R.branches.find(D=>D.index===L.index);console.log(`[branch-${L.index}] scoring\u2026`);let ne=await y({branchPath:B.path,baseSha:_,timeoutMs:d});L.score=ne;try{await S(R.farmDir,L.index,ne)}catch(D){console.error(le.yellow(`[branch-${L.index}] score.json write failed: ${D instanceof Error?D.message:String(D)}`))}}if(fU(t,R.taskSlug,R.branches,z),u||p){let L=gU(R,z,v);if(u){let B=T(L);if("skipped"in B)console.error(le.yellow(`[memory] write skipped: ${B.reason}`));else{let{factId:ne}=B;try{await w(R.taskSlug,ne)}catch(D){console.error(le.yellow(`[memory] setFarmMemoryFactId failed: ${D.message}`))}}}if(p){let B=await x(L);B.sent?console.log(le.dim(`[telegram] digest sent (${B.chatCount} chat${B.chatCount===1?"":"s"})`)):B.reason&&B.reason!=="telegram unconfigured"&&console.error(le.yellow(`[telegram] digest failed: ${B.reason}`))}}if(V.length>0){let L=new $u(V);console.error(le.red(`
2282
+ \u26A0 ISOLATION VIOLATION`)),console.error(le.red(L.message)),process.exit(1)}let I=z.every(L=>L.ok);process.exit(I?0:1)}function YS(e){e.command("farm").description("Run a task across N speculative git worktree branches in parallel").argument("<task>","Task description to run on each branch").option("-n, --branches <number>","Number of branches to spawn (1-16)","3").option("--labels <labels>","Comma-separated branch labels (count must equal --branches)").option("-m, --model <model>","Model to use",Fe()).option("--base-ref <ref>","Base git ref (default: HEAD)").option("--cwd <path>","Source repo root (default: process.cwd())").option("--fail-fast","Abort remaining branches on first failure",!1).option("--task-slug <slug>","Deterministic task slug override (for tests)").option("--no-score","Skip the post-run scorer (tests + lint + LoC)").option("--score-timeout <ms>",`Per-branch test timeout in ms (default ${dl})`).option("--no-memory","Skip writing the farm-run fact to cross-session memory").option("--no-digest","Skip pushing the Telegram digest on completion").action(async(t,n)=>{let r=parseInt(n.branches,10),o=n.labels?n.labels.split(",").map(i=>i.trim()).filter(Boolean):void 0,s=n.scoreTimeout?parseInt(n.scoreTimeout,10):void 0;s!==void 0&&(!Number.isFinite(s)||s<1)&&(console.error(le.red(`--score-timeout must be a positive integer (got "${n.scoreTimeout}")`)),process.exit(1));try{await hU({task:t,branches:r,labels:o,model:n.model,baseRef:n.baseRef,cwd:n.cwd,failFast:n.failFast,taskSlug:n.taskSlug,score:n.score,memoryWrite:n.memory,digest:n.digest,...s!==void 0?{scoreTimeoutMs:s}:{}})}catch(i){console.error(i),process.exitCode=1}})}K();import bt from"chalk";import{execFile as yU}from"node:child_process";import{promisify as bU}from"node:util";var Du=bU(yU);async function XS(){try{return(await Du("git",["rev-parse","--show-toplevel"])).stdout.trim()}catch{throw new Error("Not in a git repository.")}}function kU(e){return["empty","stale-clean","orphaned-dir","orphaned-registration","dead-owner"].includes(e)?bt.red("yes"):e==="stale-dirty"?bt.yellow("warn"):bt.green("no")}var QS=["interactive","diagnose","all"];function wU(e){if(QS.includes(e))return e;throw new Error(`Invalid --scope value: '${e}'. Allowed: ${QS.join(" | ")}.`)}function SU(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function ZS(e){let t=e.command("worktree").description("Manage git worktrees created by afk");t.command("list").description("List all afk-managed worktrees and show prune candidates (dry-run only)").action(async()=>{let n;try{n=await XS()}catch(s){U(s)}let r;try{r=await _t({execFile:Du,repoRoot:n,dryRun:!0})}catch(s){U(new Error(`Sweep failed: ${s.message}`))}let o=["PATH".padEnd(45),"OWNER".padEnd(12),"AGE".padEnd(6),"STATUS".padEnd(22),"PRUNE?"].join(" | ");console.log(bt.bold(o)),console.log("-".repeat(o.length));for(let s of r.candidates){let i=[s.path.slice(-44).padEnd(45),s.owner.padEnd(12),SU(s.ageMs).padEnd(6),s.verdict.padEnd(22),kU(s.verdict)].join(" | ");console.log(i)}if(r.candidates.length===0&&console.log(bt.dim(" (no afk-managed worktrees found)")),r.warnings.length>0){console.log("");for(let s of r.warnings)console.log(bt.yellow(s))}}),t.command("prune").description("Remove stale, empty, and orphaned worktrees").option("--apply","Execute removals (default is dry-run)",!1).option("--max-age-days-clean <n>","Max age (days) for clean worktrees before removal").option("--max-age-days-dirty <n>","Max age (days) for dirty worktrees before warning").option("--scope <scope>","Scope: interactive | diagnose | all","all").action(async n=>{let r;try{r=await XS()}catch(S){U(S)}let s=Ge().daemon?.worktreePrune,i=parseInt(E.AFK_WORKTREE_MAX_AGE_CLEAN??"",10),a=parseInt(E.AFK_WORKTREE_MAX_AGE_DIRTY??"",10),l=n.maxAgeDaysClean!==void 0?parseInt(n.maxAgeDaysClean,10):s?.maxAgeDaysClean??(Number.isNaN(i)?14:i),c=n.maxAgeDaysDirty!==void 0?parseInt(n.maxAgeDaysDirty,10):s?.maxAgeDaysDirty??(Number.isNaN(a)?30:a),d;try{d=wU(n.scope)}catch(S){U(S)}let u={execFile:Du,repoRoot:r,dryRun:!n.apply,maxAgeDaysClean:l,maxAgeDaysDirty:c,scope:d},p;try{p=await _t(u)}catch(S){U(new Error(`Sweep failed: ${S.message}`))}p.dryRun&&console.log(bt.yellow("\u{1F50D} Dry-run mode \u2014 no changes made."));let f={};for(let S of p.candidates)f[S.verdict]=(f[S.verdict]??0)+1;let g=p.warnings.filter(S=>S.startsWith("[WARN]")).length,h=p.warnings.filter(S=>S.startsWith("[ERROR]")).length,b=Object.entries(f).sort(([S],[T])=>S.localeCompare(T)).map(([S,T])=>`${S}=${T}`);console.log(`Removed: ${p.removed.length}, Warned: ${g}, Errors: ${h}`+(b.length>0?` [${b.join(" ")}]`:""));for(let S of p.candidates){let x=p.removed.includes(S.path)?bt.red("\u2717"):bt.green("\u2713");console.log(` ${x} [${S.verdict.padEnd(22)}] ${S.path}`)}if(p.warnings.length>0){console.log("");for(let S of p.warnings)S.startsWith("[ERROR]")?console.error(bt.red(S)):console.log(bt.yellow(S))}p.warnings.some(S=>S.startsWith("[ERROR]"))&&process.exit(1)})}import{spawn as vU}from"child_process";var TU=/^\d+\.\d+\.\d+(-[\da-z.]+)?$/i;function EU(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function ev(e){e.command("update").alias("upgrade").description("Update agent-afk to the latest published version").option("--check","Only check whether an update is available; do not install").option("--pin <version>","Install a specific version instead of latest (must be valid semver)").action(async t=>{let n=Wt();if(t.check===!0){process.stderr.write(`Checking for updates\u2026
2281
2283
  `);let i=await au();if(i===void 0){console.log(m.warning("Could not reach the npm registry to check for updates.")),console.log(m.dim(` Current: ${n}`)),process.exitCode=1;return}if(EU(n,i)){console.log(`${m.bold("Update available:")} ${m.dim(n)} \u2192 ${m.bold(i)}`),console.log(m.dim(" Run `afk update` to install."));return}console.log(`agent-afk ${m.bold(n)} is up to date.`);return}if(t.pin!==void 0&&!TU.test(t.pin)){console.error(m.warning(`Invalid version: ${JSON.stringify(t.pin)}. Must be valid semver (e.g. 1.2.3 or 1.2.3-beta.1).`)),process.exitCode=1;return}let r=t.pin;if(r===void 0){if(process.stderr.write(`Fetching latest version\u2026
2282
2284
  `),r=await au(),r===void 0){console.error(m.warning("Could not reach the npm registry. Aborting.")),process.exitCode=1;return}if(r===n){console.log(`agent-afk ${m.bold(n)} is up to date.`);return}}console.log(`Updating agent-afk: ${m.dim(n)} \u2192 ${m.bold(r)}`),console.log(m.dim(` npm install -g agent-afk@${r}`));let{code:o,signal:s}=await xU(r);o===0?(iu(r),console.log(m.success(`\u2713 agent-afk@${r} installed.`))):s!==null?(console.error(m.warning(`npm install was killed by signal ${s}.`)),process.exitCode=1):(console.error(m.warning(`npm install exited with code ${o??1}.`)),process.exitCode=o??1)})}function xU(e){return new Promise(t=>{let n=vU("npm",["install","-g",`agent-afk@${e}`],{stdio:"inherit"});n.on("error",()=>t({code:1,signal:null})),n.on("exit",(r,o)=>t({code:r,signal:o}))})}import{existsSync as tv,readFileSync as nv}from"node:fs";import{join as AU}from"node:path";F();async function ul(e,t,n){try{let r=AU(or("default"),"port");if(!tv(r))return;let o=nv(r,"utf-8").trim(),s=parseInt(o,10);if(Number.isNaN(s))return;await fetch(`http://localhost:${s}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)})}catch{}}function rv(e){let t=e.command("schedule").description("Manage scheduled daemon tasks");t.command("add").description("Add a new scheduled task").requiredOption("--name <name>","Human-readable label").requiredOption("--command <cmd>","Command to run").requiredOption("--cron <expr>","Cron expression (5-field)").option("--trigger <mode>","cron | sessionstart | both","cron").option("--notify <when>","failure | always | never","failure").option("--disabled","Add in disabled state",!1).action(async n=>{try{let r=ti({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger,notifyOn:n.notify,enabled:!n.disabled});await ul("POST","/tasks",{taskId:r.id,command:r.command,cron:r.cron,trigger:r.trigger}),console.log(`\u2705 Added: ${r.id} \u2014 ${r.name}`)}catch(r){U(r)}}),t.command("list").description("List all scheduled tasks").action(()=>{try{let n=lt();if(n.length===0){console.log("No scheduled tasks.");return}let r="ID | NAME | CRON | ENABLED",o="-".repeat(r.length);console.log(r),console.log(o);for(let s of n)console.log([s.id.padEnd(20),s.name.padEnd(30),s.cron.padEnd(15),String(s.enabled)].join(" | "))}catch(n){U(n)}}),t.command("remove <id>").description("Permanently remove a scheduled task").action(async n=>{try{ni(n)||(console.error(`Task not found: ${n}`),process.exit(1)),await ul("DELETE",`/tasks/${n}`),console.log(`\u2705 Removed: ${n}`)}catch(r){U(r)}}),t.command("enable <id>").description("Enable a scheduled task").action(async n=>{try{let r=vo(n);r||(console.error(`Task not found: ${n}`),process.exit(1));let o=lt();Dn(o.map(s=>s.id===n?{...s,enabled:!0,updatedAt:new Date().toISOString()}:s)),await ul("POST","/tasks",{taskId:r.id,command:r.command,cron:r.cron,trigger:r.trigger}),console.log(`\u2705 Enabled: ${n}`)}catch(r){U(r)}}),t.command("disable <id>").description("Disable a scheduled task").action(async n=>{try{vo(n)||(console.error(`Task not found: ${n}`),process.exit(1));let o=lt();Dn(o.map(s=>s.id===n?{...s,enabled:!1,updatedAt:new Date().toISOString()}:s)),await ul("DELETE",`/tasks/${n}`),console.log(`\u2705 Disabled: ${n}`)}catch(r){U(r)}}),t.command("logs <id>").description("Show recent execution history for a task").option("-n, --limit <n>","Number of records to show","10").action((n,r)=>{try{let o=Math.min(Math.max(1,parseInt(r.limit,10)||10),50),s=kt();if(!tv(s)){console.log(`No telemetry found for task: ${n}`);return}let i=nv(s),c=(i.length>1048576?i.subarray(i.length-1048576):i).toString("utf-8").split(`
2283
2285
  `),d=[];for(let p=c.length-1;p>=0;p-=1){let f=c[p];if(f)try{let g=JSON.parse(f);if(g.taskId!==n)continue;if(d.push(g),d.length>=o)break}catch{continue}}let u=d.reverse();if(u.length===0){console.log(`No history found for task: ${n}`);return}console.log(JSON.stringify(u,null,2))}catch(o){U(o)}})}function ov(e){return new Date(e).toISOString().replace("T"," ").slice(0,19)}function Zr(e,t){return e.length>=t?e:e+" ".repeat(t-e.length)}var sv=9,pl=50,iv=22;function RU(e){let t=Zr(e.jobId,iv),n=Zr(e.status,sv),r=e.label.length>pl?`${e.label.slice(0,pl-1)}\u2026`:Zr(e.label,pl),o=ov(e.startedAt),s=e.endedAt!==void 0?ov(e.endedAt):"\u2014";return`${t} ${n} ${r} ${o} ${s}`}function _U(e){return e.type==="done"||e.type==="error"}function av(e){let t=e.command("bg").description(`Inspect persisted background subagent job logs.
@@ -2296,7 +2298,7 @@ the job dies. This command reads the persisted log.`).action(async n=>{try{for a
2296
2298
  `)}catch(r){U(r)}})}import $e from"chalk";import{execFileSync as jU}from"child_process";import{existsSync as gv}from"fs";F();import{execFileSync as eo}from"child_process";import{existsSync as bs,mkdirSync as lv,readFileSync as fie,realpathSync as cv,renameSync as CU,rmSync as IU,unlinkSync as PU,writeFileSync as MU}from"fs";import{homedir as fl}from"os";import{dirname as OU,join as Lu,resolve as $U}from"path";var to=["telegram","daemon"];function ze(e){return`com.afk.${e}`}function dv(e=fl()){return Lu(e,"Library","LaunchAgents")}function no(e,t=fl()){return Lu(dv(t),`${ze(e)}.plist`)}function gl(e){return Lu(Gt(),`service-${e}.log`)}function ml(){return`gui/${process.getuid?.()??501}`}function En(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function DU(e){let t=[];t.push('<?xml version="1.0" encoding="UTF-8"?>'),t.push('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">'),t.push('<plist version="1.0">'),t.push("<dict>"),t.push(" <key>Label</key>"),t.push(` <string>${En(e.label)}</string>`),t.push(" <key>ProgramArguments</key>"),t.push(" <array>");for(let n of e.programArguments)t.push(` <string>${En(n)}</string>`);if(t.push(" </array>"),t.push(" <key>WorkingDirectory</key>"),t.push(` <string>${En(e.workingDirectory)}</string>`),t.push(" <key>StandardOutPath</key>"),t.push(` <string>${En(e.standardOutPath)}</string>`),t.push(" <key>StandardErrorPath</key>"),t.push(` <string>${En(e.standardErrorPath)}</string>`),t.push(" <key>RunAtLoad</key>"),t.push(" <true/>"),t.push(" <key>KeepAlive</key>"),t.push(" <true/>"),t.push(" <key>ProcessType</key>"),t.push(" <string>Interactive</string>"),e.watchPaths&&e.watchPaths.length>0){t.push(" <key>WatchPaths</key>"),t.push(" <array>");for(let n of e.watchPaths)t.push(` <string>${En(n)}</string>`);t.push(" </array>")}if(e.environmentVariables&&Object.keys(e.environmentVariables).length>0){t.push(" <key>EnvironmentVariables</key>"),t.push(" <dict>");let n=Object.keys(e.environmentVariables).sort();for(let r of n){let o=e.environmentVariables[r]??"";t.push(` <key>${En(r)}</key>`),t.push(` <string>${En(o)}</string>`)}t.push(" </dict>")}return t.push("</dict>"),t.push("</plist>"),t.join(`
2297
2299
  `)+`
2298
2300
  `}function LU(e=["/usr/local/bin/afk","/opt/homebrew/bin/afk"],t=bs,n=FU,r=cv){let o=process.argv[1];if(o)try{let i=r(o);if(uv.some(a=>i.startsWith(a))&&t(i))return i}catch{}let s=n();if(s&&t(s))return s;for(let i of e)if(t(i))return i;throw new Error(`Could not locate the 'afk' binary. Searched: ${e.join(", ")}. Install it globally first (e.g. 'pnpm install -g agent-afk' or via Homebrew).`)}var uv=["/usr/local/bin/","/opt/homebrew/bin/","/usr/bin/","/opt/local/bin/"];function FU(){try{let e=eo("which",["afk"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim();if(!e)return;let t;try{t=cv(e)}catch{return}return uv.some(n=>t.startsWith(n))?t:void 0}catch{return}}function pv(e,t=bs){if(e==="telegram"){let r=Su();if(r.endsWith(".ts"))throw new Error(`Refusing to install telegram service pointing at TypeScript source (${r}). Run 'pnpm build' first so the compiled entrypoint exists, or install agent-afk globally (e.g. 'pnpm install -g agent-afk').`);if(!t(r))throw new Error(`Telegram entrypoint does not exist on disk: ${r}. Run 'pnpm build' to compile it, or install agent-afk globally.`);return[process.execPath,r]}return[LU(),"daemon"]}function NU(e,t){let n=pv(e,t),r=e==="telegram"?n[1]:void 0;if(!r)return;let o=$U(r),s=fl();if(o.startsWith(s)&&!(o.includes("/node_modules/")||o.includes("/homebrew/")))return[o]}function UU(e,t){let n=e.trim();if(n.startsWith("[")||n.startsWith("{")){try{let r=JSON.parse(n),o=Array.isArray(r)?r:[r];for(let s of o){if(typeof s!="object"||s===null)continue;let i=s;if(i.Label!==t)continue;let a={};return typeof i.PID=="number"&&Number.isFinite(i.PID)&&(a.pid=i.PID),typeof i.LastExitStatus=="number"&&Number.isFinite(i.LastExitStatus)&&(a.lastExitStatus=i.LastExitStatus),a}}catch{}return}for(let r of n.split(`
2299
- `)){let o=r.split(" "),s=o.length>=3?o:r.trim().split(/\s+/);if(s.length<3||s[2]?.trim()!==t)continue;let i=s[0]?.trim()??"-",a=s[1]?.trim()??"0",l={};if(i!=="-"&&i!==""){let d=Number.parseInt(i,10);Number.isFinite(d)&&(l.pid=d)}let c=Number.parseInt(a,10);return Number.isFinite(c)&&(l.lastExitStatus=c),l}}var ys=8e3;function Fu(e){let t=no(e),n={name:e,label:ze(e),installed:bs(t),plistPath:t,logFile:gl(e)};if(!n.installed)return n;try{let r=eo("launchctl",["list"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:ys}),o=UU(r,n.label);o&&(o.pid!==void 0&&(n.pid=o.pid),o.lastExitStatus!==void 0&&(n.lastExitStatus=o.lastExitStatus))}catch{}return n}function mv(e,t={}){let n=no(e);if(bs(n))return{kind:"already-installed",plistPath:n,label:ze(e)};let r;try{r=pv(e,t._entrypointExistsCheck)}catch(c){return{kind:"failed",reason:c.message}}let o=t.noWatch?void 0:NU(e,t._entrypointExistsCheck),s=gl(e);lv(dv(),{recursive:!0}),lv(OU(s),{recursive:!0});let i={label:ze(e),programArguments:r,workingDirectory:fl(),standardOutPath:s,standardErrorPath:s,...o?{watchPaths:o}:{},...t.environment?{environmentVariables:t.environment}:{}},a=DU(i),l=`${n}.tmp`;try{MU(l,a,{encoding:"utf-8",flag:"wx",mode:384})}catch(c){return{kind:"failed",reason:`Failed to write plist (tmp ${l}): ${c.message}`}}try{CU(l,n)}catch(c){try{PU(l)}catch{}return{kind:"failed",reason:`Failed to install plist (rename ${l} \u2192 ${n}): ${c.message}`}}if(t.skipBootstrap)return{kind:"installed",plistPath:n,label:ze(e),watchPathsActive:!!o};try{eo("launchctl",["bootstrap",ml(),n],{stdio:["ignore","pipe","pipe"],timeout:ys})}catch(c){let d=c.message;if(c.code==="EALREADY"||/\b37\b/.test(d))return{kind:"failed",reason:`Service already loaded \u2014 run 'afk service restart ${e}' to reload with the new plist.`};if(/already bootstrapped|already loaded/i.test(d)){let u="";try{eo("launchctl",["bootout",`${ml()}/${ze(e)}`],{stdio:["ignore","pipe","pipe"],timeout:ys})}catch(p){u=p.message}try{eo("launchctl",["bootstrap",ml(),n],{stdio:["ignore","pipe","pipe"],timeout:ys})}catch(p){let f=p.message;return{kind:"failed",reason:`Bootstrap failed: ${u?`${f} (prior bootout: ${u})`:f}`}}}else return{kind:"failed",reason:`Bootstrap failed: ${d}`}}return{kind:"installed",plistPath:n,label:ze(e),watchPathsActive:!!o}}function fv(e,t={}){let n=no(e);if(!bs(n))return{kind:"not-installed",plistPath:n};if(!t.skipBootout)try{eo("launchctl",["bootout",`${ml()}/${ze(e)}`],{stdio:"ignore",timeout:ys})}catch{}try{IU(n,{force:!0})}catch(r){return{kind:"failed",reason:`Failed to remove plist: ${r.message}`}}return{kind:"uninstalled",plistPath:n}}function ks(){if(process.platform!=="darwin")throw new Error(`'afk service' uses macOS launchd and is only supported on darwin. Detected: ${process.platform}.`)}function hl(e){let t=e.toLowerCase();if(to.includes(t))return t;throw new Error(`Unknown service '${e}'. Supported: ${to.join(", ")}.`)}function yv(e){let t=e.command("service").description("Manage AFK background services via macOS launchd (always-on, auto-restart)");t.command("install <name>").description(`Install <${to.join("|")}> as a LaunchAgent that starts on login and relaunches on crash`).option("--no-watch","Disable WatchPaths (no auto-restart on rebuild)").option("--dry-run","Write the plist but do not call launchctl",!1).action((n,r)=>{try{ks();let o=hl(n),s=mv(o,{noWatch:r.watch===!1,skipBootstrap:!!r.dryRun});if(s.kind==="already-installed"&&(console.log($e.yellow(`\u26A0 ${s.label} already installed at ${s.plistPath}`)),console.log(m.meta(` Run 'afk service uninstall ${o}' first to reinstall.`)),process.exit(1)),s.kind==="failed"&&(console.error($e.red(`\u2717 Install failed: ${s.reason}`)),process.exit(1)),console.log($e.green(`\u2713 Installed ${s.label}`)),console.log(m.meta(` Plist: ${s.plistPath}`)),console.log(m.meta(` Log: ${gl(o)}`)),s.watchPathsActive?console.log(m.meta(" WatchPaths: active \u2014 service auto-restarts on rebuild.")):console.log(m.meta(" WatchPaths: off \u2014 manual 'afk service restart' needed after updates.")),r.dryRun){let i=process.getuid?.()??501;console.log(m.info(" (dry-run) launchctl bootstrap was skipped; service is NOT yet running.")),console.log(m.meta(` Load manually: launchctl bootstrap gui/${i} ${s.plistPath}`))}else console.log(m.meta(` Status: afk service status ${o}`))}catch(o){U(o)}}),t.command("uninstall <name>").description("Stop the service and remove its LaunchAgent plist").action(n=>{try{ks();let r=hl(n),o=fv(r);if(o.kind==="not-installed"){console.log($e.yellow(`\u26A0 ${ze(r)} is not installed (no plist at ${o.plistPath})`));return}o.kind==="failed"&&(console.error($e.red(`\u2717 Uninstall failed: ${o.reason}`)),process.exit(1)),console.log($e.green(`\u2713 Uninstalled ${ze(r)}`)),console.log(m.meta(` Removed: ${o.plistPath}`))}catch(r){U(r)}}),t.command("status [name]").description("Show running PID, last exit status, and log file for one or all services").action(n=>{try{if(ks(),n){let r=Fu(hl(n));hv(r);return}for(let r of to)hv(Fu(r)),console.log("")}catch(r){U(r)}}),t.command("list").description("List recognised service names and whether each is installed").action(()=>{try{ks(),console.log($e.bold("AFK services:"));for(let n of to){let r=no(n),o=gv(r),s=o?$e.green("\u25CF"):$e.dim("\u25CB"),i=o?m.meta("installed"):m.meta("not installed");console.log(` ${s} ${n.padEnd(10)} ${i} ${m.meta(r)}`)}}catch(n){U(n)}}),t.command("restart <name>").description("Restart the service (launchctl kickstart -k)").action(n=>{try{ks();let r=hl(n),o=no(r);if(gv(o)||(console.error($e.red(`\u2717 ${ze(r)} is not installed. Run 'afk service install ${r}' first.`)),process.exit(1)),typeof process.getuid!="function")throw new Error("process.getuid is unavailable \u2014 afk service restart requires a POSIX system.");let s=process.getuid();try{jU("launchctl",["kickstart","-k",`gui/${s}/${ze(r)}`],{stdio:["ignore","pipe","pipe"],timeout:8e3}),console.log($e.green(`\u2713 Restarted ${ze(r)}`))}catch(i){console.error($e.red(`\u2717 Restart failed: ${i.message}`)),process.exit(1)}}catch(r){U(r)}})}function hv(e){if(console.log($e.bold(`${e.label}`)),!e.installed){console.log(` ${$e.dim("\u25CB")} Not installed`),console.log(m.meta(` Plist: ${e.plistPath}`)),console.log(m.meta(` Install: afk service install ${e.name}`));return}e.pid!==void 0?console.log(` ${$e.green("\u25CF")} Running (PID ${e.pid})`):(console.log(` ${$e.yellow("\u25CF")} Installed but not running`),e.lastExitStatus!==void 0&&e.lastExitStatus!==0&&console.log(m.meta(` Last exit status: ${e.lastExitStatus}`))),console.log(m.meta(` Plist: ${e.plistPath}`)),console.log(m.meta(` Log: ${e.logFile}`))}import{readFileSync as WU,readdirSync as HU,statSync as KU}from"fs";import{join as Uu}from"path";F();import{join as ro}from"path";function BU(){return ro(pt(),"improve")}function nr(){return ro(BU(),"failure-cards")}function bv(){return ro(nr(),".index.jsonl")}function Nu(e){return ro(nr(),`${e}.json`)}function kv(e){return ro(nr(),`${e}.md`)}function wv(){return ro(he(),"witness")}H();function Sv(e){let t=e.trim(),n=/^(\d+)\s*([smhd])$/i.exec(t);if(!n)return;let r=Number.parseInt(n[1]??"0",10),o=(n[2]??"").toLowerCase();if(!(!Number.isFinite(r)||r<=0))switch(o){case"s":return r*1e3;case"m":return r*60*1e3;case"h":return r*60*60*1e3;case"d":return r*24*60*60*1e3;default:return}}function vv(e={}){let t=e.witnessRoot??wv(),n=e.afkHome??E.AFK_HOME??zU(),r=e.sinceMs,o={sessionsScanned:0,sessionsSkippedOld:0,sessionsSkippedEmpty:0,invalidLineCount:0,sessions:[]},s;try{s=HU(t)}catch{return o}for(let i of s){if(i.startsWith("."))continue;let a=Uu(t,i),l;try{l=KU(a)}catch{continue}if(!l.isDirectory())continue;if(r!==void 0&&l.mtimeMs<r){o.sessionsSkippedOld+=1;continue}let c=Uu(a,"trace.jsonl"),d;try{d=WU(c,"utf-8")}catch{o.sessionsSkippedEmpty+=1;continue}let u=qU(c,n),p=GU({sessionId:i,tracePath:c,relativeTracePath:u,content:d,sessionMtimeMs:l.mtimeMs});o.sessions.push(p),o.sessionsScanned+=1,o.invalidLineCount+=p.invalidLineCount}return o}function GU(e){let{sessionId:t,tracePath:n,relativeTracePath:r,content:o,sessionMtimeMs:s}=e,i=[],a=0,l=o.split(`
2301
+ `)){let o=r.split(" "),s=o.length>=3?o:r.trim().split(/\s+/);if(s.length<3||s[2]?.trim()!==t)continue;let i=s[0]?.trim()??"-",a=s[1]?.trim()??"0",l={};if(i!=="-"&&i!==""){let d=Number.parseInt(i,10);Number.isFinite(d)&&(l.pid=d)}let c=Number.parseInt(a,10);return Number.isFinite(c)&&(l.lastExitStatus=c),l}}var ys=8e3;function Fu(e){let t=no(e),n={name:e,label:ze(e),installed:bs(t),plistPath:t,logFile:gl(e)};if(!n.installed)return n;try{let r=eo("launchctl",["list"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:ys}),o=UU(r,n.label);o&&(o.pid!==void 0&&(n.pid=o.pid),o.lastExitStatus!==void 0&&(n.lastExitStatus=o.lastExitStatus))}catch{}return n}function mv(e,t={}){let n=no(e);if(bs(n))return{kind:"already-installed",plistPath:n,label:ze(e)};let r;try{r=pv(e,t._entrypointExistsCheck)}catch(c){return{kind:"failed",reason:c.message}}let o=t.noWatch?void 0:NU(e,t._entrypointExistsCheck),s=gl(e);lv(dv(),{recursive:!0}),lv(OU(s),{recursive:!0});let i={label:ze(e),programArguments:r,workingDirectory:fl(),standardOutPath:s,standardErrorPath:s,...o?{watchPaths:o}:{},...t.environment?{environmentVariables:t.environment}:{}},a=DU(i),l=`${n}.tmp`;try{MU(l,a,{encoding:"utf-8",flag:"wx",mode:384})}catch(c){return{kind:"failed",reason:`Failed to write plist (tmp ${l}): ${c.message}`}}try{CU(l,n)}catch(c){try{PU(l)}catch{}return{kind:"failed",reason:`Failed to install plist (rename ${l} \u2192 ${n}): ${c.message}`}}if(t.skipBootstrap)return{kind:"installed",plistPath:n,label:ze(e),watchPathsActive:!!o};try{eo("launchctl",["bootstrap",ml(),n],{stdio:["ignore","pipe","pipe"],timeout:ys})}catch(c){let d=c.message;if(c.code==="EALREADY"||/\b37\b/.test(d))return{kind:"failed",reason:`Service already loaded \u2014 run 'afk service restart ${e}' to reload with the new plist.`};if(/already bootstrapped|already loaded/i.test(d)){let u="";try{eo("launchctl",["bootout",`${ml()}/${ze(e)}`],{stdio:["ignore","pipe","pipe"],timeout:ys})}catch(p){u=p.message}try{eo("launchctl",["bootstrap",ml(),n],{stdio:["ignore","pipe","pipe"],timeout:ys})}catch(p){let f=p.message;return{kind:"failed",reason:`Bootstrap failed: ${u?`${f} (prior bootout: ${u})`:f}`}}}else return{kind:"failed",reason:`Bootstrap failed: ${d}`}}return{kind:"installed",plistPath:n,label:ze(e),watchPathsActive:!!o}}function fv(e,t={}){let n=no(e);if(!bs(n))return{kind:"not-installed",plistPath:n};if(!t.skipBootout)try{eo("launchctl",["bootout",`${ml()}/${ze(e)}`],{stdio:"ignore",timeout:ys})}catch{}try{IU(n,{force:!0})}catch(r){return{kind:"failed",reason:`Failed to remove plist: ${r.message}`}}return{kind:"uninstalled",plistPath:n}}function ks(){if(process.platform!=="darwin")throw new Error(`'afk service' uses macOS launchd and is only supported on darwin. Detected: ${process.platform}.`)}function hl(e){let t=e.toLowerCase();if(to.includes(t))return t;throw new Error(`Unknown service '${e}'. Supported: ${to.join(", ")}.`)}function yv(e){let t=e.command("service").description("Manage AFK background services via macOS launchd (always-on, auto-restart)");t.command("install <name>").description(`Install <${to.join("|")}> as a LaunchAgent that starts on login and relaunches on crash`).option("--no-watch","Disable WatchPaths (no auto-restart on rebuild)").option("--dry-run","Write the plist but do not call launchctl",!1).action((n,r)=>{try{ks();let o=hl(n),s=mv(o,{noWatch:r.watch===!1,skipBootstrap:!!r.dryRun});if(s.kind==="already-installed"&&(console.log($e.yellow(`\u26A0 ${s.label} already installed at ${s.plistPath}`)),console.log(m.meta(` Run 'afk service uninstall ${o}' first to reinstall.`)),process.exit(1)),s.kind==="failed"&&(console.error($e.red(`\u2717 Install failed: ${s.reason}`)),process.exit(1)),console.log($e.green(`\u2713 Installed ${s.label}`)),console.log(m.meta(` Plist: ${s.plistPath}`)),console.log(m.meta(` Log: ${gl(o)}`)),s.watchPathsActive?console.log(m.meta(" WatchPaths: active \u2014 service auto-restarts on rebuild.")):console.log(m.meta(" WatchPaths: off \u2014 manual 'afk service restart' needed after updates.")),r.dryRun){let i=process.getuid?.()??501;console.log(m.info(" (dry-run) launchctl bootstrap was skipped; service is NOT yet running.")),console.log(m.meta(` Load manually: launchctl bootstrap gui/${i} ${s.plistPath}`))}else console.log(m.meta(` Status: afk service status ${o}`))}catch(o){U(o)}}),t.command("uninstall <name>").description("Stop the service and remove its LaunchAgent plist").action(n=>{try{ks();let r=hl(n),o=fv(r);if(o.kind==="not-installed"){console.log($e.yellow(`\u26A0 ${ze(r)} is not installed (no plist at ${o.plistPath})`));return}o.kind==="failed"&&(console.error($e.red(`\u2717 Uninstall failed: ${o.reason}`)),process.exit(1)),console.log($e.green(`\u2713 Uninstalled ${ze(r)}`)),console.log(m.meta(` Removed: ${o.plistPath}`))}catch(r){U(r)}}),t.command("status [name]").description("Show running PID, last exit status, and log file for one or all services").action(n=>{try{if(ks(),n){let r=Fu(hl(n));hv(r);return}for(let r of to)hv(Fu(r)),console.log("")}catch(r){U(r)}}),t.command("list").description("List recognised service names and whether each is installed").action(()=>{try{ks(),console.log($e.bold("AFK services:"));for(let n of to){let r=no(n),o=gv(r),s=o?$e.green("\u25CF"):$e.dim("\u25CB"),i=o?m.meta("installed"):m.meta("not installed");console.log(` ${s} ${n.padEnd(10)} ${i} ${m.meta(r)}`)}}catch(n){U(n)}}),t.command("restart <name>").description("Restart the service (launchctl kickstart -k)").action(n=>{try{ks();let r=hl(n),o=no(r);if(gv(o)||(console.error($e.red(`\u2717 ${ze(r)} is not installed. Run 'afk service install ${r}' first.`)),process.exit(1)),typeof process.getuid!="function")throw new Error("process.getuid is unavailable \u2014 afk service restart requires a POSIX system.");let s=process.getuid();try{jU("launchctl",["kickstart","-k",`gui/${s}/${ze(r)}`],{stdio:["ignore","pipe","pipe"],timeout:8e3}),console.log($e.green(`\u2713 Restarted ${ze(r)}`))}catch(i){console.error($e.red(`\u2717 Restart failed: ${i.message}`)),process.exit(1)}}catch(r){U(r)}})}function hv(e){if(console.log($e.bold(`${e.label}`)),!e.installed){console.log(` ${$e.dim("\u25CB")} Not installed`),console.log(m.meta(` Plist: ${e.plistPath}`)),console.log(m.meta(` Install: afk service install ${e.name}`));return}e.pid!==void 0?console.log(` ${$e.green("\u25CF")} Running (PID ${e.pid})`):(console.log(` ${$e.yellow("\u25CF")} Installed but not running`),e.lastExitStatus!==void 0&&e.lastExitStatus!==0&&console.log(m.meta(` Last exit status: ${e.lastExitStatus}`))),console.log(m.meta(` Plist: ${e.plistPath}`)),console.log(m.meta(` Log: ${e.logFile}`))}import{readFileSync as WU,readdirSync as HU,statSync as KU}from"fs";import{join as Uu}from"path";F();import{join as ro}from"path";function BU(){return ro(pt(),"improve")}function nr(){return ro(BU(),"failure-cards")}function bv(){return ro(nr(),".index.jsonl")}function Nu(e){return ro(nr(),`${e}.json`)}function kv(e){return ro(nr(),`${e}.md`)}function wv(){return ro(he(),"witness")}K();function Sv(e){let t=e.trim(),n=/^(\d+)\s*([smhd])$/i.exec(t);if(!n)return;let r=Number.parseInt(n[1]??"0",10),o=(n[2]??"").toLowerCase();if(!(!Number.isFinite(r)||r<=0))switch(o){case"s":return r*1e3;case"m":return r*60*1e3;case"h":return r*60*60*1e3;case"d":return r*24*60*60*1e3;default:return}}function vv(e={}){let t=e.witnessRoot??wv(),n=e.afkHome??E.AFK_HOME??zU(),r=e.sinceMs,o={sessionsScanned:0,sessionsSkippedOld:0,sessionsSkippedEmpty:0,invalidLineCount:0,sessions:[]},s;try{s=HU(t)}catch{return o}for(let i of s){if(i.startsWith("."))continue;let a=Uu(t,i),l;try{l=KU(a)}catch{continue}if(!l.isDirectory())continue;if(r!==void 0&&l.mtimeMs<r){o.sessionsSkippedOld+=1;continue}let c=Uu(a,"trace.jsonl"),d;try{d=WU(c,"utf-8")}catch{o.sessionsSkippedEmpty+=1;continue}let u=qU(c,n),p=GU({sessionId:i,tracePath:c,relativeTracePath:u,content:d,sessionMtimeMs:l.mtimeMs});o.sessions.push(p),o.sessionsScanned+=1,o.invalidLineCount+=p.invalidLineCount}return o}function GU(e){let{sessionId:t,tracePath:n,relativeTracePath:r,content:o,sessionMtimeMs:s}=e,i=[],a=0,l=o.split(`
2300
2302
  `);for(let c=0;c<l.length;c+=1){let d=l[c]??"";if(d.trim()==="")continue;let u;try{u=JSON.parse(d)}catch{a+=1;continue}let p=Nh.safeParse(u);if(!p.success){a+=1;continue}i.push({sessionId:t,tracePath:n,relativeTracePath:r,lineNumber:c+1,rawLine:d,event:p.data})}return{sessionId:t,tracePath:n,relativeTracePath:r,sessionMtimeMs:s,events:i,invalidLineCount:a}}function zU(){let e=E.AFK_HOME;return e&&e.length>0?e:Uu(E.HOME??"",".afk")}function qU(e,t){if(!t)return e;if(e.startsWith(t)){let n=e.slice(t.length);return n.startsWith("/")&&(n=n.slice(1)),n}return e}import{createHash as JU}from"crypto";var yl=4,VU=8,YU="v1-bytes-tuple";function Tv(e,t={}){let n=t.minRepeats??yl;if(n<2)throw new Error(`minRepeats must be >= 2 (got ${n})`);let r=[];for(let o of e){let s=XU(o,n);r.push(...s)}return r}function XU(e,t){let n=QU(e.events),r=ZU(n),o=[];for(let[s,i]of r.entries()){let a=ej(i,t);for(let l of a)o.push(nj(e,l,s))}return o}function QU(e){let t=new Map,n=[];for(let r of e){let o=r.event;if(o.kind!=="tool_call")continue;if(o.payload.phase==="started"){t.set(o.payload.toolUseId,{seq:o.seq,name:o.payload.name,inputBytes:o.payload.inputBytes,subagentId:o.payload.subagentId});continue}let s=t.get(o.payload.toolUseId);if(!s)continue;t.delete(o.payload.toolUseId);let i=tj({name:o.payload.name,inputBytes:s.inputBytes,resultBytes:o.payload.resultBytes,isError:o.payload.isError,subagentId:s.subagentId});n.push({toolUseId:o.payload.toolUseId,startedSeq:s.seq,completedSeq:o.seq,completedLineNumber:r.lineNumber,name:o.payload.name,inputBytes:s.inputBytes,resultBytes:o.payload.resultBytes,isError:o.payload.isError,subagentId:s.subagentId,rawLine:r.rawLine,fingerprint:i})}return n}function ZU(e){let t=new Map;for(let n of e){let r=n.subagentId??"root",o=t.get(r);o?o.push(n):t.set(r,[n])}return t}function ej(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r];if(!o){r+=1;continue}let s=r+1;for(;s<e.length;){let a=e[s];if(!a||a.fingerprint!==o.fingerprint)break;s+=1}s-r>=t&&n.push(e.slice(r,s)),r=s>r?s:r+1}return n}function tj(e){let t=[e.name,String(e.inputBytes),String(e.resultBytes),e.isError?"1":"0",e.subagentId??""].join("|");return JU("sha256").update(t).digest("hex")}function nj(e,t,n){let r=t[0];if(!r)throw new Error("repeated-tool-use: empty run");let o=aj(r.name,r.fingerprint),s=new Date().toISOString(),i=t.slice(0,VU),a=[{sessionId:e.sessionId,tracePath:e.relativeTracePath,eventIndices:i.map(l=>l.completedSeq),excerpt:rj(i),annotation:oj(t,n)}];return{slug:o,title:sj(r.name,t.length),pattern:"repeated-tool-use",severity:ij(t.length),observedAt:s,evidence:a,detail:{detector:"repeated-tool-use@v1",fingerprintAlgorithm:YU,fingerprint:r.fingerprint,toolName:r.name,runLength:t.length,agentContext:n,inputBytes:r.inputBytes,resultBytes:r.resultBytes,isError:r.isError,toolUseIds:t.map(l=>l.toolUseId),completedSeqs:t.map(l=>l.completedSeq)}}}function rj(e){let t=e.map(n=>n.rawLine).join(`
2301
2303
  `);return t.length<=2e3?t:t.slice(0,1997)+"..."}function oj(e,t){let n=e[0],r=e[e.length-1];return!n||!r?"":[`${e.length}\xD7 consecutive '${n.name}' calls in ${t} context`,`(seq ${n.completedSeq}\u2026${r.completedSeq},`,`inputBytes=${n.inputBytes}, resultBytes=${n.resultBytes},`,`isError=${n.isError})`].join(" ")}function sj(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function ij(e){return e>=10?"high":e>=4?"medium":"low"}function aj(e,t){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),r=t.slice(0,12);return`repeated-tool-${n.length>0?n:"tool"}-${r}`}import{existsSync as bl,mkdirSync as _v,readFileSync as dj,readdirSync as uj,renameSync as Cv,writeFileSync as Wu}from"fs";import{join as pj}from"path";import{z as Z}from"zod";var ju=Z.enum(["repeated-tool-use"]),Ev=Z.enum(["low","medium","high"]),lj=Z.enum(["open","deferred","resolved"]),xv=Z.object({sessionId:Z.string().min(1),tracePath:Z.string().min(1),eventIndices:Z.array(Z.number().int().nonnegative()).min(1),excerpt:Z.string().max(2e3),annotation:Z.string().optional()}),cj=Z.object({at:Z.string().datetime(),text:Z.string()}),Bu=Z.object({schemaVersion:Z.literal(1),slug:Z.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:Z.string().min(1).max(200),pattern:ju,severity:Ev,status:lj,firstSeen:Z.string().datetime(),lastSeen:Z.string().datetime(),occurrenceCount:Z.number().int().nonnegative(),evidence:Z.array(xv).min(1),detail:Z.record(Z.string(),Z.unknown()),notes:Z.array(cj).default([])}),Uie=Z.object({slug:Z.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:Z.string().min(1).max(200),pattern:ju,severity:Ev,observedAt:Z.string().datetime(),evidence:Z.array(xv).min(1),detail:Z.record(Z.string(),Z.unknown())}),Av=Z.object({timestamp:Z.string().datetime(),event:Z.enum(["created","updated","merged-noop"]),slug:Z.string(),pattern:ju,occurrenceCount:Z.number().int().nonnegative(),evidenceAdded:Z.number().int().nonnegative()});function Iv(e){let t=nr();bl(t)||_v(t,{recursive:!0});let n=Nu(e.slug),r=kv(e.slug),o=Hu(n),s=mj(o,e),i=o===void 0,a=s.evidence.length-(o?.evidence.length??0),l=i?"created":a>0?"updated":"merged-noop",c=Bu.parse(s);return hj(n,c),yj(r,Ku(c)),gj({timestamp:bj(),event:l,slug:c.slug,pattern:c.pattern,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a)}),{slug:c.slug,event:l,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a),jsonPath:n,markdownPath:r}}function Hu(e){if(bl(e))try{let t=dj(e,"utf-8"),n=JSON.parse(t),r=Bu.safeParse(n);return r.success?r.data:void 0}catch{return}}function mj(e,t){if(!e)return{schemaVersion:1,slug:t.slug,title:t.title,pattern:t.pattern,severity:t.severity,status:"open",firstSeen:t.observedAt,lastSeen:t.observedAt,occurrenceCount:t.evidence.length,evidence:t.evidence,detail:t.detail,notes:[]};if(e.slug!==t.slug)throw new Error(`card-writer: slug mismatch on merge (existing='${e.slug}', detection='${t.slug}')`);let n=fj(e.evidence,t.evidence),r=kj(e.firstSeen,t.observedAt),o=wj(e.lastSeen,t.observedAt),s=Sj(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:s,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function fj(e,t){let n=s=>`${s.sessionId}::${s.eventIndices[0]??"NA"}`,r=new Set(e.map(n)),o=[...e];for(let s of t){let i=n(s);r.has(i)||(r.add(i),o.push(s))}return o}function Ku(e){let t=[];t.push(`# ${e.slug} \u2014 \`${e.severity}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Pattern:** \`${e.pattern}\` \xB7 **Occurrences:** ${e.occurrenceCount} \xB7 **First seen:** ${e.firstSeen} \xB7 **Last seen:** ${e.lastSeen}`),t.push(""),t.push("## Evidence"),t.push("");for(let n of e.evidence)t.push(`### Session \`${n.sessionId}\``),t.push(""),t.push(`- Trace: \`${n.tracePath}\``),t.push(`- Event seqs: ${n.eventIndices.join(", ")}`),n.annotation&&t.push(`- Note: ${n.annotation}`),t.push(""),t.push("```jsonl"),t.push(n.excerpt),t.push("```"),t.push("");if(t.push("## Detail"),t.push(""),t.push("```json"),t.push(JSON.stringify(e.detail,null,2)),t.push("```"),t.push(""),e.notes.length>0){t.push("## Triage notes"),t.push("");for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);t.push("")}else t.push("## Triage notes"),t.push(""),t.push("_(none \u2014 Phase 1A does not write notes; see `afk improve cards` future subcommands)_"),t.push("");return t.join(`
2302
2304
  `)}function gj(e){let t=Av.parse(e),n=bv(),r=nr();bl(r)||_v(r,{recursive:!0});try{Wu(n,JSON.stringify(t)+`