Files
openchamber/packages/ui/src/lib/i18n/messages/en.ts
T
Serhii Dziupin 14d7a0ca9b fix: settle busy sessions after managed OpenCode restart (#3002)
* fix: reconcile busy sessions after managed OpenCode restart

Forced health-check restarts previously rebound the event stream without
settling in-flight turns, so sessions stayed busy with no terminal state.
Interrupt those sessions, classify health failures, and retain bounded
process diagnostics for post-restart diagnosis.

Fixes #2943

Co-authored-by: serkraser <serkraser@gmail.com>

* fix: surface interrupted chats after OpenCode restart

Complete unfinished assistant turns as aborted once the session is
authoritatively idle, and show a persistent toast so users can continue
instead of remaining silently stranded.

Fixes #2943

Co-authored-by: serkraser <serkraser@gmail.com>

* fix: redact Basic auth credentials in restart diagnostics

The key/value sanitizer stopped at whitespace, so Authorization: Basic
credentials survived in stderr tails and health snapshots. Redact the
scheme token before that rule runs.

Co-authored-by: serkraser <serkraser@gmail.com>
2026-08-19 11:53:30 +03:00

3153 lines
206 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { settingsDict } from './en.settings';
export const dict = {
...settingsDict,
'terminalView.actions.attachSelection': 'Attach selected output',
'terminalView.actions.restart': 'Restart terminal',
'chat.message.terminalContext': '{terminal}, lines {start}-{end}',
'chat.chatInput.terminalContext': '{terminal}, lines {start}-{end}',
'chat.chatInput.terminalContextRemove': 'Remove terminal context',
'chat.chatInput.prCommentContext': 'PR comments',
'chat.chatInput.prCommentContextRemove': 'Remove PR comments context',
'chat.chatInput.prCheckContext': 'Failed PR checks',
'chat.chatInput.prCheckContextRemove': 'Remove PR checks context',
'common.loading': 'Loading...',
'common.unavailable': 'Unavailable',
'common.language.english': 'English',
'common.language.german': 'German',
'common.language.french': 'French',
'common.language.simplifiedChinese': 'Chinese (Simplified)',
'common.language.traditionalChinese': 'Chinese (Traditional)',
'common.language.ukrainian': 'Ukrainian',
'common.language.spanish': 'Spanish',
'common.language.brazilianPortuguese': 'Brazilian Portuguese',
'common.language.korean': 'Korean',
'common.language.polish': 'Polish',
'common.language.japanese': 'Japanese',
'common.revealPath.finder': 'Reveal in Finder',
'common.revealPath.fileExplorer': 'Open in File Explorer',
'common.revealPath.fileManager': 'Open in File Manager',
'pwa.installPrompt.description': 'Install OpenChamber for quicker access',
'pwa.installPrompt.action': 'Install',
'pwa.installPrompt.dismiss': 'Dismiss',
'pwa.installPrompt.started': 'Install started',
'pwa.installPrompt.installed': 'OpenChamber installed',
'layout.mainTab.chat': 'Chat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Diff',
'layout.mainTab.diagram': 'Diagram',
'layout.mainTab.files': 'Files',
'layout.mainTab.terminal': 'Terminal',
'layout.mainTab.context': 'Context',
'mobile.nav.aria': 'Mobile navigation',
'mobile.connect.welcome.title': 'Connect to OpenChamber',
'mobile.connect.welcome.description': 'Add a server URL or scan a pairing QR code to start using the mobile app.',
'mobile.connect.url.label': 'Server URL',
'mobile.connect.url.placeholder': 'http://192.168.1.74:2606',
'mobile.connect.token.label': 'Client token',
'mobile.connect.token.placeholder': 'Paste access token',
'mobile.connect.token.hint': 'Only needed if your server requires a token instead of a password.',
'mobile.connect.password.label': 'Password',
'mobile.connect.password.placeholder': 'OpenChamber password',
'mobile.connect.connectButton': 'Connect',
'mobile.connect.unlockButton': 'Unlock and connect',
'mobile.connect.cancelPassword': 'Use another server',
'mobile.connect.connecting': 'Connecting...',
'mobile.connect.notice.unreachable': 'Couldn\'t reach {label}. Check that the server is running.',
'mobile.connect.notice.authExpired': 'Access to {label} has expired or was revoked. Sign in again.',
'mobile.connect.recovery.description': 'Could not connect to the saved server. Check that it is running, or pick another instance.',
'mobile.connect.scanQr': 'Scan QR code',
'mobile.connect.welcome.scanHint': 'On your computer, open «Add a device» to show a QR code, then scan it here.',
'mobile.connect.advanced': 'Advanced',
'mobile.connect.manual.toggle': 'Connect by address',
'mobile.connect.scan.permissionDenied': 'Camera access is off. Enable it in Settings to scan a QR code.',
'mobile.connect.scan.failed': 'Could not scan that QR code. Try again or enter the URL manually.',
'mobile.connect.scan.invalid': 'That QR code is not an OpenChamber connection code.',
'mobile.connect.scan.unsupported': 'QR scanning is only available in the installed mobile app.',
'mobile.connect.saved.title': 'Saved connections',
'mobile.connect.saved.empty': 'No saved connections yet.',
'mobile.connect.relay.badge': 'via OpenChamber Relay',
'mobile.connect.error.urlRequired': 'Enter a server URL.',
'mobile.connect.splash.connectingTo': 'Connecting to device:',
'mobile.connect.error.invalidUrl': 'That server URL is not valid.',
'mobile.connect.error.unreachable': 'Could not reach that OpenChamber server.',
'mobile.connect.error.authRequired': 'This server needs a password or client token.',
'mobile.connect.error.passwordFailed': 'Could not unlock that server. Check the password.',
'mobile.instances.addTitle': 'Add instance',
'mobile.instances.addManual': 'Add by address',
'mobile.instances.editTitle': 'Edit instance',
'mobile.instances.edit': 'Edit',
'mobile.instances.delete': 'Delete',
'mobile.instances.deleteAria': 'Delete {label}',
'mobile.instances.confirmDeleteAria': 'Confirm deleting {label}',
'mobile.instances.cancelDeleteAria': 'Keep {label}',
'mobile.instances.cancelEdit': 'Cancel',
'mobile.instances.label.label': 'Name',
'mobile.instances.label.placeholder': 'Optional display name',
'mobile.instances.saveNew': 'Save instance',
'mobile.instances.status.connectedDirect': 'Connected · Local network',
'mobile.instances.status.connectedRelay': 'Connected · Private relay',
'mobile.instances.saveEdit': 'Save changes',
'mobile.connectionDebug.title': 'Connection log',
'mobile.connectionDebug.copy': 'Copy',
'mobile.connectionDebug.copied': 'Copied',
'mobile.connectionDebug.close': 'Close',
'mobile.connectionDebug.empty': 'No connection events yet.',
'mobile.nav.changes': 'Changes',
'mobile.nav.settings': 'Settings',
'mobile.surface.closeAria': 'Close',
'mobile.header.openWorkspaceAria': 'Open workspace panel',
'mobile.header.openMetadataAria': 'Open session metadata',
'mobile.header.metadata.context': 'Context',
'mobile.header.metadata.usage': 'Usage',
'mobile.menu.titleAria': 'Workspace tools',
'mobile.menu.files': 'Files',
'mobile.menu.changes': 'Changes',
'mobile.menu.terminal': 'Terminal',
'mobile.menu.mcp': 'MCP',
'mobile.menu.instances': 'Instances',
'mobile.menu.update': 'Update',
'mobile.menu.settings': 'Settings',
'mobile.sessions.newChatCta': 'New chat in {project}',
'mobile.sessions.dateGroup.today': 'Today',
'mobile.sessions.dateGroup.yesterday': 'Yesterday',
'mobile.sessions.dateGroup.thisWeek': 'Earlier this week',
'mobile.sessions.dateGroup.older': 'Older',
'mobile.sessions.section.worktrees': 'Worktrees',
'mobile.sessions.section.otherProjects': 'Switch project',
'mobile.sessions.section.projects': 'Projects',
'mobile.sessions.empty.noProjectsTitle': 'No projects yet',
'mobile.sessions.empty.noProjectsDescription': 'Add a project to start chatting with your code.',
'mobile.sessions.empty.noSessionsTitle': 'No sessions yet',
'mobile.sessions.empty.noSessionsDescription': 'Start your first chat to see it here.',
'mobile.sessions.empty.searchTitle': 'No matches',
'mobile.sessions.empty.searchDescription': 'Try a different search term.',
'mobile.sessions.showArchived': 'Show archived ({count})',
'mobile.sessions.hideArchived': 'Hide archived',
'mobile.sessions.activeWorktreeAria': 'Active worktree',
'mobile.sessions.activeProjectAria': 'Active project',
'mobile.sessions.startNewChat': 'Start new chat',
'mobile.sessions.newChat': 'New chat',
'mobile.sessions.editOrder': 'Reorder projects',
'mobile.sessions.doneEditing': 'Done',
'mobile.sessions.editOrderHint': 'Drag the handle to reorder projects. Tap a project to show its worktrees and drag those too. Tap the check to finish.',
'mobile.sessions.editProjectAria': 'Edit {label}',
'mobile.sessions.dragHandleAria': 'Drag {label} to reorder',
'mobile.sessions.moveUpAria': 'Move {label} up',
'mobile.sessions.moveDownAria': 'Move {label} down',
'mobile.sessions.removeProjectAria': 'Remove {label}',
'mobile.sessions.confirmRemoveProjectAria': 'Confirm removing {label}',
'mobile.sessions.toast.projectRemoved': 'Removed {label}',
'mobile.sessions.archiveSessionAria': 'Archive {title}',
'mobile.sessions.cancelArchiveAria': 'Cancel archiving {title}',
'mobile.sessions.renameSessionAria': 'Rename {title}',
'mobile.sessions.renameError': 'Failed to rename session',
'mobile.sessions.deleteSessionAria': 'Delete {title}',
'mobile.sessions.confirmDeleteSessionAria': 'Confirm deleting {title}',
'mobile.projectEdit.worktreesTitle': 'Worktrees',
'mobile.projectEdit.worktreesEmpty': 'No worktrees in this project yet.',
'mobile.projectEdit.reorderHint': 'Drag to reorder worktrees.',
'mobile.projectEdit.dragWorktreeAria': 'Drag {label} to reorder',
'mobile.projectEdit.deleteWorktreeAria': 'Remove worktree {label}',
'mobile.projectEdit.deleteWorktreeTitle': 'Remove worktree',
'mobile.projectEdit.deleteWorktreeConfirmButton': 'Remove',
'mobile.projectEdit.deleteWorktreeConfirm': 'Remove the worktree “{name}”? This cant be undone.',
'mobile.projectEdit.deleteWorktreeDirty': 'This worktree has uncommitted changes that will be lost.',
'mobile.projectEdit.deleteWorktreeArchiveNote': '{count} attached session(s) will be archived.',
'mobile.projectEdit.deleteLocalBranch': 'Also delete local branch',
'mobile.projectEdit.deleteRemoteBranch': 'Also delete remote branch',
'mobile.sessions.showMore': 'Show {count} more',
'mobile.sessions.search.section.sessions': 'Sessions',
'mobile.sessions.search.section.archived': 'Archived',
'mobile.sessions.search.section.projects': 'Projects',
'mobile.sessions.clearSearchAria': 'Clear search',
'mobile.header.noProject': 'Select a project',
'mobile.header.activeSession': 'Active session',
'mobile.header.noSession': 'No active session',
'mobile.sessions.openSheetAria': 'Open sessions and projects',
'mobile.sessions.closeSheetAria': 'Close sessions and projects',
'mobile.sessions.sheet.title': 'Sessions',
'mobile.sessions.sheet.description': 'Switch projects, open sessions, or start a new chat.',
'mobile.sessions.search.placeholder': 'Search sessions',
'mobile.sessions.empty': 'No sessions found.',
'mobile.sessions.unassignedProject': 'Other sessions',
'mobile.sessions.newSessionAria': 'Start a new session in this project',
'mobile.sessions.untitled': 'Untitled session',
'mobile.sessions.project.sessionsSingle': '1 session',
'mobile.sessions.project.sessionsPlural': '{count} sessions',
'mobile.files.refreshAria': 'Refresh files',
'mobile.files.backToParentAria': 'Back to {name}',
'mobile.files.rootDirectory': 'Project files',
'mobile.files.search.placeholder': 'Search files',
'mobile.files.search.empty': 'No files found.',
'mobile.files.parentDirectory': 'Parent directory',
'mobile.files.empty.noDirectory': 'Select a project to browse files.',
'mobile.files.empty.directory': 'This directory is empty.',
'mobile.files.error.listFailed': 'Failed to load files',
'mobile.files.error.readUnavailable': 'File preview is unavailable in this runtime.',
'mobile.files.file.truncated': 'File preview truncated for mobile.',
'mobile.files.copyPathAria': 'Copy file path',
'mobile.files.copyContent': 'Copy content',
'mobile.files.copyContentAria': 'Copy file content',
'mobile.files.editAria': 'Edit file',
'mobile.files.doneEditingAria': 'Done editing',
'mobile.files.toast.pathCopied': 'Path copied',
'mobile.files.toast.contentCopied': 'Content copied',
'mobile.files.toast.copyFailed': 'Copy failed',
'mobile.changes.placeholder.title': 'Changes',
'mobile.changes.placeholder.description': 'Working-tree review, sync, and commit actions will live here.',
'mobile.changes.branchLabel': 'Branch: {branch}',
'mobile.changes.noRemote': 'No remote available',
'mobile.changes.cleanDescription': 'There are no changed files in this workspace.',
'mobile.changes.diffDetail.subtitle': 'Read-only diff',
'mobile.changes.diffDetail.loadFailed': 'Failed to load diff',
'mobile.changes.diffDetail.missingTitle': 'File is no longer changed',
'mobile.changes.diffDetail.missingDescription': 'Go back to Changes and refresh the list.',
'mobile.changes.diffDetail.imageUnavailable': 'Image diffs are not available in mobile Changes yet.',
'mobile.settings.placeholder.title': 'Settings',
'mobile.settings.placeholder.description': 'Focused mobile connection and app settings will live here.',
'layout.rightSidebar.git': 'Git',
'layout.rightSidebar.files': 'Files',
'layout.rightSidebar.context': 'Context',
'layout.services.instance': 'Instance',
'layout.services.usage': 'Usage',
'sessions.sidebar.header.actions.closeSessions': 'Close sessions',
'sessions.sidebar.header.actions.addProject': 'Add project',
'sessions.sidebar.header.actions.newSession': 'New session',
'sessions.sidebar.header.actions.newMultiRun': 'New multi-run',
'sessions.sidebar.header.actions.scheduledTasks': 'Scheduled tasks',
'sessions.scheduledTasks.dialog.title': 'Scheduled tasks',
'sessions.scheduledTasks.dialog.description': 'Server-side tasks that create a new session and send a configured prompt.',
'sessions.scheduledTasks.dialog.project.label': 'Project',
'sessions.scheduledTasks.dialog.project.placeholder': 'Select project',
'sessions.scheduledTasks.dialog.project.empty': 'No projects',
'sessions.scheduledTasks.dialog.actions.newTask': 'New task',
'sessions.scheduledTasks.dialog.actions.runNow': 'Run now',
'sessions.scheduledTasks.dialog.actions.edit': 'Edit',
'sessions.scheduledTasks.dialog.actions.editAria': 'Edit {taskName}',
'sessions.scheduledTasks.dialog.actions.deleteAria': 'Delete {taskName}',
'sessions.scheduledTasks.dialog.loading': 'Loading tasks...',
'sessions.scheduledTasks.dialog.empty.noTasks': 'No scheduled tasks yet.',
'sessions.scheduledTasks.dialog.empty.selectProject': 'Select a project to manage scheduled tasks.',
'sessions.scheduledTasks.dialog.error.chooseProjectFirst': 'Choose a project first',
'sessions.scheduledTasks.dialog.toast.loadFailed': 'Failed to load scheduled tasks',
'sessions.scheduledTasks.dialog.toast.saved': 'Scheduled task saved',
'sessions.scheduledTasks.dialog.toast.updateFailed': 'Failed to update task',
'sessions.scheduledTasks.dialog.toast.deleted': 'Scheduled task deleted',
'sessions.scheduledTasks.dialog.toast.deleteFailed': 'Failed to delete task',
'sessions.scheduledTasks.dialog.toast.started': 'Task started',
'sessions.scheduledTasks.dialog.toast.startedPersistWarning': 'Task started, but its status could not be saved. It may still show as running until the next successful run.',
'sessions.scheduledTasks.dialog.toast.runFailed': 'Failed to run task',
'sessions.scheduledTasks.dialog.confirm.deleteTask': 'Delete scheduled task "{taskName}"?',
'sessions.scheduledTasks.dialog.confirm.deleteLoopFile': 'Delete loop task "{taskName}" and its markdown file?',
'sessions.scheduledTasks.dialog.schedule.daily': 'Daily {time}',
'sessions.scheduledTasks.dialog.schedule.dailyWithTimezone': 'Daily {time} ({timezone})',
'sessions.scheduledTasks.dialog.schedule.weekly': 'Weekly {days} {time}',
'sessions.scheduledTasks.dialog.schedule.weeklyWithTimezone': 'Weekly {days} {time} ({timezone})',
'sessions.scheduledTasks.dialog.schedule.once': 'One-time {date} {time}',
'sessions.scheduledTasks.dialog.schedule.onceWithTimezone': 'One-time {date} {time} ({timezone})',
'sessions.scheduledTasks.dialog.schedule.cron': 'Cron: {cron}',
'sessions.scheduledTasks.dialog.schedule.cronWithTimezone': 'Cron: {cron} ({timezone})',
'sessions.scheduledTasks.dialog.schedule.unknownDate': 'Unknown date',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.sun': 'Sun',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.mon': 'Mon',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.tue': 'Tue',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.wed': 'Wed',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.thu': 'Thu',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.fri': 'Fri',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.sat': 'Sat',
'sessions.scheduledTasks.dialog.schedule.weekdayShort.unknown': '?',
'sessions.scheduledTasks.dialog.relativeTime.inLessThanOneMinute': 'in <1m',
'sessions.scheduledTasks.dialog.relativeTime.justNow': 'just now',
'sessions.scheduledTasks.dialog.relativeTime.inMinutes': 'in {count}m',
'sessions.scheduledTasks.dialog.relativeTime.minutesAgo': '{count}m ago',
'sessions.scheduledTasks.dialog.relativeTime.inDuration': 'in {duration}',
'sessions.scheduledTasks.dialog.relativeTime.durationAgo': '{duration} ago',
'sessions.scheduledTasks.dialog.status.success': 'Success',
'sessions.scheduledTasks.dialog.status.error': 'Error',
'sessions.scheduledTasks.dialog.status.running': 'Running',
'sessions.scheduledTasks.dialog.status.idle': 'Idle',
'sessions.scheduledTasks.dialog.nextRun.label': 'Next',
'sessions.scheduledTasks.dialog.lastRun.label': 'Last run',
'sessions.scheduledTasks.dialog.lastRun.runningNow': 'running now',
'sessions.scheduledTasks.dialog.lastRun.never': 'never',
'sessions.scheduledTasks.dialog.taskToggle.enableAria': 'Enable {taskName}',
'sessions.scheduledTasks.dialog.taskToggle.pauseAria': 'Pause {taskName}',
'sessions.scheduledTasks.dialog.taskToggle.enabled': 'Enabled',
'sessions.scheduledTasks.dialog.taskToggle.paused': 'Paused',
'sessions.scheduledTasks.dialog.loopFile.note': 'Managed by loop file {file}',
'sessions.scheduledTasks.dialog.loopFile.toggleDisabled': 'Enabled is controlled by the loop file; set enabled in the markdown frontmatter',
'sessions.scheduledTasks.dialog.loopFile.actionsDisabled': 'Loop tasks are configured in their .agents/loops markdown file',
'sessions.scheduledTasks.editor.title.edit': 'Edit scheduled task',
'sessions.scheduledTasks.editor.title.new': 'New scheduled task',
'sessions.scheduledTasks.editor.description': 'Configure a server-side task that creates a new session and sends a prompt.',
'sessions.scheduledTasks.editor.taskName.label': 'Task name',
'sessions.scheduledTasks.editor.taskName.placeholder': 'Daily sync',
'sessions.scheduledTasks.editor.scheduleType.label': 'Schedule type',
'sessions.scheduledTasks.editor.scheduleType.daily': 'Daily',
'sessions.scheduledTasks.editor.scheduleType.weekly': 'Weekly',
'sessions.scheduledTasks.editor.scheduleType.once': 'One-time',
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
'sessions.scheduledTasks.editor.date.label': 'Date',
'sessions.scheduledTasks.editor.date.placeholder': 'Select date',
'sessions.scheduledTasks.editor.date.previousMonth': 'Previous month',
'sessions.scheduledTasks.editor.date.nextMonth': 'Next month',
'sessions.scheduledTasks.editor.date.jumpToToday': 'Jump to today',
'sessions.scheduledTasks.editor.date.today': 'Today',
'sessions.scheduledTasks.editor.time.label': 'Time',
'sessions.scheduledTasks.editor.time.hourAria': 'Hours',
'sessions.scheduledTasks.editor.time.minuteAria': 'Minutes',
'sessions.scheduledTasks.editor.time.periodAria': 'Period',
'sessions.scheduledTasks.editor.time.period.am': 'AM',
'sessions.scheduledTasks.editor.time.period.pm': 'PM',
'sessions.scheduledTasks.editor.times.label': 'Times',
'sessions.scheduledTasks.editor.times.add': 'Add time',
'sessions.scheduledTasks.editor.times.removeAria': 'Remove time',
'sessions.scheduledTasks.editor.timezone.label': 'Timezone',
'sessions.scheduledTasks.editor.weekdays.label': 'Weekdays',
'sessions.scheduledTasks.editor.model.label': 'Model',
'sessions.scheduledTasks.editor.thinkingLevel.label': 'Thinking level',
'sessions.scheduledTasks.editor.thinkingLevel.default': 'Default',
'sessions.scheduledTasks.editor.agent.label': 'Agent',
'sessions.scheduledTasks.editor.prompt.label': 'Prompt',
'sessions.scheduledTasks.editor.prompt.placeholder': 'Summarize open tasks and propose next actions',
'sessions.scheduledTasks.editor.enabled.aria': 'Enable task',
'sessions.scheduledTasks.editor.enabled.label': 'Enabled',
'sessions.scheduledTasks.editor.goal.label': 'Run as goal',
'sessions.scheduledTasks.editor.goal.aria': 'Run this task as a goal the agent pursues to completion',
'sessions.scheduledTasks.editor.goal.budgetLabel': 'Token budget',
'sessions.scheduledTasks.editor.goal.budgetAria': 'Limit the goal to a token budget',
'sessions.scheduledTasks.editor.permissionAutoAccept.label': 'Auto-accept permissions',
'sessions.scheduledTasks.editor.permissionAutoAccept.aria': 'Start the task session with permission auto-accept enabled',
'sessions.scheduledTasks.editor.actions.closeAria': 'Close',
'sessions.scheduledTasks.editor.actions.cancel': 'Cancel',
'sessions.scheduledTasks.editor.actions.save': 'Save',
'sessions.scheduledTasks.editor.actions.saving': 'Saving...',
'sessions.scheduledTasks.editor.toast.saveFailed': 'Failed to save task',
'sessions.scheduledTasks.editor.validation.taskNameRequired': 'Task name is required',
'sessions.scheduledTasks.editor.validation.promptRequired': 'Prompt is required',
'sessions.scheduledTasks.editor.validation.modelRequired': 'Model is required',
'sessions.scheduledTasks.editor.validation.dateFormat': 'Date must use YYYY-MM-DD',
'sessions.scheduledTasks.editor.validation.timeFormat': 'Time must use HH:mm',
'sessions.scheduledTasks.editor.validation.atLeastOneTime': 'Add at least one valid time',
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': 'Select at least one weekday',
'sessions.scheduledTasks.editor.validation.timezoneRequired': 'Timezone is required',
'sessions.scheduledTasks.editor.validation.cronRequired': 'Cron expression is required',
'sessions.scheduledTasks.editor.validation.cronInvalid': 'Invalid cron expression',
'sessions.scheduledTasks.editor.cronExpression.label': 'Cron expression',
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
'sessions.scheduledTasks.editor.cronExpression.nextRuns': 'Next runs',
'sessions.scheduledTasks.editor.cronExpression.examples': 'Examples',
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': 'Every 5 minutes',
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': 'Every hour',
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': 'Every Monday at 9am',
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': '9am and 5pm daily',
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': 'First of every month',
'multirun.launcher.title': 'New Multi-Run',
'multirun.launcher.actions.closeEsc': 'Close (Esc)',
'multirun.launcher.actions.cancel': 'Cancel',
'multirun.launcher.actions.creating': 'Creating...',
'multirun.launcher.actions.startWithModelCount': 'Start ({count} models)',
'multirun.launcher.project.label': 'Project',
'multirun.launcher.project.placeholder': 'Select project',
'multirun.launcher.project.empty': 'Add a project first.',
'multirun.launcher.project.gitRequired': 'No worktree isolation: runs use the same directory.',
'multirun.launcher.groupName.label': 'Group name',
'multirun.launcher.groupName.info': 'Used for worktree directory and branch names',
'multirun.launcher.groupName.placeholder': 'feature-auth, bugfix-login',
'multirun.launcher.baseBranch.label': 'Base branch',
'multirun.launcher.baseBranch.info': 'New branch created from this base per model',
'multirun.launcher.isolateRuns.label': 'Isolate runs',
'multirun.launcher.agent.label': 'Agent',
'multirun.launcher.agent.info': 'Agent used for all runs. Defaults to your configured agent.',
'multirun.launcher.setupCommands.label': 'Setup commands',
'multirun.launcher.setupCommands.loading': 'Loading...',
'multirun.launcher.setupCommands.commandPlaceholder': 'bun install',
'multirun.launcher.setupCommands.removeCommandAria': 'Remove command',
'multirun.launcher.setupCommands.addCommand': 'Add command',
'multirun.launcher.prompt.label': 'Prompt',
'multirun.launcher.prompt.placeholder': 'Enter the prompt to send to all models...',
'multirun.launcher.attachments.attach': 'Attach',
'multirun.launcher.attachments.tooltip': 'Same files sent to all runs',
'multirun.launcher.models.label': 'Models',
'multirun.launcher.models.info': 'Select 2-{max} models. Same model can be added multiple times.',
'multirun.launcher.toast.fileTooLarge': 'File "{fileName}" is too large (max 10MB)',
'multirun.launcher.toast.attachFailed': 'Failed to attach "{fileName}"',
'multirun.launcher.toast.attachedSingle': 'Attached {count} file',
'multirun.launcher.toast.attachedPlural': 'Attached {count} files',
'multirun.modelMultiSelect.actions.addModel': 'Add model',
'multirun.modelMultiSelect.search.placeholder': 'Search models',
'multirun.modelMultiSelect.search.noResults': 'No models found',
'multirun.modelMultiSelect.sections.favorites': 'Favorites',
'multirun.modelMultiSelect.sections.recent': 'Recent',
'multirun.modelMultiSelect.variant.placeholder': 'Thinking',
'multirun.modelMultiSelect.variant.default': 'Default',
'multirun.modelMultiSelect.keyboard.hint': '↑↓ navigate • Enter select • Esc close',
'multirun.modelMultiSelect.validation.minOnly': 'Select at least {min} models.',
'multirun.modelMultiSelect.validation.minToMax': 'Select from {min} to {max} models.',
'multirun.agentSelector.placeholder': 'Select an agent',
'multirun.fusion.title': 'Run fusion',
'multirun.fusion.description': 'Combine the selected multi-run outputs into one stronger answer.',
'multirun.fusion.provider.placeholder': 'Provider',
'multirun.fusion.model.placeholder': 'Model',
'multirun.fusion.sources.label': 'Sources ({count})',
'multirun.fusion.actions.cancel': 'Cancel',
'multirun.fusion.actions.start': 'Start fusion',
'multirun.fusion.actions.starting': 'Starting...',
'multirun.fusion.toast.noOutputs': 'No assistant outputs found to fuse.',
'multirun.fusion.toast.failed': 'Failed to start fusion.',
'multirun.launcher.attachments.label': 'Files',
'multirun.launcher.actions.startWithRunCount': 'Start ({count} runs)',
'multirun.launcher.groups.addGroup': 'Add run group',
'multirun.launcher.groups.removeGroup': 'Remove group',
'multirun.launcher.groups.groupLabel': 'Run group {index}',
'multirun.launcher.groups.template.label': 'Template',
'multirun.launcher.groups.template.placeholder': 'Select a template...',
'multirun.launcher.groups.template.custom': 'Custom prompt',
'multirun.launcher.groups.prompt.label': 'Prompt',
'multirun.launcher.groups.prompt.placeholder': 'Enter the prompt for this group...',
'sessions.sidebar.header.actions.searchSessions': 'Search sessions',
'sessions.sidebar.header.actions.exitSelection': 'Exit selection',
'sessions.sidebar.header.actions.selectSessions': 'Select sessions',
'sessions.sidebar.header.actions.sortProjects': 'Sort projects',
'sessions.sidebar.header.actions.sessionDisplayMode': 'Session display mode',
'sessions.sidebar.header.displayMode.label': 'Display mode',
'sessions.sidebar.header.displayMode.default': 'Default',
'sessions.sidebar.header.displayMode.minimal': 'Minimal',
'sessions.sidebar.header.displayMode.showRecent': 'Show recent section',
'sessions.sidebar.header.displayMode.showArchived': 'Show archived sessions',
'sessions.sidebar.header.displayMode.collapseAll': 'Collapse all',
'sessions.sidebar.header.displayMode.expandAll': 'Expand all',
'sessions.sidebar.header.projectSort.manual': 'Manual',
'sessions.sidebar.header.projectSort.aToZ': 'A → Z',
'sessions.sidebar.header.projectSort.zToA': 'Z → A',
'sessions.sidebar.header.projectSort.dateAdded': 'Newest',
'sessions.sidebar.header.projectSort.recent': 'Recent',
'sessions.sidebar.header.search.matchCountSingle': '{count} match',
'sessions.sidebar.header.search.matchCountPlural': '{count} matches',
'sessions.sidebar.header.search.escapeHint': 'Esc to clear',
'sessions.sidebar.header.search.placeholder': 'Search sessions...',
'sessions.sidebar.header.search.clear': 'Clear search',
'sessions.sidebar.footer.actions.settings': 'Settings',
'sessions.sidebar.footer.actions.shortcuts': 'Shortcuts',
'sessions.sidebar.footer.actions.aboutOpenChamber': 'About OpenChamber',
'sessions.sidebar.footer.actions.update': 'Update',
'sessions.sidebar.empty.noSessions.title': 'No sessions yet',
'sessions.sidebar.empty.noSessions.description': 'Create your first session to start coding.',
'sessions.sidebar.empty.noMatches.title': 'No matching sessions',
'sessions.sidebar.empty.noMatches.description': 'Try a different title, branch, folder, or path.',
'sessions.sidebar.activity.recentTitle': 'recent',
'sessions.archivePage.allDirectories': 'All directories',
'sessions.sidebar.header.displayMode.stickyHeaders': 'Sticky project headers',
'sessions.sidebar.header.grouping.label': 'Group sessions',
'sessions.sidebar.header.grouping.byWorktree': 'By worktree',
'sessions.sidebar.header.grouping.flat': 'Flat list',
'sessions.sidebar.project.actions.manageWorktrees': 'Manage worktrees',
'sessions.worktreesPage.title': 'Worktrees in {project}',
'sessions.worktreesPage.description': 'Create, inspect, and remove git worktrees for this project.',
'sessions.worktreesPage.closeAria': 'Close worktrees',
'sessions.scheduledTasks.page.closeAria': 'Close scheduled tasks',
'sessions.sidebar.nav.archive': 'Archive',
'sessions.archivePage.title': 'Archive',
'sessions.archivePage.countSingle': '{count} archived session',
'sessions.archivePage.countPlural': '{count} archived sessions',
'sessions.archivePage.closeAria': 'Close archive',
'sessions.archivePage.searchPlaceholder': 'Search archived sessions',
'sessions.archivePage.empty.noArchived': 'No archived sessions',
'sessions.archivePage.empty.noMatches': 'No matching archived sessions',
'sessions.archivePage.otherProjects': 'other projects',
'sessions.archivePage.deleteProject': 'Delete all archived sessions in this project',
'sessions.archivePage.deleteProjectAria': 'Delete all archived sessions in {label}',
'sessions.archivePage.deleteSessionAria': 'Delete {title}',
'sessions.archivePage.restoreSessionAria': 'Restore {title}',
'sessions.switcher.openAria': 'Open session switcher',
'sessions.switcher.empty': 'No recent sessions',
'sessions.switcher.draftTitle': 'New session',
'sessions.sidebar.updateCheck.errorTitle': 'Failed to check for updates',
'sessions.sidebar.updateCheck.latestVersion': 'You are on the latest version',
'sessions.sidebar.directory.errorAddProjectTitle': 'Failed to add project',
'sessions.sidebar.directory.errorAddProjectDescription': 'Please select a valid directory.',
'sessions.sidebar.directory.errorSelectDirectoryTitle': 'Failed to select directory',
'sessions.sidebar.folder.newFolderName': 'New folder',
'sessions.sidebar.bulkActions.delete': 'Delete',
'sessions.sidebar.bulkActions.archive': 'Archive',
'sessions.sidebar.bulkActions.selectedCount': '{count} selected',
'sessions.sidebar.bulkActions.moveToFolder': 'Move to folder',
'sessions.sidebar.bulkActions.deletedSingle': 'Deleted {count} session',
'sessions.sidebar.bulkActions.deletedPlural': 'Deleted {count} sessions',
'sessions.sidebar.bulkActions.failedDeleteSingle': 'Failed to delete {count} session',
'sessions.sidebar.bulkActions.failedDeletePlural': 'Failed to delete {count} sessions',
'sessions.sidebar.bulkActions.archivedSingle': 'Archived {count} session',
'sessions.sidebar.bulkActions.archivedPlural': 'Archived {count} sessions',
'sessions.sidebar.bulkActions.failedArchiveSingle': 'Failed to archive {count} session',
'sessions.sidebar.bulkActions.failedArchivePlural': 'Failed to archive {count} sessions',
'sessions.sidebar.bulkActions.restore': 'Restore',
'sessions.sidebar.bulkActions.restoredSingle': 'Restored {count} session',
'sessions.sidebar.bulkActions.restoredPlural': 'Restored {count} sessions',
'sessions.sidebar.bulkActions.failedRestoreSingle': 'Failed to restore {count} session',
'sessions.sidebar.bulkActions.failedRestorePlural': 'Failed to restore {count} sessions',
'sessions.sidebar.folders.none': 'No folders yet',
'sessions.sidebar.folders.newFolderEllipsis': 'New folder...',
'sessions.sidebar.folders.removeFromFolder': 'Remove from folder',
'sessions.sidebar.folders.moveToFolder': 'Move to folder',
'sessions.sidebar.project.actions.newWorktree': 'New worktree',
'sessions.sidebar.project.actions.newWorktreeEllipsis': 'New worktree...',
'sessions.sidebar.project.actions.projectMenu': 'Project menu',
'sessions.sidebar.project.actions.newSession': 'New session',
'sessions.sidebar.project.actions.edit': 'Edit',
'sessions.sidebar.project.actions.closeProject': 'Close project',
'sessions.sidebar.project.actions.newDraftSession': 'New draft session',
'sessions.sidebar.session.menu.rename': 'Rename',
'sessions.sidebar.session.menu.copyId': 'Copy session ID',
'sessions.sidebar.session.copyId.success': 'Session ID copied',
'sessions.sidebar.session.copyId.error': 'Failed to copy session ID',
'header.sessionActions.openAria': 'Open session actions',
'sessions.sidebar.session.rename.save': 'Save session name',
'sessions.sidebar.session.rename.cancel': 'Cancel renaming session',
'sessions.sidebar.session.menu.unpin': 'Unpin session',
'sessions.sidebar.session.menu.pin': 'Pin session',
'sessions.sidebar.session.menu.share': 'Share',
'sessions.sidebar.session.menu.copied': 'Copied',
'sessions.sidebar.session.menu.copyLink': 'Copy link',
'sessions.sidebar.session.menu.unshare': 'Unshare',
'sessions.sidebar.session.menu.exportMarkdown': 'Export Markdown',
'sessions.sidebar.session.menu.moveToWorktree': 'Move to new worktree',
'sessions.sidebar.session.moveToWorktree.success': 'Session moved to a new worktree',
'sessions.sidebar.session.moveToWorktree.failed': 'Failed to move session to a new worktree',
'sessions.sidebar.session.moveToWorktree.tooltip': 'Creates a new worktree from the current branch, transfers uncommitted changes, and moves this session and its sub-sessions there.',
'sessions.sidebar.session.moveToWorktree.tooltipBusy': 'Available when the session is idle. Stop or wait for the current activity to finish.',
'sessions.sidebar.session.moveToWorktree.tooltipMoving': 'This session is already being moved to a new worktree.',
'sessions.sidebar.session.menu.runFusion': 'Run fusion',
'sessions.sidebar.session.menu.openInSidePanel': 'Open in Side Panel',
'sessions.sidebar.session.actions.openInEditor': 'Open in Editor',
'sessions.sidebar.session.menu.betaBadge': 'beta',
'sessions.sidebar.session.menu.label': 'Session menu',
'sessions.sidebar.session.untitled': 'Untitled Session',
'sessions.sidebar.session.export.nothingToExport': 'Nothing to export',
'sessions.sidebar.session.export.failedLoadHistory': 'Failed to load the complete session history',
'sessions.sidebar.session.export.success': 'Session exported',
'sessions.sidebar.session.export.failedRevealPath': 'Failed to reveal path',
'sessions.sidebar.session.export.untitledSubagent': 'Untitled Sub-agent',
'sessions.sidebar.session.export.skippedSubtaskSingle': 'Exported session, but skipped {count} sub-agent task that could not be loaded.',
'sessions.sidebar.session.export.skippedSubtaskMany': 'Exported session, but skipped {count} sub-agent tasks that could not be loaded.',
'sessions.sidebar.session.export.dialog.title': 'Export Markdown',
'sessions.sidebar.session.export.dialog.descriptionSingle': 'This session has {count} sub-agent task. Include it in the export?',
'sessions.sidebar.session.export.dialog.descriptionMany': 'This session has {count} sub-agent tasks. Include them in the export?',
'sessions.sidebar.session.export.dialog.includeSubtasks': 'Include sub-agent tasks',
'sessions.sidebar.session.export.dialog.confirm': 'Export',
'sessions.sidebar.session.status.active': 'Session active',
'sessions.sidebar.session.status.unread': 'Unread updates',
'sessions.sidebar.session.status.pinned': 'Pinned session',
'sessions.sidebar.session.status.movingToWorktree': 'Moving session to a new worktree',
'sessions.sidebar.session.status.permissionRequired': 'Permission required',
'sessions.sidebar.session.status.questionPendingSingle': '1 pending question',
'sessions.sidebar.session.status.questionPendingMany': '{count} pending questions',
'sessions.sidebar.session.status.activeFor': 'Active for {duration}',
'sessions.sidebar.session.status.lastTurnDuration': 'Last turn took {duration}',
'sessions.sidebar.session.subsessions.collapse': 'Collapse subsessions',
'sessions.sidebar.session.subsessions.expand': 'Expand subsessions',
'sessions.sidebar.dialogs.deleteSession.title': 'Delete session?',
'sessions.sidebar.dialogs.archiveSession.title': 'Archive session?',
'sessions.sidebar.dialogs.deleteSession.withOneSubtask': '"{sessionTitle}" and its {count} sub-task will be permanently deleted.',
'sessions.sidebar.dialogs.deleteSession.withManySubtasks': '"{sessionTitle}" and its {count} sub-tasks will be permanently deleted.',
'sessions.sidebar.dialogs.archiveSession.withOneSubtask': '"{sessionTitle}" and its {count} sub-task will be archived.',
'sessions.sidebar.dialogs.archiveSession.withManySubtasks': '"{sessionTitle}" and its {count} sub-tasks will be archived.',
'sessions.sidebar.dialogs.deleteSession.single': '"{sessionTitle}" will be permanently deleted.',
'sessions.sidebar.dialogs.archiveSession.single': '"{sessionTitle}" will be archived.',
'sessions.sidebar.dialogs.neverAsk': 'Never ask',
'sessions.sidebar.dialogs.cancel': 'Cancel',
'sessions.sidebar.dialogs.deleteSession.titleAction': 'Delete session',
'sessions.sidebar.dialogs.deleteSessions.titleAction': 'Delete sessions',
'sessions.sidebar.dialogs.deleteSessions.title': 'Delete sessions?',
'sessions.sidebar.dialogs.archiveSessions.title': 'Archive sessions?',
'sessions.sidebar.dialogs.deleteSessions.singleDescription': '{count} session will be permanently deleted.',
'sessions.sidebar.dialogs.deleteSessions.pluralDescription': '{count} sessions will be permanently deleted.',
'sessions.sidebar.dialogs.archiveSessions.singleDescription': '{count} session will be archived.',
'sessions.sidebar.dialogs.archiveSessions.pluralDescription': '{count} sessions will be archived.',
'sessions.sidebar.dialogs.deleteFolder.title': 'Delete folder?',
'sessions.sidebar.dialogs.deleteFolder.withOneSubfolder': '"{folderName}" will be deleted along with {count} sub-folder. Sessions inside will not be deleted.',
'sessions.sidebar.dialogs.deleteFolder.withManySubfolders': '"{folderName}" will be deleted along with {count} sub-folders. Sessions inside will not be deleted.',
'sessions.sidebar.dialogs.deleteFolder.withContentsNoSubfolders': '"{folderName}" will be deleted. Sessions inside will not be deleted.',
'sessions.sidebar.dialogs.deleteFolder.single': '"{folderName}" will be permanently deleted.',
'sessions.sidebar.dialogs.deleteResult.singleFailedToDelete': '{count} session could not be deleted.',
'sessions.sidebar.dialogs.deleteResult.manyFailedToDelete': '{count} sessions could not be deleted.',
'sessions.sidebar.dialogs.deleteResult.singleFailedToArchive': '{count} session could not be archived.',
'sessions.sidebar.dialogs.deleteResult.manyFailedToArchive': '{count} sessions could not be archived.',
'sessions.sidebar.dialogs.deleteResult.removedFromDate': 'Removed all sessions from {dateLabel}.',
'sessions.sidebar.dialogs.deleteResult.tryAgain': 'Please try again in a moment.',
'sessions.sidebar.dialogs.worktreeDelete.descriptionNoLinked': 'This removes the selected worktree.',
'sessions.sidebar.dialogs.worktreeDelete.descriptionOneLinked': 'This removes the selected worktree and archives {count} linked session.',
'sessions.sidebar.dialogs.worktreeDelete.descriptionManyLinked': 'This removes the selected worktree and archives {count} linked sessions.',
'sessions.sidebar.dialogs.sessionDelete.descriptionOne': 'This action permanently removes 1 session.',
'sessions.sidebar.dialogs.sessionDelete.descriptionOneWithDate': 'This action permanently removes 1 session from {dateLabel}.',
'sessions.sidebar.dialogs.sessionDelete.descriptionMany': 'This action permanently removes {count} sessions.',
'sessions.sidebar.dialogs.sessionDelete.descriptionManyWithDate': 'This action permanently removes {count} sessions from {dateLabel}.',
'sessions.sidebar.dialogs.sessionList.more': '+{count} more',
'sessions.sidebar.session.share.successTitle': 'Session shared',
'sessions.sidebar.session.share.successDescription': 'Share link copied to clipboard.',
'sessions.sidebar.session.share.error': 'Unable to share session',
'sessions.sidebar.session.share.copyUrlError': 'Failed to copy URL',
'sessions.sidebar.session.unshare.success': 'Session unshared',
'sessions.sidebar.session.unshare.error': 'Unable to unshare session',
'sessions.sidebar.session.delete.success': 'Session deleted',
'sessions.sidebar.session.delete.error': 'Failed to delete session',
'sessions.sidebar.session.archive.success': 'Session archived',
'sessions.sidebar.session.archive.error': 'Failed to archive session',
'sessions.sidebar.session.restore.success': 'Session restored',
'sessions.sidebar.session.restore.error': 'Failed to restore session',
'sessions.sidebar.group.pr.checksPassed': '{success}/{total} checks passed',
'sessions.sidebar.group.pr.failingCount': '{count} failing',
'sessions.sidebar.group.pr.pendingCount': '{count} pending',
'sessions.sidebar.group.pr.conflictsOrBlocked': 'Conflicts or blocked',
'sessions.sidebar.group.pr.mergeable': 'Mergeable',
'sessions.sidebar.group.pr.mergeState': 'Merge state: {state}',
'sessions.sidebar.group.pr.status.merged': 'Merged',
'sessions.sidebar.group.pr.status.readyToMerge': 'Ready to merge',
'sessions.sidebar.group.pr.status.open': 'PR open',
'sessions.sidebar.group.pr.status.mergeConflicts': 'Merge conflicts',
'sessions.sidebar.group.pr.status.mergeBlocked': 'Merge blocked',
'sessions.sidebar.group.pr.status.draft': 'Draft PR',
'sessions.sidebar.group.pr.status.closed': 'Closed',
'sessions.sidebar.group.empty.noArchivedSessions': 'No archived sessions yet.',
'sessions.sidebar.group.empty.noSessionsInWorkspace': 'No sessions in this workspace yet.',
'sessions.sidebar.group.showMore': 'Show more sessions',
'sessions.sidebar.group.showMoreSingle': 'Show {count} more session',
'sessions.sidebar.group.showMorePlural': 'Show {count} more sessions',
'sessions.sidebar.group.showFewer': 'Show fewer sessions',
'sessions.sidebar.group.expandAria': 'Expand {label}',
'sessions.sidebar.group.collapseAria': 'Collapse {label}',
'sessions.sidebar.group.actions.deleteArchivedInGroupAria': 'Delete archived sessions in {label}',
'sessions.sidebar.group.actions.deleteArchivedSessions': 'Delete archived sessions',
'sessions.sidebar.group.actions.deleteGroupAria': 'Delete {label}',
'sessions.sidebar.group.actions.deleteWorktree': 'Delete worktree',
'sessions.sidebar.group.actions.newDraftInGroupAria': 'New draft session in {label}',
'sessions.sidebar.grouping.projectRoot': 'project root',
'sessions.sidebar.grouping.projectRootWithBranch': 'project root: {branch}',
'sessions.sidebar.grouping.archived': 'archived',
'sessions.sidebar.grouping.archivedDescription': 'Archived and unassigned sessions',
'sessions.sidebar.folderItem.expandAria': 'Expand folder {folderName}',
'sessions.sidebar.folderItem.collapseAria': 'Collapse folder {folderName}',
'sessions.sidebar.folderItem.namePlaceholder': 'Folder name',
'sessions.sidebar.folderItem.newSessionAria': 'New session in {folderName}',
'sessions.sidebar.folderItem.newSubfolderAria': 'New sub-folder in {folderName}',
'sessions.sidebar.folderItem.newSubfolder': 'New sub-folder',
'sessions.sidebar.folderItem.renameAria': 'Rename folder {folderName}',
'sessions.sidebar.folderItem.deleteArchivedInFolderAria': 'Delete archived sessions in folder {folderName}',
'sessions.sidebar.folderItem.deleteFolderAria': 'Delete folder {folderName}',
'sessions.sidebar.folderItem.emptyFolder': 'Empty folder',
'sessions.sidebar.sessionDialogs.ok': 'OK',
'sessions.sidebar.sessionDialogs.linkedSessionSingle': 'Linked session',
'sessions.sidebar.sessionDialogs.linkedSessionPlural': 'Linked sessions',
'sessions.sidebar.sessionDialogs.delete.note': 'Worktree directories stay intact. Subsessions linked to the selected sessions will also be removed.',
'sessions.sidebar.sessionDialogs.directory.errorSelectTitle': 'Failed to select directory',
'sessions.sidebar.sessionDialogs.directory.errorOpenTitle': 'Failed to open directory',
'sessions.sidebar.sessionDialogs.directory.errorOpenDescription': 'Desktop could not grant file access.',
'sessions.sidebar.sessionDialogs.directory.errorAddProjectTitle': 'Failed to add project',
'sessions.sidebar.sessionDialogs.directory.errorAddProjectDescription': 'Please select a valid directory path.',
'sessions.sidebar.sessionDialogs.worktree.errorRemoveTitle': 'Failed to remove worktree',
'sessions.sidebar.sessionDialogs.worktree.removedTitle': 'Worktree removed',
'sessions.sidebar.sessionDialogs.worktree.removed': 'Worktree removed.',
'sessions.sidebar.sessionDialogs.worktree.removedWithRemote': 'Worktree and remote branch removed.',
'sessions.sidebar.sessionDialogs.worktree.attachedArchived': 'Attached worktree archived.',
'sessions.sidebar.sessionDialogs.worktree.attachedArchivedPlural': 'Attached worktrees archived.',
'sessions.sidebar.sessionDialogs.worktree.archivedAndRemoteRemoved': 'Archived worktrees and removed remote branches.',
'sessions.sidebar.sessionDialogs.worktree.label': 'Worktree',
'sessions.sidebar.sessionDialogs.worktree.pathUnavailable': 'Worktree path unavailable.',
'sessions.sidebar.sessionDialogs.worktree.uncommittedWarning': 'Uncommitted changes will be discarded.',
'sessions.sidebar.sessionDialogs.actions.deleteRemoteBranch': 'Delete remote branch',
'sessions.sidebar.sessionDialogs.actions.remoteBranchInfoUnavailable': 'Remote branch info unavailable',
'sessions.sidebar.sessionDialogs.actions.deleteLocalBranch': 'Delete local branch',
'sessions.sidebar.sessionDialogs.actions.deleting': 'Deleting…',
'sessions.sidebar.sessionDialogs.actions.deleteWorktree': 'Delete worktree',
'gitView.branch.branchToMergeInto': 'Branch to merge into {branch}',
'gitView.branch.branchToRebaseOnto': 'Branch to rebase onto',
'gitView.branch.create': 'Create new branch...',
'gitView.branch.currentBadge': 'Current',
'gitView.branch.currentBranchFallback': 'current branch',
'gitView.branch.currentBranchTooltip': 'Current branch',
'gitView.branch.detachedHead': 'Detached HEAD',
'gitView.branch.dialogDescriptionPrefix': 'Choose how to bring another branch into',
'gitView.branch.empty': 'No branches found.',
'gitView.branch.localBranches': 'Local branches',
'gitView.branch.mergeDescription': 'Create a merge commit and preserve branch history.',
'gitView.branch.mergeRebase': 'Merge/Rebase',
'gitView.branch.mergeRebaseTooltip': 'Update this branch from another branch.',
'gitView.branch.mergingInProgress': 'Merging In Progress',
'gitView.branch.namePlaceholder': 'Branch name',
'gitView.branch.newBranchPlaceholder': 'New branch name',
'gitView.branch.noLocalBranches': 'No local branches',
'gitView.branch.noRemoteBranches': 'No remote branches',
'gitView.branch.operation': 'Operation',
'gitView.branch.operationCompleted': 'Operation Completed',
'gitView.branch.operationFailed': 'Operation Failed',
'gitView.branch.pushToPrefix': 'Push To Prefix',
'gitView.branch.pushToSuffix': 'Push To Suffix',
'gitView.branch.rebaseDescription': 'Replay your commits on top of the selected branch.',
'gitView.branch.rebasingInProgress': 'Rebasing In Progress',
'gitView.branch.remoteBranches': 'Remote branches',
'gitView.branch.renameTitle': 'Rename branch',
'gitView.branch.renameSave': 'Save branch name',
'gitView.branch.renameSaving': 'Saving branch name',
'gitView.branch.renameCancel': 'Cancel branch rename',
'gitView.branch.searchPlaceholder': 'Search branches...',
'gitView.branch.selectBranch': 'Select Branch',
'gitView.branch.summaryMergeInfix': 'into',
'gitView.branch.summaryMergePrefix': 'This will merge',
'gitView.branch.summaryRebaseInfix': 'onto',
'gitView.branch.summaryRebasePrefix': 'This will rebase',
'gitView.branch.updateDescriptionPrefix': 'Bring the latest changes into',
'gitView.branch.updateTitle': 'Update branch',
'gitView.changes.changedFilesAria': 'Changed files',
'gitView.changes.clearSelectionAria': 'Clear file selection',
'gitView.changes.collapseDirectoryAria': 'Collapse directory {path}',
'gitView.changes.expandDirectoryAria': 'Expand directory {path}',
'gitView.changes.revertAll': 'Revert all',
'gitView.changes.revertAllDescriptionPlural': 'Revert {count} changed files? This cannot be undone.',
'gitView.changes.revertAllDescriptionSingle': 'Revert {count} changed file? This cannot be undone.',
'gitView.changes.revertAllDialogTitle': 'Revert all changes?',
'gitView.changes.revertDirectoryAria': 'Revert changes in {path}',
'gitView.changes.revertDirectory': 'Revert folder',
'gitView.changes.revertDirectoryDescriptionPlural': 'This will discard local changes in {count} files under {path}.',
'gitView.changes.revertDirectoryDescriptionSingle': 'This will discard local changes in {count} file under {path}.',
'gitView.changes.revertDirectoryDialogTitle': 'Revert folder changes?',
'gitView.changes.revertDirectoryTooltip': 'Revert folder changes',
'gitView.changes.revertFileAria': 'Revert changes in {path}',
'gitView.changes.revertFileTooltip': 'Revert changes',
'gitView.changes.reverting': 'Reverting...',
'gitView.changes.selectAllAria': 'Select all files',
'gitView.changes.selectFileAria': 'Select {path}',
'gitView.changes.stagedTitle': 'Staged',
'gitView.changes.resizeSplitAria': 'Resize staged and unstaged changes',
'gitView.changes.stageAllAria': 'Stage all changes',
'gitView.changes.stageDirectoryAria': 'Stage all changes in {path}',
'gitView.changes.stageFileAria': 'Stage {path}',
'gitView.changes.title': 'Changes',
'gitView.changes.toggleDirectorySelectionAria': 'Toggle selection for {path}',
'gitView.changes.unstageAllAria': 'Unstage all changes',
'gitView.changes.unstageDirectoryAria': 'Unstage all changes in {path}',
'gitView.changes.unstageFileAria': 'Unstage {path}',
'gitView.commit.addGitmoji': 'Add gitmoji',
'gitView.commit.aiHighlights.insertAria': 'Insert aria label',
'gitView.commit.aiHighlights.insertTooltip': 'Insert tooltip',
'gitView.commit.aiHighlights.title': 'Highlights',
'gitView.commit.commit': 'Commit',
'gitView.commit.commitAria': 'Commit aria label',
'gitView.commit.committing': 'Committing...',
'gitView.commit.generate': 'Generate',
'gitView.commit.generateAria': 'Generate commit message',
'gitView.commit.messagePlaceholder': 'Commit message',
'gitView.commit.push': 'Commit & sync',
'gitView.commit.pushAria': 'Commit and sync',
'gitView.commit.pushing': 'Syncing...',
'gitView.commit.selectFilesHint': 'Select files in Changes to enable commit.',
'gitView.commit.stageFilesHint': 'Stage files to enable commit.',
'gitView.commit.title': 'Commit',
'gitView.common.cancel': 'Cancel',
'gitView.common.close': 'Close',
'gitView.common.done': 'Done',
'gitView.common.processing': 'Processing...',
'gitView.common.reset': 'Reset',
'gitView.conflict.abortOperation': 'Abort {operation}',
'gitView.conflict.conflictedFiles': 'Conflicted files:',
'gitView.conflict.continueLater': 'Continue later',
'gitView.conflict.detectedDescription': 'Resolve the {operation} conflicts to continue.',
'gitView.conflict.detectedTitle': '{operation} conflicts detected',
'gitView.conflict.errorLoadingDetails': 'Failed to load conflict details: {message}',
'gitView.conflict.headInfo': 'HEAD information:',
'gitView.conflict.loadFailed': 'Failed to load conflict details',
'gitView.conflict.loading': 'Loading conflict details...',
'gitView.conflict.noActiveSession': 'No active session',
'gitView.conflict.noActiveSessionDescription': 'Open or create a session to resolve conflicts.',
'gitView.conflict.resolveCurrentSession': 'Resolve in current session',
'gitView.conflict.resolveNewSession': 'Resolve in new session',
'gitView.empty.cleanDescription': 'All changes have been committed',
'gitView.empty.cleanTitle': 'Working tree clean',
'gitView.empty.pullBehindPlural': 'Pull {count} commits',
'gitView.empty.pullBehindSingle': 'Pull {count} commit',
'gitView.header.identityTooltip': 'Git identity',
'gitView.header.noIdentity': 'No identity',
'gitView.header.noProfiles': 'No profiles available to apply.',
'gitView.header.repositoryViews': 'Repository views',
'gitView.header.updateBranch': 'Update branch',
'gitView.header.openPullRequest': 'Open pull request',
'gitView.header.removeRemoteAria': 'Remove remote {name}',
'gitView.header.removeRemoteTitle': 'Remove remote {name}',
'gitView.header.upstreamSynced': 'synced',
'gitView.header.upstreamTooltip': 'Compared with {target}.',
'gitView.header.upstreamTooltipTracking': 'Compared with {target}. Primary sync badges still reflect {tracking}.',
'gitView.history.actions.cancelButton': 'Cancel',
'gitView.history.actions.checkout': 'Checkout',
'gitView.history.actions.checkoutConfirm': 'Check out this commit as detached HEAD?',
'gitView.history.actions.cherryPick': 'Cherry-pick',
'gitView.history.actions.cherryPickConfirm': 'Cherry-pick this commit onto the current branch?',
'gitView.history.actions.conflictToastDescription': 'Conflicts in: {files}. Resolve manually and commit, or abort with git cherry-pick/revert --abort.',
'gitView.history.actions.conflictToastTitle': 'Conflict',
'gitView.history.actions.confirmButton': 'Confirm',
'gitView.history.actions.createBranch': 'Create branch here',
'gitView.history.actions.createBranchConfirm': 'Create',
'gitView.history.actions.createBranchPlaceholder': 'Branch name',
'gitView.history.actions.detachedHead': 'Checked out (detached HEAD)',
'gitView.history.actions.merge': 'Merge into current',
'gitView.history.actions.mergeConfirm': 'Merge this commit into the current branch?',
'gitView.history.actions.rebase': 'Rebase onto this',
'gitView.history.actions.rebaseConfirm': 'Rebase current branch onto this commit?',
'gitView.history.actions.reset': 'Reset...',
'gitView.history.actions.resetHard': 'Hard — discard all changes',
'gitView.history.actions.resetHardConfirm': 'Hard reset — HEAD moves, all uncommitted changes permanently discarded.',
'gitView.history.actions.resetHardConfirmButton': 'Discard changes',
'gitView.history.actions.resetMixed': 'Mixed — unstage changes',
'gitView.history.actions.resetMixedConfirm': 'Mixed reset — HEAD moves, changes unstaged.',
'gitView.history.actions.resetSoft': 'Soft — keep staged',
'gitView.history.actions.resetSoftConfirm': 'Soft reset — HEAD moves, staged changes preserved.',
'gitView.history.actions.revert': 'Revert',
'gitView.history.actions.revertConfirm': 'Stage a revert of this commit?',
'gitView.history.binary': 'Binary',
'gitView.history.binaryNoDiff': 'Binary file — no diff available',
'gitView.history.commitsPlaceholder': 'Commits',
'gitView.history.copySha': 'Copy SHA',
'gitView.history.diffError': 'Failed to load diff. Click to retry.',
'gitView.history.largeDiffDescription': 'Rendering may be slow. You can still view the diff by clicking below.',
'gitView.history.largeDiffTitle': 'Large diff ({count} changed lines)',
'gitView.history.loadingDiff': 'Loading diff...',
'gitView.history.loadingFiles': 'Loading files...',
'gitView.history.loadMore': 'Load more',
'gitView.history.loadingMore': 'Loading...',
'gitView.history.logSize100': '100 commits',
'gitView.history.logSize25': '25 commits',
'gitView.history.logSize50': '50 commits',
'gitView.history.noCommits': 'No commits found',
'gitView.history.noFiles': 'No files',
'gitView.history.renamedNoDiff': 'Renamed file — diff not supported',
'gitView.history.renderDiffAnyway': 'Render anyway',
'gitView.history.title': 'History',
'gitView.history.refresh': 'Refresh',
'gitView.graph.title': 'Graph',
'gitView.integrate.checking': 'Checking…',
'gitView.integrate.cherryPickAbortedToast': 'Cherry-pick aborted',
'gitView.integrate.cherryPickConflictDescription': 'Resolve the cherry-pick conflicts to continue.',
'gitView.integrate.cherryPickConflictToast': 'Cherry-pick conflicts detected',
'gitView.integrate.cherryPickContinueFailedToast': 'Failed to continue cherry-pick',
'gitView.integrate.cherryPickFinishedToast': 'Cherry-pick finished',
'gitView.integrate.commitsMovedDescriptionPlural': 'Moved {count} commits to {branch}.',
'gitView.integrate.commitsMovedDescriptionSingle': 'Moved {count} commit to {branch}.',
'gitView.integrate.commitsMovedToast': 'Commits moved',
'gitView.integrate.commitsToMove': 'Commits to move',
'gitView.integrate.conflictsInFiles': 'Conflicts in files',
'gitView.integrate.currentCommit': 'Current commit',
'gitView.integrate.currentSession': 'Current session',
'gitView.integrate.failedToMoveToast': 'Failed to move commits',
'gitView.integrate.moreFiles': 'More files',
'gitView.integrate.move': 'Move',
'gitView.integrate.moveCommits': 'Move commits',
'gitView.integrate.moving': 'Moving…',
'gitView.integrate.newSession': 'New session',
'gitView.integrate.noActiveSession': 'No active session',
'gitView.integrate.noActiveSessionDescription': 'Open or create a session to continue.',
'gitView.integrate.noCommitsToMove': 'No commits to move.',
'gitView.integrate.noCommitsToMoveToast': 'No commits to move',
'gitView.integrate.previewUnavailable': 'Preview unavailable',
'gitView.integrate.showAll': 'Show all',
'gitView.integrate.showLess': 'Show less',
'gitView.integrate.showingFirstCommits': 'Showing first commits',
'gitView.integrate.target': 'Target',
'gitView.integrate.title': 'Re-integrate commits',
'gitView.integrate.toMoveCount': 'To move',
'gitView.operation.abort': 'Abort',
'gitView.operation.continue': 'Continue',
'gitView.operation.inProgressTitle': '{operation} in progress',
'gitView.operation.inProgressTitleManyConflicts': '{operation} in progress: {count} conflicts',
'gitView.operation.inProgressTitleOneConflict': '{operation} in progress: {count} conflict',
'gitView.operation.merge': 'Merge',
'gitView.operation.mergeInProgressWithHead': 'Merging {head}',
'gitView.operation.mergingMessage': 'Merging: {message}',
'gitView.operation.rebase': 'Rebase',
'gitView.operation.rebaseInProgress': 'Rebase in progress',
'gitView.operation.rebasingOnto': 'Rebasing {headName} onto {onto}',
'gitView.operation.readyToContinueHint': 'All conflicts resolved. Continue to finish the operation.',
'gitView.operation.resolveConflictsHint': 'Resolve conflicts, then continue the operation.',
'gitView.operation.resolveWithAi': 'Resolve with AI',
'gitView.stash.confirmButton': '{operation}',
'gitView.stash.description': 'Stash your local changes before starting the {operation}.',
'gitView.stash.mergeWith': 'with',
'gitView.stash.rebaseOnto': 'onto',
'gitView.stash.restoreAfterOperation': 'Restore stashed changes after {operation}',
'gitView.stash.restoreAria': 'Restore stashed changes after operation',
'gitView.stash.stepRestore': 'Restore your stashed changes',
'gitView.stash.stepStash': 'Stash your uncommitted changes',
'gitView.stash.thisWill': 'This will:',
'gitView.stash.title': 'Uncommitted Changes',
'gitView.stashes.actions.apply': 'Apply',
'gitView.stashes.actions.drop': 'Drop',
'gitView.stashes.actions.pop': 'Pop',
'gitView.stashes.actions.stashCurrent': 'Stash current changes',
'gitView.stashes.actions.stashCurrentWithCount': 'Stash {count} files',
'gitView.stashes.confirm.drop': 'Drop {ref}?',
'gitView.stashes.description': 'Save, restore, and clean up Git stashes for this repository.',
'gitView.stashes.empty.list': 'No stashes yet.',
'gitView.stashes.empty.search': 'No matching stashes.',
'gitView.stashes.includeUntrackedHint': 'Untracked files are included automatically.',
'gitView.stashes.fileCount': '{count} files',
'gitView.stashes.fileCountLoading': 'counting files...',
'gitView.stashes.itemNumber': '#{number}',
'gitView.stashes.latestLabel': 'Latest',
'gitView.stashes.messagePlaceholder': 'Stash name',
'gitView.stashes.searchPlaceholder': 'Search stashes',
'gitView.stashes.title': 'Stashes',
'gitView.stashes.toast.applyFailed': 'Failed to apply stash',
'gitView.stashes.toast.applySuccess': 'Stash applied',
'gitView.stashes.toast.createFailed': 'Failed to stash changes',
'gitView.stashes.toast.created': 'Changes stashed',
'gitView.stashes.toast.dropFailed': 'Failed to drop stash',
'gitView.stashes.toast.dropSuccess': 'Stash dropped',
'gitView.stashes.toast.loadFailed': 'Failed to load stashes',
'gitView.stashes.toast.noChanges': 'No local changes to stash',
'gitView.stashes.toast.popFailed': 'Failed to pop stash',
'gitView.stashes.toast.popSuccess': 'Stash popped',
'gitView.stashes.untitled': 'Untitled stash',
'gitView.sync.fetch': 'Fetch',
'gitView.sync.fetchFromRemote': 'Fetch from {name}',
'gitView.sync.fetchTooltip': 'Fetch from remote',
'gitView.sync.commitOrStashTooltip': 'Commit or stash your changes before syncing',
'gitView.sync.moreActionsAria': 'More sync actions',
'gitView.sync.noRemoteTooltip': 'No remotes configured',
'gitView.sync.pull': 'Pull',
'gitView.sync.pullTooltip': 'Pull changes',
'gitView.sync.pullTooltipBehind': 'Pull changes ({count} behind)',
'gitView.sync.push': 'Push',
'gitView.sync.pushTooltip': 'Push changes',
'gitView.sync.pushTooltipAhead': 'Push changes ({count} ahead)',
'gitView.sync.sync': 'sync',
'gitView.sync.syncChanges': 'Sync Changes',
'gitView.sync.syncChangesTooltip': 'Sync Changes ({behind} down, {ahead} up)',
'gitView.sync.syncChangesWithCounts': 'Sync Changes {behind}↓ {ahead}↑',
'gitView.sync.syncCounts': '{behind}↓ {ahead}↑',
'gitView.branch.actionsUnavailable': 'Branch actions unavailable in this repository state',
'gitView.conflict.noDetailsAvailable': 'No conflict details available',
'gitView.empty.notGitRepository': 'This directory is not a Git repository',
'gitView.empty.notGitRepositoryDescription': 'Initialize Git in this directory or open a repository.',
'gitView.empty.selectSessionOrDirectory': 'Select a session or directory to view Git status',
'gitView.empty.worktreeFeaturesUnavailable': 'Worktree features are unavailable in this workspace mode.',
'gitView.empty.worktreeSetupDescription': 'Finishing worktree setup and preparing repository state.',
'gitView.empty.worktreeSetupInProgress': 'Worktree setup in progress',
'worktree.bootstrap.toast.failed': 'Worktree setup failed',
'worktree.bootstrap.toast.failedDescription': 'The worktree was created, but background setup did not finish.',
'worktree.bootstrap.toast.timeoutDescription': 'The worktree was created, but background setup timed out.',
'gitView.gitmoji.empty': 'No gitmoji found',
'gitView.gitmoji.searchPlaceholder': 'Search gitmoji...',
'gitView.gitmoji.title': 'Insert gitmoji',
'gitView.history.dialogDescription': 'Browse recent commits and inspect changed files.',
'gitView.loading.checkingRepository': 'Checking repository...',
'gitView.loading.loading': 'Loading...',
'gitView.pr.actions.add': 'Add',
'gitView.pr.actions.cancelEditing': 'Cancel editing',
'gitView.pr.actions.cancelEditingAria': 'Cancel PR editing',
'gitView.pr.actions.createPr': 'Create PR',
'gitView.pr.actions.edit': 'Edit',
'gitView.pr.actions.editPr': 'Edit PR',
'gitView.pr.actions.editPrAria': 'Edit pull request',
'gitView.pr.actions.hide': 'Hide',
'gitView.pr.actions.markReady': 'Mark ready',
'gitView.pr.actions.markReadyAria': 'Mark pull request ready for review',
'gitView.pr.actions.mergePr': 'Merge PR',
'gitView.pr.actions.mergePrAria': 'Merge pull request',
'gitView.pr.actions.openChecks': 'Open checks',
'gitView.pr.actions.openChecksAria': 'Open failed checks',
'gitView.pr.actions.openComments': 'Open comments',
'gitView.pr.actions.openCommentsAria': 'Open pull request comments',
'gitView.pr.actions.openOnGitHub': 'Open on GitHub',
'gitView.pr.actions.openOnGitHubAria': 'Open pull request on GitHub',
'gitView.pr.actions.openSettings': 'Open settings',
'gitView.pr.actions.repo': 'Repository',
'gitView.pr.actions.resolveFailedChecks': 'Attach failed checks',
'gitView.pr.actions.resolveFailedChecksAria': 'Attach failed checks to chat context',
'gitView.pr.actions.savePr': 'Save PR',
'gitView.pr.actions.savePrAria': 'Save pull request changes',
'gitView.pr.actions.sendCommentToAgent': 'Attach comment to chat context',
'gitView.pr.actions.sendCommentToAgentAria': 'Attach this comment to chat context',
'gitView.pr.actions.sendToAgent': 'Attach to chat',
'gitView.pr.actions.shareComments': 'Attach comments',
'gitView.pr.actions.shareCommentsAria': 'Attach pull request comments to chat context',
'gitView.pr.actions.toggleDraftAria': 'Toggle draft state',
'gitView.pr.actions.refresh': 'Refresh PR status',
'gitView.pr.actions.refreshAria': 'Refresh pull request status',
'gitView.pr.additionalContext.added': 'Added',
'gitView.pr.additionalContext.hint': 'Add extra context for better review quality.',
'gitView.pr.additionalContext.optional': 'Optional',
'gitView.pr.additionalContext.title': 'Additional context',
'gitView.pr.checkDetails.empty': 'No check details available',
'gitView.pr.checkDetails.title': 'Failed check details',
'gitView.pr.checkingStatus': 'Checking pull request status...',
'gitView.pr.checks.label': 'checks',
'gitView.pr.checks.completedLabel': 'Completed',
'gitView.pr.checks.conclusionLabel': 'Conclusion',
'gitView.pr.checks.startedLabel': 'Started',
'gitView.pr.checks.statusLabel': 'Status',
'gitView.pr.checks.stepLabel': 'Step',
'gitView.pr.checks.steps': 'Steps',
'gitView.pr.comments.empty': 'No comments found',
'gitView.pr.comments.generalContext': 'General comment',
'gitView.pr.comments.reviewContext': 'Review comment',
'gitView.pr.comments.title': 'Comments',
'gitView.pr.comments.unknownAuthor': 'Unknown author',
'gitView.pr.createTitle': 'Create pull request',
'gitView.pr.draftMustBeReady': 'Draft PR must be marked ready before merge.',
'gitView.pr.field.baseBranch': 'Base branch',
'gitView.pr.field.description': 'Description',
'gitView.pr.field.draft': 'Draft',
'gitView.pr.field.title': 'Title',
'gitView.pr.githubNotConnected': 'GitHub is not connected',
'gitView.pr.history.merged': 'PR #{number} was merged into {base}.',
'gitView.pr.history.closed': 'PR #{number} was closed.',
'gitView.pr.loadingDescription': 'Loading description...',
'gitView.pr.mergeMethod.merge': 'Create a merge commit',
'gitView.pr.mergeMethod.rebase': 'Rebase and merge',
'gitView.pr.mergeMethod.squash': 'Squash and merge',
'gitView.pr.noDescription': 'No description',
'gitView.pr.noMergePermission': 'You do not have permission to merge this pull request.',
'gitView.pr.notMergeable': 'Not mergeable',
'gitView.pr.numberLabel': 'PR #{number}',
'gitView.pr.segment.overview': 'Overview',
'gitView.pr.segment.checks': 'Checks',
'gitView.pr.segment.comments': 'Comments',
'gitView.pr.comments.addAll': 'Attach all to chat',
'gitView.pr.placeholder.additionalContext': 'Any constraints, rollout notes, or reviewer context...',
'gitView.pr.placeholder.description': 'Describe the change...',
'gitView.pr.placeholder.main': 'Summarize your pull request',
'gitView.pr.placeholder.selectBaseBranch': 'Select base branch',
'gitView.pr.placeholder.title': 'Pull request title',
'gitView.pr.placeholder.whatChanged': 'What changed and why?',
'gitView.pr.statusUnavailable': 'Pull request status unavailable',
'gitView.pr.toast.baseBranchRequired': 'Select a base branch',
'gitView.pr.toast.baseMustDifferFromHead': 'Base branch must differ from current branch',
'gitView.pr.toast.createPrFailed': 'Failed to create pull request',
'gitView.pr.toast.generateDescriptionFailed': 'Failed to generate pull request description',
'gitView.pr.toast.githubApiUnavailable': 'GitHub API is unavailable',
'gitView.pr.toast.loadCheckDetailsFailed': 'Failed to load check details',
'gitView.pr.toast.loadChecksFailed': 'Failed to load pull request checks',
'gitView.pr.toast.loadCommentsFailed': 'Failed to load comments',
'gitView.pr.toast.loadPrCommentsFailed': 'Failed to load pull request comments',
'gitView.pr.toast.markReadyFailed': 'Failed to mark pull request ready',
'gitView.pr.toast.markedReady': 'Pull request marked ready for review',
'gitView.pr.toast.mergeFailed': 'Failed to merge pull request',
'gitView.pr.toast.noActiveSession': 'No active chat session',
'gitView.pr.toast.noActiveSessionDescription': 'Open or create a chat session to send context to an agent.',
'gitView.pr.toast.noFailedChecks': 'No failed checks found',
'gitView.pr.toast.noModelSelected': 'Select a model first',
'gitView.pr.toast.noPrComments': 'No pull request comments found',
'gitView.pr.toast.prCreated': 'Pull request created',
'gitView.pr.toast.prMerged': 'Pull request merged',
'gitView.pr.toast.prNotMerged': 'Pull request was not merged',
'gitView.pr.toast.prUpdated': 'Pull request updated',
'gitView.pr.toast.sendMessageFailed': 'Failed to send message to agent',
'gitView.pr.toast.titleRequired': 'Title is required',
'gitView.pr.toast.updatePrFailed': 'Failed to update pull request',
'gitView.pullRequest.createHint': 'Create and manage pull requests from this branch.',
'gitView.pullRequest.availableOnFeatureBranches': 'Available when the current branch can open a pull request.',
'gitView.pullRequest.title': 'Pull request',
'gitView.tabs.worktree': 'Worktree',
'gitView.toast.abortOperationFailed': 'Failed to abort operation',
'gitView.toast.appliedIdentity': 'Applied identity: {name}',
'gitView.toast.applyIdentityFailed': 'Failed to apply identity',
'gitView.toast.branchCreatedLocally': 'Branch created locally, but failed to set upstream.',
'gitView.toast.cannotCheckout': 'Cannot checkout branch: {reason}',
'gitView.toast.cannotCreateBranch': 'Cannot create branch: {reason}',
'gitView.toast.cannotRemoveOriginRemote': 'Cannot remove the origin remote',
'gitView.toast.cannotRenameBranch': 'Cannot rename branch: {reason}',
'gitView.toast.checkedOut': 'Checked out {name}',
'gitView.toast.checkoutFailed': 'Failed to checkout {name}',
'gitView.toast.commitCreated': 'Commit created',
'gitView.toast.commitHashCopied': 'Commit hash copied',
'gitView.toast.continueOperationFailed': 'Failed to continue operation',
'gitView.toast.copyFailed': 'Failed to copy',
'gitView.toast.createBranchFailed': 'Failed to create branch',
'gitView.toast.createCommitFailed': 'Failed to create commit',
'gitView.toast.createdBranch': 'Created branch {name}',
'gitView.toast.enterCommitMessage': 'Enter a commit message',
'gitView.toast.fetchedFromRemote': 'Fetched from {name}',
'gitView.toast.generateCommitMessageFailed': 'Failed to generate commit message',
'gitView.toast.mergeAborted': 'Merge aborted',
'gitView.toast.mergeCompleted': 'Merge completed',
'gitView.toast.mergeConflictsDetected': 'Merge conflicts detected',
'gitView.toast.mergedIntoBranch': 'Merged {branch} into {currentBranch}',
'gitView.toast.pulledFilesPlural': 'Pulled {count} files from {name}',
'gitView.toast.pulledFilesSingle': 'Pulled {count} file from {name}',
'gitView.toast.pushedToUpstream': 'Pushed to {name}',
'gitView.toast.commitOrStashBeforeSync': 'Commit or stash your changes before syncing',
'gitView.toast.alreadyUpToDate': 'Already up to date',
'gitView.toast.syncedPulledPluralAndPushed': 'Pulled {count} files from {name} and pushed to upstream',
'gitView.toast.syncedPulledSingleAndPushed': 'Pulled {count} file from {name} and pushed to upstream',
'gitView.toast.syncedChanges': 'Synced changes',
'gitView.toast.rebaseAborted': 'Rebase aborted',
'gitView.toast.rebaseConflictsDetected': 'Rebase conflicts detected',
'gitView.toast.rebaseStepCompleted': 'Rebase step completed',
'gitView.toast.rebasedOntoBranch': 'Rebased {currentBranch} onto {branch}',
'gitView.toast.refreshRepositoryFailed': 'Failed to refresh repository',
'gitView.toast.remoteNameRequired': 'Remote name is required',
'gitView.toast.removedRemote': 'Removed remote {name}',
'gitView.toast.renameBranchFailed': 'Failed to rename {oldName} to {newName}',
'gitView.toast.renamedBranch': 'Renamed {oldName} to {newName}',
'gitView.toast.restoreStashFailed': 'Failed to restore stash',
'gitView.toast.restoreStashManually': 'Stash restored manually required',
'gitView.toast.revertFailed': 'Failed to revert changes',
'gitView.toast.revertedFile': 'Reverted {path}',
'gitView.toast.revertedFilesPlural': 'Reverted {count} files',
'gitView.toast.revertedFilesSingle': 'Reverted {count} file',
'gitView.toast.revertedSomePlural': 'Reverted {success} files, {failed} failed',
'gitView.toast.revertedSomeSingle': 'Reverted {success} file, {failed} failed',
'gitView.toast.stageFileFailed': 'Failed to stage changes',
'gitView.toast.stageFileToCommit': 'Stage at least one file to commit',
'gitView.toast.stageFileToDescribe': 'Stage at least one file to describe',
'gitView.toast.selectFileToCommit': 'Select at least one file to commit',
'gitView.toast.selectFileToDescribe': 'Select at least one file to describe',
'gitView.toast.stashedRestored': 'Stashed changes restored',
'gitView.toast.syncActionFailed': '{action} failed',
'gitView.toast.unstageFileFailed': 'Failed to unstage changes',
'gitView.toast.upstreamSet': 'Set upstream for {branch} to {remote}',
'gitView.worktree.availableInWorktreeMode': 'Available only in worktree mode',
'contextPanel.mode.chat': 'Chat',
'contextPanel.mode.files': 'Files',
'contextPanel.mode.diff': 'Changes',
'contextPanel.mode.stagedDiff': 'Staged Diff',
'contextPanel.mode.workingDiff': 'Working Diff',
'contextPanel.mode.plan': 'Plan',
'contextPanel.mode.pr': 'Pull Request',
'contextPanel.mode.context': 'Context',
'contextPanel.mode.preview': 'Preview',
'contextPanel.mode.browser': 'Browser',
'contextRail.aria.rail': 'Panel surfaces',
'contextPanel.editorEmpty.title': 'No file open',
'contextPanel.editorEmpty.description': 'Pick a file from the tree to start editing.',
'contextRail.surface.editor.description': 'Edit project files',
'contextRail.surface.git.description': 'Commits, branches, and pull requests',
'contextRail.surface.git.changesCountAriaSingle': '{label}, {count} changed file',
'contextRail.surface.git.changesCountAriaPlural': '{label}, {count} changed files',
'contextRail.surface.git.changesCountTooltipSingle': '{count} changed file',
'contextRail.surface.git.changesCountTooltipPlural': '{count} changed files',
'contextRail.surface.terminal.description': 'Built-in terminal',
'contextRail.surface.diff.description': 'Review working changes',
'contextPanel.mode.walkthrough': 'Walkthrough',
'contextRail.surface.walkthrough.description': 'An AI-guided walkthrough of your changes',
'walkthrough.scope.all': 'All uncommitted',
'walkthrough.scope.group.workingTree': 'Working tree',
'walkthrough.scope.group.committed': 'Committed',
'walkthrough.scope.staged': 'Staged',
'walkthrough.scope.working': 'Unstaged',
'walkthrough.scope.branch': 'This branch',
'walkthrough.scope.selectorAria': 'Select what to review',
'walkthrough.language.menuLabel': 'Walkthrough language',
'walkthrough.missing.language': 'No walkthrough in {requested} yet — showing the one in {shown}.',
'walkthrough.missing.model': 'No walkthrough from {model} yet — showing the last one generated here.',
'walkthrough.missing.languageAndModel': 'No walkthrough in this language from this model yet — showing the last one generated here.',
'walkthrough.language.selectorAria': 'Select the walkthrough language',
'walkthrough.scope.pullRequest': 'PR #{number}',
'walkthrough.action.generate': 'Generate walkthrough',
'walkthrough.action.regenerate': 'Regenerate',
'walkthrough.action.cancel': 'Cancel',
'walkthrough.action.next': 'Next step',
'walkthrough.action.previous': 'Previous step',
'walkthrough.action.refresh': 'Refresh',
'walkthrough.action.open': 'Walkthrough',
'walkthrough.stage.collecting': 'Collecting the changes',
'walkthrough.stage.asking': 'Waiting on the model',
'walkthrough.stage.assembling': 'Assembling the walkthrough',
'walkthrough.empty.title': 'No walkthrough yet',
'walkthrough.empty.description': 'Build a guided reading path through these changes. This calls the small model and costs tokens, so it only ever runs when you ask.',
'walkthrough.stale.banner': 'The code changed after this review. Outdated steps: {count}',
'walkthrough.stop.staleAll': 'All of the code this step described has changed.',
'walkthrough.stop.stalePartial': 'Part of the code this step described has changed. Missing pieces: {count}',
'walkthrough.stop.staleShort': 'Outdated',
'walkthrough.stop.noCode': 'None of the code for this step is in the current diff.',
'walkthrough.uncovered.title': 'Changes the review left out: {count}',
'walkthrough.uncovered.description': 'The review treated these as routine. Expand to check them yourself.',
'walkthrough.toc.moreFiles': 'More files: {count}',
'walkthrough.toc.uncovered': 'Not covered: {count}',
'walkthrough.toc.resize': 'Resize the contents column',
'walkthrough.importance.critical': 'Key change',
'walkthrough.importance.criticalHint': 'This step drives the rest of the change, so read it closely. It is not a problem found in your code.',
'walkthrough.importance.context': 'Context',
'walkthrough.importance.contextHint': 'A supporting change, included so the rest makes sense.',
'walkthrough.help.guide': 'How walkthroughs work',
'walkthrough.blocked.noModel.title': 'No small model available',
'walkthrough.blocked.noModel.description': 'Sign in to a model provider to generate a review.',
'walkthrough.blocked.emptyDiff.title': 'Nothing to review',
'walkthrough.blocked.emptyDiff.description': 'There are no changes in this scope yet.',
'walkthrough.blocked.contextTooSmall.title': 'This diff is too large for the current model',
'walkthrough.blocked.contextTooSmall.description': '{model} fits about {available}K characters and this diff needs about {required}K. Nothing gets truncated — pick a model with a larger context instead.',
'walkthrough.blocked.structuredOutput.title': 'This model cannot produce structured output',
'walkthrough.blocked.structuredOutput.description': '{model} does not support the structured responses a walkthrough needs.',
'walkthrough.blocked.chooseModel': 'Choose the small model',
'walkthrough.blocked.outputExhausted.title': 'This model ran out of answer budget',
'walkthrough.blocked.outputExhausted.description': '{model} spent its whole output allowance on reasoning and returned nothing. Reasoning models often do this on large diffs — a model that thinks less, or reviewing a narrower scope, will get through.',
'walkthrough.blocked.outputExhausted.descriptionUnknownModel': 'The small model spent its whole output allowance on reasoning and returned nothing. Reasoning models often do this on large diffs — a model that thinks less, or reviewing a narrower scope, will get through.',
'walkthrough.blocked.onlyGenerated.title': 'Only generated files changed',
'walkthrough.blocked.onlyGenerated.description': 'Every change here is a lockfile or other tool-produced output, which the review deliberately skips.',
'walkthrough.blocked.serverUnsupported.title': 'This server has no walkthrough support',
'walkthrough.blocked.serverUnsupported.description': 'The OpenChamber server this app is connected to did not answer the walkthrough API, which means it is older than the app. Update the server to 1.18 or newer, then refresh.',
'walkthrough.blocked.contextTooSmall.descriptionUnknownModel': 'The small model fits about {available}K characters and this diff needs about {required}K. Nothing gets truncated — pick a model with a larger context instead.',
'walkthrough.blocked.structuredOutput.descriptionUnknownModel': 'The small model does not support the structured responses a walkthrough needs.',
'contextRail.surface.plan.description': 'View the current plan',
'contextRail.surface.pr.description': 'Create, review, and merge the pull request for the current branch',
'contextRail.surface.notes.description': 'Notes, todos, plans, and agent memory for the project',
'contextRail.surface.context.description': 'Session context and token usage',
'contextRail.surface.browser.description': 'Built-in web browser',
'contextRail.surface.preview.description': 'Dev server preview',
'contextRail.surface.chat.description': 'Session opened side by side',
'contextRail.surface.notes': 'Project knowledge',
'contextRail.editorTree.toggle': 'Toggle file tree',
'contextPanel.browser.open': 'Open browser panel',
'contextPanel.browser.addressAria': 'Browser address',
'contextPanel.browser.history.label': 'Recent addresses',
'contextPanel.browser.history.forget': 'Remove from history',
'contextPanel.browser.newTab': 'New browser tab',
'contextPanel.browser.empty': 'Web browser',
'contextPanel.browser.emptyHint': 'Enter an address above to start browsing the web',
'contextPanel.browser.inspectUnavailable': 'This page cannot be inspected from the browser panel.',
'contextPanel.browser.back': 'Back',
'contextPanel.browser.forward': 'Forward',
'contextPanel.browser.reload': 'Reload',
'contextPanel.browser.hardReload': 'Reload ignoring cache',
'contextPanel.browser.zoomIn': 'Zoom in',
'contextPanel.browser.zoomOut': 'Zoom out',
'contextPanel.browser.zoomReset': 'Reset zoom',
'contextPanel.browser.clearCookies': 'Clear cookies',
'contextPanel.browser.clearCache': 'Clear cache',
'contextPanel.browser.clearedCookies': 'Cookies cleared',
'contextPanel.browser.clearedCache': 'Cache cleared',
'contextPanel.browser.clearFailed': 'Could not clear browsing data',
'contextPanel.browser.stop': 'Stop',
'contextPanel.browser.openExternal': 'Open in system browser',
'contextPanel.browser.devTools': 'Open DevTools',
'contextPanel.browser.deviceToolbar': 'Toggle device toolbar',
'contextPanel.browser.device.preset': 'Device preset',
'contextPanel.browser.device.responsive': 'Responsive',
'contextPanel.browser.device.width': 'Viewport width',
'contextPanel.browser.device.height': 'Viewport height',
'contextPanel.browser.device.rotate': 'Rotate',
'contextPanel.browser.device.schemeSystem': 'Auto',
'contextPanel.browser.device.schemeLight': 'Light',
'contextPanel.browser.device.schemeDark': 'Dark',
'contextPanel.browser.device.schemeFailed': 'Could not change the page appearance',
'contextPanel.browser.frameTitle': 'Browser',
'contextPanel.browser.loadFailed': 'This page could not be loaded',
'contextPanel.browser.waitingForServer': 'Waiting for the dev server',
'contextPanel.browser.waitingForServerHint': 'It is not accepting connections yet. This page will load as soon as it does.',
'contextPanel.browser.tunnelFailed': 'This dev server could not be reached',
'contextPanel.browser.tunnelFailedHint': '{url} runs on the machine OpenChamber is on, and the connection to it could not be opened. Nothing from your own machine is shown here.',
'contextPanel.browser.loadFailedUnknown': 'The page could not be reached.',
'contextPanel.browser.crashed': 'This page stopped responding',
'contextPanel.browser.crashedHint': 'The page crashed repeatedly. Reload to try again.',
'contextPanel.browser.devServers.title': 'Running dev servers',
'projectActions.toast.multipleServers': 'Several servers started — pick one in the browser panel',
'contextPanel.browser.devServers.justStarted': 'Just started',
'contextPanel.browser.devServers.unavailable': 'Could not check for running dev servers.',
'contextPanel.browser.devServers.remoteOnly': 'These run on the machine hosting OpenChamber. Opening them needs the desktop app.',
'contextPanel.browser.annotate.toggle': 'Annotate page',
'contextPanel.browser.annotate.intro': 'This is an annotated selection from the in-app browser.',
'contextPanel.browser.annotate.attached': 'Annotation attached to chat',
'contextPanel.browser.annotate.noSession': 'Open a chat session before attaching an annotation',
'contextPanel.browser.annotate.noPage': 'Load a page before annotating',
'contextPanel.browser.annotate.failed': 'Could not annotate this page',
'contextPanel.browser.annotate.tool.element': 'Element',
'contextPanel.browser.annotate.tool.region': 'Region',
'contextPanel.browser.annotate.tool.draw': 'Draw',
'contextPanel.browser.annotate.commentPlaceholder': 'Describe the change...',
'contextPanel.browser.annotate.submit': 'Attach',
'contextPanel.browser.trustNotice': 'Pages opened here run with full access to OpenChamber — needed for inspect and screenshots. Only open sites you trust: a malicious page could read your data or act on your behalf.',
'contextPanel.tab.closeTabAria': 'Close {label} tab',
'contextPanel.actions.collapsePanel': 'Collapse panel',
'contextPanel.actions.expandPanel': 'Expand panel',
'contextPanel.actions.closePanel': 'Close panel',
'contextPanel.actions.resizePanelAria': 'Resize context panel',
'contextPanel.iframe.sessionChatTitle': 'Session chat {sessionID}',
'contextPanel.preview.actions.reload': 'Reload preview',
'contextPanel.preview.actions.openExternal': 'Open in browser',
'contextPanel.preview.actions.retry': 'Retry',
'contextPanel.preview.iframeTitle': 'Preview',
'contextPanel.preview.invalidUrl': 'Preview needs a valid http(s) URL.',
'contextPanel.preview.empty': 'No preview URL',
'contextPanel.preview.loading': 'Connecting preview proxy...',
'contextPanel.preview.proxyError': 'Could not start preview proxy.',
'contextPanel.preview.upstreamUnreachable': 'Dev server is not responding.',
'contextPanel.preview.upstreamUnreachableHint': 'Make sure your dev server is still running, then retry.',
'contextPanel.preview.startingServer': 'Starting dev server...',
'contextPanel.preview.startingServerHint': 'Waiting for the server to accept connections.',
'contextPanel.preview.title': 'Preview',
'contextPanel.preview.description': 'Use Project Actions or a terminal Preview button to open a preview.',
'contextPanel.preview.startPreview': 'Start Preview',
'contextPanel.preview.starting': 'Starting...',
'contextPanel.preview.noDevServer': 'No dev server command found. Configure a project action or add a "dev" script to package.json.',
'contextPanel.preview.startFailed': 'Failed to start preview server.',
'contextPanel.preview.serverExited': 'Dev server exited unexpectedly.',
'contextPanel.preview.noUrlDetected': 'Dev server started, but no URL was detected in its output. Open the Preview terminal tab to check logs.',
'contextPanel.preview.serverExitedWithLog': 'Dev server exited unexpectedly. Last output:\n\n{log}',
'contextPanel.preview.noUrlDetectedWithLog': 'Dev server did not become reachable. Last output:\n\n{log}',
'contextPanel.preview.console.open': 'Open preview console',
'contextPanel.preview.console.waiting': 'Waiting for preview console',
'contextPanel.preview.console.title': 'Preview console',
'contextPanel.preview.console.attach': 'Attach',
'contextPanel.preview.console.copy': 'Copy',
'contextPanel.preview.console.clear': 'Clear',
'contextPanel.preview.console.empty': 'No preview console events yet.',
'contextPanel.preview.console.noFilteredEvents': 'No events match this filter.',
'contextPanel.preview.console.runtimeError': 'Runtime error',
'contextPanel.preview.console.copied': 'Preview console copied',
'contextPanel.preview.console.copyFailed': 'Failed to copy preview console',
'contextPanel.preview.console.attached': 'Preview console attached to chat',
'contextPanel.preview.console.attachNoSession': 'Open a chat session before attaching preview logs',
'contextPanel.preview.console.attachAnnotation': 'These are browser console logs from the dev server running for this project.',
'contextPanel.preview.inspect.toggle': 'Inspect preview element',
'contextPanel.preview.inspect.attached': 'Preview annotation attached to chat',
'contextPanel.preview.inspect.attachNoSession': 'Open a chat session before attaching preview annotations',
'contextPanel.preview.inspect.attachAnnotation': 'This is a selected DOM element from the in-app preview.',
'contextPanel.preview.inspect.attachAnnotationWithScreenshot': 'This is a selected DOM element from the in-app preview. A screenshot of the visible preview area with the selected element highlighted is attached.',
'contextPanel.preview.console.filter.all': 'All',
'contextPanel.preview.console.filter.errors': 'Errors',
'contextPanel.preview.console.filter.warnings': 'Warnings',
'contextPanel.preview.console.filter.logs': 'Logs',
'terminalView.preview.open': 'Preview',
'terminalView.preview.openTitle': 'Open preview pane',
'sidebarFilesTree.menu.rename': 'Rename',
'sidebarFilesTree.menu.copyPath': 'Copy Path',
'sidebarFilesTree.menu.save': 'Save',
'sidebarFilesTree.menu.download': 'Download',
'sidebarFilesTree.menu.newFile': 'New File',
'sidebarFilesTree.menu.newFolder': 'New Folder',
'sidebarFilesTree.menu.delete': 'Delete',
'sidebarFilesTree.toast.pathCopied': 'Path copied',
'sidebarFilesTree.toast.copyFailed': 'Copy failed',
'sidebarFilesTree.toast.revealFailed': 'Failed to reveal path',
'sidebarFilesTree.toast.filenameRequired': 'Filename is required',
'sidebarFilesTree.toast.writeNotSupported': 'Write not supported',
'sidebarFilesTree.toast.fileCreated': 'File created',
'sidebarFilesTree.toast.operationFailed': 'Operation failed',
'sidebarFilesTree.toast.uploaded': 'Files uploaded',
'sidebarFilesTree.toast.uploadedWithoutConflicts': 'Files without conflicts were uploaded',
'sidebarFilesTree.toast.uploadFailed': 'Some files could not be uploaded',
'sidebarFilesTree.drop.target': 'Upload to {path}',
'sidebarFilesTree.drop.uploading': 'Uploading files to {path}',
'sidebarFilesTree.dialog.uploadConflicts.title': 'Replace existing files?',
'sidebarFilesTree.dialog.uploadConflicts.description': 'Files with these names already exist in {path}. Replacing them cannot be undone.',
'sidebarFilesTree.dialog.uploadConflicts.replace': 'Replace',
'sidebarFilesTree.toast.folderNameRequired': 'Folder name is required',
'sidebarFilesTree.toast.folderCreated': 'Folder created',
'sidebarFilesTree.toast.nameRequired': 'Name is required',
'sidebarFilesTree.toast.renameNotSupported': 'Rename not supported',
'sidebarFilesTree.toast.renamedSuccessfully': 'Renamed successfully',
'sidebarFilesTree.toast.deleteNotSupported': 'Delete not supported',
'sidebarFilesTree.toast.deletedSuccessfully': 'Deleted successfully',
'sidebarFilesTree.search.placeholder': 'Search files...',
'sidebarFilesTree.search.clearAria': 'Clear search',
'sidebarFilesTree.actions.newFileTitle': 'New File',
'sidebarFilesTree.actions.newFolderTitle': 'New Folder',
'sidebarFilesTree.actions.refreshTitle': 'Refresh',
'sidebarFilesTree.actions.collapseAllTitle': 'Collapse all folders',
'sidebarFilesTree.actions.fileMenuTitle': 'File menu',
'sidebarFilesTree.state.searching': 'Searching...',
'sidebarFilesTree.state.loading': 'Loading...',
'sidebarFilesTree.dialog.createFile.title': 'Create File',
'sidebarFilesTree.dialog.createFolder.title': 'Create Folder',
'sidebarFilesTree.dialog.rename.title': 'Rename',
'sidebarFilesTree.dialog.delete.title': 'Delete',
'sidebarFilesTree.dialog.createFile.description': 'Create a new file in {path}',
'sidebarFilesTree.dialog.createFolder.description': 'Create a new folder in {path}',
'sidebarFilesTree.dialog.rename.description': 'Rename {name}',
'sidebarFilesTree.dialog.delete.description': 'Are you sure you want to delete {name}? This action cannot be undone.',
'sidebarFilesTree.dialog.rootFallback': 'root',
'sidebarFilesTree.dialog.rename.placeholder': 'New name',
'sidebarFilesTree.dialog.namePlaceholder': 'Name',
'sidebarFilesTree.dialog.cancel': 'Cancel',
'sidebarFilesTree.dialog.confirm': 'Confirm',
'sidebarFilesTree.dialog.delete.confirm': 'Delete',
'filesView.dialog.createFile.title': 'Create File',
'filesView.dialog.createFolder.title': 'Create Folder',
'filesView.dialog.rename.title': 'Rename',
'filesView.dialog.delete.title': 'Delete',
'filesView.dialog.createFile.description': 'Create a new file in {path}',
'filesView.dialog.createFolder.description': 'Create a new folder in {path}',
'filesView.dialog.rename.description': 'Rename {name}',
'filesView.dialog.delete.description': 'Are you sure you want to delete {name}? This action cannot be undone.',
'filesView.dialog.rootFallback': 'root',
'filesView.dialog.rename.placeholder': 'New name',
'filesView.dialog.namePlaceholder': 'Name',
'filesView.dialog.cancel': 'Cancel',
'filesView.dialog.confirm': 'Confirm',
'filesView.dialog.delete.confirm': 'Delete',
'filesView.editor.saving': 'Saving...',
'filesView.editor.saved': 'Saved',
'filesView.editor.autoSaveOn': 'Auto-save on',
'filesView.editor.manualSave': 'Manual save',
'filesView.editor.saveNowTitle': 'Save now ({shortcut}) - auto-saves after 1.5s',
'filesView.editor.saveNowManualTitle': 'Save now ({shortcut})',
'filesView.editor.saveAria': 'Save ({shortcut})',
'filesView.editor.openInDesktopApp': 'Open in desktop app',
'filesView.editor.refreshApps': 'Refresh Apps',
'filesView.editor.disableLineWrap': 'Disable line wrap',
'filesView.editor.enableLineWrap': 'Enable line wrap',
'filesView.editor.findInFile': 'Find in file',
'filesView.editor.goToLine': 'Go to line',
'filesView.editor.switchToEditMode': 'Switch to edit mode',
'filesView.editor.switchToPreviewMode': 'Switch to preview mode',
'filesView.editor.switchToTextView': 'Switch to Text View',
'filesView.editor.switchToTreeView': 'Switch to Tree View',
'filesView.toast.copyFailed': 'Copy failed',
'filesView.toast.openInAppFailed': 'Failed to open in {app}',
'filesView.toast.savingNotSupported': 'Saving not supported',
'filesView.toast.writeFileFailed': 'Failed to write file',
'filesView.toast.saveFailed': 'Save failed',
'filesView.editor.copyFileContents': 'Copy file contents',
'filesView.editor.copyFilePathTitle': 'Copy file path ({path})',
'filesView.editor.saveFile': 'Save file',
'filesView.editor.exitFullscreen': 'Exit fullscreen',
'filesView.editor.fullscreen': 'Fullscreen',
'filesView.unsaved.title': 'Unsaved changes',
'filesView.unsaved.description': 'Save your edits before continuing?',
'filesView.unsaved.saveChanges': 'Save changes',
'filesView.unsaved.discard': 'Discard',
'filesView.editor.back': 'Back',
'filesView.editor.openFilesAria': 'Open files',
'filesView.editor.closeFileAria': 'Close {name}',
'filesView.editor.selectFile': 'Select a file',
'filesView.editor.showControlsAria': 'Show editor controls',
'filesView.editor.controlsTitle': 'Editor controls',
'filesView.editor.pickFileFromTree': 'Pick a file from the tree.',
'filesView.editor.cannotPreviewBinary': 'Cannot preview binary file',
'filesView.editor.binaryFileDescription': 'This file is binary and cannot be edited in OpenChamber. Download it to open with another app.',
'filesView.state.loading': 'Loading...',
'filesView.state.openingFileAtChange': 'Opening file at change...',
'filesView.tree.search.placeholder': 'Search files...',
'filesView.tree.search.clearAria': 'Clear search',
'filesView.tree.search.searching': 'Searching...',
'filesView.tree.actions.newFileTitle': 'New File',
'filesView.tree.actions.newFolderTitle': 'New Folder',
'filesView.tree.actions.refreshTitle': 'Refresh',
'filesView.editor.imageAltFallback': 'Image',
'filesView.error.jsonViewerUnavailable': 'JSON viewer unavailable',
'filesView.error.switchToTextMode': 'Switch to text mode to view raw content.',
'filesView.warning.largeFilePreviewLimited': 'This file is large ({sizeKb}KB). Preview may be limited.',
'filesView.error.previewUnavailable': 'Preview unavailable',
'filesView.error.switchToEditMode': 'Switch to edit mode to fix the issue.',
'filesView.error.readFileFailed': 'Failed to read file',
'filesView.editor.htmlPreviewTitle': 'HTML Preview',
'filesView.diagram.closeDiagramView': 'Close diagram view',
'filesView.diagram.saveDiagram': 'Save diagram',
'contextUsage.aria.label': 'Context usage',
'contextUsage.mobile.title': 'Context Usage',
'contextUsage.mobile.usedTokens': 'Used tokens',
'contextUsage.mobile.contextLimit': 'Context limit',
'contextUsage.mobile.outputLimit': 'Output limit',
'contextUsage.mobile.cost': 'Cost',
'contextUsage.mobile.usage': 'Usage',
'contextUsage.tooltip.usedTokens': 'Used tokens: {tokens}',
'contextUsage.tooltip.contextLimit': 'Context limit: {tokens}',
'contextUsage.tooltip.outputLimit': 'Output limit: {tokens}',
'contextUsage.tooltip.cost': 'Cost: {cost}',
'contextSidebar.session.untitled': 'Untitled Session',
'contextSidebar.empty.openSession': 'Open a session to inspect context.',
'contextSidebar.section.context': 'Context',
'contextSidebar.section.lastAssistantMessage': 'Last Assistant Message',
'contextSidebar.section.rawMessages': 'Raw Messages',
'contextSidebar.context.percentUsed': '{percent}% used',
'contextSidebar.breakdown.user': 'User',
'contextSidebar.breakdown.assistant': 'Assistant',
'contextSidebar.breakdown.toolCalls': 'Tool Calls',
'contextSidebar.breakdown.other': 'Other',
'contextSidebar.stats.messages': 'Messages',
'contextSidebar.stats.user': 'User',
'contextSidebar.stats.assistant': 'Assistant',
'contextSidebar.stats.cost': 'Cost',
'contextSidebar.tokens.input': 'Input',
'contextSidebar.tokens.output': 'Output',
'contextSidebar.tokens.reasoning': 'Reasoning',
'contextSidebar.tokens.cacheRead': 'Cache Read',
'contextSidebar.tokens.cacheWrite': 'Cache Write',
'contextSidebar.tokens.cacheHit': 'Cache Hit',
'contextSidebar.actions.copyJson': 'Copy JSON',
'contextSidebar.actions.copy': 'Copy',
'contextSidebar.actions.copied': 'Copied',
'planView.file.defaultName': 'plan',
'planView.title.default': 'Plan',
'planView.error.saveFailed': 'Save failed',
'planView.error.loadFailed': 'Could not load this plan',
'planView.error.previewUnavailable': 'Preview unavailable',
'planView.error.switchToEditMode': 'Switch to edit mode to fix the issue.',
'planView.error.writeFailed': 'Write failed',
'planView.error.writePlanFileFailed': 'Failed to write plan file ({status})',
'planView.actions.improvePlanAria': 'Improve plan',
'planView.actions.improve': 'Improve',
'planView.actions.implementPlanAria': 'Implement plan',
'planView.actions.implement': 'Implement',
'planView.actions.sendToNewSession': 'Send to new session',
'planView.actions.sendToNewWorktreeSession': 'Send to new worktree session',
'planView.actions.copyPlanContents': 'Copy plan contents',
'planView.state.loading': 'Loading...',
'diffView.binary.unavailable': 'Content of this file cannot be viewed.',
'diffView.change.untracked': 'Untracked file',
'diffView.change.new': 'New file',
'diffView.change.deleted': 'Deleted file',
'diffView.change.renamed': 'Renamed file',
'diffView.change.copied': 'Copied file',
'diffView.change.modified': 'Modified file',
'diffView.selector.selectFile': 'Select file',
'diffView.image.original': 'Original',
'diffView.image.modified': 'Modified',
'diffView.image.new': 'New',
'diffView.image.originalAlt': 'Original: {path}',
'diffView.image.modifiedAlt': 'Modified: {path}',
'diffView.section.files': 'Files',
'diffView.state.selectSessionDirectory': 'Select a session directory to view diffs',
'diffView.state.loadingRepositoryStatus': 'Loading repository status...',
'diffView.state.notGitRepository': 'Not a git repository. Use the Git tab to initialize or change directories.',
'diffView.state.cleanWorkingTree': 'Working tree clean, no changes to display',
'diffView.state.noLastTurnChanges': 'No last turn changes to display',
'diffView.state.failedToLoadDiff': 'Failed to load diff',
'diffView.state.loadingDiff': 'Loading diff...',
'diffView.state.loadingChanges': 'Loading changes...',
'diffView.state.largeDiff': 'Large diff ({count} changed lines)',
'diffView.state.largeDiffDescription': 'Rendering may be slow. You can still view the diff by clicking below.',
'diffView.summary.changedFilesSingle': '{count} file changed',
'diffView.summary.changedFilesPlural': '{count} files changed',
'diffView.scope.changed': 'Changed',
'diffView.scope.staged': 'Staged',
'diffView.scope.lastTurn': 'Last turn',
'diffView.scope.selectorAria': 'Select change mode',
'diffView.actions.retry': 'Retry',
'diffView.actions.renderAnyway': 'Render anyway',
'diffView.actions.expandAll': 'Expand all',
'diffView.actions.collapseAll': 'Collapse all',
'diffView.actions.loadFullFiles': 'Load full files',
'diffView.actions.disableFullFiles': 'Unload full files',
'diffView.actions.disableLineWrap': 'Disable line wrap',
'diffView.actions.enableLineWrap': 'Enable line wrap',
'diffView.actions.openFileInEditorAtChange': 'Open this file in editor at change',
'diffView.actions.openFileAtFirstChangedLine': 'Open this file at first changed line',
'diffView.actions.review': 'Review',
'diffView.actions.reviewAria': 'Review changes',
'diffView.reviewDialog.title': 'Review changes',
'diffView.reviewDialog.description': 'Start a separate review session for the current changes.',
'diffView.reviewDialog.generateHandoff': 'Generate handoff',
'diffView.reviewDialog.autoReview': 'Run automatic review loop',
'diffView.reviewDialog.info': 'This flow works best when started from the session where the changes were implemented.',
'diffView.reviewDialog.actions.cancel': 'Cancel',
'diffView.reviewDialog.actions.start': 'Review',
'diffView.reviewDialog.actions.starting': 'Starting...',
'diffView.reviewDialog.toast.noSessionDirectory': 'Session directory is unavailable',
'diffView.reviewDialog.toast.startFailed': 'Failed to start review flow',
'chat.history.loadOlder': 'Load older messages',
'chat.autoReview.title': 'Code review loop is running',
'chat.autoReview.status.waitingForReviewer': 'Waiting for reviewer',
'chat.autoReview.status.waitingForImplementer': 'Waiting for implementer',
'chat.autoReview.reviewSessionLabel': 'Review session',
'chat.autoReview.actions.open': 'Open',
'chat.autoReview.actions.stop': 'Stop',
'diffView.hunk.label': 'Hunks',
'diffView.hunk.stage': 'Stage',
'diffView.hunk.unstage': 'Unstage',
'diffView.hunk.discard': 'Discard',
'diffView.hunk.stageTitle': 'Stage hunk {index}',
'diffView.hunk.unstageTitle': 'Unstage hunk {index}',
'diffView.hunk.discardTitle': 'Discard hunk {index}',
'diffView.hunk.unavailable': 'This hunk is no longer available. Refresh the diff and try again.',
'diffView.hunk.unsupported': 'Staging individual hunks is not supported in this runtime.',
'rightSidebar.contextNotesTodo.plan.defaultTitle': 'Plan',
'rightSidebar.contextNotesTodo.empty.selectProject': 'Select a project to add notes and todos.',
'rightSidebar.contextNotesTodo.notes.placeholder': 'Capture context, reminders, or links',
'rightSidebar.contextNotesTodo.notes.addAria': 'Add note',
'rightSidebar.contextNotesTodo.notes.empty': 'No notes yet. Capture context, reminders, or links.',
'rightSidebar.contextNotesTodo.notes.actions.expand': 'Expand note',
'rightSidebar.contextNotesTodo.notes.actions.collapse': 'Collapse note',
'rightSidebar.contextNotesTodo.notes.actions.delete': 'Delete note',
'rightSidebar.contextNotesTodo.notes.actions.pin': 'Pin to agent context',
'rightSidebar.contextNotesTodo.notes.actions.unpin': 'Unpin from agent context',
'rightSidebar.contextNotesTodo.notes.source.selection': 'From chat',
'rightSidebar.contextNotesTodo.notes.source.agent': 'From agent',
'rightSidebar.contextNotesTodo.search.placeholder': 'Search',
'rightSidebar.contextNotesTodo.search.clear': 'Clear search',
'rightSidebar.contextNotesTodo.search.noResults': 'Nothing matches "{query}".',
'rightSidebar.contextNotesTodo.toast.deleteNoteFailed': 'Failed to delete note',
'rightSidebar.contextNotesTodo.toast.createNoteFailed': 'Failed to create note',
'rightSidebar.contextNotesTodo.tabs.notes': 'Notes',
'rightSidebar.contextNotesTodo.tabs.todos': 'Todo',
'rightSidebar.contextNotesTodo.tabs.plans': 'Plans',
'rightSidebar.contextNotesTodo.plans.actions.back': 'Back to plans',
'rightSidebar.contextNotesTodo.tabs.memory': 'Memory',
'rightSidebar.contextNotesTodo.sections.label': 'Project context sections',
'rightSidebar.contextNotesTodo.sections.resize': 'Resize sections sidebar',
'rightSidebar.contextNotesTodo.memory.scope.project': 'Project',
'rightSidebar.contextNotesTodo.memory.scope.label': 'Memory scope',
'rightSidebar.contextNotesTodo.memory.scope.global': 'About you',
'rightSidebar.contextNotesTodo.memory.type.fact': 'fact',
'rightSidebar.contextNotesTodo.memory.badge.new': 'new',
'rightSidebar.contextNotesTodo.memory.flagged': 'Withheld from the agent — reads as an instruction',
'rightSidebar.contextNotesTodo.memory.badge.changed': 'changed',
'rightSidebar.contextNotesTodo.memory.type.preference': 'preference',
'rightSidebar.contextNotesTodo.memory.type.reference': 'reference',
'rightSidebar.contextNotesTodo.memory.actions.delete': 'Forget this memory',
'rightSidebar.contextNotesTodo.memory.actions.editTitle': 'Memory title',
'rightSidebar.contextNotesTodo.memory.actions.editBody': 'Memory text',
'rightSidebar.contextNotesTodo.memory.toast.saveFailed': 'Failed to save memory',
'rightSidebar.contextNotesTodo.memory.toast.deleteFailed': 'Failed to forget memory',
'rightSidebar.contextNotesTodo.memory.empty.nothing': 'The agent has stored nothing here yet.',
'rightSidebar.contextNotesTodo.memory.empty.noMatches': 'No stored memory matches your search.',
'rightSidebar.contextNotesTodo.memory.empty.noProject': 'Open a project to see what the agent remembers about it.',
'rightSidebar.contextNotesTodo.memory.empty.unavailable': 'Stored memory could not be loaded. Nothing has been lost — try again.',
'rightSidebar.contextNotesTodo.todo.clearCompleted': 'Clear completed',
'rightSidebar.contextNotesTodo.todo.inputPlaceholder': 'Add a todo',
'rightSidebar.contextNotesTodo.todo.addAria': 'Add todo',
'rightSidebar.contextNotesTodo.todo.empty': 'No todos yet. Add a small checklist for this project.',
'rightSidebar.contextNotesTodo.todo.actions.markComplete': 'Mark "{text}" complete',
'rightSidebar.contextNotesTodo.todo.actions.collapse': 'Collapse todo "{text}"',
'rightSidebar.contextNotesTodo.todo.actions.expand': 'Expand todo "{text}"',
'rightSidebar.contextNotesTodo.todo.actions.delete': 'Delete "{text}"',
'rightSidebar.contextNotesTodo.todo.actions.send': 'Send "{text}"',
'rightSidebar.contextNotesTodo.todo.actions.reorder': 'Reorder "{text}"',
'rightSidebar.contextNotesTodo.todo.sendMenu.currentSession': 'Send to current session',
'rightSidebar.contextNotesTodo.todo.sendMenu.newSession': 'Send to new session',
'rightSidebar.contextNotesTodo.todo.sendMenu.newWorktreeSession': 'Send to new worktree session',
'rightSidebar.contextNotesTodo.plans.importFromFile': 'Import plan from file',
'rightSidebar.contextNotesTodo.plans.empty': 'No saved plans yet.',
'rightSidebar.contextNotesTodo.plans.deletePlan': 'Delete plan',
'rightSidebar.contextNotesTodo.plans.deletePlanWithTitle': 'Delete plan "{title}"',
'rightSidebar.contextNotesTodo.sendDialog.title.newSession': 'Send to new session',
'rightSidebar.contextNotesTodo.sendDialog.title.newWorktree': 'Send to new worktree',
'rightSidebar.contextNotesTodo.sendDialog.variant.default': 'Default',
'rightSidebar.contextNotesTodo.sendDialog.actions.cancel': 'Cancel',
'rightSidebar.contextNotesTodo.sendDialog.actions.send': 'Send',
'rightSidebar.contextNotesTodo.sendDialog.actions.sending': 'Sending',
'rightSidebar.contextNotesTodo.toast.saveNotesFailed': 'Failed to save project notes',
'rightSidebar.contextNotesTodo.toast.loadNotesFailed': 'Failed to load project notes',
'rightSidebar.contextNotesTodo.toast.noActiveSession': 'No active session selected',
'rightSidebar.contextNotesTodo.toast.sentToCurrentSession': 'Todo sent to current session',
'rightSidebar.contextNotesTodo.toast.worktreeRequiresGitRepo': 'Worktree actions are only available for Git repositories',
'rightSidebar.contextNotesTodo.toast.createSessionFailed': 'Failed to create session',
'rightSidebar.contextNotesTodo.toast.sentToNewSession': 'Todo sent to new session',
'rightSidebar.contextNotesTodo.toast.sentToNewWorktreeSession': 'Todo sent to new worktree session',
'rightSidebar.contextNotesTodo.toast.sendTodoFailed': 'Failed to send todo',
'rightSidebar.contextNotesTodo.toast.updatePlanFailed': 'Failed to update plan',
'rightSidebar.contextNotesTodo.toast.deletePlanFailed': 'Failed to delete plan',
'rightSidebar.contextNotesTodo.toast.planFileEmpty': 'Plan file is empty',
'rightSidebar.contextNotesTodo.toast.importPlanFailed': 'Failed to import plan',
'rightSidebar.contextNotesTodo.toast.planImported': 'Plan imported',
'rightSidebar.contextNotesTodo.toast.readPlanFileFailed': 'Failed to read plan file',
'inlineComment.range.lines': 'Lines {start}-{end}',
'inlineComment.input.placeholder': 'Add a comment... (Cmd+Enter to save)',
'inlineComment.input.placeholderShort': 'Add a comment...',
'inlineComment.actions.cancel': 'Cancel',
'inlineComment.actions.save': 'Save',
'inlineComment.actions.comment': 'Comment',
'inlineComment.actions.showLess': 'Show less',
'inlineComment.actions.showMore': 'Show more',
'inlineComment.actions.editComment': 'Edit comment',
'inlineComment.actions.deleteComment': 'Delete comment',
'inlineComment.toast.selectSessionToSave': 'Select a session to save comment',
'header.github.connectedWithLogin': 'GitHub: {login}',
'header.github.connected': 'GitHub connected',
'header.github.avatarWithLogin': '{login} avatar',
'header.github.avatar': 'GitHub avatar',
'header.github.accountsTitle': 'GitHub Accounts',
'header.github.accountSource.oauth': 'OAuth',
'header.github.accountSource.cli': 'CLI',
'header.services.openWithCurrent': 'Open instance, usage and MCP (current: {current})',
'header.services.open': 'Open services, usage and MCP',
'header.services.title': 'Services',
'header.services.viewAria': 'View services',
'header.services.closeAria': 'Close services',
'header.services.rateLimits': 'Rate limits',
'header.services.refreshRateLimitsAria': 'Refresh rate limits',
'header.services.noRateLimits': 'No rate limits available.',
'header.services.noRateLimitsReported': 'No rate limits reported.',
'header.services.remoteUpdate.title': 'Remote instance update',
'header.services.remoteUpdate.checking': 'Looking for updates...',
'header.services.remoteUpdate.upToDate': 'This instance is up to date.',
'header.services.remoteUpdate.available': 'Version {version} is available for this instance.',
'header.services.remoteUpdate.error': 'Failed to check remote instance updates',
'header.services.remoteUpdate.actions.open': 'Update',
'header.services.used': 'Used',
'header.services.remaining': 'Remaining',
'header.services.modelFamily.other': 'Other',
'header.actions.openPlanAria': 'Open plan',
'header.actions.toggleChangesPanel': 'Changes panel',
'header.actions.toggleChangesPanelAria': 'Toggle changes panel',
'header.actions.planWithShortcut': 'Plan ({shortcut})',
'header.actions.terminalPanelWithShortcut': 'Terminal panel ({shortcut})',
'chat.recap.aria': 'Session recap',
'chat.recap.label': 'Recap:',
'chat.goal.dialog.titleCreate': 'Set Session Goal',
'chat.goal.dialog.titleManage': 'Session Goal',
'chat.goal.dialog.objectiveLabel': 'Objective',
'chat.goal.dialog.objectivePlaceholder': 'Describe the end state the agent should reach and verify…',
'chat.goal.dialog.budgetLabel': 'Token budget',
'chat.goal.dialog.evaluationModelLabel': 'Evaluation model',
'chat.goal.status.active': 'Active',
'chat.goal.status.evaluating': 'Evaluating…',
'chat.goal.status.paused': 'Paused',
'chat.goal.status.blocked': 'Blocked',
'chat.goal.status.budgetLimited': 'Budget reached',
'chat.goal.status.complete': 'Complete',
'chat.goal.usage.tokens': '{used} tokens',
'chat.goal.usage.tokensWithBudget': '{used}/{budget} tokens',
'chat.goal.usage.turns': '{turns} continuations',
'chat.goal.action.pause': 'Pause',
'chat.goal.action.resume': 'Resume',
'chat.goal.action.markComplete': 'Mark complete',
'chat.goal.action.clear': 'Remove goal',
'chat.goal.action.cancel': 'Cancel',
'chat.goal.action.save': 'Save goal',
'chat.goal.action.start': 'Start goal',
'chat.goal.toast.actionFailed': 'Goal update failed',
"chat.goal.toast.distillFallback": "Objective exceeded the limit and couldn't be distilled — a trimmed version is used for the auditor",
'chat.goal.row.aria': 'Session goal — open details',
'chat.goal.button.createAria': 'Set a session goal',
'chat.goal.button.manageAria': 'Manage session goal',
'chat.goal.button.armAria': 'Start a goal with the next message',
'chat.goal.counter.aria': 'Goal objective length limit',
'chat.goal.button.disarmAria': 'Goal armed — tap to disarm',
'chat.goal.button.cancelAria': 'Goal running — tap to cancel it',
'chat.goal.cancelDialog.title': 'Cancel this goal?',
'chat.goal.cancelDialog.description': 'The agent will stop working toward this goal automatically.',
'chat.goal.cancelDialog.keep': 'Keep goal',
'chat.goal.cancelDialog.confirm': 'Cancel goal',
'chat.suggestion.applyAria': 'Use suggested message',
'chat.suggestion.dismissAria': 'Dismiss suggestion',
'header.actions.toggleTerminalPanelAria': 'Toggle terminal panel',
'terminalView.stream.processExitedMessage': '\r\n[Process exited{exitCodeSegment}{signalSegment}]\r\n',
'terminalView.stream.processExitedWithCode': ' with code {exitCode}',
'terminalView.stream.processExitedWithSignal': ' (signal {signal})',
'terminalView.error.sessionEnded': 'Terminal session ended',
'terminalView.error.connectionFailed': 'Connection failed: {message}',
'terminalView.error.startSessionFailed': 'Failed to start terminal session',
'terminalView.error.restartFailed': 'Failed to restart terminal',
'terminalView.error.sendInputFailed': 'Failed to send input',
'terminalView.empty.noWorkingDirectory': 'No working directory available for terminal.',
'terminalView.empty.selectSession': 'Select a session to open the terminal.',
'terminalView.empty.noWorkingDirectoryForSession': 'No working directory available for this session.',
'terminalView.actions.retry': 'Retry',
'terminalView.actions.hardRestart': 'Hard Restart',
'terminalView.actions.hardRestartTitle': 'Force kill and create fresh session',
'terminalView.quickKeys.escape': 'Esc',
'terminalView.quickKeys.tabAria': 'Tab',
'terminalView.quickKeys.controlLabel': 'Ctrl',
'terminalView.quickKeys.controlModifierAria': 'Control modifier',
'terminalView.quickKeys.altLabel': 'Alt',
'terminalView.quickKeys.altModifierAria': 'Alt modifier',
'terminalView.quickKeys.commandModifierAria': 'Command modifier',
'terminalView.quickKeys.arrowUpAria': 'Arrow up',
'terminalView.quickKeys.arrowLeftAria': 'Arrow left',
'terminalView.quickKeys.arrowDownAria': 'Arrow down',
'terminalView.quickKeys.arrowRightAria': 'Arrow right',
'terminalView.quickKeys.enterAria': 'Enter',
'terminalView.tabs.closeTabTitle': 'Close tab',
'terminalView.tabs.newTabTitle': 'New tab',
'terminalView.viewport.inputAria': 'Terminal input',
'directoryExplorerDialog.title': 'Add project directory',
'directoryExplorerDialog.description': 'Choose a folder to add as a project.',
'directoryExplorerDialog.toggle.showHidden': 'Show hidden',
'directoryExplorerDialog.pathInput.placeholder': 'Enter path or select from tree...',
'directoryExplorerDialog.actions.openingFinder': 'Opening...',
'directoryExplorerDialog.actions.openInFinder': 'Open in Finder',
'directoryExplorerDialog.actions.adding': 'Adding...',
'directoryExplorerDialog.actions.addProject': 'Add project',
'directoryExplorerDialog.actions.addLocalProject': 'Add local project',
'directoryExplorerDialog.actions.cloneRepository': 'Clone repository',
'directoryExplorerDialog.actions.cloneAndAdd': 'Clone & add',
'directoryExplorerDialog.actions.cloning': 'Cloning...',
'directoryExplorerDialog.actions.createAndAdd': 'Create & add',
'directoryExplorerDialog.actions.alreadyAdded': 'Already added',
'directoryExplorerDialog.clone.remoteUrlPlaceholder': 'Repository URL (HTTPS or SSH)',
'directoryExplorerDialog.browse.directories': 'Directories',
'directoryExplorerDialog.browse.loading': 'Loading directories...',
'directoryExplorerDialog.browse.empty': 'No matching directories.',
'directoryExplorerDialog.browse.permissionDenied': 'OpenChamber needs access to this folder.',
'directoryExplorerDialog.browse.loadFailed': 'Could not load this folder.',
'directoryExplorerDialog.browse.grantAccess': 'Grant access',
'directoryExplorerDialog.browse.retry': 'Try again',
'directoryExplorerDialog.browse.parentDirectory': 'Parent directory',
'directoryExplorerDialog.browse.addedBadge': 'Added',
'directoryExplorerDialog.browse.quickAdd': 'Add',
'directoryExplorerDialog.footer.navigate': 'Navigate',
'directoryExplorerDialog.footer.select': 'Select',
'directoryExplorerDialog.footer.add': 'Add',
'directoryExplorerDialog.shortcut.enter': 'Enter',
'directoryExplorerDialog.toast.unableToAccessDirectory': 'Unable to access directory',
'directoryExplorerDialog.toast.desktopDeniedAccess': 'Desktop denied directory access.',
'directoryExplorerDialog.toast.failedToOpenDirectory': 'Failed to open directory',
'directoryExplorerDialog.toast.desktopCouldNotGrantAccess': 'Desktop could not grant file access.',
'directoryExplorerDialog.toast.failedToAddProject': 'Failed to add project',
'directoryExplorerDialog.toast.cloneUrlRequired': 'Enter a repository URL before cloning.',
'directoryExplorerDialog.toast.selectValidDirectoryPath': 'Please select a valid directory path.',
'directoryExplorerDialog.toast.failedToSelectDirectory': 'Failed to select directory',
'directoryExplorerDialog.toast.unknownError': 'Unknown error occurred.',
'directoryTree.actions.createNewDirectory': 'Create new directory',
'directoryTree.actions.pinDirectory': 'Pin directory',
'directoryTree.actions.unpinDirectory': 'Unpin directory',
'directoryTree.actions.createDirectory': 'Create directory',
'directoryTree.actions.cancel': 'Cancel',
'directoryTree.actions.selectWorkingDirectoryAria': 'Select working directory',
'directoryTree.state.locatingHomeDirectory': 'Locating home directory...',
'directoryTree.state.loading': 'Loading...',
'directoryTree.state.noDirectoriesFound': 'No directories found',
'directoryTree.section.pinned': 'Pinned',
'directoryTree.section.browse': 'Browse',
'aboutDialog.versionLabel': 'Version {version}',
'aboutDialog.openChamberVersionLabel': 'OpenChamber version {version}',
'aboutDialog.openCodeVersionLabel': 'OpenCode version {version}',
'aboutDialog.actions.copyDiagnostics': 'Copy diagnostics',
'aboutDialog.actions.preparingDiagnostics': 'Preparing diagnostics...',
'aboutDialog.actions.diagnosticsCopied': 'Diagnostics copied',
'aboutDialog.diagnosticsDescription': 'Includes OpenChamber state, OpenCode health, directories, and projects.',
'aboutDialog.footerNote': 'Made with love for the community',
'aboutDialog.toast.copyFailed': 'Copy failed',
'aboutDialog.toast.diagnosticsNotReady': 'Diagnostics not ready yet. Wait a second and retry.',
'aboutDialog.toast.diagnosticsCopied': 'Diagnostics copied',
'helpDialog.title': 'Keyboard Shortcuts',
'helpDialog.description': 'Use these keyboard shortcuts to navigate OpenChamber efficiently',
'helpDialog.section.navigationCommands': 'Navigation & Commands',
'helpDialog.section.sessionManagement': 'Session Management',
'helpDialog.section.panels': 'Panels',
'helpDialog.section.interface': 'Interface',
'helpDialog.item.openCommandPalette': 'Open Command Palette',
'helpDialog.item.showKeyboardShortcuts': 'Show Keyboard Shortcuts (this dialog)',
'helpDialog.item.toggleSessionSidebar': 'Toggle Session Sidebar',
'helpDialog.item.addSelectionToChat': 'Add Selection to Chat',
'helpDialog.item.cycleAgent': 'Cycle Agent (chat input)',
'helpDialog.item.openModelSelector': 'Open Model Selector',
'helpDialog.item.navigateModels': 'Navigate Models (in picker)',
'helpDialog.item.adjustThinkingMode': 'Adjust Thinking Mode (in picker, when supported)',
'helpDialog.item.cycleThinkingVariant': 'Cycle Thinking Variant (global shortcut)',
'helpDialog.item.newWindow': 'New Window (desktop only)',
'helpDialog.item.createNewSession': 'Create New Session',
'helpDialog.item.createNewWorktreeDraft': 'Create New Worktree Draft',
'helpDialog.item.focusChatInput': 'Focus Chat Input',
'helpDialog.item.togglePromptNavigator': 'Toggle Prompt Navigator',
'helpDialog.item.abortActiveRun': 'Abort active run (double press)',
'helpDialog.item.toggleRightSidebar': 'Toggle context panel',
'helpDialog.item.openRightSidebarGitTab': 'Open Git surface',
'helpDialog.item.openRightSidebarFilesTab': 'Open Files surface',
'helpDialog.item.toggleTerminalDock': 'Toggle Terminal Dock',
'helpDialog.item.toggleTerminalExpanded': 'Toggle Terminal Expanded',
'helpDialog.item.togglePlanContextPanel': 'Toggle Plan Context Panel',
'helpDialog.item.switchContextSurface': 'Switch Context Panel Surface (number key)',
'helpDialog.item.cycleTheme': 'Cycle Theme (Light → Dark → System)',
'helpDialog.item.toggleServicesMenu': 'Toggle Services Menu',
'helpDialog.item.cycleServicesTab': 'Cycle Services Tab',
'helpDialog.item.openSettings': 'Open Settings',
'helpDialog.keyCombiner.or': 'or',
'helpDialog.proTips.title': 'Pro Tips:',
'helpDialog.proTips.commandPalette': 'Use Command Palette ({shortcut}) to quickly access all actions',
'helpDialog.proTips.recentSessions': 'The 5 most recent sessions appear in the Command Palette',
'helpDialog.proTips.themeCycling': 'Theme cycling remembers your preference across sessions',
'header.actions.rightSidebarWithShortcut': 'Right sidebar ({shortcut})',
'header.actions.toggleRightSidebarAria': 'Toggle right sidebar',
'header.actions.openAppMenu': 'OpenChamber menu',
'header.actions.openAppMenuAria': 'Open OpenChamber menu',
'header.actions.openSessionsWithShortcut': 'Open sessions ({shortcut})',
'header.actions.openSessionsAria': 'Open sessions',
'header.actions.closeSessionsAria': 'Close sessions',
'header.actions.newSessionAria': 'New session',
'header.actions.newSessionWithShortcut': 'New session ({shortcut})',
'header.actions.backAria': 'Back',
'header.navigation.mainAria': 'Main navigation',
'header.sessions.title': 'Sessions',
'header.changes.availableAria': 'Changes available',
'session.githubIssuePicker.error.noActiveProject': 'No active project',
'session.githubIssuePicker.error.runtimeUnavailable': 'GitHub runtime API unavailable',
'session.githubIssuePicker.error.notConnected': 'GitHub not connected',
'session.githubIssuePicker.error.repoNotResolvable': 'Repo not resolvable',
'session.githubIssuePicker.error.repoMustBeGithub': 'origin remote must be a GitHub URL',
'session.githubIssuePicker.error.issueNotFound': 'Issue not found',
'session.githubIssuePicker.error.noModelSelected': 'No model selected',
'session.githubIssuePicker.toast.loadMoreFailed': 'Failed to load more issues',
'session.githubIssuePicker.toast.loadIssueDetailsFailed': 'Failed to load issue details',
'session.githubIssuePicker.toast.sendContextFailed': 'Failed to send issue context',
'session.githubIssuePicker.toast.sessionCreated': 'Session created from issue',
'session.githubIssuePicker.toast.startSessionFailed': 'Failed to start session',
'session.githubIssuePicker.title.select': 'Link GitHub Issue',
'session.githubIssuePicker.title.createSession': 'New Session From GitHub Issue',
'session.githubIssuePicker.description.select': 'Select an issue to link to this session.',
'session.githubIssuePicker.description.createSession': 'Seeds a new session with hidden issue context (title/body/labels/comments).',
'session.githubIssuePicker.searchPlaceholder': 'Search using GitHub code search syntax',
'session.githubIssuePicker.empty.noActiveProject': 'No active project selected.',
'session.githubIssuePicker.empty.runtimeUnavailable': 'GitHub runtime API unavailable.',
'session.githubIssuePicker.empty.notConnected': 'GitHub not connected. Connect your GitHub account in settings.',
'session.githubIssuePicker.empty.noIssuesFound': 'No issues found',
'session.githubIssuePicker.empty.noOpenIssuesFound': 'No open issues found',
'session.githubIssuePicker.loading.issues': 'Loading issues...',
'session.githubIssuePicker.loading.more': 'Loading...',
'session.githubIssuePicker.actions.openSettings': 'Open settings',
'session.githubIssuePicker.actions.useIssue': 'Use issue #{number}',
'session.githubIssuePicker.actions.openInGitHubAria': 'Open in GitHub',
'session.githubIssuePicker.actions.loadMore': 'Load more',
'session.githubIssuePicker.actions.sectionTitle': 'Actions',
'session.githubIssuePicker.actions.toggleWorktreeAria': 'Toggle worktree',
'session.githubIssuePicker.actions.createInWorktree': 'Create in worktree',
'session.githubIssuePicker.actions.openRepo': 'Open Repo',
'session.githubIssuePicker.actions.refresh': 'Refresh',
'session.githubPrPicker.error.noActiveProject': 'No active project',
'session.githubPrPicker.error.runtimeUnavailable': 'GitHub runtime API unavailable',
'session.githubPrPicker.error.notConnected': 'GitHub not connected',
'session.githubPrPicker.error.prNotFound': 'Pull request not found',
'session.githubPrPicker.error.repoNotResolvable': 'Repo not resolvable',
'session.githubPrPicker.error.repoMustBeGithub': 'origin remote must be a GitHub URL',
'session.githubPrPicker.toast.loadMoreFailed': 'Failed to load more pull requests',
'session.githubPrPicker.toast.loadDetailsFailed': 'Failed to load pull request details',
'session.githubPrPicker.title': 'Link GitHub Pull Request',
'session.githubPrPicker.description': 'Select a pull request to attach review context to this message.',
'session.githubPrPicker.searchPlaceholder': 'Search using GitHub code search syntax',
'session.githubPrPicker.includeDiffAria': 'Include PR diff in attached context',
'session.githubPrPicker.includeDiff': 'Include PR diff',
'session.githubPrPicker.empty.noActiveProject': 'No active project selected.',
'session.githubPrPicker.empty.runtimeUnavailable': 'GitHub runtime API unavailable.',
'session.githubPrPicker.empty.notConnected': 'GitHub not connected. Connect your GitHub account in settings.',
'session.githubPrPicker.empty.noPullRequestsFound': 'No pull requests found',
'session.githubPrPicker.empty.noOpenPullRequestsFound': 'No open pull requests found',
'session.githubPrPicker.loading.pullRequests': 'Loading pull requests...',
'session.githubPrPicker.loading.more': 'Loading...',
'session.githubPrPicker.actions.openSettings': 'Open settings',
'session.githubPrPicker.actions.usePullRequest': 'Use pull request #{number}',
'session.githubPrPicker.actions.openInGitHubAria': 'Open in GitHub',
'session.githubPrPicker.actions.loadMore': 'Load more',
'session.newWorktree.title': 'New Worktree',
'session.newWorktree.mode.newBranch': 'New Branch',
'session.newWorktree.mode.existingBranch': 'Existing Branch',
'session.newWorktree.selectBranch': 'Select Branch',
'session.newWorktree.chooseBranch': 'Choose a branch...',
'session.newWorktree.fetchBranches': 'Fetch branches',
'session.newWorktree.searchBranches': 'Search branches...',
'session.newWorktree.loadingBranches': 'Loading branches...',
'session.newWorktree.noBranchesFound': 'No branches found',
'session.newWorktree.matchingBranches': 'Matching branches',
'session.newWorktree.noMatchingBranches': 'No matching branches',
'session.newWorktree.localBranches': 'Local branches',
'session.newWorktree.remoteBranches': 'Remote branches',
'session.newWorktree.otherLocalBranches': 'Other local branches',
'session.newWorktree.otherRemoteBranches': 'Other remote branches',
'session.newWorktree.branchName': 'Branch Name',
'session.newWorktree.branchNamePlaceholder': 'feature/my-awesome-feature',
'session.newWorktree.actions.change': 'Change',
'session.newWorktree.actions.startFromGitHubIssuePr': 'Start from GitHub Issue/PR',
'session.newWorktree.usingPrBranch': 'Using PR branch: {branch}',
'session.newWorktree.fromIssue': 'From issue #{number}: {title}',
'session.newWorktree.worktreeDirectory': 'Worktree Directory',
'session.newWorktree.worktreeDirectoryPlaceholder': 'my-worktree-directory',
'session.newWorktree.resetToMatchBranchName': 'Reset to match branch name',
'session.newWorktree.sourceBranch': 'Source Branch',
'session.newWorktree.selectSourceBranch': 'Select Source Branch',
'session.newWorktree.selectSourceBranchPlaceholder': 'Select source branch...',
'session.newWorktree.newBranchFromSource': 'New branch will be created from {source}',
'session.newWorktree.issueNumber': 'Issue #{number}',
'session.newWorktree.prNumber': 'PR #{number}',
'session.newWorktree.includeDiffBadge': '+diff',
'session.newWorktree.newSessionTitle': 'New session',
'session.newWorktree.fromSource': 'from {source}',
'session.newWorktree.actions.cancel': 'Cancel',
'session.newWorktree.actions.creating': 'Creating...',
'session.newWorktree.actions.createWorktree': 'Create Worktree',
'session.newWorktree.actions.reset': 'Reset',
'session.newWorktree.error.noModelSelected': 'No model selected',
'session.newWorktree.error.noActiveProject': 'No active project',
'session.newWorktree.error.branchNameRequired': 'Branch name is required',
'session.newWorktree.error.worktreeDirectoryRequired': 'Worktree directory is required',
'session.newWorktree.error.sendGitHubContextFailed': 'Failed to send GitHub context',
'session.newWorktree.error.createWorktreeFailed': 'Failed to create worktree',
'session.newWorktree.toast.sessionFromIssue': 'Session created from issue',
'session.newWorktree.toast.sessionFromPr': 'Session created from PR',
'session.newWorktree.toast.worktreeCreated': 'Worktree created',
'session.newWorktree.toast.worktreeCreatedDescription': '{target} - bootstrapping in background',
'session.githubIntegration.title': 'Select from GitHub',
'session.githubIntegration.tabs.issues': 'Issues',
'session.githubIntegration.tabs.pullRequests': 'Pull Requests',
'session.githubIntegration.connect.title': 'Connect to GitHub',
'session.githubIntegration.connect.description': 'Link issues or pull requests to auto-fill worktree details',
'session.githubIntegration.connect.action': 'Connect GitHub',
'session.githubIntegration.search.issuesPlaceholder': 'Search using GitHub code search syntax',
'session.githubIntegration.search.prsPlaceholder': 'Search using GitHub code search syntax',
'session.githubIntegration.empty.noIssuesFound': 'No issues found',
'session.githubIntegration.empty.noPullRequestsFound': 'No pull requests found',
'session.githubIntegration.actions.loadMore': 'Load more',
'session.githubIntegration.actions.cancel': 'Cancel',
'session.githubIntegration.actions.select': 'Select',
'session.githubIntegration.selected.issueNumber': 'Issue #{number}',
'session.githubIntegration.selected.prNumber': 'PR #{number}',
'session.githubIntegration.includeDiffAria': 'Include PR diff in session context',
'session.githubIntegration.includeDiff': 'Include PR diff',
'session.githubIntegration.error.notConnected': 'GitHub not connected',
'session.githubIntegration.error.loadDataFailed': 'Failed to load data',
'session.githubIntegration.validation.branchAlreadyCheckedOut': 'Branch is already checked out in a worktree',
'session.githubIntegration.validation.branchAlreadyExists': 'Branch already exists locally',
'session.githubIntegration.validation.failed': 'Validation failed',
'chat.fileAttachment.toast.attachFailed': 'Failed to attach file',
'chat.fileAttachment.toast.someFilesSkipped': 'Some files were skipped:\n{summary}',
'chat.fileAttachment.toast.vscodePickFailed': 'Failed to pick files in VS Code',
'chat.fileAttachment.fileFallback': 'file',
'chat.fileAttachment.skippedFallback': 'skipped',
'chat.fileAttachment.actions.attachAria': 'Attach files',
'chat.fileAttachment.actions.attach': 'Attach files',
'chat.fileAttachment.actions.removeNamed': 'Remove {name}',
'chat.fileAttachment.actions.removeImage': 'Remove image',
'chat.fileAttachment.activeEditor.addFile': 'Add file:{name} to context',
'chat.fileAttachment.activeEditor.pinSelection': 'Pin selection to context',
'chat.fileAttachment.activeEditor.remove': 'Remove from context',
'chat.fileAttachment.openInDiagram': 'Open in diagram view',
'chat.pendingChanges.fileCountSingle': '{count} file',
'chat.pendingChanges.fileCountPlural': '{count} files',
'chat.pendingChanges.changedInWorkspace': 'changed in workspace',
'chat.changedFiles.title': 'Changed files',
'chat.changedFiles.actions.openFileTitle': 'Open {path}',
'chat.emptyState.opencodeUnreachable': 'OpenCode is not reachable',
'chat.emptyState.startNewChat': 'Start a new chat',
'chat.emptyState.draftTitle': 'What are we working on?',
'chat.emptyState.draftTitleWithProject': 'What are we working on in {project}?',
'chat.draftPresets.explore.label': 'Explore the codebase',
'chat.draftPresets.catchup.label': 'Catch me up',
'chat.draftPresets.weigh.label': 'Weigh my options',
'chat.draftPresets.plan.label': 'Start feature planning',
'chat.draftPresets.craftGoal.label': 'Craft a Goal',
'chat.draftPresets.scheduleTask.label': 'Schedule a Task',
'chat.draftPresets.debug.label': 'Debug an issue',
'chat.draftPresets.review.label': 'Review my changes',
'chat.draftStarters.add': 'Add a starter',
'chat.draftStarters.searchPlaceholder': 'Search commands and skills…',
'chat.draftStarters.empty': 'Nothing to add',
'chat.draftStarters.sectionBuiltIn': 'Built-in',
'chat.draftStarters.sectionCommands': 'Commands',
'chat.draftStarters.sectionSkills': 'Skills',
'chat.draftStarters.remove': 'Remove',
'chat.scrollToBottom.aria': 'Scroll to bottom',
'chat.promptNavigator.aria': 'Prompt navigation',
'chat.promptNavigator.currentPrompt': 'Current prompt',
'chat.promptNavigator.loadMore': 'Load more prompts',
'chat.timeline.relative.justNow': 'just now',
'chat.timeline.relative.minutesAgo': '{count}m ago',
'chat.timeline.relative.hoursAgo': '{count}h ago',
'chat.timeline.relative.daysAgo': '{count}d ago',
'chat.timeline.title': 'Conversation Timeline',
'chat.timeline.description': 'Navigate to any point in the conversation or fork a new session',
'chat.timeline.searchPlaceholder': 'Search messages...',
'chat.timeline.empty.search': 'No messages found',
'chat.timeline.empty.session': 'No messages in this session yet',
'chat.timeline.noTextContent': '[No text content]',
'chat.timeline.actions.title': 'Actions',
'chat.timeline.actions.revertFromHere': 'Revert from here',
'chat.timeline.actions.forkFromHere': 'Fork from here',
'chat.timeline.actions.previousTurn': 'Previous turn',
'chat.timeline.actions.latest': 'Latest',
'chat.timeline.help.clickMessage': 'Click on a message to scroll to it in the conversation',
'chat.timeline.help.undoToPoint': 'Undo to this point (message text will populate input)',
'chat.timeline.help.createSessionFromHere': 'Create a new session starting from here',
'chat.statusRow.todo.status.inProgress': 'In progress',
'chat.statusRow.todo.status.pending': 'Pending',
'chat.statusRow.todo.status.completed': 'Completed',
'chat.statusRow.todo.status.cancelled': 'Cancelled',
'chat.statusRow.todo.priority.high': 'High priority',
'chat.statusRow.todo.priority.medium': 'Medium priority',
'chat.statusRow.todo.priority.low': 'Low priority',
'chat.statusRow.actions.stopGeneratingAria': 'Stop generating',
'chat.statusRow.tasksTitle': 'Tasks',
'chat.statusRow.modelStatus': '{model} is {status}',
'chat.statusRow.summary.activeLeft': '{active} active · {left} left',
'chat.statusRow.aborted': 'Aborted',
'chat.revertIndicator.redo': 'Redo',
'chat.revertIndicator.redoAria': 'Redo — restore reverted messages',
'chat.revertPopover.title': 'Reverted',
'chat.revertPopover.noTextContent': 'No text content',
'chat.revertPopover.forkFromHere': 'Fork from here',
'chat.revertPopover.forkFromMessage': 'Fork from this message',
'chat.revertPopover.restoreAll': 'Restore all',
'chat.revertPopover.restore': 'Restore',
'chat.revertPopover.revert': 'Revert',
'chat.revertPopover.fork': 'Fork',
'chat.revert.toast.undo': 'Reverted to {preview}',
'chat.revert.toast.redo': 'Redone',
'chat.revert.toast.restored': 'Restored all messages',
'chat.toast.opencodeRestartInterrupted.title': 'Chat interrupted',
'chat.toast.opencodeRestartInterrupted.description': 'OpenCode restarted while a response was still running. Send a message to continue.',
'chat.toast.opencodeRestartInterrupted.openSession': 'Open session',
'chat.errorBoundary.title': 'Chat Error',
'chat.errorBoundary.description': 'The chat interface encountered an error. This might be due to a temporary network issue or corrupted message data.',
'chat.errorBoundary.sessionLabel': 'Session',
'chat.errorBoundary.detailsSummary': 'Error details',
'chat.errorBoundary.resetAction': 'Reset Chat',
'chat.errorBoundary.persistentHint': 'If the problem persists, try refreshing the page.',
'chat.autocomplete.tabs.commands': 'Commands',
'chat.autocomplete.tabs.agents': 'Agents',
'chat.autocomplete.tabs.files': 'Files',
'chat.autocomplete.keyboardHint': '↑↓ navigate • Enter select • Esc close',
'chat.commandAutocomplete.command.initDescription': 'Create/update AGENTS.md file',
'chat.commandAutocomplete.command.undoDescription': 'Undo the last message',
'chat.commandAutocomplete.command.redoDescription': 'Redo previously undone messages',
'chat.commandAutocomplete.command.timelineDescription': 'Open the conversation timeline',
'chat.commandAutocomplete.command.compactDescription': 'Compress session history using AI to reduce context size',
'chat.commandAutocomplete.command.summaryDescription': 'Non-destructive session summary. Optional topic hint after the command.',
'chat.commandAutocomplete.command.workspaceReviewDescription': 'Review the workspace diff for intent, correctness, and adequacy, graded by severity.',
'chat.commandAutocomplete.command.handoffReviewDescription': 'Create or reuse a separate review session from a generated handoff.',
'chat.commandAutocomplete.command.featurePlanDescription': 'Start a guided, back-and-forth planning session for a new feature.',
'chat.commandAutocomplete.command.craftGoalDescription': 'Turn an idea or task into a clear, verifiable Goal.',
'chat.commandAutocomplete.command.scheduleTaskDescription': 'Define a scheduled task through a guided dialogue.',
'chat.chatInput.toast.craftGoalFailed': 'Failed to start Goal crafting',
'chat.chatInput.toast.scheduleTaskFailed': 'Failed to start scheduled task setup',
'chat.commandAutocomplete.command.catchUpDescription': 'Re-establish context: what you were doing and where to pick up.',
'chat.commandAutocomplete.command.debugDescription': 'Guided root-cause investigation for a bug before proposing a fix.',
'chat.commandAutocomplete.command.weighDescription': 'Weigh 2-3 approaches with trade-offs and a recommendation before you commit.',
'chat.commandAutocomplete.command.exploreDescription': 'Get oriented in this codebase: a high-level tour of the architecture and main parts.',
'chat.commandAutocomplete.badge.skill': 'skill',
'chat.commandAutocomplete.badge.command': 'command',
'chat.commandAutocomplete.badge.system': 'system',
'chat.commandAutocomplete.empty': 'No commands found',
'chat.agentMentionAutocomplete.badge.system': 'system',
'chat.agentMentionAutocomplete.empty': 'No agents found',
'chat.fileMentionAutocomplete.searchMoreAgents': 'Type to search more agents',
'chat.fileMentionAutocomplete.empty': 'No matches found',
'chat.queuedMessage.attachments': '+{count} file(s)',
'chat.queuedMessage.empty': '(empty)',
'chat.queuedMessage.title': 'Queued messages',
'chat.queuedMessage.edit': 'edit',
'chat.queuedMessage.send': 'send',
'chat.queuedMessage.removeAria': 'Remove from queue',
'chat.queuedMessage.reorderAria': 'Drag to reorder',
'chat.container.returnToParent.aria': 'Return to parent session',
'chat.container.returnToParent.titleNamed': 'Return to: {title}',
'chat.container.returnToParent.title': 'Return to parent session',
'chat.container.returnToParent.label': 'Parent',
'chat.container.readOnlySubagentPromptBanner': 'Subagent sessions cannot be prompted.',
'chat.container.sessionLoadError.title': 'Session could not be loaded',
'chat.container.sessionLoadError.description': 'Check the connection and try loading this session again.',
'chat.container.sessionLoadError.retry': 'Try again',
'sessions.sidebar.group.empty.loadingSessions': 'Loading sessions…',
'sessions.sidebar.group.empty.loadFailed': 'Could not refresh sessions.',
'sessions.sidebar.group.empty.retry': 'Try again',
'sessions.sidebar.group.empty.permissionDenied': 'Folder access is required.',
'sessions.sidebar.group.empty.grantAccess': 'Grant access',
'chat.unifiedControls.title': 'Controls',
'chat.unifiedControls.model.title': 'Model',
'chat.unifiedControls.model.noRecent': 'No recent models',
'chat.unifiedControls.model.moreAria': 'More models',
'chat.unifiedControls.effort.title': 'Effort',
'chat.unifiedControls.effort.moreAria': 'More effort options',
'chat.questionCard.summaryTab': 'Summary',
'chat.questionCard.noAnswer': '(no answer)',
'chat.questionCard.inputNeeded': 'Input needed',
'chat.questionCard.fromSubagent': 'From subagent',
'chat.questionCard.questionFallback': 'Question {index}',
'chat.questionCard.selectMultiple': 'Select multiple',
'chat.questionCard.recommended': 'recommended',
'chat.questionCard.other': 'Other…',
'chat.questionCard.yourAnswer': 'Your answer',
'chat.questionCard.submit': 'Submit',
'chat.questionCard.next': 'Next',
'chat.questionCard.dismiss': 'Dismiss',
'chat.questionCard.copyMarkdown': 'Copy as Markdown',
'chat.questionCard.copyJson': 'Copy as JSON',
'chat.questionCard.copiedMarkdown': 'Question copied as Markdown',
'chat.questionCard.copiedJson': 'Question copied as JSON',
'chat.questionCard.copyFailed': 'Failed to copy question',
'chat.questionCard.submitFailed': 'Failed to send response',
'chat.questionCard.dismissFailed': 'Failed to dismiss question',
'chat.questionCard.noLongerPending': 'This question is no longer waiting for a response.',
'chat.questionCard.tryAgain': 'Please try again in a moment.',
'chat.textSelection.toast.noProject': 'No project found for this session',
'chat.textSelection.toast.addToNotesFailed': 'Failed to add to notes',
'chat.textSelection.toast.addToNotesSuccess': 'Added selected text to notes',
'chat.textSelection.toast.addToNotesSummaryFailed': 'Could not summarize selection, added selected text to notes',
'chat.textSelection.actions.addToChat': 'Add to chat',
'chat.textSelection.actions.newSession': 'New session',
'chat.textSelection.actions.copy': 'Copy',
'chat.textSelection.actions.addToNotes': 'Add to notes',
'chat.textSelection.title.addToCurrentChat': 'Add to current chat',
'chat.textSelection.title.newSessionWithSelection': 'Create new session with selection',
'chat.textSelection.title.saveInsightToNotes': 'Save selected text to notes',
'chat.messageBody.actions.revertAria': 'Revert to this message',
'chat.messageBody.actions.revert': 'Revert from here',
'chat.messageBody.actions.forkAria': 'Fork from this message',
'chat.messageBody.actions.fork': 'Fork from here',
'chat.messageBody.actions.copyMessageAria': 'Copy message text',
'chat.messageBody.actions.copyMessage': 'Copy message',
'chat.messageBody.actions.pinContext': 'Pin into context (survives compaction)',
'chat.messageBody.actions.unpinContext': 'Unpin from context (will not survive compaction)',
'chat.messageBody.actions.contextPinFailed': 'Could not update the context pin',
'chat.messageBody.actions.openPreviewAria': 'Open preview',
'chat.messageBody.actions.openPreview': 'Open preview',
'chat.messageBody.actions.copyAnswer': 'Copy answer',
'chat.messageBody.actions.savingImage': 'Saving image...',
'chat.messageBody.actions.saveAsImage': 'Save as image',
'chat.messageBody.actions.saveAsPlan': 'Save as plan',
'chat.messageBody.actions.startNewSession': 'Start new session from this answer',
'chat.messageBody.actions.startNewMultiRun': 'Start new multi-run from this answer',
'chat.messageBody.forkDialog.instructions.label': 'Instructions',
'chat.messageBody.forkDialog.instructions.placeholder': 'Add instructions for the new session…',
'chat.messageBody.forkDialog.createWorktree': 'Create worktree',
'chat.generatedResult.actions.copy': 'Copy',
'chat.generatedResult.actions.copied': 'Copied',
'chat.generatedResult.commit.title': 'Generated commit message',
'chat.generatedResult.commit.highlights': 'Highlights',
'chat.generatedResult.pullRequest.title': 'Generated pull request',
'chat.generatedResult.pullRequest.titleLabel': 'Title',
'chat.generatedResult.pullRequest.bodyLabel': 'Body',
'chat.messageBody.tts.stopSpeaking': 'Stop speaking',
'chat.messageBody.tts.readAloud': 'Read aloud',
'chat.messageBody.tts.readAloudWithProvider': 'Read aloud ({provider} voice)',
'planView.tts.readAloud': 'Read plan aloud',
'planView.tts.stopSpeaking': 'Stop speaking',
'filesView.tts.readAloud': 'Read file aloud',
'filesView.tts.stopSpeaking': 'Stop speaking',
'chat.messageBody.toast.noProject': 'No project found for this session',
'chat.messageBody.toast.savePlanFailed': 'Failed to save plan',
'chat.messageBody.toast.planSaved': 'Plan saved',
'chat.messageBody.toast.imageSaved': 'Image saved',
'chat.messageBody.toast.generateImageFailed': 'Failed to generate image',
'chat.chatInput.actions.commands': 'Commands',
'chat.chatInput.actions.attachFiles': 'Attach files',
'chat.chatInput.actions.addAttachment': 'Add attachment',
'chat.chatInput.actions.linkGithubIssue': 'Link GitHub Issue',
'chat.chatInput.actions.linkGithubPr': 'Link GitHub PR',
'chat.chatInput.actions.modelAgentSettings': 'Model and agent settings',
'chat.chatInput.actions.sendMessageAria': 'Send message',
'chat.chatInput.actions.queueMessageAria': 'Queue message',
'chat.chatInput.actions.stopGeneratingAria': 'Stop generating',
'chat.chatInput.focusMode.toggleAria': 'Toggle focus mode',
'chat.chatInput.focusMode.label': 'Focus mode',
'chat.chatInput.permissionAutoAccept.disable': 'Disable permission auto-accept',
'chat.chatInput.permissionAutoAccept.enable': 'Enable permission auto-accept',
'chat.chatInput.permissionAutoAccept.on': 'Permission auto-accept: on',
'chat.chatInput.permissionAutoAccept.off': 'Permission auto-accept: off',
'chat.chatInput.linked.byAuthor': 'by {author}',
'chat.chatInput.linked.issue.openInBrowserAria': 'Open issue in browser',
'chat.chatInput.linked.issue.removeAria': 'Remove linked issue',
'chat.chatInput.linked.pr.number': 'PR #{number}',
'chat.chatInput.linked.pr.openInBrowserAria': 'Open pull request in browser',
'chat.chatInput.linked.pr.removeAria': 'Remove linked pull request',
'chat.chatInput.placeholder.shell': 'Enter shell command...',
'chat.chatInput.placeholder.chat': '@ for files/agents; / for commands and skills; ! for shell; # for snippets',
'chat.chatInput.placeholder.chatCompact': 'Use @ / ! # for helpers',
'chat.chatInput.placeholder.selectSession': 'Select or create a session to start chatting',
'chat.dictation.start': 'Start dictation',
'chat.dictation.overlayAria': 'Dictation',
'chat.dictation.downloadingModel': 'Downloading speech model...',
'chat.dictation.downloadingModelProgress': 'Downloading speech model... {percent}%',
'chat.dictation.listening': 'Listening...',
'chat.dictation.processing': 'Transcribing...',
'chat.dictation.failed': 'Transcription failed',
'chat.dictation.cancel': 'Discard dictation',
'chat.dictation.insert': 'Insert transcript',
'chat.dictation.insertAndSend': 'Insert and send',
'chat.dictation.retry': 'Retry transcription',
'chat.dictation.discard': 'Discard recording',
'chat.snippetAutocomplete.action.addNew': '+ Add new snippet',
'chat.snippetAutocomplete.empty': 'No snippets found',
'chat.snippetAutocomplete.footer': '↑↓ navigate • Enter select • Esc close',
'snippets.source.global': 'global',
'snippets.source.project': 'project',
'chat.chatInput.toast.compactFailed': 'Failed to compact session',
'chat.chatInput.toast.summaryFailed': 'Failed to generate summary',
'chat.messageBody.actions.sendReviewFeedback': 'Send review feedback to implementing agent',
'chat.messageBody.actions.sendImplementationResponse': 'Send implementation response to reviewing agent',
'chat.chatInput.toast.reviewFailed': 'Failed to review changes',
'chat.chatInput.toast.planFeatureFailed': 'Failed to start feature planning',
'chat.chatInput.toast.catchUpFailed': 'Failed to catch up',
'chat.chatInput.toast.debugFailed': 'Failed to start debugging',
'chat.chatInput.toast.weighFailed': 'Failed to weigh options',
'chat.chatInput.toast.exploreFailed': 'Failed to start the tour',
'chat.chatInput.toast.attachmentsTooLarge': 'Attachments are too large to send. Please try reducing the number or size of images.',
'chat.chatInput.toast.sendAttachmentsFailed': 'Failed to send attachments. Try fewer files or smaller images.',
'chat.chatInput.toast.messageSendFailed': 'Message failed to send. Attachments restored.',
'chat.chatInput.toast.clipboardAttachFailed': 'Failed to attach image from clipboard',
'chat.chatInput.toast.addedFileMentions': 'Added {count} file mention(s)',
'chat.chatInput.toast.attachFileFailed': 'Failed to attach file',
'chat.chatInput.toast.attachNamedFailed': 'Failed to attach {name}',
'chat.chatInput.toast.unsupportedAttachmentModalities': '{model} does not support {modalities} input required by {files}. You can still send the message, but these attachments may be ignored.',
'chat.chatInput.toast.someFilesSkipped': 'Some files were skipped:\n{summary}',
'chat.chatInput.toast.vscodePickFailed': 'Failed to pick files in VS Code',
'chat.chatInput.toast.openSessionFirst': 'Open a session first',
'chat.chatInput.toast.togglePermissionAutoAcceptFailed': 'Failed to toggle permission auto-accept',
'chat.chatInput.reviewComments': 'Review comments:',
'chat.chatInput.reviewCommentsRemove': 'Remove review comments',
'chat.chatInput.devServerLogs': 'Dev Server logs:',
'chat.chatInput.devServerLogsRemove': 'Remove Dev Server logs',
'chat.chatInput.previewAnnotations': 'Preview annotations:',
'chat.chatInput.previewContext': 'Preview context:',
'chat.chatInput.previewContextRemove': 'Remove preview context',
'chat.chatInput.projectRoot': 'Project root',
'chat.chatInput.branch': 'Branch',
'chat.chatInput.draftPicker.projectTitle': 'Project',
'chat.chatInput.draftPicker.searchProjects': 'Search projects...',
'chat.chatInput.draftPicker.searchBranches': 'Search branches...',
'chat.chatInput.worktrees': 'Worktrees',
'chat.chatInput.worktreeNew': '+ New',
'chat.chatInput.drop.insertMention': 'Drop to insert as mention',
'chat.chatInput.drop.attachFiles': 'Drop files here to attach',
'chat.chatInput.fileFallback': 'file',
'chat.toolOutputDialog.image.previousAria': 'Previous image',
'chat.toolOutputDialog.image.nextAria': 'Next image',
'chat.toolOutputDialog.image.closeAria': 'Close image preview',
'chat.toolOutputDialog.mermaid.missingSource': 'Missing Mermaid source URL.',
'chat.toolOutputDialog.mermaid.loadFailed': 'Unable to load Mermaid diagram.',
'chat.toolOutputDialog.mermaid.dataUrlMalformed': 'The Mermaid data URL is malformed.',
'chat.toolOutputDialog.mermaid.invalidLocalPath': 'The local Mermaid file path is invalid.',
'chat.toolOutputDialog.mermaid.readFileFailedWithStatus': 'Unable to read Mermaid file. Status: {status}.',
'chat.toolOutputDialog.mermaid.unsupportedUrlProtocol': 'The Mermaid URL protocol is unsupported.',
'chat.toolOutputDialog.mermaid.loadFailedWithStatus': 'Unable to load Mermaid diagram. Status: {status}.',
'chat.toolOutputDialog.mermaid.closeAria': 'Close diagram preview',
'chat.toolOutputDialog.mermaid.loading': 'Loading diagram...',
'chat.toolOutputDialog.mermaid.renderFailed': 'Unable to render Mermaid diagram.',
'chat.toolOutputDialog.mermaid.retry': 'Retry',
'chat.toolOutputDialog.commandCompleted': 'Command completed successfully',
'chat.toolOutputDialog.noOutputProduced': 'No output was produced',
'chat.toolPart.lspErrors': 'LSP errors',
'chat.toolPart.moreErrors': '+{count} more errors',
'chat.toolPart.error': 'Error:',
'chat.toolPart.awaitingResponse': 'Awaiting response...',
'chat.toolPart.noOutputProduced': 'No output produced',
'chat.toolPart.output': 'Output',
'chat.toolPart.showRawJson': 'Show raw JSON',
'chat.toolPart.showFormattedJson': 'Show formatted JSON',
'chat.toolPart.showNavigableJson': 'Show navigable JSON',
'chat.toolPart.openFileAtFirstChange': 'Open file at first change',
'chat.toolPart.openFileDiff': 'Open file diff',
'chat.toolPart.copyOutput': 'Copy output',
'chat.toolPart.copiedOutput': 'Copied output',
'chat.toolPart.copyOutputFailed': 'Failed to copy output',
'chat.toolPart.openSubtask': 'Open {type} subtask',
'chat.todo.total': 'Total',
'chat.todo.inProgress': 'In Progress',
'chat.todo.pending': 'Pending',
'chat.todo.completed': 'Completed',
'chat.todo.cancelled': 'Cancelled',
'chat.permissionCard.workingDirectory': 'Working Directory:',
'chat.permissionCard.timeout': 'Timeout:',
'chat.permissionCard.request': 'Request:',
'chat.permissionCard.headers': 'Headers:',
'chat.permissionCard.body': 'Body:',
'chat.permissionCard.action': 'Action:',
'chat.permissionCard.details': 'Details:',
'chat.permissionCard.patterns': 'Patterns:',
'chat.permissionToast.sessionFallback': 'Session',
'chat.permissionToast.permissionFallback': 'Permission details unavailable',
'chat.permissionToast.labels.session': 'Session:',
'chat.permissionToast.labels.permission': 'Permission:',
'chat.permissionToast.actions.once': 'Once',
'chat.permissionToast.actions.always': 'Always',
'chat.permissionToast.actions.deny': 'Deny',
'chat.permissionToast.actions.approveOnceAria': 'Approve once',
'chat.permissionToast.actions.approveOnceAriaWithSession': 'Approve once for {session}',
'chat.permissionToast.actions.approveAlwaysAria': 'Approve always',
'chat.permissionToast.actions.approveAlwaysAriaWithSession': 'Approve always for {session}',
'chat.permissionToast.actions.denyAria': 'Deny permission',
'chat.permissionToast.actions.denyAriaWithSession': 'Deny permission for {session}',
'chat.permissionRequest.required': 'Permission required:',
'chat.permissionRequest.actions.once': 'Once',
'chat.permissionRequest.actions.always': 'Always',
'chat.permissionRequest.actions.reject': 'Reject',
'chat.modelControls.provider': 'Provider',
'chat.modelControls.capability.toolCalling': 'Tool calling',
'chat.modelControls.capability.reasoning': 'Reasoning',
'chat.modelControls.modality.text': 'Text',
'chat.modelControls.modality.image': 'Image',
'chat.modelControls.modality.video': 'Video',
'chat.modelControls.modality.audio': 'Audio',
'chat.modelControls.modality.pdf': 'PDF',
'chat.modelControls.capabilities': 'Capabilities',
'chat.modelControls.modalities': 'Modalities',
'chat.modelControls.input': 'Input',
'chat.modelControls.output': 'Output',
'chat.modelControls.limits': 'Limits',
'chat.modelControls.context': 'Context',
'chat.modelControls.metadata': 'Metadata',
'chat.modelControls.knowledge': 'Knowledge',
'chat.modelControls.release': 'Release',
'chat.modelControls.mode': 'Mode',
'chat.modelControls.model': 'Model',
'chat.modelControls.temperature': 'Temperature',
'chat.modelControls.topP': 'Top P',
'chat.modelControls.permissions': 'Permissions',
'chat.modelControls.edit': 'Edit',
'chat.modelControls.bash': 'Bash',
'chat.modelControls.webFetch': 'WebFetch',
'chat.modelControls.customPrompt': 'Custom Prompt',
'chat.modelControls.selectModel': 'Select model',
'chat.modelControls.searchProvidersOrModels': 'Search providers or models',
'chat.modelControls.clearSearch': 'Clear search',
'chat.modelControls.current': 'Current',
'chat.modelControls.thinking': 'Thinking',
'chat.modelControls.default': 'Default',
'chat.modelControls.selectAgent': 'Select agent',
'chat.modelControls.costPerMillion': 'Cost ($/1M tokens)',
'chat.modelControls.metadataUnavailable': 'Model metadata unavailable.',
'chat.modelControls.addNewProvider': 'Add new provider',
'chat.modelControls.noAgentSelected': 'No agent selected.',
'chat.modelControls.resetToDefault': 'Reset to default',
'chat.modelControls.searchModels': 'Search models',
'chat.modelControls.searchAgents': 'Search agents',
'chat.modelControls.noModelsFound': 'No models found',
'chat.modelControls.favorites': 'Favorites',
'chat.modelControls.recent': 'Recent',
'chat.modelControls.addToFavorites': 'Add to favorites',
'chat.modelControls.removeFromFavorites': 'Remove from favorites',
'chat.modelControls.favoriteAria': 'Favorite',
'chat.modelControls.unfavoriteAria': 'Unfavorite',
'chat.modelControls.collapseProvider': 'Collapse provider',
'chat.modelControls.expandProvider': 'Expand provider',
'chat.modelControls.keyboardHint': '↑↓ navigate{thinking} • Enter select • Esc close',
'chat.modelControls.keyboardHintNavigate': '↑↓ navigate',
'chat.modelControls.keyboardHintSwitchAgent': '{shortcut} switch agent',
'chat.modelControls.keyboardHintThinking': '←→ thinking',
'chat.modelControls.showThinkingModes': 'Show thinking modes',
'chat.modelControls.hideThinkingModes': 'Hide thinking modes',
'chat.modelControls.moreThinkingModes': 'More thinking modes',
'chat.modelControls.noProvidersOrModelsFound': 'No providers or models match your search.',
'chat.modelControls.reorderFavoriteAria': 'Reorder favorite',
'chat.modelControls.reorderFavoriteTitle': 'Drag to reorder favorite',
'chat.modelControls.reorderProviderTitle': 'Drag to reorder provider',
'chat.modelControls.permissionLabel.custom': 'Custom',
'chat.modelControls.permissionLabel.allow': 'Allow',
'chat.modelControls.permissionLabel.deny': 'Deny',
'chat.modelControls.permissionLabel.ask': 'Ask',
'chat.modelControls.modeValue.primary': 'Primary',
'chat.modelControls.modeValue.subagent': 'Subagent',
'chat.modelControls.modeValue.all': 'All',
'chat.modelControls.modeValue.none': '—',
'chat.reasoningTrace.thinking': 'Thinking',
'chat.reasoningTrace.justification': 'Justification',
'chat.reasoningTrace.expandAria': 'Expand reasoning trace',
'chat.reasoningTrace.collapseAria': 'Collapse reasoning trace',
'chat.reasoningTrace.thought': 'Thought',
'chat.messageBody.subtask.title': 'Delegated task',
'chat.messageBody.subtask.hidePrompt': 'Hide prompt',
'chat.messageBody.subtask.showPrompt': 'Show prompt',
'chat.messageBody.subtask.openSession': 'Open subtask session',
'chat.messageBody.shellCommand.title': 'Shell command',
'chat.messageBody.shellCommand.hideOutput': 'Hide output',
'chat.messageBody.shellCommand.showOutput': 'Show output',
'chat.messageBody.shellCommand.copied': 'Copied',
'chat.messageBody.shellCommand.copyOutput': 'Copy output',
'commandPalette.title': 'Command Palette',
'commandPalette.description': 'Search files, sessions, and commands.',
'commandPalette.input.placeholder': 'Search files, sessions, commands...',
'commandPalette.empty.noResults': 'No results found.',
'commandPalette.empty.searchingFiles': 'Searching files...',
'commandPalette.item.newSession': 'New Session',
'commandPalette.item.newMiniChat': 'New Mini Chat Window',
'commandPalette.item.newWorktreeDraft': 'New Worktree Draft',
'commandPalette.item.addProject': 'Add Project',
'commandPalette.item.showSessionSwitcher': 'Show Session Switcher',
'commandPalette.item.toggleSidebar': 'Toggle Sidebar',
'commandPalette.item.showContextUsage': 'Show Context Usage',
'commandPalette.item.toggleTerminal': 'Toggle Terminal',
'commandPalette.item.openSettings': 'Open Settings...',
'commandPalette.session.untitled': 'Untitled Session',
'openCodeStatusDialog.title': 'OpenCode Status',
'openCodeStatusDialog.description': 'Inspect current OpenCode status and diagnostics.',
'openCodeStatusDialog.actions.copy': 'Copy',
'openCodeStatusDialog.empty.noData': 'No data.',
'openCodeStatusDialog.toast.copiedTitle': 'Copied',
'openCodeStatusDialog.toast.copiedDescription': 'Status copied to clipboard',
'openCodeStatusDialog.toast.copyFailed': 'Failed to copy status',
'saveProjectPlanDialog.title': 'Save Project Plan',
'saveProjectPlanDialog.description': 'Save this plan into your project as a Markdown file.',
'saveProjectPlanDialog.field.title': 'Title',
'saveProjectPlanDialog.field.titlePlaceholder': 'Plan title',
'saveProjectPlanDialog.field.contentPreview': 'Content preview',
'saveProjectPlanDialog.actions.cancel': 'Cancel',
'saveProjectPlanDialog.actions.save': 'Save',
'saveProjectPlanDialog.actions.saving': 'Saving...',
'branchPickerDialog.title': 'Branch Picker',
'branchPickerDialog.description.localBranchesForProject': 'Local branches for {project}',
'branchPickerDialog.description.selectProject': 'Select a project to view branches',
'branchPickerDialog.search.placeholder': 'Search branches...',
'branchPickerDialog.search.renameBranchPlaceholder': 'Rename branch',
'branchPickerDialog.state.noProjectSelected': 'No project selected',
'branchPickerDialog.state.loadingBranches': 'Loading branches...',
'branchPickerDialog.state.noMatchingBranches': 'No matching branches',
'branchPickerDialog.state.noBranchesFound': 'No branches found',
'branchPickerDialog.badge.head': 'HEAD',
'branchPickerDialog.badge.worktree': 'worktree',
'branchPickerDialog.actions.createWorktreeAria': 'Create worktree from branch',
'branchPickerDialog.actions.renameAria': 'Rename branch',
'branchPickerDialog.actions.deleteAria': 'Delete branch',
'branchPickerDialog.actions.deleteWorktreeAria': 'Remove worktree',
'branchPickerDialog.actions.confirmRenameAria': 'Confirm rename',
'branchPickerDialog.actions.cancelRenameAria': 'Cancel rename',
'branchPickerDialog.actions.confirmDeleteAria': 'Confirm delete branch',
'branchPickerDialog.actions.cancelDeleteAria': 'Cancel delete branch',
'branchPickerDialog.actions.deletePrompt': 'Delete',
'branchPickerDialog.actions.forceDeletePrompt': 'Force Delete',
'branchPickerDialog.tooltip.createWorktree': 'Create worktree',
'branchPickerDialog.tooltip.worktreeAlreadyExists': 'Worktree already exists',
'branchPickerDialog.tooltip.rename': 'Rename branch',
'branchPickerDialog.tooltip.renameDisabledForRoot': 'Cannot rename root branch',
'branchPickerDialog.tooltip.delete': 'Delete branch',
'branchPickerDialog.tooltip.deleteCurrentBranch': 'Cannot delete current branch',
'branchPickerDialog.tooltip.deleteDisabledForRoot': 'Cannot delete root branch',
'branchPickerDialog.tooltip.deleteWorktree': 'Remove worktree',
'branchPickerDialog.tooltip.deleteWorktreeRootProtected': 'Cannot remove root worktree',
'branchPickerDialog.toast.branchRenamed': 'Branch renamed',
'branchPickerDialog.toast.failedToRenameBranch': 'Failed to rename branch',
'branchPickerDialog.toast.branchDeleted': 'Branch deleted',
'branchPickerDialog.toast.branchNotMerged': 'Branch is not fully merged',
'branchPickerDialog.toast.confirmAgainToForceDelete': 'Confirm again to force delete',
'branchPickerDialog.toast.failedToDeleteBranch': 'Failed to delete branch',
'branchPickerDialog.toast.worktreeCreated': 'Worktree created',
'branchPickerDialog.toast.failedToCreateWorktree': 'Failed to create worktree',
'branchPickerDialog.error.failedToLoad': 'Failed to load branches',
'branchPickerDialog.error.renameRejected': 'Rename was rejected',
'branchPickerDialog.error.renameFailed': 'Failed to rename branch',
'branchPickerDialog.error.deleteRejected': 'Delete was rejected',
'branchPickerDialog.error.deleteFailed': 'Failed to delete branch',
'branchPickerDialog.error.createWorktreeFailed': 'Failed to create worktree',
'projectEditDialog.title': 'Edit project',
'projectEditDialog.field.name': 'Name',
'projectEditDialog.field.namePlaceholder': 'Project name',
'projectEditDialog.field.color': 'Color',
'projectEditDialog.field.icon': 'Icon',
'projectEditDialog.field.preview': 'Preview',
'projectEditDialog.field.iconBackground': 'Icon Background',
'projectEditDialog.field.iconBackgroundAria': 'Project icon background color',
'projectEditDialog.option.none': 'None',
'projectEditDialog.actions.uploadIcon': 'Upload Icon',
'projectEditDialog.actions.uploading': 'Uploading...',
'projectEditDialog.actions.discoverFavicon': 'Discover Favicon',
'projectEditDialog.actions.discovering': 'Discovering...',
'projectEditDialog.actions.removeProjectIcon': 'Remove Project Icon',
'projectEditDialog.actions.removing': 'Removing...',
'projectEditDialog.actions.undoRemove': 'Undo Remove',
'projectEditDialog.actions.clear': 'Clear',
'projectEditDialog.actions.cancel': 'Cancel',
'projectEditDialog.actions.save': 'Save',
'projectEditDialog.toast.failedToUploadIcon': 'Failed to upload project icon',
'projectEditDialog.toast.iconUpdated': 'Project icon updated',
'projectEditDialog.toast.failedToRemoveIcon': 'Failed to remove project icon',
'projectEditDialog.toast.iconRemoved': 'Project icon removed',
'projectEditDialog.toast.failedToDiscoverIcon': 'Failed to discover project icon',
'projectEditDialog.toast.customIconAlreadySet': 'Custom icon already set for this project',
'projectEditDialog.toast.iconDiscovered': 'Project icon discovered',
'agentManager.sidebar.search.placeholder': 'Search Agent Groups...',
'agentManager.sidebar.actions.newAgentGroup': 'New Agent Group',
'agentManager.sidebar.actions.more': '... More ({count})',
'agentManager.sidebar.actions.showLess': 'Show less',
'agentManager.sidebar.section.agentGroups': 'Agent Groups',
'agentManager.sidebar.state.loading': 'Loading...',
'agentManager.sidebar.state.noGroupsFound': 'No groups found',
'agentManager.sidebar.state.noGroupsYet': 'No agent groups yet',
'agentManager.sidebar.state.createToGetStarted': 'Create a new agent group to get started',
'agentManager.sidebar.item.modelCountSingle': '{count} model',
'agentManager.sidebar.item.modelCountPlural': '{count} models',
'agentManager.sidebar.item.groupMenuAria': 'Group menu',
'agentManager.sidebar.item.delete': 'Delete',
'agentManager.sidebar.relativeTime.now': 'now',
'agentManager.sidebar.relativeTime.minutes': '{count}m',
'agentManager.sidebar.relativeTime.hours': '{count}h',
'agentManager.sidebar.relativeTime.days': '{count}d',
'agentManager.sidebar.dialog.deleteGroupTitle': 'Delete agent group',
'agentManager.sidebar.dialog.deleteGroupDescription': 'Delete "{group}"? This removes all worktrees and sessions in this group.',
'agentManager.sidebar.dialog.cancel': 'Cancel',
'agentManager.sidebar.dialog.delete': 'Delete',
'agentManager.sidebar.dialog.deleting': 'Deleting...',
'agentManager.sidebar.toast.deletingGroup': 'Deleting "{group}"...',
'agentManager.sidebar.toast.deletedGroup': 'Deleted "{group}"',
'agentManager.sidebar.toast.failedToDeleteGroup': 'Failed to fully delete "{group}"',
'agentManager.detail.header.modelCountSingle': '{count} model',
'agentManager.detail.header.modelCountPlural': '{count} models',
'agentManager.detail.header.noBranch': 'No branch',
'agentManager.detail.actions.worktreeActionsAria': 'Worktree actions',
'agentManager.detail.actions.removeThisWorktree': 'Remove this worktree',
'agentManager.detail.actions.keepThisRemoveOthers': 'Leave this one, remove others',
'agentManager.detail.actions.copyWorktreePath': 'Copy Worktree Path',
'agentManager.detail.dialog.removeWorktreeTitle': 'Remove worktree',
'agentManager.detail.dialog.removeOtherWorktreesTitle': 'Remove other worktrees',
'agentManager.detail.dialog.removeWorktreeDescription': 'Remove "{label}"? This deletes all sessions in that worktree and removes the worktree itself.',
'agentManager.detail.dialog.removeOtherWorktreesDescription': 'Keep "{label}" and remove the other worktrees in "{group}".',
'agentManager.detail.dialog.cancel': 'Cancel',
'agentManager.detail.dialog.remove': 'Remove',
'agentManager.detail.dialog.removeOthers': 'Remove others',
'agentManager.detail.dialog.working': 'Working...',
'agentManager.detail.state.loadingSessionFor': 'Loading session for {label}',
'agentManager.detail.state.sessionId': 'Session ID: {id}',
'agentManager.detail.state.noSessionsInGroup': 'No sessions in this group',
'agentManager.detail.toast.noWorktreePath': 'No worktree path available',
'agentManager.detail.toast.worktreePathCopied': 'Worktree path copied',
'agentManager.detail.toast.failedToCopyPath': 'Failed to copy path',
'agentManager.detail.toast.removingWorktree': 'Removing worktree...',
'agentManager.detail.toast.removingOtherWorktrees': 'Removing other worktrees...',
'agentManager.detail.toast.failedToFullyRemoveWorktree': 'Failed to fully remove worktree',
'agentManager.detail.toast.worktreeRemoved': 'Worktree removed',
'agentManager.detail.toast.otherWorktreesRemoved': 'Removed other worktrees',
'agentManager.empty.groupName.label': 'Group Name',
'agentManager.empty.groupName.placeholder': 'e.g. feature-auth, bugfix-login',
'agentManager.empty.groupName.description': 'Used for worktree directory and branch naming',
'agentManager.empty.baseBranch.label': 'Base Branch',
'agentManager.empty.baseBranch.description': 'Creates new branches from {branch}',
'agentManager.empty.setupCommands.label': 'Setup commands',
'agentManager.empty.setupCommands.configured': '{count} configured',
'agentManager.empty.setupCommands.description': 'Commands run in each new worktree. Use $ROOT_PROJECT_PATH for project root.',
'agentManager.empty.setupCommands.loading': 'Loading...',
'agentManager.empty.setupCommands.commandPlaceholder': 'e.g., bun install',
'agentManager.empty.setupCommands.removeCommandAria': 'Remove command',
'agentManager.empty.setupCommands.addCommand': 'Add command',
'agentManager.empty.agent.label': 'Agent',
'agentManager.empty.agent.description': 'Defaults to your configured default agent',
'agentManager.empty.models.label': 'Models',
'agentManager.empty.models.addModel': 'Add model',
'agentManager.empty.models.selectedSingle': '{count} model selected',
'agentManager.empty.models.selectedPlural': '{count} models selected',
'agentManager.empty.prompt.label': 'Prompt',
'agentManager.empty.prompt.placeholder': 'Ask anything...',
'agentManager.empty.prompt.addAttachmentAria': 'Add attachment',
'agentManager.empty.actions.startAgentGroupAria': 'Start Agent Group',
'agentManager.empty.toast.fileTooLarge': 'File "{fileName}" is too large (max 10MB)',
'agentManager.empty.toast.failedToAttach': 'Failed to attach "{fileName}"',
'agentManager.empty.toast.attachedSingle': 'Attached {count} file',
'agentManager.empty.toast.attachedPlural': 'Attached {count} files',
'agentManager.empty.toast.failedToCreateGroup': 'Failed to create agent group',
'openInApp.actions.open': 'Open',
'openInApp.actions.openInAria': 'Open in {app}',
'openInApp.actions.chooseAppAria': 'Choose app to open',
'openInApp.actions.copyPath': 'Copy Path',
'openInApp.actions.refreshApps': 'Refresh Apps',
'openInApp.toast.pathCopied': 'Path copied to clipboard',
'projectActions.actions.addActionAria': 'Add action',
'projectActions.actions.addAction': 'Add action',
'projectActions.actions.addNewAction': 'Add new action',
'projectActions.actions.autoDiscover': 'Auto-discover',
'projectActions.actions.autoDiscoverTooltip': 'Automatically discover and run the development server',
'projectActions.actions.chooseActionAria': 'Choose project action',
'projectActions.actions.openPreview': 'Open Preview',
'projectActions.actions.runNamedAria': 'Run {name}',
'projectActions.actions.stopNamedAria': 'Stop {name}',
'projectActions.label.fallbackAction': 'Action',
'projectActions.toast.openedUrlFromOutput': 'Opened URL from action output',
'projectActions.toast.openedForwardedUrl': 'Opened forwarded URL',
'projectActions.toast.openedActionUrl': 'Opened action URL',
'projectActions.error.noActiveDirectory': 'No active directory',
'projectActions.error.noActiveDirectoryForAction': 'No active directory for action',
'projectActions.error.failedToCreateTerminalSession': 'Failed to create terminal session',
'projectActions.error.invalidCustomUrlFormat': 'Invalid custom URL format',
'projectActions.error.selectedDesktopSshForwardUnavailable': 'Selected desktop SSH forward is unavailable',
'projectActions.error.failedToRunAction': 'Failed to run action',
'mcpDropdown.title': 'MCP Servers',
'mcpDropdown.actions.refreshAria': 'Refresh',
'mcpDropdown.actions.openAria': 'MCP servers',
'mcpDropdown.statusAria': 'MCP status',
'mcpDropdown.status.unknown': 'Unknown',
'mcpDropdown.status.connected': 'Connected',
'mcpDropdown.status.failed': 'Failed: {error}',
'mcpDropdown.status.unknownError': 'Unknown error',
'mcpDropdown.status.needsAuth': 'Needs authentication',
'mcpDropdown.status.needsRegistration': 'Needs registration: {error}',
'mcpDropdown.empty.configureInConfig': 'Configure MCP servers in Settings.',
'sessionAuth.error.rateLimitTitle': 'Too many attempts',
'sessionAuth.error.networkTitle': 'Unable to reach server',
'sessionAuth.error.rateLimitDescriptionSingle': 'Please wait {minutes} minute before trying again.',
'sessionAuth.error.rateLimitDescriptionPlural': 'Please wait {minutes} minutes before trying again.',
'sessionAuth.error.networkDescription': 'We could not verify the UI session. If you\'re opening OpenChamber from another device on your local network, make sure Desktop Network Access is enabled on the desktop app and use the LAN address shown in Settings.',
'sessionAuth.error.retry': 'Retry',
'sessionAuth.error.passkeySetupFailed': 'Passkey setup failed.',
'sessionAuth.error.incorrectPassword': 'Incorrect password. Try again.',
'sessionAuth.error.unexpectedResponse': 'Unexpected response from server.',
'sessionAuth.error.networkRetry': 'Network error. Check connection and retry.',
'sessionAuth.error.passkeySignInCanceled': 'Passkey sign-in was canceled.',
'sessionAuth.error.enterPasswordForPasskey': 'Enter your password to add a passkey.',
'sessionAuth.locked.tunnelTitle': 'Tunnel access required',
'sessionAuth.locked.unlockTitle': 'Unlock OpenChamber',
'sessionAuth.locked.tunnelDescription': 'Open this tunnel using the one-time connect link from the desktop app.',
'sessionAuth.locked.passwordDescription': 'This session is password-protected.',
'sessionAuth.locked.hostSwitcherHint': 'Use Local if remote is unreachable.',
'sessionAuth.actions.cancelPasskey': 'Cancel passkey',
'sessionAuth.actions.usePasskey': 'Use passkey',
'sessionAuth.actions.unlockingAria': 'Unlocking',
'sessionAuth.actions.unlockAria': 'Unlock',
'sessionAuth.actions.trustDevice': 'Trust this device',
'sessionAuth.actions.trustDeviceAria': 'Trust this device',
'sessionAuth.actions.cancelPasskeySetup': 'Cancel passkey setup',
'sessionAuth.actions.addPasskey': 'Add passkey',
'sessionAuth.password.placeholder': 'Enter password',
'sessionAuth.toast.passkeyAdded': 'Passkey added',
'sessionAuth.toast.passkeySetupCanceled': 'Passkey setup canceled',
'desktopHostSwitcher.title': 'Instance',
'desktopHostSwitcher.description': 'Switch between Local and remote OpenChamber servers',
'desktopHostSwitcher.header.current': 'Current',
'desktopHostSwitcher.header.default': 'Default',
'desktopHostSwitcher.header.currentColon': 'Current:',
'desktopHostSwitcher.header.currentDefaultColon': 'Current default:',
'desktopHostSwitcher.status.connected': 'Connected',
'desktopHostSwitcher.status.authRequired': 'Auth required',
'desktopHostSwitcher.status.checking': 'Checking',
'desktopHostSwitcher.status.updateRecommended': 'Update recommended',
'desktopHostSwitcher.status.incompatible': 'Incompatible',
'desktopHostSwitcher.status.wrongService': 'Wrong service',
'desktopHostSwitcher.status.unreachable': 'Unreachable',
'desktopHostSwitcher.status.unknown': 'Unknown',
'desktopHostSwitcher.status.ping': ' · {ms}ms ping',
'desktopHostSwitcher.statusAria': 'Instance status',
'desktopHostSwitcher.sshPhase.ready': 'Ready',
'desktopHostSwitcher.sshPhase.error': 'Error',
'desktopHostSwitcher.sshPhase.reconnecting': 'Reconnecting',
'desktopHostSwitcher.sshPhase.resolvingConfig': 'Resolving config',
'desktopHostSwitcher.sshPhase.checkingAuth': 'Checking auth',
'desktopHostSwitcher.sshPhase.connectingSsh': 'Connecting SSH',
'desktopHostSwitcher.sshPhase.probingRemote': 'Probing remote',
'desktopHostSwitcher.sshPhase.installing': 'Installing',
'desktopHostSwitcher.sshPhase.updating': 'Updating',
'desktopHostSwitcher.sshPhase.detectingServer': 'Detecting server',
'desktopHostSwitcher.sshPhase.startingServer': 'Starting server',
'desktopHostSwitcher.sshPhase.forwardingPorts': 'Forwarding ports',
'desktopHostSwitcher.sshPhase.idle': 'Idle',
'desktopHostSwitcher.ssh.needInstancesHint': 'Need SSH instances? Manage them in Settings.',
'desktopHostSwitcher.ssh.instanceFallback': 'SSH instance',
'desktopHostSwitcher.ssh.connectingTo': 'Connecting to {host}',
'desktopHostSwitcher.actions.refresh': 'Refresh',
'desktopHostSwitcher.actions.refreshInstancesAria': 'Refresh instances',
'desktopHostSwitcher.actions.remoteSsh': 'Remote SSH',
'desktopHostSwitcher.actions.instanceActionsAria': 'Instance actions',
'desktopHostSwitcher.actions.edit': 'Edit',
'desktopHostSwitcher.actions.delete': 'Delete',
'desktopHostSwitcher.actions.connect': 'Connect',
'desktopHostSwitcher.actions.defaultInstanceAria': 'Default instance',
'desktopHostSwitcher.actions.setAsDefaultAria': 'Set as default',
'desktopHostSwitcher.actions.setAsDefault': 'Set as default',
'desktopHostSwitcher.actions.openInNewWindowAria': 'Open in new window',
'desktopHostSwitcher.actions.openInNewWindow': 'Open in new window',
'desktopHostSwitcher.actions.addInstance': 'Add instance',
'desktopHostSwitcher.actions.cancel': 'Cancel',
'desktopHostSwitcher.actions.save': 'Save',
'desktopHostSwitcher.actions.add': 'Add',
'desktopHostSwitcher.actions.switchToLocal': 'Switch to Local',
'desktopHostSwitcher.actions.retry': 'Retry',
'desktopHostSwitcher.actions.switchInstanceAria': 'Switch instance',
'desktopHostSwitcher.actions.switchInstance': 'Switch instance',
'desktopHostSwitcher.actions.switchToAria': 'Switch to {instance}',
'desktopHostSwitcher.field.labelPlaceholder': 'Label',
'desktopHostSwitcher.field.labelOptionalPlaceholder': 'Label (optional)',
'desktopHostSwitcher.field.urlPlaceholder': 'https://host:port',
'desktopHostSwitcher.state.limitedOnPage': 'Instance switcher is limited on this page. Use Local to recover.',
'desktopHostSwitcher.state.loading': 'Loading...',
'desktopHostSwitcher.state.instanceUnreachable': 'Instance unreachable',
'desktopHostSwitcher.edit.title': 'Edit instance',
'desktopHostSwitcher.add.title': 'Add instance',
'desktopHostSwitcher.error.failedToSave': 'Failed to save',
'desktopHostSwitcher.error.failedToLoad': 'Failed to load',
'desktopHostSwitcher.error.invalidUrl': 'Invalid URL (must be http/https)',
'desktopHostSwitcher.error.failedToOpenNewWindow': 'Failed to open new window',
'desktopHostSwitcher.instance.local': 'Local',
'desktopHostSwitcher.instance.fallback': 'Instance',
'desktopHostSwitcher.startup.title': 'Default SSH instance unavailable',
'desktopHostSwitcher.startup.connectingTo': 'Connecting to {host}...',
'desktopHostSwitcher.startup.failed': 'Failed to connect the default SSH instance.',
'desktopHostSwitcher.toast.sshConnected': 'SSH instance "{host}" connected',
'desktopHostSwitcher.toast.sshFailedToConnect': 'SSH instance "{host}" failed to connect',
'desktopHostSwitcher.toast.instanceUnreachable': 'Instance "{host}" is unreachable',
'miniChat.header.newSession': 'New session',
'miniChat.header.session': 'Session',
'miniChat.header.defaultAgent': 'Default agent',
'miniChat.header.noModel': 'No model',
'miniChat.status.busy': 'Running',
'miniChat.status.retry': 'Retrying',
'miniChat.status.idle': 'Idle',
'miniChat.actions.pin': 'Pin above other windows',
'miniChat.actions.unpin': 'Unpin window',
'miniChat.actions.pinAria': 'Pin Mini Chat window',
'miniChat.actions.unpinAria': 'Unpin Mini Chat window',
'miniChat.actions.openMain': 'Open in main window',
'miniChat.actions.openMainAria': 'Open session in main window',
'miniChat.unavailable.title': 'Session unavailable',
'miniChat.unavailable.description': 'This session could not be loaded. It may have been deleted, archived, or opened from a different project context.',
'sessions.sidebar.session.menu.openMiniChatWindow': 'Open in Mini Chat Window',
'header.actions.newMiniChat': 'New Mini Chat Window',
'header.actions.newMiniChatAria': 'Open a new Mini Chat window',
'header.actions.openSessionMiniChat': 'Open Session in Mini Chat',
'header.actions.openSessionMiniChatAria': 'Open current session in Mini Chat',
'header.windowControls.groupAria': 'Window controls',
'header.windowControls.minimize': 'Minimize window',
'header.windowControls.maximize': 'Maximize window',
'header.windowControls.restore': 'Restore window',
'header.windowControls.close': 'Close window',
'errorBoundary.title': 'Something went wrong',
'errorBoundary.description': 'The application encountered an unexpected error. This has been logged for debugging.',
'errorBoundary.state.unknownError': 'Unknown error',
'errorBoundary.state.componentStackLabel': 'Component stack:',
'errorBoundary.actions.errorDetails': 'Error details',
'errorBoundary.actions.tryAgain': 'Try again',
'errorBoundary.actions.copy': 'Copy',
'errorBoundary.actions.copied': 'Copied',
'jsonTreeView.error.emptyJson': 'Empty JSON content',
'jsonTreeView.error.invalidJson': 'Invalid JSON',
'jsonTreeView.error.invalidJsonTitle': 'Invalid JSON',
'jsonTreeView.actions.expandAll': 'Expand All',
'jsonTreeView.actions.collapseAll': 'Collapse All',
'numberInput.actions.decreaseAria': 'Decrease value',
'numberInput.actions.increaseAria': 'Increase value',
'goToLineDialog.field.linePlaceholderShort': 'Line',
'goToLineDialog.field.linePlaceholder': 'Line number',
'goToLineDialog.actions.go': 'Go',
'goToLineDialog.helper.editorUnavailable': 'Editor unavailable.',
'goToLineDialog.helper.currentLineRange': 'Current Line: {current}. Type a line number between 1 and {max} to navigate to.',
'goToLineDialog.helper.goToLine': 'Go to line {line}',
'dialog.common.actions.close': 'Close',
'filesView.toast.relativePathCopied': 'Relative path copied',
'filesView.tree.menu.copyRelativePath': 'Copy Relative Path',
'multiRun.branchSelector.placeholder.selectSourceBranch': 'Select source branch...',
'multiRun.branchSelector.status.loadingBranches': 'Loading branches...',
'multiRun.branchSelector.status.noBranchesFound': 'No branches found',
'multiRun.branchSelector.status.notInGitRepository': 'Not in a git repository.',
'multiRun.branchSelector.groups.localBranches': 'Local branches',
'multiRun.branchSelector.groups.remoteBranches': 'Remote branches',
'multiRun.window.actions.closeAria': 'Close multi-run',
'multiRun.window.description': 'OpenChamber Multi-Run window.',
'voice.status.idle': 'Voice Ready',
'voice.status.listening': 'Listening...',
'voice.status.processing': 'Processing...',
'voice.status.speaking': 'Speaking...',
'voice.status.error': 'Voice Error',
'voice.status.conversationModeActiveAria': 'Conversation mode active',
'voice.action.finishAndTranscribe': 'Finish and transcribe voice input',
'onboarding.common.actions.back': 'Back',
'onboarding.common.copyToClipboard': 'Copy to clipboard',
'onboarding.common.status.copiedToClipboard': 'Copied to clipboard',
'onboarding.chooser.title': 'Welcome to OpenChamber',
'onboarding.chooser.description': 'Choose how you want to connect to get started.',
'onboarding.chooser.tabs.localInstall': 'Local Install',
'onboarding.chooser.tabs.connectRemote': 'Connect Remote',
'onboarding.localSetup.title': 'Setting Up OpenCode',
'onboarding.localSetup.description': 'Install OpenCode CLI to continue.',
'onboarding.localSetup.dialog.selectOpencodeBinary': 'Select opencode binary',
'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI is not ready yet. Please confirm installation is complete and try again.',
'onboarding.localSetup.errors.detectionFailed': 'Detection failed',
'onboarding.localSetup.windows.title': 'Windows setup',
'onboarding.localSetup.windows.stepInstallWsl': 'Install OpenCode with the command below.',
'onboarding.localSetup.windows.stepInstallWslSuffix': '',
'onboarding.localSetup.windows.stepRunInstallInWsl': 'Run the install command below in a Windows terminal.',
'onboarding.localSetup.windows.stepSetBinaryPath': 'If OpenChamber does not detect OpenCode automatically, set the binary path below.',
'onboarding.localSetup.intro': 'OpenCode is the heart of OpenChamber — install it to get started.',
'onboarding.localSetup.docs.windows': 'OpenCode docs',
'onboarding.localSetup.docs.default': 'OpenCode docs',
'onboarding.localSetup.actions.checking': 'Checking…',
'onboarding.localSetup.actions.checkAndContinue': "I've completed installation, check and continue",
'onboarding.localSetup.actions.checkNow': 'Check now',
'onboarding.localSetup.helper.checkAndContinue': 'Click to check if OpenCode CLI is available. If successful, you\'ll automatically enter the main screen.',
'onboarding.localSetup.status.watching': 'Waiting for OpenCode',
'onboarding.localSetup.status.autoContinue': "We'll continue automatically once it's detected.",
'onboarding.localSetup.field.alreadyInstalled': 'Already installed? Set the OpenCode CLI path:',
'onboarding.localSetup.advanced.title': 'Set a custom binary path',
'onboarding.localSetup.troubleshoot.title': 'Having trouble?',
'onboarding.localSetup.actions.browse': 'Browse',
'onboarding.localSetup.actions.apply': 'Apply',
'onboarding.localSetup.helper.saveAndReload': 'Saves to OpenChamber settings and reloads OpenCode configuration.',
'onboarding.localSetup.remotePreference': 'Prefer to use a remote server?',
'onboarding.localSetup.actions.connectRemoteServer': 'Connect to Remote Server →',
'onboarding.localSetup.windows.hintInstallInWsl': 'On Windows, install and run OpenCode natively.',
'onboarding.localSetup.windows.hintDetectionFailed': 'If detection fails, set a native path such as opencode.cmd or opencode.exe.',
'onboarding.localSetup.hint.ensurePath': 'Already installed? Make sure opencode is in your PATH.',
'onboarding.localSetup.hint.setEnv': 'Or set OPENCODE_BINARY environment variable.',
'onboarding.localSetup.hint.missingRuntime': 'If you see "env: node: No such file or directory" or "env: bun: No such file or directory", install that runtime or ensure it is on PATH.',
'onboarding.remoteConnection.title': 'Connect to Remote Server',
'onboarding.remoteConnection.titleRecovery': 'Connect to a Different Server',
'onboarding.remoteConnection.description': 'Enter the address of an OpenChamber server to connect to.',
'onboarding.remoteConnection.field.serverAddress': 'Server Address',
'onboarding.remoteConnection.field.serverAddressPlaceholder': 'https://your-server.example.com:4096',
'onboarding.remoteConnection.field.nameOptional': 'Name (optional)',
'onboarding.remoteConnection.field.namePlaceholder': 'My Remote Server',
'onboarding.remoteConnection.errors.connectionTestFailed': 'Connection test failed',
'onboarding.remoteConnection.errors.failedToSaveConnection': 'Failed to save connection',
'onboarding.remoteConnection.status.connectedSuccessfully': 'Connected successfully ({latencyMs}ms)',
'onboarding.remoteConnection.status.authWarning': 'Server requires authentication. You can still connect.',
'onboarding.remoteConnection.status.connectionFailed': 'Connection Failed',
'onboarding.remoteConnection.status.suggestionsUnreachable': 'Suggestions: Check the server address, verify the server is running, or check your network connection.',
'onboarding.remoteConnection.status.suggestionsWrongService': 'Suggestions: Verify the URL points to an OpenChamber server, or contact the server administrator.',
'onboarding.remoteConnection.actions.testing': 'Testing…',
'onboarding.remoteConnection.actions.testConnection': 'Test Connection',
'onboarding.remoteConnection.actions.connectAndRestart': 'Connect & Restart',
'onboarding.remoteConnection.actions.whatToDo': 'What would you like to do?',
'onboarding.remoteConnection.actions.chooseDifferentServer': 'Choose Different Server',
'onboarding.remoteConnection.actions.useLocalInstead': 'Use Local Instead',
'onboarding.remoteConnection.probe.authMessage': 'Server requires authentication. You can still connect, but may need to provide credentials.',
'onboarding.remoteConnection.probe.updateRecommendedMessage': 'This instance is running a different OpenChamber version. You can connect, but update both apps if something does not work.',
'onboarding.remoteConnection.probe.incompatibleMessage': 'Server is running OpenChamber but is not compatible with this app version. Update OpenChamber on the server, then try again.',
'onboarding.remoteConnection.probe.wrongServiceMessage': 'Server responded but is not running OpenChamber. Verify the address points to an OpenChamber server.',
'onboarding.remoteConnection.probe.unreachableMessage': 'Server is unreachable. Check your network connection and verify the server address.',
'onboarding.desktopRecovery.localUnavailable.title': 'Local OpenCode Unavailable',
'onboarding.desktopRecovery.localUnavailable.description': 'OpenCode CLI could not be started or is not installed. Install OpenCode or connect to a remote server instead.',
'onboarding.desktopRecovery.localUnavailable.retry': 'Retry Local',
'onboarding.desktopRecovery.localUnavailable.useLocal': 'Set Up Local',
'onboarding.desktopRecovery.noDefaultConnection.title': 'No Default Connection',
'onboarding.desktopRecovery.noDefaultConnection.description': 'Your saved default connection could not be found. Choose how you want to connect.',
'onboarding.desktopRecovery.remoteUnreachable.title': 'Remote Server Unreachable',
'onboarding.desktopRecovery.remoteUnreachable.description': 'Could not connect to "{host}". Check your network connection and verify the server address.',
'onboarding.desktopRecovery.remoteUnreachable.retry': 'Retry Connection',
'onboarding.desktopRecovery.incompatibleServer.title': 'Incompatible Server',
'onboarding.desktopRecovery.incompatibleServer.description': 'The server at "{host}" is not running OpenChamber. Verify the address points to an OpenChamber server.',
'onboarding.desktopRecovery.remoteIncompatible.title': 'Server Update Required',
'onboarding.desktopRecovery.remoteIncompatible.description': 'The OpenChamber server at "{host}" is not compatible with this app version. Update OpenChamber on the server, then try again.',
'onboarding.desktopRecovery.common.useLocal': 'Use Local',
'onboarding.desktopRecovery.common.useRemote': 'Use Remote',
'onboarding.desktopRecovery.actions.retrying': 'Retrying…',
'onboarding.desktopRecovery.actions.retryConnection': 'Retry Connection',
'startup.initRecovery.title': 'Startup failed',
'startup.initRecovery.description': 'OpenChamber could not finish initialization. Check that the server is running, then retry.',
'startup.initRecovery.retry': 'Retry',
'startup.initRecovery.retrying': 'Retrying…',
'onboarding.desktopRecovery.placeholders.remoteServer': 'the remote server',
'onboarding.desktopRecovery.placeholders.unknownServer': 'unknown',
'vscodeLayout.title.chat': 'Chat',
'vscodeLayout.title.newSession': 'New session',
'vscodeLayout.title.sessions': 'Sessions',
'vscodeLayout.title.sessionFallback': 'Session',
'vscodeLayout.actions.backToSessionsAria': 'Back to sessions',
'vscodeLayout.actions.archiveAllAria': 'Archive all sessions',
'vscodeLayout.actions.archiveAllConfirm': 'Archive all',
'vscodeLayout.actions.archiveAllSuccess': 'Archived {count} session(s)',
'vscodeLayout.actions.archiveAllError': 'Failed to archive {count} session(s)',
'vscodeLayout.actions.cancel': 'Cancel',
'vscodeLayout.actions.newSessionAria': 'New session',
'vscodeLayout.actions.openAgentManagerAria': 'Open Agent Manager',
'vscodeLayout.actions.resizeSessionsSidebarAria': 'Resize sessions sidebar',
'vscodeLayout.actions.settingsAria': 'Settings',
'vscodeLayout.quota.title': 'Rate limits',
'vscodeLayout.quota.mode.used': 'Used',
'vscodeLayout.quota.mode.remaining': 'Remaining',
'vscodeLayout.quota.lastUpdated': 'Last updated {time}',
'vscodeLayout.quota.noRateLimitsAvailable': 'No rate limits available.',
'vscodeLayout.quota.noRateLimitsReported': 'No rate limits reported.',
'vscodeLayout.quota.actions.rateLimitsAria': 'Rate limits',
'vscodeLayout.quota.actions.showUsedAria': 'Show used quota',
'vscodeLayout.quota.actions.showRemainingAria': 'Show remaining quota',
'vscodeLayout.quota.actions.refreshAria': 'Refresh rate limits',
'updateDialog.header.updateAvailable': 'Update Available',
'updateDialog.header.updating': 'Updating OpenChamber...',
'updateDialog.changelog.title': "What's new",
'updateDialog.status.installingUpdate': 'Installing update...',
'updateDialog.status.serverRestarting': 'Server restarting...',
'updateDialog.status.waitingForServer': 'Waiting for server...',
'updateDialog.status.autoReloadHint': 'The page will reload automatically when the update is complete.',
'updateDialog.fallback.updateViaTerminal': 'Or update via terminal:',
'updateDialog.actions.copyCommand': 'Copy command',
'updateDialog.actions.copied': 'Copied!',
'updateDialog.status.downloadingPayload': 'Downloading update payload...',
'updateDialog.actions.downloadUpdate': 'Download Update',
'updateDialog.status.downloading': 'Downloading...',
'updateDialog.actions.restartToUpdate': 'Restart to Update',
'updateDialog.actions.updateNow': 'Update Now',
'updateDialog.actions.openMobileUpdate': 'Open update',
'updateDialog.status.updating': 'Updating...',
'updateDialog.error.updateFailed': 'Update failed',
'updateDialog.error.takingLonger': 'Update is taking longer than expected. Wait a bit and refresh, or run: openchamber update',
'mobileUpdate.toast.available.title': 'OpenChamber update available',
'mobileUpdate.toast.available.description': 'Version {version} is ready for Android.',
'mobileUpdate.toast.actions.download': 'Download',
'mobileUpdate.toast.actions.dismiss': 'Dismiss',
'opencodeUpdate.toast.available.title': 'OpenCode update',
'opencodeUpdate.toast.available.description': 'Version {version} available.',
'opencodeUpdate.toast.actions.update': 'Update',
'opencodeUpdate.toast.actions.dismiss': 'Dismiss',
'opencodeUpdate.toast.actions.reload': 'Reload OpenCode',
'opencodeUpdate.toast.upgrading.title': 'Updating OpenCode...',
'opencodeUpdate.toast.upgrading.description': 'Keep OpenChamber open.',
'opencodeUpdate.toast.updated.title': 'OpenCode updated',
'opencodeUpdate.toast.updated.description': 'Update installed.',
'opencodeUpdate.toast.updated.descriptionWithVersion': 'Version {version} installed.',
'opencodeUpdate.toast.failed.title': 'Could not update OpenCode',
'opencodeUpdate.toast.failed.description': 'The OpenCode upgrade failed.',
'opencodeUpdate.toast.reload.message': 'Restarting OpenCode...',
'memoryDebugPanel.title': 'Debug Panel',
'memoryDebugPanel.tabs.memory': 'Memory',
'memoryDebugPanel.tabs.streaming': 'Streaming',
'memoryDebugPanel.section.sessionsInMemory': 'Sessions in Memory',
'memoryDebugPanel.section.uiStreamingMetrics': 'UI Streaming Metrics',
'memoryDebugPanel.section.vscodeBridgeMetrics': 'VS Code Bridge Metrics',
'memoryDebugPanel.section.noUiSamples': 'No UI streaming samples yet. Start a stream and keep this panel open.',
'memoryDebugPanel.section.noVscodeSamples': 'No VS Code bridge samples yet.',
'memoryDebugPanel.metric.totalMessages': 'Total Messages',
'memoryDebugPanel.metric.cachedSessions': 'Cached Sessions',
'memoryDebugPanel.metric.userMessages': 'User Messages',
'memoryDebugPanel.metric.assistantMessages': 'Assistant Messages',
'memoryDebugPanel.metric.viewportWindow': 'Viewport Window',
'memoryDebugPanel.metric.zombieTimeout': 'Zombie Timeout',
'memoryDebugPanel.metric.githubTotalRequests': 'GitHub Total Requests',
'memoryDebugPanel.metric.metrics': 'Metrics',
'memoryDebugPanel.metric.samples': 'Samples',
'memoryDebugPanel.metric.lastUpdate': 'Last Update',
'memoryDebugPanel.metric.uiMetrics': 'UI Metrics',
'memoryDebugPanel.metric.vscodeMetrics': 'VS Code Metrics',
'memoryDebugPanel.metric.messageListRenders': 'MsgList Renders',
'memoryDebugPanel.metric.messageListStreamRenders': 'MsgList Stream Renders',
'memoryDebugPanel.metric.chatMessageRenders': 'ChatMessage Renders',
'memoryDebugPanel.metric.chatMessageStreamRenders': 'ChatMessage Stream Renders',
'memoryDebugPanel.metric.chatMessageStaticDuringStream': 'ChatMessage Static During Stream',
'memoryDebugPanel.metric.chatMessageStaticOutsideActiveTurn': 'ChatMessage Static Outside Active Turn',
'memoryDebugPanel.metric.messagesValue': '{count} messages',
'memoryDebugPanel.metric.minutesValue': '{count} minutes',
'memoryDebugPanel.metric.msgsValue': '{count} msgs',
'memoryDebugPanel.metric.roleMsgsValue': 'U {user} / A {assistant}',
'memoryDebugPanel.metric.countValue': 'count {value}',
'memoryDebugPanel.metric.avgValue': 'avg {value}',
'memoryDebugPanel.metric.maxValue': 'max {value}',
'memoryDebugPanel.metric.totalValue': 'total {value}',
'memoryDebugPanel.actions.logState': 'Log State',
'memoryDebugPanel.actions.copyJson': 'Copy JSON',
'memoryDebugPanel.tooltip.logCurrentState': 'Log current memory state to browser console',
'memoryDebugPanel.streaming.copy.copied': 'Streaming debug JSON copied',
'memoryDebugPanel.streaming.copy.failed': 'Failed to copy JSON',
'memoryDebugPanel.streaming.copy.hint': 'Copy exports both UI and VS Code streaming metrics as JSON',
'memoryDebugPanel.common.idle': 'idle',
'memoryDebugPanel.common.live': 'live',
'memoryDebugPanel.common.notAvailable': 'n/a',
'memoryDebugPanel.common.untitled': 'Untitled',
'directoryTree.field.newDirectoryPlaceholder': 'new_directory',
'textarea.resizeHandleAria': 'Resize textarea',
'sidebar.resize.leftPanelAria': 'Resize left panel',
'sidebar.resize.rightPanelAria': 'Resize right panel',
'mainLayout.mobile.closeDrawerAria': 'Close drawer',
'sortableTabsStrip.aria.tabs': 'Tabs',
'openChamberLogo.aria.logo': 'OpenChamber logo',
'markdownRenderer.code.actions.copyTitle': 'Copy code',
'markdownRenderer.code.actions.copiedTitle': 'Copied',
'markdownRenderer.table.actions.copyTitle': 'Copy table',
'markdownRenderer.code.actions.enableWrapTitle': 'Enable line wrap',
'markdownRenderer.code.actions.disableWrapTitle': 'Disable line wrap',
'markdownRenderer.table.actions.downloadTitle': 'Download table',
'markdownRenderer.table.toast.downloadedAsFormat': 'Table downloaded as {format}',
'markdownRenderer.mermaid.actions.copyTitle': 'Copy',
'markdownRenderer.mermaid.actions.copySourceTitle': 'Copy source',
'markdownRenderer.mermaid.actions.downloadSvgTitle': 'Download SVG',
'markdownRenderer.mermaid.actions.zoomInTitle': 'Zoom in',
'markdownRenderer.mermaid.actions.zoomOutTitle': 'Zoom out',
'markdownRenderer.mermaid.actions.resetViewTitle': 'Reset view',
'markdownRenderer.mermaid.toast.downloadFailed': 'Failed to download diagram',
'common.date.today': 'Today',
'common.date.yesterday': 'Yesterday',
'common.date.yesterdayWithTime': 'Yesterday {time}',
'common.relative.justNow': 'Just now',
'common.relative.minutesAgoShort': '{count}min ago',
'common.relative.hoursAgoShort': '{count}h ago',
'common.relative.daysAgoShort': '{count}d ago',
'common.relative.weeksAgoShort': '{count}w ago',
'common.relative.yearsAgoShort': '{count}y ago',
'common.relative.daysAgoCompact': '{count}d ago',
'common.relative.weeksAgoCompact': '{count}w ago',
'common.relative.yearsAgoCompact': '{count}y ago',
'common.duration.secondsCompact': '{seconds}s',
'common.duration.minutesSecondsCompact': '{minutes}m {seconds}s',
'common.duration.hoursMinutesCompact': '{hours}h {minutes}m',
'contextFileOpen.failure.tooLarge': 'File is too large to open (>{count} lines)',
'contextFileOpen.failure.missing': 'File not found',
'contextFileOpen.failure.unreadable': 'Failed to open file',
'quota.window.5h': '5-Hour',
'quota.window.7d': '7-Day Limit',
'quota.window.extraUsage': 'Extra Usage',
'quota.window.weekly': 'Weekly Limit',
'quota.window.daily': 'Daily',
'quota.window.monthly': 'Monthly Limit',
'quota.window.credits': 'Credits',
'quota.window.creditsBalance': 'Credits Balance',
'quota.window.monthlyCredits': 'Monthly Credits',
'quota.window.purchasedCredits': 'Purchased Credits',
'quota.window.freeCredits': 'Free Credits',
'quota.window.billingCycle': 'Billing Cycle',
'quota.window.auto': 'Auto',
'quota.window.api': 'API',
'quota.window.planLimit': 'Plan Limit',
'quota.window.onDemand': 'On-demand',
'quota.window.session': 'Session',
'quota.window.premium': 'Premium Interactions',
'quota.window.chat': 'Chat Requests',
'quota.window.completions': 'Completions',
'quota.window.premiumInteractions': 'Premium interactions',
'chat.workStatus.ariaLabel': 'Work status',
'chat.workStatus.context.label': 'Context',
'chat.workStatus.git.changedFileSingle': '{count} file changed',
'chat.workStatus.git.changedFilePlural': '{count} files changed',
'chat.workStatus.pr.untitled': 'Untitled pull request',
'chat.workStatus.pr.draft': 'Draft',
'chat.workStatus.pr.checks': 'Checks',
'chat.workStatus.pr.checksFailed': '{count} failed',
'chat.workStatus.pr.checksPending': '{count} running',
'chat.workStatus.pr.checksPassed': '{count} passed',
'chat.workStatus.attention.merge': 'Merge in progress',
'chat.workStatus.attention.rebase': 'Rebase in progress',
'chat.workStatus.attention.cherryPick': 'Cherry-pick in progress',
'chat.workStatus.attention.revert': 'Revert in progress',
'chat.workStatus.attention.bisect': 'Bisect in progress',
'chat.workStatus.subagent.done': 'Done',
'chat.workStatus.subagent.untitled': 'Subagent',
'chat.workStatus.mcp.toggle': 'Toggle {name}',
'chat.workStatus.mcp.needsAuth': 'Sign in',
'chat.workStatus.mcp.failed': 'Failed',
'chat.workStatus.pinned.unavailable': 'Pinned message',
'chat.workStatus.section.session': 'Session',
'chat.workStatus.section.project': 'Project',
'chat.workStatus.section.subagents': 'Subagents',
'chat.workStatus.section.mcp': 'MCP',
'chat.workStatus.section.pinned': 'Pinned messages',
'chat.workStatus.section.tasks': 'Tasks',
'chat.workStatus.subagent.working': 'is working',
'chat.workStatus.subagent.needsPermission': 'needs permission',
'chat.workStatus.subagent.askedQuestion': 'asked a question',
'chat.workStatus.section.contextBreakdown': 'Context sources',
'chat.workStatus.breakdown.skills': 'Skills',
'chat.workStatus.breakdown.pinnedNote': 'note',
'chat.workStatus.breakdown.unpin': 'Unpin from context',
'chat.workStatus.breakdown.pinnedPlan': 'plan',
'chat.workStatus.breakdown.memory': 'Agent memory',
'chat.workStatus.breakdown.pinnedKnowledgeSingle': '{count} pinned',
'chat.workStatus.breakdown.pinnedKnowledgePlural': '{count} pinned',
'chat.workStatus.breakdown.mcp': 'MCP servers',
'chat.workStatus.action.openChanges': 'Open changes',
'chat.workStatus.action.openGit': 'Open Git panel',
'chat.workStatus.action.openPr': 'Open pull request',
'chat.workStatus.action.openSubagent': 'Open {name}',
'chat.workStatus.section.usage': 'Usage',
'chat.workStatus.goal.open': 'Manage goal',
'chat.workStatus.goal.pause': 'Pause',
'chat.workStatus.goal.resume': 'Resume',
'chat.workStatus.goal.updateFailed': 'Could not update the goal',
'chat.workStatus.pinned.unpin': 'Unpin message',
'chat.workStatus.pinned.reveal': 'Go to message',
'chat.workStatus.pinned.unpinFailed': 'Could not unpin the message',
'chat.workStatus.action.openContext': 'Open context panel',
'chat.workStatus.section.linkedIssues': 'Linked',
'chat.workStatus.linkedIssues.open': 'Open #{number} on GitHub',
'chat.workStatus.linkedIssues.unlink': 'Remove link',
'chat.workStatus.linkedIssues.unlinkFailed': 'Could not remove the link',
'chat.workStatus.linkedIssues.link': 'Link to session',
'chat.workStatus.linkedIssues.linkFailed': 'Could not link',
'chat.workStatus.breakdown.issueCountSingle': '{count} issue',
'chat.workStatus.breakdown.issueCountPlural': '{count} issues',
'chat.workStatus.breakdown.prCountSingle': '{count} PR',
'chat.workStatus.breakdown.prCountPlural': '{count} PRs',
'chat.workStatus.breakdown.skillCountSingle': '{count} skill',
'chat.workStatus.breakdown.skillCountPlural': '{count} skills',
'chat.workStatus.breakdown.mcpCountSingle': '{count} MCP',
'chat.workStatus.breakdown.mcpCountPlural': '{count} MCP',
'chat.workStatus.sections.open': 'Choose sections',
'chat.workStatus.sections.dialogTitle': 'Panel sections',
'chat.workStatus.sections.dialogDescription': 'Choose what the work-status panel shows. Hidden sections keep their data — they are only left out of the panel.',
'chat.workStatus.sections.allHidden': 'No sections selected',
'chat.workStatus.sections.showAll': 'Show all',
'chat.workStatus.sections.noneWarning': 'The panel will appear empty.',
'header.workStatusPanel.toggleAria': 'Toggle work-status panel',
'header.workStatusPanel.hide': 'Hide work status',
'header.workStatusPanel.show': 'Show work status',
'chat.workStatus.mcp.authorizeOpenFailed': 'Could not open the authorization page',
'chat.workStatus.mcp.authorizeFailed': 'Authorization failed',
'mcpDropdown.toast.authorizeOpenFailed': 'Could not open the authorization page',
'mcpDropdown.toast.authorizeFailed': 'Authorization failed',
'header.services.tooltip.currentInstance': 'Current instance: {current} ({toggle})',
'header.workStatusPanel.showOverlay': 'Show work status over the chat',
'settings.mcp.page.connection.title': 'How to reach it',
'settings.mcp.page.connection.description': 'Paste the command that starts it, or the link to a hosted server.',
'settings.mcp.page.registration.title': 'This server needs its own app',
'settings.mcp.page.registration.description': 'It does not hand out credentials automatically. Create an app in the services own settings, paste its details here, then sign in.',
'settings.mcp.page.registration.callbackLabel': 'Give the service this address',
'settings.mcp.page.registration.clientId': 'App ID',
'settings.mcp.page.registration.clientSecret': 'App secret',
'settings.mcp.page.registration.afterSaving': 'Save, then press Authorize to sign in.',
'settings.mcp.page.toast.copiedCallbackUrl': 'Address copied',
'settings.mcp.page.toast.clipboardWriteFailed': 'Could not copy to the clipboard',
'settings.mcp.page.scope.everywhere': 'Available in every project',
'settings.mcp.page.scope.thisProject': 'Only in this project',
'settings.mcp.page.env.description': 'Values the server needs, such as an API key.',
'settings.mcp.page.connection.kindCommand': 'Command',
'settings.mcp.page.connection.kindLink': 'Link',
'settings.mcp.page.connection.hintCommand': 'Runs on this machine. Paste a whole command and it is split into one argument per line.',
'settings.mcp.page.connection.hintLink': 'Connects to a server someone else hosts. Paste its https address.',
} as const;
export type I18nKey = keyof typeof dict;