{
    "agentStatus": {
        "moreAgents": "{count} more agents",
        "overflowTrigger": "More agents"
    },
    "toc": {
        "title": "Contents",
        "show": "Show table of contents",
        "hide": "Hide table of contents",
        "empty": "No headings"
    },
    "composer": {
        "placeholder": "Type your message…",
        "commandsHint": "commands",
        "newlineHint": "newline",
        "removeAttachment": "Remove attachment",
        "showSlashCommands": "Show slash commands",
        "attachImage": "Attach image",
        "sendMessage": "Send message",
        "resizeHandle": "Resize the message box. Use the up and down arrow keys to adjust; double-click to return to automatic height."
    },
    "interrupt": {
        "stopProcessing": "Stop processing"
    },
    "history": {
        "title": "Message History",
        "regionLabel": "Message history",
        "loading": "Loading messages",
        "empty": "No messages yet",
        "show": "Show",
        "displayLimit": "History display limit",
        "showArchived": "Show archived",
        "showUserOnly": "Show user messages only",
        "showAllMessages": "Show all messages",
        "openSearch": "Open search",
        "closeSearch": "Close search",
        "copied": "Copied to clipboard",
        "copyFailed": "Failed to copy",
        "search": {
            "regionLabel": "Search history text",
            "placeholder": "Search...",
            "keywordLabel": "Search keyword",
            "prev": "Previous result",
            "next": "Next result",
            "close": "Close search bar",
            "countAtMax": "{current}/{max}+"
        }
    },
    "conversation": {
        "waitingForResponse": "Waiting for response...",
        "you": "You",
        "assistant": "Assistant",
        "sending": "Sending…",
        "failedToSend": "Failed to send",
        "retrySending": "Retry sending message",
        "discard": "Discard",
        "discardMessage": "Discard message",
        "insertToMessage": "Insert to message",
        "copy": "Copy",
        "copyMessage": "Copy message",
        "collapse": "Collapse",
        "expand": "Expand",
        "collapseMessage": "Collapse message",
        "expandMessage": "Expand message",
        "systemMessage": "System Message",
        "systemMessageLabel": "System message",
        "openFile": "Open file: {path}",
        "conversationLabel": "Conversation: {preview}",
        "filePathMissing": "That path is not in this worktree"
    },
    "slashCommands": {
        "title": "Commands",
        "searchPlaceholder": "Search commands...",
        "enterCustomCommand": "Enter custom command...",
        "selectHint": "select",
        "closeHint": "close",
        "empty": "No commands available",
        "catalogStale": {
            "hint": "Your CLI is newer than this list. Add missing commands in ~/.commandmate/slash-commands/."
        },
        "sourceBadge": {
            "userCatalog": "Custom"
        },
        "descriptions": {
            "clear": "Clear conversation history",
            "compact": "Compact context to reduce token usage",
            "resume": "Resume previous conversation",
            "rewind": "Rewind to previous conversation state",
            "config": "Open configuration settings",
            "model": "Switch AI model",
            "permissions": "View or update tool permissions",
            "status": "Check session status",
            "context": "Show context window usage",
            "review": "Review code changes",
            "help": "Show all available commands",
            "doctor": "Check installation health",
            "export": "Export conversation history",
            "focus": "Toggle focus mode",
            "effort": "Adjust model thinking effort (high/medium/low)",
            "fast": "Switch to fast response mode",
            "loop": "Run a prompt repeatedly while the session stays open",
            "add-dir": "Add a working directory for file access during the session",
            "terminal-setup": "Configure terminal keybindings for Shift+Enter and other shortcuts",
            "statusline": "Configure the status line display",
            "usage": "Show session cost, plan usage limits, and activity stats",
            "tasks": "View and manage background tasks",
            "memory": {
                "claude": "Edit CLAUDE.md memory files and manage auto-memory",
                "copilot": "Show memory status, or enable and disable memory across sessions",
                "command-code": "Manage Command Code memory"
            },
            "new": "Start a new conversation",
            "logout": {
                "codex": "Sign out from Codex",
                "claude": "Sign out of your Anthropic account",
                "copilot": "Log out of the current OAuth session",
                "command-code": "Log out of Command Code or a provider"
            },
            "quit": "Exit Codex CLI",
            "diff": "Show Git diff (including untracked files)",
            "mention": "Attach file/folder for next interaction",
            "mcp": "Manage MCP servers and available tools",
            "init": {
                "codex": "Generate AGENTS.md template in current directory",
                "claude": "Generate a CLAUDE.md guide for the repository",
                "copilot": "Initialize Copilot instructions for this repository",
                "opencode": "Run guided AGENTS.md setup",
                "command-code": "Initialize AGENTS.md for this project"
            },
            "feedback": {
                "codex": "Send feedback to Codex team",
                "claude": "Send feedback about Claude Code",
                "copilot": "Provide feedback about the CLI",
                "command-code": "Report a bug or share feedback on GitHub"
            },
            "plan": "Toggle plan mode",
            "goal": "Set goal for current session",
            "agent": {
                "copilot": "Browse and select an agent"
            },
            "subagents": "Manage subagents",
            "fork": "Fork current session",
            "memories": "Manage Codex memories",
            "skills": {
                "codex": "Manage Codex skills",
                "claude": "Manage Claude Code skills",
                "copilot": "Manage skills for enhanced capabilities",
                "opencode": "Browse and run available skills",
                "command-code": "Browse and open agent skills"
            },
            "hooks": "View or manage hook configurations",
            "sessions": "Browse conversation history",
            "connect": "Connect a provider",
            "exit": {
                "opencode": "Exit OpenCode TUI",
                "claude": "Exit the CLI",
                "codex": "Exit the CLI",
                "copilot": "Exit the CLI",
                "command-code": "Exit Command Code"
            },
            "models": "Switch AI model",
            "agents": {
                "opencode": "List and manage available agents",
                "claude": "Show a reminder to ask Claude to create or manage subagents, or to edit .claude/agents/ directly",
                "codex": "view and switch between all active agent sessions",
                "command-code": "Manage agent configurations"
            },
            "themes": "Change TUI theme",
            "editor": "Open editor for long messages",
            "advisor": "Enable or disable the advisor tool, which consults a second model for guidance at key moments during a task",
            "autocompact": "Set the auto-compact window: how full the context window gets before Claude Code compacts automatically",
            "autofix-pr": "Spawn a Claude Code on the web session that watches the current branch's PR and pushes fixes when CI fails or reviewers leave comments",
            "background": "Detach the current session to run as a background agent and free this terminal",
            "batch": "Orchestrate large-scale changes across a codebase in parallel",
            "branch": "Create a branch of the current conversation at this point, so you can try a different direction without losing the conversation as it stands",
            "btw": "Ask a quick side question in an ephemeral fork, without adding it to the conversation",
            "bug": "Report a bug or share your conversation",
            "cd": {
                "claude": "Move this session to a new working directory",
                "codex": "change the current working directory"
            },
            "chrome": "Configure Claude in Chrome settings",
            "claude-api": "Load Claude API reference material for your project's language (Python, TypeScript, Java, Go, Ruby, C#, PHP, or cURL) and Managed Agents reference",
            "code-review": "Review the current diff for correctness bugs and cleanup opportunities",
            "color": "Set the prompt bar color for the current session",
            "copy": "Copy the last response to the clipboard",
            "dataviz": "Design guidance for charts, graphs, and dashboards",
            "debug": {
                "claude": "Enable debug logging for the current session and troubleshoot issues by reading the session debug log",
                "opencode": "View debug information"
            },
            "deep-research": "Fan out web searches on a question, fetch and cross-check sources, and synthesize a cited report",
            "design-login": "Authorize design-system access for /design-sync with your claude.ai account",
            "design-sync": "Convert your repo's React design system and upload it to Claude Design, so designs it produces use your real components",
            "desktop": "Continue the current session in the Claude Code Desktop app",
            "fewer-permission-prompts": "Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts",
            "heapdump": "Write a JavaScript heap snapshot and a memory breakdown to ~/Desktop, or your home directory on Linux without a Desktop folder, for diagnosing high memory usage",
            "ide": "Manage IDE integration: status, current selection, open files, and other editor context",
            "insights": "Generate a report analyzing your Claude Code sessions, including project areas, interaction patterns, and friction points",
            "install-github-app": "Install the Claude GitHub App for a repository, with an optional step to set up GitHub Actions workflows and secrets",
            "install-slack-app": "Install the Claude Slack app",
            "keybindings": "Open your keyboard shortcuts file",
            "login": {
                "claude": "Sign in to your Anthropic account",
                "copilot": "Log in to Copilot",
                "command-code": "Log in to Command Code or a provider"
            },
            "mobile": "Show QR code to download the Claude mobile app",
            "passes": "Share a free week of Claude Code with friends",
            "plugin": {
                "claude": "Manage Claude Code plugins",
                "copilot": "Manage plugins and plugin marketplaces"
            },
            "powerup": "Discover Claude Code features through quick interactive lessons with animated demos",
            "privacy-settings": "View and update your privacy settings",
            "radio": "Open Claude FM lo-fi radio in your browser",
            "recap": {
                "claude": "Generate a one-line summary of the current session on demand",
                "codex": "Summarize the current conversation now"
            },
            "release-notes": "View the changelog in an interactive version picker",
            "reload-plugins": "Reload all active plugins to apply pending changes without restarting",
            "reload-skills": "Re-scan skill and command directories so skills added or changed on disk during the session become available without restarting",
            "remote-control": "Make this session available for Remote Control from claude.ai",
            "remote-env": "Choose the default environment for cloud agents",
            "rename": "Rename the current session or thread",
            "run": "Launch and drive your project's app to see a change working, not only passing tests",
            "run-skill-generator": "Teach /run and /verify how to build, launch, and drive your project's app from a clean environment by writing a per-project skill",
            "sandbox": "Toggle sandbox mode",
            "scroll-speed": "Adjust mouse wheel scroll speed interactively, with a ruler you can scroll while the dialog is open to preview the change",
            "security-review": "Analyze the changes on your current branch for security vulnerabilities",
            "setup-bedrock": "Configure Amazon Bedrock authentication, region, and model pins through an interactive wizard",
            "setup-vertex": "Configure Google Cloud's Agent Platform authentication, project, region, and model pins through an interactive wizard",
            "simplify": "Review the changed code for cleanup opportunities and apply the fixes",
            "stickers": "Order Claude Code stickers",
            "stop": "Stop background sessions and terminals",
            "subtask": "Spawn a forked subagent: a background subagent that inherits the full conversation and works on the task while you keep working",
            "team-onboarding": "Generate a team onboarding guide from your Claude Code usage history",
            "teleport": "Pull a Claude Code on the web session into this terminal: opens a picker, then fetches the branch and conversation",
            "theme": "Choose the color and syntax highlighting theme",
            "tui": "Set the terminal UI renderer and relaunch into it with your conversation intact",
            "ultrareview": "Run a deep, multi-agent code review in a cloud sandbox with ultrareview",
            "upgrade": "Open the upgrade page in your browser to switch to a higher plan tier",
            "usage-credits": "Configure usage credits, or request them from your admin, when you hit a limit",
            "verify": "Confirm a code change does what it should by building your project's app, running it, and observing the result, rather than relying on tests or type checks",
            "voice": "Toggle voice dictation, or enable it in a specific mode",
            "web-setup": "Connect your GitHub account to Claude Code on the web using your local gh CLI credentials",
            "workflows": "Open the workflow progress view to watch, pause, resume, or save running and completed workflows",
            "keymap": "Remap TUI shortcuts",
            "vim": "Toggle Vim mode for the composer",
            "setup-default-sandbox": "Set up elevated agent sandbox",
            "sandbox-add-read-dir": "Let sandbox read a directory: /sandbox-add-read-dir [absolute-path]",
            "experimental": "Toggle experimental features",
            "approve": "Approve one retry of a recent auto-review denial",
            "import": {
                "codex": "Import setup, this project, and recent chats from Claude Code",
                "claude": "Bring configuration from OpenAI Codex or Google Gemini CLI into Claude Code, including instruction files, MCP servers, commands, subagents, and skills",
                "command-code": "Import your setup from another coding agent (Claude Code, Codex, Cursor, pi, OpenCode, Gemini)"
            },
            "archive": "Archive this session and exit",
            "delete": "Permanently delete this session and exit",
            "app": {
                "codex": "Continue this session in the Desktop app",
                "copilot": "Open the GitHub Copilot desktop app"
            },
            "side": "Start a side conversation in an ephemeral fork",
            "raw": "Toggle raw scrollback mode for copy-friendly terminal selection",
            "debug-config": "Show config layers and requirement sources for debugging",
            "title": "Configure which items appear in the terminal title",
            "pets": "Choose or hide the terminal pet",
            "apps": "Manage apps",
            "plugins": "Browse plugins",
            "rollout": "Print the rollout file path",
            "ps": "List background terminals",
            "personality": "Choose a communication style for Codex",
            "test-approval": "Test approval request",
            "list-agents": "List the subagents and other Claude Code sessions Claude can message, with the name to use for each",
            "allow-all": "Enable all tool, path, and URL permissions",
            "ask": "Ask a quick side question without adding to conversation history",
            "autopilot": "Toggle autopilot mode",
            "changelog": "Display the changelog for CLI versions",
            "chronicle": "Show session history tools and insights",
            "cwd": "Change the working directory, or show the current one",
            "delegate": "Send this session to GitHub to create a pull request",
            "diagnose": "Analyze the current session log",
            "env": "Show loaded environment details",
            "fleet": "Enable fleet mode for parallel subagent execution",
            "footer": "Configure status line items",
            "instructions": "View and toggle custom instruction files",
            "keep-alive": "Manage keep-alive mode, which prevents system sleep",
            "limits": "View or edit session limits",
            "list-dirs": "Display all allowed directories",
            "lsp": "Manage language server configuration",
            "pr": "Operate on pull requests for the current branch",
            "refine": "Rewrite a rough prompt into a clear one for review",
            "remote": "Toggle remote control from GitHub web and mobile",
            "research": "Run a deep research investigation",
            "reset-allowed-tools": "Reset the list of allowed tools",
            "restart": "Restart the CLI, preserving the current session",
            "rubber-duck": "Get an independent critique of the current work",
            "search": "Search the conversation timeline",
            "session": "View and manage sessions",
            "settings": "Open the settings UI, or show and set a single value",
            "share": "Share the session to a markdown file or a GitHub gist",
            "undo": "Rewind the last turn and revert file changes",
            "update": "Update the CLI to the latest version",
            "user": "Manage the GitHub user list",
            "version": "Display version information",
            "mcps": "Toggle MCP servers",
            "move": "Move to another project directory",
            "variants": "Switch the model variant",
            "pwd": "show the current working directory",
            "artifacts": "List the artifacts you own or that are shared with you, then attach one to the session, open it in your browser, or copy its link",
            "auto-mode-setup": "Draft autoMode.environment entries from your project and recent sessions, then review the draft and save it to your user settings",
            "rate-limit-options": "Show ways to keep working when a claude.ai usage limit blocks a request: wait and continue automatically when the limit resets, add usage credits, or upgrade your plan",
            "workflow-authoring": "Load the reference for writing dynamic workflow scripts: the script API, resume behavior, quality patterns, and worked examples",
            "clone": "Clone the current branch into a new session and switch to it",
            "compact-mode": "Select the compaction mode used when compacting a session",
            "design": {
                "command-code": "Design partner for auditing, building, composing, and shipping UI",
                "claude": "Draft UI mockups, screen flows, landing pages, or posters as artboards on one canvas, published as a Claude Design artifact"
            },
            "extra": "Open the billing page to buy on-demand credits",
            "hotkeys": "Show all keyboard shortcuts",
            "learn": "Open the learn hub in your browser",
            "learn-taste": "Learn coding taste from sessions with other coding agents",
            "mode": "Show or switch the permission mode",
            "plan-review": "Open this session's latest plan in review",
            "plans": "Browse, review, and annotate saved plans",
            "pr-comments": "Fetch all PR comments for the current branch",
            "reload": "Restart the CLI and resume this session, applying a staged update",
            "session-file": "Show the current session id and session file path",
            "taste": "Manage taste learning and usage",
            "todos": "Manage the session todo list",
            "trace": "Copy the current trace id for support debugging",
            "tree": "Browse the session tree and jump to any point in it",
            "unshare": "Stop sharing the conversation",
            "worktree": {
                "codex": "Start or continue a conversation in a new worktree",
                "command-code": "Create, list, or switch git worktrees"
            },
            "skill-doctor": "Show what each of your skills costs in context and how often it gets used, so you can find skills to turn off"
        }
    },
    "session": {
        "confirmKill": "End session for \"{name}\"?\n\nAll message history will be deleted. Log files will be retained.",
        "failedToKill": "Failed to end session",
        "confirmEnd": "End {tool} session?",
        "endWarning": "Ending the session will clear chat history."
    },
    "status": {
        "waitingForResponse": "Waiting for response",
        "responseCompleted": "Response completed"
    },
    "errors": {
        "failedToUpdateFavorite": "Failed to update favorite",
        "failedToUpdateStatus": "Failed to update status"
    },
    "feedback": {
        "title": "Feedback & Support",
        "bugReport": "Report a bug",
        "featureRequest": "Request a feature",
        "question": "Ask a question",
        "viewIssues": "View all issues"
    },
    "fileTree": {
        "moveTo": "Move to...",
        "moveDialogTitle": "Select destination",
        "moveConfirm": "Move here",
        "moveSuccess": "Moved successfully",
        "timeAgo": "{time} ago",
        "rootDirectory": "Root",
        "metadata": {
            "size": "Size",
            "created": "Created",
            "modified": "Modified",
            "settingsLabel": "Metadata display settings",
            "settingsTitle": "Show inline",
            "showSize": "File size",
            "showCreated": "Created date",
            "showModified": "Modified date"
        },
        "loading": "Loading files",
        "empty": "No files found",
        "newFile": "New File",
        "newDirectory": "New Directory",
        "noResultsMatching": "No files matching \"{query}\"",
        "noResultsContaining": "No files containing \"{query}\"",
        "label": "File tree",
        "refreshing": "Refreshing files",
        "refreshLabel": "Refresh file tree",
        "resetViewLabel": "Reset file tree view",
        "loadError": "Failed to load files",
        "loadDirectoryError": "Failed to load directory: {status}",
        "itemCount": "{count} items"
    },
    "update": {
        "available": "A new version is available",
        "latestVersion": "Latest: v{version}",
        "updateCommand": "Update command:",
        "viewRelease": "View Release",
        "dataPreserved": "Your database data will be preserved during the update.",
        "version": "Version",
        "installTypeGlobal": "npm (global)",
        "installTypeLocal": "Local (git pull)",
        "updateNow": "Update now",
        "npxRestartNotice": "This server runs via npx. The update fetches the latest version and restarts the server. Some startup settings (such as the port) may change; if the page does not reconnect on its own, run \"commandmate status\" to find where the server is running.",
        "confirmTitle": "Update CommandMate?",
        "confirmDescription": "CommandMate will be updated to v{version}. The server stops, the new version installs, and the server starts again. This takes a few minutes.",
        "confirmButton": "Update",
        "starting": "Starting the update...",
        "updating": "Updating. The server will restart automatically.",
        "updatingHint": "This takes a few minutes. Keep this window open — the page reloads by itself once the new version is ready.",
        "noRestartTitle": "Update installed",
        "noRestartDescription": "This server was not started by \"commandmate start --daemon\", so it was left running on the old version. Restart it manually to apply the update.",
        "timeoutTitle": "The update may have failed",
        "timeoutDescription": "The server did not come back within the expected time. Check its state and finish the update manually:",
        "errorTitle": "Could not start the update",
        "errorNotGlobal": "CommandMate is not installed globally, so it cannot update itself.",
        "errorInProgress": "An update is already running.",
        "errorGeneric": "The update could not be started. Run the command manually:",
        "logHint": "Update log: {path}",
        "buttonLabel": "Update v{version}",
        "buttonAriaLabel": "Update CommandMate to v{version}",
        "buttonReleaseAriaLabel": "Open the v{version} release page",
        "buttonUpdating": "Updating…",
        "statusDialogTitle": "Update status"
    },
    "terminal": {
        "historyLabel": "History",
        "filesLabel": "Open Files",
        "showHistory": "Show history",
        "hideHistory": "Hide history",
        "showFiles": "Show open files",
        "hideFiles": "Hide open files",
        "equalizeWidths": "Equal widths",
        "equalizeWidthsHint": "Equalize terminal widths and reset History width",
        "addSplit": "Add split",
        "removeSplit": "Remove split",
        "selectInstance": "Select agent instance for {split}",
        "moreActions": "More actions",
        "searchTerminal": "Search terminal",
        "searchOutput": "Search terminal output for {split}",
        "endSession": "End session",
        "endSessionFor": "End session for {name}",
        "filesEmptyHint": "Open a file to enable this",
        "historyAllSplitsHint": "Applies to all splits",
        "maximizeSplit": "Maximize {split}",
        "maximizeFocusedSplit": "Maximize the focused split",
        "restoreSplits": "Restore the split layout",
        "maximizeShortcutHint": "⌘ / Ctrl + Shift + Enter",
        "maximizedStatus": "Split {split} maximized",
        "loading": "Loading…",
        "sessionEnded": "The session has ended. Send a message to start a new session."
    },
    "surfaceMode": {
        "groupLabel": "Output surface for {split}",
        "groupLabelMobile": "Output surface",
        "terminal": "Terminal",
        "chat": "Chat",
        "showTerminal": "Show terminal output",
        "showChat": "Show conversation",
        "chatSurfaceLabel": "Conversation"
    },
    "chatSurface": {
        "liveRegionLabel": "Session status",
        "generating": "Responding…",
        "thinking": "Thinking…",
        "bannerLabel": "You can act on this here",
        "reasonPager": "A pager is open. Scroll it and quit it from here, with the screen below in view.",
        "reasonSelectionList": "A selection list is open. Move and confirm from here, with the screen below in view.",
        "reasonDismissablePanel": "This screen only closes. Press Esc here, with it in view below.",
        "reasonUnclassified": "Chat can't tell what this screen is. It is shown as-is below, so you can drive it with the keys here.",
        "reasonPromptUnreadable": "Waiting for an answer, and the options couldn't be read. Read the screen below and answer with a number or y/n.",
        "openTerminal": "Open terminal",
        "jumpToLatest": "Jump to latest",
        "jumpToLatestGenerating": "Jump to latest (still responding)",
        "progressLabel": "Reply being written",
        "progressPartial": "Showing the latest part only",
        "settling": "Not saved to the conversation yet",
        "settlingLabel": "Reply waiting to be saved",
        "dialogCardLabel": "Terminal screen",
        "unreadableHint": "Answer with the number shown on screen (1-9) or y/n. Enter confirms whatever the CLI has highlighted."
    },
    "chatTranscript": {
        "regionLabel": "Chat transcript",
        "loading": "Loading messages",
        "empty": "No messages yet",
        "emptyHint": "Sending a message starts the session",
        "openSearch": "Search this conversation",
        "turnBoundary": "Next turn",
        "copyFull": {
            "label": "Full",
            "action": "Copy the full message, including Thinking and tool calls",
            "title": "Copy everything, including Thinking and tool calls"
        },
        "thinking": {
            "summary": "Thinking · {count}",
            "expand": "Show the reasoning",
            "collapse": "Hide the reasoning"
        },
        "jumpToTop": "Jump to the beginning",
        "toolLog": {
            "summary": "Tool calls \u00b7 {count}",
            "expand": "Show the tool calls",
            "collapse": "Hide the tool calls"
        },
        "toolActivity": {
            "show": "Show tool activity",
            "hide": "Hide tool activity"
        },
        "toolApproval": {
            "summary": "Tool approvals · {count}",
            "expand": "Show the tool approvals",
            "collapse": "Hide the tool approvals",
            "autoApproved": "Auto-approved",
            "answeredByHuman": "Answered here",
            "answeredInTerminal": "Answered in the terminal",
            "awaitingAnswer": "Awaiting an answer",
            "unclassified": "Dialog not recognized",
            "resolved": "Resolved",
            "unlabeled": "Approval dialog",
            "unlabeledQuestion": "Question",
            "autoAnswered": "Auto-answered",
            "submitConfirmation": "Answer submission",
            "confirmation": "Submission: {outcome}",
            "summaryQuestions": "Questions · {count}",
            "summaryConfirmations": "Submissions · {count}",
            "summaryConfirmationsOnly": "Answer submissions · {count}",
            "summarySeparator": " / ",
            "expandQuestions": "Show the questions",
            "collapseQuestions": "Hide the questions",
            "expandMixed": "Show the questions and approvals",
            "collapseMixed": "Hide the questions and approvals"
        },
        "previousSession": {
            "summary": "Previous session ({count})",
            "expand": "Show the previous session",
            "collapse": "Hide the previous session",
            "hint": "You can view the previous conversation in History."
        }
    },
    "directInput": {
        "toggle": "Direct input",
        "toggleAria": "Send keystrokes straight to the terminal",
        "notice": "Direct input is on. Every key you type here goes straight to the agent's terminal.",
        "placeholder": "Type here…",
        "close": "Exit direct input",
        "error": "Could not send. Check the session and try again."
    },
    "directInputKeyboard": {
        "menuItem": "Direct input",
        "unavailableTab": "Available on the Terminal tab",
        "unavailableChat": "Available in the terminal view (not in chat)",
        "unavailableSession": "Unavailable: the session is not running",
        "groupLabel": "Direct input keyboard",
        "confirmRowLabel": "Keys to send",
        "specialKeysLabel": "Special keys",
        "charKeysLabel": "Character keys",
        "stagedLabel": "Staged keys",
        "stagedCount": "{count} staged",
        "chipRepeat": "{key} ×{count}",
        "send": "Send ({count})",
        "sendAria": "Send {count} to the terminal",
        "undo": "Undo",
        "undoAria": "Take back the last one",
        "clearAll": "Clear all",
        "close": "Close",
        "closeAria": "Close direct input",
        "showChars": "Show character keys",
        "hideChars": "Hide character keys",
        "full": "Up to {max} at a time. Send or undo to continue",
        "sendFailed": "Not sure whether this went through — part of it may have arrived. Check the terminal, then send only what is missing",
        "acknowledge": "OK",
        "keys": {
            "esc": "Escape",
            "enter": "Enter",
            "bs": "Backspace (swipe up for Delete)",
            "home": "Home",
            "up": "Up arrow",
            "end": "End",
            "pgup": "Page Up",
            "tab": "Tab",
            "ctrl": "Ctrl (tap: next key, hold: lock)",
            "shift": "Shift (tap: next key, hold: lock)",
            "left": "Left arrow",
            "down": "Down arrow",
            "right": "Right arrow",
            "pgdn": "Page Down",
            "space": "Space",
            "toSymbols": "Switch to numbers and symbols",
            "toAlpha": "Switch to letters"
        }
    },
    "unsentComposer": {
        "regionLabel": "Unsent input",
        "label": "Unsent input:",
        "run": "Run",
        "clear": "Clear"
    },
    "todo": {
        "addPlaceholder": "Add a todo…",
        "add": "Add",
        "empty": "No todos yet.",
        "loading": "Loading…",
        "statusTodo": "Todo",
        "statusDoing": "In progress",
        "statusDone": "Done",
        "cycleStatus": "Status: {status} (click to change)",
        "moveUp": "Move up",
        "moveDown": "Move down",
        "delete": "Delete todo",
        "edit": "Edit todo",
        "editTitle": "Edit todo",
        "contentLabel": "Title",
        "contentPlaceholder": "Todo title",
        "detailLabel": "Detail",
        "detailPlaceholder": "Add notes (optional)…",
        "hasDetail": "Has detail",
        "copyDetail": "Copy detail",
        "save": "Save",
        "cancel": "Cancel",
        "loadError": "Failed to load todos",
        "addError": "Failed to add todo",
        "updateError": "Failed to update todo",
        "deleteError": "Failed to delete todo",
        "reorderError": "Failed to reorder todos"
    },
    "htmlPreview": {
        "interactiveModeConfirm": "Interactive mode executes scripts in the HTML file. Use Safe mode for untrusted HTML files.",
        "title": "HTML Preview: {path}",
        "modeSource": "Source",
        "modePreview": "Preview",
        "modeSplit": "Split",
        "sandboxSafe": "Safe",
        "sandboxInteractive": "Interactive"
    },
    "editor": {
        "saveFailedCloseConfirm": "Save failed. Close anyway?",
        "unsavedCloseConfirm": "You have unsaved changes. Are you sure you want to close?",
        "loading": "Loading...",
        "placeholder": "Start typing...",
        "placeholderMarkdown": "Start typing markdown...",
        "saveSuccess": "File saved successfully",
        "saveError": "Failed to save file",
        "loadError": "Failed to load file",
        "sessionExpired": "Session expired. Please re-login.",
        "autoSaveFailed": "Auto-save failed. Switched to manual save.",
        "unsaved": "Unsaved",
        "auto": "Auto",
        "splitView": "Split view",
        "editorOnly": "Editor only",
        "previewOnly": "Preview only",
        "enterFullscreen": "Enter fullscreen (Ctrl+Shift+F)",
        "exitFullscreen": "Exit fullscreen (ESC)",
        "indent": "Indent (Tab)",
        "outdent": "Outdent (Shift+Tab)",
        "tabMovesFocusOn": "Tab moves focus (Ctrl+M to indent instead)",
        "tabMovesFocusOff": "Tab indents (Ctrl+M to move focus instead)"
    },
    "actions": {
        "copyPath": "Copy path",
        "copyContent": "Copy content",
        "copyFilePath": "Copy file path",
        "copyFileContent": "Copy file content",
        "search": "Search",
        "searchInFile": "Search in file",
        "edit": "Edit",
        "editFile": "Edit file",
        "download": "Download",
        "downloadFile": "Download file",
        "close": "Close",
        "save": "Save",
        "saving": "Saving...",
        "saved": "Saved",
        "prev": "Prev",
        "next": "Next",
        "fullscreen": "Fullscreen",
        "exitFullscreen": "Exit fullscreen",
        "minimize": "Minimize",
        "maximize": "Maximize",
        "retry": "Retry",
        "refresh": "Refresh",
        "resetView": "Reset view"
    },
    "fileSearch": {
        "placeholder": "Search...",
        "prevMatch": "Previous match",
        "nextMatch": "Next match",
        "close": "Close search"
    },
    "fileViewer": {
        "loading": "Loading file...",
        "loadError": "Failed to load file",
        "tabSource": "Source",
        "tabPreview": "Preview",
        "sandboxSafe": "Safe",
        "sandboxInteractive": "Interactive",
        "slideTitle": "{name} - Slide {number}",
        "noSlides": "No slides found in {fileName}",
        "slides": "Slides",
        "editor": "Editor",
        "modeSwitch": "Switch display mode",
        "modeViewer": "Viewer",
        "modeEditor": "Edit",
        "moreActions": "More actions"
    },
    "fileTabs": {
        "unsavedChanges": "Unsaved changes",
        "closeTab": "Close {name}",
        "tabActions": "Tab actions",
        "closeAll": "Close All",
        "closeOthers": "Close Others",
        "closeToRight": "Close to the Right",
        "confirmCloseTitle": "Unsaved changes",
        "confirmCloseBody": "{count} of the tabs being closed have unsaved changes. Closing them discards those edits.",
        "confirmKeepUnsaved": "Keep unsaved",
        "confirmDiscard": "Close all",
        "confirmCancel": "Cancel"
    },
    "markdownPreview": {
        "loadingImage": "[loading image...]",
        "editor": "Editor",
        "preview": "Preview",
        "exitFullscreenHint": "Press ESC to exit fullscreen",
        "exitFullscreenHintSwipe": "(or swipe down)",
        "largeFileWarning": "Large file: Performance may be affected."
    },
    "mermaid": {
        "rendering": "Rendering diagram...",
        "loading": "Loading diagram...",
        "errorTitle": "Diagram Error",
        "emptyCode": "Diagram code is empty",
        "renderError": "Failed to render diagram"
    },
    "imageViewer": {
        "loadError": "Failed to load image"
    },
    "videoViewer": {
        "loadError": "Failed to load video",
        "loading": "Loading video...",
        "unsupported": "Your browser does not support the video tag."
    },
    "logViewer": {
        "title": "Log Files",
        "all": "All ({count})",
        "toolCount": "{tool} ({count})",
        "empty": "No log files found",
        "emptyFiltered": "No {tool} log files found",
        "copyTitle": "Copy sanitized log to clipboard",
        "export": "Export",
        "exporting": "Exporting...",
        "copied": "Log copied to clipboard (sanitized)",
        "exportError": "Failed to export log: {error}",
        "searchPlaceholder": "Search in log file...",
        "prevMatch": "Previous match (Shift+Enter)",
        "nextMatch": "Next match (Enter)",
        "noMatches": "No matches found for \"{query}\""
    },
    "pdfPreview": {
        "title": "PDF Preview: {path}",
        "loadError": "Could not load the PDF preview.",
        "openInNewTab": "Open PDF in a new tab",
        "download": "Download",
        "downloadPdf": "Download PDF"
    },
    "diffViewer": {
        "badge": "DIFF",
        "close": "Close diff view"
    },
    "search": {
        "searching": "Searching...",
        "placeholder": "Search files...",
        "label": "Search files",
        "clear": "Clear search",
        "mode": "Mode:",
        "modeName": "Name",
        "modeContent": "Content"
    },
    "tabs": {
        "ariaLabel": "Mobile navigation",
        "terminal": "Terminal",
        "history": "History",
        "files": "Files",
        "memo": "Tools",
        "info": "Info",
        "newOutput": "New output available",
        "promptWaiting": "Prompt waiting",
        "updateAvailable": "Update available"
    },
    "git": {
        "uncommittedChanges": "Uncommitted changes",
        "askAi": "Ask AI",
        "askAiTooltip": "Draft the current state into the AI chat (nothing is sent automatically)",
        "advancedOperations": "Advanced operations",
        "remote": "Remote",
        "paneSections": "Git pane sections",
        "tabs": {
            "status": "Status",
            "changes": "Changes",
            "history": "History",
            "advanced": "Advanced"
        },
        "checkout": {
            "action": "Checkout",
            "ariaLabel": "Checkout branch",
            "noBranches": "No branches",
            "checkoutBranch": "Checkout {name}",
            "checkedOutElsewhere": "Checked out in another worktree: {path}",
            "defaultBadge": "default",
            "confirmTitlePrefix": "Checkout ",
            "confirmTitleSuffix": "?",
            "forceLabel": "Discard uncommitted changes (force) — uncommitted changes will be lost",
            "historyLossWarning": "Switching to another branch may permanently discard the chat history, memos, and schedules linked to this worktree on the next sync.",
            "runningSessionWarning": "Switching to this branch changes the working files a running session is operating on."
        },
        "branches": {
            "title": "Branches",
            "newButton": "+ New",
            "refresh": "Refresh branches",
            "filterLocal": "local",
            "filterRemote": "remote",
            "filterAll": "all",
            "loading": "Loading branches...",
            "empty": "No branches",
            "defaultBadge": "default",
            "deleteBranch": "Delete {name}",
            "delete": "Delete",
            "createTitle": "Create branch",
            "namePlaceholder": "branch name (e.g. feature/123-foo)",
            "nameLabel": "New branch name",
            "baseLabel": "Base branch",
            "currentHead": "(current HEAD)",
            "create": "Create",
            "deleteTitlePrefix": "Delete ",
            "deleteTitleSuffix": "?",
            "forceDeleteLabel": "Force delete (-D) — unmerged commits will be lost"
        },
        "changes": {
            "title": "Changes",
            "refresh": "Refresh changes",
            "loading": "Loading changes...",
            "listHeader": "{title} ({count})",
            "empty": "None",
            "togglePreview": "Toggle diff preview for {path}",
            "showDiff": "Show diff for {path}",
            "diff": "Diff",
            "fileAction": "{action} {path}",
            "loadingPreview": "Loading diff preview...",
            "previewFailed": "Failed to load preview",
            "noDiff": "No diff available",
            "truncated": "… truncated — open full diff",
            "staged": "Staged",
            "unstaged": "Unstaged",
            "untracked": "Untracked",
            "stage": "Stage",
            "unstage": "Unstage",
            "commitMessage": "Commit message",
            "amend": "Amend",
            "commit": "Commit",
            "committing": "Committing...",
            "commitAndPush": "Commit + Push",
            "commitAndPushTooltip": "Commit, then push. If the push fails the commit is already saved — just retry Push."
        },
        "history": {
            "title": "Commit History",
            "refresh": "Refresh commit history",
            "loading": "Loading commit history...",
            "empty": "No commits found",
            "viewDiffFor": "View diff for {hash}",
            "viewDiff": "View diff",
            "hideDiff": "Hide diff",
            "loadingChangedFiles": "Loading changed files...",
            "noChangedFiles": "No changed files",
            "showCommitDiff": "Show commit diff for {path}",
            "changedFiles": "Changed Files",
            "diffLabel": "Diff: {file}",
            "loadingDiff": "Loading diff...",
            "noDiff": "No diff available",
            "diffInFilePanel": "Diff displayed in file panel: {file}"
        },
        "currentStatus": {
            "title": "Current Status",
            "refresh": "Check the remote and refresh (git fetch)",
            "refreshing": "Checking the remote...",
            "loading": "Loading git status...",
            "uncommitted": "uncommitted",
            "aheadTooltip": "commits ahead of upstream as of the last fetch (the live remote may differ)",
            "behindTooltip": "commits behind upstream as of the last fetch (the live remote may differ)",
            "lastFetch": "Last fetch: {relative}",
            "lastFetchNever": "Last fetch: never",
            "lastFetchTooltip": "ahead/behind compares against the remote information from this moment. Use the refresh button to update it.",
            "noUpstreamBadge": "not pushed",
            "noUpstreamTooltip": "This branch has no upstream, so ahead/behind cannot be computed (it has never been pushed)",
            "upstreamGoneBadge": "remote deleted",
            "upstreamGoneTooltip": "The configured upstream has no remote-tracking branch anymore (it was likely deleted on the remote)",
            "detachedBadge": "detached",
            "detachedTooltip": "HEAD does not point to a branch, so ahead/behind cannot be computed",
            "aheadBehindErrorBadge": "unavailable",
            "aheadBehindErrorTooltip": "Could not read ahead/behind (timeout or similar). Use the refresh button to retry."
        },
        "danger": {
            "title": "Danger Zone",
            "resetOpen": "Reset…",
            "revertOpen": "Revert…",
            "forcePushOpen": "Force Push…",
            "selectCommitHint": "Select a commit in Commit History to enable revert / reset-to-commit.",
            "resetTitle": "Reset",
            "resetTargetHead": "HEAD",
            "resetTargetSelectedPrefix": "Selected commit ",
            "resetTargetSelectedHash": "({hash})",
            "resetTargetNoneSelected": "(none selected)",
            "modeSoft": "soft",
            "modeMixed": "mixed",
            "modeHard": "hard",
            "resetHardWarning": "A hard reset permanently discards uncommitted changes, and moving HEAD may also lose commits. This operation cannot be undone.",
            "runningSessionWarning": "This destructive operation will overwrite the working files a running session is editing.",
            "confirmPlaceholder": "Type \"{branch}\" to confirm",
            "reset": "Reset",
            "revertTitle": "Revert",
            "revertBodyPrefix": "Revert commit ",
            "revertNoCommit": "No commit (leave staged)",
            "revert": "Revert",
            "forcePushTitle": "Force Push",
            "protectedBranchWarning": "Force pushing to the default branch is not allowed.",
            "forceWithLease": "Use --force-with-lease (recommended — refuses if the remote moved)",
            "forcePush": "Force Push"
        },
        "network": {
            "quickActions": "Quick actions",
            "fetch": "Fetch",
            "pull": "Pull",
            "push": "Push",
            "noUpstreamTooltip": "No upstream — will set upstream on push",
            "pushing": "Pushing",
            "pulling": "Pulling",
            "fetching": "Fetching",
            "progress": "{operation}… {elapsed}s",
            "abort": "Abort",
            "conflicts": "Pull produced conflicts: {files}. Resolve them in the terminal.",
            "authFailedGuidance": "Run push/pull once in the terminal to set up your credentials.",
            "failed": "Git network operation failed"
        },
        "stash": {
            "titlePrefix": "Stash ",
            "count": "({count})",
            "refresh": "Refresh stash list",
            "messagePlaceholder": "Stash message (optional)",
            "includeUntracked": "Include untracked",
            "push": "Stash",
            "loading": "Loading stashes...",
            "empty": "No stashes",
            "apply": "Apply",
            "pop": "Pop",
            "drop": "Drop",
            "dropConfirmSuffix": " will be permanently deleted. This operation cannot be undone."
        },
        "aiPrompts": {
            "branchCreate": "Create branch {name} from {base} and check it out.",
            "branchCreateBaseHead": "the current HEAD",
            "branchDelete": "Delete branch {name}.",
            "branchDeleteForce": "Delete branch {name}. Force-delete it with -D even if it still has unmerged commits.",
            "stashCleanup": "List the old stash entries and suggest which ones are safe to drop.",
            "stashCleanupCurrent": "Current stashes:",
            "stashConflict": "A conflict occurred while running stash pop / apply. Please resolve the conflict and then commit.",
            "reset": "I want to run a {mode} reset onto {target}. Please do it safely.",
            "resetHard": "I want to run a hard reset onto {target}. Please do it safely. A hard reset can discard work in progress. If you need to undo the hard reset afterwards, recover it from git reflog.",
            "revert": "Please revert commit {commit}.",
            "forcePush": "I want to push {branchRef} with force-with-lease. Check the diff against its upstream ({upstream}) first, and push only if it is safe.",
            "forcePushAhead": "I want to push {branchRef} (↑{ahead}) with force-with-lease. Check the diff against its upstream ({upstream}) first, and push only if it is safe.",
            "forcePushCurrentBranch": "the current branch"
        }
    },
    "activityBar": {
        "toggleSidebar": "Toggle sidebar",
        "label": "Activity Bar",
        "files": "File Tree",
        "git": "Git",
        "notes": "Notes",
        "schedules": "Schedules",
        "agent": "Agent",
        "timer": "Timer",
        "todo": "ToDo",
        "skills": "Skills",
        "verification": "Verification",
        "env": "Env",
        "settings": "Settings",
        "settingsMenu": {
            "settings": "Settings",
            "skills": "Skills",
            "theme": "Theme",
            "themeLight": "Light",
            "themeDark": "Dark",
            "themeSystem": "System",
            "language": "Language",
            "github": "GitHub",
            "logout": "Logout",
            "version": "CommandMate {version}"
        }
    },
    "branchMismatch": {
        "changedFrom": "Branch changed from",
        "to": "to",
        "dismiss": "Dismiss alert"
    },
    "contextMenu": {
        "label": "File actions",
        "uploadFile": "Upload File",
        "rename": "Rename",
        "move": "Move",
        "delete": "Delete"
    },
    "navigation": {
        "toolbarLabel": "TUI Navigation",
        "caption": "Nav",
        "quitPager": "Quit pager"
    },
    "promptAnswerKeys": {
        "toolbarLabel": "Dialog answer keys",
        "caption": "Answer"
    },
    "promptResponse": {
        "refused": "Your answer was not sent because the dialog has changed. Please check the screen."
    },
    "dismissPanelKeys": {
        "toolbarLabel": "Close this screen",
        "close": "Close (Esc)",
        "closeAria": "Close this screen (Esc)"
    },
    "planApproveKeys": {
        "toolbarLabel": "Approve this plan",
        "approve": "Approve plan (Ctrl+A)",
        "approveAria": "Approve this plan and run it (Ctrl+A)",
        "note": "Approving runs the plan. Use Esc above to cancel instead."
    },
    "selectionKeys": {
        "numbersToolbarLabel": "Option number keys",
        "numbersCaption": "Pick",
        "commitToolbarLabel": "Apply the highlighted choice",
        "sessionOnly": "This session only",
        "sessionOnlyAria": "Use the highlighted choice for this session only (s)",
        "setDefault": "Set as default",
        "setDefaultAria": "Set the highlighted choice as the default (Enter)",
        "defaultWarning": "Enter saves this choice as the default for new sessions. Use \u201cThis session only\u201d to leave your default unchanged.",
        "opencodeToolbarLabel": "opencode model keys",
        "opencodeCaption": "Model"
    },
    "newFileDialog": {
        "title": "New File",
        "fileNameLabel": "File name",
        "placeholder": "document",
        "create": "Create"
    },
    "paneResizer": {
        "label": "Resize panes. Use {arrows} arrow keys to adjust.",
        "arrowsHorizontal": "left and right",
        "arrowsVertical": "up and down"
    },
    "desktopLayout": {
        "activityPane": "Activity pane",
        "terminalPane": "Terminal pane"
    },
    "worktreeStatus": {
        "notSet": "Not set",
        "ready": "Ready",
        "inProgress": "In Progress",
        "inReview": "In Review",
        "done": "Done"
    },
    "card": {
        "main": "Main",
        "description": "Description",
        "link": "Link",
        "openLink": "Open link in new tab",
        "updated": "Updated {time}"
    },
    "detail": {
        "worktree": "Worktree",
        "repository": "Repository",
        "copyRepositoryPath": "Copy repository path",
        "copyWorktreePath": "Copy worktree path",
        "copyPath": "Copy path",
        "copied": "Copied!",
        "path": "Path",
        "status": "Status",
        "worktreeStatusLabel": "Worktree status",
        "description": "Description",
        "addNotesPlaceholder": "Add notes about this branch...",
        "noDescription": "No description added yet",
        "link": "Link",
        "lastUpdated": "Last Updated",
        "logs": "Logs",
        "hide": "Hide",
        "show": "Show",
        "viewInfo": "View worktree information",
        "info": "Info",
        "infoModalTitle": "Worktree Information",
        "loading": "Loading worktree...",
        "loadingInfo": "Loading worktree info...",
        "errorLoading": "Error loading worktree",
        "uploadFile": "Upload file",
        "unknownRepository": "Unknown",
        "loadingEditor": "Loading editor...",
        "agentInstanceSelection": "Agent Instance Selection",
        "statusPill": "{label}: {status}",
        "subTabMessage": "Message",
        "subTabGit": "Git",
        "statusPillWithModel": "{label}: {status} — model {model}",
        "statusPillWithUsage": "{base} — {usage}",
        "statusPillWithSource": "{base} — {source}"
    },
    "detailStatus": {
        "idle": "Idle - No active session",
        "ready": "Ready - Waiting for input",
        "running": "Running - Processing",
        "waiting": "Waiting - User input required"
    },
    "agentSource": {
        "line": "Events: {kind} ({state})",
        "lineBare": "Events: {kind}",
        "kindSse": "SSE",
        "kindHooks": "hooks",
        "kindScraper": "screen scrape",
        "livenessLive": "connected",
        "livenessStale": "stalled",
        "reasonPortIdentityChanged": "another process took the port",
        "reasonHeartbeatStale": "no heartbeat for over 30s",
        "reasonNotSubscribed": "no event subscription",
        "reasonOther": "reason: {reason}",
        "degradedTitle": "Structured events are not arriving",
        "healthyTitle": "Receiving structured events"
    },
    "relay": {
        "badgeOwed": "Reply due to {alias}",
        "badgeOwedMany": "Replies due ({count})",
        "badgeAwaiting": "Waiting on {alias}",
        "badgeAwaitingMany": "Waiting on {count} replies",
        "badgePrompt": "Confirmation reported",
        "owedTitle": "This session owes a delegated reply. It is delivered automatically when the turn ends.",
        "awaitingTitle": "This session is waiting for a delegated reply. It arrives in the composer as a relay message.",
        "promptTitle": "The other session stopped on a confirmation; the requester has been told.",
        "stripAwaiting": "Delegated to {alias}; waiting for the reply.",
        "stripAwaitingMany": "Waiting for {count} delegated replies.",
        "stripPrompt": "{alias} is waiting for a confirmation.",
        "stripOwed": "Owed to {alias}: this session's reply is delivered when the turn ends.",
        "historyBadge": "relay",
        "historyBadgeTitle": "Delivered by another agent session (Issue #2377 relay).",
        "historyCount": "{count} relayed message(s) in view"
    },
    "agentModel": {
        "label": "Model",
        "modelLabel": "Model: {model}",
        "changed": "Model changed from {from} to {to}",
        "sessionRow": "Model: {model}. Tap to open the model picker.",
        "changedRecently": "Changed",
        "changedRecentlyDetail": "Model changed from {from} to {to}. Tap to dismiss."
    },
    "agentMode": {
        "label": "Mode",
        "cycleAria": "Cycle the agent permission mode (shift+tab)",
        "cycleFromAria": "Cycle the agent permission mode. Currently {mode}. (shift+tab)",
        "note": {
            "codexModelCoupled": "Codex changes its model and reasoning effort along with the mode."
        },
        "noteShort": {
            "codexModelCoupled": "Also switches model"
        },
        "mode": {
            "default": "default",
            "manual": "manual",
            "accept-edits": "accept edits",
            "plan": "plan",
            "auto": "auto",
            "autopilot": "autopilot",
            "bypass": "permission bypass",
            "dont-ask": "don't-ask"
        }
    },
    "sessionNote": {
        "menuItem": "Session note",
        "placeholder": "What is this session working on?",
        "hint": "Enter to save, Esc to cancel. An empty note is removed.",
        "editLabel": "Edit the session note for {split}",
        "label": "Note: {note} (updated {time})",
        "empty": "No note yet"
    },
    "nextAction": {
        "start": "Start",
        "sendMessage": "Send message",
        "approveReject": "Approve / Reject",
        "replyToPrompt": "Reply to prompt",
        "checkStalled": "Check stalled",
        "running": "Running..."
    },
    "awaitingInstruction": {
        "badge": "Ready for work",
        "label": "The agent finished its turn and is waiting for your next instruction"
    },
    "verification": {
        "title": "Verification",
        "refresh": "Refresh",
        "loading": "Loading verification data…",
        "loadError": "Could not load verification data: {message}",
        "onboarding": {
            "what": "Verification runs the gates this repository declares in `{path}`, in this worktree, exactly as written.",
            "how": "Each gate's exit code decides the verdict. They are the same gates `commandmate verify` and `wait --verify` use, so green here means green there.",
            "loading": "Reading the declared gates…",
            "configError": "Could not read the verification config: {message}",
            "invalid": "`{path}` exists but could not be read: {message}",
            "noConfig": {
                "body": "This repository has not declared any verification gates yet — `{path}` does not exist, so there is nothing to run.",
                "hint": "Reads this repository's `.github/workflows/*.yml` and `package.json` scripts and writes a draft. An existing file is never overwritten. `commandmate verify init` does the same thing.",
                "action": "Draft from CI",
                "pending": "Drafting…",
                "docs": "How to write verify.yaml (design doc)",
                "created": "Drafted {count} gates into `{path}`. Review them before relying on the verdict.",
                "conflict": "`{path}` already exists. Nothing was overwritten; the file that is there is shown instead.",
                "empty": "Nothing in this repository's CI definitions or npm scripts could be drafted as a gate. Write `{path}` by hand.",
                "error": "Could not draft the verification config: {message}"
            },
            "configured": {
                "body": "{count} gates are declared in `{path}`. None has run on this branch yet.",
                "gatesHeading": "Declared gates",
                "builtin": "The built-in gates run alongside them: {gates}",
                "builtinHint": "The built-in gates run on every verification without being declared in `.commandmate/verify.yaml`. Each gate row below says what its gate checks.",
                "action": "Run verification"
            },
            "running": {
                "progress": "Running: {done} of {total} gates have finished.",
                "elapsed": "Elapsed {elapsed}",
                "action": "Refresh now",
                "hint": "Gates run one at a time; each appears in the list below as it finishes."
            },
            "result": {
                "body": "The last run on this branch, #{runId}, is RESULT {verdict}.",
                "action": "Show the latest run's gates"
            }
        },
        "contract": {
            "heading": "Execution contract",
            "empty": "No contract on this branch.\nCreate one with `commandmate send --contract <file>`, or the `cmate-task-contract` Skill.",
            "scopeAllow": "scope.allow",
            "scopeDeny": "scope.deny",
            "gates": "verify.gates",
            "gatesAll": "all declared gates",
            "autoYes": "autoYes.mode",
            "autoYesUnset": "unset (keeps the existing behavior)",
            "file": "contract file",
            "updated": "updated"
        },
        "runs": {
            "heading": "Verification runs",
            "empty": "No verification run yet.\nPress Re-verify, or run `commandmate verify {worktreeId}`.",
            "rerun": "Re-verify",
            "rerunPending": "Starting…",
            "rerunConflict": "A verification run is already in progress (run {runId}).",
            "rerunConflictUnknown": "A verification run is already in progress.",
            "rerunError": "Could not start verification: {message}",
            "select": "Show gates for run {runId} (RESULT {verdict} — {gloss})",
            "runLabel": "run {runId}",
            "trigger": "trigger={trigger}",
            "cliLegend": "Equivalent CLI exit codes: {items}",
            "cliLegendItem": "{label} = exit {code}",
            "exitCode": "CLI exit={code}",
            "cancel": "Stop verification",
            "cancelPending": "Stopping…",
            "cancelHint": "Stopping signals the running gate’s process group to terminate and starts none of the remaining gates. The run is closed as stopped.",
            "cancelGone": "That run had already finished. The list has been re-read — check the verdict it reached.",
            "cancelError": "Could not stop the verification run: {message}",
            "loadMore": "Load {count} more",
            "history": {
                "open": "Show history across other branches",
                "close": "Hide the cross-branch history",
                "hint": "Recent verification runs from every worktree this server manages. When one gate is red on several branches, that is usually a verdict about the gate rather than about the work.",
                "loading": "Loading the cross-branch history…",
                "empty": "No verification run from another branch in this window.",
                "error": "Could not load the cross-branch history: {message}",
                "failingGates": "Failing gates: {gates}"
            },
            "partial": "Partial run: {ran} of the {total} planned gates ran. Not run: {gates}. This verdict covers only the gates that ran.",
            "cancelSettling": "Stop requested. The gate has been signalled and the run is closing; a process that ignores it is killed five seconds later."
        },
        "gates": {
            "heading": "Gates — run {runId}",
            "empty": "This run recorded no gates.",
            "loading": "Loading gates…",
            "notFound": "That verification run is no longer available.",
            "loadError": "Could not load the verification run: {message}",
            "exitCode": "exit={code}",
            "duration": "duration={duration}",
            "contractSource": "[contract]",
            "showLog": "Show log tail",
            "hideLog": "Hide log tail",
            "logOmitted": "… (+{count} more lines; run `commandmate verify show {runId}` for the full log)",
            "noLog": "No log output recorded.",
            "verdictHeading": "This run's verdict",
            "contractSourceHint": "`[contract]` marks a gate the execution contract sent to this branch asked for, rather than one `.commandmate/verify.yaml` declares.",
            "builtinBadge": "built-in",
            "builtin": {
                "workEvidence": "Work-evidence gate (built-in). Looks for commits ahead of `options.baseRef` or an uncommitted change. With neither, the run is reported as Not started and the remaining gates never run.",
                "scope": "Scope gate (built-in). Reconciles the changed files against the execution contract's `scope.allow` / `scope.deny`. A run with no contract has no scope to judge, so the gate does not run.",
                "envClean": "Env-clean gate (built-in). Compares the machine against the snapshot taken when the task started: listening servers, `mcbd-*` tmux sessions, `$HOME` and `~/.commandmate`.",
                "config": "Config gate (built-in). A pseudo-gate that records why `.commandmate/verify.yaml` could not be read. When it is present, no real gate ran at all."
            },
            "skipHeading": "Gates that did not run",
            "skipReasonFor": "{gateId}: {reason}",
            "skipReason": {
                "primaryCheckout": "This worktree is the server process's own working directory, so `options.skipInPrimaryCheckout` declined the gate. That guard protects the running UI from a mid-flight rebuild — it is not a defect. The gate runs normally in any other worktree.",
                "workEvidence": "The `work-evidence` gate did not pass, so there was nothing for this gate to judge.",
                "mutex": "Another verification holding the same `mutex` did not finish within the wait budget, so the command was never started. That is a resource conflict, not a verdict on the work.",
                "detachedContract": "This branch has an execution contract, but the run was not attached to it, so the declared scope went unjudged. Starting the run with `wait --verify` attaches it automatically.",
                "noContract": "No execution contract is attached to this run, so no scope is declared to check.",
                "notRequired": "The execution contract sets `success.requireScopeClean: false`, so the scope was not judged.",
                "unknown": "This gate did not execute. Its log tail says why.",
                "cancelled": "The verification run was stopped, so this gate reached no verdict. That is the result of stopping the run, not a judgement about the work."
            },
            "showFullLog": "Open the full log",
            "fullLogTitle": "Full log — {gateId} (run {runId})",
            "fullLogSize": "{lines} lines",
            "fullLogStored": "The server stores only the tail of each gate’s output, capped by `options.maxLogTailBytes`. What you see here is all of it — nothing earlier was kept anywhere.",
            "copyLog": "Copy the log",
            "copied": "Copied",
            "copyFailed": "Could not copy"
        },
        "runStatus": {
            "running": "Running",
            "passed": "Passed",
            "failed": "Failed",
            "not_started": "Not started",
            "error": "Could not judge",
            "cancelled": "Cancelled"
        },
        "runStatusGloss": {
            "running": "Gates are still running; there is no verdict yet.",
            "passed": "Every selected gate passed.",
            "failed": "At least one gate failed, timed out, or errored.",
            "not_started": "No work evidence: neither a commit nor an uncommitted change. There was nothing to judge, so the remaining gates never ran.",
            "error": "No verdict was reached — gates were left unrun, or the verification config could not be read. This is not the same as failing.",
            "cancelled": "The run was cancelled before it reached a verdict."
        },
        "gateStatus": {
            "running": "Running",
            "passed": "Passed",
            "failed": "Failed",
            "timeout": "Timed out",
            "skipped": "Not run",
            "error": "Errored"
        },
        "gateStatusGloss": {
            "running": "This gate is still running.",
            "passed": "The command exited 0.",
            "failed": "The command exited with a non-zero code.",
            "timeout": "The command was cut off before it finished within timeoutSec.",
            "skipped": "This gate never executed. That is not the same as passing.",
            "error": "The gate could not be started, so it reached no verdict."
        },
        "chip": {
            "taskReason": "Task “{title}”: {status}",
            "resultBadge": "RESULT {verdict}",
            "runReason": "Last verification: RESULT {verdict} (run {runId})",
            "noRun": "No verification run yet",
            "failingGates": "Gates that did not pass: {gates}",
            "gatesPassed": "All {count} gates passed",
            "openHint": "Open the Verification pane",
            "dash": "—",
            "unverified": "Not verified",
            "noTask": "No execution contract has been sent to this branch",
            "reasonHeading": "Why this verdict",
            "showReason": "Show why",
            "hideReason": "Hide why"
        },
        "selection": {
            "heading": "Gates to run",
            "open": "Choose gates",
            "close": "Close the gate list",
            "all": "All {count} gates will run (the default)",
            "partial": "{selected} of {total} selected: {gates}",
            "gateLabel": "Select gate {gateId}",
            "runAll": "Verify with every gate",
            "runSelected": "Verify with the {count} selected",
            "hint": "Only the selected gates run, so confirming a one-line `lint` fix no longer means waiting for `build` and `unit`. The verdict then covers only the gates that ran, and a narrowed run is labelled as a partial run in the gate table. When the execution contract declares `success.requireWorkEvidence` / `requireScopeClean`, `work-evidence` and `scope` run regardless of the selection — narrowing the gate list cannot drop a criterion the contract declared.",
            "failedOnly": "Only the gates that failed ({count})",
            "failedOnlyEmpty": "The run on screen has no failing gate to re-run. A gate that did not run would simply not run again for the same reason.",
            "selectAll": "Back to all gates"
        }
    },
    "task": {
        "status": {
            "pending": "pending",
            "running": "running",
            "waiting_input": "waiting_input",
            "verifying": "verifying",
            "succeeded": "succeeded",
            "failed": "failed",
            "not_started": "not_started",
            "cancelled": "cancelled"
        }
    },
    "envManager": {
        "title": "Env Manager",
        "description": "View and edit this worktree's environment files. Values are hidden by default.",
        "filePickerLabel": "Environment file",
        "viewModeLabel": "View mode",
        "viewKeyValue": "Key-Value",
        "viewRaw": "Raw",
        "notCreated": "not created",
        "templateBadge": "template",
        "notCreatedHint": "{file} does not exist yet. Add a key and save to create it.",
        "keyLabel": "Variable name",
        "valueLabel": "Value of {key}",
        "showValue": "Show the value of {key}",
        "hideValue": "Hide the value of {key}",
        "removeRow": "Remove {key}",
        "addRow": "Add variable",
        "revealAll": "Show values",
        "hideAll": "Hide values",
        "reload": "Reload from disk",
        "save": "Save",
        "saved": "Saved.",
        "loading": "Loading environment file...",
        "loadError": "The environment file could not be loaded.",
        "empty": "No variables defined yet.",
        "validationFailed": "This file cannot be saved yet.",
        "suggestionsTitle": "Keys from the template",
        "suggestionsHint": "Defined in .env.example / .env.sample but missing here. Tap to add.",
        "rawLabel": "Raw environment file",
        "rawMaskedLabel": "Raw environment file (values hidden)",
        "rawMaskedHint": "Values are shown as {mask}. Choose \"Show values\" to reveal and edit them.",
        "issues": {
            "invalidSyntax": "Line {line}: not a KEY=VALUE assignment.",
            "invalidKey": "Line {line}: invalid variable name. Use letters, digits and underscores, starting with a letter or underscore.",
            "unterminatedQuote": "Line {line}: the quoted value for {key} is never closed.",
            "duplicateKey": "Line {line}: {key} is defined more than once. The last one wins.",
            "controlCharacter": "Line {line}: contains a control character that is not allowed in an environment file.",
            "tooLarge": "This file is too large to edit here.",
            "tooManyEntries": "This file defines too many variables to edit here."
        }
    },
    "agentSession": {
        "context": "{tokens} ({percent}%)",
        "chipLabel": "Session usage — {usage}",
        "titleLabel": "Session: {title}",
        "agentLabel": "Agent: {agent}",
        "costLabel": "Cost so far: {cost}",
        "spentLabel": "Spent this session: {tokens} tokens",
        "contextLabel": "Context in use: {tokens} of {limit} tokens ({percent}%)",
        "contextUnknownLabel": "Context in use: {tokens} tokens (window unknown)"
    },
    "opencodeDiff": {
        "title": "Files this turn changed",
        "subtitle": "{count} files",
        "revertedTitle": "Changes held back by a revert",
        "revertedSubtitle": "{count} files are reverted",
        "openDiff": "Show the diff for {file}",
        "unnamedFile": "(unnamed file)",
        "status": {
            "added": "added",
            "deleted": "deleted",
            "modified": "modified"
        },
        "revert": "Revert this turn",
        "unrevert": "Restore",
        "revertConfirmTitle": "Revert this turn?",
        "revertConfirmBody": "opencode will roll back its changes to {count} files. Files it created are deleted, and committed changes are rolled back in the working tree too. Restore undoes this.",
        "revertConfirmLabel": "Revert",
        "unrevertConfirmTitle": "Restore the reverted changes?",
        "unrevertConfirmBody": "opencode will put the reverted changes to {count} files back into the working tree.",
        "unrevertConfirmLabel": "Restore",
        "busy": "The agent is mid-turn. Try again once the turn finishes.",
        "noop": "opencode changed nothing (it could not find that turn).",
        "failed": "opencode refused the operation."
    },
    "opencodeQuickKeys": {
        "toolbarLabel": "opencode quick keys",
        "caption": "opencode",
        "needsSession": "Available after this pane's first turn ({notation})",
        "showKeys": "Show opencode quick keys",
        "hideKeys": "Hide opencode quick keys",
        "keys": {
            "agentNext": "Next agent",
            "agentPrev": "Previous agent",
            "commands": "Commands",
            "variant": "Variant",
            "agents": "Agents",
            "sessions": "Sessions",
            "newSession": "New session",
            "models": "Models",
            "themes": "Themes",
            "timeline": "Timeline",
            "undo": "Undo",
            "redo": "Redo",
            "compact": "Compact",
            "pageUp": "Page up",
            "pageDown": "Page down",
            "first": "First message",
            "last": "Latest message"
        }
    },
    "opencodeSidebar": {
        "regionLabel": "opencode sidebar warning",
        "label": "opencode sidebar is open",
        "body": "It shares rows with the transcript, so the end of a turn cannot be detected. Close it from the opencode pane with:"
    },
    "opencodeSession": {
        "new": "New opencode session",
        "list": "Open opencode session list",
        "fork": "Fork this opencode session",
        "share": "Create a share link",
        "unshare": "Revoke the share link",
        "shareCopy": "Copy link",
        "shareConfirmTitle": "Publish this conversation?",
        "shareConfirmBody": "opencode will publish this session to its own hosting, where anyone with the link can read it. What goes out is the conversation itself — your prompts, the agent's replies, and the input and output of every tool it ran — together with the absolute path of the session's working directory. Nothing is redacted. You can take the page down afterwards with \"Revoke the share link\", but that cannot un-read anything already read.",
        "shareConfirmLabel": "Publish",
        "sharePublicNotice": "Anyone with this link can read it.",
        "errorNoPort": "No opencode server is attached to this pane. Restart the pane and try again.",
        "errorNoSessionFork": "There is no session to fork yet. Run one turn first, then try again.",
        "errorNoSessionShare": "There is no session to share yet. Run one turn first, then try again.",
        "errorRequestFailed": "The request could not be sent. The CommandMate server is unreachable.",
        "errorUnknown": "The action failed. The server gave no reason.",
        "errorCopyFailed": "Could not copy the link. Select the link shown here and copy it manually."
    },
    "cliCommands": {
        "open": "CLI commands",
        "title": "CLI commands for {alias}",
        "loading": "Reading how this session is addressed…",
        "loadError": "Could not read how this session is addressed, so no command is shown — one built from a guess could target the wrong agent. Check that the CommandMate server is reachable and try again.",
        "retry": "Try again",
        "messagePlaceholder": "message",
        "target": "Target resolved by the server: --instance {instance} ({tool}, {stage})",
        "resolvedBy": {
            "explicit": "named explicitly",
            "roster": "from the roster",
            "primary": "primary instance of the tool",
            "worktree-default": "the worktree's default agent",
            "fallback": "last-resort default — this worktree names no agent of its own",
            "client-fallback": "resolved by the CLI against an older server"
        },
        "conflict": "The roster says {instance} is {roster}, but {requested} was requested. The commands below use the roster's answer, {roster}.",
        "commandLabel": {
            "send": "Send a message",
            "wait": "Wait for the turn to end",
            "capture": "Read the terminal",
            "respond": "Answer a prompt"
        },
        "commandDescription": {
            "send": "Replace the placeholder with your own text. It is left as a placeholder on purpose: quoting a real body — newlines, quotes, non-ASCII — correctly for your shell is not something this page can do without silently truncating it.",
            "wait": "Blocks until the agent finishes its turn.",
            "capture": "Prints what the agent's pane shows right now. Add --json for a machine-readable form.",
            "respond": "Sends the answer to an open prompt. Replace 1 with the number of the option you want."
        },
        "copy": "Copy",
        "copied": "Copied",
        "copyFailed": "Could not copy the command. Select the command shown here and copy it manually.",
        "portHint": "This server listens on port {port}, so the commands carry a CM_PORT= prefix. These commands have no --port flag; the environment variable is how one invocation is aimed at a non-default server.",
        "notesTitle": "Before you paste these",
        "noteInstanceFlag": "--instance is how a command names its target. --agent is only for starting an ad-hoc session the roster does not know, and wait has no --agent at all.",
        "noteWaitOnPrompt": "wait carries --on-prompt human so it keeps waiting when the agent asks something. Without it the default (agent) exits 10 the moment a prompt is detected.",
        "noteRespondNumber": "respond does not interpret its answer. Send the NUMBER of the option: \"yes\" is typed, ignored, and followed by Enter, which picks whatever the default option happens to be."
    }
}
