agent-afk 3.42.0 → 3.42.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var Ia=[{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). The OpenAI SDK appends `/chat/completions` itself \u2014 a value ending in `/chat/completions` will be stripped at config-load time with a one-shot warning.",type:"string",required:!1,example:"http://127.0.0.1:8000/v1",category:"model"},{name:"AFK_PROVIDER",description:"Force provider selection (anthropic | anthropic-direct | openai | openai-compatible | openai-codex). Overrides the model-name heuristic. Same surface as the --provider CLI flag; CLI flag wins when both are set.",type:"string",required:!1,example:"openai-compatible",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"},{name:"AFK_DEMO_CLEAN",description:"Explicit opt-in to capture-mode. When set to 1, suppresses high-frequency repaint drivers (spinner ticker, live thinking-preview) so recorded artifacts contain each state once instead of once per timer tick.",type:"boolean",required:!1,example:"1",category:"misc"},{name:"SCRIPT",description:"Set by script(1) on BSD/macOS/Linux to the typescript filename while a terminal session is being recorded. Presence of a non-empty value triggers capture-mode.",type:"string",required:!1,example:"/tmp/typescript",category:"process"},{name:"ASCIINEMA_REC",description:"Set to 1 by asciinema rec while a session is being recorded. Triggers capture-mode.",type:"boolean",required:!1,example:"1",category:"process"},{name:"SHELL",description:"Standard POSIX env var pointing to the user's login shell binary. Used by shell-init and worktree commands to auto-detect the correct shell syntax for emitted wrapper code.",type:"string",required:!1,example:"/bin/zsh",category:"process"},{name:"PAGER",description:"Standard POSIX env var naming the user's preferred pager (with optional flags). Used by /transcript to render the full session in a scrollable viewer; falls back to `less -R` when unset.",type:"string",required:!1,example:"less -R",category:"process"},{name:"AFK_DIFF_LINES",description:"Maximum number of diff lines shown in the inline diff render during write_file tool calls. Set to 0 for no cap. Non-integer values are silently ignored and the default applies.",type:"number",required:!1,example:"50",category:"misc"},{name:"AFK_SHELL_WRAPPER",description:"Set to 1 or true by the optional afk shell wrapper function (installed via `afk shell-init`). Signals that the parent shell has the wrapper active so the post-exit cd can fire.",type:"boolean",required:!1,example:"1",category:"process"}],v={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 AFK_PROVIDER(){return process.env.AFK_PROVIDER},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},get AFK_DEMO_CLEAN(){return process.env.AFK_DEMO_CLEAN},get SCRIPT(){return process.env.SCRIPT},get ASCIINEMA_REC(){return process.env.ASCIINEMA_REC},get SHELL(){return process.env.SHELL},get PAGER(){return process.env.PAGER},get AFK_DIFF_LINES(){return process.env.AFK_DIFF_LINES},get AFK_SHELL_WRAPPER(){return process.env.AFK_SHELL_WRAPPER}};(function(){for(let e of Ia){if(!e.secret)continue;let n=Object.getOwnPropertyDescriptor(v,e.name);n&&Object.defineProperty(v,e.name,{...n,enumerable:!1})}})();function Ca(){return v.AFK_DEBUG==="1"||v.DEBUG==="1"}function M(...t){Ca()&&console.log(...t)}var ne=class extends Error{constructor(e){super(e),this.name="AbortError"}},be=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},q=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 Ne=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};async function Sn(t,e){if(t)try{await t.write({kind:"tool_call",payload:e})}catch(n){M(`trace.emit tool_call failed: ${Oe(n)}`)}}async function $e(t,e){if(t)try{await t.write({kind:"hook_decision",payload:e})}catch(n){M(`trace.emit hook_decision failed: ${Oe(n)}`)}}async function Me(t,e){if(t)try{await t.write({kind:"subagent_lifecycle",payload:e})}catch(n){M(`trace.emit subagent_lifecycle failed: ${Oe(n)}`)}}async function Lr(t,e){if(t)try{await t.write({kind:"budget",payload:e})}catch(n){M(`trace.emit budget failed: ${Oe(n)}`)}}async function Nr(t,e){if(t)try{await t.write({kind:"abort",payload:e})}catch(n){M(`trace.emit abort failed: ${Oe(n)}`)}}async function $r(t,e){if(t)try{await t.write({kind:"compaction",payload:e})}catch(n){M(`trace.emit compaction failed: ${Oe(n)}`)}}async function Ur(t,e){if(t)try{await t.write({kind:"closure",payload:e})}catch(n){M(`trace.emit closure failed: ${Oe(n)}`)}}function Oe(t){return t instanceof Error?t.message:String(t)}import kr from"path";import{appendFileSync as _f,mkdirSync as Tf}from"fs";import{dirname as xf}from"path";import Bi from"@anthropic-ai/sdk";var jr="claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14",Ma="effort-2025-11-24",Oa="claude-cli/1.0.0 (external, cli)",Da="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;";function Hr(t){return t.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function vn(t,e,n){let r=e==="oauth"?{authToken:t}:{apiKey:t};return typeof n=="string"&&n.length>0?{...r,baseURL:n}:r}function we(t,e,n,r){return t!=="oauth"?{}:{"anthropic-beta":r?`${jr},${Ma}`:jr,"x-app":"cli","User-Agent":Oa,"X-Claude-Code-Session-Id":e,"x-client-request-id":n}}function Br(t){return t!=="oauth"?null:[{type:"text",text:Da}]}import{execFileSync as Wr}from"child_process";import{existsSync as Fa,readFileSync as La,writeFileSync as Na}from"fs";import{homedir as Kr,userInfo as Gr}from"os";import{join as qr}from"path";var $a="9d1c250a-e61b-44d9-88ed-5944d1962f5e",Ua="https://platform.claude.com/v1/oauth/token",ja=300*1e3;function re(){let t=zr();if(t===void 0)return;let e=Jr(t);if(e!==void 0){if(e.expiresAt!==void 0&&e.expiresAt<=Date.now()){process.stderr.write("agent-afk: Claude Code OAuth token in keychain is expired. Run `claude login` to refresh.\n");return}return e.accessToken}}async function En(){let t=zr();if(t===void 0)return;let e=Jr(t);if(e===void 0)return;if(e.expiresAt!==void 0&&e.expiresAt>Date.now()+ja)return e.accessToken;if(!e.refreshToken){process.stderr.write("agent-afk: OAuth token expired and no refresh token available. Run `claude login` to refresh.\n");return}let n=await Ha(e.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(t)}catch{}let o=r.claudeAiOauth??{};r.claudeAiOauth={...o,accessToken:n.accessToken,expiresAt:n.expiresAt,...n.refreshToken!==void 0?{refreshToken:n.refreshToken}:{}},Ba(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
1
+ var Ia=[{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). The OpenAI SDK appends `/chat/completions` itself \u2014 a value ending in `/chat/completions` will be stripped at config-load time with a one-shot warning.",type:"string",required:!1,example:"http://127.0.0.1:8000/v1",category:"model"},{name:"AFK_PROVIDER",description:"Force provider selection (anthropic | anthropic-direct | openai | openai-compatible | openai-codex). Overrides the model-name heuristic. Same surface as the --provider CLI flag; CLI flag wins when both are set.",type:"string",required:!1,example:"openai-compatible",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"},{name:"AFK_DEMO_CLEAN",description:"Explicit opt-in to capture-mode. When set to 1, suppresses high-frequency repaint drivers (spinner ticker, live thinking-preview) so recorded artifacts contain each state once instead of once per timer tick.",type:"boolean",required:!1,example:"1",category:"misc"},{name:"SCRIPT",description:"Set by script(1) on BSD/macOS/Linux to the typescript filename while a terminal session is being recorded. Presence of a non-empty value triggers capture-mode.",type:"string",required:!1,example:"/tmp/typescript",category:"process"},{name:"ASCIINEMA_REC",description:"Set to 1 by asciinema rec while a session is being recorded. Triggers capture-mode.",type:"boolean",required:!1,example:"1",category:"process"},{name:"SHELL",description:"Standard POSIX env var pointing to the user's login shell binary. Used by shell-init and worktree commands to auto-detect the correct shell syntax for emitted wrapper code.",type:"string",required:!1,example:"/bin/zsh",category:"process"},{name:"PAGER",description:"Standard POSIX env var naming the user's preferred pager (with optional flags). Used by /transcript to render the full session in a scrollable viewer; falls back to `less -R` when unset.",type:"string",required:!1,example:"less -R",category:"process"},{name:"AFK_DIFF_LINES",description:"Maximum number of diff lines shown in the inline diff render during write_file tool calls. Set to 0 for no cap. Non-integer values are silently ignored and the default applies.",type:"number",required:!1,example:"50",category:"misc"},{name:"AFK_SHELL_WRAPPER",description:"Set to 1 or true by the optional afk shell wrapper function (installed via `afk shell-init`). Signals that the parent shell has the wrapper active so the post-exit cd can fire.",type:"boolean",required:!1,example:"1",category:"process"}],v={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 AFK_PROVIDER(){return process.env.AFK_PROVIDER},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},get AFK_DEMO_CLEAN(){return process.env.AFK_DEMO_CLEAN},get SCRIPT(){return process.env.SCRIPT},get ASCIINEMA_REC(){return process.env.ASCIINEMA_REC},get SHELL(){return process.env.SHELL},get PAGER(){return process.env.PAGER},get AFK_DIFF_LINES(){return process.env.AFK_DIFF_LINES},get AFK_SHELL_WRAPPER(){return process.env.AFK_SHELL_WRAPPER}};(function(){for(let e of Ia){if(!e.secret)continue;let n=Object.getOwnPropertyDescriptor(v,e.name);n&&Object.defineProperty(v,e.name,{...n,enumerable:!1})}})();function Ca(){return v.AFK_DEBUG==="1"||v.DEBUG==="1"}function M(...t){Ca()&&console.log(...t)}var ne=class extends Error{constructor(e){super(e),this.name="AbortError"}},be=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},q=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 Ne=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};async function Sn(t,e){if(t)try{await t.write({kind:"tool_call",payload:e})}catch(n){M(`trace.emit tool_call failed: ${Oe(n)}`)}}async function $e(t,e){if(t)try{await t.write({kind:"hook_decision",payload:e})}catch(n){M(`trace.emit hook_decision failed: ${Oe(n)}`)}}async function Me(t,e){if(t)try{await t.write({kind:"subagent_lifecycle",payload:e})}catch(n){M(`trace.emit subagent_lifecycle failed: ${Oe(n)}`)}}async function Lr(t,e){if(t)try{await t.write({kind:"budget",payload:e})}catch(n){M(`trace.emit budget failed: ${Oe(n)}`)}}async function Nr(t,e){if(t)try{await t.write({kind:"abort",payload:e})}catch(n){M(`trace.emit abort failed: ${Oe(n)}`)}}async function $r(t,e){if(t)try{await t.write({kind:"compaction",payload:e})}catch(n){M(`trace.emit compaction failed: ${Oe(n)}`)}}async function Ur(t,e){if(t)try{await t.write({kind:"closure",payload:e})}catch(n){M(`trace.emit closure failed: ${Oe(n)}`)}}function Oe(t){return t instanceof Error?t.message:String(t)}import kr from"path";import{appendFileSync as xf,mkdirSync as Af}from"fs";import{dirname as Rf}from"path";import Bi from"@anthropic-ai/sdk";var jr="claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14",Ma="effort-2025-11-24",Oa="claude-cli/1.0.0 (external, cli)",Da="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;";function Hr(t){return t.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function vn(t,e,n){let r=e==="oauth"?{authToken:t}:{apiKey:t};return typeof n=="string"&&n.length>0?{...r,baseURL:n}:r}function we(t,e,n,r){return t!=="oauth"?{}:{"anthropic-beta":r?`${jr},${Ma}`:jr,"x-app":"cli","User-Agent":Oa,"X-Claude-Code-Session-Id":e,"x-client-request-id":n}}function Br(t){return t!=="oauth"?null:[{type:"text",text:Da}]}import{execFileSync as Wr}from"child_process";import{existsSync as Fa,readFileSync as La,writeFileSync as Na}from"fs";import{homedir as Kr,userInfo as Gr}from"os";import{join as qr}from"path";var $a="9d1c250a-e61b-44d9-88ed-5944d1962f5e",Ua="https://platform.claude.com/v1/oauth/token",ja=300*1e3;function re(){let t=zr();if(t===void 0)return;let e=Jr(t);if(e!==void 0){if(e.expiresAt!==void 0&&e.expiresAt<=Date.now()){process.stderr.write("agent-afk: Claude Code OAuth token in keychain is expired. Run `claude login` to refresh.\n");return}return e.accessToken}}async function En(){let t=zr();if(t===void 0)return;let e=Jr(t);if(e===void 0)return;if(e.expiresAt!==void 0&&e.expiresAt>Date.now()+ja)return e.accessToken;if(!e.refreshToken){process.stderr.write("agent-afk: OAuth token expired and no refresh token available. Run `claude login` to refresh.\n");return}let n=await Ha(e.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(t)}catch{}let o=r.claudeAiOauth??{};r.claudeAiOauth={...o,accessToken:n.accessToken,expiresAt:n.expiresAt,...n.refreshToken!==void 0?{refreshToken:n.refreshToken}:{}},Ba(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
2
2
  `)}return n.accessToken}function zr(){if(process.platform==="darwin")try{return Wr("security",["find-generic-password","-s","Claude Code-credentials","-a",Gr().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let t=qr(Kr(),".claude",".credentials.json");if(!Fa(t))return;try{return La(t,"utf-8")}catch{return}}}function Jr(t){let e;try{e=JSON.parse(t)}catch{return}if(typeof e!="object"||e===null)return;let n=e.claudeAiOauth;if(typeof n!="object"||n===null)return;let r=n,o=r.accessToken;if(typeof o!="string"||o.length===0)return;let s={accessToken:o},i=r.refreshToken;typeof i=="string"&&i.length>0&&(s.refreshToken=i);let c=r.expiresAt;return typeof c=="number"&&(s.expiresAt=c),s}async function Ha(t){try{let e=await fetch(Ua,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:$a})});if(!e.ok)return;let n=await e.json(),r=n.access_token,o=n.expires_in;if(typeof r!="string"||typeof o!="number")return;let s=n.refresh_token;return{accessToken:r,expiresAt:Date.now()+o*1e3,...typeof s=="string"&&s.length>0?{refreshToken:s}:{}}}catch{return}}function tt(t){if(!t||t.length<3)return"token:(unknown)";try{let n=t.split(".");if(n.length<2)throw new Error("not a JWT");let r=Buffer.from(n[1],"base64url").toString("utf-8"),o=JSON.parse(r),s=typeof o.email=="string"&&o.email||typeof o.sub=="string"&&o.sub||typeof o.account_id=="string"&&o.account_id||typeof o.preferred_username=="string"&&o.preferred_username;if(s)return s}catch{}return`token:${t.length>=8?t.slice(-8):t}`}function Ba(t){if(process.platform==="darwin")Wr("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",Gr().username,"-w",t],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let e=qr(Kr(),".claude",".credentials.json");Wa(e,t)}}function Wa(t,e){Na(t,e,{encoding:"utf-8",mode:384})}import{randomUUID as ji}from"node:crypto";var Ka="1h";function Tt(t){if(typeof t?.baseUrl=="string"&&t.baseUrl.length>0)return!1;let e=v.AFK_DISABLE_PROMPT_CACHE;if(e===void 0||e.length===0)return!0;let n=e.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function xt(){let t=v.AFK_PROMPT_CACHE_TTL;return t==="5m"?"5m":t==="1h"?"1h":Ka}function Vr(t,e){if(t.length===0)return t;let n=t[t.length-1],r=Xr(n,e);return r===n?t:[...t.slice(0,-1),r]}function Yr(t,e){if(t.length===0)return t;let n=t[t.length-1],r=Ga(n,e);return r===n?t:[...t.slice(0,-1),r]}function Ga(t,e){let n=t.content;if(typeof n=="string")return n.length===0?t:{...t,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:e}}]};if(!Array.isArray(n)||n.length===0)return t;let r=n[n.length-1],o=Xr(r,e);return o===r?t:{...t,content:[...n.slice(0,-1),o]}}function Xr(t,e){return t.type==="thinking"||t.type==="redacted_thinking"?t:{...t,cache_control:{type:"ephemeral",ttl:e}}}var _n=["## 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(`
3
3
  `);function Qr(t){return t!=="plan"?null:{type:"text",text:_n}}import{z as $}from"zod";import{mkdir as Ds,appendFile as Fs}from"fs/promises";import{join as or}from"path";var Zr={"audit-fit":{"01-skill-inspector.md":`# Skill Inspector
4
4
 
@@ -1113,7 +1113,7 @@ ${s}`}}}return{...t,systemPrompt:r}}import Ed from"openai";import{randomUUID as
1113
1113
  --
1114
1114
  ${d.content}`,isError:!0,...d.truncated===!0?{truncated:!0}:{}}),i.push({call:l,result:d}),yield{type:"tool.output",toolUseId:l.id,toolName:l.name,content:d.content,...d.isError===!0?{isError:!0}:{},...d.truncated===!0?{truncated:!0}:{},sessionId:this.initSessionId},d.render?.diff&&(yield{type:"tool.diff",toolUseId:l.id,diff:d.render.diff,sessionId:this.initSessionId})}}this.priorTurns.push(ms(e.assistantText,r));for(let c of gs(i))this.priorTurns.push(c)}async interrupt(){let e=this.abortController;if(e&&!e.signal.aborted){e.abort("interrupted");return}this.pendingAbortReason="interrupted"}async setModel(e){e!==void 0&&(this.currentModel=e)}async setPermissionMode(e){this.currentPermissionMode=ys(e)}setCwd(e){this.toolDispatcher?.setResolveBase?.(e)}async supportedCommands(){try{return ze().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 e=this.lastUsage,n=gt(this.currentModel),r;if(e&&n>0){let o=ht(e);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(e=>({name:e.serverName,status:e.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(e,n){return{canRewind:!1,error:`${Yn} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0;let e=this.abortController;e&&!e.signal.aborted?e.abort("closed"):this.pendingAbortReason="closed",this.closeResolve?.(),M(`\u{1F7E2} ${Yn}: closed`)}};function Ad(t){let e={apiKey:t.apiKey};return t.baseURL!==void 0&&(e.baseURL=t.baseURL),new Ed(e)}function Rd(t){if(!t||typeof t!="object")return"";let e=t,n=e.file_path??e.path??e.filePath;if(typeof n=="string")return" "+n;let r=e.command??e.cmd;if(typeof r=="string"){let s=r.split(`
1115
1115
  `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=e.query??e.pattern??e.url??e.description;return typeof o=="string"?" "+o:""}function bs(t,e,n={}){let r=zn(t.apiKey),o=t.resume??`openai-pending-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s=typeof t.model=="string"?t.model:"gpt-4o-mini",i={auth:r,model:s,synthesizedSessionId:o,promptStream:e,config:t};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 qt(i)}var ws="openai-compatible",ae=class{name=ws;providerOpts;memoryStore;schemas;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;constructor(e={}){this.providerOpts=e,this.memoryStore=e.memoryStore??new pe;let n=[...se];e.subagentExecutor&&n.push(Ee),e.skillExecutor&&n.push(_e),e.composeExecutor&&n.push(Te),n.push(...xe),n.push(ue),this.schemas=n}query(e){let n=e.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,s=typeof n.model=="string"?n.model:String(n.model),i=dt({surface:this.providerOpts.surface??"cli",cwd:n.cwd??process.cwd(),modelName:s,providerName:ws,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof ie?o.toolDefs.map(a=>a.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?ut(this.providerOpts.tools,i):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}:{},runtimeStateSource:i});let c={};return this.providerOpts.baseURL!==void 0&&(c.baseURL=this.providerOpts.baseURL),c.toolDispatcher=o,this.providerOpts.mcpManager!==void 0&&(c.mcpManager=this.providerOpts.mcpManager),bs(n,e.prompt,c)}buildDispatcher(e,n){let r=qe(e,n.cwd),o=lt(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[c,a]of o)r.set(c,a);n.runtimeStateSource&&r.set("get_runtime_state",We(n.runtimeStateSource));let s=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[c,a]of this.providerOpts.mcpManager.getMcpHandlers())r.set(c,a);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 ie(i)}ensureSharedRoots(e){if(!this._sharedReadRoots){let n=e?[e]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),e&&!this._initialResolveBase&&(this._initialResolveBase=e)}}addReadRoot(e,n="slash",r){this.ensureSharedRoots();let o=Xn.resolve(e);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(e,n="slash",r){this.ensureSharedRoots();let o=Xn.resolve(e);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(e,n="slash",r){if(!this._sharedReadRoots)return;let o=Xn.resolve(e);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(e){try{let n=Be();Id(Cd(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId??null,action:e.action,path:e.path,source:e.source});Pd(n,r+`
1116
- `)}catch{}}close(){this.memoryStore.close()}},Qn=new ae;var Md=new Set(["Agent","Task","agent"]),Od=new Set(["Skill","skill"]),Dd=new Set(["Compose","compose"]),Eb=new Set([...Md,...Dd,...Od]);var ks=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","memory_search"];var Fb=300*1e3;var bw=[...Dt,"agent","skill"];function vs(t,e){let n={allowedTools:[...ks]};return le(typeof e=="string"?e:void 0)==="openai-compatible"?new ae({permissions:n}):new fe({permissions:n})}function er(t){let e=$d(t);return e!==void 0?e:Ud(t)}function $d(t){let e=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=e.exec(t))!==null;)n=r[1];if(n)return Es(n.trim())}function Ud(t){for(let e=t.length-1;e>=0;e--){if(t[e]!=="}")continue;let n=jd(t,e);if(n===-1)continue;let r=t.slice(n,e+1),o=Es(r);if(o!==void 0)return o}}function jd(t,e){let n=0,r=!1,o=!1;for(let s=e;s>=0;s--){let i=t[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 Es(t){try{return JSON.parse(t)}catch{return}}function tr(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function _s(t,e,n,r,o){if(!r)return{id:t,status:e,message:n,trace:o};let s=er(n.content),i=r.safeParse(s);return i.success?{id:t,status:e,message:n,output:i.data,trace:o}:{id:t,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 Ts(t,e,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:t,status:e,error:o,trace:r}}function H(t){return`${t.status}${t.error?`: ${t.error.message}`:""}`}var zt=class{constructor(e,n,r,o,s,i,c,a,l,d,u,p,y,f){this.id=e;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=i;this.hookRegistry=c;this.onTerminal=a;this.parentInputStreamRef=l;this.parentAbortSignal=d;this.agentType=u;this.traceWriter=f;this.progressSink=p,this.parentId=y}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;currentTrace=tr();lastStreamedContent="";get status(){return this.currentStatus}async run(e,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=st(this.streamToFinalMessage(e,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",Me(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?(Me(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(Me(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(e,n){let r,o;this.lastStreamedContent="",this.currentTrace=tr();let s=n??this.progressSink??ve(),i={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let c of this.session.sendMessageStream(e)){if(s&&s(c,i),c.type==="chunk"){let a=c.chunk;a.type==="content"?this.lastStreamedContent+=a.content:a.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:a.toolUseId,name:a.toolName,inputBytes:Buffer.byteLength(a.toolInput,"utf8")}):a.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:a.toolUseId,isError:a.isError,truncated:a.truncated,sizeBytes:a.sizeBytes}):a.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(c.type==="message")r=c.message,this.currentTrace.turnCount++;else if(c.type==="error"){o=c.error;break}else if(c.type==="done"){if(typeof c.metadata?.usage=="object"&&c.metadata.usage!==null){let a=c.metadata.usage;this.currentTrace.usage={inputTokens:typeof a.input_tokens=="number"?a.input_tokens:void 0,outputTokens:typeof a.output_tokens=="number"?a.output_tokens:void 0,cacheReadTokens:typeof a.cache_read_input_tokens=="number"?a.cache_read_input_tokens:void 0,cacheCreationTokens:typeof a.cache_creation_input_tokens=="number"?a.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(e,n){try{let r=await this.run(e,n);return _s(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace)}catch(r){let o=Ts(this.id,this.currentStatus,r,this.currentTrace);return this.lastStreamedContent.length>0&&(o.partialOutput=this.lastStreamedContent),o}}runInBackground(e,n,r){let o;if(r){let s=this.progressSink??ve();o=(i,c)=>{r(i),s?.(i,c)}}this.runToResult(e,o).then(s=>{n?.(s)}).catch(s=>{M("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let e=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled",Me(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(e)}}async teardown(){if(this.stopDispatched)return;let e=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(e)}}async dispatchStopAndRelease(e){if(this.stopDispatched){this.onTerminal();return}this.stopDispatched=!0;let n=await to(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:e,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)M(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else try{this.parentInputStreamRef.pushUserMessage(n.injectContext)}catch(r){M(`Failed to inject context from SubagentStop handler: ${String(r)}`)}this.onTerminal()}};var Hd=async(t,e)=>({action:"decline"}),O=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentCwd;abortGraph;rootId;rootController;counter=0;constructor(e={}){if(this.parentCanUseTool=e.canUseTool,this.hookRegistry=e.hookRegistry,this.progressSink=e.progressSink,this.parentApiKey=e.apiKey,this.parentBaseUrl=e.baseUrl,this.parentCwd=e.cwd,this.abortGraph=new rt(e.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),e.parentAbortSignal){let n=e.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(e=>({id:e.id,status:e.status}))}get(e){return this.active.get(e)}onChildAborted(e){return this.abortGraph.onChildAborted(this.rootId,e)}abortAll(e,n="user_signal"){this.abortGraph.abort(this.rootId,e,n)}async forkSubagent(e){if(e.phaseRole!==void 0&&e.phaseRole!=="read-write"&&e.config.provider!==void 0)throw new Error(`SubagentManager.forkSubagent: phaseRole "${e.phaseRole}" is mutually exclusive with config.provider. Remove one \u2014 either let the manager construct the phase-restricted provider, or use config.provider with phaseRole: "read-write" (default).`);let n=`${e.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=e.parent.sessionId,o=e.config.hookRegistry??this.hookRegistry;o&&await eo(o,{event:"SubagentStart",subagentId:n,parentSessionId:e.parent.sessionId},{signal:this.rootController.signal,...e.config.traceWriter?{traceWriter:e.config.traceWriter}:{}});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let i={...e.config,resume:r,forkSession:r?!0:e.config.forkSession,abortSignal:s.signal,apiKey:e.config.apiKey||this.parentApiKey,baseUrl:e.config.baseUrl??this.parentBaseUrl,...e.config.parentSessionId===void 0&&e.parent.sessionId!==void 0?{parentSessionId:e.parent.sessionId}:{},...e.config.phaseRole===void 0&&e.phaseRole!==void 0?{phaseRole:e.phaseRole}:{},...e.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},hookRegistry:e.config.hookRegistry??this.hookRegistry,permissionBubbler:e.config.permissionBubbler??(this.parentCanUseTool!==void 0&&e.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...e.denyElicitations===!0?{onElicitation:Hd}:{},...e.phaseRole==="read-only"?{provider:vs("read-only",e.config.model)}:{}},c;try{c=new Fe(i)}catch(m){throw this.abortGraph.dispose(n),m}let a=e.parent.getInputStreamRef?.(),l=e.parent.abortSignal,d=this.progressSink??ve(),u=e.agentType?.trim()||void 0,p=e.parentId?.trim()||void 0,y=new zt(n,c,s,this.abortGraph,e.outputSchema,e.config.timeoutMs??ot,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},a,l,u??e.idPrefix,d,p??e.parent.sessionId,e.config.traceWriter);this.active.set(n,y);let f=typeof e.config.model=="string"?e.config.model:JSON.stringify(e.config.model);return Me(e.config.traceWriter,{transition:"started",subagentId:n,parentId:e.parent.sessionId??this.rootId,model:f,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{}}),await oe({event:"subagent.dispatched",subagent_id:n,id_prefix:e.idPrefix,model:f,parent_session_id:e.parent.sessionId}),y}async kill(e){let n=this.active.get(e);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(e=>e.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(e=>e.teardown()))}};async function Jt(t,e={}){let{failFast:n=!0,teardown:r=!0}=e;if(t.length===0)return[];let o=new Array(t.length),s=new Set(t.map((c,a)=>a)),i=t.map((c,a)=>c.handle.runToResult(c.prompt).then(l=>{if(o[a]=l,s.delete(a),n&&l.status!=="succeeded")for(let d of s){let u=t[d];u&&u.handle.status==="running"&&u.handle.cancel().catch(()=>{})}}));return await Promise.all(i),r&&await Promise.allSettled(t.map(c=>c.handle.teardown())),o}import{fileURLToPath as Bd}from"node:url";import{dirname as Wd}from"node:path";var Kd=Bd(import.meta.url),Kw=Wd(Kd),Q={name:"research-agent",systemPrompt:`---
1116
+ `)}catch{}}close(){this.memoryStore.close()}},Qn=new ae;var Md=new Set(["Agent","Task","agent"]),Od=new Set(["Skill","skill"]),Dd=new Set(["Compose","compose"]),Tb=new Set([...Md,...Dd,...Od]);var ks=["Read","Glob","Grep","NotebookRead","LS","read_file","glob","grep","list_directory","memory_search"];var Nb=300*1e3;var kw=[...Dt,"agent","skill"];function vs(t,e){let n={allowedTools:[...ks]};return ce(typeof e=="string"?e:void 0)==="openai-compatible"?new ae({permissions:n}):new fe({permissions:n})}function er(t){let e=$d(t);return e!==void 0?e:Ud(t)}function $d(t){let e=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=e.exec(t))!==null;)n=r[1];if(n)return Es(n.trim())}function Ud(t){for(let e=t.length-1;e>=0;e--){if(t[e]!=="}")continue;let n=jd(t,e);if(n===-1)continue;let r=t.slice(n,e+1),o=Es(r);if(o!==void 0)return o}}function jd(t,e){let n=0,r=!1,o=!1;for(let s=e;s>=0;s--){let i=t[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 Es(t){try{return JSON.parse(t)}catch{return}}function tr(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function _s(t,e,n,r,o){if(!r)return{id:t,status:e,message:n,trace:o};let s=er(n.content),i=r.safeParse(s);return i.success?{id:t,status:e,message:n,output:i.data,trace:o}:{id:t,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 Ts(t,e,n,r){let o=n instanceof Error?n:new Error(String(n));return{id:t,status:e,error:o,trace:r}}function H(t){return`${t.status}${t.error?`: ${t.error.message}`:""}`}var zt=class{constructor(e,n,r,o,s,i,c,a,l,d,u,p,y,f){this.id=e;this.session=n;this.controller=r;this.abortGraph=o;this.outputSchema=s;this.timeoutMs=i;this.hookRegistry=c;this.onTerminal=a;this.parentInputStreamRef=l;this.parentAbortSignal=d;this.agentType=u;this.traceWriter=f;this.progressSink=p,this.parentId=y}id;session;controller;abortGraph;outputSchema;timeoutMs;hookRegistry;onTerminal;parentInputStreamRef;parentAbortSignal;agentType;traceWriter;currentStatus="idle";inFlight=null;lastMessage;lastDurationMs;latestTerminalStatus;stopDispatched=!1;progressSink;parentId;currentTrace=tr();lastStreamedContent="";get status(){return this.currentStatus}async run(e,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=st(this.streamToFinalMessage(e,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",Me(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?(Me(this.traceWriter,{transition:"cancelled",subagentId:this.id,source:"cascade"}),this.currentStatus="cancelled",this.latestTerminalStatus="cancelled"):(Me(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(e,n){let r,o;this.lastStreamedContent="",this.currentTrace=tr();let s=n??this.progressSink??ve(),i={subagentId:this.id,...this.parentId!==void 0&&{parentId:this.parentId},...this.agentType!==void 0&&{agentType:this.agentType}};for await(let c of this.session.sendMessageStream(e)){if(s&&s(c,i),c.type==="chunk"){let a=c.chunk;a.type==="content"?this.lastStreamedContent+=a.content:a.type==="tool_use_detail"?this.currentTrace.toolCalls.push({id:a.toolUseId,name:a.toolName,inputBytes:Buffer.byteLength(a.toolInput,"utf8")}):a.type==="tool_result"?this.currentTrace.toolResults.push({toolUseId:a.toolUseId,isError:a.isError,truncated:a.truncated,sizeBytes:a.sizeBytes}):a.type==="thinking"&&(this.currentTrace.thinkingPresent=!0)}if(c.type==="message")r=c.message,this.currentTrace.turnCount++;else if(c.type==="error"){o=c.error;break}else if(c.type==="done"){if(typeof c.metadata?.usage=="object"&&c.metadata.usage!==null){let a=c.metadata.usage;this.currentTrace.usage={inputTokens:typeof a.input_tokens=="number"?a.input_tokens:void 0,outputTokens:typeof a.output_tokens=="number"?a.output_tokens:void 0,cacheReadTokens:typeof a.cache_read_input_tokens=="number"?a.cache_read_input_tokens:void 0,cacheCreationTokens:typeof a.cache_creation_input_tokens=="number"?a.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(e,n){try{let r=await this.run(e,n);return _s(this.id,this.currentStatus,r,this.outputSchema,this.currentTrace)}catch(r){let o=Ts(this.id,this.currentStatus,r,this.currentTrace);return this.lastStreamedContent.length>0&&(o.partialOutput=this.lastStreamedContent),o}}runInBackground(e,n,r){let o;if(r){let s=this.progressSink??ve();o=(i,c)=>{r(i),s?.(i,c)}}this.runToResult(e,o).then(s=>{n?.(s)}).catch(s=>{M("runInBackground: unexpected rejection after runToResult",s),console.error("Subagent runInBackground failed unexpectedly:",s)})}async cancel(){if(this.currentStatus==="cancelled"||this.stopDispatched)return;let e=this.latestTerminalStatus??"cancelled";this.currentStatus="cancelled",Me(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(e)}}async teardown(){if(this.stopDispatched)return;let e=this.latestTerminalStatus??"cancelled";try{this.inFlight&&await this.session.interrupt()}catch{}try{await this.session.close()}finally{await this.dispatchStopAndRelease(e)}}async dispatchStopAndRelease(e){if(this.stopDispatched){this.onTerminal();return}this.stopDispatched=!0;let n=await to(this.hookRegistry,{event:"SubagentStop",subagentId:this.id,status:e,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)M(`Skipping SubagentStop injectContext for ${this.id}: parent is aborted`);else try{this.parentInputStreamRef.pushUserMessage(n.injectContext)}catch(r){M(`Failed to inject context from SubagentStop handler: ${String(r)}`)}this.onTerminal()}};var Hd=async(t,e)=>({action:"decline"}),O=class{active=new Map;parentCanUseTool;hookRegistry;progressSink;parentApiKey;parentBaseUrl;parentCwd;abortGraph;rootId;rootController;counter=0;constructor(e={}){if(this.parentCanUseTool=e.canUseTool,this.hookRegistry=e.hookRegistry,this.progressSink=e.progressSink,this.parentApiKey=e.apiKey,this.parentBaseUrl=e.baseUrl,this.parentCwd=e.cwd,this.abortGraph=new rt(e.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),e.parentAbortSignal){let n=e.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(e=>({id:e.id,status:e.status}))}get(e){return this.active.get(e)}onChildAborted(e){return this.abortGraph.onChildAborted(this.rootId,e)}abortAll(e,n="user_signal"){this.abortGraph.abort(this.rootId,e,n)}async forkSubagent(e){if(e.phaseRole!==void 0&&e.phaseRole!=="read-write"&&e.config.provider!==void 0)throw new Error(`SubagentManager.forkSubagent: phaseRole "${e.phaseRole}" is mutually exclusive with config.provider. Remove one \u2014 either let the manager construct the phase-restricted provider, or use config.provider with phaseRole: "read-write" (default).`);let n=`${e.idPrefix??"subagent"}-${Date.now()}-${++this.counter}`,r=e.parent.sessionId,o=e.config.hookRegistry??this.hookRegistry;o&&await eo(o,{event:"SubagentStart",subagentId:n,parentSessionId:e.parent.sessionId},{signal:this.rootController.signal,...e.config.traceWriter?{traceWriter:e.config.traceWriter}:{}});let s=new AbortController;this.abortGraph.register(n,s),this.abortGraph.linkChild(this.rootId,n);let i={...e.config,resume:r,forkSession:r?!0:e.config.forkSession,abortSignal:s.signal,apiKey:e.config.apiKey||this.parentApiKey,baseUrl:e.config.baseUrl??this.parentBaseUrl,...e.config.parentSessionId===void 0&&e.parent.sessionId!==void 0?{parentSessionId:e.parent.sessionId}:{},...e.config.phaseRole===void 0&&e.phaseRole!==void 0?{phaseRole:e.phaseRole}:{},...e.config.cwd===void 0&&this.parentCwd!==void 0?{cwd:this.parentCwd}:{},hookRegistry:e.config.hookRegistry??this.hookRegistry,permissionBubbler:e.config.permissionBubbler??(this.parentCanUseTool!==void 0&&e.config.canUseTool===void 0?{canUseTool:this.parentCanUseTool}:void 0),...e.denyElicitations===!0?{onElicitation:Hd}:{},...e.phaseRole==="read-only"?{provider:vs("read-only",e.config.model)}:{}},c;try{c=new Fe(i)}catch(m){throw this.abortGraph.dispose(n),m}let a=e.parent.getInputStreamRef?.(),l=e.parent.abortSignal,d=this.progressSink??ve(),u=e.agentType?.trim()||void 0,p=e.parentId?.trim()||void 0,y=new zt(n,c,s,this.abortGraph,e.outputSchema,e.config.timeoutMs??ot,o,()=>{this.active.delete(n),this.abortGraph.dispose(n)},a,l,u??e.idPrefix,d,p??e.parent.sessionId,e.config.traceWriter);this.active.set(n,y);let f=typeof e.config.model=="string"?e.config.model:JSON.stringify(e.config.model);return Me(e.config.traceWriter,{transition:"started",subagentId:n,parentId:e.parent.sessionId??this.rootId,model:f,...i.tools?.allowedTools?{allowedTools:[...i.tools.allowedTools]}:{}}),await oe({event:"subagent.dispatched",subagent_id:n,id_prefix:e.idPrefix,model:f,parent_session_id:e.parent.sessionId}),y}async kill(e){let n=this.active.get(e);return n?(await n.cancel(),!0):!1}async killAll(){await Promise.allSettled([...this.active.values()].map(e=>e.cancel()))}async teardownAll(){await Promise.allSettled([...this.active.values()].map(e=>e.teardown()))}};async function Jt(t,e={}){let{failFast:n=!0,teardown:r=!0}=e;if(t.length===0)return[];let o=new Array(t.length),s=new Set(t.map((c,a)=>a)),i=t.map((c,a)=>c.handle.runToResult(c.prompt).then(l=>{if(o[a]=l,s.delete(a),n&&l.status!=="succeeded")for(let d of s){let u=t[d];u&&u.handle.status==="running"&&u.handle.cancel().catch(()=>{})}}));return await Promise.all(i),r&&await Promise.allSettled(t.map(c=>c.handle.teardown())),o}import{fileURLToPath as Bd}from"node:url";import{dirname as Wd}from"node:path";var Kd=Bd(import.meta.url),qw=Wd(Kd),Q={name:"research-agent",systemPrompt:`---
1117
1117
  name: research-agent
1118
1118
  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.
1119
1119
  model: sonnet
@@ -1166,7 +1166,7 @@ Unless the dispatcher specifies a different schema, return:
1166
1166
  **\`boundary_flag\` is required.** If nothing applies, emit \`"none"\` \u2014 do not omit the field. Treat missing as \`"none"\` is acceptable on the orchestrator side, but emit the field explicitly so downstream synthesizers and validators do not see \`null\`.
1167
1167
 
1168
1168
  If \`scope_check\` flags implementation (non-git), the orchestrator should dispatch a different sub-agent type for follow-up. Do not re-dispatch the same task through \`research-agent\`.
1169
- `,sourcePath:"agent-framework-private/agents/research-agent.md",allowedTools:["Read","Grep","Glob","WebFetch","WebSearch"],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."};import{existsSync as Re,readdirSync as Qd,readFileSync as Zd}from"fs";import{join as ge}from"path";import{existsSync as nr,readFileSync as zd,readdirSync as Jd,statSync as Vd}from"fs";import{join as bt,resolve as As}from"path";import{existsSync as Gd,mkdirSync as zw,readFileSync as qd,renameSync as Jw,writeFileSync as Vw,unlinkSync as Yw}from"fs";function xs(t=Mt()){if(!Gd(t))return Vt();try{let e=qd(t,"utf8"),n=JSON.parse(e);if(!n||typeof n!="object")return Vt();let r=n,o=r.plugins&&typeof r.plugins=="object"?r.plugins:{};if(r.version===1)return{version:2,plugins:o,marketplaces:{}};if(r.version===2){let s=r.marketplaces&&typeof r.marketplaces=="object"?r.marketplaces:{};return{version:2,plugins:o,marketplaces:s}}return Vt()}catch{return Vt()}}function Vt(){return{version:2,plugins:{},marketplaces:{}}}var Yd=5,Rs="cache",yt;function me(t=He()){yt||(yt=new Map);let e=yt.get(t);if(e)return[...e];if(!nr(t))return yt.set(t,[]),[];let n=t===He()?Mt():bt(t,".index.json"),r=xs(n),o=[];return Ps(t,t,0,o,new Set,r.plugins),yt.set(t,o),[...o]}function Ps(t,e,n,r,o,s){if(n>Yd||o.has(e))return;if(o.add(e),nr(bt(e,".claude-plugin","plugin.json"))){let c=rr(t,e);if(c===null){r.push({type:"local",path:e});return}if(c.layout==="cache"){let l=s[c.key];if(!l||l.enabled===!1)return;r.push({type:"local",path:e});return}let a=s[c.key];if(a&&a.enabled===!1)return;r.push({type:"local",path:e});return}let i;try{i=Jd(e)}catch{return}for(let c of i){if(c.startsWith("."))continue;let a=bt(e,c),l;try{l=Vd(a)}catch{continue}l.isDirectory()&&Ps(t,a,n+1,r,o,s)}}function rr(t,e){if(!e.startsWith(t))return null;let n=e.slice(t.length).replace(/^\/+/,"");if(!n)return null;let r=n.split("/").filter(s=>s.length>0);if(r.length===0)return null;if(r[0]===Rs&&r.length>=3){let s=r[1];if(s){let i=bt(t,Rs,s),a=Xd(i,e)??r[2];if(a)return{layout:"cache",key:`${s}:${a}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function Xd(t,e){let n=bt(t,".claude-plugin","marketplace.json");if(!nr(n))return null;let r;try{r=JSON.parse(zd(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let s=As(e);for(let i of o){if(!i||typeof i!="object")continue;let c=i;if(!(typeof c.name!="string"||typeof c.source!="string")&&!(!c.source.startsWith("./")&&!c.source.startsWith("../"))&&As(t,c.source)===s)return c.name}return null}var Is=["command","agent"];function Cs(t=Z()){let e=[],n=ge(t,"skills");if(Re(n))for(let r of Yt(n)){let o=ge(n,r,"SKILL.md");Re(o)&&e.push({path:o,type:"skill",source:"user"})}for(let r of Is){let o=ge(t,`${r}s`);if(Re(o))for(let s of Yt(o))s.endsWith(".md")&&e.push({path:ge(o,s),type:r,source:"user"})}return e}function Ms(t=He()){if(!Re(t))return[];let e=[],n=me(t);for(let r of n){let s=rr(t,r.path)?.key,i=ge(r.path,"skills");if(Re(i))for(let c of Yt(i)){let a=ge(i,c,"SKILL.md");if(!Re(a))continue;let l={path:a,type:"skill",source:"plugin"};s&&(l.plugin_key=s),e.push(l)}for(let c of Is){let a=ge(r.path,`${c}s`);if(Re(a))for(let l of Yt(a)){if(!l.endsWith(".md"))continue;let d={path:ge(a,l),type:c,source:"plugin"};s&&(d.plugin_key=s),e.push(d)}}}return e}function Os(t=ge(Z(),"settings.json")){if(!Re(t))return[];try{let e=Zd(t,"utf8"),r=JSON.parse(e).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[s,i]of Object.entries(r))if(Array.isArray(i))for(let c=0;c<i.length;c++)o.push({event:s,index:c,raw:i[c]});return o}catch{return[]}}function Yt(t){try{return Qd(t).filter(e=>!e.startsWith("."))}catch{return[]}}var Ns=$.object({path:$.string(),type:$.enum(["skill","command","agent","hook"]),source:$.enum(["user","plugin"]),plugin_key:$.string().optional(),verdict:$.enum(["correct","misfit","outlier"]),recommended_type:$.string(),rationale:$.string(),confidence:$.enum(["high","med","low"])}),Ls=$.record($.string(),$.record($.string(),$.number())),wk=$.object({inventory:$.object({user:Ls,plugin:Ls}),misfits:$.array(Ns),briefs_written:$.number(),total_artifacts:$.number()}),eu=$.object({writeBriefs:$.boolean().optional(),scope:$.enum(["user","plugin","all"]).optional()}),tu=["skill","command","agent"],$s=["skill","command","agent","hook"];function nu(t){return{runUserDiscovery:t!=="plugin",runPluginDiscovery:t!=="user",runHookInspector:t!=="plugin"}}function ru(t){let e=()=>{let s={};for(let i of $s)s[i]={correct:0,misfit:0,outlier:0};return s},n={user:e(),plugin:e()};for(let s of t)n[s.source][s.type][s.verdict]+=1;let r={high:0,med:1,low:2},o=t.filter(s=>s.verdict==="misfit").slice().sort((s,i)=>r[s.confidence]-r[i.confidence]);return{inventory:n,misfits:o}}function ou(t){return t.verdict==="misfit"&&t.confidence==="high"&&t.source==="user"}function su(t){let e=t.filter(o=>o.source==="user"),n=t.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),e.length===0)r.push("(none discovered)");else for(let o of e)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let s=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${s})`)}return r.join(`
1169
+ `,sourcePath:"agent-framework-private/agents/research-agent.md",allowedTools:["Read","Grep","Glob","WebFetch","WebSearch"],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."};import{existsSync as Re,readdirSync as Qd,readFileSync as Zd}from"fs";import{join as ge}from"path";import{existsSync as nr,readFileSync as zd,readdirSync as Jd,statSync as Vd}from"fs";import{join as bt,resolve as As}from"path";import{existsSync as Gd,mkdirSync as Vw,readFileSync as qd,renameSync as Yw,writeFileSync as Xw,unlinkSync as Qw}from"fs";function xs(t=Mt()){if(!Gd(t))return Vt();try{let e=qd(t,"utf8"),n=JSON.parse(e);if(!n||typeof n!="object")return Vt();let r=n,o=r.plugins&&typeof r.plugins=="object"?r.plugins:{};if(r.version===1)return{version:2,plugins:o,marketplaces:{}};if(r.version===2){let s=r.marketplaces&&typeof r.marketplaces=="object"?r.marketplaces:{};return{version:2,plugins:o,marketplaces:s}}return Vt()}catch{return Vt()}}function Vt(){return{version:2,plugins:{},marketplaces:{}}}var Yd=5,Rs="cache",yt;function me(t=He()){yt||(yt=new Map);let e=yt.get(t);if(e)return[...e];if(!nr(t))return yt.set(t,[]),[];let n=t===He()?Mt():bt(t,".index.json"),r=xs(n),o=[];return Ps(t,t,0,o,new Set,r.plugins),yt.set(t,o),[...o]}function Ps(t,e,n,r,o,s){if(n>Yd||o.has(e))return;if(o.add(e),nr(bt(e,".claude-plugin","plugin.json"))){let c=rr(t,e);if(c===null){r.push({type:"local",path:e});return}if(c.layout==="cache"){let l=s[c.key];if(!l||l.enabled===!1)return;r.push({type:"local",path:e});return}let a=s[c.key];if(a&&a.enabled===!1)return;r.push({type:"local",path:e});return}let i;try{i=Jd(e)}catch{return}for(let c of i){if(c.startsWith("."))continue;let a=bt(e,c),l;try{l=Vd(a)}catch{continue}l.isDirectory()&&Ps(t,a,n+1,r,o,s)}}function rr(t,e){if(!e.startsWith(t))return null;let n=e.slice(t.length).replace(/^\/+/,"");if(!n)return null;let r=n.split("/").filter(s=>s.length>0);if(r.length===0)return null;if(r[0]===Rs&&r.length>=3){let s=r[1];if(s){let i=bt(t,Rs,s),a=Xd(i,e)??r[2];if(a)return{layout:"cache",key:`${s}:${a}`}}}let o=r[0];return o?{layout:"flat",key:o}:null}function Xd(t,e){let n=bt(t,".claude-plugin","marketplace.json");if(!nr(n))return null;let r;try{r=JSON.parse(zd(n,"utf8"))}catch{return null}if(!r||typeof r!="object")return null;let o=r.plugins;if(!Array.isArray(o))return null;let s=As(e);for(let i of o){if(!i||typeof i!="object")continue;let c=i;if(!(typeof c.name!="string"||typeof c.source!="string")&&!(!c.source.startsWith("./")&&!c.source.startsWith("../"))&&As(t,c.source)===s)return c.name}return null}var Is=["command","agent"];function Cs(t=Z()){let e=[],n=ge(t,"skills");if(Re(n))for(let r of Yt(n)){let o=ge(n,r,"SKILL.md");Re(o)&&e.push({path:o,type:"skill",source:"user"})}for(let r of Is){let o=ge(t,`${r}s`);if(Re(o))for(let s of Yt(o))s.endsWith(".md")&&e.push({path:ge(o,s),type:r,source:"user"})}return e}function Ms(t=He()){if(!Re(t))return[];let e=[],n=me(t);for(let r of n){let s=rr(t,r.path)?.key,i=ge(r.path,"skills");if(Re(i))for(let c of Yt(i)){let a=ge(i,c,"SKILL.md");if(!Re(a))continue;let l={path:a,type:"skill",source:"plugin"};s&&(l.plugin_key=s),e.push(l)}for(let c of Is){let a=ge(r.path,`${c}s`);if(Re(a))for(let l of Yt(a)){if(!l.endsWith(".md"))continue;let d={path:ge(a,l),type:c,source:"plugin"};s&&(d.plugin_key=s),e.push(d)}}}return e}function Os(t=ge(Z(),"settings.json")){if(!Re(t))return[];try{let e=Zd(t,"utf8"),r=JSON.parse(e).hooks;if(!r||typeof r!="object")return[];let o=[];for(let[s,i]of Object.entries(r))if(Array.isArray(i))for(let c=0;c<i.length;c++)o.push({event:s,index:c,raw:i[c]});return o}catch{return[]}}function Yt(t){try{return Qd(t).filter(e=>!e.startsWith("."))}catch{return[]}}var Ns=$.object({path:$.string(),type:$.enum(["skill","command","agent","hook"]),source:$.enum(["user","plugin"]),plugin_key:$.string().optional(),verdict:$.enum(["correct","misfit","outlier"]),recommended_type:$.string(),rationale:$.string(),confidence:$.enum(["high","med","low"])}),Ls=$.record($.string(),$.record($.string(),$.number())),Sk=$.object({inventory:$.object({user:Ls,plugin:Ls}),misfits:$.array(Ns),briefs_written:$.number(),total_artifacts:$.number()}),eu=$.object({writeBriefs:$.boolean().optional(),scope:$.enum(["user","plugin","all"]).optional()}),tu=["skill","command","agent"],$s=["skill","command","agent","hook"];function nu(t){return{runUserDiscovery:t!=="plugin",runPluginDiscovery:t!=="user",runHookInspector:t!=="plugin"}}function ru(t){let e=()=>{let s={};for(let i of $s)s[i]={correct:0,misfit:0,outlier:0};return s},n={user:e(),plugin:e()};for(let s of t)n[s.source][s.type][s.verdict]+=1;let r={high:0,med:1,low:2},o=t.filter(s=>s.verdict==="misfit").slice().sort((s,i)=>r[s.confidence]-r[i.confidence]);return{inventory:n,misfits:o}}function ou(t){return t.verdict==="misfit"&&t.confidence==="high"&&t.source==="user"}function su(t){let e=t.filter(o=>o.source==="user"),n=t.filter(o=>o.source==="plugin"),r=["","## Discovered artifacts (audit only these)",""];if(r.push('### User-scope artifacts (set `"source": "user"`, omit `plugin_key`)'),e.length===0)r.push("(none discovered)");else for(let o of e)r.push(`- ${o.path}`);if(r.push(""),r.push('### Plugin-scope artifacts (set `"source": "plugin"`, copy `plugin_key` from each entry)'),n.length===0)r.push("(none discovered)");else for(let o of n){let s=o.plugin_key??"<unknown>";r.push(`- ${o.path} (plugin_key: ${s})`)}return r.join(`
1170
1170
  `)}function iu(t,e){let n=["","## Discovered hooks (audit only these)",""];if(n.push(`Settings file (use this absolute path verbatim in each verdict's \`path\` field): \`${t}\``),n.push(""),e.length===0)return n.push("(no hooks discovered)"),n.join(`
1171
1171
  `);for(let r of e){let o=`${r.event}-${r.index}`;n.push(`### Hook \`${o}\``),n.push(""),n.push("```json"),n.push(JSON.stringify(r.raw,null,2)),n.push("```"),n.push("")}return n.join(`
1172
1172
  `)}function au(t,e){if(!e)return{kind:"failure",message:`${t}: no result`};if(e.schemaError)return{kind:"failure",message:`${t}: schema mismatch \u2014 ${e.schemaError.message}`};if(e.status!=="succeeded"){let n=e.error?` \u2014 ${e.error.message}`:"";return{kind:"failure",message:`${t}: ${e.status}${n}`}}return e.output?{kind:"success",output:e.output}:{kind:"failure",message:`${t}: no output`}}async function cu(t,e,n){let r=n?.apiKey,o=n?.callId,s=typeof t=="object"&&t!==null?t:{},i=eu.parse(s),c=i.writeBriefs??!0,a=i.scope??"all",l=nu(a);if(!e?.sessionId)throw new Error("audit-fit requires a parent session with sessionId");let d=e.sessionId,u=j("audit-fit"),p={skill:u["01-skill-inspector.md"],command:u["02-command-inspector.md"],agent:u["03-agent-inspector.md"],hook:u["04-hook-inspector.md"]};for(let _ of $s)if(!p[_])throw new Error(`audit-fit skill missing inspector prompt for ${_}`);let y=l.runUserDiscovery?Cs():[],f=l.runPluginDiscovery?Ms():[],m={skill:[],command:[],agent:[]};for(let _ of[...y,...f])m[_.type].push(_);let w=new O({apiKey:r}),k=()=>async _=>Q.allowedTools.includes(_)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${_} not allowed for audit-fit inspectors. Allowed tools: ${Q.allowedTools.join(", ")}`},S=[];for(let _ of tu){let x=m[_];if(x.length===0)continue;let P=p[_];P&&S.push({type:_,prompt:`${P}
@@ -1198,7 +1198,7 @@ ${x.rationale}
1198
1198
  ---
1199
1199
  Generated by audit-fit on ${new Date().toISOString().split(".")[0]}Z
1200
1200
  `;await Fs(I,L),E++}}let C=De();await Ds(C,{recursive:!0});let F=_=>{let x=0;for(let P of Object.values(_))for(let I of Object.values(P))x+=I;return x},T=_=>{let x=g.user[_]??{},P=g.plugin[_]??{},I=L=>Object.values(L).reduce((K,z)=>K+z,0);return I(x)+I(P)},D={timestamp:new Date().toISOString(),surface:"afk",scope:a,total_artifacts:h.length,misfits_count:b.length,briefs_written:E,by_source:{user:F(g.user),plugin:F(g.plugin)},by_type:{skill:T("skill"),command:T("command"),agent:T("agent"),hook:T("hook")}},R=or(C,"audit-fit-telemetry.jsonl");return await Fs(R,JSON.stringify(D)+`
1201
- `),{inventory:g,misfits:b,briefs_written:E,total_artifacts:h.length}}var lu={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:cu,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"]};X(lu);import{z as A}from"zod";import{execFile as fu}from"node:child_process";import{promisify as mu}from"node:util";import{tmpdir as gu}from"node:os";import{join as js}from"node:path";function Us(t){return t.confidence<.5?{verify:!0,reason:`low confidence (${t.confidence.toFixed(2)} < ${.5})`}:t.boundary_flag&&t.boundary_flag.length>0?{verify:!0,reason:`boundary flag set: ${t.boundary_flag}`}:t.coverage_gaps&&t.coverage_gaps.length>0?{verify:!0,reason:`coverage gap${t.coverage_gaps.length===1?"":"s"}: ${t.coverage_gaps.length} unresolved`}:{verify:!1,reason:`confidence ${t.confidence.toFixed(2)} with no gaps or boundary`}}import{fileURLToPath as du}from"node:url";import{dirname as uu}from"node:path";var pu=du(import.meta.url),Tk=uu(pu),sr={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 ir(t){let e={description:t.description,prompt:t.systemPrompt};return t.allowedTools&&(e.tools=[...t.allowedTools]),t.model&&(e.model=t.model),e}var Xt=mu(fu),Ws=A.object({id:A.string(),claim:A.string(),confidence:A.number().min(0).max(1),evidence_sources:A.array(A.string()),location:A.string().optional(),proposed_fix:A.string().optional(),coverage_gaps:A.array(A.string()).nullish().transform(t=>t??void 0),boundary_flag:A.string().nullish().transform(t=>t??void 0)}),hu=A.object({hypothesis_id:A.string(),claim:A.string(),verdict:A.enum(["VERIFIED","REFUTED","INCONCLUSIVE"]),evidence:A.string(),gate_reason:A.string()}),Ks=A.object({hypothesis_id:A.string(),reproducer_passed:A.boolean(),regressions:A.array(A.string()),confidence:A.number().min(0).max(1),verification_log:A.string()}),yu=A.enum(["crash","regression","logic-error","flaky","environment","unknown"]),bu=A.object({failure_type:yu,error_signature:A.string(),affected_area:A.string()}),wu=A.enum(["clear_winner","multiple_plausible","dissent","all_inconclusive","no_hypotheses"]),Bk=A.object({reproducer:A.string().optional(),triage:bu.optional(),hypotheses:A.array(Ws),premise_verifications:A.array(hu).optional(),winner:A.object({hypothesis_id:A.string(),verification_log:A.string(),proposed_fix:A.string()}).optional(),verification_results:A.array(Ks).optional(),outcome:wu.optional(),recommended_next_skill:A.enum(["spec"]).optional()});async function ku(t,e){let n=t.map(a=>({hypothesis:a,decision:Us(a)})).filter(a=>a.decision.verify);if(n.length===0)return{premise_verifications:[],hypotheses_to_test:t};let r=[],o;try{r=await e(n.map(a=>a.hypothesis.claim))}catch(a){o=a instanceof Error?a.message:String(a)}let s=n.map((a,l)=>{let d=r[l];return o!==void 0?{hypothesis_id:a.hypothesis.id,claim:a.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:`shadow-verify dispatch failed: ${o}`,gate_reason:a.decision.reason}:d?{hypothesis_id:a.hypothesis.id,claim:a.hypothesis.claim,verdict:d.verdict,evidence:d.evidence,gate_reason:a.decision.reason}:{hypothesis_id:a.hypothesis.id,claim:a.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:"no verifier result for this claim",gate_reason:a.decision.reason}}),i=new Set(s.filter(a=>a.verdict==="REFUTED").map(a=>a.hypothesis_id)),c=i.size===0?t:t.filter(a=>!i.has(a.id));return{premise_verifications:s,hypotheses_to_test:c}}async function Su(t,e,n){let r=n?.apiKey,o=(()=>{if(typeof t=="string")return{failure:t,repoPath:process.cwd(),context:"",maxHypotheses:4};if(typeof t=="object"&&t!==null){let B=t;if(typeof B.failure=="string")return{failure:B.failure,repoPath:B.repoPath||process.cwd(),context:B.context||"",maxHypotheses:Math.min(B.maxHypotheses||4,4)}}throw new Error("diagnose handler requires input.failure (string) or a string argument")})();if(!e?.sessionId)throw new Error("diagnose requires a parent session with sessionId");let s=e.sessionId,i=j("diagnose"),c=i["system.md"],a=i["research.md"],l=i["hypothesis.md"],d=i["verify.md"];if(!c||!a||!l||!d)throw new Error("diagnose skill missing required prompts (system.md, research.md, hypothesis.md, verify.md)");let u=new O({apiKey:r}),p=Tu(o.context),y=vu(o.failure,o.context),f=`Triage:
1201
+ `),{inventory:g,misfits:b,briefs_written:E,total_artifacts:h.length}}var lu={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:cu,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"]};X(lu);import{z as A}from"zod";import{execFile as fu}from"node:child_process";import{promisify as mu}from"node:util";import{tmpdir as gu}from"node:os";import{join as js}from"node:path";function Us(t){return t.confidence<.5?{verify:!0,reason:`low confidence (${t.confidence.toFixed(2)} < ${.5})`}:t.boundary_flag&&t.boundary_flag.length>0?{verify:!0,reason:`boundary flag set: ${t.boundary_flag}`}:t.coverage_gaps&&t.coverage_gaps.length>0?{verify:!0,reason:`coverage gap${t.coverage_gaps.length===1?"":"s"}: ${t.coverage_gaps.length} unresolved`}:{verify:!1,reason:`confidence ${t.confidence.toFixed(2)} with no gaps or boundary`}}import{fileURLToPath as du}from"node:url";import{dirname as uu}from"node:path";var pu=du(import.meta.url),Ak=uu(pu),sr={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 ir(t){let e={description:t.description,prompt:t.systemPrompt};return t.allowedTools&&(e.tools=[...t.allowedTools]),t.model&&(e.model=t.model),e}var Xt=mu(fu),Ws=A.object({id:A.string(),claim:A.string(),confidence:A.number().min(0).max(1),evidence_sources:A.array(A.string()),location:A.string().optional(),proposed_fix:A.string().optional(),coverage_gaps:A.array(A.string()).nullish().transform(t=>t??void 0),boundary_flag:A.string().nullish().transform(t=>t??void 0)}),hu=A.object({hypothesis_id:A.string(),claim:A.string(),verdict:A.enum(["VERIFIED","REFUTED","INCONCLUSIVE"]),evidence:A.string(),gate_reason:A.string()}),Ks=A.object({hypothesis_id:A.string(),reproducer_passed:A.boolean(),regressions:A.array(A.string()),confidence:A.number().min(0).max(1),verification_log:A.string()}),yu=A.enum(["crash","regression","logic-error","flaky","environment","unknown"]),bu=A.object({failure_type:yu,error_signature:A.string(),affected_area:A.string()}),wu=A.enum(["clear_winner","multiple_plausible","dissent","all_inconclusive","no_hypotheses"]),Kk=A.object({reproducer:A.string().optional(),triage:bu.optional(),hypotheses:A.array(Ws),premise_verifications:A.array(hu).optional(),winner:A.object({hypothesis_id:A.string(),verification_log:A.string(),proposed_fix:A.string()}).optional(),verification_results:A.array(Ks).optional(),outcome:wu.optional(),recommended_next_skill:A.enum(["spec"]).optional()});async function ku(t,e){let n=t.map(a=>({hypothesis:a,decision:Us(a)})).filter(a=>a.decision.verify);if(n.length===0)return{premise_verifications:[],hypotheses_to_test:t};let r=[],o;try{r=await e(n.map(a=>a.hypothesis.claim))}catch(a){o=a instanceof Error?a.message:String(a)}let s=n.map((a,l)=>{let d=r[l];return o!==void 0?{hypothesis_id:a.hypothesis.id,claim:a.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:`shadow-verify dispatch failed: ${o}`,gate_reason:a.decision.reason}:d?{hypothesis_id:a.hypothesis.id,claim:a.hypothesis.claim,verdict:d.verdict,evidence:d.evidence,gate_reason:a.decision.reason}:{hypothesis_id:a.hypothesis.id,claim:a.hypothesis.claim,verdict:"INCONCLUSIVE",evidence:"no verifier result for this claim",gate_reason:a.decision.reason}}),i=new Set(s.filter(a=>a.verdict==="REFUTED").map(a=>a.hypothesis_id)),c=i.size===0?t:t.filter(a=>!i.has(a.id));return{premise_verifications:s,hypotheses_to_test:c}}async function Su(t,e,n){let r=n?.apiKey,o=(()=>{if(typeof t=="string")return{failure:t,repoPath:process.cwd(),context:"",maxHypotheses:4};if(typeof t=="object"&&t!==null){let B=t;if(typeof B.failure=="string")return{failure:B.failure,repoPath:B.repoPath||process.cwd(),context:B.context||"",maxHypotheses:Math.min(B.maxHypotheses||4,4)}}throw new Error("diagnose handler requires input.failure (string) or a string argument")})();if(!e?.sessionId)throw new Error("diagnose requires a parent session with sessionId");let s=e.sessionId,i=j("diagnose"),c=i["system.md"],a=i["research.md"],l=i["hypothesis.md"],d=i["verify.md"];if(!c||!a||!l||!d)throw new Error("diagnose skill missing required prompts (system.md, research.md, hypothesis.md, verify.md)");let u=new O({apiKey:r}),p=Tu(o.context),y=vu(o.failure,o.context),f=`Triage:
1202
1202
  failure_type: ${y.failure_type}
1203
1203
  error_signature: ${y.error_signature}
1204
1204
  affected_area: ${y.affected_area}`,w=`${Q.systemPrompt}
@@ -1245,7 +1245,7 @@ Location: ${t.location||"unknown"}
1245
1245
  Proposed fix: ${t.proposed_fix||"unknown"}
1246
1246
  Reproducer: ${e}
1247
1247
 
1248
- Working directory (isolated): ${c}`,d=await a.runToResult(l);return d.status!=="succeeded"||!d.output?{hypothesis_id:t.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Verification failed: ${H(d)}`}:d.output}catch(l){return{hypothesis_id:t.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Error during verification: ${l instanceof Error?l.message:String(l)}`}}finally{if(a)try{await a.teardown()}catch{}try{await Xt("git",["worktree","remove","--force",c],{cwd:n})}catch{}}}function Ru(){let t=["Edit","Write","Bash","Agent","Task"];return async e=>t.includes(e)?{behavior:"deny",message:`Tool ${e} not allowed in worktree verification. Verification is read-only.`}:Q.allowedTools.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed. Allowed tools: ${Q.allowedTools.join(", ")}`}}var Pu={name:"diagnose",description:"Parallel root-cause analysis for bugs and failing tests \u2014 forks research subagents, synthesizes hypotheses, and validates each in isolated worktrees",handler:Su,argumentHint:"<bug-or-failing-test>",whenToUse:"When a test is failing, a bug is reported, or behavior is unexplained \u2014 runs parallel root-cause analysis with hypothesis sub-agents."};X(Pu);import{z as ce}from"zod";import{execFile as zu}from"child_process";import{promisify as Ju}from"util";import{mkdir as ni,writeFile as ri,readFile as Vu}from"fs/promises";import{existsSync as Zt}from"fs";import{dirname as oi,join as he}from"path";import{fileURLToPath as Yu}from"url";import{fileURLToPath as Iu}from"node:url";import{dirname as Cu}from"node:path";var Mu=Iu(import.meta.url),zk=Cu(Mu),ar={name:"qualify",systemPrompt:`---
1248
+ Working directory (isolated): ${c}`,d=await a.runToResult(l);return d.status!=="succeeded"||!d.output?{hypothesis_id:t.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Verification failed: ${H(d)}`}:d.output}catch(l){return{hypothesis_id:t.id,reproducer_passed:!1,regressions:[],confidence:0,verification_log:`Error during verification: ${l instanceof Error?l.message:String(l)}`}}finally{if(a)try{await a.teardown()}catch{}try{await Xt("git",["worktree","remove","--force",c],{cwd:n})}catch{}}}function Ru(){let t=["Edit","Write","Bash","Agent","Task"];return async e=>t.includes(e)?{behavior:"deny",message:`Tool ${e} not allowed in worktree verification. Verification is read-only.`}:Q.allowedTools.includes(e)?{behavior:"allow"}:{behavior:"deny",message:`Tool ${e} not allowed. Allowed tools: ${Q.allowedTools.join(", ")}`}}var Pu={name:"diagnose",description:"Parallel root-cause analysis for bugs and failing tests \u2014 forks research subagents, synthesizes hypotheses, and validates each in isolated worktrees",handler:Su,argumentHint:"<bug-or-failing-test>",whenToUse:"When a test is failing, a bug is reported, or behavior is unexplained \u2014 runs parallel root-cause analysis with hypothesis sub-agents."};X(Pu);import{z as le}from"zod";import{execFile as zu}from"child_process";import{promisify as Ju}from"util";import{mkdir as ni,writeFile as ri,readFile as Vu}from"fs/promises";import{existsSync as Zt}from"fs";import{dirname as oi,join as he}from"path";import{fileURLToPath as Yu}from"url";import{fileURLToPath as Iu}from"node:url";import{dirname as Cu}from"node:path";var Mu=Iu(import.meta.url),Vk=Cu(Mu),ar={name:"qualify",systemPrompt:`---
1249
1249
  name: qualify
1250
1250
  description: Gate proposed plugin skills. Approve only real force multipliers. Reject reminders, checklists, best-practice nudges, and generic execution advice. Invoke when evaluating whether a proposed skill deserves top-level status in this plugin.
1251
1251
  model: sonnet
@@ -1481,7 +1481,7 @@ If the append fails (permissions, disk full, unwritable path), do not retry and
1481
1481
  - Stage 1 alone would land at SALVAGE (rule 8). Rule 6 fires because Stage 2 \u22648 \u2192 downgrade one tier \u2192 **REJECT**. Rewrite target: raise Bounded Damage (dry-run/draft-PR instead of push), Default Reversibility (require confirmation), Assumption Exposure (surface what tests assume before acting).
1482
1482
 
1483
1483
  Be skeptical. Protect the plugin from fluff. Stage 2 catches patterns that are strong when they work and catastrophic when they don't.
1484
- `,sourcePath:"agent-framework-local/agents/qualify.md"};import{fileURLToPath as Ou}from"node:url";import{dirname as Du}from"node:path";var Fu=Ou(import.meta.url),Qk=Du(Fu);import{mkdir as Gs,writeFile as qs}from"fs/promises";import{dirname as Lu,join as Nu}from"path";async function V(t){let e=It();await Gs(Lu(e),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r={timestamp:n,surface:"afk",...t},o=JSON.stringify(r)+`
1484
+ `,sourcePath:"agent-framework-local/agents/qualify.md"};import{fileURLToPath as Ou}from"node:url";import{dirname as Du}from"node:path";var Fu=Ou(import.meta.url),eS=Du(Fu);import{mkdir as Gs,writeFile as qs}from"fs/promises";import{dirname as Lu,join as Nu}from"path";async function V(t){let e=It();await Gs(Lu(e),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r={timestamp:n,surface:"afk",...t},o=JSON.stringify(r)+`
1485
1485
  `;return await qs(e,o,{flag:"a"}),n}async function zs(){let t=Ct(),e=Nu(t,"forge-thaw-history.jsonl");await Gs(t,{recursive:!0});let r={timestamp:new Date().toISOString().split(".")[0]+"Z",surface:"afk",event:"forge.thaw_override",thaw_triggered:!0},o=JSON.stringify(r)+`
1486
1486
  `;await qs(e,o,{flag:"a"})}import{readFile as Js,readdir as $u,writeFile as Uu,mkdir as ju,unlink as Hu}from"fs/promises";import{join as Qt}from"path";import{existsSync as Bu}from"fs";async function Vs(t){let e=Qt(Ue(),t+".md"),n=await Js(e,"utf-8");return{id:t,content:n}}async function Ys(){let t=Ue();return Bu(t)?(await $u(t,{withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".md")).map(r=>r.name.slice(0,-3)):[]}async function cr(t,e){let n=Ue(),r=Qt(n,t+".md"),o=Qt(n,e),s=Qt(o,t+".md");await ju(o,{recursive:!0});let i=await Js(r,"utf-8");await Uu(s,i,"utf-8"),await Hu(r)}var Wu=/^(APPROVE|SALVAGE|REJECT)\b/,Ku=/^(?:\w+\s+)*verdict(?:\s+\w+)*\s*[:\-—]\s*(APPROVE|SALVAGE|REJECT)\b/i,Gu=/\b(?:verdict|decision)\b/i;function Qs(t){return t.toUpperCase()}function Xs(t,e){for(let n=t.length-1;n>=0;n--){let r=t[n];if(!r)continue;let o=r.match(e);if(o&&o[1])return{index:n,verdict:Qs(o[1])}}return null}function qu(t){let e=/\b(APPROVE|SALVAGE|REJECT)\b/g;for(let n=t.length-1;n>=0;n--){let r=t[n];if(!r||!Gu.test(r))continue;let o=Array.from(r.matchAll(e));if(o.length===1){let s=o[0]?.[1];if(s)return{index:n,verdict:Qs(s)}}}return null}function Zs(t){let e=t.split(`
1487
1487
  `).map(a=>a.trim()).filter(a=>a.length>0),n=e.map(a=>a.replace(/\*\*/g,"")),r=Xs(n,Wu)??Xs(n,Ku)??qu(n);if(!r)return{verdict:"REJECT",feedback:t};let o=t.match(/score:\s*(\d+)/i),s=o&&o[1]?parseInt(o[1],10):void 0,i=e.slice(r.index+1).join(`
@@ -1489,7 +1489,7 @@ Be skeptical. Protect the plugin from fluff. Stage 2 catches patterns that are s
1489
1489
  - ${e.join(`
1490
1490
  - `)}`)}function Zu(){let t=oi(Yu(import.meta.url));return Qu(t)}function ep(t){return he(t,"..","..","..","plugins","awa-private")}function tp(){return Ct()}function np(t){let e=t.split(`
1491
1491
  `),n=[],r=/^\s+✗\s+(\S+):/;for(let o of e){let s=o.match(r);s&&s[1]&&n.push(s[1])}return n}async function rp(t){let e=tp(),n=he(e,"qualifications.jsonl");await ni(e,{recursive:!0});let o=new Date().toISOString().split(".")[0]+"Z",i=JSON.stringify({timestamp:o,surface:"afk",refers_to_run_id:t,source:"forge-gate-check-ts"})+`
1492
- `;return await ri(n,i,{flag:"a"}),o}async function op(){let t;try{t=Zu()}catch(a){throw new Error(`Failed to resolve eval-harness runner.py: ${a instanceof Error?a.message:String(a)}`)}let e=ep(t),n="",r="",o=0;try{let a=await Xu("python3",[t,"--plugin-root",e],{timeout:6e4});n=a.stdout||"",r=a.stderr||"",o=0}catch(a){let l=a;if(n=l.stdout||"",r=l.stderr||"",o=typeof l.code=="number"?l.code:1,l.code==="ENOENT"||r&&r.includes("No such file"))throw new Error(`eval-harness runner.py not found at ${t}.`)}let s=o===0?"OPEN":"CLOSED",i=s==="CLOSED"?np(n):void 0,c;if(s==="OPEN"){let a=new Date().toISOString().split(".")[0]+"Z";c=await rp(a)}return{gate_status:s,exit_code:o,stdout:n,stderr:r||void 0,tasks_failed:i,ledger_entry_ref:c}}var sp=ce.object({iteration:ce.number().int().positive(),verdict:ce.enum(["APPROVE","SALVAGE","REJECT"]),score:ce.number().optional(),feedback:ce.string()}),DS=ce.object({status:ce.enum(["APPROVED","REJECTED","GATE_CLOSED","MAX_ITERATIONS"]),skill_path:ce.string().optional(),qualify_verdicts:ce.array(sp),brief_id:ce.string().optional(),telemetry_ref:ce.string()}),ip=new Set(["unknown","unnamed","skill","new-skill","tbd","placeholder","<name>",""]);function ei(t){if(!t.startsWith(`---
1492
+ `;return await ri(n,i,{flag:"a"}),o}async function op(){let t;try{t=Zu()}catch(a){throw new Error(`Failed to resolve eval-harness runner.py: ${a instanceof Error?a.message:String(a)}`)}let e=ep(t),n="",r="",o=0;try{let a=await Xu("python3",[t,"--plugin-root",e],{timeout:6e4});n=a.stdout||"",r=a.stderr||"",o=0}catch(a){let l=a;if(n=l.stdout||"",r=l.stderr||"",o=typeof l.code=="number"?l.code:1,l.code==="ENOENT"||r&&r.includes("No such file"))throw new Error(`eval-harness runner.py not found at ${t}.`)}let s=o===0?"OPEN":"CLOSED",i=s==="CLOSED"?np(n):void 0,c;if(s==="OPEN"){let a=new Date().toISOString().split(".")[0]+"Z";c=await rp(a)}return{gate_status:s,exit_code:o,stdout:n,stderr:r||void 0,tasks_failed:i,ledger_entry_ref:c}}var sp=le.object({iteration:le.number().int().positive(),verdict:le.enum(["APPROVE","SALVAGE","REJECT"]),score:le.number().optional(),feedback:le.string()}),LS=le.object({status:le.enum(["APPROVED","REJECTED","GATE_CLOSED","MAX_ITERATIONS"]),skill_path:le.string().optional(),qualify_verdicts:le.array(sp),brief_id:le.string().optional(),telemetry_ref:le.string()}),ip=new Set(["unknown","unnamed","skill","new-skill","tbd","placeholder","<name>",""]);function ei(t){if(!t.startsWith(`---
1493
1493
  `))return{ok:!1,reason:"frontmatter_missing",message:"SKILL.md does not start with a YAML frontmatter fence (---)",skillNameAttempted:null};let e=t.split(`
1494
1494
  `),n=-1;for(let a=1;a<Math.min(e.length,41);a++)if(e[a]==="---"){n=a;break}if(n===-1)return{ok:!1,reason:"frontmatter_missing",message:'SKILL.md frontmatter closing "---" not found within first 40 lines',skillNameAttempted:null};let o=e.slice(1,n).join(`
1495
1495
  `);if(!o.match(/^name:/m)||!o.match(/^description:/m))return{ok:!1,reason:"frontmatter_missing",message:'SKILL.md frontmatter is missing required "name:" or "description:" key',skillNameAttempted:null};let c=(o.match(/^name:[ \t]*([^\n]*)/m)?.[1]??"").trim().replace(/^["']|["']$/g,"");return c?ip.has(c)?{ok:!1,reason:"sentinel_name",message:`SKILL.md "name:" resolved to sentinel/placeholder value: "${c}"`,skillNameAttempted:c}:{ok:!0,skillName:c}:{ok:!1,reason:"name_unparseable",message:'SKILL.md frontmatter "name:" key is present but value is empty after trim',skillNameAttempted:null}}function ap(t){let e=ei(t);if(e.ok||e.reason!=="frontmatter_missing"||t.startsWith(`---
@@ -1504,7 +1504,7 @@ Be skeptical. Protect the plugin from fluff. Stage 2 catches patterns that are s
1504
1504
 
1505
1505
  ${m}`);if(C.status!=="succeeded")throw new Error(`skill generation failed: ${H(C)}`);let F=C.message?.content||"";if(!F)throw new Error("skill generation returned no output");for(let T=1;T<=a;T++){let D=ar.systemPrompt;if(!D)throw new Error("qualify agent missing system prompt");let x=await(await new O({apiKey:r}).forkSubagent({parent:{sessionId:e.sessionId},config:{model:"sonnet",systemPrompt:D},idPrefix:`forge-qualify-${T}`,...o?{parentId:o}:{}})).runToResult(`Evaluate this amplifier skill against the force-multiplier criteria:
1506
1506
 
1507
- ${F}`);if(x.status!=="succeeded")throw new Error(`qualify iteration ${T} failed: ${H(x)}`);let P=x.message?.content||"",{verdict:I,score:L,feedback:K}=Zs(P),z={iteration:T,verdict:I,score:L,feedback:K};if(d.push(z),l=await V({event:"forge.qualify_iteration",iteration:T,verdict:I,score:L||null,feedback:K||null}),I==="APPROVE"){u="APPROVED";break}else if(I==="SALVAGE"&&T<a){let Y=S["qualify-rework.md"];if(!Y)throw new Error("forge skill missing qualify-rework.md prompt");let N=Y.replace("{feedback}",K).replace("{original_skill}",F),Ce=await(await new O({apiKey:r}).forkSubagent({parent:{sessionId:e.sessionId},config:{model:"sonnet",systemPrompt:N},idPrefix:`forge-rework-${T}`,...o?{parentId:o}:{}})).runToResult("Refine the skill based on the feedback.");if(Ce.status!=="succeeded")throw new Error(`rework iteration ${T} failed: ${H(Ce)}`);if(F=Ce.message?.content||"",!F)throw new Error(`rework iteration ${T} returned no output`)}else I==="REJECT"&&T>=a&&(u="MAX_ITERATIONS")}if(u==="APPROVED"){let T=ap(F);if(!T.ok)throw l=await V({event:"forge.write_failed",reason:T.reason,skill_name_attempted:T.skillNameAttempted}),new Error(`forge write-step invariant failed (${T.reason}): ${T.message}`);let D=T.skillName,R=T.recoveredContent??F;T.recoveredContent!==void 0&&(l=await V({event:"forge.preamble_recovered",skill_name:D,bytes_trimmed:F.length-T.recoveredContent.length}));let _=lr(D,{skillsDir:je(),registeredSkills:nt()});if(_)throw l=await V({event:"forge.write_failed",reason:_.reason,skill_name_attempted:_.skillNameAttempted}),new Error(`forge write-step invariant failed (${_.reason}): ${_.message}`);let x=he(je(),D);await ni(x,{recursive:!0});let P=he(x,"SKILL.md");await ri(P,R,"utf-8");let I;try{I=await Vu(P,"utf-8")}catch{I=""}if(!I.startsWith("---"))throw l=await V({event:"forge.write_failed",reason:"readback_failed",skill_name_attempted:D}),new Error(`forge write-step invariant failed (readback_failed): written file at ${P} did not read back with expected frontmatter`);p=P,w&&y&&await cr(y,"consumed"),l=await V({event:"forge.complete",status:"APPROVED",skill_name:D,iterations:d.length})}else u==="MAX_ITERATIONS"&&(w&&y&&await cr(y,"failed"),l=await V({event:"forge.complete",status:"MAX_ITERATIONS",skill_name_attempted:m||null,iterations:d.length}))}catch(f){throw l=await V({event:"forge.error",error:f instanceof Error?f.message:String(f)}),f}return{status:u,skill_path:p,qualify_verdicts:d,brief_id:y,telemetry_ref:l}}var dp={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:lp,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"]};X(dp);import{config as cv}from"dotenv";var en={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 si(t){return t in en}function ii(t){let e=en[t];if(!e)throw new Error(`Invalid model: ${t}`);return e}function wt(t){if(t!==void 0)return typeof t=="string"&&si(t)?ii(t):t}import{execFile as up}from"node:child_process";import{promisify as pp}from"node:util";var ev=pp(up);function ai(){return v.ANTHROPIC_API_KEY||v.CLAUDE_CODE_OAUTH_TOKEN||re()}function J(){return ai()}async function ci(t,e,n,r){let s=j("mint")["spec.md"];if(!s)throw new Error("mint skill missing spec.md prompt");let a=await(await new O(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:e},config:{model:"sonnet",systemPrompt:s,apiKey:J()},idPrefix:"mint-spec",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Create a detailed specification for: ${t}`);if(a.status!=="succeeded"||!a.message)throw new Error(`spec phase failed: ${H(a)}`);return a.message.content}async function li(t,e,n,r){let s=j("mint")["research.md"];if(!s)throw new Error("mint skill missing research.md prompt");let a=await(await new O(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:e},config:{model:"sonnet",systemPrompt:s,apiKey:J()},idPrefix:"mint-research",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Gather context and research for this specification:
1507
+ ${F}`);if(x.status!=="succeeded")throw new Error(`qualify iteration ${T} failed: ${H(x)}`);let P=x.message?.content||"",{verdict:I,score:L,feedback:K}=Zs(P),z={iteration:T,verdict:I,score:L,feedback:K};if(d.push(z),l=await V({event:"forge.qualify_iteration",iteration:T,verdict:I,score:L||null,feedback:K||null}),I==="APPROVE"){u="APPROVED";break}else if(I==="SALVAGE"&&T<a){let Y=S["qualify-rework.md"];if(!Y)throw new Error("forge skill missing qualify-rework.md prompt");let N=Y.replace("{feedback}",K).replace("{original_skill}",F),Ce=await(await new O({apiKey:r}).forkSubagent({parent:{sessionId:e.sessionId},config:{model:"sonnet",systemPrompt:N},idPrefix:`forge-rework-${T}`,...o?{parentId:o}:{}})).runToResult("Refine the skill based on the feedback.");if(Ce.status!=="succeeded")throw new Error(`rework iteration ${T} failed: ${H(Ce)}`);if(F=Ce.message?.content||"",!F)throw new Error(`rework iteration ${T} returned no output`)}else I==="REJECT"&&T>=a&&(u="MAX_ITERATIONS")}if(u==="APPROVED"){let T=ap(F);if(!T.ok)throw l=await V({event:"forge.write_failed",reason:T.reason,skill_name_attempted:T.skillNameAttempted}),new Error(`forge write-step invariant failed (${T.reason}): ${T.message}`);let D=T.skillName,R=T.recoveredContent??F;T.recoveredContent!==void 0&&(l=await V({event:"forge.preamble_recovered",skill_name:D,bytes_trimmed:F.length-T.recoveredContent.length}));let _=lr(D,{skillsDir:je(),registeredSkills:nt()});if(_)throw l=await V({event:"forge.write_failed",reason:_.reason,skill_name_attempted:_.skillNameAttempted}),new Error(`forge write-step invariant failed (${_.reason}): ${_.message}`);let x=he(je(),D);await ni(x,{recursive:!0});let P=he(x,"SKILL.md");await ri(P,R,"utf-8");let I;try{I=await Vu(P,"utf-8")}catch{I=""}if(!I.startsWith("---"))throw l=await V({event:"forge.write_failed",reason:"readback_failed",skill_name_attempted:D}),new Error(`forge write-step invariant failed (readback_failed): written file at ${P} did not read back with expected frontmatter`);p=P,w&&y&&await cr(y,"consumed"),l=await V({event:"forge.complete",status:"APPROVED",skill_name:D,iterations:d.length})}else u==="MAX_ITERATIONS"&&(w&&y&&await cr(y,"failed"),l=await V({event:"forge.complete",status:"MAX_ITERATIONS",skill_name_attempted:m||null,iterations:d.length}))}catch(f){throw l=await V({event:"forge.error",error:f instanceof Error?f.message:String(f)}),f}return{status:u,skill_path:p,qualify_verdicts:d,brief_id:y,telemetry_ref:l}}var dp={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:lp,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"]};X(dp);import{config as dv}from"dotenv";var en={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 si(t){return t in en}function ii(t){let e=en[t];if(!e)throw new Error(`Invalid model: ${t}`);return e}function wt(t){if(t!==void 0)return typeof t=="string"&&si(t)?ii(t):t}import{execFile as up}from"node:child_process";import{promisify as pp}from"node:util";var nv=pp(up);function ai(){return v.ANTHROPIC_API_KEY||v.CLAUDE_CODE_OAUTH_TOKEN||re()}function J(){let t=v.AFK_MODEL??v.CLAUDE_MODEL;return mp(t)}function fp(){return v.OPENAI_API_KEY||v.CODEX_API_KEY||void 0}function mp(t){let e=ce(t);return e==="openai-compatible"||e==="openai-codex"?fp():ai()}async function ci(t,e,n,r){let s=j("mint")["spec.md"];if(!s)throw new Error("mint skill missing spec.md prompt");let a=await(await new O(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:e},config:{model:"sonnet",systemPrompt:s,apiKey:J()},idPrefix:"mint-spec",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Create a detailed specification for: ${t}`);if(a.status!=="succeeded"||!a.message)throw new Error(`spec phase failed: ${H(a)}`);return a.message.content}async function li(t,e,n,r){let s=j("mint")["research.md"];if(!s)throw new Error("mint skill missing research.md prompt");let a=await(await new O(n!==void 0?{cwd:n}:{}).forkSubagent({parent:{sessionId:e},config:{model:"sonnet",systemPrompt:s,apiKey:J()},idPrefix:"mint-research",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Gather context and research for this specification:
1508
1508
 
1509
1509
  ${t}`);if(a.status!=="succeeded"||!a.message)throw new Error(`research phase failed: ${H(a)}`);return a.message.content}async function di(t,e,n,r,o){let i=j("mint")["plan.md"];if(!i)throw new Error("mint skill missing plan.md prompt");let a=await new O(r!==void 0?{cwd:r}:{}).forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:i,apiKey:J()},idPrefix:"mint-plan",phaseRole:"read-only",...o?{parentId:o}:{}}),l=`Specification:
1510
1510
  ${t}
@@ -1512,13 +1512,13 @@ ${t}
1512
1512
  Research findings:
1513
1513
  ${e}
1514
1514
 
1515
- Create a detailed implementation plan based on the spec and research.`,d=await a.runToResult(l);if(d.status!=="succeeded"||!d.message)throw new Error(`plan phase failed: ${H(d)}`);return d.message.content}function fp(t){let e=/[\w./@-]*\.(?:ts|tsx|js|jsx|mjs|cjs|py|md|json|yaml|yml|toml|sh)\b/gi,n=new Set;for(let r of t.matchAll(e))n.add(r[0].toLowerCase());return n.size}async function ui(t,e,n){if(fp(t)<3)return{kind:"skipped",reason:"too-few-files"};let o=!1;try{let s=ke("parallelize");return o=!0,{kind:"plan",plan:await s.handler({plan:t})}}catch(s){if(o)return{kind:"failed",error:`parallelize skill handler threw: ${s instanceof Error?s.message:String(s)}`}}try{let i=Zn().get("parallelize");if(!i)return{kind:"skipped",reason:"skill-body-missing"};let c=new O({parentAbortSignal:e.abortSignal,apiKey:J(),...e.cwd!==void 0?{cwd:e.cwd}:{}});try{let l=await(await c.forkSubagent({parent:e,config:{model:"sonnet",systemPrompt:i.body,env:{PLUGIN_ROOT:i.pluginPath}},idPrefix:"mint-parallelize",...n?{parentId:n}:{}})).runToResult(JSON.stringify({plan:t}));return l.status==="succeeded"&&l.message?{kind:"plan",plan:l.message.content}:l.status!=="succeeded"?{kind:"failed",error:`parallelize subagent status=${l.status}${l.error?.message?`: ${l.error.message}`:""}`}:{kind:"failed",error:"parallelize subagent returned no message"}}finally{await c.teardownAll()}}catch(s){return{kind:"failed",error:`parallelize dispatch threw: ${s instanceof Error?s.message:String(s)}`}}}import{z as ye}from"zod";function Je(t){let e=ve();e&&e({type:"panel",spec:t},{subagentId:"__main__"})}var mp=ye.object({status:ye.enum(["PASS","FAIL"]),status_reason:ye.string().optional(),files_changed:ye.array(ye.string()),tests_passed:ye.boolean(),build_passed:ye.boolean().optional(),verification_passed:ye.boolean().optional(),notes:ye.string()});async function pi(t,e,n,r,o){let i=j("mint")["build.md"];if(!i)throw new Error("mint skill missing build.md prompt");let a=await new O(r!==void 0?{cwd:r}:{}).forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:i,apiKey:J()},idPrefix:"mint-build",outputSchema:mp,...o?{parentId:o}:{}}),l=`Implementation plan:
1515
+ Create a detailed implementation plan based on the spec and research.`,d=await a.runToResult(l);if(d.status!=="succeeded"||!d.message)throw new Error(`plan phase failed: ${H(d)}`);return d.message.content}function gp(t){let e=/[\w./@-]*\.(?:ts|tsx|js|jsx|mjs|cjs|py|md|json|yaml|yml|toml|sh)\b/gi,n=new Set;for(let r of t.matchAll(e))n.add(r[0].toLowerCase());return n.size}async function ui(t,e,n){if(gp(t)<3)return{kind:"skipped",reason:"too-few-files"};let o=!1;try{let s=ke("parallelize");return o=!0,{kind:"plan",plan:await s.handler({plan:t})}}catch(s){if(o)return{kind:"failed",error:`parallelize skill handler threw: ${s instanceof Error?s.message:String(s)}`}}try{let i=Zn().get("parallelize");if(!i)return{kind:"skipped",reason:"skill-body-missing"};let c=new O({parentAbortSignal:e.abortSignal,apiKey:J(),...e.cwd!==void 0?{cwd:e.cwd}:{}});try{let l=await(await c.forkSubagent({parent:e,config:{model:"sonnet",systemPrompt:i.body,env:{PLUGIN_ROOT:i.pluginPath}},idPrefix:"mint-parallelize",...n?{parentId:n}:{}})).runToResult(JSON.stringify({plan:t}));return l.status==="succeeded"&&l.message?{kind:"plan",plan:l.message.content}:l.status!=="succeeded"?{kind:"failed",error:`parallelize subagent status=${l.status}${l.error?.message?`: ${l.error.message}`:""}`}:{kind:"failed",error:"parallelize subagent returned no message"}}finally{await c.teardownAll()}}catch(s){return{kind:"failed",error:`parallelize dispatch threw: ${s instanceof Error?s.message:String(s)}`}}}import{z as ye}from"zod";function Je(t){let e=ve();e&&e({type:"panel",spec:t},{subagentId:"__main__"})}var hp=ye.object({status:ye.enum(["PASS","FAIL"]),status_reason:ye.string().optional(),files_changed:ye.array(ye.string()),tests_passed:ye.boolean(),build_passed:ye.boolean().optional(),verification_passed:ye.boolean().optional(),notes:ye.string()});async function pi(t,e,n,r,o){let i=j("mint")["build.md"];if(!i)throw new Error("mint skill missing build.md prompt");let a=await new O(r!==void 0?{cwd:r}:{}).forkSubagent({parent:{sessionId:n},config:{model:"sonnet",systemPrompt:i,apiKey:J()},idPrefix:"mint-build",outputSchema:hp,...o?{parentId:o}:{}}),l=`Implementation plan:
1516
1516
  ${t}
1517
1517
 
1518
1518
  `+(e?`Wave orchestration plan:
1519
1519
  ${JSON.stringify(e,null,2)}
1520
1520
 
1521
- `:"")+"Execute the implementation plan following TDD (test-first) principles.",d=await a.runToResult(l);if(d.status!=="succeeded"||!d.output)throw new Error(`build phase failed: ${H(d)}`);let u=d.output,p={filesChanged:u.files_changed,testsPassed:u.tests_passed,notes:u.notes};return Je({kind:"checkpoint",title:"build",body:[`Files changed: ${p.filesChanged.length}`,`Tests: ${p.testsPassed?"passed":"failed"}`,"Next: verify"]}),p}import{z as Ve}from"zod";var gp=Ve.object({status:Ve.enum(["PASS","FAIL"]),status_reason:Ve.string().optional(),issues:Ve.array(Ve.string()).default([]),summary:Ve.string().optional()});async function dr(t,e,n,r,o,s,i){let a=await new O(s!==void 0?{cwd:s}:{}).forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:o,apiKey:J()},idPrefix:`mint-verify-${t}`,outputSchema:gp,...i?{parentId:i}:{}}),l=`Plan:
1521
+ `:"")+"Execute the implementation plan following TDD (test-first) principles.",d=await a.runToResult(l);if(d.status!=="succeeded"||!d.output)throw new Error(`build phase failed: ${H(d)}`);let u=d.output,p={filesChanged:u.files_changed,testsPassed:u.tests_passed,notes:u.notes};return Je({kind:"checkpoint",title:"build",body:[`Files changed: ${p.filesChanged.length}`,`Tests: ${p.testsPassed?"passed":"failed"}`,"Next: verify"]}),p}import{z as Ve}from"zod";var yp=Ve.object({status:Ve.enum(["PASS","FAIL"]),status_reason:Ve.string().optional(),issues:Ve.array(Ve.string()).default([]),summary:Ve.string().optional()});async function dr(t,e,n,r,o,s,i){let a=await new O(s!==void 0?{cwd:s}:{}).forkSubagent({parent:{sessionId:r},config:{model:"sonnet",systemPrompt:o,apiKey:J()},idPrefix:`mint-verify-${t}`,outputSchema:yp,...i?{parentId:i}:{}}),l=`Plan:
1522
1522
  ${e}
1523
1523
 
1524
1524
  Build results:
@@ -1555,20 +1555,20 @@ ${JSON.stringify(t.buildResults,null,2)}
1555
1555
  Verification results:
1556
1556
  ${JSON.stringify(t.verifyResults,null,2)}
1557
1557
 
1558
- Create a ship-ready summary with next steps.`,l=await c.runToResult(a);if(l.status!=="succeeded"||!l.message)throw new Error(`ship phase failed: ${H(l)}`);let d=t.buildResults?.filesChanged.length??0,u=t.healIterations;return Je({kind:"checkpoint",title:"ship \u2014 done",body:[`Files changed: ${d}`,`Heal iterations: ${u}`,`Idea: ${t.idea}`]}),l.message.content}import{existsSync as gi,mkdirSync as hp,readFileSync as yp,unlinkSync as bp,writeFileSync as wp}from"fs";import{dirname as kp,join as Sp}from"path";function ur(t){return Sp(ro(),t,"mint-state.json")}function hi(t,e){let n=ur(t);hp(kp(n),{recursive:!0}),wp(n,JSON.stringify(e,null,2),"utf-8")}function vp(t){if(typeof t!="object"||t===null)return!1;let e=t;return typeof e.currentPhase=="string"&&typeof e.idea=="string"&&typeof e.spec=="string"&&typeof e.healIterations=="number"&&Array.isArray(e.history)}function yi(t){let e=ur(t);if(!gi(e))return null;try{let n=JSON.parse(yp(e,"utf-8"));return vp(n)?n:null}catch{return null}}function pr(t){let e=ur(t);if(gi(e))try{bp(e)}catch{}}var Ep=2,bi=/^\s*(?:--continue(?:\s+(?:approved|yes|y))?|approved?|yes|y|lgtm|sure)\s*$/i,_p='To approve and run the rest of the pipeline, say "approve", "yes", "sure", or "lgtm" \u2014 or invoke /mint --continue approved. The handler will reload the spec state from disk.';function de(t,e,n){t.history.push({phase:e,output:n,timestamp:Date.now()})}function vi(t){if("completed"in t&&"paused"in t)throw new Error("mint: invariant violation \u2014 MintResult carries both completed and paused keys simultaneously")}var wi=240;function Tp(t){return t.length<=wi?t:t.slice(0,wi)+"\u2026"}function Ei(t){if(typeof t=="string"){if(bi.test(t))return{userApproved:!0};if(t.length>1&&t.trimStart().startsWith("{"))try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null)return Ei(e)}catch{}return{idea:t}}if(typeof t=="object"&&t!==null){let e=t,n=typeof e.idea=="string"?e.idea:void 0;if(n!==void 0&&bi.test(n))return{userApproved:!0};if("idea"in e||"resumeFrom"in e||e.userApproved===!0)return e}throw new Error("mint handler requires input.idea (string), input as string, or {userApproved: true} to resume")}async function ki(t,e,n){if(!e.sessionId)throw new Error("runPhasesAfterSpec requires parentSession.sessionId");let r=e.sessionId,o=e.cwd;try{t.currentPhase="research",t.research=await li(t.spec,r,o,n),de(t,"research",t.research),t.currentPhase="plan",t.plan=await di(t.spec,t.research,r,o,n),de(t,"plan",t.plan),t.currentPhase="parallelize";let s=await ui(t.plan,e,n);if(s.kind==="plan")t.waveOrchestrationPlan=s.plan,de(t,"parallelize",JSON.stringify(s.plan));else if(s.kind==="skipped")t.waveOrchestrationPlan=void 0,de(t,"parallelize",`skipped: ${s.reason}`);else if(s.kind==="failed"){t.waveOrchestrationPlan=void 0;let a=Tp(s.error);de(t,"parallelize",`failed: ${a}`),oe({event:"fallback.inline",parent_session_id:r,reason:"parallelize-dispatch-failed",error_message:a}),console.warn(`[mint] parallelize dispatch failed (single-lane fallback): ${a}`)}else{let a=s}t.currentPhase="build",t.buildResults=await pi(t.plan,t.waveOrchestrationPlan,r,o,n),de(t,"build",JSON.stringify(t.buildResults)),t.currentPhase="verify",t.verifyResults=await tn(t.plan,t.buildResults,r,o,n),de(t,"verify",JSON.stringify(t.verifyResults)),t.currentPhase="heal";let i=t.verifyResults.testsPassed&&t.verifyResults.lintPassed&&t.verifyResults.designReviewPassed;for(;!i&&t.healIterations<Ep;){let a=await fi(t.plan,t.buildResults,t.verifyResults,t.healIterations,e,n);t.healIterations=a.newHealIterations,t.verifyResults=a.newVerifyResults,i=a.healed,de(t,"heal",`Iterations: ${t.healIterations}, Success: ${i}`)}if(!i)return{paused:!0,phase:"heal-failed",reason:`Heal capped at ${t.healIterations} iterations; still have failures`,state:t,nextStep:"Heal loop exhausted. Inspect verifyResults, fix manually, then re-invoke /mint with a fresh idea \u2014 resume is not supported from heal-failed."};t.currentPhase="ship";let c=await mi(t,r,o,n);return de(t,"ship",c),{completed:!0,artifact:c,state:t}}catch(s){throw new Error(`mint failed at ${t.currentPhase}: ${s}`)}}function Si(t,e){return vi(e),("completed"in e||e.phase==="heal-failed")&&pr(t),e}async function xp(t,e,n){let r=Ei(t);if(!e?.sessionId)throw new Error("mint handler requires a parent session to fork subagents");let o=e.sessionId,s=n?.callId;if(r.userApproved){let a=r.resumeFrom??yi(o);if(!a)throw new Error("mint: no paused spec found for this session to continue. Run /mint <idea> first, then /mint --continue approved.");let l=await ki(a,e,s);return Si(o,l)}if(!r.idea)throw new Error("mint: no idea provided. Run /mint <idea> to start, or /mint --continue approved to resume a paused spec.");pr(o);let i={currentPhase:"spec",idea:r.idea,healIterations:0,history:[]};try{i.spec=await ci(r.idea,o,e.cwd,s),de(i,"spec",i.spec)}catch(a){throw new Error(`mint failed at spec: ${a}`)}if(!r.autoApprove){hi(o,i);let a={paused:!0,phase:"spec",spec:i.spec,state:i,nextStep:_p};return vi(a),a}let c=await ki(i,e,s);return Si(o,c)}var Ap={name:"mint",description:"Takes a feature idea or refactor scope and delivers a ship-ready, verified implementation end-to-end",handler:xp,argumentHint:"<idea> | --continue [approved]",whenToUse:'When the user wants a feature or refactor delivered end-to-end (spec \u2192 research \u2192 build \u2192 verify) in one ship-ready pass. After the spec phase pauses for approval, resume by invoking mint again with the literal string `"approved"` (or `"yes"`, `"lgtm"`, `"--continue approved"`) as the arguments. Equivalent JSON forms `{"userApproved": true}` and `{"idea": "approved"}` are also accepted. The handler reloads the spec state from disk and runs phases 2\u20138.',flags:["--continue"]};X(Ap);async function Rp(){throw new Error("service-setup is a fork skill; its handler should never be called directly. Invoke via the `skill` tool or `/service-setup` slash command.")}var Pp={name:"service-setup",description:"Install an AFK background process (telegram bot or daemon) as a macOS LaunchAgent so it auto-starts on login and relaunches on crash. Runs pre-flight checks (e.g., refuses to install the telegram service with an invalid token, which would otherwise crash-loop under KeepAlive), invokes `afk service install`, verifies with `afk service status`, and surfaces the management cheatsheet. macOS-only \u2014 gracefully refuses on other platforms.",handler:Rp,context:"fork",whenToUse:"When the user wants to make `afk telegram start` or `afk daemon` always-on \u2014 i.e., survive reboot, crash, OOM. Triggers on phrasings like 'install as a service', 'auto-start on login', 'keep the bot running', 'launchd', 'always-on telegram', or right after a successful `/telegram-setup` when the user asks how to make it persistent."};X(Pp);async function Ip(){throw new Error("telegram-setup is a fork skill; its handler should never be called directly. Invoke via the `skill` tool or `/telegram-setup` slash command.")}var Cp={name:"telegram-setup",description:"Guide the user through first-time Telegram bot onboarding without leaking the bearer token. Walks the user to run `afk telegram setup` in a terminal for token entry, then uses the sanctioned `afk telegram check-token`/`discover-chat`/`set-allowed-chat` subcommands to validate and finish allowlist setup \u2014 the token never enters the model context. Works in REPL or Telegram. Use when the user wants to set up Telegram push notifications for the first time, or to debug a partially-configured install.",handler:Ip,context:"fork",whenToUse:`When the user wants to set up Telegram bot notifications for the first time, or when they say something like "set up telegram", "connect telegram", "enable push", or you detect that TELEGRAM_BOT_TOKEN is unset and they're asking for notifications.`};X(Cp);import{existsSync as Mp,readdirSync as Op,readFileSync as Dp,statSync as Fp}from"fs";import{join as Lp}from"path";function fr(t){let e=[];function n(r,o=0){if(o>10||!Mp(r))return;let s;try{s=Op(r)}catch{return}for(let i of s){if(i.startsWith("."))continue;let c=Lp(r,i),a;try{a=Fp(c)}catch{continue}if(a.isFile()&&i==="SKILL.md"){let l=Np(c);l.name&&e.push(l)}else a.isDirectory()&&n(c,o+1)}}return n(t),e}function Np(t){try{let e=Dp(t,"utf-8");if(!e.startsWith(`---
1558
+ Create a ship-ready summary with next steps.`,l=await c.runToResult(a);if(l.status!=="succeeded"||!l.message)throw new Error(`ship phase failed: ${H(l)}`);let d=t.buildResults?.filesChanged.length??0,u=t.healIterations;return Je({kind:"checkpoint",title:"ship \u2014 done",body:[`Files changed: ${d}`,`Heal iterations: ${u}`,`Idea: ${t.idea}`]}),l.message.content}import{existsSync as gi,mkdirSync as bp,readFileSync as wp,unlinkSync as kp,writeFileSync as Sp}from"fs";import{dirname as vp,join as Ep}from"path";function ur(t){return Ep(ro(),t,"mint-state.json")}function hi(t,e){let n=ur(t);bp(vp(n),{recursive:!0}),Sp(n,JSON.stringify(e,null,2),"utf-8")}function _p(t){if(typeof t!="object"||t===null)return!1;let e=t;return typeof e.currentPhase=="string"&&typeof e.idea=="string"&&typeof e.spec=="string"&&typeof e.healIterations=="number"&&Array.isArray(e.history)}function yi(t){let e=ur(t);if(!gi(e))return null;try{let n=JSON.parse(wp(e,"utf-8"));return _p(n)?n:null}catch{return null}}function pr(t){let e=ur(t);if(gi(e))try{kp(e)}catch{}}var Tp=2,bi=/^\s*(?:--continue(?:\s+(?:approved|yes|y))?|approved?|yes|y|lgtm|sure)\s*$/i,xp='To approve and run the rest of the pipeline, say "approve", "yes", "sure", or "lgtm" \u2014 or invoke /mint --continue approved. The handler will reload the spec state from disk.';function de(t,e,n){t.history.push({phase:e,output:n,timestamp:Date.now()})}function vi(t){if("completed"in t&&"paused"in t)throw new Error("mint: invariant violation \u2014 MintResult carries both completed and paused keys simultaneously")}var wi=240;function Ap(t){return t.length<=wi?t:t.slice(0,wi)+"\u2026"}function Ei(t){if(typeof t=="string"){if(bi.test(t))return{userApproved:!0};if(t.length>1&&t.trimStart().startsWith("{"))try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null)return Ei(e)}catch{}return{idea:t}}if(typeof t=="object"&&t!==null){let e=t,n=typeof e.idea=="string"?e.idea:void 0;if(n!==void 0&&bi.test(n))return{userApproved:!0};if("idea"in e||"resumeFrom"in e||e.userApproved===!0)return e}throw new Error("mint handler requires input.idea (string), input as string, or {userApproved: true} to resume")}async function ki(t,e,n){if(!e.sessionId)throw new Error("runPhasesAfterSpec requires parentSession.sessionId");let r=e.sessionId,o=e.cwd;try{t.currentPhase="research",t.research=await li(t.spec,r,o,n),de(t,"research",t.research),t.currentPhase="plan",t.plan=await di(t.spec,t.research,r,o,n),de(t,"plan",t.plan),t.currentPhase="parallelize";let s=await ui(t.plan,e,n);if(s.kind==="plan")t.waveOrchestrationPlan=s.plan,de(t,"parallelize",JSON.stringify(s.plan));else if(s.kind==="skipped")t.waveOrchestrationPlan=void 0,de(t,"parallelize",`skipped: ${s.reason}`);else if(s.kind==="failed"){t.waveOrchestrationPlan=void 0;let a=Ap(s.error);de(t,"parallelize",`failed: ${a}`),oe({event:"fallback.inline",parent_session_id:r,reason:"parallelize-dispatch-failed",error_message:a}),console.warn(`[mint] parallelize dispatch failed (single-lane fallback): ${a}`)}else{let a=s}t.currentPhase="build",t.buildResults=await pi(t.plan,t.waveOrchestrationPlan,r,o,n),de(t,"build",JSON.stringify(t.buildResults)),t.currentPhase="verify",t.verifyResults=await tn(t.plan,t.buildResults,r,o,n),de(t,"verify",JSON.stringify(t.verifyResults)),t.currentPhase="heal";let i=t.verifyResults.testsPassed&&t.verifyResults.lintPassed&&t.verifyResults.designReviewPassed;for(;!i&&t.healIterations<Tp;){let a=await fi(t.plan,t.buildResults,t.verifyResults,t.healIterations,e,n);t.healIterations=a.newHealIterations,t.verifyResults=a.newVerifyResults,i=a.healed,de(t,"heal",`Iterations: ${t.healIterations}, Success: ${i}`)}if(!i)return{paused:!0,phase:"heal-failed",reason:`Heal capped at ${t.healIterations} iterations; still have failures`,state:t,nextStep:"Heal loop exhausted. Inspect verifyResults, fix manually, then re-invoke /mint with a fresh idea \u2014 resume is not supported from heal-failed."};t.currentPhase="ship";let c=await mi(t,r,o,n);return de(t,"ship",c),{completed:!0,artifact:c,state:t}}catch(s){throw new Error(`mint failed at ${t.currentPhase}: ${s}`)}}function Si(t,e){return vi(e),("completed"in e||e.phase==="heal-failed")&&pr(t),e}async function Rp(t,e,n){let r=Ei(t);if(!e?.sessionId)throw new Error("mint handler requires a parent session to fork subagents");let o=e.sessionId,s=n?.callId;if(r.userApproved){let a=r.resumeFrom??yi(o);if(!a)throw new Error("mint: no paused spec found for this session to continue. Run /mint <idea> first, then /mint --continue approved.");let l=await ki(a,e,s);return Si(o,l)}if(!r.idea)throw new Error("mint: no idea provided. Run /mint <idea> to start, or /mint --continue approved to resume a paused spec.");pr(o);let i={currentPhase:"spec",idea:r.idea,healIterations:0,history:[]};try{i.spec=await ci(r.idea,o,e.cwd,s),de(i,"spec",i.spec)}catch(a){throw new Error(`mint failed at spec: ${a}`)}if(!r.autoApprove){hi(o,i);let a={paused:!0,phase:"spec",spec:i.spec,state:i,nextStep:xp};return vi(a),a}let c=await ki(i,e,s);return Si(o,c)}var Pp={name:"mint",description:"Takes a feature idea or refactor scope and delivers a ship-ready, verified implementation end-to-end",handler:Rp,argumentHint:"<idea> | --continue [approved]",whenToUse:'When the user wants a feature or refactor delivered end-to-end (spec \u2192 research \u2192 build \u2192 verify) in one ship-ready pass. After the spec phase pauses for approval, resume by invoking mint again with the literal string `"approved"` (or `"yes"`, `"lgtm"`, `"--continue approved"`) as the arguments. Equivalent JSON forms `{"userApproved": true}` and `{"idea": "approved"}` are also accepted. The handler reloads the spec state from disk and runs phases 2\u20138.',flags:["--continue"]};X(Pp);async function Ip(){throw new Error("service-setup is a fork skill; its handler should never be called directly. Invoke via the `skill` tool or `/service-setup` slash command.")}var Cp={name:"service-setup",description:"Install an AFK background process (telegram bot or daemon) as a macOS LaunchAgent so it auto-starts on login and relaunches on crash. Runs pre-flight checks (e.g., refuses to install the telegram service with an invalid token, which would otherwise crash-loop under KeepAlive), invokes `afk service install`, verifies with `afk service status`, and surfaces the management cheatsheet. macOS-only \u2014 gracefully refuses on other platforms.",handler:Ip,context:"fork",whenToUse:"When the user wants to make `afk telegram start` or `afk daemon` always-on \u2014 i.e., survive reboot, crash, OOM. Triggers on phrasings like 'install as a service', 'auto-start on login', 'keep the bot running', 'launchd', 'always-on telegram', or right after a successful `/telegram-setup` when the user asks how to make it persistent."};X(Cp);async function Mp(){throw new Error("telegram-setup is a fork skill; its handler should never be called directly. Invoke via the `skill` tool or `/telegram-setup` slash command.")}var Op={name:"telegram-setup",description:"Guide the user through first-time Telegram bot onboarding without leaking the bearer token. Walks the user to run `afk telegram setup` in a terminal for token entry, then uses the sanctioned `afk telegram check-token`/`discover-chat`/`set-allowed-chat` subcommands to validate and finish allowlist setup \u2014 the token never enters the model context. Works in REPL or Telegram. Use when the user wants to set up Telegram push notifications for the first time, or to debug a partially-configured install.",handler:Mp,context:"fork",whenToUse:`When the user wants to set up Telegram bot notifications for the first time, or when they say something like "set up telegram", "connect telegram", "enable push", or you detect that TELEGRAM_BOT_TOKEN is unset and they're asking for notifications.`};X(Op);import{existsSync as Dp,readdirSync as Fp,readFileSync as Lp,statSync as Np}from"fs";import{join as $p}from"path";function fr(t){let e=[];function n(r,o=0){if(o>10||!Dp(r))return;let s;try{s=Fp(r)}catch{return}for(let i of s){if(i.startsWith("."))continue;let c=$p(r,i),a;try{a=Np(c)}catch{continue}if(a.isFile()&&i==="SKILL.md"){let l=Up(c);l.name&&e.push(l)}else a.isDirectory()&&n(c,o+1)}}return n(t),e}function Up(t){try{let e=Lp(t,"utf-8");if(!e.startsWith(`---
1559
1559
  `))return{};let n=e.slice(4),r=n.indexOf(`
1560
1560
  ---`);if(r===-1)return{};let o=n.slice(0,r),s=n.slice(r+4).trim(),i={},c=o.split(`
1561
1561
  `);for(let a of c){if(!a)continue;let l=a.indexOf(":");if(l===-1)continue;let d=a.slice(0,l).trim(),u=a.slice(l+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{}}}function _i(t){let e=ze(t);if(e.length===0)return"";let n=[];for(let r of e){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(`
1562
- `)}function ze(t){let e=[],n=new Set;for(let o of nt()){let s=ke(o);e.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=t??[...me(xn()),...me(),...me(Rn())];for(let o of r){if(o.type!=="local")continue;let s=fr(o.path);for(let i of s)!i.name||n.has(i.name)||(e.push({name:i.name,description:i.description??`Skill from plugin at ${o.path}`,source:"plugin"}),n.add(i.name))}return e}function Zn(t){let e=new Map,n=t??[...me(xn()),...me(),...me(Rn())];for(let r of n){if(r.type!=="local")continue;let o=fr(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&!e.has(s.name)&&e.set(s.name,{body:s.body,pluginPath:r.path})}return e}function Ti(t){if(t.length===0)return;let e=t[t.length-1];if(!e||e.role!=="assistant"||typeof e.content=="string")return;let n=e.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}))};t.push(o)}function xi(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var $p="__closed__",nn=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(e=>{this.closeResolve=()=>e($p)})}begin(){let e=new AbortController;return this.current=e,this.pendingReason!==null&&!e.signal.aborted&&(e.abort(this.pendingReason),this.pendingReason=null),e}clear(e){this.current===e&&(this.current=null)}requestAbort(e){let n=this.current;if(n&&!n.signal.aborted){n.abort(e);return}this.pendingReason=e}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}};import{randomUUID as hr}from"node:crypto";import{randomUUID as Wp}from"node:crypto";var Up=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 jp(t,e,n,r,o){let s=Up.get(t);if(!s)return;let i=1e6,a=Math.max(0,e-r-o)/i*s.inputPerMTok,l=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,y=r/i*u;return a+l+p+y}function Ai(t,e,n){if(!t)return{stopReason:e??null};let r={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null};if(t.cache_read_input_tokens!=null&&(r.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=t.cache_creation_input_tokens),r.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let o=jp(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}function Hp(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function Bp(t,e,n){let r=[],o=[];for(let c of t)c&&(c.kind==="text"?(r.push({type:"text",text:c.text}),o.push(c.text)):c.kind==="thinking"?c.thinking&&c.signature&&r.push({type:"thinking",thinking:c.thinking,signature:c.signature}):r.push({type:"tool_use",id:c.id,name:c.name,input:Hp(c.partialJson)}));let s=c=>c.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*Ri(t,e){let n=[],r=null,o=null,s=!1,i=!!v.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let c of t){switch(i&&console.log("[translate] SDK evt:",c.type),c.type){case"message_start":{let a=c.message?.usage;a&&(o={...a});break}case"content_block_start":{let a=c.content_block;a.type==="text"?n[c.index]={kind:"text",text:""}:a.type==="thinking"?n[c.index]={kind:"thinking",thinking:"",signature:""}:a.type==="tool_use"&&(n[c.index]={kind:"tool_use",id:a.id,name:a.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:a.id,toolName:a.name,toolInput:" \u2026",sessionId:e.sessionId}});break}case"content_block_delta":{let a=n[c.index],l=c.delta;l.type==="text_delta"?(a&&a.kind==="text"&&(a.text+=l.text),yield{kind:"event",event:{type:"delta.text",text:l.text,sessionId:e.sessionId}}):l.type==="input_json_delta"?a&&a.kind==="tool_use"&&(a.partialJson+=l.partial_json):l.type==="thinking_delta"?(a&&a.kind==="thinking"&&(a.thinking+=l.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:l.thinking,sessionId:e.sessionId}}):l.type==="signature_delta"&&a&&a.kind==="thinking"&&(a.signature=l.signature);break}case"content_block_stop":{let a=n[c.index];a&&a.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:a.name,toolUseIds:[a.id],sessionId:e.sessionId}});break}case"message_delta":{c.delta&&c.delta.stop_reason!==void 0&&(r=c.delta.stop_reason);let a=c.usage;a&&(o!==null?(o.output_tokens=a.output_tokens,a.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=a.cache_creation_input_tokens),a.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=a.cache_read_input_tokens),a.input_tokens!=null&&(o.input_tokens=a.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:a.cache_creation_input_tokens??null,cache_read_input_tokens:a.cache_read_input_tokens??null,inference_geo:null,input_tokens:a.input_tokens??0,output_tokens:a.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(c){i&&console.log("[translate] SDK iteration threw:",c.message),yield{kind:"event",event:{type:"error",error:c instanceof Error?c:new Error(String(c))}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:Bp(n,r,o)}}var Kp=0;function Gp(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}var qp=3,zp=5e3;function Jp(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function Vp(t,e){return new Promise(n=>{if(e.aborted){n();return}let r=setTimeout(n,t);r.unref(),e.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}async function Yp(t,e,n,r){for(let o=0;;o++){if(o>0){let s=zp*Math.pow(2,o-1);if(await Vp(s,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let i=s instanceof Error?s:new Error(String(s));if(Jp(i)&&o<qp)continue;throw i}}}function Xp(t){if(!t||typeof t!="object")return"";let e=t,n=e.file_path??e.path??e.filePath;if(typeof n=="string")return" "+n;let r=e.command??e.cmd;if(typeof r=="string"){let s=r.split(`
1563
- `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=e.query??e.pattern??e.url??e.description;return typeof o=="string"?" "+o:""}async function*mr(t){let e=t.maxToolUseIterations??Kp,n={stopReason:null},r=0,o=Wp(),s=Date.now(),i=c=>({...c,durationMs:Date.now()-s});for(;;){if(t.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let c=Tt({baseUrl:t.baseUrl})?Yr(t.messages,xt()):t.messages,a={model:t.model,max_tokens:t.maxTokens,messages:c,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0?{tools:t.tools.map(Gp)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{}},l;try{l=await Yp(t.client,a,t.headers,t.signal)}catch(f){if(t.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let m=f instanceof Error?f:new Error(String(f));m.message.includes("thinking")&&Qp(t.messages,m),yield{type:"error",error:m};return}let d=null,u=!1;try{v.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let f of Ri(l,t.ctx))if(v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",f.kind,f.kind==="event"?f.event.type:""),f.kind==="event"){if(f.event.type==="error"){yield f.event,u=!0;break}yield f.event}else{d=f.result;break}v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",d?"set":"null")}catch(f){if(t.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}yield{type:"error",error:f instanceof Error?f:new Error(String(f))};return}if(u){t.signal.aborted&&(yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId});return}if(d===null){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}if(n=mt(n,Ai(d.usage,d.stopReason,t.model)),d.stopReason!=="tool_use"){d.text.length>0&&(yield{type:"assistant.message",text:d.text,sessionId:t.ctx.sessionId},d.text.length<=200&&(yield{type:"suggestion",suggestion:d.text,sessionId:t.ctx.sessionId}));let f=d.assistantBlocks.filter(m=>m.type!=="tool_use");f.length>0&&t.messages.push({role:"assistant",content:f}),yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let p=t.messages.length;t.messages.push({role:"assistant",content:d.assistantBlocks});try{let f=[],m=new Map;for(let h of d.toolUseBlocks){f.push({id:h.id,name:h.name,input:h.input,signal:t.signal});let g=Date.now();m.set(h.id,g),Sn(t.traceWriter,{phase:"started",toolUseId:h.id,name:h.name,inputBytes:Buffer.byteLength(JSON.stringify(h.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:h.id,toolName:h.name,toolInput:Xp(h.input),sessionId:t.ctx.sessionId}}if(t.signal.aborted){let h=f.map(g=>({type:"tool_result",tool_use_id:g.id,content:"Tool call aborted",is_error:!0}));t.messages.push({role:"user",content:h}),yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let w;if(t.toolDispatcher.executeBatch)try{w=await t.toolDispatcher.executeBatch(f)}catch(h){w=f.map(()=>({content:`Tool batch execution failed: ${h instanceof Error?h.message:String(h)}`,isError:!0}))}else{w=[];for(let h of f){if(t.signal.aborted){w.push({content:"Tool call aborted",isError:!0});continue}try{w.push(await t.toolDispatcher.execute(h))}catch(g){let b=g instanceof Error?g.message:String(g);w.push({content:`Tool execution threw: ${b}`,isError:!0})}}}let k=[];for(let h=0;h<f.length;h++){let g=f[h],b=w[h],E=m.get(g.id),C=typeof E=="number"?Date.now()-E:0,F=b.truncated===!0||b.content.includes("[output truncated");Sn(t.traceWriter,{phase:"completed",toolUseId:g.id,name:g.name,resultBytes:Buffer.byteLength(b.content,"utf8"),isError:b.isError===!0,truncated:F,durationMs:C}),yield{type:"tool.output",toolUseId:g.id,toolName:g.name,content:b.content,...b.isError===!0?{isError:!0}:{},...F?{truncated:!0}:{},sessionId:t.ctx.sessionId},b.render?.diff&&(yield{type:"tool.diff",toolUseId:g.id,diff:b.render.diff,sessionId:t.ctx.sessionId});let{content:T,isError:D}=b;k.push({type:"tool_result",tool_use_id:g.id,content:T,...D===!0?{is_error:!0}:{}})}let S={role:"user",content:k};t.messages.push(S)}catch(f){throw t.messages.splice(p),f}r+=1;let y=d.toolUseBlocks[d.toolUseBlocks.length-1];if(yield{type:"progress",progress:{taskId:o,description:"Tool-use loop",summary:`Iteration ${r}: used ${y?.name??"unknown"}`,lastToolName:y?.name,totalTokens:n.totalTokens??0,toolUses:r,durationMs:Date.now()-s},sessionId:t.ctx.sessionId},e>0&&r>=e){yield{type:"turn.completed",usage:i({...n,stopReason:"tool_use_loop_capped"}),sessionId:t.ctx.sessionId};return}}}function Qp(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let c=s[i];if(c.type==="thinking"){let a=c;(!a.thinking||!a.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:a.thinking?`(${a.thinking.length} chars)`:"(empty)",sigLen:a.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}function gr(t){if(!("status"in t))return null;let e=t.status;if(e===429){let n=t.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 e===400&&t.message.includes("invalid_request_error")&&t.message.includes("credit balance")?{kind:"credit-exhausted"}:null}async function Pi(t){let{resetsAt:e,signal:n,readToken:r=re}=t,o=r(),s=e.getTime()+3e4;return new Promise(i=>{let c=()=>n.aborted?(i("aborted"),!0):Date.now()>=s?(i("timer"),!0):r()!==o?(i("hot-swap"),!0):!1;if(c())return;let a=setInterval(()=>{c()&&clearInterval(a)},3e4);a.unref(),n.addEventListener("abort",()=>{clearInterval(a),i("aborted")},{once:!0})})}async function Ii(t){let{signal:e,readToken:n=re}=t,r=n();return new Promise(o=>{let s=()=>e.aborted?(o("aborted"),!0):n()!==r?(o("hot-swap"),!0):!1;if(s())return;let i=setInterval(()=>{s()&&clearInterval(i)},3e4);e.addEventListener("abort",()=>{clearInterval(i),o("aborted")},{once:!0})})}var Zp=7200*1e3,rn=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(e){this._client=e.client,this._authMode=e.authMode,this.initSessionId=e.initSessionId,this.tokenRefresher=e.tokenRefresher,this.autoResumeOnUsageLimit=e.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let e=re(),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=re();return{accountId:tt(r??""),swapped:e!==r}}async*turnWithRetries(e,n){yield*this.turnWithUsageLimitRetry(e,n)}async*turnWithUsageLimitRetry(e,n){let r=null,o=null,s=!1;for await(let l of this.turnWithAuthRetry(e,n)){if(l.type==="error"){let d=gr(l.error);if(d&&d.kind==="oauth-limit"){o=d.resetsAt,r=l;break}if(d&&d.kind==="oauth-limit-no-ts"){s=!0,r=l;break}}yield l}if(!r)return;if(s){if(yield{type:"paused",reason:"usage-limit",accountId:tt(re()??""),autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let d;if(this.usageLimitWaitPromise)d="aborted";else{this.usageLimitWaitPromise=Ii({signal:e.signal});try{d=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(d==="aborted")return;let u=await this.forceClientRefresh();if(!u){yield r;return}e.client=this._client,e.headers=we(this._authMode,this.initSessionId,hr()),yield{type:"resumed",hotSwapped:!0,accountId:u.accountId},yield*this.turnWithAuthRetry(e,n);return}if(!o)return;if(o.getTime()-Date.now()>Zp){yield r;return}let i=tt(re()??"");if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:i,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Pi({resetsAt:o,signal:e.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let a=i;if(c==="hot-swap"){let l=await this.forceClientRefresh();l&&(e.client=this._client,a=l.accountId)}e.headers=we(this._authMode,this.initSessionId,hr()),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:a},yield*this.turnWithAuthRetry(e,n)}async*turnWithAuthRetry(e,n){let r=null;for await(let s of mr(e)){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}e.client=this._client,e.headers=we(this._authMode,this.initSessionId,hr()),yield*mr(e)}isRetryableAuth(e){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in e&&e.status===401}};import{randomUUID as of}from"node:crypto";var ef=["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(`
1564
- `),Ci="[Compacted summary of earlier conversation]",Mi="Acknowledged. Continuing from the summary above.";function tf(t){if(t.role!=="user")return!1;let e=t.content;if(typeof e=="string")return!0;if(!Array.isArray(e))return!1;for(let n of e)if(n.type==="tool_result")return!1;return!0}function Oi(t,e){if(e<=0)return t.length;let n=0;for(let r=t.length-1;r>=0;r--){let o=t[r];if(o&&tf(o)&&(n+=1,n===e))return r}return-1}function Di(t,e,n){let r=nf(t);return{model:e,max_tokens:n,system:ef,messages:[{role:"user",content:`Summarize the following conversation transcript. Follow the system instructions exactly.
1562
+ `)}function ze(t){let e=[],n=new Set;for(let o of nt()){let s=ke(o);e.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=t??[...me(xn()),...me(),...me(Rn())];for(let o of r){if(o.type!=="local")continue;let s=fr(o.path);for(let i of s)!i.name||n.has(i.name)||(e.push({name:i.name,description:i.description??`Skill from plugin at ${o.path}`,source:"plugin"}),n.add(i.name))}return e}function Zn(t){let e=new Map,n=t??[...me(xn()),...me(),...me(Rn())];for(let r of n){if(r.type!=="local")continue;let o=fr(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&!e.has(s.name)&&e.set(s.name,{body:s.body,pluginPath:r.path})}return e}function Ti(t){if(t.length===0)return;let e=t[t.length-1];if(!e||e.role!=="assistant"||typeof e.content=="string")return;let n=e.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}))};t.push(o)}function xi(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var jp="__closed__",nn=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(e=>{this.closeResolve=()=>e(jp)})}begin(){let e=new AbortController;return this.current=e,this.pendingReason!==null&&!e.signal.aborted&&(e.abort(this.pendingReason),this.pendingReason=null),e}clear(e){this.current===e&&(this.current=null)}requestAbort(e){let n=this.current;if(n&&!n.signal.aborted){n.abort(e);return}this.pendingReason=e}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}};import{randomUUID as hr}from"node:crypto";import{randomUUID as Gp}from"node:crypto";var Hp=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 Bp(t,e,n,r,o){let s=Hp.get(t);if(!s)return;let i=1e6,a=Math.max(0,e-r-o)/i*s.inputPerMTok,l=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,y=r/i*u;return a+l+p+y}function Ai(t,e,n){if(!t)return{stopReason:e??null};let r={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null};if(t.cache_read_input_tokens!=null&&(r.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=t.cache_creation_input_tokens),r.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let o=Bp(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}function Wp(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function Kp(t,e,n){let r=[],o=[];for(let c of t)c&&(c.kind==="text"?(r.push({type:"text",text:c.text}),o.push(c.text)):c.kind==="thinking"?c.thinking&&c.signature&&r.push({type:"thinking",thinking:c.thinking,signature:c.signature}):r.push({type:"tool_use",id:c.id,name:c.name,input:Wp(c.partialJson)}));let s=c=>c.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*Ri(t,e){let n=[],r=null,o=null,s=!1,i=!!v.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let c of t){switch(i&&console.log("[translate] SDK evt:",c.type),c.type){case"message_start":{let a=c.message?.usage;a&&(o={...a});break}case"content_block_start":{let a=c.content_block;a.type==="text"?n[c.index]={kind:"text",text:""}:a.type==="thinking"?n[c.index]={kind:"thinking",thinking:"",signature:""}:a.type==="tool_use"&&(n[c.index]={kind:"tool_use",id:a.id,name:a.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:a.id,toolName:a.name,toolInput:" \u2026",sessionId:e.sessionId}});break}case"content_block_delta":{let a=n[c.index],l=c.delta;l.type==="text_delta"?(a&&a.kind==="text"&&(a.text+=l.text),yield{kind:"event",event:{type:"delta.text",text:l.text,sessionId:e.sessionId}}):l.type==="input_json_delta"?a&&a.kind==="tool_use"&&(a.partialJson+=l.partial_json):l.type==="thinking_delta"?(a&&a.kind==="thinking"&&(a.thinking+=l.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:l.thinking,sessionId:e.sessionId}}):l.type==="signature_delta"&&a&&a.kind==="thinking"&&(a.signature=l.signature);break}case"content_block_stop":{let a=n[c.index];a&&a.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:a.name,toolUseIds:[a.id],sessionId:e.sessionId}});break}case"message_delta":{c.delta&&c.delta.stop_reason!==void 0&&(r=c.delta.stop_reason);let a=c.usage;a&&(o!==null?(o.output_tokens=a.output_tokens,a.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=a.cache_creation_input_tokens),a.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=a.cache_read_input_tokens),a.input_tokens!=null&&(o.input_tokens=a.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:a.cache_creation_input_tokens??null,cache_read_input_tokens:a.cache_read_input_tokens??null,inference_geo:null,input_tokens:a.input_tokens??0,output_tokens:a.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(c){i&&console.log("[translate] SDK iteration threw:",c.message),yield{kind:"event",event:{type:"error",error:c instanceof Error?c:new Error(String(c))}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:Kp(n,r,o)}}var qp=0;function zp(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}var Jp=3,Vp=5e3;function Yp(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function Xp(t,e){return new Promise(n=>{if(e.aborted){n();return}let r=setTimeout(n,t);r.unref(),e.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}async function Qp(t,e,n,r){for(let o=0;;o++){if(o>0){let s=Vp*Math.pow(2,o-1);if(await Xp(s,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let i=s instanceof Error?s:new Error(String(s));if(Yp(i)&&o<Jp)continue;throw i}}}function Zp(t){if(!t||typeof t!="object")return"";let e=t,n=e.file_path??e.path??e.filePath;if(typeof n=="string")return" "+n;let r=e.command??e.cmd;if(typeof r=="string"){let s=r.split(`
1563
+ `)[0];return" "+(s.length>80?s.slice(0,77)+"\u2026":s)}let o=e.query??e.pattern??e.url??e.description;return typeof o=="string"?" "+o:""}async function*mr(t){let e=t.maxToolUseIterations??qp,n={stopReason:null},r=0,o=Gp(),s=Date.now(),i=c=>({...c,durationMs:Date.now()-s});for(;;){if(t.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let c=Tt({baseUrl:t.baseUrl})?Yr(t.messages,xt()):t.messages,a={model:t.model,max_tokens:t.maxTokens,messages:c,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0?{tools:t.tools.map(zp)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{}},l;try{l=await Qp(t.client,a,t.headers,t.signal)}catch(f){if(t.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let m=f instanceof Error?f:new Error(String(f));m.message.includes("thinking")&&ef(t.messages,m),yield{type:"error",error:m};return}let d=null,u=!1;try{v.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let f of Ri(l,t.ctx))if(v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",f.kind,f.kind==="event"?f.event.type:""),f.kind==="event"){if(f.event.type==="error"){yield f.event,u=!0;break}yield f.event}else{d=f.result;break}v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",d?"set":"null")}catch(f){if(t.signal.aborted){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}yield{type:"error",error:f instanceof Error?f:new Error(String(f))};return}if(u){t.signal.aborted&&(yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId});return}if(d===null){yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}if(n=mt(n,Ai(d.usage,d.stopReason,t.model)),d.stopReason!=="tool_use"){d.text.length>0&&(yield{type:"assistant.message",text:d.text,sessionId:t.ctx.sessionId},d.text.length<=200&&(yield{type:"suggestion",suggestion:d.text,sessionId:t.ctx.sessionId}));let f=d.assistantBlocks.filter(m=>m.type!=="tool_use");f.length>0&&t.messages.push({role:"assistant",content:f}),yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let p=t.messages.length;t.messages.push({role:"assistant",content:d.assistantBlocks});try{let f=[],m=new Map;for(let h of d.toolUseBlocks){f.push({id:h.id,name:h.name,input:h.input,signal:t.signal});let g=Date.now();m.set(h.id,g),Sn(t.traceWriter,{phase:"started",toolUseId:h.id,name:h.name,inputBytes:Buffer.byteLength(JSON.stringify(h.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:h.id,toolName:h.name,toolInput:Zp(h.input),sessionId:t.ctx.sessionId}}if(t.signal.aborted){let h=f.map(g=>({type:"tool_result",tool_use_id:g.id,content:"Tool call aborted",is_error:!0}));t.messages.push({role:"user",content:h}),yield{type:"turn.completed",usage:i(n),sessionId:t.ctx.sessionId};return}let w;if(t.toolDispatcher.executeBatch)try{w=await t.toolDispatcher.executeBatch(f)}catch(h){w=f.map(()=>({content:`Tool batch execution failed: ${h instanceof Error?h.message:String(h)}`,isError:!0}))}else{w=[];for(let h of f){if(t.signal.aborted){w.push({content:"Tool call aborted",isError:!0});continue}try{w.push(await t.toolDispatcher.execute(h))}catch(g){let b=g instanceof Error?g.message:String(g);w.push({content:`Tool execution threw: ${b}`,isError:!0})}}}let k=[];for(let h=0;h<f.length;h++){let g=f[h],b=w[h],E=m.get(g.id),C=typeof E=="number"?Date.now()-E:0,F=b.truncated===!0||b.content.includes("[output truncated");Sn(t.traceWriter,{phase:"completed",toolUseId:g.id,name:g.name,resultBytes:Buffer.byteLength(b.content,"utf8"),isError:b.isError===!0,truncated:F,durationMs:C}),yield{type:"tool.output",toolUseId:g.id,toolName:g.name,content:b.content,...b.isError===!0?{isError:!0}:{},...F?{truncated:!0}:{},sessionId:t.ctx.sessionId},b.render?.diff&&(yield{type:"tool.diff",toolUseId:g.id,diff:b.render.diff,sessionId:t.ctx.sessionId});let{content:T,isError:D}=b;k.push({type:"tool_result",tool_use_id:g.id,content:T,...D===!0?{is_error:!0}:{}})}let S={role:"user",content:k};t.messages.push(S)}catch(f){throw t.messages.splice(p),f}r+=1;let y=d.toolUseBlocks[d.toolUseBlocks.length-1];if(yield{type:"progress",progress:{taskId:o,description:"Tool-use loop",summary:`Iteration ${r}: used ${y?.name??"unknown"}`,lastToolName:y?.name,totalTokens:n.totalTokens??0,toolUses:r,durationMs:Date.now()-s},sessionId:t.ctx.sessionId},e>0&&r>=e){yield{type:"turn.completed",usage:i({...n,stopReason:"tool_use_loop_capped"}),sessionId:t.ctx.sessionId};return}}}function ef(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let c=s[i];if(c.type==="thinking"){let a=c;(!a.thinking||!a.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:a.thinking?`(${a.thinking.length} chars)`:"(empty)",sigLen:a.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}function gr(t){if(!("status"in t))return null;let e=t.status;if(e===429){let n=t.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 e===400&&t.message.includes("invalid_request_error")&&t.message.includes("credit balance")?{kind:"credit-exhausted"}:null}async function Pi(t){let{resetsAt:e,signal:n,readToken:r=re}=t,o=r(),s=e.getTime()+3e4;return new Promise(i=>{let c=()=>n.aborted?(i("aborted"),!0):Date.now()>=s?(i("timer"),!0):r()!==o?(i("hot-swap"),!0):!1;if(c())return;let a=setInterval(()=>{c()&&clearInterval(a)},3e4);a.unref(),n.addEventListener("abort",()=>{clearInterval(a),i("aborted")},{once:!0})})}async function Ii(t){let{signal:e,readToken:n=re}=t,r=n();return new Promise(o=>{let s=()=>e.aborted?(o("aborted"),!0):n()!==r?(o("hot-swap"),!0):!1;if(s())return;let i=setInterval(()=>{s()&&clearInterval(i)},3e4);e.addEventListener("abort",()=>{clearInterval(i),o("aborted")},{once:!0})})}var tf=7200*1e3,rn=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(e){this._client=e.client,this._authMode=e.authMode,this.initSessionId=e.initSessionId,this.tokenRefresher=e.tokenRefresher,this.autoResumeOnUsageLimit=e.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let e=re(),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=re();return{accountId:tt(r??""),swapped:e!==r}}async*turnWithRetries(e,n){yield*this.turnWithUsageLimitRetry(e,n)}async*turnWithUsageLimitRetry(e,n){let r=null,o=null,s=!1;for await(let l of this.turnWithAuthRetry(e,n)){if(l.type==="error"){let d=gr(l.error);if(d&&d.kind==="oauth-limit"){o=d.resetsAt,r=l;break}if(d&&d.kind==="oauth-limit-no-ts"){s=!0,r=l;break}}yield l}if(!r)return;if(s){if(yield{type:"paused",reason:"usage-limit",accountId:tt(re()??""),autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let d;if(this.usageLimitWaitPromise)d="aborted";else{this.usageLimitWaitPromise=Ii({signal:e.signal});try{d=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(d==="aborted")return;let u=await this.forceClientRefresh();if(!u){yield r;return}e.client=this._client,e.headers=we(this._authMode,this.initSessionId,hr()),yield{type:"resumed",hotSwapped:!0,accountId:u.accountId},yield*this.turnWithAuthRetry(e,n);return}if(!o)return;if(o.getTime()-Date.now()>tf){yield r;return}let i=tt(re()??"");if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:i,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Pi({resetsAt:o,signal:e.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let a=i;if(c==="hot-swap"){let l=await this.forceClientRefresh();l&&(e.client=this._client,a=l.accountId)}e.headers=we(this._authMode,this.initSessionId,hr()),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:a},yield*this.turnWithAuthRetry(e,n)}async*turnWithAuthRetry(e,n){let r=null;for await(let s of mr(e)){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}e.client=this._client,e.headers=we(this._authMode,this.initSessionId,hr()),yield*mr(e)}isRetryableAuth(e){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in e&&e.status===401}};import{randomUUID as af}from"node:crypto";var nf=["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(`
1564
+ `),Ci="[Compacted summary of earlier conversation]",Mi="Acknowledged. Continuing from the summary above.";function rf(t){if(t.role!=="user")return!1;let e=t.content;if(typeof e=="string")return!0;if(!Array.isArray(e))return!1;for(let n of e)if(n.type==="tool_result")return!1;return!0}function Oi(t,e){if(e<=0)return t.length;let n=0;for(let r=t.length-1;r>=0;r--){let o=t[r];if(o&&rf(o)&&(n+=1,n===e))return r}return-1}function Di(t,e,n){let r=of(t);return{model:e,max_tokens:n,system:nf,messages:[{role:"user",content:`Summarize the following conversation transcript. Follow the system instructions exactly.
1565
1565
 
1566
1566
  <transcript>
1567
1567
  `+r+`
1568
1568
  </transcript>`}],stream:!0}}function Fi(t,e,n){return[{role:"user",content:Ci+`
1569
1569
 
1570
- `+n},{role:"assistant",content:Mi},...t.slice(e)]}function Li(t,e,n){let r=rf(t.slice(0,e)),o=Ci.length+2+n.length+Mi.length,s=Math.max(0,r-o);return Math.round(s/4)}function nf(t){let e=[];for(let n of t){let r=n.role==="user"?"User":"Assistant";if(e.push(r+":"),typeof n.content=="string")e.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)e.push(o.text);else if(s==="tool_use"){let i=o.name??"unknown",c=Ni(o.input);e.push(`[tool call: ${i} ${c}]`)}else if(s==="tool_result"){let i=o.content;e.push(`[tool result: ${$i(i)}]`)}else s==="image"?e.push("[image]"):s==="document"&&e.push("[document]")}e.push("")}return e.join(`
1571
- `).trim()}function Ni(t){try{let e=JSON.stringify(t);return e.length>240?e.slice(0,237)+"...":e}catch{return"{}"}}function $i(t){if(typeof t=="string")return t.length>320?t.slice(0,317)+"...":t;if(Array.isArray(t)){let e=[];for(let r of t)r.type==="text"&&"text"in r&&e.push(r.text);let n=e.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function rf(t){let e=0;for(let n of t)if(typeof n.content=="string")e+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?e+=r.text.length:o==="tool_use"?e+=Ni(r.input).length:o==="tool_result"&&(e+=$i(r.content).length)}return e}var sf=2,af="claude-haiku-4-5-20251001",cf=1024;async function Ui(t){let{state:e,abort:n,retry:r,initSessionId:o,traceWriter:s}=t,i=e.messages.length;if(e.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 c=lf(),a=Oi(e.messages,c);if(a<0)return{compacted:!1,reason:"history-too-short",messagesBefore:i,messagesAfter:i};if(a===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:i,messagesAfter:i};let l=e.messages.slice(0,a),d=df(),u=Di(l,d,cf),p=n.begin(),y;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let k=we(r.authMode,o,of()),S=r.client,h=await Promise.resolve(S.messages.create(u,{headers:k,signal:p.signal}));y=await uf(h)}catch(k){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(k instanceof Error?k.message:String(k)),messagesBefore:i,messagesAfter:i}}finally{n.clear(p)}if(y.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let f=Li(e.messages,a,y),m=Fi(e.messages,a,y);e.messages.splice(0,e.messages.length,...m);let w=e.messages.length;return $r(s,{trigger:"manual",preCompactionMessages:l,summary:y,keptTailCount:i-a,keepLastNConfig:c,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:f}),{compacted:!0,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:f}}function lf(){let t=v.AFK_COMPACT_KEEP_LAST_TURNS;if(t!==void 0&&t.length>0){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return sf}function df(){let t=v.AFK_COMPACT_MODEL;return t!==void 0&&t.length>0?t:af}async function uf(t){let e="";for await(let n of t)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(e+=r.text)}return e}var pf=[{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"}],on=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;traceWriter;state;abort;retry;cwdDependentsFactory;mcpManager;constructor(e){this.initSessionId=e.sessionId??ji(),this.promptStream=e.promptStream,this.maxTokens=e.maxTokens,this.tools=e.tools,this.systemPrefix=e.systemPrefix,this.thinking=e.thinking,e.effort!==void 0&&(this.effort=e.effort),e.baseUrl!==void 0&&(this.baseUrl=e.baseUrl),this.traceWriter=e.traceWriter,this.cwdDependentsFactory=e.cwdDependentsFactory,this.mcpManager=e.mcpManager,this.retry=new rn({client:e.client,authMode:e.authMode,initSessionId:this.initSessionId,...e.tokenRefresher?{tokenRefresher:e.tokenRefresher}:{},autoResumeOnUsageLimit:e.autoResumeOnUsageLimit??!0}),this.state=xi({model:e.model,permissionMode:e.permissionMode??"default",userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,...e.initialMessages?{initialMessages:e.initialMessages}:{},...e.autoCompactThreshold!==void 0?{autoCompactThreshold:e.autoCompactThreshold}:{}}),this.abort=new nn}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}Ti(this.state.messages),this.state.messages.push({role:"user",content:s.content});let c=this.composeSystem(),a=we(this.retry.authMode,this.initSessionId,ji(),this.effort!==void 0),l={client:this.retry.client,messages:this.state.messages,system:c,tools:this.tools,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:a,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(l,()=>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=gt(this.state.currentModel);if(d!==null&&u>0){let p=ht(d);hs(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 e=this.systemPrefix,n=this.state.userSystem,r=[];e&&e.length>0&&r.push(...e),n&&n.length>0&&r.push({type:"text",text:n});let o=Qr(this.state.currentPermissionMode);return o!==null&&r.push(o),r.length===0?null:Tt({baseUrl:this.baseUrl})?Vr(r,xt()):r}async interrupt(){this.abort.requestAbort("interrupted")}async setModel(e){e!==void 0&&e.length>0&&(this.state.currentModel=e)}async setPermissionMode(e){this.state.currentPermissionMode=e}setCwd(e){if(this.state.toolDispatcher.setResolveBase?.(e),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(e);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){try{return ze().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return pf.map(e=>({...e}))}async supportedAgents(){return[]}async getContextUsage(){let e=this.state.lastUsage,n=gt(this.state.currentModel),r;if(e&&n>0){let o=ht(e);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(e=>({name:e.serverName,status:e.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(e,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return Ui({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 yr=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1570
+ `+n},{role:"assistant",content:Mi},...t.slice(e)]}function Li(t,e,n){let r=sf(t.slice(0,e)),o=Ci.length+2+n.length+Mi.length,s=Math.max(0,r-o);return Math.round(s/4)}function of(t){let e=[];for(let n of t){let r=n.role==="user"?"User":"Assistant";if(e.push(r+":"),typeof n.content=="string")e.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)e.push(o.text);else if(s==="tool_use"){let i=o.name??"unknown",c=Ni(o.input);e.push(`[tool call: ${i} ${c}]`)}else if(s==="tool_result"){let i=o.content;e.push(`[tool result: ${$i(i)}]`)}else s==="image"?e.push("[image]"):s==="document"&&e.push("[document]")}e.push("")}return e.join(`
1571
+ `).trim()}function Ni(t){try{let e=JSON.stringify(t);return e.length>240?e.slice(0,237)+"...":e}catch{return"{}"}}function $i(t){if(typeof t=="string")return t.length>320?t.slice(0,317)+"...":t;if(Array.isArray(t)){let e=[];for(let r of t)r.type==="text"&&"text"in r&&e.push(r.text);let n=e.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}function sf(t){let e=0;for(let n of t)if(typeof n.content=="string")e+=n.content.length;else if(Array.isArray(n.content))for(let r of n.content){let o=r.type;o==="text"&&"text"in r?e+=r.text.length:o==="tool_use"?e+=Ni(r.input).length:o==="tool_result"&&(e+=$i(r.content).length)}return e}var cf=2,lf="claude-haiku-4-5-20251001",df=1024;async function Ui(t){let{state:e,abort:n,retry:r,initSessionId:o,traceWriter:s}=t,i=e.messages.length;if(e.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 c=uf(),a=Oi(e.messages,c);if(a<0)return{compacted:!1,reason:"history-too-short",messagesBefore:i,messagesAfter:i};if(a===0)return{compacted:!1,reason:"nothing-to-summarize",messagesBefore:i,messagesAfter:i};let l=e.messages.slice(0,a),d=pf(),u=Di(l,d,df),p=n.begin(),y;try{if(p.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let k=we(r.authMode,o,af()),S=r.client,h=await Promise.resolve(S.messages.create(u,{headers:k,signal:p.signal}));y=await ff(h)}catch(k){return p.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(k instanceof Error?k.message:String(k)),messagesBefore:i,messagesAfter:i}}finally{n.clear(p)}if(y.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let f=Li(e.messages,a,y),m=Fi(e.messages,a,y);e.messages.splice(0,e.messages.length,...m);let w=e.messages.length;return $r(s,{trigger:"manual",preCompactionMessages:l,summary:y,keptTailCount:i-a,keepLastNConfig:c,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:f}),{compacted:!0,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:f}}function uf(){let t=v.AFK_COMPACT_KEEP_LAST_TURNS;if(t!==void 0&&t.length>0){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return cf}function pf(){let t=v.AFK_COMPACT_MODEL;return t!==void 0&&t.length>0?t:lf}async function ff(t){let e="";for await(let n of t)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(e+=r.text)}return e}var mf=[{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"}],on=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;traceWriter;state;abort;retry;cwdDependentsFactory;mcpManager;constructor(e){this.initSessionId=e.sessionId??ji(),this.promptStream=e.promptStream,this.maxTokens=e.maxTokens,this.tools=e.tools,this.systemPrefix=e.systemPrefix,this.thinking=e.thinking,e.effort!==void 0&&(this.effort=e.effort),e.baseUrl!==void 0&&(this.baseUrl=e.baseUrl),this.traceWriter=e.traceWriter,this.cwdDependentsFactory=e.cwdDependentsFactory,this.mcpManager=e.mcpManager,this.retry=new rn({client:e.client,authMode:e.authMode,initSessionId:this.initSessionId,...e.tokenRefresher?{tokenRefresher:e.tokenRefresher}:{},autoResumeOnUsageLimit:e.autoResumeOnUsageLimit??!0}),this.state=xi({model:e.model,permissionMode:e.permissionMode??"default",userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,...e.initialMessages?{initialMessages:e.initialMessages}:{},...e.autoCompactThreshold!==void 0?{autoCompactThreshold:e.autoCompactThreshold}:{}}),this.abort=new nn}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}Ti(this.state.messages),this.state.messages.push({role:"user",content:s.content});let c=this.composeSystem(),a=we(this.retry.authMode,this.initSessionId,ji(),this.effort!==void 0),l={client:this.retry.client,messages:this.state.messages,system:c,tools:this.tools,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:a,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(l,()=>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=gt(this.state.currentModel);if(d!==null&&u>0){let p=ht(d);hs(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 e=this.systemPrefix,n=this.state.userSystem,r=[];e&&e.length>0&&r.push(...e),n&&n.length>0&&r.push({type:"text",text:n});let o=Qr(this.state.currentPermissionMode);return o!==null&&r.push(o),r.length===0?null:Tt({baseUrl:this.baseUrl})?Vr(r,xt()):r}async interrupt(){this.abort.requestAbort("interrupted")}async setModel(e){e!==void 0&&e.length>0&&(this.state.currentModel=e)}async setPermissionMode(e){this.state.currentPermissionMode=e}setCwd(e){if(this.state.toolDispatcher.setResolveBase?.(e),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(e);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){try{return ze().map(n=>{let r={name:n.name,description:n.description};return n.argumentHint&&(r.argumentHint=n.argumentHint),r})}catch{return[]}}async supportedModels(){return mf.map(e=>({...e}))}async supportedAgents(){return[]}async getContextUsage(){let e=this.state.lastUsage,n=gt(this.state.currentModel),r;if(e&&n>0){let o=ht(e);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(e=>({name:e.serverName,status:e.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(e,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return Ui({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 yr=`You have access to tools for working with the filesystem and running commands. Follow these conventions:
1572
1572
 
1573
1573
  - Use read_file before editing to verify the exact content you want to change.
1574
1574
  - Prefer edit_file over write_file for modifying existing files \u2014 write_file is for new files or complete rewrites.
@@ -1607,18 +1607,18 @@ Do NOT store: ephemeral task details, information derivable from code or git, sp
1607
1607
  - Use action "supersede" (not set + remove) when updating an existing fact \u2014 preserves history.
1608
1608
 
1609
1609
  ## Procedures (procedure_write)
1610
- Save reusable multi-step workflows the user teaches you or that you discover work well. Name in kebab-case. Searchable via memory_search.`;import{mkdirSync as ff,appendFileSync as mf,existsSync as gf}from"fs";import{resolve as hf}from"path";import{dirname as yf}from"path";var bf=`# AFK PROMPT DUMP \u2014 May contain secrets. Inspect before sharing.
1611
- `,wf=/key|token|secret|password|credential|auth/i,kf=[[/sk-ant-[A-Za-z0-9_\-]{8,200}/g,t=>`<REDACTED sk-ant length=${t[0].length}>`],[/sk-(?!ant-)[A-Za-z0-9_\-]{20,200}/g,t=>`<REDACTED sk- length=${t[0].length}>`],[/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,t=>`<REDACTED Bearer length=${t[0].length}>`],[/AKIA[A-Z0-9]{16}/g,t=>`<REDACTED AKIA length=${t[0].length}>`],[/xox[baprs]-[A-Za-z0-9\-]{10,200}/g,t=>`<REDACTED xox token length=${t[0].length}>`],[/\d{8,12}:[A-Za-z0-9_\-]{35}/g,t=>`<REDACTED Telegram token length=${t[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,t=>`${t[1]}=<REDACTED length=${t[2].length}>`],[/([A-Z_]{3,}(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*)=([^\s]{16,})/g,t=>`${t[1]}=<REDACTED length=${t[2].length}>`]];function Sf(t){let e=t;for(let[n,r]of kf)e=e.replace(n,(...o)=>{let s=o.slice(0,o.length-2);return r(s)});return e}function wr(t){return typeof t=="string"?Sf(t):Array.isArray(t)?t.map(wr):t}function vf(t){if(t===null||typeof t!="object")return t;let e=t,n={...e},r=e.env;if(r&&typeof r=="object"){let o={};for(let[s,i]of Object.entries(r))wf.test(s)&&typeof i=="string"?o[s]=`<REDACTED length=${i.length}>`:o[s]=i;n.env=o}return"system"in e&&(n.system=wr(e.system)),"systemPrompt"in e&&(n.systemPrompt=wr(e.systemPrompt)),n}function Ef(t){if(t==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof t=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(t))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof t=="object"){let e=t;if(e.type==="preset"&&e.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof e.append=="string"&&(n.append={length:e.append.length}),e.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 Hi(t){let e=v.AFK_DUMP_PROMPT;if(!e||e===""||e==="0"||e.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
1612
- `);let n=t.options,r=typeof n=="object"&&n!==null?n.systemPrompt:void 0,o=Ef(r),s={timestamp:new Date().toISOString(),prompt:t.prompt,options:vf(t.options),provenance:t.provenance,resolution:o};if(e==="1"||e.toLowerCase()==="true"||e.toLowerCase()==="stderr"){let a=JSON.stringify(s,null,2)+`
1613
- `;process.stderr.write(a);return}let i=hf(e),c=yf(i);try{ff(c,{recursive:!0});let l=(!gf(i)?bf:"")+JSON.stringify(s)+`
1614
- `;mf(i,l)}catch(a){let l=`[prompt-dump] Failed to write to ${i}: ${String(a)}
1615
- `;process.stderr.write(l)}}var Sr="anthropic-direct",Af="claude-sonnet-4-5-20250929",Rf=t=>/opus-4-(7|[89])/.test(t),Wi=null;var fe=class{name=Sr;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;subagentExecutor;composeExecutor;surface;mcpManager;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_currentCwd;_mcpToolsCache=null;_mcpHandlersCache=null;constructor(e={}){let n=[...se];if(e.subagentExecutor&&n.push(Ee),e.skillExecutor&&n.push(_e),e.composeExecutor&&n.push(Te),n.push(...xe),n.push(ue),this.memoryStore=e.memoryStore??new pe,this.externalTools=e.tools,this.skillExecutor=e.skillExecutor,this.schemas=n,this.hookRegistry=e.hookRegistry,this.permissions=e.permissions,this.subagentExecutor=e.subagentExecutor,this.composeExecutor=e.composeExecutor,this.surface=e.surface??"cli",this.mcpManager=e.mcpManager,e.mcpManager){let r=e.mcpManager.onToolsRefreshed;e.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}e.clientFactory&&(this.providerFactory=e.clientFactory)}buildDispatcher(e,n){let r=qe(e,n?.cwd),o=lt(this.memoryStore,void 0,this.surface);for(let[i,c]of o)r.set(i,c);if(n?.runtimeStateSource&&r.set("get_runtime_state",We(n.runtimeStateSource)),this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[i,c]of this._mcpHandlersCache)r.set(i,c)}let s=this._mcpToolsCache??[];return new ie({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(e){if(!this._sharedReadRoots){let n=e?[e]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),e&&!this._initialResolveBase&&(this._initialResolveBase=e),e&&!this._currentCwd&&(this._currentCwd=e)}}addReadRoot(e,n="slash",r){this.ensureSharedRoots();let o=kr.resolve(e);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(e,n="slash",r){this.ensureSharedRoots();let o=kr.resolve(e);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(e,n="slash",r){if(!this._sharedReadRoots)return;let o=kr.resolve(e);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(e){try{let n=Be();Tf(xf(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId??null,action:e.action,path:e.path,source:e.source});_f(n,r+`
1616
- `)}catch{}}query(e){let n=e.config,r=typeof n.baseUrl=="string"&&n.baseUrl.length>0,o=r?n.apiKey&&n.apiKey.length>0?n.apiKey:v.AFK_LOCAL_API_KEY||"local":n.apiKey&&n.apiKey.length>0?n.apiKey:v.ANTHROPIC_API_KEY||v.CLAUDE_CODE_OAUTH_TOKEN||"";if(!o||o.length===0)throw new Error(`${Sr} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let s=Hr(o),i=vn(o,s,n.baseUrl),c=this.providerFactory??Wi,a=c?c(i):new Bi(i),l=r?null:Br(s),d=Pf(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?wt(n.model)??n.model:Af,p=Cf(n,u),y=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 f,m=dt({surface:this.surface,cwd:n.cwd??process.cwd(),modelName:u,providerName:Sr,permissionMode:y,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>f instanceof ie?f.toolDefs.map(R=>R.name):[],getMcpTools:()=>this.mcpManager?.getMcpTools()??[],getSubagents:()=>this.subagentExecutor?this.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});f=this.externalTools?ut(this.externalTools,m):this.buildDispatcher(y,{cwd:n.cwd,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,traceWriter:n.traceWriter,runtimeStateSource:m});let w=f instanceof ie?[...f.toolDefs]:[...se,ue],k=this.skillExecutor?_i():"",S=n.cwd||process.cwd(),h=[yr,br];h.push(Ft({cwd:S,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{}})),k.length>0&&h.push(k),d&&h.push(d);let g=h.join(`
1617
-
1618
- `),b=[yr,br];k.length>0&&b.push(k),d&&b.push(d),Hi({prompt:e.prompt,options:{model:u,maxTokens:p,system:g},provenance:{systemPrompt:{source:n.systemPromptSource??"none",shape:typeof n.systemPrompt=="string"?"string":Array.isArray(n.systemPrompt)?"string[]":n.systemPrompt!=null?"preset":"undefined",...typeof n.systemPrompt=="string"?{length:n.systemPrompt.length}:{}},...n.apiKey?{apiKey:{source:"config"}}:{}}});let E;if(s==="oauth"&&!r){let R=this.providerFactory??Wi;E=async()=>{let _=await En();if(!_)return null;let x=vn(_,"oauth",n.baseUrl);return R?R(x):new Bi(x)}}let C=n.sessionId??n.resume,F=Mf(n.resumeHistory),T=this.externalTools?void 0:R=>{let _=this._currentCwd;if(this._sharedReadRoots&&_!==void 0&&_!==R){let L=this._sharedReadRoots.indexOf(_);L!==-1?this._sharedReadRoots[L]=R:this._sharedReadRoots.includes(R)||this._sharedReadRoots.push(R)}if(this._sharedWriteRoots&&_!==void 0&&_!==R){let L=this._sharedWriteRoots.indexOf(_);L!==-1?this._sharedWriteRoots[L]=R:this._sharedWriteRoots.includes(R)||this._sharedWriteRoots.push(R)}this._currentCwd=R;let P=[b[0],b[1],Ft({cwd:R,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{}}),...b.slice(2)].join(`
1619
-
1620
- `),I=this.buildDispatcher(y,{cwd:R,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,traceWriter:n.traceWriter,runtimeStateSource:m});return{userSystem:P,dispatcher:I}},D=Df(n.effort,u);return new on({client:a,authMode:r?"api-key":s,promptStream:e.prompt,toolDispatcher:f,...C!==void 0?{sessionId:C}:{},...F!==void 0?{initialMessages:F}:{},model:u,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:w,userSystem:g,systemPrefix:l,tokenRefresher:E,...n.thinking!==void 0?{thinking:Of(n.thinking,p,u)}:{},...D!==void 0?{effort:D}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...T!==void 0?{cwdDependentsFactory:T}:{},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...Ki(n.autoCompact)!==void 0?{autoCompactThreshold:Ki(n.autoCompact)}:{}})}};function Pf(t){if(t===void 0)return null;if(typeof t=="string")return t.length>0?t:null;if(typeof t=="object"&&t!==null&&"append"in t){let e=t.append;return e&&e.length>0?e:null}return null}var If=.9;function Ki(t){if(t===void 0||t===!1)return;if(t===!0)return If;let e=t.threshold;if(!(typeof e!="number"||!Number.isFinite(e)||e<=0||e>=1))return e}function Cf(t,e){let n=t.maxOutputTokens;return typeof n=="number"&&Number.isFinite(n)&&n>0?Math.floor(n):ss(e)}function Mf(t){if(!t||t.length===0)return;let e=[];for(let n of t)n.user.length>0&&e.push({role:"user",content:n.user}),n.assistant.length>0&&e.push({role:"assistant",content:n.assistant});return e.length>0?e:void 0}function Of(t,e,n){switch(t.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&Rf(n))return{type:"adaptive",display:"summarized"};let r=t.budgetTokens!==void 0&&Number.isFinite(t.budgetTokens)?Math.min(t.budgetTokens,e-1):e-1;return{type:"enabled",budget_tokens:Math.max(r,1024),display:"summarized"}}}}function Df(t,e){if(t!==void 0)return t;let n=e.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[67]/.test(n))return"max"}var Ff=new fe;var Lf=new Set([...Object.keys(en),"auto"]);function Nf(t){if(!t)return;let e=t.trim().toLowerCase();if(e){if(e==="anthropic"||e==="anthropic-direct")return"anthropic-direct";if(e==="openai"||e==="openai-compatible"||e==="openai-codex")return"openai-compatible"}}function le(t,e){let n=e?.explicit??v.AFK_PROVIDER,r=e?.openaiBaseUrl??v.AFK_OPENAI_BASE_URL,o=Nf(n);if(o)return o;let s=(t??"").trim().toLowerCase();return s&&(Lf.has(s)||s.startsWith("claude-")||s.startsWith("claude_")||s.startsWith("local-")||s.startsWith("local_"))?"anthropic-direct":s&&(s.startsWith("gpt-")||s.startsWith("gpt_")||s.startsWith("o1")||s.startsWith("o3")||s.startsWith("o4")||s.startsWith("codex-")||s.startsWith("codex_")||s==="codex"||s.startsWith("deepseek-")||s.startsWith("deepseek_")||s.startsWith("mistral-")||s.startsWith("mistral_")||s.startsWith("mixtral-")||s.startsWith("mixtral_")||s.startsWith("llama-")||s.startsWith("llama_")||s.startsWith("qwen-")||s.startsWith("qwen_")||s.includes("/"))||r&&r.trim()?"openai-compatible":"anthropic-direct"}function sn(t,e){switch(le(t,e)){case"openai-compatible":case"openai-codex":return new ae;default:return new fe}}async function an(t,e,n){if(!t)return;if(n.kind==="blocked"){await $e(t,{hookEvent:e,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await $e(t,{hookEvent:e,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function Gi(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await an(n.traceWriter,"SessionStart",{kind:"decision",decision:r})}catch(r){throw r instanceof q&&await an(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function qi(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await an(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof q&&await an(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof q||r instanceof ne){M(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}M(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var cn=class{pendingResolve=null;bufferedMessage=null;getSessionId;constructor(e){this.getSessionId=e}pushUserMessage(e){if(this.pendingResolve){let n=this.pendingResolve;this.pendingResolve=null;let r=this.getSessionId();n({content:e,...r!==void 0?{sessionId:r}:{}});return}this.bufferedMessage=e}createIterable(){let e=this;return{[Symbol.asyncIterator](){return{next(){if(e.bufferedMessage!==null){let n=e.bufferedMessage;e.bufferedMessage=null;let r=e.getSessionId();return Promise.resolve({value:{content:n,...r!==void 0?{sessionId:r}:{}},done:!1})}return new Promise(n=>{e.pendingResolve=r=>n({value:r,done:!1})})},return(){return Promise.resolve({value:void 0,done:!0})}}}}}};function zi(t,e,n){t&&(t.aborted?e.abort(t.reason):t.addEventListener("abort",()=>{e.signal.aborted||e.abort(t.reason)},{once:!0})),e.signal.addEventListener("abort",n,{once:!0})}function Ji(t,e){let n=t.permissionMode??"default",r=t.persistSession??!0,o={sessionId:t.sessionId,configuredSessionId:t.sessionId,resume:t.resume,resumeSessionAt:t.resumeSessionAt,continue:t.continue,forkSession:t.forkSession,persistSession:r},s={sessionId:t.sessionId,model:e,permissionMode:n};return{sessionIdentity:o,metadata:s}}var ln=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(e,n){this.sessionIdentity=e,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(e){e&&(this.sessionIdentity={...this.sessionIdentity,sessionId:e},this.sessionMetadata={...this.sessionMetadata,sessionId:e})}setSessionMetadata(e){this.sessionMetadata=e(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(e){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(e))}isInitializationSettled(){return this.initializationSettled}};function Vi(t){try{let e=JSON.parse(t);if(!Array.isArray(e))return null;let n=e.length;if(n===0)return"no results";let r=0,o=0;for(let c of e)if(c&&typeof c=="object"){let a=c.type;a==="fact"?r++:a==="procedure"&&o++}let s=`${n} result${n===1?"":"s"}`;if(r+o!==n)return s;let i=[];return r>0&&i.push(`${r} fact${r===1?"":"s"}`),o>0&&i.push(`${o} procedure${o===1?"":"s"}`),i.length===0?s:`${s} (${i.join(", ")})`}catch{return null}}function Yi(t){try{let e=JSON.parse(t);if(!e||typeof e!="object")return null;let n=e;if(n.target==="hot"&&n.saved===!0)return"hot memory saved";if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function Xi(t){try{let e=JSON.parse(t);if(!e||typeof e!="object")return null;let n=e;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}function vr(t){let e=t.trim();if(e.length===0)return null;let n=e[0];if(n!=="{"&&n!=="[")return null;let r=e[e.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(e)}catch{return null}return Array.isArray(o)?Qi($f(o)):o!==null&&typeof o=="object"?Qi(Uf(o)):null}function $f(t){return t.length===0?"[empty array]":t.length===1?"[1 item]":`[${t.length} items]`}function Uf(t){let e=Object.keys(t);if(e.length===0)return"{empty object}";let n=e.slice(0,4),r=e.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function Qi(t){return t.length<=80?t:t.slice(0,79)+"\u2026"}var jf=new Map([["memory_search",Vi],["memory_update",Yi],["procedure_write",Xi],["bash",vr],["Bash",vr]]);function Hf(t){return t.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\x1b[@-_]/g,"").replace(/[\x00-\x1f\x7f]/g," ").trim()}function Zi(t,e){if(!t)return null;let n=jf.get(t);if(!n)return null;try{let r=n(e);if(r===null)return null;let o=Hf(r);return o.length>0?o:null}catch{return null}}function Bf(t){let e=/Output too large \((\d+(?:\.\d+)?)\s*(B|KB|MB|GB)\)\.\s*Full output saved to:\s*(\/[^\n]+)/,n=t.match(e);if(!n||!n[1]||!n[2]||!n[3])return null;let r=n[1],o=n[2],s=n[3],i=parseFloat(r),c=i;o==="KB"?c=i*1024:o==="MB"?c=i*1024*1024:o==="GB"&&(c=i*1024*1024*1024);let a=r;return i%1===0&&(a=String(Math.floor(i))),a+=o,{sizeLabel:a,sizeBytes:Math.round(c),absolutePath:s.trim()}}function Wf(t){if(t<1024)return`${t}B`;let e=t/1024;if(e<1024)return e%1===0?`${Math.floor(e)}KB`:`${e.toFixed(1)}KB`;let n=e/1024;if(n<1024)return n%1===0?`${Math.floor(n)}MB`:`${n.toFixed(1)}MB`;let r=n/1024;return r%1===0?`${Math.floor(r)}GB`:`${r.toFixed(1)}GB`}function Kf(t){let e=Buffer.byteLength(t,"utf8"),n=Wf(e),r=t.split(`
1621
- `);if(r.length<=1&&t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};if(r.length<=1)return t.length<=80?{content:t,truncated:!1,sizeBytes:e,sizeLabel:n}:{content:t.substring(0,80)+"\u2026",truncated:!0,sizeBytes:e,sizeLabel:n};if(t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};let o=r[0]??"",s=o;return o.length>80&&(s=o.substring(0,80)+"\u2026"),{content:s+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:e,sizeLabel:n}}function Gf(t,e){let n={...t.raw??{}};return t.inputTokens!==void 0&&(n.input_tokens=t.inputTokens),t.outputTokens!==void 0&&(n.output_tokens=t.outputTokens),t.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=t.cachedInputTokens),t.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=t.cacheCreationTokens),t.totalTokens!==void 0&&(n.total_tokens=t.totalTokens),{sessionId:e,stopReason:t.stopReason??void 0,resultSubtype:t.resultSubtype,durationMs:t.durationMs,durationApiMs:t.durationApiMs,totalCostUsd:t.totalCostUsd,isError:t.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:t.modelUsage,permissionDenials:t.permissionDenials,errors:t.errors}}function qf(t){let e=t.isError===!0?null:Zi(t.toolName,t.content),n=e!==null?{display:e}:{},r=Bf(t.content);if(r)return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${r.sizeLabel}) \u2192 ${r.absolutePath}`,isError:t.isError===!0,persistedPath:r.absolutePath,sizeBytes:r.sizeBytes,sizeLabel:r.sizeLabel,...n}};let{content:o,lineCount:s,sizeBytes:i,sizeLabel:c}=Kf(t.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:o,isError:t.isError===!0,sizeBytes:i,sizeLabel:c,...t.truncated===!0&&{truncated:!0},...s!==void 0&&{lineCount:s},...n}}}function Er(t,e){switch(t.type){case"session.init":{let n=t.info;return e.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization(),null}case"session.status":return e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(t.sessionId&&e.updateSessionIdentity(t.sessionId),t.text){let n={role:"assistant",content:t.text,timestamp:new Date};return e.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}};case"tool.output":return qf(t);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:t.toolUseId,diff:t.diff}};case"progress":return{type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:t.suggestion};case"turn.completed":{let n=Gf(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(e.maxBudgetUsd!==void 0&&e.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(e._runningCostUsd=(e._runningCostUsd??0)+n.totalCostUsd,e._runningCostUsd>=e.maxBudgetUsd)){Lr(e.traceWriter,{kind:"monetary",runningCostUsd:e._runningCostUsd,maxBudgetUsd:e.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new Ne(e._runningCostUsd,e.maxBudgetUsd);return e.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:t.error};case"paused":return{type:"paused",reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:t.hotSwapped,...t.accountId!==void 0?{accountId:t.accountId}:{}};default:return null}}var Fe=class{config;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;lastResponseMetadata=null;initPromise=null;inputStream;abortController;hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;constructor(e){this.config=e,this.abortController=new AbortController,this.hookRegistry=e.hookRegistry,zi(e.abortSignal,this.abortController,()=>{this.onAbort()}),this.initSdkLifecycle()}initSdkLifecycle(){let e=wt(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=Ji(this.config,e);this.stateManager=new ln(n,r),this.inputStream=new cn(()=>this.sessionId);let o=this.config.provider??sn(e);M(`\u{1F7E2} AgentSession: Creating query session via provider=${o.name}`),this.providerQuery=o.query({prompt:this.inputStream.createIterable(),config:this.config}),this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.sessionEndDispatched=!1,this.currentState="idle";let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{for(await Gi(this.hookRegistry,{event:"SessionStart",sessionId:this.sessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});;){let e=await this.providerIterator.next();if(e.done){this.stateManager.resolveInitializationIfNeeded();return}let n=e.value,r=Er(n,this.buildTransformDeps());if(n.type==="session.init"||r&&r.type==="error")return}}catch(e){let n=e instanceof Error?e:new Error(String(e));this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:e=>this.stateManager.setSessionMetadata(e),updateSessionIdentity:e=>this.stateManager.updateSessionIdentity(e),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:e=>{this.lastResponseMetadata=e,typeof e.totalCostUsd=="number"&&Number.isFinite(e.totalCostUsd)&&(this.sessionRunningCostUsd+=e.totalCostUsd);let n=e.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let c=r[s];typeof c=="number"&&Number.isFinite(c)&&(this.sessionRunningTokens[i]+=c)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof e.stopReason=="string"&&(this.lastStopReason=e.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:e=>{this.abortController.signal.aborted||this.abortController.abort(e)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}abort(e){if(e==="closed"||e.startsWith("Budget ")||e.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${e}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(e)}async sendMessage(e,n={}){this.assertCanSend();let r=this.config.timeoutMs??ot,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let c of this.sendMessageStreamInternal(e)){if(c.type==="chunk"&&c.chunk.type==="content"&&(i+=c.chunk.content),c.type==="message"&&c.message.role==="assistant"&&(s=c.message),c.type==="error")throw c.error;if(c.type==="done"){if(s)return{...s,metadata:c.metadata};if(i)return{role:"assistant",content:i,metadata:c.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await st(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async*sendMessageStream(e){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(e)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(e){this.initPromise&&await this.initPromise;let r={role:"user",content:typeof e=="string"?e:this.summarizeContentBlocks(e),timestamp:new Date};this.conversationHistory.push(r),this.inputStream.pushUserMessage(e);let o=this.buildTransformDeps();try{for(;;){let s=await this.providerIterator.next();if(s.done)break;let i=s.value,c=Er(i,o);if(c&&(c.type==="done"&&this.turnCount++,yield c,c.type==="done"||c.type==="error"))break}}finally{this.currentState==="streaming"&&(this.currentState="idle")}}summarizeContentBlocks(e){let n=[],r=0;for(let s of e)s.type==="text"?n.push(s.text):s.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new ne("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,Rt))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(e){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async onAbort(){try{await this.providerQuery.interrupt()}catch{}}async setModel(e){let n=wt(e),r=this.stateManager.getSessionMetadata();await this.providerQuery.setModel(n??r.model??""),n&&this.stateManager.setSessionMetadata(o=>({...o,model:n}))}async setPermissionMode(e){await this.providerQuery.setPermissionMode(e),this.stateManager.setSessionMetadata(n=>({...n,permissionMode:e}))}setCwd(e){this.config={...this.config,cwd:e},this.providerQuery.setCwd?.(e)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(e,n){return this.providerQuery.rewindFiles(e,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let e=this.providerQuery.compact?.bind(this.providerQuery);return e?e():{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}getInputStreamRef(){return{pushUserMessage:e=>this.inputStream.pushUserMessage(e)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,Rt))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(e){this.sessionEndDispatched||(this.sessionEndDispatched=!0,await this.emitClosure(e).catch(()=>{}),await this.sealTraceWriter(e).catch(()=>{}),await qi(this.hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:e},this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}))}async emitClosure(e){let n=this.config.traceWriter;if(!n)return;let r=this.deriveClosureReason(e),o={};this.sessionRunningTokens.input>0&&(o.input=this.sessionRunningTokens.input),this.sessionRunningTokens.output>0&&(o.output=this.sessionRunningTokens.output),this.sessionRunningTokens.cacheRead>0&&(o.cacheRead=this.sessionRunningTokens.cacheRead),this.sessionRunningTokens.cacheCreation>0&&(o.cacheCreation=this.sessionRunningTokens.cacheCreation),await Ur(n,{reason:r,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,finalTokens:o,...this.lastStopReason!==void 0?{lastStopReason:this.lastStopReason}:{}})}deriveClosureReason(e){if(e==="error")return"abort";let n=this.abortController.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;if(r instanceof Ne)return"budget_exceeded";if(r instanceof be)return"timeout";if(typeof r=="string"){if(r.startsWith("Budget "))return"budget_exceeded";if(r.includes("timed out"))return"timeout"}return"abort"}return"model_end_turn"}async sealTraceWriter(e){let n=this.config.traceWriter;if(!n)return;let r=this.deriveSealStatus(e);await n.seal({status:r,finalCostUsd:this.sessionRunningCostUsd,finalTurnCount:this.turnCount,closedAt:new Date().toISOString()})}deriveSealStatus(e){if(e==="error")return"failed";let n=this.abortController.signal;return n.aborted&&n.reason!=="closed"?"cancelled":"succeeded"}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new ne("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")throw new Error("Cannot send message: session is busy");if(this.config.maxTurns&&this.turnCount>=this.config.maxTurns)throw new Error(`Maximum turns (${this.config.maxTurns}) exceeded`)}};function zf(t){let e=new Map,n=t.defaultMode??"ask";if(t.tools)for(let[r,o]of Object.entries(t.tools))typeof o=="string"?e.set(r,{mode:o}):e.set(r,{mode:o.mode,reason:o.reason});if(t.list)for(let r of t.list)e.set(r.tool,{mode:r.mode,reason:r.reason});return{defaultMode:n,byTool:e}}function Jf(t){return t.behavior==="allow"?{behavior:"allow"}:{behavior:"deny",message:t.reason??"Tool denied by permission rules"}}function ea(t){let{defaultMode:e,byTool:n}=zf(t.rules);return async(r,o)=>{let s={toolName:r,input:o},i=n.get(r),c=i?.mode??e,a=i?.reason,l;return c==="ask"&&t.onAsk?l=await t.onAsk(s):c==="deny"?l={behavior:"deny",reason:a}:l={behavior:"allow"},t.onDecision?.(s,l),Jf(l)}}import{Telegraf as Um}from"telegraf";import{promises as kt}from"fs";import{join as ta}from"path";var Ye=class{sessions=new Map;pendingSessions=new Map;sessionData=new Map;options;constructor(e){this.options={dataDir:e.dataDir||"./data/telegram-sessions",defaultModel:e.defaultModel||"sonnet",apiKey:e.apiKey,settingSources:e.settingSources,thinking:e.thinking,effort:e.effort,botCwd:e.botCwd,createSession:e.createSession}}getSessionIfExists(e){return this.sessions.get(e)}async getSession(e){let n=this.sessions.get(e);if(n)return this._touchActivity(e),n;let r=this.pendingSessions.get(e);if(r)try{return await r}finally{this._touchActivity(e)}let o=this.sessionData.get(e)??{chatId:e,model:this.options.defaultModel,createdAt:new Date().toISOString(),lastActivity:new Date().toISOString()},s=(async()=>{let i={model:o.model,apiKey:this.options.apiKey};this.options.settingSources?.length&&(i.settingSources=this.options.settingSources),this.options.thinking!==void 0&&(i.thinking=this.options.thinking),this.options.effort!==void 0&&(i.effort=this.options.effort);let c=o.cwd??this.options.botCwd;c!==void 0&&c.length>0&&(i.cwd=c);let a=await this.options.createSession(Gn(i));return this.sessions.set(e,a),this.sessionData.set(e,o),a})();this.pendingSessions.set(e,s);try{let i=await s;return this._touchActivity(e),i}finally{this.pendingSessions.delete(e)}}_touchActivity(e){let n=this.sessionData.get(e);n&&(n.lastActivity=new Date().toISOString())}async resetSession(e){let n=this.sessions.get(e);n&&(await n.close(),this.sessions.delete(e));let r=this.sessionData.get(e);r&&(r.lastActivity=new Date().toISOString())}async switchModel(e,n){let r=this.sessions.get(e);r&&(await r.close(),this.sessions.delete(e));let o=this.sessionData.get(e);o?(o.model=n,o.lastActivity=new Date().toISOString()):(o={chatId:e,model:n,createdAt:new Date().toISOString(),lastActivity:new Date().toISOString()},this.sessionData.set(e,o))}getModel(e){return this.sessionData.get(e)?.model||this.options.defaultModel}async setCwd(e,n){let r=this.sessions.get(e);r&&(await r.close(),this.sessions.delete(e));let o=this.sessionData.get(e);o?(o.cwd=n,o.lastActivity=new Date().toISOString()):(o={chatId:e,model:this.options.defaultModel,createdAt:new Date().toISOString(),lastActivity:new Date().toISOString(),cwd:n},this.sessionData.set(e,o))}getCwd(e){return this.sessionData.get(e)?.cwd??this.options.botCwd}async loadSessions(){try{await kt.mkdir(this.options.dataDir,{recursive:!0});let e=await kt.readdir(this.options.dataDir);for(let n of e)if(n.endsWith(".json")){let r=ta(this.options.dataDir,n),o=await kt.readFile(r,"utf-8"),s=JSON.parse(o);this.sessionData.set(s.chatId,s)}}catch(e){e.code!=="ENOENT"&&console.error("Failed to load sessions:",e)}}async saveSessions(){try{await kt.mkdir(this.options.dataDir,{recursive:!0});for(let[e,n]of this.sessionData.entries()){let r=ta(this.options.dataDir,`${e}.json`);await kt.writeFile(r,JSON.stringify(n,null,2))}}catch(e){console.error("Failed to save sessions:",e)}}async closeAll(){await this.saveSessions();let e=Array.from(this.sessions.values()).map(n=>n.close().catch(r=>console.error("Error closing session:",r)));await Promise.all(e),this.sessions.clear()}getSessionCount(){return this.sessions.size}getChatCount(){return this.sessionData.size}};function St(t,e=4096){if(t.length<=e)return[t];let n=[],r=t;for(;r.length>0;){if(r.length<=e){n.push(r);break}let o=e,s=r.lastIndexOf(`
1610
+ Save reusable multi-step workflows the user teaches you or that you discover work well. Name in kebab-case. Searchable via memory_search.`;import{mkdirSync as gf,appendFileSync as hf,existsSync as yf}from"fs";import{resolve as bf}from"path";import{dirname as wf}from"path";var kf=`# AFK PROMPT DUMP \u2014 May contain secrets. Inspect before sharing.
1611
+ `,Sf=/key|token|secret|password|credential|auth/i,vf=[[/sk-ant-[A-Za-z0-9_\-]{8,200}/g,t=>`<REDACTED sk-ant length=${t[0].length}>`],[/sk-(?!ant-)[A-Za-z0-9_\-]{20,200}/g,t=>`<REDACTED sk- length=${t[0].length}>`],[/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,t=>`<REDACTED Bearer length=${t[0].length}>`],[/AKIA[A-Z0-9]{16}/g,t=>`<REDACTED AKIA length=${t[0].length}>`],[/xox[baprs]-[A-Za-z0-9\-]{10,200}/g,t=>`<REDACTED xox token length=${t[0].length}>`],[/\d{8,12}:[A-Za-z0-9_\-]{35}/g,t=>`<REDACTED Telegram token length=${t[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,t=>`${t[1]}=<REDACTED length=${t[2].length}>`],[/([A-Z_]{3,}(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*)=([^\s]{16,})/g,t=>`${t[1]}=<REDACTED length=${t[2].length}>`]];function Ef(t){let e=t;for(let[n,r]of vf)e=e.replace(n,(...o)=>{let s=o.slice(0,o.length-2);return r(s)});return e}function wr(t){return typeof t=="string"?Ef(t):Array.isArray(t)?t.map(wr):t}function _f(t){if(t===null||typeof t!="object")return t;let e=t,n={...e},r=e.env;if(r&&typeof r=="object"){let o={};for(let[s,i]of Object.entries(r))Sf.test(s)&&typeof i=="string"?o[s]=`<REDACTED length=${i.length}>`:o[s]=i;n.env=o}return"system"in e&&(n.system=wr(e.system)),"systemPrompt"in e&&(n.systemPrompt=wr(e.systemPrompt)),n}function Tf(t){if(t==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof t=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(t))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof t=="object"){let e=t;if(e.type==="preset"&&e.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof e.append=="string"&&(n.append={length:e.append.length}),e.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 Hi(t){let e=v.AFK_DUMP_PROMPT;if(!e||e===""||e==="0"||e.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
1612
+ `);let n=t.options,r=typeof n=="object"&&n!==null?n.systemPrompt:void 0,o=Tf(r),s={timestamp:new Date().toISOString(),prompt:t.prompt,options:_f(t.options),provenance:t.provenance,resolution:o};if(e==="1"||e.toLowerCase()==="true"||e.toLowerCase()==="stderr"){let a=JSON.stringify(s,null,2)+`
1613
+ `;process.stderr.write(a);return}let i=bf(e),c=wf(i);try{gf(c,{recursive:!0});let l=(!yf(i)?kf:"")+JSON.stringify(s)+`
1614
+ `;hf(i,l)}catch(a){let l=`[prompt-dump] Failed to write to ${i}: ${String(a)}
1615
+ `;process.stderr.write(l)}}var Sr="anthropic-direct",Pf="claude-sonnet-4-5-20250929",If=t=>/opus-4-(7|[89])/.test(t),Wi=null;var fe=class{name=Sr;externalTools;memoryStore;providerFactory;skillExecutor;schemas;hookRegistry;permissions;subagentExecutor;composeExecutor;surface;mcpManager;_sharedReadRoots;_sharedWriteRoots;_initialResolveBase;_currentCwd;_mcpToolsCache=null;_mcpHandlersCache=null;constructor(e={}){let n=[...se];if(e.subagentExecutor&&n.push(Ee),e.skillExecutor&&n.push(_e),e.composeExecutor&&n.push(Te),n.push(...xe),n.push(ue),this.memoryStore=e.memoryStore??new pe,this.externalTools=e.tools,this.skillExecutor=e.skillExecutor,this.schemas=n,this.hookRegistry=e.hookRegistry,this.permissions=e.permissions,this.subagentExecutor=e.subagentExecutor,this.composeExecutor=e.composeExecutor,this.surface=e.surface??"cli",this.mcpManager=e.mcpManager,e.mcpManager){let r=e.mcpManager.onToolsRefreshed;e.mcpManager.onToolsRefreshed=o=>{this._mcpToolsCache=null,this._mcpHandlersCache=null,r?.(o)}}e.clientFactory&&(this.providerFactory=e.clientFactory)}buildDispatcher(e,n){let r=qe(e,n?.cwd),o=lt(this.memoryStore,void 0,this.surface);for(let[i,c]of o)r.set(i,c);if(n?.runtimeStateSource&&r.set("get_runtime_state",We(n.runtimeStateSource)),this.mcpManager){this._mcpToolsCache||(this._mcpToolsCache=this.mcpManager.getMcpTools()),this._mcpHandlersCache||(this._mcpHandlersCache=this.mcpManager.getMcpHandlers());for(let[i,c]of this._mcpHandlersCache)r.set(i,c)}let s=this._mcpToolsCache??[];return new ie({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(e){if(!this._sharedReadRoots){let n=e?[e]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),e&&!this._initialResolveBase&&(this._initialResolveBase=e),e&&!this._currentCwd&&(this._currentCwd=e)}}addReadRoot(e,n="slash",r){this.ensureSharedRoots();let o=kr.resolve(e);this._sharedReadRoots.includes(o)||this._sharedReadRoots.push(o),this.appendProviderAuditLog({action:"grant-read",path:o,source:n,sessionId:r})}addWriteRoot(e,n="slash",r){this.ensureSharedRoots();let o=kr.resolve(e);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(e,n="slash",r){if(!this._sharedReadRoots)return;let o=kr.resolve(e);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(e){try{let n=Be();Af(Rf(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:e.sessionId??null,action:e.action,path:e.path,source:e.source});xf(n,r+`
1616
+ `)}catch{}}query(e){let n=e.config,r=typeof n.baseUrl=="string"&&n.baseUrl.length>0,o=r?n.apiKey&&n.apiKey.length>0?n.apiKey:v.AFK_LOCAL_API_KEY||"local":n.apiKey&&n.apiKey.length>0?n.apiKey:v.ANTHROPIC_API_KEY||v.CLAUDE_CODE_OAUTH_TOKEN||"";if(!o||o.length===0)throw new Error(`${Sr} provider requires config.apiKey (resolved from ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN)`);let s=Hr(o),i=vn(o,s,n.baseUrl),c=this.providerFactory??Wi,a=c?c(i):new Bi(i),l=r?null:Br(s),d=Cf(n.systemPrompt),u=typeof n.model=="string"&&n.model.length>0?wt(n.model)??n.model:Pf,p=Of(n,u),y=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 f,m=dt({surface:this.surface,cwd:n.cwd??process.cwd(),modelName:u,providerName:Sr,permissionMode:y,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>f instanceof ie?f.toolDefs.map(R=>R.name):[],getMcpTools:()=>this.mcpManager?.getMcpTools()??[],getSubagents:()=>this.subagentExecutor?this.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});f=this.externalTools?ut(this.externalTools,m):this.buildDispatcher(y,{cwd:n.cwd,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,traceWriter:n.traceWriter,runtimeStateSource:m});let w=f instanceof ie?[...f.toolDefs]:[...se,ue],k=this.skillExecutor?_i():"",S=n.cwd||process.cwd(),h=[yr,br];h.push(Ft({cwd:S,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{}})),k.length>0&&h.push(k),d&&h.push(d);let g=h.join(`
1617
+
1618
+ `),b=[yr,br];k.length>0&&b.push(k),d&&b.push(d),Hi({prompt:e.prompt,options:{model:u,maxTokens:p,system:g},provenance:{systemPrompt:{source:n.systemPromptSource??"none",shape:typeof n.systemPrompt=="string"?"string":Array.isArray(n.systemPrompt)?"string[]":n.systemPrompt!=null?"preset":"undefined",...typeof n.systemPrompt=="string"?{length:n.systemPrompt.length}:{}},...n.apiKey?{apiKey:{source:"config"}}:{}}});let E;if(s==="oauth"&&!r){let R=this.providerFactory??Wi;E=async()=>{let _=await En();if(!_)return null;let x=vn(_,"oauth",n.baseUrl);return R?R(x):new Bi(x)}}let C=n.sessionId??n.resume,F=Df(n.resumeHistory),T=this.externalTools?void 0:R=>{let _=this._currentCwd;if(this._sharedReadRoots&&_!==void 0&&_!==R){let L=this._sharedReadRoots.indexOf(_);L!==-1?this._sharedReadRoots[L]=R:this._sharedReadRoots.includes(R)||this._sharedReadRoots.push(R)}if(this._sharedWriteRoots&&_!==void 0&&_!==R){let L=this._sharedWriteRoots.indexOf(_);L!==-1?this._sharedWriteRoots[L]=R:this._sharedWriteRoots.includes(R)||this._sharedWriteRoots.push(R)}this._currentCwd=R;let P=[b[0],b[1],Ft({cwd:R,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.surface,...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{}}),...b.slice(2)].join(`
1619
+
1620
+ `),I=this.buildDispatcher(y,{cwd:R,readRoots:this._sharedReadRoots,writeRoots:this._sharedWriteRoots,...n.env!==void 0?{env:n.env}:{},sessionId:n.sessionId,traceWriter:n.traceWriter,runtimeStateSource:m});return{userSystem:P,dispatcher:I}},D=Lf(n.effort,u);return new on({client:a,authMode:r?"api-key":s,promptStream:e.prompt,toolDispatcher:f,...C!==void 0?{sessionId:C}:{},...F!==void 0?{initialMessages:F}:{},model:u,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},maxTokens:p,tools:w,userSystem:g,systemPrefix:l,tokenRefresher:E,...n.thinking!==void 0?{thinking:Ff(n.thinking,p,u)}:{},...D!==void 0?{effort:D}:{},...r?{baseUrl:n.baseUrl}:{},...n.traceWriter?{traceWriter:n.traceWriter}:{},...n.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:n.autoResumeOnUsageLimit}:{},...T!==void 0?{cwdDependentsFactory:T}:{},...this.mcpManager!==void 0?{mcpManager:this.mcpManager}:{},...Ki(n.autoCompact)!==void 0?{autoCompactThreshold:Ki(n.autoCompact)}:{}})}};function Cf(t){if(t===void 0)return null;if(typeof t=="string")return t.length>0?t:null;if(typeof t=="object"&&t!==null&&"append"in t){let e=t.append;return e&&e.length>0?e:null}return null}var Mf=.9;function Ki(t){if(t===void 0||t===!1)return;if(t===!0)return Mf;let e=t.threshold;if(!(typeof e!="number"||!Number.isFinite(e)||e<=0||e>=1))return e}function Of(t,e){let n=t.maxOutputTokens;return typeof n=="number"&&Number.isFinite(n)&&n>0?Math.floor(n):ss(e)}function Df(t){if(!t||t.length===0)return;let e=[];for(let n of t)n.user.length>0&&e.push({role:"user",content:n.user}),n.assistant.length>0&&e.push({role:"assistant",content:n.assistant});return e.length>0?e:void 0}function Ff(t,e,n){switch(t.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&If(n))return{type:"adaptive",display:"summarized"};let r=t.budgetTokens!==void 0&&Number.isFinite(t.budgetTokens)?Math.min(t.budgetTokens,e-1):e-1;return{type:"enabled",budget_tokens:Math.max(r,1024),display:"summarized"}}}}function Lf(t,e){if(t!==void 0)return t;let n=e.toLowerCase();if(/(claude-)?(opus|sonnet)-4-[67]/.test(n))return"max"}var Nf=new fe;var $f=new Set([...Object.keys(en),"auto"]);function Uf(t){if(!t)return;let e=t.trim().toLowerCase();if(e){if(e==="anthropic"||e==="anthropic-direct")return"anthropic-direct";if(e==="openai"||e==="openai-compatible"||e==="openai-codex")return"openai-compatible"}}function ce(t,e){let n=e?.explicit??v.AFK_PROVIDER,r=e?.openaiBaseUrl??v.AFK_OPENAI_BASE_URL,o=Uf(n);if(o)return o;let s=(t??"").trim().toLowerCase();return s&&($f.has(s)||s.startsWith("claude-")||s.startsWith("claude_")||s.startsWith("local-")||s.startsWith("local_"))?"anthropic-direct":s&&(s.startsWith("gpt-")||s.startsWith("gpt_")||s.startsWith("o1")||s.startsWith("o3")||s.startsWith("o4")||s.startsWith("codex-")||s.startsWith("codex_")||s==="codex"||s.startsWith("deepseek-")||s.startsWith("deepseek_")||s.startsWith("mistral-")||s.startsWith("mistral_")||s.startsWith("mixtral-")||s.startsWith("mixtral_")||s.startsWith("llama-")||s.startsWith("llama_")||s.startsWith("qwen-")||s.startsWith("qwen_")||s.includes("/"))||r&&r.trim()?"openai-compatible":"anthropic-direct"}function sn(t,e){switch(ce(t,e)){case"openai-compatible":case"openai-codex":return new ae;default:return new fe}}async function an(t,e,n){if(!t)return;if(n.kind==="blocked"){await $e(t,{hookEvent:e,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await $e(t,{hookEvent:e,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function Gi(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await an(n.traceWriter,"SessionStart",{kind:"decision",decision:r})}catch(r){throw r instanceof q&&await an(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function qi(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await an(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof q&&await an(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof q||r instanceof ne){M(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}M(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var cn=class{pendingResolve=null;bufferedMessage=null;getSessionId;constructor(e){this.getSessionId=e}pushUserMessage(e){if(this.pendingResolve){let n=this.pendingResolve;this.pendingResolve=null;let r=this.getSessionId();n({content:e,...r!==void 0?{sessionId:r}:{}});return}this.bufferedMessage=e}createIterable(){let e=this;return{[Symbol.asyncIterator](){return{next(){if(e.bufferedMessage!==null){let n=e.bufferedMessage;e.bufferedMessage=null;let r=e.getSessionId();return Promise.resolve({value:{content:n,...r!==void 0?{sessionId:r}:{}},done:!1})}return new Promise(n=>{e.pendingResolve=r=>n({value:r,done:!1})})},return(){return Promise.resolve({value:void 0,done:!0})}}}}}};function zi(t,e,n){t&&(t.aborted?e.abort(t.reason):t.addEventListener("abort",()=>{e.signal.aborted||e.abort(t.reason)},{once:!0})),e.signal.addEventListener("abort",n,{once:!0})}function Ji(t,e){let n=t.permissionMode??"default",r=t.persistSession??!0,o={sessionId:t.sessionId,configuredSessionId:t.sessionId,resume:t.resume,resumeSessionAt:t.resumeSessionAt,continue:t.continue,forkSession:t.forkSession,persistSession:r},s={sessionId:t.sessionId,model:e,permissionMode:n};return{sessionIdentity:o,metadata:s}}var ln=class{initializationPromise;resolveInitialization;rejectInitialization;initializationSettled=!1;sessionMetadata;sessionIdentity;constructor(e,n){this.sessionIdentity=e,this.sessionMetadata=n,this.initializationPromise=new Promise((r,o)=>{this.resolveInitialization=r,this.rejectInitialization=o})}waitForInitialization(){return this.initializationPromise}getSessionIdentity(){return{...this.sessionIdentity,sessionId:this.getSessionId()}}getSessionMetadata(){return{...this.sessionMetadata,sessionId:this.getSessionId()}}getSessionId(){return this.sessionMetadata.sessionId??this.sessionIdentity.sessionId}updateSessionIdentity(e){e&&(this.sessionIdentity={...this.sessionIdentity,sessionId:e},this.sessionMetadata={...this.sessionMetadata,sessionId:e})}setSessionMetadata(e){this.sessionMetadata=e(this.sessionMetadata)}resolveInitializationIfNeeded(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}resolveInitializationOnce(){this.initializationSettled||(this.initializationSettled=!0,this.resolveInitialization(this.getSessionMetadata()))}rejectInitializationOnce(e){this.initializationSettled||(this.initializationSettled=!0,this.rejectInitialization(e))}isInitializationSettled(){return this.initializationSettled}};function Vi(t){try{let e=JSON.parse(t);if(!Array.isArray(e))return null;let n=e.length;if(n===0)return"no results";let r=0,o=0;for(let c of e)if(c&&typeof c=="object"){let a=c.type;a==="fact"?r++:a==="procedure"&&o++}let s=`${n} result${n===1?"":"s"}`;if(r+o!==n)return s;let i=[];return r>0&&i.push(`${r} fact${r===1?"":"s"}`),o>0&&i.push(`${o} procedure${o===1?"":"s"}`),i.length===0?s:`${s} (${i.join(", ")})`}catch{return null}}function Yi(t){try{let e=JSON.parse(t);if(!e||typeof e!="object")return null;let n=e;if(n.target==="hot"&&n.saved===!0)return"hot memory saved";if(n.target==="fact"){if(n.action==="remove")return n.removed===!0?"fact removed":"fact not found";if(n.action==="set"&&typeof n.id=="number")return`fact #${n.id} set`;if(n.action==="supersede"&&typeof n.id=="number"&&typeof n.supersedes=="number")return`fact #${n.id} supersedes #${n.supersedes}`}return null}catch{return null}}function Xi(t){try{let e=JSON.parse(t);if(!e||typeof e!="object")return null;let n=e;return typeof n.name=="string"&&n.written===!0?`wrote procedure '${n.name}'`:null}catch{return null}}function vr(t){let e=t.trim();if(e.length===0)return null;let n=e[0];if(n!=="{"&&n!=="[")return null;let r=e[e.length-1];if(n==="{"&&r!=="}"||n==="["&&r!=="]")return null;let o;try{o=JSON.parse(e)}catch{return null}return Array.isArray(o)?Qi(jf(o)):o!==null&&typeof o=="object"?Qi(Hf(o)):null}function jf(t){return t.length===0?"[empty array]":t.length===1?"[1 item]":`[${t.length} items]`}function Hf(t){let e=Object.keys(t);if(e.length===0)return"{empty object}";let n=e.slice(0,4),r=e.length>4?", \u2026":"";return`{${n.join(", ")}${r}}`}function Qi(t){return t.length<=80?t:t.slice(0,79)+"\u2026"}var Bf=new Map([["memory_search",Vi],["memory_update",Yi],["procedure_write",Xi],["bash",vr],["Bash",vr]]);function Wf(t){return t.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\x1b[@-_]/g,"").replace(/[\x00-\x1f\x7f]/g," ").trim()}function Zi(t,e){if(!t)return null;let n=Bf.get(t);if(!n)return null;try{let r=n(e);if(r===null)return null;let o=Wf(r);return o.length>0?o:null}catch{return null}}function Kf(t){let e=/Output too large \((\d+(?:\.\d+)?)\s*(B|KB|MB|GB)\)\.\s*Full output saved to:\s*(\/[^\n]+)/,n=t.match(e);if(!n||!n[1]||!n[2]||!n[3])return null;let r=n[1],o=n[2],s=n[3],i=parseFloat(r),c=i;o==="KB"?c=i*1024:o==="MB"?c=i*1024*1024:o==="GB"&&(c=i*1024*1024*1024);let a=r;return i%1===0&&(a=String(Math.floor(i))),a+=o,{sizeLabel:a,sizeBytes:Math.round(c),absolutePath:s.trim()}}function Gf(t){if(t<1024)return`${t}B`;let e=t/1024;if(e<1024)return e%1===0?`${Math.floor(e)}KB`:`${e.toFixed(1)}KB`;let n=e/1024;if(n<1024)return n%1===0?`${Math.floor(n)}MB`:`${n.toFixed(1)}MB`;let r=n/1024;return r%1===0?`${Math.floor(r)}GB`:`${r.toFixed(1)}GB`}function qf(t){let e=Buffer.byteLength(t,"utf8"),n=Gf(e),r=t.split(`
1621
+ `);if(r.length<=1&&t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};if(r.length<=1)return t.length<=80?{content:t,truncated:!1,sizeBytes:e,sizeLabel:n}:{content:t.substring(0,80)+"\u2026",truncated:!0,sizeBytes:e,sizeLabel:n};if(t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};let o=r[0]??"",s=o;return o.length>80&&(s=o.substring(0,80)+"\u2026"),{content:s+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:e,sizeLabel:n}}function zf(t,e){let n={...t.raw??{}};return t.inputTokens!==void 0&&(n.input_tokens=t.inputTokens),t.outputTokens!==void 0&&(n.output_tokens=t.outputTokens),t.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=t.cachedInputTokens),t.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=t.cacheCreationTokens),t.totalTokens!==void 0&&(n.total_tokens=t.totalTokens),{sessionId:e,stopReason:t.stopReason??void 0,resultSubtype:t.resultSubtype,durationMs:t.durationMs,durationApiMs:t.durationApiMs,totalCostUsd:t.totalCostUsd,isError:t.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:t.modelUsage,permissionDenials:t.permissionDenials,errors:t.errors}}function Jf(t){let e=t.isError===!0?null:Zi(t.toolName,t.content),n=e!==null?{display:e}:{},r=Kf(t.content);if(r)return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${r.sizeLabel}) \u2192 ${r.absolutePath}`,isError:t.isError===!0,persistedPath:r.absolutePath,sizeBytes:r.sizeBytes,sizeLabel:r.sizeLabel,...n}};let{content:o,lineCount:s,sizeBytes:i,sizeLabel:c}=qf(t.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:o,isError:t.isError===!0,sizeBytes:i,sizeLabel:c,...t.truncated===!0&&{truncated:!0},...s!==void 0&&{lineCount:s},...n}}}function Er(t,e){switch(t.type){case"session.init":{let n=t.info;return e.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization(),null}case"session.status":return e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(t.sessionId&&e.updateSessionIdentity(t.sessionId),t.text){let n={role:"assistant",content:t.text,timestamp:new Date};return e.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}};case"tool.output":return Jf(t);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:t.toolUseId,diff:t.diff}};case"progress":return{type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:t.suggestion};case"turn.completed":{let n=zf(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(e.maxBudgetUsd!==void 0&&e.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(e._runningCostUsd=(e._runningCostUsd??0)+n.totalCostUsd,e._runningCostUsd>=e.maxBudgetUsd)){Lr(e.traceWriter,{kind:"monetary",runningCostUsd:e._runningCostUsd,maxBudgetUsd:e.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new Ne(e._runningCostUsd,e.maxBudgetUsd);return e.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:t.error};case"paused":return{type:"paused",reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:t.hotSwapped,...t.accountId!==void 0?{accountId:t.accountId}:{}};default:return null}}var Fe=class{config;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;lastResponseMetadata=null;initPromise=null;inputStream;abortController;hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;constructor(e){this.config=e,this.abortController=new AbortController,this.hookRegistry=e.hookRegistry,zi(e.abortSignal,this.abortController,()=>{this.onAbort()}),this.initSdkLifecycle()}initSdkLifecycle(){let e=wt(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=Ji(this.config,e);this.stateManager=new ln(n,r),this.inputStream=new cn(()=>this.sessionId);let o=this.config.provider??sn(e);M(`\u{1F7E2} AgentSession: Creating query session via provider=${o.name}`),this.providerQuery=o.query({prompt:this.inputStream.createIterable(),config:this.config}),this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.sessionEndDispatched=!1,this.currentState="idle";let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{for(await Gi(this.hookRegistry,{event:"SessionStart",sessionId:this.sessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});;){let e=await this.providerIterator.next();if(e.done){this.stateManager.resolveInitializationIfNeeded();return}let n=e.value,r=Er(n,this.buildTransformDeps());if(n.type==="session.init"||r&&r.type==="error")return}}catch(e){let n=e instanceof Error?e:new Error(String(e));this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:e=>this.stateManager.setSessionMetadata(e),updateSessionIdentity:e=>this.stateManager.updateSessionIdentity(e),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:e=>{this.lastResponseMetadata=e,typeof e.totalCostUsd=="number"&&Number.isFinite(e.totalCostUsd)&&(this.sessionRunningCostUsd+=e.totalCostUsd);let n=e.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let c=r[s];typeof c=="number"&&Number.isFinite(c)&&(this.sessionRunningTokens[i]+=c)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof e.stopReason=="string"&&(this.lastStopReason=e.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:e=>{this.abortController.signal.aborted||this.abortController.abort(e)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}abort(e){if(e==="closed"||e.startsWith("Budget ")||e.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${e}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(e)}async sendMessage(e,n={}){this.assertCanSend();let r=this.config.timeoutMs??ot,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let c of this.sendMessageStreamInternal(e)){if(c.type==="chunk"&&c.chunk.type==="content"&&(i+=c.chunk.content),c.type==="message"&&c.message.role==="assistant"&&(s=c.message),c.type==="error")throw c.error;if(c.type==="done"){if(s)return{...s,metadata:c.metadata};if(i)return{role:"assistant",content:i,metadata:c.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await st(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async*sendMessageStream(e){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(e)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(e){this.initPromise&&await this.initPromise;let r={role:"user",content:typeof e=="string"?e:this.summarizeContentBlocks(e),timestamp:new Date};this.conversationHistory.push(r),this.inputStream.pushUserMessage(e);let o=this.buildTransformDeps();try{for(;;){let s=await this.providerIterator.next();if(s.done)break;let i=s.value,c=Er(i,o);if(c&&(c.type==="done"&&this.turnCount++,yield c,c.type==="done"||c.type==="error"))break}}finally{this.currentState==="streaming"&&(this.currentState="idle")}}summarizeContentBlocks(e){let n=[],r=0;for(let s of e)s.type==="text"?n.push(s.text):s.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new ne("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,Rt))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(e){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async onAbort(){try{await this.providerQuery.interrupt()}catch{}}async setModel(e){let n=wt(e),r=this.stateManager.getSessionMetadata();await this.providerQuery.setModel(n??r.model??""),n&&this.stateManager.setSessionMetadata(o=>({...o,model:n}))}async setPermissionMode(e){await this.providerQuery.setPermissionMode(e),this.stateManager.setSessionMetadata(n=>({...n,permissionMode:e}))}setCwd(e){this.config={...this.config,cwd:e},this.providerQuery.setCwd?.(e)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(e,n){return this.providerQuery.rewindFiles(e,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let e=this.providerQuery.compact?.bind(this.providerQuery);return e?e():{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}getInputStreamRef(){return{pushUserMessage:e=>this.inputStream.pushUserMessage(e)}}getHistory(){return[...this.conversationHistory]}getTurnCount(){return this.turnCount}async close(){if(this.currentState!=="closed"){this.currentState="closed",this.abortController.signal.aborted||this.abortController.abort("closed"),this.stateManager.resolveInitializationIfNeeded();try{await this.providerQuery.close()}catch{}if(await this.providerIterator.return?.(),this.initPromise)try{await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,Rt))])}catch{}await this.dispatchSessionEndOnce("close")}}async dispatchSessionEndOnce(e){this.sessionEndDispatched||(this.sessionEndDispatched=!0,await this.emitClosure(e).catch(()=>{}),await this.sealTraceWriter(e).catch(()=>{}),await qi(this.hookRegistry,{event:"SessionEnd",sessionId:this.sessionId,reason:e},this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}))}async emitClosure(e){let n=this.config.traceWriter;if(!n)return;let r=this.deriveClosureReason(e),o={};this.sessionRunningTokens.input>0&&(o.input=this.sessionRunningTokens.input),this.sessionRunningTokens.output>0&&(o.output=this.sessionRunningTokens.output),this.sessionRunningTokens.cacheRead>0&&(o.cacheRead=this.sessionRunningTokens.cacheRead),this.sessionRunningTokens.cacheCreation>0&&(o.cacheCreation=this.sessionRunningTokens.cacheCreation),await Ur(n,{reason:r,finalTurnCount:this.turnCount,finalCostUsd:this.sessionRunningCostUsd,finalTokens:o,...this.lastStopReason!==void 0?{lastStopReason:this.lastStopReason}:{}})}deriveClosureReason(e){if(e==="error")return"abort";let n=this.abortController.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;if(r instanceof Ne)return"budget_exceeded";if(r instanceof be)return"timeout";if(typeof r=="string"){if(r.startsWith("Budget "))return"budget_exceeded";if(r.includes("timed out"))return"timeout"}return"abort"}return"model_end_turn"}async sealTraceWriter(e){let n=this.config.traceWriter;if(!n)return;let r=this.deriveSealStatus(e);await n.seal({status:r,finalCostUsd:this.sessionRunningCostUsd,finalTurnCount:this.turnCount,closedAt:new Date().toISOString()})}deriveSealStatus(e){if(e==="error")return"failed";let n=this.abortController.signal;return n.aborted&&n.reason!=="closed"?"cancelled":"succeeded"}assertCanSend(){if(this.currentState==="closed")throw new Error("Cannot send message: session is closed");if(this.abortController.signal.aborted)throw new ne("Cannot send message: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")throw new Error("Cannot send message: session is busy");if(this.config.maxTurns&&this.turnCount>=this.config.maxTurns)throw new Error(`Maximum turns (${this.config.maxTurns}) exceeded`)}};function Vf(t){let e=new Map,n=t.defaultMode??"ask";if(t.tools)for(let[r,o]of Object.entries(t.tools))typeof o=="string"?e.set(r,{mode:o}):e.set(r,{mode:o.mode,reason:o.reason});if(t.list)for(let r of t.list)e.set(r.tool,{mode:r.mode,reason:r.reason});return{defaultMode:n,byTool:e}}function Yf(t){return t.behavior==="allow"?{behavior:"allow"}:{behavior:"deny",message:t.reason??"Tool denied by permission rules"}}function ea(t){let{defaultMode:e,byTool:n}=Vf(t.rules);return async(r,o)=>{let s={toolName:r,input:o},i=n.get(r),c=i?.mode??e,a=i?.reason,l;return c==="ask"&&t.onAsk?l=await t.onAsk(s):c==="deny"?l={behavior:"deny",reason:a}:l={behavior:"allow"},t.onDecision?.(s,l),Yf(l)}}import{Telegraf as Hm}from"telegraf";import{promises as kt}from"fs";import{join as ta}from"path";var Ye=class{sessions=new Map;pendingSessions=new Map;sessionData=new Map;options;constructor(e){this.options={dataDir:e.dataDir||"./data/telegram-sessions",defaultModel:e.defaultModel||"sonnet",apiKey:e.apiKey,settingSources:e.settingSources,thinking:e.thinking,effort:e.effort,botCwd:e.botCwd,createSession:e.createSession}}getSessionIfExists(e){return this.sessions.get(e)}async getSession(e){let n=this.sessions.get(e);if(n)return this._touchActivity(e),n;let r=this.pendingSessions.get(e);if(r)try{return await r}finally{this._touchActivity(e)}let o=this.sessionData.get(e)??{chatId:e,model:this.options.defaultModel,createdAt:new Date().toISOString(),lastActivity:new Date().toISOString()},s=(async()=>{let i={model:o.model,apiKey:this.options.apiKey};this.options.settingSources?.length&&(i.settingSources=this.options.settingSources),this.options.thinking!==void 0&&(i.thinking=this.options.thinking),this.options.effort!==void 0&&(i.effort=this.options.effort);let c=o.cwd??this.options.botCwd;c!==void 0&&c.length>0&&(i.cwd=c);let a=await this.options.createSession(Gn(i));return this.sessions.set(e,a),this.sessionData.set(e,o),a})();this.pendingSessions.set(e,s);try{let i=await s;return this._touchActivity(e),i}finally{this.pendingSessions.delete(e)}}_touchActivity(e){let n=this.sessionData.get(e);n&&(n.lastActivity=new Date().toISOString())}async resetSession(e){let n=this.sessions.get(e);n&&(await n.close(),this.sessions.delete(e));let r=this.sessionData.get(e);r&&(r.lastActivity=new Date().toISOString())}async switchModel(e,n){let r=this.sessions.get(e);r&&(await r.close(),this.sessions.delete(e));let o=this.sessionData.get(e);o?(o.model=n,o.lastActivity=new Date().toISOString()):(o={chatId:e,model:n,createdAt:new Date().toISOString(),lastActivity:new Date().toISOString()},this.sessionData.set(e,o))}getModel(e){return this.sessionData.get(e)?.model||this.options.defaultModel}async setCwd(e,n){let r=this.sessions.get(e);r&&(await r.close(),this.sessions.delete(e));let o=this.sessionData.get(e);o?(o.cwd=n,o.lastActivity=new Date().toISOString()):(o={chatId:e,model:this.options.defaultModel,createdAt:new Date().toISOString(),lastActivity:new Date().toISOString(),cwd:n},this.sessionData.set(e,o))}getCwd(e){return this.sessionData.get(e)?.cwd??this.options.botCwd}async loadSessions(){try{await kt.mkdir(this.options.dataDir,{recursive:!0});let e=await kt.readdir(this.options.dataDir);for(let n of e)if(n.endsWith(".json")){let r=ta(this.options.dataDir,n),o=await kt.readFile(r,"utf-8"),s=JSON.parse(o);this.sessionData.set(s.chatId,s)}}catch(e){e.code!=="ENOENT"&&console.error("Failed to load sessions:",e)}}async saveSessions(){try{await kt.mkdir(this.options.dataDir,{recursive:!0});for(let[e,n]of this.sessionData.entries()){let r=ta(this.options.dataDir,`${e}.json`);await kt.writeFile(r,JSON.stringify(n,null,2))}}catch(e){console.error("Failed to save sessions:",e)}}async closeAll(){await this.saveSessions();let e=Array.from(this.sessions.values()).map(n=>n.close().catch(r=>console.error("Error closing session:",r)));await Promise.all(e),this.sessions.clear()}getSessionCount(){return this.sessions.size}getChatCount(){return this.sessionData.size}};function St(t,e=4096){if(t.length<=e)return[t];let n=[],r=t;for(;r.length>0;){if(r.length<=e){n.push(r);break}let o=e,s=r.lastIndexOf(`
1622
1622
  `,e);if(s>e-500&&s>0)o=s+1;else{let i=r.slice(0,e).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let c=i[i.length-1];if(c){let a=r.lastIndexOf(c,e);a>e-200&&a>0&&(o=a+2)}}else{let c=r.lastIndexOf(" ",e);c>e-100&&c>0&&(o=c+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}function dn(t){t=t.replace(/[\x02\x03]/g,"");let e=t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),n=[];e=e.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let c=n.length;if(i.trim()===""){let a=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${a}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${c}`});let r=[];return e=e.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),e=e.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),e=e.replace(/__([^_]+)__/g,"<b>$1</b>"),e=e.replace(/\*([^*]+)\*/g,"<i>$1</i>"),e=e.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),e=e.replace(/~~([^~]+)~~/g,"<s>$1</s>"),e=e.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,"&quot;")+'">'+s+"</a>"),e=e.replace(/^#{1,6}\s+/gm,""),e=e.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),e=e.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),e}function Xe(t){let e=["\\","_","*","[","]","(",")","~","`",">","#","+","-","=","|","{","}",".","!"],n=t;for(let r of e)n=n.replace(new RegExp(`\\${r}`,"g"),`\\${r}`);return n}function U(t){return`\u274C Error: ${t instanceof Error?t.message:t}`}function un(){return"\u26A0\uFE0F An internal error occurred. Please try again."}var na=[{cmd:"/start",desc:"Show welcome and this command list"},{cmd:"/help",desc:"Show this command list"},{cmd:"/clear",desc:"Clear conversation history (SDK /clear)"},{cmd:"/compact",desc:"Compact conversation history (summarize older messages)"},{cmd:"/model [opus|sonnet|haiku]",desc:"Switch Claude model"},{cmd:"/cd [path]",desc:"Show or change the session working directory"}];function ra(t){let e=["\u{1F4CB} Bot commands (aligned with agent-afk CLI):","",...na.map(n=>` ${n.cmd}
1623
1623
  ${n.desc}`)];return t&&t.length>0&&e.push("","\u{1F4CB} Session commands (from SDK, when using settingSources):","",...t.map(n=>` /${n.replace(/^\//,"")}`)),e.push("","Just send a message to chat with Claude."),e.join(`
1624
1624
  `)}function _r(){return`\u{1F44B} Welcome to Agent AFK Bot!
@@ -1635,25 +1635,25 @@ Usage: /cd <path>`:`\u{1F4C2} No cwd override set \u2014 using bot process defau
1635
1635
 
1636
1636
  Usage: /cd <path>`}function sa(t){return`\u{1F4C2} cwd set to: ${t}
1637
1637
 
1638
- Next message starts a fresh session in this directory.`}function xr(t){if(!t)return"\u{1F4E6} Conversation compacted (older messages summarized).";let e=t.tokensSavedEstimate!==void 0&&t.tokensSavedEstimate>0?` (~${Yf(t.tokensSavedEstimate)} input tokens saved)`:"";return`\u{1F4E6} Compacted ${t.before} \u2192 ${t.after} messages${e}.`}function Ar(t){return t==="aborted"?"\u{1F4E6} Compaction cancelled.":t.startsWith("summarization-failed")?`\u26A0\uFE0F Compaction failed: ${t}. History unchanged.`:`\u{1F4E6} Nothing to compact (${t}).`}function Yf(t){return t>=1e3?`${Math.round(t/100)/10}k`:String(t)}async function Rr(t){await t.reply(_r())}async function Pr(t,e){let n=t.chat?.id,r,o=n?e.getSessionIfExists(n):void 0;if(o)try{await Promise.race([o.waitForInitialization(),new Promise((i,c)=>setTimeout(()=>c(new Error("timeout")),2e3))]);let s=o.getSessionMetadata();s.slashCommands?.length&&(r=s.slashCommands)}catch{}await t.reply(ra(r))}import{promises as Xf}from"fs";import{homedir as ia}from"os";import{isAbsolute as Qf,resolve as Ir}from"path";async function Cr(t,e,n,r){let o=t.chat?.id;if(!o){await t.reply(U("Could not identify chat"));return}try{await e.resetSession(o),n.delete(o),await t.reply(vt())}catch(s){r("Clear error:",s),await t.reply(U(s))}}async function aa(t,e,n){let r=t.chat?.id;if(!r){await t.reply(U("Could not identify chat"));return}try{let o=await e.getSession(r);await t.sendChatAction("typing").catch(()=>{});let s=await o.compact();s.compacted?await t.reply(xr({before:s.messagesBefore,after:s.messagesAfter,...s.tokensSavedEstimate!==void 0?{tokensSavedEstimate:s.tokensSavedEstimate}:{}})):await t.reply(Ar(s.reason??"unknown"))}catch(o){n("Compact error:",o),await t.reply(U(o))}}async function Mr(t,e,n){let r=t.chat?.id;if(!r){await t.reply(U("Could not identify chat"));return}let s=t.message.text.split(/\s+/).slice(1);if(s.length===0){let u=e.getModel(r);await t.reply(`Current model: ${u.toUpperCase()}
1638
+ Next message starts a fresh session in this directory.`}function xr(t){if(!t)return"\u{1F4E6} Conversation compacted (older messages summarized).";let e=t.tokensSavedEstimate!==void 0&&t.tokensSavedEstimate>0?` (~${Qf(t.tokensSavedEstimate)} input tokens saved)`:"";return`\u{1F4E6} Compacted ${t.before} \u2192 ${t.after} messages${e}.`}function Ar(t){return t==="aborted"?"\u{1F4E6} Compaction cancelled.":t.startsWith("summarization-failed")?`\u26A0\uFE0F Compaction failed: ${t}. History unchanged.`:`\u{1F4E6} Nothing to compact (${t}).`}function Qf(t){return t>=1e3?`${Math.round(t/100)/10}k`:String(t)}async function Rr(t){await t.reply(_r())}async function Pr(t,e){let n=t.chat?.id,r,o=n?e.getSessionIfExists(n):void 0;if(o)try{await Promise.race([o.waitForInitialization(),new Promise((i,c)=>setTimeout(()=>c(new Error("timeout")),2e3))]);let s=o.getSessionMetadata();s.slashCommands?.length&&(r=s.slashCommands)}catch{}await t.reply(ra(r))}import{promises as Zf}from"fs";import{homedir as ia}from"os";import{isAbsolute as em,resolve as Ir}from"path";async function Cr(t,e,n,r){let o=t.chat?.id;if(!o){await t.reply(U("Could not identify chat"));return}try{await e.resetSession(o),n.delete(o),await t.reply(vt())}catch(s){r("Clear error:",s),await t.reply(U(s))}}async function aa(t,e,n){let r=t.chat?.id;if(!r){await t.reply(U("Could not identify chat"));return}try{let o=await e.getSession(r);await t.sendChatAction("typing").catch(()=>{});let s=await o.compact();s.compacted?await t.reply(xr({before:s.messagesBefore,after:s.messagesAfter,...s.tokensSavedEstimate!==void 0?{tokensSavedEstimate:s.tokensSavedEstimate}:{}})):await t.reply(Ar(s.reason??"unknown"))}catch(o){n("Compact error:",o),await t.reply(U(o))}}async function Mr(t,e,n){let r=t.chat?.id;if(!r){await t.reply(U("Could not identify chat"));return}let s=t.message.text.split(/\s+/).slice(1);if(s.length===0){let u=e.getModel(r);await t.reply(`Current model: ${u.toUpperCase()}
1639
1639
 
1640
- Usage: /model [opus|opus_1m|sonnet|sonnet_1m|haiku] or org/model HF id`);return}let i=s[0];if(!i){await t.reply(U("Please specify a model: opus, opus_1m, sonnet, sonnet_1m, haiku, or an org/model id"));return}let c=["opus","opus_1m","sonnet","sonnet_1m","haiku"],a=i.toLowerCase(),l=c.includes(a),d=le(a)==="openai-compatible";if(!l&&!d){await t.reply(U(`Invalid model: ${i}
1641
- Aliases: ${c.join(", ")}, or org/model HF id`));return}try{await e.switchModel(r,a),await t.reply(Tr(a))}catch(u){n("Model switch error:",u),await t.reply(U(u))}}function Zf(t,e){let n=t.trim();return n==="~"?ia():n.startsWith("~/")?Ir(ia(),n.slice(2)):Qf(n)?Ir(n):Ir(e,n)}async function ca(t,e,n){let r=t.chat?.id;if(!r){await t.reply(U("Could not identify chat"));return}let s=t.message.text.split(/\s+/).slice(1).filter(l=>l.length>0);if(s.length===0){let l=e.getCwd(r);await t.reply(oa(l));return}let i=s[0];if(!i){await t.reply(U("Please specify a directory path"));return}let c=e.getCwd(r)??process.cwd(),a=Zf(i,c);try{if(!(await Xf.stat(a)).isDirectory()){await t.reply(U(`Not a directory: ${a}`));return}}catch(l){let d=l.code;d==="ENOENT"?await t.reply(U(`Directory does not exist: ${a}`)):d==="EACCES"?await t.reply(U(`Permission denied: ${a}`)):(n("cwd stat error:",l),await t.reply(U(l)));return}try{await e.setCwd(r,a),await t.reply(sa(a))}catch(l){n("Cwd switch error:",l),await t.reply(U(l))}}import{execFile as ym,spawn as bm}from"node:child_process";import{promisify as wm}from"node:util";import{execFile as em}from"node:child_process";import{randomBytes as tm}from"node:crypto";import{promises as pn}from"node:fs";import{join as fn}from"node:path";import{promisify as nm}from"node:util";var lA=nm(em);var Pe=class extends Error{cause;code;constructor(e,n,r){super(e),this.name="WorktreeError",this.cause=n,this.code=r}};function rm(t,e=40){return t.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,e).replace(/-+$/g,"")||"task"}function om(){return tm(4).toString("hex").slice(0,4)}function sm(t){let e=n=>String(n).padStart(2,"0");return`${t.getUTCFullYear()}${e(t.getUTCMonth()+1)}${e(t.getUTCDate())}T${e(t.getUTCHours())}${e(t.getUTCMinutes())}${e(t.getUTCSeconds())}`}function la(t,e={}){let n=(e.now??(()=>new Date))(),r=(e.randomSuffix??om)();return`${sm(n)}-${rm(t,32)}-${r}`}function im(t){let e=t;return e.respawnedAt===void 0&&(e.respawnedAt=void 0),e.respawnedAs===void 0&&(e.respawnedAs=void 0),e.prUrl===void 0&&(e.prUrl=void 0),e.prCreatedAt===void 0&&(e.prCreatedAt=void 0),e}async function Qe(t){let e=fn(so(t),"farm.json");try{let n=await pn.readFile(e,"utf8"),r=JSON.parse(n);if(r.schemaVersion!==1&&r.schemaVersion!==2&&r.schemaVersion!==3)throw new Pe(`unsupported farm manifest schema: ${r.schemaVersion} (expected 1, 2, or 3)`,void 0,"unsupported-schema");return im(r)}catch(n){if(n.code==="ENOENT")return null;throw n instanceof Pe?n:new Pe(`failed to load farm manifest ${e}`,n,"invalid")}}async function da(t,e){let n=await Qe(t);if(!n)throw new Pe(`farm not found: ${t}`);return n.human_decision=e,n.decidedAt=new Date().toISOString(),n.schemaVersion=3,await pn.writeFile(fn(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
1640
+ Usage: /model [opus|opus_1m|sonnet|sonnet_1m|haiku] or org/model HF id`);return}let i=s[0];if(!i){await t.reply(U("Please specify a model: opus, opus_1m, sonnet, sonnet_1m, haiku, or an org/model id"));return}let c=["opus","opus_1m","sonnet","sonnet_1m","haiku"],a=i.toLowerCase(),l=c.includes(a),d=ce(a)==="openai-compatible";if(!l&&!d){await t.reply(U(`Invalid model: ${i}
1641
+ Aliases: ${c.join(", ")}, or org/model HF id`));return}try{await e.switchModel(r,a),await t.reply(Tr(a))}catch(u){n("Model switch error:",u),await t.reply(U(u))}}function tm(t,e){let n=t.trim();return n==="~"?ia():n.startsWith("~/")?Ir(ia(),n.slice(2)):em(n)?Ir(n):Ir(e,n)}async function ca(t,e,n){let r=t.chat?.id;if(!r){await t.reply(U("Could not identify chat"));return}let s=t.message.text.split(/\s+/).slice(1).filter(l=>l.length>0);if(s.length===0){let l=e.getCwd(r);await t.reply(oa(l));return}let i=s[0];if(!i){await t.reply(U("Please specify a directory path"));return}let c=e.getCwd(r)??process.cwd(),a=tm(i,c);try{if(!(await Zf.stat(a)).isDirectory()){await t.reply(U(`Not a directory: ${a}`));return}}catch(l){let d=l.code;d==="ENOENT"?await t.reply(U(`Directory does not exist: ${a}`)):d==="EACCES"?await t.reply(U(`Permission denied: ${a}`)):(n("cwd stat error:",l),await t.reply(U(l)));return}try{await e.setCwd(r,a),await t.reply(sa(a))}catch(l){n("Cwd switch error:",l),await t.reply(U(l))}}import{execFile as wm,spawn as km}from"node:child_process";import{promisify as Sm}from"node:util";import{execFile as nm}from"node:child_process";import{randomBytes as rm}from"node:crypto";import{promises as pn}from"node:fs";import{join as fn}from"node:path";import{promisify as om}from"node:util";var uA=om(nm);var Pe=class extends Error{cause;code;constructor(e,n,r){super(e),this.name="WorktreeError",this.cause=n,this.code=r}};function sm(t,e=40){return t.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,e).replace(/-+$/g,"")||"task"}function im(){return rm(4).toString("hex").slice(0,4)}function am(t){let e=n=>String(n).padStart(2,"0");return`${t.getUTCFullYear()}${e(t.getUTCMonth()+1)}${e(t.getUTCDate())}T${e(t.getUTCHours())}${e(t.getUTCMinutes())}${e(t.getUTCSeconds())}`}function la(t,e={}){let n=(e.now??(()=>new Date))(),r=(e.randomSuffix??im)();return`${am(n)}-${sm(t,32)}-${r}`}function cm(t){let e=t;return e.respawnedAt===void 0&&(e.respawnedAt=void 0),e.respawnedAs===void 0&&(e.respawnedAs=void 0),e.prUrl===void 0&&(e.prUrl=void 0),e.prCreatedAt===void 0&&(e.prCreatedAt=void 0),e}async function Qe(t){let e=fn(so(t),"farm.json");try{let n=await pn.readFile(e,"utf8"),r=JSON.parse(n);if(r.schemaVersion!==1&&r.schemaVersion!==2&&r.schemaVersion!==3)throw new Pe(`unsupported farm manifest schema: ${r.schemaVersion} (expected 1, 2, or 3)`,void 0,"unsupported-schema");return cm(r)}catch(n){if(n.code==="ENOENT")return null;throw n instanceof Pe?n:new Pe(`failed to load farm manifest ${e}`,n,"invalid")}}async function da(t,e){let n=await Qe(t);if(!n)throw new Pe(`farm not found: ${t}`);return n.human_decision=e,n.decidedAt=new Date().toISOString(),n.schemaVersion=3,await pn.writeFile(fn(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
1642
1642
  `,"utf8"),n}async function ua(t,e){let n=await Qe(t);if(!n)throw new Pe(`farm not found: ${t}`);return n.respawnedAt=new Date().toISOString(),n.respawnedAs=e,n.schemaVersion=3,await pn.writeFile(fn(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
1643
1643
  `,"utf8"),n}async function pa(t,e){let n=await Qe(t);if(!n)throw new Pe(`farm not found: ${t}`);return n.prUrl=e,n.prCreatedAt=new Date().toISOString(),n.schemaVersion=3,await pn.writeFile(fn(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
1644
- `,"utf8"),n}import{execFile as am}from"node:child_process";import{promisify as cm}from"node:util";var lm=cm(am),dm=2e4,_t=class extends Error{kind;exitCode;stderr;constructor(e,n,r,o){super(e),this.name="GhError",this.kind=n,this.exitCode=r,this.stderr=o}},mn=null,Et=null;function um(t,e,n){return n===!0?"timeout":e==="ENOENT"?"not-found":/already exists/i.test(t)?"already-exists":/authentication|please log in|HTTP 40[13]|bad credentials|token|scope/i.test(t)?"unauthed":/ETIMEDOUT|ECONNRESET|ECONNREFUSED/i.test(t+(e??""))?"network":"unknown"}function fa(t,e){return lm(t,e,{timeout:dm,killSignal:"SIGTERM"}).then(n=>({stdout:n.stdout,stderr:n.stderr}))}async function ma(t={}){let e=(t._now??(()=>Date.now()))(),n=t.ttlMs??6e4,r=t.execFn??fa,o=t.log??(()=>{});return mn&&mn.expiresAt>e?(o("[gh] checkGhReady cache hit"),mn.result):(o("[gh] checkGhReady cache miss \u2014 probing"),Et||(Et=(async()=>{try{await r("gh",["--version"])}catch(c){let a=c;return a.killed?{ok:!1,hint:"`gh` timed out \u2014 check connectivity"}:a.code==="ENOENT"?{ok:!1,hint:"`gh` CLI not found \u2014 install with: brew install gh"}:{ok:!1,hint:"`gh --version` failed unexpectedly \u2014 check gh installation"}}try{await r("gh",["auth","status"])}catch(c){let a=c;return a.killed||/ETIMEDOUT|ECONNRESET|ENOTFOUND/i.test(String(a.code??""))?{ok:!1,hint:"check network \u2014 cannot reach GitHub"}:{ok:!1,hint:"`gh` is not authenticated \u2014 run: gh auth login"}}let i={ok:!0};return n>0&&(mn={result:i,expiresAt:e+n}),i})().finally(()=>{Et=null}),Et))}async function ga(t,e){let n=e??fa,r=["pr","create","--base",t.base,"--head",t.head,"--title",t.title,"--body",t.body];try{let{stdout:o}=await n("gh",r);return o.trim()}catch(o){let s=o,i=s.stderr??"",c=s.code,a=s.exitCode??1,l=um(i,c,s.killed);throw new _t(`gh pr create failed (${l}): ${i.trim()}`,l,a,i)}}function ha(t,e){let n;try{n=e?._store??new pe}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r={type:"farm-decision",taskSlug:t.taskSlug,decision:t.decision,decidedAt:t.decidedAt,via:t.via};return{factId:n.storeFact({category:"decision",content:JSON.stringify(r),source_surface:"afk"})}}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}}import{promises as pm}from"node:fs";import{join as fm}from"node:path";function wa(t){let e=t.filter(r=>r.score!==null),n=t.filter(r=>r.score===null).map(r=>r.index).sort((r,o)=>r-o);return e.sort((r,o)=>{let s=r.score,i=o.score,c=ya(s),a=ya(i);if(c!==a)return a-c;let l=ba(s.lint_ok),d=ba(i.lint_ok);return l!==d?d-l:s.loc_delta!==i.loc_delta?s.loc_delta-i.loc_delta:r.index-o.index}),[...e.map(r=>r.index),...n]}function ya(t){let e=t.pass+t.fail;return e===0?0:t.pass/e}function ba(t){return t===!0?2:t===!1?1:0}async function gn(t,e={}){if(t.branches.length===0)throw new Error(`resolveWinnerBranch: farm ${t.taskSlug} has no branches`);let n=e.loadScore??mm,r=await Promise.all(t.branches.map(async i=>({index:i.index,score:await n(t.farmDir,i.index)}))),o=wa(r),s=new Map(t.branches.map(i=>[i.index,i]));for(let i of o){let c=r.find(a=>a.index===i)?.score;if(c&&c.pass>0&&c.fail===0){let a=s.get(i);if(a)return{branch:a,source:"winner"}}}for(let i of o)if(r.find(a=>a.index===i)?.score){let a=s.get(i);if(a)return{branch:a,source:"top-scored"}}return{branch:t.branches[0],source:"fallback-first-branch"}}async function mm(t,e){let n=fm(t,"scores",`branch-${e}.json`);try{let r=await pm.readFile(n,"utf8");return JSON.parse(r)}catch(r){return r.code==="ENOENT",null}}var hn="afk:f:";var gm=new Set(["p","d","r","x"]),hm=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function ka(t){if(!t||!t.startsWith(hn)||Buffer.byteLength(t,"utf8")>64)return null;let e=t.slice(hn.length),n=e.indexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);return!gm.has(r)||!hm.test(o)?null:{action:r,taskSlug:o}}var km=wm(ym),Or=new Map;async function va(t,e={}){let n=e.log??(()=>{}),r=Sm(t),o=ka(r);if(!o){await G(t,"Unknown action",n);return}if(t.chat?.id===void 0){await G(t,"No chat context",n);return}let s=e.loadFarm??Qe,i;try{i=await s(o.taskSlug)}catch(c){n("[farm-callback] loadFarm failed:",c),await G(t,"Farm load failed",n);return}if(!i){await G(t,"Farm not found (already GC\u2019d?)",n);return}try{await vm(o.action,t,i,e,n)}catch(c){n("[farm-callback] dispatch error:",c),await G(t,"Internal error",n)}}function Sm(t){return t.callbackQuery?.data}async function G(t,e,n){try{await t.answerCbQuery(e)}catch(r){n("[farm-callback] answerCbQuery failed:",r)}}async function vm(t,e,n,r,o){switch(t){case"x":return xm(e,n,r,o);case"d":return Am(e,n,r,o);case"p":return Sa(`p:${n.taskSlug}`,e,n,r,o,Em);case"r":return Sa(`r:${n.taskSlug}`,e,n,r,o,Tm)}}async function Sa(t,e,n,r,o,s){let i=Or.get(t);if(i){o(`[farm-callback] ${t} \u2014 second tap, awaiting in-flight lock`);try{await i}catch{}let a=r.loadFarm??Qe,l;try{l=await a(n.taskSlug)}catch{await G(e,"Farm load failed",o);return}if(!l){await G(e,"Farm not found",o);return}return s(e,l,r,o)}let c=s(e,n,r,o);return Or.set(t,c),c.finally(()=>{Or.delete(t)}),c}async function Em(t,e,n,r){if(e.prUrl){await G(t,`PR already open: ${e.prUrl}`,r);return}await G(t,"Opening PR\u2026",r);let o=n.checkGhReady??ma,s;try{s=await o()}catch(m){r("[farm-callback] checkGhReady threw:",m);try{await t.reply("gh readiness check failed \u2014 see daemon logs")}catch{}return}if(!s.ok){try{await t.reply(s.hint)}catch{}return}let i=n.resolveWinnerBranch??gn,c;try{c=await i(e)}catch(m){r("[farm-callback] resolveWinnerBranch failed:",m);try{await t.reply("Winner lookup failed")}catch{}return}let a=c.branch.branch,l=e.baseBranch??"main",d=`Auto PR: ${e.taskName}`,u=`Auto-generated by afk farm ${e.taskSlug} | winner: ${a} | created: ${new Date().toISOString()}`,p=n.createPr??ga,y;try{y=await p({base:l,head:a,title:d,body:u})}catch(m){if(m instanceof _t){let w={"not-found":"gh CLI not found \u2014 install with: brew install gh","already-exists":"PR already exists for this branch",unauthed:"gh is not authenticated \u2014 run: gh auth login",network:"Network error \u2014 check gh connectivity",timeout:"gh timed out \u2014 check connectivity",unknown:"gh pr create failed \u2014 see daemon logs"};try{await t.reply(w[m.kind])}catch{}return}r("[farm-callback] createPr failed:",m);try{await t.reply("gh pr create failed \u2014 see daemon logs")}catch{}return}let f=n.recordPrCreated??pa;try{await f(e.taskSlug,y)}catch(m){r("[farm-callback] recordPrCreated failed:",m)}try{await t.reply(`PR opened \u2713
1645
- \u{1F517} ${y}`)}catch(m){r("[farm-callback] reply failed:",m)}}function _m(t,e=()=>{}){e("[farm] spawning child afk process",{args:t});let n=bm("afk",t,{detached:!0,stdio:"ignore"});n.on("error",r=>{e("[farm] child spawn error",{args:t,err:r.message})}),n.on("exit",(r,o)=>{r!==0&&e("[farm] child exited with non-zero code",{args:t,code:r,signal:o})}),n.unref()}async function Tm(t,e,n,r){if(e.respawnedAs){await G(t,`Already respawned as ${e.respawnedAs}`,r);return}if(e.branches.length===0){await G(t,"No branches remain \u2014 cannot respawn",r);return}await G(t,"Respawning\u2026",r);let o=n.resolveWinnerBranch??gn,s;try{s=await o(e)}catch(u){r("[farm-callback] resolveWinnerBranch failed:",u);try{await t.reply("Winner lookup failed")}catch{}return}let i=s.branch,c=la(e.taskName,{now:n._now,randomSuffix:n._randomSuffix}),a=e.branches.length;r("[farm] spawning child",{childSlug:c,baseRef:i.branch,branches:a});let l=n.spawnFarm??(u=>_m(u,r));try{l(["farm",e.taskName,"--branches",String(a),"--base-ref",i.branch,"--task-slug",c])}catch(u){r("[farm-callback] spawnFarm failed:",u);try{await t.reply("Respawn failed")}catch{}return}let d=n.recordRespawn??ua;try{await d(e.taskSlug,c)}catch(u){r("[farm-callback] recordRespawn failed:",u)}try{await t.reply(`Respawning as \`${c}\` from ${i.branch} \u2713
1644
+ `,"utf8"),n}import{execFile as lm}from"node:child_process";import{promisify as dm}from"node:util";var um=dm(lm),pm=2e4,_t=class extends Error{kind;exitCode;stderr;constructor(e,n,r,o){super(e),this.name="GhError",this.kind=n,this.exitCode=r,this.stderr=o}},mn=null,Et=null;function fm(t,e,n){return n===!0?"timeout":e==="ENOENT"?"not-found":/already exists/i.test(t)?"already-exists":/authentication|please log in|HTTP 40[13]|bad credentials|token|scope/i.test(t)?"unauthed":/ETIMEDOUT|ECONNRESET|ECONNREFUSED/i.test(t+(e??""))?"network":"unknown"}function fa(t,e){return um(t,e,{timeout:pm,killSignal:"SIGTERM"}).then(n=>({stdout:n.stdout,stderr:n.stderr}))}async function ma(t={}){let e=(t._now??(()=>Date.now()))(),n=t.ttlMs??6e4,r=t.execFn??fa,o=t.log??(()=>{});return mn&&mn.expiresAt>e?(o("[gh] checkGhReady cache hit"),mn.result):(o("[gh] checkGhReady cache miss \u2014 probing"),Et||(Et=(async()=>{try{await r("gh",["--version"])}catch(c){let a=c;return a.killed?{ok:!1,hint:"`gh` timed out \u2014 check connectivity"}:a.code==="ENOENT"?{ok:!1,hint:"`gh` CLI not found \u2014 install with: brew install gh"}:{ok:!1,hint:"`gh --version` failed unexpectedly \u2014 check gh installation"}}try{await r("gh",["auth","status"])}catch(c){let a=c;return a.killed||/ETIMEDOUT|ECONNRESET|ENOTFOUND/i.test(String(a.code??""))?{ok:!1,hint:"check network \u2014 cannot reach GitHub"}:{ok:!1,hint:"`gh` is not authenticated \u2014 run: gh auth login"}}let i={ok:!0};return n>0&&(mn={result:i,expiresAt:e+n}),i})().finally(()=>{Et=null}),Et))}async function ga(t,e){let n=e??fa,r=["pr","create","--base",t.base,"--head",t.head,"--title",t.title,"--body",t.body];try{let{stdout:o}=await n("gh",r);return o.trim()}catch(o){let s=o,i=s.stderr??"",c=s.code,a=s.exitCode??1,l=fm(i,c,s.killed);throw new _t(`gh pr create failed (${l}): ${i.trim()}`,l,a,i)}}function ha(t,e){let n;try{n=e?._store??new pe}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r={type:"farm-decision",taskSlug:t.taskSlug,decision:t.decision,decidedAt:t.decidedAt,via:t.via};return{factId:n.storeFact({category:"decision",content:JSON.stringify(r),source_surface:"afk"})}}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}}import{promises as mm}from"node:fs";import{join as gm}from"node:path";function wa(t){let e=t.filter(r=>r.score!==null),n=t.filter(r=>r.score===null).map(r=>r.index).sort((r,o)=>r-o);return e.sort((r,o)=>{let s=r.score,i=o.score,c=ya(s),a=ya(i);if(c!==a)return a-c;let l=ba(s.lint_ok),d=ba(i.lint_ok);return l!==d?d-l:s.loc_delta!==i.loc_delta?s.loc_delta-i.loc_delta:r.index-o.index}),[...e.map(r=>r.index),...n]}function ya(t){let e=t.pass+t.fail;return e===0?0:t.pass/e}function ba(t){return t===!0?2:t===!1?1:0}async function gn(t,e={}){if(t.branches.length===0)throw new Error(`resolveWinnerBranch: farm ${t.taskSlug} has no branches`);let n=e.loadScore??hm,r=await Promise.all(t.branches.map(async i=>({index:i.index,score:await n(t.farmDir,i.index)}))),o=wa(r),s=new Map(t.branches.map(i=>[i.index,i]));for(let i of o){let c=r.find(a=>a.index===i)?.score;if(c&&c.pass>0&&c.fail===0){let a=s.get(i);if(a)return{branch:a,source:"winner"}}}for(let i of o)if(r.find(a=>a.index===i)?.score){let a=s.get(i);if(a)return{branch:a,source:"top-scored"}}return{branch:t.branches[0],source:"fallback-first-branch"}}async function hm(t,e){let n=gm(t,"scores",`branch-${e}.json`);try{let r=await mm.readFile(n,"utf8");return JSON.parse(r)}catch(r){return r.code==="ENOENT",null}}var hn="afk:f:";var ym=new Set(["p","d","r","x"]),bm=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function ka(t){if(!t||!t.startsWith(hn)||Buffer.byteLength(t,"utf8")>64)return null;let e=t.slice(hn.length),n=e.indexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);return!ym.has(r)||!bm.test(o)?null:{action:r,taskSlug:o}}var vm=Sm(wm),Or=new Map;async function va(t,e={}){let n=e.log??(()=>{}),r=Em(t),o=ka(r);if(!o){await G(t,"Unknown action",n);return}if(t.chat?.id===void 0){await G(t,"No chat context",n);return}let s=e.loadFarm??Qe,i;try{i=await s(o.taskSlug)}catch(c){n("[farm-callback] loadFarm failed:",c),await G(t,"Farm load failed",n);return}if(!i){await G(t,"Farm not found (already GC\u2019d?)",n);return}try{await _m(o.action,t,i,e,n)}catch(c){n("[farm-callback] dispatch error:",c),await G(t,"Internal error",n)}}function Em(t){return t.callbackQuery?.data}async function G(t,e,n){try{await t.answerCbQuery(e)}catch(r){n("[farm-callback] answerCbQuery failed:",r)}}async function _m(t,e,n,r,o){switch(t){case"x":return Rm(e,n,r,o);case"d":return Pm(e,n,r,o);case"p":return Sa(`p:${n.taskSlug}`,e,n,r,o,Tm);case"r":return Sa(`r:${n.taskSlug}`,e,n,r,o,Am)}}async function Sa(t,e,n,r,o,s){let i=Or.get(t);if(i){o(`[farm-callback] ${t} \u2014 second tap, awaiting in-flight lock`);try{await i}catch{}let a=r.loadFarm??Qe,l;try{l=await a(n.taskSlug)}catch{await G(e,"Farm load failed",o);return}if(!l){await G(e,"Farm not found",o);return}return s(e,l,r,o)}let c=s(e,n,r,o);return Or.set(t,c),c.finally(()=>{Or.delete(t)}),c}async function Tm(t,e,n,r){if(e.prUrl){await G(t,`PR already open: ${e.prUrl}`,r);return}await G(t,"Opening PR\u2026",r);let o=n.checkGhReady??ma,s;try{s=await o()}catch(m){r("[farm-callback] checkGhReady threw:",m);try{await t.reply("gh readiness check failed \u2014 see daemon logs")}catch{}return}if(!s.ok){try{await t.reply(s.hint)}catch{}return}let i=n.resolveWinnerBranch??gn,c;try{c=await i(e)}catch(m){r("[farm-callback] resolveWinnerBranch failed:",m);try{await t.reply("Winner lookup failed")}catch{}return}let a=c.branch.branch,l=e.baseBranch??"main",d=`Auto PR: ${e.taskName}`,u=`Auto-generated by afk farm ${e.taskSlug} | winner: ${a} | created: ${new Date().toISOString()}`,p=n.createPr??ga,y;try{y=await p({base:l,head:a,title:d,body:u})}catch(m){if(m instanceof _t){let w={"not-found":"gh CLI not found \u2014 install with: brew install gh","already-exists":"PR already exists for this branch",unauthed:"gh is not authenticated \u2014 run: gh auth login",network:"Network error \u2014 check gh connectivity",timeout:"gh timed out \u2014 check connectivity",unknown:"gh pr create failed \u2014 see daemon logs"};try{await t.reply(w[m.kind])}catch{}return}r("[farm-callback] createPr failed:",m);try{await t.reply("gh pr create failed \u2014 see daemon logs")}catch{}return}let f=n.recordPrCreated??pa;try{await f(e.taskSlug,y)}catch(m){r("[farm-callback] recordPrCreated failed:",m)}try{await t.reply(`PR opened \u2713
1645
+ \u{1F517} ${y}`)}catch(m){r("[farm-callback] reply failed:",m)}}function xm(t,e=()=>{}){e("[farm] spawning child afk process",{args:t});let n=km("afk",t,{detached:!0,stdio:"ignore"});n.on("error",r=>{e("[farm] child spawn error",{args:t,err:r.message})}),n.on("exit",(r,o)=>{r!==0&&e("[farm] child exited with non-zero code",{args:t,code:r,signal:o})}),n.unref()}async function Am(t,e,n,r){if(e.respawnedAs){await G(t,`Already respawned as ${e.respawnedAs}`,r);return}if(e.branches.length===0){await G(t,"No branches remain \u2014 cannot respawn",r);return}await G(t,"Respawning\u2026",r);let o=n.resolveWinnerBranch??gn,s;try{s=await o(e)}catch(u){r("[farm-callback] resolveWinnerBranch failed:",u);try{await t.reply("Winner lookup failed")}catch{}return}let i=s.branch,c=la(e.taskName,{now:n._now,randomSuffix:n._randomSuffix}),a=e.branches.length;r("[farm] spawning child",{childSlug:c,baseRef:i.branch,branches:a});let l=n.spawnFarm??(u=>xm(u,r));try{l(["farm",e.taskName,"--branches",String(a),"--base-ref",i.branch,"--task-slug",c])}catch(u){r("[farm-callback] spawnFarm failed:",u);try{await t.reply("Respawn failed")}catch{}return}let d=n.recordRespawn??ua;try{await d(e.taskSlug,c)}catch(u){r("[farm-callback] recordRespawn failed:",u)}try{await t.reply(`Respawning as \`${c}\` from ${i.branch} \u2713
1646
1646
  \u{1F504} Farm \`${e.taskSlug}\` respawned.
1647
1647
  Child slug: \`${c}\`
1648
- Winner branch: \`${i.branch}\``)}catch(u){r("[farm-callback] reply failed:",u)}}async function xm(t,e,n,r){if(e.human_decision==="rejected"){await G(t,"Already discarded",r);return}if(e.human_decision!==void 0){await G(t,`Already resolved (${e.human_decision})`,r);return}let o=n.recordHumanDecision??da,s;try{s=await o(e.taskSlug,"rejected")}catch(c){r("[farm-callback] recordHumanDecision failed:",c),await G(t,"Manifest write failed",r);return}let i=n.writeFarmDecisionFact??ha;try{let c=i({taskSlug:s.taskSlug,decision:"rejected",decidedAt:s.decidedAt??new Date().toISOString(),via:"telegram"});"skipped"in c&&r("[farm-callback] memory write skipped:",c.reason)}catch(c){r("[farm-callback] memory write threw:",c)}await G(t,"Discarded \u2713",r);try{await t.reply(`\u274C Farm \`${s.taskSlug}\` discarded.`)}catch(c){r("[farm-callback] reply failed:",c)}}async function Am(t,e,n,r){if(e.branches.length===0){await G(t,"No branches to diff",r);return}let o=n.resolveWinnerBranch??gn,s;try{s=await o(e)}catch(l){r("[farm-callback] winner resolution failed:",l),await G(t,"Winner lookup failed",r);return}let i=s.branch,c=n.execGit??Rm;await G(t,"Computing diff\u2026",r);let a=s.source==="winner"?"\u2190 winner":s.source==="top-scored"?"\u2190 top-scored (no clean test pass)":"\u2190 fallback (no scores)";try{let[l,d]=await Promise.all([c(i.path,["log","--oneline",`${e.baseRef}..HEAD`]),c(i.path,["diff","--stat",e.baseRef,"HEAD"])]),u=`\u{1F4CA} Diff for ${i.branch} ${a}
1648
+ Winner branch: \`${i.branch}\``)}catch(u){r("[farm-callback] reply failed:",u)}}async function Rm(t,e,n,r){if(e.human_decision==="rejected"){await G(t,"Already discarded",r);return}if(e.human_decision!==void 0){await G(t,`Already resolved (${e.human_decision})`,r);return}let o=n.recordHumanDecision??da,s;try{s=await o(e.taskSlug,"rejected")}catch(c){r("[farm-callback] recordHumanDecision failed:",c),await G(t,"Manifest write failed",r);return}let i=n.writeFarmDecisionFact??ha;try{let c=i({taskSlug:s.taskSlug,decision:"rejected",decidedAt:s.decidedAt??new Date().toISOString(),via:"telegram"});"skipped"in c&&r("[farm-callback] memory write skipped:",c.reason)}catch(c){r("[farm-callback] memory write threw:",c)}await G(t,"Discarded \u2713",r);try{await t.reply(`\u274C Farm \`${s.taskSlug}\` discarded.`)}catch(c){r("[farm-callback] reply failed:",c)}}async function Pm(t,e,n,r){if(e.branches.length===0){await G(t,"No branches to diff",r);return}let o=n.resolveWinnerBranch??gn,s;try{s=await o(e)}catch(l){r("[farm-callback] winner resolution failed:",l),await G(t,"Winner lookup failed",r);return}let i=s.branch,c=n.execGit??Im;await G(t,"Computing diff\u2026",r);let a=s.source==="winner"?"\u2190 winner":s.source==="top-scored"?"\u2190 top-scored (no clean test pass)":"\u2190 fallback (no scores)";try{let[l,d]=await Promise.all([c(i.path,["log","--oneline",`${e.baseRef}..HEAD`]),c(i.path,["diff","--stat",e.baseRef,"HEAD"])]),u=`\u{1F4CA} Diff for ${i.branch} ${a}
1649
1649
  base: ${e.baseRef.slice(0,7)}
1650
1650
 
1651
1651
  Commits:
1652
1652
  ${l.stdout.trim()||"(none)"}
1653
1653
 
1654
1654
  Stat:
1655
- ${d.stdout.trim()||"(no changes)"}`;await t.reply(u.slice(0,4e3))}catch(l){r("[farm-callback] diff failed:",l);try{await t.reply("Diff failed \u2014 see daemon logs.")}catch{}}}async function Rm(t,e){let n=await km("git",e,{cwd:t,maxBuffer:4194304});return{stdout:n.stdout,stderr:n.stderr}}function Ze(t){let e=t instanceof Error?t.message:String(t);return e.toLowerCase().includes("rate limit")||e.toLowerCase().includes("too many requests")}function et(t){let e=t instanceof Error?t.message:String(t);return e.toLowerCase().includes("network")||e.toLowerCase().includes("connect")||e.toLowerCase().includes("timeout")}import{TelegramError as Ea}from"telegraf";var Pm=300,Im=9e4,_a=6e4,Cm=300*1e3,Mm=9e4;async function Dr(t,e,n,r){if(!t.chat?.id){r?.("streamResponse: ctx.chat is undefined (non-chat context); skipping");return}let o="",s=null,i=0,c=null,a=null,l=!1,d=-1,u=async(p,y=!1)=>{let f=Date.now();if(!s){let k=dn(p||"\u2026"),S=St(k);try{s=await t.reply(S[0]??"\u2026",{parse_mode:"HTML"})}catch(h){if(h instanceof Ea&&h.code===400&&/can't parse entities/i.test(h.description))s=await t.reply(p||"\u2026");else throw h}return}if(!y&&f-i<Pm&&p.length<100)return;i=f;let m=dn(p||"\u2026"),w=St(m);try{await t.telegram.editMessageText(t.chat?.id,s.message_id,void 0,w[0]??m,{parse_mode:"HTML"})}catch(k){if(k instanceof Ea&&k.code===400&&/can't parse entities/i.test(k.description))try{await t.telegram.editMessageText(t.chat?.id,s.message_id,void 0,p)}catch{}}};try{let p=Array.isArray(n)?"sendMessageStream"in e&&typeof e.sendMessageStream=="function"?e.sendMessageStream(n):(async function*(){let h=await e.sendMessage(n.map(g=>g.type==="text"?g.text:"").filter(Boolean).join(`
1656
- `),{stream:!1});yield{type:"message",message:h},yield{type:"done",metadata:h.metadata}})():"sendMessageStream"in e&&typeof e.sendMessageStream=="function"?e.sendMessageStream(n):(async function*(){let h=await e.sendMessage(n,{stream:!1});yield{type:"message",message:h},yield{type:"done",metadata:h.metadata}})();await u("Thinking\u2026");let y=p[Symbol.asyncIterator](),f=!1,m=null,w=()=>{let h=c!==null?Math.max(_a,c.getTime()-Date.now()+Mm):f?_a:Im;return new Promise((g,b)=>{m=setTimeout(()=>{m=null,b(new Error(f?"Response timed out. Try sending a shorter message or try again.":"Request timed out. The agent may still be starting (first message can take a minute). Try again in a moment."))},h),y.next().then(E=>{m!=null&&(clearTimeout(m),m=null),g(E)},E=>{m!=null&&(clearTimeout(m),m=null),b(E)})})},k=(h,g)=>{let b=g.agentType??g.subagentId;if(h.type==="chunk"&&h.chunk.type==="tool_use_detail"){let E=h.chunk.toolInput.length>60?h.chunk.toolInput.slice(0,57)+"...":h.chunk.toolInput;o+=`
1655
+ ${d.stdout.trim()||"(no changes)"}`;await t.reply(u.slice(0,4e3))}catch(l){r("[farm-callback] diff failed:",l);try{await t.reply("Diff failed \u2014 see daemon logs.")}catch{}}}async function Im(t,e){let n=await vm("git",e,{cwd:t,maxBuffer:4194304});return{stdout:n.stdout,stderr:n.stderr}}function Ze(t){let e=t instanceof Error?t.message:String(t);return e.toLowerCase().includes("rate limit")||e.toLowerCase().includes("too many requests")}function et(t){let e=t instanceof Error?t.message:String(t);return e.toLowerCase().includes("network")||e.toLowerCase().includes("connect")||e.toLowerCase().includes("timeout")}import{TelegramError as Ea}from"telegraf";var Cm=300,Mm=9e4,_a=6e4,Om=300*1e3,Dm=9e4;async function Dr(t,e,n,r){if(!t.chat?.id){r?.("streamResponse: ctx.chat is undefined (non-chat context); skipping");return}let o="",s=null,i=0,c=null,a=null,l=!1,d=-1,u=async(p,y=!1)=>{let f=Date.now();if(!s){let k=dn(p||"\u2026"),S=St(k);try{s=await t.reply(S[0]??"\u2026",{parse_mode:"HTML"})}catch(h){if(h instanceof Ea&&h.code===400&&/can't parse entities/i.test(h.description))s=await t.reply(p||"\u2026");else throw h}return}if(!y&&f-i<Cm&&p.length<100)return;i=f;let m=dn(p||"\u2026"),w=St(m);try{await t.telegram.editMessageText(t.chat?.id,s.message_id,void 0,w[0]??m,{parse_mode:"HTML"})}catch(k){if(k instanceof Ea&&k.code===400&&/can't parse entities/i.test(k.description))try{await t.telegram.editMessageText(t.chat?.id,s.message_id,void 0,p)}catch{}}};try{let p=Array.isArray(n)?"sendMessageStream"in e&&typeof e.sendMessageStream=="function"?e.sendMessageStream(n):(async function*(){let h=await e.sendMessage(n.map(g=>g.type==="text"?g.text:"").filter(Boolean).join(`
1656
+ `),{stream:!1});yield{type:"message",message:h},yield{type:"done",metadata:h.metadata}})():"sendMessageStream"in e&&typeof e.sendMessageStream=="function"?e.sendMessageStream(n):(async function*(){let h=await e.sendMessage(n,{stream:!1});yield{type:"message",message:h},yield{type:"done",metadata:h.metadata}})();await u("Thinking\u2026");let y=p[Symbol.asyncIterator](),f=!1,m=null,w=()=>{let h=c!==null?Math.max(_a,c.getTime()-Date.now()+Dm):f?_a:Mm;return new Promise((g,b)=>{m=setTimeout(()=>{m=null,b(new Error(f?"Response timed out. Try sending a shorter message or try again.":"Request timed out. The agent may still be starting (first message can take a minute). Try again in a moment."))},h),y.next().then(E=>{m!=null&&(clearTimeout(m),m=null),g(E)},E=>{m!=null&&(clearTimeout(m),m=null),b(E)})})},k=(h,g)=>{let b=g.agentType??g.subagentId;if(h.type==="chunk"&&h.chunk.type==="tool_use_detail"){let E=h.chunk.toolInput.length>60?h.chunk.toolInput.slice(0,57)+"...":h.chunk.toolInput;o+=`
1657
1657
  \u25E6 ${b}: ${h.chunk.toolName} ${E}`,u(o)}else h.type==="done"&&(o+=`
1658
1658
  \u25E6 ${b}: Done`,u(o))},S=!!v.AFK_TELEGRAM_TRACE;try{if(await co(k,async()=>{for(;;){S&&console.log("[trace] awaiting next event");let h=await w();if(S&&console.log("[trace] event arrived:",h.done?"DONE":h.value.type),h.done)break;let g=h.value;if(f||(f=!0,console.log("\u{1F4E1} First stream event received:",g.type),r?.("First stream event received:",g.type)),g.type==="chunk"&&g.chunk.type==="content"&&(o+=g.chunk.content,await u(o)),g.type==="chunk"&&g.chunk.type,g.type==="message"&&g.message.role==="assistant"&&(o=g.message.content,await u(o)),g.type==="progress"){let{description:b,summary:E,lastToolName:C}=g.progress,F=C?`
1659
1659
  \u25E6 ${b} (${C})`:`
@@ -1678,13 +1678,13 @@ No reset time available. Wait for the limit to reset, then send again \u2014 or
1678
1678
 
1679
1679
  Resets at ${c.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})} (in ~${D} min).
1680
1680
 
1681
- I'll auto-resume when the limit resets \u2014 no need to retype.`;l=!0,u(x,!0).finally(()=>{l=!1})}},Cm));continue}if(g.type==="resumed"){a!==null&&(clearInterval(a),a=null),c=null;let b=g.hotSwapped&&g.accountId?`\u25B6 **Resumed on ${g.accountId}**`:"\u25B6 **Resumed**";await u(b,!0);continue}if(g.type==="done"){a!==null&&(clearInterval(a),a=null),o.trim()&&await u(o,!0);break}if(g.type==="error")throw a!==null&&(clearInterval(a),a=null),g.error}}),o&&s){let h=St(dn(o));if(h.length>1)for(let g=1;g<h.length;g++){let b=h[g];b&&await t.reply(b,{parse_mode:"HTML"})}}}finally{await Promise.resolve(y.return?.(void 0)).catch(()=>{})}}catch(p){throw r?.("Streaming error:",p),p}}async function Fr(t,e,n,r,o){if(!r.has(e))try{await Promise.race([n.waitForInitialization(),new Promise((c,a)=>setTimeout(()=>a(new Error("timeout")),5e3))]);let s=n.getSessionMetadata(),i=[{command:"start",description:"Show welcome and command list"},{command:"help",description:"Show this command list"},{command:"clear",description:"Clear conversation history"},{command:"compact",description:"Compact conversation history"},{command:"model",description:"Switch Claude model (opus/sonnet/haiku)"},{command:"cd",description:"Show or change session working directory"}];if(s.slashCommands?.length)for(let c of s.slashCommands){let a=c.replace(/^\//,"");i.push({command:a,description:`SDK command: ${a}`})}if(s.skills?.length)for(let c of s.skills)i.push({command:c,description:`Run ${c} skill`});await t.telegram.setMyCommands(i,{scope:{type:"chat",chat_id:e}}),r.add(e),o(`Registered ${i.length} commands for chat ${e}`)}catch(s){o(`Could not register dynamic commands for chat ${e}:`,s)}}function Om(t){return t.length<3?null:t.length>=4&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?"image/png":t[0]===71&&t[1]===73&&t[2]===70?"image/gif":t.length>=12&&t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80?"image/webp":t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":null}async function Dm(t,e){let n=t.headers.get("content-length");if(n!=null){let c=Number(n);if(Number.isFinite(c)&&c>e)return{status:"too-large",bytesRead:c}}let r=t.body;if(!r)return{status:"missing-body"};let o=r.getReader(),s=[],i=0;try{for(;;){let{done:c,value:a}=await o.read();if(c)break;if(i+=a.byteLength,i>e)return await o.cancel().catch(()=>{}),{status:"too-large",bytesRead:i};s.push(Buffer.from(a))}}finally{o.releaseLock()}return{status:"ok",bytes:Buffer.concat(s,i)}}var yn=class t{static MAX_QUEUE_DEPTH=5;sessionManager;messageQueues=new Map;registeredCommandChats;log;bot;pendingElicitations=new Map;constructor(e,n,r,o){this.bot=e,this.sessionManager=n,this.registeredCommandChats=r,this.log=o}async handlePhoto(e){let n=e.chat?.id,r=e.message,o=r?.photo;if(!n||!o?.length){this.log(`Photo handling: missing chatId or photo array for chat ${n??"(unknown)"}`);return}this.log(`\u{1F4F7} Photo from chat ID: ${n}`);let s=o[o.length-1];if(!s){this.log(`Photo handling: empty photo array for chat ${n}`);return}let i=5*1024*1024;if(s.file_size!=null&&s.file_size>i){this.log(`Photo handling: oversized file (${s.file_size} bytes) rejected for chat ${n}`),await e.reply("\u274C Image is too large (max 5 MB). Please send a smaller photo.");return}let c=r?.caption;try{let a=await this.sessionManager.getSession(n);if(Fr(this.bot,n,a,this.registeredCommandChats,this.log).catch(g=>this.log("Failed to register chat commands:",g)),a.state!=="idle"&&(this.messageQueues.get(n)?.length??0)>=t.MAX_QUEUE_DEPTH){await e.reply("\u23F3 Queue full. Please wait for your messages to be processed.");return}let l=await e.telegram.getFileLink(s.file_id),d=l instanceof URL?l:new URL(String(l));if(d.protocol!=="https:"||d.hostname!=="api.telegram.org"||d.port!==""&&d.port!=="443"){this.log(`Photo handling: unexpected file URL (protocol=${d.protocol} hostname=${d.hostname}) rejected for chat ${n}`),await e.reply("\u274C Couldn't download the image. Please try resending.");return}let u=await globalThis.fetch(d.href,{signal:AbortSignal.timeout(15e3),redirect:"error"});if(!u.ok){this.log(`Photo handling: fetch failed with status ${u.status} for chat ${n}`),await e.reply("\u274C Couldn't download the image. Please try resending.");return}let p=await Dm(u,i);if(p.status==="too-large"){this.log(`Photo handling: downloaded file (${p.bytesRead} bytes) exceeds limit for chat ${n}`),await e.reply("\u274C Image is too large (max 5 MB). Please send a smaller photo.");return}if(p.status==="missing-body"){this.log(`Photo handling: fetch response had no body for chat ${n}`),await e.reply("\u274C Couldn't download the image. Please try resending.");return}let y=p.bytes,f=y.toString("base64"),m=["image/jpeg","image/png","image/gif","image/webp"],w=u.headers.get("content-type")??"",k=(w.split(";")[0]?.trim()??"").toLowerCase(),S;if(m.includes(k))S=k;else{let g=Om(y);if(g!==null)this.log(`Photo: sniffed ${g} (Content-Type was "${w}") for chat ${n}`),S=g;else{this.log(`Photo: unrecognised image format for chat ${n} (Content-Type: "${w}")`),await e.reply("\u274C Unsupported image format. Please send a JPEG, PNG, GIF, or WebP.");return}}let h=[];if(c!=null&&h.push({type:"text",text:`[User caption]: ${[...c].slice(0,1024).join("")}`}),h.push({type:"image",source:{type:"base64",media_type:S,data:f}}),a.state!=="idle"){this.enqueuePhoto(n,e,h)&&await e.reply("Message queued.");return}await this.processOne(n,e,h)}catch(a){let d=(a instanceof Error?a.message:String(a)).replace(/\/bot[^/]+\//g,"/bot[REDACTED]/");this.log("Photo handling error:",d),Ze(a)?await e.reply("\u23F3 Rate limit reached. Please wait a moment and try again."):et(a)?await e.reply("\u274C Couldn't download the image. Please try resending."):await e.reply(un())}}async handle(e){let n=e.chat?.id,r=e.message.text;if(!n||!r||(this.log(`\u{1F4EC} Message from chat ID: ${n}`),r.startsWith("/")))return;let o=this.pendingElicitations.get(n);if(o){let s=this.sessionManager.getSessionIfExists(n);if(s&&s.state!=="idle"){this.pendingElicitations.delete(n),o(r);return}this.log("[message] dropping stale pendingElicitation for chatId",n),this.pendingElicitations.delete(n)}try{let s=await this.sessionManager.getSession(n);if(Fr(this.bot,n,s,this.registeredCommandChats,this.log).catch(i=>this.log("Failed to register chat commands:",i)),s.state!=="idle"){this.enqueueMessage(n,e,r)&&await e.reply("Message queued.");return}await this.processOne(n,e,r)}catch(s){this.log("Message handling error:",s),Ze(s)?await e.reply("\u23F3 Rate limit reached. Please wait a moment and try again."):et(s)?await e.reply("\u{1F310} Network error. Please check your connection and try again."):await e.reply(un())}}async processClearDirect(e,n){try{await this.sessionManager.resetSession(e),this.registeredCommandChats.delete(e),await n.reply(vt())}catch(r){this.log("Clear error:",r),await n.reply(U(r))}}enqueueMessage(e,n,r){let o=this.messageQueues.get(e);return o||(o=[],this.messageQueues.set(e,o)),o.length>=t.MAX_QUEUE_DEPTH?(n.reply("\u23F3 Queue full. Please wait for your messages to be processed.").catch(()=>{}),!1):(o.push({type:"message",ctx:n,text:r}),!0)}enqueuePhoto(e,n,r){let o=this.messageQueues.get(e);return o||(o=[],this.messageQueues.set(e,o)),o.length>=t.MAX_QUEUE_DEPTH?(n.reply("\u23F3 Queue full. Please wait for your messages to be processed.").catch(()=>{}),!1):(o.push({type:"photo",ctx:n,content:r}),!0)}enqueueClear(e,n){let r=this.messageQueues.get(e);r||(r=[],this.messageQueues.set(e,r)),r.push({type:"clear",ctx:n})}async processOne(e,n,r){let o=!1;try{let s=await this.sessionManager.getSession(e);await n.sendChatAction("typing").catch(()=>{}),await Dr(n,s,r,this.log)}catch(s){if(this.log("Message handling error:",s),(s?.message??"").includes("session is busy")){(typeof r=="string"?this.enqueueMessage(e,n,r):this.enqueuePhoto(e,n,r))&&await n.reply("Message queued."),o=!0;return}Ze(s)?await n.reply("\u23F3 Rate limit reached. Please wait a moment and try again."):et(s)?await n.reply("\u{1F310} Network error. Please check your connection and try again."):await n.reply(un())}finally{o||this.drainQueue(e).catch(s=>this.log("Drain error:",s))}}async drainQueue(e){let n=this.messageQueues.get(e);if(!n?.length)return;let r=n.shift();r.type==="message"?await this.processOne(e,r.ctx,r.text):r.type==="photo"?await this.processOne(e,r.ctx,r.content):await this.processClearDirect(e,r.ctx)}};var Le="afk:e:";var Ta=/^[a-zA-Z0-9_-]{1,48}$/;function bn(t,e){if(!Ta.test(t))throw new Error(`buildElicitationCallback: invalid id ${JSON.stringify(t)}`);if(!Number.isInteger(e)||e<0)throw new Error(`buildElicitationCallback: choiceIndex must be a non-negative integer, got ${e}`);let n=`${Le}${e}:${t}`,r=Buffer.byteLength(n,"utf8");if(r>64)throw new Error(`buildElicitationCallback: payload ${r} bytes exceeds Telegram's 64-byte limit (id=${t})`);return n}function xa(t){if(!t||!t.startsWith(Le)||Buffer.byteLength(t,"utf8")>64)return null;let e=t.slice(Le.length),n=e.indexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1),s=parseInt(r,10);return!Number.isInteger(s)||s<0||String(s)!==r||!Ta.test(o)?null:{id:o,choiceIndex:s}}import{Markup as wn}from"telegraf";import{randomBytes as Fm}from"node:crypto";function Lm(){return`elic-${Fm(8).toString("hex")}`}function Nm(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function $m(t,e=64){if(Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.from(t,"utf8").subarray(0,e);return new TextDecoder("utf-8",{fatal:!1}).decode(n).replace(/\uFFFD$/,"")}function Aa(t,e,n){let r=new Map,o=new RegExp(`^${Nm(Le)}\\d+:.+$`);return e.action(o,async s=>{if(await s.answerCbQuery().catch(()=>{}),s.chat?.id!==n)return;let i=typeof s.callbackQuery=="object"&&"data"in s.callbackQuery?s.callbackQuery.data:void 0,c=xa(i);if(!c)return;let a=r.get(c.id);a&&a(c.choiceIndex)}),async(s,i)=>{if(i.signal.aborted)return{action:"decline"};let c=s.type??"text",a=s.message,l=`\u{1F4AC} *Question from agent*
1681
+ I'll auto-resume when the limit resets \u2014 no need to retype.`;l=!0,u(x,!0).finally(()=>{l=!1})}},Om));continue}if(g.type==="resumed"){a!==null&&(clearInterval(a),a=null),c=null;let b=g.hotSwapped&&g.accountId?`\u25B6 **Resumed on ${g.accountId}**`:"\u25B6 **Resumed**";await u(b,!0);continue}if(g.type==="done"){a!==null&&(clearInterval(a),a=null),o.trim()&&await u(o,!0);break}if(g.type==="error")throw a!==null&&(clearInterval(a),a=null),g.error}}),o&&s){let h=St(dn(o));if(h.length>1)for(let g=1;g<h.length;g++){let b=h[g];b&&await t.reply(b,{parse_mode:"HTML"})}}}finally{await Promise.resolve(y.return?.(void 0)).catch(()=>{})}}catch(p){throw r?.("Streaming error:",p),p}}async function Fr(t,e,n,r,o){if(!r.has(e))try{await Promise.race([n.waitForInitialization(),new Promise((c,a)=>setTimeout(()=>a(new Error("timeout")),5e3))]);let s=n.getSessionMetadata(),i=[{command:"start",description:"Show welcome and command list"},{command:"help",description:"Show this command list"},{command:"clear",description:"Clear conversation history"},{command:"compact",description:"Compact conversation history"},{command:"model",description:"Switch Claude model (opus/sonnet/haiku)"},{command:"cd",description:"Show or change session working directory"}];if(s.slashCommands?.length)for(let c of s.slashCommands){let a=c.replace(/^\//,"");i.push({command:a,description:`SDK command: ${a}`})}if(s.skills?.length)for(let c of s.skills)i.push({command:c,description:`Run ${c} skill`});await t.telegram.setMyCommands(i,{scope:{type:"chat",chat_id:e}}),r.add(e),o(`Registered ${i.length} commands for chat ${e}`)}catch(s){o(`Could not register dynamic commands for chat ${e}:`,s)}}function Fm(t){return t.length<3?null:t.length>=4&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?"image/png":t[0]===71&&t[1]===73&&t[2]===70?"image/gif":t.length>=12&&t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80?"image/webp":t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":null}async function Lm(t,e){let n=t.headers.get("content-length");if(n!=null){let c=Number(n);if(Number.isFinite(c)&&c>e)return{status:"too-large",bytesRead:c}}let r=t.body;if(!r)return{status:"missing-body"};let o=r.getReader(),s=[],i=0;try{for(;;){let{done:c,value:a}=await o.read();if(c)break;if(i+=a.byteLength,i>e)return await o.cancel().catch(()=>{}),{status:"too-large",bytesRead:i};s.push(Buffer.from(a))}}finally{o.releaseLock()}return{status:"ok",bytes:Buffer.concat(s,i)}}var yn=class t{static MAX_QUEUE_DEPTH=5;sessionManager;messageQueues=new Map;registeredCommandChats;log;bot;pendingElicitations=new Map;constructor(e,n,r,o){this.bot=e,this.sessionManager=n,this.registeredCommandChats=r,this.log=o}async handlePhoto(e){let n=e.chat?.id,r=e.message,o=r?.photo;if(!n||!o?.length){this.log(`Photo handling: missing chatId or photo array for chat ${n??"(unknown)"}`);return}this.log(`\u{1F4F7} Photo from chat ID: ${n}`);let s=o[o.length-1];if(!s){this.log(`Photo handling: empty photo array for chat ${n}`);return}let i=5*1024*1024;if(s.file_size!=null&&s.file_size>i){this.log(`Photo handling: oversized file (${s.file_size} bytes) rejected for chat ${n}`),await e.reply("\u274C Image is too large (max 5 MB). Please send a smaller photo.");return}let c=r?.caption;try{let a=await this.sessionManager.getSession(n);if(Fr(this.bot,n,a,this.registeredCommandChats,this.log).catch(g=>this.log("Failed to register chat commands:",g)),a.state!=="idle"&&(this.messageQueues.get(n)?.length??0)>=t.MAX_QUEUE_DEPTH){await e.reply("\u23F3 Queue full. Please wait for your messages to be processed.");return}let l=await e.telegram.getFileLink(s.file_id),d=l instanceof URL?l:new URL(String(l));if(d.protocol!=="https:"||d.hostname!=="api.telegram.org"||d.port!==""&&d.port!=="443"){this.log(`Photo handling: unexpected file URL (protocol=${d.protocol} hostname=${d.hostname}) rejected for chat ${n}`),await e.reply("\u274C Couldn't download the image. Please try resending.");return}let u=await globalThis.fetch(d.href,{signal:AbortSignal.timeout(15e3),redirect:"error"});if(!u.ok){this.log(`Photo handling: fetch failed with status ${u.status} for chat ${n}`),await e.reply("\u274C Couldn't download the image. Please try resending.");return}let p=await Lm(u,i);if(p.status==="too-large"){this.log(`Photo handling: downloaded file (${p.bytesRead} bytes) exceeds limit for chat ${n}`),await e.reply("\u274C Image is too large (max 5 MB). Please send a smaller photo.");return}if(p.status==="missing-body"){this.log(`Photo handling: fetch response had no body for chat ${n}`),await e.reply("\u274C Couldn't download the image. Please try resending.");return}let y=p.bytes,f=y.toString("base64"),m=["image/jpeg","image/png","image/gif","image/webp"],w=u.headers.get("content-type")??"",k=(w.split(";")[0]?.trim()??"").toLowerCase(),S;if(m.includes(k))S=k;else{let g=Fm(y);if(g!==null)this.log(`Photo: sniffed ${g} (Content-Type was "${w}") for chat ${n}`),S=g;else{this.log(`Photo: unrecognised image format for chat ${n} (Content-Type: "${w}")`),await e.reply("\u274C Unsupported image format. Please send a JPEG, PNG, GIF, or WebP.");return}}let h=[];if(c!=null&&h.push({type:"text",text:`[User caption]: ${[...c].slice(0,1024).join("")}`}),h.push({type:"image",source:{type:"base64",media_type:S,data:f}}),a.state!=="idle"){this.enqueuePhoto(n,e,h)&&await e.reply("Message queued.");return}await this.processOne(n,e,h)}catch(a){let d=(a instanceof Error?a.message:String(a)).replace(/\/bot[^/]+\//g,"/bot[REDACTED]/");this.log("Photo handling error:",d),Ze(a)?await e.reply("\u23F3 Rate limit reached. Please wait a moment and try again."):et(a)?await e.reply("\u274C Couldn't download the image. Please try resending."):await e.reply(un())}}async handle(e){let n=e.chat?.id,r=e.message.text;if(!n||!r||(this.log(`\u{1F4EC} Message from chat ID: ${n}`),r.startsWith("/")))return;let o=this.pendingElicitations.get(n);if(o){let s=this.sessionManager.getSessionIfExists(n);if(s&&s.state!=="idle"){this.pendingElicitations.delete(n),o(r);return}this.log("[message] dropping stale pendingElicitation for chatId",n),this.pendingElicitations.delete(n)}try{let s=await this.sessionManager.getSession(n);if(Fr(this.bot,n,s,this.registeredCommandChats,this.log).catch(i=>this.log("Failed to register chat commands:",i)),s.state!=="idle"){this.enqueueMessage(n,e,r)&&await e.reply("Message queued.");return}await this.processOne(n,e,r)}catch(s){this.log("Message handling error:",s),Ze(s)?await e.reply("\u23F3 Rate limit reached. Please wait a moment and try again."):et(s)?await e.reply("\u{1F310} Network error. Please check your connection and try again."):await e.reply(un())}}async processClearDirect(e,n){try{await this.sessionManager.resetSession(e),this.registeredCommandChats.delete(e),await n.reply(vt())}catch(r){this.log("Clear error:",r),await n.reply(U(r))}}enqueueMessage(e,n,r){let o=this.messageQueues.get(e);return o||(o=[],this.messageQueues.set(e,o)),o.length>=t.MAX_QUEUE_DEPTH?(n.reply("\u23F3 Queue full. Please wait for your messages to be processed.").catch(()=>{}),!1):(o.push({type:"message",ctx:n,text:r}),!0)}enqueuePhoto(e,n,r){let o=this.messageQueues.get(e);return o||(o=[],this.messageQueues.set(e,o)),o.length>=t.MAX_QUEUE_DEPTH?(n.reply("\u23F3 Queue full. Please wait for your messages to be processed.").catch(()=>{}),!1):(o.push({type:"photo",ctx:n,content:r}),!0)}enqueueClear(e,n){let r=this.messageQueues.get(e);r||(r=[],this.messageQueues.set(e,r)),r.push({type:"clear",ctx:n})}async processOne(e,n,r){let o=!1;try{let s=await this.sessionManager.getSession(e);await n.sendChatAction("typing").catch(()=>{}),await Dr(n,s,r,this.log)}catch(s){if(this.log("Message handling error:",s),(s?.message??"").includes("session is busy")){(typeof r=="string"?this.enqueueMessage(e,n,r):this.enqueuePhoto(e,n,r))&&await n.reply("Message queued."),o=!0;return}Ze(s)?await n.reply("\u23F3 Rate limit reached. Please wait a moment and try again."):et(s)?await n.reply("\u{1F310} Network error. Please check your connection and try again."):await n.reply(un())}finally{o||this.drainQueue(e).catch(s=>this.log("Drain error:",s))}}async drainQueue(e){let n=this.messageQueues.get(e);if(!n?.length)return;let r=n.shift();r.type==="message"?await this.processOne(e,r.ctx,r.text):r.type==="photo"?await this.processOne(e,r.ctx,r.content):await this.processClearDirect(e,r.ctx)}};var Le="afk:e:";var Ta=/^[a-zA-Z0-9_-]{1,48}$/;function bn(t,e){if(!Ta.test(t))throw new Error(`buildElicitationCallback: invalid id ${JSON.stringify(t)}`);if(!Number.isInteger(e)||e<0)throw new Error(`buildElicitationCallback: choiceIndex must be a non-negative integer, got ${e}`);let n=`${Le}${e}:${t}`,r=Buffer.byteLength(n,"utf8");if(r>64)throw new Error(`buildElicitationCallback: payload ${r} bytes exceeds Telegram's 64-byte limit (id=${t})`);return n}function xa(t){if(!t||!t.startsWith(Le)||Buffer.byteLength(t,"utf8")>64)return null;let e=t.slice(Le.length),n=e.indexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1),s=parseInt(r,10);return!Number.isInteger(s)||s<0||String(s)!==r||!Ta.test(o)?null:{id:o,choiceIndex:s}}import{Markup as wn}from"telegraf";import{randomBytes as Nm}from"node:crypto";function $m(){return`elic-${Nm(8).toString("hex")}`}function Um(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function jm(t,e=64){if(Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.from(t,"utf8").subarray(0,e);return new TextDecoder("utf-8",{fatal:!1}).decode(n).replace(/\uFFFD$/,"")}function Aa(t,e,n){let r=new Map,o=new RegExp(`^${Um(Le)}\\d+:.+$`);return e.action(o,async s=>{if(await s.answerCbQuery().catch(()=>{}),s.chat?.id!==n)return;let i=typeof s.callbackQuery=="object"&&"data"in s.callbackQuery?s.callbackQuery.data:void 0,c=xa(i);if(!c)return;let a=r.get(c.id);a&&a(c.choiceIndex)}),async(s,i)=>{if(i.signal.aborted)return{action:"decline"};let c=s.type??"text",a=s.message,l=`\u{1F4AC} *Question from agent*
1682
1682
 
1683
1683
  ${Xe(a)}`;if(s.context&&(l=`\u{1F4AC} *Question from agent*
1684
1684
 
1685
1685
  _${Xe(s.context)}_
1686
1686
 
1687
- ${Xe(a)}`),c==="confirm"||c==="choice"){let d=Lm(),u;return c==="confirm"?u=[[wn.button.callback("\u2705 Yes",bn(d,1)),wn.button.callback("\u274C No",bn(d,0))]]:u=(s.choices??[]).slice(0,20).map((f,m)=>[wn.button.callback($m(f),bn(d,m))]),new Promise(p=>{let y=!1,f=()=>{y||(y=!0,r.delete(d),p({action:"decline"}))};i.signal.addEventListener("abort",f,{once:!0}),r.set(d,m=>{if(!y)if(y=!0,r.delete(d),i.signal.removeEventListener("abort",f),c==="confirm")p({action:"accept",content:{value:m===1}});else{let k=(s.choices??[])[m];p(k===void 0?{action:"decline"}:{action:"accept",content:{value:k}})}}),e.telegram.sendMessage(n,l,{parse_mode:"MarkdownV2",reply_markup:wn.inlineKeyboard(u).reply_markup}).catch(()=>{y||(y=!0,r.delete(d),i.signal.removeEventListener("abort",f),p({action:"decline"}))})})}return new Promise(d=>{let u=!1,p=()=>{u||(u=!0,t.pendingElicitations.has(n)&&console.warn("[elicitation-handler] abort: cleaning up stale pendingElicitation for chatId",n),t.pendingElicitations.delete(n),d({action:"decline"}))};i.signal.addEventListener("abort",p,{once:!0});function y(m){if(u)return;u=!0,i.signal.removeEventListener("abort",p);let w=m.trim();if(w===":cancel"){d({action:"cancel"});return}if(w===""&&s.allowSkip){d({action:"skip"});return}if(c==="number"){if(w===""&&!s.allowSkip){if(u=!1,e.telegram.sendMessage(n,"\u274C Please enter a number.").catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}let k=Number(w);if(!isFinite(k)){if(u=!1,e.telegram.sendMessage(n,"\u274C Please enter a valid number.").catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}if(s.min!==void 0&&k<s.min){if(u=!1,e.telegram.sendMessage(n,`\u274C Value must be \u2265 ${s.min}.`).catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}if(s.max!==void 0&&k>s.max){if(u=!1,e.telegram.sendMessage(n,`\u274C Value must be \u2264 ${s.max}.`).catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}d({action:"accept",content:{value:k}});return}if(c==="multi_choice"){let k=s.choices??[],S=w.split(",").map(g=>g.trim()),h=[];for(let g of S){let b=parseInt(g,10);if(!Number.isInteger(b)||String(b)!==g||b<1||b>k.length){if(u=!1,e.telegram.sendMessage(n,`\u274C Invalid selection. Enter comma-separated numbers between 1 and ${k.length}.`).catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}h.push(k[b-1])}d({action:"accept",content:{value:h}});return}if(w===""&&!s.allowSkip){if(u=!1,e.telegram.sendMessage(n,"\u274C Please enter a response (or type :cancel to skip).").catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}d({action:"accept",content:{value:w}})}t.pendingElicitations.set(n,y);let f=l;if(c==="multi_choice"){let w=(s.choices??[]).map((k,S)=>`${S+1}. ${Xe(k)}`).join(`
1687
+ ${Xe(a)}`),c==="confirm"||c==="choice"){let d=$m(),u;return c==="confirm"?u=[[wn.button.callback("\u2705 Yes",bn(d,1)),wn.button.callback("\u274C No",bn(d,0))]]:u=(s.choices??[]).slice(0,20).map((f,m)=>[wn.button.callback(jm(f),bn(d,m))]),new Promise(p=>{let y=!1,f=()=>{y||(y=!0,r.delete(d),p({action:"decline"}))};i.signal.addEventListener("abort",f,{once:!0}),r.set(d,m=>{if(!y)if(y=!0,r.delete(d),i.signal.removeEventListener("abort",f),c==="confirm")p({action:"accept",content:{value:m===1}});else{let k=(s.choices??[])[m];p(k===void 0?{action:"decline"}:{action:"accept",content:{value:k}})}}),e.telegram.sendMessage(n,l,{parse_mode:"MarkdownV2",reply_markup:wn.inlineKeyboard(u).reply_markup}).catch(()=>{y||(y=!0,r.delete(d),i.signal.removeEventListener("abort",f),p({action:"decline"}))})})}return new Promise(d=>{let u=!1,p=()=>{u||(u=!0,t.pendingElicitations.has(n)&&console.warn("[elicitation-handler] abort: cleaning up stale pendingElicitation for chatId",n),t.pendingElicitations.delete(n),d({action:"decline"}))};i.signal.addEventListener("abort",p,{once:!0});function y(m){if(u)return;u=!0,i.signal.removeEventListener("abort",p);let w=m.trim();if(w===":cancel"){d({action:"cancel"});return}if(w===""&&s.allowSkip){d({action:"skip"});return}if(c==="number"){if(w===""&&!s.allowSkip){if(u=!1,e.telegram.sendMessage(n,"\u274C Please enter a number.").catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}let k=Number(w);if(!isFinite(k)){if(u=!1,e.telegram.sendMessage(n,"\u274C Please enter a valid number.").catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}if(s.min!==void 0&&k<s.min){if(u=!1,e.telegram.sendMessage(n,`\u274C Value must be \u2265 ${s.min}.`).catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}if(s.max!==void 0&&k>s.max){if(u=!1,e.telegram.sendMessage(n,`\u274C Value must be \u2264 ${s.max}.`).catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}d({action:"accept",content:{value:k}});return}if(c==="multi_choice"){let k=s.choices??[],S=w.split(",").map(g=>g.trim()),h=[];for(let g of S){let b=parseInt(g,10);if(!Number.isInteger(b)||String(b)!==g||b<1||b>k.length){if(u=!1,e.telegram.sendMessage(n,`\u274C Invalid selection. Enter comma-separated numbers between 1 and ${k.length}.`).catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}h.push(k[b-1])}d({action:"accept",content:{value:h}});return}if(w===""&&!s.allowSkip){if(u=!1,e.telegram.sendMessage(n,"\u274C Please enter a response (or type :cancel to skip).").catch(()=>{}),i.signal.aborted)return;t.pendingElicitations.set(n,y),i.signal.addEventListener("abort",p,{once:!0});return}d({action:"accept",content:{value:w}})}t.pendingElicitations.set(n,y);let f=l;if(c==="multi_choice"){let w=(s.choices??[]).map((k,S)=>`${S+1}. ${Xe(k)}`).join(`
1688
1688
  `);f+=`
1689
1689
 
1690
1690
  ${w}
@@ -1695,4 +1695,4 @@ Enter a number${m}`}s.allowSkip?f+=`
1695
1695
 
1696
1696
  _(Enter empty to skip, or :cancel to cancel)_`:f+=`
1697
1697
 
1698
- _(Type :cancel to cancel)_`,e.telegram.sendMessage(n,f,{parse_mode:"MarkdownV2"}).catch(()=>{u||(u=!0,i.signal.removeEventListener("abort",p),console.warn("[elicitation-handler] sendMessage failed; declining elicitation for chatId",n),t.pendingElicitations.delete(n),d({action:"decline"}))})})}}var kn=class{bot;sessionManager;options;running=!1;registeredCommandChats=new Set;messageHandler;constructor(e){this.options=e,this.bot=new Um(e.botToken),this.sessionManager=new Ye(e),this.messageHandler=new yn(this.bot,this.sessionManager,this.registeredCommandChats,this.log.bind(this)),this.setupHandlers()}setupHandlers(){this.bot.use(Nn(this.options.allowedChatIds,this.log.bind(this))),this.bot.command("start",n=>Rr(n)),this.bot.command("help",n=>Pr(n,this.sessionManager)),this.bot.command("clear",async n=>{let r=n.chat?.id;if(!r){await n.reply(U("Could not identify chat"));return}(await this.sessionManager.getSession(r)).state!=="idle"?(this.messageHandler.enqueueClear(r,n),await n.reply("Clear queued.")):await Cr(n,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}),this.bot.command("compact",n=>aa(n,this.sessionManager,this.log.bind(this))),this.bot.command("model",n=>Mr(n,this.sessionManager,this.log.bind(this))),this.bot.command(["cd","cwd"],n=>ca(n,this.sessionManager,this.log.bind(this))),this.bot.on("text",n=>this.messageHandler.handle(n)),this.bot.on("photo",n=>this.messageHandler.handlePhoto(n));let e=new RegExp(`^${Ra(hn)}`);this.bot.action(e,n=>va(n,{log:this.log.bind(this)})),this.bot.catch((n,r)=>{this.log("Bot error:",n),r.reply(U("An unexpected error occurred. Please try again.")).catch(o=>this.log("Failed to send error message:",o))})}async start(){if(this.running)throw new Error("Bot is already running");this.log("Loading sessions..."),await this.sessionManager.loadSessions();let e=[...this.options.allowedChatIds];if(e.length>0){let r=e[0],o=new RegExp(`^${Ra(Le)}`);Bt.install(Aa(this.messageHandler,this.bot,r)),this.bot.action(o,async s=>{await s.answerCbQuery().catch(()=>{})})}this.log("Starting bot..."),await this.bot.launch(),this.log("Registering bot commands..."),await this.bot.telegram.setMyCommands([{command:"start",description:"Show welcome and command list"},{command:"help",description:"Show this command list"},{command:"clear",description:"Clear conversation history"},{command:"compact",description:"Compact conversation history"},{command:"model",description:"Switch Claude model (opus/sonnet/haiku)"}]),this.running=!0,this.log("Bot started successfully");let n=async r=>{this.log(`Received ${r}, shutting down...`),await this.stop(),process.exit(0)};process.once("SIGINT",()=>n("SIGINT")),process.once("SIGTERM",()=>n("SIGTERM"))}async stop(){if(this.running){this.log("Stopping bot..."),this.running=!1,this.log("Uninstalling elicitation handler..."),Bt.uninstall(),this.log("Closing sessions..."),await this.sessionManager.closeAll(),this.log("Stopping bot polling...");try{this.bot.stop()}catch(e){this.log("Error stopping bot (may not have been started):",e)}this.log("Bot stopped")}}getStats(){return{running:this.running,activeSessions:this.sessionManager.getSessionCount(),totalChats:this.sessionManager.getChatCount()}}async handleStart(e){return Rr(e)}async handleHelp(e){return Pr(e,this.sessionManager)}async handleClear(e){let n=e.chat?.id;if(!n){await e.reply(U("Could not identify chat"));return}if((await this.sessionManager.getSession(n)).state!=="idle")this.messageHandler.enqueueClear(n,e),await e.reply("Clear queued.");else return Cr(e,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}async handleMessage(e){return this.messageHandler.handle(e)}async handlePhoto(e){return this.messageHandler.handlePhoto(e)}async handleModelSwitch(e){return Mr(e,this.sessionManager,this.log.bind(this))}log(...e){this.options.verbose&&console.log("[TelegramBot]",...e)}};function Ra(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{Fe as AgentSession,ae as OpenAICompatibleProvider,Ye as SessionManager,O as SubagentManager,kn as TelegramBot,ea as createCanUseToolHook,Qn as openaiCompatibleProvider,le as providerForModel,sn as resolveProvider};
1698
+ _(Type :cancel to cancel)_`,e.telegram.sendMessage(n,f,{parse_mode:"MarkdownV2"}).catch(()=>{u||(u=!0,i.signal.removeEventListener("abort",p),console.warn("[elicitation-handler] sendMessage failed; declining elicitation for chatId",n),t.pendingElicitations.delete(n),d({action:"decline"}))})})}}var kn=class{bot;sessionManager;options;running=!1;registeredCommandChats=new Set;messageHandler;constructor(e){this.options=e,this.bot=new Hm(e.botToken),this.sessionManager=new Ye(e),this.messageHandler=new yn(this.bot,this.sessionManager,this.registeredCommandChats,this.log.bind(this)),this.setupHandlers()}setupHandlers(){this.bot.use(Nn(this.options.allowedChatIds,this.log.bind(this))),this.bot.command("start",n=>Rr(n)),this.bot.command("help",n=>Pr(n,this.sessionManager)),this.bot.command("clear",async n=>{let r=n.chat?.id;if(!r){await n.reply(U("Could not identify chat"));return}(await this.sessionManager.getSession(r)).state!=="idle"?(this.messageHandler.enqueueClear(r,n),await n.reply("Clear queued.")):await Cr(n,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}),this.bot.command("compact",n=>aa(n,this.sessionManager,this.log.bind(this))),this.bot.command("model",n=>Mr(n,this.sessionManager,this.log.bind(this))),this.bot.command(["cd","cwd"],n=>ca(n,this.sessionManager,this.log.bind(this))),this.bot.on("text",n=>this.messageHandler.handle(n)),this.bot.on("photo",n=>this.messageHandler.handlePhoto(n));let e=new RegExp(`^${Ra(hn)}`);this.bot.action(e,n=>va(n,{log:this.log.bind(this)})),this.bot.catch((n,r)=>{this.log("Bot error:",n),r.reply(U("An unexpected error occurred. Please try again.")).catch(o=>this.log("Failed to send error message:",o))})}async start(){if(this.running)throw new Error("Bot is already running");this.log("Loading sessions..."),await this.sessionManager.loadSessions();let e=[...this.options.allowedChatIds];if(e.length>0){let r=e[0],o=new RegExp(`^${Ra(Le)}`);Bt.install(Aa(this.messageHandler,this.bot,r)),this.bot.action(o,async s=>{await s.answerCbQuery().catch(()=>{})})}this.log("Starting bot..."),await this.bot.launch(),this.log("Registering bot commands..."),await this.bot.telegram.setMyCommands([{command:"start",description:"Show welcome and command list"},{command:"help",description:"Show this command list"},{command:"clear",description:"Clear conversation history"},{command:"compact",description:"Compact conversation history"},{command:"model",description:"Switch Claude model (opus/sonnet/haiku)"}]),this.running=!0,this.log("Bot started successfully");let n=async r=>{this.log(`Received ${r}, shutting down...`),await this.stop(),process.exit(0)};process.once("SIGINT",()=>n("SIGINT")),process.once("SIGTERM",()=>n("SIGTERM"))}async stop(){if(this.running){this.log("Stopping bot..."),this.running=!1,this.log("Uninstalling elicitation handler..."),Bt.uninstall(),this.log("Closing sessions..."),await this.sessionManager.closeAll(),this.log("Stopping bot polling...");try{this.bot.stop()}catch(e){this.log("Error stopping bot (may not have been started):",e)}this.log("Bot stopped")}}getStats(){return{running:this.running,activeSessions:this.sessionManager.getSessionCount(),totalChats:this.sessionManager.getChatCount()}}async handleStart(e){return Rr(e)}async handleHelp(e){return Pr(e,this.sessionManager)}async handleClear(e){let n=e.chat?.id;if(!n){await e.reply(U("Could not identify chat"));return}if((await this.sessionManager.getSession(n)).state!=="idle")this.messageHandler.enqueueClear(n,e),await e.reply("Clear queued.");else return Cr(e,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}async handleMessage(e){return this.messageHandler.handle(e)}async handlePhoto(e){return this.messageHandler.handlePhoto(e)}async handleModelSwitch(e){return Mr(e,this.sessionManager,this.log.bind(this))}log(...e){this.options.verbose&&console.log("[TelegramBot]",...e)}};function Ra(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{Fe as AgentSession,ae as OpenAICompatibleProvider,Ye as SessionManager,O as SubagentManager,kn as TelegramBot,ea as createCanUseToolHook,Qn as openaiCompatibleProvider,ce as providerForModel,sn as resolveProvider};