agent-afk 5.81.0 → 5.81.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var u2=Object.defineProperty;var x=(e,t)=>()=>(e&&(t=e(e=0)),t);var Bu=(e,t)=>{for(var n in t)u2(e,n,{get:t[n],enumerable:!0})};function gt(){let e=v.AFK_PLAIN_OUTPUT;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"}function Uu(e){return Yl.find(t=>t.name===e)}function bR(e){return Yl.filter(t=>!t.required||e!==void 0&&t.category!==e?!1:process.env[t.name]===void 0||process.env[t.name]==="")}function Pb(e){return process.env[e]!==void 0}var Yl,v,G=x(()=>{"use strict";Yl=[{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_COMPACT_SHRINK_FRACTION",description:"Context-fullness fraction (0\u20131, exclusive) at/above which /compact and auto-compaction relax the keep-window so a short-but-full session (few turns, huge tool exchanges) can still be summarized instead of no-oping on turn count. Default 0.7 (see shared/compaction.ts DEFAULT_COMPACT_SHRINK_THRESHOLD).",type:"number",required:!1,example:"0.8",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_DIAGNOSE_BASELINE",description:"Kill switch for /diagnose reproducer baseline execution. When set to '0', the /diagnose skill skips executing the detected reproducer command for a ground-truth baseline; default enabled (runs). Set to '0' to disable.",type:"boolean",required:!1,default:"1",example:"0",category:"debug"},{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_DISABLE_BASH_INTERPRETER_GUARD",description:"Skip ONLY the bash interpreter-eval denylist (python -c, node -e, sh -c, ...) when set to 1, leaving the rest of path-approval intact. Applies on interactive surfaces (REPL/Telegram), where the denylist is active but your workflow legitimately runs interpreter one-liners. The restricted-root substring check is unaffected. Default: denylist active on interactive surfaces; headless already fails open (opt in with AFK_FORCE_BASH_INTERPRETER_GUARD=1). To disable all of path-approval + bash restriction instead, use AFK_DISABLE_PATH_APPROVAL=1.",type:"boolean",required:!1,default:"0",example:"1",category:"process"},{name:"AFK_DISABLE_PATH_APPROVAL",description:"Skip the path-approval + bash-restriction hooks entirely when set to 1. Use for headless flows that need wide-open file access (CI scripts, batch jobs). Default: hooks enabled. Note: on headless surfaces (afk chat, daemon) no grant manager is wired, so the interpreter denylist (python -c, node -e, sh -c, ...) fails OPEN by default \u2014 opt headless flows into it with AFK_FORCE_BASH_INTERPRETER_GUARD=1, or set this var to 1 to disable all of path-approval.",type:"boolean",required:!1,default:"0",example:"1",category:"process"},{name:"AFK_FORCE_BASH_INTERPRETER_GUARD",description:"Apply the bash interpreter-eval denylist (python -c, node -e, sh -c, ...) even on headless surfaces (afk chat, daemon) where no grant manager is wired. By default the denylist fires only on interactive surfaces (REPL/Telegram), failing open on headless so legitimate automation is not hard-blocked with no recourse. Set to 1 to opt headless flows back into the guard. Overridden by AFK_DISABLE_BASH_INTERPRETER_GUARD=1. Default: off (headless fails open).",type:"boolean",required:!1,default:"0",example:"1",category:"process"},{name:"AFK_EFFORT",description:"Effort hint guiding adaptive-thinking depth, forwarded as Anthropic output_config.effort (model-gated; ignored where unsupported). Accepts low | medium | high | xhigh | max.",type:"string",required:!1,example:"medium",category:"model"},{name:"AFK_MAX_BUDGET_USD",description:"Cumulative USD budget ceiling for the session. Aborts the turn when the running cost crosses 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:"Deprecated and inert: not read by the generation path. Use AFK_MAX_OUTPUT_TOKENS (or --max-output-tokens) to cap per-response output tokens; falls back to the model output ceiling when unset.",type:"number",required:!1,default:"4096",example:"8192",category:"model"},{name:"AFK_MAX_TOOL_USE_ITERATIONS",description:"Opt-in ceiling on tool-use rounds per turn for TOP-LEVEL (non-subagent) sessions, on both providers. Mirrors the maxToolUseIterations config key / max_tool_use_iterations tool param. Unset, non-numeric, or <=0 means unlimited (the default \u2014 zero behavior change): a top-level turn ends only when the model stops calling tools, the abort signal fires, the provider errors, or the dollar budget trips. A positive integer N makes top-level turns wind down gracefully after N tool rounds (one tools-stripped final round). An explicit config/CLI value wins over this env default. Does NOT affect subagent forks \u2014 they keep their own non-zero anti-hang default (SUBAGENT_DEFAULT_MAX_TOOL_USE_ITERATIONS) regardless of this var.",type:"number",required:!1,default:"0",example:"150",category:"model"},{name:"AFK_MEMORY_EVIDENCE_GATE",description:'Opt-in (set to 1) evidence gate for durable memory writes. When enabled, a codebase fact (memory_update category "convention") stored without an `evidence` citation is recalled as [unverified], and memory_search results carry a verification verdict. User preferences and agent reflections are never gated. Default off \u2014 memory behaves identically to legacy when unset.',type:"boolean",required:!1,example:"1",category:"misc"},{name:"AFK_MICROCOMPACT_KEEP_LAST",description:"Number of the most-recent tool_result blocks that tool-result microcompaction keeps intact regardless of size, so the agent does not lose the tool output it is actively reasoning over. Older results are the safe ones to trim. Default 4 (see shared/compaction.ts DEFAULT_MICROCOMPACT_KEEP_LAST). Values <= 0 protect nothing.",type:"number",required:!1,default:"4",example:"3",category:"model"},{name:"AFK_MICROCOMPACT_TOOL_RESULT_BYTES",description:"Byte threshold (tool_result content length) at/above which a tool_result block becomes a microcompaction candidate. When /compact and auto-compaction would otherwise no-op on a short-but-full session, microcompaction clears large/old tool_result CONTENT in place (largest first) \u2014 replacing it with a short placeholder, never removing the block \u2014 to reclaim context deterministically (no LLM call). Blocks below this size are left intact. Default 2048 (see shared/compaction.ts DEFAULT_MICROCOMPACT_TOOL_RESULT_BYTES).",type:"number",required:!1,default:"2048",example:"4096",category:"model"},{name:"AFK_MODEL",description:"Default model for agent turns. Accepts slot names (local, small, medium, large), fixed-identity aliases (opus, sonnet, haiku, fable), or full model IDs. Migration: AFK_MODEL=sonnet now pins the fixed Sonnet identity rather than following a rebound medium tier.",type:"string",required:!1,default:"medium",example:"claude-opus-5",category:"model"},{name:"AFK_MODEL_TTFB_TIMEOUT_MS",description:"Per-request time-to-first-token timeout (ms) for the anthropic-direct streaming loop. Bounds how long a single model call may stall BEFORE its first streamed CONTENT token (a text/thinking delta or tool_use); the connection-level message_start and keep-alive pings do NOT count. Once a content token streams, the timer is cleared and the rest of the response runs unbounded, so a normal slow call (below the bound) and any actively-streaming extended-thinking response are never aborted. NOTE: a request whose FIRST token takes longer than the bound \u2014 e.g. a very large opus_1m prefill \u2014 is aborted, retried once, then surfaces as an error (raise this value or set 0 for such workloads); this trims the degrading-call tail instead of a silent ~10-min hang on the SDK default. Default 180000 (180s \u2248 2\xD7 the measured p99 ttfb). Set to 0 to disable.",type:"number",required:!1,default:"180000",example:"120000",category:"model"},{name:"AFK_SUBAGENT_TIMEOUT_MS",description:"Foreground forked-subagent wall-clock budget in ms; 0 disables the cap; explicit per-fork config.timeoutMs and the 60-min background mode still win. Bounds how long a single forked child turn may run before `withTimeout` aborts its controller (cascading through the AbortGraph to descendants) and the parent receives a legible TimeoutError tool_result instead of hanging. Default 2700000 (45 min \u2248 headroom over the longest healthy review/research agent observed in production). Unset, empty, or unparseable input falls back to the default; a negative value is treated as invalid and also falls back. Set to 0 to opt a whole session back into unbounded child turns. Does NOT affect the background dispatch budget (SUBAGENT_BACKGROUND_TIMEOUT_MS) or a per-fork config.timeoutMs \u2014 both take precedence.",type:"number",required:!1,default:"2700000",example:"3600000",category:"model"},{name:"AFK_SUBAGENT_IDLE_TIMEOUT_MS",description:"Forked-subagent progress-aware idle-watchdog window in ms; 0 disables the watchdog; an explicit per-fork config.idleTimeoutMs still wins. Fires when a forked child produces no observable output event for this window, aborting the same controller the wall-clock timeout targets so partial output is preserved and the run classifies as a failure. This is distinct from AFK_SUBAGENT_TIMEOUT_MS, the blunt wall-clock that bounds total turn time: the idle watchdog is the tighter first-to-fire bound and never fires while the stream is legitimately parked on a provider-communicated backoff (OAuth pause, or a rate-limit event carrying a retry-after), extending the deadline for the pause window instead. Default 480000 (8 min) clears the worst-case transient-429 backoff the watchdog is currently blind to (about 363s) with roughly 2 min of margin, while staying materially tighter than the 45-min wall-clock. Unset, empty, or unparseable input falls back to the default; a negative value is treated as invalid and also falls back. Set to 0 to disable the idle watchdog for a whole session (the wall-clock still applies). v1 applies to forked sub-agent turns only, not top-level or daemon sessions.",type:"number",required:!1,default:"480000",example:"300000",category:"model"},{name:"AFK_VISION_MODELS",description:'Comma-separated override for image (vision) capability detection on the openai-compatible provider. Each token force-enables a model id by exact or substring match (e.g. "qwen2.5-vl" matches a local VL id); prefix a token with "!" to force-disable. Use to send images to a local vision-language model AFK does not recognise by name, or to blacklist a mis-detected id. Built-in detection already covers gpt-4o/4.1/5.x, o1/o3/o4-mini, Claude, and common VL families.',type:"string",required:!1,example:"qwen2.5-vl,!gpt-4o-mini",category:"model"},{name:"AFK_MODEL_LOCAL",description:'Bind the "local" capability tier (cheapest/fastest, user-configured) to a model id. Overrides afk.config.json models.local. Point at a local Ollama, LM Studio, or any OpenAI-compatible shim.',type:"string",required:!1,example:"llama3.2:3b",category:"model"},{name:"AFK_MODEL_LOCAL_API_KEY",description:'Per-slot API key for the "local" tier. Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_LOCAL_BASE_URL",description:'Per-slot endpoint base URL for the "local" tier. Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:11434/v1",category:"model"},{name:"AFK_MODEL_LARGE",description:'Bind the "large" capability tier (most capable) to a model id/alias. Overrides afk.config.json models.large.',type:"string",required:!1,example:"claude-opus-5",category:"model"},{name:"AFK_MODEL_LARGE_API_KEY",description:'Per-slot API key for the "large" tier (Stage 2). Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_LARGE_BASE_URL",description:'Per-slot endpoint base URL for the "large" tier (Stage 2). Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:8080/v1",category:"model"},{name:"AFK_MODEL_MEDIUM",description:'Bind the "medium" capability tier (general-use) to a model id/alias. Overrides afk.config.json models.medium.',type:"string",required:!1,example:"claude-sonnet-5",category:"model"},{name:"AFK_MODEL_MEDIUM_API_KEY",description:'Per-slot API key for the "medium" tier (Stage 2). Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_MEDIUM_BASE_URL",description:'Per-slot endpoint base URL for the "medium" tier (Stage 2). Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:8080/v1",category:"model"},{name:"AFK_MODEL_SMALL",description:'Bind the "small" capability tier (cheap/fast) to a model id/alias. Overrides afk.config.json models.small.',type:"string",required:!1,example:"gpt-4o-mini",category:"model"},{name:"AFK_MODEL_SMALL_API_KEY",description:'Per-slot API key for the "small" tier (Stage 2). Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_SMALL_BASE_URL",description:'Per-slot endpoint base URL for the "small" tier (Stage 2). Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:8080/v1",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_SUGGEST_ENABLED",description:"Enable the LLM-backed ghost-text suggestion tier in the interactive REPL. Set to 1/true/yes/on to activate. Off by default.",type:"boolean",required:!1,category:"model"},{name:"AFK_SUGGEST_GHOST",description:"Enable REPL ghost-text inline suggestions (Tier-1 history/dropdown + optional Tier-2 LLM). 1 = on (default), 0 = off. Set 0/false/off/no to disable all ghost text. Tier-2 LLM is separately gated by AFK_SUGGEST_ENABLED.",type:"boolean",required:!1,default:"1",example:"0",category:"model"},{name:"AFK_SUGGEST_MODEL",description:"Override the small model used for REPL ghost-text suggestions. Falls back to AFK_COMPACT_MODEL or haiku-class for anthropic, or the session model for other providers.",type:"string",required:!1,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 mode. Accepts adaptive | disabled | enabled:<N> | enabled:max. Defaults to the model-appropriate mode when unset (adaptive on current models).",type:"string",required:!1,default:"adaptive",example:"adaptive",category:"model"},{name:"AFK_THINKING_UI",description:"Default thinking-display mode for the interactive REPL: summary | live | digest | off. Display-only \u2014 controls how extended-thinking blocks render, never whether thinking runs (cost/latency unaffected). Overridden per-launch by --thinking-ui and mutable mid-session via /thinking. Precedence: --thinking-ui flag > this env > interactive.thinkingUi config > live. Invalid values are ignored.",type:"string",required:!1,default:"live",example:"digest",category:"misc"},{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 operator-overlay prompt. Highest-priority overlay (over afk.config.json and AFK.md). Appended on top of the framework base (prompts/system-prompt.md) under an "# Operator configuration" header \u2014 it augments, never replaces, the base.',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:"Fallback OpenAI API key for the openai-compatible provider, read after OPENAI_API_KEY. Legacy name from the removed @openai/codex-sdk integration \u2014 prefer OPENAI_API_KEY.",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_OPENAI_USE_RESPONSES",description:"Opt the OpenAI-compatible provider into the OpenAI Responses API instead of Chat Completions for API-key sessions. Truthy values: 1, true, yes, on. The ChatGPT-subscription OAuth path uses Responses automatically regardless of this flag.",type:"boolean",required:!1,example:"1",category:"model"},{name:"AFK_OPENAI_CHATGPT_OAUTH",description:"Opt into using ChatGPT-subscription OAuth credentials from ~/.codex/auth.json (auth_mode: chatgpt) as OpenAI provider auth. Off by default. READ-ONLY: AFK never refreshes these tokens \u2014 re-run `codex` when the access token expires. Routes requests over the Responses API to the private ChatGPT backend (chatgpt.com/backend-api).",type:"boolean",required:!1,example:"1",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:"EXA_API_KEY",description:"Exa (exa.ai) search API key, enabling web_scrape search mode. Free tier (20k requests/month) available at https://exa.ai. When unset, search mode returns an actionable error; markdown and raw modes are unaffected.",type:"string",required:!1,category:"auth",secret:!0},{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:"AFK_TELEGRAM_TAG_ONLY_CHAT_IDS",description:"Comma-separated list of Telegram chat IDs where the bot answers only when addressed (a reply to the bot, an @mention of the bot, or a text_mention resolving to the bot). Slash-commands are unaffected; chats not listed behave as usual. The afk.config.json telegram.tagOnlyChats block takes precedence. Requires Telegram privacy mode OFF (BotFather /setprivacy Disable) for non-addressed group messages to reach the bot.",type:"string",required:!1,example:"-100987654321,123456789",category:"telegram"},{name:"AFK_TELEGRAM_PRIMARY_CHAT_ID",description:"Default chat ID for outbound notifications (primary-mode routing). When unset, notifications go to the first private/DM chat in AFK_TELEGRAM_ALLOWED_CHAT_IDS. The afk.config.json telegram.notify block takes precedence.",type:"string",required:!1,example:"123456789",category:"telegram"},{name:"AFK_TELEGRAM_NOTIFY_MODE",description:"Outbound notification fan-out: primary (default \u2014 one chat), broadcast (every allowed chat), or custom (afk.config.json telegram.notify.targets). The afk.config.json telegram.notify.mode takes precedence.",type:"string",required:!1,example:"broadcast",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 'true' to log per-message details from the Telegram bot \u2014 chat IDs, message text, latency. (The code checks the literal string 'true'.)",type:"boolean",required:!1,example:"true",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 entire AFK state tier (sessions/, todos/, transcripts/, memory/, daemon/, etc.), not just one subdirectory. Must be an absolute path (not /). 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_COMPANION_PRIMER",description:'Opt-in: absolute path to a single companion-primer file. When set, its content is bounded (capped, fenced as <companion-primer>) and appended to the system prompt at session start for top-level sessions (chat/REPL/telegram/daemon), as lower-authority "reflections, not facts" context. Unset (default) = no-op. Only the one named file is ever read \u2014 never a directory or repo walk.',type:"string",required:!1,example:"/Users/me/Projects/afk-companion/PRIMER.md",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_DAEMON_HOST",description:"Bind address for the daemon control HTTP surface. Defaults to 127.0.0.1 (loopback only). The control surface is unauthenticated, so bind a non-loopback address such as 0.0.0.0 only on a trusted or firewalled network. Overridden by the --host flag.",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_BASE",description:"Override the base git ref for worktrees created with --worktree. By default AFK bases worktrees on the remote's default branch (e.g. origin/main), fetched fresh. Set this to pin a different ref, or to HEAD to base on the local checkout. Overridden per-session by --worktree-base.",type:"string",required:!1,example:"origin/main",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_ALLOW_PROJECT_MCP",description:"Opt-in to loading + spawning MCP servers declared in <cwd>/.mcp.json. Fail-closed: when unset (or 0), project-local servers are NOT spawned; set to a truthy value (1/true/yes/on) to load them. A project-local .mcp.json spawns arbitrary commands on session start, so it is off by default to prevent code execution when entering an untrusted repo (issue #571). Skipped servers are listed in a startup warning with the opt-in instruction.",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:"routing"},{name:"AFK_INTERNAL",description:'Tier gate. Set to exactly `1` to unlock \u2014 only the literal string "1" unlocks (other truthy values like "true"/"yes" leave the tier locked). When unlocked, skills tagged `audience: \'internal\'` (e.g. /audit-fit, harvest/distill plugins) become visible at end-user surfaces (slash-command list, --help, tab-complete, system-prompt skill manifest). Default unset = public tier \u2014 internal skills are hidden. Not an access-control boundary; it gates surfacing, not the underlying registry.',type:"boolean",required:!1,example:"1",category:"routing"},{name:"AFK_SHELL_PASSTHROUGH",description:"Enable the interactive REPL `!cmd` / `!&cmd` shell-passthrough feature. On by default. Set to 0, false, off, or no (case-insensitive) to disable, so inputs beginning with ! are sent to the model as literal text instead of being executed as shell commands. Equivalent to the --no-shell-passthrough flag.",type:"boolean",required:!1,default:"1",example:"0",category:"misc"},{name:"AFK_BG_AUTO_DELIVER",description:"Auto-deliver background subagent results into the model context on the next user turn (interactive REPL). On by default. Set to 0, false, off, or no (case-insensitive) to disable, restoring the manual /bgsub:join retrieval flow.",type:"boolean",required:!1,default:"1",example:"0",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_PLAIN_OUTPUT",description:"Force the interactive REPL to fully behave like a non-TTY surface for rendering purposes, even when stdout/stdin ARE a TTY: append-only plain-stdout output instead of the TerminalCompositor live overlay (both the persistent between-turn compositor AND the per-turn StreamRenderer overlay), AND the input surface downgrades to the simple non-TTY line reader instead of the fancy compositor-backed input box. Same code path already used for non-TTY surfaces (pipes, CI). Full opt-out escape hatch for tmux/SSH/multiplexer sessions where cursor-up redraws and DECSTBM scroll regions misbehave \u2014 trades the live overlay and fancy input UX for reliability. Opt-in \u2014 default TTY behavior (live overlay + fancy input) is unchanged unless this var is set. Truthy values: 1, true (case-insensitive).",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_GOBLIN_SPINNER",description:"Goblin-themed working spinner (olive frames + goblin verbs) while the agent runs tools. 1 = on (default), 0 = classic dim spinner.",type:"boolean",required:!1,example:"0",category:"misc"},{name:"AFK_TERM_TITLE",description:'Set the terminal/tab title (OSC 2) to reflect afk state \u2014 "afk \u2014 <cwd> \xB7 running" during a turn, "afk \u2014 <cwd>" when idle, cleared on exit. 1 = on (default when stdout is a TTY), 0 = leave the title alone. TTY-only.',type:"boolean",required:!1,example:"0",category:"misc"},{name:"AFK_NOTIFY",description:"Emit a desktop completion notification (OSC 9) on turn completion, for terminals that map OSC 9 to system notifications (iTerm2, kitty, WezTerm). Opt-in and off by default (intrusive). 1 = on. TTY-only.",type:"boolean",required:!1,example:"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_THEME",description:"TUI color palette for the interactive REPL and all CLI rendering: dark | light | auto. Display-only \u2014 swaps the semantic color palette, never behavior (cost/latency unaffected). auto detects from COLORFGBG and falls back to dark. Overridden per-launch by --theme and mutable mid-session via /theme. Precedence: --theme flag > this env > config theme > auto-detect > dark. Invalid values are ignored (dark).",type:"string",required:!1,default:"dark",example:"light",category:"misc"},{name:"COLORFGBG",description:'Terminal-set "foreground;background" color hint (e.g. "15;0"), read only for AFK_THEME=auto detection. The trailing field is the background color index; >= 7 is treated as a light background, otherwise dark. Not set by AFK \u2014 emitted by some terminals (rxvt, Konsole, iTerm2). Absent or unparseable => dark.',type:"string",required:!1,example:"15;0",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_DEBUG_COMPOSITOR",description:"Gate compositor phase-boundary traces to stderr; any truthy value enables.",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:"AFK_SESSION_LEDGER_DISABLED",description:"Disable the per-session durable event ledger (state/sessions/<id>/events.jsonl). Set to 1 to skip ledger writes; live cross-surface watching (e.g. the Telegram /watch command) will report no activity for sessions started while disabled.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AFK_RUN_RECEIPT_DISABLED",description:"Disable the post-session run receipt (state/receipts/<label>.json and .md). Set to 1 to skip receipt writes; the underlying witness trace is unaffected. Receipts are also implicitly off when AFK_TRACE_DISABLED=1 (no trace to summarize).",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) 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_BROWSER_HEADLESS",description:"Override the default headless mode for native browser-control tools. `1`/`true` forces headless; `0`/`false` forces headed. When unset the default is headless for daemon and subagent surfaces and headed for repl/interactive \u2014 so an operator can watch the agent work in REPL mode.",type:"boolean",required:!1,example:"1",category:"browser"},{name:"AFK_BROWSER_ALLOWED_DOMAINS",description:"Comma-separated allowlist of URL host globs. When set, browser_open and any navigation that targets a host outside the list returns status: blocked_by_policy. Unset means no allowlist (permissive). Patterns use simple `*` glob matching against the URL host. Combines with AFK_BROWSER_BLOCKED_DOMAINS \u2014 block wins.",type:"string",required:!1,example:"github.com,*.atlassian.net",category:"browser"},{name:"AFK_BROWSER_BLOCKED_DOMAINS",description:"Comma-separated blocklist of URL host globs. Browser navigation that matches any entry returns status: blocked_by_policy regardless of the allowlist.",type:"string",required:!1,example:"*.ads.example.com",category:"browser"},{name:"AFK_BROWSER_DOM_SNAPSHOTS",description:"Phase 2 opt-in: when set to 1, every browser_act writes a gzipped DOM snapshot sidecar under ~/.afk/state/witness/<sid>/browser/dom-snapshots/. Off by default because snapshots are large; useful for post-mortem analysis of failed actions.",type:"boolean",required:!1,example:"1",category:"browser"},{name:"AFK_BROWSER_BACKEND",description:"Select the browser provider backend. Phase 1 supports only `playwright`. Reserved for future `cdp` / `mcp` adapters. Unset defaults to `playwright`.",type:"string",required:!1,example:"playwright",category:"browser"},{name:"AFK_BROWSER_CONFIG",description:"Absolute path to an alternate browser config file. Overrides the default ~/.afk/config/browser.json lookup. Useful for per-project overrides in CI.",type:"string",required:!1,example:"/path/to/browser.json",category:"browser"},{name:"AFK_BROWSER_DEFAULT_PROFILE",description:"Name of the persistent session-vault profile the agent reuses for browser sessions. The context restores its login from (and saves it back to) ~/.afk/state/browser/<profile>/storageState.json, so a human runs `afk browser login --profile <name>` once and the agent reuses that authenticated session across unattended runs. Unset defaults to `default` (a fresh, empty profile \u2014 identical to pre-vault behavior). Allowed charset: [A-Za-z0-9_-], max 128 chars.",type:"string",required:!1,example:"work",category:"browser"},{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_READ_DENYLIST",description:"Colon-separated list of additional absolute paths the read_file/grep/glob/list_directory tools refuse to read. Built-in credential entries (~/.ssh, ~/.aws, ~/.afk/config, \u2026) always apply on top and cannot be removed.",type:"string",required:!1,example:"/Users/me/project/.env:/Users/me/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:"AFK_SESSION_ID",description:"Override the browser session ID used by the native browser-control tools. Defaults to 'default' for single-session use. Subagents inherit the parent's session by default. Set this when running multiple concurrent AFK processes that should each manage an isolated browser context.",type:"string",required:!1,default:"default",example:"session-abc123",category:"browser"},{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:"VISUAL",description:"Standard POSIX env var naming the user's preferred full-screen editor (with optional flags). Consulted FIRST by the /editor slash command (and its key chord) to compose a long prompt externally; takes precedence over EDITOR. No fallback editor is assumed \u2014 if neither VISUAL nor EDITOR is set, /editor prints a hint instead of guessing.",type:"string",required:!1,example:"nvim",category:"process"},{name:"EDITOR",description:"Standard POSIX env var naming the user's preferred editor (with optional flags). Consulted by the /editor slash command AFTER VISUAL, as the standard fallback. No default editor is assumed when both are unset \u2014 /editor prints a hint telling the user to set one.",type:"string",required:!1,example:"vim",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"},{name:"AFK_USER_CARD_MAX_ROWS",description:'Maximum number of visual rows emitted by renderUserCard before collapsing the remainder into a dim "\u2026(N lines collapsed)" summary row. Defaults to 24. Non-integer or non-positive values are silently ignored and the default applies.',type:"number",required:!1,example:"24",category:"misc"}],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_COMPACT_SHRINK_FRACTION(){return process.env.AFK_COMPACT_SHRINK_FRACTION},get AFK_COMPANION_PRIMER(){return process.env.AFK_COMPANION_PRIMER},get AFK_DEFAULT_SUBAGENT_MODEL(){return process.env.AFK_DEFAULT_SUBAGENT_MODEL},get AFK_DIAGNOSE_BASELINE(){return process.env.AFK_DIAGNOSE_BASELINE},get AFK_DISABLE_BASH_INTERPRETER_GUARD(){return process.env.AFK_DISABLE_BASH_INTERPRETER_GUARD},get AFK_DISABLE_PATH_APPROVAL(){return process.env.AFK_DISABLE_PATH_APPROVAL},get AFK_DISABLE_PROMPT_CACHE(){return process.env.AFK_DISABLE_PROMPT_CACHE},get AFK_EFFORT(){return process.env.AFK_EFFORT},get AFK_FORCE_BASH_INTERPRETER_GUARD(){return process.env.AFK_FORCE_BASH_INTERPRETER_GUARD},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_MAX_TOOL_USE_ITERATIONS(){return process.env.AFK_MAX_TOOL_USE_ITERATIONS},get AFK_MEMORY_EVIDENCE_GATE(){return process.env.AFK_MEMORY_EVIDENCE_GATE},get AFK_MICROCOMPACT_KEEP_LAST(){return process.env.AFK_MICROCOMPACT_KEEP_LAST},get AFK_MICROCOMPACT_TOOL_RESULT_BYTES(){return process.env.AFK_MICROCOMPACT_TOOL_RESULT_BYTES},get AFK_MODEL(){return process.env.AFK_MODEL},get AFK_MODEL_TTFB_TIMEOUT_MS(){return process.env.AFK_MODEL_TTFB_TIMEOUT_MS},get AFK_MODEL_LARGE(){return process.env.AFK_MODEL_LARGE},get AFK_MODEL_LARGE_API_KEY(){return process.env.AFK_MODEL_LARGE_API_KEY},get AFK_MODEL_LARGE_BASE_URL(){return process.env.AFK_MODEL_LARGE_BASE_URL},get AFK_MODEL_LOCAL(){return process.env.AFK_MODEL_LOCAL},get AFK_MODEL_LOCAL_API_KEY(){return process.env.AFK_MODEL_LOCAL_API_KEY},get AFK_MODEL_LOCAL_BASE_URL(){return process.env.AFK_MODEL_LOCAL_BASE_URL},get AFK_MODEL_MEDIUM(){return process.env.AFK_MODEL_MEDIUM},get AFK_MODEL_MEDIUM_API_KEY(){return process.env.AFK_MODEL_MEDIUM_API_KEY},get AFK_MODEL_MEDIUM_BASE_URL(){return process.env.AFK_MODEL_MEDIUM_BASE_URL},get AFK_MODEL_SMALL(){return process.env.AFK_MODEL_SMALL},get AFK_MODEL_SMALL_API_KEY(){return process.env.AFK_MODEL_SMALL_API_KEY},get AFK_MODEL_SMALL_BASE_URL(){return process.env.AFK_MODEL_SMALL_BASE_URL},get AFK_VISION_MODELS(){return process.env.AFK_VISION_MODELS},get AFK_PROMPT_CACHE_TTL(){return process.env.AFK_PROMPT_CACHE_TTL},get AFK_SUGGEST_ENABLED(){return process.env.AFK_SUGGEST_ENABLED},get AFK_SUGGEST_GHOST(){return process.env.AFK_SUGGEST_GHOST},get AFK_SUGGEST_MODEL(){return process.env.AFK_SUGGEST_MODEL},get AFK_SUBAGENT_TIMEOUT_MS(){return process.env.AFK_SUBAGENT_TIMEOUT_MS},get AFK_SUBAGENT_IDLE_TIMEOUT_MS(){return process.env.AFK_SUBAGENT_IDLE_TIMEOUT_MS},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_THINKING_UI(){return process.env.AFK_THINKING_UI},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_OPENAI_USE_RESPONSES(){return process.env.AFK_OPENAI_USE_RESPONSES},get AFK_OPENAI_CHATGPT_OAUTH(){return process.env.AFK_OPENAI_CHATGPT_OAUTH},get AFK_PROVIDER(){return process.env.AFK_PROVIDER},get EXA_API_KEY(){return process.env.EXA_API_KEY},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 AFK_TELEGRAM_TAG_ONLY_CHAT_IDS(){return process.env.AFK_TELEGRAM_TAG_ONLY_CHAT_IDS},get AFK_TELEGRAM_PRIMARY_CHAT_ID(){return process.env.AFK_TELEGRAM_PRIMARY_CHAT_ID},get AFK_TELEGRAM_NOTIFY_MODE(){return process.env.AFK_TELEGRAM_NOTIFY_MODE},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 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_DAEMON_HOST(){return process.env.AFK_DAEMON_HOST},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_BASE(){return process.env.AFK_WORKTREE_BASE},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_ALLOW_PROJECT_MCP(){return process.env.AFK_ALLOW_PROJECT_MCP},get AFK_AUTO_ROUTING(){return process.env.AFK_AUTO_ROUTING},get AFK_INTERNAL(){return process.env.AFK_INTERNAL},get AFK_SHELL_PASSTHROUGH(){return process.env.AFK_SHELL_PASSTHROUGH},get AFK_BG_AUTO_DELIVER(){return process.env.AFK_BG_AUTO_DELIVER},get AFK_BANNER_PLAIN(){return process.env.AFK_BANNER_PLAIN},get AFK_PLAIN_OUTPUT(){return process.env.AFK_PLAIN_OUTPUT},get AFK_SPINNER_TIPS(){return process.env.AFK_SPINNER_TIPS},get AFK_GOBLIN_SPINNER(){return process.env.AFK_GOBLIN_SPINNER},get AFK_TERM_TITLE(){return process.env.AFK_TERM_TITLE},get AFK_NOTIFY(){return process.env.AFK_NOTIFY},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_THEME(){return process.env.AFK_THEME},get COLORFGBG(){return process.env.COLORFGBG},get AFK_DEBUG(){return process.env.AFK_DEBUG},get AFK_DEBUG_CLIPBOARD(){return process.env.AFK_DEBUG_CLIPBOARD},get AFK_DEBUG_COMPOSITOR(){return process.env.AFK_DEBUG_COMPOSITOR},get AFK_TRACE_DISABLED(){return process.env.AFK_TRACE_DISABLED},get AFK_SESSION_LEDGER_DISABLED(){return process.env.AFK_SESSION_LEDGER_DISABLED},get AFK_RUN_RECEIPT_DISABLED(){return process.env.AFK_RUN_RECEIPT_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_SESSION_ID(){return process.env.AFK_SESSION_ID},get AFK_BROWSER_HEADLESS(){return process.env.AFK_BROWSER_HEADLESS},get AFK_BROWSER_ALLOWED_DOMAINS(){return process.env.AFK_BROWSER_ALLOWED_DOMAINS},get AFK_BROWSER_BLOCKED_DOMAINS(){return process.env.AFK_BROWSER_BLOCKED_DOMAINS},get AFK_BROWSER_DOM_SNAPSHOTS(){return process.env.AFK_BROWSER_DOM_SNAPSHOTS},get AFK_BROWSER_BACKEND(){return process.env.AFK_BROWSER_BACKEND},get AFK_BROWSER_CONFIG(){return process.env.AFK_BROWSER_CONFIG},get AFK_BROWSER_DEFAULT_PROFILE(){return process.env.AFK_BROWSER_DEFAULT_PROFILE},get AFK_WRITE_DENYLIST(){return process.env.AFK_WRITE_DENYLIST},get AFK_READ_DENYLIST(){return process.env.AFK_READ_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 VISUAL(){return process.env.VISUAL},get EDITOR(){return process.env.EDITOR},get AFK_DIFF_LINES(){return process.env.AFK_DIFF_LINES},get AFK_SHELL_WRAPPER(){return process.env.AFK_SHELL_WRAPPER},get AFK_USER_CARD_MAX_ROWS(){return process.env.AFK_USER_CARD_MAX_ROWS}};(function(){for(let t of Yl){if(!t.secret)continue;let n=Object.getOwnPropertyDescriptor(v,t.name);n&&Object.defineProperty(v,t.name,{...n,enumerable:!1})}})()});import{existsSync as wR,mkdirSync as p2,renameSync as m2,cpSync as f2,rmSync as g2}from"fs";import{join as Z,dirname as Mb,basename as h2,isAbsolute as kR}from"path";import{homedir as Ob}from"os";import{fileURLToPath as y2}from"url";function Ce(){let e=v.AFK_HOME;if(e!==void 0&&e!==""){if(!kR(e)||e==="/")throw new Error(`AFK_HOME must be an absolute path that is not /, got: ${e}`);return e}return Z(Ob(),".afk")}function _t(){return Z(Ce(),"agent-framework")}function Bn(){return Z(_t(),"forge-telemetry.jsonl")}function TR(){return Z(_t(),"routing-decisions.jsonl")}function ER(){return Z(_t(),"briefs")}function xR(){return Z(_t(),"facets")}function Vl(){return Z(Ce(),"skills")}function He(){return Z(Ce(),"plugins")}function RR(e=process.cwd()){return Z(e,".afk")}function ju(e=process.cwd()){return Z(RR(e),"skills")}function Hu(e=process.cwd()){return Z(RR(e),"plugins")}function Wu(e=process.cwd()){return Z(e,".afk","plans")}function ge(){return Z(He(),".index.json")}function $b(){return Z(bn(),"schedules.json")}function vr(){return Z(He(),"cache")}function Xl(e){return Z(vr(),e)}function gs(){let e=y2(import.meta.url),t=Mb(e);return Z(t,"bundled-plugins")}function bn(){return Z(Ce(),"config")}function Se(){let e=v.AFK_STATE_DIR;if(e!==void 0&&e!==""){if(!kR(e)||e==="/")throw new Error(`AFK_STATE_DIR must be an absolute path that is not /, got: ${e}`);return e}return Z(Ce(),"state")}function hs(){return Z(Ce(),"cache")}function Vr(){return Z(Ce(),"logs")}function lt(){return Z(Se(),"sessions")}function Ku(){return Z(Se(),"presence")}function Db(){return Z(Se(),"todos")}function Ql(){return Z(Se(),"transcripts")}function Gu(){return Z(Se(),"memory")}function ht(){return Z(Se(),"queue")}function qu(){return Z(Se(),"session-grants.jsonl")}function Zl(){return Z(bn(),"permissions.json")}function AR(){return Z(Ce(),"farms")}function Fb(e){return Z(AR(),e)}function zu(e){if(!b2.test(e))throw new Error(`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(e)}`)}function Xo(e){return zu(e),Z(Se(),"witness",e)}function CR(e){return!e||e.startsWith("in-memory:")?null:h2(Mb(e))}function Lb(){return Z(Se(),"receipts")}function Ju(e="default"){return Z(Se(),"daemon",`agent-afk@${e}`)}function _R(){return Z(Se(),"worktree-sweep.lock")}function kt(){return Z(bn(),"afk.env")}function Bt(){return Z(bn(),"afk.config.json")}function Nb(){return Z(bn(),"settings.json")}function IR(e=process.cwd()){return Z(e,".afk","settings.json")}function PR(){return Z(Ob(),".afk.env")}function Yu(){return Z(Ob(),".afk.config.json")}function w2(){return Z(Ce(),"sessions")}function S2(){return Z(Ce(),"todos")}function v2(){return Z(Ce(),"transcripts")}function Bb(e,t){if(e!==t&&wR(e)&&!wR(t))try{p2(Mb(t),{recursive:!0});try{m2(e,t)}catch(n){if(n.code==="EXDEV")try{f2(e,t,{recursive:!0}),g2(e,{recursive:!0,force:!0})}catch(r){process.stderr.write(`[afk] migrateDirOnce: EXDEV fallback failed for ${e} \u2192 ${t}: ${String(r)}
3
- `)}}}catch{}}function MR(){Bb(w2(),lt())}function OR(){Bb(S2(),Db())}function $R(){Bb(v2(),Ql())}function Ub(){return Z(Se(),"repl-history.jsonl")}function T2(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid jobId: must be a non-empty string");if(e.length>SR)throw new Error(`Invalid jobId: exceeds ${SR} chars`);if(!k2.test(e))throw new Error(`Invalid jobId: ${JSON.stringify(e)} contains characters outside [A-Za-z0-9_-]`)}function ec(){return Z(Se(),"bg")}function Qo(e){return T2(e),Z(ec(),e)}function Vu(e){return Z(Qo(e),"events.jsonl")}function jb(e){return Z(Qo(e),"meta.json")}function tc(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid browser profile: must be a non-empty string");if(e.length>vR)throw new Error(`Invalid browser profile: exceeds ${vR} chars`);if(!E2.test(e))throw new Error(`Invalid browser profile: ${JSON.stringify(e)} contains characters outside [A-Za-z0-9_-]`)}function Hb(){return Z(Se(),"browser")}function Wb(e){return tc(e),Z(Hb(),e)}function nc(e){return Z(Wb(e),"storageState.json")}function rc(e){return typeof e=="string"&&e.length>0&&e.length<=R2&&x2.test(e)}function oc(e){if(!rc(e))throw new Error(`Invalid session id for ledger path: ${JSON.stringify(e)}`);return Z(lt(),e)}function Xu(e){return Z(oc(e),"events.jsonl")}function Kb(e){return Z(oc(e),"session.key")}function ic(){return Z(Se(),"mcp","server-status.json")}var b2,k2,SR,E2,vR,x2,R2,q=x(()=>{"use strict";G();b2=/^[a-zA-Z0-9_-]+$/;k2=/^[A-Za-z0-9_-]+$/,SR=128;E2=/^[A-Za-z0-9_-]+$/,vR=128;x2=/^[A-Za-z0-9_-]+$/,R2=128});import{randomBytes as A2}from"node:crypto";import{mkdirSync as C2,renameSync as _2,rmSync as DR,writeFileSync as I2}from"node:fs";import{dirname as P2,isAbsolute as M2,join as O2}from"node:path";function Qu(){return O2(Se(),"last-cwd")}function FR(){try{DR(Qu(),{force:!0})}catch{}}function LR(e){if(!M2(e))throw new Error(`recordCdIntent: target must be an absolute path, got ${JSON.stringify(e)}`);if(/[\n\r\0]/.test(e))throw new Error(`recordCdIntent: target must not contain newline/CR/NUL, got ${JSON.stringify(e)}`);try{let t=Qu();C2(P2(t),{recursive:!0,mode:448});let n=`${t}.tmp.${process.pid}.${A2(6).toString("hex")}`;try{I2(n,e,{encoding:"utf8",mode:384}),_2(n,t)}catch(r){try{DR(n,{force:!0})}catch{}throw r}}catch{}}function NR(){let e=v.AFK_SHELL_WRAPPER;return e==="1"||e==="true"}var Zu=x(()=>{"use strict";G();q()});var ct,yt,np,he,jn,Zr,bs,rp,Fe=x(()=>{"use strict";ct=class extends Error{constructor(t){super(t),this.name="AbortError"}},yt=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},np=class extends yt{constructor(t,n){super(t,n),this.name="IdleWatchdogError"}},he=class extends Error{constructor(n,r,o,i){super(n);this.event=r;this.reason=o;this.name="HookBlockedError",i?.cause!==void 0&&(this.cause=i.cause)}event;reason;cause},jn=class extends Error{constructor(t){super(t),this.name="StreamIncompleteError"}},Zr=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},bs=class extends Error{constructor(t){super(t),this.name="DenialCircuitBreakerError"}},rp=class extends Error{constructor(n,r,o){super(o??`${n} provider does not support AgentConfig.${r}.`);this.provider=n;this.field=r;this.name="UnsupportedProviderConfigError"}provider;field}});function Ke(){return v.AFK_DEBUG==="1"||v.DEBUG==="1"}function W(...e){Ke()&&console.log(...e)}var ye=x(()=>{"use strict";G()});async function Rs(e,t){if(e)try{await e.write({kind:"tool_call",payload:t})}catch(n){W(`trace.emit tool_call failed: ${Hn(n)}`)}}async function wn(e,t){if(e)try{await e.write({kind:"hook_decision",payload:t})}catch(n){W(`trace.emit hook_decision failed: ${Hn(n)}`)}}async function ti(e,t){if(e)try{await e.write({kind:"subagent_lifecycle",payload:t})}catch(n){W(`trace.emit subagent_lifecycle failed: ${Hn(n)}`)}}async function ni(e,t){if(e)try{await e.write({kind:"background_agent",payload:t})}catch(n){W(`trace.emit background_agent failed: ${Hn(n)}`)}}async function fA(e,t){if(e)try{await e.write({kind:"budget",payload:t})}catch(n){W(`trace.emit budget failed: ${Hn(n)}`)}}async function gA(e,t){if(e)try{await e.write({kind:"abort",payload:t})}catch(n){W(`trace.emit abort failed: ${Hn(n)}`)}}async function up(e,t){if(e)try{await e.write({kind:"compaction",payload:t})}catch(n){W(`trace.emit compaction failed: ${Hn(n)}`)}}async function hA(e,t){if(e)try{await e.write({kind:"closure",payload:t})}catch(n){W(`trace.emit closure failed: ${Hn(n)}`)}}async function rt(e,t){if(e)try{await e.write({kind:"browser_event",payload:t})}catch(n){W(`trace.emit browser_event failed: ${Hn(n)}`)}}async function ie(e,t){if(e)try{await e.write({kind:"session_phase",payload:t})}catch(n){W(`trace.emit session_phase failed: ${Hn(n)}`)}}function Hn(e){return e instanceof Error?e.message:String(e)}var xe=x(()=>{"use strict";ye()});function pp(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function ac(e,t,n,r){let o=t==="oauth"?{authToken:e}:{apiKey:e},i=typeof n=="string"&&n.length>0?{...o,baseURL:n}:o;return r?{...i,fetch:r}:i}function Sn(e,t,n,r){return e!=="oauth"?{}:{"anthropic-beta":r?`${yA},${xq}`:yA,"x-app":"cli","User-Agent":Rq,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function bA(e){return e!=="oauth"?null:[{type:"text",text:Aq}]}var yA,xq,Rq,Aq,As=x(()=>{"use strict";yA="claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,extended-cache-ttl-2025-04-11",xq="effort-2025-11-24",Rq="claude-cli/1.0.0 (external, cli)",Aq="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;"});function fp(e){aw=e}function ow(e){if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0}function mp(e,t,n){let r={},o=ow(e);o&&(r.id=o);let i=ow(t);i&&(r.baseUrl=i);let s=ow(n);return s&&(r.apiKey=s),r}function Cq(){return{local:mp(v.AFK_MODEL_LOCAL,v.AFK_MODEL_LOCAL_BASE_URL,v.AFK_MODEL_LOCAL_API_KEY),small:mp(v.AFK_MODEL_SMALL,v.AFK_MODEL_SMALL_BASE_URL,v.AFK_MODEL_SMALL_API_KEY),medium:mp(v.AFK_MODEL_MEDIUM,v.AFK_MODEL_MEDIUM_BASE_URL,v.AFK_MODEL_MEDIUM_API_KEY),large:mp(v.AFK_MODEL_LARGE,v.AFK_MODEL_LARGE_BASE_URL,v.AFK_MODEL_LARGE_API_KEY)}}function dw(e){let t=Cq(),n={};for(let r of lc){let o=ri[r],i=e?.[r],s=t[r],a={id:s.id??i?.id??o.id},l=i?.name;l&&(a.name=l);let c=i?.provider;c&&(a.provider=c);let d=s.baseUrl??i?.baseUrl;d&&(a.baseUrl=d);let u=s.apiKey??i?.apiKey;u&&(a.apiKey=u),n[r]=a}return n}function _s(e){return e||aw||dw()}function Is(e,t=_s()){let n=e.trim().toLowerCase();if(!(!n||n===vA)){for(let r of lc){let o=t[r].name;if(o&&o.trim().toLowerCase()===n)return r}if(n==="local"||n==="small"||n==="medium"||n==="large")return n}}function oi(e,t=_s()){if(e===void 0)return{id:""};let n=Is(e,t);if(n)return t[n];let r=cw[e.trim().toLowerCase()];return r?{id:r}:{id:e}}function oo(e,t=_s()){if(e!==void 0)return oi(e,t).id}function Ps(e,t=_s()){if(e===void 0)return;let n=Is(e,t);if(n&&t[n].id.trim()===""){let r=n.toUpperCase();return`The "${n}" model tier is not configured (no model id). Set AFK_MODEL_${r}=<id> (optionally AFK_MODEL_${r}_BASE_URL / AFK_MODEL_${r}_API_KEY) or "models.${n}" in afk.config.json, then retry.`}}function kA(e){let t={};if(!e||typeof e!="object")return t;let n=e;for(let r of lc){let o=Iq(n[r]);o&&(t[r]=o)}return t}function TA(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="anthropic"||t==="anthropic-direct")return"anthropic";if(t==="openai"||t==="openai-compatible")return"openai";if(t==="chatgpt-oauth"||t==="chatgpt")return"chatgpt-oauth"}function Cs(e){return typeof e=="string"?e.trim():""}function wA(e){return/[\x00-\x1f\x7f]/.test(e)}function Iq(e){if(typeof e=="string"){let t=e.trim();return t?{id:t}:void 0}if(e&&typeof e=="object"){let t=e,n=Cs(t.id);if(!n)return;let r={id:n},o=Cs(t.name);o&&(r.name=o);let i=TA(t.provider);i&&(r.provider=i);let s=Cs(t.baseUrl);s&&(r.baseUrl=s);let a=Cs(t.apiKey);return a&&(r.apiKey=a),r}}function EA(e){if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,error:'model binding must be an object with at least an "id"'};let t=e;if("apiKey"in t||"api_key"in t)return{ok:!1,error:"per-slot API keys are credentials; set AFK_MODEL_<TIER>_API_KEY via `afk config env set` instead of afk.config.json"};if("baseUrl"in t||"base_url"in t)return{ok:!1,error:"per-slot baseUrl is an endpoint-redirect credential vector; set AFK_MODEL_<TIER>_BASE_URL via `afk config env set` instead of afk.config.json"};let n=Cs(t.id);if(!n)return{ok:!1,error:'model binding requires a non-empty "id"'};if(wA(n))return{ok:!1,error:'model binding "id" must not contain control characters'};let r={id:n},o=Cs(t.name);if(o){if(wA(o))return{ok:!1,error:'model binding "name" must not contain control characters'};if(_q.has(o.trim().toLowerCase()))return{ok:!1,error:`model binding "name" must not shadow a built-in alias ("${o}")`};r.name=o}if(t.provider!==void 0&&t.provider!==""){let i=TA(t.provider);if(!i)return{ok:!1,error:'model binding "provider" must be one of: anthropic, openai (aliases: anthropic-direct, openai-compatible)'};r.provider=i}return{ok:!0,value:r}}var lc,SA,iw,sw,lw,ri,vA,cw,cc,aw,_q,It=x(()=>{"use strict";G();lc=["local","small","medium","large"],SA="claude-haiku-4-5-20251001",iw="claude-sonnet-5",sw="claude-opus-5",lw="claude-fable-5",ri={local:{id:""},small:{id:SA},medium:{id:iw},large:{id:sw}},vA="auto",cw={opus:sw,opus_1m:sw,sonnet:iw,sonnet_1m:iw,haiku:SA,fable:lw},cc=[...lc,...Object.keys(cw)];_q=new Set([...lc,vA,...Object.keys(cw)])});function dc(e){return e in uw}function Tt(e){return oo(e)}var uw,vn=x(()=>{"use strict";It();uw={opus:ri.large.id,opus_1m:ri.large.id,sonnet:ri.medium.id,sonnet_1m:ri.medium.id,haiku:ri.small.id,fable:lw}});import Pq from"@anthropic-ai/sdk";import{randomUUID as xA}from"node:crypto";async function Ms(e){let{token:t,model:n,system:r,user:o,maxTokens:i=64,signal:s,clientFactory:a}=e;if(!t)throw new Error("oneShotCompletion: token required");let l=pp(t),c=ac(t,l),d=a?a(c):new Pq(c),u=xA(),m=xA(),f=Sn(l,u,m),g=Tt(n)??n,h={};Object.keys(f).length>0&&(h.headers=f),s&&(h.signal=s);let y=await d.messages.create({model:g,max_tokens:i,system:r,messages:[{role:"user",content:o}]},Object.keys(h).length>0?h:void 0),b=[];for(let S of y.content)S.type==="text"&&b.push(S.text);let w=b.join("").trim();return w.length===0&&console.warn("oneShotCompletion: response contained no text blocks \u2014 returning empty string"),w}var gp=x(()=>{"use strict";As();vn()});import{execFileSync as RA}from"child_process";import{existsSync as Mq,readFileSync as Oq,writeFileSync as $q}from"fs";import{homedir as AA,userInfo as CA}from"os";import{join as _A}from"path";function dt(){let e=IA();if(e===void 0)return;let t=PA(e);if(t!==void 0){if(t.expiresAt!==void 0&&t.expiresAt<=Date.now()){process.stderr.write("agent-afk: Claude Code OAuth token in keychain is expired. Run `claude login` to refresh.\n");return}return t.accessToken}}async function pw(){let e=IA();if(e===void 0)return;let t=PA(e);if(t===void 0)return;if(t.expiresAt!==void 0&&t.expiresAt>Date.now()+Lq)return t.accessToken;if(!t.refreshToken){process.stderr.write("agent-afk: OAuth token expired and no refresh token available. Run `claude login` to refresh.\n");return}let n=await Nq(t.refreshToken);if(!n){process.stderr.write("agent-afk: OAuth token refresh failed. Run `claude login` to refresh.\n");return}try{let r={};try{r=JSON.parse(e)}catch{}let o=r.claudeAiOauth??{};r.claudeAiOauth={...o,accessToken:n.accessToken,expiresAt:n.expiresAt,...n.refreshToken!==void 0?{refreshToken:n.refreshToken}:{}},Bq(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
2
+ var u2=Object.defineProperty;var x=(e,t)=>()=>(e&&(t=e(e=0)),t);var Bu=(e,t)=>{for(var n in t)u2(e,n,{get:t[n],enumerable:!0})};function gt(){let e=v.AFK_PLAIN_OUTPUT;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"}function Uu(e){return Yl.find(t=>t.name===e)}function bR(e){return Yl.filter(t=>!t.required||e!==void 0&&t.category!==e?!1:process.env[t.name]===void 0||process.env[t.name]==="")}function Pb(e){return process.env[e]!==void 0}var Yl,v,G=x(()=>{"use strict";Yl=[{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_COMPACT_SHRINK_FRACTION",description:"Context-fullness fraction (0\u20131, exclusive) at/above which /compact and auto-compaction relax the keep-window so a short-but-full session (few turns, huge tool exchanges) can still be summarized instead of no-oping on turn count. Default 0.7 (see shared/compaction.ts DEFAULT_COMPACT_SHRINK_THRESHOLD).",type:"number",required:!1,example:"0.8",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_DIAGNOSE_BASELINE",description:"Kill switch for /diagnose reproducer baseline execution. When set to '0', the /diagnose skill skips executing the detected reproducer command for a ground-truth baseline; default enabled (runs). Set to '0' to disable.",type:"boolean",required:!1,default:"1",example:"0",category:"debug"},{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_DISABLE_BASH_INTERPRETER_GUARD",description:"Skip ONLY the bash interpreter-eval denylist (python -c, node -e, sh -c, ...) when set to 1, leaving the rest of path-approval intact. Applies on interactive surfaces (REPL/Telegram), where the denylist is active but your workflow legitimately runs interpreter one-liners. The restricted-root substring check is unaffected. Default: denylist active on interactive surfaces; headless already fails open (opt in with AFK_FORCE_BASH_INTERPRETER_GUARD=1). To disable all of path-approval + bash restriction instead, use AFK_DISABLE_PATH_APPROVAL=1.",type:"boolean",required:!1,default:"0",example:"1",category:"process"},{name:"AFK_DISABLE_PATH_APPROVAL",description:"Skip the path-approval + bash-restriction hooks entirely when set to 1. Use for headless flows that need wide-open file access (CI scripts, batch jobs). Default: hooks enabled. Note: on headless surfaces (afk chat, daemon) no grant manager is wired, so the interpreter denylist (python -c, node -e, sh -c, ...) fails OPEN by default \u2014 opt headless flows into it with AFK_FORCE_BASH_INTERPRETER_GUARD=1, or set this var to 1 to disable all of path-approval.",type:"boolean",required:!1,default:"0",example:"1",category:"process"},{name:"AFK_FORCE_BASH_INTERPRETER_GUARD",description:"Apply the bash interpreter-eval denylist (python -c, node -e, sh -c, ...) even on headless surfaces (afk chat, daemon) where no grant manager is wired. By default the denylist fires only on interactive surfaces (REPL/Telegram), failing open on headless so legitimate automation is not hard-blocked with no recourse. Set to 1 to opt headless flows back into the guard. Overridden by AFK_DISABLE_BASH_INTERPRETER_GUARD=1. Default: off (headless fails open).",type:"boolean",required:!1,default:"0",example:"1",category:"process"},{name:"AFK_EFFORT",description:"Effort hint guiding adaptive-thinking depth, forwarded as Anthropic output_config.effort (model-gated; ignored where unsupported). Accepts low | medium | high | xhigh | max.",type:"string",required:!1,example:"medium",category:"model"},{name:"AFK_MAX_BUDGET_USD",description:"Cumulative USD budget ceiling for the session. Aborts the turn when the running cost crosses 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:"Deprecated and inert: not read by the generation path. Use AFK_MAX_OUTPUT_TOKENS (or --max-output-tokens) to cap per-response output tokens; falls back to the model output ceiling when unset.",type:"number",required:!1,default:"4096",example:"8192",category:"model"},{name:"AFK_MAX_TOOL_USE_ITERATIONS",description:"Opt-in ceiling on tool-use rounds per turn for TOP-LEVEL (non-subagent) sessions, on both providers. Mirrors the maxToolUseIterations config key / max_tool_use_iterations tool param. Unset, non-numeric, or <=0 means unlimited (the default \u2014 zero behavior change): a top-level turn ends only when the model stops calling tools, the abort signal fires, the provider errors, or the dollar budget trips. A positive integer N makes top-level turns wind down gracefully after N tool rounds (one tools-stripped final round). An explicit config/CLI value wins over this env default. Does NOT affect subagent forks \u2014 they keep their own non-zero anti-hang default (SUBAGENT_DEFAULT_MAX_TOOL_USE_ITERATIONS) regardless of this var.",type:"number",required:!1,default:"0",example:"150",category:"model"},{name:"AFK_MEMORY_EVIDENCE_GATE",description:'Opt-in (set to 1) evidence gate for durable memory writes. When enabled, a codebase fact (memory_update category "convention") stored without an `evidence` citation is recalled as [unverified], and memory_search results carry a verification verdict. User preferences and agent reflections are never gated. Default off \u2014 memory behaves identically to legacy when unset.',type:"boolean",required:!1,example:"1",category:"misc"},{name:"AFK_MICROCOMPACT_KEEP_LAST",description:"Number of the most-recent tool_result blocks that tool-result microcompaction keeps intact regardless of size, so the agent does not lose the tool output it is actively reasoning over. Older results are the safe ones to trim. Default 4 (see shared/compaction.ts DEFAULT_MICROCOMPACT_KEEP_LAST). Values <= 0 protect nothing.",type:"number",required:!1,default:"4",example:"3",category:"model"},{name:"AFK_MICROCOMPACT_TOOL_RESULT_BYTES",description:"Byte threshold (tool_result content length) at/above which a tool_result block becomes a microcompaction candidate. When /compact and auto-compaction would otherwise no-op on a short-but-full session, microcompaction clears large/old tool_result CONTENT in place (largest first) \u2014 replacing it with a short placeholder, never removing the block \u2014 to reclaim context deterministically (no LLM call). Blocks below this size are left intact. Default 2048 (see shared/compaction.ts DEFAULT_MICROCOMPACT_TOOL_RESULT_BYTES).",type:"number",required:!1,default:"2048",example:"4096",category:"model"},{name:"AFK_MODEL",description:"Default model for agent turns. Accepts slot names (local, small, medium, large), fixed-identity aliases (opus, sonnet, haiku, fable), or full model IDs. Migration: AFK_MODEL=sonnet now pins the fixed Sonnet identity rather than following a rebound medium tier.",type:"string",required:!1,default:"medium",example:"claude-opus-5",category:"model"},{name:"AFK_MODEL_TTFB_TIMEOUT_MS",description:"Per-request time-to-first-token timeout (ms) for the anthropic-direct streaming loop. Bounds how long a single model call may stall BEFORE its first streamed CONTENT token (a text/thinking delta or tool_use); the connection-level message_start and keep-alive pings do NOT count. Once a content token streams, the timer is cleared and the rest of the response runs unbounded, so a normal slow call (below the bound) and any actively-streaming extended-thinking response are never aborted. NOTE: a request whose FIRST token takes longer than the bound \u2014 e.g. a very large opus_1m prefill \u2014 is aborted, retried once, then surfaces as an error (raise this value or set 0 for such workloads); this trims the degrading-call tail instead of a silent ~10-min hang on the SDK default. Default 180000 (180s \u2248 2\xD7 the measured p99 ttfb). Set to 0 to disable.",type:"number",required:!1,default:"180000",example:"120000",category:"model"},{name:"AFK_SUBAGENT_TIMEOUT_MS",description:"Foreground forked-subagent wall-clock budget in ms; 0 disables the cap; explicit per-fork config.timeoutMs and the 60-min background mode still win. Bounds how long a single forked child turn may run before `withTimeout` aborts its controller (cascading through the AbortGraph to descendants) and the parent receives a legible TimeoutError tool_result instead of hanging. Default 2700000 (45 min \u2248 headroom over the longest healthy review/research agent observed in production). Unset, empty, or unparseable input falls back to the default; a negative value is treated as invalid and also falls back. Set to 0 to opt a whole session back into unbounded child turns. Does NOT affect the background dispatch budget (SUBAGENT_BACKGROUND_TIMEOUT_MS) or a per-fork config.timeoutMs \u2014 both take precedence.",type:"number",required:!1,default:"2700000",example:"3600000",category:"model"},{name:"AFK_SUBAGENT_IDLE_TIMEOUT_MS",description:"Forked-subagent progress-aware idle-watchdog window in ms; 0 disables the watchdog; an explicit per-fork config.idleTimeoutMs still wins. Fires when a forked child produces no observable output event for this window, aborting the same controller the wall-clock timeout targets so partial output is preserved and the run classifies as a failure. This is distinct from AFK_SUBAGENT_TIMEOUT_MS, the blunt wall-clock that bounds total turn time: the idle watchdog is the tighter first-to-fire bound and never fires while the stream is legitimately parked on a provider-communicated backoff (OAuth pause, or a rate-limit event carrying a retry-after), extending the deadline for the pause window instead. Default 480000 (8 min) clears the worst-case transient-429 backoff the watchdog is currently blind to (about 363s) with roughly 2 min of margin, while staying materially tighter than the 45-min wall-clock. Unset, empty, or unparseable input falls back to the default; a negative value is treated as invalid and also falls back. Set to 0 to disable the idle watchdog for a whole session (the wall-clock still applies). v1 applies to forked sub-agent turns only, not top-level or daemon sessions.",type:"number",required:!1,default:"480000",example:"300000",category:"model"},{name:"AFK_VISION_MODELS",description:'Comma-separated override for image (vision) capability detection on the openai-compatible provider. Each token force-enables a model id by exact or substring match (e.g. "qwen2.5-vl" matches a local VL id); prefix a token with "!" to force-disable. Use to send images to a local vision-language model AFK does not recognise by name, or to blacklist a mis-detected id. Built-in detection already covers gpt-4o/4.1/5.x, o1/o3/o4-mini, Claude, and common VL families.',type:"string",required:!1,example:"qwen2.5-vl,!gpt-4o-mini",category:"model"},{name:"AFK_MODEL_LOCAL",description:'Bind the "local" capability tier (cheapest/fastest, user-configured) to a model id. Overrides afk.config.json models.local. Point at a local Ollama, LM Studio, or any OpenAI-compatible shim.',type:"string",required:!1,example:"llama3.2:3b",category:"model"},{name:"AFK_MODEL_LOCAL_API_KEY",description:'Per-slot API key for the "local" tier. Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_LOCAL_BASE_URL",description:'Per-slot endpoint base URL for the "local" tier. Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:11434/v1",category:"model"},{name:"AFK_MODEL_LARGE",description:'Bind the "large" capability tier (most capable) to a model id/alias. Overrides afk.config.json models.large.',type:"string",required:!1,example:"claude-opus-5",category:"model"},{name:"AFK_MODEL_LARGE_API_KEY",description:'Per-slot API key for the "large" tier (Stage 2). Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_LARGE_BASE_URL",description:'Per-slot endpoint base URL for the "large" tier (Stage 2). Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:8080/v1",category:"model"},{name:"AFK_MODEL_MEDIUM",description:'Bind the "medium" capability tier (general-use) to a model id/alias. Overrides afk.config.json models.medium.',type:"string",required:!1,example:"claude-sonnet-5",category:"model"},{name:"AFK_MODEL_MEDIUM_API_KEY",description:'Per-slot API key for the "medium" tier (Stage 2). Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_MEDIUM_BASE_URL",description:'Per-slot endpoint base URL for the "medium" tier (Stage 2). Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:8080/v1",category:"model"},{name:"AFK_MODEL_SMALL",description:'Bind the "small" capability tier (cheap/fast) to a model id/alias. Overrides afk.config.json models.small.',type:"string",required:!1,example:"gpt-4o-mini",category:"model"},{name:"AFK_MODEL_SMALL_API_KEY",description:'Per-slot API key for the "small" tier (Stage 2). Overrides global credentials for this tier only.',type:"string",required:!1,category:"model",secret:!0},{name:"AFK_MODEL_SMALL_BASE_URL",description:'Per-slot endpoint base URL for the "small" tier (Stage 2). Anthropic Messages base or OpenAI-compatible base per the tier provider.',type:"string",required:!1,example:"http://localhost:8080/v1",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_SUGGEST_ENABLED",description:"Enable the LLM-backed ghost-text suggestion tier in the interactive REPL. Set to 1/true/yes/on to activate. Off by default.",type:"boolean",required:!1,category:"model"},{name:"AFK_SUGGEST_GHOST",description:"Enable REPL ghost-text inline suggestions (Tier-1 history/dropdown + optional Tier-2 LLM). 1 = on (default), 0 = off. Set 0/false/off/no to disable all ghost text. Tier-2 LLM is separately gated by AFK_SUGGEST_ENABLED.",type:"boolean",required:!1,default:"1",example:"0",category:"model"},{name:"AFK_SUGGEST_MODEL",description:"Override the small model used for REPL ghost-text suggestions. Falls back to AFK_COMPACT_MODEL or haiku-class for anthropic, or the session model for other providers.",type:"string",required:!1,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 mode. Accepts adaptive | disabled | enabled:<N> | enabled:max. Defaults to the model-appropriate mode when unset (adaptive on current models).",type:"string",required:!1,default:"adaptive",example:"adaptive",category:"model"},{name:"AFK_THINKING_UI",description:"Default thinking-display mode for the interactive REPL: summary | live | digest | off. Display-only \u2014 controls how extended-thinking blocks render, never whether thinking runs (cost/latency unaffected). Overridden per-launch by --thinking-ui and mutable mid-session via /thinking. Precedence: --thinking-ui flag > this env > interactive.thinkingUi config > live. Invalid values are ignored.",type:"string",required:!1,default:"live",example:"digest",category:"misc"},{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 operator-overlay prompt. Highest-priority overlay (over afk.config.json and AFK.md). Appended on top of the framework base (prompts/system-prompt.md) under an "# Operator configuration" header \u2014 it augments, never replaces, the base.',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:"Fallback OpenAI API key for the openai-compatible provider, read after OPENAI_API_KEY. Legacy name from the removed @openai/codex-sdk integration \u2014 prefer OPENAI_API_KEY.",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_OPENAI_USE_RESPONSES",description:"Opt the OpenAI-compatible provider into the OpenAI Responses API instead of Chat Completions for API-key sessions. Truthy values: 1, true, yes, on. The ChatGPT-subscription OAuth path uses Responses automatically regardless of this flag.",type:"boolean",required:!1,example:"1",category:"model"},{name:"AFK_OPENAI_CHATGPT_OAUTH",description:"Opt into using ChatGPT-subscription OAuth credentials from ~/.codex/auth.json (auth_mode: chatgpt) as OpenAI provider auth. Off by default. READ-ONLY: AFK never refreshes these tokens \u2014 re-run `codex` when the access token expires. Routes requests over the Responses API to the private ChatGPT backend (chatgpt.com/backend-api).",type:"boolean",required:!1,example:"1",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:"EXA_API_KEY",description:"Exa (exa.ai) search API key, enabling web_scrape search mode. Free tier (20k requests/month) available at https://exa.ai. When unset, search mode returns an actionable error; markdown and raw modes are unaffected.",type:"string",required:!1,category:"auth",secret:!0},{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:"AFK_TELEGRAM_TAG_ONLY_CHAT_IDS",description:"Comma-separated list of Telegram chat IDs where the bot answers only when addressed (a reply to the bot, an @mention of the bot, or a text_mention resolving to the bot). Slash-commands are unaffected; chats not listed behave as usual. The afk.config.json telegram.tagOnlyChats block takes precedence. Requires Telegram privacy mode OFF (BotFather /setprivacy Disable) for non-addressed group messages to reach the bot.",type:"string",required:!1,example:"-100987654321,123456789",category:"telegram"},{name:"AFK_TELEGRAM_PRIMARY_CHAT_ID",description:"Default chat ID for outbound notifications (primary-mode routing). When unset, notifications go to the first private/DM chat in AFK_TELEGRAM_ALLOWED_CHAT_IDS. The afk.config.json telegram.notify block takes precedence.",type:"string",required:!1,example:"123456789",category:"telegram"},{name:"AFK_TELEGRAM_NOTIFY_MODE",description:"Outbound notification fan-out: primary (default \u2014 one chat), broadcast (every allowed chat), or custom (afk.config.json telegram.notify.targets). The afk.config.json telegram.notify.mode takes precedence.",type:"string",required:!1,example:"broadcast",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 'true' to log per-message details from the Telegram bot \u2014 chat IDs, message text, latency. (The code checks the literal string 'true'.)",type:"boolean",required:!1,example:"true",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 entire AFK state tier (sessions/, todos/, transcripts/, memory/, daemon/, etc.), not just one subdirectory. Must be an absolute path (not /). 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_COMPANION_PRIMER",description:'Opt-in: absolute path to a single companion-primer file. When set, its content is bounded (capped, fenced as <companion-primer>) and appended to the system prompt at session start for top-level sessions (chat/REPL/telegram/daemon), as lower-authority "reflections, not facts" context. Unset (default) = no-op. Only the one named file is ever read \u2014 never a directory or repo walk.',type:"string",required:!1,example:"/Users/me/Projects/afk-companion/PRIMER.md",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_DAEMON_HOST",description:"Bind address for the daemon control HTTP surface. Defaults to 127.0.0.1 (loopback only). The control surface is unauthenticated, so bind a non-loopback address such as 0.0.0.0 only on a trusted or firewalled network. Overridden by the --host flag.",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_BASE",description:"Override the base git ref for worktrees created with --worktree. By default AFK bases worktrees on the remote's default branch (e.g. origin/main), fetched fresh. Set this to pin a different ref, or to HEAD to base on the local checkout. Overridden per-session by --worktree-base.",type:"string",required:!1,example:"origin/main",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_ALLOW_PROJECT_MCP",description:"Opt-in to loading + spawning MCP servers declared in <cwd>/.mcp.json. Fail-closed: when unset (or 0), project-local servers are NOT spawned; set to a truthy value (1/true/yes/on) to load them. A project-local .mcp.json spawns arbitrary commands on session start, so it is off by default to prevent code execution when entering an untrusted repo (issue #571). Skipped servers are listed in a startup warning with the opt-in instruction.",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:"routing"},{name:"AFK_INTERNAL",description:'Tier gate. Set to exactly `1` to unlock \u2014 only the literal string "1" unlocks (other truthy values like "true"/"yes" leave the tier locked). When unlocked, skills tagged `audience: \'internal\'` (e.g. /audit-fit, harvest/distill plugins) become visible at end-user surfaces (slash-command list, --help, tab-complete, system-prompt skill manifest). Default unset = public tier \u2014 internal skills are hidden. Not an access-control boundary; it gates surfacing, not the underlying registry.',type:"boolean",required:!1,example:"1",category:"routing"},{name:"AFK_SHELL_PASSTHROUGH",description:"Enable the interactive REPL `!cmd` / `!&cmd` shell-passthrough feature. On by default. Set to 0, false, off, or no (case-insensitive) to disable, so inputs beginning with ! are sent to the model as literal text instead of being executed as shell commands. Equivalent to the --no-shell-passthrough flag.",type:"boolean",required:!1,default:"1",example:"0",category:"misc"},{name:"AFK_BG_AUTO_DELIVER",description:"Auto-deliver background subagent results into the model context on the next user turn (interactive REPL). On by default. Set to 0, false, off, or no (case-insensitive) to disable, restoring the manual /bgsub:join retrieval flow.",type:"boolean",required:!1,default:"1",example:"0",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_PLAIN_OUTPUT",description:"Force the interactive REPL to fully behave like a non-TTY surface for rendering purposes, even when stdout/stdin ARE a TTY: append-only plain-stdout output instead of the TerminalCompositor live overlay (both the persistent between-turn compositor AND the per-turn StreamRenderer overlay), AND the input surface downgrades to the simple non-TTY line reader instead of the fancy compositor-backed input box. Same code path already used for non-TTY surfaces (pipes, CI). Full opt-out escape hatch for tmux/SSH/multiplexer sessions where cursor-up redraws and DECSTBM scroll regions misbehave \u2014 trades the live overlay and fancy input UX for reliability. Opt-in \u2014 default TTY behavior (live overlay + fancy input) is unchanged unless this var is set. Truthy values: 1, true (case-insensitive).",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_GOBLIN_SPINNER",description:"Goblin-themed working spinner (olive frames + goblin verbs) while the agent runs tools. 1 = on (default), 0 = classic dim spinner.",type:"boolean",required:!1,example:"0",category:"misc"},{name:"AFK_TERM_TITLE",description:'Set the terminal/tab title (OSC 2) to reflect afk state \u2014 "afk \u2014 <cwd> \xB7 running" during a turn, "afk \u2014 <cwd>" when idle, cleared on exit. 1 = on (default when stdout is a TTY), 0 = leave the title alone. TTY-only.',type:"boolean",required:!1,example:"0",category:"misc"},{name:"AFK_NOTIFY",description:"Emit a desktop completion notification (OSC 9) on turn completion, for terminals that map OSC 9 to system notifications (iTerm2, kitty, WezTerm). Opt-in and off by default (intrusive). 1 = on. TTY-only.",type:"boolean",required:!1,example:"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_THEME",description:"TUI color palette for the interactive REPL and all CLI rendering: dark | light | auto. Display-only \u2014 swaps the semantic color palette, never behavior (cost/latency unaffected). auto detects from COLORFGBG and falls back to dark. Overridden per-launch by --theme and mutable mid-session via /theme. Precedence: --theme flag > this env > config theme > auto-detect > dark. Invalid values are ignored (dark).",type:"string",required:!1,default:"dark",example:"light",category:"misc"},{name:"COLORFGBG",description:'Terminal-set "foreground;background" color hint (e.g. "15;0"), read only for AFK_THEME=auto detection. The trailing field is the background color index; >= 7 is treated as a light background, otherwise dark. Not set by AFK \u2014 emitted by some terminals (rxvt, Konsole, iTerm2). Absent or unparseable => dark.',type:"string",required:!1,example:"15;0",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_DEBUG_COMPOSITOR",description:"Gate compositor phase-boundary traces to stderr; any truthy value enables.",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:"AFK_SESSION_LEDGER_DISABLED",description:"Disable the per-session durable event ledger (state/sessions/<id>/events.jsonl). Set to 1 to skip ledger writes; live cross-surface watching (e.g. the Telegram /watch command) will report no activity for sessions started while disabled.",type:"boolean",required:!1,example:"1",category:"debug"},{name:"AFK_RUN_RECEIPT_DISABLED",description:"Disable the post-session run receipt (state/receipts/<label>.json and .md). Set to 1 to skip receipt writes; the underlying witness trace is unaffected. Receipts are also implicitly off when AFK_TRACE_DISABLED=1 (no trace to summarize).",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) 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_BROWSER_HEADLESS",description:"Override the default headless mode for native browser-control tools. `1`/`true` forces headless; `0`/`false` forces headed. When unset the default is headless for daemon and subagent surfaces and headed for repl/interactive \u2014 so an operator can watch the agent work in REPL mode.",type:"boolean",required:!1,example:"1",category:"browser"},{name:"AFK_BROWSER_ALLOWED_DOMAINS",description:"Comma-separated allowlist of URL host globs. When set, browser_open and any navigation that targets a host outside the list returns status: blocked_by_policy. Unset means no allowlist (permissive). Patterns use simple `*` glob matching against the URL host. Combines with AFK_BROWSER_BLOCKED_DOMAINS \u2014 block wins.",type:"string",required:!1,example:"github.com,*.atlassian.net",category:"browser"},{name:"AFK_BROWSER_BLOCKED_DOMAINS",description:"Comma-separated blocklist of URL host globs. Browser navigation that matches any entry returns status: blocked_by_policy regardless of the allowlist.",type:"string",required:!1,example:"*.ads.example.com",category:"browser"},{name:"AFK_BROWSER_DOM_SNAPSHOTS",description:"Phase 2 opt-in: when set to 1, every browser_act writes a gzipped DOM snapshot sidecar under ~/.afk/state/witness/<sid>/browser/dom-snapshots/. Off by default because snapshots are large; useful for post-mortem analysis of failed actions.",type:"boolean",required:!1,example:"1",category:"browser"},{name:"AFK_BROWSER_BACKEND",description:"Select the browser provider backend. Phase 1 supports only `playwright`. Reserved for future `cdp` / `mcp` adapters. Unset defaults to `playwright`.",type:"string",required:!1,example:"playwright",category:"browser"},{name:"AFK_BROWSER_CONFIG",description:"Absolute path to an alternate browser config file. Overrides the default ~/.afk/config/browser.json lookup. Useful for per-project overrides in CI.",type:"string",required:!1,example:"/path/to/browser.json",category:"browser"},{name:"AFK_BROWSER_DEFAULT_PROFILE",description:"Name of the persistent session-vault profile the agent reuses for browser sessions. The context restores its login from (and saves it back to) ~/.afk/state/browser/<profile>/storageState.json, so a human runs `afk browser login --profile <name>` once and the agent reuses that authenticated session across unattended runs. Unset defaults to `default` (a fresh, empty profile \u2014 identical to pre-vault behavior). Allowed charset: [A-Za-z0-9_-], max 128 chars.",type:"string",required:!1,example:"work",category:"browser"},{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_READ_DENYLIST",description:"Colon-separated list of additional absolute paths the read_file/grep/glob/list_directory tools refuse to read. Built-in credential entries (~/.ssh, ~/.aws, ~/.afk/config, \u2026) always apply on top and cannot be removed.",type:"string",required:!1,example:"/Users/me/project/.env:/Users/me/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:"AFK_SESSION_ID",description:"Override the browser session ID used by the native browser-control tools. Defaults to 'default' for single-session use. Subagents inherit the parent's session by default. Set this when running multiple concurrent AFK processes that should each manage an isolated browser context.",type:"string",required:!1,default:"default",example:"session-abc123",category:"browser"},{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:"VISUAL",description:"Standard POSIX env var naming the user's preferred full-screen editor (with optional flags). Consulted FIRST by the /editor slash command (and its key chord) to compose a long prompt externally; takes precedence over EDITOR. No fallback editor is assumed \u2014 if neither VISUAL nor EDITOR is set, /editor prints a hint instead of guessing.",type:"string",required:!1,example:"nvim",category:"process"},{name:"EDITOR",description:"Standard POSIX env var naming the user's preferred editor (with optional flags). Consulted by the /editor slash command AFTER VISUAL, as the standard fallback. No default editor is assumed when both are unset \u2014 /editor prints a hint telling the user to set one.",type:"string",required:!1,example:"vim",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"},{name:"AFK_USER_CARD_MAX_ROWS",description:'Maximum number of visual rows emitted by renderUserCard before collapsing the remainder into a dim "\u2026(N lines collapsed)" summary row. Defaults to 24. Non-integer or non-positive values are silently ignored and the default applies.',type:"number",required:!1,example:"24",category:"misc"}],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_COMPACT_SHRINK_FRACTION(){return process.env.AFK_COMPACT_SHRINK_FRACTION},get AFK_COMPANION_PRIMER(){return process.env.AFK_COMPANION_PRIMER},get AFK_DEFAULT_SUBAGENT_MODEL(){return process.env.AFK_DEFAULT_SUBAGENT_MODEL},get AFK_DIAGNOSE_BASELINE(){return process.env.AFK_DIAGNOSE_BASELINE},get AFK_DISABLE_BASH_INTERPRETER_GUARD(){return process.env.AFK_DISABLE_BASH_INTERPRETER_GUARD},get AFK_DISABLE_PATH_APPROVAL(){return process.env.AFK_DISABLE_PATH_APPROVAL},get AFK_DISABLE_PROMPT_CACHE(){return process.env.AFK_DISABLE_PROMPT_CACHE},get AFK_EFFORT(){return process.env.AFK_EFFORT},get AFK_FORCE_BASH_INTERPRETER_GUARD(){return process.env.AFK_FORCE_BASH_INTERPRETER_GUARD},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_MAX_TOOL_USE_ITERATIONS(){return process.env.AFK_MAX_TOOL_USE_ITERATIONS},get AFK_MEMORY_EVIDENCE_GATE(){return process.env.AFK_MEMORY_EVIDENCE_GATE},get AFK_MICROCOMPACT_KEEP_LAST(){return process.env.AFK_MICROCOMPACT_KEEP_LAST},get AFK_MICROCOMPACT_TOOL_RESULT_BYTES(){return process.env.AFK_MICROCOMPACT_TOOL_RESULT_BYTES},get AFK_MODEL(){return process.env.AFK_MODEL},get AFK_MODEL_TTFB_TIMEOUT_MS(){return process.env.AFK_MODEL_TTFB_TIMEOUT_MS},get AFK_MODEL_LARGE(){return process.env.AFK_MODEL_LARGE},get AFK_MODEL_LARGE_API_KEY(){return process.env.AFK_MODEL_LARGE_API_KEY},get AFK_MODEL_LARGE_BASE_URL(){return process.env.AFK_MODEL_LARGE_BASE_URL},get AFK_MODEL_LOCAL(){return process.env.AFK_MODEL_LOCAL},get AFK_MODEL_LOCAL_API_KEY(){return process.env.AFK_MODEL_LOCAL_API_KEY},get AFK_MODEL_LOCAL_BASE_URL(){return process.env.AFK_MODEL_LOCAL_BASE_URL},get AFK_MODEL_MEDIUM(){return process.env.AFK_MODEL_MEDIUM},get AFK_MODEL_MEDIUM_API_KEY(){return process.env.AFK_MODEL_MEDIUM_API_KEY},get AFK_MODEL_MEDIUM_BASE_URL(){return process.env.AFK_MODEL_MEDIUM_BASE_URL},get AFK_MODEL_SMALL(){return process.env.AFK_MODEL_SMALL},get AFK_MODEL_SMALL_API_KEY(){return process.env.AFK_MODEL_SMALL_API_KEY},get AFK_MODEL_SMALL_BASE_URL(){return process.env.AFK_MODEL_SMALL_BASE_URL},get AFK_VISION_MODELS(){return process.env.AFK_VISION_MODELS},get AFK_PROMPT_CACHE_TTL(){return process.env.AFK_PROMPT_CACHE_TTL},get AFK_SUGGEST_ENABLED(){return process.env.AFK_SUGGEST_ENABLED},get AFK_SUGGEST_GHOST(){return process.env.AFK_SUGGEST_GHOST},get AFK_SUGGEST_MODEL(){return process.env.AFK_SUGGEST_MODEL},get AFK_SUBAGENT_TIMEOUT_MS(){return process.env.AFK_SUBAGENT_TIMEOUT_MS},get AFK_SUBAGENT_IDLE_TIMEOUT_MS(){return process.env.AFK_SUBAGENT_IDLE_TIMEOUT_MS},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_THINKING_UI(){return process.env.AFK_THINKING_UI},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_OPENAI_USE_RESPONSES(){return process.env.AFK_OPENAI_USE_RESPONSES},get AFK_OPENAI_CHATGPT_OAUTH(){return process.env.AFK_OPENAI_CHATGPT_OAUTH},get AFK_PROVIDER(){return process.env.AFK_PROVIDER},get EXA_API_KEY(){return process.env.EXA_API_KEY},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 AFK_TELEGRAM_TAG_ONLY_CHAT_IDS(){return process.env.AFK_TELEGRAM_TAG_ONLY_CHAT_IDS},get AFK_TELEGRAM_PRIMARY_CHAT_ID(){return process.env.AFK_TELEGRAM_PRIMARY_CHAT_ID},get AFK_TELEGRAM_NOTIFY_MODE(){return process.env.AFK_TELEGRAM_NOTIFY_MODE},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 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_DAEMON_HOST(){return process.env.AFK_DAEMON_HOST},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_BASE(){return process.env.AFK_WORKTREE_BASE},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_ALLOW_PROJECT_MCP(){return process.env.AFK_ALLOW_PROJECT_MCP},get AFK_AUTO_ROUTING(){return process.env.AFK_AUTO_ROUTING},get AFK_INTERNAL(){return process.env.AFK_INTERNAL},get AFK_SHELL_PASSTHROUGH(){return process.env.AFK_SHELL_PASSTHROUGH},get AFK_BG_AUTO_DELIVER(){return process.env.AFK_BG_AUTO_DELIVER},get AFK_BANNER_PLAIN(){return process.env.AFK_BANNER_PLAIN},get AFK_PLAIN_OUTPUT(){return process.env.AFK_PLAIN_OUTPUT},get AFK_SPINNER_TIPS(){return process.env.AFK_SPINNER_TIPS},get AFK_GOBLIN_SPINNER(){return process.env.AFK_GOBLIN_SPINNER},get AFK_TERM_TITLE(){return process.env.AFK_TERM_TITLE},get AFK_NOTIFY(){return process.env.AFK_NOTIFY},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_THEME(){return process.env.AFK_THEME},get COLORFGBG(){return process.env.COLORFGBG},get AFK_DEBUG(){return process.env.AFK_DEBUG},get AFK_DEBUG_CLIPBOARD(){return process.env.AFK_DEBUG_CLIPBOARD},get AFK_DEBUG_COMPOSITOR(){return process.env.AFK_DEBUG_COMPOSITOR},get AFK_TRACE_DISABLED(){return process.env.AFK_TRACE_DISABLED},get AFK_SESSION_LEDGER_DISABLED(){return process.env.AFK_SESSION_LEDGER_DISABLED},get AFK_RUN_RECEIPT_DISABLED(){return process.env.AFK_RUN_RECEIPT_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_SESSION_ID(){return process.env.AFK_SESSION_ID},get AFK_BROWSER_HEADLESS(){return process.env.AFK_BROWSER_HEADLESS},get AFK_BROWSER_ALLOWED_DOMAINS(){return process.env.AFK_BROWSER_ALLOWED_DOMAINS},get AFK_BROWSER_BLOCKED_DOMAINS(){return process.env.AFK_BROWSER_BLOCKED_DOMAINS},get AFK_BROWSER_DOM_SNAPSHOTS(){return process.env.AFK_BROWSER_DOM_SNAPSHOTS},get AFK_BROWSER_BACKEND(){return process.env.AFK_BROWSER_BACKEND},get AFK_BROWSER_CONFIG(){return process.env.AFK_BROWSER_CONFIG},get AFK_BROWSER_DEFAULT_PROFILE(){return process.env.AFK_BROWSER_DEFAULT_PROFILE},get AFK_WRITE_DENYLIST(){return process.env.AFK_WRITE_DENYLIST},get AFK_READ_DENYLIST(){return process.env.AFK_READ_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 VISUAL(){return process.env.VISUAL},get EDITOR(){return process.env.EDITOR},get AFK_DIFF_LINES(){return process.env.AFK_DIFF_LINES},get AFK_SHELL_WRAPPER(){return process.env.AFK_SHELL_WRAPPER},get AFK_USER_CARD_MAX_ROWS(){return process.env.AFK_USER_CARD_MAX_ROWS}};(function(){for(let t of Yl){if(!t.secret)continue;let n=Object.getOwnPropertyDescriptor(v,t.name);n&&Object.defineProperty(v,t.name,{...n,enumerable:!1})}})()});import{existsSync as wR,mkdirSync as p2,renameSync as m2,cpSync as f2,rmSync as g2}from"fs";import{join as ee,dirname as Mb,basename as h2,isAbsolute as kR}from"path";import{homedir as Ob}from"os";import{fileURLToPath as y2}from"url";function Ce(){let e=v.AFK_HOME;if(e!==void 0&&e!==""){if(!kR(e)||e==="/")throw new Error(`AFK_HOME must be an absolute path that is not /, got: ${e}`);return e}return ee(Ob(),".afk")}function _t(){return ee(Ce(),"agent-framework")}function Bn(){return ee(_t(),"forge-telemetry.jsonl")}function TR(){return ee(_t(),"routing-decisions.jsonl")}function ER(){return ee(_t(),"briefs")}function xR(){return ee(_t(),"facets")}function Vl(){return ee(Ce(),"skills")}function He(){return ee(Ce(),"plugins")}function RR(e=process.cwd()){return ee(e,".afk")}function ju(e=process.cwd()){return ee(RR(e),"skills")}function Hu(e=process.cwd()){return ee(RR(e),"plugins")}function Wu(e=process.cwd()){return ee(e,".afk","plans")}function ge(){return ee(He(),".index.json")}function $b(){return ee(bn(),"schedules.json")}function vr(){return ee(He(),"cache")}function Xl(e){return ee(vr(),e)}function gs(){let e=y2(import.meta.url),t=Mb(e);return ee(t,"bundled-plugins")}function bn(){return ee(Ce(),"config")}function Se(){let e=v.AFK_STATE_DIR;if(e!==void 0&&e!==""){if(!kR(e)||e==="/")throw new Error(`AFK_STATE_DIR must be an absolute path that is not /, got: ${e}`);return e}return ee(Ce(),"state")}function hs(){return ee(Ce(),"cache")}function Vr(){return ee(Ce(),"logs")}function lt(){return ee(Se(),"sessions")}function Ku(){return ee(Se(),"presence")}function Db(){return ee(Se(),"todos")}function Ql(){return ee(Se(),"transcripts")}function Gu(){return ee(Se(),"memory")}function ht(){return ee(Se(),"queue")}function qu(){return ee(Se(),"session-grants.jsonl")}function Zl(){return ee(bn(),"permissions.json")}function AR(){return ee(Ce(),"farms")}function Fb(e){return ee(AR(),e)}function zu(e){if(!b2.test(e))throw new Error(`Invalid AFK_SESSION_ID: must match /^[a-zA-Z0-9_-]+$/, got: ${JSON.stringify(e)}`)}function Xo(e){return zu(e),ee(Se(),"witness",e)}function CR(e){return!e||e.startsWith("in-memory:")?null:h2(Mb(e))}function Lb(){return ee(Se(),"receipts")}function Ju(e="default"){return ee(Se(),"daemon",`agent-afk@${e}`)}function _R(){return ee(Se(),"worktree-sweep.lock")}function kt(){return ee(bn(),"afk.env")}function Bt(){return ee(bn(),"afk.config.json")}function Nb(){return ee(bn(),"settings.json")}function IR(e=process.cwd()){return ee(e,".afk","settings.json")}function PR(){return ee(Ob(),".afk.env")}function Yu(){return ee(Ob(),".afk.config.json")}function w2(){return ee(Ce(),"sessions")}function S2(){return ee(Ce(),"todos")}function v2(){return ee(Ce(),"transcripts")}function Bb(e,t){if(e!==t&&wR(e)&&!wR(t))try{p2(Mb(t),{recursive:!0});try{m2(e,t)}catch(n){if(n.code==="EXDEV")try{f2(e,t,{recursive:!0}),g2(e,{recursive:!0,force:!0})}catch(r){process.stderr.write(`[afk] migrateDirOnce: EXDEV fallback failed for ${e} \u2192 ${t}: ${String(r)}
3
+ `)}}}catch{}}function MR(){Bb(w2(),lt())}function OR(){Bb(S2(),Db())}function $R(){Bb(v2(),Ql())}function Ub(){return ee(Se(),"repl-history.jsonl")}function T2(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid jobId: must be a non-empty string");if(e.length>SR)throw new Error(`Invalid jobId: exceeds ${SR} chars`);if(!k2.test(e))throw new Error(`Invalid jobId: ${JSON.stringify(e)} contains characters outside [A-Za-z0-9_-]`)}function ec(){return ee(Se(),"bg")}function Qo(e){return T2(e),ee(ec(),e)}function Vu(e){return ee(Qo(e),"events.jsonl")}function jb(e){return ee(Qo(e),"meta.json")}function tc(e){if(typeof e!="string"||e.length===0)throw new Error("Invalid browser profile: must be a non-empty string");if(e.length>vR)throw new Error(`Invalid browser profile: exceeds ${vR} chars`);if(!E2.test(e))throw new Error(`Invalid browser profile: ${JSON.stringify(e)} contains characters outside [A-Za-z0-9_-]`)}function Hb(){return ee(Se(),"browser")}function Wb(e){return tc(e),ee(Hb(),e)}function nc(e){return ee(Wb(e),"storageState.json")}function rc(e){return typeof e=="string"&&e.length>0&&e.length<=R2&&x2.test(e)}function oc(e){if(!rc(e))throw new Error(`Invalid session id for ledger path: ${JSON.stringify(e)}`);return ee(lt(),e)}function Xu(e){return ee(oc(e),"events.jsonl")}function Kb(e){return ee(oc(e),"session.key")}function ic(){return ee(Se(),"mcp","server-status.json")}var b2,k2,SR,E2,vR,x2,R2,q=x(()=>{"use strict";G();b2=/^[a-zA-Z0-9_-]+$/;k2=/^[A-Za-z0-9_-]+$/,SR=128;E2=/^[A-Za-z0-9_-]+$/,vR=128;x2=/^[A-Za-z0-9_-]+$/,R2=128});import{randomBytes as A2}from"node:crypto";import{mkdirSync as C2,renameSync as _2,rmSync as DR,writeFileSync as I2}from"node:fs";import{dirname as P2,isAbsolute as M2,join as O2}from"node:path";function Qu(){return O2(Se(),"last-cwd")}function FR(){try{DR(Qu(),{force:!0})}catch{}}function LR(e){if(!M2(e))throw new Error(`recordCdIntent: target must be an absolute path, got ${JSON.stringify(e)}`);if(/[\n\r\0]/.test(e))throw new Error(`recordCdIntent: target must not contain newline/CR/NUL, got ${JSON.stringify(e)}`);try{let t=Qu();C2(P2(t),{recursive:!0,mode:448});let n=`${t}.tmp.${process.pid}.${A2(6).toString("hex")}`;try{I2(n,e,{encoding:"utf8",mode:384}),_2(n,t)}catch(r){try{DR(n,{force:!0})}catch{}throw r}}catch{}}function NR(){let e=v.AFK_SHELL_WRAPPER;return e==="1"||e==="true"}var Zu=x(()=>{"use strict";G();q()});var ct,yt,np,he,jn,Zr,bs,rp,Fe=x(()=>{"use strict";ct=class extends Error{constructor(t){super(t),this.name="AbortError"}},yt=class extends Error{constructor(n,r){super(n);this.timeoutMs=r;this.name="TimeoutError"}timeoutMs},np=class extends yt{constructor(t,n){super(t,n),this.name="IdleWatchdogError"}},he=class extends Error{constructor(n,r,o,i){super(n);this.event=r;this.reason=o;this.name="HookBlockedError",i?.cause!==void 0&&(this.cause=i.cause)}event;reason;cause},jn=class extends Error{constructor(t){super(t),this.name="StreamIncompleteError"}},Zr=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},bs=class extends Error{constructor(t){super(t),this.name="DenialCircuitBreakerError"}},rp=class extends Error{constructor(n,r,o){super(o??`${n} provider does not support AgentConfig.${r}.`);this.provider=n;this.field=r;this.name="UnsupportedProviderConfigError"}provider;field}});function Ke(){return v.AFK_DEBUG==="1"||v.DEBUG==="1"}function W(...e){Ke()&&console.log(...e)}var ye=x(()=>{"use strict";G()});async function Rs(e,t){if(e)try{await e.write({kind:"tool_call",payload:t})}catch(n){W(`trace.emit tool_call failed: ${Hn(n)}`)}}async function wn(e,t){if(e)try{await e.write({kind:"hook_decision",payload:t})}catch(n){W(`trace.emit hook_decision failed: ${Hn(n)}`)}}async function ti(e,t){if(e)try{await e.write({kind:"subagent_lifecycle",payload:t})}catch(n){W(`trace.emit subagent_lifecycle failed: ${Hn(n)}`)}}async function ni(e,t){if(e)try{await e.write({kind:"background_agent",payload:t})}catch(n){W(`trace.emit background_agent failed: ${Hn(n)}`)}}async function fA(e,t){if(e)try{await e.write({kind:"budget",payload:t})}catch(n){W(`trace.emit budget failed: ${Hn(n)}`)}}async function gA(e,t){if(e)try{await e.write({kind:"abort",payload:t})}catch(n){W(`trace.emit abort failed: ${Hn(n)}`)}}async function up(e,t){if(e)try{await e.write({kind:"compaction",payload:t})}catch(n){W(`trace.emit compaction failed: ${Hn(n)}`)}}async function hA(e,t){if(e)try{await e.write({kind:"closure",payload:t})}catch(n){W(`trace.emit closure failed: ${Hn(n)}`)}}async function rt(e,t){if(e)try{await e.write({kind:"browser_event",payload:t})}catch(n){W(`trace.emit browser_event failed: ${Hn(n)}`)}}async function ie(e,t){if(e)try{await e.write({kind:"session_phase",payload:t})}catch(n){W(`trace.emit session_phase failed: ${Hn(n)}`)}}function Hn(e){return e instanceof Error?e.message:String(e)}var xe=x(()=>{"use strict";ye()});function pp(e){return e.startsWith("sk-ant-oat01-")?"oauth":"api-key"}function ac(e,t,n,r){let o=t==="oauth"?{authToken:e}:{apiKey:e},i=typeof n=="string"&&n.length>0?{...o,baseURL:n}:o;return r?{...i,fetch:r}:i}function Sn(e,t,n,r){return e!=="oauth"?{}:{"anthropic-beta":r?`${yA},${xq}`:yA,"x-app":"cli","User-Agent":Rq,"X-Claude-Code-Session-Id":t,"x-client-request-id":n}}function bA(e){return e!=="oauth"?null:[{type:"text",text:Aq}]}var yA,xq,Rq,Aq,As=x(()=>{"use strict";yA="claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,extended-cache-ttl-2025-04-11",xq="effort-2025-11-24",Rq="claude-cli/1.0.0 (external, cli)",Aq="x-anthropic-billing-header: cc_version=1.0.0.test; cc_entrypoint=cli; cch=00000;"});function fp(e){aw=e}function ow(e){if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0}function mp(e,t,n){let r={},o=ow(e);o&&(r.id=o);let i=ow(t);i&&(r.baseUrl=i);let s=ow(n);return s&&(r.apiKey=s),r}function Cq(){return{local:mp(v.AFK_MODEL_LOCAL,v.AFK_MODEL_LOCAL_BASE_URL,v.AFK_MODEL_LOCAL_API_KEY),small:mp(v.AFK_MODEL_SMALL,v.AFK_MODEL_SMALL_BASE_URL,v.AFK_MODEL_SMALL_API_KEY),medium:mp(v.AFK_MODEL_MEDIUM,v.AFK_MODEL_MEDIUM_BASE_URL,v.AFK_MODEL_MEDIUM_API_KEY),large:mp(v.AFK_MODEL_LARGE,v.AFK_MODEL_LARGE_BASE_URL,v.AFK_MODEL_LARGE_API_KEY)}}function dw(e){let t=Cq(),n={};for(let r of lc){let o=ri[r],i=e?.[r],s=t[r],a={id:s.id??i?.id??o.id},l=i?.name;l&&(a.name=l);let c=i?.provider;c&&(a.provider=c);let d=s.baseUrl??i?.baseUrl;d&&(a.baseUrl=d);let u=s.apiKey??i?.apiKey;u&&(a.apiKey=u),n[r]=a}return n}function _s(e){return e||aw||dw()}function Is(e,t=_s()){let n=e.trim().toLowerCase();if(!(!n||n===vA)){for(let r of lc){let o=t[r].name;if(o&&o.trim().toLowerCase()===n)return r}if(n==="local"||n==="small"||n==="medium"||n==="large")return n}}function oi(e,t=_s()){if(e===void 0)return{id:""};let n=Is(e,t);if(n)return t[n];let r=cw[e.trim().toLowerCase()];return r?{id:r}:{id:e}}function oo(e,t=_s()){if(e!==void 0)return oi(e,t).id}function Ps(e,t=_s()){if(e===void 0)return;let n=Is(e,t);if(n&&t[n].id.trim()===""){let r=n.toUpperCase();return`The "${n}" model tier is not configured (no model id). Set AFK_MODEL_${r}=<id> (optionally AFK_MODEL_${r}_BASE_URL / AFK_MODEL_${r}_API_KEY) or "models.${n}" in afk.config.json, then retry.`}}function kA(e){let t={};if(!e||typeof e!="object")return t;let n=e;for(let r of lc){let o=Iq(n[r]);o&&(t[r]=o)}return t}function TA(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="anthropic"||t==="anthropic-direct")return"anthropic";if(t==="openai"||t==="openai-compatible")return"openai";if(t==="chatgpt-oauth"||t==="chatgpt")return"chatgpt-oauth"}function Cs(e){return typeof e=="string"?e.trim():""}function wA(e){return/[\x00-\x1f\x7f]/.test(e)}function Iq(e){if(typeof e=="string"){let t=e.trim();return t?{id:t}:void 0}if(e&&typeof e=="object"){let t=e,n=Cs(t.id);if(!n)return;let r={id:n},o=Cs(t.name);o&&(r.name=o);let i=TA(t.provider);i&&(r.provider=i);let s=Cs(t.baseUrl);s&&(r.baseUrl=s);let a=Cs(t.apiKey);return a&&(r.apiKey=a),r}}function EA(e){if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,error:'model binding must be an object with at least an "id"'};let t=e;if("apiKey"in t||"api_key"in t)return{ok:!1,error:"per-slot API keys are credentials; set AFK_MODEL_<TIER>_API_KEY via `afk config env set` instead of afk.config.json"};if("baseUrl"in t||"base_url"in t)return{ok:!1,error:"per-slot baseUrl is an endpoint-redirect credential vector; set AFK_MODEL_<TIER>_BASE_URL via `afk config env set` instead of afk.config.json"};let n=Cs(t.id);if(!n)return{ok:!1,error:'model binding requires a non-empty "id"'};if(wA(n))return{ok:!1,error:'model binding "id" must not contain control characters'};let r={id:n},o=Cs(t.name);if(o){if(wA(o))return{ok:!1,error:'model binding "name" must not contain control characters'};if(_q.has(o.trim().toLowerCase()))return{ok:!1,error:`model binding "name" must not shadow a built-in alias ("${o}")`};r.name=o}if(t.provider!==void 0&&t.provider!==""){let i=TA(t.provider);if(!i)return{ok:!1,error:'model binding "provider" must be one of: anthropic, openai (aliases: anthropic-direct, openai-compatible)'};r.provider=i}return{ok:!0,value:r}}var lc,SA,iw,sw,lw,ri,vA,cw,cc,aw,_q,It=x(()=>{"use strict";G();lc=["local","small","medium","large"],SA="claude-haiku-4-5-20251001",iw="claude-sonnet-5",sw="claude-opus-5",lw="claude-fable-5",ri={local:{id:""},small:{id:SA},medium:{id:iw},large:{id:sw}},vA="auto",cw={opus:sw,opus_1m:sw,sonnet:iw,sonnet_1m:iw,haiku:SA,fable:lw},cc=[...lc,...Object.keys(cw)];_q=new Set([...lc,vA,...Object.keys(cw)])});function dc(e){return e in uw}function Tt(e){return oo(e)}var uw,vn=x(()=>{"use strict";It();uw={opus:ri.large.id,opus_1m:ri.large.id,sonnet:ri.medium.id,sonnet_1m:ri.medium.id,haiku:ri.small.id,fable:lw}});import Pq from"@anthropic-ai/sdk";import{randomUUID as xA}from"node:crypto";async function Ms(e){let{token:t,model:n,system:r,user:o,maxTokens:i=64,signal:s,clientFactory:a}=e;if(!t)throw new Error("oneShotCompletion: token required");let l=pp(t),c=ac(t,l),d=a?a(c):new Pq(c),u=xA(),m=xA(),f=Sn(l,u,m),g=Tt(n)??n,h={};Object.keys(f).length>0&&(h.headers=f),s&&(h.signal=s);let y=await d.messages.create({model:g,max_tokens:i,system:r,messages:[{role:"user",content:o}]},Object.keys(h).length>0?h:void 0),b=[];for(let S of y.content)S.type==="text"&&b.push(S.text);let w=b.join("").trim();return w.length===0&&console.warn("oneShotCompletion: response contained no text blocks \u2014 returning empty string"),w}var gp=x(()=>{"use strict";As();vn()});import{execFileSync as RA}from"child_process";import{existsSync as Mq,readFileSync as Oq,writeFileSync as $q}from"fs";import{homedir as AA,userInfo as CA}from"os";import{join as _A}from"path";function dt(){let e=IA();if(e===void 0)return;let t=PA(e);if(t!==void 0){if(t.expiresAt!==void 0&&t.expiresAt<=Date.now()){process.stderr.write("agent-afk: Claude Code OAuth token in keychain is expired. Run `claude login` to refresh.\n");return}return t.accessToken}}async function pw(){let e=IA();if(e===void 0)return;let t=PA(e);if(t===void 0)return;if(t.expiresAt!==void 0&&t.expiresAt>Date.now()+Lq)return t.accessToken;if(!t.refreshToken){process.stderr.write("agent-afk: OAuth token expired and no refresh token available. Run `claude login` to refresh.\n");return}let n=await Nq(t.refreshToken);if(!n){process.stderr.write("agent-afk: OAuth token refresh failed. Run `claude login` to refresh.\n");return}try{let r={};try{r=JSON.parse(e)}catch{}let o=r.claudeAiOauth??{};r.claudeAiOauth={...o,accessToken:n.accessToken,expiresAt:n.expiresAt,...n.refreshToken!==void 0?{refreshToken:n.refreshToken}:{}},Bq(JSON.stringify(r))}catch{process.stderr.write(`agent-afk: Refreshed OAuth token but failed to write back to credential store.
4
4
  `)}return n.accessToken}function IA(){if(process.platform==="darwin")try{return RA("security",["find-generic-password","-s","Claude Code-credentials","-a",CA().username,"-w"],{stdio:["ignore","pipe","ignore"],encoding:"utf-8"}).trim()}catch{return}if(process.platform==="linux"){let e=_A(AA(),".claude",".credentials.json");if(!Mq(e))return;try{return Oq(e,"utf-8")}catch{return}}}function PA(e){let t;try{t=JSON.parse(e)}catch{return}if(typeof t!="object"||t===null)return;let n=t.claudeAiOauth;if(typeof n!="object"||n===null)return;let r=n,o=r.accessToken;if(typeof o!="string"||o.length===0)return;let i={accessToken:o},s=r.refreshToken;typeof s=="string"&&s.length>0&&(i.refreshToken=s);let a=r.expiresAt;return typeof a=="number"&&(i.expiresAt=a),i}async function Nq(e){try{let t=await fetch(Fq,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:e,client_id:Dq})});if(!t.ok)return;let n=await t.json(),r=n.access_token,o=n.expires_in;if(typeof r!="string"||typeof o!="number")return;let i=n.refresh_token;return{accessToken:r,expiresAt:Date.now()+o*1e3,...typeof i=="string"&&i.length>0?{refreshToken:i}:{}}}catch{return}}function io(e){if(!e||e.length<3)return"token:(unknown)";try{let n=e.split(".");if(n.length<2)throw new Error("not a JWT");let r=Buffer.from(n[1],"base64url").toString("utf-8"),o=JSON.parse(r),i=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(i)return i}catch{}return`token:${e.length>=8?e.slice(-8):e}`}function Bq(e){if(process.platform==="darwin")RA("security",["add-generic-password","-U","-s","Claude Code-credentials","-a",CA().username,"-w",e],{stdio:["ignore","ignore","ignore"]});else if(process.platform==="linux"){let t=_A(AA(),".claude",".credentials.json");Uq(t,e)}}function Uq(e,t){$q(e,t,{encoding:"utf-8",mode:384})}var Dq,Fq,Lq,ii=x(()=>{"use strict";Dq="9d1c250a-e61b-44d9-88ed-5944d1962f5e",Fq="https://platform.claude.com/v1/oauth/token",Lq=300*1e3});function bt(e,t){if(e===null||typeof e!="object")return;let n=e.headers;if(n==null)return;if(typeof n.get=="function")return n.get(t)??void 0;if(typeof n=="object"){let o=n,i=o[t]??o[t.toUpperCase()];return typeof i=="string"?i:void 0}}function si(e){let t=bt(e,"retry-after-ms");if(t!==void 0){let r=Number(t);if(Number.isFinite(r)&&r>=0)return r}let n=bt(e,"retry-after");if(n!==void 0){let r=Number(n);if(Number.isFinite(r)&&r>=0)return Math.round(r*1e3);let o=Date.parse(n);if(!Number.isNaN(o)){let i=o-Date.now();if(i>=0)return i}}}var mw=x(()=>{"use strict"});function MA(e){if(!Number.isFinite(e)||e<=0)return;let t=e*1e3;if(!(t>Hq))return new Date(t)}function fw(e){if(!("status"in e))return null;let t=e.status;if(t===429){let n=e.message.split("|");if(n.length>=2){let l=MA(parseInt(n[1].trim(),10));if(l!==void 0)return{kind:"oauth-limit",resetsAt:l}}let r=bt(e,"anthropic-ratelimit-unified-representative-claim"),o=bt(e,"anthropic-ratelimit-unified-overage-status"),i=bt(e,"anthropic-ratelimit-unified-status");if(r!==void 0||o!==void 0||i==="rejected"){let l=bt(e,"anthropic-ratelimit-unified-reset");if(l!==void 0){let c=MA(Number(l));if(c!==void 0)return{kind:"oauth-limit",resetsAt:c}}return{kind:"oauth-limit-no-ts"}}if(bt(e,"anthropic-ratelimit-requests-remaining")!==void 0||bt(e,"anthropic-ratelimit-requests-limit")!==void 0||bt(e,"anthropic-ratelimit-requests-reset")!==void 0||bt(e,"anthropic-ratelimit-input-tokens-remaining")!==void 0||bt(e,"anthropic-ratelimit-input-tokens-limit")!==void 0||bt(e,"anthropic-ratelimit-input-tokens-reset")!==void 0||bt(e,"anthropic-ratelimit-output-tokens-remaining")!==void 0||bt(e,"anthropic-ratelimit-output-tokens-limit")!==void 0||bt(e,"anthropic-ratelimit-output-tokens-reset")!==void 0)return{kind:"rate-limit-transient",retryAfterMs:si(e)};let a=si(e);return a!==void 0&&a<=jq?{kind:"rate-limit-transient",retryAfterMs:a}:{kind:"oauth-limit-no-ts"}}return t===400&&e.message.includes("invalid_request_error")&&e.message.includes("credit balance")?{kind:"credit-exhausted"}:null}async function OA(e){let{resetsAt:t,signal:n,readToken:r=dt}=e,o=r(),i=t.getTime()+3e4;return new Promise(s=>{let a,l=!1,c=m=>{l||(l=!0,a!==void 0&&clearInterval(a),n.removeEventListener("abort",d),s(m))},d=()=>{c("aborted")},u=()=>n.aborted?(c("aborted"),!0):Date.now()>=i?(c("timer"),!0):r()!==o?(c("hot-swap"),!0):!1;u()||(a=setInterval(()=>{u()},3e4),a.unref(),n.addEventListener("abort",d,{once:!0}))})}async function $A(e){let{signal:t,readToken:n=dt,retryAfterMs:r}=e,o=n(),i=r!==void 0?Date.now()+r:void 0;return new Promise(s=>{let a,l=!1,c=m=>{l||(l=!0,a!==void 0&&clearInterval(a),t.removeEventListener("abort",d),s(m))},d=()=>{c("aborted")},u=()=>t.aborted?(c("aborted"),!0):n()!==o?(c("hot-swap"),!0):i!==void 0&&Date.now()>=i?(c("timer"),!0):!1;u()||(a=setInterval(()=>{u()},3e4),a.unref(),t.addEventListener("abort",d,{once:!0}))})}var jq,Hq,gw=x(()=>{"use strict";ii();mw();jq=300*1e3,Hq=864e13});function hw(e,t=fetch,n,r){return!e&&!n&&!r?t:async(o,i)=>{let s=await t(o,i);if(r)try{r(s.headers)}catch{}if(Wq.has(s.status)){let a=si({headers:s.headers});if(n)try{n({status:s.status,...a!==void 0?{retryAfterMs:a}:{}})}catch{}if(e){let l={status:s.status,reason:s.status===429?"rate-limit":"overloaded",source:"sdk-fetch"};a!==void 0&&(l.retryAfterMs=a),ie(e,{phase:"rate_limit",...a!==void 0?{durationMs:a}:{},metadata:l})}}return s}}var Wq,DA=x(()=>{"use strict";xe();gw();Wq=new Set([429,503,529])});var hp,FA=x(()=>{"use strict";hp=class{items=[];waiter=null;attempts=0;push(t){this.attempts+=1;let n={status:t.status,attempt:this.attempts,...t.retryAfterMs!==void 0?{retryAfterMs:t.retryAfterMs}:{}};this.items.push(n);let r=this.waiter;this.waiter=null,r&&r()}takeAll(){return this.items.length===0?[]:this.items.splice(0,this.items.length)}waitForItem(){return this.items.length>0?Promise.resolve():new Promise(t=>{this.waiter=t})}resetAttempts(){this.attempts=0}}});function LA(e){if(e===null)return;let t=Number(e);if(Number.isFinite(t))return Math.min(1,Math.max(0,t))}function NA(e){if(e===null)return;let t=Number(e);if(!(!Number.isFinite(t)||t<0||t>Kq))return new Date(t*1e3)}function BA(e){try{let t=LA(e.get("anthropic-ratelimit-unified-5h-utilization")),n=NA(e.get("anthropic-ratelimit-unified-5h-reset")),r=LA(e.get("anthropic-ratelimit-unified-7d-utilization")),o=NA(e.get("anthropic-ratelimit-unified-7d-reset"));return t===void 0&&r===void 0?void 0:{...t!==void 0?{fiveHourUtilization:t}:{},...n!==void 0?{fiveHourResetsAt:n}:{},...r!==void 0?{sevenDayUtilization:r}:{},...o!==void 0?{sevenDayResetsAt:o}:{},observedAt:new Date}}catch{return}}function yp(e){return e===void 0?void 0:Math.round(e*100)}function UA(e){let t=yw,n=t===void 0||yp(t.fiveHourUtilization)!==yp(e.fiveHourUtilization)||yp(t.sevenDayUtilization)!==yp(e.sevenDayUtilization);if(yw=e,!!n)for(let r of bw)try{r()}catch{}}function jA(){return yw}function HA(e){return bw.add(e),()=>{bw.delete(e)}}var Kq,yw,bw,bp=x(()=>{"use strict";Kq=Date.UTC(2100,0,1)/1e3;bw=new Set});function Wn(e){return e==="bypassPermissions"||e==="autonomous"}var uc=x(()=>{"use strict"});function wp(e){if(typeof e?.baseUrl=="string"&&e.baseUrl.length>0)return!1;let t=v.AFK_DISABLE_PROMPT_CACHE;if(t===void 0||t.length===0)return!0;let n=t.toLowerCase();return!(n==="1"||n==="true"||n==="yes"||n==="on")}function Sp(){let e=v.AFK_PROMPT_CACHE_TTL;return e==="5m"?"5m":e==="1h"?"1h":Gq}function WA(e,t){if(e.length===0)return e;let n=e[e.length-1],r=GA(n,t);return r===n?e:[...e.slice(0,-1),r]}function KA(e,t){if(e.length===0)return e;let n=e[e.length-1],r=qq(n,t);return r===n?e:[...e.slice(0,-1),r]}function qq(e,t){let n=e.content;if(typeof n=="string")return n.length===0?e:{...e,content:[{type:"text",text:n,cache_control:{type:"ephemeral",ttl:t}}]};if(!Array.isArray(n)||n.length===0)return e;let r=n[n.length-1],o=GA(r,t);return o===r?e:{...e,content:[...n.slice(0,-1),o]}}function GA(e,t){return e.type==="thinking"||e.type==="redacted_thinking"?e:{...e,cache_control:{type:"ephemeral",ttl:t}}}var Gq,ww=x(()=>{"use strict";G();Gq="1h"});function Sw(e){return e!=="plan"?null:{type:"text",text:vp}}var vp,vw=x(()=>{"use strict";vp=["## Plan mode is active","","File and memory write tools (`write_file`, `edit_file`, `memory_update`, `procedure_write`) are refused at the hook layer.","`bash` runs for read-only investigation (git status/log/diff, ls, cat, grep, find \u2014 chained or not); state-mutating bash (file writes, rm, installs, commits, pushes) is refused while planning. The user has asked you to plan, not yet to act \u2014 exit plan mode to make changes.","Treat this turn as planning work.","","Traverse the shape that matches the work \u2014 skip steps the terrain already covers, do not skip steps the terrain hides:",""," unknown field \u2192 ground the current terrain \u2192 gather missing codebase context \u2192"," research missing external context \u2192 reveal chaos / constraints / risks \u2192"," name the failure geometry \u2192 form a candidate plan \u2192 apply adversarial pressure \u2192 embody the final plan","","Reach for these skills (invoke via the `skill` tool) when the cost of skipping exceeds the cost of dispatching:"," - `ground-state` \u2014 survey git, infra, memory before non-trivial work"," - `gather` \u2014 parallel context-gathering for a code area"," - `research` \u2014 parallel external + local context for the current task"," - `devils-advocate` \u2014 generate alternatives and rank them before committing"," - `shadow-verify` \u2014 independently re-derive load-bearing claims","","Do not declare readiness silently. When the plan is ready, state: chosen approach, risks named, and alternatives considered.","","Then, IF the task requires implementation (writing code or files), call the `exit_plan_mode` tool to present your plan. The user picks how to proceed (approve and implement, or keep planning). After calling it, END YOUR TURN \u2014 on approval you will receive a separate instruction to save the plan to a file and implement it. Do NOT use `ask_question` to ask whether the plan is OK; that is exactly what `exit_plan_mode` does \u2014 use `ask_question` only to resolve open requirement questions first. For research / read-only tasks that need no code changes, do NOT call `exit_plan_mode` \u2014 just answer.","","Manual fallbacks remain: the user can exit with `/plan off` (same save-and-implement handoff), and Shift+Tab advances the permission-mode ring without saving or implementing. Keep the plan concrete and complete enough to act on directly."].join(`
5
5
  `)});var qA=x(()=>{"use strict";vw()});function kw(e){return e!=="autonomous"?null:{type:"text",text:kp}}var kp,Tw=x(()=>{"use strict";kp=["## AFK mode is active","","The operator is away from keyboard. Your channel to them is Telegram via the `send_telegram` tool \u2014 not this transcript, which no one is watching live. At the end of each turn, push your terminal state (Done / Blocked / Asking) to Telegram so the operator can review asynchronously.","","Posture \u2014 bounded autonomy, not unchecked action:"," - Proceed autonomously on reversible work. Do not stop to confirm actions you are already authorized to take and can undo (edits, reads, tests, local commits, non-force pushes, installs)."," - At a one-way door \u2014 anything irreversible, externally visible, credential- or payment-touching, or where multiple readings lead to materially different work \u2014 do NOT guess. Push a concise Asking summary to Telegram naming the decision and your recommended default, then stop and end the turn in the Asking state."," - A mechanical gate refuses high-risk and irreversible operations at the hook layer regardless of this text. Treat a gate refusal as a signal to surface the decision to the operator, not an obstacle to work around.","","Communication discipline:"," - Batch updates. Send a Telegram message at terminal state (and at a genuinely blocking fork), not a play-by-play \u2014 the operator gets a push notification for every message."," - Keep pushes short and scannable: what happened, what changed, what (if anything) you need. Never paste raw tool output, logs, secrets, or full file contents into a push.","","Exit: the operator returns and runs `/afk off` (or Shift+Tab) to restore default permissions and terminal-channel interaction."].join(`
6
6
  `)});var zA=x(()=>{"use strict";Tw()});function Os(e,t=()=>{}){let n=new Set;if(!e)return n;for(let r of e.split(",")){let o=r.trim();if(o){if(!/^-?\d+$/.test(o)){t("[allowlist] Ignoring non-numeric chat ID:",o);continue}n.add(Number(o))}}return n}function Tp(e,t){return t.has(e)}var Ep=x(()=>{"use strict"});var $s,xp,Ew=x(()=>{"use strict";$s={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},xp="bypassPermissions"});function pc(){return v.ANTHROPIC_API_KEY||v.CLAUDE_CODE_OAUTH_TOKEN||dt()}function mc(){return v.OPENAI_API_KEY||v.CODEX_API_KEY||void 0}function Pe(e){let t=re(e);return t==="openai-compatible"||t==="openai-codex"?mc():pc()}var Et=x(()=>{"use strict";Be();ii();G()});import{existsSync as zq}from"fs";import{join as Jq}from"path";import{config as Yq}from"dotenv";function Rp(){return pc()}function VA(e){let t=e.trim();if(!t)return t;let n="/chat/completions";if(t.endsWith(n)){let r=t.slice(0,-n.length);return YA.has(t)||(YA.add(t),console.warn(`[afk] AFK_OPENAI_BASE_URL: stripped trailing "/chat/completions" \u2014 the OpenAI SDK appends it automatically.
@@ -868,7 +868,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
868
868
  [results capped at 500 entries]`),{content:d}}catch(l){return l instanceof Error?"code"in l&&l.code==="ENOENT"?{content:`Path not found: ${a}`,isError:!0}:"code"in l&&l.code==="EACCES"?{content:`Permission denied: ${a}`,isError:!0}:{content:`Error scanning directory: ${l.message}`,isError:!0}:{content:"Unknown error scanning directory",isError:!0}}}}var l4,B_,U_=x(()=>{"use strict";Xn();l4=new Set(["node_modules",".git",".hg",".svn"]);B_=TS()});import{accessSync as p4,constants as m4}from"node:fs";function j_(e){try{p4(e,m4.X_OK);return}catch(t){let n=t instanceof Error?t.message:String(t);return`ripgrep binary is missing or not executable: ${e} (the @vscode/ripgrep platform optional-dependency for ${process.platform}-${process.arch} may not be installed \u2014 e.g. an install with --no-optional, an unsupported platform/arch, or a corrupted node_modules) \u2014 underlying: ${n}`}}var H_=x(()=>{"use strict"});import{spawn as f4}from"child_process";function g4(e,t,n){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let r=e;if(typeof r.pattern!="string")throw new Error('Input must have a "pattern" field of type string');let o=typeof r.path=="string"?r.path:t?.resolveBase??t?.cwd??n??process.cwd(),i=an(o,t,"read"),s;if(r.include!==void 0){if(typeof r.include!="string")throw new Error("include must be a string");s=r.include}return{pattern:r.pattern,path:i,include:s}}function ES(e){return async(t,n,r)=>{let{pattern:o,path:i,include:s}=g4(t,r,e);if(n.aborted)return{content:"Search aborted",isError:!0};let a;try{({rgPath:a}=await import("@vscode/ripgrep"))}catch(l){return{content:`Failed to execute grep: ripgrep is unavailable \u2014 ${l instanceof Error?l.message:String(l)}`,isError:!0}}return new Promise(l=>{let c=!1;function d(T){c||(c=!0,n.removeEventListener("abort",S),l(T))}let u=["-n","--no-heading","--color=never","--hidden"];s&&u.push("-g",s),u.push("-g","!.git"),u.push("--",o,i);let m=r?.resolveBase??r?.cwd??e,f=f4(a,u,m!==void 0?{cwd:m}:{}),g="",h="",y=0,b=!1;function w(T){if(b||c||y<8e6)return;b=!0,console.warn(`[grep] overflow kill: stream=${T} totalBytes=${y} pattern=${o} path=${i}`),$e({event:"tool.overflow_kill",tool:"grep",total_bytes:y,stream:T}),f.kill("SIGKILL");let k=Vn((g+h).trimEnd()),A=Ar(k,1e5)+Qp;d({content:A,truncated:!0})}f.stdout.on("data",T=>{let k=8e6-y,A=T.length<=k?T:T.subarray(0,Math.max(0,k));y+=A.length,g+=A.toString("utf8"),w("stdout")}),f.stderr.on("data",T=>{let k=8e6-y,A=T.length<=k?T:T.subarray(0,Math.max(0,k));y+=A.length,h+=A.toString("utf8"),w("stderr")});let S=()=>{f.kill(),d({content:"Search aborted",isError:!0})};n.addEventListener("abort",S),f.on("close",T=>{if(b)return;if(T===1){let F=`No matches found for '${o}' in ${i}`;d({content:F});return}if(T===2){let F=Gs(h.trim());d({content:`grep error: ${F.content}`,isError:!0,...F.truncated?{truncated:!0}:{}});return}let k=Vn(g.trimEnd()),A=Gs(k);d({content:A.content,...A.truncated?{truncated:!0}:{}})}),f.on("error",T=>{let k=j_(a);if(k!==void 0){d({content:`Failed to execute grep: ${k}`,isError:!0});return}let A;if(m===void 0&&Pc(T))try{A=Xs(T,process.cwd())}catch{A=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${T.message}`}else A=Xs(T,m);d({content:`Failed to execute grep: ${A}`,isError:!0})})})}}var W_,K_=x(()=>{"use strict";Jn();Xn();po();hS();H_();qs();W_=ES()});import{promises as h4}from"fs";function xS(e){return(t,n,r)=>y4(t,n,r,e)}var y4,G_,q_=x(()=>{"use strict";Xn();y4=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=an(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await h4.readdir(s,{withFileTypes:!0}),l=a.filter(m=>m.isDirectory()).map(m=>`${m.name}/`),c=a.filter(m=>!m.isDirectory()).map(m=>m.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
869
869
  `)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};G_=xS()});function b4(e=Bs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let r=t,o=r.message,i=r.chat;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(i!==void 0&&typeof i!="number"&&typeof i!="string")return{content:"Invalid input: chat must be a number (chat id) or string (chat id or alias name)",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>z_)return{content:`Invalid input: message exceeds Telegram's ${z_}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let a;if(i!==void 0){let c=Op(i,$p());if(!c.ok)return{content:c.message,isError:!0};let d=Os(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(!Tp(c.id,d)){let u=[...d];return{content:`Refusing to send: chat ${c.id} is not in the allowlist (AFK_TELEGRAM_ALLOWED_CHAT_IDS). `+(u.length>0?`Allowed chat id(s): ${u.join(", ")}. `:"The allowlist is empty or unset. ")+"Add the chat id to the allowlist before targeting it.",isError:!0}}a=[c.id]}else a=Ns();if(a.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let l=[];for(let c of a){let d=await e({token:s,chatId:c,text:o});d.ok||l.push(`chat ${c}: ${d.errorMessage??`HTTP ${d.status}`}`)}return l.length===a.length?{content:`Failed to send Telegram message to any chat. ${l.join("; ")}`,isError:!0}:l.length>0?{content:`Sent Telegram message to ${a.length-l.length}/${a.length} chat(s); ${l.length} failed: ${l.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var z_,J_,Y_=x(()=>{"use strict";G();Tr();wc();Ep();z_=4096;J_=b4()});async function w4(){let[{JSDOM:e},{Readability:t},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:e,Readability:t,turndown:r}}function S4(){return RS===null&&(RS=w4()),RS}function V_(e){return e.replace(/\n{3,}/g,`
870
870
 
871
- `).trim()}function v4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function X_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await S4(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=V_(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=V_(o.turndown(d));return{title:a,markdown:u,textLength:v4(c),usedFallback:!0}}var RS,Q_=x(()=>{"use strict";RS=null});function T4(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function Z_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function E4(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function ym(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??T4,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!k4.has(u.status)||d===o)return u;let m=E4(u,s)??Z_(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=Z_(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var k4,AS=x(()=>{"use strict";ye();k4=new Set([429,502,503,504])});import{readFileSync as x4}from"node:fs";import{join as R4}from"path";function A4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function eI(e,t){return A4(t).test(e)}function I4(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(C4.has(t))return!0;if(_4.has(t))return!1}return!1}function tI(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function P4(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function nI(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tc(t),t}function M4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function O4(e){try{return x4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function $4(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=nI(t.defaultProfile)),n}function rI(e){let t=e?.env??v,n=e?.readFileSync??O4,r=e?.surface??t.AGENT_SURFACE,o=I4(t.AFK_BROWSER_HEADLESS,r),i=tI(t.AFK_BROWSER_ALLOWED_DOMAINS),s=tI(t.AFK_BROWSER_BLOCKED_DOMAINS),a=M4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=P4(t.AFK_BROWSER_BACKEND),c=nI(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():R4(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=$4(d,g);return h.configPath=m,h}function CS(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(eI(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>eI(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var C4,_4,_S=x(()=>{"use strict";G();q();C4=new Set(["daemon","subagent","telegram","afk"]),_4=new Set(["repl","interactive","cli"])});import hi from"node:fs";import bm from"node:path";import{randomBytes as D4}from"node:crypto";import{chromium as F4}from"playwright";function L4(){try{return"5.81.0"}catch{}try{let e=bm.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var N4,wm,oI=x(()=>{"use strict";q();ye();N4=L4(),wm=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=F4.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${N4}`}}loadStorageState(t){let n=nc(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nc(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=bm.join(bm.dirname(r),`.${bm.basename(r)}.${process.pid}.${D4(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as B4}from"crypto";function IS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of U4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function iI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&j4.test(e.label))}function sI(e){return B4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function aI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var U4,j4,$c=x(()=>{"use strict";U4=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];j4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as H4}from"node:crypto";function W4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function K4(e,t,n){return`el_${H4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function G4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function lI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function dI(e,t){let n=e.role??"",r=e.name??"";cI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])dI(i,t)}async function q4(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},uI).catch(()=>[])}async function z4(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},uI).catch(()=>[])}function J4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Sm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=J4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=q4(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],dI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await z4(e)).filter(B=>cI.has(B.role??"")));let w=new Map;for(let O of m){let B=lI(O.name),j=w.get(B);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(B,O)}let S=y.map(O=>({ax:O,dom:w.get(lI(O.name??""))})),T=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,B)=>{let j=O.dom?.bbox.y??0,$=B.dom?.bbox.y??0;if(j!==$)return j-$;let H=O.dom?.bbox.x??0,C=B.dom?.bbox.x??0;return H-C}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,B)=>{let j=O.ax.role??"generic",$=O.ax.name??"",H=K4(j,$,B),C=O.dom?.bbox??{x:0,y:0,w:0,h:0},L=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),iI({role:j,kind:L})&&(P="[redacted]");let M={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(M.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(M.selected=O.ax.selected),O.ax.expanded!==void 0&&(M.expanded=O.ax.expanded);let I;O.dom?.testId?I=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(I=`#${O.dom.id}`);let U={id:H,role:j,label:W4($),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(U.selector=I),U}),F="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?F="loading":O==="interactive"?F="navigating":F="idle"}catch{F="navigating"}F!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=G4(f),D=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:F,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var cI,uI,pI=x(()=>{"use strict";$c();cI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);uI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function mI(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function PS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>mI(e,i)))).filter(o=>o!==null)}async function Y4(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function MS(e,t,n){switch(t.kind){case"element_id":return V4(e,t,n);case"selector":return X4(e,t);case"semantic":return Q4(e,t)}}async function V4(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await PS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function X4(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await PS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Q4(e,t){return t.role!==void 0?Z4(e,t.text,t.role):e8(e,t.text,t)}async function Z4(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await PS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function e8(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await Y4(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await mI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var fI=x(()=>{"use strict"});import{randomBytes as t8}from"crypto";import{mkdir as n8,stat as r8,writeFile as o8}from"fs/promises";import{join as OS}from"path";import{gzip as i8}from"zlib";import{promisify as s8}from"util";function a8(e){return OS(Xo(e),"browser")}function l8(e){return OS(a8(e),"screenshots")}function c8(){return new Date().toISOString().replace(/[:.]/g,"-")}function d8(){return t8(3).toString("hex")}async function $S(e,t,n){if(t.length>gI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${gI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=l8(e);await n8(r,{recursive:!0});let o=`${c8()}-${d8()}-${n}.png`,i=OS(r,o);await o8(i,t);let{size:s}=await r8(i);return{path:i,bytes:s}}var sRe,gI,hI=x(()=>{"use strict";q();$c();sRe=s8(i8);gI=5*1024*1024});var bI={};Bu(bI,{PlaywrightProvider:()=>DS});function yI(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var DS,wI=x(()=>{"use strict";oI();pI();fI();_S();$c();hI();DS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new wm(t)}async open(t){let n=CS(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Sm(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Sm(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await MS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${yI(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=IS(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=CS(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Sm(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await MS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${yI(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await $S(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await $S(n,o,r);return i}catch{return null}}}});var bi={};Bu(bi,{__resetBrowserRegistryForTests:()=>g8,browserProviderActive:()=>m8,closeBrowserProvider:()=>FS,getBrowserProvider:()=>p8,peekBrowserProvider:()=>f8});function SI(){Promise.resolve(FS()).then(()=>{process.exit(130)})}function vI(){Promise.resolve(FS()).then(()=>{process.exit(143)})}function kI(){Qn=null}function u8(){vm||(process.on("SIGINT",SI),process.on("SIGTERM",vI),process.on("exit",kI),vm=!0)}function TI(){vm&&(process.removeListener("SIGINT",SI),process.removeListener("SIGTERM",vI),process.removeListener("exit",kI),vm=!1)}async function p8(e){return Qn!==null?Qn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(wI(),bI)),n=rI(e),r=new t(n);return u8(),Qn=r,yi=null,r})()),yi)}async function FS(){if(Qn===null)return;let e=Qn;Qn=null,yi=null,TI(),await e.shutdown()}function m8(){return Qn!==null}function f8(){return Qn}function g8(){Qn=null,yi=null,TI()}var Qn,yi,vm,wi=x(()=>{"use strict";_S();Qn=null,yi=null,vm=!1});async function EI(e,t){try{return await X_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function v8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function xI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??v8,o=null,i=e,s=null,a=null;try{let c=await ym(n,e,{headers:S8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(w8.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(b8.test(d)&&!y8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await EI(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await EI(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var y8,b8,w8,S8,RI=x(()=>{"use strict";Q_();AS();ye();y8=/(text\/html|application\/xhtml\+xml)/i,b8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,w8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,S8={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function E8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(k8,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),T8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function AI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?E8({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function CI(e,t){if(t.length===0)return`# Search results for "${e}"
871
+ `).trim()}function v4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function X_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await S4(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=V_(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=V_(o.turndown(d));return{title:a,markdown:u,textLength:v4(c),usedFallback:!0}}var RS,Q_=x(()=>{"use strict";RS=null});function T4(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function Z_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function E4(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function ym(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??T4,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!k4.has(u.status)||d===o)return u;let m=E4(u,s)??Z_(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=Z_(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var k4,AS=x(()=>{"use strict";ye();k4=new Set([429,502,503,504])});import{readFileSync as x4}from"node:fs";import{join as R4}from"path";function A4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function eI(e,t){return A4(t).test(e)}function I4(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(C4.has(t))return!0;if(_4.has(t))return!1}return!1}function tI(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function P4(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function nI(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tc(t),t}function M4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function O4(e){try{return x4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function $4(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=nI(t.defaultProfile)),n}function rI(e){let t=e?.env??v,n=e?.readFileSync??O4,r=e?.surface??t.AGENT_SURFACE,o=I4(t.AFK_BROWSER_HEADLESS,r),i=tI(t.AFK_BROWSER_ALLOWED_DOMAINS),s=tI(t.AFK_BROWSER_BLOCKED_DOMAINS),a=M4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=P4(t.AFK_BROWSER_BACKEND),c=nI(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():R4(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=$4(d,g);return h.configPath=m,h}function CS(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(eI(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>eI(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var C4,_4,_S=x(()=>{"use strict";G();q();C4=new Set(["daemon","subagent","telegram","afk"]),_4=new Set(["repl","interactive","cli"])});import hi from"node:fs";import bm from"node:path";import{randomBytes as D4}from"node:crypto";import{chromium as F4}from"playwright";function L4(){try{return"5.81.2"}catch{}try{let e=bm.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var N4,wm,oI=x(()=>{"use strict";q();ye();N4=L4(),wm=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=F4.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${N4}`}}loadStorageState(t){let n=nc(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nc(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=bm.join(bm.dirname(r),`.${bm.basename(r)}.${process.pid}.${D4(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as B4}from"crypto";function IS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of U4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function iI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&j4.test(e.label))}function sI(e){return B4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function aI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var U4,j4,$c=x(()=>{"use strict";U4=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];j4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as H4}from"node:crypto";function W4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function K4(e,t,n){return`el_${H4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function G4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function lI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function dI(e,t){let n=e.role??"",r=e.name??"";cI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])dI(i,t)}async function q4(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},uI).catch(()=>[])}async function z4(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},uI).catch(()=>[])}function J4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Sm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=J4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=q4(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],dI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await z4(e)).filter(B=>cI.has(B.role??"")));let w=new Map;for(let O of m){let B=lI(O.name),j=w.get(B);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(B,O)}let S=y.map(O=>({ax:O,dom:w.get(lI(O.name??""))})),T=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,B)=>{let j=O.dom?.bbox.y??0,$=B.dom?.bbox.y??0;if(j!==$)return j-$;let H=O.dom?.bbox.x??0,C=B.dom?.bbox.x??0;return H-C}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,B)=>{let j=O.ax.role??"generic",$=O.ax.name??"",H=K4(j,$,B),C=O.dom?.bbox??{x:0,y:0,w:0,h:0},L=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),iI({role:j,kind:L})&&(P="[redacted]");let M={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(M.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(M.selected=O.ax.selected),O.ax.expanded!==void 0&&(M.expanded=O.ax.expanded);let I;O.dom?.testId?I=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(I=`#${O.dom.id}`);let U={id:H,role:j,label:W4($),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(U.selector=I),U}),F="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?F="loading":O==="interactive"?F="navigating":F="idle"}catch{F="navigating"}F!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=G4(f),D=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:F,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var cI,uI,pI=x(()=>{"use strict";$c();cI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);uI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function mI(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function PS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>mI(e,i)))).filter(o=>o!==null)}async function Y4(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function MS(e,t,n){switch(t.kind){case"element_id":return V4(e,t,n);case"selector":return X4(e,t);case"semantic":return Q4(e,t)}}async function V4(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await PS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function X4(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await PS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Q4(e,t){return t.role!==void 0?Z4(e,t.text,t.role):e8(e,t.text,t)}async function Z4(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await PS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function e8(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await Y4(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await mI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var fI=x(()=>{"use strict"});import{randomBytes as t8}from"crypto";import{mkdir as n8,stat as r8,writeFile as o8}from"fs/promises";import{join as OS}from"path";import{gzip as i8}from"zlib";import{promisify as s8}from"util";function a8(e){return OS(Xo(e),"browser")}function l8(e){return OS(a8(e),"screenshots")}function c8(){return new Date().toISOString().replace(/[:.]/g,"-")}function d8(){return t8(3).toString("hex")}async function $S(e,t,n){if(t.length>gI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${gI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=l8(e);await n8(r,{recursive:!0});let o=`${c8()}-${d8()}-${n}.png`,i=OS(r,o);await o8(i,t);let{size:s}=await r8(i);return{path:i,bytes:s}}var sRe,gI,hI=x(()=>{"use strict";q();$c();sRe=s8(i8);gI=5*1024*1024});var bI={};Bu(bI,{PlaywrightProvider:()=>DS});function yI(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var DS,wI=x(()=>{"use strict";oI();pI();fI();_S();$c();hI();DS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new wm(t)}async open(t){let n=CS(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Sm(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Sm(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await MS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${yI(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=IS(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=CS(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Sm(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await MS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${yI(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await $S(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await $S(n,o,r);return i}catch{return null}}}});var bi={};Bu(bi,{__resetBrowserRegistryForTests:()=>g8,browserProviderActive:()=>m8,closeBrowserProvider:()=>FS,getBrowserProvider:()=>p8,peekBrowserProvider:()=>f8});function SI(){Promise.resolve(FS()).then(()=>{process.exit(130)})}function vI(){Promise.resolve(FS()).then(()=>{process.exit(143)})}function kI(){Qn=null}function u8(){vm||(process.on("SIGINT",SI),process.on("SIGTERM",vI),process.on("exit",kI),vm=!0)}function TI(){vm&&(process.removeListener("SIGINT",SI),process.removeListener("SIGTERM",vI),process.removeListener("exit",kI),vm=!1)}async function p8(e){return Qn!==null?Qn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(wI(),bI)),n=rI(e),r=new t(n);return u8(),Qn=r,yi=null,r})()),yi)}async function FS(){if(Qn===null)return;let e=Qn;Qn=null,yi=null,TI(),await e.shutdown()}function m8(){return Qn!==null}function f8(){return Qn}function g8(){Qn=null,yi=null,TI()}var Qn,yi,vm,wi=x(()=>{"use strict";_S();Qn=null,yi=null,vm=!1});async function EI(e,t){try{return await X_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function v8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function xI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??v8,o=null,i=e,s=null,a=null;try{let c=await ym(n,e,{headers:S8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(w8.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(b8.test(d)&&!y8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await EI(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await EI(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var y8,b8,w8,S8,RI=x(()=>{"use strict";Q_();AS();ye();y8=/(text\/html|application\/xhtml\+xml)/i,b8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,w8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,S8={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function E8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(k8,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),T8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function AI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?E8({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function CI(e,t){if(t.length===0)return`# Search results for "${e}"
872
872
 
873
873
  (no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
874
874
  `).trimEnd()}var k8,T8,_I=x(()=>{"use strict";po();k8="https://api.exa.ai/search",T8=10});function P8(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=x8;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,R8)}let a=A8;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,C8)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function LS(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ar(e,t),truncated:!0}}function M8(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return I8.some(o=>r.includes(o))}function O8(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=P8(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await ym(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(g){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let f=LS(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await xI(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});if(u.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let m=LS(u.markdown,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),f=M8(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let d=AI({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:_8,timeoutMs:i.timeoutMs,signal:s.signal}),m=LS(CI(i.query,u),i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var x8,R8,A8,C8,_8,I8,II,PI=x(()=>{"use strict";RI();_I();AS();qs();x8=3e4,R8=12e4,A8=1e5,C8=1e6,_8=10,I8=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"];II=O8()});import{existsSync as OI,mkdirSync as $8,readFileSync as D8,renameSync as F8,unlinkSync as L8,writeFileSync as N8}from"node:fs";import{dirname as MI,join as B8}from"node:path";import{randomBytes as U8}from"node:crypto";function ln(e){let t=e??$b();if(!OI(t))return[];try{let n=D8(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Si(e,t){let n=t??$b();$8(MI(n),{recursive:!0});let r=B8(MI(n),`.schedules.json.${process.pid}.${U8(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{N8(r,o,"utf-8"),F8(r,n)}catch(i){try{OI(r)&&L8(r)}catch{}throw i}}function km(e,t){let n=ln(t),r=n.map(l=>l.id),o=j8(e.name),i=H8(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Si(n,t),a}function Tm(e,t){let n=ln(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Si(o,t),!0)}function Dc(e,t){return ln(t).find(n=>n.id===e)}function j8(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function H8(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function $I(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Em=x(()=>{"use strict";q()});import{existsSync as W8,readFileSync as K8}from"node:fs";import{join as G8}from"node:path";async function xn(e,t,n){let r;try{let o=G8(Ju("default"),"port");if(!W8(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=K8(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var go,NS=x(()=>{"use strict";q();go="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as q8}from"node:fs";import{readFile as z8}from"node:fs/promises";var DI,FI,LI,NI,BI=x(()=>{"use strict";Em();q();NS();DI=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=km({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await xn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await xn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:go}})}},FI=async(e,t)=>{let n=ln();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},LI=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Bn();if(!q8(i))return{content:JSON.stringify([])};let s;try{let c=await z8(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1036,7 +1036,7 @@ ${g.partialOutput}`,...Ri(g.stopReason)},m):(m={content:g.error?.message??c,isEr
1036
1036
  ${BX(H)}`,artifacts:H,runPrompt:`Inspect every ${$} listed in the artifact section.`})}if(d.runHookInspector){let $=f.hook;if($){let H=pk(Ce(),"settings.json"),C=X0(H);T.push({type:"hook",prompt:`${$}
1037
1037
  ${UX(H,C)}`,artifacts:[],runPrompt:`Inspect every hook listed in the Discovered hooks section. Settings file: ${H}.`})}}let k=[];if(T.length>0){let $=await Promise.all(T.map(L=>b.forkSubagent({parent:{sessionId:u},config:{model:o,systemPrompt:`${To.systemPrompt}
1038
1038
 
1039
- ${L.prompt}`,canUseTool:S()},idPrefix:`inspector-${L.type}`,agentType:`inspector-${L.type}`,outputSchema:Le.array(nO),...i?{parentId:i}:{}}))),H=await F0(T.map((L,P)=>{let M=$[P];if(!M)throw new Error(`audit-fit: missing handle for ${L.type} inspector`);return{handle:M,prompt:L.runPrompt}}),{failFast:!1}),C=[];for(let L=0;L<H.length;L++){let P=H[L],M=T[L];if(!M)continue;let I=jX(M.type,P);if(I.kind==="failure"){C.push(I.message);continue}let U=new Map;for(let K of M.artifacts)U.set(K.path,K.source);for(let K of I.output){if(M.type==="hook"){if(K.source!=="user"){C.push(`${M.type}: hook verdict has source=${K.source} (must be 'user')`);continue}}else{let Q=U.get(K.path);if(Q===void 0){C.push(`${M.type}: verdict for unknown path ${K.path} (not in discovered list)`);continue}if(K.source!==Q){C.push(`${M.type}: verdict source mismatch for ${K.path} (expected ${Q}, got ${K.source})`);continue}}k.push(K)}}if(C.length>0){let L=C.map(P=>` - ${P}`).join(`
1039
+ ${L.prompt}`,canUseTool:S()},idPrefix:`inspector-${L.type}`,agentType:`inspector-${L.type}`,outputSchema:Le.array(nO),...i?{parentId:i}:{}}))),H=await F0(T.map((L,P)=>{let M=$[P];if(!M)throw new Error(`audit-fit: missing handle for ${L.type} inspector`);return{handle:M,prompt:L.runPrompt}}),{failFast:!1}),C=[];for(let L=0;L<H.length;L++){let P=H[L],M=T[L];if(!M)continue;let I=jX(M.type,P);if(I.kind==="failure"){C.push(I.message);continue}let U=new Map;for(let K of M.artifacts)U.set(K.path,K.source);for(let K of I.output){if(M.type==="hook"){if(K.source!=="user"){C.push(`${M.type}: hook verdict has source=${K.source} (must be 'user')`);continue}}else{let Z=U.get(K.path);if(Z===void 0){C.push(`${M.type}: verdict for unknown path ${K.path} (not in discovered list)`);continue}if(K.source!==Z){C.push(`${M.type}: verdict source mismatch for ${K.path} (expected ${Z}, got ${K.source})`);continue}}k.push(K)}}if(C.length>0){let L=C.map(P=>` - ${P}`).join(`
1040
1040
  `);throw new Error(`audit-fit: ${C.length} inspector failure(s):
1041
1041
  ${L}`)}}let{inventory:A,misfits:F}=LX(k),R=0;if(l){let $=ER();await Z0($,{recursive:!0});for(let H of F.filter(NX)){let C=H.path.replace(/[^a-z0-9]+/gi,"-").toLowerCase().slice(0,30),L=pk($,`audit-fit-${C}.md`),P=`---
1042
1042
  theme: audit-fit
@@ -1128,7 +1128,7 @@ ${t.body}`)}var u9,bk=x(()=>{"use strict";u9=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9
1128
1128
  `),0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let i;try{i=f9($O(e,o.name,"SKILL.md"),"utf-8")}catch(c){let d=c;d.code!=="ENOENT"&&process.stderr.write(`[afk] skipping skill ${o.name}: ${d.message}
1129
1129
  `);continue}let s=h9(i,o.name);if(!s)continue;s.dir=$O(e,o.name);let l={name:b9(s.name,t),description:s.description,handler:y9(s),origin:t};s.argumentHint&&(l.argumentHint=s.argumentHint),s.flags&&s.flags.length>0&&(l.flags=s.flags),s.context!=="fork"&&(l.context="load",l.loadBody=s.body.replace(/\$\{?SKILL_ROOT\}?/g,()=>s.dir)),Mt(l),r++}return r}function wk(){return Lr(Vl(),"user")}var DO,Sk=x(()=>{"use strict";q();Ot();bk();Ge();DO=1024});var vk=x(()=>{"use strict";oO();iO();IO();PO();MO();Sk()});import{isAbsolute as w9,resolve as S9}from"path";import{pathToFileURL as v9}from"url";async function LO(e,t={}){let n=t.importer??(r=>import(r));for(let r of e){if(r.main===void 0)continue;let o=w9(r.main)?r.main:S9(r.path,r.main);if(!FO.has(o)){FO.add(o);try{let s=(await n(v9(o).href))?.default;typeof s=="function"&&await s(t.pluginApi)}catch(i){t.onError?.(r,i)}}}}var FO,NO=x(()=>{"use strict";FO=new Set});import{existsSync as k9,readFileSync as T9}from"fs";import{join as E9}from"path";function Nr(e){let t=E9(e,".claude-plugin","plugin.json");if(!k9(t))return{name:null,version:null};try{let n=JSON.parse(T9(t,"utf8"));return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():null,version:typeof n.version=="string"&&n.version.trim()?n.version.trim():null}}catch{return{name:null,version:null}}}var Sd=x(()=>{"use strict"});import{z as V}from"zod";var vd,x9,R9,kk,BO,UO,jO,HO,kd,ng=x(()=>{"use strict";vd=1,x9=V.object({toolName:V.string(),toolUseId:V.string().optional(),input:V.string().optional(),inputRaw:V.string().optional(),result:V.string().optional(),isError:V.boolean().optional()}).passthrough(),R9=V.object({user:V.string().default(""),assistant:V.string().default(""),timestamp:V.number().optional(),toolEvents:V.array(x9).optional()}).passthrough(),kk=V.object({sessionId:V.string().optional(),name:V.string().optional(),source:V.enum(["cli","telegram"]).optional(),telegramChatId:V.number().optional(),model:V.string(),startedAt:V.number(),savedAt:V.number(),totalTurns:V.number(),totalCostUsd:V.number().optional(),totalTokens:V.number().optional(),totalDurationMs:V.number().optional(),turns:V.array(R9).default([]),forkedFrom:V.string().optional(),forkedAt:V.number().optional()}).passthrough(),BO=V.enum(["fully_achieved","partially_achieved","not_achieved","aborted"]),UO=V.enum(["not_persisted","persisted","unknown"]),jO=V.object({tool:V.string(),label:V.string().optional()}),HO=V.object({files_written:V.number().int(),files_edited:V.number().int(),bash_commands:V.number().int(),commits:V.number().int(),mutated:V.boolean()}),kd=V.object({facet_version:V.number().int(),session_id:V.string(),source:V.enum(["cli","telegram","unknown"]),model:V.string(),derived_at:V.string(),derived_from:V.literal("afk-session"),source_session_path:V.string(),source_session_mtime_ms:V.number(),subagent_persistence:UO,start_time:V.string(),end_time:V.string(),duration_minutes:V.number(),underlying_goal:V.string(),first_prompt:V.string(),goal_categories:V.record(V.string(),V.number()),session_type:V.string(),brief_summary:V.string(),total_turns:V.number().int(),user_message_count:V.number().int(),assistant_message_count:V.number().int(),tool_counts:V.record(V.string(),V.number()),commands:V.array(V.string()),skills:V.array(V.string()),subagents:V.array(jO),tool_errors:V.number().int(),tool_error_categories:V.record(V.string(),V.number()),friction_counts:V.record(V.string(),V.number()),friction_detail:V.string(),outcome:BO,primary_success:V.string(),world_changes:HO,decisions:V.array(V.string()),evidence_pointers:V.array(V.string())}).passthrough()});import{basename as A9}from"path";function O9(e){if(e)try{let t=JSON.parse(e);return t&&typeof t=="object"?t:void 0}catch{return}}function rg(e){return typeof e=="string"?e:void 0}function og(e,t){let n=e.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n}function $9(e){return e.replace(/[-_]+/g," ").trim()}function D9(e,t){return KO.test(e)?"slash_command":t==="telegram"?"chat":"task"}function F9(e){let t=new Map,n=[];for(let r of e)r.toolUseId===void 0?n.push(r):t.set(r.toolUseId,r);return[...t.values(),...n]}function Td(e,t={}){let n=e.turns??[],r=F9(n.flatMap(C=>C.toolEvents??[])),o={},i={},s=[],a=[],l=[],c=0,d=0,u=0,m=0,f=0;for(let C of r){let L=C.toolName;o[L]=(o[L]??0)+1,C.isError===!0&&(c+=1,i[L]=(i[L]??0)+1);let P=O9(C.inputRaw??C.input);if(L==="write_file"&&(d+=1),L==="edit_file"&&(u+=1),L==="bash"){m+=1;let M=rg(P?.command)??C.input;M&&M9.test(M)&&(f+=1)}if(_9.has(L)){let M=rg(P?.file_path);M&&!l.includes(M)&&l.length<P9&&l.push(M)}if(C9.has(L)){let M;L==="skill"?(M=rg(P?.name),M&&!a.includes(M)&&a.push(M)):L==="agent"?M=rg(P?.id_prefix):M="compose",s.push(M?{tool:L,label:M}:{tool:L})}}let g=n[0]?.user??"",h=e.source??"cli",y=D9(g,h),b=[];for(let C of n){let P=KO.exec(C.user??"")?.[1];P&&!b.includes(P)&&b.push(P)}let w=n.filter(C=>(C.user??"").trim().length>0).length,S=n.filter(C=>(C.assistant??"").trim().length>0).length,T=[...n].reverse().find(C=>(C.assistant??"").trim().length>0)?.assistant??"",k;n.length===0?k="aborted":T.trim().length===0?k="partially_achieved":k="fully_achieved";let F=k==="fully_achieved"||k==="partially_achieved"?og(T||g||y,160)||y:"none",R=c>0?`${c} tool error(s): ${Object.entries(i).map(([C,L])=>`${C}\xD7${L}`).join(", ")}`:"",D=e.name?$9(e.name):og(g,80),_=og(T||g,I9),O=og(D?`${D} \u2014 ${_}`:_,400)||"empty session",B=e.sessionId??(t.sourceSessionPath?A9(t.sourceSessionPath,".json"):"unknown"),j=e.totalDurationMs&&e.totalDurationMs>0?e.totalDurationMs:Math.max(0,e.savedAt-e.startedAt),$=t.sourceSessionPath?[...l,t.sourceSessionPath]:l,H={facet_version:vd,session_id:B,source:h==="telegram"?"telegram":"cli",model:e.model,derived_at:(t.derivedAt??new Date).toISOString(),derived_from:"afk-session",source_session_path:t.sourceSessionPath??"",source_session_mtime_ms:t.sourceSessionMtimeMs??e.savedAt,subagent_persistence:"not_persisted",start_time:new Date(e.startedAt).toISOString(),end_time:new Date(e.savedAt).toISOString(),duration_minutes:Number((j/6e4).toFixed(2)),underlying_goal:g.slice(0,WO),first_prompt:g.slice(0,WO),goal_categories:{[y]:1},session_type:y,brief_summary:O,total_turns:n.length,user_message_count:w,assistant_message_count:S,tool_counts:o,commands:b,skills:a,subagents:s,tool_errors:c,tool_error_categories:i,friction_counts:{...i},friction_detail:R,outcome:k,primary_success:F,world_changes:{files_written:d,files_edited:u,bash_commands:m,commits:f,mutated:d>0||u>0||f>0},decisions:[],evidence_pointers:$};return kd.parse(H)}var C9,_9,WO,I9,P9,M9,KO,Tk=x(()=>{"use strict";ng();C9=new Set(["agent","compose","skill"]),_9=new Set(["read_file","write_file","edit_file"]),WO=1e3,I9=240,P9=50,M9=/\bgit\s+commit(?![\w-])/,KO=/^\s*\/([a-zA-Z][\w-]*)/});import{existsSync as ig,mkdirSync as L9,readFileSync as GO,readdirSync as N9,renameSync as B9,statSync as U9,writeFileSync as j9}from"fs";import{basename as H9,dirname as W9,join as qO}from"path";function zO(e,t){return zu(e),qO(t,`${e}.json`)}function K9(e,t){return zu(e),qO(t,`${e}.json`)}function sg(e,t=lt()){let n=zO(e,t);if(ig(n))try{let r=JSON.parse(GO(n,"utf8")),o=kk.safeParse(r);return o.success?o.data:void 0}catch{return}}function G9(e){if(ig(e))try{let t=JSON.parse(GO(e,"utf8")),n=kd.safeParse(t);return n.success?n.data:void 0}catch{return}}function q9(e,t){L9(W9(e),{recursive:!0});let n=`${e}.${process.pid}.tmp`;j9(n,`${JSON.stringify(t,null,2)}
1130
1130
  `,"utf8"),B9(n,e)}function z9(e,t){return e.facet_version===vd&&e.source_session_mtime_ms===t}function Ek(e,t={}){let n=t.sessionsDir??lt(),r=t.cacheDir??xR(),o=zO(e,n);if(!ig(o))return;let i=U9(o).mtimeMs,s=K9(e,r);if(!t.force){let c=G9(s);if(c&&z9(c,i))return c}let a=sg(e,n);if(!a)return;let l=Td(a,{sourceSessionPath:o,sourceSessionMtimeMs:i});return q9(s,l),l}function xk(e={}){let t=e.sessionsDir??lt();return ig(t)?N9(t).filter(n=>n.endsWith(".json")).map(n=>H9(n,".json")):[]}var JO=x(()=>{"use strict";q();Tk();ng()});var YO=x(()=>{"use strict";ng();Tk();JO()});import{readFileSync as J9}from"node:fs";import{join as Y9}from"node:path";function xf(e,t){let n=Pi(e,t);if(n.length===0)return"";let r=[];for(let o of n){let i=o.argumentHint?`${o.argumentHint}`:"",s=i?`- \`${o.name} ${i}\`: ${o.description}`:`- ${o.name}: ${o.description}`;r.push(s),o.whenToUse&&r.push(` When to use: ${o.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either dispatches one or more context-isolated subagents (delegation \u2014 preserves the main session's context) or loads its instructions directly into your current context (`load` mode). Calling `skill` is the entry point for both; the executor picks the mode per skill. Prefer a skill over inline investigation when the task shape matches.","",...r].join(`
1131
- `)}function Pi(e,t){let n=[],r=new Set,o=v.AFK_INTERNAL==="1",i=kn(Ut());Lr(Vl(),"user"),_C("project"),Lr(ju(t?.cwd),"project");for(let{dir:a,origin:l}of i.skillRoots)Lr(a,l);for(let a of Gn()){let l=ze(a);nn(l,o)&&(n.push({name:a,description:l.description,source:l.origin==="user"?"user":l.origin==="project"?"project":l.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:l.argumentHint,whenToUse:l.whenToUse}),r.add(a))}let s=e??ag(t);for(let a of s){if(a.type!=="local")continue;let l=Gv(a.path);for(let c of l)!c.name||r.has(c.name)||nn({audience:c.audience},o)&&(n.push({name:c.name,description:c.description??`Skill from plugin at ${a.path}`,source:"plugin"}),r.add(c.name))}return n}function yd(e,t){let n=new Map,r=e??ag(t);for(let o of r){if(o.type!=="local")continue;let i=Gv(o.path);for(let s of i)s.name&&s.body&&s.body.length>0&&!n.has(s.name)&&n.set(s.name,{body:s.body,pluginPath:o.path,...s.allowedTools!==void 0?{allowedTools:s.allowedTools}:{},...s.context!==void 0?{context:s.context}:{},...s.readOnly===!0?{readOnly:!0}:{},...s.model!==void 0?{model:s.model}:{}})}return n}function Ia(e){let t=e??ag(),n=[],r=new Set;for(let o of t){if(o.type!=="local")continue;let i=Nr(o.path).name;if(i!==null)for(let s of Lf(Y9(o.path,"agents"))){let a;try{a=J9(s,"utf8")}catch{continue}let l=Ai(a);if(l===void 0)continue;let c=`${i}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${i}`,filePath:s,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function ag(e){return[...Mn(Hu(e?.cwd)),...Mn(),...Mn(gs()),...kn(Ut()).pluginRoots.flatMap(({dir:t,binary:n})=>Mn(t,{trustAll:!0,sourceEnabled:uC(n)}))]}async function Pa(){await LO(ag(),{pluginApi:{registerSkill:Mt,listSkills:Gn,getSkill:ze,loadSkillPrompts:Ue,env:v,SubagentManager:le,describeFailure:St,discoverPluginSkillBodies:yd,getAgentFrameworkDir:_t,getSkillsDir:Vl,getSessionsDir:lt,getOrDeriveFacet:Ek,listSessionIds:xk,deriveSessionFacet:Td,loadStoredSession:sg}})}var rr=x(()=>{"use strict";vk();Ot();tn();Sk();$r();NO();ud();Sd();pd();Zv();Ge();pt();YO();q();G();kr()});function Ef(){try{let e=Pi();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),n}))}catch{return Promise.resolve([])}}var Ov=x(()=>{"use strict";rr()});function lg(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let i of n)i.type==="tool_use"&&typeof i.id=="string"&&r.push(i.id);if(r.length===0)return;let o={role:"user",content:r.map(i=>({type:"tool_result",tool_use_id:i,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}var Rk=x(()=>{"use strict"});function VO(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var XO=x(()=>{"use strict"});function X9(e,t,n,r,o){let i=V9.get(e);if(!i)return;let s=1e6,l=Math.max(0,t-r-o)/s*i.inputPerMTok,c=n/s*i.outputPerMTok,d=i.cacheWritePerMTok??i.inputPerMTok*1.25,u=i.cacheReadPerMTok??i.inputPerMTok*.1,m=o/s*d,f=r/s*u;return l+c+m+f}function QO(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=X9(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var V9,ZO=x(()=>{"use strict";cv();V9=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5}],["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 Q9(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function Z9(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:Q9(a.partialJson)}));let i=a=>a.type==="tool_use",s=r.filter(i);return{stopReason:t,assistantBlocks:r,toolUseBlocks:s,usage:n,text:o.join("")}}async function*e$(e,t){let n=[],r=null,o=null,i=!1,s=!!v.AFK_TELEGRAM_TRACE;try{s&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(s&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}s&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(a){s&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}if(!i&&r===null){yield{kind:"event",event:{type:"error",error:new jn("the model stream ended without a terminal message (no message_stop and no stop_reason): the response was cut off mid-stream, typically an intermediary closing the connection. The turn is incomplete.")}};return}s&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:Z9(n,r,o)}}var t$=x(()=>{"use strict";G();Fe()});function r$(){let e=v.AFK_MODEL_TTFB_TIMEOUT_MS;if(e===void 0||e.trim()==="")return n$;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?n$:t}function o$(e,t){if(t<=0)return{signal:e,timedOut:()=>!1,firstByteSeen:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([e,n.signal]),o=!1,i=!1,s=setTimeout(()=>{o=!0,n.abort(new Error(e7))},t);s.unref();let a=()=>{i||(i=!0,clearTimeout(s))};return{signal:r,timedOut:()=>o,firstByteSeen:a,dispose:a}}var n$,e7,i$=x(()=>{"use strict";G();n$=18e4;e7="model_ttfb_timeout"});import{randomUUID as t7}from"node:crypto";function n7(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}function i7(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function s$(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}async function s7(e,t,n,r,o){for(let i=0;;i++){if(i>0){let s=l$*Math.pow(2,i-1);if(await Mr(s,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let a=s instanceof Error?s:new Error(String(s));if(i7(a)&&i<Ak)continue;throw a}}}async function*a$(e,t){ie(e.traceWriter,{phase:"rate_limit",durationMs:Date.now()-t,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:e.model}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId}}async function*a7(e,t){let n=t.throttleQueue;if(!n)return await e;n.resetAttempts();let r=Symbol("create-done"),o=!1,i=e.then(s=>(o=!0,s),s=>{throw o=!0,s});for(;;){for(let a of n.takeAll())yield{type:"rate_limit",sessionId:t.ctx.sessionId,status:a.status,attempt:a.attempt,...a.retryAfterMs!==void 0?{retryAfterMs:a.retryAfterMs}:{}};if(o)return await i;await Promise.race([i.then(()=>r,()=>r),n.waitForItem().then(()=>{})])}}async function*Ck(e){let t=Sf(e.maxToolUseIterations),n={stopReason:null},r=0,o=0,i=!1,s=0,a=0,l=r$(),c=!1,d=t7(),u=Date.now(),m=h=>({...h,durationMs:Date.now()-u});ie(e.traceWriter,{phase:"loop_start"});let f=e.signal.aborted?Date.now():null,g=()=>{f===null&&(f=Date.now())};e.traceWriter&&!e.signal.aborted&&e.signal.addEventListener("abort",g,{once:!0});try{for(;;){if(e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let h=wp({baseUrl:e.baseUrl})?KA(e.messages,Sp()):e.messages,y={model:e.model,max_tokens:e.maxTokens,messages:h,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0&&!i?{tools:e.tools.map(n7)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{}},b=Date.now(),w=o$(e.signal,l),S=!1,T;try{T=yield*a7(s7(e.client,y,e.headers,w.signal,e.signal),e)}catch($){if(w.timedOut()&&!e.signal.aborted&&!c)w.dispose(),S=!0;else{if(w.dispose(),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let H=$ instanceof Error?$:new Error(String($));H.message.includes("thinking")&&l7(e.messages,H),yield{type:"error",error:H};return}}if(S){yield*a$(e,b),c=!0;continue}let k=null,A=!1,F=!1,R=!1,D=!1;try{v.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let $ of e$(fa(T,e.signal),e.ctx))if(!D&&($.kind==="turn-result"||$.event.type!=="error")&&(D=!0,w.firstByteSeen(),ie(e.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-b,resolvedModel:e.model})),v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",$.kind,$.kind==="event"?$.event.type:""),$.kind==="event"){if($.event.type==="error"){if(w.timedOut()&&!e.signal.aborted&&!c&&!D){S=!0;break}if(s$($.event.error)&&s<Ak&&!e.signal.aborted){F=!0;break}if(e.signal.aborted)break;if($.event.error instanceof jn&&a<r7&&!e.signal.aborted){R=!0;break}yield $.event,A=!0;break}yield $.event}else{k=$.result;break}v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",k?"set":"null")}catch($){if(w.timedOut()&&!e.signal.aborted&&!c&&!D)w.dispose(),S=!0;else{if(w.dispose(),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let H=$ instanceof Error?$:new Error(String($));if(s$(H)&&s<Ak&&!e.signal.aborted)F=!0;else{yield{type:"error",error:H};return}}}if(w.dispose(),S){yield*a$(e,b),c=!0;continue}if(F){if(s+=1,ie(e.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:s}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},await Mr(l$*Math.pow(2,s-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}continue}if(R){if(a+=1,ie(e.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:a}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},await Mr(o7*Math.pow(2,a-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}continue}if(s=0,a=0,c=!1,A){e.signal.aborted&&(yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId});return}if(k===null){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let _=QO(k.usage,k.stopReason,e.model);if(n=Uc(n,_),n.contextWindowTokens=(_.inputTokens??0)+(_.outputTokens??0)+(_.cachedInputTokens??0)+(_.cacheCreationTokens??0),e.onUsageProgress?.(n),k.stopReason!=="tool_use"){if(k.stopReason==="refusal"){yield{type:"assistant.message",text:k.text.length>0?k.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:e.ctx.sessionId},yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}k.text.length>0&&(yield{type:"assistant.message",text:k.text,sessionId:e.ctx.sessionId},k.text.length<=200&&(yield{type:"suggestion",suggestion:k.text,sessionId:e.ctx.sessionId}));let $=k.assistantBlocks.filter(H=>H.type!=="tool_use");$.length>0&&e.messages.push({role:"assistant",content:$}),yield{type:"turn.completed",usage:m(i?{...n,stopReason:wo}:n),sessionId:e.ctx.sessionId};return}let O=e.messages.length;e.messages.push({role:"assistant",content:k.assistantBlocks});try{o+=k.toolUseBlocks.length;let $=[],H=new Map;for(let I of k.toolUseBlocks){$.push({id:I.id,name:I.name,input:I.input,signal:e.signal});let U=Date.now();H.set(I.id,U),Rs(e.traceWriter,yf({toolUseId:I.id,name:I.name,input:I.input,subagentId:e.subagentId})),yield{type:"tool.use.start",toolUseId:I.id,toolName:I.name,toolInput:xi(I.name,I.input),toolInputRaw:hf(I.input),sessionId:e.ctx.sessionId}}if(e.signal.aborted){let I=$.map(U=>({type:"tool_result",tool_use_id:U.id,content:"Tool call aborted",is_error:!0}));e.messages.push({role:"user",content:I}),yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let C;if(e.toolDispatcher.executeBatch)try{C=await e.toolDispatcher.executeBatch($)}catch(I){C=$.map(()=>({content:`Tool batch execution failed: ${I instanceof Error?I.message:String(I)}`,isError:!0}))}else{C=[];for(let I of $){if(e.signal.aborted){C.push({content:"Tool call aborted",isError:!0});continue}try{C.push(await e.toolDispatcher.execute(I))}catch(U){let K=U instanceof Error?U.message:String(U);C.push({content:`Tool execution threw: ${K}`,isError:!0})}}}let L=[];for(let I=0;I<$.length;I++){let U=$[I],K=C[I],Q=H.get(U.id),ee=typeof Q=="number"?Date.now()-Q:0,se=K.truncated===!0||K.content.includes("[output truncated");Rs(e.traceWriter,bf({toolUseId:U.id,name:U.name,result:K,truncated:se,durationMs:ee,subagentId:e.subagentId})),yield{type:"tool.output",toolUseId:U.id,toolName:U.name,content:K.content,...K.isError===!0?{isError:!0}:{},...se?{truncated:!0}:{},...K.incomplete===!0?{incomplete:!0}:{},...K.incompleteReason?{incompleteReason:K.incompleteReason}:{},...typeof K.batchIndex=="number"&&typeof K.batchSize=="number"?{batchIndex:K.batchIndex,batchSize:K.batchSize}:{},sessionId:e.ctx.sessionId},K.render?.diff&&(yield{type:"tool.diff",toolUseId:U.id,diff:K.render.diff,sessionId:e.ctx.sessionId});let{content:z,isError:fe,image:Ne}=K,vt=Ne!==void 0?[{type:"image",source:{type:"base64",media_type:Ne.mediaType,data:Ne.data}},...z.length>0?[{type:"text",text:z}]:[]]:z;L.push({type:"tool_result",tool_use_id:U.id,content:vt,...fe===!0?{is_error:!0}:{}})}let P={role:"user",content:L};e.messages.push(P);let M=C.find(I=>I.failureClass===Ys);if(M){yield{type:"error",error:new bs(M.content)};return}}catch($){throw e.messages.splice(O),$}r+=1;let B=k.toolUseBlocks[k.toolUseBlocks.length-1],j=B?`${B.name}${xi(B.name,B.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:d,description:"Working",summary:`round ${r}: ${j}`,lastToolName:B?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-u},sessionId:e.ctx.sessionId},i){yield{type:"turn.completed",usage:m({...n,stopReason:wo}),sessionId:e.ctx.sessionId};return}if(vf(r,t)){let $=e.messages[e.messages.length-1];$!==void 0&&$.role==="user"&&Array.isArray($.content)&&$.content.push({type:"text",text:wf}),i=!0;continue}}}finally{e.signal.removeEventListener("abort",g),f!==null&&e.signal.reason==="interrupted"&&ie(e.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-f,metadata:{provider:"anthropic-direct"}}),ie(e.traceWriter,{phase:"loop_end",durationMs:Date.now()-u})}}function l7(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let i=o.content;for(let s=0;s<i.length;s++){let a=i[s];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:s,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var Ak,l$,r7,o7,c$=x(()=>{"use strict";ZO();ww();t$();Fe();cf();xe();Av();G();kf();i$();gf();rd();Cv();dm();Fe();rd();Ak=3,l$=5e3,r7=2,o7=1e3});var d$=x(()=>{"use strict";ii()});import{randomUUID as cg}from"node:crypto";var u$,c7,d7,u7,p7,m7,dg,p$=x(()=>{"use strict";c$();As();gw();d$();kf();xe();u$=7200*1e3,c7=3,d7=12e4,u7=5e3,p7=1e3,m7=60*1e3,dg=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(t){this._client=t.client,this._authMode=t.authMode,this.initSessionId=t.initSessionId,this.tokenRefresher=t.tokenRefresher,this.autoResumeOnUsageLimit=t.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let t=dt(),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=dt();return{accountId:io(r??""),swapped:t!==r}}async*turnWithRetries(t,n){yield*this.turnWithUsageLimitRetry(t,n)}async*turnWithUsageLimitRetry(t,n){let r=null,o=null,i=!1,s=0;for(;;){let u,m=!1;for await(let h of this.turnWithAuthRetry(t,n)){if(h.type==="error"){let y=fw(h.error);if(y&&y.kind==="oauth-limit"){o=y.resetsAt,r=h;break}if(y&&y.kind==="oauth-limit-no-ts"){i=!0,r=h;break}if(y&&y.kind==="rate-limit-transient"&&s<c7){m=!0,u=y.retryAfterMs;break}}yield h}if(!m)break;if(s+=1,n()||t.signal.aborted)return;let g=Math.min(u??u7,d7)+Math.floor(Math.random()*p7);if(ie(t.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:s,waitMs:g}}),await Mr(g,t.signal),n()||t.signal.aborted)return;t.headers=Sn(this._authMode,this.initSessionId,cg())}if(!r)return;if(i){let u=io(dt()??"");if(yield{type:"paused",reason:"usage-limit",accountId:u,autoResume:this.autoResumeOnUsageLimit},ie(t.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!1,autoResume:this.autoResumeOnUsageLimit}}),!this.autoResumeOnUsageLimit){yield r;return}let m=Date.now(),f=!1;for(;;){let g;if(this.usageLimitWaitPromise)g="aborted";else{this.usageLimitWaitPromise=$A({signal:t.signal,retryAfterMs:m7});try{g=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(g==="aborted")return;let h=u;if(g==="hot-swap"){let b=await this.forceClientRefresh();b&&(t.client=this._client,h=b.accountId)}t.headers=Sn(this._authMode,this.initSessionId,cg());let y=null;for await(let b of this.turnWithAuthRetry(t,n)){if(!f&&b.type==="error"){let w=fw(b.error);if(w&&(w.kind==="oauth-limit"||w.kind==="oauth-limit-no-ts")){y=b;break}}f||(yield{type:"resumed",hotSwapped:g==="hot-swap",accountId:h},ie(t.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-m,metadata:{source:"retry-layer",hotSwapped:g==="hot-swap"}}),f=!0),yield b}if(!y)return;if(Date.now()-m>u$){yield y;return}}}if(!o)return;if(o.getTime()-Date.now()>u$){yield r;return}let a=io(dt()??""),l=Date.now();if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},ie(t.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!0,autoResume:this.autoResumeOnUsageLimit,resetsAt:o.toISOString()}}),!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=OA({resetsAt:o,signal:t.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let d=a;if(c==="hot-swap"){let u=await this.forceClientRefresh();u&&(t.client=this._client,d=u.accountId)}t.headers=Sn(this._authMode,this.initSessionId,cg()),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:d},ie(t.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-l,metadata:{source:"retry-layer",hotSwapped:c==="hot-swap"}}),yield*this.turnWithAuthRetry(t,n)}async*turnWithAuthRetry(t,n){let r=null;for await(let i of Ck(t)){if(n())return;if(i.type==="error"&&this.isRetryableAuth(i.error)){r=i;break}yield i}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}t.client=this._client,t.headers=Sn(this._authMode,this.initSessionId,cg()),yield*Ck(t)}isRetryableAuth(t){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}}});function f7(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function g7(e){let n=[(e.role==="user"?"User":"Assistant")+":"];if(typeof e.content=="string")n.push(e.content);else if(Array.isArray(e.content))for(let r of e.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let i=r.name??"unknown",s=b$(r.input);n.push(`[tool call: ${i} ${s}]`)}else if(o==="tool_result"){let i=r.content;n.push(`[tool result: ${w$(i)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
1131
+ `)}function Pi(e,t){let n=[],r=new Set,o=v.AFK_INTERNAL==="1",i=kn(Ut());Lr(Vl(),"user"),_C("project"),Lr(ju(t?.cwd),"project");for(let{dir:a,origin:l}of i.skillRoots)Lr(a,l);for(let a of Gn()){let l=ze(a);nn(l,o)&&(n.push({name:a,description:l.description,source:l.origin==="user"?"user":l.origin==="project"?"project":l.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:l.argumentHint,whenToUse:l.whenToUse}),r.add(a))}let s=e??ag(t);for(let a of s){if(a.type!=="local")continue;let l=Gv(a.path);for(let c of l)!c.name||r.has(c.name)||nn({audience:c.audience},o)&&(n.push({name:c.name,description:c.description??`Skill from plugin at ${a.path}`,source:"plugin"}),r.add(c.name))}return n}function yd(e,t){let n=new Map,r=e??ag(t);for(let o of r){if(o.type!=="local")continue;let i=Gv(o.path);for(let s of i)s.name&&s.body&&s.body.length>0&&!n.has(s.name)&&n.set(s.name,{body:s.body,pluginPath:o.path,...s.allowedTools!==void 0?{allowedTools:s.allowedTools}:{},...s.context!==void 0?{context:s.context}:{},...s.readOnly===!0?{readOnly:!0}:{},...s.model!==void 0?{model:s.model}:{}})}return n}function Ia(e){let t=e??ag(),n=[],r=new Set;for(let o of t){if(o.type!=="local")continue;let i=Nr(o.path).name;if(i!==null)for(let s of Lf(Y9(o.path,"agents"))){let a;try{a=J9(s,"utf8")}catch{continue}let l=Ai(a);if(l===void 0)continue;let c=`${i}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${i}`,filePath:s,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function ag(e){return[...Mn(Hu(e?.cwd)),...Mn(),...Mn(gs()),...kn(Ut()).pluginRoots.flatMap(({dir:t,binary:n})=>Mn(t,{trustAll:!0,sourceEnabled:uC(n)}))]}async function Pa(){await LO(ag(),{pluginApi:{registerSkill:Mt,listSkills:Gn,getSkill:ze,loadSkillPrompts:Ue,env:v,SubagentManager:le,describeFailure:St,discoverPluginSkillBodies:yd,getAgentFrameworkDir:_t,getSkillsDir:Vl,getSessionsDir:lt,getOrDeriveFacet:Ek,listSessionIds:xk,deriveSessionFacet:Td,loadStoredSession:sg}})}var rr=x(()=>{"use strict";vk();Ot();tn();Sk();$r();NO();ud();Sd();pd();Zv();Ge();pt();YO();q();G();kr()});function Ef(){try{let e=Pi();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),n}))}catch{return Promise.resolve([])}}var Ov=x(()=>{"use strict";rr()});function lg(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let i of n)i.type==="tool_use"&&typeof i.id=="string"&&r.push(i.id);if(r.length===0)return;let o={role:"user",content:r.map(i=>({type:"tool_result",tool_use_id:i,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}var Rk=x(()=>{"use strict"});function VO(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var XO=x(()=>{"use strict"});function X9(e,t,n,r,o){let i=V9.get(e);if(!i)return;let s=1e6,l=Math.max(0,t-r-o)/s*i.inputPerMTok,c=n/s*i.outputPerMTok,d=i.cacheWritePerMTok??i.inputPerMTok*1.25,u=i.cacheReadPerMTok??i.inputPerMTok*.1,m=o/s*d,f=r/s*u;return l+c+m+f}function QO(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=X9(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var V9,ZO=x(()=>{"use strict";cv();V9=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5}],["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 Q9(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function Z9(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:Q9(a.partialJson)}));let i=a=>a.type==="tool_use",s=r.filter(i);return{stopReason:t,assistantBlocks:r,toolUseBlocks:s,usage:n,text:o.join("")}}async function*e$(e,t){let n=[],r=null,o=null,i=!1,s=!!v.AFK_TELEGRAM_TRACE;try{s&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(s&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{i=!0;break}default:break}if(i)break}s&&console.log("[translate] SDK iteration ended naturally, stopped=",i)}catch(a){s&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}if(!i&&r===null){yield{kind:"event",event:{type:"error",error:new jn("the model stream ended without a terminal message (no message_stop and no stop_reason): the response was cut off mid-stream, typically an intermediary closing the connection. The turn is incomplete.")}};return}s&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:Z9(n,r,o)}}var t$=x(()=>{"use strict";G();Fe()});function r$(){let e=v.AFK_MODEL_TTFB_TIMEOUT_MS;if(e===void 0||e.trim()==="")return n$;let t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?n$:t}function o$(e,t){if(t<=0)return{signal:e,timedOut:()=>!1,firstByteSeen:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([e,n.signal]),o=!1,i=!1,s=setTimeout(()=>{o=!0,n.abort(new Error(e7))},t);s.unref();let a=()=>{i||(i=!0,clearTimeout(s))};return{signal:r,timedOut:()=>o,firstByteSeen:a,dispose:a}}var n$,e7,i$=x(()=>{"use strict";G();n$=18e4;e7="model_ttfb_timeout"});import{randomUUID as t7}from"node:crypto";function n7(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}function i7(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function s$(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}async function s7(e,t,n,r,o){for(let i=0;;i++){if(i>0){let s=l$*Math.pow(2,i-1);if(await Mr(s,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let a=s instanceof Error?s:new Error(String(s));if(i7(a)&&i<Ak)continue;throw a}}}async function*a$(e,t){ie(e.traceWriter,{phase:"rate_limit",durationMs:Date.now()-t,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:e.model}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId}}async function*a7(e,t){let n=t.throttleQueue;if(!n)return await e;n.resetAttempts();let r=Symbol("create-done"),o=!1,i=e.then(s=>(o=!0,s),s=>{throw o=!0,s});for(;;){for(let a of n.takeAll())yield{type:"rate_limit",sessionId:t.ctx.sessionId,status:a.status,attempt:a.attempt,...a.retryAfterMs!==void 0?{retryAfterMs:a.retryAfterMs}:{}};if(o)return await i;await Promise.race([i.then(()=>r,()=>r),n.waitForItem().then(()=>{})])}}async function*Ck(e){let t=Sf(e.maxToolUseIterations),n={stopReason:null},r=0,o=0,i=!1,s=0,a=0,l=r$(),c=!1,d=t7(),u=Date.now(),m=h=>({...h,durationMs:Date.now()-u});ie(e.traceWriter,{phase:"loop_start"});let f=e.signal.aborted?Date.now():null,g=()=>{f===null&&(f=Date.now())};e.traceWriter&&!e.signal.aborted&&e.signal.addEventListener("abort",g,{once:!0});try{for(;;){if(e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let h=wp({baseUrl:e.baseUrl})?KA(e.messages,Sp()):e.messages,y={model:e.model,max_tokens:e.maxTokens,messages:h,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0&&!i?{tools:e.tools.map(n7)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{}},b=Date.now(),w=o$(e.signal,l),S=!1,T;try{T=yield*a7(s7(e.client,y,e.headers,w.signal,e.signal),e)}catch($){if(w.timedOut()&&!e.signal.aborted&&!c)w.dispose(),S=!0;else{if(w.dispose(),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let H=$ instanceof Error?$:new Error(String($));H.message.includes("thinking")&&l7(e.messages,H),yield{type:"error",error:H};return}}if(S){yield*a$(e,b),c=!0;continue}let k=null,A=!1,F=!1,R=!1,D=!1;try{v.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let $ of e$(fa(T,e.signal),e.ctx))if(!D&&($.kind==="turn-result"||$.event.type!=="error")&&(D=!0,w.firstByteSeen(),ie(e.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-b,resolvedModel:e.model})),v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",$.kind,$.kind==="event"?$.event.type:""),$.kind==="event"){if($.event.type==="error"){if(w.timedOut()&&!e.signal.aborted&&!c&&!D){S=!0;break}if(s$($.event.error)&&s<Ak&&!e.signal.aborted){F=!0;break}if(e.signal.aborted)break;if($.event.error instanceof jn&&a<r7&&!e.signal.aborted){R=!0;break}yield $.event,A=!0;break}yield $.event}else{k=$.result;break}v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",k?"set":"null")}catch($){if(w.timedOut()&&!e.signal.aborted&&!c&&!D)w.dispose(),S=!0;else{if(w.dispose(),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let H=$ instanceof Error?$:new Error(String($));if(s$(H)&&s<Ak&&!e.signal.aborted)F=!0;else{yield{type:"error",error:H};return}}}if(w.dispose(),S){yield*a$(e,b),c=!0;continue}if(F){if(s+=1,ie(e.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:s}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},await Mr(l$*Math.pow(2,s-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}continue}if(R){if(a+=1,ie(e.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:a}}),yield{type:"stream.retry",sessionId:e.ctx.sessionId},await Mr(o7*Math.pow(2,a-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}continue}if(s=0,a=0,c=!1,A){e.signal.aborted&&(yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId});return}if(k===null){yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let _=QO(k.usage,k.stopReason,e.model);if(n=Uc(n,_),n.contextWindowTokens=(_.inputTokens??0)+(_.outputTokens??0)+(_.cachedInputTokens??0)+(_.cacheCreationTokens??0),e.onUsageProgress?.(n),k.stopReason!=="tool_use"){if(k.stopReason==="refusal"){yield{type:"assistant.message",text:k.text.length>0?k.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:e.ctx.sessionId},yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}k.text.length>0&&(yield{type:"assistant.message",text:k.text,sessionId:e.ctx.sessionId},k.text.length<=200&&(yield{type:"suggestion",suggestion:k.text,sessionId:e.ctx.sessionId}));let $=k.assistantBlocks.filter(H=>H.type!=="tool_use");$.length>0&&e.messages.push({role:"assistant",content:$}),yield{type:"turn.completed",usage:m(i?{...n,stopReason:wo}:n),sessionId:e.ctx.sessionId};return}let O=e.messages.length;e.messages.push({role:"assistant",content:k.assistantBlocks});try{o+=k.toolUseBlocks.length;let $=[],H=new Map;for(let I of k.toolUseBlocks){$.push({id:I.id,name:I.name,input:I.input,signal:e.signal});let U=Date.now();H.set(I.id,U),Rs(e.traceWriter,yf({toolUseId:I.id,name:I.name,input:I.input,subagentId:e.subagentId})),yield{type:"tool.use.start",toolUseId:I.id,toolName:I.name,toolInput:xi(I.name,I.input),toolInputRaw:hf(I.input),sessionId:e.ctx.sessionId}}if(e.signal.aborted){let I=$.map(U=>({type:"tool_result",tool_use_id:U.id,content:"Tool call aborted",is_error:!0}));e.messages.push({role:"user",content:I}),yield{type:"turn.completed",usage:m(n),sessionId:e.ctx.sessionId};return}let C;if(e.toolDispatcher.executeBatch)try{C=await e.toolDispatcher.executeBatch($)}catch(I){C=$.map(()=>({content:`Tool batch execution failed: ${I instanceof Error?I.message:String(I)}`,isError:!0}))}else{C=[];for(let I of $){if(e.signal.aborted){C.push({content:"Tool call aborted",isError:!0});continue}try{C.push(await e.toolDispatcher.execute(I))}catch(U){let K=U instanceof Error?U.message:String(U);C.push({content:`Tool execution threw: ${K}`,isError:!0})}}}let L=[];for(let I=0;I<$.length;I++){let U=$[I],K=C[I],Z=H.get(U.id),te=typeof Z=="number"?Date.now()-Z:0,se=K.truncated===!0||K.content.includes("[output truncated");Rs(e.traceWriter,bf({toolUseId:U.id,name:U.name,result:K,truncated:se,durationMs:te,subagentId:e.subagentId})),yield{type:"tool.output",toolUseId:U.id,toolName:U.name,content:K.content,...K.isError===!0?{isError:!0}:{},...se?{truncated:!0}:{},...K.incomplete===!0?{incomplete:!0}:{},...K.incompleteReason?{incompleteReason:K.incompleteReason}:{},...typeof K.batchIndex=="number"&&typeof K.batchSize=="number"?{batchIndex:K.batchIndex,batchSize:K.batchSize}:{},sessionId:e.ctx.sessionId},K.render?.diff&&(yield{type:"tool.diff",toolUseId:U.id,diff:K.render.diff,sessionId:e.ctx.sessionId});let{content:z,isError:fe,image:Ne}=K,vt=Ne!==void 0?[{type:"image",source:{type:"base64",media_type:Ne.mediaType,data:Ne.data}},...z.length>0?[{type:"text",text:z}]:[]]:z;L.push({type:"tool_result",tool_use_id:U.id,content:vt,...fe===!0?{is_error:!0}:{}})}let P={role:"user",content:L};e.messages.push(P);let M=C.find(I=>I.failureClass===Ys);if(M){yield{type:"error",error:new bs(M.content)};return}}catch($){throw e.messages.splice(O),$}r+=1;let B=k.toolUseBlocks[k.toolUseBlocks.length-1],j=B?`${B.name}${xi(B.name,B.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:d,description:"Working",summary:`round ${r}: ${j}`,lastToolName:B?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-u},sessionId:e.ctx.sessionId},i){yield{type:"turn.completed",usage:m({...n,stopReason:wo}),sessionId:e.ctx.sessionId};return}if(vf(r,t)){let $=e.messages[e.messages.length-1];$!==void 0&&$.role==="user"&&Array.isArray($.content)&&$.content.push({type:"text",text:wf}),i=!0;continue}}}finally{e.signal.removeEventListener("abort",g),f!==null&&e.signal.reason==="interrupted"&&ie(e.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-f,metadata:{provider:"anthropic-direct"}}),ie(e.traceWriter,{phase:"loop_end",durationMs:Date.now()-u})}}function l7(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let i=o.content;for(let s=0;s<i.length;s++){let a=i[s];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:s,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var Ak,l$,r7,o7,c$=x(()=>{"use strict";ZO();ww();t$();Fe();cf();xe();Av();G();kf();i$();gf();rd();Cv();dm();Fe();rd();Ak=3,l$=5e3,r7=2,o7=1e3});var d$=x(()=>{"use strict";ii()});import{randomUUID as cg}from"node:crypto";var u$,c7,d7,u7,p7,m7,dg,p$=x(()=>{"use strict";c$();As();gw();d$();kf();xe();u$=7200*1e3,c7=3,d7=12e4,u7=5e3,p7=1e3,m7=60*1e3,dg=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(t){this._client=t.client,this._authMode=t.authMode,this.initSessionId=t.initSessionId,this.tokenRefresher=t.tokenRefresher,this.autoResumeOnUsageLimit=t.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let t=dt(),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=dt();return{accountId:io(r??""),swapped:t!==r}}async*turnWithRetries(t,n){yield*this.turnWithUsageLimitRetry(t,n)}async*turnWithUsageLimitRetry(t,n){let r=null,o=null,i=!1,s=0;for(;;){let u,m=!1;for await(let h of this.turnWithAuthRetry(t,n)){if(h.type==="error"){let y=fw(h.error);if(y&&y.kind==="oauth-limit"){o=y.resetsAt,r=h;break}if(y&&y.kind==="oauth-limit-no-ts"){i=!0,r=h;break}if(y&&y.kind==="rate-limit-transient"&&s<c7){m=!0,u=y.retryAfterMs;break}}yield h}if(!m)break;if(s+=1,n()||t.signal.aborted)return;let g=Math.min(u??u7,d7)+Math.floor(Math.random()*p7);if(ie(t.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:s,waitMs:g}}),await Mr(g,t.signal),n()||t.signal.aborted)return;t.headers=Sn(this._authMode,this.initSessionId,cg())}if(!r)return;if(i){let u=io(dt()??"");if(yield{type:"paused",reason:"usage-limit",accountId:u,autoResume:this.autoResumeOnUsageLimit},ie(t.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!1,autoResume:this.autoResumeOnUsageLimit}}),!this.autoResumeOnUsageLimit){yield r;return}let m=Date.now(),f=!1;for(;;){let g;if(this.usageLimitWaitPromise)g="aborted";else{this.usageLimitWaitPromise=$A({signal:t.signal,retryAfterMs:m7});try{g=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(g==="aborted")return;let h=u;if(g==="hot-swap"){let b=await this.forceClientRefresh();b&&(t.client=this._client,h=b.accountId)}t.headers=Sn(this._authMode,this.initSessionId,cg());let y=null;for await(let b of this.turnWithAuthRetry(t,n)){if(!f&&b.type==="error"){let w=fw(b.error);if(w&&(w.kind==="oauth-limit"||w.kind==="oauth-limit-no-ts")){y=b;break}}f||(yield{type:"resumed",hotSwapped:g==="hot-swap",accountId:h},ie(t.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-m,metadata:{source:"retry-layer",hotSwapped:g==="hot-swap"}}),f=!0),yield b}if(!y)return;if(Date.now()-m>u$){yield y;return}}}if(!o)return;if(o.getTime()-Date.now()>u$){yield r;return}let a=io(dt()??""),l=Date.now();if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},ie(t.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!0,autoResume:this.autoResumeOnUsageLimit,resetsAt:o.toISOString()}}),!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=OA({resetsAt:o,signal:t.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let d=a;if(c==="hot-swap"){let u=await this.forceClientRefresh();u&&(t.client=this._client,d=u.accountId)}t.headers=Sn(this._authMode,this.initSessionId,cg()),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:d},ie(t.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-l,metadata:{source:"retry-layer",hotSwapped:c==="hot-swap"}}),yield*this.turnWithAuthRetry(t,n)}async*turnWithAuthRetry(t,n){let r=null;for await(let i of Ck(t)){if(n())return;if(i.type==="error"&&this.isRetryableAuth(i.error)){r=i;break}yield i}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}t.client=this._client,t.headers=Sn(this._authMode,this.initSessionId,cg()),yield*Ck(t)}isRetryableAuth(t){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}}});function f7(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function g7(e){let n=[(e.role==="user"?"User":"Assistant")+":"];if(typeof e.content=="string")n.push(e.content);else if(Array.isArray(e.content))for(let r of e.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let i=r.name??"unknown",s=b$(r.input);n.push(`[tool call: ${i} ${s}]`)}else if(o==="tool_result"){let i=r.content;n.push(`[tool result: ${w$(i)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
1132
1132
  `)}function h7(e){let t=0;if(typeof e.content=="string")t+=e.content.length;else if(Array.isArray(e.content))for(let n of e.content){let r=n.type;r==="text"&&"text"in n?t+=n.text.length:r==="tool_use"?t+=b$(n.input).length:r==="tool_result"&&(t+=w$(n.content).length)}return t}function y7(e){if(typeof e=="string")return Ei(e);if(Array.isArray(e)){let t=0;for(let n of e)n.type==="text"&&"text"in n&&(t+=Ei(n.text));return t}return 0}function b7(e){if(typeof e=="string")return pa(e);if(Array.isArray(e)){for(let t of e)if(t.type==="text"&&"text"in t)return pa(t.text)}return!1}function m$(e,t){return of(e,w7,t??{})}function f$(e,t,n,r){return hv(e,t,ug,n,r)}function g$(e,t,n){let r=yv(e,ug);return{model:t,max_tokens:n,system:Vc,messages:[{role:"user",content:Zc(r)}],stream:!0}}function h$(e,t,n){return bv(e,t,n,ug)}function y$(e,t,n){return wv(e,t,n,ug)}function b$(e){try{let t=JSON.stringify(e);return t.length>240?t.slice(0,237)+"...":t}catch{return"{}"}}function w$(e){if(typeof e=="string")return e.length>320?e.slice(0,317)+"...":e;if(Array.isArray(e)){let t=[];for(let r of e)r.type==="text"&&"text"in r&&t.push(r.text);let n=t.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}var ug,w7,S$=x(()=>{"use strict";ed();ug={isFreshUserTurn:f7,renderMessage:g7,buildPreamble(e){return[{role:"user",content:Xc+`
1133
1133
 
1134
1134
  `+e},{role:"assistant",content:Qc}]},countChars:h7};w7={listToolResults(e){let t=[];for(let n of e){if(n.role!=="user"||!Array.isArray(n.content))continue;let r=n.content;for(let o of r){if(o.type!=="tool_result")continue;let i=o;t.push({byteLength:y7(i.content),isPlaceholder:b7(i.content),clear(s){i.content=s}})}}return t}}});import{randomUUID as S7}from"node:crypto";async function k$(e){let{state:t,abort:n,retry:r,initSessionId:o,traceWriter:i}=e,s=t.messages.length;if(t.closed)return{compacted:!1,reason:"session-closed",messagesBefore:s,messagesAfter:s};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:s,messagesAfter:s};let a=E7(),l=Jc(_n(t.lastUsage??{}),ki(t.requestedModel)),c=f$(t.messages,a,l,x7());if(c<0)return v$(t,s,"history-too-short");if(c===0)return v$(t,s,"nothing-to-summarize");let d=t.messages.slice(0,c),u=A7(),m=g$(d,u,T7),f=n.begin(),g;try{if(f.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:s,messagesAfter:s};let w=Sn(r.authMode,o,S7()),S=r.client,T=await Promise.resolve(S.messages.create(m,{headers:w,signal:f.signal}));g=await C7(T)}catch(w){return f.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:s,messagesAfter:s}:{compacted:!1,reason:"summarization-failed: "+(w instanceof Error?w.message:String(w)),messagesBefore:s,messagesAfter:s}}finally{n.clear(f)}if(g.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:s,messagesAfter:s};let h=y$(t.messages,c,g),y=h$(t.messages,c,g);t.messages.splice(0,t.messages.length,...y);let b=t.messages.length;return up(i,{trigger:"manual",preCompactionMessages:d,summary:g,keptTailCount:s-c,keepLastNConfig:a,messagesBefore:s,messagesAfter:b,tokensSavedEstimate:h}),{compacted:!0,messagesBefore:s,messagesAfter:b,tokensSavedEstimate:h}}function E7(){let e=v.AFK_COMPACT_KEEP_LAST_TURNS;if(e!==void 0&&e.length>0){let t=Number.parseInt(e,10);if(Number.isFinite(t)&&t>0)return t}return v7}function x7(){let e=v.AFK_COMPACT_SHRINK_FRACTION;if(e!==void 0&&e.length>0){let t=Number.parseFloat(e);if(Number.isFinite(t)&&t>0&&t<1)return t}return ua}function v$(e,t,n){let r=R7(),{blocksCleared:o,bytesReclaimed:i}=m$(e.messages,r);return o>0?{compacted:!1,reason:"microcompacted",messagesBefore:t,messagesAfter:e.messages.length,microcompaction:{blocksCleared:o,bytesReclaimed:i}}:{compacted:!1,reason:n,messagesBefore:t,messagesAfter:t}}function R7(){return ma(v.AFK_MICROCOMPACT_TOOL_RESULT_BYTES,v.AFK_MICROCOMPACT_KEEP_LAST)}function A7(){let e=v.AFK_COMPACT_MODEL;return e!==void 0&&e.length>0?Tt(e)??e:k7}async function C7(e){let t="";for await(let n of e)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(t+=r.text)}return t}var v7,k7,T7,T$=x(()=>{"use strict";As();S$();ed();Yc();Ti();xe();vn();G();v7=2,k7="claude-haiku-4-5-20251001",T7=1024});function _k(e){if(typeof e=="string")return e;let t=[];for(let n of e)n.type==="text"&&typeof n.text=="string"&&t.push(n.text);return t.join(" ")}function x$(e){return e.role!=="user"?!1:_k(e.content).trim().length>0}function _7(e){let t=e.replace(/\s+/g," ").trim();return t.length<=E$?t:t.slice(0,E$-1)+"\u2026"}function R$(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];r&&x$(r)&&t.push({turnIndex:n,preview:_7(_k(r.content))})}return t.reverse()}function A$(e,t){let{state:n,abort:r}=e,o=n.messages.length;if(n.closed)return{rewound:!1,reason:"session-closed",messagesBefore:o,messagesAfter:o};if(!r.isIdle())return{rewound:!1,reason:"turn-in-flight",messagesBefore:o,messagesAfter:o};if(!Number.isInteger(t)||t<0||t>=o)return{rewound:!1,reason:"invalid-target",messagesBefore:o,messagesAfter:o};let i=n.messages[t];if(!i||!x$(i))return{rewound:!1,reason:"invalid-target",messagesBefore:o,messagesAfter:o};let s=_k(i.content);return n.messages.splice(t),lg(n.messages),{rewound:!0,reloadText:s,messagesBefore:o,messagesAfter:n.messages.length}}var E$,C$=x(()=>{"use strict";Rk();E$=72});var _$=x(()=>{"use strict";Yc()});import{randomUUID as I$}from"node:crypto";var I7,pg,P$=x(()=>{"use strict";uc();As();ww();qA();zA();ai();Ov();Ti();vn();Rk();XO();fv();p$();T$();C$();_$();Fe();I7=[{value:"claude-sonnet-5",displayName:"Claude Sonnet 5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-5",displayName:"Claude Opus 5",description:"Highest-capability Claude for agentic coding"},{value:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],pg=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;maxToolUseIterations;traceWriter;subagentId;state;abort;retry;cwdDependentsFactory;onPermissionMode;mcpManager;hookRegistry;throttleQueue;constructor(t){this.initSessionId=t.sessionId??I$(),this.promptStream=t.promptStream,this.maxTokens=t.maxTokens,this.tools=t.tools,this.systemPrefix=t.systemPrefix,this.thinking=t.thinking,t.effort!==void 0&&(this.effort=t.effort),t.baseUrl!==void 0&&(this.baseUrl=t.baseUrl),t.maxToolUseIterations!==void 0&&(this.maxToolUseIterations=t.maxToolUseIterations),this.traceWriter=t.traceWriter,t.subagentId!==void 0&&(this.subagentId=t.subagentId),this.cwdDependentsFactory=t.cwdDependentsFactory,this.onPermissionMode=t.onPermissionMode,this.mcpManager=t.mcpManager,t.hookRegistry!==void 0&&(this.hookRegistry=t.hookRegistry),t.throttleQueue!==void 0&&(this.throttleQueue=t.throttleQueue),this.retry=new dg({client:t.client,authMode:t.authMode,initSessionId:this.initSessionId,...t.tokenRefresher?{tokenRefresher:t.tokenRefresher}:{},autoResumeOnUsageLimit:t.autoResumeOnUsageLimit??!0}),this.state=VO({model:t.model,...t.requestedModel!==void 0?{requestedModel:t.requestedModel}:{},permissionMode:t.permissionMode??"default",userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,...t.initialMessages?{initialMessages:t.initialMessages}:{},...t.autoCompactThreshold!==void 0?{autoCompactThreshold:t.autoCompactThreshold}:{}}),this.abort=new da}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 i=o.value,s=this.abort.begin();if(s.signal.aborted){this.abort.clear(s);return}lg(this.state.messages),this.state.messages.push({role:"user",content:i.content});let a=this.composeSystem(),l=Sn(this.retry.authMode,this.initSessionId,I$(),this.effort!==void 0),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.state.currentPermissionMode==="plan"?this.tools:this.tools?.filter(u=>u.name!==Ht)??null,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:s.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.maxToolUseIterations!==void 0?{maxToolUseIterations:this.maxToolUseIterations}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{},...this.subagentId!==void 0?{subagentId:this.subagentId}:{},...this.throttleQueue?{throttleQueue:this.throttleQueue}:{},onUsageProgress:u=>{this.state.lastUsage=u}},d=!1;try{for await(let u of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;u.type==="turn.completed"&&(this.state.lastUsage=u.usage,this.abort.clear(s)),(u.type==="turn.completed"||u.type==="error")&&(d=!0),yield u}}catch(u){if(this.state.closed)return;if(s.signal.aborted){this.abort.clear(s),d||(yield this.makeInterruptedTurnEvent());continue}yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abort.clear(s)}if(this.state.closed)return;if(s.signal.aborted){d||(yield this.makeInterruptedTurnEvent());continue}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let u=this.state.lastUsage,m=ki(this.state.requestedModel);if(u!==null&&m>0){let f=_n(u);if(zc(f,m,this.state.autoCompactThreshold))try{this.hookRegistry&&await this.hookRegistry.dispatch({event:"PreCompact",sessionId:this.initSessionId,trigger:"auto"}),await this.compact()}catch(g){if(!(g instanceof he))throw g}}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let t=this.systemPrefix,n=this.state.userSystem,r=[];t&&t.length>0&&r.push(...t),n&&n.length>0&&r.push({type:"text",text:n});let o=Sw(this.state.currentPermissionMode);o!==null&&r.push(o);let i=kw(this.state.currentPermissionMode);return i!==null&&r.push(i),r.length===0?null:wp({baseUrl:this.baseUrl})?WA(r,Sp()):r}async interrupt(){this.abort.requestAbort("interrupted")}makeInterruptedTurnEvent(){return{type:"turn.completed",usage:{stopReason:"interrupted",resultSubtype:"interrupted",isError:!1},sessionId:this.initSessionId}}async setModel(t){t!==void 0&&t.length>0&&(this.state.requestedModel=t,this.state.currentModel=Tt(t)??t)}async setPermissionMode(t){this.state.currentPermissionMode=t;let n=Wn(t);this.state.toolDispatcher.setAllowAll?.(n),this.onPermissionMode?.(t)}setCwd(t){if(this.state.toolDispatcher.setResolveBase?.(t),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(t);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){return Ef()}async supportedModels(){return I7.map(t=>({...t}))}async supportedAgents(){return[]}async getContextUsage(){let t=this.state.lastUsage,n=qt(this.state.requestedModel),r;if(t&&n>0){let s=_n(t);r=Math.min(100,Math.max(0,s/n*100))}let{totalTokens:o,apiUsage:i}=qc(t);return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:i,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(t=>({name:t.serverName,status:t.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(t,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return k$({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}listRewindTargets(){return R$(this.state.messages)}async rewindConversation(t){return A$({state:this.state,abort:this.abort},t)}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}}});function Ik(e,t){let n=Hc(t),r=e.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let i=`max:${t}:${o}`;return mg.has(i)||(mg.add(i),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${t} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function M$(e){if(!e||e.length===0)return;let t=[];for(let n of e)n.user.length>0&&t.push({role:"user",content:n.user}),n.assistant.length>0&&t.push({role:"assistant",content:n.assistant});return t.length>0?t:void 0}function Pk(e,t,n){switch(e.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&M7(n))return{type:"adaptive",display:"summarized"};let r=Math.floor(t*O7),o=Math.max(1024,t-1-r),i=e.budgetTokens!==void 0&&Number.isFinite(e.budgetTokens)?Math.floor(e.budgetTokens):void 0,s=Math.min(Math.max(i??o,1024),o);if(i!==void 0&&i>o){let a=`think:${n??"default"}:${i}:${t}`;mg.has(a)||(mg.add(a),console.warn(`[afk] thinking budgetTokens ${i} leaves too little of max_tokens ${t} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:s,display:"summarized"}}}}function Mk(e,t){if(e!==void 0)return e;let n=t.toLowerCase();if(/(claude-)?(opus|sonnet)-(4-[678]|5)/.test(n))return"max"}var P7,M7,mg,O7,Ok=x(()=>{"use strict";Ti();Yc();P7=e=>/opus-4-(7|[89])/.test(e),M7=e=>P7(e)||/(claude-)?(opus|sonnet)-5/.test(e),mg=new Set,O7=.25});import{mkdirSync as $7,appendFileSync as D7,existsSync as F7}from"fs";import{resolve as L7}from"path";import{dirname as N7}from"path";function Ye(e){let t=e;for(let[n,r]of j7)t=t.replace(n,(...o)=>{let i=o.slice(0,o.length-2);return r(i)});return t}function $k(e){return typeof e=="string"?Ye(e):Array.isArray(e)?e.map($k):e}function H7(e){if(e===null||typeof e!="object")return e;let t=e,n={...t},r=t.env;if(r&&typeof r=="object"){let o={};for(let[i,s]of Object.entries(r))U7.test(i)&&typeof s=="string"?o[i]=`<REDACTED length=${s.length}>`:o[i]=s;n.env=o}return"system"in t&&(n.system=$k(t.system)),"systemPrompt"in t&&(n.systemPrompt=$k(t.systemPrompt)),n}function W7(e){if(e==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof e=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(e))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof e=="object"){let t=e;if(t.type==="preset"&&t.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof t.append=="string"&&(n.append={length:t.append.length}),t.excludeDynamicSections===!0&&(n.excludeDynamicSections=!0),n}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}function O$(e){let t=v.AFK_DUMP_PROMPT;if(!t||t===""||t==="0"||t.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
@@ -1167,18 +1167,18 @@ ${n}`;lte(this.serverName,n);let o=!1;try{let{pushIfConfigured:i}=await Promise.
1167
1167
  Open this URL to authorize:
1168
1168
  ${n}
1169
1169
  Status written to: ${ic()}
1170
- `)}_readSlot(){let t=this.backend.read();if(!t)return{};try{return JSON.parse(t).mcpOAuth?.[this.serverName]??{}}catch{return{}}}_updateSlot(t){let n=this.backend.read(),r={};if(n)try{r=JSON.parse(n)}catch{}let o=r.mcpOAuth??{},i=o[this.serverName]??{};o[this.serverName]=t(i),r.mcpOAuth=o,this.backend.write(JSON.stringify(r))}}});q();Zu();import{config as gR}from"dotenv";import{Command as Vye}from"commander";G();import Gb from"chalk";function BR(){let e=v.FORCE_COLOR;if(e&&e.length>0)return;let t=v.NO_COLOR;if(t&&t.length>0){Gb.level=0;return}let n=v.CI;if(n&&n.length>0){Gb.level=0;return}process.stdout.isTTY||(Gb.level=0)}G();import te from"chalk";var UR={brand:te.hex("#E67E4C"),mint:te.hex("#5FE3A1"),goblin:te.hex("#9CB04A"),user:te.cyan,caret:te.hex("#7AA2F7"),tool:te.hex("#DCDCAA"),chrome:te.hex("#B0B8C2"),syntaxString:te.italic.hex("#8AB07A"),toolArg:te.dim.white,thinking:te.italic.hex("#9B8FB5"),success:te.green,error:te.red,warning:te.yellow,plan:te.hex("#9F7CE0"),bypass:te.bold.hex("#FF6AC1"),meta:te.blackBright,info:te.hex("#5BA8FF"),fileRef:te.hex("#56B5A8"),heading:te.bold.white,label:te.dim,dim:te.dim,bold:te.bold,italic:te.italic,inverse:te.inverse,diffAdd:te.green,diffRemove:te.red,diffHunk:te.blackBright},$2={brand:te.hex("#C0562A"),mint:te.hex("#1B9E63"),goblin:te.hex("#6B7D2A"),user:te.hex("#0E7490"),caret:te.hex("#3B5BDB"),tool:te.hex("#7A6E00"),chrome:te.hex("#5A6470"),syntaxString:te.italic.hex("#3F7A3F"),toolArg:te.hex("#6B7280"),thinking:te.italic.hex("#6D5B8E"),success:te.hex("#2E7D32"),error:te.hex("#C62828"),warning:te.hex("#B8860B"),plan:te.hex("#7048C0"),bypass:te.bold.hex("#D6297F"),meta:te.hex("#6B7280"),info:te.hex("#1D6FD6"),fileRef:te.hex("#0F766E"),heading:te.bold.hex("#1F2937"),label:te.dim,dim:te.dim,bold:te.bold,italic:te.italic,inverse:te.inverse,diffAdd:te.hex("#2E7D32"),diffRemove:te.hex("#C62828"),diffHunk:te.hex("#6B7280")},jR=UR,HR=$2,p={...UR};import D2 from"chalk";import{createEmphasize as F2,common as L2}from"emphasize";function WR(){return{keyword:p.brand,built_in:p.brand,literal:p.brand,tag:p.brand,string:p.syntaxString,regexp:p.syntaxString,attr:p.syntaxString,comment:p.meta,meta:p.meta,quote:p.meta,number:p.warning,function:p.tool,title:p.tool,class:p.tool,"selector-tag":p.tool}}var KR=F2(L2),N2=2048,B2=512,U2=32,Un=new Map;function GR(){Un.clear()}function j2(e){let t=Un.get(e);if(t!==void 0)return Un.delete(e),Un.set(e,t),t}function H2(e,t){if(Un.has(e)&&Un.delete(e),Un.set(e,t),Un.size>U2){let n=Un.keys().next().value;n!==void 0&&Un.delete(n)}}function qR(e,t){if(D2.level===0||e.length>N2)return e;let n=e.length<B2,r=n?`${t} ${e}`:"";if(n){let i=j2(r);if(i!==void 0)return i}let o;try{if(!t||!KR.registered(t))o=e;else{let i=KR.highlight(t,e,WR());o=typeof i?.value=="string"?i.value:e}}catch{o=e}return n&&H2(r,o),o}G();var zR="dark";function JR(){return zR}function Xr(e){Object.assign(p,e==="light"?HR:jR),GR(),zR=e}function ys(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="dark"||t==="light"||t==="auto")return t}function W2(){let e=v.COLORFGBG;if(!e)return"dark";let t=e.split(";"),n=t[t.length-1]?.trim();if(!n)return"dark";let r=Number.parseInt(n,10);return Number.isInteger(r)&&(r===7||r>=9)?"light":"dark"}function Qr(e){return e==="dark"||e==="light"?e:e==="auto"?W2():"dark"}function ep(e){let t=ys(e);if(t!==void 0)return t;throw new Error(`Invalid --theme value: ${e}. Expected dark|light|auto`)}function tp(e,t){if(e!==void 0)return e;let n=ys(v.AFK_THEME);return n!==void 0?n:t}import Rte from"ora";Fe();function YR(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("rate limit")||t.toLowerCase().includes("too many requests")}function VR(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("network")||t.toLowerCase().includes("connect")||t.toLowerCase().includes("timeout")}function ws(e){if(e instanceof Zr)return{kind:"budget_exceeded",userMessage:`Session stopped: cost ceiling reached ($${e.runningCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit).`,exitCode:1,raw:e};if(e instanceof rp)return{kind:"unsupported_config",userMessage:`The "${e.provider}" provider does not support this configuration option.`,hint:`Option "${e.field}" is not available for provider "${e.provider}". Switch to a compatible provider or remove the option.`,exitCode:1,raw:e};if(e instanceof he)return{kind:"hook_blocked",userMessage:`A hook blocked the operation (event: ${e.event}).`,...e.reason!==void 0?{hint:e.reason}:{},exitCode:1,raw:e};if(e instanceof yt){let i=Math.round(e.timeoutMs/1e3);return{kind:"timeout",userMessage:`The operation timed out after ${i} second${i!==1?"s":""}.`,hint:`Timeout: ${e.timeoutMs}ms (${i}s). Increase the timeout or retry.`,exitCode:124,raw:e}}let t=e,n=e instanceof Error?e.message:String(e),r=n.toLowerCase();return t.status===401||e instanceof Error&&e.name==="AuthenticationError"?{kind:"auth",userMessage:"Authentication failed. Check that your API key is valid and has not expired.",hint:"Verify the ANTHROPIC_API_KEY environment variable or run `afk login`.",exitCode:1,raw:e}:t.status===429||YR(e)?{kind:"rate_limit",userMessage:"Anthropic rate limit reached. The request was rejected (HTTP 429).",hint:"Wait a moment and retry, or reduce the request frequency.",exitCode:1,raw:e}:t.status===529||t.status===503?{kind:"overloaded",userMessage:`Anthropic API is temporarily overloaded (HTTP ${t.status}). All retry attempts were exhausted.`,hint:"Wait a minute and try again, or switch to a less loaded model (e.g. sonnet).",exitCode:1,raw:e}:n==="Not in a git repository."||r.includes("not in a git repository")?{kind:"not_git_repo",userMessage:"This command must be run from inside a git repository.",hint:"Run `git init` to initialise a repository, or change to a directory that is already a git repo.",exitCode:1,raw:e}:VR(e)||r.includes("econnrefused")||r.includes("etimedout")?{kind:"network",userMessage:"Network error: unable to reach the API endpoint.",hint:"Check your internet connection and try again.",exitCode:1,raw:e}:{kind:"unknown",userMessage:(e instanceof Error?e.message:String(e))||"An unexpected error occurred.",exitCode:1,raw:e}}import K2 from"string-width";var qb=/\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[P^_X][^\x1B]*\x1B\\|[@-OQ-WYZ\\\-])/g,XR=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function Ie(e){return e.replace(qb,"")}function X(e){return K2(e)}function Ss(e){return e.length===0?[]:XR?Array.from(XR.segment(e),t=>t.segment):Array.from(e)}function G2(e){let t=[],n=0,r;for(qb.lastIndex=0;(r=qb.exec(e))!==null;){if(r.index>n)for(let o of Ss(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of Ss(e.slice(n)))t.push({type:"text",value:o});return t}function nt(e,t){let n=Math.max(0,t-X(e));return e+" ".repeat(n)}function q2(e,t){let n=Math.max(0,t-X(e));return" ".repeat(n)+e}function zb(e,t,n="left"){let r=Math.max(0,t-X(e));if(r===0)return e;if(n==="right")return q2(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return nt(e,t)}var z2=/^\x1b\]8;[^;\x07\x1b]*;(.*?)(?:\x07|\x1b\\)$/s,J2="\x1B]8;;\x1B\\";function ae(e,t,n="\u2026"){if(t<=0)return"";if(X(e)<=t)return e;let r=X(n),o=Math.max(0,t-r),i=0,s="",a=!1,l=!1;for(let c of G2(e)){if(c.type==="ansi"){s+=c.value,a=!0;let u=z2.exec(c.value);u&&(l=(u[1]??"").length>0);continue}let d=i+X(c.value);if(d>o)break;s+=c.value,i=d}return s+n+(l?J2:"")+(a?"\x1B[0m":"")}function QR(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Jb(e,t){let n=QR(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of Ss(e)){let i=r+o.length;if(i>=n)return r;r=i}return r}function Zo(e,t){let n=QR(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of Ss(e)){let i=r+o.length;if(r>=n||n>r&&n<i)return i;r=i}return e.length}function ne(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var op=new Set,ip=new Set,vs=!1,ei=null;function Y2(){for(let e of op)try{e()}catch{}}function V2(){for(let e of ip)try{e()}catch{}}function X2(){ei!==null&&clearTimeout(ei),ei=setTimeout(()=>{ei=null,Y2()},150)}function Yb(){V2(),X2()}function Q2(e){return op.add(e),vs||(process.stdout.on("resize",Yb),vs=!0),()=>{op.delete(e),ZR()}}function Z2(e){return ip.add(e),vs||(process.stdout.on("resize",Yb),vs=!0),()=>{ip.delete(e),ZR()}}function ZR(){op.size===0&&ip.size===0&&(vs&&(process.stdout.off("resize",Yb),vs=!1),ei!==null&&(clearTimeout(ei),ei=null))}var We={subscribe:Q2,subscribeImmediate:Z2};import eA from"wrap-ansi";function me(e,t,n={}){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let r=Math.floor(t);return eA(e,r,{hard:n.breakLongWords??!1,trim:!1,wordWrap:!0})}function sp(e,t){return!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY?e:eA(e,Math.floor(t),{hard:!0,trim:!1,wordWrap:!1})}function Zt(){return Math.max(22,ne()-6)}function eo(e,t){return ae(e,t)}function eq(e){switch(e){case"ok":return p.success("\u25CF");case"warn":return p.warning("\u25CF");case"error":return p.error("\u25CF");case"info":return p.info("\u25C6")}}function tA(e,t){let o=t.reduce((S,T)=>Math.max(S,X(T.label)),0),i=t.reduce((S,T)=>Math.max(S,X(T.value)),0),s=o+4+2+i,a=Math.min(ne()-4,100),l=Math.max(44,X(e),s,a);l=Math.min(l,Zt());let c=l+4,d=p.dim,u=d("\u256D"+"\u2500".repeat(c)+"\u256E"),m=d("\u251C"+"\u2500".repeat(c)+"\u2524"),f=d("\u2570"+"\u2500".repeat(c)+"\u256F"),g=d("\u2502"),y=me(e,l).split(`
1170
+ `)}_readSlot(){let t=this.backend.read();if(!t)return{};try{return JSON.parse(t).mcpOAuth?.[this.serverName]??{}}catch{return{}}}_updateSlot(t){let n=this.backend.read(),r={};if(n)try{r=JSON.parse(n)}catch{}let o=r.mcpOAuth??{},i=o[this.serverName]??{};o[this.serverName]=t(i),r.mcpOAuth=o,this.backend.write(JSON.stringify(r))}}});q();Zu();import{config as gR}from"dotenv";import{Command as Vye}from"commander";G();import Gb from"chalk";function BR(){let e=v.FORCE_COLOR;if(e&&e.length>0)return;let t=v.NO_COLOR;if(t&&t.length>0){Gb.level=0;return}let n=v.CI;if(n&&n.length>0){Gb.level=0;return}process.stdout.isTTY||(Gb.level=0)}G();import ne from"chalk";var UR={brand:ne.hex("#E67E4C"),mint:ne.hex("#5FE3A1"),goblin:ne.hex("#9CB04A"),user:ne.cyan,caret:ne.hex("#7AA2F7"),tool:ne.hex("#DCDCAA"),chrome:ne.hex("#B0B8C2"),syntaxString:ne.italic.hex("#8AB07A"),toolArg:ne.dim.white,thinking:ne.italic.hex("#9B8FB5"),success:ne.green,error:ne.red,warning:ne.yellow,plan:ne.hex("#9F7CE0"),bypass:ne.bold.hex("#FF6AC1"),meta:ne.blackBright,info:ne.hex("#5BA8FF"),fileRef:ne.hex("#56B5A8"),heading:ne.bold.white,label:ne.dim,dim:ne.dim,bold:ne.bold,italic:ne.italic,inverse:ne.inverse,diffAdd:ne.green,diffRemove:ne.red,diffHunk:ne.blackBright},$2={brand:ne.hex("#C0562A"),mint:ne.hex("#1B9E63"),goblin:ne.hex("#6B7D2A"),user:ne.hex("#0E7490"),caret:ne.hex("#3B5BDB"),tool:ne.hex("#7A6E00"),chrome:ne.hex("#5A6470"),syntaxString:ne.italic.hex("#3F7A3F"),toolArg:ne.hex("#6B7280"),thinking:ne.italic.hex("#6D5B8E"),success:ne.hex("#2E7D32"),error:ne.hex("#C62828"),warning:ne.hex("#B8860B"),plan:ne.hex("#7048C0"),bypass:ne.bold.hex("#D6297F"),meta:ne.hex("#6B7280"),info:ne.hex("#1D6FD6"),fileRef:ne.hex("#0F766E"),heading:ne.bold.hex("#1F2937"),label:ne.dim,dim:ne.dim,bold:ne.bold,italic:ne.italic,inverse:ne.inverse,diffAdd:ne.hex("#2E7D32"),diffRemove:ne.hex("#C62828"),diffHunk:ne.hex("#6B7280")},jR=UR,HR=$2,p={...UR};import D2 from"chalk";import{createEmphasize as F2,common as L2}from"emphasize";function WR(){return{keyword:p.brand,built_in:p.brand,literal:p.brand,tag:p.brand,string:p.syntaxString,regexp:p.syntaxString,attr:p.syntaxString,comment:p.meta,meta:p.meta,quote:p.meta,number:p.warning,function:p.tool,title:p.tool,class:p.tool,"selector-tag":p.tool}}var KR=F2(L2),N2=2048,B2=512,U2=32,Un=new Map;function GR(){Un.clear()}function j2(e){let t=Un.get(e);if(t!==void 0)return Un.delete(e),Un.set(e,t),t}function H2(e,t){if(Un.has(e)&&Un.delete(e),Un.set(e,t),Un.size>U2){let n=Un.keys().next().value;n!==void 0&&Un.delete(n)}}function qR(e,t){if(D2.level===0||e.length>N2)return e;let n=e.length<B2,r=n?`${t} ${e}`:"";if(n){let i=j2(r);if(i!==void 0)return i}let o;try{if(!t||!KR.registered(t))o=e;else{let i=KR.highlight(t,e,WR());o=typeof i?.value=="string"?i.value:e}}catch{o=e}return n&&H2(r,o),o}G();var zR="dark";function JR(){return zR}function Xr(e){Object.assign(p,e==="light"?HR:jR),GR(),zR=e}function ys(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="dark"||t==="light"||t==="auto")return t}function W2(){let e=v.COLORFGBG;if(!e)return"dark";let t=e.split(";"),n=t[t.length-1]?.trim();if(!n)return"dark";let r=Number.parseInt(n,10);return Number.isInteger(r)&&(r===7||r>=9)?"light":"dark"}function Qr(e){return e==="dark"||e==="light"?e:e==="auto"?W2():"dark"}function ep(e){let t=ys(e);if(t!==void 0)return t;throw new Error(`Invalid --theme value: ${e}. Expected dark|light|auto`)}function tp(e,t){if(e!==void 0)return e;let n=ys(v.AFK_THEME);return n!==void 0?n:t}import Rte from"ora";Fe();function YR(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("rate limit")||t.toLowerCase().includes("too many requests")}function VR(e){let t=e instanceof Error?e.message:String(e);return t.toLowerCase().includes("network")||t.toLowerCase().includes("connect")||t.toLowerCase().includes("timeout")}function ws(e){if(e instanceof Zr)return{kind:"budget_exceeded",userMessage:`Session stopped: cost ceiling reached ($${e.runningCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit).`,exitCode:1,raw:e};if(e instanceof rp)return{kind:"unsupported_config",userMessage:`The "${e.provider}" provider does not support this configuration option.`,hint:`Option "${e.field}" is not available for provider "${e.provider}". Switch to a compatible provider or remove the option.`,exitCode:1,raw:e};if(e instanceof he)return{kind:"hook_blocked",userMessage:`A hook blocked the operation (event: ${e.event}).`,...e.reason!==void 0?{hint:e.reason}:{},exitCode:1,raw:e};if(e instanceof yt){let i=Math.round(e.timeoutMs/1e3);return{kind:"timeout",userMessage:`The operation timed out after ${i} second${i!==1?"s":""}.`,hint:`Timeout: ${e.timeoutMs}ms (${i}s). Increase the timeout or retry.`,exitCode:124,raw:e}}let t=e,n=e instanceof Error?e.message:String(e),r=n.toLowerCase();return t.status===401||e instanceof Error&&e.name==="AuthenticationError"?{kind:"auth",userMessage:"Authentication failed. Check that your API key is valid and has not expired.",hint:"Verify the ANTHROPIC_API_KEY environment variable or run `afk login`.",exitCode:1,raw:e}:t.status===429||YR(e)?{kind:"rate_limit",userMessage:"Anthropic rate limit reached. The request was rejected (HTTP 429).",hint:"Wait a moment and retry, or reduce the request frequency.",exitCode:1,raw:e}:t.status===529||t.status===503?{kind:"overloaded",userMessage:`Anthropic API is temporarily overloaded (HTTP ${t.status}). All retry attempts were exhausted.`,hint:"Wait a minute and try again, or switch to a less loaded model (e.g. sonnet).",exitCode:1,raw:e}:n==="Not in a git repository."||r.includes("not in a git repository")?{kind:"not_git_repo",userMessage:"This command must be run from inside a git repository.",hint:"Run `git init` to initialise a repository, or change to a directory that is already a git repo.",exitCode:1,raw:e}:VR(e)||r.includes("econnrefused")||r.includes("etimedout")?{kind:"network",userMessage:"Network error: unable to reach the API endpoint.",hint:"Check your internet connection and try again.",exitCode:1,raw:e}:{kind:"unknown",userMessage:(e instanceof Error?e.message:String(e))||"An unexpected error occurred.",exitCode:1,raw:e}}import K2 from"string-width";var qb=/\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\)|[P^_X][^\x1B]*\x1B\\|[@-OQ-WYZ\\\-])/g,XR=typeof Intl<"u"&&"Segmenter"in Intl?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;function Ie(e){return e.replace(qb,"")}function X(e){return K2(e)}function Ss(e){return e.length===0?[]:XR?Array.from(XR.segment(e),t=>t.segment):Array.from(e)}function G2(e){let t=[],n=0,r;for(qb.lastIndex=0;(r=qb.exec(e))!==null;){if(r.index>n)for(let o of Ss(e.slice(n,r.index)))t.push({type:"text",value:o});t.push({type:"ansi",value:r[0]}),n=r.index+r[0].length}if(n<e.length)for(let o of Ss(e.slice(n)))t.push({type:"text",value:o});return t}function nt(e,t){let n=Math.max(0,t-X(e));return e+" ".repeat(n)}function q2(e,t){let n=Math.max(0,t-X(e));return" ".repeat(n)+e}function zb(e,t,n="left"){let r=Math.max(0,t-X(e));if(r===0)return e;if(n==="right")return q2(e,t);if(n==="center"){let o=Math.floor(r/2);return" ".repeat(o)+e+" ".repeat(r-o)}return nt(e,t)}var z2=/^\x1b\]8;[^;\x07\x1b]*;(.*?)(?:\x07|\x1b\\)$/s,J2="\x1B]8;;\x1B\\";function ae(e,t,n="\u2026"){if(t<=0)return"";if(X(e)<=t)return e;let r=X(n),o=Math.max(0,t-r),i=0,s="",a=!1,l=!1;for(let c of G2(e)){if(c.type==="ansi"){s+=c.value,a=!0;let u=z2.exec(c.value);u&&(l=(u[1]??"").length>0);continue}let d=i+X(c.value);if(d>o)break;s+=c.value,i=d}return s+n+(l?J2:"")+(a?"\x1B[0m":"")}function QR(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,Math.trunc(e))):0}function Jb(e,t){let n=QR(t,e.length);if(n===0||e.length===0)return 0;let r=0;for(let o of Ss(e)){let i=r+o.length;if(i>=n)return r;r=i}return r}function Zo(e,t){let n=QR(t,e.length);if(n>=e.length||e.length===0)return e.length;let r=0;for(let o of Ss(e)){let i=r+o.length;if(r>=n||n>r&&n<i)return i;r=i}return e.length}function Q(){let e=process.stdout.columns;return typeof e=="number"&&e>0?e:80}var op=new Set,ip=new Set,vs=!1,ei=null;function Y2(){for(let e of op)try{e()}catch{}}function V2(){for(let e of ip)try{e()}catch{}}function X2(){ei!==null&&clearTimeout(ei),ei=setTimeout(()=>{ei=null,Y2()},150)}function Yb(){V2(),X2()}function Q2(e){return op.add(e),vs||(process.stdout.on("resize",Yb),vs=!0),()=>{op.delete(e),ZR()}}function Z2(e){return ip.add(e),vs||(process.stdout.on("resize",Yb),vs=!0),()=>{ip.delete(e),ZR()}}function ZR(){op.size===0&&ip.size===0&&(vs&&(process.stdout.off("resize",Yb),vs=!1),ei!==null&&(clearTimeout(ei),ei=null))}var We={subscribe:Q2,subscribeImmediate:Z2};import eA from"wrap-ansi";function me(e,t,n={}){if(!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY)return e;let r=Math.floor(t);return eA(e,r,{hard:n.breakLongWords??!1,trim:!1,wordWrap:!0})}function sp(e,t){return!Number.isFinite(t)||t<=0||t===Number.POSITIVE_INFINITY?e:eA(e,Math.floor(t),{hard:!0,trim:!1,wordWrap:!1})}function Zt(){return Math.max(22,Q()-6)}function eo(e,t){return ae(e,t)}function eq(e){switch(e){case"ok":return p.success("\u25CF");case"warn":return p.warning("\u25CF");case"error":return p.error("\u25CF");case"info":return p.info("\u25C6")}}function tA(e,t){let o=t.reduce((S,T)=>Math.max(S,X(T.label)),0),i=t.reduce((S,T)=>Math.max(S,X(T.value)),0),s=o+4+2+i,a=Math.min(Q()-4,100),l=Math.max(44,X(e),s,a);l=Math.min(l,Zt());let c=l+4,d=p.dim,u=d("\u256D"+"\u2500".repeat(c)+"\u256E"),m=d("\u251C"+"\u2500".repeat(c)+"\u2524"),f=d("\u2570"+"\u2500".repeat(c)+"\u256F"),g=d("\u2502"),y=me(e,l).split(`
1171
1171
  `).map(S=>g+" "+nt(S,l)+" "+g),b=Math.max(1,l-o-4-2),w=t.map(S=>{let T=S.kind?eq(S.kind)+" ":" ",k=p.dim(nt(eo(S.label,o),o)),A=" ".repeat(4),F=eo(S.value,b),R=nt(F,b),D=k+A+T+R;return g+" "+D+" "+g});return[u,...y,m,...w,f].join(`
1172
- `)}import{sep as Zb}from"node:path";import sq from"chalk";G();G();import ks from"chalk";var lp={".":null,D:[74,92,36],M:[139,166,63],L:[178,197,88],Y:[245,213,71],K:[13,18,9],W:[238,238,222],X:[42,42,26],B:[60,38,20]},ap=["..............BBB..........","............BBBBB..........","..........BBBBBBB..........",".........BBBBBBBBB.........",".......BBBBBBBBBBBB........","......BBBBBBBBBBBBBB.......",".....BBBBBBBBBBBBBBBBB.....",".....KYYYYYYYYYYYYYYYK.....",".....KMMMMMMMMMMMMMMMK.....",".....KMMMMMMMMMMMMMMMK.....","....DKMMMMMMMMMMMMMMMKD....","...DDKMMMMMMMMMMMMMMMKDD...",".DDDDKMKKKKKMMMKKKKKMKDDDD.","DDDDDKMMKKKMMMMMKKKMMKDDDDD",".DDDDKMMYYYMMMMMYYYMMKDDDD.","..DDDKMMYKYMMLMMYKYMMKDDD..",".....KMMDDDMMLMMDDDMMK.....",".....KMDMMMMDLDMMMMDMK.....",".....KMDMMMMDDDMMMMDMK.....",".....KMMMMMMMMMMMMMMMK.....",".....KMMKKMMMMMMMKKMMK.....",".....KMMMKKKKKKKKKMMMK.....",".....KMMMMKKKKKKKMMMMK.....","......KMMMMMMMMMMMMMK......","........KMMMMMMMMMK........","..........KMMMMMK.........."],Xb=27,Vb=13,tq={"11,11":{char:"\u25BC",fg:"W",bg:"K"}};function nq(e){let t=lp[e.fg]??null,n=lp[e.bg]??null;return t&&n?ks.bgRgb(n[0],n[1],n[2]).rgb(t[0],t[1],t[2])(e.char):t?ks.rgb(t[0],t[1],t[2])(e.char):n?ks.bgRgb(n[0],n[1],n[2])(e.char):e.char}function rq(e,t,n){if(e.length!==t.length)throw new Error(`pixel row width mismatch: top=${e.length}, bot=${t.length}`);let r="";for(let o=0;o<e.length;o++){let i=tq[`${n},${o}`];if(i){r+=nq(i);continue}let s=lp[e[o]??"."]??null,a=lp[t[o]??"."]??null;!s&&!a?r+=" ":s&&!a?r+=ks.rgb(s[0],s[1],s[2])("\u2580"):!s&&a?r+=ks.rgb(a[0],a[1],a[2])("\u2584"):s&&a&&(r+=ks.bgRgb(a[0],a[1],a[2]).rgb(s[0],s[1],s[2])("\u2580"))}return r}function oq(){if(ap.length!==Vb*2)throw new Error(`GOBLIN_GRID has ${ap.length} pixel rows but MASCOT_HEIGHT*2 = ${Vb*2}`);let e=[];for(let t=0;t<Vb;t++){let n=ap[t*2]??"",r=ap[t*2+1]??"";e.push(rq(n,r,t))}return e}function nA(e="idle"){return v.AFK_BANNER_PLAIN==="1"?[]:oq()}function rA(){return v.AFK_BANNER_PLAIN==="1"}var iq={A:[" \u2588\u2588 ","\u2588 \u2588","\u2588\u2588\u2588\u2588","\u2588 \u2588","\u2588 \u2588"],G:[" \u2588\u2588\u2588","\u2588 ","\u2588 \u2588\u2588","\u2588 \u2588"," \u2588\u2588\u2588"],E:["\u2588\u2588\u2588\u2588","\u2588 ","\u2588\u2588\u2588 ","\u2588 ","\u2588\u2588\u2588\u2588"],N:["\u2588 \u2588","\u2588\u2588 \u2588","\u2588 \u2588\u2588","\u2588 \u2588","\u2588 \u2588"],T:["\u2588\u2588\u2588\u2588"," \u2588\u2588 "," \u2588\u2588 "," \u2588\u2588 "," \u2588\u2588 "],F:["\u2588\u2588\u2588\u2588","\u2588 ","\u2588\u2588\u2588 ","\u2588 ","\u2588 "],K:["\u2588 \u2588","\u2588 \u2588 ","\u2588\u2588 ","\u2588 \u2588 ","\u2588 \u2588"]," ":[" "," "," "," "," "]};function Qb(e){let t=Array.from({length:5},()=>"");return[...e.toUpperCase()].forEach((r,o)=>{let i=iq[r];if(i===void 0)throw new Error(`ascii-wordmark: no glyph for character ${JSON.stringify(r)}`);let s=o===0?"":" ".repeat(1);for(let a=0;a<5;a++)t[a]+=s+(i[a]??"")}),t}function oA(e){return Qb(e)[0]?.length??0}function aA(e){let t=e.model!==void 0||e.worktree!==void 0||e.cwd!==void 0||e.version!==void 0;return t&&!rA()?pq(e):iA(t?aq(e):e)}function aq(e){let t=e.mode;e.model!==void 0&&e.model.length>0&&(t=`${e.model} \xB7 ${t}`),e.version!==void 0&&e.version.length>0&&(t=`${t} \xB7 ${lA(e.version)}`);let n=[];e.worktree!==void 0&&e.worktree.length>0&&n.push(`branch ${e.worktree}`),e.cwd!==void 0&&e.cwd.length>0&&n.push(cA(e.cwd));let r=n.join(" \xB7 "),o=e.metaLine!==void 0?e.metaLine:r.length>0?r:void 0,i={mode:t};return o!==void 0&&(i.metaLine=o),e.hintLine!==void 0&&(i.hintLine=e.hintLine),i}function iA(e){let t="Agent AFK",n=" \xB7 ",r=p.bold(t)+p.dim(n)+e.mode,o=t+n+e.mode,i=Math.min(ne()-4,120),s=Math.max(54,X(o)+4,i);s=Math.min(s,Zt());let a=s+4,l=p.dim,c=l("\u256D"+"\u2500".repeat(a)+"\u256E"),u=me(r,s).split(`
1173
- `).map(g=>l("\u2502")+" "+nt(g,s)+" "+l("\u2502")),m=l("\u2570"+"\u2500".repeat(a)+"\u256F"),f=[c,...u,m];return e.metaLine!==void 0&&f.push(...me(p.dim(" "+e.metaLine),ne()).split(`
1174
- `)),e.hintLine!==void 0&&f.push(...me(p.dim(" "+e.hintLine),ne()).split(`
1172
+ `)}import{sep as Zb}from"node:path";import sq from"chalk";G();G();import ks from"chalk";var lp={".":null,D:[74,92,36],M:[139,166,63],L:[178,197,88],Y:[245,213,71],K:[13,18,9],W:[238,238,222],X:[42,42,26],B:[60,38,20]},ap=["..............BBB..........","............BBBBB..........","..........BBBBBBB..........",".........BBBBBBBBB.........",".......BBBBBBBBBBBB........","......BBBBBBBBBBBBBB.......",".....BBBBBBBBBBBBBBBBB.....",".....KYYYYYYYYYYYYYYYK.....",".....KMMMMMMMMMMMMMMMK.....",".....KMMMMMMMMMMMMMMMK.....","....DKMMMMMMMMMMMMMMMKD....","...DDKMMMMMMMMMMMMMMMKDD...",".DDDDKMKKKKKMMMKKKKKMKDDDD.","DDDDDKMMKKKMMMMMKKKMMKDDDDD",".DDDDKMMYYYMMMMMYYYMMKDDDD.","..DDDKMMYKYMMLMMYKYMMKDDD..",".....KMMDDDMMLMMDDDMMK.....",".....KMDMMMMDLDMMMMDMK.....",".....KMDMMMMDDDMMMMDMK.....",".....KMMMMMMMMMMMMMMMK.....",".....KMMKKMMMMMMMKKMMK.....",".....KMMMKKKKKKKKKMMMK.....",".....KMMMMKKKKKKKMMMMK.....","......KMMMMMMMMMMMMMK......","........KMMMMMMMMMK........","..........KMMMMMK.........."],Xb=27,Vb=13,tq={"11,11":{char:"\u25BC",fg:"W",bg:"K"}};function nq(e){let t=lp[e.fg]??null,n=lp[e.bg]??null;return t&&n?ks.bgRgb(n[0],n[1],n[2]).rgb(t[0],t[1],t[2])(e.char):t?ks.rgb(t[0],t[1],t[2])(e.char):n?ks.bgRgb(n[0],n[1],n[2])(e.char):e.char}function rq(e,t,n){if(e.length!==t.length)throw new Error(`pixel row width mismatch: top=${e.length}, bot=${t.length}`);let r="";for(let o=0;o<e.length;o++){let i=tq[`${n},${o}`];if(i){r+=nq(i);continue}let s=lp[e[o]??"."]??null,a=lp[t[o]??"."]??null;!s&&!a?r+=" ":s&&!a?r+=ks.rgb(s[0],s[1],s[2])("\u2580"):!s&&a?r+=ks.rgb(a[0],a[1],a[2])("\u2584"):s&&a&&(r+=ks.bgRgb(a[0],a[1],a[2]).rgb(s[0],s[1],s[2])("\u2580"))}return r}function oq(){if(ap.length!==Vb*2)throw new Error(`GOBLIN_GRID has ${ap.length} pixel rows but MASCOT_HEIGHT*2 = ${Vb*2}`);let e=[];for(let t=0;t<Vb;t++){let n=ap[t*2]??"",r=ap[t*2+1]??"";e.push(rq(n,r,t))}return e}function nA(e="idle"){return v.AFK_BANNER_PLAIN==="1"?[]:oq()}function rA(){return v.AFK_BANNER_PLAIN==="1"}var iq={A:[" \u2588\u2588 ","\u2588 \u2588","\u2588\u2588\u2588\u2588","\u2588 \u2588","\u2588 \u2588"],G:[" \u2588\u2588\u2588","\u2588 ","\u2588 \u2588\u2588","\u2588 \u2588"," \u2588\u2588\u2588"],E:["\u2588\u2588\u2588\u2588","\u2588 ","\u2588\u2588\u2588 ","\u2588 ","\u2588\u2588\u2588\u2588"],N:["\u2588 \u2588","\u2588\u2588 \u2588","\u2588 \u2588\u2588","\u2588 \u2588","\u2588 \u2588"],T:["\u2588\u2588\u2588\u2588"," \u2588\u2588 "," \u2588\u2588 "," \u2588\u2588 "," \u2588\u2588 "],F:["\u2588\u2588\u2588\u2588","\u2588 ","\u2588\u2588\u2588 ","\u2588 ","\u2588 "],K:["\u2588 \u2588","\u2588 \u2588 ","\u2588\u2588 ","\u2588 \u2588 ","\u2588 \u2588"]," ":[" "," "," "," "," "]};function Qb(e){let t=Array.from({length:5},()=>"");return[...e.toUpperCase()].forEach((r,o)=>{let i=iq[r];if(i===void 0)throw new Error(`ascii-wordmark: no glyph for character ${JSON.stringify(r)}`);let s=o===0?"":" ".repeat(1);for(let a=0;a<5;a++)t[a]+=s+(i[a]??"")}),t}function oA(e){return Qb(e)[0]?.length??0}function aA(e){let t=e.model!==void 0||e.worktree!==void 0||e.cwd!==void 0||e.version!==void 0;return t&&!rA()?pq(e):iA(t?aq(e):e)}function aq(e){let t=e.mode;e.model!==void 0&&e.model.length>0&&(t=`${e.model} \xB7 ${t}`),e.version!==void 0&&e.version.length>0&&(t=`${t} \xB7 ${lA(e.version)}`);let n=[];e.worktree!==void 0&&e.worktree.length>0&&n.push(`branch ${e.worktree}`),e.cwd!==void 0&&e.cwd.length>0&&n.push(cA(e.cwd));let r=n.join(" \xB7 "),o=e.metaLine!==void 0?e.metaLine:r.length>0?r:void 0,i={mode:t};return o!==void 0&&(i.metaLine=o),e.hintLine!==void 0&&(i.hintLine=e.hintLine),i}function iA(e){let t="Agent AFK",n=" \xB7 ",r=p.bold(t)+p.dim(n)+e.mode,o=t+n+e.mode,i=Math.min(Q()-4,120),s=Math.max(54,X(o)+4,i);s=Math.min(s,Zt());let a=s+4,l=p.dim,c=l("\u256D"+"\u2500".repeat(a)+"\u256E"),u=me(r,s).split(`
1173
+ `).map(g=>l("\u2502")+" "+nt(g,s)+" "+l("\u2502")),m=l("\u2570"+"\u2500".repeat(a)+"\u256F"),f=[c,...u,m];return e.metaLine!==void 0&&f.push(...me(p.dim(" "+e.metaLine),Q()).split(`
1174
+ `)),e.hintLine!==void 0&&f.push(...me(p.dim(" "+e.hintLine),Q()).split(`
1175
1175
  `)),f.join(`
1176
- `)}var lq="run coding agents without babysitting them",cq="docs.agentafk.com",dq="github.com/griffinwork40/agent-afk",sA="AFK",ew=[242,174,116],tw=[199,84,42];function uq(e){let t=e.length,n=(r,o,i)=>Math.round(r+(o-r)*i);return e.map((r,o)=>{let i=t<=1?0:o/(t-1),s=n(ew[0],tw[0],i),a=n(ew[1],tw[1],i),l=n(ew[2],tw[2],i);return sq.rgb(s,a,l)(r)})}function pq(e){let t=ne(),n=" ",r=" ",o=24,i=t-n.length-Xb-r.length,s=i>=o,a=Math.max(1,t-n.length),l=s?i:a,c=e.version!==void 0?lA(e.version):void 0,d=[];oA(sA)<=l?d.push(...uq(Qb(sA))):d.push(p.brand("Agent ")+p.bold(p.brand("AFK")));let u=p.heading("Agent AFK")+(c!==void 0?p.dim(" \xB7 "+c):"");d.push(""),d.push(eo(u,l));let m=[],f=y=>{m.push(eo(y,l))},g=[];e.model!==void 0&&g.push(p.heading(e.model)),e.mode.length>0&&g.push(p.dim(e.mode)),g.length>0&&f(g.join(p.dim(" \xB7 "))),e.worktree!==void 0&&f(p.dim("branch ")+p.goblin(e.worktree)),e.cwd!==void 0&&f(p.dim(fq(cA(e.cwd),l))),e.metaLine!==void 0&&f(p.dim(e.metaLine)),m.length>0&&(d.push(""),d.push(...m));let h=[];if(s){let y=nA("idle"),b=Math.max(0,Math.round((y.length-d.length)/2)),w=Math.max(y.length,b+d.length);for(let S=0;S<w;S++){let T=y[S]??" ".repeat(Xb),k=S-b,A=k>=0?d[k]??"":"";h.push((n+T+r+A).trimEnd())}}else for(let y of d)h.push((n+y).trimEnd());return h.push(""),h.push(n+eo(p.italic(p.brand(lq)),a)),h.push(n+eo(p.dim(`${cq} \xB7 ${dq}`),a)),e.hintLine!==void 0&&h.push(...me(p.dim(n+mq(e.hintLine)),t).split(`
1176
+ `)}var lq="run coding agents without babysitting them",cq="docs.agentafk.com",dq="github.com/griffinwork40/agent-afk",sA="AFK",ew=[242,174,116],tw=[199,84,42];function uq(e){let t=e.length,n=(r,o,i)=>Math.round(r+(o-r)*i);return e.map((r,o)=>{let i=t<=1?0:o/(t-1),s=n(ew[0],tw[0],i),a=n(ew[1],tw[1],i),l=n(ew[2],tw[2],i);return sq.rgb(s,a,l)(r)})}function pq(e){let t=Q(),n=" ",r=" ",o=24,i=t-n.length-Xb-r.length,s=i>=o,a=Math.max(1,t-n.length),l=s?i:a,c=e.version!==void 0?lA(e.version):void 0,d=[];oA(sA)<=l?d.push(...uq(Qb(sA))):d.push(p.brand("Agent ")+p.bold(p.brand("AFK")));let u=p.heading("Agent AFK")+(c!==void 0?p.dim(" \xB7 "+c):"");d.push(""),d.push(eo(u,l));let m=[],f=y=>{m.push(eo(y,l))},g=[];e.model!==void 0&&g.push(p.heading(e.model)),e.mode.length>0&&g.push(p.dim(e.mode)),g.length>0&&f(g.join(p.dim(" \xB7 "))),e.worktree!==void 0&&f(p.dim("branch ")+p.goblin(e.worktree)),e.cwd!==void 0&&f(p.dim(fq(cA(e.cwd),l))),e.metaLine!==void 0&&f(p.dim(e.metaLine)),m.length>0&&(d.push(""),d.push(...m));let h=[];if(s){let y=nA("idle"),b=Math.max(0,Math.round((y.length-d.length)/2)),w=Math.max(y.length,b+d.length);for(let S=0;S<w;S++){let T=y[S]??" ".repeat(Xb),k=S-b,A=k>=0?d[k]??"":"";h.push((n+T+r+A).trimEnd())}}else for(let y of d)h.push((n+y).trimEnd());return h.push(""),h.push(n+eo(p.italic(p.brand(lq)),a)),h.push(n+eo(p.dim(`${cq} \xB7 ${dq}`),a)),e.hintLine!==void 0&&h.push(...me(p.dim(n+mq(e.hintLine)),t).split(`
1177
1177
  `)),h.join(`
1178
1178
  `)}function lA(e){return e.startsWith("v")?e:`v${e}`}function mq(e){return e.replace(/\s+·\s+/g," \xB7 ")}function cA(e){let t=v.HOME;if(t===void 0||t.length===0)return e;if(e===t)return"~";let n=t.endsWith(Zb)?t:t+Zb;return e.startsWith(n)?"~"+Zb+e.slice(n.length):e}function fq(e,t){if(X(e)<=t)return e;let n="\u2026",r=Math.max(2,t-1),o=Math.ceil(r*.6),i=Math.max(1,r-o);return e.slice(0,i)+n+e.slice(e.length-o)}var nw="\u256D",rw="\u256E",gq="\u2570",hq="\u256F",sc="\u2500",yq="\u2502";function Ts(e,t={}){let n=t.border??p.dim,r=Math.max(0,Math.trunc(t.padding??1)),o=t.title,i=Array.isArray(e)?e:e.split(`
1179
1179
  `),s=Zt(),a=o!==void 0?X(` ${o} `):0,l=i.reduce((y,b)=>Math.max(y,X(b)),0),c=t.width!==void 0?Math.max(1,Math.trunc(t.width)):Math.max(1,l,a+1);c=Math.min(c,s),c=Math.max(c,Math.min(a+1,s));let d=" ".repeat(r),u=c+r*2,m;if(o!==void 0){let y=u-1,b=` ${o} `;X(b)>y&&(b=ae(b,y));let w=X(b);if(w>0&&w<=y){let S=u-1-w;m=n(nw+sc)+n.bold(b)+n(sc.repeat(S)+rw)}else m=n(nw+sc.repeat(u)+rw)}else m=n(nw+sc.repeat(u)+rw);let f=n(yq),g=[];for(let y of i)for(let b of me(y,c).split(`
1180
1180
  `)){let w=nt(ae(b,c),c);g.push(f+d+w+d+f)}let h=n(gq+sc.repeat(u)+hq);return[m,...g,h].join(`
1181
- `)}function cp(e,t){let n=Math.max(40,X(e),X(t??""))+4,r=Math.min(n,Math.min(ne()-4,100));r=Math.min(r,Zt());let o=t!==void 0?[e,p.dim(t)]:[e];return Ts(o,{border:p.error,title:"Error",width:r,padding:2})}function dA(e){let{resetsAt:t,reason:n,accountId:r,hotSwapped:o}=e,i=e.autoResume??!0,s=[];if(n==="usage-limit"){if(s.push("You've hit your Claude subscription limit for now."),t!==void 0){let u=Date.now(),m=t.getTime()-u,f=Math.max(0,Math.ceil(m/6e4)),g=t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});s.push(""),s.push(`Resets at ${g} (in ~${f} min).`)}s.push(""),i?(s.push("I'll auto-resume when the limit resets \u2014 no need to retype."),s.push(""),s.push("Or act now:"),s.push(" \u2022 Switch model \u2014 type /model <name> then press Enter"),s.push(" \u2022 Switch account \u2014 run claude login in any terminal (resumes automatically)"),s.push(" \u2022 Press Esc to stop waiting")):(s.push("Options:"),s.push(" \u2022 Wait, then send the message again."),s.push(" \u2022 Switch to API-key billing: export ANTHROPIC_API_KEY=..."),s.push(" \u2022 Log into another account in any terminal: claude login"))}else s.push("Your Anthropic API credit balance is empty."),s.push(""),s.push("Top up at: https://console.anthropic.com/settings/billing"),s.push(""),s.push("Or switch to your Claude subscription on the server.");o===!0&&r!==void 0&&(s.push(""),s.push(`Resumed on ${r}.`));let a=" Usage paused ",l=s.reduce((u,m)=>Math.max(u,X(m)),0),c=Math.max(40,X(a),l)+4,d=Math.min(c,Math.min(ne()-4,100));return d=Math.min(d,Zt()),Ts(s,{border:p.warning,title:"Usage paused",width:d,padding:2})}import{Lexer as uA}from"marked";function dp(e){return X(e)}function bq(e,t,n){return zb(e,t,n??"left")}var pA=/^\/[A-Za-z][\w:-]*$/,wq=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|[,.:;!?]?$|[,.:;!?]\s)/g;function to(e){return e?e.map(t=>{switch(t.type){case"codespan":{let n=t.text;return pA.test(n)?p.brand(n):p.tool(n)}case"strong":{let n=t;return p.bold(n.tokens?to(n.tokens):n.text)}case"em":{let n=t;return p.italic(n.tokens?to(n.tokens):n.text)}case"text":return t.text.replace(wq,n=>p.brand(n));case"link":{let n=t,r=n.tokens?to(n.tokens):n.text;return r===n.href?r:r+p.dim(` (${n.href})`)}case"escape":return t.text;default:return t.raw}}).join(""):""}var Sq=new Set(["code","table","blockquote","hr","html"]);function no(e){let t=e.replace(/^(?:\*\*|__)\s/,""),n=uA.lex(t);return n.some(o=>Sq.has(o.type))?t:n.map(o=>{switch(o.type){case"heading":{let i=o;return p.bold(to(i.tokens))}case"list":return o.items.map(s=>{let l=s.tokens[0]?.tokens??[];return"\u2022 "+to(l)}).join(", ");case"paragraph":return to(o.tokens);case"text":{let i=o;return i.tokens?to(i.tokens):i.text}case"space":return"";default:return o.raw}}).join("")}function ro(e,t={}){let n=uA.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(s){return to(s)}function i(s){return s.map(a=>{switch(a.type){case"heading":{let l=a,c=l.tokens?o(l.tokens):l.text;return l.depth===1?p.brand.bold(c)+`
1181
+ `)}function cp(e,t){let n=Math.max(40,X(e),X(t??""))+4,r=Math.min(n,Math.min(Q()-4,100));r=Math.min(r,Zt());let o=t!==void 0?[e,p.dim(t)]:[e];return Ts(o,{border:p.error,title:"Error",width:r,padding:2})}function dA(e){let{resetsAt:t,reason:n,accountId:r,hotSwapped:o}=e,i=e.autoResume??!0,s=[];if(n==="usage-limit"){if(s.push("You've hit your Claude subscription limit for now."),t!==void 0){let u=Date.now(),m=t.getTime()-u,f=Math.max(0,Math.ceil(m/6e4)),g=t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0});s.push(""),s.push(`Resets at ${g} (in ~${f} min).`)}s.push(""),i?(s.push("I'll auto-resume when the limit resets \u2014 no need to retype."),s.push(""),s.push("Or act now:"),s.push(" \u2022 Switch model \u2014 type /model <name> then press Enter"),s.push(" \u2022 Switch account \u2014 run claude login in any terminal (resumes automatically)"),s.push(" \u2022 Press Esc to stop waiting")):(s.push("Options:"),s.push(" \u2022 Wait, then send the message again."),s.push(" \u2022 Switch to API-key billing: export ANTHROPIC_API_KEY=..."),s.push(" \u2022 Log into another account in any terminal: claude login"))}else s.push("Your Anthropic API credit balance is empty."),s.push(""),s.push("Top up at: https://console.anthropic.com/settings/billing"),s.push(""),s.push("Or switch to your Claude subscription on the server.");o===!0&&r!==void 0&&(s.push(""),s.push(`Resumed on ${r}.`));let a=" Usage paused ",l=s.reduce((u,m)=>Math.max(u,X(m)),0),c=Math.max(40,X(a),l)+4,d=Math.min(c,Math.min(Q()-4,100));return d=Math.min(d,Zt()),Ts(s,{border:p.warning,title:"Usage paused",width:d,padding:2})}import{Lexer as uA}from"marked";function dp(e){return X(e)}function bq(e,t,n){return zb(e,t,n??"left")}var pA=/^\/[A-Za-z][\w:-]*$/,wq=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|[,.:;!?]?$|[,.:;!?]\s)/g;function to(e){return e?e.map(t=>{switch(t.type){case"codespan":{let n=t.text;return pA.test(n)?p.brand(n):p.tool(n)}case"strong":{let n=t;return p.bold(n.tokens?to(n.tokens):n.text)}case"em":{let n=t;return p.italic(n.tokens?to(n.tokens):n.text)}case"text":return t.text.replace(wq,n=>p.brand(n));case"link":{let n=t,r=n.tokens?to(n.tokens):n.text;return r===n.href?r:r+p.dim(` (${n.href})`)}case"escape":return t.text;default:return t.raw}}).join(""):""}var Sq=new Set(["code","table","blockquote","hr","html"]);function no(e){let t=e.replace(/^(?:\*\*|__)\s/,""),n=uA.lex(t);return n.some(o=>Sq.has(o.type))?t:n.map(o=>{switch(o.type){case"heading":{let i=o;return p.bold(to(i.tokens))}case"list":return o.items.map(s=>{let l=s.tokens[0]?.tokens??[];return"\u2022 "+to(l)}).join(", ");case"paragraph":return to(o.tokens);case"text":{let i=o;return i.tokens?to(i.tokens):i.text}case"space":return"";default:return o.raw}}).join("")}function ro(e,t={}){let n=uA.lex(e),r=Number.isFinite(t.maxWidth)?Math.floor(t.maxWidth??0):void 0;function o(s){return to(s)}function i(s){return s.map(a=>{switch(a.type){case"heading":{let l=a,c=l.tokens?o(l.tokens):l.text;return l.depth===1?p.brand.bold(c)+`
1182
1182
  `:l.depth===2?p.heading(c)+`
1183
1183
  `:p.bold(c)+`
1184
1184
  `}case"paragraph":return o(a.tokens)+`
@@ -1204,10 +1204,10 @@ Status written to: ${ic()}
1204
1204
  `;let D=Math.floor(y);return R.map(_=>ae(_,D)).join(`
1205
1205
  `)+`
1206
1206
  `}default:return a.raw}}).join("")}return i(n)}G();var mA=(()=>{let e=v.AFK_USER_CARD_MAX_ROWS,t=e?Number.parseInt(e,10):NaN;return Number.isFinite(t)&&t>0?t:24})();function vq(e){switch(e){case"plan":return p.plan;case"status":return p.info;case"checkpoint":return p.success;case"diagnosis":return p.warning}}var kq={plan:"PLAN",status:"STATUS",checkpoint:"\u2705 CHECKPOINT",diagnosis:"DIAGNOSIS"};function Es(e){let t=Array.isArray(e.body)?e.body:e.body.split(`
1207
- `);if(e.kind==="user")return Tq(t);let n=e.title??kq[e.kind];return Eq(e.kind,n,t)}function Tq(e){let t=ne(),n=Math.max(20,Math.min(t-4,Math.floor(t*.75),100)),r=[];for(let f of e)r.push(...me(no(f),n).split(`
1207
+ `);if(e.kind==="user")return Tq(t);let n=e.title??kq[e.kind];return Eq(e.kind,n,t)}function Tq(e){let t=Q(),n=Math.max(20,Math.min(t-4,Math.floor(t*.75),100)),r=[];for(let f of e)r.push(...me(no(f),n).split(`
1208
1208
  `));let o=r;if(r.length>mA){let f=mA-1,g=r.length-f;o=[...r.slice(0,f),p.dim(`\u2026(${g} lines collapsed)`)]}let i=p.user.bold("\u2502"),s=t-1,a=Math.min(Math.max(0,...o.map(f=>X(f))),Math.max(0,s-2)),l=Math.min(Math.max(1,s),Math.max(12,a+2)),c=Math.max(0,s-l),d=" ".repeat(c)+p.dim("\u2500".repeat(l)),u=Math.max(0,s-a-2),m=o.map(f=>{let g=X(f)>a?ae(f,a):f,h=Math.max(0,a-X(g));return" ".repeat(u)+g+" ".repeat(h)+" "+i}).join(`
1209
1209
  `);return d+`
1210
- `+m}function Eq(e,t,n){let r=vq(e),o=n.map(no),i=Math.max(X(t)+4,...o.map(l=>X(l))),s=Math.max(40,i)+4,a=Math.min(s,Math.min(ne()-4,100));return a=Math.min(a,Zt()),Ts(o,{border:r,title:t,width:a,padding:2})}function de(e){let t=Math.min(ne(),120);if(e===void 0)return p.dim("\u2500".repeat(t));let n=p.dim("\u2500\u2500")+" "+p.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-X(r));return n+p.dim("\u2500".repeat(o))}ye();function xs(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(cp(e.userMessage,e.hint)+`
1210
+ `+m}function Eq(e,t,n){let r=vq(e),o=n.map(no),i=Math.max(X(t)+4,...o.map(l=>X(l))),s=Math.max(40,i)+4,a=Math.min(s,Math.min(Q()-4,100));return a=Math.min(a,Zt()),Ts(o,{border:r,title:t,width:a,padding:2})}function de(e){let t=Math.min(Q(),120);if(e===void 0)return p.dim("\u2500".repeat(t));let n=p.dim("\u2500\u2500")+" "+p.bold(e)+" ",r="\u2500\u2500 "+e+" ",o=Math.max(0,t-X(r));return n+p.dim("\u2500".repeat(o))}ye();function xs(e,t){let n=t?.isTTY??process.stdout.isTTY??!1,r=t?.write??(o=>{process.stderr.write(o)});if(n)r(cp(e.userMessage,e.hint)+`
1211
1211
  `);else{let o=e.hint?` (${e.hint})`:"";r(`afk: error: ${e.userMessage}${o}
1212
1212
  `)}Ke()&&e.raw instanceof Error&&e.raw.stack&&r(e.raw.stack+`
1213
1213
  `)}function Y(e){let t=ws(e);xs(t),process.exit(t.exitCode)}xa();import*as hL from"node:os";import*as yL from"node:path";import{existsSync as Ate}from"node:fs";Gp();var hQ=["shadow-verify","shadow_verify","resolve","diagnose","appmap","mint","review","verify","verifier"],yQ=[/\bverdict(s)?\b/i,/\brecommend(ation)?s?\b/i,/\bshould\s+(delete|remove|rewrite|refactor|rename|reject|merge|revert|disable)\b/i,/\b(USELESS|KEEP|REJECT|APPROVE|SALVAGE|BLOCK|FAIL)\b/,/\b(redundant|duplicated|superseded|obsolete)\b/i,/\bvulnerab\w*\b/i,/\bunused\b/i,/\bbroken\b/i,/\bregress\w*\b/i,/\|\s*(status|verdict|decision|severity|risk|finding|priority|holds\??)\s*\|/i,/\bfound\s+\d+\s*(issue|problem|bug|error|finding|vulnerabilit)/i,/\b(critical|high|medium|low)\s+(severity|priority|risk)\b/i,/\bclaim(s)?\b[^\n]{0,80}\b(holds?|refuted|verified|partial|confirmed|disputed)\b/i,/\b(root\s*cause|incident)\b/i,/\brecommend\s+(removing|deleting|rewriting|refactoring|merging|reverting)\b/i,/\bI\s+(applied|committed|pushed|edited|wrote|fixed|patched|reset|restored|staged)\b/i,/\b(applied|committed|pushed|fixed|patched)\s+(the|these|those)\s+(change|commit|fix|patch|edit)/i],bQ=[/\bverifier_verdict\b/i,/"\s*claim\s*"\s*:/i,/\bre-derived\b[^.\n]{0,80}\bindependent/i,/\bindependently\s+(re-derived|re-verified|verified|checked)\b/i,/\bverifier\s+(agrees|disagrees|confirms|refutes)\b/i,/\b(CONFIRMED|REFUTED|UNVERIFIABLE)\b[\s\S]*?\b(CONFIRMED|REFUTED|UNVERIFIABLE)\b/,/\|\s*(claims?|verdicts?)\s*\|/i],wQ=`[framework-generated context: shadow-verify nudge]
@@ -1454,9 +1454,9 @@ Every turn must end in one externally identifiable terminal state. AFK users nee
1454
1454
 
1455
1455
  Never end a turn mid-loop without one of these. The terminal-state heading must be the last block of the response, with no trailing prose after it.`,XZ=new Set(["repl","telegram"]);function Mg(e,t,n="one-shot"){if(!e)return e;let r=[e];return t&&r.push(YZ),XZ.has(n)&&r.push(VZ),r.join(`
1456
1456
 
1457
- `)}function Cd(e,t){let n=e.trimEnd();if(!n.trim())return"";let r=Math.max(t*4,400),o=n.length>r?n.slice(-r):n,i=/[.!?](?=\s)|\n+/g,s=-1,a;for(;(a=i.exec(o))!==null;)s=a.index+a[0].length;let l=s>=0?o.slice(s):o;return l=l.replace(/\s+/g," ").trim(),l?(l.length>t&&(l=l.slice(0,Math.max(1,t-1))+"\u2026"),l):""}function Og(e,t){if(!(!e||!e.trim())&&!t.isTTY)for(let n of QZ(e))t.out.line(n)}function QZ(e){if(!e)return[];let t=p.dim("\u2502 "),n=" ",r=Math.max(1,ne()-n.length-2-2),o=[];for(let i of e.split(`
1457
+ `)}function Cd(e,t){let n=e.trimEnd();if(!n.trim())return"";let r=Math.max(t*4,400),o=n.length>r?n.slice(-r):n,i=/[.!?](?=\s)|\n+/g,s=-1,a;for(;(a=i.exec(o))!==null;)s=a.index+a[0].length;let l=s>=0?o.slice(s):o;return l=l.replace(/\s+/g," ").trim(),l?(l.length>t&&(l=l.slice(0,Math.max(1,t-1))+"\u2026"),l):""}function Og(e,t){if(!(!e||!e.trim())&&!t.isTTY)for(let n of QZ(e))t.out.line(n)}function QZ(e){if(!e)return[];let t=p.dim("\u2502 "),n=" ",r=Math.max(1,Q()-n.length-2-2),o=[];for(let i of e.split(`
1458
1458
  `)){let s=me(i,r);for(let a of s.split(`
1459
- `))o.push(n+t+a)}return o}function Zk(e,t,n,r){if(t.syntheticAgentToolUseId)return;let o=t.agentType?.trim()||"agent",i=process.stdout.columns??100,s=Math.max(20,i-14);if(r!==void 0&&n.toolLane.mergeAgentLabel(r,o,s)){t.syntheticAgentToolUseId=r;return}let a=`__synth_agent_${e}`;n.toolLane.addStartWithAgentContext(a,"Agent",`(${o})`,r,s),t.syntheticAgentToolUseId=a}import Ur from"chalk";ad();function ZZ(e){switch(e){case"read":return Ur.hex("#C9B584");case"write":return Ur.hex("#E8A33D");case"shell":return Ur.hex("#A8E060");case"subagent":return p.plan;case"skill":return Ur.hex("#F08AC4");case"dag":return Ur.hex("#4EC9B0");case"mcp":return Ur.hex("#49C2E0");case"web":return Ur.hex("#A0C4C0");case"browser":return Ur.hex("#FF8A65");case"planning":return p.meta;case"schedule":return Ur.hex("#D4A84B");case"other":return p.meta}}var eee={read:"\u25CF",write:"\u270E",shell:"$",subagent:"\u2192",skill:"\u25C6",dag:"\u2B21",mcp:"\u22A1",web:"\u2316",browser:"\u25C9",planning:"\u25B1",schedule:"\u23F2",other:"\u25CF"};function eT(e){return{color:ZZ(e),glyph:eee[e]}}function za(e){return eT(or(e))}var pF=/[\x00-\x1F\x7F-\x9F]/g;function De(e){return Ie(e).replace(pF," ").replace(/ {2,}/g," ").trim()}function tT(e){return Ie(e).replace(pF," ")}function $g(e,t){let n=t??process.stdout.columns??80;return!Number.isFinite(n)||n<=0?e:ae(e,n)}function Dg(e,t){if(!e)return;let n=t??ne();return Cd(e,Math.max(20,n-10))||void 0}function mF(e){return e===void 0||!Number.isFinite(e)||e<=0?"rate-limited \xB7 retrying\u2026":`rate-limited \xB7 retrying in ~${Math.max(1,Math.ceil(e/1e3))}s`}function _d(e,t,n,r){let{description:o,summary:i,lastToolName:s,totalTokens:a,toolUses:l,durationMs:c}=e,d=[];if(s){let{color:h,glyph:y}=za(s);d.push(`via ${h(`${y} ${De(s)}`)}`)}l&&d.push(Ba(l)),a&&d.push(`${ue(a)} tok`),c&&d.push(ve(c)),r||d.push("esc to interrupt \xB7 ctrl+b background");let u=d.length>0?` (${d.join(" \xB7 ")})`:"",m=r?"\u25CC":"\u25E6",f=De(o),g=r?p.warning("stopping\u2026"):(()=>{let h=n?.trim()?n:i;return h?De(h):""})();return g?[$g(p.dim(` ${m} ${f}`),t),$g(p.dim(` ${g}${u}`),t)]:[$g(p.dim(` ${m} ${f}${u}`),t)]}function nT(e,t){let n=e.status==="succeeded"?"\u2713":e.status==="failed"?"\u2717":"\u2298",r=De(e.agentType??e.subagentId),o=[n,r];return e.durationMs!==void 0&&o.push(`\xB7 ${ve(e.durationMs)}`),$g(p.dim(` ${o.join(" ")}`),t)}function fF(e,t){e.suppressSubagentCompletion||e.fn(nT(t))}Ge();gd();hd();rr();Pn();Sa();Mi();G();q();import{randomUUID as Iee}from"node:crypto";import{createHash as Eee}from"crypto";import{appendFileSync as xee}from"fs";import{mkdir as Ree,open as Aee,writeFile as Cee}from"fs/promises";import{join as _F}from"path";import{z as E}from"zod";var gF=["policy-refusal","timeout","permission-denied","hook-block","abort","elicitation-declined","denial-breaker"];var tee=E.object({phase:E.literal("started"),toolUseId:E.string(),name:E.string(),inputBytes:E.number().int().nonnegative(),subagentId:E.string().optional()}),hF=E.enum(gF),nee=E.object({phase:E.literal("completed"),toolUseId:E.string(),name:E.string(),resultBytes:E.number().int().nonnegative(),isError:E.boolean(),truncated:E.boolean(),durationMs:E.number().nonnegative(),incomplete:E.boolean().optional(),incompleteReason:E.string().optional(),circuitBreaker:E.boolean().optional(),failureClass:hF.optional(),batchIndex:E.number().int().positive().optional(),batchSize:E.number().int().positive().optional(),subagentId:E.string().optional()}),yF=E.discriminatedUnion("phase",[tee,nee]),ree=E.enum(["PreToolUse","PostToolUse","PostToolUseFailure","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),bF=E.object({hookEvent:ree,decision:E.union([E.literal("block"),E.literal("approve")]).optional(),reason:E.string().optional(),blockedTool:E.string().optional(),subagentId:E.string().optional(),injectedContextBytes:E.number().int().nonnegative().optional(),durationMs:E.number().nonnegative().optional(),approvalOutcome:E.enum(["approved","denied","unrecognised","timeout","decline","cancel","hard-block"]).optional()}),oee=E.object({transition:E.literal("started"),subagentId:E.string(),parentId:E.string(),model:E.string(),allowedTools:E.array(E.string()).readonly().optional(),systemPromptHash:E.string().optional(),promptHead:E.string().optional(),agentType:E.string().optional(),resolvedAgentType:E.string().optional()}),iee=E.object({transition:E.literal("succeeded"),subagentId:E.string(),durationMs:E.number().nonnegative(),turnCount:E.number().int().nonnegative(),totalCostUsd:E.number().nonnegative().optional(),outputBytes:E.number().int().nonnegative(),stopReason:E.string().optional()}),see=E.object({transition:E.literal("failed"),subagentId:E.string(),errorClass:E.string(),errorMessage:E.string(),partialOutputBytes:E.number().int().nonnegative(),failureClass:hF.optional()}),aee=E.object({transition:E.literal("cancelled"),subagentId:E.string(),source:E.enum(["cascade","explicit"]),timeout:E.boolean().optional()}),wF=E.discriminatedUnion("transition",[oee,iee,see,aee]),lee=E.object({transition:E.literal("started"),jobId:E.string(),subagentId:E.string(),label:E.string(),model:E.string()}),cee=E.object({transition:E.literal("completed"),jobId:E.string(),subagentId:E.string(),durationMs:E.number().nonnegative(),outputBytes:E.number().int().nonnegative()}),dee=E.object({transition:E.literal("failed"),jobId:E.string(),subagentId:E.string(),durationMs:E.number().nonnegative(),errorClass:E.string(),errorMessage:E.string()}),uee=E.object({transition:E.literal("cancelled"),jobId:E.string(),subagentId:E.string(),source:E.enum(["explicit","cascade"])}),pee=E.object({transition:E.literal("joined"),jobId:E.string(),subagentId:E.string(),jobStatus:E.enum(["completed","failed","cancelled"])}),mee=E.object({transition:E.literal("delivered"),jobId:E.string(),subagentId:E.string(),jobStatus:E.enum(["completed","failed","cancelled"])}),SF=E.discriminatedUnion("transition",[lee,cee,dee,uee,pee,mee]),vF=E.object({kind:E.literal("monetary"),runningCostUsd:E.number().nonnegative(),maxBudgetUsd:E.number().nonnegative(),lastTurnCostUsd:E.number().nonnegative()}),fee=E.enum(["user_signal","cascade","timeout","budget","hook_block"]),kF=E.object({origin:fee,cascadedTo:E.array(E.string()).readonly(),reason:E.string().optional()}),TF=E.enum(["manual","token_threshold","turn_count"]),gee=E.object({path:E.string(),sizeBytes:E.number().int().nonnegative(),sha256:E.string().regex(/^[0-9a-f]{64}$/)}),hee=E.object({trigger:TF,preCompactionMessages:E.array(E.unknown()),summary:E.string(),keptTailCount:E.number().int().nonnegative(),keepLastNConfig:E.number().int().nonnegative(),messagesBefore:E.number().int().nonnegative(),messagesAfter:E.number().int().nonnegative(),tokensSavedEstimate:E.number().nonnegative().optional(),summarizationTokens:E.object({input:E.number().int().nonnegative(),output:E.number().int().nonnegative()}).optional()}),yee=E.object({trigger:TF,preCompactionMessagesRef:gee,summary:E.string(),keptTailCount:E.number().int().nonnegative(),keepLastNConfig:E.number().int().nonnegative(),messagesBefore:E.number().int().nonnegative(),messagesAfter:E.number().int().nonnegative(),tokensSavedEstimate:E.number().nonnegative().optional(),summarizationTokens:E.object({input:E.number().int().nonnegative(),output:E.number().int().nonnegative()}).optional()}),bee=E.enum(["model_end_turn","truncated","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),EF=E.object({reason:bee,finalTurnCount:E.number().int().nonnegative(),finalCostUsd:E.number().nonnegative(),finalTokens:E.object({input:E.number().int().nonnegative().optional(),output:E.number().int().nonnegative().optional(),cacheRead:E.number().int().nonnegative().optional(),cacheCreation:E.number().int().nonnegative().optional()}),lastStopReason:E.string().optional(),guidance:E.string().optional()}),xF=E.object({source:E.string(),assertion:E.string(),evidence:E.array(E.string()).readonly(),confidence:E.number().min(0).max(1),dissent:E.string().optional()}),wee=E.enum(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),See=E.enum(["click","fill","press","select","hover","scroll_to","wait_for"]),vee=E.object({kind:E.enum(["semantic","element_id","selector"]),text:E.string().max(80).optional(),role:E.string().optional(),elementId:E.string().optional(),selectorHash:E.string().regex(/^[0-9a-f]{8}$/).optional()}),RF=E.object({tool:wee,action:See.optional(),toolUseId:E.string(),target:vee.optional(),urlBefore:E.string().nullable(),urlAfter:E.string().nullable(),status:E.enum(["ok","error","ambiguous_target","blocked_by_policy"]),screenshotPath:E.string().optional(),observationSummary:E.string().max(500).optional(),error:E.object({reason:E.string(),recoverable:E.boolean()}).optional(),durationMs:E.number().nonnegative()}),kee=E.enum(["bootstrap_start","bootstrap_done","session_init_start","session_init_done","mcp_connect_start","mcp_connect_done","mcp_server_start","mcp_server_done","loop_start","loop_end","model_ttfb","interrupt_halt","rate_limit","usage_limit_pause","usage_limit_resume","idle_watchdog_fired","suspected_loop","compaction_disabled"]),AF=E.object({phase:kee,durationMs:E.number().nonnegative().optional(),metadata:E.record(E.string(),E.union([E.string(),E.number(),E.boolean()])).optional(),model:E.string().optional(),resolvedModel:E.string().optional(),origin:E.enum(["cli","telegram","daemon","unknown"]).optional(),actor:E.enum(["main","subagent"]).optional()}),Tee=E.object({status:E.enum(["succeeded","failed","cancelled"]),finalCostUsd:E.number().nonnegative(),finalTurnCount:E.number().int().nonnegative(),closedAt:E.string().datetime(),incomplete:E.boolean().optional(),subagentCount:E.number().int().nonnegative().optional(),subagentTokens:E.object({input:E.number().int().nonnegative().optional(),output:E.number().int().nonnegative().optional(),cacheRead:E.number().int().nonnegative().optional(),cacheCreation:E.number().int().nonnegative().optional()}).optional(),subagentCostUsd:E.number().nonnegative().optional()}),CF=E.discriminatedUnion("kind",[E.object({kind:E.literal("tool_call"),payload:yF}),E.object({kind:E.literal("hook_decision"),payload:bF}),E.object({kind:E.literal("subagent_lifecycle"),payload:wF}),E.object({kind:E.literal("background_agent"),payload:SF}),E.object({kind:E.literal("budget"),payload:vF}),E.object({kind:E.literal("abort"),payload:kF}),E.object({kind:E.literal("compaction"),payload:hee}),E.object({kind:E.literal("closure"),payload:EF}),E.object({kind:E.literal("claim"),payload:xF}),E.object({kind:E.literal("browser_event"),payload:RF}),E.object({kind:E.literal("session_phase"),payload:AF})]),Fg=E.discriminatedUnion("kind",[E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("tool_call"),payload:yF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("hook_decision"),payload:bF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("subagent_lifecycle"),payload:wF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("background_agent"),payload:SF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("budget"),payload:vF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("abort"),payload:kF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("compaction"),payload:yee}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("closure"),payload:EF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("claim"),payload:xF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("browser_event"),payload:RF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("session_phase"),payload:AF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("session_sealed"),payload:Tee})]);var Lg=new Set,IF=!1;function _ee(){IF||(IF=!0,process.on("exit",()=>{for(let e of Lg)e.sealOnProcessExit()}))}var Ng=class{traceDir;tracePath;seq=0;sealed=!1;sealRecordPersisted=!1;fh=null;writeQueue=Promise.resolve();constructor(t){this.traceDir=t.traceDir,this.tracePath=_F(this.traceDir,"trace.jsonl")}getTracePath(){return this.tracePath}async write(t){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return CF.parse(t),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(t);await this.appendLine(n)})}async seal(t){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{if(await this.ensureOpen(),this.sealRecordPersisted)return;let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:t};await this.appendLine(n),this.sealRecordPersisted=!0,this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(t){let n=this.writeQueue.then(t,t);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await Ree(this.traceDir,{recursive:!0}),this.fh=await Aee(this.tracePath,"a"),Lg.add(this),_ee())}async closeHandle(){if(Lg.delete(this),!this.fh)return;let t=this.fh;this.fh=null,await t.close()}sealOnProcessExit(){if(this.sealRecordPersisted||this.seq===0)return;this.sealed=!0,Lg.delete(this);try{let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:{status:"failed",finalCostUsd:0,finalTurnCount:0,closedAt:new Date().toISOString(),incomplete:!0}};xee(this.tracePath,`${JSON.stringify(n)}
1459
+ `))o.push(n+t+a)}return o}function Zk(e,t,n,r){if(t.syntheticAgentToolUseId)return;let o=t.agentType?.trim()||"agent",i=Q(),s=Math.max(20,i-14);if(r!==void 0&&n.toolLane.mergeAgentLabel(r,o,s)){t.syntheticAgentToolUseId=r;return}let a=`__synth_agent_${e}`;n.toolLane.addStartWithAgentContext(a,"Agent",`(${o})`,r,s),t.syntheticAgentToolUseId=a}import Ur from"chalk";ad();function ZZ(e){switch(e){case"read":return Ur.hex("#C9B584");case"write":return Ur.hex("#E8A33D");case"shell":return Ur.hex("#A8E060");case"subagent":return p.plan;case"skill":return Ur.hex("#F08AC4");case"dag":return Ur.hex("#4EC9B0");case"mcp":return Ur.hex("#49C2E0");case"web":return Ur.hex("#A0C4C0");case"browser":return Ur.hex("#FF8A65");case"planning":return p.meta;case"schedule":return Ur.hex("#D4A84B");case"other":return p.meta}}var eee={read:"\u25CF",write:"\u270E",shell:"$",subagent:"\u2192",skill:"\u25C6",dag:"\u2B21",mcp:"\u22A1",web:"\u2316",browser:"\u25C9",planning:"\u25B1",schedule:"\u23F2",other:"\u25CF"};function eT(e){return{color:ZZ(e),glyph:eee[e]}}function za(e){return eT(or(e))}var pF=/[\x00-\x1F\x7F-\x9F]/g;function De(e){return Ie(e).replace(pF," ").replace(/ {2,}/g," ").trim()}function tT(e){return Ie(e).replace(pF," ")}function $g(e,t){let n=t??process.stdout.columns??80;return!Number.isFinite(n)||n<=0?e:ae(e,n)}function Dg(e,t){if(!e)return;let n=t??Q();return Cd(e,Math.max(20,n-10))||void 0}function mF(e){return e===void 0||!Number.isFinite(e)||e<=0?"rate-limited \xB7 retrying\u2026":`rate-limited \xB7 retrying in ~${Math.max(1,Math.ceil(e/1e3))}s`}function _d(e,t,n,r){let{description:o,summary:i,lastToolName:s,totalTokens:a,toolUses:l,durationMs:c}=e,d=[];if(s){let{color:h,glyph:y}=za(s);d.push(`via ${h(`${y} ${De(s)}`)}`)}l&&d.push(Ba(l)),a&&d.push(`${ue(a)} tok`),c&&d.push(ve(c)),r||d.push("esc to interrupt \xB7 ctrl+b background");let u=d.length>0?` (${d.join(" \xB7 ")})`:"",m=r?"\u25CC":"\u25E6",f=De(o),g=r?p.warning("stopping\u2026"):(()=>{let h=n?.trim()?n:i;return h?De(h):""})();return g?[$g(p.dim(` ${m} ${f}`),t),$g(p.dim(` ${g}${u}`),t)]:[$g(p.dim(` ${m} ${f}${u}`),t)]}function nT(e,t){let n=e.status==="succeeded"?"\u2713":e.status==="failed"?"\u2717":"\u2298",r=De(e.agentType??e.subagentId),o=[n,r];return e.durationMs!==void 0&&o.push(`\xB7 ${ve(e.durationMs)}`),$g(p.dim(` ${o.join(" ")}`),t)}function fF(e,t){e.suppressSubagentCompletion||e.fn(nT(t))}Ge();gd();hd();rr();Pn();Sa();Mi();G();q();import{randomUUID as Iee}from"node:crypto";import{createHash as Eee}from"crypto";import{appendFileSync as xee}from"fs";import{mkdir as Ree,open as Aee,writeFile as Cee}from"fs/promises";import{join as _F}from"path";import{z as E}from"zod";var gF=["policy-refusal","timeout","permission-denied","hook-block","abort","elicitation-declined","denial-breaker"];var tee=E.object({phase:E.literal("started"),toolUseId:E.string(),name:E.string(),inputBytes:E.number().int().nonnegative(),subagentId:E.string().optional()}),hF=E.enum(gF),nee=E.object({phase:E.literal("completed"),toolUseId:E.string(),name:E.string(),resultBytes:E.number().int().nonnegative(),isError:E.boolean(),truncated:E.boolean(),durationMs:E.number().nonnegative(),incomplete:E.boolean().optional(),incompleteReason:E.string().optional(),circuitBreaker:E.boolean().optional(),failureClass:hF.optional(),batchIndex:E.number().int().positive().optional(),batchSize:E.number().int().positive().optional(),subagentId:E.string().optional()}),yF=E.discriminatedUnion("phase",[tee,nee]),ree=E.enum(["PreToolUse","PostToolUse","PostToolUseFailure","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),bF=E.object({hookEvent:ree,decision:E.union([E.literal("block"),E.literal("approve")]).optional(),reason:E.string().optional(),blockedTool:E.string().optional(),subagentId:E.string().optional(),injectedContextBytes:E.number().int().nonnegative().optional(),durationMs:E.number().nonnegative().optional(),approvalOutcome:E.enum(["approved","denied","unrecognised","timeout","decline","cancel","hard-block"]).optional()}),oee=E.object({transition:E.literal("started"),subagentId:E.string(),parentId:E.string(),model:E.string(),allowedTools:E.array(E.string()).readonly().optional(),systemPromptHash:E.string().optional(),promptHead:E.string().optional(),agentType:E.string().optional(),resolvedAgentType:E.string().optional()}),iee=E.object({transition:E.literal("succeeded"),subagentId:E.string(),durationMs:E.number().nonnegative(),turnCount:E.number().int().nonnegative(),totalCostUsd:E.number().nonnegative().optional(),outputBytes:E.number().int().nonnegative(),stopReason:E.string().optional()}),see=E.object({transition:E.literal("failed"),subagentId:E.string(),errorClass:E.string(),errorMessage:E.string(),partialOutputBytes:E.number().int().nonnegative(),failureClass:hF.optional()}),aee=E.object({transition:E.literal("cancelled"),subagentId:E.string(),source:E.enum(["cascade","explicit"]),timeout:E.boolean().optional()}),wF=E.discriminatedUnion("transition",[oee,iee,see,aee]),lee=E.object({transition:E.literal("started"),jobId:E.string(),subagentId:E.string(),label:E.string(),model:E.string()}),cee=E.object({transition:E.literal("completed"),jobId:E.string(),subagentId:E.string(),durationMs:E.number().nonnegative(),outputBytes:E.number().int().nonnegative()}),dee=E.object({transition:E.literal("failed"),jobId:E.string(),subagentId:E.string(),durationMs:E.number().nonnegative(),errorClass:E.string(),errorMessage:E.string()}),uee=E.object({transition:E.literal("cancelled"),jobId:E.string(),subagentId:E.string(),source:E.enum(["explicit","cascade"])}),pee=E.object({transition:E.literal("joined"),jobId:E.string(),subagentId:E.string(),jobStatus:E.enum(["completed","failed","cancelled"])}),mee=E.object({transition:E.literal("delivered"),jobId:E.string(),subagentId:E.string(),jobStatus:E.enum(["completed","failed","cancelled"])}),SF=E.discriminatedUnion("transition",[lee,cee,dee,uee,pee,mee]),vF=E.object({kind:E.literal("monetary"),runningCostUsd:E.number().nonnegative(),maxBudgetUsd:E.number().nonnegative(),lastTurnCostUsd:E.number().nonnegative()}),fee=E.enum(["user_signal","cascade","timeout","budget","hook_block"]),kF=E.object({origin:fee,cascadedTo:E.array(E.string()).readonly(),reason:E.string().optional()}),TF=E.enum(["manual","token_threshold","turn_count"]),gee=E.object({path:E.string(),sizeBytes:E.number().int().nonnegative(),sha256:E.string().regex(/^[0-9a-f]{64}$/)}),hee=E.object({trigger:TF,preCompactionMessages:E.array(E.unknown()),summary:E.string(),keptTailCount:E.number().int().nonnegative(),keepLastNConfig:E.number().int().nonnegative(),messagesBefore:E.number().int().nonnegative(),messagesAfter:E.number().int().nonnegative(),tokensSavedEstimate:E.number().nonnegative().optional(),summarizationTokens:E.object({input:E.number().int().nonnegative(),output:E.number().int().nonnegative()}).optional()}),yee=E.object({trigger:TF,preCompactionMessagesRef:gee,summary:E.string(),keptTailCount:E.number().int().nonnegative(),keepLastNConfig:E.number().int().nonnegative(),messagesBefore:E.number().int().nonnegative(),messagesAfter:E.number().int().nonnegative(),tokensSavedEstimate:E.number().nonnegative().optional(),summarizationTokens:E.object({input:E.number().int().nonnegative(),output:E.number().int().nonnegative()}).optional()}),bee=E.enum(["model_end_turn","truncated","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),EF=E.object({reason:bee,finalTurnCount:E.number().int().nonnegative(),finalCostUsd:E.number().nonnegative(),finalTokens:E.object({input:E.number().int().nonnegative().optional(),output:E.number().int().nonnegative().optional(),cacheRead:E.number().int().nonnegative().optional(),cacheCreation:E.number().int().nonnegative().optional()}),lastStopReason:E.string().optional(),guidance:E.string().optional()}),xF=E.object({source:E.string(),assertion:E.string(),evidence:E.array(E.string()).readonly(),confidence:E.number().min(0).max(1),dissent:E.string().optional()}),wee=E.enum(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),See=E.enum(["click","fill","press","select","hover","scroll_to","wait_for"]),vee=E.object({kind:E.enum(["semantic","element_id","selector"]),text:E.string().max(80).optional(),role:E.string().optional(),elementId:E.string().optional(),selectorHash:E.string().regex(/^[0-9a-f]{8}$/).optional()}),RF=E.object({tool:wee,action:See.optional(),toolUseId:E.string(),target:vee.optional(),urlBefore:E.string().nullable(),urlAfter:E.string().nullable(),status:E.enum(["ok","error","ambiguous_target","blocked_by_policy"]),screenshotPath:E.string().optional(),observationSummary:E.string().max(500).optional(),error:E.object({reason:E.string(),recoverable:E.boolean()}).optional(),durationMs:E.number().nonnegative()}),kee=E.enum(["bootstrap_start","bootstrap_done","session_init_start","session_init_done","mcp_connect_start","mcp_connect_done","mcp_server_start","mcp_server_done","loop_start","loop_end","model_ttfb","interrupt_halt","rate_limit","usage_limit_pause","usage_limit_resume","idle_watchdog_fired","suspected_loop","compaction_disabled"]),AF=E.object({phase:kee,durationMs:E.number().nonnegative().optional(),metadata:E.record(E.string(),E.union([E.string(),E.number(),E.boolean()])).optional(),model:E.string().optional(),resolvedModel:E.string().optional(),origin:E.enum(["cli","telegram","daemon","unknown"]).optional(),actor:E.enum(["main","subagent"]).optional()}),Tee=E.object({status:E.enum(["succeeded","failed","cancelled"]),finalCostUsd:E.number().nonnegative(),finalTurnCount:E.number().int().nonnegative(),closedAt:E.string().datetime(),incomplete:E.boolean().optional(),subagentCount:E.number().int().nonnegative().optional(),subagentTokens:E.object({input:E.number().int().nonnegative().optional(),output:E.number().int().nonnegative().optional(),cacheRead:E.number().int().nonnegative().optional(),cacheCreation:E.number().int().nonnegative().optional()}).optional(),subagentCostUsd:E.number().nonnegative().optional()}),CF=E.discriminatedUnion("kind",[E.object({kind:E.literal("tool_call"),payload:yF}),E.object({kind:E.literal("hook_decision"),payload:bF}),E.object({kind:E.literal("subagent_lifecycle"),payload:wF}),E.object({kind:E.literal("background_agent"),payload:SF}),E.object({kind:E.literal("budget"),payload:vF}),E.object({kind:E.literal("abort"),payload:kF}),E.object({kind:E.literal("compaction"),payload:hee}),E.object({kind:E.literal("closure"),payload:EF}),E.object({kind:E.literal("claim"),payload:xF}),E.object({kind:E.literal("browser_event"),payload:RF}),E.object({kind:E.literal("session_phase"),payload:AF})]),Fg=E.discriminatedUnion("kind",[E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("tool_call"),payload:yF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("hook_decision"),payload:bF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("subagent_lifecycle"),payload:wF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("background_agent"),payload:SF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("budget"),payload:vF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("abort"),payload:kF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("compaction"),payload:yee}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("closure"),payload:EF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("claim"),payload:xF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("browser_event"),payload:RF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("session_phase"),payload:AF}),E.object({ts:E.string().datetime(),seq:E.number().int().nonnegative(),kind:E.literal("session_sealed"),payload:Tee})]);var Lg=new Set,IF=!1;function _ee(){IF||(IF=!0,process.on("exit",()=>{for(let e of Lg)e.sealOnProcessExit()}))}var Ng=class{traceDir;tracePath;seq=0;sealed=!1;sealRecordPersisted=!1;fh=null;writeQueue=Promise.resolve();constructor(t){this.traceDir=t.traceDir,this.tracePath=_F(this.traceDir,"trace.jsonl")}getTracePath(){return this.tracePath}async write(t){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return CF.parse(t),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(t);await this.appendLine(n)})}async seal(t){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{if(await this.ensureOpen(),this.sealRecordPersisted)return;let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:t};await this.appendLine(n),this.sealRecordPersisted=!0,this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(t){let n=this.writeQueue.then(t,t);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await Ree(this.traceDir,{recursive:!0}),this.fh=await Aee(this.tracePath,"a"),Lg.add(this),_ee())}async closeHandle(){if(Lg.delete(this),!this.fh)return;let t=this.fh;this.fh=null,await t.close()}sealOnProcessExit(){if(this.sealRecordPersisted||this.seq===0)return;this.sealed=!0,Lg.delete(this);try{let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:{status:"failed",finalCostUsd:0,finalTurnCount:0,closedAt:new Date().toISOString(),incomplete:!0}};xee(this.tracePath,`${JSON.stringify(n)}
1460
1460
  `),this.sealRecordPersisted=!0}catch{}let t=this.fh;this.fh=null,t&&t.close().catch(()=>{})}async appendLine(t){if(!this.fh)throw new Error("NdjsonTraceWriter: file handle missing");await this.fh.appendFile(`${JSON.stringify(t)}
1461
1461
  `)}async materializePersistedEvent(t){let n=new Date().toISOString(),r=this.seq++;if(t.kind==="compaction"){let o=await this.persistCompactionSidecar(t.payload,r,n);return{ts:n,seq:r,kind:"compaction",payload:o}}return{ts:n,seq:r,kind:t.kind,payload:t.payload}}async persistCompactionSidecar(t,n,r){let o=r.replace(/[:.]/g,"-"),i=_F(this.traceDir,`${String(n).padStart(6,"0")}-${o}-pre-compaction.json`),s=JSON.stringify(t.preCompactionMessages),a=Buffer.byteLength(s,"utf8"),l=Eee("sha256").update(s).digest("hex");await Cee(i,s,{encoding:"utf8",flag:"w"});let c={path:i,sizeBytes:a,sha256:l};return{trigger:t.trigger,preCompactionMessagesRef:c,summary:t.summary,keptTailCount:t.keptTailCount,keepLastNConfig:t.keepLastNConfig,messagesBefore:t.messagesBefore,messagesAfter:t.messagesAfter,...t.tokensSavedEstimate!==void 0?{tokensSavedEstimate:t.tokensSavedEstimate}:{},...t.summarizationTokens!==void 0?{summarizationTokens:t.summarizationTokens}:{}}}};function Po(e={}){if(v.AFK_TRACE_DISABLED==="1")return null;let t=e.sessionLabel??Iee(),n=Xo(t),r=new Ng({traceDir:n});return{writer:r,tracePath:r.getTracePath(),sessionLabel:t}}fc();q();import{readFileSync as Mee,writeFileSync as OF,existsSync as Pd,mkdirSync as $F,readdirSync as Oee,statSync as $ee,realpathSync as PF}from"fs";import{join as DF,basename as FF,resolve as MF,sep as Dee}from"path";import{randomUUID as Fee}from"node:crypto";import{randomUUID as Pee}from"node:crypto";var Id=class extends Error{constructor(t){super(t),this.name="SessionRegistryError"}},rT=class{byId=new Map;byBinding=new Map;bySdk=new Map;now;constructor(t){this.now=t?.now??Date.now}create(t){let n=this.now(),r=t.id??Pee();if(this.byId.has(r))throw new Id(`session handle already exists: ${r}`);let o={surface:t.surface,key:t.key,boundAt:n,lastActiveAt:n},i={id:r,surface:t.surface,model:t.model,createdAt:t.createdAt??n,lastActiveAt:n,status:"active",bindings:[o]};return t.name!==void 0&&(i.name=t.name),t.cwd!==void 0&&(i.cwd=t.cwd),t.sdkSessionId!==void 0&&(i.sdkSessionId=t.sdkSessionId),this.byId.set(r,i),this.pointBinding(this.bindingKey(o.surface,o.key),r),i.sdkSessionId!==void 0&&this.bySdk.set(i.sdkSessionId,r),this.clone(i)}load(t){if(this.byId.has(t.id))throw new Id(`session handle already exists: ${t.id}`);let n=this.clone(t);if(this.byId.set(n.id,n),n.status==="active")for(let r of n.bindings)this.pointBinding(this.bindingKey(r.surface,r.key),n.id);n.sdkSessionId!==void 0&&this.bySdk.set(n.sdkSessionId,n.id)}get(t){let n=this.byId.get(t);return n?this.clone(n):void 0}getBySdkSessionId(t){let n=this.bySdk.get(t);if(n===void 0)return;let r=this.byId.get(n);return r?this.clone(r):void 0}resolve(t,n){let r=this.byBinding.get(this.bindingKey(t,n));if(r===void 0)return;let o=this.byId.get(r);if(!(!o||o.status!=="active"))return this.clone(o)}bind(t,n){let r=this.require(t),o=this.now(),i=this.bindingKey(n.surface,n.key),s=r.bindings.find(a=>this.bindingKey(a.surface,a.key)===i);s?s.lastActiveAt=o:r.bindings.push({surface:n.surface,key:n.key,boundAt:o,lastActiveAt:o}),this.pointBinding(i,t),r.lastActiveAt=o}unbind(t,n){let r=this.bindingKey(t,n),o=this.byBinding.get(r);if(this.byBinding.delete(r),o===void 0)return;let i=this.byId.get(o);i&&(i.bindings=i.bindings.filter(s=>this.bindingKey(s.surface,s.key)!==r))}attachSdkSessionId(t,n){let r=this.require(t);r.sdkSessionId!==void 0&&r.sdkSessionId!==n&&this.bySdk.get(r.sdkSessionId)===t&&this.bySdk.delete(r.sdkSessionId),r.sdkSessionId=n,this.bySdk.set(n,t),r.lastActiveAt=this.now()}rename(t,n){let r=this.require(t);r.name=n,r.lastActiveAt=this.now()}touch(t){let n=this.require(t);n.lastActiveAt=this.now()}archive(t){let n=this.require(t);n.status="archived",n.lastActiveAt=this.now();for(let r of n.bindings){let o=this.bindingKey(r.surface,r.key);this.byBinding.get(o)===t&&this.byBinding.delete(o)}}list(t){let n=[];for(let r of this.byId.values())t?.surface!==void 0&&r.surface!==t.surface||t?.status!==void 0&&r.status!==t.status||n.push(this.clone(r));return n.sort((r,o)=>o.lastActiveAt-r.lastActiveAt),n}bindingKey(t,n){return`${t}\0${n}`}require(t){let n=this.byId.get(t);if(!n)throw new Id(`unknown session handle: ${t}`);return n}pointBinding(t,n){let r=this.byBinding.get(t);if(r!==void 0&&r!==n){let o=this.byId.get(r);o&&(o.bindings=o.bindings.filter(i=>this.bindingKey(i.surface,i.key)!==t))}this.byBinding.set(t,n)}clone(t){return{...t,bindings:t.bindings.map(n=>({...n}))}}};var _1e=new rT;function Ya(){return MR(),lt()}function Lee(e){return DF(Ya(),`${e}.json`)}function Bg(e,{write:t=!1}={}){let n=e.includes("/")?e:Lee(e),r,o;if(!t&&Pd(n)?(r=PF(n),o=PF(Ya())):(r=MF(n),o=MF(Ya())),!r.startsWith(o+Dee)&&r!==o)throw new Error(`Session path escapes sessions directory: ${e}`);return r}function Mo(e,t){let n=Ya();Pd(n)||$F(n,{recursive:!0});let r=t??e.sessionId??`session-${Date.now()}`,o={sessionId:e.sessionId,...e.name?{name:e.name}:{},...e.source?{source:e.source}:{},...e.actor?{actor:e.actor}:{},...e.telegramChatId!==void 0?{telegramChatId:e.telegramChatId}:{},...e.cwd?{cwd:e.cwd}:{},model:e.model,startedAt:e.sessionStartTime,savedAt:Date.now(),totalTurns:e.totalTurns,totalCostUsd:e.totalCostUsd,totalTokens:e.totalTokens,totalDurationMs:e.totalDurationMs,turns:e.turns},i=Bg(r,{write:!0});return OF(i,JSON.stringify(o,null,2)),i}function LF(e,t={}){let n=Ya();Pd(n)||$F(n,{recursive:!0});let r=t.newId??Fee(),o={sessionId:r,model:e.model,startedAt:e.sessionStartTime,savedAt:Date.now(),totalTurns:e.totalTurns,totalCostUsd:e.totalCostUsd,totalTokens:e.totalTokens,totalDurationMs:e.totalDurationMs,turns:[...e.turns],...e.cwd?{cwd:e.cwd}:{},...e.sessionId?{forkedFrom:e.sessionId}:{},forkedAt:Date.now()},i=Bg(r,{write:!0});return OF(i,JSON.stringify(o,null,2)),{id:r,path:i}}function Ja(e){let t;try{t=Bg(e)}catch(n){console.warn(`loadSession: rejected unsafe session id ${JSON.stringify(e)}: ${n.message}`);return}if(Pd(t))try{let n=Mee(t,"utf-8");return JSON.parse(n)}catch(n){console.warn(`loadSession: failed to read/parse ${t}: ${n.message}`);return}}function $i(e){let t;try{t=Bg(e)}catch{return}let n=Ja(t);if(n)return{path:t,id:FF(t,".json"),data:n};let r=Md();for(let i of r){if(i.id!==e&&i.sessionId!==e&&i.name!==e)continue;let s=Ja(i.path);if(s)return{path:i.path,id:i.id,data:s}}if(e.length>=3){let i=r.filter(s=>s.name!==void 0&&s.name.startsWith(e));if(i.length===1){let s=i[0];if(s){let a=Ja(s.path);if(a)return{path:s.path,id:s.id,data:a}}}}}function Md(){let e=Ya();if(!Pd(e))return[];let t=[];for(let n of Oee(e)){if(!n.endsWith(".json"))continue;let r=DF(e,n);try{if(!$ee(r).isFile())continue;let i=Ja(r);if(!i||typeof i.savedAt!="number"||typeof i.model!="string")continue;t.push({path:r,id:FF(n,".json"),sessionId:i.sessionId,name:i.name,source:i.source,actor:i.actor,telegramChatId:i.telegramChatId,model:i.model,startedAt:i.startedAt,savedAt:i.savedAt,totalTurns:i.totalTurns,totalCostUsd:i.totalCostUsd,cwd:i.cwd})}catch{}}return t.sort((n,r)=>r.savedAt-n.savedAt),t}function Va(e){if(e.resume&&e.continue)throw new Error("Use either --resume <id> or --continue, not both.");if(e.resume){let t=$i(e.resume);return t?{id:t.id,resumeId:t.data.sessionId??t.id,stored:t.data}:{id:e.resume,resumeId:e.resume}}if(e.continue){let t=Md()[0];if(!t)throw new Error("No saved sessions found for --continue. Run a session first \u2014 sessions autosave automatically.");let n=Ja(t.path);if(!n)throw new Error(`Could not load latest saved session: ${t.id}`);return{id:t.id,resumeId:n.sessionId??t.id,stored:n}}}function Xa(e){return e?{resume:e.resumeId,sessionId:e.resumeId,...e.stored?{resumeHistory:e.stored.turns.map(t=>({user:t.user,assistant:t.assistant}))}:{}}:{}}function Ug(e){let t=e.toLowerCase().replace(/[`*_~]/g," ").replace(/[^\w\s-]/g," ").replace(/[\s_]+/g," ").trim();return t?t.split(" ").filter(Boolean).slice(0,6).join("-").slice(0,48).replace(/-+$/g,""):""}function jg(e){return{totalTurns:0,totalCostUsd:0,totalTokens:0,totalDurationMs:0,sessionStartTime:Date.now(),turnCosts:[],turnTokens:[],turns:[],model:e,permissionMode:"default",thinkingUi:"live"}}function NF(e){e.totalTurns=0,e.totalCostUsd=0,e.totalTokens=0,e.totalDurationMs=0,e.sessionStartTime=Date.now(),e.turnCosts.length=0,e.turnTokens.length=0,e.turns.length=0,delete e.sessionId,delete e.name}function Di(e,t,n,r,o){let i=r?.totalCostUsd??0,s=r?.durationMs??0,a=Number(r?.usage?.input_tokens??0),l=Number(r?.usage?.output_tokens??0),c=a,d=l,u=Number(r?.usage?.cache_read_input_tokens??0)+Number(r?.usage?.cache_creation_input_tokens??0),m=r?.usage?.iterations;if(Array.isArray(m)&&m.length>0){let b=m[m.length-1];if(b&&typeof b=="object"){let w=b;c=Number(w.input_tokens??0),d=Number(w.output_tokens??0),u=Number(w.cache_read_input_tokens??0)+Number(w.cache_creation_input_tokens??0)}}e.totalTurns+=1,e.totalCostUsd+=i,e.totalDurationMs+=s,e.totalTokens+=a+l,e.turnCosts.push(i);let f=Number(r?.usage?.context_window_tokens??NaN),g=Array.isArray(m)&&m.length>0,h=Number.isFinite(f)?f:g?c+d+u:void 0;if(e.turnTokens.push({input:c,output:d,cache:u,...h!==void 0?{footprint:h}:{}}),r?.sessionId&&!e.sessionId&&(e.sessionId=String(r.sessionId)),!e.name){let b=Ug(t);b&&(e.name=b)}let y={user:t,assistant:n,timestamp:Date.now(),costUsd:i,durationMs:s,inputTokens:a,outputTokens:l,...o&&o.length>0?{toolEvents:o}:{}};return e.turns.push(y),y}import{execFile as Nee,spawn as Bee}from"node:child_process";import{promisify as Uee}from"node:util";var jee=Uee(Nee),BF=2e4,oT=class extends Error{kind;exitCode;stderr;constructor(t,n,r,o){super(t),this.name="GhError",this.kind=n,this.exitCode=r,this.stderr=o}},Hg=null,Od=null;function Hee(e,t,n){return n===!0?"timeout":t==="ENOENT"?"not-found":/already exists/i.test(e)?"already-exists":/authentication|please log in|HTTP 40[13]|bad credentials|token|scope/i.test(e)?"unauthed":/ETIMEDOUT|ECONNRESET|ECONNREFUSED/i.test(e+(t??""))?"network":"unknown"}function UF(e,t){return jee(e,t,{timeout:BF,killSignal:"SIGTERM"}).then(n=>({stdout:n.stdout,stderr:n.stderr}))}async function jF(e={}){let t=(e._now??(()=>Date.now()))(),n=e.ttlMs??6e4,r=e.execFn??UF,o=e.log??(()=>{});return Hg&&Hg.expiresAt>t?(o("[gh] checkGhReady cache hit"),Hg.result):(o("[gh] checkGhReady cache miss \u2014 probing"),Od||(Od=(async()=>{try{await r("gh",["--version"])}catch(a){let l=a;return l.killed?{ok:!1,hint:"`gh` timed out \u2014 check connectivity"}:l.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(a){let l=a;return l.killed||/ETIMEDOUT|ECONNRESET|ENOTFOUND/i.test(String(l.code??""))?{ok:!1,hint:"check network \u2014 cannot reach GitHub"}:{ok:!1,hint:"`gh` is not authenticated \u2014 run: gh auth login"}}let s={ok:!0};return n>0&&(Hg={result:s,expiresAt:t+n}),s})().finally(()=>{Od=null}),Od))}function Wee(e,t,n){return new Promise((r,o)=>{let i=Bee(e,t,{stdio:["pipe","pipe","pipe"]}),s="",a="",l=!1,c=setTimeout(()=>{l=!0,i.kill("SIGTERM")},BF);i.stdout?.on("data",d=>{s+=d.toString()}),i.stderr?.on("data",d=>{a+=d.toString()}),i.on("error",d=>{clearTimeout(c),o(Object.assign(new Error(d.message),{...d.code!==void 0?{code:d.code}:{},stderr:a}))}),i.on("close",d=>{if(clearTimeout(c),l){o(Object.assign(new Error(`${e} timed out`),{killed:!0,stderr:a}));return}if(d===0){r({stdout:s,stderr:a});return}o(Object.assign(new Error(`${e} exited ${d??"null"}`),{exitCode:d??1,stderr:a}))}),i.stdin?.on("error",()=>{}),i.stdin?.end(n)})}async function HF(e,t){let n=t??Wee,r=["pr","comment"],o=e.pr.trim();o&&r.push(o),r.push("--body-file","-");try{let{stdout:i}=await n("gh",r,e.body);return i.trim()}catch(i){let s=i,a=s.stderr??"",l=Hee(a,s.code,s.killed);throw new oT(`gh pr comment failed (${l}): ${a.trim()}`,l,s.exitCode??1,a)}}async function Wg(e){let t=e??UF;try{let{stdout:n}=await t("gh",["pr","view","--json","number","--jq",".number"]),r=n.trim();return/^\d+$/.test(r)?r:null}catch{return null}}Tr();var Kee=4096,Gee="<!-- agent-afk-review -->",qee=new Set(["github","telegram"]),WF=/--post(?:=|\s+)([^\s]+)/g;function KF(e){if(!/--post\b/.test(e))return{targets:[],cleanedArgs:e,unknown:[]};let t=[],n=[];for(let o of e.matchAll(WF))GF(o[1]??"",t,n);let r=e.replace(WF," ").replace(/(^|\s)--post(?=\s|$)/g," ").replace(/\s+/g," ").trim();return{targets:t,cleanedArgs:r,unknown:n}}function GF(e,t,n){for(let r of e.split(",").map(o=>o.trim()).filter(Boolean))if(qee.has(r)){let o=r;t.includes(o)||t.push(o)}else n.push(r)}function qF(e){let t=[],n=[];return GF(e,t,n),{targets:t,unknown:n}}function zee(e,t){if(t<=0||e.length<=t)return[e];let n=[],r="";for(let o of e.split(`
1462
1462
  `)){if(o.length>t){r&&(n.push(r),r="");for(let i=0;i<o.length;i+=t)n.push(o.slice(i,i+t));continue}r.length+o.length+1>t?(r&&n.push(r),r=o):r=r?`${r}
@@ -1483,7 +1483,7 @@ ${o.join(`
1483
1483
  `),process.exitCode=1;return}if(o.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
1484
1484
  `),process.exitCode=1;return}let s=Rte("Initializing agent...").start(),a=null,l,c,d,u,m=!1,f,g=jg(n.model),h=!1,y;try{if(n.worktree!==void 0)try{c=await Cp(n.worktree,n.worktreeBase!==void 0?{baseRef:n.worktreeBase}:void 0),d=c.path,s.text=`Worktree ready at ${c.path} (branch: ${c.branch})`}catch(ce){s.fail("Failed to create worktree"),Y(ce)}let b,w,S,T,k,A,F;try{b=_o(n.thinking)??ja(),w=Io(n.effort)??Ha(),S=Wa(n.maxBudgetUsd)??Xk(),T=Wa(n.taskBudget)??Qk(),k=Ka(n.maxOutputTokens)??Ad(),A=Ga(),F=void 0}catch(ce){s.fail("Invalid options"),Y(ce)}if(n.dumpPrompt!==void 0){let ce=n.dumpPrompt===!0?yL.join(hL.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=ce,n.provider!==void 0&&n.provider!=="anthropic"&&n.provider!=="anthropic-direct"&&console.error(`[--dump-prompt] WARNING: active provider (${n.provider}) does not support prompt dumping. No file will be written.`)}let R=pn(),{prompt:D,source:_}=Ua(),O=xt();Xr(Qr(tp(n.theme,O.theme)));let B=O.autoRouting?.chat??!1,j=Mg(D,B,"one-shot"),$={},H=Va({resume:n.resume,continue:n.continue});if(n.resume&&H&&!H.stored){s.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
1485
1485
  Run \`afk i\` then \`/resume\` to list saved sessions.
1486
- `),process.exitCode=1;return}H&&($=Xa(H),m=!0,f=H.id),n.sessionId!==void 0&&($={sessionId:n.sessionId},m=!0,f=n.sessionId);let C=H?.stored?.model??n.model,L=Ps(C);if(L)throw new Error(L);g.model=C,H?.stored&&(g.totalTurns=H.stored.totalTurns,g.totalCostUsd=H.stored.totalCostUsd,g.totalTokens=H.stored.totalTokens,g.totalDurationMs=H.stored.totalDurationMs,g.turns=[...H.stored.turns],g.sessionId=H.stored.sessionId??H.resumeId,g.sessionStartTime=H.stored.startedAt??Date.now()),n.sessionId!==void 0&&(g.sessionId=n.sessionId);let P,M=Po();y=M?.tracePath;let I=new le({apiKey:R,parentModel:Ze(),...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...d!==void 0?{cwd:d}:{},...M?.writer!==void 0?{traceWriter:M.writer}:{},surface:"cli"}),U=Ta(O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{}),K={get sessionId(){return P?.sessionId},getInputStreamRef(){return P?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return P?.abortSignal??new AbortController().signal},get hookRegistry(){return P?.hookRegistry}},Q=Ci({...d!==void 0?{cwd:d}:{},pluginAgents:Ia()}),ee=Ea(n.model,R,U,O.baseUrl,M?.writer,void 0,d,Ve,"cli",At(n.model),Q,O.openaiBaseUrl),se=new sr({subagentManager:I,parentSession:K,surface:"cli",defaultConfig:{apiKey:R,systemPrompt:D,...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{}},defaultSubagentModel:At(n.model),childProviderFactory:U,childSkillExecutorFactory:ee,resolveApiKeyForModel:Ve,depth:0,...d!==void 0?{cwd:d}:{},agentRegistry:Q,parentModel:n.model,...M?.writer!==void 0?{traceWriter:M.writer}:{}}),z=new ar({parentSession:K,surface:"cli",defaultModel:n.model,defaultSubagentModel:At(n.model),apiKey:R,childProviderFactory:U,childSkillExecutorFactory:ee,agentRegistry:Q,...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{},resolveApiKeyForModel:Ve,...M?.writer!==void 0?{traceWriter:M.writer}:{},...d!==void 0?{cwd:d}:{},getReadScopeInputs:()=>I.getReadScopeInputs()}),fe=new Ao({parentSession:K,defaultModel:n.model,defaultSubagentModel:At(n.model),apiKey:R,resolveApiKeyForModel:Ve,getReadScopeInputs:()=>I.getReadScopeInputs(),...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...d!==void 0?{cwd:d}:{},systemPrompt:D??"",surface:"cli",depth:0,...M?.writer!==void 0?{traceWriter:M.writer}:{}});l=new ut;{let ce=d??process.cwd(),qe=kn(Ut()).mcpConfigs.filter(Oe=>Oe.format==="json").map(Oe=>Oe.source),je=Ni({cwd:ce,...qe.length>0?{importedMcpConfigs:qe}:{},...n.mcpConfig!==void 0?{cliOverride:n.mcpConfig}:{}}),_e=Object.values(je.mcpServers).filter(Oe=>!Oe.disabled).length;if(_e>0){let Oe=Date.now();ie(M?.writer,{phase:"mcp_connect_start",metadata:{serverCount:_e}});try{u=await jr.fromConfig(je.mcpServers,{warnings:je.warnings,...M?.writer!==void 0?{traceWriter:M.writer}:{}})}finally{ie(M?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-Oe,metadata:{serverCount:_e}})}}else if(je.warnings.length>0)for(let Oe of je.warnings)process.stderr.write(`[mcp] ${Oe}
1486
+ `),process.exitCode=1;return}H&&($=Xa(H),m=!0,f=H.id),n.sessionId!==void 0&&($={sessionId:n.sessionId},m=!0,f=n.sessionId);let C=H?.stored?.model??n.model,L=Ps(C);if(L)throw new Error(L);g.model=C,H?.stored&&(g.totalTurns=H.stored.totalTurns,g.totalCostUsd=H.stored.totalCostUsd,g.totalTokens=H.stored.totalTokens,g.totalDurationMs=H.stored.totalDurationMs,g.turns=[...H.stored.turns],g.sessionId=H.stored.sessionId??H.resumeId,g.sessionStartTime=H.stored.startedAt??Date.now()),n.sessionId!==void 0&&(g.sessionId=n.sessionId);let P,M=Po();y=M?.tracePath;let I=new le({apiKey:R,parentModel:Ze(),...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...d!==void 0?{cwd:d}:{},...M?.writer!==void 0?{traceWriter:M.writer}:{},surface:"cli"}),U=Ta(O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{}),K={get sessionId(){return P?.sessionId},getInputStreamRef(){return P?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return P?.abortSignal??new AbortController().signal},get hookRegistry(){return P?.hookRegistry}},Z=Ci({...d!==void 0?{cwd:d}:{},pluginAgents:Ia()}),te=Ea(n.model,R,U,O.baseUrl,M?.writer,void 0,d,Ve,"cli",At(n.model),Z,O.openaiBaseUrl),se=new sr({subagentManager:I,parentSession:K,surface:"cli",defaultConfig:{apiKey:R,systemPrompt:D,...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{}},defaultSubagentModel:At(n.model),childProviderFactory:U,childSkillExecutorFactory:te,resolveApiKeyForModel:Ve,depth:0,...d!==void 0?{cwd:d}:{},agentRegistry:Z,parentModel:n.model,...M?.writer!==void 0?{traceWriter:M.writer}:{}}),z=new ar({parentSession:K,surface:"cli",defaultModel:n.model,defaultSubagentModel:At(n.model),apiKey:R,childProviderFactory:U,childSkillExecutorFactory:te,agentRegistry:Z,...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{},resolveApiKeyForModel:Ve,...M?.writer!==void 0?{traceWriter:M.writer}:{},...d!==void 0?{cwd:d}:{},getReadScopeInputs:()=>I.getReadScopeInputs()}),fe=new Ao({parentSession:K,defaultModel:n.model,defaultSubagentModel:At(n.model),apiKey:R,resolveApiKeyForModel:Ve,getReadScopeInputs:()=>I.getReadScopeInputs(),...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...d!==void 0?{cwd:d}:{},systemPrompt:D??"",surface:"cli",depth:0,...M?.writer!==void 0?{traceWriter:M.writer}:{}});l=new ut;{let ce=d??process.cwd(),qe=kn(Ut()).mcpConfigs.filter(Oe=>Oe.format==="json").map(Oe=>Oe.source),je=Ni({cwd:ce,...qe.length>0?{importedMcpConfigs:qe}:{},...n.mcpConfig!==void 0?{cliOverride:n.mcpConfig}:{}}),_e=Object.values(je.mcpServers).filter(Oe=>!Oe.disabled).length;if(_e>0){let Oe=Date.now();ie(M?.writer,{phase:"mcp_connect_start",metadata:{serverCount:_e}});try{u=await jr.fromConfig(je.mcpServers,{warnings:je.warnings,...M?.writer!==void 0?{traceWriter:M.writer}:{}})}finally{ie(M?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-Oe,metadata:{serverCount:_e}})}}else if(je.warnings.length>0)for(let Oe of je.warnings)process.stderr.write(`[mcp] ${Oe}
1487
1487
  `)}let Ne=u?.getMcpToolWireNames()??[];F=qa(n.provider,{subagentExecutor:se,skillExecutor:z,composeExecutor:fe,memoryStore:l,model:String(n.model),...O.openaiBaseUrl!==void 0?{openaiBaseUrl:O.openaiBaseUrl}:{},...u!==void 0?{mcpManager:u}:{}})??new Qe({permissions:{allowedTools:Pg(Ne)},subagentExecutor:se,skillExecutor:z,composeExecutor:fe,memoryStore:l,surface:"cli",...u!==void 0?{mcpManager:u}:{}}),await Pa(),a=new Rt(Br(Pr({model:C,surface:"cli",apiKey:Ve(C),maxTurns:parseInt(n.maxTurns,10),isNonInteractive:!0,...n.dangerouslySkipPermissions?{permissionMode:"bypassPermissions"}:O.permissionMode!==void 0?{permissionMode:O.permissionMode}:{},hookRegistry:Na(ce=>{console.log(nT(ce))},"cli",l,void 0,La({cwd:d}),{cwd:d,...M?.writer!==void 0?{traceWriter:M.writer}:{}}).registry,...j!==void 0?{systemPrompt:j}:{},..._!==void 0?{systemPromptSource:_}:{},...b!==void 0?{thinking:b}:{},...w!==void 0?{effort:w}:{},...S!==void 0?{maxBudgetUsd:S}:{},...T!==void 0?{taskBudget:T}:{},...k!==void 0?{maxOutputTokens:k}:{},...A!==void 0?{maxToolUseIterations:A}:{},...O.baseUrl!==void 0?{baseUrl:O.baseUrl}:{},...M?{traceWriter:M.writer}:{},...O.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:O.autoResumeOnUsageLimit}:{},...d!==void 0?{cwd:d}:{},...$,provider:F}))),P=a,s.text="Sending message...";let vt=async(ce,qe)=>{if(r.length===0||qe)return;let je={line:_e=>{process.stderr.write(`${_e??""}
1488
1488
  `)},raw:_e=>{process.stderr.write(_e)},success:_e=>{process.stderr.write(`\u2714 ${_e}
1489
1489
  `)},info:_e=>{process.stderr.write(`\u2139 ${_e}
@@ -1507,7 +1507,7 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
1507
1507
  `)}Be();Be();It();Et();la();function dne(e,t){try{if(!e||e.trim().toLowerCase()==="auto")return{available:!0,needs:"unknown"};let n=oi(e,t);if(n.id==="")return{available:!1,needs:"local",hint:"not configured (set AFK_MODEL_LOCAL / models.local)"};if(n.provider==="chatgpt-oauth"){let o=nr(void 0,{},!0).apiKey!=null;return{available:o,needs:"chatgpt-oauth",hint:o?void 0:"needs ChatGPT sign-in (~/.codex/auth.json)"}}if(n.apiKey)return{available:!0,needs:"unknown"};let r=re(e,t?{slots:t}:void 0);if(r==="anthropic-direct"){let o=!!pc();return{available:o,needs:"anthropic",hint:o?void 0:"needs Claude sign-in / ANTHROPIC_API_KEY"}}if(r==="openai-compatible"){if(n.baseUrl)return{available:!0,needs:"local"};let o=!!mc()||nr(void 0,{},!1).apiKey!=null;return{available:o,needs:"openai",hint:o?void 0:"needs OPENAI_API_KEY"}}return{available:!0,needs:"unknown"}}catch{return{available:!0,needs:"unknown"}}}function UL(e,t){return dne(e,t).available}ii();G();var une="https://api.anthropic.com/api/oauth/usage",pne="oauth-2025-04-20",mne=1e4;async function jL(e){let t=e?.fetchImpl??fetch,n=e?.timeoutMs??mne,r=e?.token??(v.CLAUDE_CODE_OAUTH_TOKEN||dt());if(!r)return{kind:"unavailable",reason:"no-token",detail:"No Claude Code OAuth token found. Set CLAUDE_CODE_OAUTH_TOKEN or run `claude login` and try again."};let o;try{o=await t(une,{headers:{Authorization:`Bearer ${r}`,"anthropic-beta":pne},signal:AbortSignal.timeout(n)})}catch(u){return fne(u)?{kind:"unavailable",reason:"timeout",detail:"Request to the usage endpoint timed out."}:{kind:"unavailable",reason:"network-error",detail:"Network error while contacting the usage endpoint."}}if(!o.ok)return{kind:"unavailable",reason:"http-error",detail:`Usage endpoint returned HTTP ${o.status}.`};let i;try{i=await o.json()}catch{return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned a response that was not valid JSON."}}if(typeof i!="object"||i===null)return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned an unexpected response shape."};let s=i,a=fh(s.five_hour),l=fh(s.seven_day),c=fh(s.seven_day_sonnet),d=fh(s.seven_day_opus);return!a&&!l&&!c&&!d?{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint response contained none of the known usage windows."}:{kind:"ok",...a!==void 0?{fiveHour:a}:{},...l!==void 0?{sevenDay:l}:{},...c!==void 0?{sevenDaySonnet:c}:{},...d!==void 0?{sevenDayOpus:d}:{}}}function fne(e){return e instanceof Error&&(e.name==="TimeoutError"||e.name==="AbortError")}var gne=0,hne=4102444800;function yne(e){if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}if(typeof e=="number")return!Number.isFinite(e)||e<gne||e>hne?void 0:new Date(e*1e3)}function fh(e){if(typeof e!="object"||e===null)return;let t=e,n=t.utilization;if(typeof n!="number"||!Number.isFinite(n))return;let r=n>1?n/100:n,o=Math.min(1,Math.max(0,r)),i=yne(t.resets_at);return{utilization:o,...i!==void 0?{resetsAt:i}:{}}}It();var bne="\u25B8",wne=" ",Sne="\u25C9",vne="\u25EF",kne="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",Tne="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel";function dr(e,t){return new Promise(n=>{let{header:r,options:o,multi:i=!1,signal:s,initialIndex:a=0}=t;if(o.length===0){n(null);return}if(s?.aborted){n(null);return}let l=Ene(a,0,o.length-1),c=new Set(t.initialSelected??[]),d=!1,u=y=>{d||(d=!0,s&&s.removeEventListener("abort",m),e.exitPickerMode(),n(y))},m=()=>u(null);s&&s.addEventListener("abort",m,{once:!0});let h={renderRows:()=>{let y=[];for(let b of r)y.push(b);for(let b=0;b<o.length;b++){let w=o[b]??"",S=b===l,T=S?p.brand(bne):wne,k;if(i){let A=c.has(b),F=A?p.success(Sne):p.dim(vne),R=S&&!A?p.bold(w):w;k=` ${T} ${F} ${R}`}else{let A=S?p.bold(w):p.dim(w);k=` ${T} ${A}`}y.push(k)}return y.push(p.dim(" "+(i?Tne:kne))),y},onKey:(y,b)=>{if(!d){if(b.name==="escape"||b.ctrl&&b.name==="c"){u(null);return}if(b.name==="up"||b.ctrl&&b.name==="p"){l=l===0?o.length-1:l-1,e.repaintPicker();return}if(b.name==="down"||b.ctrl&&b.name==="n"){l=l===o.length-1?0:l+1,e.repaintPicker();return}if(b.name==="return"){if(i){let w=[];for(let S=0;S<o.length;S++)if(c.has(S)){let T=o[S];T!==void 0&&w.push(T)}u(w)}else{let w=o[l];u(w!==void 0?[w]:[])}return}if(i&&(b.name==="space"||y===" ")){c.has(l)?c.delete(l):c.add(l),e.repaintPicker();return}if(b.name==="home"){l=0,e.repaintPicker();return}if(b.name==="end"){l=o.length-1,e.repaintPicker();return}}}};e.enterPickerMode(h)})}function Ene(e,t,n){return n<t||e<t?t:e>n?n:e}var xne={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(p.bold("Session cost")),n.line(de()),n.line(` total ${p.success(st(t.totalCostUsd))}`),n.line(` turns ${p.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${p.meta(st(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(st).join(p.dim(" \xB7 "));n.line(` last 5 ${r}`)}return n.line(),n.line(p.dim(" This is session-local spend. For account-wide subscription quota, see /usage.")),n.line(),"continue"}};function Rne(e,t){let n=`${Math.round(t.utilization*100)}%`,r=t.resetsAt?p.dim(` (resets ${t.resetsAt.toLocaleString()})`):"";return` ${e.padEnd(16)}${p.meta(n)}${r}`}var Ane={name:"/usage",summary:"Show Claude subscription usage (5h / 7d windows)",hint:"When you want to know how close you are to hitting your Claude subscription's rolling usage limits \u2014 distinct from /cost, which is session-local spend.",async handler(e){let{out:t}=e,n=await jL();if(t.line(),n.kind==="unavailable")return t.line(p.bold("Subscription usage")),t.line(de()),n.reason==="no-token"?t.warn("No Claude subscription token found \u2014 run `claude login`, then try /usage again."):t.warn(`Usage unavailable (${n.reason}): ${n.detail}`),t.line(),"continue";let o=[["5-hour",n.fiveHour],["7-day",n.sevenDay],["7-day (Sonnet)",n.sevenDaySonnet],["7-day (Opus)",n.sevenDayOpus]].filter(i=>i[1]!==void 0);if(t.line(p.bold("Subscription usage")),t.line(de()),o.length===0)t.line(p.dim(" No usage windows reported."));else for(let[i,s]of o)t.line(Rne(i,s));return t.line(),"continue"}};function Cne(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,i=n?.cache_read_input_tokens??0,s=n?.cache_creation_input_tokens??0,a=r+o+i+s;e.line(),e.line(p.bold("Token usage")+p.dim(" (SDK breakdown)")),e.line(de()),e.line(` total ${p.success(ue(t.totalTokens))} of ${p.meta(ue(t.maxTokens))} (${p.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${p.meta(ue(t.autoCompactThreshold))}`),e.line(),e.line(p.dim(" Last turn (API):")),e.line(` input ${p.meta(ue(r))}`),e.line(` output ${p.meta(ue(o))}`),e.line(` cache read ${p.meta(ue(i))}`),e.line(` cache creat ${p.meta(ue(s))}`),e.line(` total ${p.meta(ue(a))}`);let l=t.categories??[];if(l.length>0){let m=[...l].sort((f,g)=>g.tokens-f.tokens).slice(0,5);e.line(),e.line(p.dim(" Top categories:"));for(let f of m)e.line(` ${p.warning(f.name.padEnd(18))} ${p.meta(ue(f.tokens))}`)}let c=t.systemTools??[],d=t.mcpTools??[];if(c.length>0||d.length>0){e.line();let m=c.reduce((g,h)=>g+h.tokens,0),f=d.reduce((g,h)=>g+h.tokens,0);c.length>0&&e.line(p.dim(` system tools ${c.length} tools, ${ue(m)} tokens`)),d.length>0&&e.line(p.dim(` MCP tools ${d.length} tools, ${ue(f)} tokens`))}let u=t.agents??[];if(u.length>0){let m=u.reduce((f,g)=>f+g.tokens,0);e.line(p.dim(` agents ${u.length} loaded, ${ue(m)} tokens`))}if(t.skills){let m=t.skills;e.line(p.dim(` skills ${m.includedSkills}/${m.totalSkills} included, ${ue(m.tokens)} tokens`))}if(t.slashCommands){let m=t.slashCommands;e.line(p.dim(` slash cmds ${m.includedCommands}/${m.totalCommands} included, ${ue(m.tokens)} tokens`))}e.line()}function _ne(e,t){let n=t.turnTokens.reduce((d,u)=>d+u.input,0),r=t.turnTokens.reduce((d,u)=>d+u.output,0),o=t.turnTokens.reduce((d,u)=>d+u.cache,0),i=n+r,s=qt(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=s>0?Math.round(l/s*100):0;e.line(),e.line(p.bold("Token usage")+p.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(de()),e.line(` input ${p.meta(ue(n))}`),e.line(` output ${p.meta(ue(r))}`),e.line(` cache read ${p.meta(ue(o))}`),e.line(` total ${p.success(ue(i))}`),e.line(` context ${p.meta(`${c}% of ${ue(s)} (${t.model})`)}`),e.line()}var Ine={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();Cne(e.out,t)}catch{_ne(e.out,e.stats)}return"continue"}},Pne={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(p.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(de()),t.turns.forEach((r,o)=>{let i=p.meta(`#${o+1}`),s=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${i} ${p.user("\u25B6")} ${s}`),n.line(` ${p.brand("\u25C6")} ${p.dim(a)}`)}),n.line(),"continue")}};async function HL(e,t){let n=cc.includes(t),r=Is(t)!==void 0,o=re(t)==="openai-compatible",i=oi(t).id.trim().toLowerCase(),s=i.startsWith("claude-")||i.startsWith("claude_");if(!n&&!r&&!o&&!s){e.out.warn(`Unknown model: ${t}. Aliases: ${cc.join(", ")} (or a full model id)`);return}let a=Ps(t);if(a){e.out.warn(a);return}try{await e.session.current.setModel(t),e.stats.model=t,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${p.brand(t)}`)}catch(l){e.out.error(`Failed to switch model: ${l instanceof Error?l.message:String(l)}`)}}var Mne={name:"/model",usage:"/model [local|small|medium|large|opus|sonnet|haiku|fable|org/model]",summary:"Switch the active model mid-session",hint:"Switch the capability tier (local/small/medium/large \u2014 or your configured names) or pass a full model id. Bare `/model` opens an interactive picker on a TTY. Upgrade to large for a hard problem, downshift to small for cheap iteration \u2014 context carries over. Also accepts HuggingFace-style ids (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(n)return await HL(e,n),"continue";let r=e.getCompositor?.()??null;if(r){let i=[...cc],s=i.indexOf(e.stats.model),l=(await dr(r,{header:[p.bold("Switch model"),p.dim(`current: ${e.stats.model}`),p.dim("or type a full id: /model <org/model>"),""],options:i,initialIndex:s>=0?s:0}))?.[0];return l&&await HL(e,l),"continue"}e.out.info(`Current model: ${p.brand(e.stats.model)}`);let o=cc.map(i=>UL(i)?i:`${i} (needs sign-in)`).join(", ");return e.out.line(p.dim(` Aliases: ${o} (or any org/model HF id)`)),"continue"}},One={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(p.bold(`Tools (${n.length})`)),e.out.line(de());let r=3,o=Math.ceil(n.length/r),i=Math.max(...n.map(s=>s.length))+2;for(let s=0;s<o;s++){let a=[];for(let l=0;l<r;l++){let c=l*o+s;c<n.length&&a.push(n[c].padEnd(i))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},$ne={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(Yg(),tL)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(p.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(de());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${p.warning("\u25CF")} ${i} ${p.dim(`(${l}m ago)`)}`),e.out.line(` ${p.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(p.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(p.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),i=o.indexOf(" ");if(i===-1||o.slice(0,i).length===0||o.slice(i+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let s=o.slice(0,i).trim(),a=o.slice(i+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${s}"\u2026`),await e.mcpManager.completeAuth(s,a),e.out.success(`OAuth complete for "${s}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${s}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(p.bold(`MCP servers (${o.length})`)),e.out.line(de());let i=0;for(let s of o){let a=typeof s=="string"?s:s.name??JSON.stringify(s),l=typeof s=="object"&&s!==null&&"status"in s?String(s.status):"",c=l==="connected"?p.success("\u25CF"):p.warning("\u25CF");e.out.line(` ${c} ${a}${l?p.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(p.dim(` ${i} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},Dne={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(p.bold("Context-window limits")),e.out.line(de());for(let[t,n]of Object.entries(sa)){let r=t===e.stats.model?p.brand(" \u2190 active"):"";e.out.line(` ${p.warning(t.padEnd(12))} ${p.meta(ue(n))}${r}`)}return e.out.line(),"continue"}},Fne={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(mh(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},WL=[xne,Ine,Pne,Mne,One,$ne,Dne,Fne,Ane];q();Kw();var wT=!1;function Lne(e){switch(e){case"bypassPermissions":return"bypass restored \u2014 no prompts, read/write any path";case"acceptEdits":return"accept-edits restored \u2014 edits auto-approved";case"dontAsk":case"auto":return"previous mode restored \u2014 no approval prompts";default:return"default permissions restored"}}async function Hd(e,t){let n=e.stats.permissionMode==="plan",r=t!==void 0?t:!n,o=r?"plan":e.session.current.getPrePlanMode?.()??"default";try{if(await e.session.current.setPermissionMode(o),e.stats.permissionMode=o,e.ui.repaintStatusLine(),r){let i=wT?"":p.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");wT||(wT=!0),e.out.success(p.warning("\u25CF plan mode ON")+p.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(p.success("\u25CB plan mode OFF")+p.dim(` \u2014 ${Lne(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}async function Nne(e){if(await Hd(e,!1),e.stats.permissionMode==="plan")return"continue";let t=Wu(e.stats.cwd??process.cwd());return e.out.info(p.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:Bp(t)}}var KL={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode; /plan off saves the plan to a file then implements it",hint:"Think through an approach without changing anything \u2014 write tools and state-mutating bash are refused until you exit; read-only investigation runs. /plan off saves the plan + implements it; Shift+Tab cycles to the next mode without implementing.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();return n!==""&&r!=="on"&&r!=="off"?(e.stats.permissionMode!=="plan"&&await Hd(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await Hd(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await Hd(e,!1),"continue"):Nne(e)}};G();wc();Ma();Tr();var GL=20,qL=500,Bne={done:"\u2705 Done",blocked:"\u26D4 Blocked",asking:"\u2753 Asking",interrupted:"\u23F8\uFE0F Interrupted"},Une={done:[["","whatWasDone"],["Evidence","evidence"],["Pending","deferred"]],blocked:[["Blocked by","whatBlocks"],["Unblock","unblockCondition"],["Done so far","alreadyDone"]],asking:[["","question"],["Resolves","assumption"],["Then","followup"]],interrupted:[["","whatWasInProgress"],["State saved","stateLocation"],["Resume needs","resumeRequires"]]},kT=new Set(["write_file","edit_file","bash"]);function zL(e){return e.some(t=>kT.has(t.toolName)&&t.isError!==!0)}function jne(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":Bne[e.kind]}`,i=[];for(let[a,l]of Une[e.kind]){let c=e[l];typeof c=="string"&&c.trim().length>0&&i.push(a?`\u2022 ${a}: ${c.trim()}`:`\u2022 ${c.trim()}`)}if(i.length===0&&e.rawBody.trim().length>0){let a=e.rawBody.trim();i.push(a.length>qL?`${a.slice(0,qL)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no file write/edit or successful command recorded this turn \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
1508
1508
  `):"(no detail)";return Ye(`${o}
1509
1509
  ${s}`)}var ST=0,vT=!1;function JL(){ST=0,vT=!1}async function YL(e,t=en,n={}){try{if(ST>=GL){vT||(vT=!0,await t(`\u{1F916} AFK \xB7 reached ${GL} updates this session \u2014 further terminal-state pushes muted. Run /afk off then /afk on to resume.`));return}ST+=1,await t(jne(e,n))}catch{}}q();import*as il from"node:fs";import*as XL from"node:path";import{createHmac as Hne,randomBytes as QL,timingSafeEqual as Wne}from"node:crypto";var Kne=32,ZL="\0";function Gne(e){return JSON.stringify(TT(e))}function TT(e){if(Array.isArray(e))return e.map(TT);if(e!==null&&typeof e=="object"){let t=e,n={};for(let r of Object.keys(t).sort())n[r]=TT(t[r]);return n}return e}function eN(e){let t=VL(e);if(t)return t;let n;try{n=Kb(e)}catch{return null}try{il.mkdirSync(XL.dirname(n),{recursive:!0});let r=QL(Kne).toString("hex");return il.writeFileSync(n,r+`
1510
- `,{mode:384}),r}catch{return VL(e)}}function VL(e){let t;try{t=Kb(e)}catch{return null}try{let n=il.readFileSync(t,"utf8").trim();return n.length>0?n:null}catch{return null}}function tN(e,t){return Hne("sha256",e).update(t).digest("hex")}function nN(e,t){if(typeof e!="string"||typeof t!="string"||e.length!==t.length||e.length===0||!/^[0-9a-f]+$/i.test(e)||!/^[0-9a-f]+$/i.test(t))return!1;let n,r;try{n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex")}catch{return!1}return n.length!==r.length||n.length===0?!1:Wne(n,r)}function qne(e,t,n){return["elicitation_response",e,t,Gne(n)].join(ZL)}function zne(e,t,n,r){return tN(e,qne(t,n,r))}function rN(e,t,n,r,o){return nN(o,zne(e,t,n,r))}function Jne(e,t){return["abort_request",e,t].join(ZL)}function Yne(e,t,n){return tN(e,Jne(t,n))}function oN(e,t,n,r){return nN(r,Yne(e,t,n))}function iN(){return QL(8).toString("hex")}kg();var sN={action:"decline"};function aN(e){let{sessionId:t,key:n,onAbort:r}=e;if(n===null)return{stop:()=>{}};let o=new AbortController;return(async()=>{try{for await(let i of Uk(t,{fromStart:!1,signal:o.signal}))if(i.kind==="abort_request"&&oN(n,t,i.nonce,i.hmac)){r("remote abort via Telegram"),o.abort();return}}catch{}})(),{stop:()=>{o.abort()}}}function lN(e){let{sessionId:t,key:n,emitElicitation:r,fallback:o}=e,i=e.newReqId??iN;return function(a,l){let c=l.signal;if(c.aborted)return Promise.resolve(sN);let d=i(),u,m=new Promise(h=>{u=h}),f=new AbortController,g=()=>{f.abort(),u(sN)};c.addEventListener("abort",g,{once:!0}),n&&(async()=>{try{for await(let h of Uk(t,{fromStart:!1,signal:f.signal}))if(h.kind==="elicitation_response"&&h.reqId===d&&rN(n,t,d,h.result,h.hmac)){u(h.result);return}}catch{}})();try{r({kind:"elicitation",reqId:d,request:a})}catch{}return Promise.resolve(o(a,{signal:f.signal})).then(h=>u(h)).catch(()=>{}),m.finally(()=>{f.abort(),c.removeEventListener("abort",g)})}}Us();var gh=null;function Vne(){return v.TELEGRAM_BOT_TOKEN?Ns().length>0:!1}async function Wd(e,t){let n=e.stats.permissionMode==="autonomous",r=t!==void 0?t:!n;try{if(await e.session.current.setPermissionMode(r?"autonomous":"default"),e.stats.permissionMode=r?"autonomous":"default",e.ui.repaintStatusLine(),r){JL();let o=e.session.current,i=o.sessionId,s=e.swapElicitationHandler,a=e.stdinElicitationHandler;if(i&&s&&a){let l=eN(i);l===null&&e.out.error("AFK: could not establish a signing key \u2014 phone replies and remote /abort will NOT work (keyboard only). Check that the AFK state dir is writable.");let c=lN({sessionId:i,key:l,emitElicitation:d=>o.recordLedgerElicitation(d.reqId,d.request),fallback:a});s(c),gh?.stop(),gh=aN({sessionId:i,key:l,onAbort:d=>o.abort(d)}),Uw(i,!0)}else e.out.error("AFK: phone relay NOT armed \u2014 the session has no id until your first message completes. Running keyboard-only; re-run /afk on after a turn to enable phone questions/approvals and remote /abort.");e.out.success(p.info("\u25D0 AFK mode ON")+p.dim(" \u2014 autonomous on reversible work; high-risk/irreversible ops are refused; terminal states report to Telegram.")),Vne()||e.out.error("Telegram is not configured, so AFK updates will not be delivered. Run /telegram-setup to connect a chat. (AFK posture + safety gate still apply.)")}else{e.swapElicitationHandler?.(null),gh?.stop(),gh=null;let o=e.session.current.sessionId;o&&Uw(o,!1),e.out.success(p.success("\u25CB AFK mode OFF")+p.dim(" \u2014 default permissions restored"))}}catch(o){e.out.error(`Could not toggle AFK mode: ${o instanceof Error?o.message:String(o)}`)}}var cN={name:"/afk",usage:"/afk [on|off]",summary:"Toggle AFK mode \u2014 autonomous work + Telegram reporting while you are away",hint:"Tell the agent you are away from keyboard: it works autonomously on reversible operations, a safety gate refuses high-risk/irreversible ops, and each turn reports its terminal state to Telegram. /afk off restores default permissions.",async handler(e,t){let n=t.trim().toLowerCase(),r=n==="on"?!0:n==="off"?!1:e.stats.permissionMode!=="autonomous";return r&&e.stats.permissionMode==="autonomous"?"continue":!r&&e.stats.permissionMode==="plan"?(e.out.warn("AFK is already off \u2014 you're in plan mode. Use `/plan off` to leave plan mode."),"continue"):!r&&e.stats.permissionMode!=="autonomous"?(await Wd(e,!1),"continue"):(await Wd(e,r),"continue")}};q();import{readFileSync as Xne,writeFileSync as Qne,existsSync as dN,mkdirSync as Zne}from"fs";import{join as ere}from"path";function uN(){return OR(),Db()}function pN(e){return ere(uN(),`${e}.json`)}function hh(e){let t=pN(e);if(!dN(t))return{sessionId:e,items:[]};try{let n=Xne(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function Kd(e){let t=uN();dN(t)||Zne(t,{recursive:!0}),Qne(pN(e.sessionId),JSON.stringify(e,null,2))}function mN(e,t){let r={id:e.items.reduce((o,i)=>Math.max(o,i.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function fN(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function gN(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function hN(e){e.items.length=0}function yh(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,ne());{let r=p.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+p.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?p.success("[x]"):p.dim("[ ]"),i=r.done?p.dim(r.text):no(r.text),a=` ${p.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-X(a)),c=me(i,l).split(`
1510
+ `,{mode:384}),r}catch{return VL(e)}}function VL(e){let t;try{t=Kb(e)}catch{return null}try{let n=il.readFileSync(t,"utf8").trim();return n.length>0?n:null}catch{return null}}function tN(e,t){return Hne("sha256",e).update(t).digest("hex")}function nN(e,t){if(typeof e!="string"||typeof t!="string"||e.length!==t.length||e.length===0||!/^[0-9a-f]+$/i.test(e)||!/^[0-9a-f]+$/i.test(t))return!1;let n,r;try{n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex")}catch{return!1}return n.length!==r.length||n.length===0?!1:Wne(n,r)}function qne(e,t,n){return["elicitation_response",e,t,Gne(n)].join(ZL)}function zne(e,t,n,r){return tN(e,qne(t,n,r))}function rN(e,t,n,r,o){return nN(o,zne(e,t,n,r))}function Jne(e,t){return["abort_request",e,t].join(ZL)}function Yne(e,t,n){return tN(e,Jne(t,n))}function oN(e,t,n,r){return nN(r,Yne(e,t,n))}function iN(){return QL(8).toString("hex")}kg();var sN={action:"decline"};function aN(e){let{sessionId:t,key:n,onAbort:r}=e;if(n===null)return{stop:()=>{}};let o=new AbortController;return(async()=>{try{for await(let i of Uk(t,{fromStart:!1,signal:o.signal}))if(i.kind==="abort_request"&&oN(n,t,i.nonce,i.hmac)){r("remote abort via Telegram"),o.abort();return}}catch{}})(),{stop:()=>{o.abort()}}}function lN(e){let{sessionId:t,key:n,emitElicitation:r,fallback:o}=e,i=e.newReqId??iN;return function(a,l){let c=l.signal;if(c.aborted)return Promise.resolve(sN);let d=i(),u,m=new Promise(h=>{u=h}),f=new AbortController,g=()=>{f.abort(),u(sN)};c.addEventListener("abort",g,{once:!0}),n&&(async()=>{try{for await(let h of Uk(t,{fromStart:!1,signal:f.signal}))if(h.kind==="elicitation_response"&&h.reqId===d&&rN(n,t,d,h.result,h.hmac)){u(h.result);return}}catch{}})();try{r({kind:"elicitation",reqId:d,request:a})}catch{}return Promise.resolve(o(a,{signal:f.signal})).then(h=>u(h)).catch(()=>{}),m.finally(()=>{f.abort(),c.removeEventListener("abort",g)})}}Us();var gh=null;function Vne(){return v.TELEGRAM_BOT_TOKEN?Ns().length>0:!1}async function Wd(e,t){let n=e.stats.permissionMode==="autonomous",r=t!==void 0?t:!n;try{if(await e.session.current.setPermissionMode(r?"autonomous":"default"),e.stats.permissionMode=r?"autonomous":"default",e.ui.repaintStatusLine(),r){JL();let o=e.session.current,i=o.sessionId,s=e.swapElicitationHandler,a=e.stdinElicitationHandler;if(i&&s&&a){let l=eN(i);l===null&&e.out.error("AFK: could not establish a signing key \u2014 phone replies and remote /abort will NOT work (keyboard only). Check that the AFK state dir is writable.");let c=lN({sessionId:i,key:l,emitElicitation:d=>o.recordLedgerElicitation(d.reqId,d.request),fallback:a});s(c),gh?.stop(),gh=aN({sessionId:i,key:l,onAbort:d=>o.abort(d)}),Uw(i,!0)}else e.out.error("AFK: phone relay NOT armed \u2014 the session has no id until your first message completes. Running keyboard-only; re-run /afk on after a turn to enable phone questions/approvals and remote /abort.");e.out.success(p.info("\u25D0 AFK mode ON")+p.dim(" \u2014 autonomous on reversible work; high-risk/irreversible ops are refused; terminal states report to Telegram.")),Vne()||e.out.error("Telegram is not configured, so AFK updates will not be delivered. Run /telegram-setup to connect a chat. (AFK posture + safety gate still apply.)")}else{e.swapElicitationHandler?.(null),gh?.stop(),gh=null;let o=e.session.current.sessionId;o&&Uw(o,!1),e.out.success(p.success("\u25CB AFK mode OFF")+p.dim(" \u2014 default permissions restored"))}}catch(o){e.out.error(`Could not toggle AFK mode: ${o instanceof Error?o.message:String(o)}`)}}var cN={name:"/afk",usage:"/afk [on|off]",summary:"Toggle AFK mode \u2014 autonomous work + Telegram reporting while you are away",hint:"Tell the agent you are away from keyboard: it works autonomously on reversible operations, a safety gate refuses high-risk/irreversible ops, and each turn reports its terminal state to Telegram. /afk off restores default permissions.",async handler(e,t){let n=t.trim().toLowerCase(),r=n==="on"?!0:n==="off"?!1:e.stats.permissionMode!=="autonomous";return r&&e.stats.permissionMode==="autonomous"?"continue":!r&&e.stats.permissionMode==="plan"?(e.out.warn("AFK is already off \u2014 you're in plan mode. Use `/plan off` to leave plan mode."),"continue"):!r&&e.stats.permissionMode!=="autonomous"?(await Wd(e,!1),"continue"):(await Wd(e,r),"continue")}};q();import{readFileSync as Xne,writeFileSync as Qne,existsSync as dN,mkdirSync as Zne}from"fs";import{join as ere}from"path";function uN(){return OR(),Db()}function pN(e){return ere(uN(),`${e}.json`)}function hh(e){let t=pN(e);if(!dN(t))return{sessionId:e,items:[]};try{let n=Xne(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function Kd(e){let t=uN();dN(t)||Zne(t,{recursive:!0}),Qne(pN(e.sessionId),JSON.stringify(e,null,2))}function mN(e,t){let r={id:e.items.reduce((o,i)=>Math.max(o,i.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function fN(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function gN(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function hN(e){e.items.length=0}function yh(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,Q());{let r=p.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+p.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?p.success("[x]"):p.dim("[ ]"),i=r.done?p.dim(r.text):no(r.text),a=` ${p.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-X(a)),c=me(i,l).split(`
1511
1511
  `);t.push(a+(c[0]??""));let d=" ".repeat(X(a));for(let u of c.slice(1))t.push(d+u)}{let r=Math.max(0,Math.min(n-1,120));t.push(p.dim("\u2514"+"\u2500".repeat(r)))}return t}function yN(e){return e.items.length===0?"":e.items.map(t=>`${t.id}:${t.done?1:0}:${t.text}`).join(`
1512
1512
  `)}function bN(e){let t=e.stats.sessionId??"unbound";return hh(t)}function tre(e){let t=bN(e),n=yh(t);if(n.length===0){e.out.info("No todos yet. Try /todo add buy milk");return}for(let r of n)e.out.line(r)}var wN={name:"/todo",usage:"/todo [add|done|rm|clear|list] ...",summary:"Manage this session's todo list",hint:"When you want a durable checklist the model and you both see \u2014 survives across turns and shows above each prompt.",async handler(e,t){let n=t.trim();if(!n||n==="list")return tre(e),"continue";let[r,...o]=n.split(/\s+/),i=o.join(" "),s=bN(e);switch(r){case"add":{if(!i)return e.out.warn("Usage: /todo add <text>"),"continue";let a=mN(s,i);return Kd(s),e.out.success(`Added ${p.meta(`#${a.id}`)} ${a.text}`),"continue"}case"done":{let a=parseInt(i,10);if(!Number.isFinite(a))return e.out.warn("Usage: /todo done <id>"),"continue";let l=fN(s,a);return l?(Kd(s),e.out.success(`Marked done ${p.meta(`#${a}`)} ${l.text}`)):e.out.warn(`No todo with id ${a}`),"continue"}case"rm":case"remove":{let a=parseInt(i,10);return Number.isFinite(a)?(gN(s,a)?(Kd(s),e.out.success(`Removed ${p.meta(`#${a}`)}`)):e.out.warn(`No todo with id ${a}`),"continue"):(e.out.warn("Usage: /todo rm <id>"),"continue")}case"clear":return hN(s),Kd(s),e.out.success("All todos cleared."),"continue";default:return e.out.warn(`Unknown subcommand: ${r}. Try /todo add, done, rm, clear, list.`),"continue"}}};var SN={name:"/name",usage:"/name [name]",hint:"When you want a memorable handle for this session so /resume and --resume can find it by name instead of a UUID.",summary:"Show or set this session\u2019s name",async handler(e,t){let n=t.trim();if(!n)return e.stats.name?e.out.line(p.dim(" name ")+p.warning(e.stats.name)):e.out.info("No name set. Use /name <name> to set one."),"continue";let r=Ug(n);if(!r)return e.out.warn("Invalid name \u2014 use letters, numbers, spaces, or hyphens."),"continue";if(e.stats.name=r,e.stats.totalTurns>0)try{Mo(e.stats),e.out.success(p.success("Named")+p.dim(` ${r}`)),e.out.line(p.dim(` Resume: ${Oo(r,e.stats.model)}`))}catch(o){e.out.error(`Named "${r}" but save failed: ${o instanceof Error?o.message:String(o)}`)}else e.out.success(p.success("Named")+p.dim(` ${r} (saves on first turn)`));return"continue"}};function TN(e){if(typeof e!="number"||!Number.isFinite(e))return" \u2014 ";let t=new Date(e);return Number.isNaN(t.getTime())?" \u2014 ":t.toISOString().replace("T"," ").slice(0,16)}function nre(e){return{id:e.id,resumeId:e.data.sessionId??e.id,stored:e.data}}function vN(e){let t=e.model.padEnd(7),n=`${e.totalTurns} turn${e.totalTurns===1?"":"s"}`.padEnd(9),r=e.source==="telegram"?"tg":" ";return`${TN(e.savedAt)} ${t} ${n} ${r} ${e.name??e.id}`}function rre(e){let t=new Map;for(let n of e){let r=vN(n);t.set(r,(t.get(r)??0)+1)}return e.map(n=>{let r=vN(n);return(t.get(r)??0)>1?`${r} ${p.dim(n.id)}`:r})}async function kN(e,t){let n=t.data.name??t.id;if(typeof e.requestResume=="function"){let i=e.session.current.sessionId,s=t.data.sessionId;if(i!==void 0&&s!==void 0&&i===s||i!==void 0&&i===t.id){e.out.warn(`Already on session ${n}.`);return}e.out.info(`Resuming session ${n} \u2026`);let l=await e.requestResume(nre(t));l.ok?e.out.success(`Resumed ${n} (sdk id: ${l.sessionId})`):e.out.warn(l.reason);return}let r=t.data,o=r.name??r.sessionId??t.id;e.out.line(),e.out.line(p.bold(`Session ${r.name??t.id}`)),e.out.line(de()),e.out.line(` name ${p.brand(r.name??"\u2014")}`),e.out.line(` source ${p.brand(r.source??"cli")}`),e.out.line(` model ${p.brand(r.model)}`),e.out.line(` turns ${p.meta(String(r.totalTurns))}`),e.out.line(` cost ${p.meta(st(r.totalCostUsd))}`),e.out.line(` sdk id ${p.meta(r.sessionId??"\u2014")}`),e.out.line(),e.out.line(p.dim(" Resume with:")),e.out.line(p.brand(` ${Oo(o,r.model)}`)),e.out.line()}var EN={name:"/resume",usage:"/resume [id]",hint:"When you want to continue a previously saved session \u2014 runs interactively to pick one if no id is given.",summary:"List saved sessions, or swap the active session for a stored one",async handler(e,t){let n=t.trim();if(n){let d=$i(n);return d?(await kN(e,d),"continue"):(e.out.warn(`No saved session: ${n}`),"continue")}let r=Md();if(r.length===0)return e.out.info("No saved sessions found. Start a session \u2014 it autosaves each turn."),"continue";let o=e.stats.cwd??process.cwd(),i=r.filter(d=>d.cwd===o),s=i.length>0,a=s?i:r,l=e.getCompositor?.()??null;if(l){let d=a.slice(0,20),u=rre(d),f=(await dr(l,{header:[p.bold(`Resume a session (${d.length})`),p.dim(s?"saved in this directory":"all directories (none saved here)"),""],options:u}))?.[0];if(f){let g=u.indexOf(f),h=g>=0?d[g]:void 0;if(h){let y=$i(h.id);y?await kN(e,y):e.out.warn(`No saved session: ${h.name??h.id}`)}}return"continue"}let c=s?p.bold(`Saved sessions (${a.length})`):p.bold("Saved sessions \u2014 all (none in this directory)");e.out.line(),e.out.line(c),e.out.line(de());for(let d of a.slice(0,20)){let u=TN(d.savedAt),m=p.brand(d.model.padEnd(7)),f=p.meta(`${d.totalTurns} turn${d.totalTurns===1?"":"s"}`.padEnd(9)),g=p.meta(st(d.totalCostUsd).padStart(8)),h=d.source==="telegram"?p.brand("tg"):" ",y=p.warning(d.name??d.id);e.out.line(` ${u} ${m} ${f} ${g} ${h} ${y}`)}return e.out.line(),e.out.line(p.dim(" Resume with: /resume <name>")),e.out.line(),"continue"}};import{spawnSync as ore}from"node:child_process";function Wi(e=process.env){if(e.TMUX)return"tmux";if(e.KITTY_WINDOW_ID)return"kitty";if(e.WEZTERM_PANE)return"wezterm";if(e.WT_SESSION)return"windows-terminal";if(e.KONSOLE_DBUS_SERVICE)return"konsole";if(e.GNOME_TERMINAL_SCREEN)return"gnome-terminal";let t=e.TERM_PROGRAM;if(t==="iTerm.app")return"iterm2";if(t==="Apple_Terminal")return"apple-terminal";if(t==="vscode")return"vscode";if(t==="Hyper")return"hyper";let n=e.TERM;return n==="xterm-ghostty"||e.GHOSTTY_RESOURCES_DIR?"ghostty":n==="alacritty"?"alacritty":e.VTE_VERSION?"gnome-terminal":"unknown"}function ire(e){switch(e){case"darwin":return[{cmd:"pbcopy",args:[]}];case"win32":return[{cmd:"clip",args:[]}];default:return[{cmd:"wl-copy",args:[]},{cmd:"xclip",args:["-selection","clipboard"]},{cmd:"xsel",args:["--clipboard","--input"]}]}}function sre(e){return`\x1B]52;c;${Buffer.from(e,"utf8").toString("base64")}\x07`}function are(e){return`\x1BPtmux;${e.replace(/\x1b/g,"\x1B\x1B")}\x1B\\`}function lre(e,t=process.env){let n=sre(e);return Wi(t)==="tmux"?are(n):n}function cre(e,t=process.env,n=process.stdout){if(n.isTTY!==!0)return!1;try{return n.write(lre(e,t)),!0}catch{return!1}}function xN(e,t=process.platform,n=process.env,r=process.stdout){for(let o of ire(t))try{let i=ore(o.cmd,o.args,{input:e});if(!i.error&&i.status===0)return!0}catch{}return cre(e,n,r)}import{spawnSync as fre}from"node:child_process";import{resolve as dre}from"node:path";function ET(e,t,n){let r=dre(process.argv[1]??""),o=[process.execPath,r,"interactive"];typeof t=="string"&&t.length>0&&o.push("--model",t),o.push("--resume",e);let i=o.map(Nd).join(" "),s=r.length>0&&!r.endsWith(".ts");return{argv:o,shellCommand:i,cwd:n,spawnable:s}}function bh(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function RN(e){return`cd ${Nd(e.cwd)} && ${e.shellCommand}`}function ure(e){return`tell application "iTerm" to tell current window to create tab with default profile command "${bh(RN(e))}"`}function pre(e){return`tell application "Terminal" to do script "${bh(RN(e))}"`}function mre(e){return['tell application "Ghostty"',"set cfg to new surface configuration",`set command of cfg to "${bh(e.shellCommand)}"`,`set initial working directory of cfg to "${bh(e.cwd)}"`,"new tab in (front window) with configuration cfg","end tell"].join(`
1513
1513
  `)}function xT(e,t,n=process.platform){switch(e){case"tmux":return{kind:e,capability:"tab",exec:{cmd:"tmux",args:["new-window","-c",t.cwd,t.shellCommand]}};case"wezterm":return{kind:e,capability:"tab",exec:{cmd:"wezterm",args:["cli","spawn","--cwd",t.cwd,"--",...t.argv]}};case"kitty":return{kind:e,capability:"tab",exec:{cmd:"kitten",args:["@","launch","--type=tab",`--cwd=${t.cwd}`,...t.argv]}};case"windows-terminal":return{kind:e,capability:"tab",exec:{cmd:"wt",args:["-w","0","new-tab","-d",t.cwd,...t.argv]}};case"iterm2":return{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",ure(t)]}};case"apple-terminal":return{kind:e,capability:"window",exec:{cmd:"osascript",args:["-e",pre(t)]}};case"ghostty":return n==="darwin"?{kind:e,capability:"tab",exec:{cmd:"osascript",args:["-e",mre(t)]}}:{kind:e,capability:"none"};case"gnome-terminal":return{kind:e,capability:"tab",exec:{cmd:"gnome-terminal",args:["--tab",`--working-directory=${t.cwd}`,"--",...t.argv]}};case"konsole":return{kind:e,capability:"tab",exec:{cmd:"konsole",args:["--new-tab","--workdir",t.cwd,"-e",...t.argv]}};case"vscode":case"alacritty":case"hyper":case"unknown":return{kind:e,capability:"none"}}}var gre=5e3,hre=(e,t,n)=>{let r=fre(e,t,n);return{status:r.status,...r.error?{error:r.error}:{}}};function AN(e){let t=e.env??process.env,n=e.platform??process.platform,r=e.run??hre,o=Wi(t);if(!e.interactive)return{spawned:!1,kind:o,capability:"none",reason:"non-interactive-surface"};let i=ET(e.forkId,e.model,e.cwd);if(!i.spawnable)return{spawned:!1,kind:o,capability:"none",reason:"dev-entrypoint"};let s=xT(o,i,n);if(s.capability==="none"||!s.exec)return{spawned:!1,kind:o,capability:s.capability,reason:"no-tab-mechanism"};try{let a=r(s.exec.cmd,s.exec.args,{stdio:"ignore",timeout:gre});if(a.error||a.status!==0){let l=a.error?a.error.message:`exited ${a.status}`;return{spawned:!1,kind:o,capability:s.capability,reason:l}}return{spawned:!0,kind:o,capability:s.capability}}catch(a){return{spawned:!1,kind:o,capability:s.capability,reason:a instanceof Error?a.message:String(a)}}}var yre={tmux:"tmux",wezterm:"WezTerm",kitty:"kitty",iterm2:"iTerm","apple-terminal":"Terminal",ghostty:"Ghostty","windows-terminal":"Windows Terminal","gnome-terminal":"GNOME Terminal",konsole:"Konsole",vscode:"VS Code",alacritty:"Alacritty",hyper:"Hyper",unknown:"this terminal"};function bre(e,t,n){let r=[];if(e.spawned){let o=e.capability==="window"?"window":"tab";r.push(p.info(` \u2197 Continuing in a new ${yre[e.kind]} ${o}.`)),r.push(p.dim(" Or run it yourself:"))}else e.kind==="vscode"&&e.reason==="no-tab-mechanism"?r.push(p.dim(" VS Code's integrated terminal can't be opened from outside \u2014 run this in a new terminal:")):r.push(p.dim(" Continue the fork with:"));return r.push(p.brand(` ${t}`)),n&&r.push(p.dim(" (copied to clipboard)")),r.push(""),r.push(p.meta(" This session continues here, untouched. The fork carries the")),r.push(p.meta(" conversation only \u2014 live subagents and background jobs are not forked.")),r}var CN={name:"/fork",aliases:["/branch"],usage:"/fork",hint:"When you want to explore a divergent path without losing this thread \u2014 duplicates the conversation into a new resumable session you can continue in parallel.",summary:"Duplicate this conversation into a new, independent session",async handler(e){if(e.stats.totalTurns===0)return e.out.warn("Nothing to fork yet \u2014 no turns in this session."),"continue";let t,n;try{({id:t,path:n}=LF(e.stats))}catch(l){return e.out.error(`Could not fork: ${l instanceof Error?l.message:String(l)}`),"continue"}let r=Oo(t,e.stats.model),o=e.stats.cwd??process.cwd(),i=typeof e.requestResume=="function"&&process.stdout.isTTY===!0,s=AN({forkId:t,model:e.stats.model,cwd:o,interactive:i}),a=!s.spawned&&i&&xN(r);e.out.success(p.success("Forked")+p.dim(` ${n}`)),e.out.line();for(let l of bre(s,r,a))e.out.line(l);return e.out.line(),"continue"}};import{existsSync as xre,readFileSync as Rre}from"node:fs";import{resolve as ON}from"node:path";import{execFileSync as _N}from"node:child_process";import{readFileSync as wre,writeFileSync as Sre}from"node:fs";import{resolve as vre}from"node:path";var kre={feat:"Added",fix:"Fixed",refactor:"Changed",perf:"Changed",docs:"Changed",chore:"Changed",ci:"Changed",test:"Changed","test+fix":"Fixed",build:"Changed",style:"Changed"},Tre=["Added","Fixed","Changed","Deprecated","Removed","Security"];function IN(e){let t;try{t=_N("git",["describe","--tags","--abbrev=0"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{t=""}let n=t?["log",`${t}..HEAD`,"--format=%h %s"]:["log","-50","--format=%h %s"],r=_N("git",n,{cwd:e,encoding:"utf8"}).trim();return r?r.split(`
@@ -1523,7 +1523,7 @@ ${s}`)}var ST=0,vT=!1;function JL(){ST=0,vT=!1}async function YL(e,t=en,n={}){tr
1523
1523
 
1524
1524
  ${a}
1525
1525
  `);if(l===r)throw new Error("No ## [Unreleased] section found");Sre(n,l)}var $N={name:"/changelog",usage:"/changelog [--dry-run]",summary:"Generate CHANGELOG entries from commits since last tag",hint:"When you are preparing a release and want to auto-generate changelog entries from conventional commits.",async handler(e,t){let n=t.split(/\s+/).includes("--dry-run"),r=process.cwd(),o;try{o=IN(r)}catch(a){return e.out.error(`Failed to read git log: ${a instanceof Error?a.message:String(a)}`),"continue"}if(o.length===0)return e.out.warn("No commits found since the last tag."),"continue";let i=PN(o),s=(()=>{try{let a=Rre(ON(r,"CHANGELOG.md"),"utf8");return RT(a)}catch{return""}})();e.out.line(),e.out.info(`${o.length} commits since last tag`),e.out.line(),s&&(e.out.warn("Existing [Unreleased] entries will be preserved above new entries."),e.out.line()),e.out.line(p.heading("Preview:")),e.out.line(p.dim("\u2500".repeat(60)));for(let a of i.split(`
1526
- `))a.startsWith("### ")?e.out.line(p.bold(a)):a.startsWith("- ")?e.out.line(p.dim(" ")+a):e.out.line(a);if(e.out.line(p.dim("\u2500".repeat(60))),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!xre(ON(r,"CHANGELOG.md")))return e.out.error("CHANGELOG.md not found. Create one with a ## [Unreleased] section first."),"continue";MN(r,i),e.out.success("Wrote entries to CHANGELOG.md [Unreleased] section."),e.out.line(p.dim(" Review with: git diff CHANGELOG.md"))}catch(a){e.out.error(`Failed to update CHANGELOG.md: ${a instanceof Error?a.message:String(a)}`)}return"continue"}};Wf();pt();var AT,CT;function DN(e){AT=e}function FN(e){CT=e}var LN={running:"\u25D0",completed:"\u2713",failed:"\u2717",cancelled:"\u2298"};function wh(e){return AT||(e.out.error("Background subagent jobs are not available in this session."),null)}var _T=/\x1b\[[0-9;]*[a-zA-Z]/g;function Are(e,t=120){let n=e.replace(_T,"").replace(/[\r\n]+/g," ").trim();return n.length>t?`${n.slice(0,t)}\u2026`:n}function Cre(e){let t=LN[e.status],n=e.endedAt!==void 0?ve(e.endedAt-e.startedAt):ve(Date.now()-e.startedAt),r=e.label.length>60?`${e.label.slice(0,60)}\u2026`:e.label,o=` ${t} ${p.bold(e.jobId)} ${r} ${p.dim(`(${e.status} \xB7 ${n} \xB7 ${e.model})`)}`;if(!CT||e.status!=="running")return o;let i=CT.getSummary(e.jobId);if(!i)return o;let s=process.stdout.columns??120,a=Are(i.text,Math.max(40,s-10)),l=Math.round((Date.now()-i.refreshedAt)/1e3),c=i.stale?" [stale]":"",d=p.dim(` \u21B3 ${a} (${l}s ago)${c}`);return`${o}
1526
+ `))a.startsWith("### ")?e.out.line(p.bold(a)):a.startsWith("- ")?e.out.line(p.dim(" ")+a):e.out.line(a);if(e.out.line(p.dim("\u2500".repeat(60))),n)return e.out.info("Dry run \u2014 CHANGELOG.md not modified."),"continue";try{if(!xre(ON(r,"CHANGELOG.md")))return e.out.error("CHANGELOG.md not found. Create one with a ## [Unreleased] section first."),"continue";MN(r,i),e.out.success("Wrote entries to CHANGELOG.md [Unreleased] section."),e.out.line(p.dim(" Review with: git diff CHANGELOG.md"))}catch(a){e.out.error(`Failed to update CHANGELOG.md: ${a instanceof Error?a.message:String(a)}`)}return"continue"}};Wf();pt();var AT,CT;function DN(e){AT=e}function FN(e){CT=e}var LN={running:"\u25D0",completed:"\u2713",failed:"\u2717",cancelled:"\u2298"};function wh(e){return AT||(e.out.error("Background subagent jobs are not available in this session."),null)}var _T=/\x1b\[[0-9;]*[a-zA-Z]/g;function Are(e,t=120){let n=e.replace(_T,"").replace(/[\r\n]+/g," ").trim();return n.length>t?`${n.slice(0,t)}\u2026`:n}function Cre(e){let t=LN[e.status],n=e.endedAt!==void 0?ve(e.endedAt-e.startedAt):ve(Date.now()-e.startedAt),r=e.label.length>60?`${e.label.slice(0,60)}\u2026`:e.label,o=` ${t} ${p.bold(e.jobId)} ${r} ${p.dim(`(${e.status} \xB7 ${n} \xB7 ${e.model})`)}`;if(!CT||e.status!=="running")return o;let i=CT.getSummary(e.jobId);if(!i)return o;let s=Q(),a=Are(i.text,Math.max(40,s-10)),l=Math.round((Date.now()-i.refreshedAt)/1e3),c=i.stale?" [stale]":"",d=p.dim(` \u21B3 ${a} (${l}s ago)${c}`);return`${o}
1527
1527
  ${d}`}function IT(e,t){let n=LN[t.status];e.out.line(` ${n} ${p.bold(t.jobId)} ${t.label}`);let r=t.endedAt!==void 0?ve(t.endedAt-t.startedAt):ve(Date.now()-t.startedAt);e.out.line(` Status: ${t.status} \xB7 ${r}`),e.out.line(` Subagent: ${t.subagentId}`),e.out.line(` Model: ${t.model}`);let o=t.result;if(o?.message?.content){e.out.line("");let i=typeof o.message.content=="string"?o.message.content:JSON.stringify(o.message.content),s=In(i,o.stopReason),a=s.split(`
1528
1528
  `).slice(0,40);for(let l of a)e.out.line(` ${l}`);s.split(`
1529
1529
  `).length>40&&e.out.line(p.dim(" \u2026 (truncated; full result available via /bgsub:join again)"))}o?.error&&e.out.error(` Error: ${o.error.message}`)}var _re={name:"/bgsub",summary:"List background subagent jobs",usage:"/bgsub [id]",hint:'When you want to check on background subagent jobs spawned with mode="background" during this session.',async handler(e,t){let n=wh(e);if(!n)return"continue";let r=t.trim();if(r){let i=n.get(r);return i?(IT(e,i),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}let o=n.list();if(o.length===0)return e.out.info('No background subagent jobs. Spawn one by calling the agent tool with mode="background".'),"continue";for(let i of o)e.out.line(Cre(i));return"continue"}},Ire={name:"/bgsub:status",summary:"Show one background job",usage:"/bgsub:status <id>",hint:"When you need the full detail view for one specific background job by its ID.",async handler(e,t){let n=wh(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:status <id>"),"continue";let o=n.get(r);return o?(IT(e,o),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},Pre={name:"/bgsub:join",summary:"Wait for a background subagent job and print its result",usage:"/bgsub:join <id>",hint:"When a background subagent has finished and you want to surface its result into the conversation.",async handler(e,t){let n=wh(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:join <id>"),"continue";if(n.get(r)){try{await n.join(r)}catch(s){let a=s instanceof Error?s.message:String(s);e.out.error(`/bgsub:join failed: ${a}`)}let i=n.get(r);return i&&IT(e,i),"continue"}let o=await ir.readMeta(r);if(o){e.out.info("Job evicted from memory \u2014 replaying from log."),wt(o.stopReason)&&(e.out.line(` ${In("",o.stopReason).trimEnd()}`),e.out.line(""));let i=0;for await(let s of ir.readEvents(r)){let a=Mre(s);a!==null&&(e.out.line(a),i++)}return i===0&&e.out.info(` (no events recorded for job ${r})`),e.out.line(""),e.out.line(` Status: ${o.status}`+(o.endedAt!==void 0?` \xB7 ended ${new Date(o.endedAt).toISOString()}`:"")),"continue"}return e.out.error(`No background job with ID "${r}".`),"continue"}};function Mre(e){if(e.type==="chunk"){let t=e.chunk;return t.type==="content"?t.content.replace(_T,""):t.type==="tool_use_detail"?p.dim(` [tool: ${t.toolName}]`):null}if(e.type==="error")return p.dim(` [error: ${e.error.message}]`);if(e.type==="message"){let t=e.message.content;return(typeof t=="string"?t:JSON.stringify(t)).replace(_T,"")}return null}var Ore={name:"/bgsub:cancel",summary:"Cancel a running background subagent job",usage:"/bgsub:cancel <id>",hint:"When you want to abort a background subagent job that is still in progress.",async handler(e,t){let n=wh(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:cancel <id>"),"continue";let o=n.get(r);return o?o.status!=="running"?(e.out.info(`Job ${r} is already ${o.status}; nothing to cancel.`),"continue"):(await n.cancelJob(r)?e.out.line(p.dim(` \u2192 cancellation requested for ${r}`)):e.out.info(`Job ${r} could not be cancelled (already terminal).`),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},NN=[_re,Ire,Pre,Ore];var sl;function UN(e){sl=e}function BN(e){let t=e.trim();return t.startsWith("sh-")?t:/^\d+$/.test(t)?`sh-${t}`:t}function $re(e){switch(e){case"running":return"\u25B6";case"completed":return"\u2713";case"failed":return"\u2717";case"killed":return"\u2298";default:return"?"}}var jN={name:"/sh",summary:"Inspect or kill user-typed `!cmd` shell jobs",usage:"/sh [list | show <id> | kill <id>]",hint:"Manages shell processes started with `!cmd` (foreground) or `!&cmd` (background). No args \u2192 list. `show <id>` prints captured output, `kill <id>` terminates a running job.",async handler(e,t){if(!sl)return e.out.error("Shell passthrough not available in this session."),"continue";let n=t.trim(),[r,...o]=n===""?["list"]:n.split(/\s+/),i=o.join(" ");switch(r){case"list":{let s=sl.registry.list();if(s.length===0)return e.out.line(p.dim(" no shell jobs in this session yet \u2014 type !<cmd> to start one")),"continue";e.out.line(p.dim(" id status duration mode command"));for(let a of s){let l=$re(a.status),c=a.status.padEnd(10),d=a.result?ve(a.result.durationMs).padEnd(12):ve(Date.now()-a.startedAt).padEnd(12),u=a.mode==="background"?"bg":"fg",m=a.command.length>60?a.command.slice(0,57)+"...":a.command;e.out.line(` ${l} ${a.id.padEnd(5)} ${c} ${d} ${u.padEnd(4)} ${m}`)}return"continue"}case"show":{if(!i)return e.out.info("Usage: /sh show <id>"),"continue";let s=BN(i),a=sl.registry.get(s);if(!a)return e.out.error(`Job ${s} not found.`),"continue";if(e.out.line(p.dim(`$ ${a.command}`)),!a.result)return e.out.line(p.dim(" (still running \u2014 output captured so far is not yet flushed)")),"continue";let l=a.result.displayCaptured;l.length===0?e.out.line(p.dim(" (no output)")):e.out.raw(l.endsWith(`
@@ -1534,7 +1534,7 @@ ${d}`}function IT(e,t){let n=LN[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1534
1534
 
1535
1535
  `),t&&(n=n.replace(/^\n+/,"").replace(/\n+$/,"")),n}function Lre(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function MT(e,t){let n=Lre(t),r=new RegExp(`<${n}>`,"g"),o=r.test(e);r.lastIndex=0;let i=new RegExp(`(\\n|^)[ \\t]*<${n}>[ \\t]*\\n?`,"gm"),s=new RegExp(`(\\n|^)[ \\t]*</${n}>[ \\t]*\\n?`,"gm"),a=new RegExp(`</${n}>`,"g"),l=!1,c=e;return c=c.replace(i,(d,u)=>(l=!0,u)),c=c.replace(s,(d,u)=>(l=!0,u)),c=c.replace(r,()=>(l=!0,"")),c=c.replace(a,()=>(l=!0,"")),c=c.replace(/^[ \t]+$/gm,""),c=c.replace(/\n{3,}/g,`
1536
1536
 
1537
- `),l&&(c=c.replace(/^\n+/,"").replace(/\n+$/,"")),{text:c,found:o}}G();ye();G();import Lo from"string-width";function Ki(e){let{buffer:t,promptText:n,isTTY:r,attachmentSummary:o}=e,i=o&&o.length>0?o:null;if(!r){let g=n+t;return i!==null?`${g} ${i}`:g}let s=e.terminalWidth??ne(),a=t.includes(`
1537
+ `),l&&(c=c.replace(/^\n+/,"").replace(/\n+$/,"")),{text:c,found:o}}G();ye();G();import Lo from"string-width";function Ki(e){let{buffer:t,promptText:n,isTTY:r,attachmentSummary:o}=e,i=o&&o.length>0?o:null;if(!r){let g=n+t;return i!==null?`${g} ${i}`:g}let s=e.terminalWidth??Q(),a=t.includes(`
1538
1538
  `),l=Lo(Ie(t)),c=l>=s-2,d;if(!a&&!c){let g=p.user("\u25B6")+" ",h=2,y=s-1,b=Math.max(0,y-l-h);d=g+" ".repeat(b)+t}else d=Es({kind:"user",body:t});if(i===null)return d;let u=Lo(i),m=Math.max(0,s-1-u),f=" ".repeat(m)+p.dim(i);return d+`
1539
1539
  `+f}function OT(e,t,n){let r=n||80,o=e.split(`
1540
1540
  `),i=0;for(let s=0;s<o.length;s++){let a=Ie(o[s]),l=(s===0?t:0)+Lo(a);i+=Math.max(1,Math.ceil(l/r))}return Math.max(0,i-1)}function WN(e,t,n,r){let o=r||80,i=e.split(`
@@ -1548,11 +1548,11 @@ ${d}`}function IT(e,t){let n=LN[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1548
1548
  `)});return}let r=Math.max(1,e.stdout.rows??24),o=t.endsWith(`
1549
1549
  `)?t.slice(0,-1):t,i=Math.max(1,e.stdout.columns??80);Oh(e,i);let s=o.split(`
1550
1550
  `),a=!1;for(;s.length>1&&s[s.length-1]==="";)s.pop(),a=!0;let l=s.flatMap($=>sp($,i).split(`
1551
- `)),c=Math.max(1,l.length),d=e.scrollRegion?.getExtraRows()??0,u=e.logUpdate.topRow??0,m=e.bandGeometryStale?0:e.lastMeasuredFrameTop,f=e.committedBand.length>0&&e.committedBandBottomRow>0&&!e.bandGeometryStale?e.committedBandBottomRow+1:0,g=Math.max(u,m,f),h=g>1?g:Math.max(1,r-1-d),y=Math.max(e.anchorRow??1,1),b=g>1&&c<=h-y,w=b&&e.committedBand.length>0&&e.committedBandBottomRow>0?Math.max(h,e.committedBandBottomRow+1):h,S=Math.max(0,w-y),T=a&&b&&c<S,k=T?[...l,""]:l,A=c+(T?1:0),F=a?[...l,""]:l,R=F.length,{useBandHold:D,overflowRun:_,maxBandModel:O}=CB({prevTopRow:g,frameTop:h,anchorFloor:y,anchorRow:e.anchorRow??1,lineCount:R,textLines:F,rows:r,extraRows:d,committedBand:e.committedBand,committedBandBottomRow:e.committedBandBottomRow,committedBandPaintedRows:e.committedBandPaintedRows,geometryStale:e.bandGeometryStale});e.commitInFlight=!0,e.committing=!0;let B=0;try{e.logUpdate.clear(d),n(()=>{let $=b,H=$&&e.committedBand.length>0&&e.committedBandBottomRow>0?Math.max(h,e.committedBandBottomRow+1):h,C=Math.max(0,H-y),L=$?Math.max(0,e.committedBand.length+A-C):A;if(B=b?L:0,e.debugLog("commitAbove:phase1",{lineCount:A,fitsAboveFrame:b,bandOverflow:L}),D){let P=Math.max(0,_.length-O);if(P>0){let M=Math.max(1,r-y+1);for(let I=0;I<P;I+=M){let U=_.slice(I,Math.min(I+M,P)),K=U.map((Q,ee)=>et(y+ee,Q)).join("");e.stdout.write(`${K}\x1B[${r};1H${`
1551
+ `)),c=Math.max(1,l.length),d=e.scrollRegion?.getExtraRows()??0,u=e.logUpdate.topRow??0,m=e.bandGeometryStale?0:e.lastMeasuredFrameTop,f=e.committedBand.length>0&&e.committedBandBottomRow>0&&!e.bandGeometryStale?e.committedBandBottomRow+1:0,g=Math.max(u,m,f),h=g>1?g:Math.max(1,r-1-d),y=Math.max(e.anchorRow??1,1),b=g>1&&c<=h-y,w=b&&e.committedBand.length>0&&e.committedBandBottomRow>0?Math.max(h,e.committedBandBottomRow+1):h,S=Math.max(0,w-y),T=a&&b&&c<S,k=T?[...l,""]:l,A=c+(T?1:0),F=a?[...l,""]:l,R=F.length,{useBandHold:D,overflowRun:_,maxBandModel:O}=CB({prevTopRow:g,frameTop:h,anchorFloor:y,anchorRow:e.anchorRow??1,lineCount:R,textLines:F,rows:r,extraRows:d,committedBand:e.committedBand,committedBandBottomRow:e.committedBandBottomRow,committedBandPaintedRows:e.committedBandPaintedRows,geometryStale:e.bandGeometryStale});e.commitInFlight=!0,e.committing=!0;let B=0;try{e.logUpdate.clear(d),n(()=>{let $=b,H=$&&e.committedBand.length>0&&e.committedBandBottomRow>0?Math.max(h,e.committedBandBottomRow+1):h,C=Math.max(0,H-y),L=$?Math.max(0,e.committedBand.length+A-C):A;if(B=b?L:0,e.debugLog("commitAbove:phase1",{lineCount:A,fitsAboveFrame:b,bandOverflow:L}),D){let P=Math.max(0,_.length-O);if(P>0){let M=Math.max(1,r-y+1);for(let I=0;I<P;I+=M){let U=_.slice(I,Math.min(I+M,P)),K=U.map((Z,te)=>et(y+te,Z)).join("");e.stdout.write(`${K}\x1B[${r};1H${`
1552
1552
  `.repeat(U.length)}`)}}}else if(b)L>0&&e.stdout.write(`\x1B[${r};1H${`
1553
1553
  `.repeat(L)}`);else{let P=k.map(M=>`\x1B[2K${M??""}`).join(`
1554
1554
  `);e.stdout.write(`\x1B[${y};1H${P}\x1B[${r};1H${`
1555
- `.repeat(A)}`)}})}finally{e.committing=!1,e.debugLog("commitAbove:finally")}B>0&&e.anchorRow!==void 0&&e.anchorRow>1&&(e.anchorRow=Math.max(1,e.anchorRow-B)),e.hasCommitted=!0,e.debugLog("commitAbove:phase2:repaint"),e.repaint(),e.debugLog("commitAbove:phase2:done",{newTopRow:e.logUpdate.topRow??null});let j=e.logUpdate.topRow??0;if(j>1){let $=Math.max(e.anchorRow??1,1),H=Math.max(0,j-$);if(D){let C=FT(_,O),L=Math.min(C.length,H),P=j-L,M="";for(let I=0;I<L;I++){let U=P+I;if(U>=j)break;M+=et(U,C[C.length-L+I])}M.length>0&&n(()=>{e.stdout.write(M)}),e.committedBand=C,e.committedBandBottomRow=j-1,e.committedBandTopRow=P,e.committedBandPaintedRows=L}else{let C=Math.min(k.length,H);if(C>0){let L=k.slice(k.length-C),P=C===k.length,I=b&&P&&e.committedBand.length>0&&(e.committedBandBottomRow===j-1||e.committedBandBottomRow===w-1)?[...e.committedBand,...L]:L,U=I.length>H?I.slice(I.length-H):I,K=j-U.length,Q=e.committedBandTopRow,ee="";if(b){if(Q>0&&Q<K){let se=Math.max($,Q);for(let z=se;z<K;z++)ee+=et(z)}for(let se=0;se<U.length;se++){let z=K+se;if(z>=j)break;ee+=et(z,U[se])}}else{let se=Math.max(0,j-y),z=Math.max(0,k.length-se);for(let fe=z;fe<k.length;fe++){let Ne=y+(fe-z);if(Ne>=j)break;ee+=et(Ne,k[fe])}}ee.length>0&&n(()=>{e.stdout.write(ee)}),e.committedBand=U,e.committedBandBottomRow=j-1,e.committedBandTopRow=K,e.committedBandPaintedRows=U.length}else Yd(e)}}else if(D){let $=FT(_,O),H=Math.max(1,r-1-d);e.committedBand=$,e.committedBandBottomRow=Math.max(0,H-1),e.committedBandTopRow=Math.max(y,H-$.length),e.committedBandPaintedRows=0}else Yd(e);e.commitInFlight=!1,e.debugLog("commitAbove:phase3:done")}function Yd(e){e.committedBand=[],e.committedBandTopRow=0,e.committedBandBottomRow=0,e.committedBandPaintedRows=0,e.bandReflowCache=null}function IB(e){e.hasCommitted=!1,Yd(e),e.commitInFlight=!1}function PB(e){let t=e.pendingResizeErase;if(!t)return;e.pendingResizeErase=null;let n=Math.max(1,e.stdout.rows??24),r=Math.max(1,t.top),o=Math.min(t.bottom,n);if(r>o)return;let i="";for(let s=r;s<=o;s++)i+=et(s);try{e.stdout.write(i)}catch{}}function MB(e,t,n,r){if(e.commitInFlight||!e.logUpdate)return;let o=Math.max(e.anchorRow??1,1),i=t-1;if(e.committedBand.length===0){e.bandGeometryStale=!1;return}if(i<o)return;e.bandGeometryStale=!1;let s=i-o+1,a=Math.min(e.committedBand.length,s);if(a<=0)return;let l=i-a+1,c=l!==e.committedBandTopRow||i!==e.committedBandBottomRow,d=n>0&&n<=e.committedBandBottomRow;if(!c&&!d)return;let u=e.committedBand.slice(e.committedBand.length-a),m="\x1B[?25l";for(let f=o;f<l;f++)m+=et(f);for(let f=0;f<u.length;f++)m+=et(l+f,u[f]);m+=`\x1B[${Math.max(1,r)};1H`,cl(e.stdout,()=>{try{e.stdout.write(m)}catch{}}),e.committedBandTopRow=l,e.committedBandBottomRow=i,e.committedBandPaintedRows=a}var coe={"image/png":"PNG","image/jpeg":"JPEG","image/gif":"GIF","image/webp":"WEBP"};function doe(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}function Vd(e){if(e.length===0)return"";let t=e.reduce((a,l)=>a+l.sizeBytes,0),n=doe(t),r=e.length===1?"image":"images",o=new Set,i=[];for(let a of e){let l=coe[a.mediaType];o.has(l)||(o.add(l),i.push(l))}let s=i.join(", ");return`[${e.length} ${r} attached \xB7 ${n} \xB7 ${s} \xB7 Ctrl+X to discard]`}function OB(e,t){if(t.length===0)return e;if(e){let n=t.length===1?"image":"images";return`${e} [+ ${t.length} ${n}]`}return t.length===1?"[image attached]":`[${t.length} images attached]`}function dl(e){return e.length===0?"":e.length===1?"[image attached]":`[${e.length} images attached]`}function LT(e,t){let n=e.logUpdate?.topRow??0;if(!(e.anchorRow!==void 0&&e.anchorRow>1)){let m=e.committedBand.length,f=Math.max(0,t-1),g=e.committedBandPaintedRows<m,h=e.overlay.trim().length===0;if(!e.commitInFlight&&g&&m>f&&h&&f>0){let T=m-f,k="";for(let A=1;A<=e.committedBandBottomRow;A++)k+=et(A);for(let A=0;A<m;A++)k+=et(1+A,e.committedBand[A]);cl(e.stdout,()=>{try{e.stdout.write(k)}catch{}}),$h(e,T),e.committedBand=e.committedBand.slice(T),e.committedBandTopRow=1,e.committedBandBottomRow=f,e.committedBandPaintedRows=e.committedBand.length;return}if(!(e.hasCommitted&&n>1&&t<n)||m===0)return;let b=Math.max(0,t-1),w=m-b;if(w<=0)return;let S="";for(let T=1;T<=e.committedBandBottomRow;T++)S+=et(T);for(let T=0;T<m;T++)S+=et(1+T,e.committedBand[T]);cl(e.stdout,()=>{try{e.stdout.write(S)}catch{}}),$h(e,w),e.committedBand=e.committedBand.slice(w),e.committedBandTopRow=1,e.committedBandBottomRow=b,e.committedBandPaintedRows=e.committedBand.length;return}let o=e.committedBand.length,i=Math.max(e.anchorRow??1,1),s=Math.max(0,t-i),a=e.committedBandPaintedRows<o,l=e.overlay.trim().length===0;if(!e.commitInFlight&&a&&o>s&&l&&s>0){let m=o-s,f="";for(let g=i;g<=e.committedBandBottomRow;g++)f+=et(g);for(let g=0;g<o;g++)f+=et(i+g,e.committedBand[g]);cl(e.stdout,()=>{try{e.stdout.write(f)}catch{}}),$h(e,m),e.committedBand=e.committedBand.slice(m),e.committedBandTopRow=i,e.committedBandBottomRow=i+s-1,e.committedBandPaintedRows=e.committedBand.length;return}let c=e.hasCommitted&&n>1?Math.max(0,n-t):0,d=t<e.anchorRow?e.anchorRow-t:0,u=Math.max(c,d);if(u>0&&($h(e,u),e.anchorRow!==void 0&&e.anchorRow>1&&(e.anchorRow=Math.max(1,e.anchorRow-u)),e.committedBand.length>0)){e.committedBandTopRow-=u,e.committedBandBottomRow-=u;let m=Math.max(e.anchorRow??1,1);if(e.committedBandTopRow<m){let f=m-e.committedBandTopRow;e.committedBand=e.committedBand.slice(f),e.committedBandTopRow=m}e.committedBand.length===0||e.committedBandBottomRow<m?e.clearCommittedBand():e.committedBandPaintedRows=e.committedBand.length}}function $h(e,t){if(t<=0)return;e.debugLog("evict:enter",{rows:t,anchorRow:e.anchorRow??null});let r=`\x1B[${Math.max(1,e.stdout.rows??24)};1H${`
1555
+ `.repeat(A)}`)}})}finally{e.committing=!1,e.debugLog("commitAbove:finally")}B>0&&e.anchorRow!==void 0&&e.anchorRow>1&&(e.anchorRow=Math.max(1,e.anchorRow-B)),e.hasCommitted=!0,e.debugLog("commitAbove:phase2:repaint"),e.repaint(),e.debugLog("commitAbove:phase2:done",{newTopRow:e.logUpdate.topRow??null});let j=e.logUpdate.topRow??0;if(j>1){let $=Math.max(e.anchorRow??1,1),H=Math.max(0,j-$);if(D){let C=FT(_,O),L=Math.min(C.length,H),P=j-L,M="";for(let I=0;I<L;I++){let U=P+I;if(U>=j)break;M+=et(U,C[C.length-L+I])}M.length>0&&n(()=>{e.stdout.write(M)}),e.committedBand=C,e.committedBandBottomRow=j-1,e.committedBandTopRow=P,e.committedBandPaintedRows=L}else{let C=Math.min(k.length,H);if(C>0){let L=k.slice(k.length-C),P=C===k.length,I=b&&P&&e.committedBand.length>0&&(e.committedBandBottomRow===j-1||e.committedBandBottomRow===w-1)?[...e.committedBand,...L]:L,U=I.length>H?I.slice(I.length-H):I,K=j-U.length,Z=e.committedBandTopRow,te="";if(b){if(Z>0&&Z<K){let se=Math.max($,Z);for(let z=se;z<K;z++)te+=et(z)}for(let se=0;se<U.length;se++){let z=K+se;if(z>=j)break;te+=et(z,U[se])}}else{let se=Math.max(0,j-y),z=Math.max(0,k.length-se);for(let fe=z;fe<k.length;fe++){let Ne=y+(fe-z);if(Ne>=j)break;te+=et(Ne,k[fe])}}te.length>0&&n(()=>{e.stdout.write(te)}),e.committedBand=U,e.committedBandBottomRow=j-1,e.committedBandTopRow=K,e.committedBandPaintedRows=U.length}else Yd(e)}}else if(D){let $=FT(_,O),H=Math.max(1,r-1-d);e.committedBand=$,e.committedBandBottomRow=Math.max(0,H-1),e.committedBandTopRow=Math.max(y,H-$.length),e.committedBandPaintedRows=0}else Yd(e);e.commitInFlight=!1,e.debugLog("commitAbove:phase3:done")}function Yd(e){e.committedBand=[],e.committedBandTopRow=0,e.committedBandBottomRow=0,e.committedBandPaintedRows=0,e.bandReflowCache=null}function IB(e){e.hasCommitted=!1,Yd(e),e.commitInFlight=!1}function PB(e){let t=e.pendingResizeErase;if(!t)return;e.pendingResizeErase=null;let n=Math.max(1,e.stdout.rows??24),r=Math.max(1,t.top),o=Math.min(t.bottom,n);if(r>o)return;let i="";for(let s=r;s<=o;s++)i+=et(s);try{e.stdout.write(i)}catch{}}function MB(e,t,n,r){if(e.commitInFlight||!e.logUpdate)return;let o=Math.max(e.anchorRow??1,1),i=t-1;if(e.committedBand.length===0){e.bandGeometryStale=!1;return}if(i<o)return;e.bandGeometryStale=!1;let s=i-o+1,a=Math.min(e.committedBand.length,s);if(a<=0)return;let l=i-a+1,c=l!==e.committedBandTopRow||i!==e.committedBandBottomRow,d=n>0&&n<=e.committedBandBottomRow;if(!c&&!d)return;let u=e.committedBand.slice(e.committedBand.length-a),m="\x1B[?25l";for(let f=o;f<l;f++)m+=et(f);for(let f=0;f<u.length;f++)m+=et(l+f,u[f]);m+=`\x1B[${Math.max(1,r)};1H`,cl(e.stdout,()=>{try{e.stdout.write(m)}catch{}}),e.committedBandTopRow=l,e.committedBandBottomRow=i,e.committedBandPaintedRows=a}var coe={"image/png":"PNG","image/jpeg":"JPEG","image/gif":"GIF","image/webp":"WEBP"};function doe(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}function Vd(e){if(e.length===0)return"";let t=e.reduce((a,l)=>a+l.sizeBytes,0),n=doe(t),r=e.length===1?"image":"images",o=new Set,i=[];for(let a of e){let l=coe[a.mediaType];o.has(l)||(o.add(l),i.push(l))}let s=i.join(", ");return`[${e.length} ${r} attached \xB7 ${n} \xB7 ${s} \xB7 Ctrl+X to discard]`}function OB(e,t){if(t.length===0)return e;if(e){let n=t.length===1?"image":"images";return`${e} [+ ${t.length} ${n}]`}return t.length===1?"[image attached]":`[${t.length} images attached]`}function dl(e){return e.length===0?"":e.length===1?"[image attached]":`[${e.length} images attached]`}function LT(e,t){let n=e.logUpdate?.topRow??0;if(!(e.anchorRow!==void 0&&e.anchorRow>1)){let m=e.committedBand.length,f=Math.max(0,t-1),g=e.committedBandPaintedRows<m,h=e.overlay.trim().length===0;if(!e.commitInFlight&&g&&m>f&&h&&f>0){let T=m-f,k="";for(let A=1;A<=e.committedBandBottomRow;A++)k+=et(A);for(let A=0;A<m;A++)k+=et(1+A,e.committedBand[A]);cl(e.stdout,()=>{try{e.stdout.write(k)}catch{}}),$h(e,T),e.committedBand=e.committedBand.slice(T),e.committedBandTopRow=1,e.committedBandBottomRow=f,e.committedBandPaintedRows=e.committedBand.length;return}if(!(e.hasCommitted&&n>1&&t<n)||m===0)return;let b=Math.max(0,t-1),w=m-b;if(w<=0)return;let S="";for(let T=1;T<=e.committedBandBottomRow;T++)S+=et(T);for(let T=0;T<m;T++)S+=et(1+T,e.committedBand[T]);cl(e.stdout,()=>{try{e.stdout.write(S)}catch{}}),$h(e,w),e.committedBand=e.committedBand.slice(w),e.committedBandTopRow=1,e.committedBandBottomRow=b,e.committedBandPaintedRows=e.committedBand.length;return}let o=e.committedBand.length,i=Math.max(e.anchorRow??1,1),s=Math.max(0,t-i),a=e.committedBandPaintedRows<o,l=e.overlay.trim().length===0;if(!e.commitInFlight&&a&&o>s&&l&&s>0){let m=o-s,f="";for(let g=i;g<=e.committedBandBottomRow;g++)f+=et(g);for(let g=0;g<o;g++)f+=et(i+g,e.committedBand[g]);cl(e.stdout,()=>{try{e.stdout.write(f)}catch{}}),$h(e,m),e.committedBand=e.committedBand.slice(m),e.committedBandTopRow=i,e.committedBandBottomRow=i+s-1,e.committedBandPaintedRows=e.committedBand.length;return}let c=e.hasCommitted&&n>1?Math.max(0,n-t):0,d=t<e.anchorRow?e.anchorRow-t:0,u=Math.max(c,d);if(u>0&&($h(e,u),e.anchorRow!==void 0&&e.anchorRow>1&&(e.anchorRow=Math.max(1,e.anchorRow-u)),e.committedBand.length>0)){e.committedBandTopRow-=u,e.committedBandBottomRow-=u;let m=Math.max(e.anchorRow??1,1);if(e.committedBandTopRow<m){let f=m-e.committedBandTopRow;e.committedBand=e.committedBand.slice(f),e.committedBandTopRow=m}e.committedBand.length===0||e.committedBandBottomRow<m?e.clearCommittedBand():e.committedBandPaintedRows=e.committedBand.length}}function $h(e,t){if(t<=0)return;e.debugLog("evict:enter",{rows:t,anchorRow:e.anchorRow??null});let r=`\x1B[${Math.max(1,e.stdout.rows??24)};1H${`
1556
1556
  `.repeat(t)}`,o=()=>{try{e.stdout.write(r)}catch(i){e.debugLog("evict:error",{msg:i?.message??String(i)})}};e.scrollRegion!==void 0?e.scrollRegion.withFullScrollRegion(o):o()}function Dh(e){if(!e.armed||!e.logUpdate||e.committing||e.suspended)return;if(e.flushResizeGhostErase(),e.lastKnownRows=e.stdout.rows??24,Oh(e,e.stdout.columns??80),e.inputMode==="picker"&&e.pickerController){uoe(e);return}let t=e.renderInputLine(),n=e.overlay?e.overlay.split(`
1557
1557
  `):[],r=e.spinnerController.renderSpinnerRow(),o=e.spinnerController.renderTipRow(e.stdout.columns??80),i=null;e.attachments.length>0?i=Vd(e.attachments):e.clipboardFailureMsg!==null&&(i=p.dim(e.clipboardFailureMsg),e.clipboardFailureMsg=null);let s=e.renderDropdownRows(),a=e.renderHintRow(),l=!!r||!!o||!!i,c=l||n.length>0,d=e.scrollRegion?.getExtraRows()??0,u=Math.max(1,(e.stdout.rows??24)-1-d),m=c?1:0,f=(r?1:0)+(o?1:0)+(i?1:0)+m+s.length+(a!==null?1:0)+1,g=Math.max(0,u-f),h=n.length>g?n.slice(-g):n,y=l||h.length>0,b=[];b.push(...h),r&&b.push(r),o&&b.push(o),i&&b.push(i),y&&b.push(""),b.push(...s),a!==null&&b.push(a),b.push(t);let w=Math.max(1,(e.stdout.rows??24)-1-d),S=b.join(`
1558
1558
  `),T=w,k=e.logUpdate.measure?e.logUpdate.measure(S,T).topRow:Math.max(1,T-b.length+1);e.lastMeasuredFrameTop=k,LT(e,k);let A=e.logUpdate.topRow??0;e.logUpdate.render(S,T,e.anchorRow),e.repositionCommittedBand(k,A,T)}function uoe(e){if(!e.logUpdate||!e.pickerController)return;let t=[...e.pickerController.renderRows()],n=e.overlay?e.overlay.split(`
@@ -1582,12 +1582,12 @@ ${d}`}function IT(e,t){let n=LN[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1582
1582
  `,i=$oe(r,n,{trim:!1,hard:!0,wordWrap:!1}).split(`
1583
1583
  `);for(;i.length>0&&i[i.length-1]==="";)i.pop();return i}measure(t,n){let r=this.stream.columns??80,o=Math.max(1,e.wrapToPhysicalLines(t,r).length),i=Math.max(1,n);return{topRow:Math.max(1,i-o+1),lineCount:o}}render(t,n,r){let o=Math.max(1,n),i=Math.max(1,r??1),s=this.stream.columns??80,a=this.stream.isTTY===!0,l=e.wrapToPhysicalLines(t,s),c=Math.max(1,l.length),d=this.previousRawLineCount>c?this.previousRawLineCount-c:0,u=Math.max(0,o-c+1-i),m=Math.min(d,u),f=m>0?[...Array(m).fill(""),...l]:l,g=f.length,h=Math.max(1,o-g+1),y="";if(a&&(y+=zB),this.previousLineCount>0)for(let b=0;b<this.previousLineCount;b++){let w=this.previousTopRow+b;y+=Qd(w,1)+UT}for(let b=0;b<g;b++){let w=h+b;y+=Qd(w,1)+UT+(f[b]??"")}if(y+=Qd(h+g-1,1),a&&(y+=JB),this.stream.isTTY)try{this.stream.write(Doe)}catch{}try{this.stream.write(y)}catch{try{this.stream.isTTY&&this.stream.write(YB)}catch{}}if(v.NODE_ENV!=="production"&&g<c)throw new Error(`CupFrameRenderer invariant violation: lineCount (${g}) < rawLineCount (${c}). previousLineCount must cover at least previousRawLineCount \u2014 padded footprint must be \u2265 raw content size; see PR #557.`);this.previousTopRow=h,this.previousLineCount=g,this.previousRawLineCount=c}resetGeometry(){this.previousTopRow=0,this.previousLineCount=0,this.previousRawLineCount=0}clear(t=0){if(this.previousLineCount===0)return;let n="",r=this.stream.isTTY===!0;r&&(n+=zB);for(let o=0;o<this.previousLineCount;o++){let i=this.previousTopRow+o;n+=Qd(i,1)+UT}n+=Qd(Math.max(1,(this.stream.rows??24)-1-t),1),r&&(n+=JB);try{this.stream.write(n)}catch{}this.previousTopRow=0,this.previousLineCount=0,this.previousRawLineCount=0}done(){if(this.previousTopRow=0,this.previousLineCount=0,this.previousRawLineCount=0,this.stream.isTTY)try{this.stream.write(YB)}catch{}}};var Zd=null;function eu(e){if(Zd!==null)throw new Error(`stdin claim conflict: '${Zd.name}' already holds the claim, '${e}' cannot acquire it concurrently.`);let t=!1,n={release(){t||(t=!0,Zd?.handle===n&&(Zd=null))}};return Zd={name:e,handle:n},n}async function VB(e,t){let n=eu(e);try{return await t()}finally{n.release()}}function XB(e){if(!(!e.armed||e.suspended)){if(e.logUpdate)try{e.logUpdate.clear(e.scrollRegion?.getExtraRows()??0),e.logUpdate.done()}catch{}e.handleKeypress&&e.stdin.removeListener("keypress",e.handleKeypress);try{e.stdin.setRawMode(!1)}catch{}e.caretBlinkController.stop(),e.suspended=!0}}function QB(e){if(!(!e.armed||!e.suspended)){try{e.stdin.setRawMode(!0)}catch{}e.handleKeypress&&e.stdin.on("keypress",e.handleKeypress),e.suspended=!1,e.repaint(),e.caretBlinkController.start()}}async function ZB(e){if(e.armed)throw new Error("TerminalCompositor: arm() called while already armed");if(!(!e.stdout.isTTY||!e.stdin.isTTY)){e.anchorRow=e.declaredAnchorRow,e.logUpdate||(e.logUpdate=new Fh(e.stdout)),e.stdinClaim=eu("TerminalCompositor.arm"),e.wasRaw=e.stdin.isRaw??!1;try{e.stdin.setRawMode(!0)}catch{e.stdinClaim?.release(),e.stdinClaim=null,e.logUpdate=null,e.wasRaw=!1;return}try{e.stdout.write("\x1B[?2004h")}catch{}e.stdin.resume(),Ui(e.stdin),e.handleKeypress=(t,n)=>{let r=e.pasting?!1:e.caretBlinkController.resetVisible(),o=e.repaintCount;KB(e,t,n),r&&e.repaintCount===o&&e.repaint()},e.stdin.on("keypress",e.handleKeypress),e.armed=!0,e.canceled=!1,e.resizeUnsub=We.subscribe(()=>{e.armed&&e.repaint()}),e.resizeImmediateUnsub=We.subscribeImmediate(()=>{if(!e.armed)return;let t=e.stdout.rows??24;if(e.lastKnownRows>0&&t>e.lastKnownRows){let n=e.scrollRegion?.getExtraRows()??0,r=e.logUpdate?.topRow??0,o=e.committedBand.length>0?e.committedBandTopRow:0,i=[r,o].filter(l=>l>0),s=i.length>0?Math.min(...i):0,a=Math.max(1,e.lastKnownRows-1-n);s>0&&s<=a&&(e.pendingResizeErase={top:s,bottom:a})}else e.pendingResizeErase=null;e.logUpdate?.resetGeometry?.(),e.bandGeometryStale=!0}),e.repaint(),e.caretBlinkController.start()}}function eU(e){if(e.spinnerController.dispose(),e.caretBlinkController.stop(),!e.armed){e.resetState();return}if(e.handleKeypress&&(e.stdin.removeListener("keypress",e.handleKeypress),e.handleKeypress=null),e.resizeUnsub&&(e.resizeUnsub(),e.resizeUnsub=null),e.resizeImmediateUnsub&&(e.resizeImmediateUnsub(),e.resizeImmediateUnsub=null),Foe(e),e.logUpdate)try{e.logUpdate.clear(e.scrollRegion?.getExtraRows()??0),e.logUpdate.done()}catch{}if(e.stdout.isTTY&&e.stdin.isTTY){try{e.stdout.write("\x1B[?2004l")}catch{}try{e.stdin.setRawMode(e.wasRaw)}catch{}}e.stdinClaim&&(e.stdinClaim.release(),e.stdinClaim=null),e.armed=!1,e.resetState(),e.ghostEngine?.dispose()}function Foe(e){let t=e.committedBand.length-e.committedBandPaintedRows;if(t<=0)return;let n=e.committedBand.slice(0,t),r=Math.max(1,e.stdout.rows??24),o=Math.max(e.anchorRow??1,1),i=()=>{let s=Math.max(1,r-o+1);for(let a=0;a<n.length;a+=s){let l=n.slice(a,Math.min(a+s,n.length)),c=l.map((d,u)=>et(o+u,d)).join("");e.stdout.write(`${c}\x1B[${r};1H${`
1584
1584
  `.repeat(l.length)}`)}};try{e.scrollRegion?e.scrollRegion.withFullScrollRegion(i):i()}catch{}}function tU(e){e.overlay="",e.input=J.seed(""),e.queued=!1,e.pendingSubmissions=[],e.canceled=!1,e.backgrounded=!1,e.softStopped=!1,e.postEscCoalesce=!1,e.postEscPayload=null,e.paused=!1,e.pendingTrailingRepaint=!1,e.burstActive=!1,e.activeGhost=null,e.anchorRow=void 0,e.hasCommitted=!1,e.clearCommittedBand(),e.commitInFlight=!1,e.pendingResizeErase=null,e.bandGeometryStale=!1,e.lastKnownRows=0,e.pickerController=null,e.inputMode="streaming",e.attachments=[],e.pasting=!1,e.pasteStartBufferLen=0,e.pasteStartCursor=0,e.pasteRegistry.clear(),e.clipboardFailureMsg=null,e.autocompleteState?.reset(),e.resizeUnsub&&(e.resizeUnsub(),e.resizeUnsub=null),e.resizeImmediateUnsub&&(e.resizeImmediateUnsub(),e.resizeImmediateUnsub=null)}var pl=class{stdout;stdin;onCancel;onSoftStop;softStopped=!1;postEscCoalesce=!1;postEscPayload=null;onBackground;onRewindRequest;lastIdleEscAt=0;onPauseInterrupt;onShiftTab;onOpenEditor;promptTextFn;history;autocompleteState;formatInputBuffer;scrollRegion;anchorRow;declaredAnchorRow;onSubmit;attachments=[];pasting=!1;pasteStartBufferLen=0;pasteStartCursor=0;pasteRegistry=new Map;clipboardInFlight=!1;clipboardFailureMsg=null;inputMode="streaming";pickerController=null;pickerSavedMode="streaming";armed=!1;suspended=!1;canceled=!1;backgrounded=!1;paused=!1;wasRaw=!1;stdinClaim=null;logUpdate=null;overlay="";input=J.seed("");queued=!1;pendingSubmissions=[];handleKeypress=null;resizeUnsub=null;resizeImmediateUnsub=null;spinnerController;caretBlinkController;repaintCount=0;pendingTrailingRepaint=!1;burstActive=!1;committing=!1;hasCommitted=!1;committedBand=[];committedBandTopRow=0;committedBandBottomRow=0;lastMeasuredFrameTop=0;committedBandPaintedRows=0;bandReflowCache=null;lastKnownRows=0;pendingResizeErase=null;bandGeometryStale=!1;commitInFlight=!1;debugCompositor=!!v.AFK_DEBUG_COMPOSITOR;ghostEngine;ghostGetContext;activeGhost=null;debugLog(t,n={}){if(!this.debugCompositor)return;let r=process.hrtime.bigint(),o=Object.entries(n).map(([i,s])=>{let a=typeof s=="string"?JSON.stringify(s.length>60?s.slice(0,57)+"...":s):String(s);return`${i}=${a}`}).join(" ");process.stderr.write(`[compositor] t=${r} ${t}${o?" "+o:""}
1585
- `)}constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.onSoftStop=t.onSoftStop,this.onBackground=t.onBackground,this.onPauseInterrupt=t.onPauseInterrupt,this.onShiftTab=t.onShiftTab,this.onOpenEditor=t.onOpenEditor;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+p.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.spinnerController=new Eh({captureMode:t.captureMode??!1,goblin:t.goblinSpinner??!1,onTick:()=>this.repaint()}),this.caretBlinkController=new xh({enabled:t.caretBlink??!1,captureMode:t.captureMode??!1,intervalMs:t.caretBlinkIntervalMs??530,onTick:()=>this.repaint()}),this.onSubmit=t.onSubmit,this.anchorRow=t.anchorRow,this.declaredAnchorRow=t.anchorRow,this.ghostEngine=t.suggest?.engine,this.ghostGetContext=t.suggest?.getContext}isArmed(){return this.armed}setAnchorRow(t){this.anchorRow=t,this.declaredAnchorRow=t}suspendInput(){XB(this)}resumeInput(){QB(this)}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnRewindRequest(t){this.onRewindRequest=t??void 0}setOnOpenEditor(t){this.onOpenEditor=t??void 0}enterPickerMode(t){$B(this,t)}exitPickerMode(){DB(this)}repaintPicker(){FB(this)}setInputMode(t){this.flushPendingRepaint(),LB(this,t)}getInputMode(){return NB(this)}async arm(){return ZB(this)}disarm(){eU(this)}setOverlay(t){t!==this.overlay&&(this.debugLog("setOverlay",{framesLen:t.length,anchorRow:this.anchorRow??null}),this.overlay=t,this.repaint())}setSpinner(t){this.stdout.isTTY&&this.spinnerController.set(t)}commitAbove(t){this.flushPendingRepaint(),_B(this,t)}clearCommittedBand(){Yd(this)}flushResizeGhostErase(){PB(this)}resetCommittedBand(){IB(this)}repositionCommittedBand(t,n,r){MB(this,t,n,r)}getBuffer(){return oB(this)}getPendingCount(){return this.pendingSubmissions.length}getAttachments(){return[...this.attachments]}get caretVisible(){return this.caretBlinkController.visible}renderInputLine(){return xB(this)}updateAutocomplete(){Ih(this)}updateGhost(){vB(this)}renderDropdownRows(){return RB(this)}renderHintRow(){return AB(this)}repaint(){this.repaintCount++,this.pendingTrailingRepaint=!1,Dh(this)}scheduleRepaint(){if(this.repaintCount++,!this.burstActive){this.burstActive=!0,this.pendingTrailingRepaint=!1,Dh(this),queueMicrotask(()=>{this.burstActive=!1,this.flushPendingRepaint()});return}this.pendingTrailingRepaint=!0}flushPendingRepaint(){this.pendingTrailingRepaint&&(this.pendingTrailingRepaint=!1,this.armed&&Dh(this))}clearScreen(){this.logUpdate?.resetGeometry?.(),this.stdout.write("\x1B[H\x1B[2J"),this.repaint()}resetState(){tU(this)}applyEdit(t){return WB(this,t)}prefillInput(t){this.applyEdit(J.seed(t))}applyDropdownSelection(){return kB(this)}applyGhostAccept(){return TB(this)}};G();import jT from"chalk";var Uoe=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,joe=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,Hoe=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,nU={mint:p.mint};function Woe(e){let t=nU[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=nU[r];if(o)return o}return null}var rU=null,oU=null,iU=null,sU=null,aU="";function Bo(e,t){if(jT.level===0)return e;let n=t.version?.(),r=n!==void 0;if(r&&sU===t&&rU===e&&oU===jT.level&&iU===n)return aU;let s=e.replace(Uoe,a=>{let l=a.slice(1);return t.has(l)?(Woe(l)??p.brand)(a):p.meta(a)}).replace(joe,a=>p.fileRef(a)).replace(Hoe,a=>p.meta(a));return r&&(sU=t,rU=e,oU=jT.level,iU=n,aU=s),s}G();import{pathToFileURL as Koe}from"node:url";var Goe="\x1B]8;;\x1B\\",qoe=new Set(["iterm2","wezterm","kitty","vscode","ghostty","windows-terminal","konsole","gnome-terminal","alacritty"]),zoe=5e3;function Joe(e=process.env,t=process.stdout.isTTY===!0){let n=e.FORCE_HYPERLINK;if(n!==void 0&&n.length>0)return n!=="0"&&n.toLowerCase()!=="false";if(!t||e.CI!==void 0&&e.CI.length>0)return!1;let r=Wi(e);if(!qoe.has(r))return!1;if(r==="gnome-terminal"&&e.VTE_VERSION!==void 0){let o=Number.parseInt(e.VTE_VERSION,10);if(!Number.isFinite(o)||o<zoe)return!1}return!0}var HT;function Lh(){return HT===void 0&&(HT=Joe()),HT}function Yoe(e,t){return`\x1B]8;;${t}\x1B\\${e}${Goe}`}function Nh(e,t){try{return Yoe(e,Koe(t).href)}catch{return e}}function tu(e){let t=/[a-z][a-z0-9+.-]*:\/\/[^\s<>\"`]+/gi,n="",r=0;for(let o of e.matchAll(t)){let i=o[0]??"",s=o.index??r;n+=lU(e.slice(r,s)),n+=i,r=s+i.length}return n+=lU(e.slice(r)),n}function lU(e){let t=Lh();return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,(n,r)=>t?Nh(r,n):r)}function Voe(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}var cU=60;function WT(e,t){let n=e.trim().replace(/^\((.*)\)$/s,"$1"),r;try{r=JSON.parse(n)}catch{return e}if(!r||typeof r!="object")return e;let o=r;for(let i of t){let s=o[i];if(typeof s=="string"&&s.length>0){let a=De(s);if(a.length===0)continue;return`(${a.length>cU?ae(a,cU,"\u2026"):a})`}}return e}function dU(e,t){if(e==="bash"||e==="Bash")return Voe(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,i=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let s=`${o} node${o===1?"":"s"}`,a=i>0?`, ${i} edge${i===1?"":"s"}`:"";return`(${s}${a})`}}}catch{}}return e==="agent"||e==="Agent"?WT(t,["id_prefix","prompt"]):e==="Task"?WT(t,["description","prompt"]):e==="skill"||e==="Skill"?WT(t,["name","arguments"]):e==="ask_question"?Xoe(t):t}function Xoe(e){let t=e.trim().replace(/^\((.*)\)$/s,"$1");try{let n=JSON.parse(t);if(!n||typeof n!="object")return e;let r=n,o=typeof r.type=="string"?r.type:"text";if(o==="choice"||o==="multi_choice"){let i=r.choices,s=Array.isArray(i)?i.length:0;return s>0?`(${o}: ${s} option${s===1?"":"s"})`:`(${o})`}return`(${o})`}catch{return e}}function Qoe(e){return e.replace(/[\r\n]+/g," ")}var Zoe={"(":")","{":"}","[":"]"};function uU(e,t,n="\u2026"){let r=e.charAt(0),o=Zoe[r];return!(o&&e.endsWith(o)&&e.length>=2)||X(e)<=t?ae(e,t,n):t<3?t>=2?r+o:ae(e,t,n):ae(e,t-1,n)+o}function Hr(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=tu(dU(r,n[2]??"")),i=or(r),{color:s,glyph:a}=za(r),l=Dv(i),c=l?` [${l}]`:"";if(t!==void 0){let u=(a+" ").length+r.length+c.length,m=Math.max(1,t-u);o=uU(o,m)}o=Qoe(o);let d=s(a+" ")+s.bold(r)+p.toolArg(o);return l?d+p.dim(c):d}return p.chrome("\u25CF ")+p.toolArg(e)}G();var pU=8,Bh=30;function eie(){let e=v.AFK_DIFF_LINES;if(e===void 0)return Bh;let t=e.trim();if(!/^\d+$/.test(t))return Bh;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Bh}function tie(){let e=v.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}function nie(e){let t=p.diffAdd(`+${e.addedLines}`),n=p.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=p.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var rie=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function oie(e){let t=Ie(e.text).replace(rie,"");return e.kind==="+"?p.diffAdd("+ "+t):e.kind==="-"?p.diffRemove("- "+t):p.dim(" "+t)}var GT=new WeakMap;function Wr(e,t,n){if(tie())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?pU:eie(),o=t+"|"+n+"|"+r,i=GT.get(e);if(i!==void 0){let f=i.get(o);if(f!==void 0)return f}let s=[];s.push(n+nie(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:p.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:oie(h)})}if(r===0){for(let f of a)s.push(n+f.text);return KT(e,o,s),s}let l=0;for(let f of a)f.kind==="body"&&l++;if(l<=r){for(let f of a)s.push(n+f.text);return KT(e,o,s),s}let c=0;for(let f of a)f.kind==="header"?s.push(n+f.text):c<r&&(s.push(n+f.text),c++);let d=l-r,u=`line${d===1?"":"s"}`,m=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return s.push(n+p.dim(`\u2026 +${d} more diff ${u}${m}`)),KT(e,o,s),s}function KT(e,t,n){let r=GT.get(e);r===void 0&&(r=new Map,GT.set(e,r)),r.set(t,n)}function Uo(e){return e?p.error("\u2717"):p.success("\u2713")}var nu=3,mU=2,fU=3;function gU(e){switch(or(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function iie(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function Kr(e,t,n=60,r){let o=e.isError?p.error:p.dim,i=t??v.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(i)?"~"+e.persistedPath.slice(i.length):e.persistedPath,l=Lh()?Nh(a,e.persistedPath):a;return o(`saved \u2192 ${l}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${iie(r,e.lineCount)}`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(De(s))}function ml(e){return!e||typeof e.batchSize!="number"||typeof e.batchIndex!="number"||e.batchSize<=1?"":p.dim(` \u2225${e.batchIndex}/${e.batchSize}`)}G();function ru(e,t){if(e.length<=t)return e;let n=e.length-t,r=e.slice(0,n),o=e.slice(n),i=yU(r);return[{kind:"overflow",count:r.length,text:i},...o]}function sie(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var aie=5,hU=60;function yU(e){let t=new Map,n=0;for(let i of e)i.kind==="group"?(t.set(i.toolName,(t.get(i.toolName)??0)+i.entries.length),n+=i.entries.length):(t.set(i.toolName,(t.get(i.toolName)??0)+1),n+=1);if(n===0)return"";if(e.length>0&&e.every(i=>Je.has(i.toolName))&&new Set(e.map(i=>i.toolName)).size===1){let i=[],s=!1;for(let a of e){let c=(a.kind==="group"?a.label:a.toolInput).trim();if(!c.startsWith("(")||!c.endsWith(")")){s=!0;break}let d=c.slice(1,-1),u=De(d);if(!u){s=!0;break}let m=u.length>hU?u.slice(0,hU-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;i.push({display:m,entries:f})}if(!s&&i.length>0){let a=i.slice(0,aie),l=a.map(({display:m,entries:f})=>f>1?`${m} \xD7${f}`:m),c=a.reduce((m,f)=>m+f.entries,0),d=n-c,u=l.join(", ")+(d>0?` (+${d})`:"");return`\u2026 +${n} more: ${u}`}}let o=[];for(let[i,s]of t)o.push(`${s} ${sie(i,s)}`);return`\u2026 +${n} (${o.join(", ")})`}function Uh(e,t=$n()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function qT(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function zT(e){if(e.length===0)return[];let t=new Map;for(let o of e){let i=bU(o),s=t.get(i);s||(s=[],t.set(i,s)),s.push(o)}let n=[],r=new Set;for(let o of e){let i=bU(o),s=t.get(i);s.length>=lie(o.toolName)?r.has(i)||(n.push({kind:"group",toolName:o.toolName,label:Je.has(o.toolName)?o.toolInput:"",entries:s}),r.add(i)):n.push(o)}return n}function JT(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,i;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),i=l.join(", ")}else o===t?i=`${t} done`:o===0?i=`${t} running`:i=`${o}/${t} done`;return Hr(e.toolName+e.label)+p.dim(` \xD7${t} \u2014 ${i}`)}function bU(e){return Je.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function lie(e){return Je.has(e)?mU:fU}function wU(e,t,n,r){return e>0||t?fl([...n,!0],r):fl(n,r)}function SU(e,t){return!Je.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&SU(r,t))}function jh(e,t,n,r=ne(),o=[],i=$n(),s){let a=fl(o,i),l=ou(a,i),c=e.filter(h=>h.kind==="text"),d=e.filter(h=>h.kind==="tool").filter(h=>!SU(h,t)),u=zT(d),m=ru(u,nu),f=Uh(m,i);for(let{sibling:h,connector:y}of f){let b=p.dim(y),w=y===i.lastConnector;if(h.kind==="overflow")n.push(Me(l+b+p.dim(h.text),r));else if(h.kind==="group")n.push(Me(l+b+JT(h),r));else if(h.kind==="resultSummary")n.push(Me(l+b+h.summary,r));else{let S=h,T=t.get(S.toolUseId);if(Je.has(S.toolName)&&T&&T.length>0){S.headerEmitted?n.push(Me(l+b,r)):n.push(Me(l+b+S.prefix,r));let k=s??w;if(jh(T,t,n,r,[...o,k],i,w),S.thinkingTail){let A=ou(fl([...o,k],i),i);n.push(Me(A+p.thinking("\u2307 "+De(S.thinkingTail)),r))}}else if(!(Je.has(S.toolName)&&S.headerEmitted))if(S.result){if(n.push(Me(l+b+S.prefix+p.dim(" \u2014 ")+Uo(S.result.isError)+" "+Kr(S.result,void 0,60,S.toolName),r)),S.diff&&!S.result.isError){let k=l+(w?i.spineClosed:p.dim(i.spine))+" ";for(let A of Wr(S.diff,"overlay",k))n.push(Me(A,r))}}else{n.push(Me(l+b+S.prefix,r));let k=l+(w?i.spineClosed:p.dim(i.spine))+" ";S.thinkingTail?n.push(Me(k+p.thinking("\u2307 "+De(S.thinkingTail)),r)):n.push(Me(k+p.dim(gU(S.toolName)),r))}}}let g=wU(d.length,!1,o,i);for(let h of c)for(let y of YT(h.text,g,i))n.push(Me(y,r))}function iu(e,t,n,r,o=ne(),i=[],s=$n(),a){let l=fl(i,s),c=ou(l,s),d=[],u=e.filter(w=>w.kind==="text"),m=e.filter(w=>w.kind==="tool"),f=zT(m),g=ru(f,nu),h=qT(g,r),y=Uh(h,s);for(let{sibling:w,connector:S}of y){let T=p.dim(S),k=S===s.lastConnector;if(w.kind==="overflow")d.push(Me(c+T+p.dim(w.text),o));else if(w.kind==="resultSummary")d.push(Me(c+T+w.summary,o));else if(w.kind==="group")d.push(Me(c+T+JT(w),o));else{let A=w,F=t.get(A.toolUseId);if(Je.has(A.toolName)&&F&&F.length>0){if(A.headerEmitted){let D=A.toolInput?`${A.toolName} ${De(A.toolInput)}`:A.toolName;d.push(Me(c+T+p.dim("\u21B3 "+D),o))}else d.push(Me(c+T+A.prefix,o));let R=a??k;d.push(...iu(F,t,n,void 0,o,[...i,R],s,k))}else if(A.result){if(d.push(Me(c+T+A.prefix+p.dim(" \u2014 ")+Uo(A.result.isError)+" "+Kr(A.result,n,60,A.toolName),o)),A.diff&&!A.result.isError){let R=c+(k?s.spineClosed:p.dim(s.spine))+" ";for(let D of Wr(A.diff,"flush",R))d.push(Me(D,o))}}else d.push(Me(c+T+A.prefix,o))}}let b=wU(m.length,r!=null,i,s);for(let w of u)for(let S of YT(w.text,b,s))d.push(Me(S,o));return d}function vU(e){return e.agentResultSummary?p.dim(e.agentResultSummary)+ml(e.result):e.agentResultSummary}function su(e,t,n,r,o=[]){let i=$n(),s=t.filter(h=>h.kind==="tool"),l=s.filter(h=>h.result).reduce((h,y)=>h+(y.result.lineCount??0),0),c=[];s.length>nu&&(c.push(Ba(s.length)),l>0&&c.push(`${l} lines`));let d=p.dim(i.spine.repeat(o.length)),u=o,m=p.dim(i.turnRoot),f=c.length>0?d+m+e.prefix+p.dim(" \u2014 "+c.join(" \xB7 ")):d+m+e.prefix,g=iu(t,n,r,vU(e),ne(),u,i);return[f,...g].join(`
1586
- `)}function VT(e,t=[]){let n=$n(),r=p.dim(n.spine.repeat(t.length)),o=p.dim(n.turnRoot);return r+o+e.prefix}function au(e,t,n,r,o=[]){let i=$n(),s=o;return iu(t,n,r,vU(e),ne(),s,i)}function gl(e,t,n){let r=[],o=ne();for(let i of t){let s=e.get(i);if(s.length===1){let a=s[0];if(a.result){if(r.push(" "+a.prefix+p.dim(" \u2014 ")+Uo(a.result.isError)+" "+Kr(a.result,n,60,a.toolName)+ml(a.result)),a.diff&&!a.result.isError)for(let l of Wr(a.diff,"flush"," "))r.push(Me(l,o))}else r.push(" "+a.prefix)}else{r.push(kU(i,s,n));let a=s.filter(c=>c.diff&&c.result&&!c.result.isError),l=a.length>1;for(let c of a){if(l){let d=De(c.toolInput),u=tu(d).trim()||d.trim();r.push(" "+p.dim(`\u2500\u2500 ${u} \u2500\u2500`))}for(let d of Wr(c.diff,"flush"," "))r.push(Me(d,o))}}}return r}function kU(e,t,n){let{color:r,glyph:o}=za(e),i=t.map(d=>tu(De(d.toolInput)).trim()),s=r(o+" ")+r.bold(e)+p.dim(` \xD7${t.length}`)+" "+p.toolArg(i.join(", ")),a=t.filter(d=>d.result),l=a.filter(d=>d.result.isError);if(l.length>0){let d=a.length-l.length,m=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return m>0&&f.push(`${m} lines`),d>0&&f.push(`${d} ok`),f.push(p.error(`${l.length} error${l.length>1?"s":""}`))," "+s+p.dim(" \u2014 ")+f.join(p.dim(", "))}let c=a.map(d=>d.result?.lineCount).filter(d=>d!==void 0);if(c.length===a.length&&c.length>0){if(c.every(m=>m===c[0]))return" "+s+p.dim(` \u2014 ${c[0]} lines each`);let u=c.reduce((m,f)=>m+f,0);return" "+s+p.dim(` \u2014 ${u} lines total`)}if(a.length>0){let d=a.map(u=>Kr(u.result,n,60,u.toolName));return" "+s+p.dim(" \u2014 ")+d.join(p.dim(", "))}return" "+s}function Me(e,t){return ae(e,t)}var XT=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),cie=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),BJe=XT.midConnector,UJe=XT.lastConnector;function $n(){let e=v.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?cie:XT}function fl(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function ou(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?p.dim(o):o}return n}function YT(e,t,n){if(!e||!e.trim())return[];let r=p.dim(n.textPrefix),o=Math.max(1,ne()-t.length-2-2),i=ou(t,n),s=[];for(let a of e.split(`
1585
+ `)}constructor(t){this.stdout=t.stdout,this.stdin=t.stdin,this.onCancel=t.onCancel,this.onSoftStop=t.onSoftStop,this.onBackground=t.onBackground,this.onPauseInterrupt=t.onPauseInterrupt,this.onShiftTab=t.onShiftTab,this.onOpenEditor=t.onOpenEditor;let n=t.promptText;if(typeof n=="function")this.promptTextFn=n;else if(typeof n=="string")this.promptTextFn=()=>n;else{let r=" "+p.dim("\u23AF")+" ";this.promptTextFn=()=>r}this.history=t.history,this.autocompleteState=t.autocompleteState,this.formatInputBuffer=t.formatInputBuffer,this.scrollRegion=t.scrollRegion,this.spinnerController=new Eh({captureMode:t.captureMode??!1,goblin:t.goblinSpinner??!1,onTick:()=>this.repaint()}),this.caretBlinkController=new xh({enabled:t.caretBlink??!1,captureMode:t.captureMode??!1,intervalMs:t.caretBlinkIntervalMs??530,onTick:()=>this.repaint()}),this.onSubmit=t.onSubmit,this.anchorRow=t.anchorRow,this.declaredAnchorRow=t.anchorRow,this.ghostEngine=t.suggest?.engine,this.ghostGetContext=t.suggest?.getContext}isArmed(){return this.armed}setAnchorRow(t){this.anchorRow=t,this.declaredAnchorRow=t}suspendInput(){XB(this)}resumeInput(){QB(this)}setOnSubmit(t){this.onSubmit=t??void 0}setOnCancel(t){this.onCancel=t??void 0}getOnCancel(){return this.onCancel}setOnRewindRequest(t){this.onRewindRequest=t??void 0}setOnOpenEditor(t){this.onOpenEditor=t??void 0}enterPickerMode(t){$B(this,t)}exitPickerMode(){DB(this)}repaintPicker(){FB(this)}setInputMode(t){this.flushPendingRepaint(),LB(this,t)}getInputMode(){return NB(this)}async arm(){return ZB(this)}disarm(){eU(this)}setOverlay(t){t!==this.overlay&&(this.debugLog("setOverlay",{framesLen:t.length,anchorRow:this.anchorRow??null}),this.overlay=t,this.repaint())}setSpinner(t){this.stdout.isTTY&&this.spinnerController.set(t)}commitAbove(t){this.flushPendingRepaint(),_B(this,t)}clearCommittedBand(){Yd(this)}flushResizeGhostErase(){PB(this)}resetCommittedBand(){IB(this)}repositionCommittedBand(t,n,r){MB(this,t,n,r)}getBuffer(){return oB(this)}getPendingCount(){return this.pendingSubmissions.length}getAttachments(){return[...this.attachments]}get caretVisible(){return this.caretBlinkController.visible}renderInputLine(){return xB(this)}updateAutocomplete(){Ih(this)}updateGhost(){vB(this)}renderDropdownRows(){return RB(this)}renderHintRow(){return AB(this)}repaint(){this.repaintCount++,this.pendingTrailingRepaint=!1,Dh(this)}scheduleRepaint(){if(this.repaintCount++,!this.burstActive){this.burstActive=!0,this.pendingTrailingRepaint=!1,Dh(this),queueMicrotask(()=>{this.burstActive=!1,this.flushPendingRepaint()});return}this.pendingTrailingRepaint=!0}flushPendingRepaint(){this.pendingTrailingRepaint&&(this.pendingTrailingRepaint=!1,this.armed&&Dh(this))}clearScreen(){this.logUpdate?.resetGeometry?.(),this.stdout.write("\x1B[H\x1B[2J"),this.repaint()}resetState(){tU(this)}applyEdit(t){return WB(this,t)}prefillInput(t){this.applyEdit(J.seed(t))}applyDropdownSelection(){return kB(this)}applyGhostAccept(){return TB(this)}};G();import jT from"chalk";var Uoe=/(?<=\s|^)(\/[A-Za-z][\w:-]*)(?=\s|$)/g,joe=/(?<=\s|^)(@[~\w./-]*)(?=\s|$)/g,Hoe=/\[Pasted text #[0-9a-f]+ \+\d+ (?:lines|chars)\]/g,nU={mint:p.mint};function Woe(e){let t=nU[e];if(t)return t;let n=e.lastIndexOf(":");if(n>=0){let r=e.slice(n+1),o=nU[r];if(o)return o}return null}var rU=null,oU=null,iU=null,sU=null,aU="";function Bo(e,t){if(jT.level===0)return e;let n=t.version?.(),r=n!==void 0;if(r&&sU===t&&rU===e&&oU===jT.level&&iU===n)return aU;let s=e.replace(Uoe,a=>{let l=a.slice(1);return t.has(l)?(Woe(l)??p.brand)(a):p.meta(a)}).replace(joe,a=>p.fileRef(a)).replace(Hoe,a=>p.meta(a));return r&&(sU=t,rU=e,oU=jT.level,iU=n,aU=s),s}G();import{pathToFileURL as Koe}from"node:url";var Goe="\x1B]8;;\x1B\\",qoe=new Set(["iterm2","wezterm","kitty","vscode","ghostty","windows-terminal","konsole","gnome-terminal","alacritty"]),zoe=5e3;function Joe(e=process.env,t=process.stdout.isTTY===!0){let n=e.FORCE_HYPERLINK;if(n!==void 0&&n.length>0)return n!=="0"&&n.toLowerCase()!=="false";if(!t||e.CI!==void 0&&e.CI.length>0)return!1;let r=Wi(e);if(!qoe.has(r))return!1;if(r==="gnome-terminal"&&e.VTE_VERSION!==void 0){let o=Number.parseInt(e.VTE_VERSION,10);if(!Number.isFinite(o)||o<zoe)return!1}return!0}var HT;function Lh(){return HT===void 0&&(HT=Joe()),HT}function Yoe(e,t){return`\x1B]8;;${t}\x1B\\${e}${Goe}`}function Nh(e,t){try{return Yoe(e,Koe(t).href)}catch{return e}}function tu(e){let t=/[a-z][a-z0-9+.-]*:\/\/[^\s<>\"`]+/gi,n="",r=0;for(let o of e.matchAll(t)){let i=o[0]??"",s=o.index??r;n+=lU(e.slice(r,s)),n+=i,r=s+i.length}return n+=lU(e.slice(r)),n}function lU(e){let t=Lh();return e.replace(/\/(?:[^/\s,)]+\/){2,}([^/\s,)]+)/g,(n,r)=>t?Nh(r,n):r)}function Voe(e){let t=/^(\s*[("]?\s*)cd\s+\S+\s+&&\s+(?!cd\s)(.+)$/.exec(e);return t?(t[1]??"")+(t[2]??""):e}var cU=60;function WT(e,t){let n=e.trim().replace(/^\((.*)\)$/s,"$1"),r;try{r=JSON.parse(n)}catch{return e}if(!r||typeof r!="object")return e;let o=r;for(let i of t){let s=o[i];if(typeof s=="string"&&s.length>0){let a=De(s);if(a.length===0)continue;return`(${a.length>cU?ae(a,cU,"\u2026"):a})`}}return e}function dU(e,t){if(e==="bash"||e==="Bash")return Voe(t);if(e==="compose"||e==="Compose"){let n=t.trim().replace(/^\((.*)\)$/s,"$1");try{let r=JSON.parse(n);if(r&&typeof r=="object"){let o=Array.isArray(r.nodes)?r.nodes.length:void 0,i=Array.isArray(r.edges)?r.edges.length:0;if(o!==void 0){let s=`${o} node${o===1?"":"s"}`,a=i>0?`, ${i} edge${i===1?"":"s"}`:"";return`(${s}${a})`}}}catch{}}return e==="agent"||e==="Agent"?WT(t,["id_prefix","prompt"]):e==="Task"?WT(t,["description","prompt"]):e==="skill"||e==="Skill"?WT(t,["name","arguments"]):e==="ask_question"?Xoe(t):t}function Xoe(e){let t=e.trim().replace(/^\((.*)\)$/s,"$1");try{let n=JSON.parse(t);if(!n||typeof n!="object")return e;let r=n,o=typeof r.type=="string"?r.type:"text";if(o==="choice"||o==="multi_choice"){let i=r.choices,s=Array.isArray(i)?i.length:0;return s>0?`(${o}: ${s} option${s===1?"":"s"})`:`(${o})`}return`(${o})`}catch{return e}}function Qoe(e){return e.replace(/[\r\n]+/g," ")}var Zoe={"(":")","{":"}","[":"]"};function uU(e,t,n="\u2026"){let r=e.charAt(0),o=Zoe[r];return!(o&&e.endsWith(o)&&e.length>=2)||X(e)<=t?ae(e,t,n):t<3?t>=2?r+o:ae(e,t,n):ae(e,t-1,n)+o}function Hr(e,t){let n=/^([A-Za-z_][A-Za-z0-9_]*)(.*)$/s.exec(e);if(n){let r=n[1],o=tu(dU(r,n[2]??"")),i=or(r),{color:s,glyph:a}=za(r),l=Dv(i),c=l?` [${l}]`:"";if(t!==void 0){let u=(a+" ").length+r.length+c.length,m=Math.max(1,t-u);o=uU(o,m)}o=Qoe(o);let d=s(a+" ")+s.bold(r)+p.toolArg(o);return l?d+p.dim(c):d}return p.chrome("\u25CF ")+p.toolArg(e)}G();var pU=8,Bh=30;function eie(){let e=v.AFK_DIFF_LINES;if(e===void 0)return Bh;let t=e.trim();if(!/^\d+$/.test(t))return Bh;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:Bh}function tie(){let e=v.AFK_SHOW_DIFFS;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"}function nie(e){let t=p.diffAdd(`+${e.addedLines}`),n=p.diffRemove(`-${e.removedLines}`),r=e.hunks.length,o=p.dim(`across ${r} hunk${r===1?"":"s"}`);return`${t} ${n} ${o}`}var rie=/[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;function oie(e){let t=Ie(e.text).replace(rie,"");return e.kind==="+"?p.diffAdd("+ "+t):e.kind==="-"?p.diffRemove("- "+t):p.dim(" "+t)}var GT=new WeakMap;function Wr(e,t,n){if(tie())return[];if(e.hunks.length===0)return[];let r=t==="overlay"?pU:eie(),o=t+"|"+n+"|"+r,i=GT.get(e);if(i!==void 0){let f=i.get(o);if(f!==void 0)return f}let s=[];s.push(n+nie(e));let a=[];for(let f of e.hunks){let g=`@@ -${f.oldStart},${f.oldLines} +${f.newStart},${f.newLines} @@`;a.push({kind:"header",text:p.diffHunk(g)});for(let h of f.lines)a.push({kind:"body",text:oie(h)})}if(r===0){for(let f of a)s.push(n+f.text);return KT(e,o,s),s}let l=0;for(let f of a)f.kind==="body"&&l++;if(l<=r){for(let f of a)s.push(n+f.text);return KT(e,o,s),s}let c=0;for(let f of a)f.kind==="header"?s.push(n+f.text):c<r&&(s.push(n+f.text),c++);let d=l-r,u=`line${d===1?"":"s"}`,m=t==="flush"?" (set AFK_DIFF_LINES=0 to expand)":"";return s.push(n+p.dim(`\u2026 +${d} more diff ${u}${m}`)),KT(e,o,s),s}function KT(e,t,n){let r=GT.get(e);r===void 0&&(r=new Map,GT.set(e,r)),r.set(t,n)}function Uo(e){return e?p.error("\u2717"):p.success("\u2713")}var nu=3,mU=2,fU=3;function gU(e){switch(or(e)){case"read":return"Reading\u2026";case"write":return"Writing\u2026";case"web":return"Fetching\u2026";case"shell":return"Running\u2026";default:return"Running\u2026"}}function iie(e,t){return e?e==="grep"||e==="Grep"?t===1?"match":"matches":e==="glob"||e==="Glob"?t===1?"path":"paths":t===1?"line":"lines":t===1?"line":"lines"}function Kr(e,t,n=60,r){let o=e.isError?p.error:p.dim,i=t??v.HOME??"___NOHOME___";if(e.display!==void 0&&!e.isError)return o(e.display);if(e.persistedPath){let a=e.persistedPath.startsWith(i)?"~"+e.persistedPath.slice(i.length):e.persistedPath,l=Lh()?Nh(a,e.persistedPath):a;return o(`saved \u2192 ${l}`)}if(e.lineCount!==void 0&&e.lineCount>1)return o(`${e.lineCount} ${iie(r,e.lineCount)}`);let s=e.content.length>n?e.content.slice(0,n-3)+"\u2026":e.content;return o(De(s))}function ml(e){return!e||typeof e.batchSize!="number"||typeof e.batchIndex!="number"||e.batchSize<=1?"":p.dim(` \u2225${e.batchIndex}/${e.batchSize}`)}G();function ru(e,t){if(e.length<=t)return e;let n=e.length-t,r=e.slice(0,n),o=e.slice(n),i=yU(r);return[{kind:"overflow",count:r.length,text:i},...o]}function sie(e,t){return t<=1||e.endsWith("s")||/(sh|ch|x|z)$/i.test(e)?e:e+"s"}var aie=5,hU=60;function yU(e){let t=new Map,n=0;for(let i of e)i.kind==="group"?(t.set(i.toolName,(t.get(i.toolName)??0)+i.entries.length),n+=i.entries.length):(t.set(i.toolName,(t.get(i.toolName)??0)+1),n+=1);if(n===0)return"";if(e.length>0&&e.every(i=>Je.has(i.toolName))&&new Set(e.map(i=>i.toolName)).size===1){let i=[],s=!1;for(let a of e){let c=(a.kind==="group"?a.label:a.toolInput).trim();if(!c.startsWith("(")||!c.endsWith(")")){s=!0;break}let d=c.slice(1,-1),u=De(d);if(!u){s=!0;break}let m=u.length>hU?u.slice(0,hU-1)+"\u2026":u,f=a.kind==="group"?a.entries.length:1;i.push({display:m,entries:f})}if(!s&&i.length>0){let a=i.slice(0,aie),l=a.map(({display:m,entries:f})=>f>1?`${m} \xD7${f}`:m),c=a.reduce((m,f)=>m+f.entries,0),d=n-c,u=l.join(", ")+(d>0?` (+${d})`:"");return`\u2026 +${n} more: ${u}`}}let o=[];for(let[i,s]of t)o.push(`${s} ${sie(i,s)}`);return`\u2026 +${n} (${o.join(", ")})`}function Uh(e,t=$n()){return e.map((n,r)=>({sibling:n,connector:r===e.length-1?t.lastConnector:t.midConnector}))}function qT(e,t){return t?[...e,{kind:"resultSummary",summary:t}]:e}function zT(e){if(e.length===0)return[];let t=new Map;for(let o of e){let i=bU(o),s=t.get(i);s||(s=[],t.set(i,s)),s.push(o)}let n=[],r=new Set;for(let o of e){let i=bU(o),s=t.get(i);s.length>=lie(o.toolName)?r.has(i)||(n.push({kind:"group",toolName:o.toolName,label:Je.has(o.toolName)?o.toolInput:"",entries:s}),r.add(i)):n.push(o)}return n}function JT(e){let t=e.entries.length,n=e.entries.filter(a=>a.result),r=n.filter(a=>a.result.isError),o=n.length,i;if(r.length>0){let a=o-r.length,l=[];a>0&&l.push(`${a} ok`),l.push(`${r.length} error${r.length===1?"":"s"}`),i=l.join(", ")}else o===t?i=`${t} done`:o===0?i=`${t} running`:i=`${o}/${t} done`;return Hr(e.toolName+e.label)+p.dim(` \xD7${t} \u2014 ${i}`)}function bU(e){return Je.has(e.toolName)?e.toolName+"::"+e.toolInput:e.toolName}function lie(e){return Je.has(e)?mU:fU}function wU(e,t,n,r){return e>0||t?fl([...n,!0],r):fl(n,r)}function SU(e,t){return!Je.has(e.toolName)||e.headerEmitted!==!0?!1:(t.get(e.toolUseId)??[]).every(r=>r.kind==="tool"&&SU(r,t))}function jh(e,t,n,r=Q(),o=[],i=$n(),s){let a=fl(o,i),l=ou(a,i),c=e.filter(h=>h.kind==="text"),d=e.filter(h=>h.kind==="tool").filter(h=>!SU(h,t)),u=zT(d),m=ru(u,nu),f=Uh(m,i);for(let{sibling:h,connector:y}of f){let b=p.dim(y),w=y===i.lastConnector;if(h.kind==="overflow")n.push(Me(l+b+p.dim(h.text),r));else if(h.kind==="group")n.push(Me(l+b+JT(h),r));else if(h.kind==="resultSummary")n.push(Me(l+b+h.summary,r));else{let S=h,T=t.get(S.toolUseId);if(Je.has(S.toolName)&&T&&T.length>0){S.headerEmitted?n.push(Me(l+b,r)):n.push(Me(l+b+S.prefix,r));let k=s??w;if(jh(T,t,n,r,[...o,k],i,w),S.thinkingTail){let A=ou(fl([...o,k],i),i);n.push(Me(A+p.thinking("\u2307 "+De(S.thinkingTail)),r))}}else if(!(Je.has(S.toolName)&&S.headerEmitted))if(S.result){if(n.push(Me(l+b+S.prefix+p.dim(" \u2014 ")+Uo(S.result.isError)+" "+Kr(S.result,void 0,60,S.toolName),r)),S.diff&&!S.result.isError){let k=l+(w?i.spineClosed:p.dim(i.spine))+" ";for(let A of Wr(S.diff,"overlay",k))n.push(Me(A,r))}}else{n.push(Me(l+b+S.prefix,r));let k=l+(w?i.spineClosed:p.dim(i.spine))+" ";S.thinkingTail?n.push(Me(k+p.thinking("\u2307 "+De(S.thinkingTail)),r)):n.push(Me(k+p.dim(gU(S.toolName)),r))}}}let g=wU(d.length,!1,o,i);for(let h of c)for(let y of YT(h.text,g,i))n.push(Me(y,r))}function iu(e,t,n,r,o=Q(),i=[],s=$n(),a){let l=fl(i,s),c=ou(l,s),d=[],u=e.filter(w=>w.kind==="text"),m=e.filter(w=>w.kind==="tool"),f=zT(m),g=ru(f,nu),h=qT(g,r),y=Uh(h,s);for(let{sibling:w,connector:S}of y){let T=p.dim(S),k=S===s.lastConnector;if(w.kind==="overflow")d.push(Me(c+T+p.dim(w.text),o));else if(w.kind==="resultSummary")d.push(Me(c+T+w.summary,o));else if(w.kind==="group")d.push(Me(c+T+JT(w),o));else{let A=w,F=t.get(A.toolUseId);if(Je.has(A.toolName)&&F&&F.length>0){if(A.headerEmitted){let D=A.toolInput?`${A.toolName} ${De(A.toolInput)}`:A.toolName;d.push(Me(c+T+p.dim("\u21B3 "+D),o))}else d.push(Me(c+T+A.prefix,o));let R=a??k;d.push(...iu(F,t,n,void 0,o,[...i,R],s,k))}else if(A.result){if(d.push(Me(c+T+A.prefix+p.dim(" \u2014 ")+Uo(A.result.isError)+" "+Kr(A.result,n,60,A.toolName),o)),A.diff&&!A.result.isError){let R=c+(k?s.spineClosed:p.dim(s.spine))+" ";for(let D of Wr(A.diff,"flush",R))d.push(Me(D,o))}}else d.push(Me(c+T+A.prefix,o))}}let b=wU(m.length,r!=null,i,s);for(let w of u)for(let S of YT(w.text,b,s))d.push(Me(S,o));return d}function vU(e){return e.agentResultSummary?p.dim(e.agentResultSummary)+ml(e.result):e.agentResultSummary}function su(e,t,n,r,o=[]){let i=$n(),s=t.filter(h=>h.kind==="tool"),l=s.filter(h=>h.result).reduce((h,y)=>h+(y.result.lineCount??0),0),c=[];s.length>nu&&(c.push(Ba(s.length)),l>0&&c.push(`${l} lines`));let d=p.dim(i.spine.repeat(o.length)),u=o,m=p.dim(i.turnRoot),f=c.length>0?d+m+e.prefix+p.dim(" \u2014 "+c.join(" \xB7 ")):d+m+e.prefix,g=iu(t,n,r,vU(e),Q(),u,i);return[f,...g].join(`
1586
+ `)}function VT(e,t=[]){let n=$n(),r=p.dim(n.spine.repeat(t.length)),o=p.dim(n.turnRoot);return r+o+e.prefix}function au(e,t,n,r,o=[]){let i=$n(),s=o;return iu(t,n,r,vU(e),Q(),s,i)}function gl(e,t,n){let r=[],o=Q();for(let i of t){let s=e.get(i);if(s.length===1){let a=s[0];if(a.result){if(r.push(" "+a.prefix+p.dim(" \u2014 ")+Uo(a.result.isError)+" "+Kr(a.result,n,60,a.toolName)+ml(a.result)),a.diff&&!a.result.isError)for(let l of Wr(a.diff,"flush"," "))r.push(Me(l,o))}else r.push(" "+a.prefix)}else{r.push(kU(i,s,n));let a=s.filter(c=>c.diff&&c.result&&!c.result.isError),l=a.length>1;for(let c of a){if(l){let d=De(c.toolInput),u=tu(d).trim()||d.trim();r.push(" "+p.dim(`\u2500\u2500 ${u} \u2500\u2500`))}for(let d of Wr(c.diff,"flush"," "))r.push(Me(d,o))}}}return r}function kU(e,t,n){let{color:r,glyph:o}=za(e),i=t.map(d=>tu(De(d.toolInput)).trim()),s=r(o+" ")+r.bold(e)+p.dim(` \xD7${t.length}`)+" "+p.toolArg(i.join(", ")),a=t.filter(d=>d.result),l=a.filter(d=>d.result.isError);if(l.length>0){let d=a.length-l.length,m=a.filter(g=>!g.result.isError).map(g=>g.result.lineCount).filter(g=>g!==void 0).reduce((g,h)=>g+h,0),f=[];return m>0&&f.push(`${m} lines`),d>0&&f.push(`${d} ok`),f.push(p.error(`${l.length} error${l.length>1?"s":""}`))," "+s+p.dim(" \u2014 ")+f.join(p.dim(", "))}let c=a.map(d=>d.result?.lineCount).filter(d=>d!==void 0);if(c.length===a.length&&c.length>0){if(c.every(m=>m===c[0]))return" "+s+p.dim(` \u2014 ${c[0]} lines each`);let u=c.reduce((m,f)=>m+f,0);return" "+s+p.dim(` \u2014 ${u} lines total`)}if(a.length>0){let d=a.map(u=>Kr(u.result,n,60,u.toolName));return" "+s+p.dim(" \u2014 ")+d.join(p.dim(", "))}return" "+s}function Me(e,t){return ae(e,t)}var XT=Object.freeze({spine:"\u2502 ",spineClosed:" ",lead:" ",turnRoot:"\u25C9 ",midConnector:"\u251C\u2500 ",lastConnector:"\u2570\u2500 ",textPrefix:"\u2502 "}),cie=Object.freeze({spine:"| ",spineClosed:" ",lead:" ",turnRoot:"o ",midConnector:"+- ",lastConnector:"\\- ",textPrefix:"| "}),UJe=XT.midConnector,jJe=XT.lastConnector;function $n(){let e=v.AGENT_AFK_ASCII;return e&&/^(1|true|yes)$/i.test(e)?cie:XT}function fl(e,t){let n="";for(let r of e)n+=r?t.spineClosed:t.spine;return n+=t.spine,n}function ou(e,t){let n="";for(let r=0;r<e.length;r+=2){let o=e.slice(r,r+2);n+=o===t.spine?p.dim(o):o}return n}function YT(e,t,n){if(!e||!e.trim())return[];let r=p.dim(n.textPrefix),o=Math.max(1,Q()-t.length-2-2),i=ou(t,n),s=[];for(let a of e.split(`
1587
1587
  `)){let l=tT(a),c=me(l,o);for(let d of c.split(`
1588
- `))s.push(i+r+d)}return s}var TU=6,lu=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=Ie(r),i=Hr(n+o),s=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:o,prefix:i,...s!==void 0?{agentContext:s}:{}};this.entries.set(t,a),this.order.push(t),vo.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,i){let s=Ie(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=s,a.prefix=Hr(n+s,i),o!==void 0&&(a.agentContext=o);return}let l=Hr(n+s,i),c={kind:"tool",toolUseId:t,toolName:n,toolInput:s,prefix:l,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,c),this.order.push(t)}mergeAgentLabel(t,n,r){let o=this.entries.get(t);if(o?.kind!=="tool"||!vo.has(o.toolName)||o.toolName==="Agent")return!1;let s=`(${Ie(n)})`;return o.toolName="Agent",o.toolInput=s,o.prefix=Hr("Agent"+s,r),!0}setAgentContext(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.agentContext:r.agentContext=n)}setAgentResultSummary(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.agentResultSummary=n)}setThinkingTail(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.thinkingTail:r.thinkingTail=n)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}addDiff(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.diff=n)}upsertTextChild(t,n,r){let o=this.entries.get(t);if(o?.kind==="text"){o.text=r,o.agentContext=n;return}let i={kind:"text",toolUseId:t,text:r,agentContext:n};this.entries.set(t,i),this.order.push(t)}removeTextChildrenUnder(t){let n=[];for(let[r,o]of this.entries)o.kind==="text"&&o.agentContext===t&&n.push(r);for(let r of n)this.entries.delete(r);if(n.length>0){let r=new Set(n);this.order=this.order.filter(o=>!r.has(o))}}hasPending(){return this.entries.size>0}hasEntry(t){return this.entries.get(t)?.kind==="tool"}findLastSkillEntryId(){for(let t=this.order.length-1;t>=0;t--){let n=this.order[t],r=this.entries.get(n);if(r?.kind==="tool"&&id.has(r.toolName))return n}}peekTrailingCompletedRootToolName(){for(let t=this.order.length-1;t>=0;t--){let n=this.order[t],r=this.entries.get(n);if(!(!r||r.kind!=="tool")&&!r.agentContext)return r.result===void 0||Je.has(r.toolName)?void 0:r.toolName}}getOverlay(){let t=this.buildChildMap(),n=[],r=$n(),o=ne(),i=u=>ae(u,o),s=[];for(let u of this.order){let m=this.entries.get(u);!m||m.kind!=="tool"||m.agentContext||s.push(m)}let a=s,l=0;if(s.length>TU){let u=s.filter(h=>!h.result),m=s.filter(h=>h.result),f=Math.max(0,TU-u.length),g=new Set(m.slice(-f));l=m.length-g.size,a=s.filter(h=>!h.result||g.has(h))}let d=a.some(u=>Je.has(u.toolName))?p.dim(r.turnRoot):" ";for(let u of a){let m=t.get(u.toolUseId);if(Je.has(u.toolName)&&m&&m.length>0)u.headerEmitted?n.push(i(p.dim(r.turnRoot))):n.push(i(p.dim(r.turnRoot)+u.prefix)),jh(m,t,n,o,void 0,r),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+De(u.thinkingTail))));else if(!(Je.has(u.toolName)&&u.headerEmitted))if(Je.has(u.toolName))u.result?n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2014 ")+Uo(u.result.isError)+" "+Kr(u.result,void 0,60,u.toolName)+ml(u.result))):n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+De(u.thinkingTail))));else if(u.result){if(n.push(i(d+u.prefix+p.dim(" \u2014 ")+Uo(u.result.isError)+" "+Kr(u.result,void 0,60,u.toolName)+ml(u.result))),u.diff&&!u.result.isError)for(let f of Wr(u.diff,"overlay"," "))n.push(i(f))}else n.push(i(d+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+De(u.thinkingTail))))}return l>0&&n.push(i(" "+p.dim(`\u2026 +${l} done`))),n.join(`
1588
+ `))s.push(i+r+d)}return s}var TU=6,lu=class{entries=new Map;order=[];agentIdStack=[];addStart(t,n,r){let o=Ie(r),i=Hr(n+o),s=this.agentIdStack.at(-1)??void 0,a={kind:"tool",toolUseId:t,toolName:n,toolInput:o,prefix:i,...s!==void 0?{agentContext:s}:{}};this.entries.set(t,a),this.order.push(t),vo.has(n)&&this.agentIdStack.push(t)}addStartWithAgentContext(t,n,r,o,i){let s=Ie(r),a=this.entries.get(t);if(a?.kind==="tool"){a.toolInput=s,a.prefix=Hr(n+s,i),o!==void 0&&(a.agentContext=o);return}let l=Hr(n+s,i),c={kind:"tool",toolUseId:t,toolName:n,toolInput:s,prefix:l,...o!==void 0?{agentContext:o}:{}};this.entries.set(t,c),this.order.push(t)}mergeAgentLabel(t,n,r){let o=this.entries.get(t);if(o?.kind!=="tool"||!vo.has(o.toolName)||o.toolName==="Agent")return!1;let s=`(${Ie(n)})`;return o.toolName="Agent",o.toolInput=s,o.prefix=Hr("Agent"+s,r),!0}setAgentContext(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.agentContext:r.agentContext=n)}setAgentResultSummary(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.agentResultSummary=n)}setThinkingTail(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(n===void 0?delete r.thinkingTail:r.thinkingTail=n)}addResult(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.result=n),this.agentIdStack.at(-1)===t&&this.agentIdStack.pop()}addDiff(t,n){let r=this.entries.get(t);r?.kind==="tool"&&(r.diff=n)}upsertTextChild(t,n,r){let o=this.entries.get(t);if(o?.kind==="text"){o.text=r,o.agentContext=n;return}let i={kind:"text",toolUseId:t,text:r,agentContext:n};this.entries.set(t,i),this.order.push(t)}removeTextChildrenUnder(t){let n=[];for(let[r,o]of this.entries)o.kind==="text"&&o.agentContext===t&&n.push(r);for(let r of n)this.entries.delete(r);if(n.length>0){let r=new Set(n);this.order=this.order.filter(o=>!r.has(o))}}hasPending(){return this.entries.size>0}hasEntry(t){return this.entries.get(t)?.kind==="tool"}findLastSkillEntryId(){for(let t=this.order.length-1;t>=0;t--){let n=this.order[t],r=this.entries.get(n);if(r?.kind==="tool"&&id.has(r.toolName))return n}}peekTrailingCompletedRootToolName(){for(let t=this.order.length-1;t>=0;t--){let n=this.order[t],r=this.entries.get(n);if(!(!r||r.kind!=="tool")&&!r.agentContext)return r.result===void 0||Je.has(r.toolName)?void 0:r.toolName}}getOverlay(){let t=this.buildChildMap(),n=[],r=$n(),o=Q(),i=u=>ae(u,o),s=[];for(let u of this.order){let m=this.entries.get(u);!m||m.kind!=="tool"||m.agentContext||s.push(m)}let a=s,l=0;if(s.length>TU){let u=s.filter(h=>!h.result),m=s.filter(h=>h.result),f=Math.max(0,TU-u.length),g=new Set(m.slice(-f));l=m.length-g.size,a=s.filter(h=>!h.result||g.has(h))}let d=a.some(u=>Je.has(u.toolName))?p.dim(r.turnRoot):" ";for(let u of a){let m=t.get(u.toolUseId);if(Je.has(u.toolName)&&m&&m.length>0)u.headerEmitted?n.push(i(p.dim(r.turnRoot))):n.push(i(p.dim(r.turnRoot)+u.prefix)),jh(m,t,n,o,void 0,r),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+De(u.thinkingTail))));else if(!(Je.has(u.toolName)&&u.headerEmitted))if(Je.has(u.toolName))u.result?n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2014 ")+Uo(u.result.isError)+" "+Kr(u.result,void 0,60,u.toolName)+ml(u.result))):n.push(i(p.dim(r.turnRoot)+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+De(u.thinkingTail))));else if(u.result){if(n.push(i(d+u.prefix+p.dim(" \u2014 ")+Uo(u.result.isError)+" "+Kr(u.result,void 0,60,u.toolName)+ml(u.result))),u.diff&&!u.result.isError)for(let f of Wr(u.diff,"overlay"," "))n.push(i(f))}else n.push(i(d+u.prefix+p.dim(" \u2026"))),u.thinkingTail&&n.push(i(p.dim(r.spine)+p.thinking("\u2307 "+De(u.thinkingTail))))}return l>0&&n.push(i(" "+p.dim(`\u2026 +${l} done`))),n.join(`
1589
1589
  `)}ancestorDepthOf(t){let n=new Set([t]),r=0,o=t,i=32;for(;o!==void 0&&r<i;){let s=this.entries.get(o);if(!s||s.kind!=="tool")break;let a=s.agentContext;if(a===void 0||n.has(a))break;n.add(a);let l=this.entries.get(a);if(!l||l.kind!=="tool")break;r+=1,o=a}return r}flushSource(t,n){let r=this.entries.get(t);if(!r||r.kind!=="tool")return[];let o=Array.from({length:this.ancestorDepthOf(t)},()=>!1),i=[];{let m=[],f=new Set([t]),g=r.agentContext;for(;g!==void 0&&!f.has(g);){f.add(g);let h=this.entries.get(g);if(!h||h.kind!=="tool")break;m.push({entry:h,depth:this.ancestorDepthOf(h.toolUseId)}),g=h.agentContext}m.reverse();for(let{entry:h,depth:y}of m)h.headerEmitted||(i.push(VT(h,Array.from({length:y},()=>!1))),h.headerEmitted=!0)}let s=new Set([t]),a=[t];for(;a.length>0;){let m=a.shift();for(let[f,g]of this.entries){if(s.has(f))continue;(g.kind==="tool",g.agentContext)===m&&(s.add(f),g.kind==="tool"&&a.push(f))}}let l=new Map;for(let m of this.order){if(!s.has(m))continue;let f=this.entries.get(m);if(!f)continue;let g=(f.kind==="tool",f.agentContext);if(!g)continue;let h=l.get(g);h||(h=[],l.set(g,h)),h.push(f)}let c=l.get(r.toolUseId)??[],d=r.headerEmitted?au(r,c,l,n,o).join(`
1590
- `):su(r,c,l,n,o);for(let m of s)this.entries.delete(m);this.order=this.order.filter(m=>!s.has(m));let u=d===""?[]:[d];return[...i,...u]}flushCompletedRoots(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let c of this.order){let d=this.entries.get(c);!d||d.kind!=="tool"||d.agentContext||d.result!==void 0&&r.push(c)}if(r.length===0)return[];let o=[],i=new Map,s=[];for(let c of r){let d=this.entries.get(c);if(!d||d.kind!=="tool")continue;let u=n.get(d.toolUseId);if(Je.has(d.toolName))if(o.push(...gl(i,s,t)),i.clear(),s.length=0,d.headerEmitted){let m=au(d,u??[],n,t,[]);o.push(...m)}else o.push(su(d,u??[],n,t));else i.has(d.toolName)||(i.set(d.toolName,[]),s.push(d.toolName)),i.get(d.toolName).push(d)}o.push(...gl(i,s,t));let a=new Set(r),l=[...r];for(;l.length>0;){let c=l.shift();for(let[d,u]of this.entries){if(a.has(d))continue;(u.kind==="tool",u.agentContext)===c&&(a.add(d),u.kind==="tool"&&l.push(d))}}for(let c of a)this.entries.delete(c);return this.order=this.order.filter(c=>!a.has(c)),o}flush(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let a of this.order){let l=this.entries.get(a);!l||l.kind!=="tool"||l.agentContext||r.push(a)}let o=[],i=new Map,s=[];for(let a of r){let l=this.entries.get(a);if(!l||l.kind!=="tool")continue;let c=n.get(l.toolUseId);if(Je.has(l.toolName))if(o.push(...gl(i,s,t)),i.clear(),s.length=0,l.headerEmitted){let d=au(l,c??[],n,t,[]);o.push(...d)}else o.push(su(l,c??[],n,t));else i.has(l.toolName)||(i.set(l.toolName,[]),s.push(l.toolName)),i.get(l.toolName).push(l)}return o.push(...gl(i,s,t)),this.entries.clear(),this.order=[],this.agentIdStack=[],o}buildChildMap(){let t=new Map;for(let n of this.order){let r=this.entries.get(n);if(!r)continue;let o=(r.kind==="tool",r.agentContext);if(!o)continue;let i=t.get(o);i||(i=[],t.set(o,i)),i.push(r)}return t}};ye();function QT(e,t){let n=Math.max(0,e),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(t/4);return` ${p.thinking("\u25C6 thought for "+r+" \xB7 "+o+" tok")}`}var hl=class{buffer="";startedAt=null;endedAt=null;hasEmitted=!1;committedUpTo=0;push(t){this.hasEmitted||(this.buffer+=t,this.startedAt||(this.startedAt=Date.now()))}markEnded(){this.endedAt===null&&this.startedAt!==null&&(this.endedAt=Date.now())}isActive(){return!this.hasEmitted}hasBufferedContent(){return this.buffer.trim().length>0}peek(){return this.buffer}consume(){return this.hasEmitted=!0,this.buffer}peekPhase(){return this.buffer.slice(this.committedUpTo)}drainPhase(){let t=this.buffer.slice(this.committedUpTo);return this.committedUpTo=this.buffer.length,t}collapse(){if(this.hasEmitted||!this.startedAt)return!this.startedAt&&!this.hasEmitted&&Ke()&&console.error("[afk:thinking] collapse() short-circuited: no thinking chunks received this turn. Model may not support extended thinking, or API ignored the thinking parameter."),null;this.hasEmitted=!0;let t=this.endedAt??Date.now();return QT(t-this.startedAt,this.buffer.length)}inlineSummary(){if(!this.startedAt||!this.hasBufferedContent())return null;let t=this.endedAt??Date.now(),n=Math.max(0,t-this.startedAt),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(this.buffer.length/4);return`thought ${r} \xB7 ${o} tok`}};var ZT="__main__";function xU(e){let t={startedAt:Date.now(),lastEventAt:Date.now(),stats:{tokens:0,toolUses:0},contentBuffer:"",done:!1,errored:!1,stalledTicks:0};return e!==void 0&&(t.agentType=e),t}function cu(e,t){return{type:"tool_result",toolUseId:"synthetic",content:e,isError:t}}function RU(e){let t=["Done"],n=[];e.stats.toolUses&&n.push(Ba(e.stats.toolUses)),e.stats.tokens&&n.push(`${ue(e.stats.tokens)} tok`);let r=e.responseMetadata?.durationMs,o=Date.now()-e.startedAt;typeof r=="number"&&(n.push(ve(r)),o>r*1.5&&o-r>=1e3&&n.push(`${ve(o)} wall`)),n.length===0&&o>0&&n.push(ve(o));let i=e.thinkingLane?.inlineSummary();return i&&n.push(i),n.length>0&&t.push(`(${n.join(" \xB7 ")})`),t.join(" ")}function tE(e){let t=Math.max(1,ne()-2);return Math.max(1,t-e)}function AU(e,t){return die(e)?ro(e,{maxWidth:t}):me(e,t,{breakLongWords:!0})}function CU(e,t,n){if(!n||!e.trim())return"";let r;return eE(e)?r=`
1590
+ `):su(r,c,l,n,o);for(let m of s)this.entries.delete(m);this.order=this.order.filter(m=>!s.has(m));let u=d===""?[]:[d];return[...i,...u]}flushCompletedRoots(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let c of this.order){let d=this.entries.get(c);!d||d.kind!=="tool"||d.agentContext||d.result!==void 0&&r.push(c)}if(r.length===0)return[];let o=[],i=new Map,s=[];for(let c of r){let d=this.entries.get(c);if(!d||d.kind!=="tool")continue;let u=n.get(d.toolUseId);if(Je.has(d.toolName))if(o.push(...gl(i,s,t)),i.clear(),s.length=0,d.headerEmitted){let m=au(d,u??[],n,t,[]);o.push(...m)}else o.push(su(d,u??[],n,t));else i.has(d.toolName)||(i.set(d.toolName,[]),s.push(d.toolName)),i.get(d.toolName).push(d)}o.push(...gl(i,s,t));let a=new Set(r),l=[...r];for(;l.length>0;){let c=l.shift();for(let[d,u]of this.entries){if(a.has(d))continue;(u.kind==="tool",u.agentContext)===c&&(a.add(d),u.kind==="tool"&&l.push(d))}}for(let c of a)this.entries.delete(c);return this.order=this.order.filter(c=>!a.has(c)),o}flush(t){if(this.entries.size===0)return[];let n=this.buildChildMap(),r=[];for(let a of this.order){let l=this.entries.get(a);!l||l.kind!=="tool"||l.agentContext||r.push(a)}let o=[],i=new Map,s=[];for(let a of r){let l=this.entries.get(a);if(!l||l.kind!=="tool")continue;let c=n.get(l.toolUseId);if(Je.has(l.toolName))if(o.push(...gl(i,s,t)),i.clear(),s.length=0,l.headerEmitted){let d=au(l,c??[],n,t,[]);o.push(...d)}else o.push(su(l,c??[],n,t));else i.has(l.toolName)||(i.set(l.toolName,[]),s.push(l.toolName)),i.get(l.toolName).push(l)}return o.push(...gl(i,s,t)),this.entries.clear(),this.order=[],this.agentIdStack=[],o}buildChildMap(){let t=new Map;for(let n of this.order){let r=this.entries.get(n);if(!r)continue;let o=(r.kind==="tool",r.agentContext);if(!o)continue;let i=t.get(o);i||(i=[],t.set(o,i)),i.push(r)}return t}};ye();function QT(e,t){let n=Math.max(0,e),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(t/4);return` ${p.thinking("\u25C6 thought for "+r+" \xB7 "+o+" tok")}`}var hl=class{buffer="";startedAt=null;endedAt=null;hasEmitted=!1;committedUpTo=0;push(t){this.hasEmitted||(this.buffer+=t,this.startedAt||(this.startedAt=Date.now()))}markEnded(){this.endedAt===null&&this.startedAt!==null&&(this.endedAt=Date.now())}isActive(){return!this.hasEmitted}hasBufferedContent(){return this.buffer.trim().length>0}peek(){return this.buffer}consume(){return this.hasEmitted=!0,this.buffer}peekPhase(){return this.buffer.slice(this.committedUpTo)}drainPhase(){let t=this.buffer.slice(this.committedUpTo);return this.committedUpTo=this.buffer.length,t}collapse(){if(this.hasEmitted||!this.startedAt)return!this.startedAt&&!this.hasEmitted&&Ke()&&console.error("[afk:thinking] collapse() short-circuited: no thinking chunks received this turn. Model may not support extended thinking, or API ignored the thinking parameter."),null;this.hasEmitted=!0;let t=this.endedAt??Date.now();return QT(t-this.startedAt,this.buffer.length)}inlineSummary(){if(!this.startedAt||!this.hasBufferedContent())return null;let t=this.endedAt??Date.now(),n=Math.max(0,t-this.startedAt),r=n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`,o=Math.ceil(this.buffer.length/4);return`thought ${r} \xB7 ${o} tok`}};var ZT="__main__";function xU(e){let t={startedAt:Date.now(),lastEventAt:Date.now(),stats:{tokens:0,toolUses:0},contentBuffer:"",done:!1,errored:!1,stalledTicks:0};return e!==void 0&&(t.agentType=e),t}function cu(e,t){return{type:"tool_result",toolUseId:"synthetic",content:e,isError:t}}function RU(e){let t=["Done"],n=[];e.stats.toolUses&&n.push(Ba(e.stats.toolUses)),e.stats.tokens&&n.push(`${ue(e.stats.tokens)} tok`);let r=e.responseMetadata?.durationMs,o=Date.now()-e.startedAt;typeof r=="number"&&(n.push(ve(r)),o>r*1.5&&o-r>=1e3&&n.push(`${ve(o)} wall`)),n.length===0&&o>0&&n.push(ve(o));let i=e.thinkingLane?.inlineSummary();return i&&n.push(i),n.length>0&&t.push(`(${n.join(" \xB7 ")})`),t.join(" ")}function tE(e){let t=Math.max(1,Q()-2);return Math.max(1,t-e)}function AU(e,t){return die(e)?ro(e,{maxWidth:t}):me(e,t,{breakLongWords:!0})}function CU(e,t,n){if(!n||!e.trim())return"";let r;return eE(e)?r=`
1591
1591
  \u258D streaming code\u2026
1592
1592
  `:uie(e)?r=`
1593
1593
  \u258D streaming table\u2026
@@ -1606,15 +1606,15 @@ ${d}`}function IT(e,t){let n=LN[t.status];e.out.line(` ${n} ${p.bold(t.jobId)}
1606
1606
  `),d=c,u=s;if(c.length>n){let f=c.slice(0,c.length-n);u+=f.reduce((g,h,y)=>g+h.length+(y>0?1:0),0),d=c.slice(-n)}let m=[];m.push(Kh+p.thinking(hie));for(let f of d)m.push(Kh+p.thinking(f));return u>0&&m.push(Kh+p.dim(`\u22EF +${u} chars earlier`)),m.join(`
1607
1607
  `)}function Vt(e,t){t.length!==0&&e.commitAbove(t.join(`
1608
1608
  `))}function oE(e,t,n){n.streamingMarkdown.current?n.streamingMarkdown.current.commitPending():t.contentBuffer.trim()&&(sE(t.contentBuffer,n.out),t.contentBuffer=""),bl(n);let o=Es(e).split(`
1609
- `);if(n.isTTY&&n.compositor)Vt(n.compositor,o);else for(let i of o)n.out.line(i)}var Sie=5;function FU(e,t){let n=e.thinkingPhaseStartedAt;if(n==null)return null;e.thinkingPhaseStartedAt=void 0;let r=t.thinkingLane.drainPhase();return r.trim()?{summaryLine:QT(Date.now()-n,r.length),phaseText:r}:null}function LU(e,t){let n=[];if(t.thinkingMode==="digest"){let r=yl(De(e.phaseText),{cols:ne(),maxLines:Sie});r&&n.push(...r.split(`
1610
- `))}return n.push(e.summaryLine),n}function Gh(e,t){let n=FU(e,t);if(n==null)return;let r=LU(n,t);if(t.isTTY&&t.compositor)r.length>1?Vt(t.compositor,r):t.compositor.commitAbove(r[0]??"");else for(let o of r)t.out.line(o)}function iE(e,t){if(t.lastProgressByTask.clear(),!t.streamingMarkdown.current&&e.contentBuffer.trim()&&sE(e.contentBuffer,t.out),e.contentBuffer="",t.coordinator){if(!t.isTTY&&t.thinkingMode!=="off"){let n=t.thinkingLane.collapse();if(n){let r=n,o=t.out;t.coordinator.schedule({anchor:"before-content",commits:[()=>{o.line(r)}]})}}if(t.toolLane.hasPending()){let n=t.toolLane.flushCompletedRoots();if(n.length>0){let r=t.compositor,o=t.overlayComposer,i=t.toolLane,s=t.isTTY,a=t.out;t.coordinator.schedule({anchor:"before-content",commits:[()=>{if(s&&r)Vt(r,n),r.commitAbove(""),o?(o.markDirty("tool-lane"),o.flush()):r.setOverlay(i.getOverlay());else{for(let l of n)a.line(l);a.line("")}}]})}}if(t.isTTY&&t.thinkingMode!=="off"){let n=FU(e,t);if(n!=null){let r=LU(n,t),o=t.compositor,i=t.out,s=t.isTTY;t.coordinator.schedule({anchor:"before-content",commits:[()=>{if(s&&o)r.length>1?Vt(o,r):o.commitAbove(r[0]??"");else for(let a of r)i.line(a)}]})}}}else{if(!t.isTTY&&t.thinkingMode!=="off"){let n=t.thinkingLane.collapse();n&&t.out.line(n)}bl(t),t.isTTY&&t.thinkingMode!=="off"&&Gh(e,t)}}function sE(e,t){let n=process.stdout.isTTY?Math.max(1,ne()-2):Number.POSITIVE_INFINITY,r=ro(e,{maxWidth:n}),o=me(r,n,{breakLongWords:!0});for(let i of o.split(`
1609
+ `);if(n.isTTY&&n.compositor)Vt(n.compositor,o);else for(let i of o)n.out.line(i)}var Sie=5;function FU(e,t){let n=e.thinkingPhaseStartedAt;if(n==null)return null;e.thinkingPhaseStartedAt=void 0;let r=t.thinkingLane.drainPhase();return r.trim()?{summaryLine:QT(Date.now()-n,r.length),phaseText:r}:null}function LU(e,t){let n=[];if(t.thinkingMode==="digest"){let r=yl(De(e.phaseText),{cols:Q(),maxLines:Sie});r&&n.push(...r.split(`
1610
+ `))}return n.push(e.summaryLine),n}function Gh(e,t){let n=FU(e,t);if(n==null)return;let r=LU(n,t);if(t.isTTY&&t.compositor)r.length>1?Vt(t.compositor,r):t.compositor.commitAbove(r[0]??"");else for(let o of r)t.out.line(o)}function iE(e,t){if(t.lastProgressByTask.clear(),!t.streamingMarkdown.current&&e.contentBuffer.trim()&&sE(e.contentBuffer,t.out),e.contentBuffer="",t.coordinator){if(!t.isTTY&&t.thinkingMode!=="off"){let n=t.thinkingLane.collapse();if(n){let r=n,o=t.out;t.coordinator.schedule({anchor:"before-content",commits:[()=>{o.line(r)}]})}}if(t.toolLane.hasPending()){let n=t.toolLane.flushCompletedRoots();if(n.length>0){let r=t.compositor,o=t.overlayComposer,i=t.toolLane,s=t.isTTY,a=t.out;t.coordinator.schedule({anchor:"before-content",commits:[()=>{if(s&&r)Vt(r,n),r.commitAbove(""),o?(o.markDirty("tool-lane"),o.flush()):r.setOverlay(i.getOverlay());else{for(let l of n)a.line(l);a.line("")}}]})}}if(t.isTTY&&t.thinkingMode!=="off"){let n=FU(e,t);if(n!=null){let r=LU(n,t),o=t.compositor,i=t.out,s=t.isTTY;t.coordinator.schedule({anchor:"before-content",commits:[()=>{if(s&&o)r.length>1?Vt(o,r):o.commitAbove(r[0]??"");else for(let a of r)i.line(a)}]})}}}else{if(!t.isTTY&&t.thinkingMode!=="off"){let n=t.thinkingLane.collapse();n&&t.out.line(n)}bl(t),t.isTTY&&t.thinkingMode!=="off"&&Gh(e,t)}}function sE(e,t){let n=process.stdout.isTTY?Math.max(1,Q()-2):Number.POSITIVE_INFINITY,r=ro(e,{maxWidth:n}),o=me(r,n,{breakLongWords:!0});for(let i of o.split(`
1611
1611
  `))t.line(i)}function aE(e,t){let n=cp(e.message,e.stack);for(let r of n.split(`
1612
- `))t.line(r)}function bl(e){if(!e.toolLane.hasPending())return;let t=e.toolLane.flushCompletedRoots();if(e.isTTY&&e.compositor)t.length>0&&(Vt(e.compositor,t),e.compositor.commitAbove("")),e.overlayComposer?(e.overlayComposer.markDirty("tool-lane"),e.overlayComposer.flush()):e.compositor.setOverlay(e.toolLane.getOverlay());else if(t.length>0){for(let n of t)e.out.line(n);e.out.line("")}}var qh="__rate_limit__";function NU(e,t,n){switch(n.stageTracker&&DU(n.stageTracker,e),e.type){case"progress":n.lastProgressByTask.clear(),n.lastProgressByTask.set(e.progress.taskId,e.progress),n.isTTY&&at(n);return;case"chunk":{let r=e.chunk;if(n.lastProgressByTask.delete(qh)&&n.isTTY&&at(n),r.type==="tool_use_detail"){if(n.thinkingLane.markEnded(),n.streamingMarkdown.current?.commitPending(),n.isTTY){let s=n.toolLane.peekTrailingCompletedRootToolName();s!==void 0&&s===r.toolName&&t.thinkingPhaseStartedAt==null||bl(n),Gh(t,n)}let o=vo.has(r.toolName)||sd.has(r.toolName),i=n.activeSkillName&&o?n.toolLane.findLastSkillEntryId():void 0;n.toolLane.addStartWithAgentContext(r.toolUseId,r.toolName,r.toolInput,i),t.stats.toolUses+=1,n.isTTY&&n.compositor&&n.compositor.setSpinner({enabled:!0,rotateVerbEveryMs:3500}),n.isTTY&&at(n)}else if(r.type==="tool_result")n.streamingMarkdown.current?.commitPending(),n.toolLane.addResult(r.toolUseId,r),n.isTTY&&at(n);else if(r.type==="tool_diff")n.toolLane.addDiff(r.toolUseId,r.diff),n.isTTY&&at(n);else if(r.type==="content"){n.thinkingLane.markEnded();let o=PT(r.content);if(n.activeSkillName&&!n.skillBadgeEmitted){let i=MT(o,n.activeSkillName);if(o=i.text,i.found){n.skillBadgeEmitted=!0;let{color:s,glyph:a}=eT("skill"),l=" "+s(a+" ")+s.bold(n.activeSkillName);n.isTTY&&n.compositor?n.compositor.commitAbove(l):n.out.line(l)}}else n.activeSkillName&&(o=MT(o,n.activeSkillName).text);if(!o)return;t.contentBuffer+=o,n.isTTY&&(n.compositor&&n.compositor.setSpinner({enabled:!1}),bl(n),Gh(t,n),n.streamingMarkdown.current||(n.streamingMarkdown.current=new Hh({...n.compositor?{compositor:n.compositor}:{},...n.overlayComposer?{overlayComposer:n.overlayComposer}:{}})),n.streamingMarkdown.current.push(o))}else if(r.type==="thinking"){if(n.thinkingMode==="off")return;t.thinkingPhaseStartedAt==null&&(t.thinkingPhaseStartedAt=Date.now()),n.thinkingLane.push(r.content),n.isTTY&&(n.thinkingMode==="live"||n.thinkingMode==="digest")&&at(n)}return}case"message":t.contentBuffer||(t.contentBuffer=PT(e.message.content));return;case"error":t.errored=!0,aE(e.error,n.out);return;case"done":t.done=!0,e.metadata&&(t.responseMetadata=e.metadata),iE(t,n);return;case"suggestion":return;case"stream_retry":t.contentBuffer="",n.streamingMarkdown.current?.discardPending(),n.lastProgressByTask.delete(qh)&&n.isTTY&&at(n);return;case"rate_limit":{if(!n.isTTY)return;n.lastProgressByTask.set(qh,{taskId:qh,description:mF(e.retryAfterMs),totalTokens:0,toolUses:0,durationMs:0}),at(n);return}case"panel":oE(e.spec,t,n);return}}function at(e){if(!e.compositor)return;if(e.overlayComposer){e.overlayComposer.invalidate(),e.overlayComposer.flush();return}let t=[];if((e.thinkingMode==="live"||e.thinkingMode==="digest")&&e.thinkingLane.hasBufferedContent()){let o=yl(e.thinkingLane.peek(),{cols:ne()});o&&t.push(o)}e.toolLane.hasPending()&&t.push(e.toolLane.getOverlay());let n=[],r=Dg(e.thinkingLane.peekPhase());for(let o of e.lastProgressByTask.values())n.push(..._d(o,void 0,r));n.length>0&&t.push(n.join(`
1612
+ `))t.line(r)}function bl(e){if(!e.toolLane.hasPending())return;let t=e.toolLane.flushCompletedRoots();if(e.isTTY&&e.compositor)t.length>0&&(Vt(e.compositor,t),e.compositor.commitAbove("")),e.overlayComposer?(e.overlayComposer.markDirty("tool-lane"),e.overlayComposer.flush()):e.compositor.setOverlay(e.toolLane.getOverlay());else if(t.length>0){for(let n of t)e.out.line(n);e.out.line("")}}var qh="__rate_limit__";function NU(e,t,n){switch(n.stageTracker&&DU(n.stageTracker,e),e.type){case"progress":n.lastProgressByTask.clear(),n.lastProgressByTask.set(e.progress.taskId,e.progress),n.isTTY&&at(n);return;case"chunk":{let r=e.chunk;if(n.lastProgressByTask.delete(qh)&&n.isTTY&&at(n),r.type==="tool_use_detail"){if(n.thinkingLane.markEnded(),n.streamingMarkdown.current?.commitPending(),n.isTTY){let s=n.toolLane.peekTrailingCompletedRootToolName();s!==void 0&&s===r.toolName&&t.thinkingPhaseStartedAt==null||bl(n),Gh(t,n)}let o=vo.has(r.toolName)||sd.has(r.toolName),i=n.activeSkillName&&o?n.toolLane.findLastSkillEntryId():void 0;n.toolLane.addStartWithAgentContext(r.toolUseId,r.toolName,r.toolInput,i),t.stats.toolUses+=1,n.isTTY&&n.compositor&&n.compositor.setSpinner({enabled:!0,rotateVerbEveryMs:3500}),n.isTTY&&at(n)}else if(r.type==="tool_result")n.streamingMarkdown.current?.commitPending(),n.toolLane.addResult(r.toolUseId,r),n.isTTY&&at(n);else if(r.type==="tool_diff")n.toolLane.addDiff(r.toolUseId,r.diff),n.isTTY&&at(n);else if(r.type==="content"){n.thinkingLane.markEnded();let o=PT(r.content);if(n.activeSkillName&&!n.skillBadgeEmitted){let i=MT(o,n.activeSkillName);if(o=i.text,i.found){n.skillBadgeEmitted=!0;let{color:s,glyph:a}=eT("skill"),l=" "+s(a+" ")+s.bold(n.activeSkillName);n.isTTY&&n.compositor?n.compositor.commitAbove(l):n.out.line(l)}}else n.activeSkillName&&(o=MT(o,n.activeSkillName).text);if(!o)return;t.contentBuffer+=o,n.isTTY&&(n.compositor&&n.compositor.setSpinner({enabled:!1}),bl(n),Gh(t,n),n.streamingMarkdown.current||(n.streamingMarkdown.current=new Hh({...n.compositor?{compositor:n.compositor}:{},...n.overlayComposer?{overlayComposer:n.overlayComposer}:{}})),n.streamingMarkdown.current.push(o))}else if(r.type==="thinking"){if(n.thinkingMode==="off")return;t.thinkingPhaseStartedAt==null&&(t.thinkingPhaseStartedAt=Date.now()),n.thinkingLane.push(r.content),n.isTTY&&(n.thinkingMode==="live"||n.thinkingMode==="digest")&&at(n)}return}case"message":t.contentBuffer||(t.contentBuffer=PT(e.message.content));return;case"error":t.errored=!0,aE(e.error,n.out);return;case"done":t.done=!0,e.metadata&&(t.responseMetadata=e.metadata),iE(t,n);return;case"suggestion":return;case"stream_retry":t.contentBuffer="",n.streamingMarkdown.current?.discardPending(),n.lastProgressByTask.delete(qh)&&n.isTTY&&at(n);return;case"rate_limit":{if(!n.isTTY)return;n.lastProgressByTask.set(qh,{taskId:qh,description:mF(e.retryAfterMs),totalTokens:0,toolUses:0,durationMs:0}),at(n);return}case"panel":oE(e.spec,t,n);return}}function at(e){if(!e.compositor)return;if(e.overlayComposer){e.overlayComposer.invalidate(),e.overlayComposer.flush();return}let t=[];if((e.thinkingMode==="live"||e.thinkingMode==="digest")&&e.thinkingLane.hasBufferedContent()){let o=yl(e.thinkingLane.peek(),{cols:Q()});o&&t.push(o)}e.toolLane.hasPending()&&t.push(e.toolLane.getOverlay());let n=[],r=Dg(e.thinkingLane.peekPhase());for(let o of e.lastProgressByTask.values())n.push(..._d(o,void 0,r));n.length>0&&t.push(n.join(`
1613
1613
  `)),e.compositor.setOverlay(t.join(`
1614
- `))}var zh=class{beforeContent=[];afterSubagent=new Map;afterContent=[];schedule(t){let{anchor:n}=t;if(n==="before-content")this.beforeContent.push(t);else if(n==="after-content")this.afterContent.push(t);else{let r=n.slice(15),o=this.afterSubagent.get(r);o||(o=[],this.afterSubagent.set(r,o)),o.push(t)}}drainSubagent(t){for(let r of this.beforeContent.splice(0))for(let o of r.commits)o();let n=this.afterSubagent.get(t);if(n){this.afterSubagent.delete(t);for(let r of n)for(let o of r.commits)o()}}async flushAll(t){for(let n of this.beforeContent.splice(0))for(let r of n.commits)r();if(t)try{await t()}catch{}for(let[n,r]of Array.from(this.afterSubagent)){this.afterSubagent.delete(n);for(let o of r)for(let i of o.commits)i()}for(let n of this.afterContent.splice(0))for(let r of n.commits)r()}};var Jh=new Map,wl=new Map;function BU(e,t,n,r){let o=n.syntheticAgentToolUseId;if(o)switch(e.type){case"progress":e.progress.totalTokens&&(n.stats.tokens=e.progress.totalTokens),e.progress.toolUses!==void 0&&(n.stats.progressReportedToolUses=e.progress.toolUses);return;case"chunk":{let i=e.chunk;if(i.type==="tool_use_detail"){n.thinkingLane?.markEnded(),n.currentTextEntryId=void 0;let s=r.streamingMarkdown.get(t);s&&s.commitPending(),r.toolLane.setThinkingTail(o,void 0);let a=process.stdout.columns??100,l=Math.max(20,a-14);r.toolLane.addStartWithAgentContext(i.toolUseId,i.toolName,i.toolInput,o,l),n.stats.toolUses+=1,r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx)}else if(i.type==="tool_result"){let s=r.streamingMarkdown.get(t);s&&s.commitPending(),r.toolLane.addResult(i.toolUseId,i),r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx)}else if(i.type==="tool_diff")r.toolLane.addDiff(i.toolUseId,i.diff),r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx);else if(i.type==="content")if(n.thinkingLane?.markEnded(),n.currentTextEntryId||(n.currentTextEntryId="__in_text_block__"),n.contentBuffer+=i.content,r.isTTY&&r.compositor){if(i.content.trim()){let s=process.stdout.columns??100,a=Math.max(20,s-14),l=Cd(n.contentBuffer,a),c=Date.now(),d=Jh.get(o)??0,u=l?/[.!?…]$/.test(l):!1;l&&(c-d>=1500||u)&&(Jh.set(o,c),r.toolLane.setThinkingTail(o,l))}if(r.orchestratorCtx){let s=Date.now(),a=wl.get(o)??0;s-a>=1500&&(wl.set(o,s),at(r.orchestratorCtx))}}else{let s=n.contentBuffer.lastIndexOf(`
1615
- `);if(s!==-1){let a=n.contentBuffer.slice(0,s);n.contentBuffer=n.contentBuffer.slice(s+1),Og(a,r)}}else if(i.type==="thinking"){if(r.thinkingMode==="off")return;if(n.thinkingLane||(n.thinkingLane=new hl),n.thinkingLane.push(i.content),r.thinkingMode==="live"&&r.isTTY&&r.orchestratorCtx){let s=process.stdout.columns??100,a=Math.max(20,s-14),l=Cd(n.thinkingLane.peek(),a);l&&r.toolLane.setThinkingTail(o,l);{let c=Date.now(),d=wl.get(o)??0;c-d>=1500&&(wl.set(o,c),at(r.orchestratorCtx))}}}return}case"message":return;case"error":n.errored=!0,r.toolLane.setThinkingTail(o,void 0),Jh.delete(o),wl.delete(o);{let i=`error \u2014 ${e.error.message}`;r.toolLane.setAgentResultSummary(o,i),r.toolLane.addResult(o,cu(i,!0))}r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx);return;case"done":n.done=!0,e.metadata&&(n.responseMetadata=e.metadata),kie(t,n,r);return;case"suggestion":return;case"panel":vie(e.spec,t,n,r);return}}function vie(e,t,n,r){if(r.isTTY){let s=n.syntheticAgentToolUseId;s&&r.toolLane.setThinkingTail(s,void 0),n.contentBuffer=""}else n.contentBuffer.trim()&&(Og(n.contentBuffer,r),n.contentBuffer="");let i=Es(e).split(`
1614
+ `))}var zh=class{beforeContent=[];afterSubagent=new Map;afterContent=[];schedule(t){let{anchor:n}=t;if(n==="before-content")this.beforeContent.push(t);else if(n==="after-content")this.afterContent.push(t);else{let r=n.slice(15),o=this.afterSubagent.get(r);o||(o=[],this.afterSubagent.set(r,o)),o.push(t)}}drainSubagent(t){for(let r of this.beforeContent.splice(0))for(let o of r.commits)o();let n=this.afterSubagent.get(t);if(n){this.afterSubagent.delete(t);for(let r of n)for(let o of r.commits)o()}}async flushAll(t){for(let n of this.beforeContent.splice(0))for(let r of n.commits)r();if(t)try{await t()}catch{}for(let[n,r]of Array.from(this.afterSubagent)){this.afterSubagent.delete(n);for(let o of r)for(let i of o.commits)i()}for(let n of this.afterContent.splice(0))for(let r of n.commits)r()}};var Jh=new Map,wl=new Map;function BU(e,t,n,r){let o=n.syntheticAgentToolUseId;if(o)switch(e.type){case"progress":e.progress.totalTokens&&(n.stats.tokens=e.progress.totalTokens),e.progress.toolUses!==void 0&&(n.stats.progressReportedToolUses=e.progress.toolUses);return;case"chunk":{let i=e.chunk;if(i.type==="tool_use_detail"){n.thinkingLane?.markEnded(),n.currentTextEntryId=void 0;let s=r.streamingMarkdown.get(t);s&&s.commitPending(),r.toolLane.setThinkingTail(o,void 0);let a=Q(),l=Math.max(20,a-14);r.toolLane.addStartWithAgentContext(i.toolUseId,i.toolName,i.toolInput,o,l),n.stats.toolUses+=1,r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx)}else if(i.type==="tool_result"){let s=r.streamingMarkdown.get(t);s&&s.commitPending(),r.toolLane.addResult(i.toolUseId,i),r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx)}else if(i.type==="tool_diff")r.toolLane.addDiff(i.toolUseId,i.diff),r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx);else if(i.type==="content")if(n.thinkingLane?.markEnded(),n.currentTextEntryId||(n.currentTextEntryId="__in_text_block__"),n.contentBuffer+=i.content,r.isTTY&&r.compositor){if(i.content.trim()){let s=Q(),a=Math.max(20,s-14),l=Cd(n.contentBuffer,a),c=Date.now(),d=Jh.get(o)??0,u=l?/[.!?…]$/.test(l):!1;l&&(c-d>=1500||u)&&(Jh.set(o,c),r.toolLane.setThinkingTail(o,l))}if(r.orchestratorCtx){let s=Date.now(),a=wl.get(o)??0;s-a>=1500&&(wl.set(o,s),at(r.orchestratorCtx))}}else{let s=n.contentBuffer.lastIndexOf(`
1615
+ `);if(s!==-1){let a=n.contentBuffer.slice(0,s);n.contentBuffer=n.contentBuffer.slice(s+1),Og(a,r)}}else if(i.type==="thinking"){if(r.thinkingMode==="off")return;if(n.thinkingLane||(n.thinkingLane=new hl),n.thinkingLane.push(i.content),r.thinkingMode==="live"&&r.isTTY&&r.orchestratorCtx){let s=Q(),a=Math.max(20,s-14),l=Cd(n.thinkingLane.peek(),a);l&&r.toolLane.setThinkingTail(o,l);{let c=Date.now(),d=wl.get(o)??0;c-d>=1500&&(wl.set(o,c),at(r.orchestratorCtx))}}}return}case"message":return;case"error":n.errored=!0,r.toolLane.setThinkingTail(o,void 0),Jh.delete(o),wl.delete(o);{let i=`error \u2014 ${e.error.message}`;r.toolLane.setAgentResultSummary(o,i),r.toolLane.addResult(o,cu(i,!0))}r.isTTY&&r.orchestratorCtx&&at(r.orchestratorCtx);return;case"done":n.done=!0,e.metadata&&(n.responseMetadata=e.metadata),kie(t,n,r);return;case"suggestion":return;case"panel":vie(e.spec,t,n,r);return}}function vie(e,t,n,r){if(r.isTTY){let s=n.syntheticAgentToolUseId;s&&r.toolLane.setThinkingTail(s,void 0),n.contentBuffer=""}else n.contentBuffer.trim()&&(Og(n.contentBuffer,r),n.contentBuffer="");let i=Es(e).split(`
1616
1616
  `);if(r.isTTY&&r.compositor)Vt(r.compositor,i);else for(let s of i)r.out.line(s);r.isTTY&&r.compositor?r.compositor.commitAbove(""):r.out.line("")}function kie(e,t,n){let r=t.syntheticAgentToolUseId;if(!r||t.errored)return;if(!n.isTTY&&t.contentBuffer&&Og(t.contentBuffer,n),t.contentBuffer="",!n.isTTY&&t.thinkingLane?.hasBufferedContent()){let i=t.thinkingLane.collapse();i&&(n.out.line(i),n.out.line(""))}n.toolLane.setThinkingTail(r,void 0),Jh.delete(r),wl.delete(r);let o=RU(t);n.toolLane.setAgentResultSummary(r,o),n.toolLane.addResult(r,cu(o,!1)),n.isTTY&&n.orchestratorCtx&&at(n.orchestratorCtx)}var Yh=class{sink;order;slots=new Map;dirty=!1;constructor(t,n){this.sink=t,this.order=[...n]}register(t){this.slots.set(t.key,t),this.dirty=!0}markDirty(t){this.slots.has(t)&&(this.dirty=!0)}flush(){if(!this.dirty)return;this.dirty=!1;let t=[];for(let n of this.order){let r=this.slots.get(n);if(r===void 0)continue;let o=r.render();o.length>0&&t.push(o)}this.sink.setOverlay(t.join(`
1617
- `))}invalidate(){this.dirty=!0}};function UU(e,t=2){if(t<1||!Number.isInteger(t))throw new RangeError(`makeDedupingLineWriter: maxRepeat must be a positive integer, got ${t}`);let n=null,r=0,o=()=>{if(n!==null&&r>t){let i=r-t;e.line(` \u2026 (line repeated ${i} more time${i===1?"":"s"})`)}};return{line(i){let s=i??"";s===n?(r++,r<=t&&e.line(s)):(o(),n=s,r=1,e.line(s))},raw(i){o(),n=null,r=0,e.raw(i)},success(i){o(),n=null,r=0,e.success(i)},info(i){o(),n=null,r=0,e.info(i)},warn(i){o(),n=null,r=0,e.warn(i)},error(i){o(),n=null,r=0,e.error(i)},flush(){o(),n=null,r=0}}}ye();var Tie=3e4,Eie=" \xB7 waiting ",xie=375;function jU(e,t){e.register({key:"thinking-live",render:()=>t.thinkingMode!=="live"&&t.thinkingMode!=="digest"||!t.thinkingLane.isActive()||!t.thinkingLane.hasBufferedContent()?"":yl(t.thinkingLane.peekPhase(),{cols:ne()})??""}),e.register({key:"markdown-pending",render:()=>{let n=t.streamingMarkdownRef.current;return n?n.renderPending():""}}),e.register({key:"tool-lane",render:()=>t.toolLane.hasPending()?t.toolLane.getOverlay():""}),e.register({key:"progress-banner",render:()=>{let n=[],r=t.getSoftStopping(),o=Dg(t.thinkingLane.peekPhase());for(let i of t.lastProgressByTask.values())n.push(..._d(i,void 0,o,r));return r&&n.length===0&&n.push(..._d({taskId:"__soft_stop__",description:"Turn",totalTokens:0,toolUses:0,durationMs:0},void 0,void 0,!0)),n.length>0?n.join(`
1617
+ `))}invalidate(){this.dirty=!0}};function UU(e,t=2){if(t<1||!Number.isInteger(t))throw new RangeError(`makeDedupingLineWriter: maxRepeat must be a positive integer, got ${t}`);let n=null,r=0,o=()=>{if(n!==null&&r>t){let i=r-t;e.line(` \u2026 (line repeated ${i} more time${i===1?"":"s"})`)}};return{line(i){let s=i??"";s===n?(r++,r<=t&&e.line(s)):(o(),n=s,r=1,e.line(s))},raw(i){o(),n=null,r=0,e.raw(i)},success(i){o(),n=null,r=0,e.success(i)},info(i){o(),n=null,r=0,e.info(i)},warn(i){o(),n=null,r=0,e.warn(i)},error(i){o(),n=null,r=0,e.error(i)},flush(){o(),n=null,r=0}}}ye();var Tie=3e4,Eie=" \xB7 waiting ",xie=375;function jU(e,t){e.register({key:"thinking-live",render:()=>t.thinkingMode!=="live"&&t.thinkingMode!=="digest"||!t.thinkingLane.isActive()||!t.thinkingLane.hasBufferedContent()?"":yl(t.thinkingLane.peekPhase(),{cols:Q()})??""}),e.register({key:"markdown-pending",render:()=>{let n=t.streamingMarkdownRef.current;return n?n.renderPending():""}}),e.register({key:"tool-lane",render:()=>t.toolLane.hasPending()?t.toolLane.getOverlay():""}),e.register({key:"progress-banner",render:()=>{let n=[],r=t.getSoftStopping(),o=Dg(t.thinkingLane.peekPhase());for(let i of t.lastProgressByTask.values())n.push(..._d(i,void 0,o,r));return r&&n.length===0&&n.push(..._d({taskId:"__soft_stop__",description:"Turn",totalTokens:0,toolUses:0,durationMs:0},void 0,void 0,!0)),n.length>0?n.join(`
1618
1618
  `):""}}),e.register({key:"interrupt",render:()=>Rie(t.getInterrupting())})}function Rie(e){return e?" "+p.warning("\u26A0 interrupting\u2026 (Ctrl+C again to exit)"):""}function HU(e,t){return We.subscribe(()=>{t||!e||(e.invalidate(),e.flush())})}function WU(e){if(e.disposed)return!1;let t=!1,n=Date.now();for(let[r,o]of e.sources){if(o.done||o.errored||!o.syntheticAgentToolUseId)continue;let i=n-o.lastEventAt;if(i>Tie)if(o.stalledTicks+=1,o.stalledTicks>=xie*2)Ke()&&process.stderr.write(`[stream-renderer] auto_settle_timeout ${JSON.stringify({sourceId:r,elapsedMs:i,syntheticAgentToolUseId:o.syntheticAgentToolUseId})}
1619
1619
  `),e.toolLane.addResult(o.syntheticAgentToolUseId,cu("[no-result \u2014 timed out]",!1)),o.done=!0,t=!0;else{let s=o.agentType??r,a=Eie+ve(i);o.pauseAnnotation!==a&&(o.pauseAnnotation=a,e.toolLane.addStartWithAgentContext(o.syntheticAgentToolUseId,"Agent",`(${s})${a}`,void 0),t=!0)}}return t&&e.isTTY&&e.overlayComposer&&(e.overlayComposer.markDirty("tool-lane"),e.overlayComposer.flush()),t}ye();function KU(e){return{out:e.out,isTTY:e.isTTY,compositor:e.compositor,overlayComposer:e.overlayComposer,toolLane:e.toolLane,thinkingLane:e.thinkingLane,thinkingMode:e.thinkingMode,streamingMarkdown:e.streamingMarkdown,coordinator:e.coordinator,lastProgressByTask:e.lastProgressByTask,...e.isTTY&&e.stageTracker?{stageTracker:e.stageTracker}:{},...e.activeSkillName?{activeSkillName:e.activeSkillName}:{}}}function lE(e){return{isTTY:e.isTTY,compositor:e.compositor,toolLane:e.toolLane,out:e.out,streamingMarkdown:e.streamingMarkdown,thinkingMode:e.thinkingMode,orchestratorCtx:e.orchestratorCtx}}function GU(e){if(e.parentId===void 0)return;let t=e.sources.get(e.parentId);if(t!==void 0)return t.syntheticAgentToolUseId;if(e.toolLane.hasEntry(e.parentId))return e.parentId;Ke()&&process.stderr.write(`[stream-renderer] parentId_fallback_unresolved ${JSON.stringify({parentId:e.parentId,sourceId:e.sourceId})}
1620
1620
  `)}var Sl=class{out;thinkingMode;isTTY;captureMode;reducedMotion;onCancel;onBackground;activeSkillName;history;autocompleteState;promptText;scrollRegion;onStageChange;ownsCompositor=!0;borrowedCompositor=null;priorOnCancel=void 0;interrupting=!1;softStopping=!1;coordinator=new zh;compositor=null;overlayComposer=null;streamingMarkdownRef={current:null};toolLane=new lu;thinkingLane=new hl;stageTracker=$U();sources=new Map;subagentMarkdown=new Map;lastProgressByTask=new Map;disposed=!1;pauseTickInterval=null;resizeUnsub=null;sink;constructor(t){this.captureMode=t.captureMode??eh(),this.reducedMotion=t.reducedMotion??th(),this.out=this.captureMode?UU(t.out,2):t.out;let n=t.thinkingMode??(t.verbose===!0?"live":"summary");this.thinkingMode=this.captureMode&&n==="live"?"summary":n,this.onCancel=t.onCancel,this.onBackground=t.onBackground,this.isTTY=!(t.forceNonTty??!1)&&!gt()&&!!process.stdout.isTTY&&!!process.stdin.isTTY,this.activeSkillName=t.activeSkillName,this.history=t.history,this.autocompleteState=t.autocompleteState,this.promptText=t.promptText,this.scrollRegion=t.scrollRegion,this.onStageChange=t.onStageChange,t.compositor&&(this.borrowedCompositor=t.compositor,this.ownsCompositor=!1),this.sink=(r,o)=>this.process(r,o)}async arm(){if(this.disposed||!this.isTTY||this.compositor)return;let t;if(this.borrowedCompositor)t=this.borrowedCompositor,t.setInputMode("streaming"),this.priorOnCancel=t.getOnCancel(),this.onCancel&&t.setOnCancel(this.onCancel);else{let n=rl();t=new pl({stdout:process.stdout,stdin:process.stdin,...this.onCancel?{onCancel:this.onCancel}:{},...this.onBackground?{onBackground:this.onBackground}:{},...this.history?{history:this.history}:{},...this.autocompleteState?{autocompleteState:this.autocompleteState}:{},...this.promptText!==void 0?{promptText:this.promptText}:{},formatInputBuffer:r=>Bo(r,n),...this.scrollRegion?{scrollRegion:this.scrollRegion}:{},captureMode:this.captureMode,goblinSpinner:nh()}),await t.arm()}this.compositor=t,this.overlayComposer=new Yh(t,["thinking-live","markdown-pending","tool-lane","progress-banner","interrupt"]),jU(this.overlayComposer,{stageTracker:this.stageTracker,thinkingMode:this.thinkingMode,thinkingLane:this.thinkingLane,streamingMarkdownRef:this.streamingMarkdownRef,toolLane:this.toolLane,lastProgressByTask:this.lastProgressByTask,getInterrupting:()=>this.interrupting,getSoftStopping:()=>this.softStopping}),t.setSpinner({enabled:!this.reducedMotion,rotateVerbEveryMs:3500}),this.pauseTickInterval=setInterval(()=>this.checkPauseAnnotations(),80),this.resizeUnsub=HU(this.overlayComposer,!1)}getCompositor(){return this.compositor}setInterrupting(t){this.disposed||(this.interrupting=t,this.overlayComposer&&(this.overlayComposer.markDirty("interrupt"),this.overlayComposer.flush()))}setSoftStopping(t){this.disposed||(this.softStopping=t,this.overlayComposer&&(this.overlayComposer.markDirty("progress-banner"),this.overlayComposer.flush()))}buildOrchestratorCtx(){return KU({out:this.out,isTTY:this.isTTY,compositor:this.compositor,overlayComposer:this.overlayComposer,toolLane:this.toolLane,thinkingLane:this.thinkingLane,thinkingMode:this.thinkingMode,streamingMarkdown:this.streamingMarkdownRef,coordinator:this.coordinator,lastProgressByTask:this.lastProgressByTask,...this.isTTY?{stageTracker:this.stageTracker}:{},...this.activeSkillName?{activeSkillName:this.activeSkillName}:{}})}process(t,n){if(this.disposed)return;let r=n?.subagentId??ZT,o=r===ZT,i=this.sources.get(r);if(!i&&(i=xU(n?.agentType),this.sources.set(r,i),!o)){let s=GU({parentId:n?.parentId,sources:this.sources,toolLane:this.toolLane,sourceId:r});Zk(r,i,lE({isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown,thinkingMode:this.thinkingMode,orchestratorCtx:this.buildOrchestratorCtx()}),s)}if(o){let s=this.stageTracker.stage;if(NU(t,i,this.buildOrchestratorCtx()),this.onStageChange&&this.stageTracker.stage!==s)try{this.onStageChange(this.stageTracker.stage)}catch{}}else{if(BU(t,r,i,lE({isTTY:this.isTTY,compositor:this.compositor,toolLane:this.toolLane,out:this.out,streamingMarkdown:this.subagentMarkdown,thinkingMode:this.thinkingMode,orchestratorCtx:this.buildOrchestratorCtx()})),i.lastEventAt=Date.now(),i.pauseAnnotation!==void 0&&i.syntheticAgentToolUseId){i.pauseAnnotation=void 0,i.stalledTicks=0;let a=i.agentType??r;this.toolLane.addStartWithAgentContext(i.syntheticAgentToolUseId,"Agent",`(${a})`,void 0)}if((t.type==="done"||t.type==="error")&&this.isTTY){let a=i.syntheticAgentToolUseId;if(a&&this.toolLane.hasEntry(a)){let l=this.toolLane.flushSource(a),c=this.compositor,d=this.overlayComposer,u=this.toolLane,m=this.out;this.coordinator.schedule({anchor:`after-subagent:${r}`,commits:[()=>{if(c)Vt(c,l),c.commitAbove(""),d?(d.markDirty("tool-lane"),d.flush()):c.setOverlay(u.getOverlay());else{for(let f of l)m.line(f);m.line("")}}]});try{this.streamingMarkdownRef.current&&this.streamingMarkdownRef.current.commitPending()}finally{this.coordinator.drainSubagent(r)}}at(this.buildOrchestratorCtx())}}}async dispose(){if(this.disposed)return;this.disposed=!0,this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.lastProgressByTask.clear(),this.softStopping=!1;let t=this.streamingMarkdownRef.current?()=>this.streamingMarkdownRef.current.flush():void 0;await this.coordinator.flushAll(t),this.streamingMarkdownRef.current&&(this.streamingMarkdownRef.current.dispose(),this.streamingMarkdownRef.current=null);for(let r of this.subagentMarkdown.values()){try{await r.flush()}catch{}r.dispose()}if(this.subagentMarkdown.clear(),this.toolLane.hasPending()){let r=this.toolLane.flush();if(this.isTTY&&this.compositor)Vt(this.compositor,r),this.compositor.commitAbove(""),this.overlayComposer?(this.overlayComposer.markDirty("tool-lane"),this.overlayComposer.flush()):this.compositor.setOverlay(this.toolLane.getOverlay());else{for(let o of r)this.out.line(o);this.out.line("")}}if(this.pauseTickInterval&&(clearInterval(this.pauseTickInterval),this.pauseTickInterval=null),this.compositor){if(this.ownsCompositor)try{this.compositor.disarm()}catch{}else{try{this.compositor.setSpinner({enabled:!1})}catch(r){W("[stream-renderer] borrow-dispose setSpinner: "+String(r))}try{this.overlayComposer?(this.overlayComposer.invalidate(),this.overlayComposer.flush()):this.compositor.setOverlay("")}catch(r){W("[stream-renderer] borrow-dispose setOverlay: "+String(r))}try{this.compositor.setInputMode("idle")}catch(r){W("[stream-renderer] borrow-dispose setInputMode: "+String(r))}try{this.compositor.setOnCancel(this.priorOnCancel??null)}catch(r){W("[stream-renderer] borrow-dispose setOnCancel: "+String(r))}this.priorOnCancel=void 0}this.compositor=null,this.borrowedCompositor=null}let n=this.out;if(typeof n.flush=="function")try{n.flush()}catch{}}checkPauseAnnotations(){WU({compositor:this.compositor,disposed:this.disposed,sources:this.sources,toolLane:this.toolLane,isTTY:this.isTTY,overlayComposer:this.overlayComposer,stageTracker:this.stageTracker,thinkingMode:this.thinkingMode,thinkingLane:this.thinkingLane,streamingMarkdownRef:this.streamingMarkdownRef,lastProgressByTask:this.lastProgressByTask,out:this.out,pauseTickInterval:this.pauseTickInterval,resizeUnsub:this.resizeUnsub})}};function Vh(e,t){let n=t.verbose??v.AFK_SKILL_STREAM_VERBOSE==="1",r=t.out??e.out,o=e.getCompositor?.()??null;return new Sl({out:r,verbose:n,activeSkillName:t.skillName,onCancel:t.onCancel??(()=>{}),...o?{compositor:o}:{},...e.onStageChange?{onStageChange:e.onStageChange}:{}})}function vl(e){let t=e!==void 0?r=>{e.fn(r)}:r=>{console.log(r)},n=e!==void 0&&e.rawFn!==void 0?r=>{e.rawFn(r)}:r=>{process.stdout.write(r)};return{line(r=""){t(r)},raw(r){n(r)},success(r){t(p.success("\u2713 ")+r)},info(r){t(p.info("\u2139 ")+r)},warn(r){t(p.warning("\u26A0 ")+r)},error(r){t(p.error("\u2717 ")+r)}}}Rr();var Aie="You are initializing this project for use with AFK (an AI agent CLI).\n\nYour job: scan this project and generate an `AFK.md` file in the project root. AFK.md is a plain markdown file (no YAML frontmatter) that serves as the system prompt for all AFK sessions in this project.\n\n## Steps\n\n1. **Discover project metadata** \u2014 read these files if they exist:\n - `package.json`, `tsconfig.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Makefile`, `CMakeLists.txt`\n - `.github/workflows/` (CI config)\n - `docker-compose.yml`, `Dockerfile`\n - `README.md` or `README`\n - Any existing `CLAUDE.md` or `AGENTS.md` (borrow relevant context)\n\n2. **Scan directory structure** \u2014 list top-level directories and key subdirectories to understand the project layout.\n\n3. **Generate AFK.md** with these sections:\n - **What This Is** \u2014 one-paragraph description of the project (language, framework, purpose)\n - **Commands** \u2014 build, test, lint, dev commands (extracted from package.json scripts, Makefile targets, etc.)\n - **Architecture** \u2014 key directories and their purpose, entry points, major subsystems\n - **Conventions** \u2014 coding style, naming patterns, anything notable from config files (strictness levels, linting rules)\n - Only include sections where you found real content. Skip empty sections.\n\n4. **Write the file** \u2014 write AFK.md to the project root. Keep it concise \u2014 under 150 lines. This file is loaded into every session, so brevity matters.\n\n## Format rules\n- Plain markdown, no YAML frontmatter\n- Use code blocks for commands\n- Use tables for directory layouts\n- Don't include boilerplate or filler \u2014 every line should earn its place",qU={name:"/init",summary:"Scan project and generate AFK.md",hint:"When you're in a fresh repo and want the model to bootstrap an AFK.md system prompt that captures conventions, commands, and architecture.",async handler(e,t){let n=dE(process.cwd(),"AFK.md"),r=dE(process.cwd(),"CLAUDE.md"),o=[];o.push({type:"text",text:Th("init",t)});let i=Aie;cE(n)&&!t.includes("--force")&&(i+=`
@@ -1643,7 +1643,7 @@ ${c}`)}o.push({type:"text",text:i});let l=Vh(e,{skillName:"init",out:vl(),onCanc
1643
1643
  `}function Qie(){let e=v.PAGER;if(e){let t=e.split(/\s+/);return{cmd:t[0],args:t.slice(1)}}return{cmd:"less",args:["-R"]}}var hj={name:"/transcript",aliases:["/t"],summary:"View full session transcript in $PAGER",hint:"When you want to read the full conversation \u2014 all turns, tool calls, costs \u2014 in a scrollable pager.",async handler(e){let{stats:t,out:n}=e;if(t.turns.length===0)return n.info("No turns yet in this session."),"continue";let r=Xie(t.turns,String(t.model),t.sessionStartTime,t.totalCostUsd);if(!process.stdout.isTTY)return n.raw(r),"continue";let o=Qie();if(!o)return n.raw(r),"continue";let i=gj.join(fj.tmpdir(),`afk-transcript-${Date.now()}.txt`);await mj.writeFile(i,r,{mode:384});let s=e.getCompositor?.()??null,a=!1,l=()=>{if(!a){a=!0;try{process.stdin.resume()}catch{}s?.resumeInput()}};s?.suspendInput();try{process.stdin.pause()}catch{}return new Promise(c=>{let d=m=>{l(),m&&n.raw(r),mj.unlink(i).catch(()=>{}),c("continue")},u;try{u=zie(o.cmd,[...o.args,i],{stdio:"inherit"})}catch{d(!0);return}u.on("error",()=>d(!0)),u.on("exit",()=>d(!1))})}};G();import{spawn as Zie}from"node:child_process";import{promises as Zh}from"node:fs";import*as yj from"node:os";import*as mE from"node:path";function ese(){let e=v.VISUAL?.trim()||v.EDITOR?.trim()||"";if(!e)return null;let t=e.split(/\s+/);return{cmd:t[0],args:t.slice(1)}}async function ey(e){let{compositor:t,notify:n}=e;if(!t||!process.stdout.isTTY)return n("info","The editor handoff needs an interactive terminal \u2014 not available on this surface."),"no-tty";let r=ese();if(!r)return n("error","No editor configured. Set $VISUAL or $EDITOR (e.g. `export EDITOR=vim`) to compose prompts externally."),"no-editor";let o=t.getBuffer().text,i=await Zh.mkdtemp(mE.join(yj.tmpdir(),"afk-editor-")),s=mE.join(i,"prompt.md");await Zh.writeFile(s,o,{mode:384});let a=!1,l=()=>{if(!a){a=!0;try{process.stdin.resume()}catch{}t.resumeInput()}};t.suspendInput();try{process.stdin.pause()}catch{}try{let c=await new Promise(m=>{let f;try{f=Zie(r.cmd,[...r.args,s],{stdio:"inherit"})}catch{m(Number.NaN);return}f.on("error",()=>m(Number.NaN)),f.on("exit",g=>m(g))});if(Number.isNaN(c))return n("warn",`Could not launch editor \`${r.cmd}\` \u2014 keeping your current prompt.`),"spawn-failed";if(c!==0)return n("warn",`Editor exited with status ${c} \u2014 keeping your current prompt.`),"kept";let d=await Zh.readFile(s,"utf8"),u=d.endsWith(`
1644
1644
  `)?d.slice(0,-1):d;return t.applyEdit(J.seed(u)),"loaded"}finally{l(),Zh.rm(i,{recursive:!0,force:!0}).catch(()=>{})}}var bj={name:"/editor",aliases:["/edit"],summary:"Compose the current prompt in your external $EDITOR (Ctrl+O)",hint:"When your prompt is long enough to want real editor keybindings \u2014 opens $VISUAL/$EDITOR seeded with the input box; on exit the text loads back for you to review and submit.",async handler(e){return await ey({compositor:e.getCompositor?.()??null,notify:(t,n)=>{t==="error"?e.out.error(n):t==="warn"?e.out.warn(n):e.out.info(n)}}),"continue"}};var wj=90,tse=20,Sj=300;function nse(e,t){let n=e.replace(/\s+/g," ").trim(),o=n.toLowerCase().indexOf(t.toLowerCase());if(o<0)return n;let i=Math.max(0,o-wj),s=Math.min(n.length,o+t.length+wj),a=n.slice(i,o),l=n.slice(o,o+t.length),c=n.slice(o+t.length,s),d=i>0?"\u2026":"",u=s<n.length?"\u2026":"";return`${d}${a}${p.warning(l)}${c}${u}`}function rse(e,t){let n=t.toLowerCase(),r=[];for(let o=0;o<e.length;o++){let i=e[o],s=(i.user??"").toLowerCase().includes(n),a=(i.assistant??"").toLowerCase().includes(n);if(!s&&!a)continue;let l=s?"user":"assistant",c=s?i.user:i.assistant;r.push({ordinal:o+1,role:l,snippet:nse(c,t)})}return r}function ose(e){for(let t=e.length-1;t>=0;t--){let n=e[t].toolEvents;if(!(!n||n.length===0))for(let r=n.length-1;r>=0;r--){let o=n[r];if(o.isError!==!0)continue;let i=(o.result??"").replace(/\s+/g," ").trim(),s=i.length>Sj?i.slice(0,Sj-1)+"\u2026":i;return{ordinal:t+1,toolName:o.toolName,snippet:s}}}return null}function ise(e){return e==="user"?`${p.brand("\u25B6")} ${p.meta("user")}`:`${p.brand("\u25C6")} ${p.meta("assistant")}`}function sse(e){let{stats:t,out:n}=e,r=ose(t.turns);if(!r){n.info("No tool errors recorded in this session.");return}n.line(),n.line(p.bold("Last tool error")),n.line(de());let o=` ${p.meta(`#${r.ordinal}`)} ${p.warning(r.toolName)}`;n.line(o),n.line(` ${r.snippet?p.dim(r.snippet):p.dim("(no error output captured)")}`),n.line()}function ase(e,t){let{stats:n,out:r}=e;if(n.turns.length===0){r.info("No turns yet in this session.");return}let o=rse(n.turns,t);if(o.length===0){r.info(`No matches for "${t}".`);return}let i=o.slice(-tse),s=o.length-i.length;r.line(),r.line(p.bold(`Search: "${t}" (${o.length} match${o.length===1?"":"es"})`)),r.line(de());for(let a of i)r.line(` ${p.meta(`#${a.ordinal}`)} ${ise(a.role)}`),r.line(` ${a.snippet}`);s>0&&(r.line(),r.line(p.dim(` \u2026and ${s} more (showing the ${i.length} most recent)`))),r.line()}var vj={name:"/search",usage:"/search <term> | /search --error",summary:"Search this session's turns (or --error to jump to the last tool error)",hint:"Find where something was said this session: /search <term> matches your prompts and the assistant's replies; /search --error jumps to the most recent tool failure.",flags:["--error"],async handler(e,t){let n=t.trim();return n==="--error"||n==="-e"?(sse(e),"continue"):n===""?(e.out.info("Usage: /search <term> (or /search --error to jump to the last tool error)"),"continue"):(ase(e,n),"continue")}};G();Be();jt();G();import{access as lse,constants as cse,mkdir as dse,readFile as use}from"fs/promises";import{execSync as pse}from"child_process";q();kr();async function mse(){return pn()?{name:"Anthropic API Key",state:"pass",detail:"ANTHROPIC_API_KEY set"}:{name:"Anthropic API Key",state:"fail",fix:"Set ANTHROPIC_API_KEY or run `afk login`"}}async function fse(){return Ig()?{name:"Codex/OpenAI API Key",state:"pass",detail:"OPENAI_API_KEY or CODEX_API_KEY set"}:{name:"Codex/OpenAI API Key",state:"warn",fix:"Set OPENAI_API_KEY or CODEX_API_KEY to use Codex models"}}async function gse(){try{let t=`${pse("npm config get prefix",{timeout:2e3,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim().replace(/\/$/,"")}/bin`;return(v.PATH??"").split(":").map(r=>r.replace(/\/$/,"")).includes(t)?{name:"npm bin on PATH",state:"pass",detail:t}:{name:"npm bin on PATH",state:"fail",detail:t,fix:`Add ${t} to PATH: echo 'export PATH="${t}:$PATH"' >> ~/.zshrc`}}catch{return{name:"npm bin on PATH",state:"warn",detail:"could not query npm prefix"}}}async function fE(e,t){let n=t();try{return await lse(n,cse.W_OK),{name:e,state:"pass",detail:n}}catch{try{return await dse(n,{recursive:!0}),{name:e,state:"pass",detail:`${n} (created)`}}catch{return{name:e,state:"fail",detail:n,fix:`Unable to create or write to ${n}`}}}}async function hse(){let e=Bt();try{let t=await use(e,"utf-8");return JSON.parse(t),{name:"Config File",state:"pass",detail:`${e} (valid JSON)`}}catch(t){return t.code==="ENOENT"?{name:"Config File",state:"pass",detail:"no config file (using defaults)"}:{name:"Config File",state:"fail",detail:e,fix:`Unable to parse config file: ${t instanceof Error?t.message:"unknown error"}`}}}async function yse(){let e=bR();return e.length===0?null:{name:"Required env vars",state:"fail",detail:`Missing: ${e.map(t=>t.name).join(", ")}`,fix:"Set these env vars before running. See docs/env-registry.md for descriptions."}}async function bse(){let e=v.AFK_TELEGRAM_BOT_TOKEN;if(!e)return null;try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://api.telegram.org/bot${e}/getMe`,{signal:t.signal});if(clearTimeout(n),r.ok){let i=(await r.json()).result?.username;return{name:"Telegram Bot",state:"pass",detail:i?`@${i}`:"connected"}}return{name:"Telegram Bot",state:"fail",fix:`Telegram API returned ${r.status}. Check AFK_TELEGRAM_BOT_TOKEN.`}}catch(t){return t.name==="AbortError"?{name:"Telegram Bot",state:"warn",detail:"connection timeout"}:{name:"Telegram Bot",state:"warn",detail:`network error: ${t instanceof Error?t.message:"unknown"}`}}}async function wse(e={}){let t;if(e.detected!==void 0)t=e.detected;else try{t=Ip()}catch{return null}let n=e.trusted??Ut()??{},r=t.filter(i=>i.present&&(i.plugins.length>0||i.skills.length>0)&&n[i.binary]===void 0);return r.length===0?null:{name:"Cross-tool import available",state:"warn",detail:r.map(i=>`${i.label} (${i.plugins.length} plugins, ${i.skills.length} skills)`).join("; "),fix:"Run `afk migrate` to import them"}}async function ty(){let e=[];e.push(await mse()),e.push(await fse()),e.push(await gse()),e.push(await fE("Config Directory",bn)),e.push(await fE("State Directory",Se)),e.push(await fE("Logs Directory",Vr)),e.push(await hse());let t=await yse();t!==null&&e.push(t);let n=await bse();n!==null&&e.push(n);let r=await wse();return r!==null&&e.push(r),e}Lc();Bc();var Sse="enter to submit \xB7 esc to cancel",vse=">";function ny(e,t){return new Promise(n=>{let{header:r,initial:o="",help:i=Sse,validate:s,signal:a}=t;if(a?.aborted){n(null);return}let l=J.seed(o),c=null,d=!1,u=y=>{d||(d=!0,a&&a.removeEventListener("abort",m),e.exitPickerMode(),n(y))},m=()=>u(null);a&&a.addEventListener("abort",m,{once:!0});let h={renderRows:()=>{let y=[];for(let b of r)y.push(b);return y.push(kse(l)),c!==null&&y.push(p.warning(" "+c)),y.push(p.dim(" "+i)),y},onKey:(y,b)=>{if(d)return;if(b.name==="escape"||b.ctrl&&b.name==="c"){u(null);return}if(b.name==="return"){if(s){let S=s(l.buffer);if(S!==null){c=S,e.repaintPicker();return}}u(l.buffer);return}let w=c!==null;if(b.name==="left"||b.ctrl&&b.name==="b"){l=J.moveLeft(l),c=null,e.repaintPicker();return}if(b.name==="right"||b.ctrl&&b.name==="f"){l=J.moveRight(l),c=null,e.repaintPicker();return}if(b.name==="home"||b.ctrl&&b.name==="a"){l=J.moveHome(l),c=null,e.repaintPicker();return}if(b.name==="end"||b.ctrl&&b.name==="e"){l=J.moveEnd(l),c=null,e.repaintPicker();return}if(b.name==="backspace"){l=J.backspace(l),c=null,e.repaintPicker();return}if(b.name==="delete"){l=J.deleteForward(l),c=null,e.repaintPicker();return}if(b.ctrl&&b.name==="w"){l=J.deleteWordBackward(l),c=null,e.repaintPicker();return}if(b.ctrl&&b.name==="u"){l=J.deleteToLineStart(l),c=null,e.repaintPicker();return}if(b.ctrl&&b.name==="k"){l=J.deleteToLineEnd(l),c=null,e.repaintPicker();return}if(y!==void 0&&y.length>0&&!Tse(y)){l=J.insert(l,y),c=null,e.repaintPicker();return}w&&(c=null,e.repaintPicker())}};e.enterPickerMode(h)})}function kse(e){let{buffer:t,cursor:n}=e,r=t.slice(0,n),o=n>=t.length,i=o?"\u258F":t.charAt(n),s=n<t.length?t.slice(n+1):"",a=o?p.caret(i):p.caret.inverse(i);return` ${p.dim(vse)} ${r}${a}${s}`}function Tse(e){if(e.length!==1)return!1;let t=e.charCodeAt(0);return t<32||t===127}Lc();Bc();var Ese=["Model & routing","Interactive","Session","Telegram","Advanced"];function xse(e){return e==="model"||e.startsWith("models.")||e==="temperature"||e==="maxTokens"||e.startsWith("autoRouting.")?"Model & routing":e.startsWith("interactive.")?"Interactive":e.startsWith("telegram.")?"Telegram":e.startsWith("daemon.")||e==="systemPrompt"||e==="permissionMode"||e==="enableShellHooks"||e==="enablePluginHooks"||e==="updatePolicy"?"Advanced":"Session"}function Rse(e){let t=new Map;for(let r of e){let o=xse(r.path),i=t.get(o);i?i.push(r):t.set(o,[r])}let n=[];for(let r of Ese){let o=t.get(r);o&&o.length>0&&n.push({name:r,keys:o})}return n}function gE(e){return e===void 0?"(unset)":e===null?"null":Array.isArray(e)?e.length===0?"(empty)":e.join(","):typeof e=="object"?JSON.stringify(e):String(e)}function Ase(e,t,n){return`${e.tier==="human"?"\u{1F512} ":" "}${e.path.padEnd(n)} ${gE(t)} (${e.type})`}function Cse(e){if(e.type==="boolean")return{kind:"pick",options:["true","false"]};if(e.type==="enum"&&e.enumValues&&e.enumValues.length>0)return{kind:"pick",options:[...e.enumValues]};let t="enter to save \xB7 esc to cancel";return e.type==="number"&&e.clamp?t=`number ${`[${e.clamp.min}..${e.clamp.max}]${e.clamp.integer?" integer":""}`} \xB7 enter to save \xB7 esc to cancel`:e.type==="number"?t="number \xB7 enter to save \xB7 esc to cancel":e.type==="number-array"?t="comma-separated numbers \xB7 enter to save \xB7 esc to cancel":e.type==="model-slot"&&(t="model id (e.g. sonnet) \xB7 enter to save \xB7 esc to cancel"),{kind:"text",help:t}}function _se(e){return t=>{let n=Dm(e,t);return n.ok?null:n.error}}var hE="\u2699 Settings";async function kj(e,t){let n=Rse(t.specs());if(n.length!==0)for(;;){let r=[p.bold(hE),p.dim("Changes apply on the next restart"),""],o=await e.pick(r,n.map(a=>`${a.name} \xB7 ${a.keys.length} setting${a.keys.length===1?"":"s"}`));if(o===null)return;let i=n[o];if(!i)return;let s=Math.min(28,Math.max(...i.keys.map(a=>a.path.length)));for(;;){let a=[p.bold(`${hE} \u203A ${i.name}`),""],l=await e.pick(a,i.keys.map(d=>Ase(d,t.current(d.path),s)));if(l===null)break;let c=i.keys[l];if(!c)break;await Ise(e,t,c)}}}async function Ise(e,t,n){let r=t.current(n.path),o=[p.bold(`${hE} \u203A ${n.path}`),p.dim(n.description),p.dim(`current: ${gE(r)}`),""],i=Cse(n),s;if(i.kind==="pick"){let l=await e.pick(o,i.options);if(l===null)return;let c=i.options[l];if(c===void 0)return;s=c}else{let l=r===void 0?"":gE(r),c=await e.editText(o,l,i.help,_se(n));if(c===null)return;s=c}let a=!1;if(n.tier==="human"){if(await e.pick([p.warning(`Apply human-tier change to ${n.path}?`),p.dim("This setting is normally changed via `afk config` on the CLI."),""],[`Yes \u2014 set to "${s}"`,"No \u2014 cancel"])!==0)return;a=!0}try{let l=t.write(n.path,s,a);e.emit(`${p.success(" \u2713")} ${n.path} = ${p.bold(l)} ${p.dim(`\u2014 ${dn}`)}`)}catch(l){e.emit(`${p.error(" \u2717")} ${p.error(l instanceof Error?l.message:String(l))}`)}}function Tj(e){return{async pick(t,n){let r=await dr(e,{header:t,options:n});if(!r||r.length===0)return null;let o=n.indexOf(r[0]);return o>=0?o:null},async editText(t,n,r,o){return ny(e,{header:t,initial:n,help:r,validate:o})},emit(t){e.commitAbove(t)}}}function Ej(){return{specs:()=>QS,current:e=>ra(e).value,write:(e,t,n)=>String(ho(e,t,n?{allowHumanOnly:!0}:void 0).value)}}function ry(e){let t=v.AFK_MODEL??v.CLAUDE_MODEL,n=t??"sonnet",r=re(t),o=v.ANTHROPIC_API_KEY||v.CLAUDE_CODE_OAUTH_TOKEN,i=v.OPENAI_API_KEY||v.CODEX_API_KEY,s=r==="anthropic"?o:i;if(e.line(),e.line(p.bold("Configuration")),e.line(de()),e.line(` model ${p.info(t?n:`${n} (default)`)}`),e.line(` provider ${p.plan(r)}`),r==="anthropic"){let d=s?p.success("\u2713 set (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN)"):p.warning("\u26A0 not set \u2014 subprocess falls back to OAuth / keychain");e.line(` api key ${d}`)}else{let d=v.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY",u=s?p.success(`\u2713 set (${d})`):p.warning("\u26A0 not set \u2014 falling back to `codex login` state");e.line(` api key ${u}`)}e.line(` thinking ${v.AFK_THINKING?p.info(v.AFK_THINKING):p.dim("(unset \u2014 SDK default)")}`),e.line(` effort ${v.AFK_EFFORT?p.info(v.AFK_EFFORT):p.dim("(unset \u2014 SDK default)")}`);let a=Ls();e.line(` perm mode ${a==="bypassPermissions"?p.warning(`${a} (bypass \u2014 containment off)`):p.info(`${a} (containment on)`)}`),e.line(),e.line(p.bold("Environment variables")),e.line(de());let l=[["AFK_MODEL",v.AFK_MODEL??p.dim("unset")],["CLAUDE_MODEL",v.CLAUDE_MODEL??p.dim("unset")],["ANTHROPIC_API_KEY",v.ANTHROPIC_API_KEY?p.success("set"):p.dim("unset")],["CLAUDE_CODE_OAUTH_TOKEN",v.CLAUDE_CODE_OAUTH_TOKEN?p.success("set"):p.dim("unset")],["OPENAI_API_KEY",v.OPENAI_API_KEY?p.success("set"):p.dim("unset")],["CODEX_API_KEY",v.CODEX_API_KEY?p.success("set"):p.dim("unset")],["AFK_THINKING",v.AFK_THINKING??p.dim("unset")],["AFK_EFFORT",v.AFK_EFFORT??p.dim("unset")]],c=Math.max(...l.map(([d])=>d.length))+2;for(let[d,u]of l)e.line(` ${p.meta(d.padEnd(c))} ${u}`);e.line()}function Pse(e,t){let n=t.trim(),r=n.indexOf(" ");if(r===-1)return e.out.warn("Usage: /config set <key> <value>"),"continue";let o=n.slice(0,r).trim(),i=n.slice(r+1).trim(),s=$m(o);if(!s)return e.out.error(`Unknown config key: ${o} (type /config to browse settings)`),"continue";if(s.tier==="human")return e.out.warn(`${o} is human-tier \u2014 set it from the interactive menu (/config) or \`afk config set ${o} <value>\`.`),"continue";try{let a=ho(o,i);e.out.success(`\u2713 set ${o} = ${String(a.value)} \u2014 ${dn}`)}catch(a){e.out.error(a instanceof Error?a.message:String(a))}return"continue"}var Mse={name:"/config",summary:"View or edit configuration \u2014 interactive settings menu on a TTY",usage:"/config [view | set <key> <value>]",hint:"Browse and edit config mid-session in an arrow-key settings menu. `/config view` prints the resolved configuration; `/config set <key> <value>` sets one agent-tier key. Changes apply on the next restart \u2014 same store as `afk config`.",async handler(e,t){let n=t.trim();if(n==="view")return ry(e.out),"continue";if(n==="set"||n.startsWith("set "))return Pse(e,n==="set"?"":n.slice(4));if(n.length>0&&n!=="edit"&&n!=="menu")return e.out.warn(`Unknown argument: ${n} (usage: /config [view | set <key> <value>])`),ry(e.out),"continue";let r=e.getCompositor?.()??null;if(!r)return ry(e.out),e.out.line(p.dim(" Interactive editing needs a TTY. Use `/config set <key> <value>` or `afk config`.")),"continue";try{await kj(Tj(r),Ej())}catch(o){e.out.error(`Could not open the settings menu: ${o instanceof Error?o.message:String(o)}`),e.out.line(p.dim(" Showing the read-only view instead:")),ry(e.out)}return"continue"}},Ose={name:"/doctor",summary:"Run system health checks (API keys, directories, config file, Telegram)",hint:"When something feels broken \u2014 API key missing, config file unreadable, Telegram bot unreachable. Same checks as `afk doctor` but surfaced mid-session without exiting.",async handler(e){let{out:t}=e;t.line(),t.line(p.bold("System health checks")),t.line(de());let n;try{n=await ty()}catch(a){return t.error(`Health check failed: ${a instanceof Error?a.message:String(a)}`),"continue"}for(let a of n){let l;a.state==="pass"?l=p.success("\u2713"):a.state==="warn"?l=p.warning("\u26A0"):l=p.error("\u2717");let c=` ${l} ${a.name}`;a.detail&&(c+=` \u2014 ${p.dim(a.detail)}`),t.line(c),a.state!=="pass"&&a.fix&&t.line(p.dim(` Fix: ${a.fix}`))}let r=n.filter(a=>a.state==="pass").length,o=n.filter(a=>a.state==="warn").length,i=n.filter(a=>a.state==="fail").length;t.line();let s=[p.success(`${r} passed`),o>0?p.warning(`${o} warned`):p.dim(`${o} warned`),i>0?p.error(`${i} failed`):p.dim(`${i} failed`)];return t.line(` Summary: ${s.join(p.dim(" \xB7 "))}`),t.line(),"continue"}},xj=[Mse,Ose];Ot();G();q();bk();import{readdirSync as $se,readFileSync as Dse,statSync as Rj}from"fs";import{join as Fse}from"path";function yE(e){let t=e??vr(),n=new Map;try{Rj(t)}catch{return n}let r=(o,i)=>{if(i>8)return;let s;try{s=$se(o)}catch{return}for(let a of s){let l=Fse(o,a),c;try{c=Rj(l)}catch{continue}if(c.isDirectory()){r(l,i+1);continue}if(a!=="SKILL.md"||!c.isFile())continue;let d;try{d=Dse(l,"utf-8")}catch{continue}let u=l.split("/"),m=u[u.length-2];if(!m)continue;let f=tg(d);if(f.length===0)continue;let g=n.get(m)??[],h=new Set([...g,...f]);n.set(m,Array.from(h).sort())}};return r(t,0),n}function oy(){let e=yE();for(let[t,n]of yE(gs())){let r=e.get(t)??[];e.set(t,Array.from(new Set([...r,...n])).sort())}return e}function du(e){if(!e)return;let t=e.split(/(?<=[.!?])\s+/);for(let n of t){let r=/^(Use(?:d)? when\b.*|When\s+(?:the\s+user\s+|to\s+)?\b.*)$/i.exec(n.trim());if(r&&r[1]){let o=r[1].trim();if(o.length>=12)return o}}}var pr={discovered:[],collisions:[],shadowedBareNames:new Set};function Aj(e){pr=e}function fn(e){return e.includes(":")?e.split(":").pop():e}function wE(e){return e==="user"?"user":e==="project"?"project":e?.startsWith("imported:")?"imported":"builtin"}function Lse(e,t){let n=new Map,r=i=>{let s=fn(i.slashName.replace(/^\//,"")),a=n.get(s);a?a.alts.push(i):n.set(s,{main:i,alts:[]})};for(let i of qw(t)){let s=ze(i),a=`/${i}`,l=s.argumentHint?`${a} ${s.argumentHint}`:a;r({slashName:a,display:l,description:s.description,source:wE(s.origin)})}let o=new Map(pr.collisions.map(i=>[i.bare,i.altSlash]));for(let i of e){let s=fn(i.name),l=o.get(s)??`/${i.name}`,c=i.argumentHint?`${l} ${i.argumentHint}`:l;r({slashName:l,display:c,description:i.description,source:"plugin"})}return n}function bE(e){switch(e){case"builtin":return"built-in";case"user":return"user";case"project":return"project";case"plugin":return"plugin";case"imported":return"imported"}}function Cj(e,t){let n=fn(e.main.slashName.replace(/^\//,"")),r=fn(t.main.slashName.replace(/^\//,""));return n.localeCompare(r)}function _j(e,t,n,r){let{main:o,alts:i}=t,s=me(o.description,r).split(`
1645
1645
  `);if(X(o.display)>n-1){e.out.line(" "+p.warning(o.display));for(let a of s)e.out.line(" "+" ".repeat(n)+p.dim(a))}else{let a=nt(p.warning(o.display),n);e.out.line(" "+a+p.dim(s[0]??""));for(let l of s.slice(1))e.out.line(" "+" ".repeat(n)+p.dim(l))}if(i.length>0){let a=i.map(l=>l.slashName).join(", ");for(let l of me(`\u21B3 also: ${a}`,r).split(`
1646
- `))e.out.line(" "+" ".repeat(n)+p.dim(l))}}function Ij(e,t,n){let r=Lse(t,n);if(e.out.line(),r.size===0){e.out.line(p.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}let o=Array.from(r.values()),i=o.reduce((g,h)=>g+h.alts.length,0),s=o.filter(g=>g.main.source==="builtin").sort(Cj),a=o.filter(g=>g.main.source!=="builtin").sort(Cj),l=Math.max(20,ne()),c=o.reduce((g,h)=>Math.max(g,X(h.main.display)),0),d=Math.min(c+2,Math.max(10,Math.floor((l-2)*.45))),u=Math.max(12,l-2-d);e.out.line(p.bold("Skills")+p.dim(` (${o.length})`));let m=new Set(o.map(g=>g.main.source)),f=["builtin","user","project","plugin"].filter(g=>m.has(g)).map(bE).join(" \xB7 ");if(e.out.line(p.dim(` ${f} \u2014 /skills <name> for details`)),s.length>0){e.out.line(),e.out.line(de("Built-in"));for(let g of s)_j(e,g,d,u)}if(a.length>0){e.out.line(),e.out.line(s.length>0?de("Plugins & user skills"):de());for(let g of a)_j(e,g,d,u)}e.out.line(),e.out.line(p.dim(i>0?" Tip: \u21B3 also lines show alternative (shadowed) forms \xB7 /skills <name> for full details":" Tip: /skills <name> for full details on a skill")),e.out.line()}function Nse(e,t){try{let n=ze(e);return nn(n,t)?n:void 0}catch{return}}function Bse(e,t){let n=[];for(let r of qw(t))if(r.includes(":")&&fn(r)===e){let o=wE(ze(r).origin);n.push({slash:`/${r}`,source:o})}for(let r of pr.collisions)r.bare===e&&n.push({slash:r.altSlash,source:"plugin"});return n}function Pj(e,t,n,r){let o=t.replace(/^\//,"").trim(),i=Nse(o,r),s=n.find(b=>fn(b.name)===o||b.name===o);if(!i&&!s){e.out.line(),e.out.line(p.dim(` No skill found matching "${o}".`)),e.out.line(p.dim(" Run /skills to see everything available.")),e.out.line();return}let a=i?.name??fn(s.name),l=i?.description??s.description,c=i?.argumentHint??s?.argumentHint,d=c?`/${a} ${c}`:`/${a}`,u=i?wE(i.origin):"plugin",m=Math.max(20,ne()),f=Math.max(20,Math.min(m-2,100));e.out.line(),e.out.line(` ${p.warning(d)}`),e.out.line();for(let b of me(l,f).split(`
1646
+ `))e.out.line(" "+" ".repeat(n)+p.dim(l))}}function Ij(e,t,n){let r=Lse(t,n);if(e.out.line(),r.size===0){e.out.line(p.dim(" No skills available. Built-in skills should always load \u2014 check your install.")),e.out.line();return}let o=Array.from(r.values()),i=o.reduce((g,h)=>g+h.alts.length,0),s=o.filter(g=>g.main.source==="builtin").sort(Cj),a=o.filter(g=>g.main.source!=="builtin").sort(Cj),l=Math.max(20,Q()),c=o.reduce((g,h)=>Math.max(g,X(h.main.display)),0),d=Math.min(c+2,Math.max(10,Math.floor((l-2)*.45))),u=Math.max(12,l-2-d);e.out.line(p.bold("Skills")+p.dim(` (${o.length})`));let m=new Set(o.map(g=>g.main.source)),f=["builtin","user","project","plugin"].filter(g=>m.has(g)).map(bE).join(" \xB7 ");if(e.out.line(p.dim(` ${f} \u2014 /skills <name> for details`)),s.length>0){e.out.line(),e.out.line(de("Built-in"));for(let g of s)_j(e,g,d,u)}if(a.length>0){e.out.line(),e.out.line(s.length>0?de("Plugins & user skills"):de());for(let g of a)_j(e,g,d,u)}e.out.line(),e.out.line(p.dim(i>0?" Tip: \u21B3 also lines show alternative (shadowed) forms \xB7 /skills <name> for full details":" Tip: /skills <name> for full details on a skill")),e.out.line()}function Nse(e,t){try{let n=ze(e);return nn(n,t)?n:void 0}catch{return}}function Bse(e,t){let n=[];for(let r of qw(t))if(r.includes(":")&&fn(r)===e){let o=wE(ze(r).origin);n.push({slash:`/${r}`,source:o})}for(let r of pr.collisions)r.bare===e&&n.push({slash:r.altSlash,source:"plugin"});return n}function Pj(e,t,n,r){let o=t.replace(/^\//,"").trim(),i=Nse(o,r),s=n.find(b=>fn(b.name)===o||b.name===o);if(!i&&!s){e.out.line(),e.out.line(p.dim(` No skill found matching "${o}".`)),e.out.line(p.dim(" Run /skills to see everything available.")),e.out.line();return}let a=i?.name??fn(s.name),l=i?.description??s.description,c=i?.argumentHint??s?.argumentHint,d=c?`/${a} ${c}`:`/${a}`,u=i?wE(i.origin):"plugin",m=Math.max(20,Q()),f=Math.max(20,Math.min(m-2,100));e.out.line(),e.out.line(` ${p.warning(d)}`),e.out.line();for(let b of me(l,f).split(`
1647
1647
  `))e.out.line(` ${b}`);let g=i?.whenToUse??du(l);if(g&&g!==l.trim()){e.out.line(),e.out.line(` ${p.bold("When to use")}`);for(let b of me(g,f).split(`
1648
1648
  `))e.out.line(` ${p.dim(b)}`)}let h=i?.flags??oy().get(o);h&&h.length>0&&(e.out.line(),e.out.line(` ${p.bold("Flags")} ${p.dim(h.join(", "))}`)),e.out.line(),e.out.line(` ${p.bold("Source")} ${p.dim(bE(u))}`);let y=Bse(a,r);if(y.length>0){e.out.line(),e.out.line(` ${p.bold("Alternatives")}`);for(let b of y)e.out.line(` ${p.dim("\u21B3")} ${p.warning(b.slash)} ${p.dim(`(${bE(b.source)} \u2014 shadowed by /${a})`)}`)}e.out.line()}var SE={name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",usage:"/skills [name]",hint:"When you want to browse every skill the session can dispatch \u2014 pass a name for full details on one.",async handler(e,t){let n=v.AFK_INTERNAL==="1",r=t.trim();return r&&!r.startsWith("-")?Pj(e,r,[],n):Ij(e,[],n),"continue"}};function Mj(e){return{name:"/skills",aliases:["/builtin-skills"],summary:"List all skills available in this session \u2014 vendored, user, and plugin",usage:"/skills [name]",hint:"When you want to browse every skill the session can dispatch \u2014 pass a name for full details on one.",async handler(t,n){let r=v.AFK_INTERNAL==="1",o=n.trim();return o&&!o.startsWith("-")?Pj(t,o,e,r):Ij(t,e,r),"continue"}}}$r();rr();q();$r();Jt();Sd();import{basename as Use}from"path";function jse(e,t,n){let r=new Set([e]);t&&r.add(t);for(let[o,i]of Object.entries(n)){if(r.has(o))return i;let s=o.includes(":")?o.split(":").pop():o;if(r.has(s)||i.manifestName&&r.has(i.manifestName))return i}return null}function Oj(e={}){let t=e.roots??[Hu(),He(),gs()],n=Re(e.indexPath??ge()),r=[],o=new Set;for(let i of t)for(let s of Mn(i)){if(s.type!=="local")continue;let a=s.path,l=Use(a),{name:c,version:d}=Nr(a),u=c??l;if(o.has(u))continue;o.add(u);let m=jse(l,c,n.plugins);r.push({name:u,version:d,ref:m?.ref??null,commit:m?.commit??null,source:m?.source??null,sourceType:m?.sourceType??null,dir:a})}return r.sort((i,s)=>i.name.localeCompare(s.name)),r}function $j(e){let t;return e.version?t=/^v/i.test(e.version)?e.version:`v${e.version}`:e.ref?t=e.ref:t="(local)",e.commit&&e.commit!==e.ref&&(t+=` @ ${e.commit.slice(0,7)}`),t}var vE=[],Hse={name:"/agents",summary:"List plugin-provided subagents (loads after session init)",async handler(e){return e.out.line(),e.out.line(p.dim(" Plugin agents are still loading \u2014 try again after the session is ready.")),e.out.line(),"continue"}};function Wse(e){return{name:"/agents",summary:"List Task-tool subagents loaded by the SDK (plugin + user + project)",async handler(t){if(t.out.line(),e.length===0)return t.out.line(p.dim(" No plugin agents loaded. Agents come from `agents:` entries in plugin.json or from ~/.afk/agents/.")),t.out.line(),"continue";t.out.line(p.bold("Plugin agents")+p.dim(` (${e.length} loaded)`)),t.out.line(p.dim("\u2500".repeat(60)));let n=e.reduce((r,o)=>Math.max(r,o.name.length),0)+2;for(let r of e){let o=p.warning(r.name.padEnd(n)),i=r.model?p.dim(`[${r.model}]`):"",s=r.description?p.dim(` ${r.description}`):"";t.out.line(` ${o} ${i}${s}`)}return t.out.line(),t.out.line(p.dim(" Agents are dispatched by the model via the Task tool \u2014 not user-invoked.")),t.out.line(),"continue"}}}async function iy(e){let t;try{t=await e.supportedAgents()}catch(n){return console.error(p.dim(" \u26A0 Plugin-agent discovery failed: ")+(n instanceof Error?n.message:String(n))),null}return vE=t.map(n=>{let r={name:n.name,description:n.description};return n.model&&(r.model=n.model),r}),Fo(Wse(vE)),vE.length}function Dj(){be(Hse)}Ot();Rr();function sy(e,t){for(let n of t??[])e.push({type:"image",source:{type:"base64",media_type:n.mediaType,data:n.bytes.toString("base64")}})}function Fj(e,t,n,r){let o=Th(e.name,t),i=e.context==="fork"?" This skill runs with context: 'fork' \u2014 the executor will fork a subagent.":"",s=`Use the \`skill\` tool with {"name": "${e.name}", "arguments": "${t}"} to dispatch this skill.${i}`,a=[];return n&&n.trim().length>0&&a.push({type:"text",text:n}),a.push({type:"text",text:o}),a.push({type:"text",text:s}),sy(a,r),a}var Kse=15e3;async function ay(e,t){let n=Vh(e,{skillName:t.skillName,onCancel:()=>{e.session.current.interrupt().catch(()=>{})}}),r=!1,o=`/${t.skillName}${t.args?" "+t.args:""}`;await e.transcript?.appendUser?.(o).catch(()=>{});let i="",s=!1,a,l=0,c=[],d=new Map;try{await n.arm(),e.setSoftStopHandler?.(()=>{r=!0,e.session.current.interrupt().catch(()=>{})});let u;if(t.preflight)try{u=await t.preflight()}catch{u=void 0}let m=Fj(t.skillMeta,t.args,u,t.attachments);await Ws(n.sink,async()=>{for await(let f of e.session.current.sendMessageStream(m)){if(r)break;if(f.type==="message"&&f.message.role==="assistant"&&(i=f.message.content),f.type==="chunk"&&f.chunk.type==="tool_use_detail"){let g=f.chunk,h={toolName:g.toolName,toolUseId:g.toolUseId,input:g.toolInput};d.set(g.toolUseId,h),c.push(h)}else if(f.type==="chunk"&&f.chunk.type==="tool_result"){let g=f.chunk,h=d.get(g.toolUseId);if(h&&(h.result=g.content,h.isError=g.isError,d.delete(g.toolUseId)),e.onContextProgress){let y=Date.now();if(y-l>=Kse){l=y;try{let b=e.onContextProgress();b instanceof Promise&&await b}catch{}}}}else f.type==="done"&&(s=!0,a=f.metadata);n.sink(f)}})}finally{e.setSoftStopHandler?.(null),await n.dispose();try{e.onStageChange?.("observing")}catch{}}if(s&&!r){Di(e.stats,o,i,a,c);try{e.ui.repaintStatusLine()}catch{}await e.transcript?.appendTurn(o,i).catch(()=>{})}return i}G();import{execFile as Gse}from"child_process";import{promisify as qse}from"util";import{writeFileSync as zse}from"fs";import{join as Jse}from"path";var Yse=qse(Gse),Vse=4*1024*1024,kE=!1;function TE(e){let t=e.trim();if(!t)return null;if(/^#?\d+$/.test(t)){let r=t.replace(/^#/,""),o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number: ${r}. Must be 1\u2013999999.`);return r}let n=t.match(/github\.com\/[^/]+\/[^/]+\/pull\/(\d+)/);if(n&&n[1]){let r=n[1],o=parseInt(r,10);if(!(o>0&&o<1e6))throw new Error(`[afk preflight] Invalid PR number in URL: ${r}. Must be 1\u2013999999.`);return r}return null}async function Xse(e,t,n){try{let{stdout:r}=await Yse(e,t,{encoding:"utf-8",...n?.cwd?{cwd:n.cwd}:{},maxBuffer:n?.maxBuffer??Vse,timeout:8e3});return r}catch(r){if(v.AFK_DEBUG==="1"&&r instanceof Error&&"stderr"in r){let i=String(r.stderr??"").replace(/\x1b\[[0-9;]*m/g,"").slice(0,200).trim();i&&process.stderr.write(`[afk preflight] ${e} stderr: ${i}
1649
1649
  `)}return null}}async function Qse(e,t,n={}){let r=n.exec??Xse,o=n.writeFile??((f,g)=>zse(f,g,"utf-8")),[i,s,a]=await Promise.all([r("gh",["pr","view",e,"--json","title,baseRefName,headRefName,additions,deletions,changedFiles,files"],{cwd:t.cwd}),r("gh",["pr","diff",e],{cwd:t.cwd}),r("git",["status","--porcelain"],{cwd:t.cwd})]),l=null;if(i)try{l=JSON.parse(i)}catch{l=null}let c=null,d=null;if(s!==null){let f=Jse(t.artifactDir,`pr-${e}.diff`);try{o(f,s),c=f,d=s.trimEnd().split(`
@@ -1665,7 +1665,7 @@ ${t}`}var Wj=!1;function Kj(){Wj||(Wj=!0,EE("review",Lj),Bj())}G();var cae=new S
1665
1665
  Do not simply re-assert Done.`;function v1(e){let t=e.maxInjectionsPerSession??Ile,n=0;return r=>r.event!=="Stop"?{}:e.isEnabled()?e.getPermissionMode()!=="autonomous"?{}:r.terminalState!=="done"?{}:r.doneHasCorroboratingEvidence!==!1?{}:n>=t?(W(`[terminal-state gate] injection budget exhausted (cap=${t}); letting unbacked Done stand (fail open)`,{sessionId:r.sessionId}),{}):(n+=1,W(`[terminal-state gate] injecting Done-evidence correction (${n}/${t})`,{sessionId:r.sessionId}),{injectContext:Ple}):{}}var Ey=class{entries=new Map;record(t){let n=this.entries.get(t.skillName);n?(n.runs+=1,n.totalDurationMs+=t.durationMs,t.claimsTotal!==void 0&&(n.totalClaims=(n.totalClaims??0)+t.claimsTotal),t.claimsConfirmed!==void 0&&(n.totalConfirmed=(n.totalConfirmed??0)+t.claimsConfirmed),t.claimsRefuted!==void 0&&(n.totalRefuted=(n.totalRefuted??0)+t.claimsRefuted),t.claimsInconclusive!==void 0&&(n.totalInconclusive=(n.totalInconclusive??0)+t.claimsInconclusive)):this.entries.set(t.skillName,{skillName:t.skillName,runs:1,totalDurationMs:t.durationMs,...t.claimsTotal!==void 0?{totalClaims:t.claimsTotal}:{},...t.claimsConfirmed!==void 0?{totalConfirmed:t.claimsConfirmed}:{},...t.claimsRefuted!==void 0?{totalRefuted:t.claimsRefuted}:{},...t.claimsInconclusive!==void 0?{totalInconclusive:t.claimsInconclusive}:{}})}summary(){return this.entries.size===0?null:new Map(this.entries)}clear(){this.entries=new Map}};Uv();var xy=class{source;sampleEveryNTurns;cachedRatio;cachedDetail;inFlight=null;disposed=!1;generation=0;constructor(t,n={}){this.source=t,this.sampleEveryNTurns=n.sampleEveryNTurns??3}attach(t){return this.source=t,this.generation+=1,this.reset(),this}getRatio(){return this.cachedRatio}getDetail(){return this.cachedDetail}async refresh(){if(this.disposed)return;if(this.inFlight)return this.inFlight;let t=this.doFetch().finally(()=>{this.inFlight=null});return this.inFlight=t,t}async onTurn(t){this.disposed||t%this.sampleEveryNTurns===1&&await this.refresh()}reset(){this.cachedRatio=void 0,this.cachedDetail=void 0,this.inFlight=null}dispose(){this.disposed=!0}async doFetch(){let t=this.generation;try{let n=await this.source.getContextUsage();if(this.generation!==t)return;let r=Mle(n.apiUsage),o=n.maxTokens??0,i=n.percentage;typeof i=="number"&&(this.cachedRatio=Math.min(1,Math.max(0,i/100)),this.cachedDetail={used:r,limit:o,percentage:i})}catch{}}};function Mle(e){return e?e.input_tokens+e.output_tokens+e.cache_creation_input_tokens+e.cache_read_input_tokens:0}Ge();gd();ok();ye();gp();ff();var Ole="claude-haiku-4-5",$le=15e3,Dle=1e3,Fle=80,Lle=200,Nle=3e3,Ble='Summarize what this background subagent is currently doing in \u226480 tokens. Be concrete: name specific tools used, files examined, decisions made. Avoid filler ("appears to be working on\u2026").';var Ry=class{registry;apiKey;model;intervalMs;maxInputTokens;maxOutputTokens;maxCallsPerSession;callLLM;getTranscriptFn;summaries=new Map;jobIndexMap=new Map;jobIndexCounter=0;callsThisSession=0;lastRefreshedAt=new Map;abortController=new AbortController;tickTimer;tickIntervalMs;constructor(t){this.registry=t.registry,this.apiKey=t.apiKey,this.model=t.model??Ole,this.intervalMs=t.intervalMs??$le,this.maxInputTokens=t.maxInputTokens??Dle,this.maxOutputTokens=t.maxOutputTokens??Fle,this.maxCallsPerSession=t.maxCallsPerSession??Lle,this.tickIntervalMs=Math.max(1e3,Math.floor(this.intervalMs/10)),t.callLLM!==void 0?this.callLLM=t.callLLM:this.callLLM=(n,r)=>Ms({token:this.apiKey,model:this.model,system:Ble,user:n,maxTokens:this.maxOutputTokens,signal:r}),this.getTranscriptFn=t.getTranscript??(n=>this.registry.getTranscript(n)),this.registry.on("started",n=>{this.jobIndexMap.set(n.jobId,this.jobIndexCounter++)}),this.registry.on("settled",n=>{this.summaries.delete(n.jobId),this.jobIndexMap.delete(n.jobId),this.lastRefreshedAt.delete(n.jobId)})}start(){this.tickTimer===void 0&&(this.abortController=new AbortController,this.tickTimer=setInterval(()=>{this.tick()},this.tickIntervalMs))}stop(){this.tickTimer!==void 0&&(clearInterval(this.tickTimer),this.tickTimer=void 0),this.abortController.abort()}getSummary(t){return this.summaries.get(t)}async tick(){let t=Date.now(),n=this.registry.list().filter(o=>o.status==="running"),r=[];for(let o of n){let s=(this.jobIndexMap.get(o.jobId)??0)*Nle%this.intervalMs,a=this.intervalMs-1e3-s,l=this.lastRefreshedAt.get(o.jobId)??0;if(!(t-l<a)){if(this.callsThisSession>=this.maxCallsPerSession){W(`[BackgroundSummarizer] budget cap (${this.callsThisSession}/${this.maxCallsPerSession}) \u2014 skipping ${o.jobId}`);continue}this.callsThisSession++,r.push(o.jobId)}}await Promise.allSettled(r.map(o=>this.refreshJob(o,t)))}async refreshJob(t,n){let r=!1;try{let o=this.getTranscriptFn(t);if(o===void 0||o.trim().length===0)return;let i=this.maxInputTokens*4,s=o.length>i?o.slice(-i):o,l=`Transcript tail:
1666
1666
  <transcript>
1667
1667
  ${ga(s)}
1668
- </transcript>`;this.lastRefreshedAt.set(t,n);let c=await this.callLLM(l,this.abortController.signal);this.summaries.set(t,{text:c.trim(),refreshedAt:n,stale:!1}),r=!0}catch(o){if(W(`[BackgroundSummarizer] Haiku call failed for ${t}:`,o),!this.abortController.signal.aborted){let i=this.summaries.get(t);i!==void 0&&this.summaries.set(t,{...i,stale:!0})}}finally{r||this.callsThisSession--}}};hd();Pn();Sa();Mi();Be();function k1(e,t){let n=new Map;return r=>{let o=t(r),i=n.get(o);if(i!==void 0)return i;let s=e(r);return n.set(o,s),s}}rr();kr();G();xe();function UE(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function fu(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(p.warning(`\u26A0 [resume-swap] ${t}: ${UE(r)}`))}async function T1(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(s){let a=s instanceof Error?s.message:String(s);return{ok:!1,reason:`buildSession failed: ${UE(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,s=>(r=UE(s instanceof Error?s.message:String(s)),!1))){await n.close().catch(a=>{fu(t.completionWriter,"new session close after init failure",a)});let s=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(p.warning(`\u26A0 ${s}`)),{ok:!1,reason:s}}await t.backgroundRegistry.cancelAll().catch(s=>{fu(t.completionWriter,"cancelAll failed",s)}),await t.sessionRef.current.close().catch(s=>{fu(t.completionWriter,"session close failed",s)}),t.sessionRef.current=n,e.stored?(uh(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.permissionMode="default";try{t.onSwapped(e)}catch(s){fu(t.completionWriter,"onSwapped callback threw",s)}t.contextSampler.attach(n),await uu(n).catch(s=>{fu(t.completionWriter,"autoRegisterPluginPassthroughs failed",s)});let i=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&i.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&i.push(st(t.stats.totalCostUsd)),t.stats.totalTokens>0&&i.push(ue(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(p.brand(i.join(" \xB7 "))),ph(t.stats,t.completionWriter),t.statusLine.repaint(On(t.stats,t.contextSampler,t.gitStatusSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function x1(e){return new Rt(Br(Pr({model:e.model,surface:"cli",apiKey:Ve(e.model),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory})))}async function A1(e,t){let n=Date.now(),r=Va(e),o=Xa(r),i=NL(t?.cwd,r?.stored?.cwd),s=r?.stored?.model??e.model,a=Ps(s);if(a)throw new Error(a);let l,c,d;l=_o(e.thinking)??ja(),c=Io(e.effort)??Ha(),d=Ka(e.maxOutputTokens)??Ad();let u=Ga(),{prompt:m,source:f}=Ua(),g=xt(),h=g.autoRouting?.interactive??!0,y=Mg(m,h,"repl"),b={current:null},w=r?.stored?.sessionId,S=Po(w?{sessionLabel:w}:{}),T=pn(),k=new le({apiKey:T,parentModel:Ze(),...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...i!==void 0?{cwd:i}:{},...S?.writer!==void 0?{traceWriter:S.writer}:{},surface:"cli"});ie(S?.writer,{phase:"bootstrap_start"});let A=new Kf(S?{traceWriter:S.writer}:{});DN(A);let R=g.bgSummaries===!0&&T?new Ry({registry:A,apiKey:T,maxCallsPerSession:g.maxSummaryCallsPerSession??200}):void 0;R?.start(),FN(R);let D=Ta(g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{}),_={get sessionId(){return b.current?.sessionId},getInputStreamRef(){return b.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return b.current?.abortSignal??new AbortController().signal},get hookRegistry(){return b.current?.hookRegistry}},O=Ci({...i!==void 0?{cwd:i}:{},pluginAgents:Ia()}),B=Ea(s,T,D,g.baseUrl,S?.writer,A,i,Ve,"cli",At(s),O,g.openaiBaseUrl),j=new sr({subagentManager:k,parentSession:_,surface:"cli",defaultConfig:{apiKey:T,systemPrompt:m,...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{}},defaultSubagentModel:At(s),childProviderFactory:D,childSkillExecutorFactory:B,backgroundRegistry:A,resolveApiKeyForModel:Ve,depth:0,...i!==void 0?{cwd:i}:{},agentRegistry:O,parentModel:s,...S?.writer!==void 0?{traceWriter:S.writer}:{}}),$=new ar({parentSession:_,surface:"cli",defaultModel:s,defaultSubagentModel:At(s),apiKey:T,childProviderFactory:D,childSkillExecutorFactory:B,agentRegistry:O,backgroundRegistry:A,...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{},resolveApiKeyForModel:Ve,...S?.writer!==void 0?{traceWriter:S.writer}:{},...i!==void 0?{cwd:i}:{},getReadScopeInputs:()=>k.getReadScopeInputs()}),H=new Ao({parentSession:_,defaultModel:s,defaultSubagentModel:At(s),apiKey:T,resolveApiKeyForModel:Ve,getReadScopeInputs:()=>k.getReadScopeInputs(),...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...i!==void 0?{cwd:i}:{},systemPrompt:m??"",surface:"cli",depth:0,...S?.writer!==void 0?{traceWriter:S.writer}:{}}),C=new ut,L;{let Ee=i??process.cwd(),yn=kn(Ut()).mcpConfigs.filter(Sr=>Sr.format==="json").map(Sr=>Sr.source),Nn=Ni({cwd:Ee,...yn.length>0?{importedMcpConfigs:yn}:{},...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),Nu=Object.values(Nn.mcpServers).filter(Sr=>!Sr.disabled).length;if(Nu>0){let Sr=Nn.sources.length===1?Nn.sources[0]:`${Nn.sources.length} source(s)`;console.log(p.dim(` mcp: ${Nu} server(s) from ${Sr??Li()}`));let d2=Date.now();ie(S?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Nu}});try{L=await jr.fromConfig(Nn.mcpServers,{warnings:Nn.warnings,...S?.writer!==void 0?{traceWriter:S.writer}:{}})}finally{ie(S?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-d2,metadata:{serverCount:Nu}})}}else if(Nn.warnings.length>0)for(let Sr of Nn.warnings)console.warn(`[mcp] ${Sr}`)}let P=L?.getMcpToolWireNames()??[],I=k1(Ee=>qa(e.provider,{subagentExecutor:j,skillExecutor:$,composeExecutor:H,memoryStore:C,model:Ee!==void 0?Ee:String(s),...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{},...L!==void 0?{mcpManager:L}:{}})??new Qe({permissions:{allowedTools:Pg(P)},subagentExecutor:j,skillExecutor:$,composeExecutor:H,memoryStore:C,surface:"cli",...L!==void 0?{mcpManager:L}:{}}),Ee=>e.provider??re(Ee!==void 0?Ee:String(s),g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:void 0)),U=I(String(s)),K=jg(s);r?.stored&&uh(K,r.stored,r.resumeId);let Q=e.dangerouslySkipPermissions?"bypassPermissions":g.permissionMode;Q!==void 0&&(K.permissionMode=Q),e.thinkingUi!==void 0&&(K.thinkingUi=e.thinkingUi),K.cwd=i??process.cwd(),S&&console.log(p.dim(` trace: ${S.tracePath}`)),t?.cwd===void 0&&i!==void 0&&E1(i)!==E1(process.cwd())&&console.log(p.dim(` \u21AA resuming in ${i}`));let ee={fn:Ee=>console.log(Ee),idleFn:Ee=>console.log(Ee)},se=new ch,z=S1(process.stdout,{statusLine:se}),fe=Na(Ee=>{fF(ee,Ee)},"cli",C,()=>K.permissionMode,La({cwd:i}),{cwd:i,...S?.writer!==void 0?{traceWriter:S.writer}:{}},()=>i??process.cwd()),Ne=fe.registry,vt=fe.pathApprovalGrantRef;Ne.register("Stop",v1({getPermissionMode:()=>K.permissionMode,isEnabled:()=>xt().enforceDoneEvidence===!0}));let Nt={model:s,resumeConfig:o,systemPrompt:y,systemPromptSource:f,thinking:l,effort:c,maxOutputTokens:d,maxToolUseIterations:u,...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},providerFactory:I,hookRegistry:Ne,traceWriter:S?.writer,cwd:i,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:g.autoResumeOnUsageLimit,...Q!==void 0?{permissionMode:Q}:{}};await Pa();let Ae=x1(Nt);b.current=Ae,k.setOnSubagentSucceeded((Ee,yn)=>{b.current?.recordSubagentCompletion(Ee,yn)});let ce=new Ey,qe=vl(ee),je=new xy(Ae),_e=new dh({cwd:K.cwd??process.cwd(),branchTtlMs:1e3}),Oe={session:b,stats:K,out:qe,ui:{clearScreen:()=>{let Ee=Oe.getCompositor?.();Ee?.setOverlay(""),Ee?.resetCommittedBand(),se.stop(),je.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),se.start(),se.repaint(On(K,je,_e))},repaintStatusLine:()=>se.repaint(On(K,je,_e))},ledger:ce,...L!==void 0?{mcpManager:L}:{}},wr=Ee=>(ce.clear(),T1(Ee,{sessionRef:b,stats:K,contextSampler:je,gitStatusSampler:_e,statusLine:se,backgroundRegistry:A,completionWriter:ee,isInFlight:()=>Yr.getInFlight?.()??!1,onSwapped:yn=>{Yr.resumeTarget=yn,Yr.clearVerdictLedger?.(),Yr.clearBgResultBuffer?.()},buildSession:yn=>x1({...Nt,model:yn.stored?.model??Nt.model,resumeConfig:Xa(yn),permissionMode:K.permissionMode})})),Yr={session:b,memoryStore:C,stats:K,statusLine:se,contextSampler:je,gitStatusSampler:_e,completionWriter:ee,replRenderer:z,slashCtx:Oe,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:A,subagentControl:j,...R!==void 0?{bgSummarizer:R}:{},requestResume:wr,getInFlight:()=>!1,...L!==void 0?{mcpManager:L}:{},suggestApiKey:T,...g.openaiBaseUrl!==void 0?{suggestBaseUrl:g.openaiBaseUrl}:{},...g.interactive?.suggestGhost!==void 0?{suggestGhostConfig:g.interactive.suggestGhost}:{},hookRegistry:fe.registry},hR=Ee=>{ee.fn(VU(Ee,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},yR=Ee=>{ee.fn(YU(Ee,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),ce.record(Ee)};DM(hR),OM(yR),Yr.teardownTrustedSkillEvents=()=>{FM(hR),$M(yR)},w1(),uF(U)?(rj(U),vt.current=U,qD(U)):v.AFK_DISABLE_PATH_APPROVAL!=="1"&&console.warn("[path-approval] active provider does not implement GrantManager \u2014 path-approval elicitation and bash restricted-path checks will not fire.");let _b=R1.createInterface({input:process.stdin,output:process.stdout,terminal:!1});Yr.rl=_b;let Ib={current:null};return Yr.inputSurfaceRef=Ib,Xe.install(Ud({readLine:Ee=>new Promise((yn,Nn)=>{_b.question(Ee,yn),_b.once("close",()=>Nn(new Error("readline closed")))}),writer:{line:(Ee="")=>process.stdout.write(Ee+`
1668
+ </transcript>`;this.lastRefreshedAt.set(t,n);let c=await this.callLLM(l,this.abortController.signal);this.summaries.set(t,{text:c.trim(),refreshedAt:n,stale:!1}),r=!0}catch(o){if(W(`[BackgroundSummarizer] Haiku call failed for ${t}:`,o),!this.abortController.signal.aborted){let i=this.summaries.get(t);i!==void 0&&this.summaries.set(t,{...i,stale:!0})}}finally{r||this.callsThisSession--}}};hd();Pn();Sa();Mi();Be();function k1(e,t){let n=new Map;return r=>{let o=t(r),i=n.get(o);if(i!==void 0)return i;let s=e(r);return n.set(o,s),s}}rr();kr();G();xe();function UE(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function fu(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(p.warning(`\u26A0 [resume-swap] ${t}: ${UE(r)}`))}async function T1(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(s){let a=s instanceof Error?s.message:String(s);return{ok:!1,reason:`buildSession failed: ${UE(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,s=>(r=UE(s instanceof Error?s.message:String(s)),!1))){await n.close().catch(a=>{fu(t.completionWriter,"new session close after init failure",a)});let s=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(p.warning(`\u26A0 ${s}`)),{ok:!1,reason:s}}await t.backgroundRegistry.cancelAll().catch(s=>{fu(t.completionWriter,"cancelAll failed",s)}),await t.sessionRef.current.close().catch(s=>{fu(t.completionWriter,"session close failed",s)}),t.sessionRef.current=n,e.stored?(uh(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.permissionMode="default";try{t.onSwapped(e)}catch(s){fu(t.completionWriter,"onSwapped callback threw",s)}t.contextSampler.attach(n),await uu(n).catch(s=>{fu(t.completionWriter,"autoRegisterPluginPassthroughs failed",s)});let i=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&i.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&i.push(st(t.stats.totalCostUsd)),t.stats.totalTokens>0&&i.push(ue(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(p.brand(i.join(" \xB7 "))),ph(t.stats,t.completionWriter),t.statusLine.repaint(On(t.stats,t.contextSampler,t.gitStatusSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function x1(e){return new Rt(Br(Pr({model:e.model,surface:"cli",apiKey:Ve(e.model),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory})))}async function A1(e,t){let n=Date.now(),r=Va(e),o=Xa(r),i=NL(t?.cwd,r?.stored?.cwd),s=r?.stored?.model??e.model,a=Ps(s);if(a)throw new Error(a);let l,c,d;l=_o(e.thinking)??ja(),c=Io(e.effort)??Ha(),d=Ka(e.maxOutputTokens)??Ad();let u=Ga(),{prompt:m,source:f}=Ua(),g=xt(),h=g.autoRouting?.interactive??!0,y=Mg(m,h,"repl"),b={current:null},w=r?.stored?.sessionId,S=Po(w?{sessionLabel:w}:{}),T=pn(),k=new le({apiKey:T,parentModel:Ze(),...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...i!==void 0?{cwd:i}:{},...S?.writer!==void 0?{traceWriter:S.writer}:{},surface:"cli"});ie(S?.writer,{phase:"bootstrap_start"});let A=new Kf(S?{traceWriter:S.writer}:{});DN(A);let R=g.bgSummaries===!0&&T?new Ry({registry:A,apiKey:T,maxCallsPerSession:g.maxSummaryCallsPerSession??200}):void 0;R?.start(),FN(R);let D=Ta(g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{}),_={get sessionId(){return b.current?.sessionId},getInputStreamRef(){return b.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return b.current?.abortSignal??new AbortController().signal},get hookRegistry(){return b.current?.hookRegistry}},O=Ci({...i!==void 0?{cwd:i}:{},pluginAgents:Ia()}),B=Ea(s,T,D,g.baseUrl,S?.writer,A,i,Ve,"cli",At(s),O,g.openaiBaseUrl),j=new sr({subagentManager:k,parentSession:_,surface:"cli",defaultConfig:{apiKey:T,systemPrompt:m,...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{}},defaultSubagentModel:At(s),childProviderFactory:D,childSkillExecutorFactory:B,backgroundRegistry:A,resolveApiKeyForModel:Ve,depth:0,...i!==void 0?{cwd:i}:{},agentRegistry:O,parentModel:s,...S?.writer!==void 0?{traceWriter:S.writer}:{}}),$=new ar({parentSession:_,surface:"cli",defaultModel:s,defaultSubagentModel:At(s),apiKey:T,childProviderFactory:D,childSkillExecutorFactory:B,agentRegistry:O,backgroundRegistry:A,...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{},resolveApiKeyForModel:Ve,...S?.writer!==void 0?{traceWriter:S.writer}:{},...i!==void 0?{cwd:i}:{},getReadScopeInputs:()=>k.getReadScopeInputs()}),H=new Ao({parentSession:_,defaultModel:s,defaultSubagentModel:At(s),apiKey:T,resolveApiKeyForModel:Ve,getReadScopeInputs:()=>k.getReadScopeInputs(),...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},...i!==void 0?{cwd:i}:{},systemPrompt:m??"",surface:"cli",depth:0,...S?.writer!==void 0?{traceWriter:S.writer}:{}}),C=new ut,L;{let Ee=i??process.cwd(),yn=kn(Ut()).mcpConfigs.filter(Sr=>Sr.format==="json").map(Sr=>Sr.source),Nn=Ni({cwd:Ee,...yn.length>0?{importedMcpConfigs:yn}:{},...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),Nu=Object.values(Nn.mcpServers).filter(Sr=>!Sr.disabled).length;if(Nu>0){let Sr=Nn.sources.length===1?Nn.sources[0]:`${Nn.sources.length} source(s)`;console.log(p.dim(` mcp: ${Nu} server(s) from ${Sr??Li()}`));let d2=Date.now();ie(S?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Nu}});try{L=await jr.fromConfig(Nn.mcpServers,{warnings:Nn.warnings,...S?.writer!==void 0?{traceWriter:S.writer}:{}})}finally{ie(S?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-d2,metadata:{serverCount:Nu}})}}else if(Nn.warnings.length>0)for(let Sr of Nn.warnings)console.warn(`[mcp] ${Sr}`)}let P=L?.getMcpToolWireNames()??[],I=k1(Ee=>qa(e.provider,{subagentExecutor:j,skillExecutor:$,composeExecutor:H,memoryStore:C,model:Ee!==void 0?Ee:String(s),...g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:{},...L!==void 0?{mcpManager:L}:{}})??new Qe({permissions:{allowedTools:Pg(P)},subagentExecutor:j,skillExecutor:$,composeExecutor:H,memoryStore:C,surface:"cli",...L!==void 0?{mcpManager:L}:{}}),Ee=>e.provider??re(Ee!==void 0?Ee:String(s),g.openaiBaseUrl!==void 0?{openaiBaseUrl:g.openaiBaseUrl}:void 0)),U=I(String(s)),K=jg(s);r?.stored&&uh(K,r.stored,r.resumeId);let Z=e.dangerouslySkipPermissions?"bypassPermissions":g.permissionMode;Z!==void 0&&(K.permissionMode=Z),e.thinkingUi!==void 0&&(K.thinkingUi=e.thinkingUi),K.cwd=i??process.cwd(),S&&console.log(p.dim(` trace: ${S.tracePath}`)),t?.cwd===void 0&&i!==void 0&&E1(i)!==E1(process.cwd())&&console.log(p.dim(` \u21AA resuming in ${i}`));let te={fn:Ee=>console.log(Ee),idleFn:Ee=>console.log(Ee)},se=new ch,z=S1(process.stdout,{statusLine:se}),fe=Na(Ee=>{fF(te,Ee)},"cli",C,()=>K.permissionMode,La({cwd:i}),{cwd:i,...S?.writer!==void 0?{traceWriter:S.writer}:{}},()=>i??process.cwd()),Ne=fe.registry,vt=fe.pathApprovalGrantRef;Ne.register("Stop",v1({getPermissionMode:()=>K.permissionMode,isEnabled:()=>xt().enforceDoneEvidence===!0}));let Nt={model:s,resumeConfig:o,systemPrompt:y,systemPromptSource:f,thinking:l,effort:c,maxOutputTokens:d,maxToolUseIterations:u,...g.baseUrl!==void 0?{baseUrl:g.baseUrl}:{},providerFactory:I,hookRegistry:Ne,traceWriter:S?.writer,cwd:i,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:g.autoResumeOnUsageLimit,...Z!==void 0?{permissionMode:Z}:{}};await Pa();let Ae=x1(Nt);b.current=Ae,k.setOnSubagentSucceeded((Ee,yn)=>{b.current?.recordSubagentCompletion(Ee,yn)});let ce=new Ey,qe=vl(te),je=new xy(Ae),_e=new dh({cwd:K.cwd??process.cwd(),branchTtlMs:1e3}),Oe={session:b,stats:K,out:qe,ui:{clearScreen:()=>{let Ee=Oe.getCompositor?.();Ee?.setOverlay(""),Ee?.resetCommittedBand(),se.stop(),je.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),se.start(),se.repaint(On(K,je,_e))},repaintStatusLine:()=>se.repaint(On(K,je,_e))},ledger:ce,...L!==void 0?{mcpManager:L}:{}},wr=Ee=>(ce.clear(),T1(Ee,{sessionRef:b,stats:K,contextSampler:je,gitStatusSampler:_e,statusLine:se,backgroundRegistry:A,completionWriter:te,isInFlight:()=>Yr.getInFlight?.()??!1,onSwapped:yn=>{Yr.resumeTarget=yn,Yr.clearVerdictLedger?.(),Yr.clearBgResultBuffer?.()},buildSession:yn=>x1({...Nt,model:yn.stored?.model??Nt.model,resumeConfig:Xa(yn),permissionMode:K.permissionMode})})),Yr={session:b,memoryStore:C,stats:K,statusLine:se,contextSampler:je,gitStatusSampler:_e,completionWriter:te,replRenderer:z,slashCtx:Oe,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:A,subagentControl:j,...R!==void 0?{bgSummarizer:R}:{},requestResume:wr,getInFlight:()=>!1,...L!==void 0?{mcpManager:L}:{},suggestApiKey:T,...g.openaiBaseUrl!==void 0?{suggestBaseUrl:g.openaiBaseUrl}:{},...g.interactive?.suggestGhost!==void 0?{suggestGhostConfig:g.interactive.suggestGhost}:{},hookRegistry:fe.registry},hR=Ee=>{te.fn(VU(Ee,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},yR=Ee=>{te.fn(YU(Ee,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),ce.record(Ee)};DM(hR),OM(yR),Yr.teardownTrustedSkillEvents=()=>{FM(hR),$M(yR)},w1(),uF(U)?(rj(U),vt.current=U,qD(U)):v.AFK_DISABLE_PATH_APPROVAL!=="1"&&console.warn("[path-approval] active provider does not implement GrantManager \u2014 path-approval elicitation and bash restricted-path checks will not fire.");let _b=R1.createInterface({input:process.stdin,output:process.stdout,terminal:!1});Yr.rl=_b;let Ib={current:null};return Yr.inputSurfaceRef=Ib,Xe.install(Ud({readLine:Ee=>new Promise((yn,Nn)=>{_b.question(Ee,yn),_b.once("close",()=>Nn(new Error("readline closed")))}),writer:{line:(Ee="")=>process.stdout.write(Ee+`
1669
1669
  `)},pendingCount:()=>Xe.pendingCount(),suspendInput:()=>Ib.current?.suspendForElicitation(),resumeInput:()=>Ib.current?.resumeAfterElicitation()})),Oe.requestResume=wr,ie(S?.writer,{phase:"bootstrap_done",durationMs:Date.now()-n}),Yr}xr();q();import{promises as jE}from"node:fs";import*as _1 from"node:path";async function C1(e,t,n=!1){await jE.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=_1.join(e,`${r}.md`),i=n?" (continued)":"";return await jE.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${i}
1670
1670
 
1671
1671
  - model: ${t}
@@ -1718,18 +1718,18 @@ _ended: ${new Date().toISOString()}_
1718
1718
  `),T=1;else if(k!==null){let se=k;k=null,n.write(se+`
1719
1719
  `),T=1}else T=0;n.write(a+Bo(f.buffer,O)),g.trigger=qd(f.buffer,f.cursor);let M=`${f.cursor}:${f.buffer}`;g.suppressedSignature!==null&&g.suppressedSignature!==M&&(g.suppressedSignature=null),g.trigger&&g.suppressedSignature===null?(g.trigger.kind==="slash"?g.candidates=_h(g.trigger.query).slice(0,12):g.trigger.kind==="file"?g.candidates=gB(g.trigger.query):g.candidates=zd(g.trigger.command,g.trigger.query),g.dropdownOpen=g.candidates.length>0):(g.dropdownOpen=!1,g.candidates=[]),g.selectedIndex>=g.candidates.length&&(g.selectedIndex=Math.max(0,g.candidates.length-1)),g.viewportStart>g.selectedIndex&&(g.viewportStart=g.selectedIndex),g.selectedIndex>=g.viewportStart+F&&(g.viewportStart=g.selectedIndex-F+1);let I=n.columns||80;if(h=0,g.dropdownOpen&&I>40){let se=Math.min(I-4,60),z=Math.min(g.candidates.length-g.viewportStart,F);for(let vt=0;vt<z;vt++){let Nt=g.viewportStart+vt,Ae=Ph(g.candidates[Nt],Nt===g.selectedIndex,se,g.trigger?.kind);n.write(`
1720
1720
  `+Ae);let ce=qE(Ie(Ae));h+=Math.max(1,Math.ceil(ce/I))}let fe=Math.min(I-4,80),Ne=Mh(g.candidates[g.selectedIndex]?.hint,fe);if(Ne!==null){n.write(`
1721
- `+Ne);let vt=qE(Ie(Ne));h+=Math.max(1,Math.ceil(vt/I))}}let U=OT(f.buffer,l,I),{row:K,col:Q}=WN(f.buffer,f.cursor,l,I),ee=Math.max(0,U-K+h);ee>0&&n.write(Xt.cursorUp(ee)),n.write("\r"),Q>0&&n.write(Xt.cursorForward(Q)),S=U},j=!1,$=()=>{D||(D=!0,setImmediate(()=>{D&&!j&&(D=!1,B())}))};B();let H=()=>{let M=g.candidates[g.selectedIndex];if(!M)return!1;let I=f.buffer.slice(0,f.cursor),U=f.buffer.slice(f.cursor),K,Q;if(g.trigger?.kind==="slash"){let ee=/\/[A-Za-z_-]*$/.exec(I);K=ee?I.length-ee[0].length:f.cursor,Q=M.value+(U.startsWith(" ")?"":" ")}else if(g.trigger?.kind==="flag"){let ee=/--[a-z0-9-]*$/.exec(I);K=ee?I.length-ee[0].length:f.cursor,Q=M.value+(U.startsWith(" ")?"":" ")}else{let ee=I.search(/[^\s]*$/);K=ee>=0?ee:f.cursor,Q=M.value}return f=J.replaceRange(f,{start:K,end:f.cursor},Q),g.dropdownOpen=!1,g.viewportStart=0,g.selectedIndex=0,B(),!0},C=()=>{(T>0||S>0)&&n.write(Xt.cursorUp(T+S)),n.write("\r"),n.write(Xt.eraseDown),h=0;let M=Ki({buffer:Bo(f.buffer,O),promptText:a,isTTY:!!n.isTTY,attachmentSummary:dl(A)}),I=()=>n.write(M+`
1721
+ `+Ne);let vt=qE(Ie(Ne));h+=Math.max(1,Math.ceil(vt/I))}}let U=OT(f.buffer,l,I),{row:K,col:Z}=WN(f.buffer,f.cursor,l,I),te=Math.max(0,U-K+h);te>0&&n.write(Xt.cursorUp(te)),n.write("\r"),Z>0&&n.write(Xt.cursorForward(Z)),S=U},j=!1,$=()=>{D||(D=!0,setImmediate(()=>{D&&!j&&(D=!1,B())}))};B();let H=()=>{let M=g.candidates[g.selectedIndex];if(!M)return!1;let I=f.buffer.slice(0,f.cursor),U=f.buffer.slice(f.cursor),K,Z;if(g.trigger?.kind==="slash"){let te=/\/[A-Za-z_-]*$/.exec(I);K=te?I.length-te[0].length:f.cursor,Z=M.value+(U.startsWith(" ")?"":" ")}else if(g.trigger?.kind==="flag"){let te=/--[a-z0-9-]*$/.exec(I);K=te?I.length-te[0].length:f.cursor,Z=M.value+(U.startsWith(" ")?"":" ")}else{let te=I.search(/[^\s]*$/);K=te>=0?te:f.cursor,Z=M.value}return f=J.replaceRange(f,{start:K,end:f.cursor},Z),g.dropdownOpen=!1,g.viewportStart=0,g.selectedIndex=0,B(),!0},C=()=>{(T>0||S>0)&&n.write(Xt.cursorUp(T+S)),n.write("\r"),n.write(Xt.eraseDown),h=0;let M=Ki({buffer:Bo(f.buffer,O),promptText:a,isTTY:!!n.isTTY,attachmentSummary:dl(A)}),I=()=>n.write(M+`
1722
1722
  `);e.statusLine?.withFullScrollRegion?e.statusLine.withFullScrollRegion(I):I(),P(),u({text:f.buffer,attachments:[...A]}),S=0},L=M=>{S>0&&n.write(Xt.cursorUp(S)),h>0&&(n.write(Xt.eraseDown),h=0),n.write(`
1723
- `),P(),m(M),S=0},P=()=>{j=!0,c&&t.removeListener("keypress",c),d&&d(),c=null,d=null};c=(M,I)=>{let U=Date.now(),K=U-R<_;R=U;let Q=I?.sequence||"";if(Q==="\x1B[200~"){y=!0,w=f.buffer.length;return}if(Q==="\x1B[201~"){y=!1,f.buffer.length===w?b||(b=!0,Vi().then(z=>{z?(k=null,A.push(z)):k="[clipboard: no image found]",$()}).catch(()=>{}).finally(()=>{b=!1})):(B(),b||(b=!0,Vi().then(z=>{z&&(k=null,A.push(z),$())}).catch(()=>{}).finally(()=>{b=!1})));return}if(I?.ctrl&&I?.name==="c"){e.onSigint?e.onSigint():L(new Error("SIGINT"));return}if(I?.ctrl&&I?.name==="d"){f.buffer.length===0&&((T>0||S>0)&&n.write(Xt.cursorUp(T+S)),h>0&&(n.write(Xt.eraseDown),h=0),n.write(`
1724
- `),P(),u({text:"",attachments:[...A]}),S=0);return}if(I?.ctrl&&I?.name==="v"){b||(b=!0,Vi().then(z=>{z?(k=null,A.push(z)):k="[clipboard: no image found]",$()}).catch(()=>{}).finally(()=>{b=!1}));return}if(I?.name==="escape"){g.dropdownOpen&&(g.suppressedSignature=`${f.cursor}:${f.buffer}`,g.dropdownOpen=!1,g.candidates=[],B());return}if(I?.ctrl&&I?.name==="a"){let z=J.moveLineStart(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="e"){let z=J.moveLineEnd(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="b"){let z=J.moveLeft(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="f"){let z=J.moveRight(f);z!==f&&(f=z,B());return}if(I?.meta&&I?.name==="b"){let z=J.moveWordBackward(f);z!==f&&(f=z,B());return}if(I?.meta&&I?.name==="f"){let z=J.moveWordForward(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="w"){let z=J.deleteWordBackward(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.ctrl&&I?.name==="l"){S=0,T=0,n.write("\x1B[H\x1B[2J"),B();return}if(I?.ctrl&&I?.name==="p"||I?.name==="up"){if(g.dropdownOpen){g.selectedIndex>0&&(g.selectedIndex--,g.selectedIndex<g.viewportStart&&(g.viewportStart=g.selectedIndex),B());return}let z=n.columns||80,fe=J.moveUpLine(f,z,l);if(fe.moved)f=fe.state,e.history?.resetRecall(),B();else if(e.history){let Ne=e.history.back(f.buffer);Ne!==null&&(f=J.seed(Ne),B())}return}if(I?.ctrl&&I?.name==="n"||I?.name==="down"){if(g.dropdownOpen){g.selectedIndex<g.candidates.length-1&&(g.selectedIndex++,g.selectedIndex>=g.viewportStart+F&&(g.viewportStart=g.selectedIndex-F+1),B());return}let z=n.columns||80,fe=J.moveDownLine(f,z,l);if(fe.moved)f=fe.state,e.history?.resetRecall(),B();else if(e.history){let Ne=e.history.forward();Ne!==null&&(f=J.seed(Ne),B())}return}if(I?.name==="left"){let z=J.moveLeft(f);z!==f&&(f=z,B());return}if(I?.name==="right"){let z=J.moveRight(f);z!==f&&(f=z,B());return}if(I?.name==="home"){let z=J.moveHome(f);z!==f&&(f=z,B());return}if(I?.name==="end"){let z=J.moveEnd(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="u"){let z=J.deleteToLineStart(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.ctrl&&I?.name==="k"){let z=J.deleteToLineEnd(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.ctrl&&I?.name==="x"){A.length>0&&(A.pop(),B());return}if(I?.name==="backspace"){if(I?.meta){let fe=J.deleteWordBackward(f);fe!==f&&(f=fe,e.history?.resetRecall(),B());return}let z=J.backspace(f);z!==f?(f=z,e.history?.resetRecall(),B()):A.length>0&&(A.pop(),B());return}if(I?.name==="delete"){if(I?.meta){let fe=J.deleteWordForward(f);fe!==f&&(f=fe,e.history?.resetRecall(),B());return}let z=J.deleteForward(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.name==="return"){if(Ah(I,Q)){f=J.insert(f,`
1723
+ `),P(),m(M),S=0},P=()=>{j=!0,c&&t.removeListener("keypress",c),d&&d(),c=null,d=null};c=(M,I)=>{let U=Date.now(),K=U-R<_;R=U;let Z=I?.sequence||"";if(Z==="\x1B[200~"){y=!0,w=f.buffer.length;return}if(Z==="\x1B[201~"){y=!1,f.buffer.length===w?b||(b=!0,Vi().then(z=>{z?(k=null,A.push(z)):k="[clipboard: no image found]",$()}).catch(()=>{}).finally(()=>{b=!1})):(B(),b||(b=!0,Vi().then(z=>{z&&(k=null,A.push(z),$())}).catch(()=>{}).finally(()=>{b=!1})));return}if(I?.ctrl&&I?.name==="c"){e.onSigint?e.onSigint():L(new Error("SIGINT"));return}if(I?.ctrl&&I?.name==="d"){f.buffer.length===0&&((T>0||S>0)&&n.write(Xt.cursorUp(T+S)),h>0&&(n.write(Xt.eraseDown),h=0),n.write(`
1724
+ `),P(),u({text:"",attachments:[...A]}),S=0);return}if(I?.ctrl&&I?.name==="v"){b||(b=!0,Vi().then(z=>{z?(k=null,A.push(z)):k="[clipboard: no image found]",$()}).catch(()=>{}).finally(()=>{b=!1}));return}if(I?.name==="escape"){g.dropdownOpen&&(g.suppressedSignature=`${f.cursor}:${f.buffer}`,g.dropdownOpen=!1,g.candidates=[],B());return}if(I?.ctrl&&I?.name==="a"){let z=J.moveLineStart(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="e"){let z=J.moveLineEnd(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="b"){let z=J.moveLeft(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="f"){let z=J.moveRight(f);z!==f&&(f=z,B());return}if(I?.meta&&I?.name==="b"){let z=J.moveWordBackward(f);z!==f&&(f=z,B());return}if(I?.meta&&I?.name==="f"){let z=J.moveWordForward(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="w"){let z=J.deleteWordBackward(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.ctrl&&I?.name==="l"){S=0,T=0,n.write("\x1B[H\x1B[2J"),B();return}if(I?.ctrl&&I?.name==="p"||I?.name==="up"){if(g.dropdownOpen){g.selectedIndex>0&&(g.selectedIndex--,g.selectedIndex<g.viewportStart&&(g.viewportStart=g.selectedIndex),B());return}let z=n.columns||80,fe=J.moveUpLine(f,z,l);if(fe.moved)f=fe.state,e.history?.resetRecall(),B();else if(e.history){let Ne=e.history.back(f.buffer);Ne!==null&&(f=J.seed(Ne),B())}return}if(I?.ctrl&&I?.name==="n"||I?.name==="down"){if(g.dropdownOpen){g.selectedIndex<g.candidates.length-1&&(g.selectedIndex++,g.selectedIndex>=g.viewportStart+F&&(g.viewportStart=g.selectedIndex-F+1),B());return}let z=n.columns||80,fe=J.moveDownLine(f,z,l);if(fe.moved)f=fe.state,e.history?.resetRecall(),B();else if(e.history){let Ne=e.history.forward();Ne!==null&&(f=J.seed(Ne),B())}return}if(I?.name==="left"){let z=J.moveLeft(f);z!==f&&(f=z,B());return}if(I?.name==="right"){let z=J.moveRight(f);z!==f&&(f=z,B());return}if(I?.name==="home"){let z=J.moveHome(f);z!==f&&(f=z,B());return}if(I?.name==="end"){let z=J.moveEnd(f);z!==f&&(f=z,B());return}if(I?.ctrl&&I?.name==="u"){let z=J.deleteToLineStart(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.ctrl&&I?.name==="k"){let z=J.deleteToLineEnd(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.ctrl&&I?.name==="x"){A.length>0&&(A.pop(),B());return}if(I?.name==="backspace"){if(I?.meta){let fe=J.deleteWordBackward(f);fe!==f&&(f=fe,e.history?.resetRecall(),B());return}let z=J.backspace(f);z!==f?(f=z,e.history?.resetRecall(),B()):A.length>0&&(A.pop(),B());return}if(I?.name==="delete"){if(I?.meta){let fe=J.deleteWordForward(f);fe!==f&&(f=fe,e.history?.resetRecall(),B());return}let z=J.deleteForward(f);z!==f&&(f=z,e.history?.resetRecall(),B());return}if(I?.name==="return"){if(Ah(I,Z)){f=J.insert(f,`
1725
1725
  `),e.history?.resetRecall(),B();return}if(y){f=J.insert(f,`
1726
1726
  `);return}if(K){f=J.insert(f,`
1727
1727
  `),$();return}if(g.dropdownOpen){let z=g.trigger?.kind,fe=H();z==="slash"&&fe&&C()}else al(f.buffer)?(f=J.replaceRange(f,{start:f.buffer.length-1,end:f.buffer.length},`
1728
- `),B()):C();return}if(I?.shift&&I?.name==="tab"||I?.sequence==="\x1B[Z"){e.onShiftTab?.();return}if(I?.name==="tab"){if(g.dropdownOpen)H();else{let z=f.buffer.slice(0,f.cursor),fe=/\s+\/([A-Za-z][A-Za-z0-9_:-]*)$/.exec(z);if(fe){let vt="/"+fe[1],Ae=[...Yt().map(ce=>ce.name),...ol().map(ce=>ce.alias)].filter(ce=>ce.startsWith(vt)).sort((ce,qe)=>ce.localeCompare(qe))[0];if(Ae){let ce=f.buffer.slice(f.cursor),qe=f.cursor-vt.length,je=Ae+(ce.startsWith(" ")?"":" ");f=J.replaceRange(f,{start:qe,end:f.cursor},je),B()}}}return}let ee=!I?.ctrl&&!I?.meta,se=ee&&typeof M=="string"&&ul(M)?M:ee&&typeof I?.sequence=="string"&&ul(I.sequence)?I.sequence:null;se!==null&&(f=J.insert(f,se),e.history?.resetRecall(),y||(K?$():B()))},d=We.subscribe(()=>{S=0,T=0,h=0,B()}),t.on("keypress",c)})}finally{e.statusLine?.setExtraRows(s),o.restore(),i?.release()}}G();async function N1(e){return!process.stdout.isTTY||!process.stdin.isTTY||gt()?D1(e):L1(e)}G();var _y=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;softStopHandler=null;pauseInterruptHandler=null;pendingReadReject=null;pendingReadResolve=null;slashRegistryView=rl();constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=Cy()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY||gt())return;let o=new pl({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onSoftStop:()=>{this.softStopHandler?.()},onBackground:()=>{this.backgroundHandler?.()},onPauseInterrupt:()=>{this.pauseInterruptHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.onOpenEditor?{onOpenEditor:t.onOpenEditor}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:i=>Bo(i,this.slashRegistryView),caretBlink:SL()&&!th(),captureMode:eh(),goblinSpinner:nh(),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{},...t.anchorRow!==void 0?{anchorRow:t.anchorRow}:{},...t.suggest?{suggest:t.suggest}:{}});await o.arm(),o.setInputMode("idle"),o.setOnRewindRequest(()=>{this.requestRewind()}),this.compositor=o,this.armedStdout=n}async dispose(){if(this.compositor){if(this.pendingReadReject){this.compositor.setOnSubmit(null);let t=this.pendingReadReject;this.pendingReadReject=null,this.pendingReadResolve=null,t(new Error("InputSurface disposed while readLine was in progress"))}try{this.compositor.disarm()}catch{}this.compositor=null,this.armedStdout=null,this.backgroundHandler=null,this.softStopHandler=null,this.pauseInterruptHandler=null}}getCompositor(){return this.compositor}setBackgroundHandler(t){this.backgroundHandler=t}setSoftStopHandler(t){this.softStopHandler=t}setPauseInterruptHandler(t){this.pauseInterruptHandler=t}setPausedState(t){this.compositor&&(this.compositor.paused=t)}suspendForElicitation(){this.compositor?.suspendInput()}resumeAfterElicitation(){this.compositor?.resumeInput()}async readLine(t){if(this.compositor&&this.compositor.isArmed()){let n=this.compositor;return new Promise((r,o)=>{this.pendingReadReject=o,this.pendingReadResolve=r;let i=s=>{n.setOnSubmit(null),this.pendingReadReject=null,this.pendingReadResolve=null;let a=this.armedStdout??process.stdout,l=s.displayText??s.text,c=Ki({buffer:Bo(l,this.slashRegistryView),promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:dl([...s.attachments])});Vt(n,c.split(`
1728
+ `),B()):C();return}if(I?.shift&&I?.name==="tab"||I?.sequence==="\x1B[Z"){e.onShiftTab?.();return}if(I?.name==="tab"){if(g.dropdownOpen)H();else{let z=f.buffer.slice(0,f.cursor),fe=/\s+\/([A-Za-z][A-Za-z0-9_:-]*)$/.exec(z);if(fe){let vt="/"+fe[1],Ae=[...Yt().map(ce=>ce.name),...ol().map(ce=>ce.alias)].filter(ce=>ce.startsWith(vt)).sort((ce,qe)=>ce.localeCompare(qe))[0];if(Ae){let ce=f.buffer.slice(f.cursor),qe=f.cursor-vt.length,je=Ae+(ce.startsWith(" ")?"":" ");f=J.replaceRange(f,{start:qe,end:f.cursor},je),B()}}}return}let te=!I?.ctrl&&!I?.meta,se=te&&typeof M=="string"&&ul(M)?M:te&&typeof I?.sequence=="string"&&ul(I.sequence)?I.sequence:null;se!==null&&(f=J.insert(f,se),e.history?.resetRecall(),y||(K?$():B()))},d=We.subscribe(()=>{S=0,T=0,h=0,B()}),t.on("keypress",c)})}finally{e.statusLine?.setExtraRows(s),o.restore(),i?.release()}}G();async function N1(e){return!process.stdout.isTTY||!process.stdin.isTTY||gt()?D1(e):L1(e)}G();var _y=class{history;autocompleteState;rl;statusLine;compositor=null;armedStdout=null;backgroundHandler=null;softStopHandler=null;pauseInterruptHandler=null;pendingReadReject=null;pendingReadResolve=null;slashRegistryView=rl();constructor(t){this.rl=t.rl,this.history=t.history,this.statusLine=t.statusLine,this.autocompleteState=Cy()}async armCompositor(t){if(this.compositor)return;let n=t.stdout??process.stdout,r=t.stdin??process.stdin;if(!n.isTTY||!r.isTTY||gt())return;let o=new pl({stdout:n,stdin:r,promptText:t.promptFn,onCancel:t.onCancel,onSoftStop:()=>{this.softStopHandler?.()},onBackground:()=>{this.backgroundHandler?.()},onPauseInterrupt:()=>{this.pauseInterruptHandler?.()},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.onOpenEditor?{onOpenEditor:t.onOpenEditor}:{},history:this.history,autocompleteState:this.autocompleteState,formatInputBuffer:i=>Bo(i,this.slashRegistryView),caretBlink:SL()&&!th(),captureMode:eh(),goblinSpinner:nh(),...t.scrollRegion?{scrollRegion:t.scrollRegion}:{},...t.anchorRow!==void 0?{anchorRow:t.anchorRow}:{},...t.suggest?{suggest:t.suggest}:{}});await o.arm(),o.setInputMode("idle"),o.setOnRewindRequest(()=>{this.requestRewind()}),this.compositor=o,this.armedStdout=n}async dispose(){if(this.compositor){if(this.pendingReadReject){this.compositor.setOnSubmit(null);let t=this.pendingReadReject;this.pendingReadReject=null,this.pendingReadResolve=null,t(new Error("InputSurface disposed while readLine was in progress"))}try{this.compositor.disarm()}catch{}this.compositor=null,this.armedStdout=null,this.backgroundHandler=null,this.softStopHandler=null,this.pauseInterruptHandler=null}}getCompositor(){return this.compositor}setBackgroundHandler(t){this.backgroundHandler=t}setSoftStopHandler(t){this.softStopHandler=t}setPauseInterruptHandler(t){this.pauseInterruptHandler=t}setPausedState(t){this.compositor&&(this.compositor.paused=t)}suspendForElicitation(){this.compositor?.suspendInput()}resumeAfterElicitation(){this.compositor?.resumeInput()}async readLine(t){if(this.compositor&&this.compositor.isArmed()){let n=this.compositor;return new Promise((r,o)=>{this.pendingReadReject=o,this.pendingReadResolve=r;let i=s=>{n.setOnSubmit(null),this.pendingReadReject=null,this.pendingReadResolve=null;let a=this.armedStdout??process.stdout,l=s.displayText??s.text,c=Ki({buffer:Bo(l,this.slashRegistryView),promptText:t.promptFn(),isTTY:!!a.isTTY,attachmentSummary:dl([...s.attachments])});Vt(n,c.split(`
1729
1729
  `)),r({text:s.text,attachments:[...s.attachments]})};n.setOnSubmit(i),t.initialBuffer!==void 0&&t.initialBuffer.length>0&&n.prefillInput(t.initialBuffer),n.setInputMode("idle"),n.repaint()})}return N1({rl:this.rl,promptFn:t.promptFn,...t.initialBuffer!==void 0?{initialBuffer:t.initialBuffer}:{},...t.onSigint?{onSigint:t.onSigint}:{},...t.onShiftTab?{onShiftTab:t.onShiftTab}:{},...t.compositor?{compositor:t.compositor}:{},history:this.history,autocompleteState:this.autocompleteState,...this.statusLine?{statusLine:this.statusLine}:{}})}isAwaitingInput(){return this.pendingReadResolve!==null}bufferIsEmpty(){let t=this.compositor?.getBuffer();return t?t.text.length===0&&!t.queued:!0}abortPendingRead(){if(!this.pendingReadResolve)return;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"",attachments:[]})}requestRewind(){if(!this.pendingReadResolve)return!1;this.compositor?.setOnSubmit(null);let t=this.pendingReadResolve;return this.pendingReadReject=null,this.pendingReadResolve=null,t({text:"/rewind",attachments:[]}),!0}toRunTurnRefs(t){return{history:this.history,autocompleteState:this.autocompleteState,promptText:t}}};G();xr();ye();G();var zE=["default","plan","bypassPermissions"];function Vle(e,t){switch(t){case"plan":e.out.success(p.warning("\u25CF plan mode ON")+p.dim(" \u2014 writes refused; read-only bash runs, mutating bash blocked."));return;case"bypassPermissions":e.out.line(p.bypass("\u26A1 bypass ON")+p.dim(" \u2014 path-approval prompts + containment OFF; read/write any path. (Does not affect ask_question.)"));return;case"default":e.out.success(p.success("\u25CB default")+p.dim(" \u2014 path containment + approval prompts restored."));return}}async function Iy(e){let t=e.stats.permissionMode;if(t==="autonomous"){await Wd(e,!1);return}let n=zE.indexOf(t),r=zE[(n+1)%zE.length]??"default";try{await e.session.current.setPermissionMode(r),e.stats.permissionMode=r,e.ui.repaintStatusLine(),Vle(e,r)}catch(o){e.out.error(`Could not switch permission mode: ${o instanceof Error?o.message:String(o)}`)}}bp();function xl(e){let t=p.brand("afk"),n=e==="plan"?p.warning(" \u25CF"):e==="autonomous"?p.info(" \u25D0"):e==="bypassPermissions"?p.bypass(" \u26A1 bp"):"";return t+n+p.brand(" \u203A ")}async function B1(e,t,n,r,o,i,s){let a=SB({onError:m=>W("[afk suggest] Tier-2 completion failed:",m)});await t.armCompositor({promptFn:()=>xl(e.stats.permissionMode),onCancel:o,onShiftTab:()=>{Iy(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},onOpenEditor:()=>{let m=t.getCompositor();ey({compositor:m,notify:(f,g)=>{let h=f==="error"?p.error(g):f==="warn"?p.warning(g):p.dim(g);m?.commitAbove(h)}}).catch(()=>{})},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...i?{suggest:{engine:a,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let m=t.history;return m.getEntries?[...m.getEntries()]:[]},getDropdownTopCandidate:m=>{let g=t.autocompleteState.candidates[0];return g&&g.value.startsWith(m)&&g.value.length>m.length?g.value:null},getTranscriptTail:()=>{let m=e.stats.turns;return m.length===0?"":m.slice(-2).reverse().map(f=>`user: ${f.user}
1730
1730
  assistant: ${f.assistant}`).join(`
1731
1731
  `)},getRecentCommands:()=>{let m=t.history;return m.getEntries?[...m.getEntries()]:[]},llmEnabled:()=>/^(1|true|yes|on)$/i.test(v.AFK_SUGGEST_ENABLED??"")})}}:{}});let l=t.getCompositor(),c=Ud({readLine:m=>t.readLine({promptFn:()=>m}).then(f=>f.text),writer:{line:(m="")=>{let f=t.getCompositor();f?f.commitAbove(m):process.stdout.write(m+`
1732
- `)}},pendingCount:()=>Xe.pendingCount(),...l?{pickFromList:m=>dr(l,m),readTextOverlay:m=>ny(l,m)}:{}});Xe.install(c),e.replRenderer.setCompositor(t.getCompositor()),e.slashCtx.getCompositor=()=>t.getCompositor();let d=t.getCompositor();if(d){let m=f=>d.commitAbove(f);e.completionWriter.fn=m,e.completionWriter.idleFn=m}let u=m=>{t.setSoftStopHandler(m),n.requestSoftStop=m};return e.slashCtx.setSoftStopHandler=u,e.slashCtx.onStageChange=m=>s.getLoopStageBar()?.repaint(m),e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),await e.gitStatusSampler.refresh(),e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))},e.slashCtx.transcript=r,e.slashCtx.stdinElicitationHandler=c,e.slashCtx.swapElicitationHandler=m=>Xe.install(m??c),e.inputSurfaceRef&&(e.inputSurfaceRef.current=t),e.gitStatusSampler.setOnUpdate(()=>{e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))}),e.gitStatusSampler.refresh(),HA(()=>{e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))}),{installSoftStop:u}}function U1(e={}){let t=e.load??hh,n=e.onResize??(s=>We.subscribe(s)),r="",o,i=n(()=>{r=""});return{renderIfChanged(s){let a=s??"unbound",l=t(a),c=yN(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:yh(l))},invalidate(){r=""},dispose(){try{i()}catch{}}}}G();var JE={done:{glyph:"\u2713",color:p.success,label:"done"},blocked:{glyph:"\u2298",color:p.error,label:"blocked"},asking:{glyph:"?",color:p.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:p.meta,label:"interrupted"}};function j1(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,i=!1,s=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function d(g){let h=o();return Math.max(1,g-1-h)}function u(){if(!i||!r?.isTTY)return;let g=f(),h=c(),y=g!==null&&h>1?1:0;if(y!==s&&(s>0&&m(),s=y,a?.(s)),y===0)return;let b=d(h);r.write("\x1B[s"),r.write(`\x1B[${b};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function m(){if(!r?.isTTY)return;let g=c(),h=d(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=p.dim(" ledger "),h=p.dim(" \xB7 "),y=n.map(k=>{let A=JE[k];return A.color(`${A.glyph} ${A.label}`)}),b=p.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+y.join(h)+b,S=Math.max(20,ne()-2);if(X(w)<=S)return w;let T=g+n.map(k=>JE[k].color(JE[k].glyph)).join(p.dim(" "))+b;return ae(T,S)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),u()},reset(){n=[],i&&s>0&&(m(),s=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){i||gt()||(i=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),s=0,l=We.subscribe(()=>u()),u())},stop(){i&&(i=!1,l!==null&&(l(),l=null),s>0&&(m(),s=0,a?.(0)),r=null)},repaint(){u()}}}G();var H1=["\u25D0","\u25D1","\u25D2","\u25D3"],Py=class{stream;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;resizeImmediateUnsub=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;lastPaintStartRow=0;preResizeStartRow=null;preResizeRowCount=null;onRowCountChange;getAdjacentRows;constructor(t,n={}){this.registry=t,this.stream=n.stream??process.stdout,this.throttleMs=n.throttleMs??200,this.getAdjacentRows=n.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||gt()||(this.started=!0,this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=We.subscribe(()=>this.repaint()),this.resizeImmediateUnsub=We.subscribeImmediate(()=>this.resetGeometry()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%H1.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}resetGeometry(){this.rowCount>0&&(this.preResizeStartRow=this.lastPaintStartRow,this.preResizeRowCount=this.rowCount),this.rowCount=0,this.lastRepaint=0}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s})),n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(this.clearPreResizeRows(),o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let i=Math.max(1,n-o-r);this.lastPaintStartRow=i,this.stream.write("\x1B[s");for(let s=0;s<o;s++){let a=t[s],l=i+s;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let i=0;i<r;i++)this.stream.write(`\x1B[${o+i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}clearPreResizeRows(){let t=this.preResizeStartRow,n=this.preResizeRowCount;if(this.preResizeStartRow=null,this.preResizeRowCount=null,t===null||n===null||!this.stream.isTTY)return;let r=this.stream.rows??24,o=[];for(let i=0;i<n;i++){let s=t+i;s<=r&&o.push(s)}if(o.length!==0){this.stream.write("\x1B[s");for(let i of o)this.stream.write(`\x1B[${i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}}formatItemLine(t){return this.formatJobLine(t.job)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=p.brand(H1[this.spinnerIndex]),o=p.dim(t.jobId),i=p.bold(t.label||t.jobId),s=[r,o,i],a=Date.now()-t.startedAt;return s.push(p.dim(ve(a))),ae(" "+s.join(" "),n)}};import{spawn as Xle}from"node:child_process";var Qle=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function Zle(){let e="";return{strip(t){let r=(e+t).replace(Qle,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function W1(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var K1=12e4,G1=1e5;function YE(e){let t=Date.now(),n=e.timeoutMs??K1,r=e.maxBytes??G1,o=Zle(),i;try{i=Xle(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(k){let A=k instanceof Error?k.message:String(k);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${A}`})}}i.unref();let s,a=!1,l=new Promise(k=>{s=A=>{a||(a=!0,k(A))}}),c="",d="",u=0,m=0,f=!1,g=!1,h=!1;function y(k){let A=r-u;if(A>0){let F=k.length<=A?k:W1(k,A);u+=F.length,c+=F.toString("utf8"),k.length>A&&(f=!0)}else k.length>0&&(f=!0);if(m<r){let F=o.strip(k.toString("utf8")),R=Buffer.byteLength(F,"utf8"),D=r-m;if(R<=D)d+=F,m+=R;else{let _=Buffer.from(F,"utf8");d+=W1(_,D).toString("utf8"),m=r,f=!0}}}function b(){if(i.pid!==void 0&&i.pid!==0&&!i.killed)try{process.kill(-i.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{b(),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),S=()=>{b(),clearTimeout(w),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",S);function T(){g||a||u<r&&m<r||(g=!0,b(),clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return i.stdout?.on("data",k=>{y(k);try{e.onChunk?.(k,"stdout")}catch{}T()}),i.stderr?.on("data",k=>{y(k);try{e.onChunk?.(k,"stderr")}catch{}T()}),i.on("error",k=>{clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${k.message}`})}),i.on("close",(k,A)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",S),!(g||a)){if(o.flush(),h){s({exitCode:k,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(k!==null&&k!==0){s({exitCode:k,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${k}`});return}if(k===null){s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"signal-killed",errorMessage:A?`Command killed by signal ${A}`:"Command killed by signal"});return}s({exitCode:k,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f})}}),{pid:i.pid,promise:l,kill:(k="SIGKILL")=>{if(!(i.pid===void 0||i.pid===0||i.killed)){h=!0;try{process.kill(-i.pid,k)}catch{}}}}}import{EventEmitter as ece}from"node:events";var q1=200,hu=class extends ece{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=YE({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),i={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,i),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(s=>{i.result=s,i.status=tce(s),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",i)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:i,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=q1))for(let[t,n]of this.jobs){if(this.jobs.size<=q1)break;n.status!=="running"&&this.jobs.delete(t)}}};function tce(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function nce(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function rce(e,t){let n=ve(t.durationMs);return t.errorReason==="abort"?p.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?p.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?p.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?p.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?p.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?p.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):p.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function z1(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function oce(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${ve(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${z1(e)}</command>`),r.push("<output>"),r.push(z1(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
1732
+ `)}},pendingCount:()=>Xe.pendingCount(),...l?{pickFromList:m=>dr(l,m),readTextOverlay:m=>ny(l,m)}:{}});Xe.install(c),e.replRenderer.setCompositor(t.getCompositor()),e.slashCtx.getCompositor=()=>t.getCompositor();let d=t.getCompositor();if(d){let m=f=>d.commitAbove(f);e.completionWriter.fn=m,e.completionWriter.idleFn=m}let u=m=>{t.setSoftStopHandler(m),n.requestSoftStop=m};return e.slashCtx.setSoftStopHandler=u,e.slashCtx.onStageChange=m=>s.getLoopStageBar()?.repaint(m),e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),await e.gitStatusSampler.refresh(),e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))},e.slashCtx.transcript=r,e.slashCtx.stdinElicitationHandler=c,e.slashCtx.swapElicitationHandler=m=>Xe.install(m??c),e.inputSurfaceRef&&(e.inputSurfaceRef.current=t),e.gitStatusSampler.setOnUpdate(()=>{e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))}),e.gitStatusSampler.refresh(),HA(()=>{e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))}),{installSoftStop:u}}function U1(e={}){let t=e.load??hh,n=e.onResize??(s=>We.subscribe(s)),r="",o,i=n(()=>{r=""});return{renderIfChanged(s){let a=s??"unbound",l=t(a),c=yN(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:yh(l))},invalidate(){r=""},dispose(){try{i()}catch{}}}}G();var JE={done:{glyph:"\u2713",color:p.success,label:"done"},blocked:{glyph:"\u2298",color:p.error,label:"blocked"},asking:{glyph:"?",color:p.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:p.meta,label:"interrupted"}};function j1(e={}){let t=Math.max(2,e.capacity??8),n=[],r=null,o=()=>0,i=!1,s=0,a,l=null;function c(){let g=r?.rows;return typeof g=="number"&&g>0?g:24}function d(g){let h=o();return Math.max(1,g-1-h)}function u(){if(!i||!r?.isTTY)return;let g=f(),h=c(),y=g!==null&&h>1?1:0;if(y!==s&&(s>0&&m(),s=y,a?.(s)),y===0)return;let b=d(h);r.write("\x1B[s"),r.write(`\x1B[${b};1H`),r.write("\x1B[2K"),r.write(g),r.write("\x1B[u")}function m(){if(!r?.isTTY)return;let g=c(),h=d(g);r.write("\x1B[s"),r.write(`\x1B[${h};1H`),r.write("\x1B[2K"),r.write("\x1B[u")}function f(){if(n.length===0)return null;let g=p.dim(" ledger "),h=p.dim(" \xB7 "),y=n.map(k=>{let A=JE[k];return A.color(`${A.glyph} ${A.label}`)}),b=p.dim(` (${n.length} turn${n.length===1?"":"s"})`),w=g+y.join(h)+b,S=Math.max(20,Q()-2);if(X(w)<=S)return w;let T=g+n.map(k=>JE[k].color(JE[k].glyph)).join(p.dim(" "))+b;return ae(T,S)}return{push(g){n.push(g.kind),n.length>t&&(n=n.slice(n.length-t)),u()},reset(){n=[],i&&s>0&&(m(),s=0,a?.(0))},entries(){return n},render(){return f()},setRowCountChangeHandler(g){a=g},start(g){i||gt()||(i=!0,r=g.stream??process.stdout,o=g.getAdjacentRows??(()=>0),s=0,l=We.subscribe(()=>u()),u())},stop(){i&&(i=!1,l!==null&&(l(),l=null),s>0&&(m(),s=0,a?.(0)),r=null)},repaint(){u()}}}G();var H1=["\u25D0","\u25D1","\u25D2","\u25D3"],Py=class{stream;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;resizeImmediateUnsub=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;lastPaintStartRow=0;preResizeStartRow=null;preResizeRowCount=null;onRowCountChange;getAdjacentRows;constructor(t,n={}){this.registry=t,this.stream=n.stream??process.stdout,this.throttleMs=n.throttleMs??200,this.getAdjacentRows=n.getAdjacentRows??(()=>0)}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||gt()||(this.started=!0,this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=We.subscribe(()=>this.repaint()),this.resizeImmediateUnsub=We.subscribeImmediate(()=>this.resetGeometry()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%H1.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.resizeImmediateUnsub&&(this.resizeImmediateUnsub(),this.resizeImmediateUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}resetGeometry(){this.rowCount>0&&(this.preResizeStartRow=this.lastPaintStartRow,this.preResizeRowCount=this.rowCount),this.rowCount=0,this.lastRepaint=0}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}redraw(){this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s})),n=this.stream.rows??24,r=this.getAdjacentRows(),o=Math.max(0,Math.min(t.length,n-1-r));if(this.clearPreResizeRows(),o!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=o,this.onRowCountChange?.(o)),o===0)return;let i=Math.max(1,n-o-r);this.lastPaintStartRow=i,this.stream.write("\x1B[s");for(let s=0;s<o;s++){let a=t[s],l=i+s;this.stream.write(`\x1B[${l};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(a))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=this.getAdjacentRows(),r=Math.min(this.rowCount,t-1-n),o=Math.max(1,t-r-n);this.stream.write("\x1B[s");for(let i=0;i<r;i++)this.stream.write(`\x1B[${o+i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}clearPreResizeRows(){let t=this.preResizeStartRow,n=this.preResizeRowCount;if(this.preResizeStartRow=null,this.preResizeRowCount=null,t===null||n===null||!this.stream.isTTY)return;let r=this.stream.rows??24,o=[];for(let i=0;i<n;i++){let s=t+i;s<=r&&o.push(s)}if(o.length!==0){this.stream.write("\x1B[s");for(let i of o)this.stream.write(`\x1B[${i};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}}formatItemLine(t){return this.formatJobLine(t.job)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=p.brand(H1[this.spinnerIndex]),o=p.dim(t.jobId),i=p.bold(t.label||t.jobId),s=[r,o,i],a=Date.now()-t.startedAt;return s.push(p.dim(ve(a))),ae(" "+s.join(" "),n)}};import{spawn as Xle}from"node:child_process";var Qle=/\x1b(?:\[[0-9;]*[a-zA-Z]|[\]P^_X][^\x07\x1b]*(?:\x07|\x1b\\)|[@-OQ-WYZ\\])/g;function Zle(){let e="";return{strip(t){let r=(e+t).replace(Qle,""),o=r.match(/\x1b(?:[\]P^_X][^\x07\x1b]*|\[[0-9;]*)?$/);return o?(e=o[0],r.slice(0,r.length-e.length)):(e="",r)},flush(){return e="",""}}}function W1(e,t){if(e.length<=t)return e;let n=t;for(;n>0&&(e[n]&192)===128;)n--;return e.subarray(0,n)}var K1=12e4,G1=1e5;function YE(e){let t=Date.now(),n=e.timeoutMs??K1,r=e.maxBytes??G1,o=Zle(),i;try{i=Xle(e.command,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:{...process.env,...e.env}}:{}})}catch(k){let A=k instanceof Error?k.message:String(k);return{pid:void 0,kill:()=>{},promise:Promise.resolve({exitCode:null,durationMs:Date.now()-t,displayCaptured:"",modelCaptured:"",truncated:!1,errorReason:"spawn-failed",errorMessage:`Failed to spawn shell: ${A}`})}}i.unref();let s,a=!1,l=new Promise(k=>{s=A=>{a||(a=!0,k(A))}}),c="",d="",u=0,m=0,f=!1,g=!1,h=!1;function y(k){let A=r-u;if(A>0){let F=k.length<=A?k:W1(k,A);u+=F.length,c+=F.toString("utf8"),k.length>A&&(f=!0)}else k.length>0&&(f=!0);if(m<r){let F=o.strip(k.toString("utf8")),R=Buffer.byteLength(F,"utf8"),D=r-m;if(R<=D)d+=F,m+=R;else{let _=Buffer.from(F,"utf8");d+=W1(_,D).toString("utf8"),m=r,f=!0}}}function b(){if(i.pid!==void 0&&i.pid!==0&&!i.killed)try{process.kill(-i.pid,"SIGKILL")}catch{}}let w=setTimeout(()=>{b(),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"timeout",errorMessage:`Command timed out after ${n}ms`})},n),S=()=>{b(),clearTimeout(w),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:h?"Command killed":"Command aborted"})};e.abort.addEventListener("abort",S);function T(){g||a||u<r&&m<r||(g=!0,b(),clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:!0,errorReason:"overflow",errorMessage:`Output exceeded ${r} bytes`}))}return i.stdout?.on("data",k=>{y(k);try{e.onChunk?.(k,"stdout")}catch{}T()}),i.stderr?.on("data",k=>{y(k);try{e.onChunk?.(k,"stderr")}catch{}T()}),i.on("error",k=>{clearTimeout(w),e.abort.removeEventListener("abort",S),s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"spawn-failed",errorMessage:`Shell process error: ${k.message}`})}),i.on("close",(k,A)=>{if(clearTimeout(w),e.abort.removeEventListener("abort",S),!(g||a)){if(o.flush(),h){s({exitCode:k,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"abort",errorMessage:"Command killed"});return}if(k!==null&&k!==0){s({exitCode:k,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"nonzero-exit",errorMessage:`Command exited with code ${k}`});return}if(k===null){s({exitCode:null,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f,errorReason:"signal-killed",errorMessage:A?`Command killed by signal ${A}`:"Command killed by signal"});return}s({exitCode:k,durationMs:Date.now()-t,displayCaptured:c,modelCaptured:d,truncated:f})}}),{pid:i.pid,promise:l,kill:(k="SIGKILL")=>{if(!(i.pid===void 0||i.pid===0||i.killed)){h=!0;try{process.kill(-i.pid,k)}catch{}}}}}import{EventEmitter as ece}from"node:events";var q1=200,hu=class extends ece{jobs=new Map;handles=new Map;aborts=new Map;counter=0;start(t){let n=`sh-${++this.counter}`,r=new AbortController,o=YE({command:t.command,...t.cwd!==void 0?{cwd:t.cwd}:{},abort:r.signal,...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.maxBytes!==void 0?{maxBytes:t.maxBytes}:{},...t.env!==void 0?{env:t.env}:{},...t.onChunk!==void 0?{onChunk:t.onChunk}:{}}),i={id:n,command:t.command,pid:o.pid,startedAt:Date.now(),mode:t.mode,status:"running"};return this.jobs.set(n,i),this.handles.set(n,o),this.aborts.set(n,r),o.promise.then(s=>{i.result=s,i.status=tce(s),this.aborts.delete(n),this.handles.delete(n);try{this.emit("complete",i)}catch(a){console.warn(`[shell-jobs] listener for 'complete' threw on ${n}: ${a instanceof Error?a.message:String(a)}`)}this.pruneHistory()}),{job:i,handle:o}}get(t){return this.jobs.get(t)}list(){return[...this.jobs.values()].sort((t,n)=>t.startedAt-n.startedAt)}running(){return this.list().filter(t=>t.status==="running")}kill(t){let n=this.jobs.get(t);if(!n||n.status!=="running")return!1;let r=this.aborts.get(t);if(r)return r.abort(),!0;let o=this.handles.get(t);return o?(o.kill(),!0):!1}killAll(){let t=this.running();for(let n of t)this.kill(n.id);return t}runningCount(){let t=0;for(let n of this.jobs.values())n.status==="running"&&t++;return t}pruneHistory(){if(!(this.jobs.size<=q1))for(let[t,n]of this.jobs){if(this.jobs.size<=q1)break;n.status!=="running"&&this.jobs.delete(t)}}};function tce(e){return e.errorReason===void 0?"completed":e.errorReason==="abort"?"killed":"failed"}function nce(e){if(!e.startsWith("!"))return null;if(e.startsWith("!&")){let n=e.slice(2).trim();return n.length===0?null:{mode:"background",command:n}}let t=e.slice(1).trim();return t.length===0?null:{mode:"foreground",command:t}}function rce(e,t){let n=ve(t.durationMs);return t.errorReason==="abort"?p.dim(` [${e.id} \xB7 killed \xB7 ${n}]`):t.errorReason==="timeout"?p.dim(` [${e.id} \xB7 timed out \xB7 ${n}]`):t.errorReason==="overflow"?p.dim(` [${e.id} \xB7 output overflow \xB7 ${n}]`):t.errorReason==="spawn-failed"?p.warning(` [${e.id} \xB7 spawn failed \xB7 ${n}]`):t.errorReason==="nonzero-exit"?p.warning(` [${e.id} \xB7 exit ${t.exitCode} \xB7 ${n}]`):t.errorReason==="signal-killed"?p.warning(` [${e.id} \xB7 killed by signal \xB7 ${n}]`):p.dim(` [${e.id} \xB7 exit ${t.exitCode??0} \xB7 ${n}]`)}function z1(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function oce(e,t,n){let r=[],o=[`mode="${t}"`];return n.exitCode!==null&&o.push(`exit="${n.exitCode}"`),n.errorReason!==void 0&&o.push(`reason="${n.errorReason}"`),o.push(`duration="${ve(n.durationMs)}"`),n.truncated&&o.push('truncated="true"'),r.push(`<bash-passthrough ${o.join(" ")}>`),r.push(`<command>${z1(e)}</command>`),r.push("<output>"),r.push(z1(n.modelCaptured)),r.push("</output>"),r.push("</bash-passthrough>"),r.join(`
1733
1733
  `)}var My=class e{constructor(t){this.opts=t;this.registry.on("complete",n=>{if(n.mode!=="background")return;let r=n.result;r&&(this.queueInjection({command:n.command,mode:"background",result:r}),this.pendingNotifications.push({job:n,result:r}),this.pendingNotifications.length>e.MAX_PENDING_NOTIFICATIONS&&this.pendingNotifications.shift())})}opts;registry=new hu;pendingInjections=[];pendingNotifications=[];activeFgJobId=null;static MAX_PENDING_INJECTIONS=25;static MAX_PENDING_NOTIFICATIONS=50;async dispatch(t){let n=nce(t);return n===null?t==="!"||t==="!&"||t.startsWith("! ")||t.startsWith("!& ")?(this.opts.writeLine(p.dim(" usage: !<cmd> (foreground) !&<cmd> (background)")),!0):!1:(n.mode==="foreground"?await this.runForeground(n.command):this.startBackground(n.command),!0)}drainInjections(){if(this.pendingInjections.length===0)return"";let t=this.pendingInjections.map(n=>oce(n.command,n.mode,n.result));return this.pendingInjections=[],t.join(`
1734
1734
  `)+`
1735
1735
  `}drainNotifications(){if(this.pendingNotifications.length===0)return[];let t=this.pendingNotifications;return this.pendingNotifications=[],t}abortActiveForeground(){return this.activeFgJobId===null?!1:(this.registry.kill(this.activeFgJobId),!0)}hasActiveForeground(){return this.activeFgJobId!==null}drainOnExit(){let t=this.registry.killAll();t.length>0&&this.opts.writeLine(p.dim(` Killing ${t.length} background shell job${t.length===1?"":"s"} on exit.`))}async runForeground(t){this.opts.writeLine(p.dim(`$ ${t}`));let n="",r=!1,o=()=>{let c;for(;(c=n.indexOf(`
@@ -1742,17 +1742,17 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
1742
1742
  `)+`
1743
1743
  `}drainNotifications(){if(this.pendingNotifications.length===0)return[];let t=this.pendingNotifications;return this.pendingNotifications=[],t}reset(){this.pendingInjections=[],this.pendingNotifications=[]}dispose(){this.registry.off("settled",this.onSettled)}};function Y1(e,t){let n=U1(),r=j1();e.clearVerdictLedger=()=>r.reset();let o=0,i=0,s=1,a=()=>e.statusLine.setExtraRows(s+o+i),l,c;r.setRowCountChangeHandler(m=>{i=m,a(),l?.redraw(),c?.redraw()}),l=new Py(e.backgroundRegistry,{getAdjacentRows:()=>i}),l.setRowCountChangeHandler(m=>{o=m,a()}),c=new Wh({getExtraRows:()=>e.statusLine.getExtraRows()}),c.setRowCountChangeHandler(m=>{a()}),e.statusLine.setAfterScrollRestore(()=>{r.repaint(),l?.redraw(),c?.redraw()}),l.start(),c.start(),r.start({stream:process.stdout});let d=new My({writeLine:m=>e.replRenderer.writeLine(m),getCwd:()=>e.stats.cwd});UN(d),t.tryAbortShellForeground=()=>d.abortActiveForeground();let u=new Oy(e.backgroundRegistry);return e.clearBgResultBuffer=()=>u.reset(),{contextPane:n,bgStatusBar:l,loopStageBar:c,verdictLedger:r,shellPassthrough:d,bgResultNotifier:u}}ye();po();G();Fe();kc();ye();Rr();function $y(e){if(!e)return null;let t=e.split(`
1744
1744
  `),n=t.slice(Math.max(0,t.length-40)),r=-1,o=null;for(let l=n.length-1;l>=0;l--){let c=n[l]??"",d=dce(c);if(d){r=l,o=d;break}}if(o===null||r<0)return null;let i=n.slice(r+1).map(l=>l.trim());for(;i.length>0&&i[0]==="";)i.shift();for(;i.length>0&&i[i.length-1]==="";)i.pop();let s=uce(i),a=i.join(`
1745
- `).trim();return{kind:o,rawBody:a,...pce(o,s)}}function dce(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function uce(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),i=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let a=t[t.length-1];a.value=`${a.value} ${r}`.trim();continue}let s=i.indexOf(":");if(s>0&&s<60){let a=i.slice(0,s).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^(?:\*\*|__)\s*/,"").toLowerCase(),l=i.slice(s+1).trim().replace(/^(?:\*\*|__)\s/,"");t.push({label:a,value:l})}else t.push({label:"",value:i})}return t}function pce(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let i of r)if(o.label.includes(i))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let i=n("evidence","what changed","change","artifact","output");i!==void 0&&(r.evidence=i);let s=n("pending","deferred","follow-up","followup","next");return s!==void 0&&(r.deferred=s),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let i=n("unblock","must change","to unblock","condition");i!==void 0&&(r.unblockCondition=i);let s=n("has already","been done","already done","what has been done","progress");return s!==void 0&&(r.alreadyDone=s),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let i=n("assumption","resolves");i!==void 0&&(r.assumption=i);let s=n("once answered","follow-up","next","will do","after");return s!==void 0&&(r.followup=s),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let i=n("state was saved","state","saved","where");i!==void 0&&(r.stateLocation=i);let s=n("resumption","resume","requires");return s!==void 0&&(r.resumeRequires=s),r}}}var mce={done:{color:p.success,chip:"\u2713 Done",affordance:"Objective satisfied - review evidence and close."},blocked:{color:p.error,chip:"\u2298 Blocked",affordance:"External dependency - unblock above to resume."},asking:{color:p.warning,chip:"? Asking",affordance:"Waiting on you - answer above to continue."},interrupted:{color:p.meta,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved - resume when ready."}};function V1(e){let t=mce[e.kind],n=Math.max(34,Math.min(ne()-6,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-X(` ${t.chip} `)))+"\u256E"),i=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),s=t.color("\u2502"),a=s+" ".repeat(n+4)+s,l=fce(e),c=l.reduce((f,g)=>Math.max(f,X(g.label)),0),d=Math.max(8,n-c-2),u=[o,a];if(l.length===0){let f=e.rawBody.split(`
1745
+ `).trim();return{kind:o,rawBody:a,...pce(o,s)}}function dce(e){let t=e.trim().replace(/^#{1,6}\s+/,"").replace(/^[-•▶▸]\s+/,"").replace(/^\*\s+/,"").replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^\*(.+?)\*$/,"$1").replace(/^_(.+?)_$/,"$1").replace(/[.:!?\s]+$/,"").trim();if(t.length===0||t.length>24)return null;let n=t.toLowerCase();return n==="done"?"done":n==="blocked"?"blocked":n==="asking"?"asking":n==="interrupted"?"interrupted":null}function uce(e){let t=[];for(let n of e){let r=n.trim();if(r==="")continue;let o=/^(?:[-*•▶▸]|\d+[.)])\s+(.*)$/.exec(r),i=o?(o[1]??"").trim():r;if(!o&&t.length>0&&r.length>0){let a=t[t.length-1];a.value=`${a.value} ${r}`.trim();continue}let s=i.indexOf(":");if(s>0&&s<60){let a=i.slice(0,s).trim().replace(/^\*\*(.+?)\*\*$/,"$1").replace(/^__(.+?)__$/,"$1").replace(/^(?:\*\*|__)\s*/,"").toLowerCase(),l=i.slice(s+1).trim().replace(/^(?:\*\*|__)\s/,"");t.push({label:a,value:l})}else t.push({label:"",value:i})}return t}function pce(e,t){let n=(...r)=>{for(let o of t)if(o.label!==""){for(let i of r)if(o.label.includes(i))return o.value}};switch(e){case"done":{let r={},o=n("what was done","what i did","completed","done");o!==void 0&&(r.whatWasDone=o);let i=n("evidence","what changed","change","artifact","output");i!==void 0&&(r.evidence=i);let s=n("pending","deferred","follow-up","followup","next");return s!==void 0&&(r.deferred=s),r}case"blocked":{let r={},o=n("what blocks","blocker","blocked by");o!==void 0&&(r.whatBlocks=o);let i=n("unblock","must change","to unblock","condition");i!==void 0&&(r.unblockCondition=i);let s=n("has already","been done","already done","what has been done","progress");return s!==void 0&&(r.alreadyDone=s),r}case"asking":{let r={},o=n("question","asking");o!==void 0&&(r.question=o);let i=n("assumption","resolves");i!==void 0&&(r.assumption=i);let s=n("once answered","follow-up","next","will do","after");return s!==void 0&&(r.followup=s),r}case"interrupted":{let r={},o=n("what you were doing","in progress","doing","task");o!==void 0&&(r.whatWasInProgress=o);let i=n("state was saved","state","saved","where");i!==void 0&&(r.stateLocation=i);let s=n("resumption","resume","requires");return s!==void 0&&(r.resumeRequires=s),r}}}var mce={done:{color:p.success,chip:"\u2713 Done",affordance:"Objective satisfied - review evidence and close."},blocked:{color:p.error,chip:"\u2298 Blocked",affordance:"External dependency - unblock above to resume."},asking:{color:p.warning,chip:"? Asking",affordance:"Waiting on you - answer above to continue."},interrupted:{color:p.meta,chip:"\u23F8 Interrupted",affordance:"Halted with state preserved - resume when ready."}};function V1(e){let t=mce[e.kind],n=Math.max(34,Math.min(Q()-6,100)),r=n+4,o=t.color("\u256D\u2500")+t.color.call(null,` ${t.chip} `)+t.color("\u2500".repeat(Math.max(0,r-1-X(` ${t.chip} `)))+"\u256E"),i=t.color("\u2570"+"\u2500".repeat(r)+"\u256F"),s=t.color("\u2502"),a=s+" ".repeat(n+4)+s,l=fce(e),c=l.reduce((f,g)=>Math.max(f,X(g.label)),0),d=Math.max(8,n-c-2),u=[o,a];if(l.length===0){let f=e.rawBody.split(`
1746
1746
  `).find(y=>y.trim().length>0)?.trim()??"",g=f.length>0?f:`${e.kind} (no structured fields)`,h=me(no(g),n).split(`
1747
1747
  `);for(let y of h)u.push(s+" "+nt(y,n)+" "+s)}else for(let f of l){let g=p.dim(nt(f.label,c)),h=me(no(f.value),d).split(`
1748
1748
  `),y=h[0]??"";u.push(s+" "+g+" "+nt(y,d)+" "+s);for(let b of h.slice(1))u.push(s+" "+" ".repeat(c)+" "+nt(b,d)+" "+s)}u.push(a);let m=p.dim(ae(t.affordance,n));return u.push(s+" "+nt(m,n)+" "+s),u.push(i),u.join(`
1749
1749
  `)}function fce(e){let t=[],n=(r,o)=>{o&&o.trim().length>0&&t.push({label:r,value:o.trim()})};switch(e.kind){case"done":n("done",e.whatWasDone),n("evidence",e.evidence),e.deferred?.trim()!==e.whatWasDone?.trim()&&n("deferred",e.deferred);break;case"blocked":n("blocks",e.whatBlocks),n("unblock",e.unblockCondition),n("progress",e.alreadyDone);break;case"asking":n("question",e.question),n("resolves",e.assumption),n("after",e.followup);break;case"interrupted":n("was doing",e.whatWasInProgress),n("saved at",e.stateLocation),n("resume",e.resumeRequires);break}return t}jt();function X1(e,t,n,r){let o=[];return n&&n.trim().length>0&&o.push({type:"text",text:n}),r&&r.length>0&&o.push(...r),e&&o.push({type:"text",text:e}),sy(o,t),o}import{readFileSync as gce,statSync as hce}from"fs";import{extname as yce,join as Q1}from"path";import{homedir as bce}from"os";Qs();var wce=100*1024,Sce=400*1024,vce=/(?<=\s|^)@([~\w./-]+)(?=\s|$)/g,kce=/(^|\/)\.(ssh|aws|gnupg|kube|docker)(\/|$)|(^|\/)[^/]*\.env(\.[^/]+)?$|(^|\/)\.(netrc|npmrc|pypirc)$|(^|\/)id_(rsa|ed25519|ecdsa|dsa)(\.pub)?$|\.(pem|key|p12|pfx)$|(^|\/)credentials$|(^|\/)\.git\/config$|(^|\/)\.git-credentials$|(^|\/)\.(bash|zsh|fish|sh)_history$/i,Tce=[".afk/config",".afk/state",".config/gcloud",".config/gh"];function Ece(e){let t=0,n=e.match(/`+/g);if(n)for(let r of n)r.length>t&&(t=r.length);return"`".repeat(Math.max(3,t+1))}function xce(e,t){if(kce.test(e))return!0;for(let n of t)if(e===n||e.startsWith(n+"/"))return!0;return!1}var Rce={".ts":"typescript",".tsx":"tsx",".js":"javascript",".jsx":"jsx",".mjs":"javascript",".cjs":"javascript",".json":"json",".md":"markdown",".py":"python",".sh":"bash",".bash":"bash",".zsh":"bash",".yaml":"yaml",".yml":"yaml",".toml":"toml",".rs":"rust",".go":"go",".rb":"ruby",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".cc":"cpp",".cs":"csharp",".html":"html",".css":"css",".scss":"scss",".sql":"sql",".xml":"xml",".txt":""};function Ace(e){return Rce[e.toLowerCase()]??""}function Cce(e=process.env){return e.AFK_AT_FILE_INJECT!=="0"}function Z1(e,t={}){let n={fileBlocks:[],warnings:[]};if(!Cce(t.env))return n;let r=[];for(let u of e.matchAll(vce)){let m=u[1];m&&r.push(m)}if(r.length===0)return n;let o=t.rootDir??process.cwd(),i=t.homeDir??bce(),s=Tce.map(u=>Gt(Q1(i,u))),a=[],l=[],c=new Set,d=0;for(let u of r){let{scanDir:m,leafPrefix:f}=qi(u,o,i),g=f?Q1(m,f):m,h=Gt(g);if(c.has(h))continue;if(c.add(h),xce(h,s)){l.push(`@${u}: sensitive path, not injected`);continue}let y;try{y=hce(h)}catch{l.push(`@${u}: not found, left as text`);continue}if(y.isDirectory()){l.push(`@${u}: is a directory, skipped`);continue}if(!y.isFile()){l.push(`@${u}: not a regular file, skipped`);continue}if(y.size>wce){l.push(`@${u}: too large (${Math.round(y.size/1024)} KB > 100 KB), skipped`);continue}if(d+y.size>Sce){l.push(`@${u}: 400 KB total injection budget exceeded, skipped`);continue}let b;try{b=gce(h)}catch{l.push(`@${u}: could not read, skipped`);continue}if(b.includes(0)){l.push(`@${u}: binary file, skipped`);continue}d+=y.size;let w=Ace(yce(h)),S=b.toString("utf8"),T=Ece(S);a.push({type:"text",text:`Contents of ${u}:
1750
1750
  ${T}${w}
1751
1751
  ${S}
1752
- ${T}`})}return{fileBlocks:a,warnings:l}}async function eH(e,t,n,r,o="summary",i,s){let a=OB(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),nl(process.stdout,Ld(process.cwd(),!0));let l="",c=0,d=!1,u=!1,m=!1,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,T=[],k=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,F=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then($=>{for(let H of $)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${H.jobId}: ${H.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,D=()=>new Sl({out:vl(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(j=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:F}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...R?{compositor:R}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=D(),O=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let $=j;i.fn=H=>$.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.($=>_.setInterrupting($)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,_.setSoftStopping(!0),t.interrupt().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),P)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(F);let{fileBlocks:j,warnings:$}=Z1(e.text,{rootDir:process.cwd()});for(let P of $)(i??{fn:console.log}).fn(p.dim(` @-file: ${P}`));let H=j.length>0||e.attachments.length>0?X1(e.text,e.attachments,void 0,j):e.text,C=t.sendMessageStream(H);if(await Ws((P,M)=>{_.process(P,M)},async()=>{for await(let P of C){if(h||y)break;if(P.type==="chunk"&&P.chunk.type==="content"?(l+=P.chunk.content,d=!0):P.type==="message"&&!d&&(l=P.message.content),P.type==="stream_retry"&&(l=l.slice(0,c)),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let M=P.chunk,I={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};k.set(M.toolUseId,I),T.push(I)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let I=k.get(M.toolUseId);if(I&&(I.result=M.content,I.isError=M.isError,k.delete(M.toolUseId)),r.onContextProgress){let U=Date.now();if(U-w>=S){w=U;try{let K=r.onContextProgress();K instanceof Promise&&await K}catch(K){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),K)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await O(),R&&P.autoResume===!0){let M=new AbortController;b.abort=M;let I=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,U=I?`Keep waiting \u2014 auto-resumes at ${I}`:"Keep waiting \u2014 auto-resume in progress",K="Switch model / provider (type /model after)",Q="Stop waiting",ee=[p.warning(" \u23F3 Usage limit reached.")+(I?p.dim(` Auto-resumes at ${I}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];dr(R,{header:ee,options:[U,K,Q],signal:M.signal,initialIndex:0}).then(se=>{if(b.abort=null,!se)return;let z=se[0];z===void 0||z===U||(y=!0,z===K&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(fe=>{Ke()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),fe)}))}).catch(se=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),se)})}else(i??{fn:console.log}).fn(dA({reason:P.reason,...P.resetsAt!==void 0?{resetsAt:P.resetsAt}:{},...P.accountId!==void 0?{accountId:P.accountId}:{},...P.autoResume!==void 0?{autoResume:P.autoResume}:{}}));continue}if(P.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,T.length=0,k.clear(),f=!1,g=void 0,u=!1,_=D(),m=!1,await B(),(i??{fn:console.log}).fn(p.success(M));continue}if(P.type==="error"){await O(),xs(ws(P.error)),u=!0;continue}_.process(P),P.type==="done"&&(f=!0,g=P.metadata)}}),await O(),h){let P=i?i.fn:console.log,M=R?R.getPendingCount():0,I=M>0?` \xB7 ${M} queued`:"";P(p.warning(`\u23F8 Stopped${I} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(f&&!h&&!y){Di(n,a,l,g,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),tl(process.stdout),kL(process.stdout,"afk: turn complete");let P=I=>{i?i.fn(I):console.log(I)},M=$y(l);if(M){P(V1(M)),P("");let I=zL(T);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:I})}catch{}if(n.permissionMode==="autonomous"){let U=M.kind==="done"&&bc().verifyDone===!0&&!I;YL(M,void 0,{unverified:U})}}if(Ice(g,n,P),r.onAfterTurn){let I=r.onAfterTurn();I instanceof Promise&&await I.catch(()=>{})}}}catch(j){await O(),u||xs(ws(j))}finally{await O(),nl(process.stdout,Ld(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function _ce(e,t){let n=Math.round(e*100),r=ue(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ue(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function Ice(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ve(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ue(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=yT(t),a=qt(t.model),l=_ce(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var Pce=5e3,Mce=3,Oce="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function $ce(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function tH(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async F=>{Ke()&&(f=mh(F)),await uu(e.session.current),Ke()&&(g=_E())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,T,k,A=0;for(m.onInjectable=()=>{A>=Mce||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,tl(process.stdout),h={text:Oce,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let C of g)e.replRenderer.writeLine(C);e.replRenderer.writeLine(""),g=[]}let F=u.drainNotifications();for(let{job:C,result:L}of F){let P=L.errorReason===void 0?"\u2713":"\u2717",M=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,I=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${P} [${C.id}] ${M} \xB7 ${I}s \xB7 `)+C.command)}let R=m.drainNotifications();for(let{job:C}of R){let L=C.status==="completed"?"\u2713":C.status==="failed"?"\u2717":"\u2298",P=C.endedAt!==void 0?Math.max(0,Math.round((C.endedAt-C.startedAt)/100)/10):0,M=C.label.length>60?`${C.label.slice(0,60)}\u2026`:C.label;e.replRenderer.writeLine(p.dim(` ${L} [${C.jobId}] subagent ${C.status} \xB7 ${P}s \xB7 `)+M)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let C of D)e.replRenderer.writeLine(C);e.replRenderer.writeLine("")}let _,O;if(h===void 0){let C=await e.session.current.takePendingPlanExitSeed();C!==void 0&&(e.stats.permissionMode=C.mode,h={text:C.message,attachments:[]})}if(h!==void 0){let C=h;h=void 0;let L=xl(e.stats.permissionMode),P=Ki({buffer:C.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:dl([...C.attachments])});e.replRenderer.writeLine(P),_=C.text.trim(),O=C.attachments}else{let C=y;y=void 0;let L=await o.readLine({promptFn:()=>xl(e.stats.permissionMode),...C!==void 0?{initialBuffer:C}:{},onSigint:r,onShiftTab:()=>{Iy(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});_=L.text.trim(),O=L.attachments}if(!_&&O.length===0)continue;if(_.startsWith("!")){let C=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!C&&(b||(b=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(_))){e.statusLine.rearm();continue}}let B=!1;if(_.startsWith("/")){let C=await $L(_,e.slashCtx,O);if(C.handled){if(C.result==="exit"){e.rl.close();return}if((_==="/clear"||_.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="submit"){h={text:C.result.message,attachments:O??[]},e.statusLine.rearm();continue}if(C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="prefill"){y=C.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}a.push(_),await $ce(e,_);let j=_;if(B){let C=hT(_);if(C){let L=C.name.replace(/^\//,"").split(":").pop()??"";if(L&&xE(L)){let P={skillName:L,rawArgs:C.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,I=Zi(M),U=Date.now();W(`[afk trace] preflight.start commandName=${L}`);let K=!1,Q=await Qi(P,{cwd:e.stats.cwd??process.cwd(),artifactDir:I},ee=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${L}) failed: `)+(ee instanceof Error?ee.message:String(ee)))});K=Q!==null,W(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-U} success=${K}`),j=AE(Q?.manifestBlock,_)}}}let $=u.drainInjections();$.length>0&&(j=$+j);let H=m.drainInjections();if(H.length>0&&(j=H+j),S!==void 0&&(j=S+`
1752
+ ${T}`})}return{fileBlocks:a,warnings:l}}async function eH(e,t,n,r,o="summary",i,s){let a=OB(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),nl(process.stdout,Ld(process.cwd(),!0));let l="",c=0,d=!1,u=!1,m=!1,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,T=[],k=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,F=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then($=>{for(let H of $)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${H.jobId}: ${H.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,D=()=>new Sl({out:vl(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(j=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:F}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...R?{compositor:R}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=D(),O=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let $=j;i.fn=H=>$.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.($=>_.setInterrupting($)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,_.setSoftStopping(!0),t.interrupt().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),P)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(F);let{fileBlocks:j,warnings:$}=Z1(e.text,{rootDir:process.cwd()});for(let P of $)(i??{fn:console.log}).fn(p.dim(` @-file: ${P}`));let H=j.length>0||e.attachments.length>0?X1(e.text,e.attachments,void 0,j):e.text,C=t.sendMessageStream(H);if(await Ws((P,M)=>{_.process(P,M)},async()=>{for await(let P of C){if(h||y)break;if(P.type==="chunk"&&P.chunk.type==="content"?(l+=P.chunk.content,d=!0):P.type==="message"&&!d&&(l=P.message.content),P.type==="stream_retry"&&(l=l.slice(0,c)),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let M=P.chunk,I={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};k.set(M.toolUseId,I),T.push(I)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let I=k.get(M.toolUseId);if(I&&(I.result=M.content,I.isError=M.isError,k.delete(M.toolUseId)),r.onContextProgress){let U=Date.now();if(U-w>=S){w=U;try{let K=r.onContextProgress();K instanceof Promise&&await K}catch(K){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),K)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await O(),R&&P.autoResume===!0){let M=new AbortController;b.abort=M;let I=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,U=I?`Keep waiting \u2014 auto-resumes at ${I}`:"Keep waiting \u2014 auto-resume in progress",K="Switch model / provider (type /model after)",Z="Stop waiting",te=[p.warning(" \u23F3 Usage limit reached.")+(I?p.dim(` Auto-resumes at ${I}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];dr(R,{header:te,options:[U,K,Z],signal:M.signal,initialIndex:0}).then(se=>{if(b.abort=null,!se)return;let z=se[0];z===void 0||z===U||(y=!0,z===K&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(fe=>{Ke()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),fe)}))}).catch(se=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),se)})}else(i??{fn:console.log}).fn(dA({reason:P.reason,...P.resetsAt!==void 0?{resetsAt:P.resetsAt}:{},...P.accountId!==void 0?{accountId:P.accountId}:{},...P.autoResume!==void 0?{autoResume:P.autoResume}:{}}));continue}if(P.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,T.length=0,k.clear(),f=!1,g=void 0,u=!1,_=D(),m=!1,await B(),(i??{fn:console.log}).fn(p.success(M));continue}if(P.type==="error"){await O(),xs(ws(P.error)),u=!0;continue}_.process(P),P.type==="done"&&(f=!0,g=P.metadata)}}),await O(),h){let P=i?i.fn:console.log,M=R?R.getPendingCount():0,I=M>0?` \xB7 ${M} queued`:"";P(p.warning(`\u23F8 Stopped${I} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(f&&!h&&!y){Di(n,a,l,g,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),tl(process.stdout),kL(process.stdout,"afk: turn complete");let P=I=>{i?i.fn(I):console.log(I)},M=$y(l);if(M){P(V1(M)),P("");let I=zL(T);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:I})}catch{}if(n.permissionMode==="autonomous"){let U=M.kind==="done"&&bc().verifyDone===!0&&!I;YL(M,void 0,{unverified:U})}}if(Ice(g,n,P),r.onAfterTurn){let I=r.onAfterTurn();I instanceof Promise&&await I.catch(()=>{})}}}catch(j){await O(),u||xs(ws(j))}finally{await O(),nl(process.stdout,Ld(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function _ce(e,t){let n=Math.round(e*100),r=ue(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ue(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function Ice(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ve(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ue(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=yT(t),a=qt(t.model),l=_ce(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var Pce=5e3,Mce=3,Oce="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function $ce(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function tH(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async F=>{Ke()&&(f=mh(F)),await uu(e.session.current),Ke()&&(g=_E())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,T,k,A=0;for(m.onInjectable=()=>{A>=Mce||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,tl(process.stdout),h={text:Oce,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let C of g)e.replRenderer.writeLine(C);e.replRenderer.writeLine(""),g=[]}let F=u.drainNotifications();for(let{job:C,result:L}of F){let P=L.errorReason===void 0?"\u2713":"\u2717",M=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,I=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${P} [${C.id}] ${M} \xB7 ${I}s \xB7 `)+C.command)}let R=m.drainNotifications();for(let{job:C}of R){let L=C.status==="completed"?"\u2713":C.status==="failed"?"\u2717":"\u2298",P=C.endedAt!==void 0?Math.max(0,Math.round((C.endedAt-C.startedAt)/100)/10):0,M=C.label.length>60?`${C.label.slice(0,60)}\u2026`:C.label;e.replRenderer.writeLine(p.dim(` ${L} [${C.jobId}] subagent ${C.status} \xB7 ${P}s \xB7 `)+M)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let C of D)e.replRenderer.writeLine(C);e.replRenderer.writeLine("")}let _,O;if(h===void 0){let C=await e.session.current.takePendingPlanExitSeed();C!==void 0&&(e.stats.permissionMode=C.mode,h={text:C.message,attachments:[]})}if(h!==void 0){let C=h;h=void 0;let L=xl(e.stats.permissionMode),P=Ki({buffer:C.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:dl([...C.attachments])});e.replRenderer.writeLine(P),_=C.text.trim(),O=C.attachments}else{let C=y;y=void 0;let L=await o.readLine({promptFn:()=>xl(e.stats.permissionMode),...C!==void 0?{initialBuffer:C}:{},onSigint:r,onShiftTab:()=>{Iy(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});_=L.text.trim(),O=L.attachments}if(!_&&O.length===0)continue;if(_.startsWith("!")){let C=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!C&&(b||(b=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(_))){e.statusLine.rearm();continue}}let B=!1;if(_.startsWith("/")){let C=await $L(_,e.slashCtx,O);if(C.handled){if(C.result==="exit"){e.rl.close();return}if((_==="/clear"||_.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="submit"){h={text:C.result.message,attachments:O??[]},e.statusLine.rearm();continue}if(C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="prefill"){y=C.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}a.push(_),await $ce(e,_);let j=_;if(B){let C=hT(_);if(C){let L=C.name.replace(/^\//,"").split(":").pop()??"";if(L&&xE(L)){let P={skillName:L,rawArgs:C.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,I=Zi(M),U=Date.now();W(`[afk trace] preflight.start commandName=${L}`);let K=!1,Z=await Qi(P,{cwd:e.stats.cwd??process.cwd(),artifactDir:I},te=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${L}) failed: `)+(te instanceof Error?te.message:String(te)))});K=Z!==null,W(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-U} success=${K}`),j=AE(Z?.manifestBlock,_)}}}let $=u.drainInjections();$.length>0&&(j=$+j);let H=m.drainInjections();if(H.length>0&&(j=H+j),S!==void 0&&(j=S+`
1753
1753
 
1754
1754
  `+j,S=void 0),e.hookRegistry)try{let C={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(C);L.injectContext&&(j=L.injectContext+j)}catch(C){if(C instanceof he){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(C.reason?p.dim(`: ${_r(C.reason)}`):"")),e.statusLine.rearm();continue}if(C instanceof qn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${C.timeoutMs}ms`)),e.statusLine.rearm();continue}throw C}if(T=void 0,k=void 0,await eH({text:j,attachments:O},e.session.current,e.stats,{setInFlight(C){n.turnInFlight=C},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(C){await t.appendUser(C)},async onTurnComplete(C,L){if(await t.appendTurn(C,L),e.stats.sessionId)try{Mo(e.stats)}catch(P){w||(w=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(P instanceof Error?P.message:String(P))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(C,L)=>{d?.push(C),T=C.kind,k=L?.doneHasCorroboratingEvidence},setActiveCompositor:C=>{n.activeCompositor=C},setInterruptNotifier:C=>{n.notifyInterrupting=C},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:C=>o.setBackgroundHandler(C),setSoftStopHandler:i,setPausedState:C=>o.setPausedState(C),setPauseInterruptHandler:C=>o.setPauseInterruptHandler(C),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:C=>c.repaint(C)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(xl(e.stats.permissionMode))),e.hookRegistry)try{let C=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...T!==void 0?{terminalState:T}:{},...k!==void 0?{doneHasCorroboratingEvidence:k}:{}},void 0,Pce);C.injectContext&&C.injectContext.trim().length>0&&(S=C.injectContext)}catch(C){if(C instanceof ct)throw C;C instanceof qn?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):C instanceof he?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${_r(C.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(C))}}}function Dce(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function nH(e,t,n,r){let o=await $1(),i=new _y({rl:e.rl,history:o,statusLine:e.statusLine}),s=Dce(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await B1(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=Y1(e,n),await tH(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}fc();ea();import{execFile as Fce}from"node:child_process";import{dirname as Lce,isAbsolute as Nce,resolve as Bce}from"node:path";import{promisify as Uce}from"node:util";var rH=Uce(Fce),jce=3e3,Hce=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Wce(){let t=(await rH("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Nce(t)?t:Bce(process.cwd(),t);return Lce(n)}async function oH(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Wce()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),jce)});try{let o=cn({execFile:rH,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>Hce.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}gp();fc();import{promises as Kce}from"node:fs";import{dirname as Gce,join as aH}from"node:path";import{randomBytes as qce}from"node:crypto";var zce=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
1755
- `),iH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,XE=30,Jce=1024,Yce=8e3,Vce="haiku";async function Xce(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=tde(n,Jce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Yce),s=t.signal?nde([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ms({token:t.token,model:t.model??Vce,system:zce,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Qce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Gce(t.worktreePath);return await Zce(l,c)}function Qce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(iH.test(t)&&t.length<=XE)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>XE)break;o=s}return iH.test(o)?o:null}async function Zce(e,t){if(!await ede(aH(t,e)))return e;let n=qce(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,XE-5)}-${n}`}async function ede(e){try{return await Kce.access(e),!0}catch{return!1}}function tde(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function nde(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function lH(e){let t,n,r=aH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Xce(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ap(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return sH(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return sH(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function sH(e,t){e&&e.setCwd(t),rde(t)}function rde(e){try{process.chdir(e)}catch{}}jt();q();import{spawn as dH}from"child_process";import{existsSync as uH,mkdirSync as lde,readFileSync as pH,unlinkSync as cH,writeFileSync as mH}from"fs";import{get as cde}from"https";import{join as fH}from"path";import{readFileSync as ode}from"fs";import{dirname as ide,join as sde}from"path";import{fileURLToPath as ade}from"url";function gr(){try{return"5.81.0"}catch{}try{let e=ide(ade(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(ode(sde(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var dde=64*1024,ude=10800*1e3,pde=800,mde=3600*1e3,fde="update-check.json",gde="pending-update.json";function QE(){return fH(hs(),fde)}function yu(){return fH(hs(),gde)}function ZE(){let e=hs();uH(e)||lde(e,{recursive:!0})}function gH(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function hH(){try{let e=pH(QE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function yH(){try{ZE();let e=`
1755
+ `),iH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,XE=30,Jce=1024,Yce=8e3,Vce="haiku";async function Xce(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=tde(n,Jce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Yce),s=t.signal?nde([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ms({token:t.token,model:t.model??Vce,system:zce,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Qce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Gce(t.worktreePath);return await Zce(l,c)}function Qce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(iH.test(t)&&t.length<=XE)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>XE)break;o=s}return iH.test(o)?o:null}async function Zce(e,t){if(!await ede(aH(t,e)))return e;let n=qce(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,XE-5)}-${n}`}async function ede(e){try{return await Kce.access(e),!0}catch{return!1}}function tde(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function nde(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function lH(e){let t,n,r=aH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Xce(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ap(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return sH(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return sH(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function sH(e,t){e&&e.setCwd(t),rde(t)}function rde(e){try{process.chdir(e)}catch{}}jt();q();import{spawn as dH}from"child_process";import{existsSync as uH,mkdirSync as lde,readFileSync as pH,unlinkSync as cH,writeFileSync as mH}from"fs";import{get as cde}from"https";import{join as fH}from"path";import{readFileSync as ode}from"fs";import{dirname as ide,join as sde}from"path";import{fileURLToPath as ade}from"url";function gr(){try{return"5.81.2"}catch{}try{let e=ide(ade(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(ode(sde(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var dde=64*1024,ude=10800*1e3,pde=800,mde=3600*1e3,fde="update-check.json",gde="pending-update.json";function QE(){return fH(hs(),fde)}function yu(){return fH(hs(),gde)}function ZE(){let e=hs();uH(e)||lde(e,{recursive:!0})}function gH(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function hH(){try{let e=pH(QE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function yH(){try{ZE();let e=`
1756
1756
  const https = require('https');
1757
1757
  const fs = require('fs');
1758
1758
  const url = 'https://registry.npmjs.org/agent-afk/latest';
@@ -1779,7 +1779,7 @@ ${r}Run \`npm install -g agent-afk\` to update${o}
1779
1779
  Run \`afk i\` then \`/resume\` to list saved sessions.
1780
1780
  `),process.exitCode=1;return}}catch(M){r.fail("Session not found");let I=M instanceof Error?M.message:String(M);process.stderr.write(`Error: ${I}
1781
1781
  Run \`afk i\` then \`/resume\` to list saved sessions.
1782
- `),process.exitCode=1;return}let o=xt();n.thinkingUi=Sde(n,o),Xr(Qr(tp(n.theme,o.theme)));let i=v.AFK_WORKTREE_BRANCH_PREFIX??o.interactive?.worktreeBranchPrefix,s=n.worktreeBase??v.AFK_WORKTREE_BASE??o.interactive?.worktreeBase,a={};i!==void 0&&(a.branchPrefix=i),s!==void 0&&(a.baseRef=s);let l=Object.keys(a).length>0?a:void 0,c=v.AFK_WORKTREE_BOOT_PRUNE==="0",d=await oH({disabled:c}),u=wde(n,o),m=pn(),f=n.worktree===!0&&u&&m!==void 0,g,h,y;if(n.worktree!==void 0)try{f?(y=await oC(l),r.text="Worktree will be named from your first message"):(h=await Cp(n.worktree,l),g=h.path,r.text=`Worktree ready at ${h.path} (branch: ${h.branch})`)}catch(M){r.fail("Worktree setup failed"),Y(M)}let b=d.ran&&d.removedCount>0?`Pruned ${d.removedCount} stale worktree(s). Run /worktree list for details.`:void 0,w;try{w=await A1(n,g!==void 0?{cwd:g}:void 0)}catch(M){r.fail("Invalid options"),Y(M)}let S=t.join(" ").trim();if(S&&(w.initialInput=S),y!==void 0&&m!==void 0){let M=y,I=m;w.firstTurnHook=async U=>{let K=kH({text:"Naming & creating worktree\u2026",...jd}).start(),Q=await lH({deferred:M,message:U,token:I,session:w.session.current,...i!==void 0?{branchPrefix:i}:{}}).finally(()=>K.stop());if(Q.status==="created"||Q.status==="created-fallback"){h=M.handle(),w.stats.cwd=Q.path;let ee=os.relative(process.cwd(),Q.path)||Q.path;if(Q.status==="created")console.log(p.dim(" \u21AA worktree: ")+`${ee} `+p.dim(`(branch: ${Q.branch})`));else{let se=bde(Q.reason,Q.detail),z=se!==void 0?p.dim(` \u2014 ${se}`):"";console.log(p.dim(" \u21AA worktree: ")+`${ee} `+p.dim(`(branch: ${Q.branch})`)+z)}}else console.warn(p.warning("\u26A0 ")+`Worktree creation failed: ${Q.reason}. `+p.dim(`Continuing in ${Bd(process.cwd(),{maxWidth:60})} (no isolation).`))}}Bi(async()=>{w.teardownTrustedSkillEvents?.(),Xe.uninstall(),w.bgSummarizer?.stop(),await w.backgroundRegistry.cancelAll().catch(()=>{}),await w.session.current.close(),w.mcpManager&&await w.mcpManager.disconnectAll(),w.memoryStore.close(),h!==void 0&&await h.cleanup({force:w.stats.totalTurns===0})}),r.succeed("Session ready"),h!==void 0?console.log(p.dim(" \u21AA worktree: ")+p.dim(Bd(h.path,{maxWidth:60}))+p.dim(` (branch: ${h.branch})`)):y!==void 0&&console.log(p.dim(" \u21AA worktree: named & created from your first message"));let T=await I1(()=>w.stats.model);console.log(p.dim(` transcript: ${T.path()}`)),Bi(async()=>{await T.appendEnded()});let k=!1,A=()=>{if(w.stats.totalTurns===0)return;let M=Mo(w.stats);return k=!0,M};Bi(async()=>{if(!k)try{A()}catch{}});let F={turnInFlight:!1,lastSigintAt:0};w.getInFlight=()=>F.turnInFlight;let R=1500,D=()=>{let M=Date.now();if(F.tryAbortShellForeground&&F.tryAbortShellForeground()){F.lastSigintAt=M;return}if(F.turnInFlight){F.requestSoftStop?F.requestSoftStop():w.session.current.interrupt().catch(()=>{}),F.lastSigintAt=M,F.notifyInterrupting?.(!0);let I=`
1782
+ `),process.exitCode=1;return}let o=xt();n.thinkingUi=Sde(n,o),Xr(Qr(tp(n.theme,o.theme)));let i=v.AFK_WORKTREE_BRANCH_PREFIX??o.interactive?.worktreeBranchPrefix,s=n.worktreeBase??v.AFK_WORKTREE_BASE??o.interactive?.worktreeBase,a={};i!==void 0&&(a.branchPrefix=i),s!==void 0&&(a.baseRef=s);let l=Object.keys(a).length>0?a:void 0,c=v.AFK_WORKTREE_BOOT_PRUNE==="0",d=await oH({disabled:c}),u=wde(n,o),m=pn(),f=n.worktree===!0&&u&&m!==void 0,g,h,y;if(n.worktree!==void 0)try{f?(y=await oC(l),r.text="Worktree will be named from your first message"):(h=await Cp(n.worktree,l),g=h.path,r.text=`Worktree ready at ${h.path} (branch: ${h.branch})`)}catch(M){r.fail("Worktree setup failed"),Y(M)}let b=d.ran&&d.removedCount>0?`Pruned ${d.removedCount} stale worktree(s). Run /worktree list for details.`:void 0,w;try{w=await A1(n,g!==void 0?{cwd:g}:void 0)}catch(M){r.fail("Invalid options"),Y(M)}let S=t.join(" ").trim();if(S&&(w.initialInput=S),y!==void 0&&m!==void 0){let M=y,I=m;w.firstTurnHook=async U=>{let K=kH({text:"Naming & creating worktree\u2026",...jd}).start(),Z=await lH({deferred:M,message:U,token:I,session:w.session.current,...i!==void 0?{branchPrefix:i}:{}}).finally(()=>K.stop());if(Z.status==="created"||Z.status==="created-fallback"){h=M.handle(),w.stats.cwd=Z.path;let te=os.relative(process.cwd(),Z.path)||Z.path;if(Z.status==="created")console.log(p.dim(" \u21AA worktree: ")+`${te} `+p.dim(`(branch: ${Z.branch})`));else{let se=bde(Z.reason,Z.detail),z=se!==void 0?p.dim(` \u2014 ${se}`):"";console.log(p.dim(" \u21AA worktree: ")+`${te} `+p.dim(`(branch: ${Z.branch})`)+z)}}else console.warn(p.warning("\u26A0 ")+`Worktree creation failed: ${Z.reason}. `+p.dim(`Continuing in ${Bd(process.cwd(),{maxWidth:60})} (no isolation).`))}}Bi(async()=>{w.teardownTrustedSkillEvents?.(),Xe.uninstall(),w.bgSummarizer?.stop(),await w.backgroundRegistry.cancelAll().catch(()=>{}),await w.session.current.close(),w.mcpManager&&await w.mcpManager.disconnectAll(),w.memoryStore.close(),h!==void 0&&await h.cleanup({force:w.stats.totalTurns===0})}),r.succeed("Session ready"),h!==void 0?console.log(p.dim(" \u21AA worktree: ")+p.dim(Bd(h.path,{maxWidth:60}))+p.dim(` (branch: ${h.branch})`)):y!==void 0&&console.log(p.dim(" \u21AA worktree: named & created from your first message"));let T=await I1(()=>w.stats.model);console.log(p.dim(` transcript: ${T.path()}`)),Bi(async()=>{await T.appendEnded()});let k=!1,A=()=>{if(w.stats.totalTurns===0)return;let M=Mo(w.stats);return k=!0,M};Bi(async()=>{if(!k)try{A()}catch{}});let F={turnInFlight:!1,lastSigintAt:0};w.getInFlight=()=>F.turnInFlight;let R=1500,D=()=>{let M=Date.now();if(F.tryAbortShellForeground&&F.tryAbortShellForeground()){F.lastSigintAt=M;return}if(F.turnInFlight){F.requestSoftStop?F.requestSoftStop():w.session.current.interrupt().catch(()=>{}),F.lastSigintAt=M,F.notifyInterrupting?.(!0);let I=`
1783
1783
  `+p.info("\u2139 ")+"Press Ctrl+C again to exit.",U=F.activeCompositor;if(U&&U.isArmed())try{U.commitAbove(I)}catch{console.log(I)}else console.log(I);return}if(M-F.lastSigintAt<R){w.session.current?.abort("sigint"),w.rl.close();return}F.lastSigintAt=M,console.log(`
1784
1784
  `+p.info("\u2139 ")+"Press Ctrl+C again (or /exit) to quit.")};process.on("SIGINT",D),Bi(async()=>{process.removeListener("SIGINT",D)});let _=!1,O=()=>{if(_)return;_=!0,w.session.current?.abort("sigterm");try{w.rl.close()}catch{}setTimeout(()=>{Zg().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGTERM",O),Bi(async()=>{process.removeListener("SIGTERM",O)});let B=!1,j=()=>{if(B)return;B=!0,w.session.current?.abort("sighup");try{w.rl.close()}catch{}setTimeout(()=>{Zg().finally(()=>process.exit(0))},2e3).unref()};process.on("SIGHUP",j),Bi(async()=>{process.removeListener("SIGHUP",j)}),process.stdout.write("\x1B[3J\x1B[2J\x1B[H");let $=1,H=process.stdout.write.bind(process.stdout),C=process.stderr.write.bind(process.stderr),L=M=>(typeof M=="string"?M:M instanceof Uint8Array?Buffer.from(M).toString("utf8"):String(M)).match(/\n/g)?.length??0,P=M=>((I,...U)=>($+=L(I),M(I,...U)));process.stdout.write=P(H),process.stderr.write=P(C);try{if(By!==null){let{updateInfo:I,pendingMessage:U}=By;By=null,U!==null&&process.stderr.write(U),I!==null&&Dy(I)}let M=w.resumeTarget?`Resuming ${w.resumeTarget.id} \xB7 ${w.stats.totalTurns} prior turn${w.stats.totalTurns===1?"":"s"}`:void 0;console.log(`
1785
1785
  `+aA({mode:"Interactive Mode",model:w.stats.model,version:gr(),...h!==void 0?{worktree:h.branch}:{},cwd:g??process.cwd(),...M!==void 0?{metaLine:M}:{},hintLine:vde()})),b!==void 0&&console.log(p.dim(` ${b}`)),w.resumeTarget&&ph(w.stats,w.completionWriter),console.log()}finally{process.stdout.write=H,process.stderr.write=C}w.preArmAnchorRow=$,nl(process.stdout,Ld(process.cwd(),!1)),w.statusLine.start(),w.slashCtx.ui.repaintStatusLine(),w.rl.on("close",async()=>{w.statusLine.stop(),nl(process.stdout,""),kde(w,h,A),console.log(p.info("\u2139 ")+"Goodbye!"),await Zg(),process.exit(0)}),await nH(w,T,F,D)})}function kde(e,t,n){if(e.stats.totalTurns===0)return;console.log(de("Session Summary"));let r=[`${e.stats.totalTurns} turn${e.stats.totalTurns===1?"":"s"}`,ve(Date.now()-e.stats.sessionStartTime)];e.stats.totalCostUsd>0&&r.push(st(e.stats.totalCostUsd)),e.stats.totalTokens>0&&r.push(ue(e.stats.totalTokens)+" tokens"),console.log(p.dim(" "+r.join(" \xB7 ")));let o=t?os.basename(t.path):"none";console.log(p.dim(` model: ${e.stats.model} \xB7 worktree: ${o}`));try{let s=e.stats.cwd??process.cwd(),l=hde("git",["diff","--shortstat","HEAD"],{cwd:s,encoding:"utf8",timeout:2e3}).trim();console.log(p.dim(` edits: ${l||"no files changed"}`))}catch{}let i=e.stats.sessionId;try{let s=n();!i&&s&&(i=os.basename(s,".json"))}catch{}i&&console.log(p.dim(" Continue with: ")+p.brand(Oo(i,e.stats.model))),console.log()}G();import Tde from"ora";xa();Be();jt();function RH(e){e.command("status").description("Check agent connection status").option("-f, --format <format>","Output format (text|json)","text").action(async t=>{let n=Tde("Checking status...").start();try{let r=Ze(),o=re(r),i=Ve(r),s=o==="openai-compatible"||o==="openai-codex";await new Rt({model:s?"gpt-4o-mini":"haiku",...i!==void 0?{apiKey:i}:{},maxTurns:1}).close(),n.succeed(`${o} provider reachable`);let l=Ls();if(t.format==="json"){let c=pn(),d=Ig(),u=c?v.ANTHROPIC_API_KEY?"ANTHROPIC_API_KEY":"CLAUDE_CODE_OAUTH_TOKEN":null,m=d?v.OPENAI_API_KEY?"OPENAI_API_KEY":"CODEX_API_KEY":null;console.log(JSON.stringify({providers:{anthropic:{ok:!!c,source:u},codex:{ok:!!d,source:m}},model:String(r),permissionMode:l,bypass:l==="bypassPermissions"},null,2))}else{let c=l==="bypassPermissions"?{label:"Permissions",value:"Bypass \u2014 path containment off (read/write anywhere)",kind:"warn"}:{label:"Permissions",value:`Contained \u2014 mode: ${l}`,kind:"info"};console.log(`
@@ -1913,13 +1913,13 @@ Multiple chats found:`)),o.forEach((l,c)=>{let d=l.username?`@${l.username}`:l.f
1913
1913
  `).slice(-o-1);console.log(i.join(`
1914
1914
  `))})}function Zue(e){if(console.log(p.heading("\u{1F4CA} Telegram Bot Status")),console.log(""),e.running?(console.log(` ${p.success("\u25CF")} Running (PID ${e.pid})`),e.uptimeSec!==void 0&&console.log(` Uptime: ${epe(e.uptimeSec)}`),e.memoryMb!==void 0&&console.log(` Memory: ${e.memoryMb} MB`)):console.log(` ${p.error("\u25CF")} Stopped`),console.log(` PID: ${e.pidFile}`),console.log(` Logs: ${e.logFile}`),e.logTail&&e.logTail.length>0){console.log(""),console.log(p.heading("Recent log entries:"));for(let t of e.logTail)console.log(p.meta(` ${t}`))}}function epe(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m ${e%60}s`;let n=Math.floor(t/60);return n<24?`${n}h ${t%60}m`:`${Math.floor(n/24)}d ${n%24}h`}import{execFile as _pe}from"node:child_process";import{promisify as Ipe}from"node:util";q();import{execFile as tpe}from"node:child_process";import{randomBytes as npe}from"node:crypto";import{promises as Il}from"node:fs";import{join as qy}from"node:path";import{promisify as rpe}from"node:util";var ope=rpe(tpe),kW=16;var Ct=class extends Error{cause;code;constructor(t,n,r){super(t),this.name="WorktreeError",this.cause=n,this.code=r}};function Sx(e,t=40){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).replace(/-+$/g,"")||"task"}function ipe(){return npe(4).toString("hex").slice(0,4)}function spe(e){let t=n=>String(n).padStart(2,"0");return`${e.getUTCFullYear()}${t(e.getUTCMonth()+1)}${t(e.getUTCDate())}T${t(e.getUTCHours())}${t(e.getUTCMinutes())}${t(e.getUTCSeconds())}`}function ape(e,t={}){let n=(t.now??(()=>new Date))(),r=(t.randomSuffix??ipe)();return`${spe(n)}-${Sx(e,32)}-${r}`}async function ss(e,t){try{let n=await ope("git",t,{cwd:e,maxBuffer:4194304});return{stdout:n.stdout.trim(),stderr:n.stderr.trim()}}catch(n){let r=n,o=(r.stderr??r.stdout??r.message??"").toString().trim();throw new Ct(`git ${t.join(" ")} failed: ${o}`,n)}}async function lpe(e){let{stdout:t}=await ss(e,["rev-parse","--show-toplevel"]);if(!t)throw new Ct(`not a git repository: ${e}`);return t}async function cpe(e,t){if(t){let{stdout:o}=await ss(e,["rev-parse",t]);return{sha:o}}let{stdout:n}=await ss(e,["rev-parse","HEAD"]),r;try{let{stdout:o}=await ss(e,["symbolic-ref","--quiet","HEAD"]);o&&(r=o)}catch{}return{sha:n,branch:r}}function dpe(e,t,n){let r=n?Sx(n,32):`branch-${t}`;return`afk/farm/${e}/${t}-${r}`}function upe(e,t){return qy(e,`branch-${t}`)}async function ppe(e,t){try{await ss(e,["worktree","remove","--force",t])}catch{}}async function mpe(e,t){try{await ss(e,["branch","-D",t])}catch{}}async function TW(e){if(e.count<1||e.count>kW)throw new Ct(`count must be between 1 and ${kW}, got ${e.count}`);if(e.labels&&e.labels.length!==e.count)throw new Ct(`labels.length (${e.labels.length}) must equal count (${e.count})`);let t=e.cwd??process.cwd(),n=await lpe(t),{sha:r,branch:o}=await cpe(n,e.baseRef),i=(e.now??(()=>new Date))(),s=e.taskSlug??ape(e.taskName,{now:()=>i,randomSuffix:e.randomSuffix}),a=e.taskSlug??s,l=Fb(s);try{throw await Il.access(l),new Ct(`farm directory already exists: ${l}`)}catch(u){if(u.code!=="ENOENT")throw u instanceof Ct?u:new Ct(`failed to check farm dir ${l}`,u)}await Il.mkdir(l,{recursive:!0});let c=[];try{for(let u=1;u<=e.count;u++){let m=e.labels?.[u-1],f=dpe(s,u,m),g=upe(l,u);await ss(n,["worktree","add","-b",f,g,r]),c.push({index:u,label:m?Sx(m,32):void 0,path:g,branch:f})}}catch(u){for(let m of c.slice().reverse())await ppe(n,m.path),await mpe(n,m.branch);throw await Il.rm(l,{recursive:!0,force:!0}).catch(()=>{}),u instanceof Ct?u:new Ct("farm creation failed",u)}let d={schemaVersion:3,taskId:a,taskSlug:s,taskName:e.taskName,repoRoot:n,baseRef:r,baseBranch:o,farmDir:l,createdAt:i.toISOString(),branches:c};return await Il.writeFile(qy(l,"farm.json"),JSON.stringify(d,null,2)+`
1915
1915
  `,"utf8"),d}function fpe(e){let t=e;return t.respawnedAt===void 0&&(t.respawnedAt=void 0),t.respawnedAs===void 0&&(t.respawnedAs=void 0),t.prUrl===void 0&&(t.prUrl=void 0),t.prCreatedAt===void 0&&(t.prCreatedAt=void 0),t}async function gpe(e){let t=qy(Fb(e),"farm.json");try{let n=await Il.readFile(t,"utf8"),r=JSON.parse(n);if(r.schemaVersion!==1&&r.schemaVersion!==2&&r.schemaVersion!==3)throw new Ct(`unsupported farm manifest schema: ${r.schemaVersion} (expected 1, 2, or 3)`,void 0,"unsupported-schema");return fpe(r)}catch(n){if(n.code==="ENOENT")return null;throw n instanceof Ct?n:new Ct(`failed to load farm manifest ${t}`,n,"invalid")}}async function EW(e,t){let n=await gpe(e);if(!n)throw new Ct(`farm not found: ${e}`);return n.memoryFactId=t,n.schemaVersion=3,await Il.writeFile(qy(n.farmDir,"farm.json"),JSON.stringify(n,null,2)+`
1916
- `,"utf8"),n}Ge();import{spawn as hpe}from"child_process";import{promises as zy}from"fs";import{join as vu,dirname as wrt}from"path";var ype=1,Jy=12e4;async function CW(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=Jy,_spawn:i=hpe,_readPackageJson:s=bpe,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await wpe(t,s),d=0,u=0,m=0,f;if(c){let b=await IW(c,t,o,i,a);m=b.durationMs,b.timedOut?(u=1,f=`tests timed out after ${o}ms`):b.crashed?(u=1,f=`test runner crashed: ${kpe(b.stderr,200)}`):b.exitCode===0?d=1:u=1}else f="no test command found (no package.json scripts.test)";let g=await Spe(t,o,i,a),h=await vpe(t,n,i),y={schemaVersion:ype,pass:d,fail:u,loc_delta:h,lint_ok:g,duration_ms:m,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(y.error=f),c!==void 0&&(y.testCmd=c),y}async function _W(e,t,n){let r=vu(e,"scores");await zy.mkdir(r,{recursive:!0});let o=vu(r,`branch-${t}.json`);return await zy.writeFile(o,JSON.stringify(n,null,2)+`
1916
+ `,"utf8"),n}Ge();import{spawn as hpe}from"child_process";import{promises as zy}from"fs";import{join as vu,dirname as vrt}from"path";var ype=1,Jy=12e4;async function CW(e){let{branchPath:t,baseSha:n,testCmd:r,timeoutMs:o=Jy,_spawn:i=hpe,_readPackageJson:s=bpe,_now:a=Date.now,_nowIso:l=()=>new Date().toISOString()}=e,c=r??await wpe(t,s),d=0,u=0,m=0,f;if(c){let b=await IW(c,t,o,i,a);m=b.durationMs,b.timedOut?(u=1,f=`tests timed out after ${o}ms`):b.crashed?(u=1,f=`test runner crashed: ${kpe(b.stderr,200)}`):b.exitCode===0?d=1:u=1}else f="no test command found (no package.json scripts.test)";let g=await Spe(t,o,i,a),h=await vpe(t,n,i),y={schemaVersion:ype,pass:d,fail:u,loc_delta:h,lint_ok:g,duration_ms:m,branchPath:t,baseSha:n,scoredAt:l()};return f!==void 0&&(y.error=f),c!==void 0&&(y.testCmd=c),y}async function _W(e,t,n){let r=vu(e,"scores");await zy.mkdir(r,{recursive:!0});let o=vu(r,`branch-${t}.json`);return await zy.writeFile(o,JSON.stringify(n,null,2)+`
1917
1917
  `,"utf8"),o}function ku(e){let t=e.filter(r=>r.score!==null),n=e.filter(r=>r.score===null).map(r=>r.index).sort((r,o)=>r-o);return t.sort((r,o)=>{let i=r.score,s=o.score,a=xW(i),l=xW(s);if(a!==l)return l-a;let c=RW(i.lint_ok),d=RW(s.lint_ok);return c!==d?d-c:i.loc_delta!==s.loc_delta?i.loc_delta-s.loc_delta:r.index-o.index}),[...t.map(r=>r.index),...n]}async function bpe(e){try{let t=await zy.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function wpe(e,t){let n=await t(vu(e,"package.json"));if(!AW(n))return;let r=n.scripts;return!AW(r)||typeof r.test!="string"?void 0:await PW(vu(e,"pnpm-lock.yaml"))?"pnpm test":"npm test"}async function IW(e,t,n,r,o){let i=o();return new Promise(s=>{let a;try{a=r(e,{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],env:{...process.env,CI:"1"}})}catch(m){s({exitCode:null,durationMs:o()-i,stderr:m instanceof Error?m.message:String(m),timedOut:!1,crashed:!0});return}let l="",c=!1,d=!1,u=setTimeout(()=>{c=!0,a.kill("SIGKILL")},n);a.stderr?.on("data",m=>{l+=String(m),l.length>64e3&&(l=l.slice(-32e3))}),a.on("error",m=>{d||(d=!0,clearTimeout(u),s({exitCode:null,durationMs:o()-i,stderr:m.message,timedOut:!1,crashed:!0}))}),a.on("close",m=>{d||(d=!0,clearTimeout(u),s({exitCode:m,durationMs:o()-i,stderr:l,timedOut:c,crashed:!1}))})})}async function Spe(e,t,n,r){if(!await PW(vu(e,"tsconfig.json")))return null;let o=await IW("npx --no-install tsc --noEmit",e,t,n,r);return o.crashed||o.timedOut?null:o.exitCode===0}async function vpe(e,t,n){return new Promise(r=>{let o;try{o=n("git",["diff","--shortstat",`${t}..HEAD`],{cwd:e,stdio:["ignore","pipe","pipe"]})}catch{r(0);return}let i="";o.stdout?.on("data",s=>{i+=String(s)}),o.on("error",()=>r(0)),o.on("close",()=>{let s=/(\d+) insertions?\(\+\)/.exec(i),a=/(\d+) deletions?\(-\)/.exec(i),l=s?Number(s[1]):0,c=a?Number(a[1]):0;r(l-c)})})}function xW(e){let t=e.pass+e.fail;return t===0?0:e.pass/t}function RW(e){return e===!0?2:e===!1?1:0}function kpe(e,t){return e.length<=t?e:e.slice(0,t)+"\u2026"}function AW(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function PW(e){try{return await zy.access(e),!0}catch{return!1}}im();function MW(e,t){let n;try{n=t?._store??new ut}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}try{let r=Tpe(e);return{factId:n.storeFact({category:"learning",content:JSON.stringify(r),source_surface:"afk"})}}catch(r){return{skipped:!0,reason:r instanceof Error?r.message:String(r)}}}function Tpe(e){let t=Epe(e.branches),n=e.winner??null,r=xpe(e,t);return{type:"farm-run",task:e.taskName,taskSlug:e.taskSlug,winner:n,why:r,scores:t,human_decision:e.human_decision??null,baseSha:e.baseSha,completedAt:e.completedAt}}function Epe(e){return e.map(t=>{let n=t.score??null;return{index:t.index,branch:t.branch,pass:n?.pass??0,fail:n?.fail??0,loc_delta:n?.loc_delta??0,lint_ok:n?.lint_ok??null,duration_ms:n?.duration_ms??0}})}function xpe(e,t){let{winner:n,branches:r}=e;if(n==null)return r.some(m=>m.score!=null)?`no winner: all ${r.length} branches failed tests`:"no winner: scoring data unavailable";let o=t.find(u=>u.index===n);if(!o)return`branch-${n} wins`;let i=o.pass>0?"\u2713":"\u2717",s=o.lint_ok===!0?"\u2713":o.lint_ok===!1?"\u2717":"?",a=o.loc_delta>=0?`+${o.loc_delta}`:String(o.loc_delta),c=t.filter(u=>u.index!==n).map(u=>u.loc_delta>=0?`+${u.loc_delta}`:String(u.loc_delta)),d=c.length>0?` (vs ${c.join(", ")} LoC)`:"";return`branch-${n} wins: tests${i}, lint${s}, ${a} LoC${d}`}var Rpe="afk:f:";var Ape=/^[a-z0-9T][a-z0-9T-]{0,62}$/;function Tu(e,t){if(!Ape.test(t))throw new Error(`buildFarmCallback: invalid taskSlug ${JSON.stringify(t)}`);let n=`${Rpe}${e}:${t}`,r=Buffer.byteLength(n,"utf8");if(r>64)throw new Error(`buildFarmCallback: payload ${r} bytes exceeds Telegram's 64-byte limit (slug=${t})`);return n}function OW(e){return{inline_keyboard:[[{text:"\u2705 Open PR",callback_data:Tu("p",e)},{text:"\u{1F501} Respawn from winner",callback_data:Tu("r",e)}],[{text:"\u{1F50D} Full diff",callback_data:Tu("d",e)},{text:"\u274C Discard all",callback_data:Tu("x",e)}]]}}function Cpe(e){let{taskName:t,taskSlug:n,baseSha:r,branches:o,winner:i}=e,s=o.filter(b=>b.ok),a=o.filter(b=>!b.ok),l=o.length,c=s.length,d=s.map(b=>({index:b.index,score:b.score??null})),u=ku(d),m=new Map(o.map(b=>[b.index,b])),f=[];f.push(`\u{1F331} Farm complete: ${c}/${l} branches \u2014 ${t}`),f.push("");let g=1;for(let b of u){let w=m.get(b);if(!w)continue;let S=i!==void 0&&i===w.index,T=w.label?` (${w.label})`:"",k=w.score??null,A=k===null?"\u2014":k.pass>0?"\u2713":"\u2717",F=k===null?"\u2014":k.lint_ok===!0?"\u2713":k.lint_ok===!1?"\u2717":"?",R=k===null?"?":k.loc_delta>0?`+${k.loc_delta}`:k.loc_delta<0?`${k.loc_delta}`:"0",D=S?" \u2190 winner":"";f.push(`#${g} ${w.branch}${T} tests${A} lint${F} ${R} LoC${D}`),g++}let h=[...a].sort((b,w)=>b.index-w.index);for(let b of h){let w=b.label?` (${b.label})`:"",S=b.error??"unknown error";f.push(`#${g} ${b.branch}${w} failed: ${S}`),g++}f.push(""),i===void 0&&(f.push("\u26A0 no branch won (no successful + scored branches)"),f.push(""));let y=r.slice(0,7);return f.push(`base: ${y}`),f.push(`farm: ~/.afk/farms/${n}/`),f.join(`
1918
1918
  `)}async function $W(e,t){let n=Cpe(e),r=OW(e.taskSlug),o=t?._push??await Promise.resolve().then(()=>(Tr(),Lw)).then(i=>i.pushIfConfigured);try{let i=await o(n,{replyMarkup:r});return i===null?{sent:!1,reason:"telegram unconfigured"}:{sent:!0,chatCount:i.length}}catch(i){return{sent:!1,reason:i instanceof Error?i.message:String(i)}}}var DW=Ipe(_pe);async function Ppe(e,t){try{let{stdout:n}=await DW("git",["-C",e,"rev-list",`${t}..HEAD`,"--count"],{maxBuffer:4194304});return parseInt(n.trim(),10)||0}catch{return 0}}async function Mpe(e){try{let{stdout:t}=await DW("git",["-C",e,"status","--porcelain"],{maxBuffer:4194304});return t.trim()?t.trim().split(`
1919
1919
  `).filter(Boolean):[]}catch{return[]}}var vx=class extends Error{dirtyFiles;constructor(t){super(`Source repository has uncommitted changes after farm run. Dirty files:
1920
1920
  ${t.map(n=>` ${n}`).join(`
1921
1921
  `)}`),this.name="FarmIsolationViolation",this.dirtyFiles=t}};function Ope(e,t){return e.length>=t?e:e+" ".repeat(t-e.length)}function $pe(e){if(e===void 0)return p.dim("\u2014");if(e===null)return p.dim("skipped");let t=e.fail===0&&e.pass>0?p.success("tests\u2713"):p.error("tests\u2717"),n=e.lint_ok===!0?p.success("lint\u2713"):e.lint_ok===!1?p.error("lint\u2717"):p.dim("lint?"),r=e.loc_delta>0?"+":"",o=p.dim(`${r}${e.loc_delta} LoC`);return`${t} ${n} ${o}`}function Dpe(e,t,n,r){let o="\u2500".repeat(45);console.log(p.dim(o)),console.log(`farm: ${e}`),console.log(`slug: ${t}`),console.log("");let i=r.some(d=>d.score!=null),s=i?ku(r.map(d=>({index:d.index,score:d.score??null}))).map(d=>r.find(u=>u.index===d)):r;for(let d=0;d<s.length;d++){let u=s[d],m=n.find(w=>w.index===u.index),f=u.ok?p.success("\u2713"):p.error("\u2717"),g=Ope(m.branch,40),h=u.ok?p.dim(`(${u.commitCount} commit${u.commitCount===1?"":"s"})`):p.error(`[error: ${u.error}]`),y=i?p.brand(`#${d+1} `):"",b=i?` ${$pe(u.score)}`:"";console.log(`${y}branch-${u.index} ${f} ${g} ${h}${b}`),console.log(p.dim(` worktree: ${m.path}`))}console.log(p.dim(o));let a=r.filter(d=>d.ok).length,l=r.length;console.log(`${a}/${l} branches completed.`);let c=r.some(d=>d.score!=null&&d.score.pass>0);i&&!c&&console.log(p.warning("\u26A0 no branch passed tests \u2014 ranking falls back to lint + LoC"))}function Fpe(e,t,n){let r=t.map(a=>{let l=e.branches.find(d=>d.index===a.index),c={index:a.index,branch:l?.branch??`(unknown-${a.index})`,ok:a.ok,commitCount:a.commitCount};return l?.label!==void 0&&(c.label=l.label),a.error!==void 0&&(c.error=a.error),a.score!==void 0&&(c.score=a.score),c}),o=ku(t.map(a=>({index:a.index,score:a.score??null}))),i;for(let a of o){let l=t.find(c=>c.index===a);if(!(!l||!l.ok||!l.score)&&l.score.pass>0&&l.score.fail===0){i=a;break}}if(i===void 0)for(let a of o){let l=t.find(c=>c.index===a);if(l?.ok&&l.score){i=a;break}}let s={taskName:e.taskName,taskSlug:e.taskSlug,baseSha:e.baseRef,startedAt:n,completedAt:new Date().toISOString(),branches:r};return i!==void 0&&(s.winner=i),e.human_decision!==void 0&&(s.human_decision=e.human_decision),s}async function Lpe(e){let{task:t,branches:n,labels:r,model:o,baseRef:i,cwd:s=process.cwd(),failFast:a,taskSlug:l,score:c=!0,scoreTimeoutMs:d=Jy,memoryWrite:u=!0,digest:m=!0,_createFarm:f=TW,_runSubagentDAG:g=Rg,_getCommitCount:h=Ppe,_getSourceRepoDirtyFiles:y=Mpe,_scoreBranch:b=CW,_writeScore:w=_W,_writeFarmFact:S=MW,_sendFarmDigest:T=$W,_setFarmMemoryFactId:k=EW,_createTraceWriter:A=Po}=e,F=new Date().toISOString();(!Number.isInteger(n)||n<1||n>16)&&(console.error(p.error(`--branches must be between 1 and 16 (got ${n})`)),process.exit(1)),r!==void 0&&r.length!==n&&(console.error(p.error(`--labels count (${r.length}) must equal --branches (${n})`)),process.exit(1));let R;try{R=await f({taskName:t,count:n,labels:r,cwd:s,baseRef:i,taskSlug:l})}catch(U){console.error(p.error(`Farm creation failed: ${U instanceof Error?U.message:String(U)}`)),process.exit(1)}let D=R.baseRef,_=o??Ze(),O=Ua().prompt??"",B=R.branches.map(U=>({id:`branch-${U.index}`,agentType:`branch-${U.index}${U.label?` (${U.label})`:""}`,systemPrompt:O,promptBuilder:K=>(console.log(`[branch-${U.index}] started`),[`Task: ${t}`,"",`You are working in a dedicated git worktree. Your working directory has been set to: ${U.path}`,`Your branch is: ${U.branch}`,"","Complete the task. All file operations are restricted to this worktree by the runtime."].join(`
1922
- `)),model:_,idPrefix:`farm-${R.taskSlug}-branch-${U.index}`,cwd:U.path,readRoots:[U.path],writeRoots:[U.path]})),j=A(),$=new AbortController,H=new le({parentAbortSignal:$.signal,...j!==null?{traceWriter:j.writer}:{},surface:"cli"}),C={sessionId:`farm-${R.taskSlug}`,abortSignal:$.signal,surface:"cli"},L;try{L=await g({manager:H,parentSession:C,nodes:B,edges:[],failFast:a})}catch(U){throw console.error(p.error(`Farm dispatch failed: ${U instanceof Error?U.message:String(U)}`)),U}finally{$.abort()}let P=[];for(let U of R.branches){let K=L.failed.find(se=>se.id===`branch-${U.index}`),Q=L.skipped.includes(`branch-${U.index}`);if(K||Q){let se=K?K.error.message:"skipped";console.log(`[branch-${U.index}] \u2717 failed: ${se}`),P.push({index:U.index,ok:!1,commitCount:0,error:se});continue}let ee=await h(U.path,D);if(ee===0){let se="no commits made";console.log(`[branch-${U.index}] \u2717 failed: ${se}`),P.push({index:U.index,ok:!1,commitCount:0,error:se})}else console.log(`[branch-${U.index}] \u2713 done`),P.push({index:U.index,ok:!0,commitCount:ee})}let M=await y(s);if(c)for(let U of P){if(!U.ok){U.score=null;continue}let K=R.branches.find(ee=>ee.index===U.index);console.log(`[branch-${U.index}] scoring\u2026`);let Q=await b({branchPath:K.path,baseSha:D,timeoutMs:d});U.score=Q;try{await w(R.farmDir,U.index,Q)}catch(ee){console.error(p.warning(`[branch-${U.index}] score.json write failed: ${ee instanceof Error?ee.message:String(ee)}`))}}if(Dpe(t,R.taskSlug,R.branches,P),u||m){let U=Fpe(R,P,F);if(u){let K=S(U);if("skipped"in K)console.error(p.warning(`[memory] write skipped: ${K.reason}`));else{let{factId:Q}=K;try{await k(R.taskSlug,Q)}catch(ee){console.error(p.warning(`[memory] setFarmMemoryFactId failed: ${ee.message}`))}}}if(m){let K=await T(U);K.sent?console.log(p.dim(`[telegram] digest sent (${K.chatCount} chat${K.chatCount===1?"":"s"})`)):K.reason&&K.reason!=="telegram unconfigured"&&console.error(p.warning(`[telegram] digest failed: ${K.reason}`))}}if(M.length>0){let U=new vx(M);console.error(p.error(`
1922
+ `)),model:_,idPrefix:`farm-${R.taskSlug}-branch-${U.index}`,cwd:U.path,readRoots:[U.path],writeRoots:[U.path]})),j=A(),$=new AbortController,H=new le({parentAbortSignal:$.signal,...j!==null?{traceWriter:j.writer}:{},surface:"cli"}),C={sessionId:`farm-${R.taskSlug}`,abortSignal:$.signal,surface:"cli"},L;try{L=await g({manager:H,parentSession:C,nodes:B,edges:[],failFast:a})}catch(U){throw console.error(p.error(`Farm dispatch failed: ${U instanceof Error?U.message:String(U)}`)),U}finally{$.abort()}let P=[];for(let U of R.branches){let K=L.failed.find(se=>se.id===`branch-${U.index}`),Z=L.skipped.includes(`branch-${U.index}`);if(K||Z){let se=K?K.error.message:"skipped";console.log(`[branch-${U.index}] \u2717 failed: ${se}`),P.push({index:U.index,ok:!1,commitCount:0,error:se});continue}let te=await h(U.path,D);if(te===0){let se="no commits made";console.log(`[branch-${U.index}] \u2717 failed: ${se}`),P.push({index:U.index,ok:!1,commitCount:0,error:se})}else console.log(`[branch-${U.index}] \u2713 done`),P.push({index:U.index,ok:!0,commitCount:te})}let M=await y(s);if(c)for(let U of P){if(!U.ok){U.score=null;continue}let K=R.branches.find(te=>te.index===U.index);console.log(`[branch-${U.index}] scoring\u2026`);let Z=await b({branchPath:K.path,baseSha:D,timeoutMs:d});U.score=Z;try{await w(R.farmDir,U.index,Z)}catch(te){console.error(p.warning(`[branch-${U.index}] score.json write failed: ${te instanceof Error?te.message:String(te)}`))}}if(Dpe(t,R.taskSlug,R.branches,P),u||m){let U=Fpe(R,P,F);if(u){let K=S(U);if("skipped"in K)console.error(p.warning(`[memory] write skipped: ${K.reason}`));else{let{factId:Z}=K;try{await k(R.taskSlug,Z)}catch(te){console.error(p.warning(`[memory] setFarmMemoryFactId failed: ${te.message}`))}}}if(m){let K=await T(U);K.sent?console.log(p.dim(`[telegram] digest sent (${K.chatCount} chat${K.chatCount===1?"":"s"})`)):K.reason&&K.reason!=="telegram unconfigured"&&console.error(p.warning(`[telegram] digest failed: ${K.reason}`))}}if(M.length>0){let U=new vx(M);console.error(p.error(`
1923
1923
  \u26A0 ISOLATION VIOLATION`)),console.error(p.error(U.message)),process.exit(1)}let I=P.every(U=>U.ok);process.exit(I?0:1)}function FW(e){e.command("farm").description("Run a task across N speculative git worktree branches in parallel").argument("<task>","Task description to run on each branch").option("-n, --branches <number>","Number of branches to spawn (1-16)","3").option("--labels <labels>","Comma-separated branch labels (count must equal --branches)").option("-m, --model <model>","Model to use",Ze()).option("--base-ref <ref>","Base git ref (default: HEAD)").option("--cwd <path>","Source repo root (default: process.cwd())").option("--fail-fast","Abort remaining branches on first failure",!1).option("--task-slug <slug>","Deterministic task slug override (for tests)").option("--no-score","Skip the post-run scorer (tests + lint + LoC)").option("--score-timeout <ms>",`Per-branch test timeout in ms (default ${Jy})`).option("--no-memory","Skip writing the farm-run fact to cross-session memory").option("--no-digest","Skip pushing the Telegram digest on completion").action(async(t,n)=>{let r=parseInt(n.branches,10),o=n.labels?n.labels.split(",").map(s=>s.trim()).filter(Boolean):void 0,i=n.scoreTimeout?parseInt(n.scoreTimeout,10):void 0;i!==void 0&&(!Number.isFinite(i)||i<1)&&(console.error(p.error(`--score-timeout must be a positive integer (got "${n.scoreTimeout}")`)),process.exit(1));try{await Lpe({task:t,branches:r,labels:o,model:n.model,baseRef:n.baseRef,cwd:n.cwd,failFast:n.failFast,taskSlug:n.taskSlug,score:n.score,memoryWrite:n.memory,digest:n.digest,...i!==void 0?{scoreTimeoutMs:i}:{}})}catch(s){console.error(s),process.exitCode=1}})}G();import{execFile as Npe}from"node:child_process";ea();jt();import{promisify as Bpe}from"node:util";var kx=Bpe(Npe);async function LW(){try{return(await kx("git",["rev-parse","--show-toplevel"])).stdout.trim()}catch{throw new Error("Not in a git repository.")}}function Upe(e){return["empty","orphaned-dir","orphaned-registration","dead-owner"].includes(e)?p.error("yes"):e==="stale-dirty"||e==="stale-clean"?p.warning("warn"):p.success("no")}var NW=["interactive","diagnose","all"];function jpe(e){if(NW.includes(e))return e;throw new Error(`Invalid --scope value: '${e}'. Allowed: ${NW.join(" | ")}.`)}function Hpe(e){if(e<=0)return"-";let t=e/864e5;return t<1?`${Math.max(1,Math.round(e/36e5))}h`:`${Math.round(t)}d`}function BW(e){let t=e.command("worktree").description("Manage git worktrees created by afk");t.command("list").description("List all afk-managed worktrees and show prune candidates (dry-run only)").action(async()=>{let n;try{n=await LW()}catch(i){Y(i)}let r;try{r=await cn({execFile:kx,repoRoot:n,dryRun:!0})}catch(i){Y(new Error(`Sweep failed: ${i.message}`))}let o=["PATH".padEnd(45),"OWNER".padEnd(12),"AGE".padEnd(6),"STATUS".padEnd(22),"PRUNE?"].join(" | ");console.log(p.heading(o)),console.log("-".repeat(o.length));for(let i of r.candidates){let s=[i.path.slice(-44).padEnd(45),i.owner.padEnd(12),Hpe(i.ageMs).padEnd(6),i.verdict.padEnd(22),Upe(i.verdict)].join(" | ");console.log(s)}if(r.candidates.length===0&&console.log(p.dim(" (no afk-managed worktrees found)")),r.warnings.length>0){console.log("");for(let i of r.warnings)console.log(p.warning(i))}}),t.command("prune").description("Remove stale, empty, and orphaned worktrees").option("--apply","Execute removals (default is dry-run)",!1).option("--max-age-days-clean <n>","Max age (days) for clean worktrees before removal").option("--max-age-days-dirty <n>","Max age (days) for dirty worktrees before warning").option("--scope <scope>","Scope: interactive | diagnose | all","all").action(async n=>{let r;try{r=await LW()}catch(w){Y(w)}let i=xt().daemon?.worktreePrune,s=parseInt(v.AFK_WORKTREE_MAX_AGE_CLEAN??"",10),a=parseInt(v.AFK_WORKTREE_MAX_AGE_DIRTY??"",10),l=n.maxAgeDaysClean!==void 0?parseInt(n.maxAgeDaysClean,10):i?.maxAgeDaysClean??(Number.isNaN(s)?14:s),c=n.maxAgeDaysDirty!==void 0?parseInt(n.maxAgeDaysDirty,10):i?.maxAgeDaysDirty??(Number.isNaN(a)?30:a),d;try{d=jpe(n.scope)}catch(w){Y(w)}let u={execFile:kx,repoRoot:r,dryRun:!n.apply,maxAgeDaysClean:l,maxAgeDaysDirty:c,scope:d},m;try{m=await cn(u)}catch(w){Y(new Error(`Sweep failed: ${w.message}`))}m.dryRun&&console.log(p.warning("\u{1F50D} Dry-run mode \u2014 no changes made."));let f={};for(let w of m.candidates)f[w.verdict]=(f[w.verdict]??0)+1;let g=m.warnings.filter(w=>w.startsWith("[WARN]")).length,h=m.warnings.filter(w=>w.startsWith("[ERROR]")).length,y=Object.entries(f).sort(([w],[S])=>w.localeCompare(S)).map(([w,S])=>`${w}=${S}`);console.log(`Removed: ${m.removed.length}, Warned: ${g}, Errors: ${h}`+(y.length>0?` [${y.join(" ")}]`:""));for(let w of m.candidates){let T=m.removed.includes(w.path)?p.error("\u2717"):p.success("\u2713");console.log(` ${T} [${w.verdict.padEnd(22)}] ${w.path}`)}if(m.warnings.length>0){console.log("");for(let w of m.warnings)w.startsWith("[ERROR]")?console.error(p.error(w)):console.log(p.warning(w))}m.warnings.some(w=>w.startsWith("[ERROR]"))&&process.exit(1)})}import{spawn as Wpe}from"child_process";var Kpe=/^\d+\.\d+\.\d+(-[\da-z.]+)?$/i;function Gpe(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let i=0;i<o;i++){let s=n[i]??0,a=r[i]??0;if(a>s)return!0;if(a<s)return!1}return!1}function UW(e){e.command("update").alias("upgrade").description("Update agent-afk to the latest published version").option("--check","Only check whether an update is available; do not install").option("--pin <version>","Install a specific version instead of latest (must be valid semver)").action(async t=>{let n=gr();if(t.check===!0){process.stderr.write(`Checking for updates\u2026
1924
1924
  `);let s=await Ny();if(s===void 0){console.log(p.warning("Could not reach the npm registry to check for updates.")),console.log(p.dim(` Current: ${n}`)),process.exitCode=1;return}if(Ly(s),Gpe(n,s)){console.log(`${p.bold("Update available:")} ${p.dim(n)} \u2192 ${p.bold(s)}`),console.log(p.dim(" Run `afk update` to install."));return}console.log(`agent-afk ${p.bold(n)} is up to date.`);return}if(t.pin!==void 0&&!Kpe.test(t.pin)){console.error(p.warning(`Invalid version: ${JSON.stringify(t.pin)}. Must be valid semver (e.g. 1.2.3 or 1.2.3-beta.1).`)),process.exitCode=1;return}let r=t.pin;if(r===void 0){if(process.stderr.write(`Fetching latest version\u2026
1925
1925
  `),r=await Ny(),r===void 0){console.error(p.warning("Could not reach the npm registry. Aborting.")),process.exitCode=1;return}if(Ly(r),r===n){console.log(`agent-afk ${p.bold(n)} is up to date.`);return}}console.log(`Updating agent-afk: ${p.dim(n)} \u2192 ${p.bold(r)}`),console.log(p.dim(` npm install -g agent-afk@${r}`));let{code:o,signal:i}=await qpe(r);o===0?(ex(r),console.log(p.success(`\u2713 agent-afk@${r} installed.`))):i!==null?(console.error(p.warning(`npm install was killed by signal ${i}.`)),process.exitCode=1):(console.error(p.warning(`npm install exited with code ${o??1}.`)),process.exitCode=o??1)})}function qpe(e){return new Promise(t=>{let n=Wpe("npm",["install","-g",`agent-afk@${e}`],{stdio:"inherit"});n.on("error",()=>t({code:1,signal:null})),n.on("exit",(r,o)=>t({code:r,signal:o}))})}import{existsSync as zpe,readFileSync as Jpe}from"node:fs";Em();q();NS();function jW(e){let t=e.command("schedule").description("Manage scheduled daemon tasks");t.command("add").description("Add a new scheduled task").requiredOption("--name <name>","Human-readable label").requiredOption("--command <cmd>","Command to run").requiredOption("--cron <expr>","Cron expression (5-field)").option("--trigger <mode>","cron | sessionstart | both","cron").option("--notify <when>","failure | always | never","failure").option("--disabled","Add in disabled state",!1).action(async n=>{try{let r=km({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger,notifyOn:n.notify,enabled:!n.disabled});(r.enabled?await xn("POST","/tasks",{taskId:r.id,command:r.command,cron:r.cron,trigger:r.trigger,notifyOn:r.notifyOn}):await xn("DELETE",`/tasks/${r.id}`)).synced||console.error(`\u26A0\uFE0F ${go}`),console.log(`\u2705 Added: ${r.id} \u2014 ${r.name}`)}catch(r){Y(r)}}),t.command("list").description("List all scheduled tasks").action(()=>{try{let n=ln();if(n.length===0){console.log("No scheduled tasks.");return}let r="ID | NAME | CRON | ENABLED",o="-".repeat(r.length);console.log(r),console.log(o);for(let i of n)console.log([i.id.padEnd(20),i.name.padEnd(30),i.cron.padEnd(15),String(i.enabled)].join(" | "))}catch(n){Y(n)}}),t.command("remove <id>").description("Permanently remove a scheduled task").action(async n=>{try{Tm(n)||(console.error(`Task not found: ${n}`),process.exit(1)),(await xn("DELETE",`/tasks/${n}`)).synced||console.error(`\u26A0\uFE0F ${go}`),console.log(`\u2705 Removed: ${n}`)}catch(r){Y(r)}}),t.command("enable <id>").description("Enable a scheduled task").action(async n=>{try{let r=Dc(n);r||(console.error(`Task not found: ${n}`),process.exit(1));let o=ln();Si(o.map(s=>s.id===n?{...s,enabled:!0,updatedAt:new Date().toISOString()}:s)),(await xn("POST","/tasks",{taskId:r.id,command:r.command,cron:r.cron,trigger:r.trigger,notifyOn:r.notifyOn})).synced||console.error(`\u26A0\uFE0F ${go}`),console.log(`\u2705 Enabled: ${n}`)}catch(r){Y(r)}}),t.command("disable <id>").description("Disable a scheduled task").action(async n=>{try{Dc(n)||(console.error(`Task not found: ${n}`),process.exit(1));let o=ln();Si(o.map(s=>s.id===n?{...s,enabled:!1,updatedAt:new Date().toISOString()}:s)),(await xn("DELETE",`/tasks/${n}`)).synced||console.error(`\u26A0\uFE0F ${go}`),console.log(`\u2705 Disabled: ${n}`)}catch(r){Y(r)}}),t.command("logs <id>").description("Show recent execution history for a task").option("-n, --limit <n>","Number of records to show","10").action((n,r)=>{try{let o=Math.min(Math.max(1,parseInt(r.limit,10)||10),50),i=Bn();if(!zpe(i)){console.log(`No telemetry found for task: ${n}`);return}let s=Jpe(i),c=(s.length>1048576?s.subarray(s.length-1048576):s).toString("utf-8").split(`
@@ -1958,7 +1958,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
1958
1958
  `)){let r=n.indexOf("=");if(r<0)continue;let o=n.slice(0,r).trim(),i=n.slice(r+1).trim();switch(o){case"MainPID":{let s=Number.parseInt(i,10);Number.isFinite(s)&&s>0&&(t.pid=s);break}case"ExecMainStatus":{let s=Number.parseInt(i,10);Number.isFinite(s)&&(t.lastExitStatus=s);break}case"ActiveState":i&&(t.activeState=i);break;case"LoadState":i&&(t.loadState=i);break;default:break}}return t}function yK(e){let t=Fn(e),n={name:e,label:Au(e),installed:jme(t),configPath:t,logFile:Dl(e)};if(!n.installed)return n;try{let r=Ume("systemctl",["--user","show",Lt(e),"--property=MainPID,ExecMainStatus,ActiveState,LoadState"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:Fl}),o=Hme(r);o.pid!==void 0&&(n.pid=o.pid),o.lastExitStatus!==void 0&&(n.lastExitStatus=o.lastExitStatus)}catch{}return n}var wK={backend:"systemd",configKind:"systemd user unit",install(e,t={}){return fK(e,t)},uninstall(e){return gK(e)},status(e){return yK(e)},restart(e){if(!bK(Fn(e)))return{kind:"not-installed",configPath:Fn(e)};try{return Wme("systemctl",["--user","restart",Lt(e)],{stdio:["ignore","pipe","pipe"],timeout:Fl}),{kind:"restarted",label:Au(e)}}catch(t){let n=t.stderr;return{kind:"failed",reason:n&&n.toString().trim()||t.message}}},isInstalled(e){return bK(Fn(e))},configPath(e){return Fn(e)},logPath(e){return Dl(e)},label(e){return Au(e)},readConfigFile(e){return hK(e)}};var Bl=["telegram","daemon"];function SK(e=process.platform){switch(e){case"darwin":return aK;case"linux":return wK;default:return null}}var vK="macOS (launchd) and Linux (systemd --user)";function Cu(){let e=SK();if(!e)throw new Error(`'afk service' is not supported on ${process.platform}. Supported: ${vK}.`);return e}function ib(e){let t=e.toLowerCase();if(Bl.includes(t))return t;throw new Error(`Unknown service '${e}'. Supported: ${Bl.join(", ")}.`)}function TK(e){let t=e.command("service").description("Manage AFK background services (launchd on macOS, systemd --user on Linux) \u2014 always-on, auto-restart");t.command("install <name>").description(`Install <${Bl.join("|")}> as an OS service that starts on login and relaunches on crash`).option("--no-watch","Disable auto-restart-on-rebuild (launchd WatchPaths / systemd .path unit)").option("--dry-run","Write the config file but do not register with the supervisor",!1).action((n,r)=>{try{let o=Cu(),i=ib(n),s=o.install(i,{noWatch:r.watch===!1,dryRun:!!r.dryRun});s.kind==="already-installed"&&(console.log(p.warning(`\u26A0 ${s.label} already installed at ${s.configPath}`)),console.log(p.meta(` Run 'afk service uninstall ${i}' first to reinstall.`)),process.exit(1)),s.kind==="failed"&&(console.error(p.error(`\u2717 Install failed: ${s.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Installed ${s.label}`)),console.log(p.meta(` Config: ${s.configPath} (${o.configKind})`)),console.log(p.meta(` Log: ${o.logPath(i)}`)),s.autoRestartOnRebuild?console.log(p.meta(" Auto-restart on rebuild: on")):console.log(p.meta(` Auto-restart on rebuild: off \u2014 run 'afk service restart ${i}' after updates.`));for(let a of s.notes??[])console.log(p.info(` ${a}`));r.dryRun||console.log(p.meta(` Status: afk service status ${i}`))}catch(o){Y(o)}}),t.command("uninstall <name>").description("Stop the service and remove its config (LaunchAgent plist / systemd unit)").action(n=>{try{let r=Cu(),o=ib(n),i=r.uninstall(o);if(i.kind==="not-installed"){console.log(p.warning(`\u26A0 ${r.label(o)} is not installed (no config at ${i.configPath})`));return}i.kind==="failed"&&(console.error(p.error(`\u2717 Uninstall failed: ${i.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Uninstalled ${r.label(o)}`)),console.log(p.meta(` Removed: ${i.configPath}`))}catch(r){Y(r)}}),t.command("status [name]").description("Show running PID, last exit status, and log file for one or all services").action(n=>{try{let r=Cu();if(n){kK(r.status(ib(n)),r.configKind);return}for(let o of Bl)kK(r.status(o),r.configKind),console.log("")}catch(r){Y(r)}}),t.command("list").description("List recognised service names and whether each is installed").action(()=>{try{let n=Cu();console.log(p.heading(`AFK services (${n.backend}):`));for(let r of Bl){let o=n.isInstalled(r),i=o?p.success("\u25CF"):p.dim("\u25CB"),s=o?p.meta("installed"):p.meta("not installed");console.log(` ${i} ${r.padEnd(10)} ${s} ${p.meta(n.configPath(r))}`)}}catch(n){Y(n)}}),t.command("restart <name>").description("Restart the service (launchctl kickstart -k / systemctl --user restart)").action(n=>{try{let r=Cu(),o=ib(n),i=r.restart(o);i.kind==="not-installed"&&(console.error(p.error(`\u2717 ${r.label(o)} is not installed. Run 'afk service install ${o}' first.`)),process.exit(1)),i.kind==="failed"&&(console.error(p.error(`\u2717 Restart failed: ${i.reason}`)),process.exit(1)),console.log(p.success(`\u2713 Restarted ${i.label}`))}catch(r){Y(r)}})}function kK(e,t){if(console.log(p.heading(`${e.label}`)),!e.installed){console.log(` ${p.dim("\u25CB")} Not installed`),console.log(p.meta(` Config: ${e.configPath} (${t})`)),console.log(p.meta(` Install: afk service install ${e.name}`));return}e.pid!==void 0?console.log(` ${p.success("\u25CF")} Running (PID ${e.pid})`):(console.log(` ${p.warning("\u25CF")} Installed but not running`),e.lastExitStatus!==void 0&&e.lastExitStatus!==0&&console.log(p.meta(` Last exit status: ${e.lastExitStatus}`))),console.log(p.meta(` Config: ${e.configPath} (${t})`)),console.log(p.meta(` Log: ${e.logFile}`))}import{execFileSync as Kme}from"child_process";import{chmodSync as Gme,existsSync as _u,mkdirSync as RK,readdirSync as qme,readFileSync as zme,renameSync as AK,writeFileSync as CK}from"fs";import{basename as Jme,dirname as Mx,join as Ox}from"path";import{randomBytes as _K}from"crypto";import{createInterface as Yme}from"node:readline";q();function Vme(e){let t=Yme({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,()=>{t.close(),n()})})}var Jo="chrome-devtools",Px=["stable","beta","canary","dev"];function Xme(e="stable"){let t=["chrome-devtools-mcp@latest","--autoConnect"];return e!=="stable"&&t.push("--channel",e),{command:"npx",args:t}}function EK(e){if(!_u(e))return{mcpServers:{}};let t;try{t=zme(e,"utf-8")}catch(o){throw new Error(`Failed to read MCP config at ${e}: ${o.message}`)}let n;try{n=JSON.parse(t)}catch{throw new Error(`MCP config at ${e} is not valid JSON. Fix or remove it, then retry.`)}if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`MCP config at ${e} must be a JSON object.`);let r=n;if(Array.isArray(r.mcpServers))throw new Error(`MCP config at ${e} has an invalid "mcpServers" (must be a JSON object, not an array).`);return(r.mcpServers===void 0||typeof r.mcpServers!="object"||r.mcpServers===null)&&(r.mcpServers={}),r}function xK(e,t){RK(Mx(e),{recursive:!0});let n=Ox(Mx(e),`.mcp.json.${process.pid}.${_K(4).toString("hex")}.tmp`);CK(n,`${JSON.stringify(t,null,2)}
1959
1959
  `,"utf-8"),AK(n,e)}function Qme(){let e=process.platform==="darwin"?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"]:["google-chrome","google-chrome-stable","chromium","chromium-browser"];for(let t of e)try{let r=Kme(t,["--version"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:5e3}).match(/(\d+)\.\d+\.\d+/);if(r!==null&&r[1]!==void 0)return parseInt(r[1],10)}catch{}return null}function Zme(){let e=Qme();console.log(""),console.log(p.heading("Drive your real Chrome \u2014 one-time setup:")),e===null?console.log(p.meta(" \u2022 Chrome not detected. autoConnect requires Chrome \u2265 144.")):e<144?console.log(p.warning(` \u2022 Detected Chrome ${e} \u2014 autoConnect requires \u2265 144. Please update Chrome.`)):console.log(p.meta(` \u2022 Detected Chrome ${e} \u2713 (autoConnect needs \u2265 144)`)),console.log(p.meta(" 1. In Chrome, open chrome://inspect/#remote-debugging and enable it (one time).")),console.log(p.meta(' 2. The first time the agent drives Chrome, click "Allow" on the prompt.')),console.log(p.meta(' 3. Chrome shows a "being controlled by automated test software" banner while active.')),console.log(""),console.log(p.meta("The agent gains mcp__chrome-devtools__* tools (navigate, click, fill, take_snapshot, \u2026)")),console.log(p.meta("driving your REAL, logged-in profile. Run `/mcp` in the REPL to confirm it connected.")),console.log(p.meta("Undo anytime with `afk browser disconnect`."))}function IK(e){let t=e.command("browser").description("Give the agent web hands: connect your real Chrome, or save a login it reuses");t.command("connect").description("Wire chrome-devtools-mcp (--autoConnect) so the agent can drive your real, logged-in Chrome").option("--channel <channel>",`Chrome channel autoConnect targets (${Px.join("|")})`,"stable").action(n=>{try{let r=(n.channel??"stable").toLowerCase();if(!Px.includes(r))throw new Error(`--channel must be one of ${Px.join(", ")} (got "${n.channel}")`);let o=Li(),i=EK(o);i.mcpServers===void 0&&(i.mcpServers={});let s=Xme(r),a=i.mcpServers[Jo];if(a!==void 0&&JSON.stringify(a)===JSON.stringify(s))console.log(p.success(`\u2713 "${Jo}" already configured`)),console.log(p.meta(` Config: ${o}`));else{i.mcpServers[Jo]=s,xK(o,i);let l=a===void 0?"Added":"Updated";console.log(p.success(`\u2713 ${l} "${Jo}" MCP server`)),console.log(p.meta(` Config: ${o}`)),console.log(p.meta(` Runs: npx ${s.args?.join(" ")??""}`))}Zme()}catch(r){Y(r)}}),t.command("disconnect").description("Remove the chrome-devtools server from your MCP config").action(()=>{try{let n=Li();if(!_u(n)){console.log(p.warning(`\u26A0 No MCP config at ${n} \u2014 nothing to remove.`));return}let r=EK(n);if(r.mcpServers===void 0||r.mcpServers[Jo]===void 0){console.log(p.warning(`\u26A0 "${Jo}" is not configured \u2014 nothing to remove.`));return}delete r.mcpServers[Jo],xK(n,r),console.log(p.success(`\u2713 Removed "${Jo}" from ${n}`))}catch(n){Y(n)}}),t.command("login <url>").description("Open a headed browser, log in manually, and save the session to a vault profile the agent's native browser tools reuse").option("--profile <name>","Vault profile name to save the session under","default").action(async(n,r)=>{try{let o=(r.profile??"default").trim();tc(o);let i;try{i=new URL(n)}catch{throw new Error(`Invalid URL: ${n}`)}if(i.protocol!=="http:"&&i.protocol!=="https:")throw new Error(`login URL must be http(s), got: ${i.protocol}`);let s=nc(o),{chromium:a}=await import("playwright");console.log(p.meta(`Launching a browser for profile "${o}"\u2026`));let l=await a.launch({headless:!1}),c=await l.newContext(_u(s)?{storageState:s}:{});await(await c.newPage()).goto(n,{waitUntil:"load"}).catch(()=>{}),console.log(""),console.log(p.heading("Log in to the site in the opened browser window.")),console.log(p.meta("When fully logged in, return here and press Enter to save the session.")),console.log(p.meta("(Do NOT close the browser window yourself \u2014 this command closes it for you.)")),await Vme("Press Enter to save the session\u2026 ");let u=await c.storageState();RK(Wb(o),{recursive:!0});let m=Ox(Mx(s),`.${Jme(s)}.${process.pid}.${_K(4).toString("hex")}.tmp`);CK(m,JSON.stringify(u),{mode:384}),Gme(m,384),AK(m,s),await l.close().catch(()=>{}),console.log(p.success(`\u2713 Saved session for profile "${o}"`)),console.log(p.meta(` Vault: ${s} (0600 \u2014 treat as a credential)`)),console.log(p.meta(" Point the agent at it:")),console.log(p.meta(` export AFK_BROWSER_DEFAULT_PROFILE=${o}`))}catch(o){Y(o)}}),t.command("profiles").description("List saved browser session-vault profiles").action(()=>{try{let n=Hb(),r=_u(n)?qme(n,{withFileTypes:!0}).filter(o=>o.isDirectory()):[];if(r.length===0){console.log(p.meta("No saved profiles. Create one with `afk browser login <url> --profile <name>`."));return}console.log(p.heading("Saved browser profiles:"));for(let o of r){let i=_u(Ox(n,o.name,"storageState.json")),s=i?p.success("\u25CF"):p.meta("\u25CB"),a=i?"":p.meta(" (no saved session)");console.log(` ${s} ${o.name}${a}`)}console.log(""),console.log(p.meta("Use one: export AFK_BROWSER_DEFAULT_PROFILE=<name>"))}catch(n){Y(n)}})}import{readFileSync as efe,readdirSync as tfe,statSync as nfe}from"fs";import{join as Lx}from"path";q();import{join as tt}from"path";function sb(){return tt(_t(),"improve")}function Yo(){return tt(sb(),"failure-cards")}function PK(){return tt(Yo(),".index.jsonl")}function Iu(e){return tt(Yo(),`${e}.json`)}function ab(e){return tt(Yo(),`${e}.md`)}function MK(){return tt(Se(),"witness")}function ls(){return tt(sb(),"proposals")}function OK(){return tt(ls(),".index.jsonl")}function $x(e){return tt(ls(),`${e}.json`)}function $K(e){return tt(ls(),`${e}.md`)}function Vo(){return tt(sb(),"eval-cases")}function DK(){return tt(Vo(),".index.jsonl")}function Dx(e){return tt(Vo(),`${e}.json`)}function Fx(e){return tt(Vo(),`${e}.fixture.jsonl`)}function FK(e){return tt(Vo(),`${e}.md`)}function Ul(){return tt(sb(),"eval-runs")}function LK(){return tt(Ul(),".index.jsonl")}function NK(e){return tt(Ul(),`${e}.json`)}function BK(e){return tt(Ul(),`${e}.md`)}G();function UK(e){let t=e.trim(),n=/^(\d+)\s*([smhd])$/i.exec(t);if(!n)return;let r=Number.parseInt(n[1]??"0",10),o=(n[2]??"").toLowerCase();if(!(!Number.isFinite(r)||r<=0))switch(o){case"s":return r*1e3;case"m":return r*60*1e3;case"h":return r*60*60*1e3;case"d":return r*24*60*60*1e3;default:return}}function jK(e={}){let t=e.witnessRoot??MK(),n=e.afkHome??v.AFK_HOME??rfe(),r=e.sinceMs,o={sessionsScanned:0,sessionsSkippedOld:0,sessionsSkippedEmpty:0,invalidLineCount:0,sessions:[]},i;try{i=tfe(t)}catch{return o}for(let s of i){if(s.startsWith("."))continue;let a=Lx(t,s),l;try{l=nfe(a)}catch{continue}if(!l.isDirectory())continue;if(r!==void 0&&l.mtimeMs<r){o.sessionsSkippedOld+=1;continue}let c=Lx(a,"trace.jsonl"),d;try{d=efe(c,"utf-8")}catch{o.sessionsSkippedEmpty+=1;continue}let u=ofe(c,n),m=jl({sessionId:s,tracePath:c,relativeTracePath:u,content:d,sessionMtimeMs:l.mtimeMs});o.sessions.push(m),o.sessionsScanned+=1,o.invalidLineCount+=m.invalidLineCount}return o}function jl(e){let{sessionId:t,tracePath:n,relativeTracePath:r,content:o,sessionMtimeMs:i}=e,s=[],a=0,l=o.split(`
1960
1960
  `);for(let c=0;c<l.length;c+=1){let d=l[c]??"";if(d.trim()==="")continue;let u;try{u=JSON.parse(d)}catch{a+=1;continue}let m=Fg.safeParse(u);if(!m.success){a+=1;continue}s.push({sessionId:t,tracePath:n,relativeTracePath:r,lineNumber:c+1,rawLine:d,event:m.data})}return{sessionId:t,tracePath:n,relativeTracePath:r,sessionMtimeMs:i,events:s,invalidLineCount:a}}function rfe(){let e=v.AFK_HOME;return e&&e.length>0?e:Lx(v.HOME??"",".afk")}function ofe(e,t){if(!t)return e;if(e.startsWith(t)){let n=e.slice(t.length);return n.startsWith("/")&&(n=n.slice(1)),n}return e}import{createHash as ife}from"crypto";var Jr=4,sfe=8,afe="v1-bytes-tuple";function lb(e,t={}){let n=t.minRepeats??Jr;if(n<2)throw new Error(`minRepeats must be >= 2 (got ${n})`);let r=[];for(let o of e){let i=lfe(o,n);r.push(...i)}return r}function lfe(e,t){let n=cfe(e.events),r=dfe(n),o=[];for(let[i,s]of r.entries()){let a=ufe(s,t);for(let l of a)o.push(mfe(e,l,i))}return o}function cfe(e){let t=new Map,n=[];for(let r of e){let o=r.event;if(o.kind!=="tool_call")continue;if(o.payload.phase==="started"){t.set(o.payload.toolUseId,{seq:o.seq,name:o.payload.name,inputBytes:o.payload.inputBytes,subagentId:o.payload.subagentId});continue}let i=t.get(o.payload.toolUseId);if(!i)continue;t.delete(o.payload.toolUseId);let s=pfe({name:o.payload.name,inputBytes:i.inputBytes,resultBytes:o.payload.resultBytes,isError:o.payload.isError,subagentId:i.subagentId});n.push({toolUseId:o.payload.toolUseId,startedSeq:i.seq,completedSeq:o.seq,completedLineNumber:r.lineNumber,name:o.payload.name,inputBytes:i.inputBytes,resultBytes:o.payload.resultBytes,isError:o.payload.isError,subagentId:i.subagentId,rawLine:r.rawLine,fingerprint:s})}return n}function dfe(e){let t=new Map;for(let n of e){let r=n.subagentId??"root",o=t.get(r);o?o.push(n):t.set(r,[n])}return t}function ufe(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r];if(!o){r+=1;continue}let i=r+1;for(;i<e.length;){let a=e[i];if(!a||a.fingerprint!==o.fingerprint)break;i+=1}i-r>=t&&n.push(e.slice(r,i)),r=i>r?i:r+1}return n}function pfe(e){let t=[e.name,String(e.inputBytes),String(e.resultBytes),e.isError?"1":"0",e.subagentId??""].join("|");return ife("sha256").update(t).digest("hex")}function mfe(e,t,n){let r=t[0];if(!r)throw new Error("repeated-tool-use: empty run");let o=bfe(r.name,r.fingerprint),i=new Date().toISOString(),s=t.slice(0,sfe),a=[{sessionId:e.sessionId,tracePath:e.relativeTracePath,eventIndices:s.map(l=>l.completedSeq),excerpt:ffe(s),annotation:gfe(t,n)}];return{slug:o,title:hfe(r.name,t.length),pattern:"repeated-tool-use",severity:yfe(t.length),observedAt:i,evidence:a,detail:{detector:"repeated-tool-use@v1",fingerprintAlgorithm:afe,fingerprint:r.fingerprint,toolName:r.name,runLength:t.length,agentContext:n,inputBytes:r.inputBytes,resultBytes:r.resultBytes,isError:r.isError,toolUseIds:t.map(l=>l.toolUseId),completedSeqs:t.map(l=>l.completedSeq)}}}function ffe(e){let t=e.map(n=>n.rawLine).join(`
1961
- `);return t.length<=2e3?t:t.slice(0,1997)+"..."}function gfe(e,t){let n=e[0],r=e[e.length-1];return!n||!r?"":[`${e.length}\xD7 consecutive '${n.name}' calls in ${t} context`,`(seq ${n.completedSeq}\u2026${r.completedSeq},`,`inputBytes=${n.inputBytes}, resultBytes=${n.resultBytes},`,`isError=${n.isError})`].join(" ")}function hfe(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function yfe(e){return e>=10?"high":e>=4?"medium":"low"}function bfe(e,t){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),r=t.slice(0,12);return`repeated-tool-${n.length>0?n:"tool"}-${r}`}var wfe=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function cb(e,t={}){let n=t.minOccurrences??1;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="closure")continue;let l=a.payload.reason;if(!wfe.has(l))continue;let c={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,finalCostUsd:a.payload.finalCostUsd,finalTurnCount:a.payload.finalTurnCount},d=r.get(l);d?d.push(c):r.set(l,[c])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(vfe(i,s));return o}var Sfe=8;function vfe(e,t){let n=Tfe(e),r=new Date().toISOString(),i=t.slice(0,Sfe).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Efe(l.rawLine),annotation:`closure.reason='${l.reason}' \xB7 cost=${xfe(l.finalCostUsd)} \xB7 turns=${l.finalTurnCount}`})),s=t.reduce((l,c)=>l+c.finalCostUsd,0),a=t.reduce((l,c)=>l+c.finalTurnCount,0)/t.length;return{slug:n,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:kfe(e,t.length),observedAt:r,evidence:i,detail:{detector:"closure-anomaly@v1",closureReason:e,affectedSessions:t.length,totalCostUsd:HK(s),avgTurnCount:Rfe(a),maxCostUsd:HK(Math.max(...t.map(l=>l.finalCostUsd))),sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function kfe(e,t){switch(e){case"budget_exceeded":case"timeout":return"high";case"hook_blocked":case"iteration_cap":case"max_turns_exceeded":return t>=3?"high":"medium";case"abort":return t>=3?"medium":"low";default:return"low"}}function Tfe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function Efe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function xfe(e){return`$${e.toFixed(4)}`}function HK(e){return Math.round(e*1e4)/1e4}function Rfe(e){return Math.round(e*100)/100}import{createHash as Afe}from"crypto";var cs=2,Cfe="v1-hook-reason-tuple",_fe=8;function WK(e,t={}){let n=t.minOccurrences??cs;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="SubagentStart"||a.payload.decision!=="block")continue;let l=a.payload.reason??"",c=a.payload.blockedTool,d=Ife({hookEvent:a.payload.hookEvent,reason:l,blockedTool:c}),u={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,blockedTool:c,injectedContextBytes:a.payload.injectedContextBytes},m=r.get(d);m?m.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Mfe(i,s));return o}function Ife(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return Afe("sha256").update(t).digest("hex")}function Pfe(e){return`subagent-block-${e.slice(0,12)}`}function Mfe(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=Pfe(e),o=new Date().toISOString(),s=t.slice(0,_fe).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Ffe(l.rawLine),annotation:Dfe(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:$fe(n.reason,t.length,a),pattern:"subagent-block",severity:Ofe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:Cfe,fingerprint:e,hookEvent:"SubagentStart",reason:n.reason,blockedTool:n.blockedTool??null,blockCount:t.length,distinctSessions:a,sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function Ofe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function $fe(e,t,n){let r=e.length>80?e.slice(0,77)+"...":e,o=r.length>0?`: "${r}"`:"";return`SubagentStart hook blocked ${t}\xD7 across ${n} session${n===1?"":"s"}${o}`}function Dfe(e){let t=[`seq ${e.seq}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),e.blockedTool&&t.push(`blockedTool=${e.blockedTool}`),typeof e.injectedContextBytes=="number"&&t.push(`injectedContextBytes=${e.injectedContextBytes}`),t.join(" \xB7 ")}function Ffe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as Lfe}from"crypto";var ds=2,Nfe="v1-pretooluse-read-normreason",Bfe=8,Ufe=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function jfe(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function KK(e,t={}){let n=t.minOccurrences??ds;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="PreToolUse"||a.payload.decision!=="block")continue;let l=a.payload.blockedTool;if(l===void 0||!Ufe.has(l))continue;let c=a.payload.reason??"",d=jfe(c),u=Hfe({hookEvent:a.payload.hookEvent,normalizedReason:d}),m={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:d,blockedTool:l},f=r.get(u);f?f.push(m):r.set(u,[m])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Kfe(i,s));return o}function Hfe(e){let t=[e.hookEvent,e.normalizedReason].join("|");return Lfe("sha256").update(t).digest("hex")}function Wfe(e){return`subagent-read-denial-${e.slice(0,12)}`}function Kfe(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=Wfe(e),o=new Date().toISOString(),s=t.slice(0,Bfe).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:Jfe(c.rawLine),annotation:zfe(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:qfe(t.length,a),pattern:"subagent-read-denial",severity:Gfe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v1",fingerprintAlgorithm:Nfe,fingerprint:e,hookEvent:"PreToolUse",normalizedReason:n.normalizedReason,reason:n.reason,blockedTools:l,denialCount:t.length,distinctSessions:a,sessionIds:[...new Set(t.map(c=>c.sessionId))],seqs:t.map(c=>c.seq)}}}function Gfe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function qfe(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function zfe(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function Jfe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var Yfe=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined"]),us=3,ps=.25,Vfe=8;function Hl(e,t={}){let n=t.minFailures??us,r=t.minFailureRate??ps;if(n<1)throw new Error(`minFailures must be >= 1 (got ${n})`);if(r<=0||r>1)throw new Error(`minFailureRate must be in (0, 1] (got ${r})`);let o=new Map;for(let s of e)for(let a of s.events){let l=a.event;if(l.kind!=="tool_call"||l.payload.phase!=="completed"||l.payload.circuitBreaker===!0)continue;let c=Xfe(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&Yfe.has(d)){c.excludedByClass.set(d,(c.excludedByClass.get(d)??0)+1);continue}c.totalCalls+=1,l.payload.isError&&(c.failures.push({sessionId:s.sessionId,relativeTracePath:s.relativeTracePath,seq:l.seq,rawLine:a.rawLine,resultBytes:l.payload.resultBytes,durationMs:l.payload.durationMs,truncated:l.payload.truncated,...d!==void 0?{failureClass:d}:{}}),c.affectedSessions.add(s.sessionId),l.payload.truncated&&(c.truncatedFailureCount+=1))}let i=[];for(let s of o.values()){if(s.failures.length<n)continue;let a=s.failures.length/s.totalCalls;a<r||i.push(Qfe(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function Xfe(e,t){let n=e.get(t);return n||(n={toolName:t,totalCalls:0,failures:[],affectedSessions:new Set,truncatedFailureCount:0,excludedByClass:new Map},e.set(t,n)),n}function Qfe(e,t){let n=tge(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,Vfe).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:nge(d.rawLine),annotation:`isError=true${d.failureClass?` \xB7 class=${d.failureClass}`:""} \xB7 resultBytes=${d.resultBytes} \xB7 durationMs=${d.durationMs}${d.truncated?" \xB7 truncated":""}`})),a=e.failures.reduce((d,u)=>d+u.durationMs,0)/e.failures.length,l={};for(let d of e.failures){let u=d.failureClass??"unclassified";l[u]=(l[u]??0)+1}let c={};for(let[d,u]of e.excludedByClass)c[d]=u;return{slug:n,title:ege(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:Zfe(e.failures.length,t),observedAt:r,evidence:i,detail:{detector:"tool-failure-density@v2",toolName:e.toolName,totalCalls:e.totalCalls,failureCount:e.failures.length,failureRate:rge(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:oge(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function Zfe(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function ege(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function tge(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function nge(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function rge(e){return Math.round(e*1e4)/1e4}function oge(e){return Math.round(e*100)/100}var db=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Jr})`,run:(e,t)=>lb(e,{minRepeats:t.minRepeats??Jr})},{name:"closure-anomaly",description:`Session closure reason \u2208 {budget_exceeded,timeout,hook_blocked,abort,iteration_cap,max_turns_exceeded} (default \u2265${1})`,enabledByDefault:!1,run:(e,t)=>cb(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${cs})`,enabledByDefault:!1,run:(e,t)=>WK(e,{minOccurrences:t.subagentBlockMinOccurrences??cs})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${us} failures, ${ps} rate)`,enabledByDefault:!0,run:(e,t)=>Hl(e,{minFailures:t.toolFailureMinFailures??us,minFailureRate:t.toolFailureMinRate??ps})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${ds})`,enabledByDefault:!1,run:(e,t)=>KK(e,{minOccurrences:t.subagentReadDenialMinOccurrences??ds})}]);function GK(e,t,n,r){let o=[];for(let i of db){if(n!==void 0){if(!n.has(i.name))continue}else if(r!==!0&&i.enabledByDefault===!1)continue;let s=i.run(e,t);o.push(...s)}return o}function ub(){return db.map(e=>e.name)}function qK(){return db.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function Wl(){return db.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as Ou,mkdirSync as tG,readFileSync as kge,readdirSync as nG,renameSync as rG,writeFileSync as Ux}from"fs";import{join as oG}from"path";import{z as N}from"zod";var Kl=N.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),pb=N.enum(["low","medium","high"]),ige=N.enum(["open","deferred","resolved"]),zK=N.object({sessionId:N.string().min(1),tracePath:N.string().min(1),eventIndices:N.array(N.number().int().nonnegative()).min(1),excerpt:N.string().max(2e3),annotation:N.string().optional()}),mb=N.object({at:N.string().datetime(),text:N.string()}),Mu=N.object({schemaVersion:N.literal(1),slug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:N.string().min(1).max(200),pattern:Kl,severity:pb,status:ige,firstSeen:N.string().datetime(),lastSeen:N.string().datetime(),occurrenceCount:N.number().int().nonnegative(),evidence:N.array(zK).min(1),detail:N.record(N.string(),N.unknown()),notes:N.array(mb).default([])}),est=N.object({slug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:N.string().min(1).max(200),pattern:Kl,severity:pb,observedAt:N.string().datetime(),evidence:N.array(zK).min(1),detail:N.record(N.string(),N.unknown())}),JK=N.object({timestamp:N.string().datetime(),event:N.enum(["created","updated","merged-noop"]),slug:N.string(),pattern:Kl,occurrenceCount:N.number().int().nonnegative(),evidenceAdded:N.number().int().nonnegative()}),sge=N.enum(["prompt-defect","schema-too-strict","schema-too-loose","tool-output-shape","hook-overreach","retry-policy","timeout-too-low","cost-control","dispatcher-bug","detector-needs-tuning","unknown"]),age=N.enum(["safe","moderate","high","forbidden"]),lge=N.enum(["low","medium","high"]),cge=N.object({cardSlug:N.string(),eventIndices:N.array(N.number().int().nonnegative()).min(1),annotation:N.string().optional()}),dge=N.object({path:N.string().min(1),rationale:N.string(),riskTier:age,confidence:lge}),uge=N.object({unitTests:N.array(N.string()),evalCases:N.array(N.string()),smokeChecks:N.array(N.string()),manualChecks:N.array(N.string())}),pge=N.object({forbiddenPaths:N.array(N.string()),requiresExplicitApproval:N.boolean()}),mge=N.enum(["draft","approved","rejected","superseded"]),Nx=N.object({schemaVersion:N.literal(1),proposalId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),cardSlug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:N.string().min(1).max(200),hypothesis:N.string().min(1),rootCauseClass:sge,evidenceRefs:N.array(cge).min(1),fixSketch:N.string().min(1),likelyFiles:N.array(dge),riskLevel:pb,validationPlan:uge,scopeFreeze:pge,generatedBy:N.enum(["template","llm"]),createdAt:N.string().datetime(),status:mge,notes:N.array(mb).default([])}),YK=N.object({timestamp:N.string().datetime(),event:N.enum(["created","triaged","superseded"]),proposalId:N.string(),cardSlug:N.string(),generatedBy:N.enum(["template","llm"]),riskLevel:pb}),fge=N.object({sourceSessionId:N.string().min(1),sourceTracePath:N.string().min(1),fixturePath:N.string().min(1),evidenceRowIndex:N.number().int().nonnegative(),evidenceEventIndices:N.array(N.number().int().nonnegative()).min(1),sliceLineRange:N.object({startLine:N.number().int().positive(),endLine:N.number().int().positive()}),sliceLineCount:N.number().int().positive(),sliceSha256:N.string().regex(/^[0-9a-f]{64}$/,"sliceSha256 must be 64 lowercase hex chars")}),gge=N.object({kind:N.literal("pattern-absent"),patternId:Kl,detectorVersion:N.string().min(1),rationale:N.string().min(1)}),hge=N.object({detectorAtGeneration:N.string().min(1),fingerprintAtGeneration:N.string().nullable(),cardOccurrenceCountAtGeneration:N.number().int().nonnegative(),cardLastSeenAtGeneration:N.string().datetime(),generatedBy:N.literal("replay-fixture")}),yge=N.enum(["draft","approved","rejected","superseded"]),fb=N.object({schemaVersion:N.literal(1),evalCaseId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalCaseId must be lowercase alphanumeric with hyphens"),cardSlug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),proposalId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/).nullable(),title:N.string().min(1).max(200),createdAt:N.string().datetime(),kind:N.literal("replay"),replay:fge,assertion:gge,provenance:hge,status:yge,notes:N.array(mb).default([])}),VK=N.object({timestamp:N.string().datetime(),event:N.enum(["created","triaged","superseded"]),evalCaseId:N.string(),cardSlug:N.string(),proposalId:N.string().nullable(),kind:N.literal("replay")}),bge=N.enum(["pass","fail","skipped"]),wge=N.object({name:N.string().min(1),description:N.string().min(1),status:bge,expected:N.string(),actual:N.string()}),Sge=N.enum(["config-value","observed-behavior","source-symbol","fixture"]),vge=N.object({kind:Sge,ref:N.string().min(1),detail:N.string()}),XK=N.enum(["pass","fail","unsupported","error"]),Bx=N.object({schemaVersion:N.literal(1),evalRunId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalRunId must be lowercase alphanumeric with hyphens"),evalCaseId:N.string().min(1),cardSlug:N.string().min(1),patternId:Kl,contract:N.string().min(1).nullable(),status:XK,createdAt:N.string().datetime(),durationMs:N.number().int().nonnegative(),checks:N.array(wge),evidence:N.array(vge),runner:N.object({version:N.string().min(1),mode:N.literal("deterministic")}),notes:N.array(mb).default([])}),QK=N.object({timestamp:N.string().datetime(),event:N.literal("created"),evalRunId:N.string(),evalCaseId:N.string(),cardSlug:N.string(),patternId:Kl,contract:N.string().nullable(),status:XK}),ZK=Object.freeze(["**/auth/**","**/billing/**","**/secrets/**","**/credentials*",".env",".env.*","pnpm-lock.yaml","package-lock.json","yarn.lock",".github/workflows/**","dist/**","build/**","node_modules/**",".git/**","**/.afk/config/**","**/.afk/state/**"]);function iG(e){let t=Yo();Ou(t)||tG(t,{recursive:!0});let n=Iu(e.slug),r=ab(e.slug),o=Gl(n),i=Tge(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=Mu.parse(i);return Rge(n,c),Age(r,$u(c)),xge({timestamp:Cge(),event:l,slug:c.slug,pattern:c.pattern,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a)}),{slug:c.slug,event:l,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a),jsonPath:n,markdownPath:r}}function Gl(e){if(Ou(e))try{let t=kge(e,"utf-8"),n=JSON.parse(t),r=Mu.safeParse(n);return r.success?r.data:void 0}catch{return}}function Tge(e,t){if(!e)return{schemaVersion:1,slug:t.slug,title:t.title,pattern:t.pattern,severity:t.severity,status:"open",firstSeen:t.observedAt,lastSeen:t.observedAt,occurrenceCount:t.evidence.length,evidence:t.evidence,detail:t.detail,notes:[]};if(e.slug!==t.slug)throw new Error(`card-writer: slug mismatch on merge (existing='${e.slug}', detection='${t.slug}')`);let n=Ege(e.evidence,t.evidence),r=_ge(e.firstSeen,t.observedAt),o=Ige(e.lastSeen,t.observedAt),i=Pge(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:i,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function Ege(e,t){let n=i=>`${i.sessionId}::${i.eventIndices[0]??"NA"}`,r=new Set(e.map(n)),o=[...e];for(let i of t){let s=n(i);r.has(s)||(r.add(s),o.push(i))}return o}function $u(e){let t=[];t.push(`# ${e.slug} \u2014 \`${e.severity}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Pattern:** \`${e.pattern}\` \xB7 **Occurrences:** ${e.occurrenceCount} \xB7 **First seen:** ${e.firstSeen} \xB7 **Last seen:** ${e.lastSeen}`),t.push(""),t.push("## Evidence"),t.push("");for(let n of e.evidence)t.push(`### Session \`${n.sessionId}\``),t.push(""),t.push(`- Trace: \`${n.tracePath}\``),t.push(`- Event seqs: ${n.eventIndices.join(", ")}`),n.annotation&&t.push(`- Note: ${n.annotation}`),t.push(""),t.push("```jsonl"),t.push(n.excerpt),t.push("```"),t.push("");if(t.push("## Detail"),t.push(""),t.push("```json"),t.push(JSON.stringify(e.detail,null,2)),t.push("```"),t.push(""),t.push("## Triage notes"),t.push(""),e.notes.length>0){for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);t.push("")}else t.push('_(none \u2014 add one with `afk improve cards triage <slug> --note "\u2026"`)_'),t.push("");return t.join(`
1961
+ `);return t.length<=2e3?t:t.slice(0,1997)+"..."}function gfe(e,t){let n=e[0],r=e[e.length-1];return!n||!r?"":[`${e.length}\xD7 consecutive '${n.name}' calls in ${t} context`,`(seq ${n.completedSeq}\u2026${r.completedSeq},`,`inputBytes=${n.inputBytes}, resultBytes=${n.resultBytes},`,`isError=${n.isError})`].join(" ")}function hfe(e,t){return`'${e}' tool repeated ${t}\xD7 with identical fingerprint`}function yfe(e){return e>=10?"high":e>=4?"medium":"low"}function bfe(e,t){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),r=t.slice(0,12);return`repeated-tool-${n.length>0?n:"tool"}-${r}`}var wfe=new Set(["budget_exceeded","timeout","hook_blocked","abort","iteration_cap","max_turns_exceeded"]);function cb(e,t={}){let n=t.minOccurrences??1;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="closure")continue;let l=a.payload.reason;if(!wfe.has(l))continue;let c={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,finalCostUsd:a.payload.finalCostUsd,finalTurnCount:a.payload.finalTurnCount},d=r.get(l);d?d.push(c):r.set(l,[c])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(vfe(i,s));return o}var Sfe=8;function vfe(e,t){let n=Tfe(e),r=new Date().toISOString(),i=t.slice(0,Sfe).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Efe(l.rawLine),annotation:`closure.reason='${l.reason}' \xB7 cost=${xfe(l.finalCostUsd)} \xB7 turns=${l.finalTurnCount}`})),s=t.reduce((l,c)=>l+c.finalCostUsd,0),a=t.reduce((l,c)=>l+c.finalTurnCount,0)/t.length;return{slug:n,title:`Session closure reason '${e}' across ${t.length} session${t.length===1?"":"s"}`,pattern:"closure-anomaly",severity:kfe(e,t.length),observedAt:r,evidence:i,detail:{detector:"closure-anomaly@v1",closureReason:e,affectedSessions:t.length,totalCostUsd:HK(s),avgTurnCount:Rfe(a),maxCostUsd:HK(Math.max(...t.map(l=>l.finalCostUsd))),sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function kfe(e,t){switch(e){case"budget_exceeded":case"timeout":return"high";case"hook_blocked":case"iteration_cap":case"max_turns_exceeded":return t>=3?"high":"medium";case"abort":return t>=3?"medium":"low";default:return"low"}}function Tfe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`closure-anomaly-${t.length>0?t:"unknown"}`}function Efe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function xfe(e){return`$${e.toFixed(4)}`}function HK(e){return Math.round(e*1e4)/1e4}function Rfe(e){return Math.round(e*100)/100}import{createHash as Afe}from"crypto";var cs=2,Cfe="v1-hook-reason-tuple",_fe=8;function WK(e,t={}){let n=t.minOccurrences??cs;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="SubagentStart"||a.payload.decision!=="block")continue;let l=a.payload.reason??"",c=a.payload.blockedTool,d=Ife({hookEvent:a.payload.hookEvent,reason:l,blockedTool:c}),u={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:l,blockedTool:c,injectedContextBytes:a.payload.injectedContextBytes},m=r.get(d);m?m.push(u):r.set(d,[u])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Mfe(i,s));return o}function Ife(e){let t=[e.hookEvent,e.reason,e.blockedTool??""].join("|");return Afe("sha256").update(t).digest("hex")}function Pfe(e){return`subagent-block-${e.slice(0,12)}`}function Mfe(e,t){let n=t[0];if(!n)throw new Error("subagent-block: empty sighting bucket");let r=Pfe(e),o=new Date().toISOString(),s=t.slice(0,_fe).map(l=>({sessionId:l.sessionId,tracePath:l.relativeTracePath,eventIndices:[l.seq],excerpt:Ffe(l.rawLine),annotation:Dfe(l)})),a=new Set(t.map(l=>l.sessionId)).size;return{slug:r,title:$fe(n.reason,t.length,a),pattern:"subagent-block",severity:Ofe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-block@v1",fingerprintAlgorithm:Cfe,fingerprint:e,hookEvent:"SubagentStart",reason:n.reason,blockedTool:n.blockedTool??null,blockCount:t.length,distinctSessions:a,sessionIds:t.map(l=>l.sessionId),seqs:t.map(l=>l.seq)}}}function Ofe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function $fe(e,t,n){let r=e.length>80?e.slice(0,77)+"...":e,o=r.length>0?`: "${r}"`:"";return`SubagentStart hook blocked ${t}\xD7 across ${n} session${n===1?"":"s"}${o}`}function Dfe(e){let t=[`seq ${e.seq}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),e.blockedTool&&t.push(`blockedTool=${e.blockedTool}`),typeof e.injectedContextBytes=="number"&&t.push(`injectedContextBytes=${e.injectedContextBytes}`),t.join(" \xB7 ")}function Ffe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}import{createHash as Lfe}from"crypto";var ds=2,Nfe="v1-pretooluse-read-normreason",Bfe=8,Ufe=new Set(["read_file","grep","glob","list_directory","Read","Grep","Glob","LS","NotebookRead"]);function jfe(e){return e.replace(/~?\/[\w.\-/]+/g,"<path>")}function KK(e,t={}){let n=t.minOccurrences??ds;if(n<1)throw new Error(`minOccurrences must be >= 1 (got ${n})`);let r=new Map;for(let i of e)for(let s of i.events){let a=s.event;if(a.kind!=="hook_decision"||a.payload.hookEvent!=="PreToolUse"||a.payload.decision!=="block")continue;let l=a.payload.blockedTool;if(l===void 0||!Ufe.has(l))continue;let c=a.payload.reason??"",d=jfe(c),u=Hfe({hookEvent:a.payload.hookEvent,normalizedReason:d}),m={sessionId:i.sessionId,relativeTracePath:i.relativeTracePath,seq:a.seq,rawLine:s.rawLine,reason:c,normalizedReason:d,blockedTool:l},f=r.get(u);f?f.push(m):r.set(u,[m])}let o=[];for(let[i,s]of r.entries())s.length<n||o.push(Kfe(i,s));return o}function Hfe(e){let t=[e.hookEvent,e.normalizedReason].join("|");return Lfe("sha256").update(t).digest("hex")}function Wfe(e){return`subagent-read-denial-${e.slice(0,12)}`}function Kfe(e,t){let n=t[0];if(!n)throw new Error("subagent-read-denial: empty sighting bucket");let r=Wfe(e),o=new Date().toISOString(),s=t.slice(0,Bfe).map(c=>({sessionId:c.sessionId,tracePath:c.relativeTracePath,eventIndices:[c.seq],excerpt:Jfe(c.rawLine),annotation:zfe(c)})),a=new Set(t.map(c=>c.sessionId)).size,l=[...new Set(t.map(c=>c.blockedTool))].sort();return{slug:r,title:qfe(t.length,a),pattern:"subagent-read-denial",severity:Gfe(t.length,a),observedAt:o,evidence:s,detail:{detector:"subagent-read-denial@v1",fingerprintAlgorithm:Nfe,fingerprint:e,hookEvent:"PreToolUse",normalizedReason:n.normalizedReason,reason:n.reason,blockedTools:l,denialCount:t.length,distinctSessions:a,sessionIds:[...new Set(t.map(c=>c.sessionId))],seqs:t.map(c=>c.seq)}}}function Gfe(e,t){return e>=6||t>=3?"high":e>=3?"medium":"low"}function qfe(e,t){return`Forked sub-agent read auto-denied ${e}\xD7 across ${t} session${t===1?"":"s"} (path outside granted read roots)`}function zfe(e){let t=[`seq ${e.seq}`,`blockedTool=${e.blockedTool}`];return e.reason&&t.push(`reason="${e.reason.slice(0,200)}"`),t.join(" \xB7 ")}function Jfe(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}var Yfe=new Set(["policy-refusal","permission-denied","hook-block","abort","elicitation-declined"]),us=3,ps=.25,Vfe=8;function Hl(e,t={}){let n=t.minFailures??us,r=t.minFailureRate??ps;if(n<1)throw new Error(`minFailures must be >= 1 (got ${n})`);if(r<=0||r>1)throw new Error(`minFailureRate must be in (0, 1] (got ${r})`);let o=new Map;for(let s of e)for(let a of s.events){let l=a.event;if(l.kind!=="tool_call"||l.payload.phase!=="completed"||l.payload.circuitBreaker===!0)continue;let c=Xfe(o,l.payload.name),d=l.payload.failureClass;if(d!==void 0&&Yfe.has(d)){c.excludedByClass.set(d,(c.excludedByClass.get(d)??0)+1);continue}c.totalCalls+=1,l.payload.isError&&(c.failures.push({sessionId:s.sessionId,relativeTracePath:s.relativeTracePath,seq:l.seq,rawLine:a.rawLine,resultBytes:l.payload.resultBytes,durationMs:l.payload.durationMs,truncated:l.payload.truncated,...d!==void 0?{failureClass:d}:{}}),c.affectedSessions.add(s.sessionId),l.payload.truncated&&(c.truncatedFailureCount+=1))}let i=[];for(let s of o.values()){if(s.failures.length<n)continue;let a=s.failures.length/s.totalCalls;a<r||i.push(Qfe(s,a))}return i.sort((s,a)=>s.slug.localeCompare(a.slug)),i}function Xfe(e,t){let n=e.get(t);return n||(n={toolName:t,totalCalls:0,failures:[],affectedSessions:new Set,truncatedFailureCount:0,excludedByClass:new Map},e.set(t,n)),n}function Qfe(e,t){let n=tge(e.toolName),r=new Date().toISOString(),i=e.failures.slice(0,Vfe).map(d=>({sessionId:d.sessionId,tracePath:d.relativeTracePath,eventIndices:[d.seq],excerpt:nge(d.rawLine),annotation:`isError=true${d.failureClass?` \xB7 class=${d.failureClass}`:""} \xB7 resultBytes=${d.resultBytes} \xB7 durationMs=${d.durationMs}${d.truncated?" \xB7 truncated":""}`})),a=e.failures.reduce((d,u)=>d+u.durationMs,0)/e.failures.length,l={};for(let d of e.failures){let u=d.failureClass??"unclassified";l[u]=(l[u]??0)+1}let c={};for(let[d,u]of e.excludedByClass)c[d]=u;return{slug:n,title:ege(e.toolName,e.failures.length,e.totalCalls,t),pattern:"tool-failure-density",severity:Zfe(e.failures.length,t),observedAt:r,evidence:i,detail:{detector:"tool-failure-density@v2",toolName:e.toolName,totalCalls:e.totalCalls,failureCount:e.failures.length,failureRate:rge(t),affectedSessionCount:e.affectedSessions.size,truncatedFailureCount:e.truncatedFailureCount,avgFailureDurationMs:oge(a),failureClassBreakdown:l,excludedByClass:c,sessionIds:Array.from(e.affectedSessions),seqs:e.failures.map(d=>d.seq)}}}function Zfe(e,t){return t>=1||t>=.5?"high":t>=.25?e>=10?"high":"medium":e>=10?"medium":"low"}function ege(e,t,n,r){let o=(r*100).toFixed(1);return`'${e}' tool failed ${t}/${n} calls (${o}%)`}function tge(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return`tool-failure-${t.length>0?t:"unknown"}`}function nge(e){return e.length<=2e3?e:e.slice(0,1997)+"..."}function rge(e){return Math.round(e*1e4)/1e4}function oge(e){return Math.round(e*100)/100}var db=Object.freeze([{name:"repeated-tool-use",description:`Tool fired \u2265N consecutive times with identical fingerprint (default ${Jr})`,run:(e,t)=>lb(e,{minRepeats:t.minRepeats??Jr})},{name:"closure-anomaly",description:`Session closure reason \u2208 {budget_exceeded,timeout,hook_blocked,abort,iteration_cap,max_turns_exceeded} (default \u2265${1})`,enabledByDefault:!1,run:(e,t)=>cb(e,{minOccurrences:t.closureAnomalyMinOccurrences??1})},{name:"subagent-block",description:`Same SubagentStart hook block reason recurring across \u2265N events (default ${cs})`,enabledByDefault:!1,run:(e,t)=>WK(e,{minOccurrences:t.subagentBlockMinOccurrences??cs})},{name:"tool-failure-density",description:`Tool with \u2265N failures (isError: true) AND failure rate \u2265R (defaults: ${us} failures, ${ps} rate)`,enabledByDefault:!0,run:(e,t)=>Hl(e,{minFailures:t.toolFailureMinFailures??us,minFailureRate:t.toolFailureMinRate??ps})},{name:"subagent-read-denial",description:`Forked sub-agent read auto-denied (PreToolUse block, path outside granted read roots) recurring across \u2265N events (default ${ds})`,enabledByDefault:!1,run:(e,t)=>KK(e,{minOccurrences:t.subagentReadDenialMinOccurrences??ds})}]);function GK(e,t,n,r){let o=[];for(let i of db){if(n!==void 0){if(!n.has(i.name))continue}else if(r!==!0&&i.enabledByDefault===!1)continue;let s=i.run(e,t);o.push(...s)}return o}function ub(){return db.map(e=>e.name)}function qK(){return db.filter(e=>e.enabledByDefault!==!1).map(e=>e.name)}function Wl(){return db.filter(e=>e.enabledByDefault===!1).map(e=>e.name)}import{existsSync as Ou,mkdirSync as tG,readFileSync as kge,readdirSync as nG,renameSync as rG,writeFileSync as Ux}from"fs";import{join as oG}from"path";import{z as N}from"zod";var Kl=N.enum(["repeated-tool-use","subagent-block","closure-anomaly","tool-failure-density","subagent-read-denial"]),pb=N.enum(["low","medium","high"]),ige=N.enum(["open","deferred","resolved"]),zK=N.object({sessionId:N.string().min(1),tracePath:N.string().min(1),eventIndices:N.array(N.number().int().nonnegative()).min(1),excerpt:N.string().max(2e3),annotation:N.string().optional()}),mb=N.object({at:N.string().datetime(),text:N.string()}),Mu=N.object({schemaVersion:N.literal(1),slug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/,"slug must be lowercase alphanumeric with hyphens"),title:N.string().min(1).max(200),pattern:Kl,severity:pb,status:ige,firstSeen:N.string().datetime(),lastSeen:N.string().datetime(),occurrenceCount:N.number().int().nonnegative(),evidence:N.array(zK).min(1),detail:N.record(N.string(),N.unknown()),notes:N.array(mb).default([])}),nst=N.object({slug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:N.string().min(1).max(200),pattern:Kl,severity:pb,observedAt:N.string().datetime(),evidence:N.array(zK).min(1),detail:N.record(N.string(),N.unknown())}),JK=N.object({timestamp:N.string().datetime(),event:N.enum(["created","updated","merged-noop"]),slug:N.string(),pattern:Kl,occurrenceCount:N.number().int().nonnegative(),evidenceAdded:N.number().int().nonnegative()}),sge=N.enum(["prompt-defect","schema-too-strict","schema-too-loose","tool-output-shape","hook-overreach","retry-policy","timeout-too-low","cost-control","dispatcher-bug","detector-needs-tuning","unknown"]),age=N.enum(["safe","moderate","high","forbidden"]),lge=N.enum(["low","medium","high"]),cge=N.object({cardSlug:N.string(),eventIndices:N.array(N.number().int().nonnegative()).min(1),annotation:N.string().optional()}),dge=N.object({path:N.string().min(1),rationale:N.string(),riskTier:age,confidence:lge}),uge=N.object({unitTests:N.array(N.string()),evalCases:N.array(N.string()),smokeChecks:N.array(N.string()),manualChecks:N.array(N.string())}),pge=N.object({forbiddenPaths:N.array(N.string()),requiresExplicitApproval:N.boolean()}),mge=N.enum(["draft","approved","rejected","superseded"]),Nx=N.object({schemaVersion:N.literal(1),proposalId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),cardSlug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),title:N.string().min(1).max(200),hypothesis:N.string().min(1),rootCauseClass:sge,evidenceRefs:N.array(cge).min(1),fixSketch:N.string().min(1),likelyFiles:N.array(dge),riskLevel:pb,validationPlan:uge,scopeFreeze:pge,generatedBy:N.enum(["template","llm"]),createdAt:N.string().datetime(),status:mge,notes:N.array(mb).default([])}),YK=N.object({timestamp:N.string().datetime(),event:N.enum(["created","triaged","superseded"]),proposalId:N.string(),cardSlug:N.string(),generatedBy:N.enum(["template","llm"]),riskLevel:pb}),fge=N.object({sourceSessionId:N.string().min(1),sourceTracePath:N.string().min(1),fixturePath:N.string().min(1),evidenceRowIndex:N.number().int().nonnegative(),evidenceEventIndices:N.array(N.number().int().nonnegative()).min(1),sliceLineRange:N.object({startLine:N.number().int().positive(),endLine:N.number().int().positive()}),sliceLineCount:N.number().int().positive(),sliceSha256:N.string().regex(/^[0-9a-f]{64}$/,"sliceSha256 must be 64 lowercase hex chars")}),gge=N.object({kind:N.literal("pattern-absent"),patternId:Kl,detectorVersion:N.string().min(1),rationale:N.string().min(1)}),hge=N.object({detectorAtGeneration:N.string().min(1),fingerprintAtGeneration:N.string().nullable(),cardOccurrenceCountAtGeneration:N.number().int().nonnegative(),cardLastSeenAtGeneration:N.string().datetime(),generatedBy:N.literal("replay-fixture")}),yge=N.enum(["draft","approved","rejected","superseded"]),fb=N.object({schemaVersion:N.literal(1),evalCaseId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalCaseId must be lowercase alphanumeric with hyphens"),cardSlug:N.string().regex(/^[a-z0-9][a-z0-9-]*$/),proposalId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/).nullable(),title:N.string().min(1).max(200),createdAt:N.string().datetime(),kind:N.literal("replay"),replay:fge,assertion:gge,provenance:hge,status:yge,notes:N.array(mb).default([])}),VK=N.object({timestamp:N.string().datetime(),event:N.enum(["created","triaged","superseded"]),evalCaseId:N.string(),cardSlug:N.string(),proposalId:N.string().nullable(),kind:N.literal("replay")}),bge=N.enum(["pass","fail","skipped"]),wge=N.object({name:N.string().min(1),description:N.string().min(1),status:bge,expected:N.string(),actual:N.string()}),Sge=N.enum(["config-value","observed-behavior","source-symbol","fixture"]),vge=N.object({kind:Sge,ref:N.string().min(1),detail:N.string()}),XK=N.enum(["pass","fail","unsupported","error"]),Bx=N.object({schemaVersion:N.literal(1),evalRunId:N.string().regex(/^[a-z0-9][a-z0-9-]*$/,"evalRunId must be lowercase alphanumeric with hyphens"),evalCaseId:N.string().min(1),cardSlug:N.string().min(1),patternId:Kl,contract:N.string().min(1).nullable(),status:XK,createdAt:N.string().datetime(),durationMs:N.number().int().nonnegative(),checks:N.array(wge),evidence:N.array(vge),runner:N.object({version:N.string().min(1),mode:N.literal("deterministic")}),notes:N.array(mb).default([])}),QK=N.object({timestamp:N.string().datetime(),event:N.literal("created"),evalRunId:N.string(),evalCaseId:N.string(),cardSlug:N.string(),patternId:Kl,contract:N.string().nullable(),status:XK}),ZK=Object.freeze(["**/auth/**","**/billing/**","**/secrets/**","**/credentials*",".env",".env.*","pnpm-lock.yaml","package-lock.json","yarn.lock",".github/workflows/**","dist/**","build/**","node_modules/**",".git/**","**/.afk/config/**","**/.afk/state/**"]);function iG(e){let t=Yo();Ou(t)||tG(t,{recursive:!0});let n=Iu(e.slug),r=ab(e.slug),o=Gl(n),i=Tge(o,e),s=o===void 0,a=i.evidence.length-(o?.evidence.length??0),l=s?"created":a>0?"updated":"merged-noop",c=Mu.parse(i);return Rge(n,c),Age(r,$u(c)),xge({timestamp:Cge(),event:l,slug:c.slug,pattern:c.pattern,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a)}),{slug:c.slug,event:l,occurrenceCount:c.occurrenceCount,evidenceAdded:Math.max(0,a),jsonPath:n,markdownPath:r}}function Gl(e){if(Ou(e))try{let t=kge(e,"utf-8"),n=JSON.parse(t),r=Mu.safeParse(n);return r.success?r.data:void 0}catch{return}}function Tge(e,t){if(!e)return{schemaVersion:1,slug:t.slug,title:t.title,pattern:t.pattern,severity:t.severity,status:"open",firstSeen:t.observedAt,lastSeen:t.observedAt,occurrenceCount:t.evidence.length,evidence:t.evidence,detail:t.detail,notes:[]};if(e.slug!==t.slug)throw new Error(`card-writer: slug mismatch on merge (existing='${e.slug}', detection='${t.slug}')`);let n=Ege(e.evidence,t.evidence),r=_ge(e.firstSeen,t.observedAt),o=Ige(e.lastSeen,t.observedAt),i=Pge(e.severity,t.severity);return{schemaVersion:1,slug:e.slug,title:t.title,pattern:e.pattern,severity:i,status:e.status,firstSeen:r,lastSeen:o,occurrenceCount:n.length,evidence:n,detail:t.detail,notes:e.notes}}function Ege(e,t){let n=i=>`${i.sessionId}::${i.eventIndices[0]??"NA"}`,r=new Set(e.map(n)),o=[...e];for(let i of t){let s=n(i);r.has(s)||(r.add(s),o.push(i))}return o}function $u(e){let t=[];t.push(`# ${e.slug} \u2014 \`${e.severity}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Pattern:** \`${e.pattern}\` \xB7 **Occurrences:** ${e.occurrenceCount} \xB7 **First seen:** ${e.firstSeen} \xB7 **Last seen:** ${e.lastSeen}`),t.push(""),t.push("## Evidence"),t.push("");for(let n of e.evidence)t.push(`### Session \`${n.sessionId}\``),t.push(""),t.push(`- Trace: \`${n.tracePath}\``),t.push(`- Event seqs: ${n.eventIndices.join(", ")}`),n.annotation&&t.push(`- Note: ${n.annotation}`),t.push(""),t.push("```jsonl"),t.push(n.excerpt),t.push("```"),t.push("");if(t.push("## Detail"),t.push(""),t.push("```json"),t.push(JSON.stringify(e.detail,null,2)),t.push("```"),t.push(""),t.push("## Triage notes"),t.push(""),e.notes.length>0){for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);t.push("")}else t.push('_(none \u2014 add one with `afk improve cards triage <slug> --note "\u2026"`)_'),t.push("");return t.join(`
1962
1962
  `)}function xge(e){let t=JK.parse(e),n=PK(),r=Yo();Ou(r)||tG(r,{recursive:!0});try{Ux(n,JSON.stringify(t)+`
1963
1963
  `,{flag:"a"})}catch{}}function Rge(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Ux(n,JSON.stringify(t,null,2)),rG(n,e)}function Age(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Ux(n,t),rG(n,e)}function Cge(){return new Date().toISOString()}function _ge(e,t){return e<=t?e:t}function Ige(e,t){return e>=t?e:t}var eG={low:0,medium:1,high:2};function Pge(e,t){return eG[e]>=eG[t]?e:t}function sG(){let e=Yo();if(!Ou(e))return[];let t=[];for(let n of nG(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=Gl(oG(e,n));r&&t.push({slug:r.slug,title:r.title,pattern:r.pattern,severity:r.severity,status:r.status,occurrenceCount:r.occurrenceCount,firstSeen:r.firstSeen,lastSeen:r.lastSeen})}return t.sort((n,r)=>n.lastSeen!==r.lastSeen?n.lastSeen<r.lastSeen?1:-1:n.slug<r.slug?-1:1),t}function gb(e){return Gl(Iu(e))}function aG(e){let t;for(let n of e.notes)(t===void 0||Date.parse(n.at)>Date.parse(t))&&(t=n.at);return t}function Mge(e){if(e.status!=="resolved"&&e.status!=="deferred")return!1;let t=aG(e);if(t===void 0)return!1;let n=Date.parse(e.lastSeen),r=Date.parse(t);return Number.isNaN(n)||Number.isNaN(r)?!1:n>r}function Oge(e){let t=[];for(let n of e){if(!Mge(n))continue;let r=aG(n);r!==void 0&&t.push({slug:n.slug,pattern:n.pattern,severity:n.severity,status:n.status,occurrenceCount:n.occurrenceCount,lastSeen:n.lastSeen,latestNoteAt:r})}return t.sort((n,r)=>n.lastSeen!==r.lastSeen?n.lastSeen<r.lastSeen?1:-1:n.slug<r.slug?-1:1),t}function lG(){let e=Yo();if(!Ou(e))return[];let t=[];for(let n of nG(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=Gl(oG(e,n));r&&t.push(r)}return Oge(t)}import{existsSync as $ge,mkdirSync as Dge,renameSync as cG,writeFileSync as dG}from"fs";import{dirname as Fge}from"path";var ms=class extends Error{constructor(n,r){super(r);this.code=n;this.name="TriageError"}code};function uG(e,t){let n=Iu(e),r=ab(e),o=Gl(n);if(!o)throw new ms("card-not-found",`No failure card found for slug '${e}'`);if(t.note!==void 0&&t.note.trim().length===0)throw new ms("invalid-note","triage note must be non-empty after trim");let i=t.note?.trim(),s=i!==void 0&&i.length>0,a=t.status!==void 0&&t.status!==o.status;if(!s&&!a)throw new ms("no-change","triage requires at least --note or --status to differ from current");let l=(t.now??(()=>new Date))().toISOString(),c=s?[...o.notes,{at:l,text:i}]:o.notes,d=a?t.status:o.status,u={...o,status:d,notes:c},m=Mu.parse(u);return Lge(n),Nge(n,m),Bge(r,$u(m)),{slug:e,card:m,noteAdded:s,statusChanged:a?{from:o.status,to:d}:void 0,jsonPath:n,markdownPath:r}}function Lge(e){let t=Fge(e);$ge(t)||Dge(t,{recursive:!0})}function Nge(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;dG(n,JSON.stringify(t,null,2)),cG(n,e)}function Bge(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;dG(n,t),cG(n,e)}var Uge={"repeated-tool-use":{rootCauseClass:"dispatcher-bug",hypothesis:e=>{let t=typeof e.detail.toolName=="string"?e.detail.toolName:"<unknown>",n=typeof e.detail.runLength=="number"?e.detail.runLength:"?";return`The '${t}' tool was dispatched ${n} times in a row with an identical input/output byte fingerprint. This is either (a) the model is stuck retrying the same call without responding to its result, (b) the tool's result shape is too uninformative for the model to make progress, or (c) a productive recursion that happens to share byte counts (rare; the fingerprint caveat is documented on the detector).`},fixSketch:e=>["## Candidate fixes (human picks)","",`**Option A \u2014 make the loop visible.** Surface a clear "no-progress" signal to the model when '${typeof e.detail.toolName=="string"?e.detail.toolName:"<the tool>"}' returns the same result N times in a row. Today the dispatcher just executes the call.`,"",`**Option B \u2014 improve the tool's result shape.** If the model can't distinguish "no results" from "same results," its result is information-poor. Inspect the tool's response and verify it carries enough signal for the model to change its query.`,"","**Option C \u2014 confirm productive recursion.** Open the source trace at the seq values listed in the evidence and inspect the model's reasoning between repeats. If each call's args genuinely differ (and the byte-count collision is the issue), no code change is needed; tune the detector instead.","","_Option C first \u2014 the byte-fingerprint detector has a documented collision caveat. Confirm there is a real loop before changing dispatcher behavior._"].join(`
1964
1964
  `),likelyFiles:[{path:"src/agent/providers/anthropic-direct/loop.ts",rationale:"Main tool dispatch loop. If a no-progress detector is added at the dispatch boundary, it lives here.",riskTier:"moderate",confidence:"medium"},{path:"src/agent/tools/",rationale:"Tool implementations. If the result shape is information-poor, the specific tool implementation needs the change.",riskTier:"safe",confidence:"low"},{path:"src/improve/scan/detectors/repeated-tool-use.ts",rationale:"If this turns out to be detector noise rather than a real bug, tune here.",riskTier:"safe",confidence:"medium"}],riskFloor:"medium",validationPlan:{unitTests:["pnpm test src/improve/scan/detectors/repeated-tool-use","pnpm test src/agent/providers/anthropic-direct"],evalCases:[],smokeChecks:["pnpm lint","afk improve scan --since 7d # after fix lands, this pattern should NOT recur"],manualChecks:["Open the trace at the evidence seqs and confirm the calls are truly identical (not just byte-coincident)."]}},"subagent-block":{rootCauseClass:"hook-overreach",hypothesis:e=>{let t=typeof e.detail.reason=="string"?e.detail.reason:"",n=typeof e.detail.blockCount=="number"?e.detail.blockCount:"?",r=typeof e.detail.distinctSessions=="number"?e.detail.distinctSessions:"?",o=t?` with reason "${t.slice(0,200)}"`:" (no reason field on the block events)";return`A SubagentStart hook returned decision:'block' ${n} times across ${r} session(s)${o}. Recurring blocks suggest either (a) the guard is over-broad and trips on legitimate dispatches, (b) the legitimate use case actually needs a refactor to satisfy the guard, or (c) the user has no signal explaining the block and keeps retrying.`},fixSketch:e=>{let t=typeof e.detail.reason=="string"?e.detail.reason:"<not in payload>";return["## Candidate fixes (human picks)","",`**Identify the hook owner first.** The trace's hook_decision event carries the \`reason\` field ("${t}"). Grep the codebase for that literal string \u2014 that locates the hook handler.`,"","```sh","# Replace the quoted string below with the actual reason text from the evidence.",`grep -rn -- "${t.slice(0,60).replace(/"/g,'\\"')}" src/`,"```","","**Option A \u2014 tighten the guard.** If the block fires on dispatches it should not, narrow the predicate. Confirm by adding a unit test that exercises the false-positive case.","","**Option B \u2014 make the refusal legible.** Instead of `decision: 'block'`, return a hook decision that injects a context message via `injectContext`. The parent session then sees a clear no-op message instead of a silent block.","",'**Option C \u2014 accept the block as correct.** If the guard is doing its job, mark the card resolved via `afk improve cards triage <slug> --status resolved --note "..."`. No code change.'].join(`
@@ -1969,7 +1969,7 @@ or "latest" (the default) \u2014 the most recently written trace.`).option("--al
1969
1969
  `)}function bG(){let e=ls();if(!hb(e))return[];let t=[];for(let n of Yge(e)){if(!n.endsWith(".json")||n.startsWith("."))continue;let r=wG(Vge(e,n));r&&t.push({proposalId:r.proposalId,cardSlug:r.cardSlug,title:r.title,riskLevel:r.riskLevel,status:r.status,rootCauseClass:r.rootCauseClass,generatedBy:r.generatedBy,createdAt:r.createdAt})}return t.sort((n,r)=>n.createdAt!==r.createdAt?n.createdAt<r.createdAt?1:-1:n.proposalId<r.proposalId?-1:1),t}function Hx(e){return wG($x(e))}function wG(e){if(hb(e))try{let t=Jge(e,"utf-8"),n=JSON.parse(t),r=Nx.safeParse(n);return r.success?r.data:void 0}catch{return}}function Qge(e){let t=YK.parse(e),n=OK(),r=ls();hb(r)||fG(r,{recursive:!0});try{jx(n,JSON.stringify(t)+`
1970
1970
  `,{flag:"a"})}catch{}}function Zge(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;jx(n,JSON.stringify(t,null,2)),gG(n,e)}function ehe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;jx(n,t),gG(n,e)}import{createHash as SG}from"crypto";import{existsSync as the,readFileSync as nhe}from"fs";var gn=class extends Error{code;constructor(t,n){super(t),this.name="EvalGenError",this.code=n}};function vG(e,t){if(!the(e))throw new gn(`replay-fixture: source trace not found: ${e}`,"source-not-found");let n=t.startLine??1;if(n!==1)throw new gn(`replay-fixture: only startLine=1 (prefix slice) is supported in Sprint 3 (got ${n})`,"unsupported-window");let r=nhe(e);if(r.length===0)throw new gn(`replay-fixture: source trace is empty: ${e}`,"source-empty");let o=rhe(r),i=o.length,s=-1;for(let u=0;u<o.length;u++){let m=o[u];if(m.contentEnd===m.start)continue;let f=r.subarray(m.start,m.contentEnd).toString("utf8"),g;try{g=JSON.parse(f)}catch{continue}if(g!==null&&typeof g=="object"&&"seq"in g&&typeof g.seq=="number"&&g.seq===t.endSeq){s=u+1;break}}if(s===-1)throw new gn(`replay-fixture: seq ${t.endSeq} not found in ${e} (scanned ${i} lines)`,"seq-not-found");let l=o[s-1].byteEnd,c=Buffer.from(r.subarray(0,l)),d=SG("sha256").update(c).digest("hex");return{bytes:c,startLine:1,endLine:s,sliceLineCount:s,sliceSha256:d,sourceLineCount:i}}function bb(e){return SG("sha256").update(e).digest("hex")}function rhe(e){let t=[],n=0;for(let r=0;r<e.length;r++)e[r]===10&&(t.push({start:n,contentEnd:r,byteEnd:r+1}),n=r+1);return n<e.length&&t.push({start:n,contentEnd:e.length,byteEnd:e.length}),t}import{randomBytes as ohe}from"crypto";import{existsSync as wb,mkdirSync as kG,readFileSync as TG,readdirSync as ihe,renameSync as Wx,writeFileSync as Sb}from"fs";import{join as EG,relative as she}from"path";q();function xG(e,t={}){let n=(t.now??(()=>new Date))(),r=ahe(n),o=t.randomSuffix!==void 0?t.randomSuffix():ohe(3).toString("hex");if(!/^[0-9a-f]{6}$/.test(o))throw new Error(`generateEvalCaseId: randomSuffix must be 6 lowercase hex chars (got '${o}')`);return`${e}-eval-${r}-${o}`}function ahe(e){let t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0");return`${t}${n}${r}`}function RG(e,t){if(t.evidenceRowIndex<0||t.evidenceRowIndex>=e.evidence.length)throw new gn(`buildEvalCase: evidence row ${t.evidenceRowIndex} out of range (card has ${e.evidence.length} row(s))`,"evidence-row-out-of-range");let n=e.evidence[t.evidenceRowIndex];if(n.eventIndices.length===0)throw new gn(`buildEvalCase: evidence row ${t.evidenceRowIndex} has no eventIndices`,"seq-not-found");let r=Math.max(...n.eventIndices),i=(t.resolveTraceAbsPath??lhe)(n.tracePath),s=vG(i,{endSeq:r}),a=(t.now??(()=>new Date))().toISOString(),l=Fx(t.evalCaseId),c=she(Ce(),l),d=typeof e.detail.detector=="string"?e.detail.detector:e.pattern,u=typeof e.detail.fingerprint=="string"?e.detail.fingerprint:null,m=t.proposalId??null,f={schemaVersion:1,evalCaseId:t.evalCaseId,cardSlug:e.slug,proposalId:m,title:che(e,r),createdAt:a,kind:"replay",replay:{sourceSessionId:n.sessionId,sourceTracePath:n.tracePath,fixturePath:c,evidenceRowIndex:t.evidenceRowIndex,evidenceEventIndices:[...n.eventIndices],sliceLineRange:{startLine:s.startLine,endLine:s.endLine},sliceLineCount:s.sliceLineCount,sliceSha256:s.sliceSha256},assertion:{kind:"pattern-absent",patternId:e.pattern,detectorVersion:d,rationale:dhe({patternId:e.pattern,detectorVersion:d,endSeq:r,sliceLineCount:s.sliceLineCount,sessionId:n.sessionId})},provenance:{detectorAtGeneration:d,fingerprintAtGeneration:u,cardOccurrenceCountAtGeneration:e.occurrenceCount,cardLastSeenAtGeneration:e.lastSeen,generatedBy:"replay-fixture"},status:"draft",notes:[]};return fb.parse(f),{evalCase:f,sliceBytes:s.bytes}}function lhe(e){return EG(Ce(),e)}function che(e,t){let n="Replay [pattern-absent]: ",r=` (through seq ${t})`,o=200-n.length-r.length,i=e.title.length>o?e.title.slice(0,o-1)+"\u2026":e.title;return`${n}${i}${r}`.slice(0,200)}function dhe(e){let t=e.sessionId.slice(0,8);return`After the proposed fix lands, replaying the prefix [seq 0..${e.endSeq}] (${e.sliceLineCount} lines, session ${t}\u2026) through ${e.detectorVersion} must produce zero findings for '${e.patternId}' with the fingerprint at generation time. **Sprint 3 ships eval-case-as-contract; the runner that enforces this lands in a later sprint.**`}function AG(e,t){let n=fb.parse(e),r=Vo();wb(r)||kG(r,{recursive:!0});let o=Dx(n.evalCaseId),i=Fx(n.evalCaseId),s=FK(n.evalCaseId);fhe(i,t);let a=bb(TG(i));if(a!==n.replay.sliceSha256)throw new gn(`writeEvalCase: fixture sha256 mismatch after write (expected ${n.replay.sliceSha256}, got ${a}, path ${i})`,"fixture-mismatch");return phe(o,n),mhe(s,vb(n)),uhe({timestamp:new Date().toISOString(),event:"created",evalCaseId:n.evalCaseId,cardSlug:n.cardSlug,proposalId:n.proposalId,kind:n.kind}),{evalCaseId:n.evalCaseId,jsonPath:o,fixturePath:i,markdownPath:s}}function vb(e){let t=[];if(t.push(`# ${e.evalCaseId} \u2014 \`${e.kind}\` \u2014 \`${e.status}\``),t.push(""),t.push(e.title),t.push(""),t.push(`**Card:** \`${e.cardSlug}\` \xB7 **Proposal:** ${e.proposalId?`\`${e.proposalId}\``:"_(none)_"} \xB7 **Created:** ${e.createdAt}`),t.push(""),t.push("> **Sprint 3 disclaimer.** This file is a CONTRACT, not an"),t.push("> executable. No runner consumes it yet. A future sprint will"),t.push("> replay the fixture through the detector and assert the"),t.push("> pattern is absent. Until then this artifact captures intent."),t.push(""),t.push("## Replay fixture"),t.push(""),t.push(`- **Source session:** \`${e.replay.sourceSessionId}\``),t.push(`- **Source trace:** \`${e.replay.sourceTracePath}\``),t.push(`- **Fixture:** \`${e.replay.fixturePath}\``),t.push(`- **Evidence row:** index ${e.replay.evidenceRowIndex} (seqs ${e.replay.evidenceEventIndices.join(", ")})`),t.push(`- **Slice:** lines ${e.replay.sliceLineRange.startLine}\u2013${e.replay.sliceLineRange.endLine} (${e.replay.sliceLineCount} lines)`),t.push(`- **SHA-256:** \`${e.replay.sliceSha256}\``),t.push(""),t.push("## Assertion"),t.push(""),t.push(`- **Kind:** \`${e.assertion.kind}\``),t.push(`- **Pattern:** \`${e.assertion.patternId}\``),t.push(`- **Detector:** \`${e.assertion.detectorVersion}\``),t.push(""),t.push(e.assertion.rationale),t.push(""),t.push("## Provenance"),t.push(""),t.push(`- **Detector at generation:** \`${e.provenance.detectorAtGeneration}\``),t.push(`- **Fingerprint at generation:** ${e.provenance.fingerprintAtGeneration?`\`${e.provenance.fingerprintAtGeneration}\``:"_(none \u2014 detector has no fingerprint)_"}`),t.push(`- **Card occurrence count at generation:** ${e.provenance.cardOccurrenceCountAtGeneration}`),t.push(`- **Card lastSeen at generation:** ${e.provenance.cardLastSeenAtGeneration}`),t.push(`- **Generated by:** \`${e.provenance.generatedBy}\``),t.push(""),t.push("## Triage notes"),t.push(""),e.notes.length===0)t.push("_(none)_");else for(let n of e.notes)t.push(`- _${n.at}_ \u2014 ${n.text}`);return t.push(""),t.join(`
1971
1971
  `)}function Kx(){let e=Vo();if(!wb(e))return[];let t=[];for(let n of ihe(e)){if(!n.endsWith(".json")||n.startsWith(".")||n.endsWith(".fixture.jsonl"))continue;let r=_G(EG(e,n));r&&t.push({evalCaseId:r.evalCaseId,cardSlug:r.cardSlug,proposalId:r.proposalId,title:r.title,kind:r.kind,status:r.status,patternId:r.assertion.patternId,createdAt:r.createdAt,sliceSha256:r.replay.sliceSha256})}return t.sort((n,r)=>n.createdAt!==r.createdAt?n.createdAt<r.createdAt?1:-1:n.evalCaseId<r.evalCaseId?-1:1),t}function kb(e){return _G(Dx(e))}function CG(e){return Kx().filter(t=>t.cardSlug===e).map(t=>kb(t.evalCaseId)).filter(t=>t!==void 0)}function _G(e){if(wb(e))try{let t=TG(e,"utf-8"),n=JSON.parse(t),r=fb.safeParse(n);return r.success?r.data:void 0}catch{return}}function uhe(e){let t=VK.parse(e),n=DK(),r=Vo();wb(r)||kG(r,{recursive:!0});try{Sb(n,JSON.stringify(t)+`
1972
- `,{flag:"a"})}catch{}}function phe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sb(n,JSON.stringify(t,null,2)),Wx(n,e)}function mhe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sb(n,t),Wx(n,e)}function fhe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sb(n,t),Wx(n,e)}import{randomBytes as Ohe}from"crypto";import{existsSync as Vx,mkdirSync as HG,readFileSync as $he,readdirSync as Jst,renameSync as WG,writeFileSync as Xx}from"fs";import{join as Dhe}from"path";q();Ic();Fv();wg();var IG=400;function Qt(e){let n=(typeof e=="string"?e:String(e)).replace(/\s+/g," ").trim();return n.length>IG?n.slice(0,IG-1)+"\u2026":n}function Te(e){return{name:e.name,description:e.description,status:e.status??(e.pass?"pass":"fail"),expected:Qt(e.expected),actual:Qt(e.actual)}}var Du="eval_run_probe_tool";async function ghe(){let e=Vs,t=0,n=async()=>(t+=1,{content:"probe-ok"}),r=new Kt({handlers:new Map([[Du,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[Du]}}),o=new AbortController().signal,i=h=>({id:"eval-run-probe",name:Du,input:h,signal:o}),s={probe:"byte-identical-input"},a=[];for(let h=0;h<e-1;h++)a.push(await r.execute(i(s)));let l=t,c=await r.execute(i(s)),d=t,u=await r.execute(i({probe:"a-different-input"})),m=a.every(h=>h.isError!==!0&&h.circuitBreaker!==!0),f=[Te({name:"executes-below-threshold",description:`First ${e-1} byte-identical calls execute without tripping`,pass:m&&l===e-1,expected:`${e-1} clean executions; handler runs ${e-1}\xD7`,actual:`${a.filter(h=>h.isError!==!0).length} clean; handler ran ${l}\xD7`}),Te({name:"trips-at-threshold",description:`Call #${e} is short-circuited with isError + circuitBreaker, handler skipped`,pass:c.isError===!0&&c.circuitBreaker===!0&&d===l,expected:"isError=true, circuitBreaker=true, handler not re-run",actual:`isError=${c.isError??!1}, circuitBreaker=${c.circuitBreaker??!1}, handler ran ${d}\xD7`}),Te({name:"breaker-message-is-actionable",description:"The synthetic block names the looping tool and reads as a stop nudge",pass:/circuit breaker/i.test(c.content)&&c.content.includes(Du),expected:`mentions "circuit breaker" and the tool name "${Du}"`,actual:c.content}),Te({name:"resets-on-different-input",description:"A different-input call after a trip resets the consecutive counter and executes",pass:u.isError!==!0&&u.circuitBreaker!==!0&&t===d+1,expected:"executes (no breaker), handler runs once more",actual:`isError=${u.isError??!1}, circuitBreaker=${u.circuitBreaker??!1}, handler ran ${t}\xD7`})],g=[{kind:"config-value",ref:"src/agent/tools/dispatcher.ts#REPEAT_CIRCUIT_BREAKER_THRESHOLD",detail:String(e)},{kind:"observed-behavior",ref:"SessionToolDispatcher.execute",detail:`handler ran ${d}\xD7 across ${e} byte-identical calls; call #${e} short-circuited (circuitBreaker=${c.circuitBreaker??!1})`}];return{checks:f,evidence:g}}async function hhe(){let n=Rf(3,3);return{checks:[Te({name:"refusal-states-depth",description:"Refusal reports the depth that was hit and the max",pass:n.includes("nesting depth 3 (max 3)"),expected:'mentions "nesting depth 3 (max 3)"',actual:n}),Te({name:"recovery-hint-present",description:"Refusal carries the recovery hint clause",pass:n.includes(ha),expected:"contains SKILL_MAX_DEPTH_RECOVERY_HINT",actual:n}),Te({name:"hint-directs-inline-work",description:"Hint tells the model to work inline instead of delegating further",pass:/perform the work inline/i.test(ha)&&/skill\/agent\/compose/i.test(ha),expected:'hint mentions "perform the work inline" and "skill/agent/compose"',actual:ha})],evidence:[{kind:"source-symbol",ref:"src/agent/tools/skill-depth-message.ts#buildSkillMaxDepthRefusal",detail:n},{kind:"source-symbol",ref:"src/agent/tools/skill-executor.ts (execute: depth >= maxDepth branch)",detail:"returns buildSkillMaxDepthRefusal(depth, maxDepth)"}]}}var fs="tool-failure-density",Ln="flaky_tool",ql="refusal_only_tool",zl="tool-failure-flaky-tool",yhe="tool-failure-refusal-only-tool";async function bhe(){let e=qK(),t=Wl(),n=[Te({name:"in-default-enabled-set",description:`${fs} runs in a default scan`,pass:e.includes(fs),expected:`defaultEnabledDetectorNames() includes "${fs}"`,actual:`[${e.join(", ")}]`}),Te({name:"not-opt-in",description:`${fs} is not in the disabled-by-default set`,pass:!t.includes(fs),expected:`disabledByDefaultDetectorNames() excludes "${fs}"`,actual:`[${t.join(", ")}]`})],r=[{kind:"config-value",ref:"DETECTOR_REGISTRY['tool-failure-density'].enabledByDefault",detail:String(e.includes(fs))}];return{checks:n,evidence:r}}function mt(e,t,n){let r={phase:"completed",toolUseId:`tu-${e}`,name:t,resultBytes:128,isError:n.isError,truncated:!1,durationMs:10};return n.circuitBreaker===!0&&(r.circuitBreaker=!0),n.failureClass!==void 0&&(r.failureClass=n.failureClass),JSON.stringify({ts:"2026-06-20T10:00:00.000Z",seq:e,kind:"tool_call",payload:r})}function Gx(e,t){let n=`state/witness/${e}/trace.jsonl`;return jl({sessionId:e,tracePath:n,relativeTracePath:n,content:t.join(`
1972
+ `,{flag:"a"})}catch{}}function phe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sb(n,JSON.stringify(t,null,2)),Wx(n,e)}function mhe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sb(n,t),Wx(n,e)}function fhe(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Sb(n,t),Wx(n,e)}import{randomBytes as Ohe}from"crypto";import{existsSync as Vx,mkdirSync as HG,readFileSync as $he,readdirSync as Vst,renameSync as WG,writeFileSync as Xx}from"fs";import{join as Dhe}from"path";q();Ic();Fv();wg();var IG=400;function Qt(e){let n=(typeof e=="string"?e:String(e)).replace(/\s+/g," ").trim();return n.length>IG?n.slice(0,IG-1)+"\u2026":n}function Te(e){return{name:e.name,description:e.description,status:e.status??(e.pass?"pass":"fail"),expected:Qt(e.expected),actual:Qt(e.actual)}}var Du="eval_run_probe_tool";async function ghe(){let e=Vs,t=0,n=async()=>(t+=1,{content:"probe-ok"}),r=new Kt({handlers:new Map([[Du,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[Du]}}),o=new AbortController().signal,i=h=>({id:"eval-run-probe",name:Du,input:h,signal:o}),s={probe:"byte-identical-input"},a=[];for(let h=0;h<e-1;h++)a.push(await r.execute(i(s)));let l=t,c=await r.execute(i(s)),d=t,u=await r.execute(i({probe:"a-different-input"})),m=a.every(h=>h.isError!==!0&&h.circuitBreaker!==!0),f=[Te({name:"executes-below-threshold",description:`First ${e-1} byte-identical calls execute without tripping`,pass:m&&l===e-1,expected:`${e-1} clean executions; handler runs ${e-1}\xD7`,actual:`${a.filter(h=>h.isError!==!0).length} clean; handler ran ${l}\xD7`}),Te({name:"trips-at-threshold",description:`Call #${e} is short-circuited with isError + circuitBreaker, handler skipped`,pass:c.isError===!0&&c.circuitBreaker===!0&&d===l,expected:"isError=true, circuitBreaker=true, handler not re-run",actual:`isError=${c.isError??!1}, circuitBreaker=${c.circuitBreaker??!1}, handler ran ${d}\xD7`}),Te({name:"breaker-message-is-actionable",description:"The synthetic block names the looping tool and reads as a stop nudge",pass:/circuit breaker/i.test(c.content)&&c.content.includes(Du),expected:`mentions "circuit breaker" and the tool name "${Du}"`,actual:c.content}),Te({name:"resets-on-different-input",description:"A different-input call after a trip resets the consecutive counter and executes",pass:u.isError!==!0&&u.circuitBreaker!==!0&&t===d+1,expected:"executes (no breaker), handler runs once more",actual:`isError=${u.isError??!1}, circuitBreaker=${u.circuitBreaker??!1}, handler ran ${t}\xD7`})],g=[{kind:"config-value",ref:"src/agent/tools/dispatcher.ts#REPEAT_CIRCUIT_BREAKER_THRESHOLD",detail:String(e)},{kind:"observed-behavior",ref:"SessionToolDispatcher.execute",detail:`handler ran ${d}\xD7 across ${e} byte-identical calls; call #${e} short-circuited (circuitBreaker=${c.circuitBreaker??!1})`}];return{checks:f,evidence:g}}async function hhe(){let n=Rf(3,3);return{checks:[Te({name:"refusal-states-depth",description:"Refusal reports the depth that was hit and the max",pass:n.includes("nesting depth 3 (max 3)"),expected:'mentions "nesting depth 3 (max 3)"',actual:n}),Te({name:"recovery-hint-present",description:"Refusal carries the recovery hint clause",pass:n.includes(ha),expected:"contains SKILL_MAX_DEPTH_RECOVERY_HINT",actual:n}),Te({name:"hint-directs-inline-work",description:"Hint tells the model to work inline instead of delegating further",pass:/perform the work inline/i.test(ha)&&/skill\/agent\/compose/i.test(ha),expected:'hint mentions "perform the work inline" and "skill/agent/compose"',actual:ha})],evidence:[{kind:"source-symbol",ref:"src/agent/tools/skill-depth-message.ts#buildSkillMaxDepthRefusal",detail:n},{kind:"source-symbol",ref:"src/agent/tools/skill-executor.ts (execute: depth >= maxDepth branch)",detail:"returns buildSkillMaxDepthRefusal(depth, maxDepth)"}]}}var fs="tool-failure-density",Ln="flaky_tool",ql="refusal_only_tool",zl="tool-failure-flaky-tool",yhe="tool-failure-refusal-only-tool";async function bhe(){let e=qK(),t=Wl(),n=[Te({name:"in-default-enabled-set",description:`${fs} runs in a default scan`,pass:e.includes(fs),expected:`defaultEnabledDetectorNames() includes "${fs}"`,actual:`[${e.join(", ")}]`}),Te({name:"not-opt-in",description:`${fs} is not in the disabled-by-default set`,pass:!t.includes(fs),expected:`disabledByDefaultDetectorNames() excludes "${fs}"`,actual:`[${t.join(", ")}]`})],r=[{kind:"config-value",ref:"DETECTOR_REGISTRY['tool-failure-density'].enabledByDefault",detail:String(e.includes(fs))}];return{checks:n,evidence:r}}function mt(e,t,n){let r={phase:"completed",toolUseId:`tu-${e}`,name:t,resultBytes:128,isError:n.isError,truncated:!1,durationMs:10};return n.circuitBreaker===!0&&(r.circuitBreaker=!0),n.failureClass!==void 0&&(r.failureClass=n.failureClass),JSON.stringify({ts:"2026-06-20T10:00:00.000Z",seq:e,kind:"tool_call",payload:r})}function Gx(e,t){let n=`state/witness/${e}/trace.jsonl`;return jl({sessionId:e,tracePath:n,relativeTracePath:n,content:t.join(`
1973
1973
  `)+`
1974
1974
  `,sessionMtimeMs:0})}function whe(){let e=Gx("tfd-sess-a",[mt(0,Ln,{isError:!1}),mt(1,Ln,{isError:!0,failureClass:"timeout"}),mt(2,Ln,{isError:!0}),mt(3,Ln,{isError:!0,failureClass:"policy-refusal"}),mt(4,Ln,{isError:!0,circuitBreaker:!0})]),t=Gx("tfd-sess-b",[mt(0,Ln,{isError:!0}),mt(1,Ln,{isError:!1}),mt(2,Ln,{isError:!0,failureClass:"permission-denied"}),mt(3,Ln,{isError:!0,failureClass:"abort"}),mt(4,Ln,{isError:!0,failureClass:"hook-block"}),mt(5,Ln,{isError:!0,failureClass:"elicitation-declined"})]),n=Gx("tfd-sess-c",[mt(0,ql,{isError:!1}),mt(1,ql,{isError:!0,failureClass:"policy-refusal"}),mt(2,ql,{isError:!0,failureClass:"policy-refusal"}),mt(3,ql,{isError:!0,failureClass:"permission-denied"}),mt(4,ql,{isError:!0,failureClass:"hook-block"}),mt(5,ql,{isError:!0,failureClass:"abort"})]);return[e,t,n]}function Tb(e,t){let n=e[t];return typeof n=="number"?n:void 0}function qx(e){let t={};if(e===null||typeof e!="object")return t;for(let[n,r]of Object.entries(e))typeof r=="number"&&(t[n]=r);return t}function PG(e,t){let n=qx(e),r=Object.keys(n),o=Object.keys(t);if(r.length!==o.length)return!1;for(let i of o)if(n[i]!==t[i])return!1;return!0}function She(e){return Array.isArray(e)?e.filter(t=>typeof t=="number"):[]}function vhe(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function khe(){let e=whe(),t=Hl(e,{}),n=t.find(k=>k.slug===zl),r=t.find(k=>k.slug===yhe),o=n?.detail??{},i=Tb(o,"failureCount"),s=Tb(o,"totalCalls"),a=Tb(o,"failureRate"),l=Tb(o,"affectedSessionCount"),c=qx(o.failureClassBreakdown),d=qx(o.excludedByClass),u=vhe(o.sessionIds).slice().sort(),m=She(o.seqs),f=Hl(e,{minFailures:4}),g=Hl(e,{minFailureRate:.7}),h=!f.some(k=>k.slug===zl),y=!g.some(k=>k.slug===zl),b={"policy-refusal":1,"permission-denied":1,abort:1,"hook-block":1,"elicitation-declined":1},w={timeout:1,unclassified:2},S=[Te({name:"classification-fires-on-dual-threshold",description:"A tool clearing BOTH the failure-count and failure-rate floors yields exactly one card at the recorded magnitude",pass:t.length===1&&n!==void 0&&i===3&&s===5&&a===.6,expected:`1 card '${zl}' with failureCount=3, totalCalls=5, failureRate=0.6`,actual:n===void 0?`no '${zl}' card; ${t.length} card(s): [${t.map(k=>k.slug).join(", ")}]`:`${t.length} card(s); failureCount=${i}, totalCalls=${s}, failureRate=${a}`}),Te({name:"classification-excludes-system-said-no-classes",description:"policy-refusal / permission-denied / hook-block / abort / elicitation-declined are excluded from BOTH numerator and denominator and never manufacture a card alone",pass:PG(d,b)&&i===3&&s===5&&r===void 0,expected:"excludedByClass={policy-refusal:1,permission-denied:1,abort:1,hook-block:1,elicitation-declined:1}; counts not inflated; refusal-only tool yields NO card",actual:`excludedByClass=${JSON.stringify(d)}; failureCount=${i}, totalCalls=${s}; refusal_only_tool card ${r===void 0?"absent":"PRESENT"}`}),Te({name:"classification-excludes-circuit-breaker",description:"A circuitBreaker-synthesised completion is skipped before classification \u2014 it inflates neither totalCalls nor the unclassified count, and never lands in excludedByClass",pass:s===5&&c.unclassified===2&&d.circuitBreaker===void 0,expected:"totalCalls=5 (breaker not counted); unclassified=2 (breaker not folded in); no circuitBreaker key in excludedByClass",actual:`totalCalls=${s}; unclassified=${c.unclassified??0}; excludedByClass keys=[${Object.keys(d).join(", ")}]`}),Te({name:"classification-counts-timeout-and-unclassified",description:"timeout and unclassified (no failureClass) failures DO count toward the failure stats",pass:PG(c,w),expected:"failureClassBreakdown={timeout:1,unclassified:2}",actual:`failureClassBreakdown=${JSON.stringify(c)}`}),Te({name:"classification-respects-thresholds",description:"The card drops out when EITHER the count floor or the rate floor is raised above the recorded magnitude (dual AND threshold)",pass:h&&y,expected:"minFailures=4 \u2192 no card (count gate); minFailureRate=0.7 \u2192 no card (rate gate)",actual:`count gate ${h?"held":"LEAKED"}; rate gate ${y?"held":"LEAKED"}`}),Te({name:"classification-reports-affected-sessions-and-seqs",description:"The card reports the distinct affected sessions and per-failure seqs in deterministic order",pass:l===2&&JSON.stringify(u)===JSON.stringify(["tfd-sess-a","tfd-sess-b"])&&JSON.stringify(m)===JSON.stringify([1,2,0]),expected:"affectedSessionCount=2; sessionIds=[tfd-sess-a,tfd-sess-b]; seqs=[1,2,0]",actual:`affectedSessionCount=${l}; sessionIds=[${u.join(",")}]; seqs=[${m.join(",")}]`})],T=[{kind:"source-symbol",ref:"src/improve/scan/detectors/tool-failure-density.ts#detectToolFailureDensity",detail:n===void 0?`synthetic corpus \u2192 ${t.length} card(s); '${zl}' absent`:`synthetic corpus \u2192 flaky_tool ${i}/${s} (rate ${a}); breakdown ${JSON.stringify(c)}`},{kind:"observed-behavior",ref:"detectToolFailureDensity (EXCLUDED_FAILURE_CLASSES + circuitBreaker exclusion)",detail:`excludedByClass=${JSON.stringify(d)}; refusal_only_tool card ${r===void 0?"absent":"PRESENT"}`}];return{checks:S,evidence:T}}async function The(){let e=await bhe(),t=khe();return{checks:[...e.checks,...t.checks],evidence:[...e.evidence,...t.evidence]}}async function Ehe(){let e=Oi("abort"),t=Oi("model_end_turn"),n=[Te({name:"abort-closure-has-guidance",description:"An abort closure maps to a non-empty recovery hint",pass:typeof e=="string"&&e.trim().length>0,expected:"non-empty guidance string for reason=abort",actual:e===null?"null (no guidance)":Qt(e)}),Te({name:"guidance-names-a-recovery-action",description:"The abort hint names a concrete next action (resume / re-run)",pass:e!==null&&/\b(resume|re-run|rerun|retry)\b/i.test(e),expected:"hint mentions resume / re-run",actual:e===null?"null":Qt(e)}),Te({name:"guidance-is-the-canonical-constant",description:"The wired hint is the exported CLOSURE_ABORT_RECOVERY_HINT (no drift)",pass:e===Bk,expected:'buildClosureGuidance("abort") === CLOSURE_ABORT_RECOVERY_HINT',actual:e===null?"null":Qt(e)}),Te({name:"benign-closure-has-no-guidance",description:"A clean model_end_turn close carries no false-positive guidance",pass:t===null,expected:"null for reason=model_end_turn",actual:t===null?"null":Qt(t)})],r=[{kind:"source-symbol",ref:"src/agent/session/closure-guidance.ts#buildClosureGuidance",detail:e===null?"null":Qt(e)},{kind:"source-symbol",ref:"src/agent/session/agent-session.ts (emitClosure: attaches guidance to closure event)",detail:"buildClosureGuidance(reason) \u2192 closure payload .guidance"}];return{checks:n,evidence:r}}var zx=Object.freeze([{id:"repeat-loop-circuit-breaker",patternId:"repeated-tool-use",title:"Repeat-loop circuit breaker trips at the consecutive-identical threshold",run:ghe},{id:"skill-max-depth-recovery-hint",patternId:"subagent-block",title:"Skill max-depth refusal carries an actionable recovery hint",run:hhe},{id:"tool-failure-density-enabled",patternId:"tool-failure-density",title:"tool-failure-density detector is enabled by default and classifies a known failure mix correctly",run:The},{id:"closure-abort-recovery-hint",patternId:"closure-anomaly",title:"Anomalous abort closure carries an actionable recovery hint",run:Ehe}]);function MG(e){return zx.find(t=>t.patternId===e)}function OG(){return zx.map(e=>e.patternId)}function $G(){return zx.map(e=>e.id)}Ic();wg();var xb="replay:",DG=`${xb}fixture-reproduces-pattern`,BG=`${xb}guardrail-neutralizes-recorded-loop`,FG=`${xb}fixture-reproduces-closure-anomaly`,UG=`${xb}guardrail-guides-recorded-closure`,LG="The committed fixture still reproduces the recorded repeated-tool-use loop when re-scanned by the detector",xhe=Object.freeze({replay:"byte-identical-input"}),Rhe=async(e,t)=>{let n=async()=>({content:"replay-probe-ok"}),r=new Kt({handlers:new Map([[e,n]]),schemas:[],hookRegistry:void 0,permissions:{allowedTools:[e]}}),o=new AbortController().signal,i=null,s=0;for(let a=1;a<=t;a++){let l={id:`replay-${a}`,name:e,input:xhe,signal:o},c=await r.execute(l);if(s=a,c.circuitBreaker===!0){i=a;break}}return{trippedAtCall:i,callsDriven:s}};function Eb(e){let t=e.detail.runLength;return typeof t=="number"?t:0}async function Ahe(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=jl({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=lb([s],{minRepeats:Jr}),l=e.provenance.fingerprintAtGeneration,c=l?a.find(w=>w.detail.fingerprint===l):void 0,d=[...a].sort((w,S)=>Eb(S)-Eb(w))[0],u=c??d;if(u===void 0)return r.push(Te({name:DG,description:LG,pass:!1,status:"skipped",expected:l?`detector finds a run with fingerprint ${l.slice(0,12)}\u2026`:"detector finds \u22651 repeated-tool-use run in the fixture",actual:`detector found ${a.length} run(s); none matched \u2014 replay skipped (eval-case may be stale or misgenerated)`})),o.push({kind:"fixture",ref:e.replay.fixturePath,detail:"fixture did not reproduce the repeated-tool-use pattern; replay skipped (no loop to re-drive)"}),{checks:r,evidence:o};r.push(Te({name:DG,description:LG,pass:!0,expected:l?`detector finds a run with fingerprint ${l.slice(0,12)}\u2026`:"detector finds \u22651 repeated-tool-use run in the fixture",actual:`found '${String(u.detail.toolName)}' \xD7${Eb(u)}`}));let m=String(u.detail.toolName),f=Eb(u),g=n.driveLoop??Rhe,h=Math.min(f,Vs),y=await g(m,h),b=y.trippedAtCall!==null&&y.trippedAtCall<=f;return r.push(Te({name:BG,description:"Re-driving the recorded loop through the live guardrail trips the circuit breaker at or before the recorded length",pass:b,expected:`circuit breaker trips at call \u2264 ${f} (recorded run length)`,actual:y.trippedAtCall===null?`no trip within ${y.callsDriven} call(s) \u2014 recorded loop of ${f} would still complete`:`tripped at call ${y.trippedAtCall}`})),o.push({kind:"observed-behavior",ref:"SessionToolDispatcher.execute (repeat-loop circuit breaker)",detail:`'${m}' recorded \xD7${f}; live breaker ${y.trippedAtCall===null?"did NOT trip":`tripped at call ${y.trippedAtCall}`} (threshold ${Vs})`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded loop on '${m}' (run length ${f})`}),{checks:r,evidence:o}}function Che(e){let t=e.detail.closureReason;return typeof t=="string"?t:null}function _he(e){let t=e.detail.seqs;return Array.isArray(t)?t.filter(n=>typeof n=="number"):[]}var NG="The committed fixture still reproduces the recorded anomalous closure when re-scanned by the detector";async function Ihe(e,t,n){let r=[],o=[],i=t.toString("utf8"),s=jl({sessionId:e.replay.sourceSessionId,tracePath:e.replay.sourceTracePath,relativeTracePath:e.replay.sourceTracePath,content:i,sessionMtimeMs:0}),a=cb([s],{minOccurrences:1}),l=Math.max(...e.replay.evidenceEventIndices),d=a.find(h=>_he(h).includes(l))??a[0];if(d===void 0)return r.push(Te({name:FG,description:NG,pass:!1,status:"skipped",expected:"detector finds \u22651 anomalous closure in the fixture",actual:`detector found ${a.length} closure-anomaly finding(s); none matched \u2014 replay skipped (eval-case may be stale or misgenerated)`})),o.push({kind:"fixture",ref:e.replay.fixturePath,detail:"fixture did not reproduce an anomalous closure; replay skipped (no closure to re-drive)"}),{checks:r,evidence:o};let u=Che(d)??"";r.push(Te({name:FG,description:NG,pass:!0,expected:"detector finds \u22651 anomalous closure in the fixture",actual:`found closure.reason='${u}' (seq ${l})`}));let f=(n.buildGuidance??Oi)(u),g=f!==null&&f.trim().length>0;return r.push(Te({name:UG,description:"Re-driving the recorded closure reason through the live guardrail yields actionable recovery guidance",pass:g,expected:`buildClosureGuidance('${u}') returns a non-empty recovery hint`,actual:g?Qt(f):`no guidance for reason '${u}' \u2014 the recorded closure anomaly would still surface with no recovery path`})),o.push({kind:"observed-behavior",ref:"buildClosureGuidance (closure-anomaly recovery hint)",detail:`closure.reason='${u}'; live guardrail ${g?"returned a recovery hint":"returned no guidance"}`},{kind:"fixture",ref:e.replay.fixturePath,detail:`replayed recorded closure reason '${u}'`}),{checks:r,evidence:o}}var Phe=Object.freeze([{patternId:"repeated-tool-use",run:Ahe},{patternId:"closure-anomaly",run:Ihe}]),Mhe=[BG,UG];function Jx(e){return Mhe.includes(e)}function jG(e){return Phe.find(t=>t.patternId===e)}var Fhe="eval-run@v1";function KG(e,t={}){let n=(t.now??(()=>new Date))(),r=Lhe(n),o=t.randomSuffix!==void 0?t.randomSuffix():Ohe(3).toString("hex");if(!/^[0-9a-f]{6}$/.test(o))throw new Error(`generateEvalRunId: randomSuffix must be 6 lowercase hex chars (got '${o}')`);return`${e}-run-${r}-${o}`}function Lhe(e){let t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0");return`${t}${n}${r}`}async function GG(e,t){let r=(t.now??(()=>new Date))().toISOString(),o=t.clockMs??(()=>Date.now()),i=o(),s=[],a=[],l=[],c=Bhe(e,t);s.push(c.check),c.evidence&&a.push(c.evidence);let d=MG(e.assertion.patternId),u=null,m=!1;if(!d)l.push({at:r,text:`No deterministic validation contract is registered for pattern '${e.assertion.patternId}'. Supported: ${OG().join(", ")}.`});else{u=d.id;try{let T=await d.run();s.push(...T.checks),a.push(...T.evidence)}catch(T){m=!0;let k=T instanceof Error?T.message:String(T);l.push({at:r,text:`Contract '${d.id}' threw during execution: ${Qt(k)}`})}}let f=jG(e.assertion.patternId),g=!1;if(f&&c.bytes!==void 0&&c.check.status==="pass")try{let T=await f.run(e,c.bytes,{...t.driveLoop?{driveLoop:t.driveLoop}:{}});s.push(...T.checks),a.push(...T.evidence),g=!0}catch(T){m=!0;let k=T instanceof Error?T.message:String(T);l.push({at:r,text:`Fixture-replay for '${e.assertion.patternId}' threw during execution: ${Qt(k)}`})}let h=s.some(T=>Jx(T.name)),y=f!==void 0&&c.check.status==="pass"&&g&&!h,b=Nhe({hasContract:d!==void 0||g,contractThrew:m,checks:s,replayInconclusive:y}),w=Math.max(0,Math.round(o()-i)),S={schemaVersion:1,evalRunId:t.evalRunId,evalCaseId:e.evalCaseId,cardSlug:e.cardSlug,patternId:e.assertion.patternId,contract:u,status:b,createdAt:r,durationMs:w,checks:s,evidence:a,runner:{version:Fhe,mode:"deterministic"},notes:l};return Bx.parse(S),S}function Nhe(e){return e.contractThrew?"error":e.checks.some(t=>t.status==="fail")?"fail":!e.hasContract||e.replayInconclusive===!0?"unsupported":"pass"}function Bhe(e,t){let r=(t.resolveFixtureAbsPath??(d=>Dhe(Ce(),d)))(e.replay.fixturePath),o=e.replay.sliceSha256,i="fixture-integrity",s="Committed replay fixture exists and matches the eval-case's recorded sha256";if(!Vx(r))return{check:Te({name:i,description:s,pass:!1,expected:`fixture present at ${e.replay.fixturePath}`,actual:"fixture file not found on disk"})};let a;try{a=$he(r)}catch(d){let u=d instanceof Error?d.message:String(d);return{check:Te({name:i,description:s,pass:!1,expected:`readable fixture (${o})`,actual:`read error: ${Qt(u)}`})}}let l=bb(a),c=l===o;return{check:Te({name:i,description:s,pass:c,expected:o,actual:l}),evidence:{kind:"fixture",ref:e.replay.fixturePath,detail:`sha256 ${c?"match":"MISMATCH"} (${e.replay.sliceLineCount} lines)`},bytes:a}}function qG(e){let t=Bx.parse(e),n=Ul();Vx(n)||HG(n,{recursive:!0});let r=NK(t.evalRunId),o=BK(t.evalRunId);return Whe(r,t),Khe(o,Qx(t)),Hhe({timestamp:new Date().toISOString(),event:"created",evalRunId:t.evalRunId,evalCaseId:t.evalCaseId,cardSlug:t.cardSlug,patternId:t.patternId,contract:t.contract,status:t.status}),{evalRunId:t.evalRunId,jsonPath:r,markdownPath:o}}var Uhe={pass:"\u2713 PASS",fail:"\u2717 FAIL",unsupported:"\u2013 UNSUPPORTED",error:"\u26A0 ERROR"},jhe={pass:"\u2713",fail:"\u2717",skipped:"\u2013"};function Qx(e){let t=e.checks.filter(s=>s.status==="pass").length,n=e.checks.filter(s=>s.status==="fail").length,r=e.checks.filter(s=>s.status==="skipped").length,o=[];if(o.push(`# ${e.evalRunId} \u2014 \`eval-run\` \u2014 \`${e.status}\``),o.push(""),o.push(`Deterministic guardrail validation of eval-case \`${e.evalCaseId}\`.`),o.push(""),o.push(`**Eval-case:** \`${e.evalCaseId}\` \xB7 **Card:** \`${e.cardSlug}\` \xB7 **Pattern:** \`${e.patternId}\` \xB7 **Contract:** ${e.contract?`\`${e.contract}\``:"_(none)_"} \xB7 **Created:** ${e.createdAt} \xB7 **Duration:** ${e.durationMs}ms`),o.push(""),e.checks.some(s=>Jx(s.name))?(o.push("> **What this is.** A deterministic validation of pattern"),o.push(`> \`${e.patternId}\`. It re-drove the failure recorded in the committed`),o.push("> fixture through the LIVE guardrail and asserts the recorded failure is"),o.push("> neutralised at the recorded magnitude \u2014 proving the behaviour is fixed,"),o.push("> not merely that a guardrail exists. It re-drives the recorded failure"),o.push("> conditions; it does NOT re-execute the original tool/LLM.")):(o.push("> **What this is.** A narrow, deterministic check that the guardrail"),o.push(`> mapped to pattern \`${e.patternId}\` is present and behaving. It`),o.push("> validates the guardrail the pattern maps to; the eval-case's own"),o.push("> `pattern-absent` assertion remains the full contract.")),o.push(""),o.push(`## Result: ${Uhe[e.status]} (${t}/${e.checks.length} checks passed${n?`, ${n} failed`:""}${r?`, ${r} skipped`:""})`),o.push(""),o.push("## Checks"),o.push(""),e.checks.length===0)o.push("_(none)_");else{o.push("| Check | Status | Expected | Actual |"),o.push("|---|---|---|---|");for(let s of e.checks)o.push(`| ${Yx(s.name)} | ${jhe[s.status]} ${s.status} | ${Yx(s.expected)} | ${Yx(s.actual)} |`)}if(o.push(""),o.push("## Evidence"),o.push(""),e.evidence.length===0)o.push("_(none)_");else for(let s of e.evidence)o.push(`- **[${s.kind}]** \`${s.ref}\` \u2014 ${s.detail}`);if(o.push(""),o.push("## Runner"),o.push(""),o.push(`- **Version:** \`${e.runner.version}\` \xB7 **Mode:** \`${e.runner.mode}\``),o.push(""),o.push("## Notes"),o.push(""),e.notes.length===0)o.push("_(none)_");else for(let s of e.notes)o.push(`- _${s.at}_ \u2014 ${s.text}`);return o.push(""),o.join(`
1975
1975
  `)}function Yx(e){return e.replace(/\|/g,"\\|").replace(/\n/g," ")}function Hhe(e){let t=QK.parse(e),n=Ul();Vx(n)||HG(n,{recursive:!0});try{Xx(LK(),JSON.stringify(t)+`