// SPDX-License-Identifier: MIT
// Copyright (c) 2025-2026 SenWeaverCoding
// Licensed under the MIT License.

export const en = {

  'common.cancel': 'Cancel',
  'common.close': 'Close',
  'common.save': 'Save',
  'common.saving': 'Saving...',

  'settings.userGroup.title': 'User & LAN',
  'settings.userGroup.description': 'Set your nickname and email, view your user ID and current LAN address, and toggle LAN discovery.',
  'settings.userGroup.nickname': 'Nickname',
  'settings.userGroup.email': 'Email',
  'settings.userGroup.userId': 'User ID',
  'settings.userGroup.localIp': 'LAN address',
  'settings.userGroup.discoveryToggle': 'LAN discovery',
  'settings.userGroup.discoveryEnabledHint': 'Discoverable on the local network; you can chat and transfer files with peers.',
  'settings.userGroup.discoveryDisabledHint': 'Turn on to discover and message peers on the same network.',

  'lan.title': 'Contacts',
  'lan.online': 'Online',
  'lan.noPeers': 'No peers found on your network yet.',
  'lan.recentChats': 'Recent chats',
  'lan.transfers': 'Transfers',
  'lan.settings': 'Open settings',
  'lan.discoveryOff': 'LAN discovery is off.',
  'lan.enableDiscovery': 'Enable',
  'lan.offline': 'offline',
  'lan.offlineSendDisabled': 'Peer is offline',
  'lan.noMessages': 'No messages yet. Say hello!',
  'lan.fileLabel': 'File',
  'lan.sendFile': 'Send file',
  'lan.sendFolder': 'Send folder',
  'lan.messagePlaceholder': 'Type a message...',
  'lan.send': 'Send',
  'lan.pathPrompt': 'Enter the absolute path of the file or folder to send',
  'lan.saveToLocal': 'Save to local',
  'lan.saving': 'Saving…',
  'lan.saved': 'Saved',
  'lan.saveFailed': 'Save failed',
  'lan.saveDestPrompt': 'Enter the absolute path of the local directory to save into',
  'lan.imageLoading': 'Loading image…',
  'lan.imageFailed': 'Failed to load image',
  'lanShare.title': 'Personal Shares',
  'lanShare.subtitle': 'Share files or folders with everyone on the LAN',
  'lanShare.network': 'Network',
  'lanShare.mine': 'My Shares',
  'lanShare.shareFile': 'Share File',
  'lanShare.shareFolder': 'Share Folder',
  'lanShare.unshare': 'Unshare',
  'lanShare.download': 'Download',
  'lanShare.requesting': 'Requesting…',
  'lanShare.received': 'Received',
  'lanShare.emptyMine': "You haven't shared any files or folders yet.",
  'lanShare.emptyNetwork': 'No shared content on the LAN yet.',
  'lanShare.sharedToast': 'Shared "{name}" to the LAN',
  'lanGroup.title': 'Project Groups',
  'lanGroup.subtitle': 'Collaborate over your local network',
  'lanGroup.empty': 'No project groups yet. Create one to start collaborating.',
  'lanGroup.create': 'New Group',
  'lanGroup.createTitle': 'Create Project Group',
  'lanGroup.namePlaceholder': 'Group name',
  'lanGroup.descPlaceholder': 'Description (optional)',
  'lanGroup.confirm': 'Confirm',
  'lanGroup.cancel': 'Cancel',
  'lanGroup.tabChat': 'Chat',
  'lanGroup.tabDocuments': 'Documents',
  'lanGroup.tabBoard': 'Board',
  'lanGroup.tabTimeline': 'Timeline',
  'lanGroup.tabMembers': 'Members',
  'lanGroup.progress': 'Progress',
  'lanGroup.members': 'members',
  'lanGroup.roleOwner': 'Project Manager',
  'lanGroup.roleManager': 'Manager',
  'lanGroup.roleMember': 'Member',
  'lanGroup.roleViewer': 'Viewer',
  'lanGroup.invite': 'Invite',
  'lanGroup.inviteHint': 'Invite an online user to this group',
  'lanGroup.noOnlinePeers': 'No online users available to invite.',
  'lanGroup.changeRole': 'Change role',
  'lanGroup.remove': 'Remove',
  'lanGroup.leave': 'Leave group',
  'lanGroup.leaveConfirm': 'Leave this project group?',
  'lanGroup.you': 'You',
  'lanGroup.offline': 'offline',
  'lanGroup.upload': 'Upload',
  'lanGroup.uploadFile': 'Upload file',
  'lanGroup.uploadFolder': 'Upload folder',
  'lanGroup.selectPhase': 'Phase',
  'lanGroup.uncategorized': 'Uncategorized',
  'lanGroup.download': 'Download',
  'lanGroup.downloading': 'Requesting…',
  'lanGroup.save': 'Save to local',
  'lanGroup.available': 'Available',
  'lanGroup.notDownloaded': 'Not downloaded',
  'lanGroup.version': 'v',
  'lanGroup.noDocuments': 'No documents in this phase yet.',
  'lanGroup.addPhase': 'Add phase',
  'lanGroup.phaseName': 'Phase name',
  'lanGroup.removePhase': 'Remove phase',
  'lanGroup.addTask': 'Add task',
  'lanGroup.taskTitle': 'Task title',
  'lanGroup.taskDescription': 'Description',
  'lanGroup.assignee': 'Assignee',
  'lanGroup.dueDate': 'Due date',
  'lanGroup.priority': 'Priority',
  'lanGroup.status': 'Status',
  'lanGroup.noTasks': 'No tasks yet.',
  'lanGroup.unassigned': 'Unassigned',
  'lanGroup.statusTodo': 'To Do',
  'lanGroup.statusInProgress': 'In Progress',
  'lanGroup.statusDone': 'Done',
  'lanGroup.statusBlocked': 'Blocked',
  'lanGroup.phaseNotStarted': 'Not started',
  'lanGroup.phaseInProgress': 'In progress',
  'lanGroup.phaseDone': 'Done',
  'lanGroup.phaseBlocked': 'Blocked',
  'lanGroup.priorityLow': 'Low',
  'lanGroup.priorityMedium': 'Medium',
  'lanGroup.priorityHigh': 'High',
  'lanGroup.priorityUrgent': 'Urgent',
  'lanGroup.kindTask': 'Task',
  'lanGroup.kindMilestone': 'Milestone',
  'lanGroup.phaseRequirements': 'Requirements',
  'lanGroup.phaseDesign': 'Design',
  'lanGroup.phaseDevelopment': 'Development',
  'lanGroup.phaseTesting': 'Testing',
  'lanGroup.phaseDeployment': 'Deployment',
  'lanGroup.phaseMaintenance': 'Maintenance',
  'lanGroup.messagePlaceholder': 'Message the group…',
  'lanGroup.send': 'Send',
  'lanGroup.noMessages': 'No messages yet. Say hello!',
  'lanGroup.sharedDocument': 'Shared a document',
  'lanGroup.imageLoading': 'Loading image…',
  'lanGroup.imageFailed': 'Failed to load image',
  'lanGroup.pendingUploadTitle': 'Upload to project group',
  'lanGroup.pendingUploadHint': 'Choose a group and phase for this file',
  'lanGroup.noPhases': 'No phases defined.',
  'lanGroup.timelineEmpty': 'No scheduled tasks to display.',
  'lanGroup.deleteDoc': 'Delete document?',
  'lanGroup.deleteTask': 'Delete task?',
  'lanGroup.uploadToGroup': 'Upload to project group',
  'common.delete': 'Delete',
  'common.edit': 'Edit',
  'common.add': 'Add',
  'common.run': 'Run',
  'common.running': 'Running',
  'common.send': 'Send',
  'common.stop': 'Stop',
  'common.rename': 'Rename',
  'common.retry': 'Retry',
  'common.reload': 'Reload',
  'common.refresh': 'Refresh',
  'common.loading': 'Loading...',
  'common.select': 'Select',
  'common.enable': 'Enable',
  'common.disable': 'Disable',
  'common.active': 'ACTIVE',
  'common.expand': 'Expand',
  'common.collapse': 'Collapse',

  'sidebar.newSession': 'New agent',
  'sidebar.scheduled': 'Scheduled',
  'sidebar.automations': 'Automations',
  'sidebar.settings': 'Settings',
  'sidebar.searchPlaceholder': 'Search sessions...',
  'sidebar.noSessions': 'No sessions yet',
  'sidebar.noMatching': 'No matching sessions',
  'sidebar.sessionListFailed': 'Session list failed to load',
  'sidebar.missingDir': 'missing dir',
  'sidebar.confirmDelete': 'Delete this session? This cannot be undone.',
  'sidebar.untitled': 'New agent',
  'sidebar.deleteAria': 'Delete conversation',
  'sidebar.deleteWorkspaceAria': 'Delete workspace directory',
  'sidebar.newSessionInWorkspaceAria': 'New agent in this workspace directory',
  'sidebar.deleteWorkspaceTitle': 'Delete workspace directory',
  'sidebar.confirmDeleteWorkspace': 'Delete all {count} sessions under workspace "{dir}"? This cannot be undone.',
  'sidebar.confirmDeleteWorkspaceRunning': '{running} session(s) under workspace "{dir}" have a running agent. Deleting will stop them and permanently remove all {count} sessions under this directory. This cannot be undone.',
  'sidebar.allProjects': 'All projects',
  'sidebar.other': 'Other',
  'sidebar.collapse': 'Collapse sidebar',
  'sidebar.expand': 'Expand sidebar',
  'sidebar.expandWorkspace': 'Expand workspace',
  'sidebar.collapseWorkspace': 'Collapse workspace',
  'sidebar.showMore': 'Show {count} more',
  'sidebar.showMoreWorkspaces': 'Show {count} more workspaces',
  'sidebar.browserPanel': 'Embedded browser',

  'browser.panel.title': 'Embedded browser',
  'browser.panel.collapse': 'Collapse browser',
  'browser.panel.close': 'Close',
  'browser.panel.empty': 'Loading browser…',
  'browser.panel.empty.title': 'Browser',
  'browser.panel.empty.hint': 'Enter a URL above, or instruct the Agent to navigate and use the browser',
  'browser.panel.urlPlaceholder': 'Enter URL or search…',
  'browser.panel.back': 'Back',
  'browser.panel.forward': 'Forward',
  'browser.panel.reload': 'Reload',
  'browser.panel.pickElement': 'Select element',
  'browser.panel.consoleShow': 'Show console',
  'browser.panel.consoleHide': 'Hide console',
  'browser.panel.consoleTitle': 'Console',
  'browser.panel.consoleEmpty': 'No console output yet.',
  'browser.panel.consoleClear': 'Clear',
  'browser.panel.inspectorShow': 'Show CSS inspector',
  'browser.panel.inspectorHide': 'Hide CSS inspector',
  'browser.panel.inspectorTitle': 'CSS inspector',
  'browser.panel.inspectorEmpty': 'Select an element to inspect computed styles.',
  'browser.panel.more': 'More',
  'browser.panel.menu.screenshot': 'Take screenshot',
  'browser.panel.menu.areaScreenshot': 'Capture area screenshot',
  'browser.panel.menu.hardReload': 'Hard reload',
  'browser.panel.menu.copyUrl': 'Copy current URL',
  'browser.panel.menu.zoom': 'Zoom',
  'browser.panel.menu.zoomIn': 'Zoom in',
  'browser.panel.menu.zoomOut': 'Zoom out',
  'browser.panel.menu.zoomReset': 'Reset zoom',
  'browser.panel.menu.clearHistory': 'Clear browsing history',
  'browser.panel.menu.clearCookies': 'Clear cookies',
  'browser.panel.menu.clearCache': 'Clear cache',
  'browser.panel.driver.title': 'Agent driver',
  'browser.panel.driver.show': 'Show agent driver',
  'browser.panel.driver.hide': 'Hide agent driver',
  'browser.panel.driver.empty': 'No agent actions yet.',
  'browser.panel.driver.clear': 'Clear',
  'browser.panel.driver.live': 'Live',
  'browser.panel.tabs.new': 'New tab',
  'browser.panel.tabs.close': 'Close tab',
  'browser.panel.tabs.untitled': 'New tab',
  'browser.panel.tabs.activate': 'Switch to this tab',
  'browser.panel.tabs.agentActive': 'Agent is working in this tab',
  'browser.panel.toast.screenshotSaved': 'Screenshot saved',
  'browser.panel.toast.screenshotCopied': 'Screenshot copied to clipboard',
  'browser.panel.toast.screenshotFailed': 'Screenshot failed',
  'browser.panel.toast.actionFailed': 'Browser action failed: {action}',
  'browser.panel.action.navigate': 'Navigate',
  'browser.panel.action.open': 'Open browser',
  'browser.panel.action.toggle': 'Toggle browser',
  'browser.panel.actor.user': 'USER',
  'browser.panel.actor.agent': 'AGENT',
  'browser.panel.cooperate.title': 'Co-driving timeline',
  'browser.panel.cooperate.empty': 'No actions yet from you or the agent.',
  'browser.panel.cooperate.agentBubble': 'Agent {kind}',
  'browser.panel.splitter.dragHorizontal': 'Drag to resize console / inspector area',

  'rightSidebar.title': 'Workspace',
  'rightSidebar.toggleOpen': 'Open file explorer',
  'rightSidebar.toggleClose': 'Close file explorer',
  'rightSidebar.empty': 'No workspace folder for this session yet',
  'rightSidebar.loading': 'Loading workspace files...',
  'rightSidebar.refresh': 'Refresh',
  'files.refresh': 'Refresh',
  'files.newFile': 'New file',
  'files.newFolder': 'New folder',
  'files.rename': 'Rename',
  'files.delete': 'Delete',
  'files.deleteConfirm': 'Delete "{name}"? This cannot be undone.',
  'files.deleteTitle': 'Delete item',
  'files.deleteDescriptionDir':
    'This folder and all of its contents will be removed from the workspace.',
  'files.deleteDescriptionFile': 'This file will be removed from the workspace.',
  'files.deleteToTrashHint':
    'The item is moved to the system trash/recycle bin when supported, so it can usually be restored from there.',
  'files.upload': 'Upload',
  'files.searchPlaceholder': 'Search files by name...',
  'files.unsavedChanges': 'Unsaved changes',
  'files.confirmDiscard': 'Discard unsaved changes to "{name}"?',
  'files.saveSuccess': 'Saved',
  'files.saveError': 'Save failed: {message}',
  'files.binaryNotPreviewable': 'Cannot preview binary file',
  'files.preview.image': 'Image',
  'files.preview.video': 'Video',
  'files.preview.audio': 'Audio',
  'files.preview.pdf': 'PDF',
  'files.preview.binary': 'Binary',
  'files.preview.zoomIn': 'Zoom in',
  'files.preview.zoomOut': 'Zoom out',
  'files.preview.actualSize': 'Actual size (100%)',
  'files.preview.fit': 'Fit to window',
  'files.modifiedAgo': 'Modified {time}',
  'files.outsideWorkspace': 'Path is outside the workspace',
  'files.workspaceMissing': 'Workspace folder is missing or unavailable',
  'files.openFile': 'Open',
  'files.empty': 'This folder is empty',
  'files.searchEmpty': 'No matches',
  'files.searchHint': 'Type at least 1 character to search',
  'files.noFileSelected': 'Select a file to start editing',
  'files.editorLoading': 'Loading editor...',
  'files.editorCrashed': 'The editor failed to load.',
  'files.editorReload': 'Reload',
  'files.errorLoading': 'Failed to load file: {message}',
  'files.errorLoadingTree': 'Failed to load directory: {message}',
  'files.uploadError': 'Upload failed: {message}',
  'files.uploadSuccess': 'Uploaded {count} file(s)',
  'files.confirmDelete': 'Delete',
  'files.dropToUpload': 'Drop files here to upload',
  'files.dropTargetInvalid': 'Cannot drop here',
  'files.namePlaceholder': 'Name...',
  'files.tab.close': 'Close',
  'files.tab.closeOthers': 'Close others',
  'files.tab.closeAll': 'Close all',
  'files.tab.aiBadge': 'Modified by AI',
  'files.tab.externalBadge': 'Modified outside the app',
  'files.outline.title': 'Outline',
  'files.outline.empty': 'No symbols in this file',
  'files.outline.loading': 'Loading outline...',
  'files.outline.unavailable': 'Outline requires an LSP server for this language',
  'files.problems.title': 'Problems',
  'files.problems.empty': 'No problems detected in opened files',
  'files.problems.errors': '{count} errors',
  'files.problems.warnings': '{count} warnings',
  'files.problems.errorsOne': '1 error',
  'files.problems.warningsOne': '1 warning',
  'files.problems.severityError': 'Error',
  'files.problems.severityWarning': 'Warning',
  'files.problems.severityInfo': 'Info',
  'files.problems.severityHint': 'Hint',
  'files.problems.severity.error': 'Error',
  'files.problems.severity.warning': 'Warning',
  'files.problems.severity.info': 'Info',
  'files.problems.severity.hint': 'Hint',
  'files.problems.scope.open': 'Open tabs',
  'files.problems.scope.workspace': 'Workspace',
  'files.problems.openFile': 'Jump to source',
  'files.statusBar.problems': 'Problems',
  'files.statusBar.problemsTooltip': 'Errors / Warnings across opened files',
  'files.statusBar.lineCol': 'Ln {line}, Col {column}',
  'files.statusBar.indent': 'Indent',
  'files.statusBar.encoding': 'Encoding',
  'files.statusBar.language': 'Language',
  'files.statusBar.lspReady': 'LSP ready',
  'files.statusBar.lspStarting': 'LSP starting',
  'files.statusBar.lspFailed': 'LSP failed',
  'files.statusBar.lspIdle': 'LSP idle',
  'files.statusBar.lspOff': 'LSP disabled',
  'editor.unsavedClose.title': 'Save changes?',
  'editor.unsavedClose.body': 'You have unsaved changes in {name}. Save before closing?',
  'editor.unsavedClose.save': 'Save',
  'editor.unsavedClose.discard': "Don't save",
  'editor.unsavedClose.cancel': 'Cancel',
  'debugReport.techDoc.screenshots': 'Screenshots',
  'debugReport.report.browserTrace': 'Browser Trace',
  'finder.empty': 'No matches',
  'files.search.kindName': 'Name',
  'files.search.kindContent': 'Content',
  'finder.quickOpen.title': 'Open file',
  'finder.quickOpen.placeholder': 'Type a file name to open',
  'finder.quickOpen.empty': 'Type to fuzzy-search files in the workspace',
  'finder.searchInFiles.title': 'Search in files',
  'finder.searchInFiles.placeholder': 'Type text to search across files',
  'finder.searchInFiles.empty': 'Type to search file contents (uses ripgrep when available)',
  'finder.workspaceSymbol.title': 'Go to symbol in workspace',
  'finder.workspaceSymbol.placeholder': 'Type a symbol name',
  'finder.workspaceSymbol.empty': 'Type to query workspace symbols via LSP',
  'finder.workspaceSymbol.unavailable': 'No LSP server is currently available for workspace symbols',
  'files.collapseAll': 'Collapse all',
  'files.filterPlaceholder': 'Filter visible...',
  'files.filterClear': 'Clear filter',
  'files.filterEmpty': 'No matching visible nodes',
  'files.tree.copyMarkdown': 'Copy as Markdown block',
  'files.tree.copyMarkdownDone': 'Copied as Markdown code block',
  'files.tree.copyMarkdownFailed': 'Failed to copy as Markdown',
  'workspace.copy': 'Copy',
  'workspace.cut': 'Cut',
  'workspace.paste': 'Paste',
  'workspace.copied': 'Copied "{name}"',
  'workspace.cutToast': 'Cut "{name}"',
  'workspace.copying': 'Copying "{name}" to {dir} {percent}%',
  'workspace.copyCancel': 'Cancel copy',
  'workspace.copyFailed': 'Copy failed: {message}',
  'workspace.moveFailed': 'Move failed: {message}',
  'workspace.moveIntoSelf': 'Cannot move a folder into itself',
  'editor.action.copyAsMarkdown': 'Copy selection as Markdown block',
  'lsp.preferences.title': 'Editor features',
  'lsp.preferences.inlayHints': 'Inlay hints',
  'lsp.preferences.inlayHintsDescription':
    'Show inline type and parameter hints provided by the language server.',
  'lsp.preferences.formatOnSave': 'Format on save',
  'lsp.preferences.formatOnSaveDescription':
    'Run the language server formatter before saving the file.',
  'lsp.preferences.hoverDelay': 'Hover delay',
  'lsp.preferences.hoverDelayDescription':
    'Milliseconds to wait before showing the hover popup.',
  'lsp.preferences.saveSuccess': 'Settings saved',
  'lsp.preferences.saveFailed': 'Failed to save settings: {message}',
  'lsp.codeAction.applied': 'Applied quick fix to {count} file(s)',
  'lsp.codeAction.partialFailure': 'Could not apply edits to: {files}',
  'lsp.codeAction.commandFailed': 'Code action command failed: {message}',
  'lsp.codeAction.skippedUndo':
    '{count} file(s) skipped the undo stack (close without saving to revert)',
  'codeViewer.showNext': 'Load next {count} lines',
  'codeViewer.showAll': 'Load all ({count} remaining)',
  'codeViewer.truncated': 'Showing {shown} of {total} lines',
  'codeViewer.showAllConfirm.title': 'Load entire file?',
  'codeViewer.showAllConfirm.body':
    'This will render {total} lines at once and may cause the editor to lag. Continue?',
  'codeViewer.showAllConfirm.confirm': 'Load all',
  'codeViewer.showAllConfirm.cancel': 'Cancel',
  'files.aiModifiedToast': 'AI modified {count} line(s)',
  'files.aiModifiedToastViewDiff': 'View diff',
  'files.diffMode.title': 'AI changes vs. previous content',
  'files.diffMode.dismiss': 'Close diff view',
  'files.externalChanged':
    'This file was modified outside the editor. Reload to see the latest content.',
  'files.externalChangedReload': 'Reload',
  'files.externalChangedDismiss': 'Dismiss',
  'files.tree.copyPath': 'Copy absolute path',
  'files.tree.copyRelativePath': 'Copy relative path',
  'files.tree.reveal': 'Reveal in file manager',
  'files.tree.openInTerminal': 'Open in integrated terminal',
  'files.tree.openTerminalFailed': 'Failed to open integrated terminal: {message}',
  'files.tree.sendToLan': 'Send to LAN user',
  'files.tree.uploadToGroup': 'Upload to project group',
  'files.tree.shareToLan': 'Share to LAN',
  'files.tree.lanNoPeers': 'No devices online',
  'files.tree.lanDiscoveryOff': 'LAN discovery is off',
  'files.tree.lanSendStarted': 'Sending “{name}”',
  'files.tree.lanSendFailed': 'Send failed: {message}',
  'files.tree.pathLabel': 'Path',
  'files.tree.sizeLabel': 'Size',
  'files.tree.modifiedLabel': 'Modified',
  'files.preview.copied': 'Copied to clipboard',
  'files.preview.copyFailed': 'Copy failed',
  'files.preview.revealFailed': 'Failed to reveal file: {message}',
  'files.preview.wordWrap': 'Toggle word wrap',
  'files.preview.minimap': 'Toggle minimap',
  'files.preview.whitespace': 'Toggle whitespace',
  'files.preview.copyPath': 'Copy absolute path',
  'files.preview.copyRelativePath': 'Copy relative path',
  'files.preview.reveal': 'Reveal in file manager',
  'files.preview.markdownSource': 'Source',
  'files.preview.markdownPreview': 'Preview',
  'files.preview.largeFileTitle': 'This file is large',
  'files.preview.largeFileBody':
    'The file is {size} ({lines} lines). Opening it in the editor may be slow.',
  'files.preview.largeFileOpen': 'Open anyway',
  'files.preview.largeFileTruncate': 'Show first {count} lines',
  'files.preview.largeFileTruncated':
    'Showing the first {count} of {total} lines (read-only).',

  'titlebar.code': 'Code',
  'titlebar.terminal': 'Terminal',
  'titlebar.history': 'History',
  'titlebar.window.minimize': 'Minimize',
  'titlebar.window.maximize': 'Maximize',
  'titlebar.window.restore': 'Restore Down',
  'titlebar.window.close': 'Close',
  'titlebar.window.zoom': 'Zoom',
  'titlebar.computerUse.enter': 'Control PC',
  'titlebar.computerUse.exit': 'Back to coding',

  'computerUse.title': 'Control PC',
  'computerUse.subtitle': 'Let a vision model operate your desktop',
  'computerUse.taskPlaceholder': 'Describe what you want done on this computer…',
  'computerUse.run': 'Run',
  'computerUse.stop': 'Stop',
  'computerUse.continue': 'Continue',
  'computerUse.replyPlaceholder': 'Reply to the agent…',
  'computerUse.send': 'Send',
  'computerUse.model': 'Vision model',
  'computerUse.noVisionModels': 'No vision-capable model found. Add one in Settings > Providers.',
  'computerUse.maxSteps': 'Max steps',
  'computerUse.stepDelay': 'Step delay (ms)',
  'computerUse.status.idle': 'Idle',
  'computerUse.status.running': 'Running',
  'computerUse.status.thinking': 'Thinking…',
  'computerUse.status.finished': 'Finished',
  'computerUse.status.callUser': 'Needs your help',
  'computerUse.status.error': 'Error',
  'computerUse.status.stopped': 'Stopped',
  'computerUse.empty': 'Describe a task and press Run. The agent will look at your screen and act step by step.',
  'computerUse.screenshot': 'Screenshot',
  'computerUse.steps': 'Steps',
  'computerUse.thought': 'Thought',
  'computerUse.action': 'Action',
  'computerUse.warning': 'The agent controls your real mouse and keyboard. Stay near the Stop button.',
  'computerUse.connecting': 'Connecting…',

  'menu.file': 'File',
  'menu.edit': 'Edit',
  'menu.view': 'View',
  'menu.help': 'Help',
  'menu.file.newSession': 'New Agent',
  'menu.file.openWorkspaceFolder': 'Open Workspace Folder',
  'menu.file.settings': 'Settings',
  'menu.file.quit': 'Quit',
  'menu.file.workspaceUnavailable': 'Opening a workspace folder requires the desktop app.',
  'menu.edit.undo': 'Undo',
  'menu.edit.redo': 'Redo',
  'menu.edit.cut': 'Cut',
  'menu.edit.copy': 'Copy',
  'menu.edit.paste': 'Paste',
  'menu.edit.selectAll': 'Select All',
  'menu.view.showLeftSidebar': 'Show Left Sidebar',
  'menu.view.hideLeftSidebar': 'Hide Left Sidebar',
  'menu.view.showRightSidebar': 'Show Right Sidebar',
  'menu.view.hideRightSidebar': 'Hide Right Sidebar',
  'menu.view.zoomIn': 'Zoom In',
  'menu.view.zoomOut': 'Zoom Out',
  'menu.view.resetZoom': 'Reset Zoom',
  'menu.help.documentation': 'Documentation',
  'menu.help.github': 'GitHub Repository',
  'menu.help.checkForUpdates': 'Check for Updates',

  'status.connected': 'Connected',
  'status.connecting': 'Connecting...',
  'status.reconnecting': 'Reconnecting...',
  'status.disconnected': 'Disconnected',

  'settings.title': 'Settings',
  'settings.backToHome': 'Back to home',
  'settings.tab.providers': 'Providers',
  'settings.tab.permissions': 'Permissions',
  'settings.tab.general': 'General',
  'settings.tab.agents': 'Agents',
  'settings.tab.skills': 'Rules, Skills, Subagents',
  'settings.tab.mcp': 'Tools & MCPs',
  'settings.tab.lsp': 'Language Servers',
  'settings.tab.keyboard': 'Keyboard Shortcuts',
  'settings.tab.hooks': 'Hooks',
  'settings.tab.usage': 'Usage',
  'settings.tab.evolution': 'Self-Evolution',
  'settings.tab.plugins': 'Plugins',
  'settings.tab.credentials': 'Credentials',
  'settings.integrations.title': 'Other integrations',
  'settings.integrations.description': 'Other providers and external services this build supports, with their current configuration status.',
  'settings.adapters.supportedChannels': 'Supported channels & status',
  'settings.adapters.supportedChannelsDesc': 'Chat channels this build supports and their current configuration status.',
  'settings.integrations.empty': 'No integrations available.',
  'settings.integrations.error': 'Failed to load integrations: {error}',
  'settings.integrations.statusActive': 'Active',
  'settings.integrations.statusAvailable': 'Available',
  'settings.integrations.statusComingSoon': 'Coming Soon',
  'automations.page.title': 'Automations',
  'automations.page.subtitle': 'Run agent tasks on a schedule, on an interval, once, when the system is idle, or after a session ends.',
  'automations.page.desktopNotice': 'Automations only run while the desktop app is open. Keep it running so tasks fire on time.',
  'automations.trigger.label': 'Trigger',
  'automations.trigger.schedule': 'On a schedule',
  'automations.trigger.idle': 'When idle',
  'automations.trigger.sessionEnd': 'After a session ends',
  'automations.trigger.afterIdle': 'Run after idle for (minutes)',
  'automations.trigger.idleHint': 'Runs in the background only when no conversation is active.',
  'automations.trigger.sessionEndHint': 'Runs once each time an active session finishes.',
  'automations.trigger.idleDesc': 'When idle · {duration}',
  'automations.trigger.sessionEndDesc': 'After session ends',
  'automations.trigger.intervalDesc': 'Every {duration}',
  'automations.trigger.onceDesc': 'Once · {time}',
  'automations.trigger.minutesValue': '{n} min',
  'automations.trigger.hoursValue': '{n} h',
  'automations.priority.label': 'Priority',
  'automations.priority.high': 'High',
  'automations.priority.normal': 'Normal',
  'automations.priority.low': 'Low',
  'automations.requireIdle': 'Only run when idle',
  'automations.requireIdleHint': 'Defer a scheduled run until the system has been idle for a while.',
  'automations.minutesUnit': 'minutes',
  'automations.maxDuration': 'Max duration (minutes)',
  'automations.maxDurationHint': 'Stop the task if it runs longer than this. 0 means no limit.',
  'credentials.title': 'Credential Vault',
  'credentials.description': 'Store reusable secrets (passwords, tokens, URLs). Credentials never leave this machine — chats reference them as credential chips and the real values are never sent to the LLM.',
  'credentials.empty': 'No credentials yet.',
  'credentials.add': 'Add credential',
  'credentials.edit': 'Edit',
  'credentials.delete': 'Delete',
  'credentials.deleteConfirm': 'Delete credential "{name}"? This cannot be undone.',
  'credentials.name': 'Name',
  'credentials.kind': 'Kind',
  'credentials.value': 'Value',
  'credentials.kind.username': 'Username',
  'credentials.kind.password': 'Password',
  'credentials.kind.token': 'Token',
  'credentials.kind.url': 'URL',
  'credentials.kind.other': 'Other',
  'credentials.placeholder.insert': 'Insert credential {name}',
  'credentials.placeholder.hint': 'Click a credential to insert it at the cursor; it shows as a chip in chat.',
  'credentials.save': 'Save credential',
  'credentials.cancel': 'Cancel',
  'credentials.show': 'Show',
  'credentials.hide': 'Hide',
  'credentials.created': 'Created',
  'credentials.updated': 'Updated',
  'credentials.nameInvalid': 'Name must contain only letters, digits, "_" or "-".',
  'credentials.valueRequired': 'Value cannot be empty.',
  'debug.qa.panelTitle': 'Credentials',
  'debug.qa.insertCred': 'Insert credential',
  'debug.qa.placeholder': 'Insert any secret from the "Credentials" button above — never paste real passwords.',
  'debug.qa.reportReady': 'QA report ready',
  'debug.qa.openReport': 'Open report',
  'debug.qa.takeover': 'Assistant is auto-testing this tab',
  'debug.qa.userAuthenticatedHint': 'Already logged in? Describe the feature to test — the assistant will take over the logged-in tab.',
  'debug.qa.coverage.title': 'Coverage',
  'debug.qa.inputPlaceholder': 'Paste the target URL (if already logged in, just describe what to test); use the "Credentials" button above for any secrets.',
  'settings.evolution.title': 'Self-Evolution',
  'settings.evolution.description': 'Self-reinforcing programming learning. The assistant collects turn data, distils lessons and can export datasets for external/cloud RL.',
  'settings.evolution.persistence.title': 'Local Training Data Persistence',
  'settings.evolution.persistence.description': 'When OFF the assistant only learns in-context: no raw turn data is written to disk. Lessons and playbooks are still persisted because they are the distilled knowledge.',
  'settings.evolution.persistence.toggleOn': 'Enabled',
  'settings.evolution.persistence.toggleOff': 'Disabled',
  'settings.evolution.persistence.usage': 'Disk usage',
  'settings.evolution.persistence.purgeTitle': 'Purge local training data',
  'settings.evolution.persistence.purgeWarning': 'This is irreversible. Type I_UNDERSTAND to confirm.',
  'settings.evolution.persistence.purgeAll': 'Purge all',
  'settings.evolution.persistence.purgeTurns': 'Purge raw turns',
  'settings.evolution.persistence.purgeExports': 'Purge exports',
  'settings.evolution.persistence.purgeHistory': 'Purge push history',
  'settings.evolution.persistence.purgeEvents': 'Purge audit events',
  'settings.evolution.metrics.title': 'Self-Evolution Metrics',
  'settings.evolution.metrics.totalTurns': 'Recorded turns',
  'settings.evolution.metrics.lessons': 'Lessons',
  'settings.evolution.metrics.lessonsActive': 'Active lessons',
  'settings.evolution.metrics.lessonHits': 'Total injections',
  'settings.evolution.metrics.exports': 'Exports',
  'settings.evolution.metrics.pushes': 'Push receipts',
  'settings.evolution.metrics.toolSearch': 'tool_search calls / activations / blocked',
  'settings.evolution.metrics.toolSearchTooltip':
    'tool_search invocations · tools activated · activations rejected for safety · average activation latency.',
  'settings.evolution.metrics.deferredBuiltin': '{count} stubs deferred',
  'settings.evolution.maintenance.title': 'Maintenance',
  'settings.evolution.maintenance.description':
    'Manually distill lessons or rescore reward signals for stored turns.',
  'settings.evolution.maintenance.persistRequired':
    'Enable training data persistence first; otherwise no raw turns are available.',
  'settings.evolution.maintenance.turnIdLabel': 'Turn ID',
  'settings.evolution.maintenance.distill': 'Distill',
  'settings.evolution.maintenance.distillQueued': 'Queued for distillation: {turnId}',
  'settings.evolution.maintenance.distillFailed':
    'Distillation failed; check the turn ID and persistence state.',
  'settings.evolution.maintenance.rescore': 'Rescore all',
  'settings.evolution.maintenance.rescoreHint':
    'Re-run evaluators and refresh reward signals for every stored turn.',
  'settings.evolution.maintenance.rescoreDone':
    'Done: rescored {rescored}, errors {errors}, total scanned {totalSeen}.',
  'settings.evolution.maintenance.rescoreFailed': 'Rescore failed, please retry.',
  'settings.evolution.lessons.title': 'Lessons',
  'settings.evolution.lessons.empty': 'No lessons yet — they will appear after the assistant solves successful turns.',
  'settings.evolution.config.title': 'Engine Settings',
  'settings.evolution.config.judgeEnabled': 'Async next-state PRM judge',
  'settings.evolution.config.autoDistill': 'Auto-distill on session end',
  'settings.evolution.config.maxLessons': 'Max lessons in prompt',
  'settings.evolution.config.tokenBudget': 'Lesson token budget',
  'settings.evolution.config.judgeModel': 'Judge model override',
  'settings.evolution.export.title': 'Export Datasets',
  'settings.evolution.export.description': 'Project recorded turns into one of six standard JSONL formats for external training or cloud RL.',
  'settings.evolution.export.disabled': 'Persistence is OFF. Enable persistence above to record raw turns before exporting.',
  'settings.evolution.export.format': 'Format',
  'settings.evolution.export.create': 'Create export',
  'settings.evolution.export.recent': 'Recent exports',
  'settings.evolution.export.empty': 'No exports yet.',
  'settings.evolution.cloud.title': 'Cloud RL Targets',
  'settings.evolution.cloud.description': 'Configure cloud destinations (OpenAI files, HuggingFace datasets, RL Dataset Server, Tinker, Fireworks, custom webhook) and push exports.',
  'settings.evolution.cloud.empty': 'No cloud targets configured.',
  'settings.evolution.cloud.history': 'Recent push history',
  'settings.evolution.cloud.add': 'Add target',
  'settings.evolution.cloud.push': 'Push',

  'settings.evolution.recycling.title': 'Experience Recycling',
  'settings.evolution.recycling.description':
    'Capture, clean and replay high-signal turns. Selected experiences are injected into the next turn prompt to bias the assistant toward proven patterns.',
  'settings.evolution.recycling.toggle': 'Enable recycling',
  'settings.evolution.recycling.sampleRate': 'Sample rate',
  'settings.evolution.recycling.sampleRateHelp':
    'Probability that an eligible turn is captured. 0 = off, 1 = always.',
  'settings.evolution.recycling.minReward': 'Minimum reward',
  'settings.evolution.recycling.minRewardHelp':
    'Only keep turns whose final reward meets this floor (use negative values to also keep failures).',
  'settings.evolution.recycling.maxRetained': 'Max stored experiences',
  'settings.evolution.recycling.maxReplayInPrompt': 'Max replayed per turn',
  'settings.evolution.recycling.replayTokenBudget': 'Replay token budget',
  'settings.evolution.recycling.privacy': 'Privacy redaction',
  'settings.evolution.recycling.redactPaths': 'Redact workspace paths',
  'settings.evolution.recycling.redactSecrets': 'Redact secrets & env values',
  'settings.evolution.recycling.redactUserText': 'Redact raw user text',
  'settings.evolution.recycling.includeSuccesses': 'Capture successes',
  'settings.evolution.recycling.includeFailures': 'Capture failures',
  'settings.evolution.recycling.weights': 'Replay ranking weights',
  'settings.evolution.recycling.weightQuality': 'Quality',
  'settings.evolution.recycling.weightRecency': 'Recency',
  'settings.evolution.recycling.weightDiversity': 'Diversity',
  'settings.evolution.recycling.recent': 'Recent recycled experiences',
  'settings.evolution.recycling.empty': 'No experiences recycled yet.',
  'settings.evolution.recycling.purge': 'Purge all',
  'settings.evolution.recycling.total': 'Stored: {count}',
  'settings.evolution.recycling.outcome.success': 'success',
  'settings.evolution.recycling.outcome.failure': 'failure',
  'settings.evolution.recycling.outcome.neutral': 'neutral',

  'settings.evolution.reflection.title': 'Self-Reflection',
  'settings.evolution.reflection.description':
    'Periodically inspect recent turns with an LLM, distil insights and write them back as lessons, skills, rules or memory entries.',
  'settings.evolution.reflection.toggle': 'Enable self-reflection',
  'settings.evolution.reflection.triggerMode': 'Trigger mode',
  'settings.evolution.reflection.triggerMode.manual': 'Manual only',
  'settings.evolution.reflection.triggerMode.auto': 'Auto (event driven)',
  'settings.evolution.reflection.triggerMode.scheduled': 'Scheduled interval',
  'settings.evolution.reflection.depth': 'Reflection depth',
  'settings.evolution.reflection.depth.quick': 'Quick',
  'settings.evolution.reflection.depth.deep': 'Deep',
  'settings.evolution.reflection.model': 'Reflection model (optional)',
  'settings.evolution.reflection.modelHelp': 'Leave blank to reuse the judge / primary model.',
  'settings.evolution.reflection.provider': 'Reflection provider (optional)',
  'settings.evolution.modelPicker.noModelsConfigured': 'No models added',
  'settings.evolution.modelPicker.providerHasNoModels': 'The selected provider has no models',
  'settings.evolution.modelPicker.addProviderFirst': 'Add a provider with models in Adapter Settings first',
  'settings.evolution.modelPicker.useDefault': 'Use default (unspecified)',
  'settings.evolution.modelPicker.unregisteredHint': '{model} (unregistered)',
  'settings.evolution.modelPicker.goToAdapterSettings': 'Add and save models in Adapter Settings before selecting here.',
  'settings.evolution.modelPicker.providerAuto': 'Follow judge default provider',
  'settings.evolution.modelPicker.providerDefaultTag': 'default',
  'settings.evolution.reflection.scheduleIntervalMinutes': 'Schedule interval (minutes)',
  'settings.evolution.reflection.minTurnsForAuto': 'Min turns before auto reflect',
  'settings.evolution.reflection.failureThreshold': 'Auto trigger after N failures',
  'settings.evolution.reflection.includeUserThumbsDown': 'Treat thumbs-down as failure',
  'settings.evolution.reflection.lookbackTurns': 'Lookback turns per run',
  'settings.evolution.reflection.maxLessonsPerRun': 'Max lessons per run',
  'settings.evolution.reflection.maxTotalLessons': 'Max total lessons retained',
  'settings.evolution.reflection.writeback': 'Writeback targets',
  'settings.evolution.reflection.writeback.lessons': 'Lessons (DB)',
  'settings.evolution.reflection.writeback.skills': 'Skill notes',
  'settings.evolution.reflection.writeback.rules': 'User rules',
  'settings.evolution.reflection.writeback.memory': 'Memory file',
  'settings.evolution.reflection.runNow': 'Reflect now',
  'settings.evolution.reflection.runQueued': 'Reflection queued: {runId}',
  'settings.evolution.reflection.runFailed': 'Failed to trigger reflection: {error}',
  'settings.evolution.reflection.recent': 'Recent reflection runs',
  'settings.evolution.reflection.empty': 'No reflection runs yet.',
  'settings.evolution.reflection.summary.totalRuns': 'Total runs',
  'settings.evolution.reflection.summary.completed': 'Completed',
  'settings.evolution.reflection.summary.failed': 'Failed',
  'settings.evolution.reflection.summary.lessons': 'Lessons produced',
  'settings.evolution.reflection.summary.lastRunAt': 'Last run',
  'settings.evolution.reflection.summary.lastStatus': 'Last status',
  'settings.evolution.reflection.summary.avgLessonsPerRun': 'Avg lessons / run',

  'settings.evolution.reflection.persistRequired.title':
    'Persist training data is required',
  'settings.evolution.reflection.persistRequired.body':
    'Self-reflection needs persistence enabled so recent turns can be replayed for the reflector.',
  'settings.evolution.reflection.persistRequired.enable': 'Enable now',
  'settings.evolution.reflection.persistAutoEnabledToast':
    'Persist training data was automatically enabled to support reflection / recycling.',

  'settings.evolution.reflection.runError.persistence_required':
    'Enable Persist training data first.',
  'settings.evolution.reflection.runError.no_turns_available':
    'No turn records yet. Have a chat first, then try again.',
  'settings.evolution.reflection.runError.reflection_disabled':
    'Self-reflection is disabled. Turn it on first.',
  'settings.evolution.reflection.runError.reflection_queue_full':
    'Reflection queue is full. Please retry in a moment.',
  'settings.evolution.reflection.runError.reflection_store_unavailable':
    'Reflection storage is not ready. Check application logs.',
  'settings.evolution.reflection.runError.reflection_worker_unavailable':
    'Reflection worker is not initialised yet.',
  'settings.evolution.reflection.runError.model_not_registered':
    'The selected reflection model is not configured in any provider.',
  'settings.evolution.reflection.runError.provider_not_registered':
    'The selected reflection provider is not configured.',

  'settings.evolution.reflection.run.status.queued': 'Queued',
  'settings.evolution.reflection.run.status.running': 'Running',
  'settings.evolution.reflection.run.status.completed': 'Completed',
  'settings.evolution.reflection.run.status.failed': 'Failed',
  'settings.evolution.reflection.run.status.skipped': 'Skipped',

  'settings.evolution.reflection.skipReason.no_provider':
    'No reflection provider is configured.',
  'settings.evolution.reflection.skipReason.no_provider_for_registered_model':
    'No provider in the configured set could serve the reflection model.',
  'settings.evolution.reflection.skipReason.model_not_registered':
    'Reflection model is not registered in any provider.',
  'settings.evolution.reflection.skipReason.writeback_skill_skipped':
    'Skill writeback was skipped (e.g. missing home directory or empty slug).',
  'settings.evolution.reflection.skipReason.writeback_rule_skipped':
    'Rule writeback was skipped (e.g. missing home directory or empty slug).',

  'settings.evolution.recycling.persistRequired.title':
    'Persist training data is required',
  'settings.evolution.recycling.persistRequired.body':
    'Experience recycling stores harvested turns; enable persistence so the SQLite store is reachable.',
  'settings.evolution.recycling.persistRequired.enable': 'Enable now',
  'settings.evolution.recycling.runtime.todayHarvested': 'Today {count}',
  'settings.evolution.recycling.runtime.totalHarvested': 'Total {count}',
  'settings.evolution.recycling.runtime.lastHarvestAt': 'Last harvest {ts}',

  'settings.evolution.overview.judgeWorker.running': 'Judge: running',
  'settings.evolution.overview.judgeWorker.idle': 'Judge: idle',
  'settings.evolution.overview.judgeWorker.error': 'Judge: error',
  'settings.evolution.overview.reflectionScheduler.label': 'Reflection scheduler',
  'settings.evolution.overview.reflectionScheduler.never': 'never',
  'settings.evolution.overview.reflectionScheduler.intervalMinutes':
    'every {minutes} min',

  'settings.evolution.modelEmpty.gotoProviders': 'Go to provider settings',

  'terminal.panel.newTab': 'New terminal',
  'terminal.panel.closeTab': 'Close tab',
  'terminal.panel.clear': 'Clear',
  'terminal.panel.hide': 'Hide panel',
  'terminal.panel.resize': 'Resize panel',
  'terminal.tab.agentMirror': 'Agent',
  'terminal.tab.untitled': 'Terminal',
  'terminal.status.idle': 'Idle',
  'terminal.status.starting': 'Starting',
  'terminal.status.running': 'Running',
  'terminal.status.exited': 'Exited',
  'terminal.status.error': 'Error',
  'terminal.status.unavailable': 'Unavailable',

  'settings.providers.title': 'Providers',
  'settings.providers.description': 'Manage API providers for model access.',
  'settings.providers.addProvider': 'Add Provider',
  'settings.providers.officialName': 'Default Provider',
  'settings.providers.officialDesc': 'No provider selected yet',
  'settings.providers.empty': 'No providers configured. Click "Add Provider" to get started.',
  'settings.providers.modelCount': '{count} models',
  'settings.providers.modelsHeader': 'Models',
  'settings.providers.modelsHelp': 'The first entry is treated as the primary model. The second column is the context window in tokens (used by the composer ring); leave blank to fall back to the built-in heuristic.',
  'settings.providers.noModels': 'No models added yet.',
  'settings.providers.primaryTag': 'PRIMARY',
  'settings.providers.addModel': 'Add Model',
  'settings.providers.addModelPlaceholder': 'Type a model id and press Enter',
  'settings.providers.modelTypeLabel': 'Model types',
  'settings.providers.modelTypeTooltip': 'Pick the capability types for this model (multi-select). The composer model picker only lists models matching the current function (e.g. image/video/audio generation). Legacy models without a type default to text generation.',
  'settings.providers.modelTypeNone': 'No type selected — defaults to text generation',
  'settings.modelTypes.text': 'Text generation',
  'settings.modelTypes.image-generation': 'Image generation',
  'settings.modelTypes.video-generation': 'Video generation',
  'settings.modelTypes.audio-generation': 'Audio generation',
  'settings.modelTypes.image-understanding': 'Image understanding',
  'settings.modelTypes.video-understanding': 'Video understanding',
  'settings.modelTypes.speech-recognition': 'Speech recognition',
  'settings.modelTypes.embedding': 'Embedding',
  'settings.modelTypes.rerank': 'Rerank',
  'settings.modelTypes.music-generation': 'Music generation',
  'settings.providers.contextWindowPlaceholder': 'Tokens (e.g. 1000000)',
  'settings.providers.contextWindowTooltip': 'Maximum context window for this model in tokens. The composer\u2019s token-usage ring uses this as the upper bound. Leave blank to use the built-in heuristic.',
  'settings.providers.priceInputPlaceholder': 'In $/M',
  'settings.providers.priceInputTooltip': 'Input token price (USD per million tokens), used by the usage page cost stats. Leave blank to fall back to the built-in pricing table; unmatched models count as $0.',
  'settings.providers.priceOutputPlaceholder': 'Out $/M',
  'settings.providers.priceOutputTooltip': 'Output token price (USD per million tokens), used by the usage page cost stats. Leave blank to fall back to the built-in pricing table; unmatched models count as $0.',
  'settings.providers.editModels': 'Edit Models',
  'settings.providers.searchModels': 'Add or search models',
  'settings.providers.discoverTitle': 'Fetch official model list',
  'settings.providers.fetchModelList': 'Fetch latest models',
  'settings.providers.discoverError': 'Failed to fetch model list',
  'settings.providers.discoverEmpty': 'No models found',
  'settings.providers.discoveredCount': 'Discovered {count} models (source: {source})',
  'settings.providers.discoverSourceRemote': 'online',
  'settings.providers.discoverSourceCache': 'cache',
  'settings.providers.selectAll': 'Select all',
  'settings.providers.deselectAll': 'Deselect all',
  'settings.providers.allTab': 'All',
  'settings.providers.alreadyAdded': 'Added',
  'settings.providers.applySelected': 'Apply selected ({count})',
  'settings.providers.searchAllModels': 'Search models by id or provider',
  'settings.providers.globalModelsHelp': 'Enable or disable models across all providers. Disabled models are hidden from the model selector.',
  'settings.providers.viewAllModels': 'View All Models',
  'settings.providers.showLessModels': 'Show Less',
  'settings.providers.modelsShowingCount': 'Showing {shown} of {total} models',
  'settings.providers.refreshModels': 'Refresh models',
  'settings.providers.noModelsMatch': 'No matching models',
  'settings.providers.noBaseUrl': 'No base URL set',
  'settings.providers.connected': 'Connected ({latency}ms)',
  'settings.providers.failed': 'Failed: {error}',
  'settings.providers.connectivityOk': '① Connectivity ({latency}ms)',
  'settings.providers.connectivityFailed': '① Connectivity failed: {error}',
  'settings.providers.proxyOk': '② Proxy pipeline ({latency}ms)',
  'settings.providers.proxyFailed': '② Proxy failed: {error}',
  'settings.providers.confirmDelete': 'Delete provider "{name}"? This cannot be undone.',
  'settings.providers.activate': 'Activate',
  'settings.providers.default': 'Default',
  'settings.providers.setDefault': 'Set default',
  'settings.providers.test': 'Test',
  'settings.providers.edit': 'Edit',
  'settings.providers.requestFailed': 'Request failed',
  'settings.providers.addTitle': 'Add Provider',
  'settings.providers.editTitle': 'Edit Provider',
  'settings.providers.preset': 'Preset',
  'settings.providers.name': 'Name',
  'settings.providers.namePlaceholder': 'Provider name',
  'settings.providers.nameConflict': 'This display name is already in use; submission was still accepted (each provider has a unique ID, but a unique name is recommended).',
  'settings.providers.nameConflictHint': 'A provider named "{{name}}" already exists. Each provider has its own unique ID so duplicate display names are allowed, but a unique name is recommended for clarity.',
  'settings.providers.notes': 'Notes',
  'settings.providers.notesPlaceholder': 'Optional notes...',
  'settings.providers.baseUrl': 'Base URL',
  'settings.providers.baseUrlPlaceholder': 'https://api.example.com/anthropic',
  'settings.providers.apiKey': 'API Key',
  'settings.providers.apiKeyKeep': 'API Key (leave blank to keep current)',
  'settings.providers.testConnection': 'Test Connection',
  'settings.providers.apiFormat': 'API Format',
  'settings.providers.apiFormatAnthropic': 'Anthropic Messages',
  'settings.providers.apiFormatOpenaiChat': 'OpenAI Chat Completions',
  'settings.providers.apiFormatOpenaiResponses': 'OpenAI Responses API',

  'settings.providers.advanced.title': 'Advanced settings',
  'settings.providers.advanced.customHeaders.title': 'Custom HTTP headers',
  'settings.providers.advanced.customHeaders.description': 'Extra headers sent on every request to this provider (e.g. anthropic-beta, HTTP-Referer, x-tenant). Disabled rows are kept for reference but not sent.',
  'settings.providers.advanced.customHeaders.add': 'Add header',
  'settings.providers.advanced.customHeaders.nameLabel': 'Header name',
  'settings.providers.advanced.customHeaders.valueLabel': 'Header value',
  'settings.providers.advanced.customHeaders.enabled': 'Enabled',
  'settings.providers.advanced.customHeaders.remove': 'Remove header',
  'settings.providers.advanced.customHeaders.invalidName': 'Invalid header name (only ASCII letters/digits and ! # $ % & \' * + - . ^ _ ` | ~ are allowed).',
  'settings.providers.advanced.customHeaders.duplicateName': 'Duplicate header name; only the first row will be sent.',
  'settings.providers.advanced.customHeaders.disallowed': 'Reserved header; managed by the provider itself and will be ignored at runtime.',
  'settings.providers.advanced.customHeaders.empty': 'No custom headers. Click "Add header" to add one (e.g. anthropic-beta, HTTP-Referer, X-Title).',
  'settings.providers.advanced.customHeaders.show': 'Show value',
  'settings.providers.advanced.customHeaders.hide': 'Hide value',

  'settings.permissions.title': 'Permission Mode',
  'settings.permissions.description': 'Controls how tool execution permissions are handled.',
  'settings.permissions.default': 'Ask permissions',
  'settings.permissions.defaultDesc': 'Ask before executing tools',
  'settings.permissions.acceptEdits': 'Accept edits',
  'settings.permissions.acceptEditsDesc': 'Auto-approve file edits, ask for others',
  'settings.permissions.plan': 'Plan mode',
  'settings.permissions.planDesc': 'Think and plan without executing',
  'settings.permissions.bypass': 'Bypass all',
  'settings.permissions.bypassDesc': 'Skip all permission checks (dangerous)',

  'settings.tab.adapters': 'Integrations',
  'settings.adapters.description': 'Configure IM adapters to chat with SenWeaverCoding via Telegram or Feishu.',
  'settings.adapters.telegram': 'Telegram',
  'settings.adapters.feishu': 'Feishu',
  'settings.adapters.botToken': 'Bot Token',
  'settings.adapters.botTokenPlaceholder': 'Paste token from @BotFather',
  'settings.adapters.appId': 'App ID',
  'settings.adapters.appIdPlaceholder': 'e.g. cli_xxx',
  'settings.adapters.appSecret': 'App Secret',
  'settings.adapters.appSecretPlaceholder': 'From Feishu Open Platform',
  'settings.adapters.encryptKey': 'Encrypt Key',
  'settings.adapters.encryptKeyPlaceholder': 'Optional',
  'settings.adapters.verificationToken': 'Verification Token',
  'settings.adapters.verificationTokenPlaceholder': 'Optional',
  'settings.adapters.allowedUsers': 'Allowed Users',
  'settings.adapters.allowedUsersHint': 'Comma-separated. Leave empty to allow everyone.',
  'settings.adapters.tgAllowedUsersPlaceholder': 'e.g. 123456789, 987654321',
  'settings.adapters.fsAllowedUsersPlaceholder': 'e.g. ou_xxx, ou_yyy',
  'settings.adapters.defaultProject': 'Default Project',
  'settings.adapters.defaultProjectHint': 'Default working directory for new IM sessions. If empty, the bot will ask you to choose.',
  'settings.adapters.streamingCard': 'Streaming Card Mode',
  'settings.adapters.streamingCardDesc': 'Real-time card updates for better experience',
  'settings.adapters.serverUrl': 'Server URL',
  'settings.adapters.serverUrlPlaceholder': 'ws://127.0.0.1:42617',
  'settings.adapters.save': 'Save',
  'settings.adapters.saved': 'Saved',
  'settings.adapters.saving': 'Saving...',
  'settings.adapters.startHint': 'After saving, run adapter: cd adapters && bun run {platform}',
  'settings.adapters.pairing': 'Pairing',
  'settings.adapters.pairingDesc': 'Generate a pairing code and send it to the Bot via IM private chat to bind your identity.',
  'settings.adapters.generateCode': 'Generate Code',
  'settings.adapters.regenerateCode': 'Regenerate',
  'settings.adapters.codeExpired': 'Expired',
  'settings.adapters.codeExpiresIn': 'Expires in',
  'settings.adapters.minutes': 'min',
  'settings.adapters.pairingCodeHint': 'Send this code to the Bot in Feishu or Telegram private chat.',
  'settings.adapters.pairedUsers': 'Paired Users',
  'settings.adapters.noPairedUsers': 'No paired users yet',
  'settings.adapters.unbind': 'Unbind',
  'settings.adapters.unbindConfirm': 'Are you sure you want to unbind this user? They will need to re-pair to use the bot.',
  'settings.adapters.platform.telegram': 'Telegram',
  'settings.adapters.platform.feishu': 'Feishu',

  'settings.adapters.descriptionFull': 'Configure all messaging, voice, email, and webhook channels SenWeaverCoding can talk through. Each card stores credentials directly into your local config.toml.',
  'settings.adapters.generalSection': 'General settings',
  'settings.adapters.generalSectionDesc': 'Workspace, session storage, and behaviour shared across every channel.',
  'settings.adapters.disable': 'Disable',
  'settings.adapters.disableChannel': 'Disable channel',
  'settings.adapters.disableChannelConfirm': 'This will clear the channel credentials from config and stop the adapter. The channel can be re-enabled at any time by filling in the form again.',
  'settings.adapters.featureMissing': 'This channel was not compiled into the current build (missing Cargo feature flag).',
  'settings.adapters.status.configured': 'Configured',
  'settings.adapters.status.empty': 'Not configured',
  'settings.adapters.status.unavailable': 'Unavailable',
  'settings.adapters.tribool.follow': 'Follow global default',
  'settings.adapters.tribool.on': 'Force on',
  'settings.adapters.tribool.off': 'Force off',
  'settings.adapters.select.unset': '(use default)',

  'settings.adapters.categories.im': 'Instant Messaging & Bots',
  'settings.adapters.categories.whatsapp': 'WhatsApp Family',
  'settings.adapters.categories.email': 'Email',
  'settings.adapters.categories.webhookSocial': 'Webhook & Social',
  'settings.adapters.categories.voice': 'Voice',

  'settings.adapters.channels.telegram.name': 'Telegram',
  'settings.adapters.channels.telegram.tagline': 'Connect a Telegram bot via the Bot API.',
  'settings.adapters.channels.discord.name': 'Discord',
  'settings.adapters.channels.discord.tagline': 'Discord bot — slash commands, mentions and threads.',
  'settings.adapters.channels.discordHistory.name': 'Discord History',
  'settings.adapters.channels.discordHistory.tagline': 'Logs every message in your guild and forwards @mentions.',
  'settings.adapters.channels.slack.name': 'Slack',
  'settings.adapters.channels.slack.tagline': 'Slack bot via Socket Mode or Events API.',
  'settings.adapters.channels.mattermost.name': 'Mattermost',
  'settings.adapters.channels.mattermost.tagline': 'Self-hosted Mattermost team server.',
  'settings.adapters.channels.lark.name': 'Lark (International)',
  'settings.adapters.channels.lark.tagline': 'ByteDance Lark — international app domain.',
  'settings.adapters.channels.feishu.name': 'Feishu (China)',
  'settings.adapters.channels.feishu.tagline': 'ByteDance Feishu — Chinese open platform.',
  'settings.adapters.channels.dingtalk.name': 'DingTalk',
  'settings.adapters.channels.dingtalk.tagline': 'Alibaba DingTalk — Stream Mode bot.',
  'settings.adapters.channels.wecom.name': 'WeCom',
  'settings.adapters.channels.wecom.tagline': 'Tencent WeCom — Bot Webhook.',
  'settings.adapters.channels.qq.name': 'QQ Official',
  'settings.adapters.channels.qq.tagline': 'Tencent QQ Official Bot SDK.',
  'settings.adapters.channels.matrix.name': 'Matrix',
  'settings.adapters.channels.matrix.tagline': 'Self-hosted federated Matrix homeserver.',
  'settings.adapters.channels.signal.name': 'Signal',
  'settings.adapters.channels.signal.tagline': 'Signal Messenger via signal-cli daemon.',
  'settings.adapters.channels.irc.name': 'IRC',
  'settings.adapters.channels.irc.tagline': 'Connect to an IRC server over TLS.',
  'settings.adapters.channels.imessage.name': 'iMessage',
  'settings.adapters.channels.imessage.tagline': 'Apple iMessage — macOS host only.',
  'settings.adapters.channels.nextcloudTalk.name': 'Nextcloud Talk',
  'settings.adapters.channels.nextcloudTalk.tagline': 'Nextcloud Talk webhook bot.',
  'settings.adapters.channels.mochat.name': 'Mochat',
  'settings.adapters.channels.mochat.tagline': 'Customer-service bot via Mochat polling API.',
  'settings.adapters.channels.nostr.name': 'Nostr',
  'settings.adapters.channels.nostr.tagline': 'Decentralised social — NIP-04/17 DMs.',

  'settings.adapters.channels.whatsapp.name': 'WhatsApp',
  'settings.adapters.channels.whatsapp.tagline': 'Cloud API or native Web client (wa-rs).',
  'settings.adapters.channels.linq.name': 'Linq',
  'settings.adapters.channels.linq.tagline': 'iMessage / RCS / SMS via Linq Partner API.',
  'settings.adapters.channels.wati.name': 'WATI',
  'settings.adapters.channels.wati.tagline': 'WhatsApp Business via WATI provider.',

  'settings.adapters.channels.email.name': 'Email (IMAP/SMTP)',
  'settings.adapters.channels.email.tagline': 'IMAP IDLE for inbound, SMTP for outbound replies.',
  'settings.adapters.channels.gmailPush.name': 'Gmail Push',
  'settings.adapters.channels.gmailPush.tagline': 'Gmail real-time notifications via Pub/Sub.',

  'settings.adapters.channels.webhook.name': 'Generic Webhook',
  'settings.adapters.channels.webhook.tagline': 'Universal HTTP adapter — receive POST, send POST/PUT.',
  'settings.adapters.channels.twitter.name': 'X / Twitter',
  'settings.adapters.channels.twitter.tagline': 'X (Twitter) bot via API v2 Bearer token.',
  'settings.adapters.channels.reddit.name': 'Reddit',
  'settings.adapters.channels.reddit.tagline': 'Reddit OAuth2 bot (DMs and subreddit feed).',
  'settings.adapters.channels.bluesky.name': 'Bluesky',
  'settings.adapters.channels.bluesky.tagline': 'Bluesky / AT Protocol app password.',

  'settings.adapters.channels.voiceCall.name': 'Voice Call (Twilio/Telnyx/Plivo)',
  'settings.adapters.channels.voiceCall.tagline': 'Real-time phone calls with STT/TTS streaming.',
  'settings.adapters.channels.telnyx.name': 'Telnyx',
  'settings.adapters.channels.telnyx.tagline': 'AI voice calls via Telnyx SIP infrastructure.',
  'settings.adapters.channels.voiceWake.name': 'Voice Wake-Word',
  'settings.adapters.channels.voiceWake.tagline': 'Local microphone — wake word triggered capture.',

  'settings.adapters.notices.signal': 'Requires a running signal-cli HTTP daemon. Bridge it to your Signal account first; this UI just stores the URL and account.',
  'settings.adapters.notices.imessage': 'Available on macOS hosts only. SenWeaverCoding talks to your local Messages.app via AppleScript.',
  'settings.adapters.notices.whatsapp': 'WhatsApp has two modes: fill Cloud API fields (phone number ID + access token + verify token) for Meta Business, or fill Session Path for the native Web client.',
  'settings.adapters.notices.gmailPush': 'Set up a Pub/Sub topic, grant gmail-api-push@system.gserviceaccount.com Publisher role, then point a push subscription at /webhook/gmail.',
  'settings.adapters.notices.twitter': 'You need an X (Twitter) Developer account and an app with elevated access. Bearer token requires User Authentication Settings configured.',
  'settings.adapters.notices.reddit': 'OAuth2 refresh-token flow: create a Reddit app, do the auth-code dance once, paste the resulting refresh token here.',
  'settings.adapters.notices.voiceCall': 'Pick a provider then fill the matching credentials. Webhook port must be reachable from the public internet (use an ngrok / Tailscale tunnel during local dev).',

  'settings.adapters.fields.botToken': 'Bot Token',
  'settings.adapters.fields.appId': 'App ID',
  'settings.adapters.fields.appSecret': 'App Secret',
  'settings.adapters.fields.appToken': 'App Token',
  'settings.adapters.fields.encryptKey': 'Encrypt Key',
  'settings.adapters.fields.verificationToken': 'Verification Token',
  'settings.adapters.fields.allowedUsers': 'Allowed Users',
  'settings.adapters.fields.proxyUrl': 'Proxy URL',
  'settings.adapters.fields.mentionOnly': 'Respond only when @-mentioned',
  'settings.adapters.fields.interruptOnNewMessage': 'Cancel in-flight reply on new message',
  'settings.adapters.fields.streamMode': 'Streaming mode',
  'settings.adapters.fields.draftUpdateIntervalMs': 'Draft update interval (ms)',
  'settings.adapters.fields.multiMessageDelayMs': 'Multi-message delay (ms)',
  'settings.adapters.fields.ackReactionsOverride': 'Ack reactions (override global)',
  'settings.adapters.fields.guildId': 'Guild ID',
  'settings.adapters.fields.channelIds': 'Channel IDs',
  'settings.adapters.fields.listenToBots': 'Listen to other bots',
  'settings.adapters.fields.storeDms': 'Store DMs',
  'settings.adapters.fields.respondToDms': 'Respond to DMs',
  'settings.adapters.fields.slackBotToken': 'Bot User OAuth Token',
  'settings.adapters.fields.slackAppToken': 'App-Level Token (Socket Mode)',
  'settings.adapters.fields.slackChannelId': 'Default Channel ID',
  'settings.adapters.fields.slackChannelIds': 'Allowed Channel IDs',
  'settings.adapters.fields.threadReplies': 'Reply in thread',
  'settings.adapters.fields.useMarkdownBlocks': 'Render Markdown as Slack blocks',
  'settings.adapters.fields.streamDrafts': 'Stream drafts (live edit)',
  'settings.adapters.fields.mattermostUrl': 'Server URL',
  'settings.adapters.fields.mattermostChannelId': 'Channel ID',
  'settings.adapters.fields.useFeishu': 'Use Feishu (Chinese) endpoints',
  'settings.adapters.fields.receiveMode': 'Receive mode',
  'settings.adapters.fields.webhookPort': 'Webhook port',
  'settings.adapters.fields.streamingCard': 'Streaming card mode',
  'settings.adapters.fields.clientId': 'Client ID',
  'settings.adapters.fields.clientSecret': 'Client Secret',
  'settings.adapters.fields.refreshToken': 'Refresh Token',
  'settings.adapters.fields.webhookKey': 'Webhook Key',
  'settings.adapters.fields.matrixHomeserver': 'Homeserver URL',
  'settings.adapters.fields.accessToken': 'Access Token',
  'settings.adapters.fields.matrixUserId': 'User ID',
  'settings.adapters.fields.matrixDeviceId': 'Device ID',
  'settings.adapters.fields.matrixRoomId': 'Room ID',
  'settings.adapters.fields.matrixAllowedRooms': 'Allowed Rooms',
  'settings.adapters.fields.matrixRecoveryKey': 'Recovery Key (optional)',
  'settings.adapters.fields.signalHttpUrl': 'signal-cli HTTP URL',
  'settings.adapters.fields.signalAccount': 'Signal Account (E.164)',
  'settings.adapters.fields.signalGroupId': 'Group ID Filter',
  'settings.adapters.fields.signalAllowedFrom': 'Allowed Senders',
  'settings.adapters.fields.ignoreAttachments': 'Ignore attachment-only messages',
  'settings.adapters.fields.ignoreStories': 'Ignore stories',
  'settings.adapters.fields.ircServer': 'IRC server',
  'settings.adapters.fields.ircPort': 'Port',
  'settings.adapters.fields.ircNickname': 'Nickname',
  'settings.adapters.fields.ircUsername': 'Username',
  'settings.adapters.fields.ircChannels': 'Channels to join',
  'settings.adapters.fields.ircServerPassword': 'Server password',
  'settings.adapters.fields.ircNickservPassword': 'NickServ password',
  'settings.adapters.fields.ircSaslPassword': 'SASL password',
  'settings.adapters.fields.ircVerifyTls': 'Verify TLS certificate',
  'settings.adapters.fields.allowedContacts': 'Allowed Contacts',
  'settings.adapters.fields.nextcloudBaseUrl': 'Nextcloud base URL',
  'settings.adapters.fields.webhookSecret': 'Webhook secret',
  'settings.adapters.fields.botName': 'Bot display name',
  'settings.adapters.fields.apiUrl': 'API URL',
  'settings.adapters.fields.apiToken': 'API Token',
  'settings.adapters.fields.pollIntervalSecs': 'Poll interval (seconds)',
  'settings.adapters.fields.nostrPrivateKey': 'Private key (hex/nsec)',
  'settings.adapters.fields.nostrRelays': 'Relays',
  'settings.adapters.fields.nostrAllowedPubkeys': 'Allowed pubkeys',

  'settings.adapters.fields.whatsappAccessToken': 'Cloud API Access Token',
  'settings.adapters.fields.whatsappPhoneNumberId': 'Phone Number ID',
  'settings.adapters.fields.whatsappVerifyToken': 'Verify Token',
  'settings.adapters.fields.whatsappAppSecret': 'App Secret',
  'settings.adapters.fields.whatsappSessionPath': 'Web session path',
  'settings.adapters.fields.whatsappPairPhone': 'Pair phone (for QR-less linking)',
  'settings.adapters.fields.whatsappPairCode': 'Pair code (custom)',
  'settings.adapters.fields.whatsappAllowedNumbers': 'Allowed numbers',
  'settings.adapters.fields.whatsappMode': 'Mode',
  'settings.adapters.fields.whatsappSelfChat': 'Always reply in self-chat',
  'settings.adapters.fields.whatsappDmPolicy': 'DM policy',
  'settings.adapters.fields.whatsappGroupPolicy': 'Group policy',
  'settings.adapters.fields.whatsappDmMentionPatterns': 'DM mention regex',
  'settings.adapters.fields.whatsappGroupMentionPatterns': 'Group mention regex',
  'settings.adapters.fields.fromPhone': 'From phone (E.164)',
  'settings.adapters.fields.signingSecret': 'Signing secret',
  'settings.adapters.fields.allowedSenders': 'Allowed senders',
  'settings.adapters.fields.tenantId': 'Tenant ID',

  'settings.adapters.fields.imapHost': 'IMAP host',
  'settings.adapters.fields.imapPort': 'IMAP port',
  'settings.adapters.fields.imapFolder': 'IMAP folder',
  'settings.adapters.fields.idleTimeoutSecs': 'IDLE timeout (s)',
  'settings.adapters.fields.smtpHost': 'SMTP host',
  'settings.adapters.fields.smtpPort': 'SMTP port',
  'settings.adapters.fields.smtpTls': 'SMTP over TLS',
  'settings.adapters.fields.emailUsername': 'Username',
  'settings.adapters.fields.emailPassword': 'Password',
  'settings.adapters.fields.fromAddress': 'From address',
  'settings.adapters.fields.defaultSubject': 'Default subject',

  'settings.adapters.fields.enabled': 'Enabled',
  'settings.adapters.fields.gmailTopic': 'Pub/Sub topic',
  'settings.adapters.fields.gmailLabelFilter': 'Watched labels',
  'settings.adapters.fields.oauthToken': 'OAuth2 token',
  'settings.adapters.fields.webhookUrl': 'Webhook URL',

  'settings.adapters.fields.port': 'Listen port',
  'settings.adapters.fields.listenPath': 'Listen path',
  'settings.adapters.fields.sendUrl': 'Outbound URL',
  'settings.adapters.fields.sendMethod': 'Outbound method',
  'settings.adapters.fields.authHeader': 'Authorization header',
  'settings.adapters.fields.bearerToken': 'Bearer token',
  'settings.adapters.fields.redditUsername': 'Reddit username',
  'settings.adapters.fields.redditSubreddit': 'Subreddit filter (optional)',
  'settings.adapters.fields.blueskyHandle': 'Bluesky handle',
  'settings.adapters.fields.blueskyAppPassword': 'App password',

  'settings.adapters.fields.voiceProvider': 'Provider',
  'settings.adapters.fields.voiceFromNumber': 'From number',
  'settings.adapters.fields.voiceAccountId': 'Account ID / API key',
  'settings.adapters.fields.voiceAuthToken': 'Auth token',
  'settings.adapters.fields.voiceWebhookPort': 'Voice webhook port',
  'settings.adapters.fields.maxCallDurationSecs': 'Max call duration (s)',
  'settings.adapters.fields.requireOutboundApproval': 'Require outbound approval',
  'settings.adapters.fields.transcriptionLogging': 'Log transcripts to workspace',
  'settings.adapters.fields.ttsVoice': 'TTS voice (provider-specific)',
  'settings.adapters.fields.webhookBaseUrl': 'Webhook base URL',
  'settings.adapters.fields.clawdApiKey': 'Telnyx API key',
  'settings.adapters.fields.clawdConnectionId': 'SIP connection ID',
  'settings.adapters.fields.allowedDestinations': 'Allowed destinations',
  'settings.adapters.fields.wakeWord': 'Wake word phrase',
  'settings.adapters.fields.silenceTimeoutMs': 'Silence timeout (ms)',
  'settings.adapters.fields.maxCaptureSecs': 'Max capture (s)',
  'settings.adapters.fields.energyThreshold': 'Energy threshold',

  'settings.adapters.fields.cli': 'Enable CLI channel',
  'settings.adapters.fields.messageTimeoutSecs': 'Message timeout (s)',
  'settings.adapters.fields.ackReactions': 'Acknowledgement reactions',
  'settings.adapters.fields.showToolCalls': 'Show tool calls in chat',
  'settings.adapters.fields.sessionPersistence': 'Persist channel sessions',
  'settings.adapters.fields.sessionBackend': 'Session backend',
  'settings.adapters.fields.sessionTtlHours': 'Session TTL (hours)',
  'settings.adapters.fields.debounceMs': 'Inbound debounce (ms)',

  'settings.adapters.placeholders.telegramBotToken': 'Paste token from @BotFather',
  'settings.adapters.placeholders.discordBotToken': 'Bot token from Discord Developer Portal',
  'settings.adapters.placeholders.slackBotToken': 'xoxb-...',
  'settings.adapters.placeholders.slackAppToken': 'xapp-... (Socket Mode only)',
  'settings.adapters.placeholders.feishuAppId': 'cli_xxxxxxxxxxxx',
  'settings.adapters.placeholders.mattermostUrl': 'https://mattermost.example.com',
  'settings.adapters.placeholders.matrixHomeserver': 'https://matrix.org',
  'settings.adapters.placeholders.matrixRoomId': '!abc123:matrix.org',
  'settings.adapters.placeholders.signalHttpUrl': 'http://127.0.0.1:8686',
  'settings.adapters.placeholders.signalAccount': '+15551234567',
  'settings.adapters.placeholders.ircServer': 'irc.libera.chat',
  'settings.adapters.placeholders.ircChannels': '#sen, #ai',
  'settings.adapters.placeholders.allowedContacts': '+15551234567, friend@icloud.com',
  'settings.adapters.placeholders.nextcloudBaseUrl': 'https://cloud.example.com',
  'settings.adapters.placeholders.nostrPrivateKey': 'nsec1... or 64-char hex',
  'settings.adapters.placeholders.wecomWebhookKey': 'Webhook key from WeCom Bot config',
  'settings.adapters.placeholders.gmailTopic': 'projects/your-project/topics/gmail-watch',
  'settings.adapters.placeholders.listenPath': '/webhook',
  'settings.adapters.placeholders.imapHost': 'imap.gmail.com',
  'settings.adapters.placeholders.smtpHost': 'smtp.gmail.com',
  'settings.adapters.placeholders.fromAddress': 'sen@example.com',
  'settings.adapters.placeholders.watiApiUrl': 'https://live-mt-server.wati.io',
  'settings.adapters.placeholders.blueskyHandle': 'mybot.bsky.social',
  'settings.adapters.placeholders.proxyUrl': 'socks5://127.0.0.1:1080',
  'settings.adapters.placeholders.e164': '+15551234567',
  'settings.adapters.placeholders.wakeWord': 'hey sen',

  'settings.adapters.hints.telegramAllowedUsers': 'Comma-separated Telegram user IDs (numeric). Leave empty to deny all.',
  'settings.adapters.hints.discordAllowedUsers': 'Comma-separated Discord user IDs. Empty = deny all.',
  'settings.adapters.hints.discordGuildId': 'Restrict the bot to a single guild (server). Optional.',
  'settings.adapters.hints.discordChannelIds': 'Limit history capture to these channel IDs. Empty = all channels.',
  'settings.adapters.hints.feishuAllowedUsers': 'Comma-separated open IDs / union IDs. "*" = allow everyone.',
  'settings.adapters.hints.mentionOnly': 'In group chats, only respond when the bot is @-mentioned. DMs are always processed.',
  'settings.adapters.hints.interruptOnNewMessage': 'A new message from the same sender cancels the in-flight reply.',
  'settings.adapters.hints.listenToBots': 'Process messages from other bots. Leave off to avoid loops.',
  'settings.adapters.hints.useFeishu': 'Switch to the Chinese open-platform endpoints. Leave off for international Lark.',
  'settings.adapters.hints.webhookPortLark': 'Required when receive mode is "webhook". Ignored in WebSocket mode.',
  'settings.adapters.hints.streamingCard': 'Updates a Feishu card in place as the response streams. Otherwise sends incremental messages.',
  'settings.adapters.hints.ackReactionsOverride': 'Override the global ack-reactions setting just for this channel.',
  'settings.adapters.hints.matrixRecoveryKey': 'When set, Matrix recovers room keys and cross-signing secrets on startup.',
  'settings.adapters.hints.signalGroupId': '"dm" = DMs only. A specific group ID = that group only. Empty = all messages.',
  'settings.adapters.hints.allowedContacts': 'Phone numbers (E.164) or email addresses. Empty list denies all.',
  'settings.adapters.hints.botName': 'Used to filter the bot\'s own posts and prevent feedback loops.',
  'settings.adapters.hints.nostrRelays': 'Comma-separated wss:// relay URLs. Empty = use built-in defaults.',
  'settings.adapters.hints.whatsappCloudOnly': 'Only required for Cloud API mode (Meta Business).',
  'settings.adapters.hints.whatsappWebOnly': 'Only required for Web mode. Path to the wa-rs session database.',
  'settings.adapters.hints.whatsappPairPhone': 'Country code + number, e.g. 15551234567. Leave blank for QR pairing.',
  'settings.adapters.hints.idleTimeoutSecs': 'IMAP IDLE re-establish window. RFC 2177 recommends 1740s (29 min).',
  'settings.adapters.hints.emailAllowedSenders': 'Comma-separated. Use "*" to accept everyone, or "@example.com" for a domain.',
  'settings.adapters.hints.gmailLabelFilter': 'Comma-separated. Default watches INBOX.',
  'settings.adapters.hints.sendUrl': 'When set, replies are POST/PUT-ed here. Leave blank for receive-only.',
  'settings.adapters.hints.webhookSecret': 'HMAC-SHA256 shared secret. When set, incoming requests must match.',
  'settings.adapters.hints.redditUsername': 'Without the "u/" prefix.',
  'settings.adapters.hints.voiceAccountId': 'Account SID (Twilio) / API Key (Telnyx) / Auth ID (Plivo).',
  'settings.adapters.hints.ttsVoice': 'Provider-specific voice ID. Leave blank for the default voice.',
  'settings.adapters.hints.webhookBaseUrl': 'Public URL the telephony provider can reach. Use ngrok / Tailscale during local dev.',
  'settings.adapters.hints.allowedDestinations': 'Phone numbers, prefixes, or "*" to allow any destination.',
  'settings.adapters.hints.energyThreshold': 'RMS energy below this is treated as silence. Lower = more sensitive.',

  'settings.adapters.hints.cli': 'When enabled, you can also chat with the agent from the terminal CLI.',
  'settings.adapters.hints.messageTimeoutSecs': 'Per-turn budget shared by every channel. Scales up to 4× when tool loops are deep.',
  'settings.adapters.hints.ackReactions': 'Add ⏳ on receipt and ✅ when complete. Per-channel overrides apply on top.',
  'settings.adapters.hints.showToolCalls': 'Forward "🔧 tool_name: ✓" notifications to the messaging client.',
  'settings.adapters.hints.sessionPersistence': 'Save channel conversation history so sessions survive a daemon restart.',
  'settings.adapters.hints.sessionTtlHours': 'Auto-archive idle sessions older than this. 0 disables.',
  'settings.adapters.hints.debounceMs': 'Bunch rapid messages from the same sender into a single turn. 0 disables.',

  'settings.adapters.streamMode.off': 'Off — single message',
  'settings.adapters.streamMode.partial': 'Partial — edit a draft live',
  'settings.adapters.streamMode.multi': 'Multi-message — paragraph by paragraph',
  'settings.adapters.whatsappMode.business': 'Business — respond to everyone on the allowlist',
  'settings.adapters.whatsappMode.personal': 'Personal — apply DM/group policies',
  'settings.adapters.whatsappPolicy.allowlist': 'Allowlist',
  'settings.adapters.whatsappPolicy.ignore': 'Ignore',
  'settings.adapters.whatsappPolicy.all': 'All',
  'settings.adapters.larkReceive.websocket': 'WebSocket (long-lived)',
  'settings.adapters.larkReceive.webhook': 'Webhook (HTTP callback)',
  'settings.adapters.voiceProvider.twilio': 'Twilio',
  'settings.adapters.voiceProvider.telnyx': 'Telnyx',
  'settings.adapters.voiceProvider.plivo': 'Plivo',
  'settings.adapters.sessionBackend.sqlite': 'SQLite (default)',
  'settings.adapters.sessionBackend.jsonl': 'JSONL (legacy)',
  'settings.adapters.httpMethod.post': 'POST',
  'settings.adapters.httpMethod.put': 'PUT',

  'settings.mcp.title': 'MCP servers',
  'settings.mcp.description': 'Connect external tools and data sources for SenWeaverCoding. Add, edit, reconnect, and disable servers without leaving the desktop app.',
  'settings.mcp.addServer': 'Add server',
  'settings.mcp.empty': 'No MCP servers configured yet',
  'settings.mcp.emptyHint': 'Add a custom stdio, HTTP, or SSE MCP server to start extending tool access.',
  'settings.mcp.stats.total': 'Total servers',
  'settings.mcp.stats.connected': 'Connected now',
  'settings.mcp.stats.attention': 'Need attention',
  'settings.mcp.scope.project': 'Project',
  'settings.mcp.scope.local': 'Local',
  'settings.mcp.scope.user': 'User',
  'settings.mcp.scope.plugin': 'Plugin',
  'settings.mcp.scopeDesc.local': 'Private to you for one project. Stored in your user config, scoped by the selected project.',
  'settings.mcp.scopeDesc.project': 'Shared with the team through the selected project’s `.mcp.json`.',
  'settings.mcp.scopeDesc.user': 'Available in all projects for your user account.',
  'settings.mcp.scope.dynamic': 'Built-in',
  'settings.mcp.scope.enterprise': 'Enterprise',
  'settings.mcp.scope.claudeai': 'Sen.ai',
  'settings.mcp.scope.managed': 'Managed',
  'settings.mcp.transport.http': 'Streamable HTTP',
  'settings.mcp.globalOnlyHint': 'This page manages only user-global MCP servers for speed. Project-specific MCP will move into the chat slash-command experience.',
  'settings.mcp.form.back': 'Back to servers',
  'settings.mcp.form.createTitle': 'Connect to a custom MCP',
  'settings.mcp.form.createHint': 'Set up a custom MCP server with the fields supported by SenWeaverCoding today.',
  'settings.mcp.form.editTitle': 'Update {name} MCP',
  'settings.mcp.form.editHint': 'Review connection details, save changes, or reconnect this server from the desktop app.',
  'settings.mcp.form.transportLocked': 'If you would like to switch MCP server type, uninstall first.',
  'settings.mcp.form.uninstall': 'Uninstall',
  'settings.mcp.form.reconnect': 'Reconnect',
  'settings.mcp.form.save': 'Save',
  'settings.mcp.form.name': 'Name',
  'settings.mcp.form.namePlaceholder': 'MCP server name',
  'settings.mcp.form.scope': 'Config scope',
  'settings.mcp.form.transport': 'Transport',
  'settings.mcp.form.status': 'Status',
  'settings.mcp.form.location': 'Config location',
  'settings.mcp.form.rawConfig': 'Raw config',
  'settings.mcp.form.command': 'Command to launch',
  'settings.mcp.form.commandPlaceholder': 'npx',
  'settings.mcp.form.commandHostHint': 'STDIO MCP commands run on the host machine. Install runtimes like Node.js, Python, Bun, or uv yourself and make sure the command is available in PATH.',
  'settings.mcp.form.arguments': 'Arguments',
  'settings.mcp.form.argumentPlaceholder': 'chrome-devtools-mcp@latest',
  'settings.mcp.form.addArgument': 'Add argument',
  'settings.mcp.form.environmentVariables': 'Environment variables',
  'settings.mcp.form.addEnv': 'Add environment variable',
  'settings.mcp.form.keyPlaceholder': 'Key',
  'settings.mcp.form.valuePlaceholder': 'Value',
  'settings.mcp.form.url': 'URL',
  'settings.mcp.form.sseUrl': 'SSE URL',
  'settings.mcp.form.urlPlaceholder': 'https://mcp.example.com/mcp',
  'settings.mcp.form.headers': 'Headers',
  'settings.mcp.form.addHeader': 'Add header',
  'settings.mcp.form.oauthClientId': 'OAuth client ID',
  'settings.mcp.form.oauthClientIdPlaceholder': 'Optional client ID',
  'settings.mcp.form.oauthCallbackPort': 'OAuth callback port',
  'settings.mcp.form.oauthCallbackPortPlaceholder': 'Optional fixed callback port',
  'settings.mcp.form.headersHelper': 'Headers helper script',
  'settings.mcp.form.headersHelperPlaceholder': 'Optional helper command path',
  'settings.mcp.form.deleteTitle': 'Delete MCP server',
  'settings.mcp.form.cancel': 'Cancel',
  'settings.mcp.form.confirmDelete': 'Delete',
  'settings.mcp.form.deleteConfirm': 'Delete MCP server "{name}"? This cannot be undone.',
  'settings.mcp.form.deleteConfirmBody': 'Delete MCP server "{name}"? This action cannot be undone.',
  'settings.mcp.targetProject.title': 'Target project',
  'settings.mcp.targetProject.selected': 'Currently viewing local and shared MCP servers for: {path}',
  'settings.mcp.targetProject.empty': 'Choose a project to inspect project-private or project-shared MCP servers.',
  'settings.mcp.targetProject.emptyWithCurrent': 'Choose a target project. The current active session is: {path}',
  'settings.mcp.targetProject.localSelected': 'This server will be private to you inside: {path}',
  'settings.mcp.targetProject.localEmpty': 'Choose the project that should receive this private MCP server.',
  'settings.mcp.targetProject.projectSelected': 'This server will be shared through: {path}/.mcp.json',
  'settings.mcp.targetProject.projectEmpty': 'Choose the project whose `.mcp.json` should receive this shared MCP server.',
  'settings.mcp.targetProject.globalTitle': 'Global install target',
  'settings.mcp.targetProject.globalHint': 'User scope does not need a target project. It is stored in your global Sen config and is available everywhere.',
  'settings.mcp.toast.created': 'Created MCP server "{name}"',
  'settings.mcp.toast.saved': 'Saved MCP server "{name}"',
  'settings.mcp.toast.deleted': 'Deleted MCP server "{name}"',
  'settings.mcp.toast.enabled': 'Enabled MCP server "{name}"',
  'settings.mcp.toast.disabled': 'Disabled MCP server "{name}"',
  'settings.mcp.toast.reconnected': 'Reconnected MCP server "{name}"',
  'settings.mcp.toast.saveFailed': 'Failed to save MCP server',
  'settings.mcp.toast.deleteFailed': 'Failed to delete MCP server',
  'settings.mcp.toast.toggleFailed': 'Failed to update MCP server state',
  'settings.mcp.toast.reconnectFailed': 'Failed to reconnect MCP server',

  'settings.skills.title': 'Installed Skills',
  'settings.skills.description': 'Skills extend Sen with specialized capabilities. Manage skills in ~/.sen/skills/',
  'settings.skills.browserTitle': 'Browse installed skills',
  'settings.skills.browserEyebrow': 'Skill Browser',
  'settings.skills.browserDescription': 'Inspect bundled, project, and user skills, compare their scope, and open each skill folder to read its docs and source files.',
  'settings.skills.entryEyebrow': 'Skill Entry',
  'settings.skills.slashCommand': '/slash',
  'settings.skills.alwaysApplyBadge': 'Always Applied',
  'settings.skills.alwaysApplyHint':
    'This skill declares alwaysApply: true and is fully injected into the system prompt every turn, even in compact mode.',
  'settings.skills.newButton': 'New Skill',
  'settings.skills.newDialogTitle': 'New User Skill',
  'settings.skills.fieldName': 'Skill name (folder name)',
  'settings.skills.namePlaceholder': 'e.g. code-review',
  'settings.skills.nameHint':
    'Letters, digits, dash and underscore only. Becomes ~/.senweavercoding/skills/<name>/SKILL.md.',
  'settings.skills.nameInvalid':
    'Invalid name. Use ASCII letters, digits, "-" or "_" only (no spaces or path characters).',
  'settings.skills.fieldContent': 'SKILL.md content',
  'settings.skills.createButton': 'Create',
  'settings.skills.createdToast': 'Skill created.',
  'settings.skills.deletedToast': 'Skill deleted.',
  'settings.skills.deleteFailed': 'Failed to delete skill',
  'settings.skills.dropHint':
    'Tip: drag a skill folder (containing SKILL.md) or a single .md file here to install it.',
  'settings.skills.dropOverlayTitle': 'Drop to install skill',
  'settings.skills.dropOverlayHint':
    'Drop a skill folder (with SKILL.md) or a single .md file',
  'settings.skills.installing': 'Installing…',
  'settings.skills.installSummary': 'Installed {count} skill(s).',
  'settings.skills.installFailed': 'Failed to install skill',
  'settings.skills.conflictTitle': 'Replace existing skill?',
  'settings.skills.conflictTitlePlural': 'Replace existing skills?',
  'settings.skills.conflictBody':
    'The following name(s) already exist in your user skills directory and will be overwritten:',
  'settings.skills.conflictOverwrite': 'Overwrite',
  'settings.skills.conflictKeepBoth': 'Keep both',
  'settings.skills.renamedToast': 'Installed as "{name}" to avoid name collision.',
  'settings.skills.deleteConfirmTitle': 'Delete this skill?',
  'settings.skills.deleteConfirmBody':
    'The folder for "{name}" will be permanently removed from ~/.senweavercoding/skills. This cannot be undone.',
  'settings.skills.tokenEstimate': '~{count} tokens',
  'settings.skills.tokenEstimateShort': '~{count}',
  'settings.skills.summary.totalSkills': 'Total skills',
  'settings.skills.summary.totalFiles': 'Files',
  'settings.skills.summary.sources': 'Sources',
  'settings.skills.summary.tokens': 'Estimated tokens',
  'settings.skills.summary.source': 'Source',
  'settings.skills.summary.entry': 'Entry',
  'settings.skills.groupHint': '{count} skills available from {source}',
  'settings.skills.ready': 'Ready',
  'settings.skills.unavailable': 'Unavailable',
  'settings.skills.empty': 'No skills installed',
  'settings.skills.emptyHint': 'Add skills to ~/.senweavercoding/skills/ to get started',
  'settings.skills.openDirectory': 'Open Skills Folder',
  'settings.skills.openFailed': 'Failed to open skills folder',
  'settings.skills.back': 'Back to list',
  'settings.skills.files': 'files',
  'settings.skills.entryFile': 'entry file',
  'settings.skills.metaTitle': 'Skill metadata',
  'settings.skills.filesPanel': 'Files',
  'settings.skills.filesPanelHint': 'Browse the entry file and supporting implementation files.',
  'settings.skills.readingMode': 'Viewing in {mode}',
  'settings.skills.docMode': 'document mode',
  'settings.skills.codeMode': 'code mode',
  'settings.skills.source.user': 'User',
  'settings.skills.source.project': 'Project',
  'settings.skills.source.plugin': 'Plugin',
  'settings.skills.source.mcp': 'MCP',
  'settings.skills.source.bundled': 'Built-in',

  'settings.plugins.title': 'Installed Plugins',
  'settings.plugins.description': 'Inspect installed plugins, see their health, and apply changes to the desktop runtime.',
  'settings.plugins.browserTitle': 'Browse installed plugins',
  'settings.plugins.browserEyebrow': 'Plugin Manager',
  'settings.plugins.browserDescription': 'Plugins bundle skills, agents, hooks, MCP servers, and language tooling. This view keeps the desktop surface focused on installed plugins, health, and apply-to-runtime feedback.',
  'settings.plugins.entryEyebrow': 'Plugin Detail',
  'settings.plugins.summary.total': 'Total plugins',
  'settings.plugins.summary.enabled': 'Enabled',
  'settings.plugins.summary.attention': 'Needs attention',
  'settings.plugins.summary.marketplaces': 'Marketplaces',
  'settings.plugins.summary.skills': 'Skills',
  'settings.plugins.summary.agents': 'Agents',
  'settings.plugins.summary.mcp': 'MCP',
  'settings.plugins.summary.hooks': 'Hooks',
  'settings.plugins.group.attention': 'Needs attention',
  'settings.plugins.group.enabled': 'Enabled',
  'settings.plugins.group.disabled': 'Disabled',
  'settings.plugins.groupHint': '{count} plugins in this section',
  'settings.plugins.refresh': 'Refresh',
  'settings.plugins.apply': 'Apply changes',
  'settings.plugins.applyHint': 'Enable, disable, and update changes become active after applying them to the current desktop runtime.',
  'settings.plugins.lastReload': 'Last apply: {enabled} active plugins, {skills} plugin skills, {errors} errors.',
  'settings.plugins.reloadToast': 'Applied plugin changes: {enabled} active plugins, {skills} skills, {errors} errors.',
  'settings.plugins.marketplacesTitle': 'Known marketplaces',
  'settings.plugins.marketplacesHint': 'Read-only summary of marketplace sources already configured for this machine.',
  'settings.plugins.marketplaceAutoUpdateOn': 'Auto-update on',
  'settings.plugins.marketplaceAutoUpdateOff': 'Auto-update off',
  'settings.plugins.marketplaceInstalledCount': '{count} installed',
  'settings.plugins.marketplaceUpdatedAt': 'Updated {value}',
  'settings.plugins.status.enabled': 'Enabled',
  'settings.plugins.status.disabled': 'Disabled',
  'settings.plugins.status.attention': 'Attention',
  'settings.plugins.scope.user': 'User',
  'settings.plugins.scope.project': 'Project',
  'settings.plugins.scope.local': 'Local',
  'settings.plugins.scope.managed': 'Managed',
  'settings.plugins.scope.builtin': 'Built-in',
  'settings.plugins.empty': 'No plugins installed',
  'settings.plugins.emptyHint': 'Install plugins through SenWeaverCoding to manage them here.',
  'settings.plugins.runtimeUnavailable': 'Plugin runtime not compiled in this build',
  'settings.plugins.runtimeUnavailableHint': 'This build was compiled without the plugins-wasm feature, so plugins cannot be loaded or managed here.',
  'settings.plugins.back': 'Back to list',
  'settings.plugins.noDescription': 'No description available for this plugin.',
  'settings.plugins.errorCount': '{count} errors',
  'settings.plugins.enable': 'Enable',
  'settings.plugins.disable': 'Disable',
  'settings.plugins.update': 'Update',
  'settings.plugins.uninstall': 'Uninstall',
  'settings.plugins.confirmUninstall': 'Uninstall plugin "{name}"? This removes the installed copy for the selected scope.',
  'settings.plugins.author': 'Author: {value}',
  'settings.plugins.projectPath': 'Project: {value}',
  'settings.plugins.installPath': 'Installed at: {value}',
  'settings.plugins.managedHint': 'This plugin is managed by policy and cannot be changed from the desktop app.',
  'settings.plugins.builtinHint': 'Built-in plugins can be reloaded here, but install and uninstall actions are not exposed.',
  'settings.plugins.errorsTitle': 'Plugin errors',
  'settings.plugins.capabilitiesTitle': 'Bundled capabilities',
  'settings.plugins.capabilitiesHint': 'Capabilities exposed by this plugin after loading its manifest and runtime integrations.',
  'settings.plugins.sharedNavigationDisabled': 'Enable this plugin and apply changes before opening its skills, agents, or MCP entries in the shared management pages.',
  'settings.plugins.capabilityEmpty': 'None exposed',
  'settings.plugins.capability.skills': '{count} skills',
  'settings.plugins.capability.agents': '{count} agents',
  'settings.plugins.capability.mcpServers': '{count} MCP servers',
  'settings.plugins.capabilityLabel.skills': 'Skills',
  'settings.plugins.capabilityLabel.commands': 'Commands',
  'settings.plugins.capabilityLabel.agents': 'Agents',
  'settings.plugins.capabilityLabel.hooks': 'Hooks',
  'settings.plugins.capabilityLabel.mcpServers': 'MCP servers',
  'settings.plugins.capabilityLabel.lspServers': 'LSP servers',

  'settings.general.appearanceTitle': 'Appearance',
  'settings.general.appearanceDescription': 'Switch between the original light workspace and the new dark workspace.',
  'settings.general.appearance.light': 'Light',
  'settings.general.appearance.dark': 'Dark',
  'settings.general.languageTitle': 'Language',
  'settings.general.languageDescription': 'Choose the display language for the application.',
  'settings.general.effortTitle': 'Effort Level',
  'settings.general.effortDescription': 'Controls how much computation the model uses.',
  'settings.general.effort.low': 'Low',
  'settings.general.effort.medium': 'Medium',
  'settings.general.effort.high': 'High',
  'settings.general.effort.max': 'Max',
  'settings.general.securityPolicyTitle': 'Security Policy',
  'settings.general.securityPolicyDescription': 'When off, only per-tool execution approval remains. Command allowlist, risk classification, path restrictions, and output-redirection bans are all skipped.',
  'settings.general.securityPolicyToggle': 'Enable security policy',
  'settings.general.securityPolicyEnabledHint': 'Enabled: command allowlist, risk levels, workspace boundary, and forbidden paths are all enforced.',
  'settings.general.securityPolicyDisabledHint': 'Disabled: only per-tool execution approval applies; all other command/path restrictions are skipped.',
  'settings.general.syncTitle': 'Settings Sync',
  'settings.general.syncDescription': 'Export a snapshot of your settings to a JSON file, or import one to apply it on this device.',
  'settings.general.syncExport': 'Export snapshot',
  'settings.general.syncImport': 'Import snapshot',
  'settings.general.syncExported': 'Settings snapshot exported.',
  'settings.general.syncImported': 'Settings snapshot imported.',
  'settings.general.closeBehaviorTitle': 'Close Button Behavior',
  'settings.general.closeBehaviorDescription': 'Choose what happens when you click the window close button.',
  'settings.general.closeBehavior.minimize': 'Minimize to tray',
  'settings.general.closeBehavior.exit': 'Quit application',
  'settings.general.closeBehavior.ask': 'Ask every time',
  'close.prompt.title': 'Close SenWeaverCoding',
  'close.prompt.desc': 'Do you want to minimize to the system tray or quit the application?',
  'close.prompt.minimize': 'Minimize to tray',
  'close.prompt.minimizeHint': 'The app keeps running in the background; click the tray icon to reopen.',
  'close.prompt.exit': 'Quit application',
  'close.prompt.exitHint': 'Running assistants are stopped and their progress is saved before quitting.',
  'close.prompt.dontAskAgain': "Don't ask again",
  'close.prompt.confirm': 'Confirm',
  'close.prompt.cancel': 'Cancel',
  'close.saving.title': 'Saving before exit',
  'close.saving.desc': 'Waiting for running assistants to safely save their progress...',
  'close.saving.remaining': '{count} assistant(s) still running',
  'close.saving.forceQuit': 'Force quit',
  'tray.show': 'Show main window',
  'tray.quit': 'Quit',
  'tray.tooltip': 'SenWeaverCoding',

  'empty.title': 'New agent',
  'empty.subtitle': 'Spin up a fresh agent to help with this codebase. Sen is ready to help you build, debug, and architect your project.',
  'empty.placeholder': 'Plan, Build, / for commands, @ for context',
  'empty.addFiles': 'Add files or photos',
  'empty.slashCommands': 'Slash commands',
  'empty.failedToCreate': 'Failed to create agent',

  'chat.placeholder': 'Plan, Build, / for commands, @ for context',
  'chat.placeholderMissing': 'This agent points to a missing workspace. Create a new agent or pick another project.',
  'chat.scrollToLatest': 'Jump to latest',
  'chat.scrollToLatestTooltip': 'Scroll to the most recent message',
  'chat.addFiles': 'Add files or photos',
  'chat.slashCommands': 'Slash commands',
  'slash.mcp.title': 'Available MCP tools',
  'slash.mcp.subtitle': 'Global and current-project MCP servers available in this chat context.',
  'slash.mcp.subtitleWithProject': 'Showing global plus project MCP for: {path}',
  'slash.mcp.emptyTitle': 'No MCP servers available',
  'slash.mcp.emptyBody': 'No global or project MCP servers are available for this chat context.',
  'slash.mcp.projectBadge': 'Project: {name}',
  'slash.skills.title': 'Available skills',
  'slash.skills.subtitle': 'User-invocable skills available in the current context.',
  'slash.skills.subtitleWithProject': 'Showing skills for: {path}',
  'slash.skills.emptyTitle': 'No skills available',
  'slash.skills.emptyBody': 'No user-invocable skills were found for this context.',
  'slash.plugins.title': 'Plugins',
  'slash.plugins.subtitle': 'Plugin management will move into this slash-command surface.',
  'slash.plugins.emptyTitle': 'Plugins panel coming soon',
  'slash.plugins.emptyBody': 'This shared slash-command panel is wired up now; plugin data will be connected next.',
  'chat.navigate': 'navigate',
  'chat.select': 'select',
  'chat.dismiss': 'dismiss',
  'chat.stopTitle': 'Stop generation (Cmd+.)',
  'chat.stopping': 'Stopping...',
  'chat.willResumeWhenWorkersFinish': 'Will resume when subagents finish',
  'chat.workers.runningCount': '{count} subagents running',
  'chat.workers.openDetail': 'Open detail',
  'chat.workers.stopWorker': 'Stop',
  'chat.workers.stopAll': 'Stop all',
  'chat.workers.spawnVerb': 'spawned',
  'chat.tokenRing.tooltip': '{pct}% · {used} / {total} context used',
  'chat.tokenRing.tooltipCycled': '{pct}% · {used} / {total} context used · cycle {cycle}',
  'chat.rewindAction': 'Rewind to here',
  'chat.rewindModalTitle': 'Rewind Conversation',
  'chat.rewindConfirm': 'Rewind here',
  'chat.rewindPromptLabel': 'Selected prompt',
  'chat.rewindAttachmentOnly': 'This message only contains attachments.',
  'chat.rewindLoading': 'Inspecting file checkpoints for this turn...',
  'chat.loadHistoryFailed': 'Failed to load conversation history. Check the connection and try reopening the session.',
  'chat.connectionLost': 'Connection lost. Reconnection attempts exhausted.',
  'chat.persistLag': 'Session persistence is falling behind; recent messages are queued and will be saved shortly.',
  'chat.reconnect': 'Reconnect',
  'statusBar.reconnecting': 'Reconnecting',
  'statusBar.disconnected': 'Disconnected',
  'chat.contextCompressed': 'Context compressed to fit the model window',
  'chat.rewindConversationCardTitle': 'Conversation rollback',
  'chat.rewindConversationCardBody': 'Remove this prompt and the {count} active messages that follow it, then reopen the composer at that point.',
  'chat.rewindCodeCardTitle': 'Code rollback',
  'chat.rewindCodeFiles': '{count} files will be restored',
  'chat.rewindCodeInsertions': '{count} insertions will be removed',
  'chat.rewindCodeDeletions': '{count} deletions will be restored',
  'chat.rewindCodeUnavailable': 'No file checkpoint is available for this prompt. The conversation can still be rewound.',
  'chat.rewindFilesLabel': 'Affected files',
  'chat.rewindFilesMore': '+{count} more',
  'chat.rewindSuccessWithCode': 'Rewound {count} messages and restored tracked files.',
  'chat.rewindSuccessConversationOnly': 'Rewound {count} messages. No file checkpoint was available for this turn.',
  'chat.rewindActionShort': 'Rewind to here',
  'chat.rewindModalTitleSubmit': 'Submit from a previous message?',
  'chat.rewindModalBody': 'Submitting from a previous message will revert {fileCount} file changes to before this message and clear {messageCount} messages after this one.',
  'chat.rewindModalBodyNoFiles': 'Submitting from a previous message will clear {messageCount} messages after this one. No file changes need to be reverted.',
  'chat.rewindContinueOnly': 'Continue without reverting',
  'chat.rewindContinueAndRevert': 'Continue and revert',
  'chat.editPromptHint': 'Click to edit and re-send',
  'chat.errorDetails': 'Show detailed error',
  'chat.restoreLastConversation': 'Restore to last used',
  'chat.restoreConfirmTitle': 'Restore previous conversation',
  'chat.restoreConfirmBody': 'This will re-apply {fileCount} file changes and bring back the cancelled conversation.',
  'chat.restoreConfirmBodyNoFiles': 'This will bring back the cancelled conversation. No file changes need to be re-applied.',
  'chat.restoreConfirmConfirm': 'Restore',
  'chat.sendAfterRewindTitle': 'Discard cancelled conversation?',
  'chat.sendAfterRewindBody': 'Sending will permanently discard the cancelled messages and keep the {fileCount} reverted file changes. This cannot be undone.',
  'chat.sendAfterRewindBodyNoFiles': 'Sending will permanently discard the cancelled messages. This cannot be undone.',
  'chat.sendAfterRewindConfirm': 'Send & discard',
  'chat.messageMoreActions': 'Message actions',
  'chat.forkChat': 'Fork Chat',
  'chat.copyMessage': 'Copy Message',
  'chat.copyMessageToast': 'Message copied',
  'chat.copyFailedToast': 'Copy failed',
  'chat.forkChatToast': 'New agent opened with the same workspace',

  'streaming.thinking': 'Thinking',
  'streaming.running': 'Running',
  'streaming.working': 'Working',

  'permission.allowEditFile': 'Allow Sen to {toolName} {fileName}?',
  'permission.allowEditFileGeneric': 'Allow Sen to {toolName} this file?',
  'permission.allowBash': 'Allow Sen to run this command?',
  'permission.allowTool': 'Allow Sen to use {toolName}?',
  'permission.awaitingApproval': 'Awaiting approval',
  'permission.responded': 'Responded',
  'permission.allow': 'Allow',
  'permission.allowForSession': 'Allow for session',
  'permission.deny': 'Deny',
  'permission.switchToSession': 'Open this session',
  'permission.pendingApproval': 'Awaiting your approval',
  'permission.hideDetails': 'Hide details',
  'permission.showFullInput': 'Show full input',
  'permission.replacingContent': 'Replacing content in file',

  'question.needsInput': 'Sen needs your input',
  'question.answered': 'Answered',
  'question.customResponse': 'Or type a custom response:',
  'question.typePlaceholder': 'Type your answer...',
  'question.submit': 'Submit',
  'question.answeredPrefix': 'Answered: ',
  'question.unparsableTitle': 'Could not parse this question. Raw request shown below.',

  'plan.questionsTitle': 'Questions',
  'plan.questionPagination': '{current} of {total}',
  'plan.skip': 'Skip',
  'plan.continue': 'Continue',
  'plan.skipKey': 'Esc',
  'plan.continueKey': '\u23CE',
  'plan.multiSelectHint': 'Select multiple',
  'composer.askDetailsPlaceholder': 'Add more optional details',
  'composer.contextRef.remove': 'Remove reference',
  'composer.dropToReference': 'Drop to reference here',
  'composer.queue.title': '{count} queued',
  'composer.queue.waitingFor': 'Waiting for "{title}" to finish',
  'composer.queue.cancelAll': 'Cancel all',
  'composer.queue.autoSendHint': 'Will auto-send in order once the current turn finishes',
  'composer.queue.itemAttachments': '{count} attachments',

  'plan.answersTitle': 'Answers',
  'plan.skippedAnswer': '(Skipped)',

  'plan.viewPlan': 'View Plan',
  'plan.build': 'Build',
  'plan.buildShortcut': 'Ctrl+\u23CE',
  'plan.writingPlan': 'Writing plan...',
  'plan.untitledPlan': 'Untitled plan',
  'plan.todosCount': '{count} To-dos',
  'plan.todosShowMore': '\u00B7\u00B7\u00B7 {count} more',

  'plan.executing': 'Executing',
  'plan.hydrating': 'Hydrating',
  'plan.hydratingDetail': 'Waiting for the Agent to confirm the live plan tracker. Step counts shown above are from the saved plan document and will refresh on the first update.',
  'plan.copyPath': 'Copy plan file path:\n{path}',
  'plan.copyPathDone': 'Path copied',
  'plan.completed': 'Completed',
  'plan.progressCardTitle': 'Plan Progress · Completed',
  'plan.stickyProgress': '{completed}/{total}',
  'plan.stickySucceeded': '({succeeded} succeeded)',
  'plan.stickyProgressTitle': '{completed} completed + {cancelled} skipped/cancelled out of {total}',

  'plan.incomplete': 'Stopped',
  'plan.resume': 'Continue',
  'plan.resumeTitle': 'Resume plan execution from the next pending step',

  'plan.modeSwitchTitle': 'Agent Mode',
  'plan.modeSwitchBody': 'User confirmed start of execution. Switching to Agent mode is required to perform code edits, cargo check, and other non-readonly operations.',
  'plan.modeSwitchSwitch': 'Switch',
  'plan.modeSwitchSwitchShortcut': '\u2303\u23CE',
  'plan.modeSwitchAlwaysAsk': 'Always ask',
  'plan.modeSwitchSwitched': 'Switched to Agent mode',
  'plan.modeSwitchDismissed': 'Dismissed',

  'plan.blockedTitle': 'Blocked in Plan mode',
  'plan.blockedBody': 'The model tried to call {tools}. Plan mode only allows read-only exploration plus update_plan / exit_plan_mode / ask_question — the call was refused before any change was made.',

  'modeBlocked.readOnly.title': 'Blocked by read-only mode',
  'modeBlocked.readOnly.body': 'The model tried to call {tools} but the current mode only allows read-only operations. The call was refused with no changes to your files or environment. Switch to a write-capable mode if writes are required.',
  'modeBlocked.toolNotAllowed.title': 'Tool not allowed in this mode',
  'modeBlocked.toolNotAllowed.body': '{tools} is not in the allowed-tools whitelist of the current coding mode. The call was refused. Switch to a mode that allows it, or pick a different tool to accomplish the task.',

  'execTool.openFullLog': 'View full log in terminal panel',
  'execTool.stop': 'Stop this command',

  'thinking.wordThought': 'Thought',
  'thinking.wordThinking': 'Thinking',

  'thinking.durationForSeconds': ' for {seconds}s',

  'chat.planningNextMoves': 'Planning next moves',

  'chat.retry.title': 'Reconnecting ({label}); will resume shortly…',
  'chat.retry.attempt': 'attempt {attempt}',
  'chat.retry.engineOverloaded': 'provider busy',
  'chat.retry.accountRateLimited': 'quota recovering',
  'chat.retry.transient': 'network blip',
  'chat.retry.stopButton': 'Stop',
  'chat.taskNotification.completed': 'Background task completed',
  'chat.taskNotification.failed': 'Background task failed',
  'chat.taskNotification.stopped': 'Background task stopped',
  'chat.taskNotification.openResult': 'Open result',
  'chat.taskNotification.dismiss': 'Dismiss',


  'tool.list.workspaceRoot': 'Workspace root',
  'tool.edit.multiFiles': '{count} files',
  'tool.edit.globPattern': 'Pattern',
  'tool.edit.executing': 'Editing {path}…',
  'tool.edit.executingGeneric': 'Executing edit…',
  'tool.edit.showDiff': 'Show diff',
  'tool.edit.hideDiff': 'Hide diff',
  'tool.todo.summary': '{completed}/{total} todos',
  'tool.todo.empty': 'no todos',
  'tool.todo.emptyHint': 'No todos in this update.',
  'tool.todo.inProgressBadge': '{count} in progress',
  'tool.errorOutput': 'Error Output',
  'tool.toolOutput': 'Tool Output',
  'tool.toolInput': 'Tool Input',
  'tool.readFileContents': 'Read file contents',
  'tool.createFile': 'Create file',
  'tool.updateFileContents': 'Update file contents',
  'tool.linesChanged': '{count} lines changed',
  'tool.linesCreated': '{count} lines created',
  'tool.linesOutput': '{count} lines output',
  'tool.result': '{toolName} result',
  'tool.resultGeneric': 'Tool result',
  'tool.error': 'ERROR',
  'tool.success': 'SUCCESS',
  'tool.showLess': 'Show less',
  'tool.showMore': 'Show {count} more characters',

  'tool.web.searchInProgress': 'Searching the web…',
  'tool.web.searchDone': 'Web search complete',
  'tool.web.searchFailed': 'Web search failed',
  'tool.web.readPages': 'Read {count} pages',
  'tool.web.noResults': 'No results found',
  'tool.web.providerLabel': 'Provider:',
  'tool.web.enginesUsedLabel': 'Engines:',
  'tool.web.openInBuiltinBrowser': 'Open in built-in browser',
  'tool.web.engineSourceLabel': 'Source',
  'tool.web.publishedAtLabel': 'Published',

  'tool.verb.read': 'Read',
  'tool.verb.listed': 'Listed',
  'tool.verb.searched': 'Grepped',
  'tool.verb.fetched': 'Fetched',
  'tool.verb.edited': 'Edited',
  'tool.verb.ran': 'Ran',
  'tool.verb.recalled': 'Recalled',
  'tool.verb.memory': 'Memory',
  'tool.verb.planned': 'Plan',
  'tool.verb.tasks': 'Tasks',
  'tool.verb.delegated': 'Delegated',
  'tool.verb.mcp': 'MCP',
  'tool.verb.tool': 'Tool',
  'tool.verb.git': 'Git',
  'tool.verb.diagnosed': 'Diagnosed',
  'tool.verb.sessionsed': 'Session',
  'tool.verb.communicated': 'Messaged',
  'tool.verb.flowed': 'Flow',
  'tool.verb.codeIntel': 'Code Intel',
  'tool.verb.modelConfig': 'Model',
  'tool.verb.integration': 'Integration',
  'tool.verb.ops': 'Ops',
  'tool.verb.hardware': 'Hardware',
  'task.subagent.running': 'Running',
  'task.subagent.completed': 'Completed',
  'task.subagent.failed': 'Failed',
  'task.subagent.stop': 'Stop',
  'task.subagent.agentLabel': 'Agent',
  'task.subagent.finalOutput': 'Final output',
  'task.subagent.agentOutput': 'Agent output',
  'task.subagent.waiting': 'Waiting for subagents to start…',
  'task.subagent.empty': 'No activity yet.',

  'explored.prefix': 'Explored',
  'explored.exploring': 'Exploring',
  'explored.empty': 'no observations',
  'explored.join': ', ',
  'explored.readOne': '1 file',
  'explored.readMany': '{count} files',
  'explored.listedOne': '1 listing',
  'explored.listedMany': '{count} listings',
  'explored.searchedOne': '1 search',
  'explored.searchedMany': '{count} searches',
  'explored.recalledOne': '1 recall',
  'explored.recalledMany': '{count} recalls',
  'explored.thoughtOne': '1 thought',
  'explored.thoughtMany': '{count} thoughts',

  'toolGroup.readOne': 'Read 1 file',
  'toolGroup.readMany': 'Read {count} files',
  'toolGroup.createdOne': 'created a file',
  'toolGroup.createdMany': 'created {count} files',
  'toolGroup.editedOne': 'edited a file',
  'toolGroup.editedMany': 'edited {count} files',
  'toolGroup.ranOne': 'ran a command',
  'toolGroup.ranMany': 'ran {count} commands',
  'toolGroup.foundFiles': 'found files',
  'toolGroup.searchedOne': 'searched code',
  'toolGroup.searchedMany': 'searched {count} patterns',
  'toolGroup.agentOne': 'dispatched an agent',
  'toolGroup.agentMany': 'dispatched {count} agents',
  'agentStatus.starting': 'Starting',
  'agentStatus.running': 'Running',
  'agentStatus.done': 'Done',
  'agentStatus.failed': 'Failed',
  'agentStatus.stopped': 'Stopped',
  'agentStatus.noActivity': 'No tool activity yet',
  'agentStatus.viewResult': 'View result',
  'agentStatus.resultTitle': 'Agent result',
  'toolGroup.searchedWeb': 'searched the web',
  'toolGroup.fetchedOne': 'fetched a page',
  'toolGroup.fetchedMany': 'fetched {count} pages',

  'tasks.title': 'Tasks',
  'tasks.completed': 'Tasks completed',
  'tasks.dismissCompleted': 'Hide completed tasks',
  'tasks.expandList': 'Show task list',
  'tasks.collapseList': 'Hide task list',
  'tasks.newTask': '+ New task',
  'tasks.emptyTitle': 'No scheduled tasks yet.',
  'tasks.emptyDesc': 'Create a recurring task to automate your engineering workflows.',
  'tasks.createNew': 'Create new task',
  'tasks.totalTasks': 'Total Tasks',
  'tasks.active': 'Active',
  'tasks.disabled': 'Disabled',

  'newTask.title': 'New scheduled task',
  'newTask.localWarning': 'Local tasks only run while your computer is awake.',
  'newTask.name': 'Name',
  'newTask.namePlaceholder': 'daily-code-review',
  'newTask.description': 'Description',
  'newTask.descPlaceholder': "Review yesterday's commits and flag anything concerning",
  'newTask.frequency': 'Frequency',
  'newTask.everyNMinutes': 'Every N minutes',
  'newTask.everyNHours': 'Every N hours',
  'newTask.daily': 'Daily',
  'newTask.weekdays': 'Weekdays (Mon–Fri)',
  'newTask.specificDays': 'Specific days of week',
  'newTask.monthly': 'Monthly',
  'newTask.customCron': 'Custom cron expression',
  'newTask.intervalMinutes': 'Every {n} minutes',
  'newTask.intervalHours': 'Every {n} hours',
  'newTask.atMinute': 'at minute :{m}',
  'newTask.onMonthDay': 'On day {d} of each month',
  'newTask.cronFormatHint': 'Format: minute hour day-of-month month day-of-week',
  'newTask.invalidCron': 'Invalid cron expression',
  'newTask.daySun': 'Sun',
  'newTask.dayMon': 'Mon',
  'newTask.dayTue': 'Tue',
  'newTask.dayWed': 'Wed',
  'newTask.dayThu': 'Thu',
  'newTask.dayFri': 'Fri',
  'newTask.daySat': 'Sat',
  'newTask.delayNote': 'Scheduled tasks use a randomized delay of several minutes for server performance.',
  'newTask.create': 'Create task',
  'newTask.promptPlaceholder': 'Look at the commits from the last 24 hours. Summarize what changed, call out any risky patterns or missing tests, and note anything worth following up on.',
  'newTask.notification': 'Notification',
  'newTask.notifyOnComplete': 'Push notification on completion',
  'newTask.notifyChannels': 'Notification channels',
  'newTask.notifyHint': 'Send the task title and result to your IM channels when done.',
  'newTask.notConfigured': 'Not configured',
  'newTask.noChannelConfigured': 'No IM channels configured yet. Go to Settings → IM Adapters to set up.',

  'cron.everyMinute': 'Runs every minute',
  'cron.everyNMinutes': 'Runs every {n} minutes',
  'cron.everyHour': 'Runs every hour',
  'cron.everyNHours': 'Runs every {n} hours',
  'cron.everyNHoursAtMinute': 'Runs every {n} hours at :{m}',
  'cron.dailyAt': 'Runs daily at {time}',
  'cron.weekdaysAt': 'Runs on weekdays at {time}',
  'cron.specificDaysAt': 'Runs every {days} at {time}',
  'cron.monthlyAt': 'Runs on the {day}th of every month at {time}',
  'cron.customSchedule': 'Custom: {cron}',
  'cron.dow.0': 'Sun',
  'cron.dow.1': 'Mon',
  'cron.dow.2': 'Tue',
  'cron.dow.3': 'Wed',
  'cron.dow.4': 'Thu',
  'cron.dow.5': 'Fri',
  'cron.dow.6': 'Sat',

  'tasks.runNow': 'Run now',
  'tasks.confirmRun': 'Execute this task immediately?',
  'tasks.confirmDisable': 'Disable this scheduled task?',
  'tasks.confirmEnable': 'Enable this scheduled task?',
  'tasks.confirmDelete': 'Permanently delete this task and all its logs?',
  'tasks.running': 'Running...',
  'tasks.viewLogs': 'Logs',
  'tasks.logsTitle': 'Execution logs',
  'tasks.noLogs': 'No execution logs yet',
  'tasks.runStatus.running': 'Running',
  'tasks.runStatus.completed': 'Completed',
  'tasks.runStatus.failed': 'Failed',
  'tasks.runStatus.timeout': 'Timeout',
  'tasks.duration': '{s}s',
  'tasks.viewOutput': 'Summary',
  'tasks.hideOutput': 'Hide',
  'tasks.close': 'Close',
  'tasks.edit': 'Edit',
  'tasks.editTitle': 'Edit scheduled task',
  'tasks.saveChanges': 'Save changes',
  'tasks.openSession': 'View conversation',
  'tasks.createdAt': 'Created: ',
  'tasks.lastRunAt': 'Last run: ',
  'tasks.outputHintSession': 'Click "View conversation" to see the full output in session view.',
  'tasks.noOutputText': 'No output available.',

  'promptEditor.worktree': 'worktree',
  'promptEditor.bypassWarning': 'Bypass mode grants full system access',
  'promptEditor.within': 'within',
  'promptEditor.selectFolder': '— select a folder to limit scope',

  'permMode.executionPermissions': 'Execution Permissions',
  'permMode.askPermissions': 'Ask permissions',
  'permMode.askPermDesc': 'Confirm file edits and higher-risk commands when CLI asks',
  'permMode.autoAccept': 'Auto accept edits',
  'permMode.autoAcceptDesc': 'Sen writes to disk without asking',
  'permMode.planMode': 'Plan mode',
  'permMode.planModeDesc': 'Architecture & reasoning only, no files',
  'permMode.bypass': 'Bypass permissions',
  'permMode.bypassDesc': 'Full tool access for shell and file system',
  'permMode.dontAsk': "Don't ask",
  'permMode.enableBypassTitle': 'Enable bypass permissions?',
  'permMode.enableBypassSubtitle': 'This grants full access to your system',
  'permMode.enableBypassBody': 'Sen will have <strong>unrestricted</strong> access to execute shell commands and modify files within:',
  'permMode.permReadWrite': 'Read, write, and delete any files',
  'permMode.permShell': 'Execute arbitrary shell commands',
  'permMode.permPackages': 'Install or remove packages',
  'permMode.enableBypassBtn': 'Enable bypass',

  'permMode.label.default': 'Ask permissions',
  'permMode.label.acceptEdits': 'Auto accept',
  'permMode.label.plan': 'Plan mode',
  'permMode.label.bypassPermissions': 'Bypass',
  'permMode.label.dontAsk': "Don't ask",

  'model.selectModel': 'Select model',
  'model.configuration': 'Model Configuration',
  'model.effort': 'Effort',
  'model.unconfiguredPlaceholder': 'No models configured',
  'chat.noModel.banner': 'No model configured. Add at least one model in Provider settings to send messages.',
  'chat.noModel.warning': 'No model is configured. Please add at least one model in Provider settings before sending.',
  'chat.noModel.shortToast': 'Please add a model first.',
  'chat.noModel.openSettings': 'Open Provider settings',
  'chat.noModel.sendTooltip': 'Please add a model first',

  'dirPicker.selectProject': 'Select a project...',
  'dirPicker.recent': 'Recent',
  'dirPicker.more': 'Load more',
  'dirPicker.noRecent': 'No recent projects',
  'dirPicker.chooseFolder': 'Choose a different folder',
  'dirPicker.chooseProjectFolder': 'Choose project folder',
  'dirPicker.useThisFolder': 'Use this folder',
  'dirPicker.noSubdirs': 'No subdirectories',

  'fileSearch.searching': 'Searching...',
  'fileSearch.noMatch': 'No files match',
  'fileSearch.noFiles': 'No files in this directory',
  'fileSearch.accessDenied': 'Cannot access this directory',
  'fileSearch.loadFailed': 'Failed to load directory',
  'fileSearch.navigate': 'navigate',
  'fileSearch.attach': 'attach',
  'fileSearch.attachFolder': 'attach this folder',
  'fileSearch.close': 'close',

  'teams.backToLeader': '\u2190 Back to Leader',
  'teams.viewing': 'Viewing:',
  'teams.transcript': 'transcript',
  'teams.noMessages': 'No messages yet',
  'teams.team': 'Team:',
  'teams.members': 'members',
  'teams.working': 'Working...',
  'teams.thinking': 'Thinking...',
  'teams.running': 'running',
  'teams.leader': 'team-lead',
  'teams.memberPlaceholder': 'Message this teammate directly...',
  'teams.memberSessionHint': 'Messages here go straight to this teammate while you watch its transcript update.',

  'scheduledPage.title': 'Scheduled tasks',
  'scheduledPage.subtitle': 'Run tasks on a schedule or whenever you need them. Type {code} in any existing session to create one.',
  'scheduledPage.desktopNotice': 'Scheduled tasks only run while the desktop app is open. Make sure it stays running for tasks to fire on time.',
  'scheduledPage.oldSubtitle': 'Manage automated operational routines and background maintenance.',
  'scheduledPage.executionMode': 'Execution Mode',
  'scheduledPage.localMode': 'Local Mode',
  'scheduledPage.remoteMode': 'Remote Mode',
  'scheduledPage.nextRun': 'Next Run',
  'scheduledPage.systemHealth': 'System Health',
  'scheduledPage.activeSession': 'Active Session',
  'scheduledPage.colTaskName': 'Task Name',
  'scheduledPage.colFrequency': 'Frequency',
  'scheduledPage.colLastResult': 'Last Result',
  'scheduledPage.colNextExecution': 'Next Execution',
  'scheduledPage.colActions': 'Actions',
  'scheduledPage.endOfList': 'End of scheduled list',
  'scheduledPage.pausedTasks': '9 other tasks are currently paused or disabled for maintenance.',
  'scheduledPage.recentLogs': 'Recent Output Logs',
  'scheduledPage.viewArtifacts': 'View Full Artifacts',
  'scheduledPage.resourceAllocation': 'Resource Allocation',
  'scheduledPage.cpuCapacity': 'CPU Capacity',
  'scheduledPage.memoryLoad': 'Memory Load',
  'scheduledPage.connectedLocal': 'Connected to local node',
  'scheduledPage.thisMonth': '{count} this month',

  'update.available': 'v{version} available',
  'update.availableLabel': 'Available',
  'update.checking': 'Checking for updates...',
  'update.checkNow': 'Check now',
  'update.checkedAt': 'Last checked {time}',
  'update.currentVersionUnknown': 'Unknown',
  'update.newVersion': 'New version v{version} available',
  'update.downloading': 'Downloading...',
  'update.idle': 'Check for updates to compare your installed version with the latest GitHub Release.',
  'update.now': 'Update now',
  'update.later': 'Later',
  'update.progress': 'Downloading update... {progress}%',
  'update.progressBytes': 'Downloading update... {downloaded} downloaded',
  'update.releaseNotes': 'Release Notes',
  'update.restarting': 'Restarting to finish update...',
  'update.upToDate': 'You are up to date on v{version}.',
  'update.failed': 'Update failed: {error}',
  'update.toast.checking': 'Checking for updates…',
  'update.toast.upToDate': 'You are on the latest version v{version}',
  'update.toast.error': 'Update check failed: {error}',
  'update.toast.dismiss': 'Dismiss',

  'session.untitled': 'Untitled Session',
  'session.active': 'session active',
  'session.lastUpdated': 'last updated {time}',
  'session.messages': '{count} messages',
  'session.workspaceUnavailable': 'Workspace unavailable: {dir}',
  'session.timeJustNow': 'just now',
  'session.timeMinutes': '{n}m ago',
  'session.timeHours': '{n}h ago',
  'session.timeDays': '{n}d ago',

  'app.runtimeError': 'A runtime error occurred: {message}',
  'app.serverFailed': 'Local server failed to start',
  'app.serverFailedHint': 'Please include a screenshot of this diagnostic panel when reporting the issue.',
  'app.startupError': 'Startup error',
  'app.serverLogs': 'Server logs',
  'app.copyDiagnostics': 'Copy diagnostics',
  'app.copiedDiagnostics': 'Copied',
  'app.launching': 'Launching local workspace...',
  'app.launchingSlow': 'The local service is still warming up (waited {{seconds}}s). Cold launches can take a while.',
  'app.launchingTip': 'If this stays for a long time, check if anti-virus / firewall is scanning the executable, or if any leftover MCP/LSP processes are blocking startup.',
  'app.launchingFailed': 'Local workspace failed to start',
  'app.launchingFailedDetail': 'The embedded backend did not become ready after {{seconds}}s. Click Retry or Open log directory below.',
  'app.retry': 'Retry launch',
  'app.retrying': 'Retrying...',
  'app.openLogDir': 'Open log directory',
  'app.copyLaunchError': 'Copy launch error',
  'app.copyLaunchErrorCopied': 'Copied',

  'error.CLI_NOT_RUNNING': 'CLI process is not running. The session may have ended or the process crashed.',
  'error.CLI_START_FAILED': 'Failed to start CLI process.',
  'error.CLI_AUTH_REQUIRED': 'Authentication is required. Please log in.',
  'error.CLI_SESSION_CONFLICT': 'Session is already in use by another process.',
  'error.CLI_SPAWN_FAILED': 'Failed to spawn CLI subprocess.',
  'error.CLI_ERROR': 'An error occurred during processing.',
  'error.WORKDIR_INVALID': 'Working directory is invalid or does not exist.',
  'error.PARSE_ERROR': 'Invalid message format.',
  'error.UNKNOWN_TYPE': 'Unknown message type.',
  'error.BAD_REQUEST': 'Bad request.',
  'error.NOT_FOUND': 'Resource not found.',
  'error.INTERNAL_ERROR': 'Internal server error.',
  'error.NO_MODEL_CONFIGURED': 'No model is configured. Add at least one provider and model in settings.',
  'error.CONFIG_ERROR': 'Model or provider configuration is invalid. Check API key, endpoint URL, and model name.',
  'error.CONNECTION_FAILED': 'Unable to connect to the model provider. Check your network and provider endpoint.',
  'error.CONNECTION_TIMEOUT': 'The request timed out before completing. Check your network and try again.',
  'error.INSUFFICIENT_BALANCE': 'Account balance or quota is insufficient. Top up or switch to another provider.',
  'error.GATEWAY_ERROR': 'The upstream gateway returned an error. Try again later or switch provider.',
  'error.AUTH_ERROR': 'Authentication failed. Verify your API key and account permissions.',
  'error.RATE_LIMITED': 'Rate limit reached. Wait a moment or switch to another provider.',
  'error.MODEL_UNAVAILABLE': 'The selected model is unavailable. Choose a supported model or provider.',
  'error.ENGINE_OVERLOADED': 'The upstream model engine is overloaded. Retry shortly or switch model.',
  'error.PROVIDER_FAILOVER': 'All configured providers failed. Check network and provider settings, then retry.',
  'error.AGENT_TURN_FAILED': 'Something went wrong while processing your request. Try again.',
  'error.UNKNOWN_ERROR': 'Something went wrong while processing your request. Try again.',
  'error.TURN_CANCELLED': 'The request was cancelled.',
  'error.VALIDATION_ERROR': 'The request was invalid. Check your input and try again.',

  'serverVerb.Thinking': 'Thinking',
  'serverVerb.Task started': 'Task started',
  'serverVerb.Task in progress': 'Task in progress',

  'tabs.close': 'Close',
  'tabs.closeOthers': 'Close Others',
  'tabs.closeLeft': 'Close to the Left',
  'tabs.closeRight': 'Close to the Right',
  'tabs.closeAll': 'Close All',
  'tabs.closeConfirmTitle': 'Session Running',
  'tabs.closeConfirmMessage': 'This session is still running. What would you like to do?',
  'tabs.closeConfirmKeep': 'Keep Running',
  'tabs.closeConfirmStop': 'Stop & Close',
  'tabs.close.queueWarning.title': '{count} queued messages remaining',
  'tabs.close.queueWarning.body': 'Closing this tab affects how those queued messages are handled. Choose what to do.',
  'tabs.close.queueWarning.discard': 'Discard & close',
  'tabs.close.queueWarning.keep': 'Keep queue (send in background)',
  'tabs.queuedBadge': '+{count} queued',
  'tabs.awaitingApproval': 'Waiting for your approval',

  'settings.tab.codingMode': 'Coding Mode',
  'settings.codingMode.title': 'Coding Mode',
  'settings.codingMode.description':
    'Pick the AI programming workflow. Each mode tunes the system prompt, allowed tools, and approval policy.',
  'settings.codingMode.derivedPermission': 'Derived approval policy: {mode}',
  'settings.codingMode.reorderHint':
    'Drag the cards to reorder modes. The new order syncs instantly to the mode picker in the input area and persists across restarts.',
  'settings.codingMode.dragHandle': 'Drag to reorder',
  'settings.codingMode.loading': 'Loading available coding modes…',
  'codingMode.title': 'Coding Modes',
  'codingMode.selectorTitle': 'Choose a coding workflow',
  'codingMode.tag.autonomous': 'Autonomous',
  'codingMode.tag.readOnly': 'Read-only',
  'codingMode.confirmAutonomousTitle': 'Enable autonomous mode?',
  'codingMode.confirmAutonomousSubtitle':
    'The agent will run write operations and shell commands without prompting',
  'codingMode.confirmAutonomousBody':
    'In Agent / Harness mode the assistant decomposes tasks and executes file edits, shell commands, and tool calls automatically. Use this only on a workspace you trust and back up.',
  'codingMode.confirmAutonomousBtn': 'Enable autonomous mode',
  'codingMode.webSearchStatus': 'Web search',
  'codingMode.webFetchStatus': 'Web fetch',
  'codingMode.webStatusOn': 'Enabled',
  'codingMode.webStatusOff': 'Disabled',
  'codingMode.vibe.label': 'Vibe',
  'codingMode.vibe.description':
    'Full tool access with minimal prompting — for fast prototyping and free-form coding when you trust the agent to move quickly.',
  'codingMode.spec.label': 'Spec',
  'codingMode.spec.description':
    'Specification-driven — generates SPEC.md, follows a tracked plan step-by-step, and verifies each step with build/test commands.',
  'codingMode.plan.label': 'Plan',
  'codingMode.plan.description':
    'Plan authoring — analyzes the request, then writes or updates a `.plan.md` document under `.senweavercoding/plans/` so a later mode can execute it. Cannot modify source code or run shell commands.',
  'codingMode.ask.label': 'Ask',
  'codingMode.ask.description':
    'Pure read-only Q&A — explains code with citations and runs no mutations of any kind: no file edits, no shell, no plan writes.',
  'codingMode.tdd.label': 'TDD',
  'codingMode.tdd.description':
    'Strict Red → Green → Refactor — writes a failing test first, then minimum implementation to pass, then refactor; auto-runs verification after every edit.',
  'codingMode.debug.label': 'Debug',
  'codingMode.debug.description':
    'Four-stage root-cause analysis (Reproduce → Hypothesize → Isolate → Fix) plus QA automation — drives the built-in browser for end-to-end frontend/backend testing, reuses your pre-logged-in session, redacts PII at the LLM boundary, and emits report.md + tech_doc.md with screenshots and a browser trace.',
  'codingMode.auto.label': 'Auto',
  'codingMode.auto.description':
    'Automatically picks the best-fitting coding mode for each message based on your intent (debugging, planning, design, Q&A, or general agent work). Never locks in a single mode — every turn is routed to the best fit while all other modes stay unchanged.',
  'codingMode.agent.label': 'Agent',
  'codingMode.agent.description':
    'Autonomous orchestrator — auto-approves all tool calls, decomposes the task, executes end-to-end with file edits and shell commands, then self-verifies.',
  'codingMode.architect.label': 'Architect',
  'codingMode.architect.description':
    'Architecture-focused — reads broadly to do high-level design review, then performs targeted cross-module edits backed by spec analysis.',
  'codingMode.pair.label': 'Pair',
  'codingMode.pair.description':
    'Collaborative pair-programming — proceeds one step at a time and pauses at every checkpoint for your confirmation before continuing.',
  'codingMode.context.label': 'Context',
  'codingMode.context.description':
    'Context engineering for large codebases — Explore → Map → Plan → Strike, with impact analysis reported after each batch of edits.',
  'codingMode.mvai.label': 'MVAI',
  'codingMode.mvai.description':
    'Model-View-Agent-Interface architecture — enforces interface-first contracts that are observable, testable, and clearly layered.',
  'codingMode.harness.label': 'Harness',
  'codingMode.harness.description':
    'Engineering-grade harness — spec generation, skill orchestration, session checkpoints and multi-agent delegation, with auto-approval and verification.',
  'codingMode.curator.label': 'Curator',
  'codingMode.curator.description':
    'Research curator — extensively mines the web and local workspace, then authors a professional paper / solution / technical report with DOCX export. Stops after the document lands so a later switch to Agent mode can implement the blueprint verbatim.',
  'codingMode.designer.label': 'Designer',
  'codingMode.designer.description':
    'Design studio — ten UI/design surfaces (prototype, BI dashboard, slide deck, diagram, image, video, HyperFrames, audio, from Figma, from template) driven by a discovery → plan → generate → critique pipeline; artifacts render in a dedicated preview panel and every model and media call reuses your configured model providers.',
  'designer.chips.title': 'Design modes',
  'designer.panel.brief': 'Brief',
  'designer.panel.briefPlaceholder': 'Describe what you want to design…',
  'designer.panel.generate': 'Generate',
  'designer.panel.cancel': 'Cancel',
  'designer.panel.model': 'Model',
  'designer.panel.modelPlaceholder': 'Select or type a model id',
  'designer.preview.title': 'Design preview',
  'designer.preview.toggle': 'Design canvas',
  'designer.preview.empty': 'Generated design artifacts appear here',
  'designer.preview.openFile': 'Open file',
  'designer.preview.refresh': 'Refresh',
  'designer.preview.close': 'Close',
  'designer.canvas.title': 'Design canvas',
  'designer.canvas.toggle': 'Design canvas',
  'designer.canvas.empty': "This session's designs appear here. Generate in Designer mode to see its history.",
  'designer.canvas.refresh': 'Refresh',
  'designer.canvas.close': 'Close',
  'designer.canvas.editUnit': 'Edit source file',
  'designer.canvas.fullscreenPreview': 'Fullscreen preview this unit',
  'designer.canvas.exitFullscreen': 'Exit fullscreen (Esc)',
  'designer.canvas.deleteUnit': 'Delete selected unit',
  'designer.canvas.moveUnit': 'Drag to reposition on canvas',
  'designer.canvas.sendToComposer': 'Reference in composer (drag or click)',
  'designer.deck.openPptx': 'Open PPTX file',
  'designer.deck.openPptxFailed': 'The PPTX file is not ready yet — wait for the deck to compile',
  'designer.deck.generating': 'Slides are being generated… the canvas refreshes as each slide is written',
  'designer.deck.prev': 'Previous slide',
  'designer.deck.next': 'Next slide',
  'designer.deck.notes': 'Speaker notes',
  'designer.deck.thumbnails': 'Thumbnails',
  'designer.deck.theme': 'Switch theme',
  'designer.deck.present': 'Present (fullscreen)',
  'designer.deck.exitPresent': 'Exit presentation',
  'designer.image.regionRect': 'Box select a region',
  'designer.image.regionLasso': 'Freehand circle a region',
  'designer.image.regionLabel': 'Region {w}%×{h}%',
  'designer.image.regionPicked': 'Region referenced in composer',
  'designer.image.maskSaveFailed': 'Failed to save the region mask — try again',
  'designer.diagram.exportPng': 'Export PNG',
  'designer.diagram.exportSvg': 'Export SVG',
  'designer.diagram.copySource': 'Copy source',
  'designer.diagram.sourceCopied': 'Diagram source copied',
  'designer.diagram.exportFailed': 'Export failed — try again',
  'designer.diagram.renderError': 'Render failed — reference this unit and ask the assistant to fix the syntax',
  'designer.canvas.renameUnit': 'Rename (or double-click the name)',
  'designer.canvas.zoomIn': 'Zoom in',
  'designer.canvas.zoomOut': 'Zoom out',
  'designer.canvas.resetView': 'Reset view',
  'designer.canvas.fitView': 'Fit all units to view',
  'designer.canvas.editRefChip': 'Edit design',
  'designer.canvas.editRefRemove': 'Remove reference',
  'designer.canvas.selectMode': 'Select element to edit (click a part of the design)',
  'designer.canvas.device': 'Preview viewport',
  'designer.canvas.deviceAuto': 'Fit',
  'designer.canvas.tweaks': 'Tweaks',
  'designer.canvas.tweaksReset': 'Reset',
  'designer.canvas.tweakAccent': 'Accent',
  'designer.canvas.tweakScale': 'Type scale',
  'designer.canvas.tweakDensity': 'Density',
  'designer.canvas.tweakMotion': 'Motion',
  'designer.canvas.tweakMode': 'Mode',
  'designer.canvas.mode.auto': 'Auto',
  'designer.canvas.mode.light': 'Light',
  'designer.canvas.mode.dark': 'Dark',
  'designer.canvas.elementRef': 'Editing element',
  'designer.inline.requiredMissing': 'Fill the required "{label}" parameter before generating',
  'designer.figma.invalidUrl': 'That does not look like a Figma link — paste a figma.com file/design share URL',
  'designer.canvas.exportHandoff': 'Export handoff package (ZIP + manifest + React)',
  'designer.canvas.handoffDone': 'Handoff package ready ({n} files) → {path}',
  'designer.canvas.handoffFailed': 'Handoff export failed',
  'designer.canvas.lint': 'Lint selected design (anti-AI-slop)',
  'designer.canvas.lintSelectHint': 'Select an HTML or deck design unit first',
  'designer.canvas.lintResult': 'Lint — P0: {p0} · P1: {p1} · P2: {p2}',
  'designer.canvas.lintFailed': 'Lint failed',
  'designer.canvas.exportPdf': 'Export merged PDF (print all HTML units to one PDF via the built-in browser)',
  'designer.canvas.addUnit': 'Add UI unit',
  'designer.canvas.addFromTemplate': 'From template',
  'designer.canvas.addSketch': 'Hand-drawn sketch',
  'designer.canvas.addUnitDone': 'UI unit added',
  'designer.canvas.addUnitFailed': 'Failed to add UI unit',
  'designer.canvas.sketchUndo': 'Undo last stroke',
  'designer.canvas.sketchClear': 'Clear board',
  'designer.canvas.sketchNamePlaceholder': 'Sketch name (optional)…',
  'designer.canvas.sketchSave': 'Add to canvas',
  'designer.canvas.sketchDefaultName': 'Hand-drawn sketch',
  'designer.canvas.pdfSelectHint': 'No HTML design units to export on this canvas',
  'designer.canvas.pdfFailed': 'PDF export failed',
  'designer.canvas.pdfDone': 'Print dialog opened with {n} unit(s) merged',
  'designer.canvas.downloadFile': 'Download file',
  'designer.canvas.deleteConfirm': 'Click delete again to remove the unit AND its file from disk',
  'designer.canvas.deleteFailed': 'Failed to delete the design unit on the server',
  'designer.canvas.refreshFailed': 'Could not refresh design units — check the gateway connection',
  'designer.canvas.mediaLoadFailed': 'Media file failed to load (it may have been moved or deleted)',
  'designer.canvas.zoomReset': 'Reset zoom to 100%',
  'designer.designSystem.label': 'Design system',
  'designer.designSystem.auto': 'Auto',
  'designer.designSystem.autoHint': 'Match a design system from the current prompt',
  'designer.designSystem.searchPlaceholder': 'Search design systems…',
  'designer.designSystem.count': '{n} available',
  'designer.inline.choose': 'Choose',
  'designer.inline.any': 'Any',
  'designer.inline.auto': 'Auto',
  'designer.inline.none': 'None',
  'designer.inline.modelPlaceholder': 'Select or type model id',
  'designer.promptTemplate.label': 'Prompt template',
  'designer.promptTemplate.none': 'No template',
  'designer.promptTemplate.noneHint': 'Generate from your brief only',
  'designer.promptTemplate.searchPlaceholder': 'Search prompt templates…',
  'designer.promptTemplate.count': '{n} available',
  'designer.htmlTemplate.none': 'No template',
  'designer.htmlTemplate.noneHint': 'Build from scratch using your brief',
  'designer.htmlTemplate.searchPlaceholder': 'Search built-in templates…',
  'designer.htmlTemplate.count': '{n} built-in templates',
  'curator.actions.buildSwitch': 'Build → Agent',
  'curator.statusWriting': 'Writing…',
  'curator.statusFailed': 'Not finalized',
  'curator.failedHint': 'The document was not finalized yet. Ask the assistant to continue, or fix the issue below and retry.',
  'curator.interrupted': 'The turn ended before the document was finalized. Click "Continue writing" to let the assistant finish and save it.',
  'curator.continueWriting': 'Continue writing',
  'curator.continueWritingPrompt': 'Continue and finalize the Curator document',
  'curator.copyPath': 'Copy path',
  'curator.viewDocument': 'View document',
  'curator.untitled': 'Untitled document',
  'curator.revealDocx': 'Show in file manager',
  'curator.renderingDiagrams': 'Rendering diagrams into the DOCX…',
  'curator.progressCardTitle': 'Curator build · Completed',
  'curator.modeSwitchTitle': 'Switch to Agent · execute impl_blueprint.md verbatim',
  'curator.modeSwitchBody':
    'After switching, Agent mode will load impl_blueprint.md and engineer the full codebase, configs and docs accordingly. Curator-stage assets feed in as implementation inputs.',
  'review.curatorGroupLabel': 'Curator deliverables',
  'review.completedGroupLabel': 'Completed curator deliverables',
  'pairCheckpoint.title': 'Pair Checkpoint',
  'pairCheckpoint.awaiting': 'Awaiting input',
  'pairCheckpoint.body':
    'Pair mode pauses after every tool batch and hands control back to you. Review the changes above, then send the next instruction (or a redirect) to resume execution.',
  'pairCheckpoint.hint': 'Type your next message to continue or redirect.',
  'quickMode.title': 'Switch coding mode',
  'quickMode.escHint': 'Esc to close',
  'quickMode.footerKeys': 'Press 1–9, 0, Q, W to select',
  'quickMode.footerHint': 'Ctrl+Shift+M to open · Ctrl+Shift+P for Plan',
  'settings.keyboard.title': 'Keyboard Shortcuts',
  'settings.keyboard.description':
    'Customize global keyboard shortcuts. Click "Rebind" and press the new key combination; press Esc to cancel. Changes take effect immediately and persist across sessions.',
  'settings.keyboard.rebind': 'Rebind',
  'settings.keyboard.cancel': 'Cancel',
  'settings.keyboard.recording': 'Press a key…',
  'settings.keyboard.resetAll': 'Reset all to defaults',
  'settings.keyboard.resetOne': 'Reset to default',
  'settings.keyboard.recordHint':
    'Tip: Modifier keys alone (Ctrl, Shift, Alt) are ignored. Combinations conflicting with other actions are rejected.',
  'shortcuts.conflict':
    'Shortcut "{shortcut}" is already bound to "{action}". Choose a different combination.',
  'shortcuts.action.new-session.label': 'New agent',
  'shortcuts.action.new-session.description':
    'Create a new agent in the active workspace.',
  'shortcuts.action.sidebar-search.label': 'Focus sidebar search',
  'shortcuts.action.sidebar-search.description':
    'Open the sidebar (if collapsed) and focus the session search field.',
  'shortcuts.action.stop-generation.label': 'Stop generation',
  'shortcuts.action.stop-generation.description':
    'Cancel the running generation in the active session.',
  'shortcuts.action.toggle-terminal.label': 'Toggle terminal panel',
  'shortcuts.action.toggle-terminal.description':
    'Show or hide the bottom terminal panel; opens a new shell tab if none exist.',
  'shortcuts.action.quick-mode-switcher.label': 'Open quick mode switcher',
  'shortcuts.action.quick-mode-switcher.description':
    'Open the quick coding-mode switcher overlay; press 1–9, 0, Q, W to select.',
  'shortcuts.action.mode-plan.label': 'Switch to Plan mode',
  'shortcuts.action.mode-plan.description':
    'Directly switch the active session to Plan mode for plan generation.',
  'shortcuts.action.close-modal.label': 'Close modal / overlay',
  'shortcuts.action.close-modal.description':
    'Close the topmost modal or overlay (settings, dialogs, quick switcher).',

  'settings.hooks.title': 'Hooks',
  'settings.hooks.description':
    'Configure lifecycle hooks that run alongside tool invocations for auditing, observability, and policy enforcement.',
  'settings.hooks.runtimeSection': 'Runtime',
  'settings.hooks.enableLifecycle': 'Enable lifecycle hooks',
  'settings.hooks.enableLifecycleHint':
    'When enabled, configured hook handlers run in-process for every tool call.',
  'settings.hooks.commandLogger': 'Command logger',
  'settings.hooks.commandLoggerHint':
    'Log every tool invocation to the runtime tracing pipeline for auditing.',
  'settings.hooks.webhookSection': 'Webhook audit',
  'settings.hooks.webhookEnable': 'Enable webhook audit',
  'settings.hooks.webhookEnableHint':
    'POST a JSON payload to a remote endpoint for tool calls matching the patterns below.',
  'settings.hooks.webhookUrl': 'Webhook URL',
  'settings.hooks.webhookPatterns': 'Tool patterns (comma-separated)',
  'settings.hooks.webhookPatternsHint':
    'Glob patterns matched against tool names. Empty list audits nothing.',
  'settings.hooks.webhookIncludeArgs': 'Include arguments',
  'settings.hooks.webhookIncludeArgsHint':
    'Embed serialized tool arguments in the audit payload (may contain sensitive data).',
  'settings.hooks.webhookMaxArgsBytes': 'Max args bytes',
  'settings.hooks.scriptSection': 'Cursor-style hook scripts',
  'settings.hooks.scriptDescription':
    'Hook scripts are auto-loaded (read-only) from the following paths if present.',
  'settings.hooks.savedToast': 'Hooks configuration saved.',

  'settings.agents.title': 'Agents',
  'settings.agents.description':
    'Global agent behaviour: tool loop, history, compaction, reasoning depth, runtime caps, and built-in context tools (web_search / web_fetch).',
  'settings.agents.savedToast': 'Settings saved.',

  'settings.agents.section.core': 'Core Behaviour',
  'settings.agents.section.coreHint':
    "[agent] block — tool loop iterations, history budget, dispatcher and parallel tool execution.",
  'settings.agents.section.context': 'Context Management',
  'settings.agents.section.contextHint':
    'History pruning and automatic conversation compaction to keep within model context.',
  'settings.agents.section.quality': 'Quality & Approach',
  'settings.agents.section.qualityHint':
    'Default reasoning depth and post-response evaluation gate.',
  'settings.agents.section.directives': 'Directives & Project Intel',
  'settings.agents.section.directivesHint':
    'Global instructions injected into every session and project auto-indexing.',
  'settings.agents.section.runtime': 'Runtime Loop',
  'settings.agents.section.runtimeHint':
    '[agent_runtime] block — per-turn token caps, loop detection, sub-agent concurrency, fast apply, self-consistency.',
  'settings.agents.section.contextTools': 'Context Tools',
  'settings.agents.section.contextToolsHint':
    'Built-in web_search and web_fetch tools surfaced to the agent.',
  'settings.agents.section.permission': 'Execution Permissions',
  'settings.agents.section.permissionHint':
    'Global default permission level applied to all sessions. Switching coding mode automatically re-derives this value.',
  'settings.agents.permission.codingHint':
    'Coding mode "{mode}" currently auto-derives permission to "{derived}".',

  'settings.agents.autoRun.title': 'Auto-Run',
  'settings.agents.autoRun.modeLabel': 'Auto-Run Mode',
  'settings.agents.autoRun.modeHint':
    'Choose how Agent runs tools like command execution, MCP, and file writes.',
  'settings.agents.autoRun.opt.askEveryTime': 'Ask Every Time',
  'settings.agents.autoRun.opt.askEveryTimeHint':
    'Prompt before every non-read tool — even ones in your allowlist.',
  'settings.agents.autoRun.opt.acceptEdits': 'Auto-Accept Edits',
  'settings.agents.autoRun.opt.acceptEditsHint':
    'File edits run silently; shell and other system tools still ask.',
  'settings.agents.autoRun.opt.useAllowlist': 'Use Allowlist',
  'settings.agents.autoRun.opt.useAllowlistHint':
    'Allowlisted tools auto-run; everything else asks.',
  'settings.agents.autoRun.opt.runEverything': 'Run Everything',
  'settings.agents.autoRun.opt.runEverythingHint':
    'Full tool access for shell and file system without prompting.',

  'settings.agents.autoRun.allowlist.title': 'Allowlist',
  'settings.agents.autoRun.allowlist.hint':
    'Tools listed here auto-run while in Use Allowlist mode. Use "*" to allow everything.',
  'settings.agents.autoRun.allowlist.placeholder': 'Tool name (e.g. file_read)',
  'settings.agents.autoRun.allowlist.add': 'Add',
  'settings.agents.autoRun.allowlist.empty':
    'No tools allowlisted yet. Add a tool name to auto-approve it.',
  'settings.agents.autoRun.allowlist.remove': 'Remove',

  'settings.agents.autoRun.modeTransitions.title': 'Auto-Approved Mode Transitions',
  'settings.agents.autoRun.modeTransitions.hint':
    'Mode transitions that will be automatically approved without prompting.',

  'settings.agents.autoRun.browserProtection': 'Browser Protection',
  'settings.agents.autoRun.browserProtectionHint':
    'Prevent Agent from automatically running Browser tools.',
  'settings.agents.autoRun.mcpProtection': 'MCP Tools Protection',
  'settings.agents.autoRun.mcpProtectionHint':
    'Prevent Agent from automatically running MCP tools.',

  'settings.agents.loopEng.title': 'Loop Engineering · Autonomous Loop',
  'settings.agents.loopEng.hint':
    'Generator-Evaluator quality loop and autonomous guardrails. All options are off by default; enabling the independent reviewer takes effect on the next run.',
  'settings.agents.loopEng.reviewGroup': 'Independent Reviewer (writer ≠ judge)',
  'settings.agents.loopEng.selfEval': 'Enable Independent Reviewer',
  'settings.agents.loopEng.selfEvalHint':
    'After deterministic checks pass, an independent model grades high-risk output against a fixed rubric and sends structured feedback back for a rewrite.',
  'settings.agents.loopEng.evaluateCodeEdits': 'Review Code Edits',
  'settings.agents.loopEng.evaluateCodeEditsHint':
    'Run the independent review on code-edit flows and reuse the existing fix loop when it rejects the change.',
  'settings.agents.loopEng.maxRetries': 'Max Evaluator Retries',
  'settings.agents.loopEng.maxRetriesHint':
    'How many times a turn that modified files may be sent back for a rewrite when the reviewer rejects it.',
  'settings.agents.loopEng.evaluatorModel': 'Evaluator Model',
  'settings.agents.loopEng.evaluatorModelHint':
    'Pick an independent evaluator model from any configured provider; cross-provider models are called with their own key automatically. Leave unset to reuse the model this session runs with.',
  'settings.agents.loopEng.evaluatorModelDefault': 'Reuse main model (this session\u2019s model)',
  'settings.agents.loopEng.frozenRubric': 'Frozen Rubric Path',
  'settings.agents.loopEng.frozenRubricHint':
    'Optional path to a fixed review rubric file. Leave empty to use the built-in code-review rubric.',
  'settings.agents.loopEng.frozenRubricPlaceholder': 'e.g. ./.sen/review-rubric.md (empty = built-in)',
  'settings.agents.loopEng.guardGroup': 'Autonomous Guardrails',
  'settings.agents.loopEng.maxCost': 'Daily Cost Cap',
  'settings.agents.loopEng.maxCostHint':
    'Autonomous /goal loops halt once the day\'s spend reaches this cap (requires cost tracking enabled). 0 disables the cap.',
  'settings.agents.loopEng.cents': 'cents/day',
  'settings.agents.loopEng.costTracking': 'Enable Cost Tracking',
  'settings.agents.loopEng.costTrackingHint':
    'Record token usage and spend, which the daily cost cap relies on. Off by default.',
  'settings.agents.loopEng.estop': 'Enable Emergency Stop',
  'settings.agents.loopEng.estopHint':
    'Allow the emergency-stop kill-switch/tool-freeze to halt tool execution. The persisted state is honored at the start of each agent session.',

  'settings.agents.autoRun.confirmTransition.title': 'Switch coding mode?',
  'settings.agents.autoRun.confirmTransition.body':
    'Switch the agent to "{target}" mode. You can auto-approve this transition in Agents settings.',
  'settings.agents.autoRun.confirmTransition.confirm': 'Switch',
  'settings.agents.autoRun.confirmTransition.cancel': 'Cancel',

  'settings.agents.field.compactContext': 'Compact context for small models',
  'settings.agents.field.compactContextHint':
    'When enabled: bootstrap_max_chars=6000, rag_chunk_limit=2. Use for 13B or smaller models.',
  'settings.agents.field.maxToolIterations': 'Max tool iterations',
  'settings.agents.field.maxToolIterationsHint':
    'Soft cap on tool-call loop turns per user message. 0 falls back to the safe default of 200.',
  'settings.agents.field.maxHistoryMessages': 'Max history messages',
  'settings.agents.field.maxHistoryMessagesHint':
    'Maximum conversation history messages retained per session.',
  'settings.agents.field.maxContextTokens': 'Max context tokens',
  'settings.agents.field.maxContextTokensHint':
    'Estimated token budget before compaction triggers. Uses ~4 chars/token heuristic.',
  'settings.agents.field.parallelTools': 'Parallel tool execution',
  'settings.agents.field.parallelToolsHint':
    'Allow multiple tools to be dispatched in parallel within a single iteration.',
  'settings.agents.field.toolDispatcher': 'Tool dispatcher',
  'settings.agents.field.toolDispatcherHint':
    'Strategy used to schedule tool calls (typically "auto").',
  'settings.agents.field.contextAwareTools': 'Context-aware tool filtering',
  'settings.agents.field.contextAwareToolsHint':
    'Only surface relevant tools per iteration based on the current step.',

  'settings.agents.field.historyEnabled': 'Enable history pruning',
  'settings.agents.field.historyMaxTokens': 'Pruning max tokens',
  'settings.agents.field.historyKeepRecent': 'Keep recent N messages',
  'settings.agents.field.historyCollapseTools': 'Collapse tool results',

  'settings.agents.field.compressionEnabled': 'Enable context compression',
  'settings.agents.field.compressionThreshold': 'Trigger threshold ratio',
  'settings.agents.field.compressionThresholdHint':
    'Compression starts when history reaches this fraction of the model context (0–1).',
  'settings.agents.field.compressionFirstN': 'Protect first N messages',
  'settings.agents.field.compressionLastN': 'Protect last N messages',
  'settings.agents.field.compressionMaxPasses': 'Max compression passes',
  'settings.agents.field.compressionSummaryChars': 'Summary max chars',
  'settings.agents.field.compressionSourceChars': 'Source slice max chars',
  'settings.agents.field.compressionTimeout': 'Timeout (seconds)',
  'settings.agents.field.compressionSummaryModel': 'Summary model (optional)',
  'settings.agents.field.compressionSummaryModelHint':
    'Override model used for summarisation. Leave empty to use the default model.',

  'settings.agents.field.builtinToolDeferred': 'Built-in tool deferred loading',
  'settings.agents.field.builtinToolDeferredHint':
    'Send only core tool schemas (file/search/shell/plan…) every turn; expose the rest as name+description stubs and let the model activate them via tool_search. Trades a small latency hit for a major reduction in input tokens (typically 25–30K tokens per turn).',

  'settings.agents.field.thinkingLevel': 'Default reasoning depth',
  'settings.agents.field.thinkingLevelHint':
    'Quick = "off"/"minimal"; thorough = "high"/"max". Equivalent to Cursor "Default Approach".',
  'settings.agents.thinking.off': 'Off',
  'settings.agents.thinking.minimal': 'Minimal',
  'settings.agents.thinking.low': 'Low',
  'settings.agents.thinking.medium': 'Medium',
  'settings.agents.thinking.high': 'High',
  'settings.agents.thinking.max': 'Max',

  'settings.agents.field.evalEnabled': 'Enable post-response evaluator',
  'settings.agents.field.evalEnabledHint':
    'Equivalent to Cursor "Agent Review" — re-runs evaluation if the answer scores below the threshold.',
  'settings.agents.field.evalMinScore': 'Minimum quality score',
  'settings.agents.field.evalMaxRetries': 'Max retries',

  'settings.agents.field.directives': 'Global directives',
  'settings.agents.field.directivesHint':
    'Default instructions applied to all agent sessions. Project-level AGENTS.md still overrides.',
  'settings.agents.field.directiveContent': 'Instruction',
  'settings.agents.field.directiveMode': 'Restrict to mode',
  'settings.agents.field.directiveModePlaceholder': 'all modes',
  'settings.agents.field.addDirective': 'Add directive',
  'settings.agents.field.removeDirective': 'Remove',

  'settings.agents.field.runtimeMaxIters': 'Max tool iterations (runtime cap)',
  'settings.agents.field.runtimeLoopThreshold': 'Loop detection threshold',
  'settings.agents.field.runtimeLoopThresholdHint':
    'Force-terminate the turn after this many identical tool invocations.',
  'settings.agents.field.runtimeParallel': 'Parallel tool dispatch enabled',
  'settings.agents.field.runtimeSoftCap': 'Per-turn token soft cap',
  'settings.agents.field.runtimeHardCap': 'Per-turn token hard cap',
  'settings.agents.field.runtimeMaxSubagents': 'Max sub-agents per coordinator',
  'settings.agents.field.runtimeParallelConcurrency': 'Parallel tool max concurrency',
  'settings.agents.field.runtimeSubagentTimeout': 'Sub-agent call timeout (seconds)',
  'settings.agents.field.fastApplyModel': 'Fast-apply model (optional)',
  'settings.agents.field.fastApplyModelHint':
    'Smaller / cheaper model used for the first refine attempt during apply_model.',
  'settings.agents.field.fastApplyTimeout': 'Fast-apply timeout (seconds)',
  'settings.agents.field.selfConsistencyEnabled': 'Enable self-consistency voting',
  'settings.agents.field.selfConsistencyEnabledHint':
    'Repeat the final-answer turn N times in parallel and pick the consensus answer.',
  'settings.agents.field.selfConsistencySamples': 'Samples',
  'settings.agents.field.selfConsistencyTemperature': 'Sampling temperature',
  'settings.agents.field.selfConsistencyMaxConcurrent': 'Max concurrent samples',
  'settings.agents.field.selfConsistencyFinalOnly': 'Final-answer turn only',

  'settings.agents.field.webSearchEnabled': 'Enable web_search tool',
  'settings.agents.field.webSearchProvider': 'Provider',
  'settings.agents.field.webSearchMaxResults': 'Max results',
  'settings.agents.field.webSearchTimeout': 'Timeout (seconds)',
  'settings.agents.field.webSearchBraveKey': 'Brave API key',
  'settings.agents.field.webSearchSearxng': 'SearXNG instance URL',
  'settings.agents.field.webSearchTavilyKey': 'Tavily API key',
  'settings.agents.field.webSearchExaKey': 'Exa API key',
  'settings.agents.field.webSearchSecretsHint':
    'Stored in the local config file. Leave empty to keep the existing value.',

  'settings.agents.field.webFetchEnabled': 'Enable web_fetch tool',
  'settings.agents.field.webFetchAllowed': 'Allowed domains (comma-separated, * = all)',
  'settings.agents.field.webFetchBlocked': 'Blocked domains (comma-separated)',
  'settings.agents.field.webFetchPrivate': 'Allowed private hosts (comma-separated)',
  'settings.agents.field.webFetchMaxSize': 'Max response size (bytes)',
  'settings.agents.field.webFetchTimeout': 'Timeout (seconds)',

  'settings.usage.title': 'Usage',
  'settings.usage.description':
    'Token usage across every chat session, broken down by model and by conversation. Spend is included as a secondary metric.',
  'settings.usage.kpiSession': 'Session',
  'settings.usage.kpiSessionHint': 'Spend on the active session',
  'settings.usage.kpiDaily': 'Today',
  'settings.usage.kpiDailyHint': 'Spend so far today',
  'settings.usage.kpiMonthly': 'This month',
  'settings.usage.kpiMonthlyHint': 'Spend month-to-date',
  'settings.usage.kpiTokens': 'Session tokens',
  'settings.usage.kpiTokensHint': 'Total input + output tokens this session',
  'settings.usage.kpiTotalTokens': 'Total tokens',
  'settings.usage.kpiTotalTokensHint': 'Total tokens across all sessions.',
  'settings.usage.kpiRequests': 'Requests',
  'settings.usage.kpiRequestsHint': 'Total provider round-trips recorded.',
  'settings.usage.kpiTokenRate': 'Token rate',
  'settings.usage.kpiTokenRateHint': 'Recent throughput (last hour, per minute).',
  'settings.usage.kpiAvgTokens': 'Avg tokens / request',
  'settings.usage.kpiAvgTokensHint': 'Total tokens divided by request count.',
  'settings.usage.kpi24h': 'Last 24 hours',
  'settings.usage.kpi24hHint': 'Tokens · requests · cost over the last 24 h.',
  'settings.usage.kpi7d': 'Last 7 days',
  'settings.usage.kpi7dHint': 'Tokens · requests · cost over the last 7 days.',
  'settings.usage.lifetimeSection': 'Lifetime by model',
  'settings.usage.lifetimeHint': 'Aggregated from costs.jsonl',
  'settings.usage.providerSection': 'By provider',
  'settings.usage.providerHint': 'Models grouped by their provider prefix',
  'settings.usage.workspaceSection': 'By workspace',
  'settings.usage.workspaceHint': 'Sessions grouped by working directory',
  'settings.usage.workspaceUnknown': '(no workspace)',
  'settings.usage.sessionSection': 'By session',
  'settings.usage.sessionHint': 'Tokens consumed per chat session',
  'settings.usage.systemSection': 'Process & gateway',
  'settings.usage.systemHint': 'Live runtime info from /api/runtime/snapshot',
  'settings.usage.systemLoading': 'Loading runtime info…',
  'settings.usage.systemVersion': 'Build',
  'settings.usage.systemPlatform': 'Platform',
  'settings.usage.systemPid': 'Process ID',
  'settings.usage.systemCpu': 'CPU cores',
  'settings.usage.systemUptime': 'Uptime',
  'settings.usage.systemStartedAt': 'Started at',
  'settings.usage.systemGateway': 'Gateway URL',
  'settings.usage.systemPathPrefix': 'Path prefix',
  'settings.usage.systemWorkspace': 'Workspace dir',
  'settings.usage.systemDefaultProvider': 'Default provider',
  'settings.usage.systemDefaultModel': 'Default model',
  'settings.usage.systemActiveSessions': 'Active sessions',
  'settings.usage.systemLiveTasks': 'Live background tasks',
  'settings.usage.tasksSection': 'Background tasks',
  'settings.usage.tasksLiveSuffix': 'live',
  'settings.usage.tasksEmpty': 'No supervised background tasks running.',
  'settings.usage.codingModeSection': 'By coding mode',
  'settings.usage.codingModeHint': '7 visible programming workflows tracked per request',
  'settings.usage.codingModeKpiActive': 'Active modes',
  'settings.usage.codingModeKpiActiveHint': 'Modes that have recorded at least one request',
  'settings.usage.codingModeKpiRequests': 'Mode requests',
  'settings.usage.codingModeKpiRequestsHint': 'Total LLM round-trips attributed to a coding mode',
  'settings.usage.codingModeKpiTokens': 'Mode tokens',
  'settings.usage.codingModeKpiTokensHint': 'Total tokens attributed to a coding mode',
  'settings.usage.codingModeKpiCost': 'Mode cost',
  'settings.usage.codingModeKpiCostHint': 'Total spend attributed to a coding mode',
  'settings.usage.codingModeNoData': 'No data',
  'settings.usage.codingMode.vibe': 'Vibe',
  'settings.usage.codingMode.spec': 'Spec',
  'settings.usage.codingMode.plan': 'Plan',
  'settings.usage.codingMode.ask': 'Ask',
  'settings.usage.codingMode.tdd': 'TDD',
  'settings.usage.codingMode.debug': 'Debug',
  'settings.usage.codingMode.agent': 'Agent',
  'settings.usage.codingMode.architect': 'Architect',
  'settings.usage.codingMode.pair': 'Pair',
  'settings.usage.codingMode.context': 'Context',
  'settings.usage.codingMode.mvai': 'MVAI',
  'settings.usage.codingMode.harness': 'Harness',
  'settings.usage.colCodingMode': 'Coding mode',
  'settings.usage.empty': 'No usage records yet.',
  'settings.usage.colModel': 'Model',
  'settings.usage.colProvider': 'Provider',
  'settings.usage.colModelCount': 'Models',
  'settings.usage.colSession': 'Session',
  'settings.usage.colSessionCount': 'Sessions',
  'settings.usage.colWorkspace': 'Workspace',
  'settings.usage.colRequests': 'Requests',
  'settings.usage.colInputTokens': 'Input',
  'settings.usage.colOutputTokens': 'Output',
  'settings.usage.colTotalTokens': 'Total tokens',
  'settings.usage.colCost': 'Cost (USD)',
  'settings.usage.colFirstUsed': 'First used',
  'settings.usage.colLastUsed': 'Last used',
  'settings.usage.colTaskName': 'Task',
  'settings.usage.colTaskCount': 'Live count',
  'settings.usage.colTaskOldest': 'Oldest age',
  'settings.usage.deletedSession': '[deleted]',

  'settings.toolsAndMcps.title': 'Tools & MCPs',
  'settings.toolsAndMcps.description':
    'Manage user-defined script-wrapped tools and external MCP server connections.',
  'settings.toolsAndMcps.subtabTools': 'Custom Tools',
  'settings.toolsAndMcps.subtabGuardrails': 'Guardrails',
  'settings.toolsAndMcps.subtabWeb': 'Web Research',
  'settings.toolsAndMcps.subtabMcps': 'MCP Servers',

  'settings.web.title': 'Web Research',
  'settings.web.description':
    'Let the assistant gather external evidence (docs, specs, vendor pages) via web search and fetch. Both are on by default; disable here to keep the agent fully local.',
  'settings.web.loading': 'Loading web research settings…',
  'settings.web.disabledHint':
    'Currently OFF. The model will not call this tool and will be told via system reminder to answer from local context only.',
  'settings.web.providerHintNoKey':
    'No API key is configured for this provider — the runtime will fall back to DuckDuckGo until you add one.',
  'settings.web.search.title': 'Web Search',
  'settings.web.search.description':
    'Issue queries to a search provider and stream back ranked results so the agent can cite sources.',
  'settings.web.search.provider': 'Provider',
  'settings.web.search.maxResults': 'Max Results (1-10)',
  'settings.web.search.timeout': 'Timeout (seconds)',
  'settings.web.fetch.title': 'Web Fetch',
  'settings.web.fetch.description':
    'Allow the agent to read primary sources by fetching specific URLs (paired with web search for citations).',
  'settings.web.fetch.allowedDomains': 'Allowed Domains',
  'settings.web.fetch.allowedDomainsHint':
    'Comma-separated list. Use "*" to allow any host. Block lists override allow lists.',
  'settings.web.fetch.maxSize': 'Max Response Size (bytes)',
  'settings.web.fetch.timeout': 'Timeout (seconds)',

  'settings.userRules.title': 'Instruction Rules',
  'settings.userRules.description':
    'Markdown files placed in this directory are appended to the assistant system prompt as project-wide instructions.',
  'settings.userRules.openDirectory': 'Open Directory',
  'settings.userRules.empty': 'No rule files yet.',
  'settings.userRules.emptyHint':
    'Click Open Directory to create the folder, then drop in any *.md or *.mdc rule file.',
  'settings.userRules.createdHint': 'Directory created. Add rule files inside, then refresh.',
  'settings.userRules.openFailed': 'Failed to open directory',
  'settings.userRules.tierExplanation':
    'Tip: add a YAML frontmatter `alwaysApply: false` to make a rule on-demand (loaded only when the assistant needs it). Files without frontmatter (or `alwaysApply: true`) are always applied as binding constraints — the safe default.',
  'settings.userRules.alwaysApplyBadge': 'Always Applied',
  'settings.userRules.alwaysApplyHint':
    'Full rule body is injected into every system prompt as a binding constraint.',
  'settings.userRules.onDemandBadge': 'On Demand',
  'settings.userRules.onDemandHint':
    'Only metadata is preloaded; the assistant calls read_user_rule(name) to load the full body when relevant.',
  'settings.userRules.newButton': 'New',
  'settings.userRules.newDialogTitle': 'New Instruction Rule',
  'settings.userRules.fieldName': 'File name',
  'settings.userRules.namePlaceholder': 'e.g. typescript-style.md',
  'settings.userRules.nameHint': 'Saved as: {computed}',
  'settings.userRules.nameInvalid':
    'Invalid name. Use a simple filename without slashes, leading dot, or "..".',
  'settings.userRules.nameConflict': 'A rule with this name already exists.',
  'settings.userRules.fieldContent': 'Rule content (Markdown + optional YAML frontmatter)',
  'settings.userRules.createButton': 'Create',
  'settings.userRules.createdToast': 'Rule file created.',
  'settings.userRules.savedToast': 'Rule file saved.',
  'settings.userRules.saveFailed': 'Failed to save rule',
  'settings.userRules.deletedToast': 'Rule file deleted.',
  'settings.userRules.deleteFailed': 'Failed to delete rule',
  'settings.userRules.deleteConfirmTitle': 'Delete this rule?',
  'settings.userRules.deleteConfirmBody':
    'The file "{name}" will be permanently removed from your rules directory. This cannot be undone.',
  'settings.userRules.editingHint':
    'Tip: keep YAML frontmatter at the top to control alwaysApply, description, and name.',
  'settings.userRules.revealFile': 'Reveal in Explorer',

  'settings.tools.listDescription':
    'Tools are registered as custom_<name> in the agent runtime. Disabled entries are skipped.',
  'settings.tools.create': 'Add custom tool',
  'settings.tools.empty': 'No custom tools configured yet.',
  'settings.tools.disabled': 'Disabled',
  'settings.tools.editTitle': 'Edit custom tool',
  'settings.tools.createTitle': 'Add custom tool',
  'settings.tools.fieldName': 'Name',
  'settings.tools.fieldDescription': 'Description',
  'settings.tools.fieldCommand': 'Command',
  'settings.tools.fieldCommandHint': 'Executable launched on each call.',
  'settings.tools.fieldArgs': 'Arguments (one per line)',
  'settings.tools.fieldArgsHint':
    'Use {json} for the full JSON payload or {field} for a specific argument.',
  'settings.tools.fieldCwd': 'Working directory',
  'settings.tools.fieldCwdHint':
    'Relative to the workspace root. Leave empty to use the workspace.',
  'settings.tools.fieldEnv': 'Environment (KEY=value, one per line)',
  'settings.tools.fieldEnvHint': 'Merged on top of the parent environment.',
  'settings.tools.fieldTimeout': 'Timeout (seconds)',
  'settings.tools.fieldEnabled': 'Enabled',
  'settings.tools.fieldSchema': 'Parameter JSON Schema',
  'settings.tools.fieldSchemaHint':
    'Strict schema exposed to the LLM. Validated as JSON before saving.',
  'settings.tools.errorNamePattern': 'Name must match [a-z_][a-z0-9_]*',
  'settings.tools.errorCommandEmpty': 'Command must be non-empty.',
  'settings.tools.errorTimeout': 'Timeout must be greater than zero.',
  'settings.tools.errorSchema': 'Schema is not valid JSON.',
  'settings.tools.confirmDeleteTitle': 'Delete custom tool',
  'settings.tools.confirmDeleteMessage':
    'Are you sure you want to delete the custom tool "{name}"? This cannot be undone.',
  'settings.tools.createdToast': 'Custom tool created.',
  'settings.tools.updatedToast': 'Custom tool updated.',
  'settings.tools.deletedToast': 'Custom tool deleted.',

  'settings.rsk.title': 'Rules, Skills, Subagents',
  'settings.rsk.description':
    'Manage guardrail policies, agent skills, and delegate subagents.',
  'settings.rsk.subtabRules': 'Rules',
  'settings.rsk.subtabSkills': 'Skills',
  'settings.rsk.subtabSubagents': 'Subagents',

  'settings.rules.engineEnable': 'Enable guardrails engine',
  'settings.rules.engineEnableHint':
    'When disabled, all tool calls bypass policy evaluation.',
  'settings.rules.defaultPolicy': 'Default policy',
  'settings.rules.policy.allow': 'Allow',
  'settings.rules.policy.deny': 'Deny',
  'settings.rules.policy.requireApproval': 'Require approval',
  'settings.rules.policy.auditOnly': 'Audit only',
  'settings.rules.listDescription':
    'Rules are evaluated top-to-bottom. The first matching rule wins.',
  'settings.rules.create': 'Add rule',
  'settings.rules.empty': 'No guardrail rules defined.',
  'settings.rules.editTitle': 'Edit rule',
  'settings.rules.createTitle': 'Add rule',
  'settings.rules.fieldPattern': 'Tool pattern',
  'settings.rules.fieldPatternHint': 'Glob matched against tool name.',
  'settings.rules.fieldPolicy': 'Policy',
  'settings.rules.fieldReason': 'Reason',
  'settings.rules.fieldReasonHint': 'Shown to the operator on approval/deny.',
  'settings.rules.fieldContexts': 'Contexts (comma-separated)',
  'settings.rules.fieldContextsHint':
    'Restrict rule to specific runtime contexts (empty = always applies).',
  'settings.rules.errorPatternEmpty': 'Tool pattern must be non-empty.',
  'settings.rules.savedToast': 'Guardrails saved.',
  'settings.rules.deletedToast': 'Rule deleted.',
  'settings.rules.confirmDeleteTitle': 'Delete rule',
  'settings.rules.confirmDeleteMessage':
    'Delete rule for pattern "{pattern}"? This cannot be undone.',

  'settings.skills.disabledTitle': 'Disabled skills',
  'settings.skills.disabledHint':
    'Comma-separated skill names to exclude from agent prompts.',
  'settings.skills.disabledSavedToast': 'Disabled skill list saved.',

  'settings.skills.promptModeTitle': 'Skill prompt loading mode',
  'settings.skills.promptModeHint':
    'Controls how skills are presented to the model on every turn. Compact keeps the system prompt small and lets the model pull full skill files via read_skill on demand; Full pre-loads every skill\u2019s instructions and tool descriptions.',
  'settings.skills.promptMode.compactTitle': 'Compact (on-demand)',
  'settings.skills.promptMode.compactDesc':
    'Inject only name + description + location. Model calls read_skill(name) to load the full file when needed. Saves 5\u201315K input tokens per turn.',
  'settings.skills.promptMode.fullTitle': 'Full (pre-load all)',
  'settings.skills.promptMode.fullDesc':
    'Inject every skill\u2019s full instructions and tool descriptions on every turn. Higher token cost but the model has full context immediately.',
  'settings.skills.promptMode.recommended': 'Recommended',
  'settings.skills.promptModeSavedToast': 'Skill prompt mode updated.',

  'settings.subagents.listDescription':
    'Delegate subagents are user-defined agents the main loop can dispatch tasks to.',
  'settings.subagents.create': 'Add subagent',
  'settings.subagents.empty': 'No subagents configured.',
  'settings.subagents.editTitle': 'Edit subagent',
  'settings.subagents.createTitle': 'Add subagent',
  'settings.subagents.agenticBadge': 'Agentic',
  'settings.subagents.fieldName': 'Name',
  'settings.subagents.fieldProvider': 'Provider',
  'settings.subagents.fieldModel': 'Model',
  'settings.subagents.fieldTemperature': 'Temperature',
  'settings.subagents.fieldTemperatureHint': 'Range 0.0–2.0. Leave empty to inherit.',
  'settings.subagents.fieldSystemPrompt': 'System prompt',
  'settings.subagents.fieldAllowedTools': 'Allowed tools (comma-separated)',
  'settings.subagents.fieldAllowedToolsHint':
    'Only these tools are exposed when running this subagent.',
  'settings.subagents.fieldMaxDepth': 'Max recursion depth',
  'settings.subagents.fieldMaxDepthHint': 'Prevents runaway nested delegation. 1–10.',
  'settings.subagents.fieldMaxIterations': 'Max iterations',
  'settings.subagents.fieldTimeout': 'Timeout (s)',
  'settings.subagents.fieldTimeoutHint': 'Single-shot call timeout.',
  'settings.subagents.fieldAgenticTimeout': 'Agentic timeout (s)',
  'settings.subagents.fieldAgenticTimeoutHint':
    'Multi-turn agentic loop timeout.',
  'settings.subagents.fieldAgentic': 'Agentic mode',
  'settings.subagents.fieldAgenticHint':
    'Enables tool calls and a multi-turn loop instead of a single completion.',
  'settings.subagents.fieldSkillsDir': 'Skills directory (relative)',
  'settings.subagents.fieldApiKey': 'API key (optional)',
  'settings.subagents.fieldApiKeyHint':
    'Override the parent provider key for this subagent.',
  'settings.subagents.errorNameEmpty': 'Name must be non-empty.',
  'settings.subagents.errorProviderEmpty': 'Provider must be non-empty.',
  'settings.subagents.errorModelEmpty': 'Model must be non-empty.',
  'settings.subagents.errorMaxDepth': 'Max depth must be between 1 and 10.',
  'settings.subagents.errorMaxIterations': 'Max iterations must be > 0.',
  'settings.subagents.errorTemperature': 'Temperature must be in [0.0, 2.0].',
  'settings.subagents.createdToast': 'Subagent created.',
  'settings.subagents.updatedToast': 'Subagent updated.',
  'settings.subagents.deletedToast': 'Subagent deleted.',
  'settings.subagents.confirmDeleteTitle': 'Delete subagent',
  'settings.subagents.confirmDeleteMessage':
    'Delete subagent "{name}"? This cannot be undone.',

  'mode.badge.auto': 'auto',
  'mode.badge.supervised': 'supervised',
  'mode.badge.readOnly': 'read-only',
  'mode.badge.checkpoint': 'checkpoint',

  'tool.aboutToRun': 'About to run',
  'tool.batchId': 'batch',

  'subagent.thinking': 'thinking',
  'subagent.status': 'status',

  'review.filesCount': '{count} Files',
  'review.keepAll': 'Keep All',
  'review.undoAll': 'Undo All',
  'review.undoing': 'Undoing…',
  'review.review': 'Review',
  'review.stop': 'Stop',
  'review.stopShortcut': 'Ctrl+Shift+⌫',
  'review.undoFailed': 'Failed to undo all file changes.',

  'settings.lsp.title': 'Language Servers',
  'settings.lsp.description':
    'Manage LSP servers that power in-editor squiggles, hover tooltips, completion, and the Agent\'s code-intelligence tools. Switch between managed installs and manual command overrides per server.',
  'settings.lsp.globalEnable': 'Enable LSP integration',
  'settings.lsp.badge.disabled': 'Disabled',
  'settings.lsp.badge.stopped': 'Stopped',
  'settings.lsp.badge.install': 'Install',
  'settings.lsp.badge.installing': 'Installing',
  'settings.lsp.badge.ready': 'Ready',
  'settings.lsp.badge.starting': 'Starting',
  'settings.lsp.badge.failed': 'Failed',
  'settings.lsp.addServer': 'Add server',
  'settings.lsp.customTemplate': 'Custom (manual)',
  'settings.lsp.customTemplateHint': 'Provide your own command, args, and env',
  'settings.lsp.empty': 'Select a server to view details, or click "Add server" to start a new one.',
  'settings.lsp.recentDiagnostics': 'Recent diagnostics',
  'settings.lsp.mode.managed': 'Managed',
  'settings.lsp.mode.manual': 'Manual',
  'settings.lsp.field.id': 'ID',
  'settings.lsp.field.languageId': 'Language ID',
  'settings.lsp.field.displayName': 'Display name',
  'settings.lsp.field.command': 'Command',
  'settings.lsp.field.args': 'Arguments',
  'settings.lsp.field.env': 'Environment (KEY=VALUE per line)',
  'settings.lsp.field.fileExtensions': 'File extensions',
  'settings.lsp.field.initOptions': 'Initialization options (JSON)',
  'settings.lsp.field.enabled': 'Server enabled',
  'settings.lsp.action.install': 'Install',
  'settings.lsp.action.reinstall': 'Reinstall',
  'settings.lsp.action.retry': 'Retry install',
  'settings.lsp.action.enable': 'Enable',
  'settings.lsp.action.disable': 'Disable',
  'settings.lsp.action.restart': 'Restart',
  'settings.lsp.installState.installed': 'Installed',
  'settings.lsp.installState.installing': 'Installing',
  'settings.lsp.installState.failed': 'Install failed',
  'settings.lsp.installState.notInstalled': 'Not installed',
  'settings.lsp.toast.installFailed': 'Failed to install language server',
  'settings.lsp.toast.installSucceeded': 'Language server installed',
  'settings.lsp.toast.toggleFailed': 'Failed to toggle language server',
  'settings.lsp.toast.restartFailed': 'Failed to restart language server',
  'settings.lsp.toast.deleteFailed': 'Failed to delete language server',
  'settings.lsp.toast.saveFailed': 'Failed to save language server',
  'settings.lsp.toast.globalToggleFailed': 'Failed to update LSP integration',

  'wsManager.workspaceBusyToast': 'Workspace is busy with another session. Try again later.',
  'runtime.syncTimeout': 'Model switch was not confirmed by the backend (timed out). It may not have taken effect — try switching again.',
  'runtime.syncFailed': 'Failed to sync the model selection to the backend. It will be retried before your next message.',

  'browser.panel.tabs.pinAsTestTarget': 'Pin as test target',
  'browser.panel.tabs.unpinTestTarget': 'Unpin test target',
  'browser.panel.tabs.testTargetBadge': 'Test Target (QA)',

  'debug.privacy.banner.collapsed':
    'Debug mode keeps your PII (ID numbers, phones, passwords, tokens, etc.) local — none of it is sent to the LLM.',
  'debug.privacy.banner.expanded':
    'These categories are detected and redacted with stable placeholders before any LLM call. Browser snapshots and tool results are sanitized too.',
  'debug.privacy.banner.empty': 'No private data redacted in this session yet.',
  'debug.privacy.banner.expand': 'Show details',
  'debug.privacy.banner.collapse': 'Hide details',
  'debug.privacy.banner.totalLabel': 'Redactions in this session',
  'debug.privacy.banner.clear': 'Clear stats',

  'debug.privacy.categories.id_card': 'ID card',
  'debug.privacy.categories.phone': 'Phone number',
  'debug.privacy.categories.email': 'Email',
  'debug.privacy.categories.bank_card': 'Bank card',
  'debug.privacy.categories.jwt': 'JWT',
  'debug.privacy.categories.api_key': 'API key',
  'debug.privacy.categories.bearer': 'Bearer token',
  'debug.privacy.categories.auth_header': 'Authorization header',
  'debug.privacy.categories.url_password': 'URL password',
  'debug.privacy.categories.kv_secret': 'Inline secret',
  'debug.privacy.categories.private_key': 'Private key',
  'debug.privacy.categories.ipv4': 'IPv4',
  'debug.privacy.categories.mac': 'MAC address',

  'debug.qa.bindTab.button': 'Bind Tab',
  'debug.qa.bindTab.hint':
    'Pick a tab from the embedded browser for the agent to use. New popup tabs are auto-claimed by this session.',
  'debug.qa.bindTab.refresh': 'Refresh tabs',
  'debug.qa.bindTab.empty': 'No tabs in the dock — open a page in the embedded browser first.',
  'debug.qa.bindTab.ownerUser': 'user',
  'debug.qa.bindTab.ownerAgent': 'agent',
  'debug.qa.bindTab.unbind': 'Unbind',

  'debug.qa.prototypeRef.button': 'Prototype Ref',
  'debug.qa.prototypeRef.hint': 'Bind a tab showing your prototype design (Modao, Figma, etc.) as a UI validation reference. The agent will compare implementation against the prototype during testing.',
  'debug.qa.prototypeRef.empty': 'No tabs available — open a prototype design page in the embedded browser first.',
  'debug.qa.prototypeRef.unbind': 'Unbind prototype',
  'debug.qa.prototypeRef.figmaHint': 'Or paste a Figma design link directly — the agent fetches exact layout, color and typography data via the Figma API for high-fidelity comparison.',
  'debug.qa.prototypeRef.figmaPlaceholder': 'Paste a figma.com design share link…',
  'debug.qa.prototypeRef.figmaBind': 'Bind',

  'debug.qa.dock.agentBusy': 'Agent is testing dock tab #{tabId}',

  'debug.qa.docs.title': 'QA documents ready',
  'debug.qa.docs.openReport': 'Open report.md',
  'debug.qa.docs.openAnalysis': 'Open analysis.md',
  'debug.qa.docs.openRunbook': 'Open runbook.md',

  'settings.debugPrivacy.title': 'Debug Privacy',
  'settings.debugPrivacy.description':
    'Configure the outbound PII sanitizer that runs in Debug mode before any LLM call.',
  'settings.debugPrivacy.enable': 'Enable Debug PII sanitization',
  'settings.debugPrivacy.enableHint':
    'When enabled, sensitive data is redacted from messages, tool results, and browser snapshots before reaching the LLM.',
  'settings.debugPrivacy.sessionStats': 'Redactions in current session',
  'settings.debugPrivacy.clearStats': 'Clear session stats',
  'settings.debugPrivacy.resetDefaults': 'Reset to defaults',

  'debugReport.techDoc.title': 'System Technical Documentation',

  'python.statusBar.notSet': 'Py: not set',
  'python.statusBar.system': 'Py {version} (system{pkg})',
  'python.statusBar.systemNoVersion': 'Py (system{pkg})',
  'python.statusBar.venv': 'Py {version} (.venv{pkg})',
  'python.statusBar.venvNoVersion': 'Py (.venv{pkg})',
  'python.statusBar.creating': 'Py: creating venv…',
  'python.statusBar.installing': 'Py: installing…',
  'python.statusBar.tooltip': 'Click to manage the workspace Python interpreter',

  'python.picker.title': 'Python interpreter',
  'python.picker.current': 'Current interpreter',
  'python.picker.notConfigured': 'No interpreter configured for this workspace',
  'python.picker.versionLabel': 'Version',
  'python.picker.toolLabel': 'Tool',
  'python.picker.pathLabel': 'Path',
  'python.picker.packagesLabel': 'Packages',
  'python.picker.requiredLabel': 'Required',
  'python.picker.isolatedYes': 'Workspace-isolated',
  'python.picker.isolatedNo': 'System (not isolated)',
  'python.picker.createUv': 'Create .venv with uv',
  'python.picker.createVenv': 'Create .venv with python -m venv',
  'python.picker.selectOther': 'Select other interpreter…',
  'python.picker.installRequirements': 'Install requirements.txt',
  'python.picker.installSmart': 'Install dependencies',
  'python.picker.openVenvDir': 'Open .venv in file manager',
  'python.picker.openTerminal': 'Open terminal',
  'python.picker.purge': 'Delete .venv',
  'python.picker.notInstalledNotice':
    'No Python interpreter detected on this system. Install Python 3.x to use venv isolation.',
  'python.picker.openPythonDownload': 'Open python.org downloads',
  'python.picker.openDirFailed': 'Failed to open .venv directory.',
  'python.picker.terminalOpened':
    'Terminal opened. Python venv is automatically activated in new shells.',
  'python.picker.candidatesTitle': 'Detected interpreters',
  'python.picker.candidatesEmpty': 'No interpreter detected on this system',
  'python.picker.actionsTitle': 'Actions',
  'python.picker.refresh': 'Refresh',
  'python.picker.close': 'Close',
  'python.picker.jobCreating': 'Creating .venv…',
  'python.picker.jobInstalling': 'Installing packages…',
  'python.picker.jobNoOutputYet': '(no output yet)',
  'python.picker.errorPrefix': 'Last error:',
  'python.picker.expand': 'expand',
  'python.picker.collapse': 'collapse',

  'python.toast.detectedNoVenv':
    'Python project detected — create an isolated .venv to keep dependencies from leaking between workspaces.',
  'python.toast.createCta': 'Create with uv',
  'python.toast.createFallbackCta': 'Create with venv',
  'python.toast.creationStarted': 'Creating Python virtual environment in .venv …',
  'python.toast.creationDone': 'Workspace .venv is ready',
  'python.toast.creationFailed': 'Failed to create .venv: {error}',
  'python.toast.fallbackVenv':
    'uv was not available — fell back to python -m venv. Workspace .venv is ready.',
  'python.toast.interpreterSelected': 'Python interpreter updated for this workspace.',
  'python.toast.installDone': 'Dependencies installed.',
  'python.toast.installFailed': 'Install failed: {error}',
  'python.toast.purgeDone': 'Workspace .venv removed.',

  'agentMonitor.title': 'Agents monitor',
  'agentMonitor.expand': 'Expand agents monitor',
  'agentMonitor.collapse': 'Collapse agents monitor',
  'agentMonitor.filter.active': 'Active',
  'agentMonitor.filter.errors': 'Errors',
  'agentMonitor.groupBy.workspace': 'By workspace',
  'agentMonitor.groupBy.status': 'By status',
  'agentMonitor.groupBy.flat': 'Flat',
  'agentMonitor.groupBy.menuLabel': 'Group by',
  'agentMonitor.empty': 'No agents to display.',
  'agentMonitor.emptyActive': 'No agents are currently running. See the history list below.',
  'agentMonitor.emptyErrors': 'No agents have errors or missing workspaces.',
  'agentMonitor.unknownWorkspace': 'Other',
  'agentMonitor.summary':
    'Running {running} · Waiting {waiting} · Errors {error}',
  'agentMonitor.summaryShort': '{active} active · {total} total',
  'agentMonitor.clickToFocus': 'Click to focus this agent',
  'agentMonitor.queuedBadge': '{count} queued',
  'agentMonitor.attached': 'Currently attached',
  'agentMonitor.status.running': 'Running',
  'agentMonitor.status.thinking': 'Thinking',
  'agentMonitor.status.tool': 'Tool executing',
  'agentMonitor.status.waiting': 'Awaiting approval',
  'agentMonitor.status.queued': 'Queued',
  'agentMonitor.status.error': 'Error',
  'agentMonitor.status.disconnected': 'Disconnected',
  'agentMonitor.status.missingWorkDir': 'Workspace missing',
  'agentMonitor.status.idle': 'Idle',
  'agentMonitor.status.waiting_resource': 'Waiting on resource',
  'agentMonitor.status.waitingResource': 'Waiting on resource',
  'agentMonitor.waitingResourceCount': 'Waiting on {count} resource(s)',
  'agentMonitor.codingMode': 'Mode',
  'agentMonitor.detail.elapsed': 'Running {time}',
  'agentMonitor.detail.tool': 'Tool {name}',
  'agentMonitor.detail.streaming': 'Streaming',
  'agentMonitor.detail.thinking': 'Thinking',
  'agentMonitor.detail.permissionPending': 'Awaiting approval',
  'agentMonitor.detail.waitingFile': 'Waiting for {target}',
  'agentMonitor.detail.waitingShell': 'Waiting for shell',
  'agentMonitor.detail.waitingBrowser': 'Waiting for browser',
  'agentMonitor.detail.queued': '{count} queued',
  'agentMonitor.detail.tokens': '{count} tokens',
  'agentMonitor.detail.edits': '{count} edited file(s) pending',
  'agentMonitor.detail.lastEdit': 'Last edit {path}',
  'agentMonitor.detail.heldBy': 'Held by "{holder}"',
  'agentMonitor.detail.connection.connecting': 'Connecting',
  'agentMonitor.detail.connection.reconnecting': 'Reconnecting',
  'agentMonitor.detail.connection.disconnected': 'Disconnected',
  'chat.resourceWait.banner.title': 'Waiting for resource',
  'chat.resourceWait.file': 'File {path}',
  'chat.resourceWait.shell': 'Shell',
  'chat.resourceWait.browser': 'Embedded browser',
  'chat.resourceWait.heldBy': 'held by "{holder}"',
  'chat.resourceWait.heldByUnknown': 'held by another session',
  'chat.resourceWait.switchTo': 'Focus',
  'chat.resourceWait.collapse': 'Collapse',
  'chat.resourceWait.expandMore': 'Show {count} more',

  'templateLibrary.title': 'Template Library',
  'templateLibrary.subtitle': 'Browse, preview and customize built-in design systems, templates and document blueprints.',
  'templateLibrary.open': 'Template Library',
  'templateLibrary.close': 'Close',
  'templateLibrary.loading': 'Loading…',
  'templateLibrary.empty': 'Nothing here yet.',
  'templateLibrary.search': 'Search templates…',
  'templateLibrary.category.designSystems': 'Design Systems',
  'templateLibrary.category.designerTemplates': 'Designer Templates',
  'templateLibrary.category.promptTemplates': 'Prompt Templates',
  'templateLibrary.category.curatorTemplates': 'Document Templates',
  'templateLibrary.badge.builtin': 'Built-in',
  'templateLibrary.badge.user': 'Custom',
  'templateLibrary.badge.customized': 'Customized',
  'templateLibrary.badge.stale': 'Built-in updated',
  'templateLibrary.action.edit': 'Edit',
  'templateLibrary.action.preview': 'Preview',
  'templateLibrary.action.save': 'Save',
  'templateLibrary.action.saved': 'Saved',
  'templateLibrary.action.reset': 'Reset to built-in',
  'templateLibrary.action.diff': 'View diff',
  'templateLibrary.action.merge': 'Merge',
  'templateLibrary.action.delete': 'Delete',
  'templateLibrary.action.create': 'New',
  'templateLibrary.action.back': 'Back',
  'templateLibrary.action.cancel': 'Cancel',
  'templateLibrary.diff.title': 'Built-in vs your version',
  'templateLibrary.diff.builtin': 'Built-in',
  'templateLibrary.diff.yours': 'Your version',
  'templateLibrary.staleBanner': 'The built-in version of this file changed. You can view the diff, keep your version, or reset to built-in.',
  'templateLibrary.create.title': 'Create new',
  'templateLibrary.create.id': 'Id',
  'templateLibrary.create.name': 'Name',
  'templateLibrary.create.description': 'Description',
  'templateLibrary.create.category': 'Category',
  'templateLibrary.create.surface': 'Surface',
  'templateLibrary.create.baseKind': 'Base type',
  'templateLibrary.create.submit': 'Create',
  'templateLibrary.confirmDelete': 'Delete this custom entry? This cannot be undone.',
  'templateLibrary.confirmReset': 'Reset this file to the built-in version? Your changes will be lost.',
  'templateLibrary.toast.saved': 'Saved. Changes take effect immediately.',
  'templateLibrary.toast.reset': 'Reset to built-in.',
  'templateLibrary.toast.created': 'Created.',
  'templateLibrary.toast.deleted': 'Deleted.',
  'templateLibrary.toast.error': 'Operation failed.',
  'templateLibrary.preview.none': 'No preview available for this item.',
  'templateLibrary.preview.prompt': 'Prompt',

} as const

export type TranslationKey = keyof typeof en
