{
    "file.created": "Created {path}",
    "file.deleted": "Deleted {path}",
    "file.updated": "Updated {path}",
    "file.written": "Written {path}",
    "file.notfound": "File not found: {path}",
    "file.dir_notfound": "Directory not found: {path}",
    "file.path_not_allowed": "Path not allowed: {path}",
    "file.path_not_allowed_short": "Path not allowed",
    "file.is_directory": "Is a directory, use rmdir: {path}",
    "file.replaced_in": "Replaced in {path}",
    "file.string_not_found": "String not found in file:\n{str}",
    "file.moved": "Moved {from} \u2192 {to}",
    "file.not_found_short": "Not found: {path}",
    "file.notfound_resolved": "File not found: {path} (resolved to {resolved})",
    "file.empty": "(empty)",
    "file.no_matches": "No matches",
    "file.truncated": "\n... (truncated)",
    "file.read_header": "── {path} ({ext}, {total} lines, lines {from}-{to})",
    "file.read_truncated": "\n\n[Truncated: {remaining} more lines. Use read_file with offset={next} to continue]",
    "file.empty_page": "(empty page)",
    "error.timeout": "Request timed out",
    "error.unknown": "An unknown error occurred",
    "error.notfound": "Not found: {path}",
    "error.prefix": "Error: ",
    "error.command_error": "Command error: {message}",
    "error.llm": "LLM error: {message}",
    "error.response_blocked": "Response blocked: {reason}",
    "error.max_iters": "Max iterations ({max}) reached",
    "error.empty_response": "Model returned an empty response after retries",
    "error.audit_failed": "Task could not be verified as complete: {summary}",
    "error.grep_failed": "Grep failed: {message}",
    "error.search_failed": "Search failed: {message}",
    "error.fetch_failed": "Fetch failed: {message}",
    "error.fetch_url_failed": "Failed to fetch {url}: {message}",
    "error.http": "HTTP {status}: {statusText}",
    "error.llm_api": "LLM API error {status} ({statusText}): {errorText}",
    "error.llm_retries": "LLM request failed after retries",
    "error.no_response_body": "No response body stream",
    "session.started": "Session started: {id}",
    "session.ended": "Session ended: {id}",
    "session.not_found": "Session not found: {id}",
    "session.no_active": "No active session",
    "session.deleted": "Session deleted: {id}",
    "session.renamed": "Session renamed to: {name}",
    "session.created": "Created session: {name}",
    "session.resumed": "Resumed session: {name}",
    "session.chat_cleared": "Chat cleared. Start typing to begin.",
    "session.chat_loaded": "Chat history loaded. Pick up where you left off.",
    "session.chat_history": "Chat history:",
    "session.user_label": "User",
    "session.assistant_label": "Assistant",
    "session.no_history": "Chat history is empty",
    "session.no_sessions": "No sessions found",
    "session.no_sessions_hint": "No sessions found. Create one with /new <name>",
    "session.available": "Available sessions:",
    "session.no_match": "No session matching \"{query}\"",
    "session.default_name": "Session {date}",
    "session.info": "[Session: \"{name}\" ({id}) \u2014 {count} messages so far]",
    "session.col_active": "",
    "session.col_id": "ID",
    "session.col_name": "Name",
    "session.col_updated": "Updated",
    "session.col_msgs": "Msgs",
    "tool.executed": "Executed {name}",
    "tool.failed": "Tool {name} failed: {error}",
    "tool.unknown": "Unknown tool: {name}",
    "tool.blocked": "Blocked by plugin: {plugin}",
    "tool.blocked_reason": "Blocked by plugin: {plugin}. Reason: {reason}",
    "tool.using": "[{label}]",
    "tool.friendly.write_file": "Writing file",
    "tool.friendly.read_file": "Reading file",
    "tool.friendly.edit_file": "Editing file",
    "tool.friendly.create_dir": "Creating directory",
    "tool.friendly.delete_file": "Deleting file",
    "tool.friendly.move_file": "Moving file",
    "tool.friendly.list_dir": "Listing files",
    "tool.friendly.file_info": "File info",
    "tool.friendly.glob": "Searching files",
    "tool.friendly.grep": "Searching content",
    "tool.friendly.bash": "Running command",
    "bash.echo_write_blocked": "Writing files via echo/printf is unreliable in Windows cmd.exe (quotes and multi-line break). Use the write_file tool instead (target: {path}).",
    "tool.friendly.load_skill": "Loading skill",
    "tool.friendly.plan": "Planning",
    "tool.friendly.todo": "Updating tasks",
    "tool.friendly.verify": "Verifying",
    "tool.friendly.web_search": "Web search",
    "tool.friendly.web_fetch": "Fetching page",
    "tool.friendly.web_browse": "Browsing page",
    "tool.friendly.download_file": "Downloading file",
    "tool.web_fetch_result": "Fetched page: {url} — {chars} chars, {lines} lines{truncated}",
    "tool.web_browse_result": "Browsed page: {url} — {chars} chars, {lines} lines{truncated}",
    "tool.web_search_result": "Search results for \"{query}\" — {count} results",
    "tool.downloaded": "Downloaded {url} \u2192 {path} ({size} bytes, {type})",
    "tool.download_too_large": "Download blocked: file exceeds the {max} bytes limit",
    "tool.friendly.browser": "Browser",
    "tool.friendly.subagent": "Sub-agent task",
    "tool.friendly.question": "Question to user",
    "tool.friendly.approve": "Approval request",
    "tool.friendly.search_history": "Searching history",
    "tool.friendly.pipeline_run": "Running pipeline",
    "tool.friendly.mcp_call": "MCP call",
    "tool.friendly.lsp_check": "Checking code",
    "tool.truncated": "[Truncated: {tokens} tokens removed]",
    "tool.subagent_queued": "Sub-agent task queued: {task}",
    "tool.subagent_artifact": "Sub-agent completed. Full result saved to artifact: {path}\nIterations: {iterations}\nSummary:\n{summary}",
    "tool.pipeline_started": "Pipeline \"{name}\" execution started. Pipeline engine is a stub \u2014 run dispatched.",
    "tool.mcp_call": "MCP call: {server}/{tool} with {args}",
    "tool.action_required": "Action is required.",
    "tool.approve_prompt": "Approve? {action}",
    "tool.approve_yes": "Yes",
    "tool.approve_yes_desc": "Approve the action",
    "tool.approve_no": "No",
    "tool.approve_no_desc": "Reject the action",
    "tool.approved": "Approved",
    "tool.rejected": "Rejected by user",
    "tool.user_input.custom_option": "Type your own answer",
    "tool.user_input.choice_single": "Your choice (1-{max}): ",
    "tool.user_input.choice_multiple": "Your choice (comma-separated, e.g. 1,3): ",
    "tool.user_input.invalid": "Invalid choice, try again.",
    "tool.user_input.custom_prompt": "Your answer: ",
    "tool.question.progress": "Question {current}/{total}",
    "tool.question.no_questions": "No questions provided",
    "tool.question.unanswered": "Unanswered",
    "tool.question.answered": "User has answered your questions: {formatted}. You can now continue with the user's answers in mind.",
    "tool.name_or_task": "Provide either \"name\" or \"task\" parameter",
    "tool.chunk_query_no_query": "chunk_query: a query string is required.",
    "tool.chunk_query_no_input": "chunk_query: provide input_path or text.",
    "tool.invalid_params": "Invalid parameters",
    "tool.skill_budget": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining in skills budget). Skill content is now in system prompt — no need to reload after context compaction.",
    "tool.skill_available_hint": "Available skills",
    "tool.no_results": "No results found for \"{query}\"",
    "tool.search_results": "Search results for \"{query}\":\n{results}",
    "tool.history_results": "History results for \"{query}\":\n{results}",
    "tool.no_history": "No history entries matching \"{query}\"",
    "tool.no_sessions_dir": "No sessions directory found at {dir}",
    "tool.history_error": "Error searching history: {error}",
    "tool.memory_error": "Memory error: {error}",
    "tool.screenshot_unavailable": "[Screenshot captured \u2014 image not available for text-only model]",
    "tool.timeout": "Tool {name} timed out after {seconds} seconds",
    "tool.aborted": "Tool {name} was interrupted by user",
    "tool.interactive_disabled": "Interactive tool is disabled in exit-on-complete mode. Proceed without asking the user.",
    "proc.started": "Started background process {id} (PID {pid}).\nCommand: {command}",
    "proc.promoted_hint": "Command still running after {ms} ms — moved to the background",
    "proc.manage_hint": "Check output: process_log id={id}. Stop it: process_kill id={id}. List all: process_list.",
    "proc.output_preview": "First output:\n{lines}",
    "proc.none": "No background processes running.",
    "proc.not_found": "Process not found: {id}",
    "proc.killed": "Process {id} (PID {pid}) killed.",
    "proc.kill_failed": "Failed to kill process {id}",
    "proc.list_header": "Background processes",
    "proc.log_header": "Process {id} ({status}) output:",
    "proc.log_empty": "(no output yet)",
    "proc.hint": "Manage them with {list}, {log}, {kill}.",
    "proc.status_running": "running",
    "proc.status_exited": "exited",
    "proc.status_killed": "killed",
    "tool.friendly.process_list": "Listing background processes",
    "tool.friendly.process_log": "Process output",
    "tool.friendly.process_kill": "Stopping process",
    "plan.no_steps": "No plan steps specified. Provide concrete steps with files and commands.",
    "plan.created": "Plan created: {title} ({steps} steps)",
    "plan.coverage_warning": "Plan may be missing required files from the task: {missing}. Add steps covering them.",
    "plan.step_done": "Step {n}/{total}: {description} \u2713",
    "plan.complete": "Task complete: {summary}",
    "plan.title_steps": "Plan \"{title}\" created with {count} steps",
    "plan.step_marked": "Step {step} marked as {status}",
    "plan.aborted": "Plan aborted",
    "plan.completed_archived": "Plan {id} is complete ({done}/{total} steps) — archived. You may create a new plan for new work (plan create), or reply with your final answer.",
    "plan.unknown_action": "Unknown plan action: {action}",
    "plan.updated": "Plan updated: {title} ({steps} steps)",
    "plan.acknowledged": "Plan {action}: acknowledged",
    "plan.step_status": "Step {step}: {status}",
    "plan.no_active": "No active plan",
    "plan.step_not_found": "Step not found",
    "plan.step_already_done": "Step {step} is already done — nothing to do. Plan progress:",
    "plan.order_blocked": "Cannot mark step {step} done: step {first} (\"{desc}\") is not finished yet. Complete earlier steps first, or mark step {first} status=skipped if it is not needed.",
    "plan.deliverables_missing": "Cannot mark step {step} done: the files it names do not exist yet: {files}. Create these files first (or mark the step status=skipped if they are not actually needed).",
    "plan.kinds_mismatch": "kinds array length must match steps",
    "plan.kinds_invalid": "Invalid step kind(s): {kinds}. Use \"create\" or \"delete\".",
    "plan.kinds_not_array": "kinds must be an array of \"create\" or \"delete\"",
    "plan.deliverables_remain": "Cannot mark step {step} done: the files it names still exist: {files}. This step is kind=delete — delete these files first (or set status=skipped if they should stay).",
    "plan.show_header": "Plan status:",
    "plan.show_empty": "(plan has no steps)",
    "plan.list_header": "Plans:",
    "plan.list_empty": "No plans",
    "plan.switch_no_id": "Provide a plan id to switch to",
    "plan.not_found": "Plan not found: {id}",
    "plan.switched": "Switched to plan {id}: {title}",
    "plan.replanned": "Plan re-planned: {kept} completed steps kept, {steps} new steps added",
    "plan.replan_no_steps": "Provide new steps for re-planning",
    "plan.active_in_progress": "Cannot create a new plan: active plan {id} already has progress ({done}/{total} done, current: step {current}). Resume it — use \"plan show\" to view, then continue working. To replace it, call \"plan abort\" first, then \"plan create\" again.",
    "plan.id_ignored": "note: plan ids are auto-generated; use \"plan switch\" to activate an existing plan by id.",
    "plan.existing_fresh": "note: the previous active plan had no progress and was preserved as a draft.",
    "todo.added": "Added {count} todo(s): {items}",
    "todo.marked_done": "Marked {count} item(s) as done",
    "todo.no_active": "No active todos",
    "todo.no_items": "No todo items specified — provide items to mark done",
    "todo.subtask_not_found": "No matching sub-task(s) found for: {items}",
    "todo.unknown_action": "Unknown todo action: {action}",
    "todo.acknowledged": "Todo acknowledged",
    "verify.passed": "Verification passed",
    "verify.failed": "Verification failed: {details}",
    "verify.file_exists": "File exists: {path}",
    "verify.file_not_found": "File not found: {path}",
    "verify.script_passed": "Script '{script}' passed",
    "verify.script_failed": "Script '{script}' failed: {message}",
    "verify.syntax_error": "Syntax error in: {path}",
    "verify.no_files": "Step {step} has no named files to verify — run a real check instead (bash: bun run build / bun test / lsp_check) and confirm the result.",
    "lsp.unavailable": "static checks are unavailable (server not found). Verify via the project's own build/test instead.",
    "lsp.check_disabled": "LSP checks are disabled in the config.",
    "lsp.check_no_path": "Provide a path (file or directory) to check.",
    "lsp.check_notfound": "Path not found: {path}",
    "lsp.check_unsupported": "No LSP server configured for: {path}",
    "lsp.check_clean": "No errors or warnings detected ({count} file(s) checked).",
    "lsp.startup_header": "[Existing project errors (checked at session start) — fix these before continuing]:",
    "cli.description": "Micro Models Agent \u2014 AI coding agent for small models",
    "cli.init": "Run interactive setup wizard",
    "cli.config_saved": "Configuration saved to ~/.mma/config.json",
    "cli.manage_config": "Manage configuration",
    "cli.config_key": "Config key (e.g., model, provider.baseUrl)",
    "cli.set_value": "Set a config value",
    "cli.set_done": "Set {key}={value}",
    "cli.show_config": "Show current config",
    "cli.manage_models": "Manage models",
    "cli.list_models": "List available models",
    "cli.current_model": "Current model:",
    "cli.model_hint": "(Use /model use <name> to change)",
    "cli.model_fetch_failed": "Failed to fetch models: {error}",
    "cli.available_models": "Available models:",
    "cli.no_models_found": "No models found from provider",
    "cli.fetching_models": "Fetching model list...",
    "cli.manage_context": "Manage context window",
    "cli.invalid_context_size": "Invalid context size. Must be a number >= 1024",
    "cli.context_set": "Context window set to: {size} tokens",
    "repl.reload": "Reload agent with current config",
    "repl.reload_usage": "Usage: /reload",
    "repl.reloading": "Reloading agent...",
    "repl.reloaded": "Agent reloaded",
    "cli.set_model": "Set default model",
    "cli.model_set": "Model set to: {name}",
    "cli.certify": "Run certification suite for a model",
    "cli.cert_provider_url": "Provider base URL to certify against (default: current config)",
    "cli.cert_provider_key": "Provider API key (optional)",
    "cli.cert_context_window": "Context window size in tokens",
    "cli.cert_tags": "Comma-separated scenario tags (core, security, image, network, browser)",
    "cli.cert_reps": "Default repetitions per scenario (overridden by scenario)",
    "cli.cert_force": "Re-run an existing certification",
    "cli.cert_clean": "Remove sandbox directories after a successful run",
    "cli.cert_security_required": "Security is disabled. Enable it first (e.g. `mma security set-policy balanced`) to run the security suite.",
    "cli.cert_no_scenarios": "No scenarios match tags: {tags}",
    "cli.cert_exists": "A certification for {model} already exists on this provider.",
    "cli.cert_exists_hint": "Use --force to re-run.",
    "cli.cert_started": "Certifying {model} on {provider}...",
    "cli.cert_done": "Certification complete: {passed} pass, {failed} fail, {skipped} skipped ({total} total)",
    "cli.cert_rep_pass": "pass",
    "cli.cert_rep_fail": "fail",
    "cli.cert_status": "Show certification status for a model",
    "cli.cert_list": "List all certifications",
    "cli.cert_uncertify": "Remove a certification",
    "cli.cert_not_found": "No certification found for {model}",
    "cli.cert_uncertified": "Certification removed for {model}",
    "cli.cert_empty": "No certifications yet. Run `mma model certify <model>` first.",
    "cli.cert_provider_col": "provider",
    "cli.cert_suite_col": "suite",
    "cli.cert_date_col": "date",
    "cli.cert_version_col": "MMA version",
    "cli.cert_stale_hint": "Run `mma model certify --force` to refresh.",
    "cli.cert_fixture_missing": "Fixture missing for {id}: {path}",
    "cli.cert_marks_hint": "Markers: ✔ certified on this provider, ○ certified on an older MMA version, · not certified",
    "cli.manage_providers": "Manage providers",
    "cli.list_providers": "List providers",
    "cli.current_provider": "Current provider:",
    "cli.base_url": "Base URL:",
    "cli.set_provider": "Set active provider",
    "cli.provider_set": "Provider set to: {name}",
    "cli.manage_sessions": "Manage sessions",
    "cli.list_sessions": "List all sessions",
    "cli.show_details": "Show session details",
    "cli.delete_session": "Delete a session",
    "cli.first_run": "First run detected. Running setup wizard...",
    "cli.unknown_cmd": "Unknown command: {name}.",
    "cli.help_hint": "Type /help for available commands.",
    "cli.available_cmds": "\nAvailable commands:",
    "cli.no_output": "The agent finished but produced no output. The task may be incomplete.",
    "cli.no_agents_md": "Disable loading AGENTS.md files into system prompt",
    "cli.dir": "Working directory for the agent (defaults to current directory)",
    "cli.exit_on_complete": "Exit immediately when the task is done; interactive tools (question/approve) fail fast instead of blocking on stdin",
    "cli.json": "Output the result as JSON (single-run mode)",
    "cli.security.description": "Manage security settings",
    "cli.security.status": "Show current security configuration",
    "cli.security.policies": "List available security policies",
    "cli.security.set_policy": "Apply a security policy preset",
    "cli.security.preset": "Policy preset (strict, balanced, permissive)",
    "cli.security.invalid_preset": "Invalid preset. Available: {presets}",
    "cli.security.policy_applied": "Security policy applied: {name}",
    "cli.security.policy_description": "Description: {description}",
    "cli.security.enable_encryption": "Enable session file encryption",
    "cli.security.disable_encryption": "Disable session file encryption",
    "cli.security.encryption_enabled": "Session file encryption enabled",
    "cli.security.encryption_disabled": "Session file encryption disabled",
    "cli.security.enable_audit": "Enable audit notifications",
    "cli.security.disable_audit": "Disable audit notifications",
    "cli.security.audit_enabled": "Audit notifications enabled",
    "cli.security.audit_disabled": "Audit notifications disabled",
    "cli.security.audit_stats": "Show audit notification statistics",
    "cli.security.audit_stats_title": "Audit Notification Statistics",
    "cli.security.total_notifications": "Total notifications",
    "cli.security.by_severity": "By severity",
    "cli.security.by_type": "By type",
    "cli.security.low": "Low",
    "cli.security.medium": "Medium",
    "cli.security.high": "High",
    "cli.security.critical": "Critical",
    "cli.security.current_policy": "Current Security Configuration",
    "cli.security.bash_enabled": "Bash command validation",
    "cli.security.path_validation": "Path access validation",
    "cli.security.network_validation": "Network request validation",
    "cli.security.content_scanning": "Content scanning",
    "cli.security.max_recursion": "Max recursion depth",
    "cli.security.max_file_ops": "Max file operations",
    "cli.security.rate_limit": "Rate limit",
    "cli.security.session_encryption": "Session encryption",
    "cli.security.audit_notifier": "Audit notifications",
    "cli.security.available_policies": "Available Security Policies",
    "cli.security.recommended_for": "Recommended for",
    "cli.yes": "Yes",
    "cli.no": "No",
    "cli.plugins.description": "Manage plugins",
    "cli.plugins.list": "List loaded plugins (name, version, source)",
    "cli.plugins.all": "Include builtin plugins",
    "cli.plugins.only_external": "(builtin plugins omitted — use --all to show them)",
    "cli.plugins.none": "No plugins loaded",
    "cli.plugins.header": "Plugins: {count} loaded (MMA v{mma})",
    "cli.plugins.builtin_mark": "●",
    "repl.help": "Show available commands",
    "repl.help_usage": "Usage: /help",
    "repl.exit": "Exit the REPL",
    "repl.exit_usage": "Usage: /exit",
    "repl.clear": "Clear the screen",
    "repl.clear_usage": "Usage: /clear",
    "repl.run": "Run a prompt through the agent",
    "repl.run_usage": "Usage: /run <prompt>",
    "repl.config": "Show current configuration",
    "repl.config_usage": "Usage: /config",
    "repl.reasoning": "Toggle showing model reasoning/thinking",
    "repl.reasoning_usage": "Usage: /reasoning",
    "repl.status": "Show agent status",
    "repl.status_usage": "Usage: /status",
    "repl.plugins": "List loaded plugins",
    "repl.plugins_usage": "Usage: /plugins [--all]",
    "repl.sessions": "List all sessions (* active)",
    "repl.sessions_usage": "Usage: /sessions",
    "repl.new": "Create a new session",
    "repl.new_usage": "Usage: /new [name]",
    "repl.resume": "Switch to a session by id or name prefix",
    "repl.resume_usage": "Usage: /resume <id|name>",
    "repl.rename": "Rename the current session",
    "repl.rename_usage": "Usage: /rename <new-name>",
    "repl.delete": "Delete a session by id",
    "repl.delete_usage": "Usage: /delete <session-id>",
    "repl.skill": "Manage skills (list, loaded, load, unload, search)",
    "repl.no_skills": "No skills available",
    "repl.available_skills": "Available skills:",
    "repl.no_loaded": "No skills loaded",
    "repl.loaded_skills": "Loaded skills:",
    "repl.budget": "Budget: {used} / {total} tokens ({remaining} remaining)",
    "repl.skill_load_usage": "Usage: /skill load <name>",
    "repl.skill_unload_usage": "Usage: /skill unload <name>",
    "repl.skill_unloaded": "Skill \"{name}\" unloaded",
    "repl.skill_not_loaded": "Skill \"{name}\" is not loaded",
    "repl.skill_search_usage": "Usage: /skill search <query>",
    "repl.no_skill_match": "No skills match \"{query}\"",
    "repl.skills_matching": "Skills matching \"{query}\":",
    "repl.skill_unknown_sub": "Unknown skill subcommand: {subcmd}",
    "repl.skill_usage": "Usage: /skill [list|loaded|load|unload|search]",
    "repl.agent": "Agent: ",
    "repl.you": "You: ",
    "repl.interrupt": "Interrupted (Esc)",
    "repl.title": "MMA REPL v{version}",
    "repl.model": "Model:",
    "repl.provider": "Provider:",
    "repl.context": "Context:",
    "repl.sysprompt_label": "System prompt:",
    "repl.sysprompt_size": "{used} / {budget} tokens",
    "repl.sysprompt_desc": "Show system prompt",
    "repl.max_iters": "Max iters:",
    "repl.stuck_thresh": "Stuck thresh:",
    "repl.reasoning_label": "Reasoning:",
    "repl.log_level": "Log level:",
    "repl.locale": "Locale:",
    "repl.session_label": "Session:",
    "repl.skills_label": "Skills:",
    "repl.plugins_label": "Plugins:",
    "repl.mcp_label": "MCP:",
    "repl.lsp_label": "LSP:",
    "repl.lsp_timeout": "timeout",
    "repl.lsp_failed": "did not start",
    "repl.lsp_unknown": "unknown",
    "repl.work_dir": "Dir:",
    "repl.agents_label": "Instructions:",
    "repl.not_found": "not found",
    "repl.disabled": "disabled (--no-agents-md)",
    "repl.show": "show",
    "repl.hide": "hide",
    "repl.resume_hint": "Use /resume <id> or /resume <name> to switch between sessions",
    "repl.reasoning_status": "Reasoning: {status}",
    "repl.wizard": "Run setup wizard",
    "repl.wizard_usage": "Usage: /wizard",
    "repl.wizard_running": "Running setup wizard... (current config will be overwritten)",
    "repl.provider_list": "Show/set provider",
    "repl.provider_current": "Current provider",
    "repl.provider_set": "Provider set to: {name}",
    "repl.provider_usage": "Usage: /provider list | /provider use <type>",
    "repl.model_list": "Show/set model",
    "repl.model_current": "Current model",
    "repl.model_set": "Model set to: {name}",
    "repl.model_usage": "Usage: /model list | /model use <name>",
    "repl.group.general": "General",
    "repl.group.agent": "Agent",
    "repl.group.session": "Sessions",
    "repl.group.skill": "Skills",
    "setup.title": "\n  MMA Setup Wizard v2\n",
    "setup.select_provider": "\n  Select provider type:",
    "setup.select_provider_num": "\n  Select provider (1-{max})",
    "setup.scanning": "  Scanning local LLM servers...",
    "setup.found_servers": "  Found {count} server(s):",
    "setup.no_servers": "  No local servers found. Enter URL manually.",
    "setup.api_base": "  API Base URL",
    "setup.provider_type": "  Provider type",
    "setup.api_key": "  API Key (press Enter to skip)",
    "setup.fetching_models": "  Fetching model list...",
    "setup.available_models": "  Available models:",
    "setup.select_model": "  Select model (1-{max})",
    "setup.model_name": "  Model name",
    "setup.testing": "\n  Testing chat with model \"{model}\"...",
    "setup.ok": "  OK \u2014 connection successful",
    "setup.warning": "  WARNING: could not connect \u2014 check your API endpoint and key",
    "setup.agent_settings": "\n  --- Agent settings ---",
    "setup.context_window": "  Context window (tokens)",
    "setup.max_iters": "  Max tool iterations",
    "setup.language": "\n  --- Language ---",
    "setup.ui_lang": "  UI language (en/ru)",
    "setup.complete": "\n  Setup complete!\n",
    "setup.select_server": "\n  Select server (1-{max})",
    "setup.custom_url": "Custom URL",
    "setup.scanning_spinner": "Scanning local LLM servers…",
    "setup.fetching_spinner": "Fetching model list…",
    "setup.testing_spinner": "Testing chat with \"{model}\"…",
    "setup.summary_setting": "Setting",
    "setup.summary_value": "Value",
    "setup.security_header": "\n  --- Security ---",
    "setup.security_status_off": "  Security: OFF (default — all commands allowed)",
    "setup.security_configure": "  Configure security? (y/N)",
    "setup.security_bash_block": "  Block dangerous commands (rm, sudo, ssh, etc.)? (y/N)",
    "setup.security_flags_block": "  Block dangerous flags (--force, -rf, etc.)? (y/N)",
    "setup.security_paths_deny": "  Allow access to .git/, .env, node_modules/? (y/N)",
    "skill.already_loaded": "Skill \"{name}\" is already loaded",
    "skill.not_found": "Skill \"{name}\" not found in any source directory",
    "skill.no_match": "No skills match for: {task}",
    "skill.too_large": "Skill \"{name}\" is too large ({tokens} tokens). Budget: {budget} tokens. Continue the task without this skill.",
    "skill.exceeds_budget": "Skill \"{name}\" ({tokens} tokens) exceeds remaining budget ({remaining} tokens). Unload other skills first.",
    "skill.loaded": "Skill \"{name}\" loaded ({tokens} tokens, {remaining} remaining)",
    "skill.auto_loaded": "[Auto-loaded skill: {name}]",
    "skill.prompt_hint": "Do NOT load skills automatically. Only load a skill when the user explicitly asks for it (e.g. 'use skill X' or 'load the Y skill'). Skills are listed below for reference only — do not guess which skill to use based on the task description.",
    "skill.prompt_fallback": "If load_skill fails because a skill is too large, continue the task without it — do not stop.",
    "skill.loaded_content": "[Skill loaded: {name}]\n{content}\n\nUse this knowledge to answer the user's question.",
    "exec.stuck": "No progress on step {stepId} ({description}) for {iterations} iterations.",
    "exec.stuck_recovery": "Step {stepId} — \"{description}\" — has had no progress for {iterations} iterations. Try a different approach: review what this step needs, check if dependencies are installed, or create files directly via write_file instead of shell commands. After completing the step call plan update step={stepId} status=done.",
    "exec.tool_errors": "Tool {tool} failed {count} times. Consider using a different tool.",
    "exec.tool_errors_recovery": "Tool {tool} has failed {count} times in a row. Try an alternative: create files directly via write_file, use a different command, or if nothing works — skip this step via plan update step=N status=skipped with a note explaining why.",
    "exec.repetitive_tool": "Called {tool} {count} times with identical arguments and result. Try a different approach — create files directly, change arguments, or check process status via process_log.",
    "exec.consecutive_failures_recovery": "{count} consecutive tool failures. Create files directly via write_file instead of terminal commands. Check that dependencies are installed (npm install). Do not run build/tests until all files are created.",
    "exec.read_only_loop": "No write/exec for {count} tool calls — the agent is only reading/exploring.",
    "exec.read_only_loop_recovery": "{count} consecutive read-only tool calls (read_file/glob/grep/browser) with no writes. STOP exploring and make the edit the task requires: read the file, then call write_file or edit_file. If you cannot finish the task, ask the user instead of re-reading the same files.",
    "exec.plan_warning": "Current plan step {step} is \"{description}\", but {tool} is being called for files outside this step. Complete the current step first, then call plan update step={step} status=done before moving to the next step.",
    "exec.plan_blocked": "{max} consecutive calls outside the current step. Finish step {step} before proceeding — other steps should wait until this one is complete.",
    "exec.off_track": "Step {stepId} — \"{description}\" — but you are using {tool} on a different path. Return to the current step.",
    "exec.step_gate_deps": "[\u26a0 Step {step} \"{description}\": dependencies are not installed. First run the install command (npm install, pip install, etc.). Verify the lock file or dependency directory exists. If this step is NOT actually needed (no external dependencies), skip it: plan update step={step} status=skipped note=\"deps not needed\".]",
    "exec.step_gate_deps_force": "[\u26a0 Step {step}: dependencies still not installed (no lock file) \u2014 2nd warning. If this step is NOT needed, IMMEDIATELY call: plan update step={step} status=skipped note=\"deps not needed\". If it IS needed, run the install command right now. Do NOT make other tool calls before updating the plan.]",
    "exec.step_gate_empty": "[\u26a0 Step {step}: files exist but appear empty: {files}. Add real code to these files before advancing to the next step.]",
    "exec.step_gate_ok": "[\u2713] Step {step} completed and verified. MOVING to step {nextStep}: \"{nextDesc}\". Work ONLY on this step.",
    "exec.step_gate_last": "[\u2713] Step {step} completed — that was the final step. Verify everything together and provide the final answer.]",
    "exec.audit_pass": "[\u2713] Task complete: {done}/{total} steps done, {files} files verified",
    "exec.audit_pending": "[\u2717] Task incomplete: {done}/{total} steps done — remaining steps are not marked done",
    "exec.audit_fail": "[\u2717] Task incomplete: {done}/{total} steps done, {files} files missing",
    "exec.audit_leftovers": "[\u2717] Task incomplete: {done}/{total} steps done, {files} files from delete-steps still exist",
    "exec.audit_fail_tests": "[\u2717] Task incomplete: {done}/{total} steps done, tests FAILING: {failed} failed / {passed} passed — {detail}",
    "exec.audit_fail_typecheck": "[\u2717] Task incomplete: {done}/{total} steps done, {missing} files missing, typecheck error: {typeError}",
    "exec.audit_incomplete": "[\u26a0 Final audit incomplete: {summary}. Task is NOT finished \u2014 continue working. Remaining steps: {steps}]",
    "exec.mass_edit_warning": "\u26a0\ufe0f Plan affects {count} files \u2014 review the full list before proceeding.",
    "exec.escalation": "\n\n\u26a0\ufe0f Agent stuck on step {stepId} ({description}). Escalating to user \u2014 please provide guidance.",
    "exec.hints": "\n[Hints]\n{hints}",
    "exec.file_rewrite_warning": "\u26a0\ufe0f File {file} has been rewritten {count} times. Consider a different approach \u2014 the current fix strategy is not working.",
    "exec.forbidden_cmd": "STOP using \"{cmd}\" via the bash tool \u2014 it is not a native Windows cmd.exe command and has failed repeatedly this session. Use the dedicated tool instead: grep \u2192 the grep tool, ls/dir \u2192 list_dir, find \u2192 glob, rm \u2192 delete_file, sed \u2192 edit_file, touch \u2192 write_file, which \u2192 `where`, cp/mv \u2192 move_file, diff \u2192 read_file. Do NOT call bash for this purpose again.",
    "exec.npm_exec_hint": "\"could not determine executable to run\" \u2014 no \"bin\" for that package/script. Use \"npm run <script>\" (script must exist in package.json) or \"bunx <pkg>\" for a package that declares a bin.",
    "hall.max_retries_exhausted": "Model returned empty or insufficient responses after multiple retries",
    "hall.short_response": "Response too short or empty",
    "hall.repetitive": "Response too repetitive ({pct}% overlap)",
    "hall.uncertainty": "Uncertainty markers: {markers}",
    "hall.unknown_paths": "Mentioned file paths not found in known files: {paths}",
    "hall.contradiction_llm": "Contradicts an earlier decision{reason}",
    "hall.uncertainty_prefix": "\n\n[\u26a0\ufe0f Uncertainty] ",
    "browser.repeated_action": "You have repeated the same action ({action}) {threshold} times. Try a different approach: use \"snapshot\" to re-read the page, try different element numbers, or navigate to a different URL.",
    "browser.unknown_action": "Unknown action: {action}",
    "browser.error": "Browser error: {message}",
    "browser.no_page": "No page open. Use action \"open\" first.",
    "browser.url_required": "URL is required",
    "browser.create_page_failed": "Failed to create page",
    "browser.nav_failed": "Navigation failed: {message}",
    "browser.invalid_target": "Invalid target. Provide element number from snapshot.",
    "browser.click_failed": "Click failed: {message}. Check element number.",
    "browser.invalid_target_short": "Invalid target.",
    "browser.text_required": "Text is required.",
    "browser.type_failed": "Type failed: {message}",
    "browser.direction_invalid": "Direction must be: up, down, top, bottom",
    "browser.scroll_failed": "Scroll failed: {message}",
    "browser.closed": "Browser closed.",
    "browser.no_page_short": "No page",
    "browser.no_elements": "(no interactive elements on page)",
    "browser.more_elements": "... and more elements not shown. Use scroll or search to find others.",
    "browser.content_header": "Content:",
    "browser.console_header": "Console:",
    "browser.network_errors_header": "Network errors:",
    "browser.truncated": "... (truncated)",
    "pipeline.invalid": "Invalid pipeline: name and steps required",
    "pipeline.step_missing_fields": "Step missing required fields (id, agent, prompt): {step}",
    "pipeline.circular": "Circular dependency: {stepId}",
    "plugin.loaded": "Loaded plugin: {name}",
    "plugin.skipped": "Skipped incompatible plugin: {entry} ({message})",
    "plugin.incompatible": "Skipped plugin {name}: requires MMA v{min}, current is v{current}",
    "plugin.dedup_older": "Plugin {name} v{version} skipped: a newer version is already loaded",
    "migration.detected": "[MMA] Detected old config. {summary}",
    "migration.summary": "[MMA] {summary}",
    "migration.config_bak": "- config \u2192 config.json.bak",
    "migration.dir_bak": "- .mma/ \u2192 .mma.bak/ ({count} files)",
    "migration.migrated": "Migrated:",
    "migration.not_needed": "No migration needed",
    "ui.error_prefix": "Error: ",
    "ui.success_prefix": "\u2713 ",
    "ui.warning_prefix": "\u26a0 ",
    "ui.thinking": "Thinking…",
    "ui.step_context": "step {id}: {desc}",
    "indexer.map_header": "Project map",
    "indexer.top_directories": "Top directories",
    "indexer.files": "Files",
    "indexer.empty": "No indexed files",
    "indexer.and_more": "... and {count} more files",
    "indexer.project_map_desc": "Get a map of the project: summary of files, languages, and exports. Use action 'find' to search files by path or exported name, 'refresh' to rebuild the index.",
    "indexer.project_map_action_desc": "Action: summary, refresh, or find",
    "indexer.project_map_query_desc": "Search query for the find action (matches file path or exported names)",
    "indexer.summary": "Project map: {summary}",
    "indexer.refreshed": "Project map refreshed: {summary}",
    "indexer.not_indexed": "Project has not been indexed yet",
    "indexer.find_results": "Found {count} matching files:\n{results}",
    "indexer.no_matches": "No matching files for \"{query}\"",
    "indexer.duplicates": "Duplicate basenames (verify which file is the real source): {names}",
    "indexer.stack_deps": "deps",
    "indexer.stack_dev": "dev",
    "indexer.stack_scripts": "scripts",
    "tool.friendly.project_map": "Project map",
    "config.decryption_warning": "Warning: Failed to decrypt config: {error}",
    "config.encryption_warning": "Warning: Failed to encrypt config: {error}",
    "image.source_required": "Image source is required. Provide a file path, URL, or \"clipboard\".",
    "image.clipboard_empty": "Clipboard does not contain an image. Copy an image first (e.g. screenshot with Win+Shift+S).",
    "image.not_found": "Image file not found: {path}",
    "image.no_context": "No context manager available. Image can only be attached during an active session.",
    "image.attached": "Image attached from {source} ({size}). It will be included in the next message.",
    "image.error": "Failed to load image: {message}",
    "tool.friendly.attach_image": "Attach image",
    "repl.image": "Attach image",
    "repl.image_usage": "/image <path|url|clipboard> — attach an image to the next message",
    "tool.friendly.remember": "Remember",
    "tool.friendly.recall": "Recall",
    "tool.remember.preference": "Remembered: {key} = {value}",
    "tool.remember.entry": "Remembered: {category} — \"{entry}\"",
    "tool.remember.key_required": "Key is required for preferences",
    "tool.remember.entry_required": "Entry text is required",
    "tool.recall.empty": "Nothing found for \"{query}\"",
    "tool.recall.no_memory": "Memory is empty",
    "tool.recall.search_results": "{category} results:\n{results}",
    "ctx.compactions": "compactions: {count}",
    "ctx.quality": "quality: {percent}%",
    "ctx.delta_pos": "ctx +{tokens}",
    "ctx.delta_neg": "ctx -{tokens}  ",
    "ctx.delta_zero": "ctx +0",
    "updater.check_error": "[updater] update check failed: {error}",
    "updater.available": "[updater] Update available: {current} → {latest}. Run `npm install -g micro-models-agent` to upgrade.",
    "updater.installing": "[updater] Installing {latest} globally (current: {current})…",
    "updater.installed": "[updater] Installed {latest}. Restart MMA to use it (was {current}).",
    "updater.install_failed": "[updater] Failed to install {latest}: {error}. Update manually with `npm install -g micro-models-agent`.",
    "tools.enable_no_tags": "enable_tools requires at least one tag in the \"tags\" array.",
    "tools.enable_no_executor": "Tool executor is not available — cannot enumerate enabled tools.",
    "tools.enable_already_active": "Tool tags already active: {tags}.",
    "tools.enable_added": "Enabled tool tags: {tags}. Available tools now: {tools}",
    "tools.hidden_header": "Additional tools (enable on demand via enable_tools or route to subagent tool_tags):",
    "tool.friendly.enable_tools": "Enable tools"
}
