export default {
  'mcpServers.action.add': 'Add server',
  'mcpServers.action.cancel': 'Cancel',
  'mcpServers.action.delete': 'Delete',
  'mcpServers.action.edit': 'Edit',
  'mcpServers.action.retry': 'Retry',
  'mcpServers.action.save': 'Save server',
  'mcpServers.action.saving': 'Saving...',
  'mcpServers.action.toggle': 'Toggle {{name}}',
  'mcpServers.delete.description': 'Delete {{name}}? This cannot be undone.',
  'mcpServers.delete.title': 'Delete server',
  'mcpServers.dialog.create': 'Add MCP server',
  'mcpServers.dialog.description': 'Configure a local command or a streamable HTTP endpoint.',
  'mcpServers.dialog.edit': 'Edit MCP server',
  'mcpServers.empty.description': 'Add a server to make its tools available to compatible runtimes.',
  'mcpServers.empty.title': 'No MCP servers',
  'mcpServers.error.description': 'The server list could not be loaded.',
  'mcpServers.error.title': 'Could not load MCP servers',
  'mcpServers.form.arguments': 'Arguments',
  'mcpServers.form.argumentsPlaceholder': 'One argument per line',
  'mcpServers.form.command': 'Command',
  'mcpServers.form.commandPlaceholder': 'npx',
  'mcpServers.form.enabled': 'Enabled',
  'mcpServers.form.environment': 'Environment variables',
  'mcpServers.form.error.command': 'A command is required.',
  'mcpServers.form.error.name': 'Use letters, numbers, dots, dashes, or underscores.',
  'mcpServers.form.error.secretLine': 'Each secret must use NAME=value.',
  'mcpServers.form.error.url': 'Enter a valid URL.',
  'mcpServers.form.headers': 'Secret headers',
  'mcpServers.form.name': 'Name',
  'mcpServers.form.namePlaceholder': 'my-server',
  'mcpServers.form.replaceSecrets': 'Replace stored secrets',
  'mcpServers.form.transport': 'Transport',
  'mcpServers.form.url': 'URL',
  'mcpServers.page.description': 'Manage local tool servers available to agent runtimes.',
  'mcpServers.page.title': 'MCP servers',
  'mcpServers.runtime.httpNote': 'HTTP headers are supplied by the runtime.',
  'mcpServers.toast.deleted': 'MCP server deleted',
  'mcpServers.toast.deleteFailed': 'Could not delete MCP server',
  'mcpServers.toast.saved': 'MCP server saved',
  'mcpServers.toast.saveFailed': 'Could not save MCP server',
  'mcpServers.toast.toggleFailed': 'Could not update MCP server',
  'mcpServers.transport.http': 'Streamable HTTP',
  'mcpServers.transport.stdio': 'Local command',
  'mcpServers.action.browseRegistry': 'Browse registry',
  'mcpServers.registry.title': 'MCP registry',
  'mcpServers.registry.description': 'Discover and install servers from the official MCP registry.',
  'mcpServers.registry.searchPlaceholder': 'Search servers…',
  'mcpServers.registry.install': 'Install',
  'mcpServers.registry.notInstallable': 'Manual setup',
  'mcpServers.registry.loadMore': 'Load more',
  'mcpServers.registry.loading': 'Searching…',
  'mcpServers.registry.empty': 'No servers match your search.',
  'mcpServers.registry.error.title': 'Registry unavailable',
  'mcpServers.registry.error.description': 'Could not reach the MCP registry. Check your connection and try again.',
  'mcpServers.registry.action.retry': 'Retry',
  'mcpServers.status.ready': 'Ready',
  'mcpServers.status.disabled': 'Disabled',
  'mcpServers.status.error': 'Error',
  'mcpServers.tabs.installed': 'Installed',
  'mcpServers.tabs.discover': 'Discover',
  'nav.appearance': 'Appearance',
  'nav.providers': 'Model Providers',
  'nav.registry': 'Model Registry',
  'nav.mcpServers': 'MCP Servers',
  'nav.agents': 'Agents',
  'nav.runtimes': 'Runtimes',
  'nav.chat': 'Chat',
  'nav.await': 'Await',
  'nav.worktrees': 'Worktrees',
  'nav.jarvis': 'Jarvis',
  'nav.chronicle': 'Chronicle',
  'nav.shortcut': 'Shortcuts',
  'nav.serverEndpoint': 'Server Endpoint',
  'nav.network': 'Network',
  'nav.desktop': 'Desktop',
  'nav.downloads': 'Downloads',
  'nav.backup': 'Backup & Restore',
  'nav.editor': 'Editor',
  'nav.features': 'Features',
  'nav.externalIssues': 'Issue sources',
  'nav.import': 'Import',
  'nav.plugins': 'Plugins',
  'nav.remoteHosts': 'Remote Hosts',
  'nav.support': 'Support',
  'nav.about': 'About',
  'nav.whatsNew': 'What\'s New',
  'backup.page.title': 'Backup & Restore',
  'backup.page.description': 'Move all Cradle-owned data to another computer with one verified backup file.',
  'backup.badge.local': 'Local',
  'backup.notice.title': 'Keep the backup file private',
  'backup.notice.description': 'The backup includes Cradle’s database, settings, agents, sessions, plugins, runtime files, and locally stored credentials. Workspace folders and provider-owned data outside Cradle are not copied.',
  'backup.export.label': 'Export Cradle data',
  'backup.export.description': 'Choose a destination, then Cradle restarts briefly to create a consistent, checksummed backup while the local server is stopped.',
  'backup.export.action': 'Export backup',
  'backup.restore.label': 'Restore Cradle data',
  'backup.restore.description': 'Restore a .cradle-backup file. Cradle verifies every file, restarts, and keeps the current data directory as a rollback copy.',
  'backup.restore.action': 'Choose backup',
  'backup.restore.confirmTitle': 'Replace local Cradle data?',
  'backup.restore.confirmDescription': 'Cradle will restore {{path}} and restart. The current data remains as a rollback copy, and is restored automatically if startup health checks fail.',
  'backup.restore.confirm': 'Restore and restart',
  'backup.restore.cancel': 'Cancel',
  'backup.unavailable': 'Backup and restore are available in the Cradle desktop app.',
  'backup.status.pending': 'The backup operation is scheduled. Cradle will restart to finish it.',
  'backup.status.exported': 'Backup exported successfully to {{path}}.',
  'backup.status.restored': 'Backup restored successfully. The previous data remains at {{backupPath}}.',
  'backup.status.failed': 'Backup operation failed: {{message}}',
  'backup.status.unknownError': 'Unknown error',
  'about.analytics.description': 'Share anonymous usage data to help improve Cradle.',
  'about.analytics.share.description': 'Shares manually defined navigation and feature outcomes. Cradle never includes prompts, responses, code, file paths, resource IDs, raw errors, or screen recordings.',
  'about.analytics.share.label': 'Share anonymous product usage',
  'about.analytics.title': 'Product analytics',
  'about.badge.local': 'Local-first',
  'about.external.agentActions.description': 'Approved agent and tool actions may read or write the local paths covered by that action.',
  'about.external.agentActions.label': 'Approved agent actions',
  'about.external.agentActions.path': 'approved workspace and client paths',
  'about.external.cli.description': 'Installing the packaged command creates or removes a symlink only when you choose that action.',
  'about.external.cli.label': 'Desktop CLI command',
  'about.external.claudeDir.description': 'When signed in with a Claude official subscription, conversations in Cradle are persisted into your ~/.claude directory. Cradle passes through this directory, sharing sessions and memory with Claude CLI.',
  'about.external.claudeDir.label': 'Claude session data',
  'about.external.claudeDir.path': '~/.claude/projects/*, ~/.claude/settings.json',
  'about.external.cli.path': '/usr/local/bin/cradle',
  'about.external.description': 'Some features intentionally touch paths outside Application Support so Cradle can work with your projects and local tools.',
  'about.external.githubCliAuth.description': 'GitHub features may ask the local gh CLI for an auth token when needed. Cradle uses it in memory only and never writes or stores it.',
  'about.external.githubCliAuth.label': 'GitHub CLI authentication',
  'about.external.githubCliAuth.path': 'gh auth token (not persisted by Cradle)',
  'githubApp.title': 'GitHub identity',
  'githubApp.description': 'Install the Cradle GitHub App, then connect your GitHub identity for user-attributed actions.',
  'githubApp.badge': 'GitHub App',
  'githubApp.install.title': 'Install Cradle in the repositories you use',
  'githubApp.install.description': 'First install the Cradle App into the organization and repositories where you want Cradle to act. Then connect your GitHub identity below.',
  'githubApp.connect.title': 'Connect your GitHub identity',
  'githubApp.connect.description': 'Enter this code in GitHub to authorize Cradle on your behalf.',
  'githubApp.connecting': 'Loading GitHub connection…',
  'githubApp.pendingCode': 'This code expires soon. Keep this window open while you finish in GitHub.',
  'githubApp.connected': 'Posting as @{{login}} via Cradle',
  'githubApp.expires': 'Connection expires {{date}}',
  'githubApp.expired': 'Your GitHub connection has expired. Connect again to continue.',
  'githubApp.unavailable': 'GitHub App connection is unavailable in this build.',
  'githubApp.actions.install': 'Install Cradle App',
  'githubApp.actions.connect': 'Connect GitHub',
  'githubApp.actions.continueInBrowser': 'Continue in browser',
  'githubApp.actions.cancel': 'Cancel',
  'githubApp.actions.disconnect': 'Disconnect',
  'githubApp.actions.confirmDisconnect': 'Disconnect GitHub',
  'githubApp.disconnect.title': 'Disconnect GitHub?',
  'githubApp.disconnect.description': 'This removes the local GitHub App credential from this device. It does not uninstall the Cradle App from GitHub.',
  'githubApp.toast.connectFailed': 'Could not start GitHub connection',
  'githubApp.toast.disconnectFailed': 'Could not disconnect GitHub',
  'about.external.skills.description': 'Cradle-owned skills may live in workspace or agent-specific Cradle namespaces for runtime compatibility.',
  'about.external.skills.label': 'Skills',
  'about.external.skills.path': '~/.cradle/agents/{agentId}/skills, <workspace>/.cradle/skills',
  'about.external.nativeSkillRoots.description': 'When enabled in Features, Cradle places capability entry points in compatible agent skill folders so agents can discover and use the capabilities Cradle provides.',
  'about.external.nativeSkillRoots.label': 'Agent capability folders',
  'about.external.nativeSkillRoots.path': '~/.codex/skills/cradle/*, ~/.claude/skills/cradle/*',
  'about.external.title': 'Places outside Application Support',
  'about.external.workspace.description': 'Editing files, creating folders, or starting an ad hoc workspace writes to the workspace you selected or created.',
  'about.external.workspace.label': 'Workspace files',
  'about.external.workspace.path': '<workspace>/* and ~/Documents/Cradle for ad hoc workspaces',
  'about.notice.description': 'Cradle keeps its database, logs, plugins, and runtime files in its app data directory. The exceptions below describe where it may touch local projects and tools.',
  'about.notice.title': 'Cradle may write outside its app data directory',
  'about.page.description': 'Version, local storage boundaries, and filesystem impact.',
  'about.page.title': 'About Cradle',
  'about.readOnly.description': 'External Claude and Codex session import scans read source files and imports copies into Cradle-owned records.',
  'about.readOnly.label': 'External app scans',
  'about.readOnly.value': 'Read-only',
  'about.storage.applicationSupport.description': 'Primary Cradle-owned location for database, logs, plugins, runtime files, and diagnostics.',
  'about.storage.applicationSupport.fallback': 'Application Support / Cradle',
  'about.storage.applicationSupport.label': 'App data directory',
  'about.storage.applicationSupport.default': 'Default location',
  'about.storage.applicationSupport.custom': 'Custom location',
  'about.storage.database.description': 'Local SQLite database used by Cradle-owned records.',
  'about.storage.database.fallback': 'cradle.db inside the app data directory',
  'about.storage.database.label': 'Database',
  'import.action.import': 'Import',
  'import.action.open': 'Open',
  'import.action.scan': 'Scan',
  'import.action.scanAgain': 'Scan again',
  'import.action.sync': 'Sync',
  'import.alert.description': 'Provider files stay read-only. Continuing an imported chat starts a new Cradle-owned provider thread and never appends to the original transcript.',
  'import.alert.title': 'External app data stays read-only',
  'import.badge.local': 'Local sources',
  'import.badge.device': 'Server + Device',
  'import.badge.duplicate': 'Duplicate',
  'import.badge.server': 'Server',
  'import.center.description': 'Nothing is selected automatically. Exact paths, longest ancestors, and Git identity are mapped automatically; unmatched projects are reconstructed.',
  'import.center.title': 'Import Center',
  'import.empty.description': 'Cradle reads lightweight descriptors first. Full transcripts are read only after you select sessions and start import.',
  'import.empty.filtered': 'No sessions match these filters.',
  'import.empty.title': 'Find your historical conversations',
  'import.filter.allSources': 'All sources',
  'import.filter.allStates': 'All states',
  'import.filter.available': 'available',
  'import.filter.imported': 'imported',
  'import.filter.update-available': 'update available',
  'import.page.description': 'Discover complete Claude and Codex conversations, review their recovered Workspace, then import a Cradle-owned copy.',
  'import.page.title': 'Import',
  'import.results.description': 'Imported sessions are ready to open. Offline Workspaces stay visible and can be relinked later.',
  'import.results.title': 'Results',
  'import.scan.descriptionElectron': 'Scan both the connected server and this Electron device for supported AI chat sessions.',
  'import.scan.descriptionServer': 'Scan the connected server for supported AI chat sessions.',
  'import.scan.label': 'Find importable sessions',
  'import.selection.description': '{{selected}} selected from {{count}} importable items.',
  'import.selection.label': 'Selection',
  'import.selection.clear': 'Clear',
  'import.selection.selectShown': 'Select shown',
  'import.selection.summary': '{{selected}} selected · {{count}} shown',
  'import.selection.toggleAll': 'Toggle all importable items',
  'import.status.imported': 'Imported {{imported}}, skipped {{skipped}}, duplicates {{duplicates}}, errors {{errors}}.',
  'import.status.scanned': 'Found {{count}} session candidates.',
  'import.status.scanning': 'Scanning Claude and Codex sessions…',
  'import.status.synced': 'Synchronized {{count}} new messages.',
  'import.state.imported': 'Imported',
  'import.state.legacy': 'Legacy import · repair available',
  'import.state.missing': 'Location missing',
  'import.state.ready': 'Ready',
  'import.state.update': 'Update available',
  'import.stat.offline': 'Offline',
  'import.stat.sessions': 'Sessions',
  'import.stat.workspaces': 'Workspaces',
  'import.warning.title': 'Scan warnings',
  'import.workspace.ancestor': 'Nested under this Workspace',
  'import.workspace.exact': 'Exact Workspace path',
  'import.workspace.git': 'Matched by Git repository',
  'import.workspace.importRecord': 'Linked to this imported session',
  'import.workspace.offline': 'Historical Workspace will be created offline',
  'import.workspace.register': 'Workspace will be registered',
  'externalIssues.page.title': 'Issue sources',
  'externalIssues.page.description': 'Mirror external issues onto Kanban as read-only cards. Status changes are stored locally and never written back.',
  'externalIssues.status.connected': '{{n}} connected',
  'externalIssues.status.error': '{{n}} error',
  'externalIssues.status.none': 'No sources connected',
  'externalIssues.workspace.label': 'Projecting into',
  'externalIssues.workspace.placeholder': 'Select workspace',
  'externalIssues.source.empty': 'No issue sources are installed.',
  'externalIssues.source.unavailable': 'unavailable',
  'externalIssues.source.unavailableHint': 'This source is not available. Check that the plugin is installed and enabled.',
  'externalIssues.source.connectedCount': '{{n}} connected',
  'externalIssues.source.notConnected': 'not connected',
  'externalIssues.connect.placeholder': 'owner/repo',
  'externalIssues.connect.action': 'Connect',
  'externalIssues.connect.refreshNow': 'Run first sync immediately',
  'externalIssues.repo.empty': 'No repositories connected yet.',
  'externalIssues.repo.syncing': 'Syncing…',
  'externalIssues.repo.paused': '{{n}} issues · paused',
  'externalIssues.repo.rateLimited': 'Rate limited · retry {{time}}',
  'externalIssues.repo.errorFallback': 'Repository sync failed. Refresh again to collect a new error.',
  'externalIssues.repo.meta': '{{n}} issues · synced {{time}}',
  'externalIssues.repo.metaNever': '{{n}} issues · never synced',
  'externalIssues.menu.refresh': 'Refresh now',
  'externalIssues.menu.autoRefresh': 'Auto-refresh hourly',
  'externalIssues.menu.enable': 'Enable',
  'externalIssues.menu.disable': 'Disable',
  'externalIssues.menu.disconnect': 'Disconnect',
  'externalIssues.menu.more': 'More options for {{repo}}',
  'externalIssues.disconnect.title': 'Disconnect repository?',
  'externalIssues.disconnect.description': 'This removes the {{repo}} binding and all synced issue records from this workspace. The repository itself is not affected.',
  'externalIssues.disconnect.cancel': 'Cancel',
  'externalIssues.disconnect.confirm': 'Disconnect',
  'externalIssues.toast.connected': 'Connected {{repo}}',
  'externalIssues.toast.connectFailed': 'Failed to connect repository',
  'externalIssues.toast.invalidRepo': 'Enter a valid owner/repo or GitHub URL',
  'externalIssues.toast.refreshed': '{{status}} · {{n}} issues projected',
  'externalIssues.toast.refreshFailed': 'Refresh failed',
  'externalIssues.toast.disconnected': 'Disconnected {{repo}}',
  'externalIssues.toast.updateFailed': 'Update failed',
  'registry.action.cancel': 'Cancel',
  'registry.action.delete': 'Delete mapping',
  'registry.action.edit': 'Edit mapping',
  'registry.action.save': 'Save',
  'registry.action.saveAlias': 'Save alias',
  'registry.action.saveManual': 'Save manual',
  'registry.add.description': 'Map a provider model ID to a models.dev model ID, or attach a manual registry entry when models.dev has no match.',
  'registry.add.label': 'Add mapping',
  'registry.add.tabAlias': 'Alias',
  'registry.add.tabManual': 'Manual',
  'registry.alert.description': 'Mappings are global. Every provider target and custom model with the same model ID uses this enrichment before falling back to models.dev exact and fuzzy matching.',
  'registry.alert.title': 'Cradle owns registry mappings',
  'registry.detail.contextWindow': 'Context Window',
  'registry.detail.contextWindowDesc': 'Maximum context length.',
  'registry.detail.cost': 'Pricing',
  'registry.detail.costDesc': 'Token pricing from models.dev.',
  'registry.detail.createdAt': 'Created',
  'registry.detail.createdAtDesc': 'When this mapping was first created.',
  'registry.detail.family': 'Model Family',
  'registry.detail.familyDesc': 'The model family from models.dev.',
  'registry.detail.registryModelId': 'Registry Model ID',
  'registry.detail.registryModelIdDesc': 'The canonical models.dev model identifier.',
  'registry.empty': 'No registry mappings yet.',
  'registry.field.manualJson': 'Manual models.dev JSON',
  'registry.field.manualJson.placeholder': '{ "id": "...", "name": "...", ... }',
  'registry.field.modelId': 'Provider model ID',
  'registry.field.modelId.placeholder': 'e.g. gpt-4o',
  'registry.field.registryModelId': 'Registry model ID',
  'registry.field.registryModelId.placeholder': 'e.g. openai/gpt-4o',
  'registry.loading': 'Loading registry mappings...',
  'registry.manual.description': 'Manual JSON should use the models.dev model object shape.',
  'registry.match.alias': 'alias',
  'registry.match.manual': 'manual',
  'registry.noSelection.description': 'Pick a mapping on the left to view its details, or add a new one to get started.',
  'registry.noSelection.title': 'No mapping selected',
  'registry.page.description': 'Manage global model ID mappings used by the model enrichment pipeline.',
  'registry.page.title': 'Model Registry',
  'registry.search.empty': 'Search models.dev to pick a registry model.',
  'registry.search.modelsDev': 'Search models.dev...',
  'registry.search.noMatches': 'No matching mappings',
  'registry.search.placeholder': 'Filter mappings...',
  'registry.search.results': 'models.dev results',
  'registry.status.deleted': 'Mapping deleted.',
  'registry.status.deleteFailed': 'Failed to delete mapping.',
  'registry.status.saved': 'Mapping saved.',
  'chat.page.title': 'Chat',
  'chat.page.description': 'Configure default behavior for chat and agent sessions.',
  'chat.continuation.label': 'Continuation behavior',
  'chat.continuation.description': 'Queue follow-up work while Cradle is running, or steer the current run. Press Shift+Cmd/Ctrl+Enter to invert the behavior for one message.',
  'chat.continuation.queue': 'Queue',
  'chat.continuation.steer': 'Steer',
  'chat.codexUserAgent.label': 'Cradle User-Agent for Codex',
  'chat.codexUserAgent.description': 'Advertise Cradle when Codex app-server initializes. Turn this off to use Codex-native client identity.',
  'chat.codexUserAgent.cliIdentityDisabled': 'Disabled while the Codex CLI-compatible identity feature is enabled.',
  'chat.titleGeneration.description': 'Choose the provider, model, and thinking effort used when Cradle names new Codex sessions.',
  'chat.titleGeneration.emptyProfiles': 'No Codex-compatible providers configured',
  'chat.titleGeneration.followCurrent': 'Follow current session',
  'chat.titleGeneration.followCurrent.description': 'Use the same provider and model as the session being named.',
  'chat.titleGeneration.label': 'Session title generation',
  'chat.titleGeneration.thinking.high.description': 'More reasoning for ambiguous prompts.',
  'chat.titleGeneration.thinking.high.label': 'High',
  'chat.titleGeneration.thinking.low.description': 'Light reasoning for short prompts.',
  'chat.titleGeneration.thinking.low.label': 'Low',
  'chat.titleGeneration.thinking.medium.description': 'Balanced reasoning for everyday titles.',
  'chat.titleGeneration.thinking.medium.label': 'Medium',
  'chat.titleGeneration.thinking.minimal.description': 'Fastest option for simple title naming.',
  'chat.titleGeneration.thinking.minimal.label': 'Minimal',
  'chat.titleGeneration.thinking.xhigh.description': 'Maximum reasoning for unusually complex prompts.',
  'chat.titleGeneration.thinking.xhigh.label': 'Extra High',
  'chat.archive.description': 'Review archived sessions and restore any conversation back to active lists.',
  'chat.archive.empty': 'No archived sessions.',
  'chat.archive.label': 'Archived sessions',
  'chat.archive.loading': 'Loading archived sessions...',
  'chat.archive.metaLabel': 'Archived',
  'chat.archive.restore': 'Restore',
  'chat.archive.restoreAria': 'Restore {{title}}',
  'chat.archive.restoreFailed': 'Failed to restore session.',
  'chat.archive.restored': 'Session restored.',
  'chat.archive.searchEmpty': 'No archived sessions match your search.',
  'chat.archive.searchPlaceholder': 'Search archived sessions...',
  'chat.archive.untitled': 'Untitled session',
  'features.loading': 'Loading feature flags...',
  'features.blockCodexAppServerLogInserts.description': 'Install a trigger in Cradle\'s Codex app-server logs database that ignores new log rows and keeps the WAL from growing during noisy TRACE or DEBUG writes.',
  'features.blockCodexAppServerLogInserts.label': 'Block Codex app-server log inserts',
  'features.codexCliCompatibleIdentity.description': 'Initialize app-server with the interactive Codex CLI identity and the current Codex runtime version.',
  'features.codexCliCompatibleIdentity.label': 'Use Codex CLI-compatible identity',
  'features.continueBlockedCodexGoals.description': 'Resume Codex Goals that Codex marked blocked through Cradle\'s internal continuation path.',
  'features.continueBlockedCodexGoals.label': 'Continue blocked Codex Goals',
  'features.localAuthForDangerousActions.description': 'Ask the desktop app for system verification before deleting agents, issues, or workspaces.',
  'features.localAuthForDangerousActions.label': 'System verification for destructive actions',
  'features.multiWorkspace.description': 'Enable the CRA-026 symlink workspace POC. Combine already-registered local projects into a Cradle-owned workspace under ~/Documents/Cradle/workspaces. Work is not supported on multi-folder workspaces.',
  'features.multiWorkspace.label': 'Multi-folder workspace POC',
  'features.nativeProviderSkillProjection.description': 'Allow agents to discover and use all Cradle capabilities, including enabled plugins and built-in skills.',
  'features.nativeProviderSkillProjection.label': 'Let agents use all Cradle capabilities',
  'features.turnCheckpoints.description': 'Capture Git-backed snapshots before and after chat turns. This experimental feature writes internal refs into the workspace repository.',
  'features.turnCheckpoints.label': 'Turn checkpoints',
  'features.threadHandoffs.description': 'Allow a completed chat transcript to be copied into a new session for a different runtime or provider connection.',
  'features.threadHandoffs.label': 'Thread handoffs',
  'features.page.description': 'Gate unfinished Cradle capabilities before they appear in workspace flows.',
  'features.page.title': 'Features',
  'serverEndpoint.action.reset': 'Use default',
  'serverEndpoint.action.save': 'Save and reload',
  'serverEndpoint.action.test': 'Test connection',
  'serverEndpoint.action.testing': 'Testing...',
  'serverEndpoint.badge.custom': 'Custom',
  'serverEndpoint.badge.default': 'Default',
  'serverEndpoint.current.description': 'The URL this renderer uses for API requests after startup.',
  'serverEndpoint.current.label': 'Active endpoint',
  'serverEndpoint.default.description': 'Provided by Electron preload or Vite environment.',
  'serverEndpoint.default.label': 'Default URL',
  'serverEndpoint.error.invalidUrl': 'Enter a valid http:// or https:// URL.',
  'serverEndpoint.externalGuide.body': 'This is not a hosted service or a production remote-access mode. It is the personal-developer path for trying the app from another trusted device while the backend keeps running on this machine.',
  'serverEndpoint.externalGuide.description': 'Route the hosted web UI to a Cradle backend reachable through Tailscale.',
  'serverEndpoint.externalGuide.label': 'External device preview',
  'serverEndpoint.externalGuide.security.description': 'Cradle does not have real account authentication here yet. Use this only for previewing on trusted devices inside Tailscale; do not expose the API to the public internet.',
  'serverEndpoint.externalGuide.security.title': 'Security boundary:',
  'serverEndpoint.externalGuide.step.connectTailscale': 'Connect the external device to the same Tailscale network.',
  'serverEndpoint.externalGuide.step.openWeb': 'Open https://app.cradle.wibus.ren on that device.',
  'serverEndpoint.externalGuide.step.reload': 'Run Test connection if you want a quick check, then choose Save and reload.',
  'serverEndpoint.externalGuide.step.setUrl': 'Go to Settings > Server Endpoint, then set Backend API URL to the target machine\'s reachable API URL, for example http://<tailscale-ip>:21423.',
  'serverEndpoint.externalGuide.step.startServer': 'Start Cradle on the machine that owns the backend API, and make sure the API is reachable on its Tailscale IP.',
  'serverEndpoint.externalGuide.title': 'Use Cradle from another device',
  'serverEndpoint.fallback.description': 'Resetting removes the renderer override and returns to the app-provided endpoint.',
  'serverEndpoint.fallback.label': 'Fallback',
  'serverEndpoint.page.description': 'Override the backend API URL for this browser or Electron renderer. This setting is stored locally and remains editable when the server is unreachable.',
  'serverEndpoint.page.title': 'Server Endpoint',
  'serverEndpoint.test.httpError': 'Server responded with HTTP {{status}}.',
  'serverEndpoint.test.success': 'Connection succeeded.',
  'serverEndpoint.test.unreachable': 'Could not reach /health at this URL.',
  'serverEndpoint.url.description': 'Use an absolute URL such as http://127.0.0.1:21423.',
  'serverEndpoint.url.label': 'Backend API URL',
  'network.page.title': 'Network',
  'network.page.description': 'Server connection and outbound proxy for Cradle.',
  'network.loading': 'Loading network preferences...',
  'network.enabled.label': 'Use proxy for network requests',
  'network.enabled.description': 'Applies to new outbound requests from the Cradle server runtime.',
  'network.mode.label': 'Proxy source',
  'network.mode.description': 'Follow the desktop system proxy by default, or choose a Cradle-specific proxy.',
  'network.mode.system.label': 'Follow System Proxy',
  'network.mode.system.description': 'Use the current macOS or Windows HTTP/HTTPS proxy. New requests follow port changes from proxy apps.',
  'network.mode.custom.label': 'Custom Proxy',
  'network.mode.custom.description': 'Use a proxy just for Cradle, such as a local Clash, Surge, or v2rayN HTTP port.',
  'network.mode.environment.label': 'Environment Proxy',
  'network.mode.environment.description': 'Use HTTPS_PROXY, HTTP_PROXY, and NO_PROXY from the server process environment.',
  'network.custom.url.label': 'Custom proxy URL',
  'network.custom.url.description': 'HTTP, HTTPS, and SOCKS5 proxy URLs are supported.',
  'network.custom.url.placeholder': 'http://127.0.0.1:7890',
  'network.custom.error.invalid': 'Enter a valid proxy URL.',
  'network.inbound.title': 'Inbound access',
  'network.inbound.description': 'Controls whether the local Cradle Server API accepts connections from other devices.',
  'network.inbound.access.local': 'This device only',
  'network.inbound.access.network': 'Other devices',
  'network.inbound.server.label': 'Cradle Server API',
  'network.inbound.server.description': 'Other-device access binds the API to all interfaces instead of localhost.',
  'network.inbound.relay.label': 'Built-in Relay',
  'network.inbound.relay.description': 'Other-device access makes the managed relayd listener reachable outside this machine.',
  'network.inbound.relay.publicUrl.label': 'Reachable Relay URL',
  'network.inbound.relay.publicUrl.description': 'Use the URL remote machines can open. Include an explicit port, for example http://192.168.1.10:21425.',
  'network.inbound.relay.publicUrl.placeholder': 'http://192.168.1.10:21425',
  'network.inbound.relay.publicUrl.error': 'Enter a valid http:// or https:// URL with an explicit port.',
  'network.inbound.apply.label': 'Apply changes',
  'network.inbound.apply.description': 'Inbound listener changes take effect after restarting Cradle.',
  'network.inbound.apply.badge': 'Restart required',
  'network.inbound.warning': 'Only enable other-device access on a trusted network. Cradle Server does not yet provide account authentication for public internet exposure.',
  'network.status.label': 'Current route',
  'network.status.loading': 'Checking',
  'network.status.loadingDescription': 'Resolving the current outbound proxy.',
  'network.status.refresh': 'Refresh network proxy status',
  'network.status.off': 'Off',
  'network.status.offDescription': 'Cradle server requests are using direct connections.',
  'network.status.direct': 'Direct',
  'network.status.system': 'System',
  'network.status.custom': 'Custom',
  'network.status.environment': 'Env',
  'network.status.proxyUrl': 'Using {{url}} for new outbound requests.',
  'network.status.reason.direct': 'Cradle server requests are using direct connections.',
  'network.status.reason.systemProxyNotConfigured': 'No system proxy is currently configured.',
  'network.status.reason.systemProxyPacUnsupported': 'A PAC proxy is configured. Set a custom proxy URL for Cradle.',
  'network.status.reason.systemProxyUnsupported': 'System proxy detection is not available on this platform.',
  'network.status.reason.systemProxyBypassed': 'The system proxy bypass rules match this request.',
  'network.status.reason.systemProxyReadFailed': 'Cradle could not read the system proxy settings.',
  'network.status.reason.customProxyMissing': 'Enter a custom proxy URL to use this mode.',
  'network.status.reason.customProxyInvalid': 'The custom proxy URL is not valid.',
  'network.status.reason.environmentProxyNotConfigured': 'No proxy environment variables are available to the server process.',
  'shortcut.page.title': 'Shortcuts',
  'shortcut.page.description': 'Configure global desktop shortcut behavior.',
  'shortcut.badge.desktop': 'Desktop',
  'shortcut.configurable.title': 'Configurable shortcuts',
  'shortcut.configurable.description': 'Desktop-owned shortcuts that can be changed here.',
  'shortcut.file.title': 'Keybindings file',
  'shortcut.file.description': 'Override registered commands with JSON rules. Keys support mod, cmd, ctrl, shift, alt, and optional when expressions with !, &&, ||, and parentheses.',
  'shortcut.file.pathLabel': 'Configuration path',
  'shortcut.file.open': 'Open file',
  'shortcut.appshotHotkey.label': 'AppShot',
  'shortcut.appshotHotkey.description': 'Capture the frontmost app window into the active chat composer.',
  'shortcut.appshotHotkey.enabledLabel': 'Enable AppShot shortcut',
  'shortcut.appshotHotkey.triggerLabel': 'AppShot trigger',
  'shortcut.appshotHotkey.option.command': 'Double Command',
  'shortcut.appshotHotkey.option.option': 'Double Option',
  'shortcut.appshotHotkey.option.shift': 'Double Shift',
  'shortcut.builtIn.global.title': 'Built-in shortcuts',
  'shortcut.builtIn.global.description': 'Application shortcuts available from the main Cradle window.',
  'shortcut.builtIn.contextual.title': 'Contextual shortcuts',
  'shortcut.builtIn.contextual.description': 'Shortcuts that apply inside a specific editor, panel, or list.',
  'shortcut.builtIn.settings.label': 'Settings',
  'shortcut.builtIn.settings.description': 'Open or close Settings.',
  'shortcut.builtIn.commandPalette.label': 'Command palette',
  'shortcut.builtIn.commandPalette.description': 'Open app commands directly.',
  'shortcut.builtIn.quickOpen.label': 'Quick open',
  'shortcut.builtIn.quickOpen.description': 'Search sessions, issues, files, and commands.',
  'shortcut.builtIn.newChat.label': 'New chat',
  'shortcut.builtIn.newChat.description': 'Open a new chat surface.',
  'shortcut.builtIn.closeSurface.label': 'Close surface',
  'shortcut.builtIn.closeSurface.description': 'Close the active surface.',
  'shortcut.builtIn.switchSurface.label': 'Switch surface',
  'shortcut.builtIn.switchSurface.description': 'Jump to a numbered surface.',
  'shortcut.builtIn.cycleSurface.label': 'Cycle surfaces',
  'shortcut.builtIn.cycleSurface.description': 'Move to the next or previous surface.',
  'shortcut.builtIn.sidebar.label': 'Sidebar',
  'shortcut.builtIn.sidebar.description': 'Show or hide the workspace sidebar.',
  'shortcut.builtIn.rightAside.label': 'Right aside',
  'shortcut.builtIn.rightAside.description': 'Show or hide the right aside for the active surface.',
  'shortcut.builtIn.bottomPanel.label': 'Bottom panel',
  'shortcut.builtIn.bottomPanel.description': 'Show or hide the bottom panel.',
  'shortcut.builtIn.externalTerminal.label': 'External terminal',
  'shortcut.builtIn.externalTerminal.description': 'Open an external terminal in the active workspace folder.',
  'shortcut.builtIn.jarvis.label': 'Jarvis',
  'shortcut.builtIn.jarvis.description': 'Open or close Jarvis.',
  'shortcut.builtIn.layoutFocus.label': 'Layout focus',
  'shortcut.builtIn.layoutFocus.description': 'Expand or collapse available sidebars around the active surface.',
  'shortcut.builtIn.keyboardShortcuts.label': 'Keyboard shortcuts',
  'shortcut.builtIn.keyboardShortcuts.description': 'Open this keyboard shortcuts reference.',
  'shortcut.builtIn.settingsClose.label': 'Close Settings',
  'shortcut.builtIn.settingsClose.description': 'Close Settings while it is active.',
  'shortcut.builtIn.chatSend.label': 'Send message',
  'shortcut.builtIn.chatSend.description': 'Send the current composer draft.',
  'shortcut.builtIn.chatAlternateSend.label': 'Alternate send',
  'shortcut.builtIn.chatAlternateSend.description': 'Send with the alternate continuation behavior.',
  'shortcut.builtIn.chatMode.label': 'Composer mode',
  'shortcut.builtIn.chatMode.description': 'Toggle the runtime interaction mode in the composer.',
  'shortcut.builtIn.browserTabSwitch.label': 'Browser panel tabs',
  'shortcut.builtIn.browserTabSwitch.description': 'Switch the active Browser panel tab.',
  'shortcut.builtIn.browserTabClose.label': 'Close Browser tab',
  'shortcut.builtIn.browserTabClose.description': 'Close the active Browser panel tab.',
  'shortcut.builtIn.workspaceCopyPath.label': 'Copy file path',
  'shortcut.builtIn.workspaceCopyPath.description': 'Copy the selected workspace file path.',
  'shortcut.builtIn.workspaceCopyRelativePath.label': 'Copy relative path',
  'shortcut.builtIn.workspaceCopyRelativePath.description': 'Copy the selected workspace-relative path.',
  'shortcut.webNotice.description': 'These settings apply when Cradle runs as the desktop app.',
  'shortcut.overlay.title': 'Keyboard shortcuts',
  'shortcut.overlay.dismissHint': 'to close',
  'desktop.page.title': 'Desktop',
  'desktop.page.description': 'Configure desktop app behavior and update preferences.',
  'desktop.badge.desktop': 'Desktop',
  'desktop.doubleCommandQ.label': 'Double Command+Q to quit',
  'desktop.doubleCommandQ.description': 'Require pressing Command+Q twice within a short window before Cradle quits.',
  'desktop.autoCheckForUpdates.label': 'Automatically check for updates',
  'desktop.autoCheckForUpdates.description': 'Check for new versions every 5 minutes in the background.',
  'desktop.autoDownloadUpdates.label': 'Automatically download updates',
  'desktop.autoDownloadUpdates.description': 'Download available updates as soon as a new version is found. Requires automatic checks.',
  'desktop.externalTerminal.label': 'External terminal app',
  'desktop.externalTerminal.description': 'App name used when opening a folder in an external terminal. Leave blank to use the system default.',
  'desktop.externalTerminal.placeholder': 'e.g. Ghostty.app, iTerm.app, wt.exe, gnome-terminal',
  'desktop.webNotice.description': 'These settings apply only in the Cradle desktop app.',
  'desktop.updates.title': 'Desktop Updates',
  'desktop.updates.currentVersion': 'Installed version',
  'desktop.updates.availableVersion': 'Available update',
  'desktop.updates.none': 'None',
  'desktop.updates.releaseNotes': 'Release Notes',
  'desktop.updates.actions.refresh': 'Refresh',
  'desktop.updates.actions.check': 'Check',
  'desktop.updates.actions.download': 'Download',
  'desktop.updates.actions.restart': 'Restart',
  'desktop.updates.status.unavailable': 'Unavailable',
  'desktop.updates.status.checking': 'Checking',
  'desktop.updates.status.downloading': 'Downloading',
  'desktop.updates.status.preparing': 'Preparing',
  'desktop.updates.status.ready': 'Downloaded',
  'desktop.updates.status.available': 'Available',
  'desktop.updates.status.current': 'Current',
  'desktop.cli.title': 'CLI Command',
  'desktop.cli.actions.refresh': 'Refresh',
  'desktop.cli.actions.install': 'Install',
  'desktop.cli.actions.repair': 'Repair',
  'desktop.cli.actions.remove': 'Remove',
  'desktop.cli.status.unavailable': 'Unavailable',
  'desktop.cli.status.installed': 'Installed',
  'desktop.cli.status.notInstalled': 'Not installed',
  'desktop.cli.status.repair': 'Repair',
  'jarvis.model.description': 'Choose Jarvis provider profile, model, and thinking level.',
  'jarvis.model.emptyProfiles': 'No agent profiles configured',
  'jarvis.model.emptySelection': 'Select a model',
  'jarvis.model.label': 'Model',
  'jarvis.page.description': 'Configure the system assistant that has full awareness of your workspace.',
  'jarvis.page.title': 'Jarvis',
  'jarvis.runtime.description': 'Choose which chat runtime powers new Jarvis sessions.',
  'jarvis.runtime.label': 'Runtime',
  'jarvis.thinking.high.description': 'Deeper reasoning for complex work.',
  'jarvis.thinking.high.label': 'High',
  'jarvis.thinking.low.description': 'Fast responses with light reasoning.',
  'jarvis.thinking.low.label': 'Low',
  'jarvis.thinking.medium.description': 'Balanced reasoning for everyday work.',
  'jarvis.thinking.medium.label': 'Medium',
  'jarvis.thinking.minimal.description': 'Lowest reasoning budget for direct tasks.',
  'jarvis.thinking.minimal.label': 'Minimal',
  'jarvis.thinking.xhigh.description': 'Maximum reasoning budget for hard tasks.',
  'jarvis.thinking.xhigh.label': 'Extra High',
  'remoteHosts.page.title': 'Remote Hosts',
  'remoteHosts.page.description': 'Pair another computer to run agents there, or let another computer pair with this one. Relay is the default path; SSH and direct URL are advanced options.',
  'remoteHosts.guide.toggle': 'How do I set this up?',
  'remoteHosts.guide.intro': 'Pair another computer by creating a host enrollment there, then pasting its pairing string here. Relay is the default; use a direct URL or SSH only when the server is already reachable.',
  'remoteHosts.guide.step1.title': 'Create a host enrollment on the other computer',
  'remoteHosts.guide.step1.detail': 'On the computer you want to reach, open Cradle → Settings → Remote Hosts → This computer, then add an enrollment. It prints a one-time pairing string.',
  'remoteHosts.guide.step2.title': 'Pair it here',
  'remoteHosts.guide.step2.detail': 'Choose Pair another computer, pick Relay, and paste the pairing string. The computer appears here once pairing completes.',
  'remoteHosts.guide.step3.title': 'Connect and browse remote workspaces',
  'remoteHosts.guide.step3.detail': 'Cradle connects to the remote Cradle Server over the relay. Expand the row to browse its workspaces and files.',
  'remoteHosts.guide.relayNote': 'Already reachable by SSH or a direct URL? Use the Advanced path in the pair wizard instead of a pairing string.',
  'remoteHosts.guide.copy': 'Copy command',
  'remoteHosts.guide.commandCopied': 'Command copied.',
  'remoteHosts.guide.copyFailed': 'Failed to copy command.',
  'remoteHosts.loading': 'Loading remote hosts...',
  'remoteHosts.empty.title': 'Pair your first computer',
  'remoteHosts.action.addHost': 'Pair another computer',
  'remoteHosts.action.add': 'Add',
  'remoteHosts.action.save': 'Save',
  'remoteHosts.action.cancel': 'Cancel',
  'remoteHosts.action.edit': 'Edit',
  'remoteHosts.action.delete': 'Delete',
  'remoteHosts.action.connect': 'Connect',
  'remoteHosts.action.disconnect': 'Disconnect',
  'remoteHosts.action.expand': 'Expand',
  'remoteHosts.action.collapse': 'Collapse',
  'remoteHosts.action.refresh': 'Refresh',
  'remoteHosts.action.testCradleServer': 'Test Cradle Server',
  'remoteHosts.action.completePairing': 'Complete pairing',
  'remoteHosts.action.openWorkspaces': 'Open workspaces',
  'remoteHosts.action.done': 'Done',
  'remoteHosts.badge.disabled': 'Disabled',
  'remoteHosts.state.idle': 'Not connected',
  'remoteHosts.state.connecting': 'Connecting',
  'remoteHosts.state.connected': 'Connected',
  'remoteHosts.state.disconnected': 'Disconnected',
  'remoteHosts.state.offline': 'Offline',
  'remoteHosts.runtime.available': 'Available',
  'remoteHosts.runtime.unavailable': 'Unavailable',
  'remoteHosts.agent.idle': 'Idle',
  'remoteHosts.agent.running': 'Running',
  'remoteHosts.agent.failed': 'Failed',
  'remoteHosts.detail.directory': 'Remote directory',
  'remoteHosts.detail.runtimes': 'Runtimes',
  'remoteHosts.detail.workspaces': 'Workspaces',
  'remoteHosts.detail.agents': 'Live agents',
  'remoteHosts.detail.loading': 'Loading...',
  'remoteHosts.detail.noRuntimes': 'No runtimes returned by the remote Cradle Server.',
  'remoteHosts.detail.health': 'Cradle Server health',
  'remoteHosts.detail.noWorkspaces': 'No workspaces returned by the remote Cradle Server.',
  'remoteHosts.detail.noAgents': 'No live agents on this host.',
  'remoteHosts.detail.connectToBrowse': 'Connect to this host to read Cradle Server health and browse remote workspaces.',
  'remoteHosts.files.empty': 'No files returned for this location.',
  'remoteHosts.files.noPreview': 'No text preview is available for this file.',
  'remoteHosts.files.root': 'Back to workspace root',
  'remoteHosts.files.up': 'Up to parent directory',
  'remoteHosts.health.unavailable': 'Health data is unavailable.',
  'remoteHosts.health.uptime': 'Uptime {{seconds}}s',
  'remoteHosts.directory.hint': 'Browse the remote filesystem and select a directory. Cradle probes it for git info; add remote projects from the workspace sidebar.',
  'remoteHosts.directory.pathPlaceholder': '~/projects/my-repo',
  'remoteHosts.directory.go': 'Go to path',
  'remoteHosts.directory.up': 'Up to parent directory',
  'remoteHosts.directory.home': 'Go to home directory',
  'remoteHosts.directory.useCurrent': 'Use this directory',
  'remoteHosts.directory.select': 'Select',
  'remoteHosts.directory.empty': 'This directory is empty.',
  'remoteHosts.directory.selected': 'Selected path',
  'remoteHosts.directory.isRepo': 'Git repository',
  'remoteHosts.directory.notRepo': 'Not a git repository. You can still select it, but no branch or remote will be available.',
  'remoteHosts.directory.repoRoot': 'Root',
  'remoteHosts.directory.branch': 'Branch',
  'remoteHosts.directory.remote': 'Remote',
  'remoteHosts.directory.probeUnavailable': 'Could not probe this path for git info.',
  'remoteHosts.directory.addFromWorkspaceSidebar': 'Remote project registration now lives in the workspace sidebar Add project flow.',
  'remoteHosts.directory.register': 'Register as remote project',
  'remoteHosts.directory.registerPending': 'Durable remote-project registration is a separate step that isn\'t available yet. Once shipped, the selected path becomes a Cradle-owned project keyed by host and remote path.',
  'remoteHosts.workspace.import': 'Register',
  'remoteHosts.workspace.imported': 'Workspace "{{name}}" registered locally.',
  'remoteHosts.workspace.alreadyRegistered': 'Workspace "{{name}}" is already registered locally.',
  'remoteHosts.workspace.importFailed': 'Failed to register workspace.',
  'remoteHosts.toast.connected': 'Connected to remote host.',
  'remoteHosts.toast.disconnected': 'Disconnected from remote host.',
  'remoteHosts.toast.connectFailed': 'Failed to connect.',
  'remoteHosts.toast.disconnectFailed': 'Failed to disconnect.',
  'remoteHosts.toast.deleted': 'Remote host deleted.',
  'remoteHosts.toast.deleteFailed': 'Failed to delete host.',
  'remoteHosts.toast.created': 'Remote host created.',
  'remoteHosts.toast.updated': 'Remote host updated.',
  'remoteHosts.toast.saveFailed': 'Failed to save host.',
  'remoteHosts.toast.cradleServerOk': 'Remote Cradle Server is reachable.',
  'remoteHosts.toast.cradleServerFailed': 'Remote Cradle Server test failed.',
  'remoteHosts.delete.title': 'Delete remote host?',
  'remoteHosts.delete.description': 'This removes "{{name}}" from Cradle and disconnects any active session. The remote machine is not affected.',
  'remoteHosts.form.addTitle': 'Add remote host',
  'remoteHosts.form.editTitle': 'Edit remote host',
  'remoteHosts.form.description': 'Cradle connects to a Cradle Server on the other computer.',
  'remoteHosts.form.displayName': 'Display name',
  'remoteHosts.form.displayNamePlaceholder': 'e.g. Build server',
  'remoteHosts.form.sshTarget': 'SSH target',
  'remoteHosts.form.sshTargetPlaceholder': 'user@host',
  'remoteHosts.form.sshTargetHint': 'Use an alias from your ~/.ssh/config, or a plain user@host. Your existing keys, ProxyJump, and config apply.',
  'remoteHosts.form.remoteAddress': 'Remote address',
  'remoteHosts.form.remoteAddressPlaceholder': 'devbox.local',
  'remoteHosts.form.sshPort': 'SSH port',
  'remoteHosts.form.username': 'Username',
  'remoteHosts.form.usernamePlaceholder': 'wibus',
  'remoteHosts.form.auth': 'Authentication',
  'remoteHosts.form.authDefault': 'SSH config / agent',
  'remoteHosts.form.authIdentityFile': 'Existing key file',
  'remoteHosts.form.identityFile': 'Identity file',
  'remoteHosts.form.identityFilePlaceholder': '~/.ssh/id_ed25519',
  'remoteHosts.form.advanced': 'Advanced',
  'remoteHosts.form.baseUrl': 'Cradle Server URL',
  'remoteHosts.form.baseUrlHint': 'Use this only when the remote Cradle Server is already reachable from this machine.',
  'remoteHosts.form.baseUrlPlaceholder': 'http://127.0.0.1:21423',
  'remoteHosts.form.connectTimeoutMs': 'Connect timeout',
  'remoteHosts.form.connectTimeoutMsHint': 'Timeout in milliseconds for connecting to the remote Cradle Server.',
  'remoteHosts.form.remoteServerHost': 'Remote server host',
  'remoteHosts.form.remoteServerPort': 'Remote server port',
  'remoteHosts.form.remoteSocketPath': 'Legacy socket path',
  'remoteHosts.form.remoteSocketPathPlaceholder': 'http://127.0.0.1:21423',
  'remoteHosts.form.remoteSocketPathHint': 'Legacy field retained only for old translation catalogs. New remote hosts use Cradle Server URLs.',
  'remoteHosts.form.enabled': 'Enabled',
  'remoteHosts.form.enabledHint': 'Disabled hosts are kept but cannot be connected.',
  'remoteHosts.form.transport': 'Connection',
  'remoteHosts.form.transportSsh': 'SSH',
  'remoteHosts.form.transportDirectUrl': 'Direct URL',
  'remoteHosts.form.transportRelay': 'Relay',
  'remoteHosts.form.relayNote': 'Create a host enrollment on the remote Cradle Server, then paste its pairing string from this row.',
  'remoteHosts.transport.ssh': 'SSH',
  'remoteHosts.transport.directUrl': 'Direct URL',
  'remoteHosts.transport.relay': 'Relay',
  'remoteHosts.transport.directSocket': 'Direct socket',
  'remoteHosts.action.pairRelay': 'Pair via relay',
  'remoteHosts.relay.roomLabel': 'Room',
  'remoteHosts.relay.noRoom': 'Not paired',
  'remoteHosts.relay.dialog.title': 'Pair via relay',
  'remoteHosts.relay.dialog.description': 'Run the command on the remote machine, then paste the pairing code it prints back here.',
  'remoteHosts.relay.dialog.relayUrl': 'Relay URL',
  'remoteHosts.relay.dialog.relayUrlPlaceholder': 'https://relay.example.com',
  'remoteHosts.relay.dialog.relayUrlHint': 'The relay server both machines connect to. Ask your relay operator for the URL.',
  'remoteHosts.relay.dialog.generate': 'Generate pairing command',
  'remoteHosts.relay.dialog.regenerate': 'Generate new command',
  'remoteHosts.relay.dialog.commandTitle': 'Run this on the remote machine',
  'remoteHosts.relay.dialog.commandHint': 'On the remote machine, run the command below. It prints a one-time pairing code.',
  'remoteHosts.relay.dialog.expiresIn': 'Expires in {{seconds}}s',
  'remoteHosts.relay.dialog.expired': 'Command expired — generate a new one.',
  'remoteHosts.relay.dialog.pairingCode': 'Pairing string',
  'remoteHosts.relay.dialog.pairingCodePlaceholder': '<pairingCode>:<roomId>#<hostKeyFingerprint>',
  'remoteHosts.relay.dialog.pairingCodeHint': 'Paste the code the command printed.',
  'remoteHosts.relay.dialog.pairingStepTitle': 'Paste the pairing code',
  'remoteHosts.relay.dialog.claim': 'Complete pairing',
  'remoteHosts.relay.dialog.claiming': 'Completing...',
  'remoteHosts.relay.toast.commandGenerated': 'Pairing command generated. Run it on the remote machine.',
  'remoteHosts.relay.toast.pairingComplete': 'Host paired over relay.',
  'remoteHosts.relay.toast.pairingFailed': 'Relay pairing failed.',
  'remoteHosts.relay.toast.commandFailed': 'Failed to generate pairing command.',
  'remoteHosts.group.otherComputers': 'Other computers',
  'remoteHosts.group.otherComputers.description': 'Computers you can connect to from this one.',
  'remoteHosts.wizard.title': 'Pair another computer',
  'remoteHosts.wizard.description': 'Choose how to reach the other computer.',
  'remoteHosts.wizard.pathRelay': 'Pair over relay',
  'remoteHosts.wizard.pathRelayHint': 'Default. Use a one-time pairing string.',
  'remoteHosts.wizard.pathDirectUrl': 'Direct URL',
  'remoteHosts.wizard.pathDirectUrlHint': 'The Cradle Server is already reachable by URL.',
  'remoteHosts.wizard.pathSsh': 'SSH',
  'remoteHosts.wizard.pathSshHint': 'Advanced / compatibility.',
  'remoteHosts.wizard.computerName': 'Computer name',
  'remoteHosts.wizard.computerNamePlaceholder': 'e.g. Build server',
  'remoteHosts.wizard.enrollmentCommandTitle': 'On the other computer, create a host enrollment',
  'remoteHosts.wizard.enrollmentCommandHint': 'Run the command below on the other computer. It prints a one-time pairing string. Or use the This computer section on that machine.',
  'remoteHosts.wizard.success.title': 'Computer paired',
  'remoteHosts.wizard.success.body': '{{name}} is paired. Connecting now — browse its workspaces when ready.',
  'remoteHosts.wizard.success.connecting': 'Connecting…',
  'remoteHosts.wizard.success.connected': 'Connected',
  'remoteHosts.wizard.success.connectFailed': 'Paired, but the connection failed. Try Connect from the row.',
  'remoteHosts.relayServers.title': 'Relay servers',
  'remoteHosts.relayServers.description': 'Relay servers route pairings between computers that can\'t reach each other directly. Add one once, then pair computers against it.',
  'remoteHosts.relayServers.empty': 'No relay servers configured. Add the URL your operator gave you.',
  'remoteHosts.relayServers.add': 'Add relay server',
  'remoteHosts.relayServers.badge.default': 'Default',
  'remoteHosts.relayServers.badge.managed': 'Managed',
  'remoteHosts.relayServers.managedLocalName': 'Built-in local relay',
  'remoteHosts.relayServers.managedLocalDescription': 'Started by Cradle on this machine. Configure its remote-control reachability here.',
  'remoteHosts.relayServers.action.setDefault': 'Set as default',
  'remoteHosts.relayServers.action.edit': 'Edit',
  'remoteHosts.relayServers.action.delete': 'Delete',
  'remoteHosts.relayServers.delete.title': 'Delete relay server?',
  'remoteHosts.relayServers.delete.description': 'This removes "{{name}}" from Cradle. Hosts already paired against it keep their stored connection.',
  'remoteHosts.relayServers.form.addTitle': 'Add relay server',
  'remoteHosts.relayServers.form.editTitle': 'Edit relay server',
  'remoteHosts.relayServers.form.displayName': 'Display name',
  'remoteHosts.relayServers.form.displayNamePlaceholder': 'e.g. Official relay',
  'remoteHosts.relayServers.form.relayUrl': 'Relay URL',
  'remoteHosts.relayServers.form.relayUrlPlaceholder': 'https://relay.example.com',
  'remoteHosts.relayServers.form.isDefault': 'Use as default for new pairings',
  'remoteHosts.relayServers.toast.created': 'Relay server added.',
  'remoteHosts.relayServers.toast.updated': 'Relay server updated.',
  'remoteHosts.relayServers.toast.deleted': 'Relay server deleted.',
  'remoteHosts.relayServers.toast.saveFailed': 'Failed to save relay server.',
  'remoteHosts.relayServers.toast.deleteFailed': 'Failed to delete relay server.',
  'remoteHosts.relay.dialog.relayServer': 'Relay server',
  'remoteHosts.relay.dialog.noRelayServer': 'No relay server configured',
  'remoteHosts.relay.dialog.addRelayServer': 'Add a relay server',
  'remoteHosts.relay.dialog.noRelayServerHint': 'Add a relay server first, then generate the pairing command.',
  'remoteHosts.relay.dialog.noRelayUrl': 'This host has no relay server. Edit it and choose a relay server first.',
  'hostEnrollments.title': 'This computer',
  'hostEnrollments.description': 'Let another computer pair with this one over a relay.',
  'hostEnrollments.empty': 'No enrollments. Add one to let another computer pair with this machine.',
  'hostEnrollments.loading': 'Loading...',
  'hostEnrollments.status.connected': 'Connected',
  'hostEnrollments.status.disconnected': 'Disconnected',
  'hostEnrollments.status.pending': 'Waiting for controller',
  'hostEnrollments.status.paired': 'Paired',
  'hostEnrollments.status.offline': 'Offline',
  'hostEnrollments.row.controller': 'Controller',
  'hostEnrollments.row.lastSeen': 'Last seen',
  'hostEnrollments.action.add': 'Add enrollment',
  'hostEnrollments.action.delete': 'Delete',
  'hostEnrollments.action.cancel': 'Cancel',
  'hostEnrollments.action.copy': 'Copy',
  'hostEnrollments.action.showPairingString': 'Show pairing string',
  'hostEnrollments.form.addTitle': 'Let another computer pair with this one',
  'hostEnrollments.form.description': 'Create an enrollment so another computer can pair with this one. Uses the default relay server.',
  'hostEnrollments.form.displayName': 'Computer name',
  'hostEnrollments.form.displayNamePlaceholder': 'e.g. Living room Mac',
  'hostEnrollments.form.relayServer': 'Relay server',
  'hostEnrollments.form.relayUrl': 'Relay URL',
  'hostEnrollments.form.advanced': 'Advanced',
  'hostEnrollments.form.relayHint': 'Uses the default relay server. Change it only if your pairing partner uses a different relay.',
  'hostEnrollments.pairing.title': 'Pairing string',
  'hostEnrollments.pairing.hint': 'Send this string to the other computer. They paste it under Remote Hosts → Pair another computer.',
  'hostEnrollments.pairing.copied': 'Pairing string copied.',
  'hostEnrollments.pairing.copyFailed': 'Failed to copy.',
  'hostEnrollments.delete.title': 'Delete enrollment?',
  'hostEnrollments.delete.description': 'This removes "{{name}}" and stops accepting relay connections through it.',
  'hostEnrollments.toast.created': 'Enrollment created.',
  'hostEnrollments.toast.deleted': 'Enrollment deleted.',
  'hostEnrollments.toast.saveFailed': 'Failed to create enrollment.',
  'hostEnrollments.toast.deleteFailed': 'Failed to delete enrollment.',
  'sidebar.close': 'Close settings',
  'sidebar.title': 'Settings',
  'sidebar.search': 'Search settings...',
  'sidebar.clearSearch': 'Clear search',
  'sidebar.noResults': 'No matching settings',
  'sidebar.section.general': 'General',
  'sidebar.section.models': 'Models',
  'sidebar.section.runtime': 'Runtime',
  'sidebar.section.agent': 'Agent',
  'sidebar.section.extensions': 'Extensions',
  'sidebar.section.system': 'System',
  'sidebar.section.help': 'Help',
  'support.action.copy': 'Copy',
  'support.action.export': 'Export',
  'support.action.open': 'Open',
  'support.action.reveal': 'Reveal',
  'support.alert.description': 'Cradle does not upload diagnostics automatically in this private preview. Exported bundles stay on this machine until you send them through your invite channel.',
  'support.alert.title': 'Private preview support is local-first',
  'support.badge.documented': 'Documented',
  'support.badge.manual': 'Manual',
  'support.dataDirectory.description': 'Open the Cradle-owned data directory that stores the local database, logs, plugins, and runtime files.',
  'support.dataDirectory.label': 'Cradle data directory',
  'support.dataDirectory.change': 'Change location',
  'support.dataDirectory.confirmTitle': 'Change Cradle data location?',
  'support.dataDirectory.confirmDescription': 'Cradle will copy your data to {{path}}, verify it, and restart the app. Your current data stays as a backup until the migration succeeds.',
  'support.dataDirectory.confirm': 'Copy and restart',
  'support.dataDirectory.cancel': 'Cancel',
  'support.dataDirectory.restart': 'Migration scheduled. Cradle will restart now.',
  'support.diagnostics.description': 'Flush local observability data and download a diagnostics JSON with runtime metadata, recent server logs, events, and incidents.',
  'support.diagnostics.label': 'Diagnostics bundle',
  'support.diagnostics.note': 'Local private-preview diagnostics export. Review before sharing; no automatic upload was performed.',
  'support.error.noDiagnosticsBundle': 'No diagnostics bundle returned',
  'support.feedbackChannel.description': 'Copy a private-preview handoff block you can paste into your invite channel, email, or direct message with the reviewed diagnostics file.',
  'support.feedbackChannel.label': 'Private handoff',
  'support.feedbackTemplate.description': 'Copy a compact feedback template with version, runtime, server URL, and diagnostics instructions.',
  'support.feedbackTemplate.label': 'Feedback template',
  'support.page.description': 'Export local diagnostics, prepare private-preview feedback, and inspect Cradle-owned data before uninstalling.',
  'support.page.title': 'Support',
  'support.status.exported': 'Exported {{eventCount}} events and {{incidentCount}} incidents.',
  'support.status.handoffCopied': 'Private preview handoff copied.',
  'support.status.templateCopied': 'Feedback template copied.',
  'support.privateHandoff.title': '# Private Preview Handoff',
  'support.privateHandoff.step1': '1. Export diagnostics from Settings > Support and review the JSON locally.',
  'support.privateHandoff.step2': '2. Send this feedback text through the private preview channel you were invited through.',
  'support.privateHandoff.step3': '3. Attach the reviewed diagnostics JSON only if you are comfortable sharing its contents.',
  'support.template.diagnostics': '## Diagnostics',
  'support.template.diagnosticsNote': 'Attach the local diagnostics JSON exported from Settings > Support only after reviewing it.',
  'support.template.expected': '## What I expected',
  'support.template.reproduction': '## Reproduction steps',
  'support.template.runtime': 'Runtime: {{runtime}}',
  'support.template.runtime.electron': 'Electron desktop',
  'support.template.runtime.web': 'Web preview',
  'support.template.server': 'Server: {{server}}',
  'support.template.title': '# Cradle Preview Feedback',
  'support.template.version': 'Version: {{version}}',
  'support.template.whatHappened': '## What happened',
  'support.onboarding.label': 'Onboarding',
  'support.onboarding.description': 'Show the onboarding flow again to reconfigure initial setup preferences.',
  'support.action.showOnboarding': 'Show onboarding',
  'support.uninstall.description': 'Use the OS uninstall flow to remove the app. Cradle-owned user data is retained by default so accidental uninstall does not delete work.',
  'support.uninstall.label': 'Uninstall',
  'appearance.page.title': 'Appearance',
  'appearance.page.description': 'Customize the app visual style.',
  'appearance.general.title': 'General',
  'appearance.theme.label': 'Theme',
  'appearance.theme.description': 'Choose the app color theme.',
  'appearance.theme.info': 'Light and dark themes fit different environments. System mode follows your operating system preference.',
  'appearance.theme.mode': 'Mode',
  'appearance.theme.light': 'Light',
  'appearance.theme.dark': 'Dark',
  'appearance.theme.system': 'System',
  'appearance.customization.title': 'Theme profiles',
  'appearance.customization.description': 'Configure Light and Dark side by side. Override any value to make it yours, or reset a field - or the whole profile - back to the Cradle defaults at any time.',
  'appearance.customization.import': 'Import',
  'appearance.customization.duplicate': 'Duplicate',
  'appearance.customization.duplicateProfile': 'Duplicate profile',
  'appearance.customization.resetProfile': 'Reset to defaults',
  'appearance.customization.resetProfileConfirm': 'Clear all overrides for this profile and restore the Cradle defaults?',
  'appearance.customization.resetField': 'Reset to default',
  'appearance.customization.importError': 'This file is not a valid Cradle theme.',
  'appearance.customization.livePreview': 'Live preview',
  'appearance.customization.livePreviewDescription': 'Updates immediately as you edit this profile.',
  'appearance.customization.name': 'Theme name',
  'appearance.customization.colors': 'Colors',
  'appearance.customization.accent': 'Accent',
  'appearance.customization.background': 'Background',
  'appearance.customization.foreground': 'Foreground',
  'appearance.customization.uiFont': 'UI font',
  'appearance.customization.codeFont': 'Code font',
  'appearance.customization.translucentSidebar': 'Translucent sidebar',
  'appearance.customization.translucentSidebarDescription': 'Blend the sidebar with content behind the window.',
  'appearance.customization.contrast': 'Contrast',
  'appearance.customization.contrastDescription': 'Adjust secondary text and separator strength.',
  'appearance.language.label': 'Language',
  'appearance.language.description': 'Choose the display language for this app.',
  'appearance.language.pending': 'Switching language...',
  'appearance.language.option.en-US': 'English',
  'appearance.language.option.zh-CN': 'Chinese (Simplified)',
  'appearance.language.option.ja-JP': 'Japanese',
  'appearance.language.option.es-ES': 'Spanish',
  'appearance.sessionPreview.label': 'Collapsed session preview',
  'appearance.sessionPreview.description': 'How many sessions to show in each workspace group before collapsing the rest behind a "show more" button.',
  'appearance.sessionPreview.info': 'Pinned and running sessions always stay visible even when the preview limit is small.',
  'appearance.terminalFont.label': 'Terminal font',
  'appearance.terminalFont.description': 'Font family used by built-in terminals on this device. Leave blank to use Cradle defaults.',
  'appearance.terminalFont.placeholder': '"MesloLGM Nerd Font Mono", "CaskaydiaCove Nerd Font", ui-monospace, monospace',
  'await.page.title': 'Await',
  'await.page.description': 'Configure CI check bypass rules for session awaits. Bypassed checks are skipped during polling and do not block await completion.',
  'await.workspace.label': 'Workspace',
  'await.workspace.description': 'Select which workspace to manage bypass rules for.',
  'await.rules.label': 'Bypass rules',
  'await.rules.description': 'Define patterns for CI checks that should be automatically bypassed. Supports glob patterns (* and ?).',
  'await.rules.empty': 'No bypass rules defined. Add a rule to automatically skip non-blocking CI checks.',
  'await.rules.add': 'Add rule',
  'await.rules.patternPlaceholder': 'Check name pattern (e.g. PR Checklist*)',
  'await.guide.label': 'About Session Await',
  'await.guide.description': 'How Session Await pauses a chat on an external condition and how bypass rules fit in.',
  'await.guide.intro.title': 'Session Await pauses a chat until an external signal arrives',
  'await.guide.intro.body': 'Session Await lets a chat session stop and wait for something outside the agent loop — most often a GitHub CI run on a pull request or commit, a PR review verdict (approved, changes requested, or reviewed), or a human-driven manual trigger. While the await is open, the agent stays idle and Cradle keeps polling the source. The session resumes as soon as the condition resolves. The Await panel in the right aside shows every pending await with its current status.',
  'await.guide.bypass.title': 'Bypass rules tell Cradle which checks can be skipped',
  'await.guide.bypass.body': 'Some CI checks do not actually gate merge — flaky linters, weekly snapshots, or required-on-paper jobs you intentionally ignore. A bypass rule matches a check by name pattern and tells Cradle to ignore it during polling. Required checks (the req badge) can never be bypassed; only optional checks (opt) can.',
  'worktrees.page.title': 'Worktrees',
  'worktrees.page.description': 'Manage Cradle-created git worktrees across every workspace and free disk space when old isolated checkouts are no longer needed.',
  'worktrees.cleanup.title': 'Cleanup',
  'worktrees.cleanup.description': 'Cradle removes the oldest unbound worktrees first when cleanup runs. Set either limit to 0 to disable that limit.',
  'worktrees.cleanup.maxWorktrees.label': 'Max worktrees',
  'worktrees.cleanup.maxWorktrees.description': 'Maximum number of Cradle-managed active worktrees to retain across all workspaces.',
  'worktrees.cleanup.maxTotalSizeGb.label': 'Max total size (GB)',
  'worktrees.cleanup.maxTotalSizeGb.description': 'Maximum total size in GB across active Cradle-managed worktrees.',
  'worktrees.action.runCleanup': 'Run cleanup',
  'worktrees.action.cleanupOne': 'Cleanup',
  'worktrees.list.title': 'Cradle-managed worktrees',
  'worktrees.list.description': '{{count}} active worktrees using {{size}}.',
  'worktrees.list.loading': 'Loading worktrees...',
  'worktrees.list.error': 'Failed to load managed worktrees.',
  'worktrees.list.boundSessions': '{{count}} sessions',
  'worktrees.list.createdAt': 'Created {{value}}',
  'worktrees.empty.title': 'No Cradle-managed worktrees on this machine.',
  'worktrees.empty.description': 'New isolated sessions will appear here after Cradle creates their git worktrees.',
  'worktrees.confirm.title': 'Cleanup worktree?',
  'worktrees.confirm.description': 'This removes "{{name}}" and deletes its local branch. Unmerged changes in that worktree will be discarded.',
  'worktrees.confirm.cancel': 'Cancel',
  'worktrees.confirm.action': 'Cleanup',
  'await.guide.steps.title': 'How a rule is applied',
  'await.guide.step.scope': 'Scoped per workspace — rules only apply to awaits created in the workspace that owns them.',
  'await.guide.step.match': 'Matched by name — the pattern is a glob against the check name GitHub reports (* matches any sequence, ? matches a single character).',
  'await.guide.step.apply': 'Applied to optional checks only — required checks (the req badge) cannot be bypassed; bypass only affects optional checks (opt).',
  'await.guide.patterns.title': 'Useful patterns',
  'await.guide.patterns.note': 'Patterns are case-sensitive and matched against the exact check name GitHub reports.',
  'await.guide.pattern.example1.desc': 'Match every check whose name starts with "PR Checklist".',
  'await.guide.pattern.example2.desc': 'Match all checks inside the "lint" namespace (lint:eslint, lint:prettier, …).',
  'await.guide.pattern.example3.desc': 'Match a single check by its exact name.',
  'await.guide.pattern.example4.desc': 'Match any single-character prefix followed by "ci" (ci/1, ci/2, …).',
  'await.guide.scope.title': 'Per-workspace scope',
  'await.guide.scope.description': 'Rules live in the workspace\'s Cradle database. Removing or disabling a workspace does not affect bypass rules in other workspaces, and a rule never leaks past its owner/repo match.',
  'plugins.page.title': 'Plugins',
  'plugins.page.description': 'Browse and switch Cradle extensions on or off. Disabling a plugin removes its private routes, panels, and commands until you turn it back on.',
  'plugins.search.placeholder': 'Search plugins...',
  'plugins.filter.all': 'All',
  'plugins.filter.enabled': 'On',
  'plugins.filter.disabled': 'Off',
  'plugins.action.refresh': 'Refresh',
  'plugins.toggleAria': 'Toggle {{name}}',
  'plugins.noDescription': 'No description provided.',
  'plugins.badge.pinned': 'Pinned',
  'plugins.source.workspaceDev': 'Dev',
  'plugins.source.bundled': 'Bundled',
  'plugins.source.external': 'External',
  'plugins.sources.title': 'Sources',
  'plugins.sources.description': 'Add local folders, GitHub repositories, or npm packages as external plugin sources. Newly discovered plugins stay off until you enable and trust them.',
  'plugins.sources.kind.localPath': 'Local path',
  'plugins.sources.kind.git': 'GitHub',
  'plugins.sources.kind.npm': 'npm',
  'plugins.sources.pluginsCount': '{{count}} plugins',
  'plugins.sources.status.error': 'Error',
  'plugins.sources.removeAria': 'Remove source {{name}}',
  'plugins.sources.toast.added': 'Plugin source added',
  'plugins.sources.toast.addFailed': 'Failed to add plugin source',
  'plugins.sources.toast.removed': 'Plugin source removed',
  'plugins.sources.toast.removeFailed': 'Failed to remove plugin source',
  'plugins.capabilities': '{{count}} capabilities',
  'plugins.add.button': 'Add plugin',
  'plugins.add.title': 'Add plugin',
  'plugins.add.description': 'Paste a plugin source, preview what it contains, then install after confirming.',
  'plugins.add.inputLabel': 'Plugin source',
  'plugins.add.inputPlaceholder': 'Paste a cradle:// link, GitHub repo URL, or npm package name',
  'plugins.add.submit': 'Add',
  'plugins.add.invalidHint': 'Could not recognize this input. Try a cradle:// link, a GitHub repo (owner/repo), or an npm package name.',
  'plugins.add.localPathHint': 'Local folders are added via the `cradle plugin source add` command.',
  'plugins.add.resultTitle': 'Added',
  'plugins.add.resultHint': 'New plugins start turned off. Enable one to start using it.',
  'plugins.add.resultError': 'Failed to add: {{message}}',
  'plugins.add.resultEmpty': 'No plugins were found at this source.',
  'plugins.add.enableAll': 'Enable all',
  'plugins.add.done': 'Done',
  'plugins.add.tryAgain': 'Try again',
  'plugins.add.preview': 'Preview what will install',
  'plugins.add.resolving': 'Resolving source…',
  'plugins.add.installing': 'Installing…',
  'plugins.add.installN': 'Install {{count}} plugins',
  'plugins.add.recognition.github': 'GitHub repository',
  'plugins.add.recognition.npm': 'npm package',
  'plugins.add.recognition.cradle': 'cradle link',
  'plugins.add.example.github': 'https://github.com/wibus-wee/cradle-app',
  'plugins.add.example.npm': '@cradle/browser-use',
  'plugins.add.example.cradle': 'cradle://plugins/install?repository=owner/repo',
  'plugins.add.undo': 'Undo, remove this source',
  'plugins.add.undoConfirm': 'This will remove {{count}} plugins from {{source}}.',
  'plugins.add.error.repoNotFound': 'Couldn\'t find that repository',
  'plugins.add.error.network': 'Network problem, check your connection and retry',
  'plugins.add.error.noPlugins': 'No Cradle plugins in this source',
  'plugins.add.back': 'Back',
  'plugins.add.retry': 'Retry',
  'plugins.add.cancel': 'Cancel',
  'plugins.preview.empty': 'No Cradle plugins found at this source',
  'plugins.preview.trusted': 'Trusted',
  'plugins.preview.untrusted': 'Not trusted',
  'plugins.preview.untrustedHint': 'Needs confirmation before enabling',
  'plugins.preview.permissions': '{{count}} permissions',
  'plugins.preview.select-all': 'Select all',
  'plugins.preview.selected-n': '{{count}} selected',
  'plugins.trust.title': 'Trust before enabling',
  'plugins.trust.body': 'This plugin comes from an external source. Review the permissions it requests before enabling it.',
  'plugins.trust.permissions': 'Requested permissions',
  'plugins.trust.confirm': 'Trust & enable',
  'plugins.trust.cancel': 'Cancel',
  'plugins.uninstall': 'Uninstall',
  'plugins.uninstallConfirmTitle': 'Uninstall plugin',
  'plugins.uninstallConfirmBody': 'This will remove {{count}} plugins from {{source}}.',
  'plugins.uninstallPlan.loading': 'Inspecting processes, managed resources, and plugin data…',
  'plugins.uninstallPlan.failed': 'Could not inspect this plugin’s uninstall plan. Nothing has been removed.',
  'plugins.uninstallPlan.stopProcesses': 'Stop {{count}} managed processes',
  'plugins.uninstallPlan.removeResource': 'Uninstall managed resource: {{name}}',
  'plugins.uninstallPlan.remove': 'Remove',
  'plugins.uninstallPlan.preserve': 'Preserve',
  'plugins.needsTrust': 'Needs trust before enabling',
  'plugins.provenance.github': 'GitHub · {{location}}',
  'plugins.provenance.npm': 'npm · {{location}}',
  'plugins.provenance.local': 'Local',
  'plugins.provenance.bundled': 'Built-in',
  'plugins.provenance.workspaceDev': 'Dev',
  'plugins.center.title': 'Plugin Center',
  'plugins.center.tab.marketplace': 'Marketplace',
  'plugins.center.tab.installed': 'Installed',
  'plugins.center.tab.import': 'Import',
  'plugins.center.search.placeholder': 'Search plugins…',
  'plugins.center.category.all': 'All',
  'plugins.center.category.automation': 'Automation',
  'plugins.center.category.mcp': 'MCP',
  'plugins.center.category.integration': 'Integration',
  'plugins.center.category.skill': 'Skill',
  'plugins.center.category.dev': 'Developer',
  'plugins.center.stale': 'Data may be out of date',
  'plugins.center.updatedAt': 'Updated {{time}}',
  'plugins.center.empty': 'No plugins in the marketplace yet',
  'plugins.center.refresh': 'Refresh',
  'plugins.center.installedCount': '{{count}} installed',
  'plugins.marketplace.bundled': 'Built-in',
  'plugins.marketplace.installed': 'Installed',
  'plugins.marketplace.install': 'Install',
  'plugins.marketplace.enable': 'Enable',
  'plugins.marketplace.update': 'Update',
  'plugins.marketplace.open': 'Open',
  'plugins.marketplace.author': 'Author',
  'plugins.marketplace.permissions': '{{count}} permissions',
  'plugins.marketplace.featured': 'Featured',
  'plugins.marketplace.noMatches': 'No matching plugins',
  'plugins.empty.title': 'No plugins yet',
  'plugins.empty.description': 'No plugins installed yet. Browse the Marketplace or import a source to get started.',
  'plugins.empty.noMatches': 'No matching plugins',
  'plugins.empty.noMatchesHint': 'Try a different keyword or clear the filter to see all installed plugins.',
  'plugins.error': 'Failed to load plugins. Make sure the Cradle server is reachable and try again.',
  'plugins.toast.enabled': 'Plugin turned on',
  'plugins.toast.disabled': 'Plugin turned off',
  'plugins.toast.toggleFailed': 'Failed to update plugin',
  'nav.integrations': 'Integrations',
  'integrations.page.title': 'Integrations',
  'integrations.page.description': 'Connect external platforms and configure provider integrations.',
'integrations.categories.label': 'Categories',
'integrations.categories.description': 'Browse integration categories',
'integrations.categories.connections.title': 'Connections',
'integrations.categories.connections.description': 'Manage conversation bridge connections to external platforms like Slack.',
'integrations.categories.provider.title': 'Agent Capabilities',
'integrations.categories.provider.description': 'Manage how agents discover and use Cradle capabilities.',
'integrations.categories.provider.enabled': 'Enabled',
'integrations.overview.label': 'Overview',
'integrations.overview.adapters': 'Adapters',
'integrations.overview.connections': 'Connections',
  'integrations.tabs.connections': 'Connections',
  'integrations.tabs.slackSetup': 'Slack setup',
  'integrations.status.connected': '{{n}} connection',
  'integrations.status.connected_plural': '{{n}} connections',
  'integrations.status.error': '{{n}} error',
  'integrations.status.error_plural': '{{n}} errors',
  'integrations.status.none': 'No connections',
  'integrations.adapter.empty': 'No adapters available. Install plugins to add integration support.',
  'integrations.adapter.unavailable': 'unavailable',
  'integrations.adapter.unavailableHint': 'This adapter is not available. Check that the plugin is installed and enabled.',
  'integrations.adapter.connectionCount': '{{n}} connection',
  'integrations.adapter.connectionCount_plural': '{{n}} connections',
  'integrations.adapter.noConnections': 'no connections',
  'integrations.adapter.capabilities': 'Capabilities',
  'integrations.connection.empty': 'No connections yet. Create one to get started.',
  'integrations.connection.selectPlaceholder': 'Select a connection to view details',
  'integrations.connection.create': 'Create connection',
  'integrations.connection.displayName': 'Display name',
  'integrations.connection.displayNamePlaceholder': 'e.g., My Slack Workspace',
  'integrations.connection.enabled': 'Enable connection',
  'integrations.connection.enabledDescription': 'Start this connection automatically when the server starts.',
  'integrations.connection.platform': 'Platform',
  'integrations.connection.adapter': 'Adapter',
  'integrations.connection.save': 'Save connection',
  'integrations.connection.delete': 'Delete connection',
  'integrations.connection.start': 'Start',
  'integrations.connection.stop': 'Stop',
  'integrations.connection.restart': 'Restart',
  'integrations.connection.starting': 'Starting…',
  'integrations.connection.stopping': 'Stopping…',
  'integrations.connection.deleting': 'Deleting…',
  'integrations.connection.saving': 'Saving…',
  'integrations.connection.healthStatus': 'Health',
  'integrations.connection.healthUnknown': 'Unknown',
  'integrations.connection.healthStarting': 'Starting',
  'integrations.connection.healthRunning': 'Running',
  'integrations.connection.healthStopped': 'Stopped',
  'integrations.connection.healthError': 'Error',
  'integrations.connection.healthMessage': 'Health message',
  'integrations.connection.lastStartedAt': 'Last started',
  'integrations.connection.lastStoppedAt': 'Last stopped',
  'integrations.connection.lastErrorAt': 'Last error',
  'integrations.connection.createdAt': 'Created',
  'integrations.connection.updatedAt': 'Updated',
  'integrations.connection.toast.created': 'Connection created',
  'integrations.connection.toast.updated': 'Connection updated',
  'integrations.connection.toast.deleted': 'Connection deleted',
  'integrations.connection.toast.started': 'Connection started',
  'integrations.connection.toast.stopped': 'Connection stopped',
  'integrations.connection.toast.createFailed': 'Failed to create connection',
  'integrations.connection.toast.updateFailed': 'Failed to update connection',
  'integrations.connection.toast.deleteFailed': 'Failed to delete connection',
  'integrations.connection.toast.startFailed': 'Failed to start connection',
  'integrations.connection.toast.stopFailed': 'Failed to stop connection',
  'integrations.connection.deleteConfirmTitle': 'Delete connection?',
  'integrations.connection.deleteConfirmDescription': 'This will delete the connection "{{displayName}}" and stop it if it is running. Channel bindings will also be removed.',
  'integrations.connection.deleteConfirmCancel': 'Cancel',
  'integrations.connection.deleteConfirmAction': 'Delete',
  'integrations.slack.title': 'Slack configuration',
  'integrations.slack.description': 'Configure Slack bot credentials. Tokens are stored as secrets in the Cradle database.',
  'integrations.slack.botToken': 'Bot Token',
  'integrations.slack.botTokenPlaceholder': 'xoxb-...',
  'integrations.slack.botTokenDescription': 'Slack bot user token (starts with xoxb-).',
  'integrations.slack.appToken': 'App Token',
  'integrations.slack.appTokenPlaceholder': 'xapp-...',
  'integrations.slack.appTokenDescription': 'Slack app-level token for Socket Mode (starts with xapp-).',
  'integrations.slack.signingSecret': 'Signing Secret',
  'integrations.slack.signingSecretPlaceholder': 'Signing secret from Slack app settings',
  'integrations.slack.signingSecretDescription': 'Slack app signing secret for request verification.',
  'integrations.slack.logLevel': 'Log level',
  'integrations.slack.logLevelDebug': 'Debug',
  'integrations.slack.logLevelInfo': 'Info',
  'integrations.slack.logLevelWarn': 'Warn',
  'integrations.slack.logLevelError': 'Error',
  'integrations.slack.secret.selectExisting': 'Select existing secret',
  'integrations.slack.secret.createNew': 'Create new secret',
  'integrations.slack.secret.label': 'Secret label',
  'integrations.slack.secret.labelPlaceholder': 'e.g., Slack Bot Token (My Workspace)',
  'integrations.slackGuide.slackApp.title': 'Slack app configuration',
  'integrations.slackGuide.slackApp.description': 'Configure the Slack app first, then paste its credentials into Cradle.',
  'integrations.slackGuide.cradle.title': 'Cradle configuration',
  'integrations.slackGuide.cradle.description': 'After the Slack app is installed, create a Cradle connection and bind Slack channels to workspaces.',
  'integrations.slackGuide.step.createApp.title': 'Create a Slack app',
  'integrations.slackGuide.step.createApp.description': 'Create the app in Slack API, install it to the target workspace, and keep the Basic Information page open for the signing secret.',
  'integrations.slackGuide.step.socketMode.title': 'Enable Socket Mode',
  'integrations.slackGuide.step.socketMode.description': 'Turn on Socket Mode and create an app-level token with the connections:write scope. This token starts with xapp-.',
  'integrations.slackGuide.step.botScopes.title': 'Add bot token scopes',
  'integrations.slackGuide.step.botScopes.description': 'Add the bot scopes below, reinstall the Slack app, and copy the bot user token that starts with xoxb-.',
  'integrations.slackGuide.step.events.title': 'Subscribe to bot events',
  'integrations.slackGuide.step.events.description': 'Enable Event Subscriptions and subscribe the bot to app mentions plus public/private channel messages.',
  'integrations.slackGuide.step.slashCommand.title': 'Add the /cradle command',
  'integrations.slackGuide.step.slashCommand.description': 'Create a Slack slash command named /cradle. With Socket Mode enabled, Slack delivers the command through the app connection instead of the old standalone bridge.',
  'integrations.slackGuide.step.credentials.title': 'Create the Cradle connection',
  'integrations.slackGuide.step.credentials.description': 'In this Settings page, create a Slack connection with the bot token, app-level token, and signing secret stored as Cradle secrets.',
  'integrations.slackGuide.step.binding.title': 'Bind a Slack channel',
  'integrations.slackGuide.step.binding.description': 'Open the connection, add a channel binding, enter the Slack team ID and channel ID, choose a Cradle workspace, and choose the default runtime target for new Slack threads.',
  'integrations.slackGuide.step.invite.title': 'Invite and test the bot',
  'integrations.slackGuide.step.invite.description': 'Invite the bot to the Slack channel, mention it or run /cradle in a bound thread, and Cradle will create or continue the matching chat session.',
  'integrations.channelBindings.title': 'Channel bindings',
  'integrations.channelBindings.description': 'Map external channels to Cradle workspaces. Messages in bound channels create new chat sessions.',
  'integrations.channelBindings.empty': 'No channel bindings yet.',
  'integrations.channelBindings.add': 'Add binding',
  'integrations.channelBindings.externalWorkspaceId': 'External workspace ID',
  'integrations.channelBindings.externalWorkspaceIdPlaceholder': 'Slack workspace/team ID',
  'integrations.channelBindings.externalChannelId': 'External channel ID',
  'integrations.channelBindings.externalChannelIdPlaceholder': 'Slack channel ID',
  'integrations.channelBindings.cradleWorkspaceId': 'Cradle workspace',
  'integrations.channelBindings.cradleWorkspacePlaceholder': 'Select workspace',
  'integrations.channelBindings.sessionAgentId': 'Default agent',
  'integrations.channelBindings.sessionAgentPlaceholder': 'Optional: select default agent',
  'integrations.channelBindings.sessionProviderTargetId': 'Default provider',
  'integrations.channelBindings.sessionProviderPlaceholder': 'Optional: select default provider',
  'integrations.channelBindings.sessionRuntimeKind': 'Default runtime',
  'integrations.channelBindings.sessionRuntimePlaceholder': 'Optional: select default runtime',
  'integrations.channelBindings.sessionModelId': 'Default model',
  'integrations.channelBindings.sessionModelPlaceholder': 'Optional: select default model',
  'integrations.channelBindings.runtimeTarget': 'Default runtime target',
  'integrations.channelBindings.runtimeTargetPlaceholder': 'Select default agent or provider runtime',
  'integrations.channelBindings.runtimeTargetLoading': 'Loading runtime targets…',
  'integrations.channelBindings.runtimeTargetEmpty': 'No provider-backed agents or chat provider runtimes are available.',
  'integrations.channelBindings.runtimeTargetError': 'Failed to load runtime targets.',
  'integrations.channelBindings.runtimeTargetAgentPrefix': 'Agent:',
  'integrations.channelBindings.runtimeTargetProviderPrefix': 'Provider:',
  'integrations.channelBindings.remove': 'Remove binding',
  'integrations.channelBindings.save': 'Save binding',
  'integrations.channelBindings.toast.added': 'Channel binding added',
  'integrations.channelBindings.toast.removed': 'Channel binding removed',
  'integrations.channelBindings.toast.addFailed': 'Failed to add channel binding',
  'integrations.channelBindings.toast.removeFailed': 'Failed to remove channel binding',
  'integrations.threads.title': 'Recent threads',
  'integrations.threads.description': 'Recently created thread bindings for this connection.',
  'integrations.threads.empty': 'No threads yet.',
  'integrations.threads.externalThreadId': 'External thread ID',
  'integrations.threads.sessionId': 'Session ID',
  'integrations.delivery.title': 'Failed deliveries',
  'integrations.delivery.description': 'Assistant responses that failed to deliver. Retry to send them again.',
  'integrations.delivery.empty': 'No failed deliveries.',
  'integrations.delivery.retry': 'Retry failed deliveries',
  'integrations.delivery.retryAll': 'Retry all',
  'integrations.delivery.retrying': 'Retrying…',
  'integrations.delivery.toast.retried': 'Retried {{attempted}} deliveries: {{delivered}} succeeded, {{failed}} failed',
  'integrations.delivery.toast.retryFailed': 'Failed to retry deliveries',
  'integrations.delivery.status.pending': 'Pending',
  'integrations.delivery.status.delivered': 'Delivered',
  'integrations.delivery.status.failed': 'Failed',
  'integrations.delivery.attemptCount': 'Attempts',
  'integrations.delivery.errorText': 'Error',
  'integrations.delivery.createdAt': 'Created',
  'integrations.console.statusStrip.adapters': 'Adapters',
  'integrations.console.statusStrip.running': 'Running',
  'integrations.console.statusStrip.failed': 'Failed',
  'integrations.console.statusStrip.idle': 'No active connections',
  'integrations.console.statusStrip.errorHint': '{{n}} delivery failed to send — retry it from the connection.',
  'integrations.console.statusStrip.errorHint_plural': '{{n}} deliveries failed to send — retry them from the connection.',
  'integrations.console.providerSkills.hint': 'Allows agents to discover and use all Cradle capabilities, including enabled plugins and built-in skills.',
  'integrations.console.providerSkills.pathCodex': '~/.codex/skills/cradle',
  'integrations.console.providerSkills.pathClaude': '~/.claude/skills/cradle',
  'integrations.console.bridge.label': 'Conversation bridge',
  'integrations.console.bridge.description': 'Connections route external platform conversations into Cradle sessions.',
  'integrations.console.bridge.empty': 'No connections yet. Create one to bridge an external platform.',
  'integrations.console.bridge.new': 'New connection',
  'integrations.console.bridge.refresh': 'Refresh',
  'integrations.connection.back': 'Back to overview',
  'integrations.connection.new': 'New connection',
  'integrations.connection.refresh': 'Refresh',
  'integrations.connection.configTitle': 'Configuration',
  'integrations.connection.metadataTitle': 'Metadata',
  'integrations.connection.selectConnection': 'Select a connection',
  'integrations.connection.selectConnectionHint': 'Choose a connection from the list to view and manage its details.',
  'integrations.connection.retryFailed': 'Retry failed deliveries',
  'integrations.connection.edit': 'Edit',
  'integrations.secrets.title': 'Secrets',
  'integrations.secrets.description': 'Manage stored secrets for connections. Secrets are encrypted at rest.',
  'integrations.secrets.empty': 'No secrets yet.',
  'integrations.secrets.create': 'Create secret',
  'integrations.secrets.delete': 'Delete',
  'integrations.secrets.label': 'Label',
  'integrations.secrets.kind': 'Kind',
  'integrations.secrets.maskedSecret': 'Secret',
  'integrations.secrets.createdAt': 'Created',
  'integrations.secrets.toast.created': 'Secret created',
  'integrations.secrets.toast.deleted': 'Secret deleted',
  'integrations.secrets.toast.createFailed': 'Failed to create secret',
  'integrations.secrets.toast.deleteFailed': 'Failed to delete secret',
  'integrations.secrets.deleteConfirmTitle': 'Delete secret?',
  'integrations.secrets.deleteConfirmDescription': 'This will delete the secret "{{label}}". Connections using this secret may stop working.',
  'integrations.secrets.deleteConfirmCancel': 'Cancel',
  'integrations.secrets.deleteConfirmAction': 'Delete',
} as const
