{
  "cfg.section.output.title": "Output",
  "cfg.output.verbosity": "verbosity",
  "cfg.output.effort_routing": "effort routing",
  "cfg.output.about": "Reduce the tokens the model generates: verbosity steering trims preamble/restatement; effort routing (opt-in) lowers reasoning effort on trivial prompts.",
  "cfg.output.change_hint": "Change at runtime: /config output concise | minimal | full ; /config output effort on|off",
  "cfg.output.set_ok": "verbosity: %s -> %s",
  "cfg.output.set_noop": "verbosity already %s",
  "cfg.output.set_invalid": "invalid output setting: %s",
  "cfg.output.set_valid": "valid: full | concise | minimal ; effort on|off",
  "cfg.output.persist_hint": "set CHATCLI_OUTPUT_VERBOSITY=%s in .env to persist",
  "cfg.output.effort_invalid": "invalid effort value: %s (use on|off)",
  "cfg.output.effort_set": "effort routing %s",
  "cfg.output.usage_header": "Usage - /config output",
  "cfg.output.usage_status": "show status",
  "cfg.output.usage_concise": "trim ceremony, keep substance (default)",
  "cfg.output.usage_minimal": "fewest correct tokens",
  "cfg.output.usage_full": "no steering",
  "cfg.output.usage_effort": "lower effort on trivial prompts (opt-in)",
  "cfg.output.usage_note": "Changes apply immediately; set CHATCLI_OUTPUT_VERBOSITY / CHATCLI_OUTPUT_EFFORT_ROUTING in .env for a permanent default.",
  "complete.config.output_concise": "trim ceremony, keep substance (default)",
  "complete.config.output_minimal": "fewest correct tokens",
  "complete.config.output_full": "no steering (natural verbosity)",
  "complete.config.output_effort": "complexity-based effort routing (opt-in)",
  "complete.config.output_effort_on": "enable effort downgrade on trivial prompts",
  "complete.config.output_effort_off": "disable effort routing",
  "chat.envelope.compression_saved": "%s saved",
  "cfg.section.compression.title": "Compression",
  "cfg.compression.mode": "mode",
  "cfg.compression.saved": "saved",
  "cfg.compression.ccr_store": "CCR store",
  "cfg.compression.ccr_stale": "%d stale",
  "cfg.compression.ccr_oldest": "oldest %s",
  "cfg.compression.prune_ok": "pruned %d entries (%s freed) — %d remaining",
  "cfg.compression.prune_none": "CCR store already clean — %d entries",
  "cfg.compression.calls": "calls",
  "cfg.compression.about": "Content-aware, reversible compression of bulky tool output (search/log/diff/JSON). Originals stay recoverable with @recall.",
  "cfg.compression.change_hint": "Change at runtime: /config compression lossy | lossless | off",
  "cfg.compression.unavailable": "compression layer unavailable in this session",
  "cfg.compression.set_ok": "compression mode: %s -> %s",
  "cfg.compression.set_noop": "compression mode already %s",
  "cfg.compression.set_invalid": "invalid compression mode: %s",
  "cfg.compression.set_valid": "valid modes: off | lossless | lossy",
  "cfg.compression.persist_hint": "set CHATCLI_COMPRESSION=%s in .env to persist",
  "cfg.compression.usage_header": "Usage - /config compression",
  "cfg.compression.usage_status": "show status & savings",
  "cfg.compression.usage_lossy": "full reduction, reversible via @recall",
  "cfg.compression.usage_lossless": "lossless reductions only",
  "cfg.compression.usage_off": "disable compression",
  "cfg.compression.usage_stats": "per-strategy savings summary",
  "cfg.compression.usage_prune": "curate now (drop TTL-expired + evict to cap)",
  "cfg.compression.usage_note": "Mode changes apply immediately; set CHATCLI_COMPRESSION in .env for a permanent default.",
  "complete.config.compression_lossy": "full reduction, reversible via @recall",
  "complete.config.compression_lossless": "lossless reductions only (no dropping)",
  "complete.config.compression_off": "disable compression",
  "complete.config.compression_stats": "session savings summary",
  "complete.config.compression_prune": "curate the CCR store now (TTL + size cap)",
  "complete.root.provider": "Switch the active LLM provider (navigable list)",
  "complete.provider.item": "available provider",
  "complete.provider.current": "current provider",
  "cli.provider.current": "Active provider: %s. Available:",
  "cli.provider.hint": "Use /provider <name> to switch (or just /provider for the list).",
  "cli.provider.unknown": "Unknown provider: %s. Use /provider to list the available ones.",
  "palette.ui.run_bare": "run without arguments",
  "palette.cat.core": "Core",
  "palette.cat.model": "Model",
  "palette.cat.session": "Session",
  "palette.cat.context": "Context",
  "palette.cat.agent": "Agent & Build",
  "palette.cat.quality": "Quality",
  "palette.cat.integrations": "Integrations",
  "palette.cat.scheduler": "Scheduler",
  "palette.cat.system": "System",
  "palette.ui.title": "Command Palette",
  "palette.ui.filter_prompt": "Filter:",
  "palette.ui.no_match": "No matching commands",
  "palette.ui.hint": "↑/↓ move · enter select · → drill in · ⌫/esc back · tab insert · ctrl+c cancel",
  "palette.ui.more": "+%d more…",
  "palette.ui.mode_badge": "mode",
  "complete.root.menu": "Open the interactive command palette",
  "welcome.title": "Bringing Your Terminal Closer to Artificial Intelligence 🕵️‍♂️✨",
  "welcome.tip.title": "Did You Know?",
  "welcome.footer.help.cmd": "/help",
  "welcome.footer.help.desc": "for all commands",
  "welcome.footer.exit.cmd": "/exit",
  "welcome.footer.exit.desc": "to quit",
  "welcome.footer.switch_model.cmd": "/switch --model",
  "welcome.footer.switch_model.desc": "to change model",
  "welcome.current_model": "🤖 You are chatting with %s (%s)",
  "welcome.auth_hint": "Use /auth login anthropic | openai-codex | github-copilot to authenticate.",
  "tip.add_file": "Use '@file <path>' to add file content to the context.",
  "tip.git_context": "Use '@git' to include status and recent commits from your repository.",
  "tip.exec_command": "Need to run a command? Use '@command <your_command>'.",
  "tip.switch_provider": "Switch between AI providers at any time with the '/switch' command.",
  "tip.new_session": "Clear the history and start a new conversation with '/newsession'.",
  "tip.view_config": "Check your current configuration (no secrets!) with the '/config' command.",
  "tip.cancel_request": "Press Ctrl+C once to cancel an AI response without exiting the chat.",
  "tip.agent_mode": "Use agent mode with '/agent <task>' to have the AI execute commands for you.",
  "tip.agent_toggle_view": "In Agent Mode, use 'p' to toggle between COMPACT and FULL view.",
  "tip.agent_output_actions": "In Agent Mode, use 'vN' to open full output in pager and 'wN' to save to a file.",
  "tip.agent_last_result": "The 'Last Result' in Agent Mode is always anchored to the footer, no need to scroll.",
  "version.label": "Version: %s (commit: %s)",
  "help.header.title": "Complete Guide to ChatCLI Commands",
  "help.header.subtitle1": "Here is an exhaustive map of all available commands, subcommands, flags, and options.",
  "help.header.subtitle2": "Use them to control the application, add context, or automate tasks.",
  "help.section.general": "General Control",
  "help.command.help": "Shows this complete help screen.",
  "help.command.exit": "Exits the application.",
  "help.command.newsession": "Clears the current conversation history and starts a new session (alias for /session new).",
  "help.command.version": "Shows version, commit hash, build date, and checks for updates.",
  "help.section.config": "Configuration and AI Providers",
  "help.command.switch": "Opens the interactive menu to change the LLM provider (e.g., OPENAI, CLAUDEAI).",
  "help.command.switch_model": "Changes the model for the current provider (e.g., gpt-4o-mini, grok-4, gpt-5... etc).",
  "help.command.model": "Shorthand for /switch --model: changes only the current provider's model.",
  "help.command.maxtokens": "Shorthand for /switch --max-tokens: caps output tokens (0 = provider default).",
  "help.command.switch_model_example": "(Changes to the GPT-4o Mini model on OpenAI)",
  "help.command.switch_max_tokens": "Sets the maximum tokens for the next responses (0 for provider default).",
  "help.command.switch_realm": "Updates the 'realm/tenant' (StackSpot only).",
  "help.command.switch_agent_id": "Updates the 'Agent ID' (StackSpot only).",
  "help.command.config": "Displays the current configuration (provider, model, keys, etc.).",
  "help.command.reload": "Reloads the configuration variables from your .env file in real-time.",
  "help.section.context": "Adding Context to Prompts",
  "help.command.file": "Adds the content of a file or directory to the prompt.",
  "help.command.file_mode_full": "(Default) Sends the full content, truncating if necessary.",
  "help.command.file_mode_chunked": "For large projects, splits content into manageable chunks.",
  "help.command.file_mode_summary": "Sends only the file structure, without the content.",
  "help.command.file_mode_smart": "The AI selects the most relevant files for your question.",
  "help.command.file_mode_example": "Ex: @file --mode=smart ./src How does login work?",
  "help.command.git": "Adds status, branch, remotes, and recent Git commits.",
  "help.command.history": "Adds the last commands from your shell history (bash/zsh/fish).",
  "help.command.env": "Adds environment variables (sensitive values are redacted).",
  "help.section.chunks": "Large File Management (Chunks)",
  "help.command.nextchunk": "Sends the next project chunk to the AI.",
  "help.command.retry": "Tries to resend the last failed chunk.",
  "help.command.retryall": "Tries to resend all failed chunks.",
  "help.command.skipchunk": "Skips a chunk with an error and proceeds to the next.",
  "help.section.exec": "Executing Terminal Commands",
  "help.command.command": "Executes a command and adds its output to the prompt.",
  "help.command.command_example": "(Executes 'ls -la' and appends the result)",
  "help.command.command_i": "Executes an interactive command (e.g., vim) without adding output to the prompt.",
  "help.command.command_ai": "Executes a command and sends the output DIRECTLY to the AI.",
  "help.command.command_ai_example": "(Sends git diff for AI analysis)",
  "help.command.command_ai_context": "Same as above, but adds context/question.",
  "help.command.command_ai_context_example": "Ex: @command --ai cat err.log > summarize this error",
  "help.section.agent": "Agent Mode (Task Execution)",
  "help.section.coder": "Coder Mode (Software Engineering)",
  "help.command.coder": "Starts software engineer mode (uses tools/plugins via <tool_call>).",
  "help.command.coder_example": "Example: /coder fix failing tests and apply minimal refactor",
  "help.command.coder_notes": "Notes:",
  "help.command.coder_note_plugin": "• Requires the @coder plugin installed (see: /plugin list).",
  "help.command.coder_note_auto_tools": "• Runs tools automatically (ReAct loop).",
  "help.command.agent": "Asks the AI to plan and execute commands to solve a task.",
  "help.command.run": "An alias for the /agent command.",
  "help.command.agent_example": "Ex: /agent list all .go files and count their lines",
  "help.command.agent_inside": "Inside agent mode:",
  "help.command.agent_exec_n": "Executes a specific command (e.g., 1 for the first).",
  "help.command.agent_exec_all": "Executes ALL suggested commands in sequence.",
  "help.command.agent_edit": "Edits command N before executing (e.g., e1).",
  "help.command.agent_dry_run": "Simulates (dry-run) command N (e.g., t2).",
  "help.command.agent_continue": "Asks AI for continuation with the output of command N (e.g., c2).",
  "help.command.agent_pre_context": "Adds context to command N BEFORE executing (e.g., pc1).",
  "help.command.agent_post_context": "Adds context to the OUTPUT of command N (e.g., ac1).",
  "help.command.agent_view": "Opens the full output of command N in pager (less -R/more).",
  "help.command.agent_save": "Saves the output of command N to a temporary file.",
  "help.command.agent_toggle_plan": "Toggles plan view: COMPACT ↔ FULL.",
  "help.command.agent_redraw": "Refreshes the screen (clear + redraw).",
  "help.command.agent_quit": "Exits agent mode.",
  "help.command.agent_notes": "Notes:",
  "help.command.agent_last_result": "• Last Result is always anchored to the footer (preview).",
  "help.command.agent_compact_plan": "• COMPACT Plan shows 1 line per command (status + desc + 1st code line).",
  "help.command.agent_full_plan": "• FULL Plan shows a card with description, type, risk, and formatted code block.",
  "help.section.sessions": "Session Management",
  "help.command.session_save": "Saves the current session with a name (e.g., /session save my-chat).",
  "help.command.session_load": "Loads a saved session (e.g., /session load my-chat).",
  "help.command.session_list": "Lists all saved sessions.",
  "help.command.session_delete": "Deletes a saved session (e.g., /session delete my-chat).",
  "help.command.session_new": "Starts a new clean session (alias for /newsession).",
  "help.section.oneshot": "Non-Interactive Mode (One-Shot, for scripts and pipes)",
  "help.command.oneshot_p": "Executes a prompt once and exits.",
  "help.command.oneshot_p_example": "Ex: chatcli -p \"Explain this repository.\"",
  "help.command.oneshot_prompt": "Alias for -p.",
  "help.command.oneshot_provider": "Overrides the provider (e.g., --provider OPENAI).",
  "help.command.oneshot_model": "Overrides the model (e.g., --model gpt-4o-mini).",
  "help.command.oneshot_agent_id": "Overrides agent (stackSpot only)-(e.g. --agent-id 1290XSBD00384).",
  "help.command.oneshot_max_tokens": "Overrides the maximum tokens for the response.",
  "help.command.oneshot_timeout": "Timeout for the call command (e.g., --timeout 5m, default: 5m).",
  "help.command.oneshot_no_anim": "Disables animations (useful in scripts/CI).",
  "help.command.oneshot_auto_exec": "In one-shot agent mode, automatically executes the first suggested command if safe.",
  "help.command.oneshot_pipes": "Piping (stdin): Send data via pipe (e.g., git diff | chatcli -p \"Summarize changes.\").",
  "help.section.tips": "General Tips and Shortcuts",
  "help.command.tips_cancel": "Cancel (Ctrl+C): Press Ctrl+C once during 'Thinking...' to cancel.",
  "help.command.tips_exit": "Quick Exit (Ctrl+D): Press Ctrl+D on an empty prompt to exit ChatCLI.",
  "help.command.tips_operator": "Operator '>': Use '>' to add context to prompts (e.g., @git > Create a release note).",
  "help.command.tips_agent_p": "Agent Mode: p - Toggles COMPACT/FULL plan (useful to focus on the flow).",
  "help.command.tips_agent_v": "Agent Mode: vN - Opens command N's output in pager (for long reads without clutter).",
  "help.command.tips_agent_w": "Agent Mode: wN - Saves command N's output to a temp file (to share or attach).",
  "help.command.tips_agent_r": "Agent Mode: r - Redraws the screen (clear) keeping focus on 'Last Result'.",
  "help.section.plugins": "Plugin Management",
  "help.command.plugin_list": "Lists all installed plugins.",
  "help.command.plugin_install": "Installs a plugin from a Git repository.",
  "help.command.plugin_show": "Shows usage details for a specific plugin.",
  "help.command.plugin_inspect": "Shows debugging information for a plugin.",
  "status.reloading_config": "Reloading configurations...",
  "status.reload_success_preserved": "Configurations reloaded successfully! (current provider/model preserved)",
  "status.reload_fail_preserve": "Failed to preserve provider/model after reload; falling back to .env values",
  "status.reload_embed_provider": "Embedding provider reconfigured: %s",
  "status.reload_success": "Configurations reloaded successfully!",
  "status.reload_fail_client": "Failed to reconfigure LLM client after reload.",
  "status.operation_canceled": "🛑 Operation canceled successfully!",
  "status.provider_switched": "Switched to %s (%s)",
  "status.exiting": "Goodbye!",
  "status.agent_mode_enter": "\n🤖 Entering agent mode with query: \"%s\"\n",
  "status.agent_mode_description": "The agent will analyze your request and suggest commands to solve it.",
  "status.agent_mode_exit": "\n ✅ Returning to chat...",
  "prompt.select_provider": "Choose the provider (by number): ",
  "prompt.confirm_exit": "\nGoodbye!! Double CTRL+C...",
  "prompt.cancel_op": "\n⚠️ Ctrl+C triggered - Canceling operation...",
  "error.generic": "❌ Error: %s",
  "error.invalid_choice_normal_mode": "Invalid choice. Returning to normal mode.",
  "error.unknown_command": "Unknown command. Use /help to see available commands.",
  "error.agent_query_extraction": "Error: could not extract agent query.",
  "error.agent_mode_error": " ❌ Error in agent mode: %v",
  "hub.cmd.not_connected": "/hub commands require a connection to a hub-enabled server (use /connect)",
  "hub.cmd.usage": "usage: /hub [whoami | bind <platform> <userid> [principal] | bindings [principal]]",
  "hub.cmd.bind_usage": "usage: /hub bind <platform> <userid> [principal]  (empty principal = yourself)",
  "hub.cmd.bound": "binding created: %s:%s",
  "hub.cmd.no_bindings": "no bindings",
  "complete.confighub.set": "Set a hub setting (persists in db, read by the gateway)",
  "complete.confighub.reset": "Reset a setting (back to env/default)",
  "complete.confighub.enabled": "Turn the hub on/off (on/off)",
  "complete.confighub.principal": "Shared conversation identity",
  "complete.confighub.isolate": "Isolate each channel (multi-user bot) (on/off)",
  "complete.confighub.principal_known": "known principal",
  "complete.confighub.ttl_6h": "6 hours",
  "complete.confighub.ttl_24h": "24 hours (default)",
  "complete.confighub.ttl_72h": "3 days",
  "complete.confighub.ttl_168h": "7 days",
  "complete.confighub.ttl_0": "disable purging",
  "complete.confighub.ttl": "Hours before pruning an idle conversation",
  "complete.hub.whoami": "Show your principal and active conversation",
  "complete.hub.bind": "Bind a channel identity to a principal",
  "complete.hub.bindings": "List channel→principal bindings",
  "complete.root.hub": "Inspect/manage the shared cross-channel conversation (hub)",
  "help.command.hub": "Inspect the shared conversation and manage channel bindings (whoami/bind/bindings)",
  "hub.resumed": "resumed shared conversation (%d messages from other channels)",
  "hub.via_channel": "[via %s]",
  "session.new_session_started": "New conversation session started; history has been cleared.",
  "session.usage_header": "Usage of /session command:",
  "session.usage_save": "  /session save <name>",
  "session.usage_load": "  /session load <name>",
  "session.usage_list": "  /session list",
  "session.usage_search": "  /session search <query>",
  "session.search.usage": "Usage: /session search <query>",
  "session.search.error": "Error searching sessions: %v",
  "session.search.none": "No saved session matches %q.",
  "session.search.header": "Sessions matching %q",
  "session.search.match_count": "%d match(es)",
  "ratelimit.title": "Rate Limits (from provider headers)",
  "ratelimit.empty": "No rate-limit data captured yet. Make a request first.",
  "ratelimit.requests": "requests",
  "ratelimit.tokens": "tokens",
  "ratelimit.used_pct": "%d%% used",
  "ratelimit.resets_in": "resets in %ds",
  "export.empty": "Nothing to export — the conversation is empty.",
  "export.done": "Exported %d turns to %s",
  "complete.root.export": "Export the conversation as a JSONL trajectory",
  "complete.root.moa": "Mixture-of-Agents: query several models and synthesize",
  "complete.root.gateway": "Run as a messaging daemon (Telegram, etc.)",
  "complete.gateway.start": "Start the messaging daemon",
  "complete.gateway.stop": "Stop the messaging daemon",
  "complete.gateway.status": "List registered/configured platforms",
  "complete.root.lsp": "Run a language server and show diagnostics for a file",
  "lsp.usage": "Usage: /lsp <file>",
  "lsp.unsupported": "No language server configured for %s files.",
  "lsp.starting": "Starting language server: %s...",
  "lsp.spawn_failed": "Could not start %s (is it installed?): %v",
  "lsp.no_response": "No diagnostics received within the timeout.",
  "lsp.header": "Diagnostics for %s",
  "lsp.clean": "No problems found.",
  "gateway.usage": "Usage: /gateway [start|status|stop]",
  "gateway.no_platforms": "No messaging platform configured. Set e.g. CHATCLI_TELEGRAM_BOT_TOKEN.",
  "gateway.registered": "Registered platforms:",
  "gateway.configured": "Configured (ready) adapters:",
  "gateway.running": "Gateway running on: %s. Press Ctrl+C to stop.",
  "gateway.stopped": "Gateway stopped.",
  "gateway.task_done": "Task completed.",
  "gateway.thinking": "🤔 Got it — working on that…",
  "gateway.audio.transcribing": "🎙️ transcribing your voice message…",
  "gateway.audio.disabled": "🎙️ I received a voice message but transcription isn't enabled. Set CHATCLI_TRANSCRIPTION_PROVIDER=embedded for built-in offline transcription (one-time download, no API key) — or install a local whisper CLI, or set CHATCLI_TRANSCRIPTION_URL. Meanwhile, please send your request as text.",
  "gateway.image.default_prompt": "Analyze the attached image and describe what it shows.",
  "gateway.audio.failed": "🎙️ I couldn't transcribe that voice message. Please try again or send it as text.",
  "gateway.audio.needs_ffmpeg": "🎙️ I got your audio, but the gateway host lacks ffmpeg to decode this format. Install it on the host: %s",
  "gateway.status_voice": "Voice transcription:",
  "gateway.status_voice_off": "disabled (no usable provider)",
  "gateway.status_voice_warn": "⚠️ ffmpeg missing on the host: voice notes (OGG/Opus) work via the pure-Go decoder; %s require ffmpeg — %s",
  "gateway.audio.empty": "🎙️ I couldn't make out any speech in that voice message. Could you send it as text?",
  "gateway.persona_prompt": "You are answering through a messaging gateway: your reply is delivered as a chat message (Telegram, WhatsApp, Discord, Slack, …). Keep the final answer short, direct and in plain text — no tables, no banners, no ASCII art, and avoid long code blocks unless the user explicitly asked for code. Use your tools normally to read, create or edit files and run commands; the user only sees a brief action feed plus your final answer, so let the prose be a concise summary of what you did and the result.",
  "gateway.status_running": "Gateway daemon running (pid=%d).",
  "gateway.status_stopped": "Gateway daemon not running.",
  "gateway.already_running": "Gateway already running (pid=%d). Run /gateway stop first.",
  "gateway.started_detached": "Gateway started (pid=%d) on: %s. Logs: %s",
  "gateway.stopped_pid": "Gateway stopped (pid=%d).",
  "moa.usage": "Usage: /moa <prompt> (set CHATCLI_MOA_MODELS=\"provider:model,...\")",
  "moa.no_models": "No MoA models configured. Set CHATCLI_MOA_MODELS=\"openai:gpt-5,claudeai:claude-opus-4-8\".",
  "moa.running": "Querying %d models in parallel, then synthesizing...",
  "session.usage_delete": "  /session delete <name>",
  "session.usage_new": "  /session new",
  "session.error_save": " ❌ Error saving session: %v",
  "session.save_success": " ✅ Session '%s' saved successfully.",
  "session.error_load": " ❌ Error loading session: %v",
  "session.load_success": " ✅ Session '%s' loaded. The previous conversation has been restored.",
  "session.error_list": " ❌ Error listing sessions: %v",
  "session.list_empty": "No saved sessions found.",
  "session.list_header": "Saved sessions:",
  "session.error_delete": " ❌ Error deleting session: %v",
  "session.delete_success": " ✅ Session '%s' successfully deleted from disk.",
  "session.delete_active_cleared": "The current session was cleared. You are in a new conversation.",
  "session.error_name_required_save": "Error: a name is required to save the session.",
  "session.error_name_required_load": "Error: a name is required to load the session.",
  "session.error_name_required_delete": "Error: a name is required to delete the session.",
  "session.unknown_command": "Unknown session command: '%s'. Use /session to see options.",
  "session.save_where_prompt": "📦 Where to save session '%s'?",
  "session.save_option_local": "  [l] Local only",
  "session.save_option_remote": "  [r] Remote server only",
  "session.save_option_both": "  [b] Both (local + remote)",
  "session.save_success_remote": " ✅ Session '%s' saved successfully (remote server).",
  "session.save_success_both": " ✅ Session '%s' saved locally and on remote server.",
  "session.list_header_local": "📂 Local sessions:",
  "session.list_header_remote": "☁️  Remote sessions (server):",
  "session.load_found_both": "Session '%s' found in both local and remote. Load from?",
  "session.load_success_remote": " ✅ Session '%s' loaded from remote server. The previous conversation has been restored.",
  "session.delete_found_both": "Session '%s' found in both local and remote. Delete from?",
  "session.delete_success_remote": " ✅ Session '%s' deleted from remote server.",
  "session.delete_success_both": " ✅ Session '%s' deleted from both local and remote server.",
  "session.option_local": "  [l] Local",
  "session.option_remote": "  [r] Remote",
  "session.option_both": "  [b] Both",
  "session.prompt_choice": " > ",
  "chunk.no_more_chunks": "There are no more file chunks available.",
  "chunk.no_more_pending_but_failed": "There are no more pending chunks, but there are %d failed chunks. Use /retry to retry the last failed chunk or /retryall to retry all.",
  "chunk.sending": "Sending chunk %d of %d... (%d remaining after this one)",
  "chunk.progress_header": "📊 PROGRESS: Chunk %d/%d",
  "chunk.progress_processed": "▶️ %d chunks already processed",
  "chunk.progress_pending": "▶️ %d pending chunks",
  "chunk.progress_failed": "▶️ %d failed chunks",
  "chunk.progress_usage": "▶️ Use '/nextchunk' to advance or '/retry' if a failure occurs",
  "chunk.prompt": "This is chunk %d/%d of the code I requested earlier. Please continue the analysis:",
  "chunk.error_processing": "\n⚠️ Error processing chunk %d/%d: %s",
  "chunk.moved_to_failed_queue": "The chunk has been moved to the failed chunks queue.",
  "chunk.retry_or_next": "Use /retry to try this chunk again or /nextchunk to continue with the next one.",
  "chunk.status_header": "\nChunk status:",
  "chunk.status_pending": "- %d pending chunks. Use /nextchunk to continue.",
  "chunk.status_failed": "- %d failed chunks. Use /retry or /retryall to reprocess them.",
  "chunk.all_processed_success": "\nAll chunks have been processed successfully.",
  "chunk.no_failed_to_retry": "There are no failed chunks to reprocess.",
  "chunk.retrying_last_failed": "Retrying chunk %d/%d that failed previously...",
  "chunk.retry_header": "📊 NEW ATTEMPT: Chunk %d/%d",
  "chunk.retry_status_retrying": "▶️ Retrying a previously failed chunk",
  "chunk.retry_status_other_failed": "▶️ %d other failed chunks",
  "chunk.retry_prompt": "This is chunk %d/%d of the code (new attempt after failure). Please continue the analysis:",
  "chunk.retry_error": "\n⚠️ Error reprocessing chunk %d/%d: %s",
  "chunk.retry_remains_failed": "The chunk remains in the failed chunks queue.",
  "chunk.retry_success": "\nChunk reprocessed successfully!",
  "chunk.retrying_all_failed": "Retrying all %d failed chunks...",
  "chunk.no_pending_to_skip": "There are no pending chunks to skip.",
  "chunk.skipping": "Skipping chunk %d/%d...",
  "chunk.status_no_pending": "- No pending chunks.",
  "chunk.status_no_failed": "- No failed chunks.",
  "agent.header.title": "🤖 AGENT MODE: ACTION PLAN",
  "agent.header.description": "The AI has suggested the following commands to perform your task.",
  "agent.plan.compact_view": "📋 PLAN (compact view)",
  "agent.plan.full_view": "📋 PLAN (full view)",
  "agent.plan.status.pending": "Pending",
  "agent.plan.status.ok": "OK",
  "agent.plan.status.error": "ERROR",
  "agent.plan.risk.dangerous": "⚠️ Potentially dangerous",
  "agent.plan.risk.safe": "Safe",
  "agent.plan.command_header": "🔷 COMMAND #%d: %s",
  "agent.plan.field.type": "Type:",
  "agent.plan.field.risk": "Risk:",
  "agent.plan.field.status": "Status:",
  "agent.plan.field.code": "Code:",
  "agent.plan.command_separator": "( %d / %d )",
  "agent.plan.default_description": "Execute commands",
  "agent.ui.tool_label": "Tool",
  "agent.ui.tool_args": "Arguments",
  "agent.ui.tool_command": "Command",
  "agent.ui.action_title": "EXECUTE ACTION",
  "agent.ui.action_title_progress": "EXECUTE ACTION (%d/%d)",
  "agent.ui.action_title_short": "ACTION %d/%d",
  "agent.ui.result_success": "SUCCESS",
  "agent.ui.result_failure": "EXECUTION FAILED",
  "agent.ui.result_ok": "OK",
  "agent.ui.result_error": "ERROR",
  "agent.ui.result_empty": "-",
  "agent.ui.result_truncated": "\n... [output truncated visually, agent received all] ...",
  "agent.ui.reasoning_title": "REASONING",
  "agent.ui.batch_started": " 📦 STARTING BATCH EXECUTION: %d ACTIONS ",
  "agent.ui.batch_interrupted": " ⚠️ BATCH INTERRUPTED: %d of %d actions completed successfully.",
  "agent.ui.batch_completed": " ✅ BATCH COMPLETED: All %d actions executed successfully.",
  "agent.ui.batch_summary_success": "%d/%d completed",
  "agent.ui.batch_summary_errors": "%d/%d completed (with errors)",
  "agent.thinking.phrase_1": "Thinking…",
  "agent.thinking.phrase_2": "Analyzing…",
  "agent.thinking.phrase_3": "Processing…",
  "agent.thinking.phrase_4": "Reasoning…",
  "agent.thinking.phrase_5": "Planning…",
  "agent.thinking.phrase_6": "Exploring…",
  "agent.thinking.phrase_7": "Connecting dots…",
  "agent.thinking.phrase_8": "Crafting solution…",
  "agent.thinking.phrase_9": "Reading code…",
  "agent.thinking.phrase_10": "Mapping structure…",
  "agent.last_result.header": "🧾 LAST RESULT",
  "agent.last_result.tips": "Tips: v%d = view full | w%d = save to file | Enter = continue",
  "agent.menu.header": "WHAT DO YOU WANT TO DO?",
  "agent.menu.exec_n": "Executes a specific command (e.g., 1, 2, ...)",
  "agent.menu.exec_all": "Executes all commands in sequence",
  "agent.menu.edit": "Edits command N (e.g., e1)",
  "agent.menu.dry_run": "Simulates (dry-run) command N (e.g., t2)",
  "agent.menu.continue": "Asks AI for continuation with the output of N (e.g., c2)",
  "agent.menu.pre_context": "Adds pre-context to N before executing (e.g., pc1)",
  "agent.menu.post_context": "Adds context to the OUTPUT of N (e.g., ac1)",
  "agent.menu.view": "View full output of N in pager",
  "agent.menu.save": "Save output of N to a file",
  "agent.menu.toggle_plan": "Toggles full/compact plan",
  "agent.menu.redraw": "Refreshes the screen (clear)",
  "agent.menu.quit": "Exits Agent Mode",
  "agent.menu.col.execution": "Execution",
  "agent.menu.col.edit_context": "Edit & Context",
  "agent.menu.col.view": "View",
  "agent.banner.title": "AGENT MODE",
  "agent.banner.task": "Task",
  "agent.banner.mode": "Mode",
  "agent.banner.mode_value": "supervised — you approve each action",
  "coder.banner.title": "CODER MODE",
  "coder.banner.objective": "Objective",
  "coder.banner.workspace": "Workspace",
  "coder.banner.policy": "Policy",
  "coder.banner.policy_value": "read-only by default · Ctrl+C cancels",
  "chat.envelope.tokens": "%d↑ %d↓",
  "chat.envelope.no_tokens": "—",
  "chat.envelope.context_pct": "ctx %d%%",
  "cfg.agent.usage_header": "Usage of /config agent:",
  "cfg.agent.usage_ui_show": "show current style and options",
  "cfg.agent.usage_ui_full": "full bordered cards (default)",
  "cfg.agent.usage_ui_compact": "inline ↻/✓ lines (ideal for /coder)",
  "cfg.agent.usage_ui_minimal": "truncated cards (middle ground)",
  "cfg.agent.usage_note_scope": "Style applies to both /coder and /agent.",
  "cfg.agent.usage_note_persist": "To persist across sessions, add CHATCLI_CODER_UI=<value> to your .env.",
  "cfg.agent.unknown_sub": "Unknown subcommand: %s",
  "cfg.agent.ui_invalid_value": "Invalid value: %s",
  "cfg.agent.ui_valid_values": "Use full, compact, or minimal.",
  "cfg.agent.ui_set_failed": "Failed to switch style: %s",
  "cfg.agent.ui_set_ok": "Style switched: %s → %s. Takes effect on the next /coder or /agent.",
  "cfg.agent.ui_set_noop": "Style was already %s — nothing changed.",
  "cfg.agent.ui_runtime_hint": "🔄 Immediate change: applies on the next /coder or /agent.",
  "cfg.agent.ui_persist_hint": "💾 To persist across sessions: add CHATCLI_CODER_UI=%s to your .env.",
  "cfg.agent.ui_status_header": "🎨 Timeline style (CHATCLI_CODER_UI)",
  "cfg.agent.ui_status_current": "Current:",
  "cfg.agent.ui_status_options": "Available:",
  "cfg.agent.ui_status_change_hint": "To switch: /config agent ui <full|compact|minimal>",
  "cfg.agent.ui_source_env": "set by env",
  "cfg.agent.ui_source_default": "default",
  "cfg.agent.ui_desc_full": "Full bordered cards ╭─╮ … ╰─╯. Ideal for supervised /agent.",
  "cfg.agent.ui_desc_compact": "Inline lines ↻ Read(main.go) / ✓ Read(main.go) 0.3s. Ideal for /coder with many tools.",
  "cfg.agent.ui_desc_minimal": "Smaller cards with truncated content. Middle ground.",
  "complete.config.agent.ui": "Switch the timeline style (full/compact/minimal)",
  "cfg.section.ui.title": "UI / THEME",
  "cfg.ui.usage_header": "Usage of /config ui:",
  "cfg.ui.usage_theme_show": "show the active theme and color profile",
  "cfg.ui.usage_theme_set": "switch to the %s theme",
  "cfg.ui.usage_note_scope": "The theme skins chat, coder and agent — cards, borders, markdown and spinners.",
  "cfg.ui.usage_note_persist": "To persist across sessions, add CHATCLI_THEME=<name> to your .env.",
  "cfg.ui.unknown_sub": "Unknown subcommand: %s",
  "cfg.ui.theme_invalid_value": "Invalid theme: %s",
  "cfg.ui.theme_valid_values": "Available themes: %s.",
  "cfg.ui.theme_set_failed": "Failed to switch theme: %s",
  "cfg.ui.theme_set_ok": "Theme switched: %s → %s. Applies on the next render.",
  "cfg.ui.theme_set_noop": "Theme was already %s — nothing changed.",
  "cfg.ui.theme_persist_hint": "💾 To persist across sessions: add CHATCLI_THEME=%s to your .env.",
  "cfg.ui.theme_status_header": "🎨 Active theme (CHATCLI_THEME)",
  "cfg.ui.theme_status_current": "Theme:",
  "cfg.ui.theme_status_profile": "Color profile:",
  "cfg.ui.theme_status_options": "Available:",
  "cfg.ui.theme_status_change_hint": "To switch: /config ui theme <name>",
  "cfg.ui.theme_source_env": "set by env",
  "cfg.ui.theme_source_default": "default",
  "cfg.ui.theme_desc_dark": "Dark palette tuned for dark terminals (default).",
  "cfg.ui.theme_desc_light": "Light palette for terminals with a light background.",
  "cfg.ui.theme_desc_dracula": "Dracula — iconic high-contrast dark (purple/pink/cyan).",
  "cfg.ui.theme_desc_nord": "Nord — cool, low-saturation arctic palette.",
  "cfg.ui.theme_desc_tokyo-night": "Tokyo Night — modern night-blue with vivid accents.",
  "cfg.ui.theme_desc_solarized-dark": "Solarized Dark — Ethan Schoonover's classic on its dark base.",
  "cfg.ui.theme_desc_solarized-light": "Solarized Light — the same hues on a light background.",
  "cfg.ui.theme_desc_gruvbox": "Gruvbox — retro, warm, high-contrast dark.",
  "cfg.ui.theme_desc_catppuccin-mocha": "Catppuccin Mocha — soft pastel dark palette.",
  "cfg.ui.theme_desc_monokai": "Monokai — the classic editor palette on charcoal.",
  "cfg.ui.theme_desc_one-dark": "One Dark — Atom's balanced blue/gray with soft accents.",
  "cfg.ui.timeline_pointer": "Timeline density (full/compact/minimal): see /config agent ui.",
  "cfg.kv.theme_active": "Active theme",
  "cfg.kv.color_profile": "Color profile",
  "cfg.kv.themes_available": "Available themes",
  "complete.config.ui.theme": "Switch the color theme (dark/light)",
  "agent.prompt.choice": "\n ➤ Your choice: ",
  "agent.status.exiting": "\n ✅ Exiting agent mode.",
  "agent.status.no_output_to_show": "No output to display.",
  "agent.status.no_output_to_save": "No output to save.",
  "agent.status.press_enter": "\nPress Enter to continue...",
  "agent.status.error_saving": "Error saving:",
  "agent.status.file_saved_at": "File saved at:",
  "agent.status.batch_warning": "⚠️ WARNING: One or more commands are potentially dangerous.",
  "agent.status.batch_check_individual": "Check individual commands before approving batch execution!",
  "agent.status.batch_confirm": "\n⚠️ Execute all commands in sequence? (y/N): ",
  "agent.status.batch_canceled": "Batch execution canceled.",
  "agent.status.executing_command": "\n🚀 Executing command #%d:",
  "agent.status.all_commands_executed": "\n✅ All commands have been executed.",
  "agent.status.summary": "\nSummary:",
  "agent.status.command_not_executed": "This command has not been executed yet.",
  "agent.status.context_received": "\nContext received! Requesting refinement from AI...",
  "agent.status.no_new_commands": "\nThe AI did not suggest new commands.",
  "agent.status.executing": "🚀 EXECUTING: %s",
  "agent.status.executing_script": "⚙️ Executing script via %s:",
  "agent.status.dir_changed": "📂 Directory changed to: %s",
  "agent.status.dangerous_command_confirm": "This command is potentially dangerous. To confirm, type: 'yes, I want to run this knowingly'\nConfirm?: ",
  "agent.status.dangerous_command_aborted": "Execution of dangerous command ABORTED.",
  "agent.status.dangerous_command_confirmed": "⚠️ Confirmation received. Executing...",
  "agent.status.executing_command_n": "⚙️ Command %d/%d: %s",
  "agent.status.interactive_mode": "🖥️  Interactive mode.",
  "agent.status.command_finished": "✓ Command finished.",
  "agent.status.execution_complete": " ✅ Execution Completed ",
  "agent.status.execution_complete_with_errors": " ⚠️ Execution Completed with Errors ",
  "agent.status.simulating_commands": "\n🔎 Simulating commands (type: %s):",
  "agent.status.simulation_done": "Simulation finished, command NOT executed.",
  "agent.status.confirm_exec_after_sim": "Do you want to execute this command now? (y/N): ",
  "agent.status.edit_prompt": "Edit in terminal (t) or external editor (e)? [t/e]: ",
  "agent.status.edit_command_prompt": "Command %d/%d (%s): ",
  "agent.status.interactive_confirm": "The command '%s' might be interactive. Run in interactive mode? (y/N): ",
  "agent.error.invalid_command_number": "Invalid command number.",
  "agent.error.invalid_command_number_edit": "Invalid command number to edit.",
  "agent.error.invalid_command_number_simulate": "Invalid command number to simulate.",
  "agent.error.invalid_command_number_context": "Invalid number to add context.",
  "agent.error.invalid_command_number_continue": "Invalid number for continuation.",
  "agent.error.error_editing_command": "Error editing command:",
  "agent.error.no_context_provided": "No context provided. Operation canceled.",
  "agent.error.refinement_failed": "Error requesting refinement from AI:",
  "agent.error.continuation_failed": "Error asking AI for continuation:",
  "agent.error.create_temp_file": "❌ Error creating temporary file: %v",
  "agent.error.write_script": "❌ Error writing script: %v",
  "agent.error.change_dir": "❌ Error changing directory to '%s': %v",
  "agent.error.invalid_option": "Invalid option.",
  "agent.oneshot.no_command": "\nNo executable command was suggested by the AI.",
  "agent.oneshot.header": "\n🤖 AGENT MODE (ONE-SHOT): Suggested Command",
  "agent.oneshot.header_auto_exec": "\n🤖 AGENT MODE (ONE-SHOT): Automatic Execution",
  "agent.oneshot.auto_exec_tip": "To execute automatically, use the --agent-auto-exec flag",
  "agent.oneshot.block_header": "\n🔷 Command Block: %s",
  "agent.oneshot.language": "  Language: %s",
  "agent.oneshot.auto_exec_aborted": "automatic execution aborted for safety. The suggested command is potentially dangerous: %q",
  "agent.oneshot.auto_exec_running": "✅ Safe command detected. Executing the suggested command...",
  "agent.oneshot.error_with_output": "the command was executed, but returned an error: %s",
  "oneshot.error_overrides": "❌ Error applying provider/model overrides",
  "agent.system_prompt.interactive": "You are a command-line assistant that helps the user perform tasks on the system safely. Always briefly explain the purpose before the commands. Prefer simple, non-interactive commands. Avoid potentially destructive commands (rm -rf, dd, mkfs, etc.) without a clear risk warning and safe alternatives. When suggesting executable commands, use code blocks exactly in the format:\n\n```execute:<type>\n<commands>\n```\n\nAccepted types: shell, git, docker, kubectl. If there is ambiguity, ask a question before providing commands.",
  "agent.system_prompt.default.base": "[ACTIVE MODE: /agent]\nYou are an expert command-line assistant, operating inside a terminal. Your goal is to help the user perform tasks safely and efficiently by providing the correct commands.\n\n**[Available Context]**\n- Operating System: %s\n- Default Shell: %s\n- Current Directory: %s\n\n**[MANDATORY PROCESS]**\nFor each user request, you MUST strictly follow these two steps:\n\n**Step 1: Planning**\nThink step-by-step internally. If necessary, summarize the reasoning in a <reasoning> tag to show the user.\n\n**Step 2: Structured Final Response**\nAfter reasoning, provide the final response containing:\n1. A <explanation> tag with a clear and concise explanation of what the commands will do.\n2. One or more code blocks in the example format (the actual example block is injected below).\n\n**[GUIDELINES AND RESTRICTIONS]**\n1. Safety First: NEVER suggest destructive commands ('rm -rf', 'dd', 'mkfs', etc.) without an explicit warning about the risks in the <explanation> tag.\n2. Clarity: Prefer commands that are easy to understand. If a command is complex (e.g., 'awk', 'sed'), explain each part of it.\n3. Efficiency: Use pipes ('|') and combine commands to create efficient solutions when appropriate.\n4. Interactivity: Avoid interactive commands (e.g., 'vim', 'nano', 'ssh' without arguments). If necessary, warn the user in the <explanation> and add the #interactive marker at the end of the command (e.g., 'ssh user@host #interactive') so the CLI can handle it as interactive.\n5. Ambiguity: If the user's request is ambiguous, ask a clarifying question instead of guessing. DO NOT provide an execute block in that case.\n6. Format: Use execute:<type> code blocks as per the example injected below.\n\n**[COMPLETE EXAMPLE]**\n\n**User Request:** \"list all go files in this project and count the lines of each one\"\n\n**Your Response:**\n<reasoning>\n1. The user wants to find all files with the .go extension. The 'find' command is ideal for this.\n2. The search starting point should be the current directory ('.').\n3. The search criterion is the file name, so I'll use: find . -name \"*.go\"\n4. For each file found, the user wants to count the lines. The 'wc -l' command does this.\n5. I need to combine find with wc -l. The best way to do this for multiple files is using xargs or the -exec option of find. The -exec option with + is efficient.\n6. The final command will be: find . -name \"*.go\" -exec wc -l {} +\n</reasoning>\n<explanation>\nI will use the 'find' command to recursively search for all files ending with .go from the current directory. Then, for each file found, I will execute the 'wc -l' command to count the number of lines.\n</explanation>\n\nExample command block (format shown below):",
  "agent.system_prompt.oneshot": "You are a command-line assistant operating in a single-execution (one-shot) mode. Your task is to analyze the user's request and provide **a single, concise command block** that solves the task as efficiently and safely as possible.\n\n- Respond **only** with the best command block in the ```execute:shell format.\n- **Do not** provide multiple command blocks or alternatives.\n- **Do not** add long explanations before or after, just the command needed for execution.\n- Avoid destructive commands (like rm -rf) unless explicitly requested and the intent is clear.\n- The command must be directly executable, as we only need one, the best and most expert command possible.",
  "agent.llm_prompt.continuation": "The previously suggested command was:\n%s\n\nThe result (stdout) was:\n%s\n\nThe error (stderr) was:\n%s\n\nPlease suggest a correction or next steps based on the result. Provide executable commands in the appropriate format.",
  "agent.llm_prompt.continuation_with_context": "The previously suggested command was:\n%s\n\nThe result (stdout) was:\n%s\n\nThe error (stderr) was:\n%s\n\nPlease suggest a correction or next steps based on the result and the provided context. Provide executable commands in the appropriate format.\n\nAdditional context provided by the user:\n%s",
  "agent.llm_prompt.pre_execution_context": "The command you suggested was:\n```\n%s\n```\n\nBefore executing it, the user provided the following additional context or instruction:\n%s\n\nPlease review the suggested command based on this new context. If necessary, modify it or suggest a new set of commands. Present the new commands in the appropriate executable format.",
  "main.warn_expand_path": "Warning: could not expand path '%s': %v",
  "main.error_dotenv_not_found": ".env file not found at %s",
  "main.error_logger_init": "Could not initialize logger: %v",
  "main.error_no_provider": "No LLM provider is configured. Check your environment variables.",
  "main.error_apply_overrides": " ❌ Error applying overrides: %v",
  "manager.error_provider_not_supported": "LLM Provider '%s' not supported or not configured",
  "cli.switch.invalid_max_tokens": " ❌ Invalid value for --max-tokens: '%s'. Must be a number >= 0.",
  "cli.switch.max_tokens_set": " ✅ Maximum token limit set to: %d (0 = use provider default)",
  "cli.maxtokens.current": " ℹ️  Current max-tokens override: %d (0 = provider default). Set with /max-tokens <num>.",
  "cli.switch.stackspot_only_flags": " ❌ Flags --realm and --agent-id can only be used with the STACKSPOT provider.",
  "cli.switch.realm_updated": " ✅ StackSpot realm/tenant updated to '%s'. The token will be renewed on the next request.",
  "cli.switch.agent_id_updated": " ✅ StackSpot Agent ID updated to '%s'.",
  "cli.switch.agent_id_error": " ❌ Error recreating StackSpot client with new Agent ID: %v",
  "cli.switch.changing_model": "Attempting to switch to model '%s' on provider '%s'...",
  "cli.switch.change_model_error": " ❌ Error switching to model '%s': %v\n   Verify that the model name is correct for the current provider.",
  "cli.switch.change_model_success": " ✅ Successfully switched model to %s (%s)",
  "cli.switch.available_providers": "Available providers:",
  "agent.validator.empty_command": "empty command",
  "agent.validator.dangerous_command": "potentially dangerous command detected: %s",
  "agent.executor.interactive_mode_header": "\n--- Entering interactive command mode ---",
  "agent.executor.interactive_mode_info": "Terminal control will be passed to the command.",
  "agent.executor.interactive_mode_exit_tip": "To return, exit the program (e.g., ':q' in vim, 'exit' in shell).",
  "agent.executor.interactive_mode_footer": "--- Returning to ChatCLI ---",
  "agent.executor.fail_restore_terminal": "Failed to restore terminal",
  "help.section.contexts": "Context Management",
  "help.command.context_create": "Create new context from files/directories",
  "help.command.context_mode": "Processing mode (full, summary, chunked, smart, knowledge)",
  "help.command.context_description": "Context description",
  "help.command.context_tags": "Comma-separated tags",
  "help.command.context_attach": "Attach context to current session",
  "help.command.context_detach": "Detach context from session",
  "help.command.context_list": "List all saved contexts",
  "help.command.context_show": "Show context details",
  "help.command.context_delete": "Delete a context permanently",
  "help.command.context_merge": "Merge multiple contexts into a new one",
  "help.command.context_attached": "Show contexts attached to current session",
  "help.command.context_export": "Export context to JSON file",
  "help.command.context_import": "Import context from JSON file",
  "help.command.context_metrics": "Show usage metrics and statistics",
  "context.error.unknown_subcommand": "Unknown subcommand: '%s'. Use /context help to see available commands.",
  "context.create.usage": "Usage: /context create <name> <paths...> [--mode <mode>] [--description <text>] [--tags <tag1,tag2>]",
  "context.create.error.mode_required": "Flag --mode requires a value (full, summary, chunked, smart, knowledge)",
  "context.create.error.description_required": "Flag --description requires a value",
  "context.create.error.tags_required": "Flag --tags requires comma-separated values",
  "context.create.error.no_paths": "No paths provided. At least one file or directory is required.",
  "context.create.error.failed": "Error creating context: %v",
  "context.create.processing": " 🔄 Processing files...",
  "context.create.success": " ✅ Context created successfully!",
  "context.attach.usage": "Usage: /context attach <name> [--priority <number>]",
  "context.attach.error.invalid_priority": "Invalid priority. Must be an integer.",
  "context.attach.error.not_found": "Context '%s' not found",
  "context.attach.error.failed": "Error attaching context: %v",
  "context.attach.success": " ✅ Context '%s' attached to current session",
  "context.attach.priority": "Priority:",
  "context.attach.files": "Files:",
  "context.attach.files_label": "files",
  "context.attach.size": "Size:",
  "context.detach.usage": "Usage: /context detach <name>",
  "context.detach.error.not_found": "Context '%s' not found",
  "context.detach.error.failed": "Error detaching context: %v",
  "context.detach.success": " ✅ Context '%s' detached from session",
  "context.delete.usage": "Usage: /context delete <name>",
  "context.delete.error.not_found": "Context '%s' not found",
  "context.delete.error.failed": "Error deleting context: %v",
  "context.delete.confirm": " ⚠️  Are you sure you want to delete context '%s'? (y/N): ",
  "context.delete.canceled": "Operation cancelled.",
  "context.delete.success": " ✅ Context '%s' deleted successfully",
  "context.list.error.failed": "Error listing contexts: %v",
  "context.list.empty": "No contexts found. Use /context create to create one.",
  "context.list.header": " 📦 AVAILABLE CONTEXTS",
  "context.show.usage": "Usage: /context show <name>",
  "context.show.error.not_found": "Context '%s' not found",
  "context.merge.usage": "Usage: /context merge <new-name> <context1> <context2> [context3...]",
  "context.merge.error.context_not_found": "Context '%s' not found",
  "context.merge.error.failed": "Error merging contexts: %v",
  "context.merge.processing": " 🔄 Merging contexts...",
  "context.merge.success": " ✅ Contexts merged successfully!",
  "context.attached.error.failed": "Error fetching attached contexts: %v",
  "context.attached.empty": "No contexts attached to this session. Use /context attach <name> to attach.",
  "context.attached.header": " 📌 CONTEXTS ATTACHED TO SESSION",
  "context.export.usage": "Usage: /context export <name> <target-path>",
  "context.export.error.not_found": "Context '%s' not found",
  "context.export.error.failed": "Error exporting context: %v",
  "context.export.success": " ✅ Context exported to: %s",
  "context.import.usage": "Usage: /context import <file-path>",
  "context.import.error.failed": "Error importing context: %v",
  "context.import.success": " ✅ Context '%s' imported successfully",
  "context.metrics.header": " 📊 CONTEXT METRICS",
  "context.update.usage": "Usage: /context update <name> [<paths...>] [--mode <mode>] [--description <text>] [--tags <tag1,tag2>]",
  "context.update.processing": " 🔄 Updating context...",
  "context.update.error.failed": "Error updating context: %v",
  "context.update.success": " ✅ Context updated successfully!",
  "context.create.force_tip": "Tip: Use --force to overwrite an existing context",
  "plugin.usage_header": "Usage: /plugin <list|install|show|inspect|uninstall> [arguments]",
  "plugin.list.empty": "No plugins installed. Use '/plugin install <url>' to add one.",
  "plugin.list.header": " 🔌 INSTALLED PLUGINS:",
  "plugin.show.usage": "Usage: /plugin show <plugin-name>",
  "plugin.error.not_found": " ❌ Plugin '%s' not found.",
  "plugin.show.details_for": " 🧩 PLUGIN DETAILS: %s",
  "plugin.show.description": "Description",
  "plugin.show.usage_label": "Usage",
  "plugin.show.version": "Version",
  "plugin.inspect.usage": "Usage: /plugin inspect <plugin-name>",
  "plugin.inspect.details_for": "🛠️ PLUGIN INSPECTION: %s",
  "plugin.inspect.path": "Executable Path",
  "plugin.inspect.permissions": "Permissions",
  "plugin.install.usage": "Usage: /plugin install <git-repository-url>",
  "plugin.install.security_warning": " ⚠️ WARNING: You are about to clone, compile, and execute code from a third-party repository. Only install from trusted sources.",
  "plugin.install.confirm": "Do you wish to continue with the installation of '%s'? (y/N): ",
  "plugin.install.canceled": "Installation cancelled.",
  "plugin.install.installing": "Installing plugin from '%s'...",
  "plugin.install.error.tempdir": " ❌ Error creating temporary directory: %v",
  "plugin.install.error.clone": " ❌ Error cloning repository: %v",
  "plugin.install.error.build": " ❌ Error compiling plugin: %v\nOutput: %s",
  "plugin.install.error.chmod": "❌ Error setting executable permission on plugin: %v",
  "plugin.install.success": " ✅ Plugin '%s' installed successfully!",
  "plugin.uninstall.usage": "Usage: /plugin uninstall <plugin-name>",
  "plugin.uninstall.error": " ❌ Error uninstalling plugin '%s': %v",
  "plugin.uninstall.success": " ✅ Plugin '%s' uninstalled.",
  "plugin.uninstall.error.not_local": " ❌ Cannot uninstall a builtin or remote plugin.",
  "plugin.error.unknown_subcommand": "Unknown plugin subcommand: '%s'",
  "plugin.error.manager_disabled": " ❌ Plugin manager is not available. Check logs for initialization errors.",
  "plugin.reloading": "Reloading plugins...",
  "plugin.reload_success": " ✅ Plugins reloaded. New plugins are now available!",
  "agent.feedback.tool_output_header": "--- Tool Output ---",
  "agent.status.using_tool": " 🤖 Agent is using tool: %s %s",
  "agent.status.final_answer_no_commands": " ✅ The agent provided a final answer without executable commands.",
  "agent.error.max_turns_reached": "The agent did not reach a final solution after %d turns.",
  "agent.system_prompt.tools_header": "**[AVAILABLE TOOLS]**",
  "agent.system_prompt.tools_instruction": "To use a tool, your response MUST contain a block in the format: `<tool_call name=\"@tool-name\" args=\"argument1 argument2\" />`. After receiving the tool's result, decide the next step. If no tool is suitable, generate the final solution using ```execute:shell``` blocks.",
  "agent.error.tool_not_found": "Error: the tool '%s' you tried to use was not found. Please choose one from the list or generate a shell command.",
  "agent.feedback.tool_output": "The tool '%s' was executed and returned the following:\n\n<tool_output>\n%s\n</tool_output>\n\n(If the task is done, reply only with a final summary. If more actions are needed, send the next tool_call).",
  "agent.error.max_turns_reached_context": "⚠️ The agent stopped after reaching the maximum limit of %d turns to prevent infinite loops. It did not reach a final solution.",
  "agent.feedback.last_thought": "Here is the agent's last thought process:",
  "agent.error.invalid_tool_args": "Error: The arguments you provided for the tool '%s' were malformed: %v. Please correct the quoting and try again.",
  "agent.multiline_input_tip": "(Enter a single '.' on a new line to finish)",
  "agent.prompt.additional_context": "\n ➤ Provide additional context or instructions: ",
  "agent.output_header": "\n--- Command Output ---",
  "agent.persona.list.empty": "⚠ No agents found. Create .md files in the agents directory.",
  "agent.persona.skills.empty": "⚠ No skills found. Create .md files in the skills directory.",
  "agent.persona.off.no_active": "⚠ No agent is currently active.",
  "agent.persona.off.hint": "💡 ChatCLI returned to default behavior (default persona).",
  "agent.persona.show.no_active": "⚠ No agent is active. Use /agent load <name> to load one.",
  "agent.persona.load.usage": "⚠ Usage: /agent load <agent-name>",
  "agent.usage.hint": "💡 Usage: /agent <task>  (e.g., /agent investigate 500 error). Without a task, agent mode is not started to avoid sending an empty message to the LLM.",
  "persona.error.not_initialized": "❌ Persona system not initialized.",
  "help.section.persona": "Agent Management (Personas)",
  "help.command.persona_list": "Lists all available agents.",
  "help.command.persona_load": "Loads a specific agent with its skills.",
  "help.command.persona_skills": "Lists all available skills.",
  "help.command.persona_show": "Shows details of the active agent and its prompt.",
  "help.command.persona_status": "Shows the active agent's status, including session pinning.",
  "help.command.persona_off": "Deactivates the current agent, returning to default behavior.",
  "remote.resources.available": "Server has %d plugins, %d agents, %d skills available",
  "paste.detected": "📋 Pasted (%d chars, %d lines)",
  "paste.detected.short": "📋 Pasted (%d chars)",
  "context.display.label.description": "Description:",
  "context.display.label.mode": "Mode:",
  "context.display.label.files": "Files:",
  "context.display.label.size": "Size:",
  "context.display.label.tags": "Tags:",
  "context.display.label.tokens": "Tokens:",
  "context.display.label.created": "Created:",
  "context.display.total_injected": "Total injected:",
  "context.display.cache_info": "Contexts are injected as system prompt and cached",
  "context.display.cache_anthropic": "Anthropic: cache_control ephemeral (~90%% discount)",
  "context.display.cache_openai": "OpenAI: automatic prompt caching (~50%% discount)",
  "context.display.large_context_warning": "Large context! Consider using chunks (/context attach %s --chunks 1,2)",
  "context.display.metrics.total_contexts": "Total Contexts:",
  "context.display.metrics.attached_contexts": "Attached Contexts:",
  "context.display.metrics.total_files": "Total Files:",
  "context.display.metrics.total_size": "Total Size:",
  "context.display.metrics.by_mode": "Contexts by Mode:",
  "context.display.metrics.storage_path": "Storage Path:",
  "context.display.info.context_label": "📦 Context:",
  "context.display.info.id_label": "ID:",
  "context.display.info.general_header": "📊 GENERAL INFORMATION",
  "context.display.info.mode_label": "  Mode:",
  "context.display.info.content_label": "  Content:",
  "context.display.info.content_value": "%d files | %.2f MB",
  "context.display.info.tags_label": "  Tags:",
  "context.display.info.created_at": "  Created at:",
  "context.display.info.updated_at": "  Updated at:",
  "context.display.stats.type_distribution_header": "📂 TYPE DISTRIBUTION",
  "context.display.stats.type_line": "%d files (%.1f%%) | %.2f KB",
  "context.display.chunks.structure_header": "🧩 CHUNK STRUCTURE",
  "context.display.chunks.strategy": "Strategy:",
  "context.display.chunks.total": "Total:",
  "context.display.chunks.total_value": "%d chunks",
  "context.display.chunks.detail_tip": "💡 Use '/context show <name>' to see full chunk details",
  "context.display.chunks.chunk_label": "Chunk %d/%d",
  "context.display.chunks.content_label": "Content:",
  "context.display.chunks.content_value": "%d files | %.2f KB | ~%d tokens",
  "context.display.files.structure_header": "📁 FILE STRUCTURE",
  "context.display.files.first_n_of_total": "First %d of %d files:",
  "context.display.files.and_more": "... and %d more files",
  "context.display.files.show_all_tip": "💡 Use '/context show <name>' to see all files",
  "context.display.files.root_dir": "(root)",
  "context.display.attachment.header": "📌 ATTACHMENT STATUS",
  "context.display.attachment.attached_sessions": "Attached to %d session(s):",
  "context.display.attachment.not_attached": "Not attached to any session",
  "context.display.attachment.attach_instruction": "To attach this context to the current session:",
  "context.display.attachment.chunked_info": "This context is split into chunks. You can:",
  "context.display.attachment.attach_all": "Attach all chunks",
  "context.display.attachment.attach_specific": "Attach specific chunks with:",
  "context.help.title": "📦 Context Management",
  "context.help.create_header": "Create Context:",
  "context.help.arg.name": "name",
  "context.help.arg.paths": "paths...",
  "context.help.arg.options": "options",
  "context.help.arg.mode": "mode",
  "context.help.arg.text": "text",
  "context.help.arg.path": "path",
  "context.help.arg.new_name": "new-name",
  "context.help.mode_desc": "Mode: full, summary, chunked, smart, knowledge",
  "context.help.description_desc": "Context description",
  "context.help.tags_desc": "Comma-separated tags",
  "context.help.force_desc": "Overwrite if already exists",
  "context.help.example_label": "Example:",
  "context.help.update_header": "Update Contexts:",
  "context.help.new_mode_desc": "New processing mode",
  "context.help.new_description_desc": "New description",
  "context.help.new_tags_desc": "New tags",
  "context.help.notes_label": "Notes:",
  "context.help.update_note1": "• Only provided fields will be updated",
  "context.help.update_note2": "• If no paths provided, current files are kept",
  "context.help.update_note3": "• UpdatedAt is always updated",
  "context.help.attach_header": "Attach/Detach:",
  "context.help.attach_desc": "Attach context to current session",
  "context.help.detach_desc": "Detach context from session",
  "context.help.list_view_header": "List and View:",
  "context.help.list_desc": "List all contexts",
  "context.help.show_desc": "Show full context details",
  "context.help.inspect_desc": "Deep statistical analysis of the context",
  "context.help.inspect_chunk_desc": "Inspect specific chunk",
  "context.help.attached_desc": "Show contexts attached to session",
  "context.help.manage_header": "Manage:",
  "context.help.delete_desc": "Delete a context",
  "context.help.merge_desc": "Merge multiple contexts",
  "context.help.import_export_header": "Import/Export:",
  "context.help.export_desc": "Export context to file",
  "context.help.import_desc": "Import context from file",
  "context.help.metrics_header": "Metrics:",
  "context.help.metrics_desc": "Show usage statistics",
  "context.help.note1": "• Attached contexts are automatically included in LLM prompts",
  "context.help.note2": "• Use priority to control order (lower = first)",
  "context.help.note3": "• Merged contexts automatically remove duplicates",
  "context.inspect.usage": "Usage: /context inspect <name> [--chunk N]",
  "context.inspect.error.not_found": "Context '%s' not found",
  "context.inspect.error.chunk_not_found": "Chunk %d does not exist (available: 1-%d)",
  "context.inspect.header": "\n🔍 DETAILED INSPECTION",
  "context.inspect.size_class.small": "small (<10KB)",
  "context.inspect.size_class.medium": "medium (10-100KB)",
  "context.inspect.size_class.large": "large (>100KB)",
  "context.inspect.stats_header": "📊 STATISTICAL ANALYSIS",
  "context.inspect.total_lines": "Total lines of code:",
  "context.inspect.avg_lines": "Average lines per file:",
  "context.inspect.size_distribution_header": "📐 SIZE DISTRIBUTION",
  "context.inspect.size_distribution_line": "%s: %d files (%.1f%%)",
  "context.inspect.extensions_header": "🗂️ EXTENSIONS FOUND",
  "context.inspect.no_extension": "(no extension)",
  "context.inspect.extension_line": "%s: %d file(s)",
  "context.inspect.chunk_analysis_header": "🧩 CHUNK ANALYSIS",
  "context.inspect.chunk_avg_size": "Average chunk size:",
  "context.inspect.chunk_min_size": "Smallest chunk:",
  "context.inspect.chunk_max_size": "Largest chunk:",
  "context.inspect.chunk_variation": "Variation:",
  "context.inspect.chunk_header": "🔍 CHUNK INSPECTION %d/%d",
  "context.inspect.files_count": "%d files",
  "context.inspect.estimated_tokens": "Estimated tokens:",
  "context.inspect.file_list_header": "📋 COMPLETE FILE LIST",
  "context.inspect.label.type": "Type:",
  "context.inspect.label.lines": "Lines:",
  "context.io.error.chunk_requires_number": "--chunk requires a number (e.g., --chunk 1)",
  "context.io.error.invalid_chunk_number": "invalid chunk number: %s",
  "context.io.error.chunks_requires_numbers": "--chunks requires comma-separated numbers (e.g., --chunks 1,2,3)",
  "context.io.error.unknown_flag": "unknown flag: %s",
  "context.io.error.rag_with_chunks": "--rag cannot be combined with --chunk/--chunks (semantic vs. manual selection)",
  "context.io.label.rag_topk": "Semantic retrieval (passages):",
  "context.io.warn.rag_no_provider": "  ⚠ --rag requires an embeddings provider (set CHATCLI_EMBED_PROVIDER); attaching as whole content for now",
  "context.io.error.not_chunked": "context '%s' is not split into chunks",
  "context.io.attach_success": "✅ Context '%s' attached successfully!",
  "context.io.label.priority": "Priority:",
  "context.io.label.selected_chunks": "Selected chunks:",
  "context.io.label.of": "of",
  "context.io.chunk_detail": "Chunk %d: %s (%d files, %.2f KB)",
  "context.io.label.total_attached": "Total attached:",
  "context.io.total_attached_value": "%d files | %.2f MB",
  "context.io.label.attached": "Attached:",
  "context.io.attached_all_chunks": "All %d chunks (%d files, %.2f MB)",
  "context.io.label.estimated_cost": "💡 Estimated cost:",
  "context.io.cached_via_system_prompt": "(cached via system prompt)",
  "context.io.knowledge_attached": "knowledge base — %d passages, %.2f MB indexed (corpus stays OUT of the prompt)",
  "context.io.knowledge_cost_note": "(index card only; relevant passages retrieved per turn)",
  "context.io.large_context_tip": "Large context — consider using chunks to reduce cost",
  "context.handler.error.invalid_mode": "invalid mode: %s (use: full, summary, chunked, smart, knowledge)",
  "context.handler.label.name": "Name:",
  "context.handler.label.paths": "Paths:",
  "agent.persona.usage.load": "Usage: /agent load <name>",
  "agent.persona.usage.attach": "Usage: /agent attach <name>",
  "agent.persona.usage.detach": "Usage: /agent detach <name>",
  "agent.persona.directory": "Directory",
  "agent.persona.list.create_hint": "Create a .md file with YAML frontmatter to define an agent.",
  "agent.persona.list.header": "Available Agents:",
  "agent.persona.no_description": "(no description)",
  "agent.persona.list.load_hint": "Use %s to load an agent",
  "agent.persona.skills.header": "Available Skills:",
  "agent.persona.load.error": "Error loading agent",
  "agent.persona.load.success": "✓ Agent '%s' loaded successfully!",
  "agent.persona.load.skills_attached": "Attached skills:",
  "agent.persona.load.skills_missing": "Skills not found (ignored):",
  "agent.persona.load.plugins_enabled": "Enabled plugins:",
  "agent.persona.load.ready": "Ready to use! The persona will be applied automatically on the next command.",
  "agent.persona.load.example": "Example",
  "agent.persona.load.or": "or",
  "agent.persona.unload.success": "✓ Agent '%s' deactivated.",
  "agent.persona.show.active_header": "Active Agent:",
  "agent.persona.show.name": "Name",
  "agent.persona.show.description": "Description",
  "agent.persona.show.file": "File",
  "agent.persona.show.skills_loaded": "Loaded skills",
  "agent.persona.show.skills_missing": "Missing skills",
  "agent.persona.show.prompt_preview": "Composed Prompt Preview",
  "agent.persona.show.truncated": "(truncated, use /agent show --full to see everything)",
  "agent.persona.show.total_size": "Total size",
  "agent.persona.show.characters": "characters",
  "agent.persona.status.header": "Agent Management (Personas)",
  "agent.persona.status.active": "Active agent",
  "agent.persona.status.none": "No active agent (using default persona)",
  "agent.persona.help.management_header": "Management Subcommands:",
  "agent.persona.help.list": "Lists available agents",
  "agent.persona.help.load": "Loads a specific agent",
  "agent.persona.help.skills": "Lists available skills",
  "agent.persona.help.show": "Shows active agent and its prompt (use --full to show all)",
  "agent.persona.help.status": "Lists only attached agents",
  "agent.persona.help.off": "Deactivates the current agent",
  "agent.persona.help.exec_header": "Execution Mode (with task):",
  "agent.persona.help.agent_task": "Executes a task in agent mode",
  "agent.persona.help.coder_task": "Executes in software engineer mode",
  "agent.persona.help.agents_dir": "Agents",
  "agent.persona.attach.error": "Error attaching",
  "agent.persona.attach.success": "Agent '%s' attached! Skills added: %d",
  "agent.persona.detach.error": "Error detaching",
  "agent.persona.detach.success": "Agent '%s' removed from session.",
  "agent.persona.attached.header": "Attached Agents:",
  "agent.persona.unload_all.success": "✇ All agents have been deactivated.",
  "skill.registry.not_initialized": "Skill registry not initialized.",
  "skill.invoke.not_invocable": "This skill exists but is not invocable (set `user-invocable: true` in its frontmatter)",
  "skill.error": "Error",
  "skill.warning": "Warning",
  "skill.usage.search": "Usage: /skill search <query>",
  "skill.usage.install": "Usage: /skill install <name> [--from <registry>]",
  "skill.usage.uninstall": "Usage: /skill uninstall <name>",
  "skill.usage.info": "Usage: /skill info <name> [--from <registry>]",
  "skill.unknown_subcommand": "Unknown subcommand '%s'. Use /skill help for usage.",
  "skill.search.searching": "Searching registries for",
  "skill.search.no_results": "No skills found.",
  "skill.search.results": "Results (%d found)",
  "skill.search.install_hint": "Use %s to install a skill.",
  "skill.installed": "installed",
  "skill.installed_other": "installed from other source",
  "skill.not_installed": "not installed",
  "skill.install.installing": "Installing",
  "skill.install.not_found_in": "Skill not found",
  "skill.install.in_registry": "in registry",
  "skill.install.available_in": "Available in",
  "skill.install.found_in_multiple": "Skill",
  "skill.install.registries_label": "found in multiple registries",
  "skill.install.use_from": "Use %s to choose.",
  "skill.install.blocked": "BLOCKED",
  "skill.install.warning": "WARNING",
  "skill.install.confirm": "Continue with installation?",
  "skill.install.canceled": "Installation cancelled.",
  "skill.install.result_installed": "Installed",
  "skill.install.result_updated": "Updated",
  "skill.install.from": "from",
  "skill.install.path": "Path",
  "skill.install.available": "Skill '%s' is now available.",
  "skill.install.verify": "Verify with",
  "skill.refresh_failed": "failed to refresh skills",
  "skill.uninstall.not_installed": "Skill '%s' is not installed.",
  "skill.uninstall.removing": "Removing skill",
  "skill.uninstall.done": "Done.",
  "skill.uninstall.success": "Skill '%s' uninstalled.",
  "skill.uninstall.multiple": "Multiple skills matching",
  "skill.uninstall.specify": "found from different sources",
  "skill.uninstall.use_full_name": "Use the full name to specify which one to uninstall.",
  "skill.list.empty": "No skills installed.",
  "skill.list.search_hint": "Use %s to find and install skills.",
  "skill.list.header": "Installed Skills",
  "skill.registries.header": "Registries",
  "skill.registries.configured": "Configured Registries",
  "skill.registries.config": "Config",
  "skill.registries.edit_hint": "Edit the config file to add custom registries.",
  "skill.registries.toggle_hint": "Use %s to toggle.",
  "skill.registry.not_found": "Registry not found",
  "skill.registry.available": "Available registries",
  "skill.registry.enabled": "Enabled",
  "skill.registry.disabled": "Disabled",
  "skill.registry.restart_hint": "(takes effect on next session)",
  "skill.info.not_found": "Skill '%s' not found.",
  "skill.info.name": "Name",
  "skill.info.desc": "Desc",
  "skill.info.version": "Version",
  "skill.info.author": "Author",
  "skill.info.source": "Source",
  "skill.info.tags": "Tags",
  "skill.info.downloads": "Downloads",
  "skill.info.installs": "Installs",
  "skill.info.repo": "Repo",
  "skill.info.page": "Page",
  "skill.info.security": "Security",
  "skill.info.moderation": "Moderation",
  "skill.info.status": "Status",
  "skill.info.path": "Path",
  "skill.info.sources": "sources",
  "skill.help.header": "Skill Registry Commands",
  "skill.help.search": "Search for skills across registries",
  "skill.help.install": "Install a skill from a registry",
  "skill.help.uninstall": "Remove an installed skill",
  "skill.help.list": "List installed skills",
  "skill.help.info": "Show skill details (local + registry)",
  "skill.help.registries": "Show configured registries",
  "skill.help.registry_toggle": "Enable or disable a registry",
  "skill.help.prefer": "Set preferred source for conflicting skills",
  "skill.help.pin": "Pin a skill so it's injected on every turn this session",
  "skill.help.unpin": "Remove a skill from the pinned set",
  "skill.help.pinned": "List the skills pinned for this session",
  "skill.usage.pin": "Usage: /skill pin <name>",
  "skill.usage.unpin": "Usage: /skill unpin <name>",
  "skill.pin.no_manager": "Persona manager not initialized.",
  "skill.pin.not_found": "Skill not found",
  "skill.pin.search_hint": "Try %s or install it with /skill install <name>.",
  "skill.pin.disabled_invocation": "Skill is manual-only (disable-model-invocation)",
  "skill.pin.use_manual_hint": "Use %s to invoke it manually for a single turn.",
  "skill.pin.already": "Skill is already pinned:",
  "skill.pin.success": "Skill pinned:",
  "skill.pin.effect": "It will be injected on every turn until /skill unpin.",
  "skill.unpin.success": "Skill unpinned:",
  "skill.unpin.not_pinned": "Skill is not pinned:",
  "skill.pinned.header": "Skills pinned for this session",
  "skill.pinned.empty": "No skills pinned for this session.",
  "skill.pinned.hint": "Use %s to pin a skill.",
  "skill.list.pinned_marker": "[pinned]",
  "skill.prefer.none": "No skill preferences set.",
  "skill.prefer.hint": "Use %s to set a preference.",
  "skill.prefer.header": "Skill Preferences",
  "skill.prefer.current": "Preference",
  "skill.prefer.default_order": "default — local wins",
  "skill.prefer.available": "Available sources",
  "skill.prefer.active": "preferred",
  "skill.prefer.not_installed": "Skill '%s' is not installed from any source.",
  "skill.prefer.set": "Preference set:",
  "skill.prefer.reset": "Preference removed for",
  "skill.prefer.effect": "This takes effect on the next skill activation.",
  "skill.prefer.source_not_found": "Source not found",
  "skill.prefer.for_skill": "for skill",
  "skill.help.show_help": "Show this help",
  "skill.help.skills_dir": "Skills dir",
  "coder.security.header": "SECURITY CHECK",
  "coder.security.task": "Task",
  "coder.security.action": "Action",
  "coder.security.rule": "Rule",
  "coder.security.exec_requires_approval": "exec requires individual approval",
  "coder.security.no_rule_for": "no rule for '%s'",
  "coder.security.choose": "Choose",
  "coder.security.yes_once": "Yes, execute (once)",
  "coder.security.allow_always": "Allow always (%s)",
  "coder.security.no_skip": "No, skip",
  "coder.security.deny_always": "Block always (%s)",
  "coder.security.canceled": "Cancelled",
  "coder.security.invalid_input": "Invalid input — action denied for security",
  "coder.security.action.exec": "Execute shell command",
  "coder.security.action.test": "Run tests",
  "coder.security.action.write": "Write file",
  "coder.security.action.patch": "Modify file (patch)",
  "coder.security.action.read": "Read file",
  "coder.security.action.search": "Search in code",
  "coder.security.action.tree": "List directory structure",
  "coder.security.action.unknown": "Unknown action",
  "coder.security.detail.file": "file",
  "coder.security.detail.term": "term",
  "connect.usage.main": " Usage: /connect <host:port> [--token <t>] [--use-local-auth] [--provider <p>] [--model <m>] [--llm-key <k>]",
  "connect.usage.stackspot": "   StackSpot: --client-id <id> --client-key <key> --realm <r> --agent-id <a>",
  "connect.usage.ollama": "   Ollama:    --ollama-url <url>",
  "connect.usage.tls": "   TLS:       --tls [--ca-cert <path>]",
  "connect.error.already_connected": " Already connected to a remote server. Use /disconnect first.",
  "connect.error.resolve_local_auth": " Failed to resolve local auth: %v",
  "connect.status.connecting": " Connecting to %s...",
  "connect.error.connection_failed": " Connection failed: %v",
  "connect.error.health_check_failed": " Health check failed: %v",
  "connect.error.server_not_healthy": " Server is not healthy",
  "connect.info.using_local_oauth": "using local OAuth credentials",
  "connect.info.using_api_key": "using your API key",
  "connect.status.connected": " Connected to remote server (%s)",
  "connect.info.watcher_active": " K8s watcher active: %s (context injected into prompts)",
  "connect.hint.disconnect": " Use /disconnect to return to local mode.",
  "connect.error.not_connected": " Not connected to a remote server.",
  "connect.status.disconnected": " Disconnected from remote server.",
  "connect.status.back_to_local": " Back to local mode: %s (%s)",
  "connect.status.back_to_local_no_provider": " Back to local mode (no LLM provider configured).",
  "watch.usage.header": " Usage:",
  "watch.usage.start": "   /watch start --deployment <name> [--namespace <ns>] [--interval <dur>] [--window <dur>] [--max-log-lines <n>] [--kubeconfig <path>]",
  "watch.usage.stop": "   /watch stop",
  "watch.usage.status": "   /watch status",
  "watch.error.already_running": " K8s watcher already running. Use /watch stop first.",
  "watch.error.invalid_flag": " Invalid %s: %s",
  "watch.error.unknown_flag": " Unknown flag: %s",
  "watch.error.deployment_required": " --deployment is required.",
  "watch.status.starting": " Starting K8s watcher for deployment/%s in namespace/%s ...",
  "watch.status.config": "   Interval: %s | Window: %s | Max log lines: %d",
  "watch.error.start_failed": " Failed to start watcher: %s",
  "watch.status.started": " K8s watcher started. Context will be injected into all prompts.",
  "watch.hint.status_stop": " Use /watch status to check, /watch stop to stop.",
  "watch.error.not_running": " No K8s watcher is running.",
  "watch.status.stopped": " K8s watcher stopped.",
  "watch.status.active_with_info": " K8s Watcher: %s",
  "watch.status.active_no_info": " K8s Watcher: active (no status available)",
  "watch.error.remote_query_failed": " Failed to query remote watcher status: %s",
  "watch.status.remote_inactive": " Server has no K8s watcher active.",
  "watch.status.remote_active": " K8s Watcher (remote): %s",
  "watch.status.remote_details": "   Target: %s/%s | Pods: %d | Alerts: %d | Snapshots: %d",
  "watch.status.inactive": " No K8s watcher active. Start with: /watch start --deployment <name>",
  "metrics.header": "ChatCLI Runtime Metrics",
  "metrics.label.provider": "Provider:",
  "metrics.label.model": "Model:",
  "metrics.session.unsaved": "(unsaved)",
  "metrics.label.session": "Session:",
  "metrics.label.history_msgs": "History msgs:",
  "metrics.label.tokens": "Tokens (est.):",
  "metrics.label.turns": "Turns:",
  "metrics.header.go_runtime": "Go Runtime",
  "metrics.label.goroutines": "Goroutines:",
  "metrics.label.alloc": "Alloc:",
  "metrics.label.sys": "Sys:",
  "metrics.label.gc_cycles": "GC cycles:",
  "metrics.header.connection": "Connection",
  "metrics.label.remote": "Remote:",
  "metrics.value.connected": "connected",
  "metrics.value.local": "local",
  "metrics.label.watcher": "Watcher:",
  "metrics.value.inactive": "inactive",
  "auth.usage": "Usage: /auth status | login <anthropic|openai-codex|github-copilot> | logout <anthropic|openai-codex|github-copilot>",
  "auth.login.usage": "Use: /auth login anthropic | openai-codex | github-copilot",
  "auth.login.failed": "Login failed: %v",
  "auth.login.success": "Logged in (%s) profile: %s",
  "auth.error.unknown_provider": "Unknown provider. Use: anthropic | openai-codex | github-copilot",
  "auth.logout.usage": "Use: /auth logout anthropic | openai-codex | github-copilot",
  "auth.logout.failed": "Logout failed: %v",
  "auth.logout.success": "Logout ok",
  "auth.error.unknown_subcommand": "Unknown subcommand. Use: status | login | logout",
  "memory.error.not_available": "Memory system not available.",
  "memory.usage": "Usage: /memory [today|yesterday|week|longterm|list|load <date>|profile|profile set <k>=<v>|remember [cat] <fact>|forget <substr>|facts|topics|projects|stats|compact|<YYYY-MM-DD>]",
  "memory.no_notes_for": "No notes found for",
  "memory.notes_for": "Memory notes for",
  "memory.no_notes_week": "No notes in the last 7 days.",
  "memory.header.week": "Memory notes — last 7 days",
  "memory.no_longterm": "No long-term memory stored yet.",
  "memory.header.longterm": "Long-term Memory (MEMORY.md)",
  "memory.error.invalid_date": "Invalid date.",
  "memory.error.date_format_hint": "Use format YYYY-MM-DD or 'yesterday'",
  "memory.already_loaded": "Notes from %s already loaded in this conversation.",
  "memory.loaded_into_context": "Loaded memory from %s into conversation context (%d chars)",
  "memory.header.files": "Memory files",
  "memory.no_daily_notes": "No daily notes yet",
  "memory.daily_notes_count": "%d daily notes:",
  "rewind.no_checkpoints": "No checkpoints available yet.",
  "rewind.header": "REWIND — Select a checkpoint to restore",
  "rewind.select_prompt": "Select [1-%d] or (q)uit:",
  "rewind.canceled": "Rewind cancelled.",
  "rewind.invalid_selection": "Invalid selection.",
  "rewind.success": "Rewound to checkpoint [%d] (%s, %d messages)",
  "compact.error.no_provider": "No LLM provider configured.",
  "compact.error.history_too_short": "History too short to compact.",
  "compact.error.failed": "Compaction failed: %s",
  "compact.success": "Compacted: %d → %d messages",
  "compact.error.not_enough_with_instruction": "Not enough messages to compact with instruction.",
  "compact.error.not_enough_middle": "Not enough middle messages to compact.",
  "compact.compacting_with_instruction": "Compacting with instruction:",
  "compact.preserved": "preserved",
  "compact.status.start": "📦 Compacting history (%d msgs, %s → target %s)",
  "compact.status.trim": "🧹 Trim: stripping reasoning/dedup (no LLM)…",
  "compact.status.trim_sufficient": "✓ Trim was enough (%s → %s)",
  "compact.status.summarize": "🧠 Summarizing old messages via LLM (may take 30-90s — ESC cancels)…",
  "compact.status.canceled": "⚠ Compaction cancelled by user",
  "compact.status.summarize_failed": "⚠ Summarization failed (%v) — falling back to truncation",
  "compact.status.summarize_applied": "✓ Summary applied (%d → %d msgs, %s → %s)",
  "compact.status.emergency": "✂ Emergency truncation — old messages dropped",
  "compact.status.truncated": "✓ Truncated (%d → %d msgs)",
  "agent.microcompact.applied": "microcompact: %d truncated, %d summarized, %s freed",
  "agent.queue.new_user_instruction": "New user instruction received",
  "agent.queue.indicator": "(%d queued)",
  "agent.spinner.executing": "RUNNING: %s %s",
  "agent.spinner.action_placeholder": "action",
  "slash.help.description": "Returns the chatcli command catalog (slash and @-modifiers).",
  "slash.version.description": "Returns the running chatcli build version and whether an update is available.",
  "plugins.todo.description": "Manage the agent task plan: write the full plan, list current state, or mark one task by id (Claude Code TodoWrite parity)",
  "plugins.todo.describe.write": "Updating task plan",
  "plugins.todo.describe.list": "Listing task plan",
  "plugins.todo.describe.mark": "Marking task",
  "plugins.todo.describe.mark_id": "Marking task #%s",
  "plugins.read.description": "Read file contents from the workspace (line range, head/tail, base64 supported)",
  "plugins.read.describe": "Reading: %s",
  "plugins.knowledge.describe_search": "Searching knowledge base: \"%s\"",
  "plugins.knowledge.describe_get": "Reading document: %s",
  "plugins.knowledge.describe_toc": "Listing knowledge base contents",
  "plugins.knowledge.describe_list": "Listing attached knowledge bases",
  "plugins.knowledge.describe_generic": "Querying the knowledge base",
  "plugins.docsflatten.description": "Flatten documentation OR code/infra (Markdown, source code, Terraform, Kubernetes/Argo YAML, shell) from a local directory or git repo into AI-ready chunks (text/jsonl/json/yaml); kind=code chunks by structure; jsonl feeds /context --mode knowledge",
  "plugins.docsflatten.describe": "Flattening docs: %s",
  "plugins.context.description": "Build and manage your own knowledge bases without the user: create a context from docs (a corpus.jsonl from @docs-flatten, a directory or files), attach it (with optional RAG retrieval), inspect (list/status), detach or delete. Pairs with @websearch + @docs-flatten + @knowledge for an autonomous documentation pipeline.",
  "plugins.context.describe.create": "Building knowledge base: %s",
  "plugins.context.describe.update": "Updating context: %s",
  "plugins.context.describe.show": "Showing context: %s",
  "plugins.context.describe.inspect": "Inspecting context: %s",
  "plugins.context.describe.merge": "Merging contexts into: %s",
  "plugins.context.describe.export": "Exporting context: %s",
  "plugins.context.describe.import": "Importing context",
  "plugins.context.describe.metrics": "Computing context metrics",
  "plugins.context.describe.attach": "Attaching context: %s",
  "plugins.context.describe.detach": "Detaching context: %s",
  "plugins.context.describe.list": "Listing contexts",
  "plugins.context.describe.status": "Checking attached contexts",
  "plugins.context.describe.delete": "Deleting context: %s",
  "plugins.registrytags.description": "List the tags published for a container image across public/private OCI registries (Docker Hub, GCR, GHCR, Quay, ACR, Harbor, Artifactory). Keyless for public images; reads ~/.docker/config.json for private ones. No image is pulled.",
  "plugins.registrytags.describe": "Listing tags: %s",
  "plugins.registrytags.none": "No tags found for %s",
  "plugins.registrytags.truncated": "truncated at %d",
  "plugins.wikipedia.description": "Look things up on Wikipedia: search for matching article titles or read an article's plain-text intro. Keyless, language-configurable (lang=en|pt|es|...).",
  "plugins.wikipedia.describe_search": "Searching Wikipedia: %s",
  "plugins.wikipedia.describe_read": "Reading Wikipedia: %s",
  "plugins.wikipedia.results_header": "Wikipedia search results (use the exact title with read):",
  "plugins.wikipedia.no_results": "No Wikipedia results for %s",
  "plugins.wikipedia.no_article": "No summary found for the article %s",
  "plugins.diagram.description": "Render an architecture, dependency, flow or ER diagram to PNG/SVG/JPG from Graphviz DOT, with crisp and 100%% correct text labels — deterministic, never a guessed-pixel image. Graphviz is embedded (WASM) so no install is needed; if a system Graphviz ('dot') is on PATH it is used automatically for crisper fonts and layout (CHATCLI_DIAGRAM_BACKEND=auto|system|embedded). Also builds the real Go import graph of a module (gomod). Prefer this over @image for any node/edge diagram.",
  "plugins.graphview.description": "Render an INTERACTIVE, Obsidian-style force-directed graph (drag nodes, zoom, pan, search, filter by type) to a self-contained HTML file and open it in the browser. Unlike @diagram (a static image), the result keeps moving with physics. Sources: json (you supply nodes/edges — ideal to map the current conversation), knowledge (the in-core knowledge graph), conversation (a structural session graph). Self-contained: embedded JS engine, no CDN, no network, no API key.",
  "plugins.graphview.describe": "Rendering interactive graph (source: %s)",
  "plugins.graphview.empty": "The graph has no nodes to render.",
  "plugins.graphview.too_big": "graph is too large to render interactively (%d nodes, max %d); reduce the node set or render a sub-graph.",
  "plugins.graphview.rendered": "Interactive graph rendered → %s (%d nodes, %d edges)",
  "plugins.graphview.opened": "Opened in your default browser. Drag nodes, scroll to zoom, drag the background to pan, click a type in the legend to filter.",
  "plugins.graphview.open_hint": "Open this file in a browser to explore it: %s",
  "plugins.graphview.default_title": "Graph",
  "cfg.section.graphview.title": "Interactive Graph View (@graphview)",
  "cfg.graphview.about": "Renders a draggable force-directed graph to a self-contained HTML file. Works in agent, coder and chat (chat is gated by CHATCLI_CHAT_GRAPHVIEW).",
  "cfg.chat.gv_effective": "graphview in chat (effective)",
  "cfg.chat.gv_invalid": "invalid value '%s' for graphview",
  "cfg.chat.gv_valid": "valid values: on, off, toggle, status",
  "cfg.chat.usage_gv_on": "enable interactive graph rendering in chat",
  "cfg.chat.usage_gv_off": "disable interactive graph rendering in chat",
  "complete.config.chat_graphview": "enable/disable interactive graph rendering in chat",
  "plugins.diagram.describe_render": "Rendering diagram → %s",
  "plugins.diagram.describe_gomod": "Building Go import graph: %s",
  "plugins.diagram.rendered": "Diagram rendered → %s (%s, %s)",
  "plugins.diagram.dimensions": "dimensions: %s",
  "plugins.diagram.no_edges": "No import edges found under %s",
  "plugins.search.description": "Search workspace files for a regex pattern (Go regexp syntax) and return file:line matches",
  "plugins.search.describe": "Searching: %s",
  "plugins.tree.description": "List the workspace directory structure as an ASCII tree (depth-bounded)",
  "plugins.tree.describe": "Listing: %s",
  "plugins.websearch.describe": "Searching: %s",
  "plugins.webfetch.describe": "Fetching: %s",
  "plugins.coder.describe.read": "Reading: %s",
  "plugins.coder.describe.search": "Searching: %s",
  "plugins.coder.describe.exec": "Executing: %s",
  "plugins.coder.describe.write": "Writing: %s",
  "plugins.coder.describe.patch": "Patching: %s",
  "plugins.coder.describe.tree": "Listing: %s",
  "plugins.coder.describe.generic": "@coder %s",
  "plugins.park.describe.delay": "Parking for: %s",
  "plugins.park.describe.until": "Parking until: %s",
  "plugins.park.describe.for_url": "Polling URL: %s",
  "plugins.park.describe.for_cmd": "Polling cmd: %s",
  "plugins.park.describe.generic": "@park %s",
  "plugins.scheduler.describe.schedule": "Scheduling: %s",
  "plugins.scheduler.describe.query": "@scheduler query: %s",
  "plugins.scheduler.describe.cancel": "@scheduler cancel: %s",
  "plugins.scheduler.describe.wait": "Waiting until: %s",
  "plugins.scheduler.describe.list": "Listing scheduled jobs",
  "plugins.scheduler.describe.generic": "@scheduler %s",
  "agent.early_exit.stagnation": "ReAct loop stopped: the same tool_call repeated %d turns in a row (stagnation). Set CHATCLI_AGENT_EARLY_EXIT=0 to disable this detector.",
  "agent.early_exit.chat_hint": "Tip: this query looks conversational — the /agent loop was skipped. Use /chat or just type the question to force chat mode, or /run to force agent mode.",
  "agent.webfetch.auto_saved": "web_fetch: response too large inline (%d bytes); saved to %s — use read_file or rerun with filter/from_line/to_line.",
  "agent.preflight.near_cap": "pre-flight: history %s ≈ %d%% of configured cap (%s) — compacting",
  "agent.preflight.warn_no_cap": "history %s — if you are behind a proxy/gateway, export CHATCLI_MAX_PAYLOAD=5MB (adjust to the proxy limit)",
  "agent.recovery.reason.ctx_too_long": "context too long",
  "agent.recovery.reason.payload_413": "proxy/gateway payload limit (413/431)",
  "agent.recovery.reason.waf_403": "proxy/WAF rejection (403 + security signals)",
  "agent.recovery.reason.suspected_payload": "suspected payload limit (large history %s + network error)",
  "agent.recovery.retrying": "Recoverable failure (%s) — compacting and retrying",
  "agent.recovery.assumed_cap": "Assuming 4 MB payload cap — export CHATCLI_MAX_PAYLOAD (e.g. 5MB, 512KB) to adjust",
  "oneshot.details_label": "Details",
  "oneshot.error.no_provider": "❌ No LLM provider configured. Use /auth login anthropic | openai-codex | github-copilot to authenticate first.",
  "oneshot.error.empty_input": "❌ One-shot error\n\nOne-shot mode was triggered (via -p/--prompt flag or stdin), but no input content was provided.\n\n- Use the -p/--prompt flag with text:\n\n  chatcli -p \"Your prompt here\"\n\n- Or send data via stdin:\n\n  echo \"Text\" | chatcli -p or echo \"Text\" | chatcli",
  "oneshot.error.agent_failed": " ❌ Error running agent in one-shot mode",
  "oneshot.error.coder_failed": " ❌ Error running coder in one-shot mode",
  "oneshot.error.run_failed": " ❌ Error running in one-shot mode",
  "command.context.shell_history": "Shell History (last 30 commands)",
  "command.context.git_info": "Git Information",
  "command.context.env_vars": "Environment Variables",
  "command.executing": "Executing command:",
  "command.error.shell_not_found": "Error locating shell:",
  "command.error.shell_config_not_found": "Could not determine config file for shell:",
  "command.warning.interactive": "Warning: Executing interactive command. Control will be returned to ChatCLI at the end.",
  "command.error.execution": "Error executing command:",
  "command.output.not_captured": "Command output could not be captured for history.",
  "command.output.header": "Command output",
  "command.sending_to_ai": "Sending command output to the AI...",
  "command.error.processing_request": "An error occurred while processing the request.",
  "cli.error.no_provider_configured": "No LLM provider configured. Use /auth login anthropic | openai-codex | github-copilot to authenticate, then /switch to select a provider.",
  "queue.message_queued": "📥 Message queued (#%d)",
  "queue.full": "⚠ Queue full (max 10). Please wait.",
  "cli.signal.interrupt": "🛑 Interruption requested by user! Stopping processes...",
  "cli.status.operation_canceled_returning": "✅ Operation cancelled. Returning to chat...",
  "cli.error.execution_failed": "❌ Execution error: %v",
  "coder.header": "👨‍💻 SOFTWARE ENGINEER MODE ACTIVATED",
  "coder.objective": "Objective",
  "coder.hint.ctrl_c": "💡 Tip: Press Ctrl+C at any time to stop execution.",
  "coder.session_finished": "✅ Engineering session finished.",
  "queue.messages_removed": "🗑 %d message(s) removed from queue.",
  "queue.processing_remaining": "📤 Processing from queue (%d remaining)...",
  "queue.processing": "📤 Processing from queue...",
  "cli.error.switch_provider_failed": "Error switching provider.",
  "help.command.compact": "Compact history (guided: /compact keep only API patterns)",
  "help.command.rewind": "Rewind to a previous conversation checkpoint",
  "help.command.quick_rewind": "Quick rewind (when input is empty)",
  "help.command.memory": "View/load memory notes (today, yesterday, week, longterm, list, load <date>)",
  "file.chunk.wait_before_send": "Wait 5 seconds before sending the first chunk...",
  "file.chunk.sending_first": "Sending first chunk to the LLM...",
  "coder.quick_tip.header": "💡 Quick tip (/coder):",
  "coder.quick_tip.read": "  - read: {\"cmd\":\"read\",\"args\":{\"file\":\"main.go\"}}",
  "coder.quick_tip.search": "  - search: {\"cmd\":\"search\",\"args\":{\"term\":\"Login\",\"dir\":\".\"}}",
  "coder.quick_tip.write": "  - write: {\"cmd\":\"write\",\"args\":{\"file\":\"x.go\",\"encoding\":\"base64\",\"content\":\"...\"}}",
  "coder.quick_tip.exec": "  - exec: {\"cmd\":\"exec\",\"args\":{\"cmd\":\"mkdir -p testeapi\"}}",
  "coder.waiting_for_input": "Waiting for your response (--- for multiline, 'exit' to finish):",
  "multiline.hint": "Multiline mode — type %s on a new line to finish",
  "multiline.canceled": "multiline cancelled",
  "agent.status.task_completed": "🏁 TASK COMPLETED",
  "agent.status.max_turns_stopped": "⚠️ Limit of %d steps reached. The agent stopped to prevent an infinite loop.",
  "agent.telemetry.session": "session: %s",
  "agent.label.command": "Command",
  "agent.dryrun.label": "Dry-run",
  "agent.dryrun.failed": "Dry-run failed",
  "ai.response_language": "[RESPONSE LANGUAGE]\nYou MUST write ALL your responses in **English**. This includes: reasoning, explanations, action plans, error messages, questions, and any other text shown to the user. Only code, commands, file paths, and technical identifiers should remain in their original form.",
  "_section.llm": "--- LLM Provider Messages ---",
  "llm.error.marshal_payload": "Error marshaling payload",
  "llm.error.marshal_payload_for": "Error marshaling payload for %s",
  "llm.error.prepare_request": "error preparing request",
  "llm.error.prepare_request_for": "error preparing payload for %s",
  "llm.error.create_request": "error creating request",
  "llm.error.create_request_for": "Error creating HTTP request for %s",
  "llm.error.read_response": "error reading response",
  "llm.error.read_response_for": "Error reading response from %s",
  "llm.error.decode_response": "error decoding response",
  "llm.error.decode_response_for": "Error decoding response from %s",
  "llm.error.decode_response_json_for": "Error decoding JSON response from %s",
  "llm.error.api_error": "API error from %s: %s",
  "llm.error.api_error_code": "API error from %s (code %d): %s",
  "llm.error.api_error_payload": "%s API returned an error in payload",
  "llm.error.api_error_base_resp": "%s API returned error via base_resp",
  "llm.error.no_response": "no response received from %s",
  "llm.error.no_response_generic": "no response received",
  "llm.error.empty_response": "empty response from %s",
  "llm.error.empty_response_max_tokens": "%s API returned an empty response, likely because 'max_tokens' is too low",
  "llm.error.empty_response_unspecified": "%s API returned an empty response for an unspecified reason",
  "llm.error.no_choices": "%s API returned no response (empty 'choices' array)",
  "llm.error.unexpected_format": "unexpected format in %s response",
  "llm.error.missing_message_field": "'message' field missing in %s response",
  "llm.error.invalid_message_content": "message content is not valid",
  "llm.error.no_text_content": "No text content found in %s response",
  "llm.error.no_text_content_stream": "No text content found in %s response (stream)",
  "llm.error.get_response_after_retries": "Error getting response from %s after retries",
  "llm.error.request_failed": "HTTP request error for %s",
  "llm.error.read_body": "Error reading response body from %s",
  "llm.error.content_encoding_unsupported": "unsupported content-encoding: %s",
  "llm.error.read_stream": "error reading stream: %w",
  "llm.error.read_sse_stream": "error reading SSE stream",
  "llm.error.no_text_from_sse": "no text extracted from Responses API SSE stream",
  "llm.warn.empty_choices": "No 'choice' in %s response.",
  "llm.warn.empty_content": "%s response with empty content.",
  "llm.warn.could_not_extract_text": "Could not extract text from response, even with 'completed' status.",
  "llm.warn.could_not_extract_text_error": "could not extract text from Responses API response",
  "llm.minimax.using_anthropic_compat": "MiniMax using Anthropic-compatible endpoint",
  "llm.info.fetched_models": "Fetched %s models",
  "llm.info.fetched_models_total": "Fetched %s models (total: %d, chat: %d)",
  "llm.info.configuring_provider": "Configuring provider %s",
  "llm.info.using_custom_max_tokens": "Using custom %s",
  "llm.info.initializing_client": "Initializing %s client",
  "llm.info.starting_request": "Starting request to %s",
  "llm.info.response_received": "Response received from %s successfully",
  "llm.info.parse_complete": "Parsing of %s response completed successfully",
  "llm.info.token_usage_stats": "Token usage statistics for %s",
  "llm.warn.provider_not_available": "%s not set, provider %s will not be available",
  "llm.warn.provider_not_configured": "%s not configured, provider %s will not be available",
  "llm.tool.error.marshaling_payload": "marshaling payload",
  "llm.tool.error.reading_response": "reading response",
  "llm.tool.error.decoding_response": "decoding response",
  "llm.tool.error.decoding_response_body": "decoding response body",
  "llm.tool.error.creating_request": "creating request",
  "llm.tool.error.no_choices": "no choices in response",
  "llm.tool.error.unexpected_choice_format": "unexpected choice format",
  "llm.tool.error.no_message_in_choice": "no message in choice",
  "_section.llm.manager": "--- LLM Manager Messages ---",
  "llm.manager.retry_policy": "Retry policy configured",
  "llm.manager.provider_unsupported": "error: LLM provider '%s' not supported or not configured",
  "llm.manager.client_attempt_failed": "Attempt to get client for unconfigured provider",
  "llm.manager.client_create_error": "Error creating LLM client instance",
  "llm.manager.stackspot_requires_config": "STACKSPOT provider requires STACKSPOT_REALM and STACKSPOT_AGENT_ID. Provide them in .env or via --realm and --agent-id flags",
  "llm.manager.stackspot_credentials_missing": "CLIENT_ID or CLIENT_KEY not set, STACKSPOT provider will not be available",
  "llm.manager.model_not_found_ollama": "model '%s' not found in Ollama. Available models: %s",
  "llm.manager.ollama_not_active": "OLLAMA_ENABLED is not active, Ollama provider ignored.",
  "llm.manager.ollama_not_detected": "Ollama was not detected at the configured address; provider will not be available.",
  "llm.manager.ollama_comm_error": "Error communicating with Ollama service (check if it is running).",
  "llm.manager.ollama_decode_error": "Could not decode the Ollama model list.",
  "llm.manager.ollama_no_models": "No models found in Ollama service. Download one with 'ollama pull <model_name>'.",
  "llm.manager.using_responses_api": "Using OpenAI Responses API",
  "llm.manager.using_chat_completions": "Using OpenAI Chat Completions API",
  "llm.manager.failed_resolve_auth": "failed to resolve %s auth",
  "llm.manager.create_client_unsupported": "CreateClientWithKey: provider '%s' does not support client-provided API keys",
  "llm.manager.stackspot_requires_field": "STACKSPOT requires '%s' in provider_config",
  "llm.manager.failed_create_for_listing": "failed to create client for model listing",
  "llm.manager.api_listing_failed": "Failed to fetch models from API, will include catalog models",
  "_section.llm.fallback": "--- LLM Fallback Chain Messages ---",
  "llm.fallback.all_failed": "all providers failed; last error: %w",
  "llm.fallback.no_providers": "no providers available in fallback chain",
  "llm.fallback.no_tool_providers": "no tool-aware providers available in fallback chain",
  "llm.fallback.skipping_cooldown": "skipping provider (cooldown)",
  "llm.fallback.request_failed": "provider request failed",
  "llm.fallback.no_native_tools": "provider does not support native tools, skipping",
  "_section.llm.token": "--- LLM Token Manager Messages ---",
  "llm.token.realm_updated": "Realm value updated",
  "llm.token.valid_found": "Valid token found",
  "llm.token.expired_or_missing": "Token expired or missing, starting renewal",
  "llm.token.renewing": "Renewing access token...",
  "llm.token.renewed_success": "Token renewed successfully",
  "llm.token.renew_error": "error renewing token",
  "llm.token.renew_failed_attempts": "failed to renew token after %d attempts",
  "llm.token.temp_error": "Temporary error renewing token",
  "llm.token.backoff_retry": "Applying backoff before next attempt",
  "llm.token.create_request_error": "Error creating token request",
  "llm.token.request_error": "Error making token request",
  "llm.token.request_failed": "Token request failed",
  "llm.token.get_failed": "failed to get token: status %d, response: %s",
  "llm.token.decode_error": "Error decoding token response",
  "llm.token.access_token_missing": "access_token not found in token response",
  "llm.token.access_token_get_failed": "could not get access_token",
  "llm.token.expires_in_missing": "expires_in not found in token response",
  "llm.token.expires_in_get_failed": "could not get expires_in",
  "_section.llm.stackspot": "--- LLM StackSpot Messages ---",
  "llm.stackspot.get_response_error": "Error getting response from StackSpot Agent after retries",
  "llm.stackspot.prepare_chat_request": "error preparing chat request",
  "llm.stackspot.create_chat_request": "error creating chat request",
  "llm.stackspot.do_chat_request": "error making chat request",
  "llm.stackspot.read_chat_response": "error reading chat response",
  "llm.stackspot.decode_chat_response": "error deserializing chat response",
  "llm.stackspot.empty_response": "agent response is empty (stop_reason: %s)",
  "llm.stackspot.get_token_error": "error getting token",
  "llm.stackspot.token_invalid_renewing": "Token invalid or expired, renewing...",
  "llm.stackspot.renew_token_error": "error renewing token",
  "_section.llm.copilot": "--- LLM Copilot Messages ---",
  "llm.copilot.marshal_failed": "Failed to marshal payload",
  "llm.copilot.prepare_request_failed": "failed to prepare request",
  "llm.copilot.create_request_failed": "Failed to create request",
  "llm.copilot.read_response_failed": "Failed to read Copilot response",
  "llm.copilot.decode_response_failed": "Failed to decode Copilot response",
  "llm.copilot.no_response": "No response from Copilot",
  "llm.copilot.no_response_error": "no response received from GitHub Copilot",
  "llm.copilot.access_denied": "GitHub Copilot: access denied (403). Your Copilot subscription may have expired or the token is invalid. Run '/auth login github-copilot' to re-authenticate.",
  "llm.copilot.fetch_models_failed": "failed to fetch Copilot models",
  "_section.llm.ollama": "--- LLM Ollama Messages ---",
  "llm.ollama.prepare_payload": "error preparing Ollama payload",
  "llm.ollama.create_request": "error creating Ollama request",
  "llm.ollama.read_response": "error reading Ollama response",
  "llm.ollama.decode_response": "error decoding Ollama response",
  "llm.ollama.api_error": "Ollama error: %s",
  "llm.ollama.get_response_error": "Error getting response from Ollama after retries",
  "llm.ollama.filter_applied": "Thinking filter applied successfully",
  "llm.ollama.no_thinking_detected": "No 'thinking' detected, returning original response",
  "llm.ollama.fetch_models_failed": "failed to fetch Ollama models",
  "_section.llm.assistant": "--- LLM OpenAI Assistant Messages ---",
  "llm.assistant.create_cache_dir_error": "error creating cache directory",
  "llm.assistant.create_thread_error": "error creating thread",
  "llm.assistant.thread_created": "Thread created",
  "llm.assistant.add_message_error": "error adding message to thread",
  "llm.assistant.run_error": "error running assistant",
  "llm.assistant.wait_response_error": "error waiting for response",
  "llm.assistant.run_failed": "assistant execution failed: %s",
  "llm.assistant.get_response_error": "error getting response",
  "llm.assistant.timeout_recovery": "Attempting to recover messages after timeout",
  "llm.assistant.partial_response": "Partial response recovered successfully after timeout",
  "llm.assistant.partial_response_prefix": "[Partial response due to timeout] %s",
  "llm.assistant.cleanup_done": "OpenAI Assistant resource cleanup completed",
  "llm.assistant.list_runs_error": "Error listing runs for cleanup",
  "llm.assistant.decode_runs_error": "Error decoding runs response",
  "llm.assistant.cancel_run_error": "Error canceling run",
  "llm.assistant.run_canceled": "Run cancelled successfully",
  "llm.assistant.recovered_from_cache": "Assistant recovered from cache",
  "llm.assistant.create_error": "error creating assistant",
  "llm.assistant.decode_response_error": "error decoding assistant response",
  "llm.assistant.cache_save_failed": "Could not save assistantID to cache",
  "llm.assistant.new_created": "New assistant created",
  "llm.assistant.cache_not_found": "Cache file not found, creating new registry",
  "llm.assistant.cache_read_error": "Error reading cache file",
  "llm.assistant.cache_decode_error": "Error decoding cache",
  "llm.assistant.cache_loaded": "Cache loaded successfully",
  "llm.assistant.cache_dir_error": "Error creating cache directory",
  "llm.assistant.cache_encode_error": "Error encoding cache",
  "llm.assistant.cache_save_error": "Error saving cache",
  "llm.assistant.cache_saved": "Cache saved successfully",
  "llm.assistant.decode_response": "error decoding response",
  "llm.assistant.decode_status": "error decoding status",
  "llm.assistant.execution_failed": "execution failed with status: %s",
  "llm.assistant.timeout_waiting": "timeout waiting for completion",
  "llm.assistant.decode_messages": "error decoding messages",
  "llm.assistant.no_assistant_response": "no assistant response found",
  "llm.assistant.model_different": "model different from cache",
  "_section.llm.responses": "--- LLM OpenAI Responses API Messages ---",
  "llm.responses.prepare_payload": "error preparing payload for Responses API",
  "llm.responses.create_request": "error creating request for Responses API",
  "llm.responses.read_response": "error reading Responses API response",
  "llm.responses.decode_response": "error decoding Responses API response",
  "llm.responses.api_error": "OpenAI Responses API returned an error in payload",
  "llm.responses.api_error_msg": "OpenAI API error: %s",
  "llm.responses.incomplete_max_tokens": "OpenAI response was incomplete, 'max_output_tokens' value is too low",
  "llm.responses.incomplete_unknown": "OpenAI response was incomplete for an unknown reason (status: %s)",
  "llm.responses.get_response_error": "Error getting response from OpenAI Responses after retries",
  "llm.responses.fetch_models_apikey": "Fetched OpenAI models (Responses API key)",
  "llm.responses.missing_scope": "OpenAI API key missing required scope for model listing",
  "llm.responses.missing_scope_detail": "OpenAI returned 403: missing scope api.model.read. Enable the 'Model Read' permission for your API key at platform.openai.com",
  "_section.llm.googleai": "--- LLM Google AI Messages ---",
  "llm.googleai.api_error": "Error returned by Google AI API",
  "llm.googleai.api_error_msg": "API error: %s (code: %d)",
  "llm.googleai.no_candidates": "No candidates in Google AI response",
  "llm.googleai.decode_error": "Error decoding JSON response from Google AI",
  "server.tls.load_failed": "Failed to load TLS certificate",
  "server.tls.enabled": "TLS enabled",
  "server.reflection.enabled": "gRPC reflection enabled",
  "server.listen.failed": "failed to listen on %s: %w",
  "server.shutdown.signal": "Received shutdown signal",
  "server.starting": "ChatCLI gRPC server starting",
  "server.listening": "🚀 ChatCLI server listening on %s\n",
  "server.auth_enabled": "🔒 Authentication enabled (Bearer token required)",
  "server.metrics_enabled": "📊 Prometheus metrics on :%d/metrics\n",
  "server.grpc_failed": "gRPC server failed: %w",
  "server.stopped": "ChatCLI gRPC server stopped",
  "server.handler.client_config": "Using client-provided config",
  "server.handler.client_api_key": "Using client-provided API key",
  "server.handler.user_question_prefix": "\n\nUser Question: ",
  "server.analysis.issue_name_required": "issue_name is required",
  "server.analysis.llm_client_failed": "Failed to get LLM client for analysis",
  "server.analysis.get_client_error": "failed to get LLM client: %v",
  "server.analysis.llm_failed": "LLM analysis failed",
  "server.analysis.llm_error": "LLM analysis failed: %v",
  "server.analysis.parse_fallback": "Review the issue manually — AI response could not be parsed",
  "server.analysis.parse_failed": "Failed to parse AI response: %v. Raw: %s",
  "server.analysis.action_diverges_from_analysis": "First proposed action diverges from analysis (containment described but first action is a diagnostic)",
  "server.agentic.issue_name_required": "issue_name is required",
  "server.agentic.llm_client_failed": "Failed to get LLM client for agentic step",
  "server.agentic.get_client_error": "failed to get LLM client: %v",
  "server.agentic.llm_failed": "LLM agentic step failed",
  "server.agentic.llm_error": "LLM agentic step failed: %v",
  "server.agentic.diverges_from_insight": "Agentic step diverges from AIInsight primary suggested action",
  "server.remote.agents_list_error": "failed to list agents: %v",
  "server.remote.skills_list_error": "failed to list skills: %v",
  "server.remote.persona_unavailable": "persona system not available",
  "server.remote.agent_name_required": "agent name is required",
  "server.remote.agent_not_found": "agent not found: %v",
  "server.remote.skill_name_required": "skill name is required",
  "server.remote.skill_not_found": "skill not found: %v",
  "server.remote.plugin_unavailable": "plugin system not available",
  "server.remote.plugin_name_required": "plugin_name is required",
  "server.remote.plugin_not_found": "plugin not found: %s",
  "server.remote.plugin_executing": "Executing remote plugin",
  "server.remote.plugin_stat_error": "failed to stat plugin binary: %v",
  "server.remote.plugin_open_error": "failed to open plugin binary: %v",
  "server.remote.plugin_read_error": "read error: %v",
  "server.session.prompt_empty": "prompt cannot be empty",
  "server.session.llm_client_failed": "Failed to get LLM client",
  "server.session.get_client_error": "failed to get LLM client: %v",
  "server.session.send_prompt_failed": "LLM SendPrompt failed",
  "server.session.llm_error": "LLM error: %v",
  "server.session.stream_client_failed": "Failed to get LLM client for stream",
  "server.session.stream_failed": "LLM StreamPrompt failed",
  "server.session.interactive_started": "Interactive session started",
  "server.session.interactive_ended": "Interactive session ended (client closed)",
  "server.session.interactive_recv_error": "Interactive session recv error",
  "server.session.interactive_llm_error": "Failed to get LLM client: %v",
  "server.session.interactive_llm_response_error": "LLM error: %v",
  "server.session.unhandled_message_type": "Unhandled session message type",
  "server.session.mgmt_unavailable": "session management not available",
  "server.hub.unavailable": "conversation hub not available",
  "server.hub.enabled": "conversation hub enabled (cross-channel continuity)",
  "server.hub.init_failed": "conversation hub disabled: init failed: %v",
  "server.hub.no_principal": "no authenticated principal",
  "server.hub.permission_denied": "not allowed to act on behalf of another principal",
  "server.hub.conv_not_found": "conversation not found",
  "server.hub.conv_forbidden": "not allowed to access this conversation",
  "server.hub.resolve_error": "failed to resolve conversation: %v",
  "server.hub.new_error": "failed to start new conversation: %v",
  "server.hub.append_error": "failed to append event: %v",
  "server.hub.read_error": "failed to read conversation: %v",
  "server.hub.bind_error": "failed to bind identity: %v",
  "server.hub.bind_missing": "platform, user_id and principal are required",
  "server.hub.list_bindings_error": "failed to list bindings: %v",
  "server.hub.subscribe_resync": "stream interrupted; resubscribe from last seq to resync",
  "server.session.list_error": "failed to list sessions: %v",
  "server.session.name_empty": "session name cannot be empty",
  "server.session.not_found": "session not found: %v",
  "server.session.save_error": "failed to save session: %v",
  "server.session.delete_error": "failed to delete session: %v",
  "server.session.cmd_empty": "Error: empty command",
  "server.session.cmd_unknown": "Unknown command: '%s'\n\nAvailable remote commands:\n  /status          - Server info (provider, model, version, watcher)\n  /watcher status  - K8s watcher status\n  /plugins list    - List available plugins\n  /agents list     - List available agents\n  /skills list     - List available skills",
  "server.session.cmd_status_header": "=== Server Status ===\n",
  "server.session.cmd_status_version": "Version:  %s\n",
  "server.session.cmd_status_provider": "Provider: %s\n",
  "server.session.cmd_status_model": "Model:    %s\n",
  "server.session.cmd_status_watcher_active": "Watcher:  active",
  "server.session.cmd_status_watcher_target": " (%s/%s)",
  "server.session.cmd_status_watcher_inactive": "Watcher:  inactive\n",
  "server.session.cmd_status_plugins": "Plugins:  %d loaded\n",
  "server.session.cmd_status_agents": "Agents:   %d available\n",
  "server.session.cmd_status_skills": "Skills:   %d available\n",
  "server.session.cmd_status_fallback": "Fallback: configured\n",
  "server.session.cmd_status_mcp": "MCP:      active\n",
  "server.session.cmd_watcher_inactive": "K8s Watcher: inactive (no watcher configured)",
  "server.session.cmd_watcher_header": "=== K8s Watcher Status ===\n",
  "server.session.cmd_watcher_status_active": "Status:     active\n",
  "server.session.cmd_watcher_deployment": "Deployment: %s\n",
  "server.session.cmd_watcher_namespace": "Namespace:  %s\n",
  "server.session.cmd_watcher_summary": "Summary:    %s\n",
  "server.session.cmd_watcher_alerts": "Alerts:     %d\n",
  "server.session.cmd_watcher_snapshots": "Snapshots:  %d\n",
  "server.session.cmd_watcher_pods": "Pods:       %d\n",
  "server.session.cmd_plugins_none_mgr": "No plugin manager configured on this server.",
  "server.session.cmd_plugins_none": "No plugins available.",
  "server.session.cmd_plugins_header": "=== Plugins (%d) ===\n",
  "server.session.cmd_agents_none_loader": "No persona loader configured on this server.",
  "server.session.cmd_agents_error": "Error listing agents: %v",
  "server.session.cmd_agents_none": "No agents available.",
  "server.session.cmd_agents_header": "=== Agents (%d) ===\n",
  "server.session.cmd_skills_none_loader": "No persona loader configured on this server.",
  "server.session.cmd_skills_error": "Error listing skills: %v",
  "server.session.cmd_skills_none": "No skills available.",
  "server.session.cmd_skills_header": "=== Skills (%d) ===\n",
  "server.auth.missing_metadata": "missing metadata",
  "server.auth.missing_authorization": "missing authorization header",
  "server.auth.invalid_format": "invalid authorization format, expected 'Bearer <token>'",
  "server.auth.invalid_token": "invalid token",
  "server.auth.metadata_warn": "Missing metadata in request",
  "server.auth.authorization_warn": "Missing authorization header",
  "server.auth.format_warn": "Invalid authorization format",
  "server.auth.token_warn": "Invalid token",
  "server.middleware.unary_call": "gRPC unary call",
  "server.middleware.stream_call": "gRPC stream call",
  "server.middleware.panic_unary": "Panic recovered in gRPC unary handler",
  "server.middleware.panic_stream": "Panic recovered in gRPC stream handler",
  "server.middleware.internal_error": "internal server error",
  "cmd.server.gateway_colocated": "Gateway co-located in server process (real-time cross-channel push enabled)",
  "cmd.server.gateway_hub_disabled": "CHATCLI_GATEWAY_IN_SERVER set but the hub is disabled; gateway not co-located",
  "cmd.server.gateway_init_failed": "Failed to initialize the co-located gateway",
  "cmd.server.gateway_stopped": "Co-located gateway stopped with error",
  "cmd.server.session_init_failed": "Failed to initialize session manager, sessions will be unavailable",
  "cmd.server.plugin_init_failed": "Failed to initialize plugin manager, remote plugins will be unavailable",
  "cmd.server.plugin_init_success": "Plugin manager initialized for remote discovery",
  "cmd.server.persona_init_success": "Persona loader initialized for remote discovery",
  "cmd.server.fallback_unavailable": "fallback provider unavailable, skipping",
  "cmd.server.fallback_init_success": "Fallback chain initialized",
  "cmd.server.mcp_config_failed": "Failed to load MCP config, MCP tools will be unavailable",
  "cmd.server.mcp_start_failed": "Failed to start MCP servers",
  "cmd.server.mcp_init_success": "MCP manager initialized",
  "cmd.server.watch_config_failed": "failed to load watch config: %w",
  "cmd.server.watch_create_failed": "failed to create K8s watcher: %w",
  "cmd.server.watch_starting": "Starting K8s multi-watcher",
  "cmd.server.watch_error": "K8s multi-watcher stopped with error",
  "cmd.server.watch_active": "K8s watcher active: %d targets (interval: %s)\n",
  "cmd.connect.addr_required": "server address is required (use --addr or positional argument)",
  "cmd.connect.local_auth_failed": "failed to resolve local auth: %w",
  "cmd.connect.remote_failed": "failed to connect to remote server: %w",
  "cmd.connect.health_failed": "server health check failed: %w",
  "cmd.connect.not_healthy": "server is not healthy",
  "cmd.connect.connected": "Connected to ChatCLI server (%s)\n",
  "cmd.connect.using_local_oauth": ", using local OAuth credentials",
  "cmd.connect.using_api_key": ", using your own API key",
  "cmd.connect.watcher_active": "K8s watcher active: %s (context injected into all prompts)\n",
  "cmd.connect.prompt_failed": "remote prompt failed: %w",
  "cmd.connect.init_failed": "failed to initialize ChatCLI: %w",
  "cmd.connect.auth_unsupported": "--use-local-auth only supports OAuth providers (CLAUDEAI, OPENAI, COPILOT). Provider '%s' requires --llm-key with an API key instead",
  "cmd.connect.auth_not_found": "no local credentials found for %s: %w\nRun 'chatcli' then '/auth login %s' first",
  "cmd.connect.auth_auto_resolved": "Auto-resolved local auth",
  "cmd.connect.auth_no_creds": "no local OAuth credentials found. Run 'chatcli' then '/auth login anthropic' or '/auth login openai-codex' or '/auth login github-copilot' first",
  "cmd.watch.deployment_required": "deployment name or config file required (use --deployment or --config)",
  "cmd.watch.config_failed": "failed to load watch config: %w",
  "cmd.watch.create_failed": "failed to create K8s watcher: %w",
  "cmd.watch.error": "K8s watcher stopped with error",
  "cmd.watch.starting": "Starting K8s watcher: %d targets (interval: %s, window: %s)\n",
  "cmd.watch.data_collected": "Initial data collected. K8s context will be injected into all prompts.",
  "cmd.watch.init_failed": "failed to initialize ChatCLI: %w",
  "cmd.watch.override_failed": "failed to apply provider/model overrides: %w",
  "cmd.watch.interactive_hint": "Type your questions about the deployments. K8s context is automatically included.",
  "cmd.watch.interactive_hint2": "Use /watch to see current status.\n\n",
  "cmd.watch.no_provider": "no LLM provider configured",
  "cmd.watch.llm_client_failed": "failed to create LLM client: %w",
  "cmd.watch.llm_request_failed": "LLM request failed: %w",
  "auth.resolver.no_credentials": "no credentials for provider %s",
  "auth.resolver.oauth_refresh_failed": "OAuth token refresh failed",
  "auth.resolver.oauth_save_failed": "Failed to persist refreshed OAuth token",
  "auth.store.not_found": "Auth store not found, creating new",
  "auth.store.read_failed": "Failed to read auth store",
  "auth.store.decrypt_failed": "Failed to decrypt auth store",
  "auth.store.parse_failed": "Failed to parse auth store",
  "auth.store.create_dir_failed": "failed to create auth directory: %w",
  "auth.store.marshal_failed": "failed to marshal auth store: %w",
  "auth.store.encrypt_failed": "failed to encrypt auth store: %w",
  "auth.store.write_failed": "failed to write auth store: %w",
  "auth.store.saved": "Auth store saved (encrypted)",
  "auth.refresh.nil_cred": "nil cred",
  "auth.refresh.not_oauth": "cred is not oauth",
  "auth.refresh.missing_refresh": "missing refresh token",
  "auth.refresh.unsupported_provider": "unsupported oauth provider: %s",
  "auth.refresh.failed": "oauth refresh failed: %w",
  "auth.token_provider.empty_token": "auth token is empty",
  "auth.token_provider.persist_failed": "Failed to persist refreshed OAuth token to auth store",
  "auth.token_provider.background_refresh_failed": "Proactive OAuth refresh failed; will retry",
  "auth.login.anthropic_opening": "\nAUTH [Anthropic] Opening browser for authentication...",
  "auth.login.browser_failed": "Could not open browser automatically. Open this URL manually:",
  "auth.login.anthropic_browser_ok": "Browser opened. After authorizing, copy the code shown on the page and paste it below.",
  "auth.login.anthropic_browser_ok_callback": "Browser opened. Waiting for authentication callback...",
  "auth.login.anthropic_browser_failed": "Could not open browser automatically. Open this URL manually:",
  "auth.login.anthropic_browser_hint": "If the browser did not open, copy and paste this URL:",
  "auth.login.anthropic_paste_code": "\n> Paste the code here: ",
  "auth.login.anthropic_read_failed": "failed to read authorization code: %w",
  "auth.login.anthropic_code_required": "code is required",
  "auth.login.anthropic_state_failed": "failed to generate OAuth state: %w",
  "auth.login.anthropic_waiting": "\nWaiting for callback (press Ctrl+C to cancel, auto-timeout in 5 minutes)...",
  "auth.login.anthropic_callback_error": "callback error: %w",
  "auth.login.anthropic_timeout": "OAuth callback timed out after %s",
  "auth.login.anthropic_csrf_error": "OAuth state mismatch: possible CSRF attack",
  "auth.login.anthropic_no_code_error": "no code in callback",
  "auth.login.anthropic_auth_failed_html": "<html><body><h2>Authentication failed</h2><p>Invalid state parameter (possible CSRF attack). You can close this tab.</p></body></html>",
  "auth.login.anthropic_no_code_html": "<html><body><h2>Authentication failed</h2><p>No authorization code received. You can close this tab.</p></body></html>",
  "auth.login.anthropic_fallback_paste": "Could not start local callback server; falling back to legacy paste flow.",
  "auth.login.openai_opening": "\nAUTH [OpenAI Codex] Opening browser for authentication...",
  "auth.login.openai_state_failed": "failed to generate OAuth state: %w",
  "auth.login.openai_listener_failed": "failed to start local callback server on port %s: %w",
  "auth.login.openai_auth_failed_html": "<html><body><h2>Authentication failed</h2><p>Invalid state parameter (possible CSRF attack). You can close this tab.</p></body></html>",
  "auth.login.openai_csrf_error": "OAuth state mismatch: possible CSRF attack",
  "auth.login.openai_no_code_html": "<html><body><h2>Authentication failed</h2><p>No authorization code received. You can close this tab.</p></body></html>",
  "auth.login.openai_no_code_error": "no code in callback",
  "auth.login.openai_success_html": "<html><body><h2>Authentication successful!</h2><p>You can close this tab and return to the terminal.</p></body></html>",
  "auth.login.openai_browser_failed": "Could not open browser automatically. Open this URL manually:",
  "auth.login.openai_browser_ok": "Browser opened. Waiting for authentication callback...",
  "auth.login.openai_browser_hint": "If the browser did not open, copy and paste this URL:",
  "auth.login.openai_waiting": "\nWaiting for callback (press Ctrl+C to cancel, auto-timeout in 5 minutes)...",
  "auth.login.openai_callback_error": "callback error: %w",
  "auth.login.openai_timeout": "OAuth callback timed out after %s",
  "auth.login.unsupported_platform": "unsupported platform",
  "auth.login.status_not_connected": "not connected",
  "auth.login.status_no_expiry": "type=%s expiry=no expiry (persistent)",
  "auth.login.status_format": "type=%s expiry=%s",
  "auth.login.status_env": "via %s (env fallback)",
  "auth.login.status_display": "Anthropic: %s\nOpenAI Codex: %s\nGitHub Copilot: %s\nGitHub Models: %s",
  "auth.copilot.device_code_failed": "failed to request device code: %w",
  "auth.copilot.opening": "\nAUTH [GitHub Copilot] Device authentication required.",
  "auth.copilot.step1": "  1. Open: %s\n",
  "auth.copilot.step2": "  2. Enter code: %s\n",
  "auth.copilot.browser_failed": "Could not open browser automatically. Open the URL above manually.",
  "auth.copilot.browser_ok": "Browser opened. Enter the code above and authorize the application.",
  "auth.copilot.waiting": "Waiting for authorization (press Ctrl+C to cancel)...",
  "auth.copilot.save_failed": "failed to save credentials: %w",
  "auth.copilot.success": "GitHub Copilot authentication successful!",
  "auth.copilot.read_response_failed": "failed to read device code response: %w",
  "auth.copilot.request_failed": "device code request failed (%s): %s",
  "auth.copilot.parse_failed": "failed to parse device code response: %w",
  "auth.copilot.invalid_response": "invalid device code response: missing device_code or user_code",
  "auth.copilot.code_expired": "device code expired; please try again",
  "auth.copilot.poll_retry": "Token poll request failed, retrying",
  "auth.copilot.slow_down": "Slowing down poll interval",
  "auth.copilot.empty_token": "empty access token in response",
  "auth.copilot.denied": "authorization denied by user",
  "auth.copilot.oauth_error": "OAuth error: %s — %s",
  "auth.github_models.header": "  GitHub Models — Authentication",
  "auth.github_models.separator": "  ─────────────────────────────────",
  "auth.github_models.description": "  GitHub Models uses a Personal Access Token (PAT) for authentication.",
  "auth.github_models.create_url": "  Create one at: https://github.com/settings/tokens",
  "auth.github_models.scopes_hint": "  (No special scopes needed for model inference)",
  "auth.github_models.found_env": "  Found token in %s, using it.\n",
  "auth.github_models.save_failed": "failed to save credential: %w",
  "auth.github_models.saved_from_env": "GitHub Models token saved from env",
  "auth.github_models.prompt": "  Paste your GitHub token (ghp_... or github_pat_...): ",
  "auth.github_models.read_failed": "failed to read token: %w",
  "auth.github_models.empty_token": "empty token",
  "auth.github_models.saved": "GitHub Models PAT saved",
  "auth.github_models.success": "  ✓ Token saved successfully!",
  "auth.crypto.keygen_failed": "failed to generate encryption key: %w",
  "auth.crypto.keydir_failed": "failed to create key directory: %w",
  "auth.crypto.keysave_failed": "failed to save encryption key: %w",
  "auth.crypto.cipher_failed": "failed to create cipher: %w",
  "auth.crypto.gcm_failed": "failed to create GCM: %w",
  "auth.crypto.nonce_failed": "failed to generate nonce: %w",
  "auth.crypto.decode_failed": "failed to decode encrypted data: %w",
  "auth.crypto.data_too_short": "encrypted data too short",
  "auth.crypto.decrypt_failed": "failed to decrypt auth data: %w",
  "auth.sync.anthropic_newer": "existing Anthropic credentials are newer, skipping sync",
  "auth.sync.anthropic_save_failed": "failed to save synced Anthropic credentials",
  "auth.sync.anthropic_synced": "synced Anthropic credentials from Claude Code",
  "auth.sync.codex_newer": "existing OpenAI Codex credentials are newer, skipping sync",
  "auth.sync.codex_save_failed": "failed to save synced Codex credentials",
  "auth.sync.codex_synced": "synced OpenAI credentials from Codex CLI",
  "auth.sync.claude_expired": "Claude Code token expired, skipping",
  "auth.sync.claude_cred_expired": "Claude credential expired, skipping",
  "auth.sync.codex_token_expired": "Codex CLI token expired, skipping",
  "llm.zai.jwt_generated": "ZAI JWT token generated",
  "llm.zai.jwt_cached": "Using cached ZAI JWT token",
  "llm.zai.jwt_invalid_key": "Invalid ZAI API key format for JWT (expected id.secret), using raw key",
  "llm.info.using_custom_base_url": "Using custom base URL for %s: %s",

  "cfg.route.unknown_section": "Unknown section: %s",
  "cfg.route.hint": "Sections: all, general, providers, agent, resilience, session, integrations, auth, security, server",

  "cfg.val.default": "(default)",
  "cfg.val.default_tag": "(default)",
  "cfg.val.not_set": "(not set)",
  "cfg.val.none": "(none)",
  "cfg.val.empty": "(empty)",
  "cfg.val.not_initialized": "not initialized",
  "cfg.val.enabled": "enabled",
  "cfg.val.disabled": "disabled",
  "cfg.val.valid": "valid",
  "cfg.val.expired": "EXPIRED",
  "cfg.val.expires_in": "(expires in %s)",
  "cfg.val.expired_ago": "(expired %s ago)",
  "cfg.val.no_provider": "(no provider)",
  "cfg.val.unknown": "(unknown)",
  "cfg.val.unnamed_session": "(unnamed — use /session save <name>)",
  "cfg.val.unnamed": "(unnamed)",
  "cfg.val.no_matches_yet": "(no matches yet)",
  "cfg.val.none_set": "(none set)",
  "cfg.val.already_warned": "already shown this session",
  "cfg.val.yes": "yes",
  "cfg.val.off": "off",
  "cfg.val.on": "on",
  "cfg.val.budget_ok": "OK",
  "cfg.val.budget_warning": "WARNING",
  "cfg.val.budget_exceeded": "EXCEEDED",

  "cfg.panorama.title": "CHATCLI — PANORAMA",
  "cfg.panorama.drill_down": "Drill-down:",
  "cfg.panorama.sections_hint": "Sections: providers, agent, resilience, session, integrations, auth, security, server",

  "cfg.section.general.title": "GENERAL",
  "cfg.section.providers.title": "PROVIDERS",
  "cfg.section.agent.title": "AGENT RUNTIME",
  "cfg.section.resilience.title": "RESILIENCE & PROXY",
  "cfg.section.session.title": "SESSION",
  "cfg.section.integrations.title": "INTEGRATIONS",
  "cfg.section.auth.title": "AUTH / OAUTH",
  "cfg.section.security.title": "SECURITY & SANDBOX",
  "cfg.section.quality.title": "AGENT QUALITY PIPELINE",
  "cfg.section.memory.title": "LONG-TERM MEMORY",
  "cfg.sub.memory.injection": "Injection mode (agent/coder)",
  "cfg.sub.selfevolve": "Self-evolution (skill authoring)",
  "cfg.sub.graph": "Knowledge graph (per-turn index card)",
  "cfg.kv.selfevolve.mode_auto": "auto — detects and authors/evolves skills automatically (edit-safe, reversible)",
  "cfg.kv.selfevolve.mode_suggest": "suggest — detects and suggests skills; never writes to disk",
  "cfg.kv.selfevolve.mode_off": "off — disabled",
  "cfg.section.selfevolve.title": "Self-evolution",
  "cfg.sub.selfevolve.mode": "Autonomy",
  "cfg.sub.selfevolve.skills": "Skills",
  "cfg.kv.selfevolve.skills_total": "skills total",
  "cfg.kv.selfevolve.skills_authored": "engine-authored",
  "cfg.kv.selfevolve.stats_hint": "Run @skill stats for per-skill activation analytics.",
  "cfg.kv.selfevolve.see_section": "self-evolution",
  "cfg.kv.selfevolve.see_section_val": "see /config selfevolve",
  "cfg.kv.memory.mode_full": "full — push the whole retrieval every turn",
  "cfg.kv.memory.mode_index": "index — push a stable digest, pull detail via @memory recall",
  "cfg.kv.memory.mode_off": "off — inject no memory (bootstrap still applies)",
  "cfg.kv.memory.index_size": "Current index size",
  "cfg.section.hub.title": "Conversation Hub (cross-channel continuity)",
  "cfg.sub.hub.local": "Local mode (same machine, no /connect)",
  "cfg.sub.hub.settings": "Settings (setting > env > default)",
  "cfg.hub.mutable_hint": "change with: /config hub set <key> <value>  ·  clear with: /config hub reset <key>",
  "cfg.hub.readonly_hint": "read-only this session (no local/connected hub); use env vars",
  "cfg.hub.no_session": "hub settings require local hub or /connect (set CHATCLI_HUB_PRINCIPAL or /connect)",
  "cfg.hub.set_usage": "usage: /config hub set <enabled|principal|isolate|ttl_hours> <value>  |  /config hub reset <key>",
  "cfg.hub.unknown_key": "unknown key %q; valid: %s",
  "cfg.hub.set_ok": "set %s = %s",
  "cfg.hub.reset_ok": "reset %s (falls back to env/default)",
  "cfg.hub.bad_bool": "%s accepts on/off (true/false)",
  "cfg.hub.bad_int": "%s accepts an integer >= 0",
  "cfg.sub.hub.server": "Server / storage",
  "cfg.sub.hub.session": "Current session",
  "cfg.hub.state": "state",
  "cfg.hub.connected": "connected",
  "cfg.hub.not_connected": "not connected (use /connect)",
  "cfg.hub.principal": "principal",
  "cfg.hub.conversation": "conversation",
  "cfg.section.server.title": "SERVER / OPERATOR",

  "cfg.sub.quality.refine": "── Self-Refine (#5)",
  "cfg.sub.quality.verify": "── Chain-of-Verification / CoVe (#6)",
  "cfg.sub.quality.reflexion": "── Reflexion (#3)",
  "cfg.sub.quality.plan_first": "── Plan-and-Solve / ReWOO (#2)",
  "cfg.sub.quality.hyde": "── RAG + HyDE (#4)",
  "cfg.sub.quality.reasoning": "── Reasoning backbone (#7)",
  "cfg.kv.quality.hooks_registered": "Hooks registered",
  "cfg.kv.quality.reflexion_runtime": "Runtime state",
  "cfg.kv.quality.vector_provider": "Vector provider",
  "cfg.kv.quality.vector_count": "Vector entries",
  "cfg.kv.quality.vector_state": "Vector index",
  "cfg.val.not_attached": "(not attached)",

  "complete.root.thinking": "Override extended thinking / reasoning_effort for the next turn (cross-provider)",
  "complete.root.plan": "Force Plan-and-Solve / ReWOO on the next /agent or /coder run",
  "complete.root.refine": "Toggle Self-Refine post-processing for the session (on|off|auto)",
  "complete.root.verify": "Toggle Chain-of-Verification (CoVe) for the session (on|off|auto)",
  "complete.root.reflect": "Persist a manual lesson into long-term memory (Reflexion)",
  "reflect.armed_blank": "/reflect needs a free-text lesson — e.g. /reflect when editing large Go files use Edit, not full rewrite",
  "reflect.no_memory": "memory store unavailable — /reflect cannot persist",
  "reflect.persisted": "lesson persisted to long-term memory (category=lesson)",
  "reflect.mistake_user_supplied": "(user-supplied lesson; no automatic mistake detection)",
  "reflect.status_legacy": "reflexion: legacy mode (detached goroutine, no durable queue)",
  "reflect.status_queue": "reflexion queue: %d pending",
  "reflect.status_dlq": "reflexion DLQ: %d entries",
  "reflect.status_hint": "subcommands: /reflect list | failed | retry <id> | purge <id> | drain",
  "reflect.queue_disabled": "reflexion queue is disabled — enable via CHATCLI_QUALITY_REFLEXION_QUEUE_ENABLED=1",
  "reflect.list_pending_header": "pending (%d):",
  "reflect.list_dlq_header": "dead letter queue (%d):",
  "reflect.dlq_empty": "DLQ is empty — no failed lessons to review",
  "reflect.dlq_list_failed": "failed to list DLQ entries",
  "reflect.retry_usage": "usage: /reflect retry <job-id>",
  "reflect.retry_ok": "job %s re-queued",
  "reflect.retry_failed": "retry failed",
  "reflect.purge_usage": "usage: /reflect purge <job-id>",
  "reflect.purge_ok": "job %s purged from DLQ",
  "reflect.purge_failed": "purge failed",
  "reflect.drain_ok": "drain complete — %d job(s) re-enqueued from WAL",
  "reflect.drain_failed": "drain failed",
  "reflect.field_task": "task",
  "reflect.field_error": "last error",
  "refine.set_on": "self-refine ON for this session",
  "refine.set_off": "self-refine OFF for this session",
  "refine.set_once": "self-refine armed (next agent turn will refine)",
  "refine.cleared": "self-refine override cleared (using /config quality)",
  "refine.usage": "usage: /refine [on|off|once|auto]",
  "refine.state_auto": "self-refine: auto (no override — using /config quality)",
  "refine.state_on": "self-refine: ON (session override active)",
  "refine.state_off": "self-refine: OFF (session override active)",
  "verify.set_on": "verify (CoVe) ON for this session",
  "verify.set_off": "verify (CoVe) OFF for this session",
  "verify.set_once": "verify armed (next agent turn will verify)",
  "verify.cleared": "verify override cleared (using /config quality)",
  "verify.usage": "usage: /verify [on|off|once|auto]",
  "verify.state_auto": "verify: auto (no override — using /config quality)",
  "verify.state_on": "verify: ON (session override active)",
  "verify.state_off": "verify: OFF (session override active)",
  "plan.armed": "plan-first armed — your next /agent or /coder turn will run a structured plan",
  "plan_first.executed": "plan-first executed %d step(s) before handing off to the orchestrator",
  "plan_first.with_errors": "(some steps had errors — orchestrator will see them in the report)",
  "plan_first.synth_plan_header": "Auto-generated structured plan (Plan-and-Solve / ReWOO):",
  "plan_first.orchestrator_handoff": "Use the report above as ground truth for the user-facing answer; do not re-run completed steps.",
  "plan_first.spinner_planning": "planning structured steps (Plan-and-Solve)...",
  "plan_first.spinner_executing": "executing structured plan...",
  "plan_first.preview_header": "Generated plan (dry-run — nothing will be executed)",
  "plan_first.preview_task": "Summary",
  "plan_first.preview_parallel": "Parallel groups",
  "plan_first.preview_parse_failed": "Could not parse the plan JSON — showing raw output:",
  "plan_first.preview_footer": "To execute this plan: /plan <same task> (or /plan coder <task>)",
  "plan.preview_usage": "usage: /plan preview <task description>",
  "thinking.cleared": "thinking override cleared — using skill hints + quality auto-agents",
  "thinking.disabled": "thinking disabled for next turn (override active)",
  "thinking.set": "thinking override set to %s for next turn",
  "thinking.bad_budget": "invalid budget value: %s — expected a positive integer",
  "thinking.unknown_arg": "unknown /thinking argument: %s",
  "thinking.usage": "usage: /thinking [auto|off|on|low|medium|high|max|budget=N]",
  "thinking.state_auto": "thinking: auto (no override active)",
  "thinking.state_off": "thinking: explicitly off (override active)",
  "thinking.state_set": "thinking: %s (override active)",

  "cfg.sub.general.locale": "── Locale & version",
  "cfg.sub.general.logging": "── Logging",
  "cfg.sub.general.history": "── Command history",
  "cfg.sub.prov.openai": "── OpenAI",
  "cfg.sub.prov.anthropic": "── Anthropic (Claude)",
  "cfg.sub.prov.googleai": "── Google AI (Gemini)",
  "cfg.sub.prov.xai": "── xAI (Grok)",
  "cfg.sub.prov.ollama": "── Ollama",
  "cfg.sub.prov.bedrock": "── AWS Bedrock",
  "cfg.sub.prov.copilot": "── GitHub Copilot",
  "cfg.sub.prov.github_models": "── GitHub Models",
  "cfg.sub.prov.openrouter": "── OpenRouter",
  "cfg.sub.prov.zai": "── ZAI (Zhipu)",
  "cfg.sub.prov.minimax": "── MiniMax",
  "cfg.sub.prov.moonshot": "── Moonshot (Kimi)",
  "cfg.sub.prov.stackspot": "── StackSpot",
  "cfg.sub.agent.parallelism": "── Parallelism & workers",
  "cfg.sub.agent.token_efficiency": "── Token efficiency (early-exit & smart routing)",
  "cfg.sub.agent.execution": "── Execution",
  "cfg.sub.agent.coder_denial": "── Coder denial caps",
  "cfg.sub.agent.per_agent": "── Per-agent overrides (set any)",
  "cfg.sub.agent.persona": "── Active persona (runtime)",
  "cfg.sub.resil.payload": "── Payload & recovery",
  "cfg.sub.resil.streaming": "── Streaming",
  "cfg.sub.resil.compaction": "── Compaction",
  "cfg.sub.resil.tls_trust": "── Global TLS trust (corporate proxy CA)",
  "cfg.sub.resil.bedrock_proxy": "── Bedrock corporate proxy",
  "cfg.sub.resil.web_proxy": "── Web tools corporate proxy (webfetch/websearch/osv)",
  "cfg.sub.resil.session_state": "── Session state",
  "cfg.sub.session.cost": "── Cost & budget",
  "cfg.sub.session.attached": "── Attached contexts",
  "cfg.sub.session.memory": "── Memory system",
  "cfg.sub.integ.mcp": "── MCP (Model Context Protocol)",
  "cfg.sub.integ.hooks": "── Hooks (lifecycle events)",
  "cfg.sub.integ.plugins": "── Plugins",
  "cfg.sub.integ.skills": "── Skills & registry",
  "cfg.sub.integ.websearch": "── Web search",
  "cfg.sub.integ.gateway_voice": "── Gateway · Voice transcription",
  "cfg.sub.integ.gateway_tts": "── Gateway · Voice reply (TTS)",
  "cfg.sub.integ.imagegen": "── Image generation (@image)",
  "cfg.kv.transcription": "Active backend",
  "cfg.sub.integ.gateway_send": "── Gateway · Proactive messaging (@send)",
  "cfg.kv.send_platforms": "Configured platforms",
  "cfg.val.transcription_off": "disabled (text only)",
  "cfg.val.tts_off": "disabled",
  "cfg.val.imagegen_off": "disabled",
  "cfg.kv.imagegen": "Image backend",
  "cfg.section.diagram.title": "Diagram Rendering (@diagram)",
  "cfg.sub.diagram.backend": "── Backend",
  "cfg.sub.diagram.system": "── System Graphviz",
  "cfg.kv.diagram_effective": "Effective backend",
  "cfg.kv.diagram_dot": "System dot",
  "cfg.kv.diagram_dot_version": "Version",
  "cfg.val.diagram_dot_missing": "not installed (using embedded)",
  "cfg.kv.tts": "Voice backend",
  "cfg.sub.integ.worktrees": "── Git worktrees",
  "cfg.sub.integ.watcher": "── K8s watcher",
  "cfg.sub.integ.remote": "── Remote connection",
  "cfg.sub.auth.oauth": "── OAuth profiles",
  "cfg.sub.sec.cmd_policy": "── Command policy",
  "cfg.sub.sec.workspace": "── Workspace / paths",
  "cfg.sub.sec.coder_policy": "── Coder policy",
  "cfg.sub.sec.tls": "── TLS / proxy",
  "cfg.sub.sec.redaction": "── Redaction & scrubbing",
  "cfg.sub.sec.plugins": "── Plugins",
  "cfg.sub.server.grpc": "── gRPC server",
  "cfg.sub.server.jwt": "── JWT",
  "cfg.sub.server.rate_limit": "── Rate limit",
  "cfg.sub.server.fallback": "── Fallback chain (server)",
  "cfg.sub.server.watcher": "── K8s watcher (server)",
  "cfg.sub.server.audit": "── Audit",
  "cfg.sub.server.operator": "── Operator / AIOps",

  "cfg.kv.provider": "Provider",
  "cfg.kv.model": "Model",
  "cfg.kv.model_client": "Model (client)",
  "cfg.kv.preferred_api": "Preferred API",
  "cfg.kv.effective_max_tokens": "Effective max tokens",
  "cfg.kv.session": "Session",
  "cfg.kv.messages": "Messages",
  "cfg.kv.tokens_used": "Tokens used",
  "cfg.kv.cost_usd": "Cost (USD)",
  "cfg.kv.budget": "Budget",
  "cfg.kv.session_duration": "Session duration",
  "cfg.kv.persona": "Persona",
  "cfg.kv.plugins_loaded": "Plugins loaded",
  "cfg.kv.mcp_servers": "MCP servers",
  "cfg.kv.hooks_configured": "Hooks configured",
  "cfg.kv.websearch_chain": "Web search chain",
  "cfg.kv.remote": "Remote",
  "cfg.kv.active_provider": "Active provider",
  "cfg.kv.active_model": "Active model",
  "cfg.kv.available_n": "Available #%d",
  "cfg.kv.realm_runtime": "Realm (runtime)",
  "cfg.kv.agent_id_runtime": "Agent ID (runtime)",
  "cfg.kv.name": "Name",
  "cfg.kv.description": "Description",
  "cfg.kv.attached_count": "Attached count",
  "cfg.kv.active_persona": "Active persona",
  "cfg.kv.persona_system": "Persona system",
  "cfg.kv.history_messages": "History messages",
  "cfg.kv.history_chars": "History chars",
  "cfg.kv.proxy_warning": "Proxy warning",
  "cfg.kv.started": "Started",
  "cfg.kv.duration": "Duration",
  "cfg.kv.total_cost_usd": "Total cost (USD)",
  "cfg.kv.total_tokens": "Total tokens",
  "cfg.kv.budget_status": "Budget status",
  "cfg.kv.cost_tracker": "Cost tracker",
  "cfg.kv.attached": "Attached",
  "cfg.kv.daily_notes_on_disk": "Daily notes on disk",
  "cfg.kv.today_note_path": "Today's note path",
  "cfg.kv.long_term_size": "Long-term size",
  "cfg.kv.long_term_memory": "Long-term memory",
  "cfg.kv.memory_store": "Memory store",
  "cfg.kv.servers": "Servers",
  "cfg.kv.total_tools": "Total tools",
  "cfg.kv.shadowed_builtins": "Shadowed builtins",
  "cfg.kv.mcp_manager": "MCP manager",
  "cfg.kv.configured": "Configured",
  "cfg.kv.hook_manager": "Hook manager",
  "cfg.kv.loaded": "Loaded",
  "cfg.kv.registries": "Registries",
  "cfg.kv.skills_installed": "Skills installed",
  "cfg.kv.active_chain": "Active chain",
  "cfg.kv.repo_root": "Repo root",
  "cfg.kv.current_branch": "Current branch",
  "cfg.kv.active": "Active",
  "cfg.kv.status": "Status",
  "cfg.kv.address": "Address",
  "cfg.kv.provider_remote": "Provider (remote)",
  "cfg.kv.model_remote": "Model (remote)",
  "cfg.kv.local_provider_saved": "Local provider saved",
  "cfg.kv.local_model_saved": "Local model saved",
  "cfg.kv.active_policy": "Active policy",
  "cfg.kv.local_override": "Local override",
  "cfg.kv.local_merge": "Local merge",
  "cfg.kv.rule_count": "Rule count",
  "cfg.kv.last_match": "Last match",
  "cfg.kv.dotenv_path": ".env file path",
  "cfg.kv.history_file": "History file",

  "cfg.msg.skip_server": "No server-mode env vars detected — skipping (CLI context).",
  "cfg.msg.server_hint": "This section is only meaningful when running `chatcli server` or the operator.",
  "cfg.msg.auth_hint": "Run /auth login <provider> to authenticate.",
  "cfg.msg.not_logged_in": "(not logged in)",
  "cfg.msg.profile_load_error": "[profile %s] error loading",
  "cfg.msg.disconnected": "disconnected",
  "cfg.msg.connected_tools": "connected, %d tools",
  "cfg.msg.last_error": " — last error: %s",
  "cfg.msg.no_contexts_attached": "(none — /context attach <name>)",
  "cfg.msg.no_persona": "(none — /agent load <name>)",
  "cfg.msg.manager_not_init": "(manager not initialized)",

  "ws.cmd.usage_provider": "Usage: /websearch provider <searxng|duckduckgo|auto>",
  "ws.cmd.unknown_sub": "Unknown subcommand: %s",
  "ws.cmd.usage_hint": "Usage: /websearch [list|provider <name>|reset|status]",
  "ws.cmd.override_cleared": "✓ Override cleared — back to auto mode.",
  "ws.cmd.box_title": "WEB SEARCH",
  "ws.cmd.box_providers": "PROVIDERS",
  "ws.cmd.kv_override": "Override",
  "ws.cmd.kv_searxng_url": "SearxNG URL",
  "ws.cmd.searxng_not_configured": "(not configured — set SEARXNG_URL)",
  "ws.cmd.active_chain_header": "Active chain:",
  "ws.cmd.sx_configured": "✓ configured",
  "ws.cmd.sx_not_configured": "✗ not configured (SEARXNG_URL empty)",
  "ws.cmd.sx_tagline": "self-hosted, ideal for corporate environments, no API key",
  "ws.cmd.ddg_available": "✓ always available",
  "ws.cmd.ddg_tagline": "HTML scraping, no API key, may fail with CAPTCHA",
  "ws.cmd.brave_tagline": "HTML scraping, independent index, no API key",
  "ws.cmd.mojeek_tagline": "HTML scraping, independent index, no API key; some networks get a 403",
  "ws.cmd.invalid_provider": "Invalid provider: %s",
  "ws.cmd.valid_options": "Options: searxng, duckduckgo, auto",
  "ws.cmd.sx_missing_url_warn": "⚠ SearxNG selected but SEARXNG_URL is not set.",
  "ws.cmd.sx_missing_url_hint1": "Chain will fall back to DuckDuckGo until you configure:",
  "ws.cmd.sx_missing_url_hint2": "export SEARXNG_URL=https://searx.internal.corp",
  "ws.cmd.provider_set_session": "✓ Preferred provider: %s (this session only)",
  "ws.cmd.persist_hint": "To persist, add to your shell/.env:",
  "ws.cmd.persist_unset": "unset CHATCLI_WEBSEARCH_PROVIDER",
  "ws.cmd.persist_set": "export CHATCLI_WEBSEARCH_PROVIDER=%s",

  "complete.config.all": "Full dump (all sections)",
  "complete.config.general": "dotenv, locale, logging, version check",
  "complete.config.providers": "Env vars for all providers (OpenAI, Claude, Bedrock, etc)",
  "complete.config.agent": "Agent runtime — workers, subagents, coder UI",
  "complete.config.resilience": "Payload caps, recovery, stream timeout, global TLS trust, Bedrock proxy",
  "complete.config.session": "Session, cost, budget, contexts, memory",
  "complete.config.integrations": "MCP, hooks, plugins, websearch, skills, worktrees, watcher, remote",
  "complete.config.auth": "OAuth status per provider + keychain",
  "complete.config.security": "Command policy, workspace sandbox, TLS, redaction",
  "complete.config.server": "Server/operator env vars (only in server mode)",
  "complete.config.quality": "Seven-pattern agent quality pipeline (Self-Refine, CoVe, Reflexion, Plan-First, HyDE, Reasoning)",
  "complete.config.root_desc": "Configuration panorama (sections: all, general, providers, agent, quality, resilience, session, integrations, auth, security, server)",
  "complete.config.status_alias": "Alias of /config — configuration panorama",

  "complete.thinking.auto": "Clear override — defer to skill hints + quality.reasoning auto-agents",
  "complete.thinking.off": "Force NO thinking / reasoning_effort for next turn",
  "complete.thinking.on": "Alias for /thinking high — enable high-tier reasoning next turn",
  "complete.thinking.low": "Map to SkillEffort low (OpenAI reasoning.effort=low; no Anthropic thinking)",
  "complete.thinking.medium": "Map to SkillEffort medium (Anthropic thinking_budget=4096; OpenAI reasoning.effort=medium)",
  "complete.thinking.high": "Map to SkillEffort high (Anthropic thinking_budget=16384; OpenAI reasoning.effort=high)",
  "complete.thinking.max": "Map to SkillEffort max (Anthropic thinking_budget=32768)",
  "complete.thinking.budget_medium": "Tier closest to 4096 thinking tokens → medium",
  "complete.thinking.budget_high": "Tier closest to 8000 thinking tokens → high (default)",
  "complete.thinking.budget_max": "Tier closest to 16384 thinking tokens → max",

  "complete.refine.on": "Force Self-Refine ON for this session (overrides /config quality)",
  "complete.refine.off": "Force Self-Refine OFF for this session",
  "complete.refine.once": "Arm Self-Refine for the next turn only",
  "complete.refine.auto": "Clear session override — use /config quality setting",
  "complete.refine.clear": "Alias for auto — clear session override",

  "complete.verify.on": "Force Chain-of-Verification ON for this session",
  "complete.verify.off": "Force Chain-of-Verification OFF for this session",
  "complete.verify.once": "Arm CoVe for the next turn only",
  "complete.verify.auto": "Clear session override — use /config quality setting",
  "complete.verify.clear": "Alias for auto — clear session override",

  "complete.plan.hint": "Free-text task. Without args, arms plan-first flag for the next /agent or /coder run.",
  "complete.plan.agent": "Explicit: plan-first + agent mode (same as /plan <task>)",
  "complete.plan.coder": "Plan-first + coder mode (software engineer with tools)",
  "complete.plan.preview": "Dry-run: generate and render the plan without executing anything",
  "complete.plan.dry": "Alias of preview — dry-run without execution",

  "complete.reflect.hint": "Free-text lesson. Persists directly to memory.Fact (category=lesson, trigger=manual) without LLM call.",
  "complete.reflect.list": "Show pending reflexion queue + DLQ entries",
  "complete.reflect.failed": "List dead-letter entries (failed lessons needing review)",
  "complete.reflect.retry": "Re-queue a failed lesson by job ID (requires <id>)",
  "complete.reflect.purge": "Permanently delete a DLQ entry by job ID (requires <id>)",
  "complete.reflect.drain": "Force replay of WAL-pending lessons from a previous session",
  "complete.reflect.id_placeholder": "Job ID from /reflect failed (16 hex chars)",


  "complete.websearch.root_desc": "Configure web search provider (list, provider, reset, status)",
  "complete.websearch.sub_status": "Show current provider + active fallback chain",
  "complete.websearch.sub_list": "List known providers and which are configured",
  "complete.websearch.sub_provider": "Set preferred provider (searxng|duckduckgo|auto)",
  "complete.websearch.sub_reset": "Remove override and return to auto mode",
  "complete.websearch.prov_searxng": "Self-hosted (requires SEARXNG_URL) — preferred when configured",
  "complete.websearch.prov_duckduckgo": "HTML scraping, no API key — default",
  "complete.websearch.prov_brave": "HTML scraping, independent index, no API key",
  "complete.websearch.prov_mojeek": "HTML scraping, independent index, no API key",
  "complete.websearch.prov_auto": "Auto: DuckDuckGo first, SearxNG as fallback if configured",

  "hooks.cmd.not_initialized": "Hooks not initialized.",
  "hooks.cmd.box_title": "HOOKS",
  "hooks.cmd.none_configured": "No hooks configured.",
  "hooks.cmd.configure_in": "Configure hooks in ~/.chatcli/hooks.json:",
  "hooks.cmd.events_label": "Events:",
  "hooks.cmd.event_label": "Event:",
  "hooks.cmd.type_label": "Type:",
  "hooks.cmd.target_label": "Target:",
  "hooks.cmd.filter_label": "Filter:",
  "hooks.cmd.total_label": "Total:",
  "hooks.cmd.total_summary": "%d hooks (%s%d active%s)",
  "hooks.cmd.suggest_list": "List all configured hooks",
  "hooks.cmd.suggest_reload": "Reload hooks from configuration files",

  "mcp.cmd.box_title": "MCP SERVERS",
  "mcp.cmd.not_enabled": "MCP is not enabled.",
  "mcp.cmd.enable_hint": "To enable, create ~/.chatcli/mcp_servers.json:",
  "mcp.cmd.usage": "Usage: /mcp [status|tools|restart|start|stop|reload|logs] [server]",
  "mcp.cmd.no_servers": "No servers configured.",
  "mcp.cmd.status_connected": "connected",
  "mcp.cmd.status_disconnected": "disconnected",
  "mcp.cmd.status_starting": "starting…",
  "agent.mcp.note_starting": "MCP Tools (external): configured servers are still launching in the background. Do NOT invoke `mcp_*` this turn; use the tools listed above and, if the user explicitly asked for MCP, tell them the server is not ready yet.",
  "agent.mcp.note_unavailable": "MCP Tools (external): MCP is configured but no server is connected in this session. Do NOT invoke `mcp_*`; use the tools listed above and, if the user asked for MCP, briefly explain that no server is available and suggest running `/mcp status` to see the error.",
  "agent.mcp.routing_hint_coder": "Routing (MCP-first): The user has an MCP server connected — for any file operation covered by a `mcp_*` tool (read/write/list/tree/search/move/info/edit), TRY the MCP tool first. If the first `mcp_*` call returns 'path outside allowed directories', invoke `mcp_list_allowed_directories` ONCE to learn the scope, then fall back to `@coder` (do not repeat the same `mcp_*` for the same path). Use `@coder` directly for: `exec`, `git-*`, `patch`, content `search` (ripgrep), and anything MCP does not cover. Do not invoke `mcp_list_allowed_directories` prophylactically — only after a scope failure.",
  "agent.mcp.routing_hint_agent": "Routing (MCP-first): The user has an MCP server connected — for file operations covered by `mcp_*`, TRY the MCP tool first. If the first `mcp_*` call returns 'path outside allowed directories', invoke `mcp_list_allowed_directories` ONCE to learn the scope and explain to the user; do not retry the same path. Do not invoke `mcp_list_allowed_directories` prophylactically — only after a scope failure.",
  "mcp.cmd.tools_count": "%d tools",
  "mcp.cmd.total_label": "Total",
  "mcp.cmd.total_summary": "%d servers, %s tools available",
  "mcp.cmd.trust_mode_active": "TRUST mode active — every tool is auto-approved",
  "mcp.cmd.auto_approve_count": "auto-approve: %d tools",
  "mcp.cmd.hidden_tools_count": "hidden tools: %d",
  "mcp.transport.cwd_invalid": "MCP cwd %q is invalid",
  "mcp.transport.cwd_not_directory": "MCP cwd %q is not a directory",
  "mcp.transport.call_timeout": "MCP call %q timed out after %s",
  "mcp.transport.sse_endpoint_timeout": "SSE server did not send endpoint event within %s",
  "mcp.transport.http_url_required": "Streamable HTTP transport requires a non-empty url",
  "mcp.transport.http_closed": "Streamable HTTP transport is closed",
  "mcp.transport.http_status_error": "MCP server returned HTTP %d: %s",
  "mcp.transport.http_bad_content_type": "Unexpected Content-Type from MCP server: %s",
  "mcp.transport.http_body_too_large": "MCP HTTP response exceeded %d bytes",
  "mcp.transport.http_stream_closed": "MCP HTTP stream closed before %q response arrived (deadline %s)",
  "mcp.transport.http_post_failed": "MCP HTTP POST failed",
  "mcp.transport.http_sse_read_failed": "MCP HTTP SSE read",
  "mcp.transport.rpc_error": "MCP error %d: %s",
  "mcp.transport.http_initialize_failed": "MCP initialize failed",
  "mcp.cmd.box_tools_title": "MCP TOOLS",
  "mcp.cmd.no_tools": "No tools available.",
  "mcp.cmd.box_restart_title": "MCP RESTART",
  "mcp.cmd.restarting": "Restarting MCP servers...",
  "mcp.cmd.restart_error": "Error: %v",
  "mcp.cmd.restart_success": "%d servers, %d tools",
  "mcp.cmd.sug_status": "Show status of connected MCP servers",
  "mcp.cmd.sug_tools": "List all available MCP tools",
  "mcp.cmd.sug_restart": "Restart all MCP servers (or one by name)",
  "mcp.cmd.sug_start": "Start a stopped server: /mcp start <name>",
  "mcp.cmd.sug_stop": "Stop a server without removing it from config",
  "mcp.cmd.sug_reload": "Re-read mcp_servers.json and reconcile",
  "mcp.cmd.sug_logs": "Show recent stderr lines for a server",
  "mcp.cmd.unknown_server": "MCP server %q is not configured.",
  "mcp.cmd.already_running": "MCP server %q is already running.",
  "mcp.cmd.no_tools_for_server": "No tools registered for server %q yet.",
  "mcp.cmd.restarting_one": "Restarting MCP server %q...",
  "mcp.cmd.restart_one_success": "MCP server %q restarted.",
  "mcp.cmd.usage_start": "Usage: /mcp start <server-name>",
  "mcp.cmd.start_error": "Start failed: %v",
  "mcp.cmd.start_success": "MCP server %q started.",
  "mcp.cmd.usage_stop": "Usage: /mcp stop <server-name>",
  "mcp.cmd.stop_error": "Stop failed: %v",
  "mcp.cmd.stop_success": "MCP server %q stopped.",
  "mcp.cmd.reload_no_path": "MCP config path is not set; nothing to reload.",
  "mcp.cmd.reload_error": "Reload failed: %v",
  "mcp.cmd.reload_no_changes": "No changes detected on disk.",
  "mcp.cmd.reload_summary": "%d started, %d stopped, %d updated.",
  "mcp.cmd.usage_logs": "Usage: /mcp logs <server-name>",
  "mcp.cmd.box_logs_title": "MCP LOGS — %s",
  "mcp.cmd.no_logs": "No log lines captured yet.",

  "wt.cmd.usage_create": "Usage: /worktree create <branch-name>",
  "wt.cmd.usage_remove": "Usage: /worktree remove <path-or-branch>",
  "wt.cmd.err_not_git_repo": "Error: not inside a git repository.",
  "wt.cmd.err_repo_root": "Error: could not determine repository root.",
  "wt.cmd.err_create": "Error creating worktree: %s",
  "wt.cmd.warn_chdir_after_create": "Worktree created at %s but failed to change directory: %v",
  "wt.cmd.created_active": "Worktree created and active:",
  "wt.cmd.kv_branch": "Branch: %s",
  "wt.cmd.kv_path": "Path:   %s",
  "wt.cmd.not_in_git_repo": "Not inside a git repository.",
  "wt.cmd.err_generic": "Error: %v",
  "wt.cmd.title_list": "Git Worktrees",
  "wt.cmd.err_remove_main": "Cannot remove the main worktree.",
  "wt.cmd.err_chdir": "Error changing directory: %v",
  "wt.cmd.back_to_main": "Returning to main directory: %s",
  "wt.cmd.err_remove": "Error removing worktree: %s",
  "wt.cmd.removed": "Worktree removed: %s",
  "wt.cmd.title_status": "Worktree Status",
  "wt.cmd.label_cwd": "CWD:",
  "wt.cmd.label_branch": "Branch:",
  "wt.cmd.label_repo": "Repo:",
  "wt.cmd.label_type": "Type:",
  "wt.cmd.label_total": "Total:",
  "wt.cmd.type_linked": "worktree (linked)",
  "wt.cmd.type_main": "main worktree",
  "wt.cmd.total_count": "%d worktrees",
  "wt.cmd.sugg_create": "Create a new worktree with branch",
  "wt.cmd.sugg_list": "List active worktrees",
  "wt.cmd.sugg_remove": "Remove a worktree",
  "wt.cmd.sugg_status": "Show current worktree info",

  "cost.cmd.not_initialized": "Cost tracker not initialized.",
  "cost.cmd.box_title": "SESSION COST",
  "cost.cmd.provider": "Provider",
  "cost.cmd.model": "Model",
  "cost.cmd.duration": "Duration",
  "cost.cmd.requests": "Requests",
  "cost.cmd.source": "Source",
  "cost.cmd.source_api": "API usage data",
  "cost.cmd.source_estimate": "character estimate",
  "cost.cmd.tokens_label": "Tokens:",
  "cost.cmd.input": "Input:",
  "cost.cmd.output": "Output:",
  "cost.cmd.total": "Total:",
  "cost.cmd.cache_tokens_label": "Cache Tokens:",
  "cost.cmd.cache_created": "Created:",
  "cost.cmd.cache_read": "Read:",
  "cost.cmd.cache_savings": "(saves ~90%% input cost)",
  "cost.cmd.cost_label": "Cost:",
  "cost.cmd.input_cost": "Input:  ",
  "cost.cmd.output_cost": "Output: ",
  "cost.cmd.cache_cost": "Cache:",
  "cost.cmd.pricing_unavailable": "Pricing not available for this model.",

  "chan.cmd.box_title": "MCP CHANNELS",
  "chan.cmd.box_title_filtered": "CHANNEL: %s",
  "chan.cmd.mcp_disabled": "MCP not enabled. Channels require MCP servers.",
  "chan.cmd.inject_empty": "No messages to inject.",
  "chan.cmd.inject_success": "Messages injected into context.",
  "chan.cmd.no_messages": "No messages received.",
  "chan.cmd.no_messages_hint": "Channels are populated when MCP servers send push messages.",
  "chan.cmd.total_label": "Total",
  "chan.cmd.total_messages": "%d messages",
  "chan.cmd.suggest_list": "List recent channel messages",
  "chan.cmd.suggest_inject": "Inject messages into conversation context",
  "chan.cmd.suggest_ack": "Clear unread + pending notify banner",
  "chan.cmd.suggest_pause": "Suspend trigger evaluation",
  "chan.cmd.suggest_resume": "Resume trigger evaluation",
  "chan.cmd.suggest_rules": "Show / reload trigger rules",
  "chan.cmd.suggest_confirm": "Resolve a pending confirm action",
  "chan.cmd.suggest_run": "Run agent on a specific channel message",
  "chan.cmd.unread_label": "Unread",
  "chan.cmd.paused_note": "(triggers paused — /channel resume to re-enable)",
  "chan.cmd.pause_done": "✓ Trigger engine paused. /channel resume to re-enable.",
  "chan.cmd.resume_done": "✓ Trigger engine resumed.",
  "chan.cmd.ack_done": "Cleared %d notify entries; acknowledged %d unread messages.",
  "chan.cmd.rules_title": "TRIGGER RULES",
  "chan.cmd.rules_empty": "No rules configured. Create ~/.chatcli/mcp/triggers.json to enable triggers.",
  "chan.cmd.rules_reloaded": "Rules reloaded — %d active.",
  "chan.cmd.confirm_usage": "Usage: /channel confirm <id> [yes|no]",
  "chan.cmd.confirm_bad_id": "Invalid confirm id.",
  "chan.cmd.confirm_denied": "Confirm action #%d denied.",
  "chan.cmd.run_usage": "Usage: /channel run <seq>",
  "chan.cmd.run_bad_seq": "Invalid seq number.",

  "chan.banner.title": "MCP CHANNEL INBOX",
  "chan.banner.unread": "%d new channel message(s) since last ack",
  "chan.banner.hint_ack": "Hint: /channel ack to clear, /channel list for full inbox",

  "chan.trigger.toast_header": "trigger fired (%s) — rule %s",
  "chan.trigger.toast_confirm_hint": "Run /channel confirm %d [yes|no] to resolve",
  "chan.trigger.toast_auto_hint": "Will run on next prompt cycle. Press Esc to abort once started.",
  "chan.trigger.auto_header": "AUTO-AGENT ▶ %s   (%s/%s)",

  "complete.root.exit": "Exit ChatCLI",
  "complete.root.quit": "Alias of /exit - Exit ChatCLI",
  "complete.root.switch": "Switch the LLM provider; followed by --model changes the model",
  "complete.root.model": "Shorthand for /switch --model: change the current provider's model",
  "complete.root.model_image": "Shorthand for /config image model: change the @image generation model",
  "complete.root.maxtokens": "Shorthand for /switch --max-tokens: cap the session's output tokens",
  "complete.maxtokens.default": "0 = use the provider's default",
  "complete.root.help": "Show help",
  "complete.root.reload": "Reload .env settings",
  "complete.root.agent": "Start agent mode to execute tasks",
  "complete.root.coder": "Start engineer mode (Code Creation and Editing)",
  "complete.root.run": "Alias for /agent - Start agent mode to execute tasks",
  "complete.root.newsession": "Start a new conversation session",
  "complete.root.version": "Check ChatCLI version",
  "complete.root.nextchunk": "Load the next file chunk",
  "complete.root.retry": "Retry the last failed chunk",
  "complete.root.retryall": "Retry all failed chunks",
  "complete.root.skipchunk": "Skip a file chunk",
  "complete.root.session": "Manage sessions: new, save, list, load, delete",
  "complete.root.context": "Manage persistent contexts (create, attach, detach, list, show, etc)",
  "complete.root.plugin": "Manage plugins (install, list, show, etc.)",
  "complete.root.skill": "Manage registry skills (search, install, uninstall, list)",
  "complete.root.clear": "Force redraw/clear the screen if the prompt is corrupted or has visual artifacts.",
  "complete.root.auth": "Manage OAuth credentials (status, login, logout)",
  "complete.root.connect": "Connect to a remote ChatCLI server (gRPC)",
  "complete.root.disconnect": "Disconnect from the remote server and return to local mode",
  "complete.root.watch": "Show the K8s watcher status (when active)",
  "complete.root.metrics": "Show runtime metrics (provider, session, tokens, memory)",
  "complete.root.mcp": "Manage MCP servers (status, tools, restart)",
  "complete.root.hooks": "Show configured lifecycle hooks",
  "complete.root.cost": "Show estimated cost of the current session",
  "complete.root.ratelimit": "Show provider rate-limit status from response headers",
  "complete.root.worktree": "Manage git worktrees for isolated branch work",
  "complete.root.channel": "Manage MCP channels for push messages from external servers",
  "complete.root.compact": "Compact history (use /compact <instruction> to guide what to preserve)",
  "complete.root.rewind": "Rewind to a previous conversation checkpoint",
  "complete.root.memory": "View/load memory notes (today, yesterday, week, load <date>, longterm, list)",
  "complete.root.graph": "Visualize the knowledge graph as an image (/graph or /graph <subject>)",
  "graph.cmd.empty": "The knowledge graph is empty so far.",
  "graph.cmd.no_node": "No graph node found for %q.",
  "graph.cmd.rendered": "Rendered the knowledge graph:",
  "graph.cmd.error": "Could not render the graph: %s",
  "graph.tool.no_node": "No graph node found for %q.",

  "complete.generic.flag_mode": "Set file processing mode (full, summary, chunked, smart, knowledge)",
  "complete.generic.flag_model": "Switch the model (runtime) based on the current provider (gpt-5, grok-4, etc.)",
  "complete.generic.flag_max_tokens": "Set the max tokens for the next responses (0 for default)",
  "complete.generic.flag_agent_id_stackspot": "Change the agent at runtime (STACKSPOT only)",
  "complete.generic.flag_realm_stackspot": "Change the Realm/Tenant at runtime (STACKSPOT only)",
  "complete.generic.flag_i_interactive": "Ideal for interactive commands, avoiding the feeling of a blocked terminal",
  "complete.generic.flag_ai": "Send the command output directly to the AI to analyze; for additional context type ( @command --ai <command> > <context>)",
  "complete.generic.option_for": "Option for %s",
  "complete.generic.values_suffix": "(values: %s)",

  "complete.skill.user_invocable_fallback": "user-invocable skill",
  "complete.skill.sub_search": "Search for skills across registries",
  "complete.skill.sub_install": "Install a skill from a registry",
  "complete.skill.sub_uninstall": "Remove an installed skill",
  "complete.skill.sub_list": "List installed skills",
  "complete.skill.sub_info": "Show skill metadata from registry",
  "complete.skill.sub_registries": "Show configured registries",
  "complete.skill.sub_registry": "Enable/disable a registry",
  "complete.skill.sub_prefer": "Set preferred source for a skill",
  "complete.skill.sub_help": "Show skill command help",
  "complete.skill.sub_pin": "Pin a skill for this session",
  "complete.skill.sub_unpin": "Remove a skill from the pinned set",
  "complete.skill.sub_pinned": "List pinned skills",
  "complete.skill.unpin_desc": "Currently pinned skill",
  "complete.skill.flag_from": "Specify registry source",
  "complete.skill.sub_registry_enable": "Enable a registry",
  "complete.skill.sub_registry_disable": "Disable a registry",
  "complete.skill.flag_reset": "Remove preference (use default order)",
  "complete.skill.prefer_local": "Prefer local version",

  "complete.connect.token": "Server authentication token",
  "complete.connect.provider": "LLM provider (OPENAI, CLAUDEAI, GOOGLEAI, XAI, ZAI, MINIMAX, MOONSHOT, STACKSPOT, OLLAMA, COPILOT, GITHUB_MODELS, OPENROUTER)",
  "complete.connect.model": "LLM model (gpt-4, claude-3, etc.)",
  "complete.connect.llm_key": "API key/OAuth token to send to the server",
  "complete.connect.use_local_auth": "Use local OAuth credentials (from /auth login)",
  "complete.connect.tls": "Enable TLS connection",
  "complete.connect.ca_cert": "CA certificate file for TLS",
  "complete.connect.client_id": "StackSpot: Client ID for authentication",
  "complete.connect.client_key": "StackSpot: Client Key for authentication",
  "complete.connect.realm": "StackSpot: Realm/Tenant",
  "complete.connect.agent_id": "StackSpot: Agent ID",
  "complete.connect.ollama_url": "Ollama: Server base URL (e.g. http://localhost:11434)",

  "complete.watch.flag_deployment": "K8s deployment to monitor (required)",
  "complete.watch.flag_namespace": "Deployment namespace (default: default)",
  "complete.watch.flag_interval": "Collection interval (e.g. 10s, 1m)",
  "complete.watch.flag_window": "Observation window (e.g. 1h, 4h)",
  "complete.watch.flag_max_log_lines": "Max log lines per pod",
  "complete.watch.flag_kubeconfig": "Path to kubeconfig",
  "complete.watch.sub_start": "Start K8s monitoring (e.g. /watch start --deployment myapp)",
  "complete.watch.sub_stop": "Stop K8s monitoring",
  "complete.watch.sub_status": "Show active watcher status",

  "complete.context.root_desc": "📦 Manage persistent contexts (create, attach, detach, list, show, inspect, etc)",
  "complete.context.sub_create": "Create a context from files/directories (use --mode, --description, --tags)",
  "complete.context.sub_update": "Update an existing context (use --mode, --description, --tags)",
  "complete.context.sub_attach": "Attach an existing context to the current session (use --priority, --chunk, --chunks)",
  "complete.context.sub_detach": "Detach context from the current session",
  "complete.context.sub_list": "List all saved contexts",
  "complete.context.sub_show": "Show full details of a specific context",
  "complete.context.sub_inspect": "Deep statistical analysis of a context (use --chunk N for a specific chunk)",
  "complete.context.sub_delete": "Delete context permanently (asks for confirmation)",
  "complete.context.sub_merge": "Merge multiple contexts into a new one",
  "complete.context.sub_attached": "Show which contexts are attached to the session",
  "complete.context.sub_export": "Export context to JSON file",
  "complete.context.sub_import": "Import context from JSON file",
  "complete.context.sub_metrics": "Show context usage statistics",
  "complete.context.sub_help": "Detailed help about the context system",
  "complete.context.flag_chunk_inspect": "Inspect a specific chunk (e.g. --chunk 1)",
  "complete.context.flag_chunk_short": "Shortcut for --chunk",
  "complete.context.flag_priority": "Set priority (lower = sent first)",
  "complete.context.flag_priority_short": "Shortcut for --priority",
  "complete.context.flag_chunk_attach": "Attach a specific chunk (e.g. --chunk 1)",
  "complete.context.flag_chunks": "Attach multiple chunks (e.g. --chunks 1,2,3)",
  "complete.context.flag_chunks_short": "Shortcut for --chunks",
  "complete.context.flag_rag": "Semantic retrieval: inject only the relevant passages (optional: K)",
  "complete.context.flag_rag_short": "Shortcut for --rag",
  "complete.context.flag_mode": "Processing mode: full, summary, chunked, smart, knowledge",
  "complete.context.flag_mode_short": "Shortcut for --mode",
  "complete.context.flag_description": "Textual description of the context",
  "complete.context.flag_desc_short": "Shortcut for --description",
  "complete.context.flag_d_short": "Shortcut for --description",
  "complete.context.flag_tags": "Comma-separated tags (e.g. api,golang)",
  "complete.context.flag_tags_short": "Shortcut for --tags",
  "complete.context.flag_force": "Overwrite if it already exists (create only)",
  "complete.context.flag_force_short": "Shortcut for --force (create only)",
  "complete.context.mode_full": "Full file contents",
  "complete.context.mode_summary": "Only directory structure and metadata",
  "complete.context.mode_chunked": "Split into manageable chunks",
  "complete.context.mode_smart": "AI selects files relevant to the prompt",
  "complete.context.mode_knowledge": "Knowledge base: injects an index card + per-turn retrieval (BM25 + vectors)",
  "complete.context.prompt_name": "Type the context name (e.g. my-project)",
  "complete.context.prompt_merge_name": "Type the name of the new merged context",
  "complete.context.not_chunked_warning": "⚠️  This context is not split into chunks",
  "complete.context.chunk_desc_fmt": "Chunk %d/%d: %s (%d files, %.2f KB)",
  "complete.context.name_mode_fmt": "mode:%s",
  "complete.context.name_chunks_fmt": "%d chunks",
  "complete.context.name_files_fmt": "%d files",
  "complete.context.name_tags_fmt": "tags:%s",

  "complete.session.root_desc": "Manage sessions (new, save, list, load, delete)",
  "complete.session.sub_new": "Create new session (clears current history)",
  "complete.session.sub_save": "Save current session with a name",
  "complete.session.sub_load": "Load a previously saved session",
  "complete.session.sub_list": "List all saved sessions",
  "complete.session.sub_search": "Full-text search across saved sessions",
  "complete.session.sub_delete": "Delete a saved session",
  "complete.session.sub_fork": "Fork current session with a new name",
  "complete.session.saved_session": "Saved session",

  "complete.plugin.sub_list": "List all installed plugins.",
  "complete.plugin.sub_install": "Install a new plugin from a Git repository.",
  "complete.plugin.sub_reload": "Force reload of all installed plugins.",
  "complete.plugin.sub_show": "Show details of a specific plugin.",
  "complete.plugin.sub_inspect": "Show debug information for a plugin.",
  "complete.plugin.sub_uninstall": "Remove an installed plugin.",

  "complete.agent.sub_list": "List available agents",
  "complete.agent.sub_load": "Load a specific agent",
  "complete.agent.sub_attach": "Attach multiple agents to the existing session",
  "complete.agent.sub_detach": "Detach agent from the current session",
  "complete.agent.sub_skills": "List available skills",
  "complete.agent.sub_show": "Show the active agent",
  "complete.agent.sub_status": "Show attached agents, alias{attached or list-attached}",
  "complete.agent.sub_off": "Disable the current agent",
  "complete.agent.sub_help": "Help for the /agent command",
  "complete.agent.flag_full": "Show full agent details",

  "complete.switch.root_desc": "Switch the LLM provider; followed by --model changes the model",
  "complete.switch.flag_model": "Switch the model (runtime) based on the current provider",
  "complete.switch.flag_max_tokens": "Set max tokens for the next responses (0 for default)",
  "complete.switch.flag_realm": "Change the Realm/Tenant at runtime",
  "complete.switch.flag_agent_id": "Change the agent at runtime",

  "complete.auth.root_desc": "Manage OAuth credentials (status, login, logout)",
  "complete.auth.sub_status": "Show authentication status for all providers",
  "complete.auth.sub_login": "Authenticate with a provider (anthropic, openai-codex, github-copilot, github-models)",
  "complete.auth.sub_logout": "Remove credentials for a provider (anthropic, openai-codex, github-copilot, github-models)",
  "complete.auth.provider_anthropic": "Anthropic (Claude)",
  "complete.auth.provider_openai_codex": "OpenAI (GPT Plus / Codex)",
  "complete.auth.provider_github_copilot": "GitHub Copilot",
  "complete.auth.provider_github_models": "GitHub Models (GPT-4o, Llama, Mistral, DeepSeek...)",

  "skill.cmd.installs_suffix": "installs",
  "skill.cmd.by_author": "by",
  "skill.cmd.status_enabled": "enabled",
  "skill.cmd.status_paused": "paused",
  "skill.cmd.status_disabled": "disabled",
  "skill.cmd.status_paused_failures": "paused: %d failures%s",
  "skill.cmd.err_dns": "unavailable (DNS lookup failed)",
  "skill.cmd.err_conn_refused": "unavailable (connection refused)",
  "skill.cmd.err_timeout": "unavailable (timeout)",
  "skill.cmd.err_tls": "TLS certificate error",
  "skill.cmd.err_not_found": "API endpoint not found",

  "persona.cmd.skills_count": "[%d skills]",
  "persona.cmd.skills_label": "Skills",
  "persona.cmd.arg_name": "<name>",
  "persona.cmd.arg_task": "<task>",
  "persona.cmd.example_agent": "create an HTTP server",
  "persona.cmd.example_coder": "refactor the code",

  "mem.cmd.no_notes_found_for": "No notes found for",
  "mem.cmd.profile.title": "User Profile",
  "mem.cmd.profile.empty": "No profile data yet. Interact more and the system will learn about you.",
  "mem.cmd.profile.name": "Name:",
  "mem.cmd.profile.role": "Role:",
  "mem.cmd.profile.expertise": "Expertise:",
  "mem.cmd.profile.language": "Language:",
  "mem.cmd.profile.style": "Style:",
  "mem.cmd.profile.top_commands": "Top Commands:",
  "mem.cmd.profile.preferences": "Preferences:",
  "mem.cmd.profile.last_updated": "Last updated:",
  "mem.cmd.profile.company": "Company:",
  "mem.cmd.profile.location": "Location:",
  "mem.cmd.profile.certifications": "Certifications:",
  "mem.cmd.profile.skills": "Skills:",
  "mem.cmd.profile.goals": "Goals:",
  "mem.cmd.profile.set.usage": "Usage: /memory profile set <key>=<value> (e.g. profile set certifications=AWS SAA)",
  "mem.cmd.profile.set.ok": "Profile field '%s' updated.",
  "mem.cmd.profile.set.nochange": "No change (value already set).",
  "mem.cmd.remember.usage": "Usage: /memory remember [category] <fact> (categories: architecture|pattern|preference|gotcha|project|personal|general)",
  "mem.cmd.remember.ok": "Remembered.",
  "mem.cmd.remember.dup": "Already in memory (no change).",
  "mem.cmd.forget.usage": "Usage: /memory forget <substring of the fact to remove>",
  "mem.cmd.forget.removed": "Removed %d fact(s).",
  "mem.cmd.forget.none": "No matching fact found.",
  "mem.cmd.suggest.remember": "Remember a fact deterministically (e.g. remember [personal] got AWS cert)",
  "mem.cmd.suggest.forget": "Remove stored facts matching a substring",
  "mem.notice.prefix": "memory:",
  "mem.notice.facts": "+%d fact(s)",
  "mem.notice.profile": "profile updated",
  "mem.notice.projects": "+%d project",
  "mem.notice.topics": "+%d topic(s)",
  "mem.notice.failing": "memory: extraction failing (%d in a row) — recent facts are queued on disk and will be retried automatically",
  "selfevolve.notice.prefix": "skills:",
  "selfevolve.notice.authored": "authored %s",
  "selfevolve.notice.evolved": "evolved %s",
  "selfevolve.notice.evolved_backup": "evolved %s (your original backed up; /skill restore to undo)",
  "selfevolve.notice.suggested": "suggestion — run /skill create to save: %s",
  "mem.tool.remember.ok": "Remembered: %s",
  "mem.tool.remember.dup": "Already in memory (no change).",
  "mem.tool.profile.ok": "Profile updated: %s",
  "mem.tool.profile.nochange": "No profile change (values already set).",
  "mem.tool.forget.result": "Removed %d matching fact(s).",
  "mem.tool.recall.empty": "No memory stored yet.",
  "send.tool.sent.ok": "Message sent via %s to %s.",
  "send.tool.no_platform": "Provide a target platform (e.g. \"telegram\" or \"telegram:chat_id\").",
  "send.tool.build_failed": "Failed to initialize messaging platforms",
  "send.tool.not_configured": "Platform %q is not configured. Available platforms: %s.",
  "send.tool.no_chatid": "No target for %s. Use \"%s:chat_id\" or set %s.",
  "send.tool.failed": "Failed to send via %s",
  "send.tool.list.empty": "No messaging platforms configured. Configure at least one gateway (Telegram/WhatsApp/Discord/Slack/webhook).",
  "send.tool.list.header": "Configured messaging platforms:",
  "send.tool.list.home": "home channel",
  "send.tool.list.no_home": "no home channel (set %s or use platform:chat_id)",
  "image.tool.generated": "Generated %d image(s) via %s:\n  %s",
  "image.tool.edited": "Edited %d image(s) via %s:\n  %s",
  "image.edit.routed": "ℹ️  Image backend %q can't edit images; routed to %q for this edit. Set CHATCLI_IMAGE_EDIT_PROVIDER to pin a different one.",
  "vision.warn.model_no_vision": "⚠️  The current model (%s) does not support image input, and no vision-capable model is available for the describe-fallback. The attached image was ignored — switch to a model with vision, or set CHATCLI_VISION_INPUT=native if this off-catalog model does support images.",
  "vision.describe.instruction": "Describe the attached image(s) in thorough, faithful detail: all visible text (verbatim), objects, people, layout, colors, charts/diagrams and their data, and anything else relevant. This description will be the only representation of the image available to another model, so be complete and precise.",
  "vision.describe.in_progress": "Describing image with %s...",
  "vision.describe.note": "[Transcription of %d attached image(s), generated by the vision model %s — the original could not be sent natively:]",
  "skill.tool.created": "Skill %q created at %s. It will auto-activate on its triggers in future turns.",
  "skill.tool.updated": "Skill %q updated at %s. It will auto-activate on its triggers in future turns.",
  "skill.tool.removed": "Skill %q removed.",
  "skill.tool.restored": "Skill %q restored from backup (engine changes undone).",
  "skill.tool.restore_none": "Skill %q has no backup to restore.",
  "skill.tool.exported": "Exported %d skill(s) to %s",
  "skill.tool.imported": "Imported %d skill(s)",
  "speak.tool.spoke": "Spoke %d character(s) → %s (%s, %d bytes) via %s",
  "moa.tool.unavailable": "Mixture-of-Agents is not available in this session.",
  "moa.tool.no_members": "No models available to participate. Configure at least one provider.",
  "moa.tool.all_failed": "All queried models failed.",
  "moa.tool.synthesized": "Answer synthesized from: %s (aggregator: %s)",
  "moa.tool.list.empty": "No providers configured.",
  "moa.tool.list.header": "Providers available for Mixture-of-Agents:",
  "moa.tool.list.current": "Current model (default aggregator): %s/%s",
  "session.tool.unavailable": "Session search is not available.",
  "session.tool.no_match": "No saved session matches %q.",
  "session.tool.match_header": "Sessions matching %q:",
  "session.tool.match_count": "%d match(es)",
  "session.tool.list.empty": "No saved sessions.",
  "session.tool.list.header": "Saved sessions:",
  "mem.cmd.topics.title": "Tracked Topics",
  "mem.cmd.topics.empty": "No topics tracked yet.",
  "mem.cmd.topics.mentions_last": "(%d mentions, last: %s)",
  "mem.cmd.projects.title": "Tracked Projects",
  "mem.cmd.projects.empty": "No projects tracked yet.",
  "mem.cmd.projects.path": "Path:",
  "mem.cmd.projects.tech": "Tech:",
  "mem.cmd.projects.last_active": "Last active:",
  "mem.cmd.stats.title": "Memory System Stats",
  "mem.cmd.stats.facts_stored": "Facts stored:",
  "mem.cmd.stats.topics_tracked": "Topics tracked:",
  "mem.cmd.stats.projects_tracked": "Projects tracked:",
  "mem.cmd.stats.usage_patterns": "Usage Patterns:",
  "mem.cmd.stats.sessions": "Sessions:",
  "mem.cmd.stats.total_messages": "Total messages:",
  "mem.cmd.stats.avg_session": "Avg session: %.0f min",
  "mem.cmd.stats.peak_hours": "Peak hours:",
  "mem.cmd.stats.top_commands": "Top commands:",
  "mem.cmd.stats.features": "Features:",
  "mem.cmd.stats.common_errors": "Common Errors:",
  "mem.cmd.stats.error_pattern": "%s (%d times)",
  "mem.cmd.stats.fix": "Fix:",
  "mem.cmd.stats.last_session": "Last session:",
  "mem.cmd.facts.title": "Memory Facts",
  "mem.cmd.facts.empty": "No facts stored.",
  "mem.cmd.facts.score_access": "(score: %s, accessed: %d)",
  "mem.cmd.facts.total": "Total:",
  "mem.cmd.facts.total_count": "%d facts",
  "mem.cmd.compact.running": "Running memory compaction...",
  "mem.cmd.compact.failed": "Compaction failed:",
  "mem.cmd.compact.complete": "Compaction complete",
  "mem.cmd.compact.facts_change": "Facts: %d -> %d",
  "mem.cmd.compact.notes_removed": "Old daily notes removed: %d",
  "mem.cmd.list.memory_md_facts": "MEMORY.md (%d facts)",
  "mem.cmd.list.memory_md_empty": "MEMORY.md (empty)",
  "mem.cmd.list.earlier_notes": "... (%d earlier notes)",
  "mem.cmd.suggest.memory": "View/load memory notes",
  "mem.cmd.suggest.today": "Today's notes",
  "mem.cmd.suggest.yesterday": "Yesterday's notes",
  "mem.cmd.suggest.week": "Notes from the last 7 days",
  "mem.cmd.suggest.longterm": "Long-term memory (MEMORY.md)",
  "mem.cmd.suggest.list": "List all memory files",
  "mem.cmd.suggest.load": "Load notes from a date into context (e.g. load yesterday)",
  "mem.cmd.suggest.profile": "Show user profile",
  "mem.cmd.suggest.profile_set": "Set a profile field (e.g. set certifications=AWS SAA)",
  "mem.cmd.suggest.topics": "Show tracked topics",
  "mem.cmd.suggest.projects": "Show tracked projects",
  "mem.cmd.suggest.stats": "Memory system statistics",
  "mem.cmd.suggest.facts": "List stored facts (e.g. facts architecture)",
  "mem.cmd.suggest.compact": "Force memory compaction",
  "mem.cmd.suggest.load_today": "Load today's notes",
  "mem.cmd.suggest.load_yesterday": "Load yesterday's notes",
  "mem.cmd.suggest.load_date": "Notes from %s",
  "mem.cmd.suggest.cat_architecture": "Architectural decisions",
  "mem.cmd.suggest.cat_pattern": "Patterns and conventions",
  "mem.cmd.suggest.cat_preference": "User preferences",
  "mem.cmd.suggest.cat_gotcha": "Gotchas and known bugs",
  "mem.cmd.suggest.cat_project": "Project details",
  "mem.cmd.suggest.cat_personal": "Personal information",
  "mem.cmd.suggest.cat_general": "General facts",

  "sw.cmd.skill_swap_provider": "skill requested %s/%s — swapping for this turn",
  "sw.cmd.stream_stalled": "[Stream stalled — partial response shown]",
  "sw.cmd.could_not_list_models": "Could not list models for %s: %v",
  "sw.cmd.no_models_found": "No models found for %s",
  "sw.cmd.available_models_header": "Available models for %s (%s):",

  "sess.cmd.invalid_one_shot_input": "invalid input for one-shot agent mode: %s",
  "sess.cmd.fork_error": "Fork error: %v",
  "sess.cmd.fork_unsaved": "(unsaved)",
  "sess.cmd.fork_header": "SESSION FORKED",
  "sess.cmd.fork_from": "From:",
  "sess.cmd.fork_to": "To:",
  "sess.cmd.fork_messages": "Messages:",
  "sess.cmd.fork_footer": "Now working on the fork. The original remains intact.",

  "ctx.cmd.init_manager_error": "failed to initialize context manager",
  "ctx.cmd.read_response_error": "failed to read response",

  "cmd.core.session_fork_usage": "Usage: /session fork <new-name>",

  "scheduler.disabled": "Scheduler disabled for this session (CHATCLI_SCHEDULER_ENABLED=false or init failed).",
  "scheduler.created": "Job %s created (%s).",
  "scheduler.wait_async": "Wait registered in background as job %s.",
  "scheduler.wait_completed": "Wait %s finished with outcome %s.",
  "scheduler.wait_ctx_cancelled": "Wait cancelled by user or timeout.",
  "scheduler.render.overdue": "overdue",
  "scheduler.render.in": "in %s",
  "scheduler.render.col_status": "STATUS",
  "scheduler.render.col_id": "ID",
  "scheduler.render.col_name": "NAME",
  "scheduler.render.col_owner": "OWNER",
  "scheduler.render.col_type": "TYPE",
  "scheduler.render.col_next_fire": "NEXT FIRE",
  "scheduler.render.col_last": "LAST",
  "scheduler.render.owner": "Owner",
  "scheduler.render.status": "Status",
  "scheduler.render.type": "Type",
  "scheduler.render.created": "Created",
  "scheduler.render.next_fire": "Next fire",
  "scheduler.render.finished": "Finished",
  "scheduler.render.attempts": "Attempts",
  "scheduler.render.action": "Action",
  "scheduler.render.command": "command",
  "scheduler.render.wait": "Wait",
  "scheduler.render.depends_on": "Depends on",
  "scheduler.render.triggers": "Triggers",
  "scheduler.render.description": "Description",
  "scheduler.render.tags": "Tags",
  "scheduler.render.history": "History (%d",
  "scheduler.render.cycles": ", %d cycles",
  "scheduler.render.transitions": "Transitions",
  "scheduler.jobs.cycle_header": "── cycle #%d ──",
  "scheduler.jobs.err_prefix": "err: ",
  "scheduler.jobs.cond_prefix": "cond: ",
  "scheduler.jobs.unknown": "Unknown /jobs subcommand: %s",
  "scheduler.jobs.not_found": "Job %s not found.",
  "scheduler.jobs.show_usage": "Usage: /jobs show <id>",
  "scheduler.jobs.cancel_usage": "Usage: /jobs cancel <id> [reason...]",
  "scheduler.jobs.pause_usage": "Usage: /jobs pause <id>",
  "scheduler.jobs.resume_usage": "Usage: /jobs resume <id>",
  "scheduler.jobs.logs_usage": "Usage: /jobs logs <id>",
  "scheduler.jobs.cancelled": "Job %s cancelled.",
  "scheduler.jobs.paused": "Job %s paused.",
  "scheduler.jobs.resumed": "Job %s resumed.",
  "scheduler.jobs.empty": "(no jobs)",
  "scheduler.jobs.logs_empty": "(no executions yet)",
  "scheduler.jobs.gc_done": "Snapshot written; WAL GC performed.",
  "scheduler.daemon.status_header": "Scheduler daemon (over UNIX socket):",
  "scheduler.daemon.local": "Scheduler running in-process (no daemon).",
  "scheduler.daemon.none": "No scheduler active.",
  "scheduler.daemon.use_subcommand": "Use 'chatcli daemon start|stop|status' from the shell — /jobs daemon only reads status here.",
  "scheduler.daemon.unknown": "Unknown /jobs daemon subcommand: %s",
  "scheduler.schedule.usage_header": "Usage: /schedule <name> --when <when> --do <action> [--wait <cond>] [flags]",
  "scheduler.schedule.usage_example_1": "Example: /schedule backup --cron \"0 2 * * *\" --do \"/run backup --full\"",
  "scheduler.schedule.usage_example_2": "Example: /schedule check-deploy --when +30s --do \"shell: kubectl get pods\" --wait \"k8s:deployment/prod/api:Available\"",
  "scheduler.schedule.usage_example_3": "Example: /schedule smoke --when \"every 5m\" --do \"/run smoke tests\" --tag env=prod",
  "scheduler.schedule.usage_flags": "Flags: --when --do --wait --timeout --poll --max-polls --max-retries --depends-on --triggers --ttl --tag --description --on-timeout --async --i-know",
  "scheduler.wait.usage_header": "Usage: /wait --until <cond> [--then <action>] [flags]",
  "scheduler.wait.usage_example_1": "Example: /wait --until http://localhost:8080/health==200 --then \"/run smoke\" --timeout 10m --every 5s",
  "scheduler.wait.usage_example_2": "Example: /wait --until \"k8s:pod/prod/api:Ready\" --async",
  "scheduler.wait.usage_flags": "Flags: --until --then --every --timeout --max-polls --on-timeout --async --name",
  "scheduler.jobs.usage_header": "Usage: /jobs <subcommand> [args]",

  "help.section.scheduler": "Scheduler — Scheduling & wait-until",
  "help.command.schedule": "Schedules a job to fire at a time or cron expression. Ex: /schedule bk --cron \"0 2 * * *\" --do \"/run backup\"",
  "help.command.wait": "Waits until a condition is satisfied and optionally runs an action. Ex: /wait --until http://x/health==200 --then \"/run tests\"",
  "help.command.jobs": "Manage scheduled jobs: list, show, tree, cancel, pause, resume, logs, history, daemon, gc.",

  "cfg.section.scheduler.title": "Scheduler (Chronos) — Scheduling & Wait-Until",
  "cfg.sub.sched.core": "Core",
  "cfg.sub.sched.budget": "Default Budget",
  "cfg.sub.sched.safety": "Safety",
  "cfg.sub.sched.daemon": "Daemon",
  "cfg.kv.scheduler_enabled": "CHATCLI_SCHEDULER_ENABLED",
  "cfg.kv.scheduler_data_dir": "CHATCLI_SCHEDULER_DATA_DIR",
  "cfg.kv.scheduler_wal_segments": "WAL segments",
  "cfg.kv.scheduler_active": "Active jobs",
  "cfg.kv.scheduler_queue_depth": "Queue depth",
  "cfg.kv.scheduler_audit_path": "Audit log",
  "cfg.kv.scheduler_daemon": "Daemon",

  "sched.complete.help": "Show command examples and flags",
  "sched.status.pending": "Waiting for next fire window",
  "sched.status.blocked": "Blocked by dependencies",
  "sched.status.waiting": "In condition polling loop",
  "sched.status.running": "Action currently executing",
  "sched.status.paused": "Paused by the user",
  "sched.status.completed": "Succeeded",
  "sched.status.failed": "Failed (permanent error or retries exhausted)",
  "sched.status.cancelled": "Cancelled by user or owner",
  "sched.status.timed_out": "Wait exceeded its timeout",
  "sched.status.skipped": "Miss-policy elected to skip",
  "sched.owner.me": "Only this session's jobs",
  "sched.owner.user": "Jobs created interactively",
  "sched.owner.agent": "Jobs created by agents (ReAct)",
  "sched.owner.worker": "Jobs created by workers/subagents",
  "sched.owner.system": "Scheduler-internal jobs",
  "sched.owner.hook": "Jobs triggered by hooks",
  "sched.ontimeout.fail": "Mark as timed_out and stop (default)",
  "sched.ontimeout.fire_anyway": "Run the action even without satisfaction",
  "sched.ontimeout.fallback": "Run wait.fallback then fail",
  "sched.when.relative_5m": "In 5 minutes",
  "sched.when.relative_30s": "In 30 seconds",
  "sched.when.relative_in_2h": "In 2 hours",
  "sched.when.every_30s": "Every 30 seconds (interval)",
  "sched.when.every_5m": "Every 5 minutes",
  "sched.when.every_1h": "Every hour",
  "sched.when.at_hourly": "On the top of every hour",
  "sched.when.at_daily": "At local midnight",
  "sched.when.at_weekly": "Every Sunday at midnight",
  "sched.when.cron_0_2": "02:00 every day (5-field cron)",
  "sched.when.when_ready": "No time — fires when wait condition is satisfied",
  "sched.when.manual": "Only fires when another job lists this in --triggers",
  "sched.until.http_200": "HTTP GET returning 200",
  "sched.until.tcp_port": "TCP port open",
  "sched.until.k8s_pod": "K8s pod with Ready=True",
  "sched.until.k8s_deploy": "Deployment with Available=True",
  "sched.until.docker_healthy": "Docker container healthcheck OK",
  "sched.until.file_exists": "File present on disk",
  "sched.until.shell_exit": "Shell command returns 0",
  "sched.until.llm_check": "LLM answers YES to the prompt",
  "sched.do.slash_run": "Run a slash command (/run, /coder, etc.)",
  "sched.do.shell": "Run a shell command under CoderMode safety",
  "sched.do.agent": "Boot a ReAct agent with the task",
  "sched.do.llm": "Single headless LLM prompt",
  "sched.do.noop": "Do nothing (useful for triggers-only pipelines)",
  "sched.do.webhook": "HTTP POST / GET / PUT to a URL",
  "sched.do.hook": "Fire a chatcli hook by event name",
  "sched.flag.when": "When to fire: +5m, every 30s, cron:0 2 * * *, @daily, when-ready, manual",
  "sched.flag.cron": "Shortcut for --when cron:<expr>",
  "sched.flag.every": "Shortcut for --when every <duration>",
  "sched.flag.do": "Action to execute on fire",
  "sched.flag.wait": "Condition to satisfy before the action (polled)",
  "sched.flag.until": "Wait condition (same as --wait)",
  "sched.flag.timeout": "Max action timeout (e.g. 10m)",
  "sched.flag.wait_timeout": "Max wait-loop timeout",
  "sched.flag.poll": "Interval between condition polls",
  "sched.flag.max_polls": "Max polls before giving up",
  "sched.flag.max_retries": "Retries on transient action failure",
  "sched.flag.depends_on": "Wait for an existing job to complete",
  "sched.flag.triggers": "Fire an existing job after completion",
  "sched.flag.ttl": "How long to keep the record after terminal",
  "sched.flag.description": "Free-form description shown by /jobs show",
  "sched.flag.tag": "Key=value tag for /jobs list filtering",
  "sched.flag.on_timeout": "Wait-timeout behavior",
  "sched.flag.async": "Do not block the CLI — return the job ID",
  "sched.flag.i_know": "Acknowledge a shell command flagged as dangerous",
  "sched.flag.then": "Action to run once the condition is satisfied",
  "sched.flag.name": "Job name (auto-suffixed if omitted)",
  "sched.jobs.sub.list": "List active jobs (--all includes terminal)",
  "sched.jobs.sub.show": "Full detail of a single job",
  "sched.jobs.sub.tree": "ASCII DAG showing depends_on/triggers",
  "sched.jobs.sub.cancel": "Cancel a job (running too)",
  "sched.jobs.sub.pause": "Pause a non-running job",
  "sched.jobs.sub.resume": "Resume a paused job",
  "sched.jobs.sub.logs": "Show execution history",
  "sched.jobs.sub.history": "List terminal jobs",
  "sched.jobs.sub.daemon": "Daemon status and control",
  "sched.jobs.sub.gc": "Force snapshot + WAL GC",
  "sched.jobs.sub.clear": "Delete terminal jobs from history",
  "sched.jobs.flag.all": "Include terminal jobs in the result",
  "sched.jobs.flag.status": "Filter by status",
  "sched.jobs.flag.owner": "Filter by owner",
  "sched.jobs.flag.tag": "Filter by tag (k or k=v)",
  "sched.jobs.flag.name": "Filter by name substring",
  "sched.jobs.clear.flag.failed": "Only jobs with status=failed",
  "sched.jobs.clear.flag.succeeded": "Only jobs with status=completed",
  "sched.jobs.clear.flag.cancelled": "Only jobs with status=cancelled",
  "sched.jobs.clear.flag.timed_out": "Only jobs with status=timed_out",
  "sched.jobs.clear.flag.status": "Specific terminal status (repeatable)",
  "sched.jobs.clear.flag.older_than": "Only jobs updated more than N ago (e.g. 24h, 7d)",
  "sched.jobs.clear.flag.name": "Filter by name substring",
  "sched.jobs.clear.flag.mine": "Only jobs owned by the current session",
  "sched.jobs.clear.flag.yes": "Required to actually delete (without --yes only a preview is shown)",
  "sched.jobs.daemon.status": "Show daemon state or in-process scheduler",
  "sched.jobs.daemon.start": "(use the binary: chatcli daemon start)",
  "sched.jobs.daemon.stop": "(use the binary: chatcli daemon stop)",
  "sched.jobs.daemon.restart": "(use the binary: chatcli daemon stop && start)",

  "help.command.parked": "list parked agents (/parked prune | gc <dur>)",
  "help.command.resume": "force-resume a parked agent: /resume <token>",
  "help.command.cancel_park": "cancel a parked agent: /cancel-park <token>",
  "park.banner.scheduled": "Agent parked: token=%s resume_at=%s — %s",
  "park.banner.hint": "Terminal is yours. The agent will resume itself when the wait completes. Use /resume %s to force-resume now, or /cancel-park %s to abort.",
  "park.banner.resumed": "Agent resumed (token=%s, outcome=%s) — continuing from where it stopped.",
  "park.box.title": "Agent parked",
  "park.box.token": "token",
  "park.box.mode": "mode",
  "park.box.note": "note",
  "park.box.resume_at": "resume_at",
  "park.box.controls": "Controls",
  "park.box.controls.resume_now": "force-resume now",
  "park.box.controls.cancel": "abort park",
  "park.list.empty": "No parked agents.",
  "park.list.header": "Parked agents (token / mode / description / scheduler status):",
  "park.resume.usage": "Usage: /resume <token>   (token may be a unique prefix; use /parked to list)",
  "park.resume.load_failed": "failed to load park snapshot: %v",
  "park.cancel.usage": "Usage: /cancel-park <token>   (use /parked to list)",
  "park.cancel.job_failed": "failed to cancel scheduler job: %v",
  "park.cancel.delete_failed": "failed to delete snapshot: %v",
  "park.cancel.ok": "Park %s cancelled and snapshot removed.",
  "park.resolve.empty": "park: empty token (use /parked to list)",
  "park.resolve.not_found": "park: no snapshot matching %q (use /parked to list)",
  "park.resolve.ambiguous": "park: token prefix %q is ambiguous (matches: %s) — use a longer prefix",

  "sec.cmd.usage_header": "Usage: /config security {rules|allow|deny|forget|reload} [args]",
  "sec.cmd.usage_note_pattern": "Patterns use prefix match against \"<toolName> <args>\" (e.g. \"@coder exec kubectl get\"). Deny beats Allow.",
  "sec.cmd.usage_note_scope": "Changes persist to ~/.chatcli/coder_policy.json and take effect for /coder and the scheduler on the next fire.",
  "sec.cmd.unknown_sub": "Unknown /config security subcommand: %s",
  "sec.cmd.unknown_flag": "unknown flag",
  "sec.cmd.multiple_patterns": "only one pattern can be passed per invocation",
  "sec.cmd.pattern_required": "pattern is required. Usage: /config security {allow|deny|forget} \"<pattern>\"",
  "sec.cmd.policy_load_failed": "failed to load coder policy: %v",
  "sec.cmd.cancelled": "cancelled.",
  "sec.cmd.rules_header": "CoderMode active rules",
  "sec.cmd.rules_active_path": "global file:",
  "sec.cmd.rules_local_path": "local file:",
  "sec.cmd.rules_empty": "(no rules configured; CoderMode defaults apply)",
  "sec.cmd.rules_group_deny": "Deny",
  "sec.cmd.rules_group_allow": "Allow",
  "sec.cmd.rules_group_ask": "Ask",
  "sec.cmd.rules_total": "total:",
  "sec.cmd.rules_word": "rules",
  "sec.cmd.confirm_deny": "Add DENY rule for %q? All future use (interactive or scheduled) will be blocked [y/N]:",
  "sec.cmd.confirm_allow_broad": "Pattern %q is broad and may authorize too much. Confirm ALLOW? [y/N]:",
  "sec.cmd.confirm_forget": "Remove rule %q? [y/N]:",
  "sec.cmd.added_allow": "ALLOW rule added",
  "sec.cmd.added_deny": "DENY rule added",
  "sec.cmd.forgot": "rule %q removed",
  "sec.cmd.forget_nomatch": "no rule with exact pattern %q — nothing to remove",
  "sec.cmd.persisted_to": "persisted to %s",
  "sec.cmd.reloaded": "policy reloaded from disk",
  "ask.ui.progress": "[%d/%d]",
  "ask.ui.other": "Other (type a custom answer)…",
  "ask.ui.editing": "type your answer · enter confirm · esc cancel",
  "ask.ui.hint_multi": "↑/↓ move · space toggle · enter confirm · esc back/cancel",
  "ask.ui.hint_single": "↑/↓ move · space/enter select · esc back/cancel",
  "ask.chat.tool_forbidden": "Only the ask_user tool is available in chat mode; answer in text instead.",
  "ask.chat.continue": "Now answer the user directly using the selections above. Do NOT call any tool again.",
  "plugins.ask.describe": "Asking you %d question(s)…",
  "cfg.section.chat.title": "Chat",
  "cfg.chat.ask_effective": "ask_user in chat (effective)",
  "cfg.chat.ask_active": "ask_user active now",
  "cfg.chat.about": "When on, chat may use ONLY the sanctioned exception tools (ask_user; knowledge retrieval, read-only) — never execution tools. Works with native (API key) and XML (OAuth) providers.",
  "cfg.chat.change_hint": "Toggle: /config chat ask on | off | toggle",
  "cfg.chat.unknown_sub": "unknown subcommand: %s",
  "cfg.chat.ask_invalid": "invalid value: %s",
  "cfg.chat.ask_valid": "valid values: on, off, toggle, status",
  "cfg.chat.set_failed": "failed to set CHATCLI_CHAT_ASK: %s",
  "cfg.chat.set_noop": "chat ask_user already %s",
  "cfg.chat.set_ok": "chat ask_user: %s → %s",
  "cfg.chat.persist_hint": "to persist across sessions, add CHATCLI_CHAT_ASK=%s to your .env",
  "cfg.chat.kb_effective": "knowledge in chat (effective)",
  "cfg.chat.kb_invalid": "invalid value: %s",
  "cfg.chat.kb_valid": "valid values: on, off, toggle, status",
  "cfg.chat.set_noop_var": "chat %s already %s",
  "cfg.chat.set_ok_var": "chat %s: %s → %s",
  "cfg.chat.persist_hint_var": "to persist across sessions, add %s=%s to your .env",
  "cfg.chat.usage_kb_on": "enable knowledge retrieval in chat (read-only)",
  "cfg.chat.usage_kb_off": "disable knowledge retrieval in chat",
  "cfg.chat.usage_header": "Usage — /config chat",
  "cfg.chat.usage_status": "show status",
  "cfg.chat.usage_on": "enable ask_user in chat",
  "cfg.chat.usage_off": "disable (chat stays tool-less)",
  "cfg.chat.usage_toggle": "flip the current state",
  "cfg.chat.usage_note": "Flips process env only; chat keeps streaming when off.",
  "complete.config.chat_ask": "enable/disable ask_user in chat",
  "complete.config.chat_knowledge": "enable/disable knowledge retrieval in chat (read-only)",
  "complete.config.chat_on": "enable ask_user in chat",
  "complete.config.chat_off": "disable ask_user in chat",
  "complete.config.chat_toggle": "flip ask_user in chat",
  "complete.config.chat_status": "show chat ask_user status",
  "cfg.val.no": "no",
  "cfg.chat.tool_mode": "tool-call mode (active provider)",
  "cfg.chat.mode_native": "native",
  "cfg.chat.mode_xml": "XML (works on OAuth too)",
  "plugins.image.describe.gen": "🎨 Generating image: %s",
  "plugins.image.describe.status": "🎨 Image backend",
  "plugins.image.describe.default": "🎨 Image generation",
  "plugins.speak.describe.say": "🔊 Speaking: %s",
  "plugins.speak.describe.status": "🔊 Voice backend",
  "plugins.speak.describe.default": "🔊 Text-to-speech",
  "plugins.session.describe.search": "🔎 Searching conversations: %s",
  "plugins.session.describe.list": "🔎 Listing sessions",
  "plugins.session.describe.default": "🔎 Conversation search",
  "plugins.osv.describe.scan": "🛡️ Scanning %s",
  "plugins.osv.describe.check": "🛡️ Checking %s",
  "plugins.osv.describe.default": "🛡️ Vulnerability scan",
  "plugins.skill.describe.create": "✍️ Authoring skill: %s",
  "plugins.skill.describe.update": "✍️ Updating skill: %s",
  "plugins.skill.describe.show": "📖 Showing skill: %s",
  "plugins.skill.describe.remove": "🗑️ Removing skill: %s",
  "plugins.skill.describe.list": "📚 Listing skills",
  "plugins.skill.describe.stats": "📊 Skill usage stats",
  "plugins.skill.describe.export": "📦 Exporting skills",
  "plugins.skill.describe.import": "📥 Importing skills",
  "plugins.skill.describe.default": "✍️ Skill authoring",
  "plugins.send.describe.send": "📨 Sending to %s",
  "plugins.send.describe.list": "📨 Listing platforms",
  "plugins.send.describe.default": "📨 Proactive message",
  "plugins.moa.describe.ask": "🧠 Mixture-of-Agents…",
  "plugins.moa.describe.list": "🧠 Listing providers",
  "plugins.moa.describe.default": "🧠 Mixture-of-Agents",
  "cfg.section.image.title": "Image Generation (@image)",
  "cfg.image.set_ok": "%s set to %s (effective now; add to .env to persist).",
  "cfg.image.reset_ok": "Image overrides reset.",
  "cfg.image.value_required": "Provide a value for %s.",
  "cfg.image.unknown_sub": "Unknown image subcommand: %s",
  "cfg.image.about": "Image generation backend (local SD WebUI, OpenAI Images, Responses API, Google, xAI).",
  "cfg.image.change_hint": "Use: /config image provider|api|model|url <value> · /config image models · /config image reset",
  "cfg.image.usage": "/config image [provider <name>|api images|responses|model <id>|url <url>|models|reset]",
  "cfg.image.catalog_header": "Image-capable models (catalog):",
  "cfg.image.catalog_live": "Available on your OpenAI account:",
  "complete.configimage.provider": "Set the backend (sdwebui|openai|responses|google|xai|bedrock|url|auto)",
  "complete.configimage.api": "OpenAI: Images API or Responses API",
  "complete.configimage.model": "Set the image model",
  "complete.configimage.url": "Set the URL (SD WebUI / compatible endpoint)",
  "complete.configimage.models": "List the model catalog",
  "complete.configimage.reset": "Clear image overrides",
  "complete.configimage.val": "value",
  "agent.spinner.working": "working"
}
