@jingyi0605/codingns4dsh 0.2.2-beta.1 → 0.2.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +4 -4
- package/README.md +4 -4
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts.map +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts.map +1 -1
- package/data/build/dist/client/bundle.js +1720 -1933
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/cli-slots.d.ts.map +1 -1
- package/data/build/dist/client/cli-slots.js +24 -13
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.magpie-model-tag.js +4 -0
- package/data/build/dist/client/client.magpie-model-tag.js.map +1 -1
- package/data/build/dist/client/features/file-management.d.ts.map +1 -1
- package/data/build/dist/client/features/file-management.js +17 -2
- package/data/build/dist/client/features/file-management.js.map +1 -1
- package/data/build/dist/client/features/magpie-management-page.d.ts +17 -4
- package/data/build/dist/client/features/magpie-management-page.d.ts.map +1 -1
- package/data/build/dist/client/features/magpie-management-page.js +52 -16
- package/data/build/dist/client/features/magpie-management-page.js.map +1 -1
- package/data/build/dist/client/features/mobile-access-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access-panel.js +1 -11
- package/data/build/dist/client/features/mobile-access-panel.js.map +1 -1
- package/data/build/dist/client/features/mobile-access.d.ts +3 -6
- package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access.js +18 -47
- package/data/build/dist/client/features/mobile-access.js.map +1 -1
- package/data/build/dist/client/features/types.d.ts +3 -0
- package/data/build/dist/client/features/types.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.js +2 -0
- package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
- package/data/build/dist/client/file-management-context-menu.d.ts +10 -0
- package/data/build/dist/client/file-management-context-menu.d.ts.map +1 -0
- package/data/build/dist/client/file-management-context-menu.js +182 -0
- package/data/build/dist/client/file-management-context-menu.js.map +1 -0
- package/data/build/dist/client/file-management-dom.d.ts +2 -0
- package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
- package/data/build/dist/client/file-management-dom.js +10 -6
- package/data/build/dist/client/file-management-dom.js.map +1 -1
- package/data/build/dist/client/index.d.ts.map +1 -1
- package/data/build/dist/client/index.js +3 -0
- package/data/build/dist/client/index.js.map +1 -1
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +2 -0
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/magpie.d.ts.map +1 -1
- package/data/build/dist/client/locales/magpie.js +2 -0
- package/data/build/dist/client/locales/magpie.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +29 -11
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.d.ts +22 -0
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.js +33 -0
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +10 -1
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/llm-text-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/llm-text-adapter.js +1 -0
- package/data/build/dist/dsh-capabilities/host/llm-text-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.d.ts +1 -0
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.js +15 -7
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js +10 -1
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +10 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +1 -0
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +3 -0
- package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/types.js.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts +5 -0
- package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.js +54 -2
- package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +70 -3
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/magpie-usage.js +6 -2
- package/data/build/dist/host/cli-adapters/magpie-usage.js.map +1 -1
- package/data/build/dist/host/features/session-translation-recovery.js +2 -2
- package/data/build/dist/host/features/session-translation-recovery.js.map +1 -1
- package/data/build/dist/host/features/session-translation-service.d.ts +2 -2
- package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-service.js +11 -9
- package/data/build/dist/host/features/session-translation-service.js.map +1 -1
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +4 -1
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +5 -4
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/shared/contracts/config.d.ts +2 -2
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +5 -10
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +3 -3
- package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.js +2 -2
- package/data/build/dist/shared/contracts/version.js.map +1 -1
- package/package.json +34 -32
- package/profile/README.md +2 -2
- package/profile/package.json +2 -2
- package/profile/version.json +2 -2
- package/version.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.magpie-model-tag.js","names":["en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","zh","en","en","zh","en","zh","en","zh","en","zh","en","zh","gitDictionary.en","debugDictionary.en","peerHostDictionary.en","peerHostWorkspaceDictionary.en","usageDictionary.en","fileWorkspaceDictionary.en","terminalAuthDictionary.en","panelsDictionary.en","subagentCollapsedDictionary.en","quickAppsDictionary.en","cliManagementDictionary.en","magpieDictionary.en","pluginUpdateDictionary.en","credentialsDictionary.en","gitDictionary.zh","debugDictionary.zh","peerHostDictionary.zh","peerHostWorkspaceDictionary.zh","usageDictionary.zh","fileWorkspaceDictionary.zh","terminalAuthDictionary.zh","panelsDictionary.zh","subagentCollapsedDictionary.zh","quickAppsDictionary.zh","cliManagementDictionary.zh","magpieDictionary.zh","pluginUpdateDictionary.zh","credentialsDictionary.zh","useMemo","primitives","createElement","icons","value","createElement"],"sources":["../../../../src/shared/provider-icon-resources.ts","../../../../src/client/locales/debug.ts","../../../../src/client/locales/fileWorkspace.ts","../../../../src/client/locales/git.ts","../../../../src/client/locales/panels.ts","../../../../src/client/locales/peerHost.ts","../../../../src/client/locales/peerHostWorkspace.ts","../../../../src/client/locales/terminalAuth.ts","../../../../src/client/locales/usage.ts","../../../../src/client/locales/subagentCollapsed.ts","../../../../src/shared/quick-apps-bootstrap-locale.ts","../../../../src/client/locales/quickApps.ts","../../../../src/client/locales/cliManagement.ts","../../../../src/client/locales/magpie.ts","../../../../src/client/locales/pluginUpdate.ts","../../../../src/client/locales/credentials.ts","../../../../src/client/locale.ts","../../../../src/shared/cli-provider-route.ts","../../../../src/client/provider-icons.ts","../../../../src/shared/debug.ts","../../../../src/shared/contracts/transport.ts","../../../../src/shared/contracts/peer-host.ts","../../../../src/client/cli-catalog.ts","../../../../src/client/adapter-catalog-watch.ts","../../../../src/client/model-catalog-cache.ts","../../../../src/dsh-capabilities/client/primitives-adapter.ts","../../../../src/client/magpie-model-tag.ts"],"sourcesContent":["/** Client 与 Host 共用固定资源目录;避开 Desktop 将 /assets 固定映射到应用安装目录的路径。 */\nexport const PROVIDER_ICON_PATH = '/api/codingns/provider-icons/'\n\nexport const PROVIDER_ICON_FILES: Readonly<Record<string, string>> = {\n magpie: 'magpie.png',\n dsh: 'deepseek-harness.svg',\n 'command-code': 'command-code.svg',\n 'claude-code': 'claude-code.png',\n kimi: 'kimi.png',\n gemini: 'gemini.png',\n pi: 'pi.svg',\n codex: 'codex.png',\n opencode: 'opencode.png',\n grok: 'grok.png',\n mcode: 'minimax-code.svg',\n zcode: 'zcode.svg',\n r4: 'r4.svg',\n codebuddy: 'codebuddy.svg',\n workbuddy: 'workbuddy.svg',\n 'cursor-cli': 'cursor-cli.svg',\n 'kiro-cli': 'kiro-cli.svg',\n qoder: 'qoder.svg',\n 'qoder-cn': 'qoder-cn.svg',\n antigravity: 'antigravity.svg',\n doubao: 'doubao.png',\n}\n","/**\n * debug 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'debug.title': 'Debug',\n 'debug.guideDescription': 'Start workspace commands, check ports, and open services',\n 'debug.readingWorkspace': 'Reading workspace…',\n 'debug.eyebrow': 'Workspace tools',\n 'debug.heading': 'Workspace debugging',\n 'debug.profileCount': '{count} configurations',\n 'debug.addProfileAria': 'Add launch configuration',\n 'debug.addProfile': 'Add configuration',\n 'debug.emptyTitle': 'No launch configurations yet',\n 'debug.emptyText': 'Add a command for the current workspace to start a terminal, check its port, and open the service from here.',\n 'debug.addFirstProfile': 'Add the first configuration',\n 'debug.runningCount': '{count} running',\n 'debug.notRunning': 'Not running',\n 'debug.metaCwd': 'Directory',\n 'debug.metaPort': 'Port',\n 'debug.metaRuntime': 'Runtime',\n 'debug.proxyEnabled': 'Proxy enabled',\n 'debug.portUnknown': 'Port status not checked yet',\n 'debug.portListening': 'Port {port} is listening',\n 'debug.portListeningPid': 'Port {port} is listening · PID {pid}',\n 'debug.portStopped': 'Port {port} is not listening',\n 'debug.launch': 'Start',\n 'debug.checkPort': 'Check port',\n 'debug.killPortHint': 'Kill only the port listener and keep the terminal window',\n 'debug.killProcess': 'Kill process',\n 'debug.stopHint': 'Stop and close the terminal window',\n 'debug.stop': 'Stop',\n 'debug.edit': 'Edit',\n 'debug.delete': 'Delete',\n 'debug.enableProxy': 'Enable proxy',\n 'debug.openProxy': 'Open proxy',\n 'debug.proxyTurnOff': 'Turn off',\n 'debug.formAddTitle': 'Add quick launch item',\n 'debug.formEditTitle': 'Edit quick launch item',\n 'debug.formHint': 'Save a reusable set of launch arguments, then open the terminal with one click.',\n 'debug.closeFormAria': 'Close the quick launch form',\n 'debug.sectionLaunch': 'Launch entry',\n 'debug.sectionLaunchHint': 'Enter the full command, for example pnpm run dev --host 0.0.0.0.',\n 'debug.fieldName': 'Name',\n 'debug.fieldNamePlaceholder': 'For example: frontend development',\n 'debug.fieldCwd': 'Launch directory (path relative to the workspace)',\n 'debug.fieldCwdPlaceholder': 'Leave empty to use the root directory',\n 'debug.fieldCommand': 'Full launch command',\n 'debug.fieldCommandPlaceholder': 'For example: pnpm run dev --host 0.0.0.0',\n 'debug.sectionRuntime': 'Runtime environment (optional)',\n 'debug.sectionRuntimeHint': 'Only shells actually detected by the Host are shown.',\n 'debug.fieldShell': 'Terminal shell',\n 'debug.runtimeHint': 'The runtime is chosen automatically by the Host platform (effective capability: {runtime}).',\n 'debug.sectionPort': 'Service check',\n 'debug.sectionPortHint': 'The port is checked automatically every 5 seconds, or refresh it manually.',\n 'debug.fieldPort': 'Listening port (optional)',\n 'debug.fieldProxy': 'Reverse proxy',\n 'debug.proxyToggleLabel': 'Allow access to confirmed services',\n 'debug.proxyToggleAria': 'Enable service proxy',\n 'debug.close': 'Close',\n 'debug.saveAriaCreate': 'Save the configuration and create the quick launch item',\n 'debug.saveAriaUpdate': 'Save the quick launch item changes',\n 'debug.saving': 'Saving…',\n 'debug.saveAsQuickLaunch': 'Save as quick launch',\n 'debug.saveChanges': 'Save changes',\n 'debug.saved': 'Launch configuration saved',\n 'debug.updated': 'Launch configuration updated',\n 'debug.confirmDelete': 'Delete the launch configuration “{name}”?',\n 'debug.deleted': 'Launch configuration deleted',\n 'debug.confirmKillPort': 'Kill the process listening on port {port}?',\n 'debug.portKilled': 'The listening process was terminated',\n 'debug.proxyEnabledMessage': 'Proxy enabled: {url}',\n 'debug.shellSystemDefault': 'System default',\n 'debug.shellSystemDefaultAuto': 'System default (auto-select)',\n 'debug.runtimeMacosTmux': 'macOS with tmux',\n 'debug.runtimeLinuxTmux': 'Linux with tmux',\n 'debug.runtimeWindowsConpty': 'Windows with ConPTY',\n 'debug.runtimeLocalPty': 'local-pty (in-process PTY)',\n 'debug.runtimeWaiting': 'Waiting for Host terminal status',\n 'feature.debug.label': 'Workspace debugging',\n 'feature.debug.description': 'Launch terminals and check services',\n}\n\nexport const zh: Record<string, string> = {\n 'debug.title': '调试',\n 'debug.guideDescription': '启动工作区命令、检查端口并访问服务',\n 'debug.readingWorkspace': '正在读取工作区…',\n 'debug.eyebrow': '工作区工具',\n 'debug.heading': '工作区调试',\n 'debug.profileCount': '{count} 个配置',\n 'debug.addProfileAria': '添加启动配置',\n 'debug.addProfile': '添加配置',\n 'debug.emptyTitle': '还没有启动配置',\n 'debug.emptyText': '为当前 Workspace 添加一个命令,即可从这里启动终端、检查端口和访问服务。',\n 'debug.addFirstProfile': '添加第一个配置',\n 'debug.runningCount': '{count} 个运行中',\n 'debug.notRunning': '未运行',\n 'debug.metaCwd': '目录',\n 'debug.metaPort': '端口',\n 'debug.metaRuntime': '运行方式',\n 'debug.proxyEnabled': '代理已启用',\n 'debug.portUnknown': '端口状态尚未检查',\n 'debug.portListening': '端口 {port} 正在监听',\n 'debug.portListeningPid': '端口 {port} 正在监听 · PID {pid}',\n 'debug.portStopped': '端口 {port} 未监听',\n 'debug.launch': '启动',\n 'debug.checkPort': '检查端口',\n 'debug.killPortHint': '只结束端口监听进程,保留终端窗口',\n 'debug.killProcess': '结束进程',\n 'debug.stopHint': '停止并关闭终端窗口',\n 'debug.stop': '停止',\n 'debug.edit': '编辑',\n 'debug.delete': '删除',\n 'debug.enableProxy': '开启代理',\n 'debug.openProxy': '打开代理',\n 'debug.proxyTurnOff': '关闭',\n 'debug.formAddTitle': '添加快捷启动项',\n 'debug.formEditTitle': '编辑快捷启动项',\n 'debug.formHint': '保存一组可重复使用的启动参数,之后可以一键打开终端。',\n 'debug.closeFormAria': '关闭快捷启动项',\n 'debug.sectionLaunch': '启动入口',\n 'debug.sectionLaunchHint': '直接输入完整命令,例如 pnpm run dev --host 0.0.0.0。',\n 'debug.fieldName': '名称',\n 'debug.fieldNamePlaceholder': '例如:前端开发',\n 'debug.fieldCwd': '启动目录(Workspace 内相对路径)',\n 'debug.fieldCwdPlaceholder': '留空使用根目录',\n 'debug.fieldCommand': '完整启动命令',\n 'debug.fieldCommandPlaceholder': '例如:pnpm run dev --host 0.0.0.0',\n 'debug.sectionRuntime': '执行环境(可选)',\n 'debug.sectionRuntimeHint': '只显示 Host 实际检测到的 Shell。',\n 'debug.fieldShell': '终端 Shell',\n 'debug.runtimeHint': '运行方式由 Host 平台自动选择(实际能力:{runtime})。',\n 'debug.sectionPort': '服务检查',\n 'debug.sectionPortHint': '端口每 5 秒自动检查,也可手动刷新。',\n 'debug.fieldPort': '监听端口(可选)',\n 'debug.fieldProxy': '反向代理',\n 'debug.proxyToggleLabel': '允许访问已确认的服务',\n 'debug.proxyToggleAria': '启用服务代理',\n 'debug.close': '关闭',\n 'debug.saveAriaCreate': '保存配置并创建快捷启动项',\n 'debug.saveAriaUpdate': '保存快捷启动项修改',\n 'debug.saving': '保存中…',\n 'debug.saveAsQuickLaunch': '保存为快捷启动',\n 'debug.saveChanges': '保存修改',\n 'debug.saved': '启动配置已保存',\n 'debug.updated': '启动配置已更新',\n 'debug.confirmDelete': '确认删除“{name}”启动配置?',\n 'debug.deleted': '启动配置已删除',\n 'debug.confirmKillPort': '确认结束端口 {port} 的监听进程?',\n 'debug.portKilled': '监听进程已结束',\n 'debug.proxyEnabledMessage': '代理已开启:{url}',\n 'debug.shellSystemDefault': '系统默认',\n 'debug.shellSystemDefaultAuto': '系统默认(自动选择)',\n 'debug.runtimeMacosTmux': 'macOS 使用 tmux',\n 'debug.runtimeLinuxTmux': 'Linux 使用 tmux',\n 'debug.runtimeWindowsConpty': 'Windows 使用 ConPTY',\n 'debug.runtimeLocalPty': '使用 local-pty(进程内 PTY)',\n 'debug.runtimeWaiting': '等待 Host 终端能力状态',\n 'feature.debug.label': '工作区调试',\n 'feature.debug.description': '启动终端并检查服务',\n}\n","/**\n * fileWorkspace 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'htmlFiles.confirmConnect': 'Allow this HTML page to read, save, and delete files in these locations?\\n\\nPage: {path}\\n\\n{scopes}\\n\\nAccess lasts until this preview is closed or reloaded.',\n 'htmlFiles.cancelled': 'Workspace file connection cancelled.',\n 'fileMenu.expandFolder': 'Expand folder',\n 'fileMenu.openFile': 'Open file',\n 'fileMenu.download': 'Download file',\n 'fileMenu.newFile': 'New file',\n 'fileMenu.newDirectory': 'New folder',\n 'fileMenu.rename': 'Rename / move',\n 'fileMenu.copy': 'Copy',\n 'fileMenu.cut': 'Cut',\n 'fileMenu.paste': 'Paste',\n 'fileMenu.copyRelativePath': 'Copy relative path',\n 'fileMenu.copyAbsolutePath': 'Copy absolute path',\n 'fileMenu.gitIgnore': 'Add to Git exclude',\n 'fileMenu.delete': 'Delete',\n 'fileMenu.promptNewDirectory': 'Enter a new folder name or relative path',\n 'fileMenu.promptNewFile': 'Enter a new file name or relative path',\n 'fileMenu.promptRename': 'Enter a new file name or relative path',\n 'fileMenu.confirmDelete': 'Delete \"{name}\"?',\n 'fileMenu.copiedRelativePath': 'Relative path copied',\n 'fileMenu.copiedAbsolutePath': 'Absolute path copied',\n 'fileMenu.copyPathFailed': 'Unable to copy the path',\n 'fileMenu.operationDone': 'File operation completed',\n 'fileMenu.unresolvedPath': 'Unable to resolve the current file path',\n 'fileEditor.edit': 'Edit file',\n 'fileEditor.editorLabel': 'File content editor',\n 'fileEditor.save': 'Save file',\n 'fileEditor.cancel': 'Cancel editing',\n 'fileEditor.saved': 'File saved',\n 'sessionFiles.title': 'Changed files',\n 'sessionFiles.count': '{count} files',\n 'sessionFiles.refresh': 'Refresh',\n 'sessionFiles.close': 'Close diff',\n 'sessionFiles.loadingDiff': 'Reading diff…',\n 'sessionFiles.stageAll': 'Stage all',\n 'sessionFiles.loading': 'Reading session changes…',\n 'sessionFiles.empty': 'No changed files were detected in this session',\n 'sessionFiles.selectFile': 'Select a file to view its diff',\n 'sessionFiles.noDiff': 'No diff available for this file',\n 'sessionFiles.tabLabel': 'Changed files {count}',\n 'sessionFiles.stageDirectory': 'Stage folder',\n 'sessionFiles.unstage': 'Unstage',\n 'sessionFiles.stage': 'Add to staged changes',\n 'sessionFiles.discard': 'Discard changes',\n 'archive.title': 'Archived sessions',\n 'archive.entryCount': 'Archived sessions {count}',\n 'archive.close': 'Close',\n 'archive.searchPlaceholder': 'Search archived sessions',\n 'archive.empty': 'No archived sessions found.',\n 'archive.createdAt': 'Created: {time}',\n 'archive.archivedAt': 'Archived: {time}',\n 'archive.restore': 'Unarchive',\n 'archive.restoreUnsupportedTitle': 'This DSH version does not support unarchiving',\n 'archive.restoreUnsupported': 'Unarchive (not supported in this version)',\n 'archive.processing': 'Processing…',\n 'workspaceVisibility.hide': 'Hide workspace',\n 'workspaceVisibility.showHidden': 'Show hidden workspaces',\n 'workspaceVisibility.hiddenCount': 'Hidden workspaces {count}',\n 'workspaceVisibility.restore': 'Restore workspace {title}',\n 'mobileRail.openSidebar': 'Open sidebar',\n 'provider.unbound': 'No Agent bound',\n 'provider.doubao': 'Doubao App',\n 'provider.unknown': 'Unknown Agent ({adapterId})',\n 'toolStream.statusFailed': 'Failed',\n 'toolStream.statusCompleted': 'Completed',\n 'toolStream.statusRunning': 'Running',\n 'toolStream.missingMarker': 'External tool node is missing its start marker',\n 'pwaPrompt.install': 'Install to home screen',\n 'pwaPrompt.hint': 'After installing, open it straight from the home screen for a standalone window and more screen space.',\n 'pwaPrompt.dismiss': 'Not now',\n 'pwaPrompt.iosHint': 'Tap \"Share\" then \"Add to Home Screen\" to install.',\n}\n\nexport const zh: Record<string, string> = {\n 'htmlFiles.confirmConnect': '允许此 HTML 页面读取、保存和删除以下位置中的文件吗?\\n\\n页面:{path}\\n\\n{scopes}\\n\\n授权在关闭或重新加载预览后失效。',\n 'htmlFiles.cancelled': '已取消工作区文件连接。',\n 'fileMenu.expandFolder': '展开文件夹',\n 'fileMenu.openFile': '打开文件',\n 'fileMenu.download': '下载文件',\n 'fileMenu.newFile': '新建文件',\n 'fileMenu.newDirectory': '新建目录',\n 'fileMenu.rename': '重命名/移动',\n 'fileMenu.copy': '复制',\n 'fileMenu.cut': '剪切',\n 'fileMenu.paste': '粘贴',\n 'fileMenu.copyRelativePath': '复制相对路径',\n 'fileMenu.copyAbsolutePath': '复制绝对路径',\n 'fileMenu.gitIgnore': '添加到 Git 排除',\n 'fileMenu.delete': '删除',\n 'fileMenu.promptNewDirectory': '输入新目录名称或相对路径',\n 'fileMenu.promptNewFile': '输入新文件名称或相对路径',\n 'fileMenu.promptRename': '输入新的文件名或相对路径',\n 'fileMenu.confirmDelete': '确定删除“{name}”吗?',\n 'fileMenu.copiedRelativePath': '已复制相对路径',\n 'fileMenu.copiedAbsolutePath': '已复制绝对路径',\n 'fileMenu.copyPathFailed': '复制路径失败',\n 'fileMenu.operationDone': '文件操作已完成',\n 'fileMenu.unresolvedPath': '无法解析当前文件路径',\n 'fileEditor.edit': '编辑文件',\n 'fileEditor.editorLabel': '文件内容编辑器',\n 'fileEditor.save': '保存文件',\n 'fileEditor.cancel': '取消编辑',\n 'fileEditor.saved': '文件已保存',\n 'sessionFiles.title': '修改文件',\n 'sessionFiles.count': '{count} 个文件',\n 'sessionFiles.refresh': '刷新',\n 'sessionFiles.close': '关闭 Diff',\n 'sessionFiles.loadingDiff': '正在读取 Diff…',\n 'sessionFiles.stageAll': '全部暂存',\n 'sessionFiles.loading': '正在读取会话修改…',\n 'sessionFiles.empty': '本次会话没有已识别的修改文件',\n 'sessionFiles.selectFile': '选择文件查看 Diff',\n 'sessionFiles.noDiff': '当前文件没有可显示的 Diff',\n 'sessionFiles.tabLabel': '修改文件 {count}',\n 'sessionFiles.stageDirectory': '暂存目录',\n 'sessionFiles.unstage': '撤销暂存',\n 'sessionFiles.stage': '添加到暂存区',\n 'sessionFiles.discard': '撤销变更',\n 'archive.title': '已归档的会话',\n 'archive.entryCount': '已归档的会话 {count}',\n 'archive.close': '关闭',\n 'archive.searchPlaceholder': '搜索已归档会话',\n 'archive.empty': '没有找到归档会话。',\n 'archive.createdAt': '创建时间:{time}',\n 'archive.archivedAt': '归档时间:{time}',\n 'archive.restore': '取消归档',\n 'archive.restoreUnsupportedTitle': '当前 DSH 版本不支持取消归档',\n 'archive.restoreUnsupported': '取消归档(当前版本不支持)',\n 'archive.processing': '处理中…',\n 'workspaceVisibility.hide': '隐藏工作区',\n 'workspaceVisibility.showHidden': '显示隐藏的工作区',\n 'workspaceVisibility.hiddenCount': '隐藏的工作区 {count}',\n 'workspaceVisibility.restore': '恢复工作区 {title}',\n 'mobileRail.openSidebar': '打开侧边栏',\n 'provider.unbound': '未绑定 Agent',\n 'provider.doubao': '豆包 App',\n 'provider.unknown': '未知 Agent({adapterId})',\n 'toolStream.statusFailed': '失败',\n 'toolStream.statusCompleted': '已完成',\n 'toolStream.statusRunning': '运行中',\n 'toolStream.missingMarker': '外部工具节点缺少起始标记',\n 'pwaPrompt.install': '安装到主屏幕',\n 'pwaPrompt.hint': '安装后可从主屏幕直接打开,获得独立窗口与更完整的屏幕空间。',\n 'pwaPrompt.dismiss': '以后再说',\n 'pwaPrompt.iosHint': '点击「分享」→「添加到主屏幕」即可安装。',\n}\n","/**\n * git 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'feature.gitManagement.label': 'Git repository management',\n 'feature.gitManagement.description': 'View changes and manage commits',\n 'git.tabTitle': 'Git',\n 'git.guideDescription': 'View changes, commits, and version history',\n 'git.panelLabel': 'Git repository management',\n 'git.opFetch': 'Fetch',\n 'git.opPull': 'Pull',\n 'git.opPush': 'Push',\n 'git.opUndo': 'Undo commit',\n 'git.refresh': 'Refresh',\n 'git.operationRunning': '{operation} in progress…',\n 'git.operationInProgress': '{operation} in progress…',\n 'git.operationDone': '{operation} completed',\n 'git.operationCompleted': 'Operation completed',\n 'git.noWorkspace': 'No workspace is currently available',\n 'git.commitMessageRequired': 'Enter a commit message',\n 'git.commitHashCopied': 'Git version hash copied',\n 'git.commitMessageCopied': 'Commit message copied',\n 'git.copyUnsupported': 'Copying is not supported in this environment',\n 'git.readingCommitDiff': 'Reading commit diff…',\n 'git.readingFileDiff': 'Reading file diff…',\n 'git.viewSwitcherLabel': 'Switch between files and version views',\n 'git.switchToFiles': 'Files',\n 'git.switchToHistory': 'Versions',\n 'git.readingStatus': 'Reading Git status…',\n 'git.noRepository': 'This directory is not a Git repository yet',\n 'git.initHint': 'Initialize it to view changes, commits, and version history.',\n 'git.init': 'Initialize Git',\n 'git.summary': '{staged} staged · {unstaged} unstaged · {total} commits ({scope})',\n 'git.commitChanges': 'Commit changes',\n 'git.stagingEmpty': 'Staging area is empty',\n 'git.stagedCount': '{count} staged',\n 'git.commitPlaceholder': 'Type a commit message here',\n 'git.generatingMessage': 'Generating commit message…',\n 'git.generationEnabled': 'Generate commit messages',\n 'git.generationEnabledHelp': 'Show the Generate button in the Git panel to draft a message from staged changes.',\n 'git.messageDetail': 'Commit message level',\n 'git.messageConcise': 'Concise — subject only',\n 'git.messageDetailed': 'Detailed — subject and change summary',\n 'git.messageModels': 'Commit message models',\n 'git.messageModelsPicker': 'Add commit message models',\n 'git.messageModelsHelp': 'Drag to set priority; models are tried in order. An empty pool follows the default DSH model. If generation fails, your existing draft is kept.',\n 'git.settingsSaved': 'Git settings saved',\n 'git.messagePrompt': 'Git commit rule prompt',\n 'git.messagePromptHelp': 'Custom rules for commit-message language, style, and conventions. Leave blank to use defaults; the selected detail level still applies.',\n 'git.messagePromptPlaceholder': 'For example: Use Conventional Commits, include a scope, and write in English.',\n 'git.messagePromptSave': 'Save commit rules',\n 'git.messagePromptSaving': 'Saving commit rules…',\n 'git.draftMessage': 'Generate commit message',\n 'git.commit': 'Commit',\n 'git.stagedFiles': 'Staged files',\n 'git.unstagedFiles': 'Unstaged files',\n 'git.unstageDirectory': 'Unstage directory',\n 'git.stageDirectory': 'Add directory to staging',\n 'git.discardDirectory': 'Discard directory changes',\n 'git.unstageFile': 'Unstage',\n 'git.stageFile': 'Add to staging',\n 'git.discardFile': 'Discard changes',\n 'git.unstageAll': 'Unstage all',\n 'git.addAllToStaging': 'Add all to staging',\n 'git.stageAll': 'Stage all',\n 'git.discardAllChanges': 'Discard all changes',\n 'git.pullRunning': '⟳ Pull in progress…',\n 'git.pushRunning': '⟳ Push in progress…',\n 'git.viewAllVersions': 'View all versions',\n 'git.loadMoreVersions': 'Show more versions (100 each)',\n 'git.undoLastCommit': 'Undo last commit',\n 'git.operationsMenu': 'Git operations menu',\n 'git.commitDiff': 'Commit Diff',\n 'git.commitDiffTitle': 'Commit Diff · {hash}',\n 'git.closeDiff': 'Close Diff',\n 'git.changedFiles': 'Changed files',\n 'git.noFileChanges': 'No file changes detected.',\n 'git.originalPath': 'Original path: {path}',\n 'git.binary': 'Binary',\n 'git.truncated': 'Content truncated',\n 'git.noTextDiff': 'No text diff to display.',\n 'git.fileDiff': 'File Diff',\n 'git.fileDiffTitle': 'File Diff · {path}',\n 'git.staged': 'Staged',\n 'git.unstaged': 'Unstaged',\n 'git.stagedDiffHead': 'Staged diff (against HEAD)',\n 'git.worktreeDiff': 'Working tree diff',\n 'git.binaryFile': 'Binary file',\n 'git.statusAdded': 'Added',\n 'git.statusDeleted': 'Deleted',\n 'git.statusRenamed': 'Renamed',\n 'git.statusCopied': 'Copied',\n 'git.statusModified': 'Modified',\n 'git.graphLegend': 'Commit graph: solid colored lines are lanes (branch topology); blue dashed lines are commits not yet pushed to a remote. Hover a node to see the origin and branches of that commit.',\n 'git.versionCount': 'Git versions ({count})',\n 'git.scopeHint': 'Version scope: list only the current branch, or list all local and remote-tracking branches',\n 'git.scopeLabel': 'Version scope',\n 'git.currentBranch': 'Current branch',\n 'git.allBranches': 'All branches',\n 'git.switchBranch': 'Switch branch',\n 'git.noCommits': 'No commits yet',\n 'git.loading': 'Loading…',\n 'git.authorSuffix': '{date} · Author {author}',\n 'git.versionMenu': 'Version actions menu',\n 'git.viewChangesAndDiff': 'View changed files and diff',\n 'git.copyCommitHash': 'Copy Commit Hash',\n 'git.copyCommitMessage': 'Copy commit message',\n 'git.copyVersionHash': 'Copy Git version hash',\n 'git.remoteBranch': 'Remote branch',\n 'git.tag': 'Tag',\n 'git.localBranch': 'Local branch',\n 'git.refTitle': '{kind}: {name}',\n 'git.originLocalWithRemote': 'Local commit: only on a local branch and not yet pushed to a remote (blue dashed line)',\n 'git.originLocalOnly': 'Local commit: only on a local branch (this repository has no remote, blue dashed line)',\n 'git.originSynced': 'Synced: both the current branch and the remote-tracking branch contain this commit (solid colored line)',\n 'git.originRemote': 'Remote commit: only the remote-tracking branch contains it, not local yet (try Fetch/Pull first)',\n 'git.originOtherBranch': 'Other branch: only another local branch contains it; neither the current branch nor the remote has it (blue dashed line)',\n 'git.originUnknown': 'Origin unknown: the Host did not return the commit origin (colored by lane)',\n 'git.branchesAndTags': 'Branches and tags: {refs}',\n 'git.refSeparator': '; ',\n 'git.author': 'Author: {name}',\n 'git.unknownDate': 'Unknown date',\n 'git.unknownTime': 'Unknown time',\n 'git.dateLabel': '{month}/{day}',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.gitManagement.label': 'Git 仓库管理',\n 'feature.gitManagement.description': '查看改动并管理提交',\n 'git.tabTitle': 'Git',\n 'git.guideDescription': '查看改动、提交和版本历史',\n 'git.panelLabel': 'Git 仓库管理',\n 'git.opFetch': 'Fetch',\n 'git.opPull': 'Pull',\n 'git.opPush': 'Push',\n 'git.opUndo': '撤销提交',\n 'git.refresh': '刷新',\n 'git.operationRunning': '正在{operation}…',\n 'git.operationInProgress': '{operation}进行中…',\n 'git.operationDone': '{operation}已完成',\n 'git.operationCompleted': '操作已完成',\n 'git.noWorkspace': '当前没有可用的工作区',\n 'git.commitMessageRequired': '请输入提交说明',\n 'git.commitHashCopied': 'Git 版本号已复制',\n 'git.commitMessageCopied': '提交信息已复制',\n 'git.copyUnsupported': '当前环境不支持复制',\n 'git.readingCommitDiff': '正在读取提交 Diff…',\n 'git.readingFileDiff': '正在读取文件 Diff…',\n 'git.viewSwitcherLabel': '切换文件与版本视图',\n 'git.switchToFiles': '切换文件',\n 'git.switchToHistory': '切换版本',\n 'git.readingStatus': '正在读取 Git 状态…',\n 'git.noRepository': '当前目录还没有 Git 仓库',\n 'git.initHint': '初始化后即可查看改动、提交和版本历史。',\n 'git.init': '初始化 Git',\n 'git.summary': '{staged} 个已暂存 · {unstaged} 个未暂存 · {total} 条提交({scope})',\n 'git.commitChanges': '提交更改',\n 'git.stagingEmpty': '暂存区为空',\n 'git.stagedCount': '{count} 个已暂存',\n 'git.commitPlaceholder': '在这里输入提交信息',\n 'git.generatingMessage': '正在生成提交信息…',\n 'git.generationEnabled': '生成 Git 提交信息',\n 'git.generationEnabledHelp': '在 Git 面板显示生成按钮,根据已暂存的改动起草提交信息。',\n 'git.messageDetail': '提交信息级别',\n 'git.messageConcise': '简洁 — 仅标题',\n 'git.messageDetailed': '详细 — 标题与变更摘要',\n 'git.messageModels': '提交信息模型',\n 'git.messageModelsPicker': '添加提交信息模型',\n 'git.messageModelsHelp': '拖拽调整优先级,按顺序尝试模型;模型池为空时跟随 DSH 默认模型。生成失败时保留已有草稿。',\n 'git.settingsSaved': 'Git 设置已保存',\n 'git.messagePrompt': 'Git 提交规则提示词',\n 'git.messagePromptHelp': '自定义提交信息的语言、风格和格式规范。留空时使用默认规则;简洁或详细级别仍然生效。',\n 'git.messagePromptPlaceholder': '例如:使用 Conventional Commits 格式,包含 scope,并使用英文编写。',\n 'git.messagePromptSave': '保存提交规则',\n 'git.messagePromptSaving': '正在保存提交规则…',\n 'git.draftMessage': '生成提交信息',\n 'git.commit': '提交',\n 'git.stagedFiles': '暂存文件',\n 'git.unstagedFiles': '未提交文件',\n 'git.unstageDirectory': '撤销目录暂存',\n 'git.stageDirectory': '将目录添加到暂存区',\n 'git.discardDirectory': '撤销目录变更',\n 'git.unstageFile': '撤销暂存',\n 'git.stageFile': '添加到暂存区',\n 'git.discardFile': '撤销变更',\n 'git.unstageAll': '取消全部暂存',\n 'git.addAllToStaging': '全部添加到暂存区',\n 'git.stageAll': '暂存全部',\n 'git.discardAllChanges': '放弃全部改动',\n 'git.pullRunning': '⟳ Pull 进行中…',\n 'git.pushRunning': '⟳ Push 进行中…',\n 'git.viewAllVersions': '查看所有版本',\n 'git.loadMoreVersions': '查看更多版本(每次 100 条)',\n 'git.undoLastCommit': '撤销上次提交',\n 'git.operationsMenu': 'Git 操作菜单',\n 'git.commitDiff': '提交 Diff',\n 'git.commitDiffTitle': '提交 Diff · {hash}',\n 'git.closeDiff': '关闭 Diff',\n 'git.changedFiles': '变更文件',\n 'git.noFileChanges': '没有检测到文件变更。',\n 'git.originalPath': '原路径:{path}',\n 'git.binary': '二进制',\n 'git.truncated': '内容已截断',\n 'git.noTextDiff': '当前没有可显示的文本差异。',\n 'git.fileDiff': '文件 Diff',\n 'git.fileDiffTitle': '文件 Diff · {path}',\n 'git.staged': '已暂存',\n 'git.unstaged': '未暂存',\n 'git.stagedDiffHead': '暂存区 Diff(相对 HEAD)',\n 'git.worktreeDiff': '工作区 Diff',\n 'git.binaryFile': '二进制文件',\n 'git.statusAdded': '新增',\n 'git.statusDeleted': '删除',\n 'git.statusRenamed': '重命名',\n 'git.statusCopied': '复制',\n 'git.statusModified': '修改',\n 'git.graphLegend': '提交图:彩色实线=泳道(分支拓扑),蓝色虚线=尚未推送到远程的提交;鼠标悬浮节点可看该提交的归属与分支',\n 'git.versionCount': 'Git 版本 ({count})',\n 'git.scopeHint': '版本范围:只列当前分支,或列出全部本地分支与远程跟踪分支',\n 'git.scopeLabel': '版本范围',\n 'git.currentBranch': '当前分支',\n 'git.allBranches': '全部分支',\n 'git.switchBranch': '切换分支',\n 'git.noCommits': '暂无提交',\n 'git.loading': '正在加载…',\n 'git.authorSuffix': '{date} · 作者 {author}',\n 'git.versionMenu': '版本操作菜单',\n 'git.viewChangesAndDiff': '查看更改文件与 Diff',\n 'git.copyCommitHash': '复制 Commit Hash',\n 'git.copyCommitMessage': '复制提交信息',\n 'git.copyVersionHash': '复制 Git 版本号',\n 'git.remoteBranch': '远程分支',\n 'git.tag': '标签',\n 'git.localBranch': '本地分支',\n 'git.refTitle': '{kind}:{name}',\n 'git.originLocalWithRemote': '本地提交:只在本地分支上,尚未推送到远程(蓝色虚线)',\n 'git.originLocalOnly': '本地提交:只在本地分支上(当前仓库没有远程,蓝色虚线)',\n 'git.originSynced': '已同步:当前分支与远程跟踪分支都包含该提交(彩色实线)',\n 'git.originRemote': '远程提交:只有远程跟踪分支包含该提交,本地还没有(可先 Fetch/Pull)',\n 'git.originOtherBranch': '其他分支:只有其他本地分支包含该提交,当前分支与远程都没有(蓝色虚线)',\n 'git.originUnknown': '归属未知:Host 未返回提交归属(按泳道配色)',\n 'git.branchesAndTags': '分支与标签:{refs}',\n 'git.refSeparator': ';',\n 'git.author': '作者:{name}',\n 'git.unknownDate': '未知日期',\n 'git.unknownTime': '未知时间',\n 'git.dateLabel': '{month}月{day}日',\n}\n","/**\n * panels 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'common.listSeparator': ', ',\n 'settings.unknownVersion': 'Unknown version',\n 'settings.maintenanceDisabled': 'This module is disabled by maintenance policy; the setting will not start it.',\n 'cli.thinkingLevelTitle': 'Thinking level ({model})',\n 'cli.adapterEnabled': '{name} enabled',\n 'cli.adapterDisabled': '{name} disabled',\n 'cli.translationConversation': 'Translate conversation',\n 'cli.translationConversationToggle': 'Toggle conversation translation',\n 'cli.translationSettings': 'Conversation translation settings',\n 'cli.translationSettingsClose': 'Close',\n 'cli.translationSettingsDescription': 'Choose which messages to translate for {agent}. These options are saved separately for each agent and apply to its conversations with translation enabled.',\n 'cli.translationUserMessages': 'Translate user messages',\n 'cli.translationThinkingMessages': 'Translate AI thinking messages',\n 'cli.translationAssistantMessages': 'Translate AI final messages',\n 'lan.fieldListenPort': 'listen port',\n 'lan.fieldDshPort': 'DSH local port',\n 'lan.fieldMustBeNumber': '{field} must be a number',\n 'lan.fieldMustBeInteger': '{field} must be an integer from {minimum} to 65535',\n 'workspace.sessionSettingsSaved': 'Workspace session settings saved',\n 'feature.sessionTranslation.label': 'Session translation',\n 'feature.sessionTranslation.description': 'Translate selected external Agent requests and replies while keeping tools, commands, paths, and original history unchanged. Control DSH native session translation using the switch in the conversation model selector.',\n 'translation.inputTitle': 'Translate requests before sending',\n 'translation.inputLanguage': 'Request language',\n 'translation.outputTitle': 'Translate the AI’s reasoning and final messages into the language specified below',\n 'translation.outputLanguage': 'Reply language',\n 'translation.modelTitle': 'Translation model pool',\n 'translation.rulesTitle': 'Translation rules',\n 'translation.rulesHelp': 'Rules apply to input, reasoning, and replies, including text already in the target language. They take priority over the default translation prompts.',\n 'translation.rulesEmpty': 'No custom rules. The default translation prompts apply.',\n 'translation.ruleAdd': 'Add rule',\n 'translation.ruleEdit': 'Edit rule {number}',\n 'translation.ruleRemove': 'Remove rule {number}',\n 'translation.ruleText': 'Rule instructions',\n 'translation.rulePlaceholder': 'For example: Keep product names in their original language.',\n 'translation.ruleSave': 'Save rule',\n 'translation.ruleSaving': 'Saving…',\n 'translation.ruleCancel': 'Cancel',\n 'translation.modelFollowDefault': 'Use the default DSH model',\n 'translation.modelResetTitle': 'Use the default DSH model?',\n 'translation.modelResetHelp': 'This will clear all {count} models and their priority order from the pool, then follow the default DSH model. Continue?',\n 'translation.modelResetConfirm': 'Clear pool and use default',\n 'translation.modelUnavailable': 'Saved model is unavailable',\n 'translation.modelLoading': 'Loading available DSH models…',\n 'translation.modelEmpty': 'No DSH text models are available.',\n 'translation.modelHelp': 'Drag to set priority; the first model is tried first. If all models fail, the original text is kept.',\n 'translation.modelDefaultActive': 'No models selected; using the default DSH model.',\n 'translation.modelPriority': 'Priority {priority}',\n 'translation.modelPoolCount': '{count} models · ordered by priority',\n 'translation.modelPoolEmpty': 'Add models to set up automatic fallback.',\n 'translation.modelAdd': 'Add models',\n 'translation.modelRemove': 'Remove {model}',\n 'translation.modelDrag': 'Reorder {model}',\n 'translation.modelDragHelp': 'Drag to reorder, or use the Up and Down arrow keys.',\n 'translation.modelReordered': '{model} moved to priority {priority}',\n 'translation.modelPickerTitle': 'Add translation models',\n 'translation.modelPickerHelp': 'Select models to add to the end of the pool. Drag them to adjust priority after adding.',\n 'translation.modelSearch': 'Search models or providers',\n 'translation.modelPickerCount': '{count} selected',\n 'translation.modelAddSelected': 'Add selected ({count})',\n 'translation.modelCancel': 'Cancel',\n 'translation.modelNoMatches': 'No matching models.',\n 'translation.modelAllAdded': 'All available models are already in the pool.',\n 'translation.detailsTitle': 'Translation details',\n 'translation.viewDetails': 'View translation details',\n 'translation.statusTranslated': 'Translated',\n 'translation.statusTranslating': 'Translating…',\n 'translation.progressHelp': 'Preparing and translating your message. The translation result will be available when this finishes.',\n 'translation.statusFailed': 'Translation failed; original kept',\n 'translation.failure.timeout': 'The translation request timed out.',\n 'translation.failure.cancelled': 'The translation request was cancelled.',\n 'translation.failure.rate-limit': 'The translation provider rate limit was reached.',\n 'translation.failure.network': 'A network error interrupted the translation request.',\n 'translation.failure.unavailable': 'The translation provider was temporarily unavailable.',\n 'translation.failure.invalid-response': 'The translation response failed format, language, completion, or protected-text validation.',\n 'translation.failure.configuration': 'The translation model or provider configuration was rejected or unavailable.',\n 'translation.failure.provider': 'The translation provider or runtime reported an unclassified error.',\n 'translation.failure.unknown': 'No failure details were saved for this translation.',\n 'translation.retry': 'Retry translation',\n 'translation.sendDirectly': 'Send directly',\n 'translation.cancelSending': 'Cancel sending',\n 'translation.inputFailedTitle': 'Message translation failed',\n 'translation.inputFailedHelp': 'Your message has not been sent. Choose how to continue.',\n 'translation.decisionFailed': 'Could not apply your choice. Please try again.',\n 'translation.statusNotNeeded': 'Already in the target language; translation skipped',\n 'translation.detectedLanguage': 'Detected language',\n 'translation.modelNotUsed': 'Not used; translation was unnecessary',\n 'translation.originalText': 'Original text',\n 'translation.translatedText': 'Translation',\n 'translation.actualSentText': 'Actual sent text:',\n 'translation.modelUsed': 'Model used',\n 'translation.modelUnknown': 'Model information unavailable',\n 'translation.modelOfficial': 'DeepSeek official',\n 'translation.modelThirdParty': 'Third-party',\n 'translation.saveRejected': 'The translation settings could not be saved.',\n 'translation.saved': 'Translation settings saved',\n 'translation.language.zh': '简体中文', 'translation.language.en': 'English', 'translation.language.fr': 'Français', 'translation.language.de': 'Deutsch', 'translation.language.ja': '日本語',\n 'translation.adapter.claude': 'Claude Code', 'translation.adapter.codex': 'Codex', 'translation.adapter.pi': 'Pi', 'translation.adapter.opencode': 'OpenCode', 'translation.adapter.antigravity': 'Antigravity', 'translation.adapter.grok': 'Grok', 'translation.adapter.cursor': 'Cursor', 'translation.adapter.kiro': 'Kiro',\n}\n\nexport const zh: Record<string, string> = {\n 'common.listSeparator': '、',\n 'settings.unknownVersion': '未知版本',\n 'settings.maintenanceDisabled': '该模块当前由维护策略停用,设置不会启动它。',\n 'cli.thinkingLevelTitle': '思考等级({model})',\n 'cli.adapterEnabled': '已启用 {name}',\n 'cli.adapterDisabled': '已停用 {name}',\n 'cli.translationConversation': '翻译对话',\n 'cli.translationConversationToggle': '切换对话翻译',\n 'cli.translationSettings': '对话翻译设置',\n 'cli.translationSettingsClose': '关闭',\n 'cli.translationSettingsDescription': '选择 {agent} 需要翻译的消息类型。选项按 Agent 独立保存,应用于该 Agent 已开启对话翻译的会话。',\n 'cli.translationUserMessages': '翻译用户消息',\n 'cli.translationThinkingMessages': '翻译 AI 思考消息',\n 'cli.translationAssistantMessages': '翻译 AI 正式消息',\n 'lan.fieldListenPort': '监听端口',\n 'lan.fieldDshPort': 'DSH 本地端口',\n 'lan.fieldMustBeNumber': '{field} 必须是数字',\n 'lan.fieldMustBeInteger': '{field} 必须是 {minimum} 到 65535 的整数',\n 'workspace.sessionSettingsSaved': '工作区会话设置已保存',\n 'feature.sessionTranslation.label': '会话翻译',\n 'feature.sessionTranslation.description': '为选定的外部 Agent 翻译请求和回复,同时保留工具、命令、路径与原始历史;DSH 原生会话翻译由对话框模型选择器中的会话翻译开关控制。',\n 'translation.inputTitle': '发送前翻译请求',\n 'translation.inputLanguage': '请求目标语言',\n 'translation.outputTitle': 'AI的思考内容和正式消息翻译为以下指定语言',\n 'translation.outputLanguage': '回复语言',\n 'translation.modelTitle': '翻译模型池',\n 'translation.rulesTitle': '翻译规则',\n 'translation.rulesHelp': '规则适用于输入、思考和回复,包括已经是目标语言的文本。规则的优先级高于默认翻译提示词。',\n 'translation.rulesEmpty': '尚未添加自定义规则,使用默认翻译提示词。',\n 'translation.ruleAdd': '添加规则',\n 'translation.ruleEdit': '编辑规则 {number}',\n 'translation.ruleRemove': '移除规则 {number}',\n 'translation.ruleText': '规则内容',\n 'translation.rulePlaceholder': '例如:产品名称保留原文,不进行翻译。',\n 'translation.ruleSave': '保存规则',\n 'translation.ruleSaving': '正在保存…',\n 'translation.ruleCancel': '取消',\n 'translation.modelFollowDefault': '跟随 DSH 默认模型',\n 'translation.modelResetTitle': '确认跟随 DSH 默认模型?',\n 'translation.modelResetHelp': '这将清空模型池中的全部 {count} 个模型及其优先级顺序,并改为跟随 DSH 默认模型。是否继续?',\n 'translation.modelResetConfirm': '清空并跟随默认模型',\n 'translation.modelUnavailable': '已保存的模型当前不可用',\n 'translation.modelLoading': '正在加载可用的 DSH 模型…',\n 'translation.modelEmpty': '当前没有可用的 DSH 文本模型。',\n 'translation.modelHelp': '拖拽调整优先级,优先使用列表首个模型;全部失败时保留原文。',\n 'translation.modelDefaultActive': '未选择模型,当前跟随 DSH 默认模型。',\n 'translation.modelPriority': '优先级 {priority}',\n 'translation.modelPoolCount': '{count} 个模型 · 按优先级排列',\n 'translation.modelPoolEmpty': '添加模型,配置自动回退顺序。',\n 'translation.modelAdd': '添加模型',\n 'translation.modelRemove': '移除 {model}',\n 'translation.modelDrag': '调整 {model} 的顺序',\n 'translation.modelDragHelp': '拖拽调整顺序,也可使用上下方向键。',\n 'translation.modelReordered': '{model} 已移至优先级 {priority}',\n 'translation.modelPickerTitle': '添加翻译模型',\n 'translation.modelPickerHelp': '选择模型后添加到模型池末尾,添加后可拖拽调整优先级。',\n 'translation.modelSearch': '搜索模型或供应商',\n 'translation.modelPickerCount': '已选择 {count} 个',\n 'translation.modelAddSelected': '添加所选({count})',\n 'translation.modelCancel': '取消',\n 'translation.modelNoMatches': '没有匹配的模型。',\n 'translation.modelAllAdded': '所有可用模型均已添加到模型池。',\n 'translation.detailsTitle': '翻译详情',\n 'translation.viewDetails': '查看翻译详情',\n 'translation.statusTranslated': '已翻译',\n 'translation.statusTranslating': '正在翻译…',\n 'translation.progressHelp': '正在准备并翻译消息,完成后可查看翻译结果。',\n 'translation.statusFailed': '翻译失败,已保留原文',\n 'translation.failure.timeout': '翻译请求超时。',\n 'translation.failure.cancelled': '翻译请求已取消。',\n 'translation.failure.rate-limit': '翻译服务商的请求频率已达上限。',\n 'translation.failure.network': '网络错误中断了翻译请求。',\n 'translation.failure.unavailable': '翻译服务商暂时不可用。',\n 'translation.failure.invalid-response': '翻译结果未通过格式、语言、完整性或受保护文本校验。',\n 'translation.failure.configuration': '翻译模型或服务商配置被拒绝或不可用。',\n 'translation.failure.provider': '翻译服务商或运行时返回了未分类错误。',\n 'translation.failure.unknown': '此翻译未保存失败详情。',\n 'translation.retry': '重试翻译',\n 'translation.sendDirectly': '直接发送',\n 'translation.cancelSending': '取消发送',\n 'translation.inputFailedTitle': '消息翻译失败',\n 'translation.inputFailedHelp': '消息尚未发送,请选择如何继续。',\n 'translation.decisionFailed': '未能应用你的选择,请重试。',\n 'translation.statusNotNeeded': '原文已是目标语言,无需翻译',\n 'translation.detectedLanguage': '检测到的语言',\n 'translation.modelNotUsed': '未调用,原文无需翻译',\n 'translation.originalText': '原文',\n 'translation.translatedText': '译文',\n 'translation.actualSentText': '实际发送文本:',\n 'translation.modelUsed': '翻译模型',\n 'translation.modelUnknown': '暂无模型信息',\n 'translation.modelOfficial': 'DeepSeek 官方',\n 'translation.modelThirdParty': '第三方',\n 'translation.saveRejected': '会话翻译设置未能保存。',\n 'translation.saved': '会话翻译设置已保存',\n 'translation.language.zh': '简体中文', 'translation.language.en': '英语', 'translation.language.fr': '法语', 'translation.language.de': '德语', 'translation.language.ja': '日语',\n 'translation.adapter.claude': 'Claude Code', 'translation.adapter.codex': 'Codex', 'translation.adapter.pi': 'Pi', 'translation.adapter.opencode': 'OpenCode', 'translation.adapter.antigravity': 'Antigravity', 'translation.adapter.grok': 'Grok', 'translation.adapter.cursor': 'Cursor', 'translation.adapter.kiro': 'Kiro',\n}\n","/**\n * peerHost 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'feature.peerHost.label': 'Manage other DSH Hosts',\n 'feature.peerHost.description': 'Aggregate sessions from multiple Hosts',\n 'peerHost.panelTitle': 'Manage other DSH Hosts',\n 'peerHost.panelSubtitle': 'Connect to and manage other registered work hosts',\n 'peerHost.closePanel': 'Close PeerHost management',\n 'peerHost.close': 'Close',\n 'peerHost.addHost': 'Add Host',\n 'peerHost.registeredHosts': 'Registered Hosts',\n 'peerHost.listHint': 'Manage connections, resources, and access status',\n 'peerHost.closeDialogTitle': 'Close {title}',\n 'peerHost.nameOptional': 'Name (optional)',\n 'peerHost.hostUrl': 'Host URL',\n 'peerHost.targetUsername': 'Target Host username',\n 'peerHost.targetPassword': 'Target Host password',\n 'peerHost.identifyingAccount': 'Identifying the current account…',\n 'peerHost.loginNote': 'Credentials are only used for the target Host session; the password is not saved in the browser.',\n 'peerHost.addAndLogin': 'Add and sign in',\n 'peerHost.adding': 'Adding…',\n 'peerHost.retrying': 'Retrying…',\n 'peerHost.handshakeFailed': 'The PeerHost was registered, but its handshake status is “{status}”; fix the URL or credentials and submit again.',\n 'peerHost.identityLocal': 'Read account “{username}” from the current page as the suggested username; this does not sign in to the remote Host.',\n 'peerHost.identityRelay': 'Read account “{username}” from the current relay login as the suggested username; the target Host password is still required.',\n 'peerHost.identityUnknown': 'The current page account could not be identified; enter the target Host username and password.',\n 'peerHost.readingList': 'Reading PeerHosts...',\n 'peerHost.emptyList': 'No other Host has been added yet. Click “+” in the top right to add one.',\n 'peerHost.colorDefaultHint': 'Default color (derived from the name)',\n 'peerHost.colorLabel': 'Label color {color}',\n 'peerHost.hostnameValue': 'Hostname: {hostname}',\n 'peerHost.notReported': 'Not reported',\n 'peerHost.dshVersion': 'DSH version',\n 'peerHost.unknown': 'Unknown',\n 'peerHost.visibleWorkspaces': 'Visible workspaces',\n 'peerHost.memory': 'Memory',\n 'peerHost.edit': 'Edit',\n 'peerHost.test': 'Test',\n 'peerHost.enable': 'Enable',\n 'peerHost.disable': 'Disable',\n 'peerHost.delete': 'Delete',\n 'peerHost.confirmDelete': 'Delete PeerHost “{name}”?',\n 'peerHost.noSample': 'No sample yet',\n 'peerHost.editHost': 'Edit Host',\n 'peerHost.name': 'Name',\n 'peerHost.hostUrlOptional': 'Host URL (optional)',\n 'peerHost.targetUsernameOptional': 'Target Host username (optional)',\n 'peerHost.targetPasswordOptional': 'Target Host password (optional)',\n 'peerHost.passwordKeepNote': 'Leave the password blank to keep the saved credentials; entering a password performs the handshake and sign-in immediately.',\n 'peerHost.saveAndConnect': 'Save and connect',\n 'peerHost.urlBackfilledNote': 'The URL was filled in from the record; leave it blank to keep the current URL.',\n 'peerHost.relayRouteNote': 'The relay route is stored by the Host and cannot be changed from the client.',\n 'peerHost.passwordRequiresUsername': 'Entering a password also requires the target Host username; leave the password blank to keep the current credentials.',\n 'peerHost.saving': 'Saving…',\n 'peerHost.credentialSavedNote': 'This Host already has saved credentials for that target, so connections complete automatically; leave the fields blank to keep them.',\n 'peerHost.colorSection': 'Workspace label color',\n 'peerHost.usePresetColor': 'Use color {color}',\n 'peerHost.colorReset': 'Default',\n 'peerHost.statusConfigured': 'Not tested',\n 'peerHost.statusChecking': 'Testing',\n 'peerHost.statusReady': 'Connected',\n 'peerHost.statusPluginMissing': 'Plugin missing',\n 'peerHost.statusVersionMismatch': 'Version mismatch',\n 'peerHost.statusIdentityChanged': 'Identity changed',\n 'peerHost.statusSessionRequired': 'Sign-in required',\n 'peerHost.statusUnreachable': 'Unreachable',\n 'peerHost.statusReconnecting': 'Reconnecting',\n 'peerHost.statusDisabled': 'Disabled',\n 'peerHost.debugWorkspaceUnavailable': 'The remote debug workspace scope is unavailable. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.gitWorkspaceUnavailable': 'The remote Git workspace is temporarily unavailable. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.fileWorkspaceUnavailable': 'The remote file scope is unavailable or inconsistent. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.questionSessionUnavailable': 'The session for this remote question is unavailable. Please reconnect.',\n 'peerHost.sessionUnavailable': 'The remote session scope is unavailable. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.attachmentFolderUnsupported': 'Add individual files to the remote session; local folders cannot be attached.',\n 'peerHost.reference.section': 'Conversations',\n 'peerHost.reference.newSession': 'New session',\n 'peerHost.stateExternal': 'The Transport structure of this page is not supported, so the plugin cannot wrap it and PeerHost aggregation is disabled; refreshing the page will not change the result.',\n 'peerHost.stateNotInstalledDesktop': 'The preboot shim is not installed in this Desktop page; restart DSH Desktop and reopen the page.',\n 'peerHost.stateNotInstalledWeb': 'The preboot shim is not installed in this page; refresh DSH Web and then enable PeerHost.',\n 'peerHost.stateRequiresReload': 'The preboot shim is installed, but the current Connection has not bound the aggregate Transport; refresh DSH Web before using remote workspaces.',\n 'peerHost.stateActive': 'The preboot shim has taken over the page Transport; the native Connection of this page keeps reusing the same instance.',\n 'peerHost.statePending': 'The preboot shim is installed with CodingNS; it takes effect as soon as PeerHost is enabled, and native workspaces read the aggregate Transport directly.',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.peerHost.label': '管理其他 DSH Host',\n 'feature.peerHost.description': '聚合多个 Host 会话',\n 'peerHost.panelTitle': '管理其他 DSH Host',\n 'peerHost.panelSubtitle': '连接并管理已登记的其他工作主机',\n 'peerHost.closePanel': '关闭 PeerHost 管理',\n 'peerHost.close': '关闭',\n 'peerHost.addHost': '添加 Host',\n 'peerHost.registeredHosts': '已登记的 Host',\n 'peerHost.listHint': '管理连接、资源和访问状态',\n 'peerHost.closeDialogTitle': '关闭{title}',\n 'peerHost.nameOptional': '名称(可选)',\n 'peerHost.hostUrl': 'Host 地址',\n 'peerHost.targetUsername': '目标 Host 用户名',\n 'peerHost.targetPassword': '目标 Host 密码',\n 'peerHost.identifyingAccount': '正在识别当前登录账号…',\n 'peerHost.loginNote': '登录信息只用于目标 Host 会话;密码不会保存到浏览器。',\n 'peerHost.addAndLogin': '添加并登录',\n 'peerHost.adding': '添加中…',\n 'peerHost.retrying': '重试中…',\n 'peerHost.handshakeFailed': 'PeerHost 已登记,但握手状态为“{status}”;请修正地址或凭据后再次提交。',\n 'peerHost.identityLocal': '已读取当前页面账号“{username}”作为用户名建议;这不会自动登录远程 Host',\n 'peerHost.identityRelay': '已读取当前中转账号“{username}”作为用户名建议;仍需目标 Host 自己的密码',\n 'peerHost.identityUnknown': '未识别当前页面账号;请填写目标 Host 的用户名和密码',\n 'peerHost.readingList': '正在读取 PeerHost...',\n 'peerHost.emptyList': '尚未添加其他 Host。点击右上角“+”添加。',\n 'peerHost.colorDefaultHint': '默认配色(按名称推导)',\n 'peerHost.colorLabel': '标签配色 {color}',\n 'peerHost.hostnameValue': '主机名:{hostname}',\n 'peerHost.notReported': '未上报',\n 'peerHost.dshVersion': 'DSH 版本',\n 'peerHost.unknown': '未知',\n 'peerHost.visibleWorkspaces': '可见工作区',\n 'peerHost.memory': '内存',\n 'peerHost.edit': '编辑',\n 'peerHost.test': '测试',\n 'peerHost.enable': '启用',\n 'peerHost.disable': '禁用',\n 'peerHost.delete': '删除',\n 'peerHost.confirmDelete': '确认删除 PeerHost“{name}”?',\n 'peerHost.noSample': '暂无采样',\n 'peerHost.editHost': '编辑 Host',\n 'peerHost.name': '名称',\n 'peerHost.hostUrlOptional': 'Host 地址(可选)',\n 'peerHost.targetUsernameOptional': '目标 Host 用户名(可选)',\n 'peerHost.targetPasswordOptional': '目标 Host 密码(可选)',\n 'peerHost.passwordKeepNote': '密码留空表示保持已保存的登录凭据不变;填写密码后会立即握手并登录。',\n 'peerHost.saveAndConnect': '保存并连接',\n 'peerHost.urlBackfilledNote': '地址已从记录中回填;留空表示保持当前地址不变。',\n 'peerHost.relayRouteNote': '中转路由由 Host 侧保存,当前不可在客户端修改。',\n 'peerHost.passwordRequiresUsername': '填写密码时必须同时填写目标 Host 用户名;密码留空即可保持当前凭据。',\n 'peerHost.saving': '保存中…',\n 'peerHost.credentialSavedNote': '当前 Host 已保存该目标的登录凭据,连接会自动完成;留空即可保持不变。',\n 'peerHost.colorSection': '工作区标签配色',\n 'peerHost.usePresetColor': '使用配色 {color}',\n 'peerHost.colorReset': '默认',\n 'peerHost.statusConfigured': '待测试',\n 'peerHost.statusChecking': '测试中',\n 'peerHost.statusReady': '已连接',\n 'peerHost.statusPluginMissing': '插件缺失',\n 'peerHost.statusVersionMismatch': '版本不匹配',\n 'peerHost.statusIdentityChanged': '身份已变化',\n 'peerHost.statusSessionRequired': '需要登录',\n 'peerHost.statusUnreachable': '无法连接',\n 'peerHost.statusReconnecting': '重连中',\n 'peerHost.statusDisabled': '已禁用',\n 'peerHost.debugWorkspaceUnavailable': '远程调试工作区作用域不可用,请等待 PeerHost 工作区刷新',\n 'peerHost.gitWorkspaceUnavailable': '远程 Git 工作区暂不可用,请等待 PeerHost 工作区刷新',\n 'peerHost.fileWorkspaceUnavailable': '远程文件作用域不可用或不一致,请等待 PeerHost 工作区刷新',\n 'peerHost.questionSessionUnavailable': '远端问题所属会话不可用,请重新连接',\n 'peerHost.sessionUnavailable': '远端会话作用域暂不可用,请等待 PeerHost 工作区刷新',\n 'peerHost.attachmentFolderUnsupported': '请向远程会话添加单个文件,不能附加本机文件夹。',\n 'peerHost.reference.section': '对话',\n 'peerHost.reference.newSession': '新会话',\n 'peerHost.stateExternal': '当前页面的 Transport 结构不受支持,插件无法包装它,PeerHost 聚合已停用;刷新页面不会改变结果。',\n 'peerHost.stateNotInstalledDesktop': '当前 Desktop 页面没有安装 preboot shim;请重启 DSH Desktop 后再打开页面。',\n 'peerHost.stateNotInstalledWeb': '当前页面未安装 preboot shim;请刷新 DSH Web 后再启用 PeerHost。',\n 'peerHost.stateRequiresReload': 'preboot shim 已安装,但当前 Connection 尚未绑定聚合 Transport;请刷新 DSH Web 后再操作远端工作区。',\n 'peerHost.stateActive': 'preboot shim 已接管页面 Transport;本次页面的原生 Connection 将继续复用同一实例。',\n 'peerHost.statePending': 'preboot shim 已随 CodingNS 安装;启用 PeerHost 后立即生效,原生工作区会直接读取聚合 Transport。',\n}\n","/**\n * peerHostWorkspace 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'peerHostWorkspace.tabLocal': 'Local folders',\n 'peerHostWorkspace.tabRemote': 'Remote HOST',\n 'peerHostWorkspace.sourceLabel': 'Workspace source',\n 'peerHostWorkspace.heading': 'Remote HOST workspaces',\n 'peerHostWorkspace.hint': 'Choose a Host to view its added workspaces; use the candidates below to add another one.',\n 'peerHostWorkspace.loadingHosts': 'Reading registered Hosts…',\n 'peerHostWorkspace.noHosts': 'No other Host is registered yet. Add one under “Manage other DSH Hosts” first.',\n 'peerHostWorkspace.loadingWorkspaces': 'Reading the workspaces registered on this Host…',\n 'peerHostWorkspace.noWorkspaces': 'This Host has no registered workspaces.',\n 'peerHostWorkspace.addedHeading': 'Added workspaces',\n 'peerHostWorkspace.availableHeading': 'Add a workspace',\n 'peerHostWorkspace.noAddedWorkspaces': 'No remote workspace has been added to this Host yet.',\n 'peerHostWorkspace.columnWorkspace': 'Workspace',\n 'peerHostWorkspace.columnSessions': 'Sessions',\n 'peerHostWorkspace.columnHost': 'Remote HOST',\n 'peerHostWorkspace.columnPath': 'Path',\n 'peerHostWorkspace.columnActions': 'Actions',\n 'peerHostWorkspace.remove': 'Remove',\n 'peerHostWorkspace.removeLabel': 'Remove workspace “{name}”',\n 'peerHostWorkspace.removeHint': 'Remove from this workspace list; keep the remote folder and sessions.',\n 'peerHostWorkspace.disconnectedHint': 'Disconnected; expand to view the cached session list.',\n 'peerHostWorkspace.dismissDisconnected': 'Remove disconnected workspace record',\n 'peerHostWorkspace.dismissDisconnectedHint': 'Hide this cached record while disconnected. Added workspaces return after reconnection.',\n 'peerHostWorkspace.noSessions': 'No sessions',\n 'peerHostWorkspace.sessionCount': '{count} sessions',\n 'peerHostWorkspace.added': 'Added; the workspace appears in the sidebar after you close this dialog.',\n 'peerHostWorkspace.removed': 'Removed; the remote folder and sessions are kept. You can add it again below.',\n 'peerHostWorkspace.statusConfigured': 'Pending connection',\n 'peerHostWorkspace.statusChecking': 'Checking',\n 'peerHostWorkspace.statusReady': 'Connected',\n 'peerHostWorkspace.statusPluginMissing': 'Plugin missing',\n 'peerHostWorkspace.statusVersionMismatch': 'Version mismatch',\n 'peerHostWorkspace.statusIdentityChanged': 'Identity changed',\n 'peerHostWorkspace.statusSessionRequired': 'Sign-in required',\n 'peerHostWorkspace.statusUnreachable': 'Unreachable',\n 'peerHostWorkspace.statusReconnecting': 'Reconnecting',\n 'peerHostWorkspace.statusDisabled': 'Disabled',\n 'peerHostWorkspace.hintSessionRequired': '“{host}” needs a new sign-in. Open “Manage other DSH Hosts”, choose “Edit” for this Host, and save the account and password.',\n 'peerHostWorkspace.hintUnreachable': '“{host}” is unreachable. Make sure the target machine is running, then click “Test” in the management panel to retry.',\n 'peerHostWorkspace.hintVersionMismatch': '“{host}” is incompatible. The client plugin version must be at least the PeerHost plugin version; the DSH version and API compatibility must also be supported.',\n 'peerHostWorkspace.hintPluginMissing': '“{host}” does not have this plugin installed, so its workspaces cannot be aggregated.',\n 'peerHostWorkspace.hintIdentityChanged': 'The identity of “{host}” changed. Run “Test” and sign in again in the management panel.',\n 'peerHostWorkspace.hintNotReady': '“{host}” is currently “{status}”; finish connecting it in the management panel first.',\n 'peerHostWorkspace.manageHosts': 'Manage other DSH Hosts',\n}\n\nexport const zh: Record<string, string> = {\n 'peerHostWorkspace.tabLocal': '本机文件夹',\n 'peerHostWorkspace.tabRemote': '远程 HOST',\n 'peerHostWorkspace.sourceLabel': '工作区来源',\n 'peerHostWorkspace.heading': '远程 HOST 工作区',\n 'peerHostWorkspace.hint': '选择一台 Host 查看已添加的工作区;可在下方候选列表继续添加工作区。',\n 'peerHostWorkspace.loadingHosts': '正在读取已登记的 Host…',\n 'peerHostWorkspace.noHosts': '尚未登记其他 Host。请先在“管理其他 DSH Host”中添加。',\n 'peerHostWorkspace.loadingWorkspaces': '正在读取该 Host 已登记的工作区…',\n 'peerHostWorkspace.noWorkspaces': '该 Host 上没有已登记的工作区。',\n 'peerHostWorkspace.addedHeading': '已添加的远程工作区',\n 'peerHostWorkspace.availableHeading': '添加远程工作区',\n 'peerHostWorkspace.noAddedWorkspaces': '该 Host 尚未添加远程工作区。',\n 'peerHostWorkspace.columnWorkspace': '工作区名称',\n 'peerHostWorkspace.columnSessions': '会话数',\n 'peerHostWorkspace.columnHost': '所属远程 HOST',\n 'peerHostWorkspace.columnPath': '路径',\n 'peerHostWorkspace.columnActions': '操作',\n 'peerHostWorkspace.remove': '移除',\n 'peerHostWorkspace.removeLabel': '移除工作区“{name}”',\n 'peerHostWorkspace.removeHint': '仅取消在当前端添加,保留远端目录和会话。',\n 'peerHostWorkspace.disconnectedHint': '连接已断开,仍可展开查看缓存的会话列表。',\n 'peerHostWorkspace.dismissDisconnected': '移除断开的工作区记录',\n 'peerHostWorkspace.dismissDisconnectedHint': '断线期间隐藏此缓存记录;连接恢复后仍按工作区添加状态显示。',\n 'peerHostWorkspace.noSessions': '无会话',\n 'peerHostWorkspace.sessionCount': '{count} 个会话',\n 'peerHostWorkspace.added': '已添加;关闭对话框后该工作区会出现在侧栏。',\n 'peerHostWorkspace.removed': '已移除;远端目录和会话保留,可在下方重新添加。',\n 'peerHostWorkspace.statusConfigured': '待连接',\n 'peerHostWorkspace.statusChecking': '检查中',\n 'peerHostWorkspace.statusReady': '已连接',\n 'peerHostWorkspace.statusPluginMissing': '插件缺失',\n 'peerHostWorkspace.statusVersionMismatch': '版本不匹配',\n 'peerHostWorkspace.statusIdentityChanged': '身份已变化',\n 'peerHostWorkspace.statusSessionRequired': '需要登录',\n 'peerHostWorkspace.statusUnreachable': '无法连接',\n 'peerHostWorkspace.statusReconnecting': '重连中',\n 'peerHostWorkspace.statusDisabled': '已禁用',\n 'peerHostWorkspace.hintSessionRequired': '“{host}”需要重新登录。请到“管理其他 DSH Host”打开该 Host 的“编辑”,填入账号密码保存即可。',\n 'peerHostWorkspace.hintUnreachable': '“{host}”当前无法连接。请确认目标机器已启动,然后在管理面板点“测试”重试。',\n 'peerHostWorkspace.hintVersionMismatch': '“{host}”版本不兼容。客户端插件版本须不低于 PeerHost 插件版本,DSH 版本及 API 兼容标识也须受支持。',\n 'peerHostWorkspace.hintPluginMissing': '“{host}”没有安装本插件,无法聚合它的工作区。',\n 'peerHostWorkspace.hintIdentityChanged': '“{host}”的身份已变化。请在管理面板重新“测试”并登录。',\n 'peerHostWorkspace.hintNotReady': '“{host}”当前状态为“{status}”,请先在管理面板完成连接。',\n 'peerHostWorkspace.manageHosts': '管理其他 DSH Host',\n}\n","/**\n * terminalAuth 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'terminalShare.title': 'Share terminal output to a conversation',\n 'terminalShare.menuTitle': 'Share to a conversation',\n 'terminalShare.more': 'More conversations',\n 'terminalShare.untitled': 'Untitled conversation',\n 'terminalShare.time.now': 'now',\n 'terminalShare.time.minutes': '{n}min',\n 'terminalShare.time.hours': '{n}h',\n 'terminalShare.time.days': '{n}d',\n 'terminalShare.time.months': '{n}mo',\n 'terminalShare.time.years': '{n}y',\n 'terminalShare.time.unknown': 'Update time unknown',\n 'terminalShare.selectionActions': 'Selected terminal text',\n 'terminalShare.copy': 'Copy',\n 'terminalShare.share': 'Share',\n 'terminalShare.preview.title': 'Terminal log',\n 'terminalShare.preview.close': 'Close',\n 'terminalShare.preview.metadata': '{title} · {lines} lines · {time}',\n 'terminalShare.preview.invalid': 'This log reference is invalid. Please share the terminal log again.',\n 'terminalShare.referenceUnavailable': 'Log reference cards are temporarily unavailable. Please retry.',\n 'terminalShare.selectionLimited': 'Selection exceeds 200 lines / 32 KiB; sharing the first {lines} retained lines.',\n 'terminalShare.unavailable': 'Conversation sharing is unavailable. This feature requires the DSH draft-persistence API added in 0.2.1-alpha.1.',\n 'terminalShare.snapshot.heading': 'Terminal log snapshot (read-only debugging context)',\n 'terminalShare.snapshot.terminal': 'Terminal: {title}',\n 'terminalShare.snapshot.host': 'Source Host: {host}',\n 'terminalShare.snapshot.workspace': 'Workspace: {workspace}',\n 'terminalShare.snapshot.cwd': 'Launch directory: {cwd}',\n 'terminalShare.snapshot.shell': 'Shell: {shell}',\n 'terminalShare.snapshot.time': 'Captured at: {time}',\n 'terminalShare.snapshot.range': 'Range: {range}, {lines} lines retained',\n 'terminalShare.snapshot.truncated': 'Content truncated: yes',\n 'terminalShare.snapshot.complete': 'Content truncated: no',\n 'terminalShare.range.selection': 'Selected text',\n 'terminalShare.range.recent': 'Recent output (up to 200 lines)',\n 'terminalShare.range.screen': 'Current screen',\n 'terminalShare.empty': 'No output in this range.',\n 'terminalShare.loading': 'Loading conversations…',\n 'terminalShare.new': 'New conversation',\n 'terminalShare.retry': 'Refresh conversations',\n 'terminalShare.adding': 'Adding…',\n 'terminalShare.referenceLabel': 'Terminal: {title} · {lines} lines',\n 'terminalView.errorDetail': 'Terminal error: {message}',\n 'terminalView.readOnly': 'This page is currently read-only.',\n 'terminalView.reconnect': 'Reconnect',\n 'terminalView.readingEnvironment': 'Reading the terminal environment…',\n 'terminalView.loadTimeout': 'The terminal service did not respond in time. Please retry.',\n 'terminalView.starting': 'Starting…',\n 'terminalView.connecting': 'Connecting…',\n 'terminalView.disconnected': 'Connection lost.',\n 'terminalView.lost': 'The terminal runtime is gone (the process may have been ended externally).',\n 'terminalView.rebuild': 'Rebuild terminal',\n 'terminalView.exited': 'Process exited ({exitCode})',\n 'terminalView.unavailable': 'Unavailable',\n 'terminalView.closed': 'The terminal is closed.',\n 'loginProtection.saved': 'Login protection settings saved',\n 'loginProtection.savedRelaySession': 'Settings saved. Relay access requires entering the password again to establish a session for this tab.',\n 'loginProtection.panelHint': 'Add local account verification for LAN and relay access. Loopback 127.0.0.1 / ::1 is never protected. The password is verified only on the Host and never enters browser settings or the URL; while the page stays open, the session is renewed automatically as it nears expiry.',\n 'loginProtection.enable': 'Enable login protection',\n 'loginProtection.username': 'Local username',\n 'loginProtection.newPassword': 'New password (leave blank to keep the current one)',\n 'loginProtection.password': 'Password (at least 8 characters)',\n 'loginProtection.timeoutSeconds': 'Session timeout (seconds)',\n 'loginProtection.scopes': 'Applies to',\n 'loginProtection.scopeLan': 'LAN access',\n 'loginProtection.scopeLanHint': 'LAN interface entry',\n 'loginProtection.scopeRelay': 'Relay access',\n 'loginProtection.scopeRelayHint': 'Codingns4DSH relay',\n 'loginProtection.scopeOption': '{label} ({hint})',\n 'loginProtection.saving': 'Saving…',\n 'loginProtection.save': 'Save login protection',\n 'loginProtection.errorTimeoutRange': 'The session timeout must be between 60 and 604800 seconds',\n 'loginProtection.errorScopesRequired': 'Select at least one scope',\n}\n\nexport const zh: Record<string, string> = {\n 'terminalShare.title': '分享终端输出至会话',\n 'terminalShare.menuTitle': '分享至会话',\n 'terminalShare.more': '更多会话',\n 'terminalShare.untitled': '未命名会话',\n 'terminalShare.time.now': '刚刚',\n 'terminalShare.time.minutes': '{n}分钟',\n 'terminalShare.time.hours': '{n}小时',\n 'terminalShare.time.days': '{n}天',\n 'terminalShare.time.months': '{n}个月',\n 'terminalShare.time.years': '{n}年',\n 'terminalShare.time.unknown': '更新时间未知',\n 'terminalShare.selectionActions': '终端选中文字',\n 'terminalShare.copy': '复制',\n 'terminalShare.share': '分享',\n 'terminalShare.preview.title': '终端日志',\n 'terminalShare.preview.close': '关闭',\n 'terminalShare.preview.metadata': '{title} · {lines} 行 · {time}',\n 'terminalShare.preview.invalid': '日志引用已损坏,请重新分享终端日志。',\n 'terminalShare.referenceUnavailable': '日志引用卡片暂不可用,请稍后重试。',\n 'terminalShare.selectionLimited': '选区超过 200 行 / 32 KiB,仅分享前 {lines} 行已保留的内容。',\n 'terminalShare.unavailable': '会话分享服务不可用;此功能需要 DSH 自 0.2.1-alpha.1 起提供的草稿保存能力。',\n 'terminalShare.snapshot.heading': '终端日志快照(只读调试资料)',\n 'terminalShare.snapshot.terminal': '终端:{title}',\n 'terminalShare.snapshot.host': '来源 Host:{host}',\n 'terminalShare.snapshot.workspace': '工作区:{workspace}',\n 'terminalShare.snapshot.cwd': '启动目录:{cwd}',\n 'terminalShare.snapshot.shell': 'Shell:{shell}',\n 'terminalShare.snapshot.time': '采集时间:{time}',\n 'terminalShare.snapshot.range': '范围:{range},保留 {lines} 行',\n 'terminalShare.snapshot.truncated': '内容已截断:是',\n 'terminalShare.snapshot.complete': '内容已截断:否',\n 'terminalShare.range.selection': '选中内容',\n 'terminalShare.range.recent': '最近输出(最多 200 行)',\n 'terminalShare.range.screen': '当前屏幕',\n 'terminalShare.empty': '此范围没有输出。',\n 'terminalShare.loading': '正在读取会话…',\n 'terminalShare.new': '新建会话',\n 'terminalShare.retry': '刷新会话列表',\n 'terminalShare.adding': '正在加入…',\n 'terminalShare.referenceLabel': '终端:{title} · {lines} 行',\n 'terminalView.errorDetail': '终端错误:{message}',\n 'terminalView.readOnly': '此页面当前只读。',\n 'terminalView.reconnect': '重新连接',\n 'terminalView.readingEnvironment': '正在读取终端环境…',\n 'terminalView.loadTimeout': '终端服务响应超时,请重试。',\n 'terminalView.starting': '正在启动…',\n 'terminalView.connecting': '正在连接…',\n 'terminalView.disconnected': '连接已断开。',\n 'terminalView.lost': '终端运行时已丢失(进程可能被外部结束)。',\n 'terminalView.rebuild': '重建终端',\n 'terminalView.exited': '进程已退出({exitCode})',\n 'terminalView.unavailable': '不可用',\n 'terminalView.closed': '终端已关闭。',\n 'loginProtection.saved': '登录保护设置已保存',\n 'loginProtection.savedRelaySession': '设置已保存;中继访问需要重新输入密码以建立当前标签页会话',\n 'loginProtection.panelHint': '为局域网和中继访问统一增加本地账号验证。本机 127.0.0.1 / ::1 永远不受此保护。密码只在 Host 侧验证,不会进入浏览器设置或 URL;页面保持打开时,会在会话临近超时时自动续期。',\n 'loginProtection.enable': '启用登录保护',\n 'loginProtection.username': '本地用户名',\n 'loginProtection.newPassword': '新密码(留空保持不变)',\n 'loginProtection.password': '密码(至少 8 位)',\n 'loginProtection.timeoutSeconds': '会话超时(秒)',\n 'loginProtection.scopes': '应用范围',\n 'loginProtection.scopeLan': '局域网访问',\n 'loginProtection.scopeLanHint': '局域网网卡入口',\n 'loginProtection.scopeRelay': '中继访问',\n 'loginProtection.scopeRelayHint': 'Codingns4DSH 中继',\n 'loginProtection.scopeOption': '{label}({hint})',\n 'loginProtection.saving': '保存中…',\n 'loginProtection.save': '保存登录保护',\n 'loginProtection.errorTimeoutRange': '会话超时时间必须是 60 到 604800 秒',\n 'loginProtection.errorScopesRequired': '至少选择一个应用范围',\n}\n","/**\n * usage 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'usage.r4StatsPeriod': 'Account usage · UTC',\n 'usage.r4TodayIoTokens': 'Input + output tokens today',\n 'usage.r4WeekRequests': 'Requests · last 7 days',\n 'usage.r4WeekIoTokens': 'Input + output tokens · last 7 days',\n 'usage.r4WeekCost': 'Cost · last 7 days',\n 'usage.r4ModelsWeek': 'By model · last 7 days',\n 'usage.r4TodayUsage': 'Account usage today (UTC)',\n 'usage.r4KeyRemainingLimit': 'Key remaining / limit',\n 'usage.r4TodayCost': 'Cost today (UTC)',\n 'usage.r4AccountSnapshot': 'Account balance (snapshot)',\n 'usage.r4PackageBalance': 'Package balance',\n 'usage.r4WalletBalance': 'Wallet balance',\n 'usage.r4PackageExpiry': 'Next package expiry',\n 'usage.r4KeyQuota': 'Current Key · lifetime spend limit',\n 'usage.r4KeyLimit': 'Key limit',\n 'usage.r4NoLimit': 'No Key limit',\n 'usage.r4KeySpent': 'Key settled spend',\n 'usage.r4KeyHeld': 'Key in-flight holds',\n 'usage.r4KeyRemaining': 'Key remaining (after holds)',\n 'usage.r4AccountUsage': 'Account usage · today and last 7 days (UTC)',\n 'usage.r4inputTokens': 'Prompt tokens today',\n 'usage.r4outputTokens': 'Completion tokens today',\n 'usage.r4cacheReadTokens': 'Cache-read tokens today',\n 'usage.r4cacheCreationTokens': 'Cache-creation tokens today',\n 'usage.slotLabel': 'Agent subscription balance',\n 'usage.remainingLabel': '{provider} subscription balance {percent}%',\n 'usage.upstreamBalanceLabel': '{provider} upstream balance {amount}',\n 'usage.balanceLabel': '{provider} balance {amount}',\n 'usage.providerBalanceLabel': '{provider} remaining {amount}',\n 'usage.providerBalancePlanLabel': '{provider} · {plan} · {amount}',\n 'usage.unavailable': 'Unavailable',\n 'usage.upstreamNotProvided': 'Not provided by upstream',\n 'usage.available': 'Available',\n 'usage.subscriptionRemaining': 'Subscription balance',\n 'usage.todayCostShort': 'Today {amount}',\n 'usage.accountBalance': 'Account balance',\n 'usage.officialRemaining': 'Official balance',\n 'usage.windowFiveHour': '5-hour quota',\n 'usage.windowWeekly': 'Weekly quota',\n 'usage.windowMonthly': 'Monthly quota',\n 'usage.quotaGroupGemini': 'Gemini models',\n 'usage.quotaGroupThirdParty': 'Claude and GPT models',\n 'usage.popoverSubscriptionUsage': '{provider} subscription usage',\n 'usage.popoverSubscriptionTitle': '{provider} subscription',\n 'usage.windowRemaining': '{label} remaining {percent}%',\n 'usage.resetsIn': 'Resets in {time}',\n 'usage.windowDays': '{count}-day quota',\n 'usage.windowHours': '{count}-hour quota',\n 'usage.windowMinutes': '{count}-minute quota',\n 'usage.officialRemainingPopover': '{provider} official balance',\n 'usage.usedOfTotal': 'Used {used} / {total}',\n 'usage.usedShort': 'Used {amount}',\n 'usage.expiresIn': 'Expires in {time}',\n 'usage.expired': 'Expired',\n 'usage.noMoreStats': 'No further statistics',\n 'usage.providerDetails': 'Upstream details',\n 'usage.keyStatus': 'API key status',\n 'usage.keyActive': 'Active',\n 'usage.keyExpired': 'Expired',\n 'usage.providerAccountBalance': '{provider} account balance',\n 'usage.granted': 'Granted {amount}',\n 'usage.toppedUp': 'Topped up {amount}',\n 'usage.deepseekApiNote': 'The official DeepSeek API currently exposes only an account balance endpoint; request, token, and cost details are unavailable.',\n 'usage.upstreamUsageTitle': '{provider} upstream usage',\n 'usage.addressMissing': 'Address not provided',\n 'usage.statTodayRequests': 'Requests today',\n 'usage.statTodayTokens': 'Tokens today',\n 'usage.statTodayCost': 'Cost today',\n 'usage.statTotalRequests': 'Total requests',\n 'usage.statTotalTokens': 'Total tokens',\n 'usage.statTotalCost': 'Total cost',\n 'usage.statTodayCacheHitRate': 'Cache hit rate today',\n 'usage.statTotalCacheHitRate': 'Overall cache hit rate',\n 'usage.byModel': 'By model',\n 'usage.byDay': 'By day',\n 'usage.noModelStats': 'No per-model statistics',\n 'usage.colModel': 'Model',\n 'usage.colDate': 'Date',\n 'usage.colRequests': 'Requests',\n 'usage.colToken': 'Token',\n 'usage.colCost': 'Cost',\n 'usage.colCache': 'Cache',\n 'usage.newApiBalance': 'Balance',\n 'usage.newApiUsed': 'Used',\n 'usage.newApiUnlimited': 'Unlimited',\n 'usage.providerDeepseekOfficial': 'DeepSeek Official',\n 'usage.providerUpstream': '{name} upstream',\n 'usage.countdownDaysHours': '{days}d {hours}h',\n 'usage.countdownHoursMinutes': '{hours}h {minutes}m',\n 'usage.countdownHours': '{hours}h',\n 'usage.countdownMinutes': '{minutes}m',\n 'usage.creditBalanceLabel': 'Credits',\n 'usage.creditUnlimited': 'Unlimited',\n 'usage.resetCreditsLabel': 'Reset credits',\n 'usage.resetCreditsCount': '{count}',\n 'usage.resetCreditsExpiresAt': 'expires in {time}',\n 'usage.resetCreditsExpired': 'expired',\n 'usage.resetCreditsMore': '{count} more',\n 'usage.resetButton': 'Reset subscription',\n 'usage.resetTooltipReady': 'Consumes one reset credit to restore the current window',\n 'usage.resetTooltipNone': 'No reset credits available',\n 'usage.resetDialogTitle': 'Reset subscription usage?',\n 'usage.resetDialogBody': 'This consumes one reset credit and immediately restores the current usage window, with {count} left. This cannot be undone. Continue?',\n 'usage.resetDialogCancel': 'Cancel',\n 'usage.resetDialogConfirm': 'Confirm reset',\n 'usage.resetDialogPending': 'Resetting…',\n 'usage.resetDialogClose': 'Close',\n 'usage.resetOutcomeReset': 'The current usage window has been reset and reset credits refreshed.',\n 'usage.resetOutcomeAlreadyRedeemed': 'This reset already took effect; usage has been refreshed.',\n 'usage.resetOutcomeNothingToReset': 'No window has reached its limit; no reset credit was consumed.',\n 'usage.resetOutcomeNoCredit': 'No reset credits available; nothing was reset.',\n 'usage.resetFailed': 'Reset failed. Try again later.',\n 'usage.magpieUsageLabel': 'Magpie usage, session and route',\n 'usage.magpieShortLabel': 'Magpie',\n 'usage.magpieTitle': 'Magpie usage',\n 'usage.magpieTodayScope': 'Today · all Magpie agents',\n 'usage.magpieTabUsage': 'Usage',\n 'usage.magpieTabRoute': 'Route + quota',\n 'usage.magpieAggregateTitle': 'Gateway usage',\n 'usage.magpieSessionTitle': 'This Agent session',\n 'usage.magpieSessionTodayTitle': 'This Agent session · today',\n 'usage.magpieRouteTitle': 'Latest route',\n 'usage.magpieUsageUnavailable': 'Magpie usage is unavailable.',\n 'usage.magpieRequests': 'Requests',\n 'usage.magpieErrors': 'Errors',\n 'usage.magpieInputTokens': 'Input tokens',\n 'usage.magpieOutputTokens': 'Output tokens',\n 'usage.magpieCacheReadTokens': 'Cache read',\n 'usage.magpieCacheWriteTokens': 'Cache written',\n 'usage.magpieTotalTokens': 'Input + output',\n 'usage.magpieCost': 'Estimated cost',\n 'usage.magpieCacheHitRate': 'Cache hit rate',\n 'usage.magpieAccountPolicies': 'Codex account controls',\n 'usage.magpieResetCountLabel': 'Reset cards',\n 'usage.magpieResetCount': '{count} reset cards',\n 'usage.magpieResetWhenWeek': 'Auto-use a reset when the weekly window is exhausted',\n 'usage.magpieResetBeforeExpiry': 'Auto-use a reset before it expires',\n 'usage.magpieUseCredits': 'Use credits after quota is exhausted',\n 'usage.magpieUseReset': 'Use one reset card',\n 'usage.magpieUpdated': 'Updated {time}',\n 'usage.magpieAgent': 'Agent: {agent}',\n 'usage.magpieSessionNoUsage': 'No matching session usage today.',\n 'usage.magpieSessionIdUnavailable': 'This Agent session cannot be linked to Magpie.',\n 'usage.magpieRouteUnavailable': 'Magpie route information is unavailable.',\n 'usage.magpieRouteNoRequests': 'Magpie has no route for this session yet.',\n 'usage.magpieAskedModel': 'Requested model',\n 'usage.magpieRouteGroup': 'Routing group',\n 'usage.magpieRouteRule': 'Routing rule',\n 'usage.magpieRouteAccount': 'Upstream account',\n 'usage.magpieRoutedModel': 'Current destination',\n 'usage.magpieServedModel': 'Model that replied',\n 'usage.magpieEffort': 'Reasoning level',\n 'usage.magpieRequestStatus': 'Request status',\n 'usage.magpieRouteDone': 'Complete · ',\n 'usage.magpieRouteRunning': 'In progress · ',\n 'usage.magpieAttempts': 'Attempts',\n 'usage.magpieUnknownModel': 'Model not provided',\n 'usage.magpieFallback': 'Fallback',\n 'usage.magpieQuotaTitle': 'Upstream quota',\n 'usage.magpieQuotaUnavailable': 'Magpie quota data is unavailable.',\n 'usage.magpieQuotaProviderUnavailable': 'The upstream provider for this session is not identified yet.',\n 'usage.magpieQuotaNoData': 'No quota was reported for the upstream provider.',\n 'usage.magpieQuotaNoWindows': 'No quota windows reported.',\n 'usage.magpieQuotaAccount': 'Account: {account}',\n 'usage.magpieQuotaBalance': 'Balance: {balance}',\n 'usage.magpieQuotaRemaining': '{name} remaining {percent}%',\n 'usage.magpieQuotaResets': 'Resets at {time}',\n 'usage.magpieRouteFlowTitle': 'Routing flow',\n 'usage.magpieRouteComplete': 'Completed',\n 'accountBar.userFallback': 'User',\n 'accountBar.connectionManageTitle': 'Connection management · Manage other DSH Hosts',\n 'accountBar.identityClickHint': '{identity} · Click to manage sign-in',\n 'accountBar.connectionManage': 'Connection management',\n 'accountBar.userAria': 'User: {identity}',\n 'accountBar.localAccount': '{identity} (local account)',\n 'accountBar.unknownAccount': 'Unrecognized account',\n 'accountBar.access': 'Access: {access}',\n 'accountBar.accessWithLatency': 'Access: {access} · {latency} ms',\n 'accountBar.memory': 'Memory',\n 'accountBar.hostCpu': 'Host CPU',\n 'accountBar.hostMemory': 'Host memory',\n 'accountBar.managePeerHost': 'Manage PeerHost',\n 'accountBar.managePeerHostHint': 'Connect and manage other DSH Hosts',\n 'accountBar.loggingOut': 'Signing out…',\n 'accountBar.logout': 'Sign out',\n 'accountBar.relay': 'Relay',\n 'accountBar.direct': 'Direct',\n // Magpie 订阅卡的签到状态、账号分组与重置卡文案。\n 'usage.checkinClaimed': 'Checked in today{credit} · {streak}',\n 'usage.checkinStreak': '{days}-day streak',\n 'usage.checkinFailed': 'Check-in failed',\n 'usage.checkinIneligible': 'This account does not take part in check-in',\n 'usage.checkinInactive': 'Check-in is not enabled',\n 'usage.checkinCaptcha': 'Check-in needs a captcha',\n 'usage.checkinOwnApp': 'Check in from the official app',\n 'usage.checkinPending': 'Not checked in yet today',\n 'usage.checkinUnknown': 'Check-in state unknown',\n 'usage.quotaActiveAccount': 'In use',\n 'usage.quotaGroupAccounts': '{count} accounts',\n 'usage.quotaCollapseAccounts': 'Collapse account details',\n 'usage.quotaExpandAccounts': 'Expand account details',\n 'usage.quotaDailyTotal': 'Today {amount}',\n 'usage.quotaPlanUntil': 'Plan until',\n 'usage.quotaReadFailed': 'Read failed: {reason}',\n 'usage.quotaRunsOut': 'At the current rate {amount} runs out {time}',\n 'usage.resetCardsLabel': 'Reset cards',\n 'usage.resetCardsByWindow': 'Resets · 5h {fiveHour} · weekly {weekly}',\n 'usage.resetCardsCount': '{count} reset cards',\n 'usage.resetCardsExpiresAt': 'Expires {time}',\n // 路由标题栏的“查看请求”入口与请求模态框;明细文案复用 magpie.* 词典。\n 'usage.magpieViewRequests': 'View requests',\n 'usage.magpieRequestsTitle': 'Magpie requests',\n 'usage.magpieRequestsClose': 'Close',\n}\n\nexport const zh: Record<string, string> = {\n 'usage.r4StatsPeriod': '账户用量 · UTC',\n 'usage.r4TodayIoTokens': '今日输入与输出 Token',\n 'usage.r4WeekRequests': '近 7 天请求数',\n 'usage.r4WeekIoTokens': '近 7 天输入与输出 Token',\n 'usage.r4WeekCost': '近 7 天费用',\n 'usage.r4ModelsWeek': '按模型统计 · 近 7 天',\n 'usage.r4TodayUsage': '今日账户用量(UTC)',\n 'usage.r4KeyRemainingLimit': 'Key 剩余 / 限额',\n 'usage.r4TodayCost': '今日费用(UTC)',\n 'usage.r4AccountSnapshot': '账户余额(快照)',\n 'usage.r4PackageBalance': '套餐余额',\n 'usage.r4WalletBalance': '钱包余额',\n 'usage.r4PackageExpiry': '最近套餐到期时间',\n 'usage.r4KeyQuota': '当前 Key · 终身消费限额',\n 'usage.r4KeyLimit': 'Key 限额',\n 'usage.r4NoLimit': 'Key 未设限',\n 'usage.r4KeySpent': 'Key 已结算消费',\n 'usage.r4KeyHeld': 'Key 请求中冻结金额',\n 'usage.r4KeyRemaining': 'Key 剩余额度(扣除冻结)',\n 'usage.r4AccountUsage': '账户用量 · 今日与近 7 天(UTC)',\n 'usage.r4inputTokens': '今日输入 Token',\n 'usage.r4outputTokens': '今日输出 Token',\n 'usage.r4cacheReadTokens': '今日缓存读取 Token',\n 'usage.r4cacheCreationTokens': '今日缓存写入 Token',\n 'usage.slotLabel': 'Agent 订阅余量',\n 'usage.remainingLabel': '{provider} 订阅余量 {percent}%',\n 'usage.upstreamBalanceLabel': '{provider} 上游余额 {amount}',\n 'usage.balanceLabel': '{provider} 余额 {amount}',\n 'usage.providerBalanceLabel': '{provider} 余量 {amount}',\n 'usage.providerBalancePlanLabel': '{provider} · {plan} · {amount}',\n 'usage.unavailable': '不可用',\n 'usage.upstreamNotProvided': '上游未提供',\n 'usage.available': '可用',\n 'usage.subscriptionRemaining': '订阅余量',\n 'usage.todayCostShort': '今日 {amount}',\n 'usage.accountBalance': '账户余额',\n 'usage.officialRemaining': '官方余量',\n 'usage.windowFiveHour': '5 小时额度',\n 'usage.windowWeekly': '周额度',\n 'usage.windowMonthly': '月额度',\n 'usage.quotaGroupGemini': 'Gemini 模型',\n 'usage.quotaGroupThirdParty': 'Claude 与 GPT 模型',\n 'usage.popoverSubscriptionUsage': '{provider} 订阅使用情况',\n 'usage.popoverSubscriptionTitle': '{provider} 订阅',\n 'usage.windowRemaining': '{label}剩余 {percent}%',\n 'usage.resetsIn': '重置于 {time}',\n 'usage.windowDays': '{count} 天额度',\n 'usage.windowHours': '{count} 小时额度',\n 'usage.windowMinutes': '{count} 分钟额度',\n 'usage.officialRemainingPopover': '{provider} 官方余量',\n 'usage.usedOfTotal': '已用 {used} / {total}',\n 'usage.usedShort': '已用 {amount}',\n 'usage.expiresIn': '{time}到期',\n 'usage.expired': '已到期',\n 'usage.noMoreStats': '暂无更多统计',\n 'usage.providerDetails': '上游详情',\n 'usage.keyStatus': 'API Key 状态',\n 'usage.keyActive': '有效',\n 'usage.keyExpired': '已过期',\n 'usage.providerAccountBalance': '{provider} 账户余额',\n 'usage.granted': '赠送 {amount}',\n 'usage.toppedUp': '充值 {amount}',\n 'usage.deepseekApiNote': '官方 DeepSeek API 当前只提供账户余额接口,暂无请求量、Token 或费用明细。',\n 'usage.upstreamUsageTitle': '{provider} 上游用量',\n 'usage.addressMissing': '地址未提供',\n 'usage.statTodayRequests': '今日请求数',\n 'usage.statTodayTokens': '今日 Token 用量',\n 'usage.statTodayCost': '今日费用',\n 'usage.statTotalRequests': '累计请求数',\n 'usage.statTotalTokens': '累计 Token 用量',\n 'usage.statTotalCost': '累计费用',\n 'usage.statTodayCacheHitRate': '今日缓存命中率',\n 'usage.statTotalCacheHitRate': '累计缓存命中率',\n 'usage.byModel': '按模型统计',\n 'usage.byDay': '按日统计',\n 'usage.noModelStats': '暂无按模型统计',\n 'usage.colModel': '模型',\n 'usage.colDate': '日期',\n 'usage.colRequests': '请求',\n 'usage.colToken': 'Token',\n 'usage.colCost': '费用',\n 'usage.colCache': '缓存',\n 'usage.newApiBalance': '余额',\n 'usage.newApiUsed': '已用',\n 'usage.newApiUnlimited': '无限额度',\n 'usage.providerDeepseekOfficial': 'DeepSeek 官方',\n 'usage.providerUpstream': '{name} 上游',\n 'usage.countdownDaysHours': '{days}天{hours}小时后',\n 'usage.countdownHoursMinutes': '{hours}小时{minutes}分钟后',\n 'usage.countdownHours': '{hours}小时后',\n 'usage.countdownMinutes': '{minutes}分钟后',\n 'usage.creditBalanceLabel': '剩余点数',\n 'usage.creditUnlimited': '不限',\n 'usage.resetCreditsLabel': '重置次数',\n 'usage.resetCreditsCount': '{count} 次',\n 'usage.resetCreditsExpiresAt': '{time}到期',\n 'usage.resetCreditsExpired': '已过期',\n 'usage.resetCreditsMore': '还有 {count} 张',\n 'usage.resetButton': '重置订阅',\n 'usage.resetTooltipReady': '消耗 1 次重置次数以立即恢复当前窗口',\n 'usage.resetTooltipNone': '没有可用的重置次数',\n 'usage.resetDialogTitle': '确认重置订阅用量',\n 'usage.resetDialogBody': '将消耗 1 次重置次数立即恢复当前用量窗口,剩余 {count} 次。此操作不可撤销,确定继续吗?',\n 'usage.resetDialogCancel': '取消',\n 'usage.resetDialogConfirm': '确认重置',\n 'usage.resetDialogPending': '正在重置…',\n 'usage.resetDialogClose': '关闭',\n 'usage.resetOutcomeReset': '已重置当前用量窗口,重置次数已更新。',\n 'usage.resetOutcomeAlreadyRedeemed': '该次重置此前已生效,已刷新最新用量。',\n 'usage.resetOutcomeNothingToReset': '当前没有达到限额的窗口,未消耗重置次数。',\n 'usage.resetOutcomeNoCredit': '没有可用的重置次数,未执行重置。',\n 'usage.resetFailed': '重置失败,请稍后重试。',\n 'usage.magpieUsageLabel': 'Magpie 用量、会话与路由',\n 'usage.magpieShortLabel': 'Magpie',\n 'usage.magpieTitle': 'Magpie 用量',\n 'usage.magpieTodayScope': '今日 · 所有 Magpie Agent',\n 'usage.magpieTabUsage': '用量',\n 'usage.magpieTabRoute': '路由 + 配额',\n 'usage.magpieAggregateTitle': '网关用量',\n 'usage.magpieSessionTitle': '当前 Agent 会话',\n 'usage.magpieSessionTodayTitle': '当前 Agent 会话 · 今日',\n 'usage.magpieRouteTitle': '最近路由',\n 'usage.magpieUsageUnavailable': '暂时无法读取 Magpie 用量。',\n 'usage.magpieRequests': '请求数',\n 'usage.magpieErrors': '失败数',\n 'usage.magpieInputTokens': '输入 Token',\n 'usage.magpieOutputTokens': '输出 Token',\n 'usage.magpieCacheReadTokens': '缓存读取',\n 'usage.magpieCacheWriteTokens': '缓存写入',\n 'usage.magpieTotalTokens': '输入 + 输出',\n 'usage.magpieCost': '预估费用',\n 'usage.magpieCacheHitRate': '缓存命中率',\n 'usage.magpieAccountPolicies': 'Codex 账号控制',\n 'usage.magpieResetCountLabel': '重置卡',\n 'usage.magpieResetCount': '{count} 张重置卡',\n 'usage.magpieResetWhenWeek': '周额度用尽时自动使用重置卡',\n 'usage.magpieResetBeforeExpiry': '重置卡到期前自动使用',\n 'usage.magpieUseCredits': '额度用尽后使用点数',\n 'usage.magpieUseReset': '使用一张重置卡',\n 'usage.magpieUpdated': '更新于 {time}',\n 'usage.magpieAgent': 'Agent:{agent}',\n 'usage.magpieSessionNoUsage': '今天还没有找到此会话的用量。',\n 'usage.magpieSessionIdUnavailable': '无法将当前 Agent 会话与 Magpie 对应。',\n 'usage.magpieRouteUnavailable': '暂时无法读取 Magpie 路由信息。',\n 'usage.magpieRouteNoRequests': 'Magpie 尚无此会话的路由记录。',\n 'usage.magpieAskedModel': '请求的模型',\n 'usage.magpieRouteGroup': '路由分组',\n 'usage.magpieRouteRule': '路由规则',\n 'usage.magpieRouteAccount': '上游账号',\n 'usage.magpieRoutedModel': '当前目标',\n 'usage.magpieServedModel': '实际响应模型',\n 'usage.magpieEffort': '推理强度',\n 'usage.magpieRequestStatus': '请求状态',\n 'usage.magpieRouteDone': '已完成 · ',\n 'usage.magpieRouteRunning': '进行中 · ',\n 'usage.magpieAttempts': '尝试记录',\n 'usage.magpieUnknownModel': '上游未提供模型名',\n 'usage.magpieFallback': '已回退',\n 'usage.magpieQuotaTitle': '上游配额',\n 'usage.magpieQuotaUnavailable': '暂时无法读取 Magpie 配额。',\n 'usage.magpieQuotaProviderUnavailable': '尚未识别此会话实际使用的上游提供商。',\n 'usage.magpieQuotaNoData': '上游提供商没有报告配额信息。',\n 'usage.magpieQuotaNoWindows': '上游没有报告配额窗口。',\n 'usage.magpieQuotaAccount': '账号:{account}',\n 'usage.magpieQuotaBalance': '余额:{balance}',\n 'usage.magpieQuotaRemaining': '{name} 剩余 {percent}%',\n 'usage.magpieQuotaResets': '重置于 {time}',\n 'usage.magpieRouteFlowTitle': '路由流转',\n 'usage.magpieRouteComplete': '已完成',\n 'accountBar.userFallback': '用户',\n 'accountBar.connectionManageTitle': '连接管理 · 管理其他 DSH Host',\n 'accountBar.identityClickHint': '{identity} · 点击管理登录',\n 'accountBar.connectionManage': '连接管理',\n 'accountBar.userAria': '用户:{identity}',\n 'accountBar.localAccount': '{identity}(本地账号)',\n 'accountBar.unknownAccount': '未识别账号',\n 'accountBar.access': '访问:{access}',\n 'accountBar.accessWithLatency': '访问:{access} · {latency} ms',\n 'accountBar.memory': '内存',\n 'accountBar.hostCpu': '主机 CPU',\n 'accountBar.hostMemory': '主机内存',\n 'accountBar.managePeerHost': '管理 PeerHost',\n 'accountBar.managePeerHostHint': '连接和管理其他 DSH Host',\n 'accountBar.loggingOut': '注销中…',\n 'accountBar.logout': '注销登录',\n 'accountBar.relay': '中转',\n 'accountBar.direct': '直连',\n // Magpie 订阅卡的签到状态、账号分组与重置卡文案。\n 'usage.checkinClaimed': '今日已签到{credit} · {streak}',\n 'usage.checkinStreak': '连续 {days} 天',\n 'usage.checkinFailed': '签到失败',\n 'usage.checkinIneligible': '该账号不参与签到',\n 'usage.checkinInactive': '未启用签到',\n 'usage.checkinCaptcha': '签到需要验证码',\n 'usage.checkinOwnApp': '请在官方 App 内签到',\n 'usage.checkinPending': '今日尚未签到',\n 'usage.checkinUnknown': '签到状态未知',\n 'usage.quotaActiveAccount': '使用中',\n 'usage.quotaGroupAccounts': '{count} 个账号',\n 'usage.quotaCollapseAccounts': '收起账号明细',\n 'usage.quotaExpandAccounts': '展开账号明细',\n 'usage.quotaDailyTotal': '今日 {amount}',\n 'usage.quotaPlanUntil': '套餐到期',\n 'usage.quotaReadFailed': '读取失败:{reason}',\n 'usage.quotaRunsOut': '按当前速度,{amount} 将在 {time} 耗尽',\n 'usage.resetCardsLabel': '重置卡',\n 'usage.resetCardsByWindow': '重置卡 · 5 小时 {fiveHour} · 每周 {weekly}',\n 'usage.resetCardsCount': '{count} 张重置卡',\n 'usage.resetCardsExpiresAt': '最近到期 {time}',\n // 路由标题栏的“查看请求”入口与请求模态框;明细文案复用 magpie.* 词典。\n 'usage.magpieViewRequests': '查看请求',\n 'usage.magpieRequestsTitle': 'Magpie 请求',\n 'usage.magpieRequestsClose': '关闭',\n}\n","/**\n * subagentCollapsed 域词典片段。\n *\n * 停止子 Agent 分组的专用文案;键名按 `<域>.<语义>` 规则加前缀,\n * 合并与命名空间注册由 ../locale.ts 统一完成,运行时的组件命名空间\n * 注册仍使用同一份 zh/en。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const zh = {\n 'subagentCollapsed.inactive.one': '已停止 {count} 个子智能体',\n 'subagentCollapsed.inactive.other': '已停止 {count} 个子智能体',\n 'subagentCollapsed.inactive.expand': '展开已停止的子智能体',\n 'subagentCollapsed.inactive.collapse': '收起已停止的子智能体',\n 'subagentCollapsed.count.total.one': '{count} 个子智能体',\n 'subagentCollapsed.count.total.other': '{count} 个子智能体',\n 'subagentCollapsed.count.running.one': '{count} 个子智能体,正在运行',\n 'subagentCollapsed.count.running.other': '{count} 个子智能体,正在运行',\n 'subagentCollapsed.activity.running': '正在运行',\n 'subagentCollapsed.activity.completed': '已完成',\n 'subagentCollapsed.activity.inactive': '当前未运行',\n 'subagentCollapsed.tokens.thousand': '{value}K',\n 'subagentCollapsed.tokens.million': '{value}M',\n 'subagentCollapsed.tokens.total': '{value} tok',\n 'subagentCollapsed.duration.seconds': '{seconds}秒',\n 'subagentCollapsed.duration.minutes': '{minutes}分{seconds}秒',\n 'subagentCollapsed.duration.hours': '{hours}小时{minutes}分{seconds}秒',\n 'subagentCollapsed.duration.days': '{days}天',\n 'subagentCollapsed.duration.daysHours': '{days}天{hours}小时',\n 'subagentCollapsed.duration.months': '{months}个月',\n 'subagentCollapsed.duration.monthsDays': '{months}个月{days}天',\n 'subagentCollapsed.duration.years': '{years}年',\n 'subagentCollapsed.duration.yearsMonths': '{years}年{months}个月',\n 'subagentCollapsed.duration.exactDays': '{days}天 {hours}:{minutes}:{seconds}',\n 'subagentCollapsed.duration.exactTitle': '用时 {duration}',\n 'subagentCollapsed.mode.oneShot': '一次性',\n 'subagentCollapsed.mode.continuable': '可继续',\n 'subagentCollapsed.mode.unknown': '模式未知',\n 'subagentCollapsed.branch.collapse': '收起 {label} 的下级子智能体',\n 'subagentCollapsed.branch.expand': '展开 {label} 的下级子智能体',\n 'subagentCollapsed.loading.label': '正在加载子智能体…',\n 'subagentCollapsed.loading.aria': '正在加载子智能体',\n 'subagentCollapsed.load.error': '无法加载子智能体',\n 'subagentCollapsed.retry': '重试',\n 'subagentCollapsed.diagnostic.corrupt': '会话记录损坏',\n 'subagentCollapsed.diagnostic.unsupported': '子智能体记录版本不受支持',\n 'subagentCollapsed.diagnostic.unavailable': '会话记录暂不可用',\n 'subagentCollapsed.tree.aria': '子智能体会话',\n 'subagentCollapsed.switcher.aria': '切换到 {title}',\n 'subagentCollapsed.open.sidebar': '在侧边栏打开',\n 'subagentCollapsed.open.sidebar.aria': '在侧边栏打开 {label}',\n}\n\nexport const en: Record<keyof typeof zh, string> = {\n 'subagentCollapsed.inactive.one': '{count} stopped subagent',\n 'subagentCollapsed.inactive.other': '{count} stopped subagents',\n 'subagentCollapsed.inactive.expand': 'Show stopped subagents',\n 'subagentCollapsed.inactive.collapse': 'Hide stopped subagents',\n 'subagentCollapsed.count.total.one': '{count} subagent',\n 'subagentCollapsed.count.total.other': '{count} subagents',\n 'subagentCollapsed.count.running.one': '{count} subagent running',\n 'subagentCollapsed.count.running.other': '{count} subagents running',\n 'subagentCollapsed.activity.running': 'running',\n 'subagentCollapsed.activity.completed': 'completed',\n 'subagentCollapsed.activity.inactive': 'not running',\n 'subagentCollapsed.tokens.thousand': '{value}K',\n 'subagentCollapsed.tokens.million': '{value}M',\n 'subagentCollapsed.tokens.total': '{value} tok',\n 'subagentCollapsed.duration.seconds': '{seconds}s',\n 'subagentCollapsed.duration.minutes': '{minutes}m {seconds}s',\n 'subagentCollapsed.duration.hours': '{hours}h {minutes}m {seconds}s',\n 'subagentCollapsed.duration.days': '{days}d',\n 'subagentCollapsed.duration.daysHours': '{days}d {hours}h',\n 'subagentCollapsed.duration.months': '{months}mo',\n 'subagentCollapsed.duration.monthsDays': '{months}mo {days}d',\n 'subagentCollapsed.duration.years': '{years}y',\n 'subagentCollapsed.duration.yearsMonths': '{years}y {months}mo',\n 'subagentCollapsed.duration.exactDays': '{days}d {hours}:{minutes}:{seconds}',\n 'subagentCollapsed.duration.exactTitle': 'Duration {duration}',\n 'subagentCollapsed.mode.oneShot': 'one-shot',\n 'subagentCollapsed.mode.continuable': 'continuable',\n 'subagentCollapsed.mode.unknown': 'unknown mode',\n 'subagentCollapsed.branch.collapse': 'Collapse {label} descendants',\n 'subagentCollapsed.branch.expand': 'Expand {label} descendants',\n 'subagentCollapsed.loading.label': 'Loading subagents…',\n 'subagentCollapsed.loading.aria': 'Loading subagents',\n 'subagentCollapsed.load.error': 'Unable to load subagents',\n 'subagentCollapsed.retry': 'Retry',\n 'subagentCollapsed.diagnostic.corrupt': 'corrupted session record',\n 'subagentCollapsed.diagnostic.unsupported': 'unsupported subagent record version',\n 'subagentCollapsed.diagnostic.unavailable': 'session record temporarily unavailable',\n 'subagentCollapsed.tree.aria': 'Subagent sessions',\n 'subagentCollapsed.switcher.aria': 'Switch to {title}',\n 'subagentCollapsed.open.sidebar': 'Open in sidebar',\n 'subagentCollapsed.open.sidebar.aria': 'Open {label} in sidebar',\n}\n","/** Shared by the client dictionary and the isolated credential landing page. */\nexport const quickAppBootstrapEn = {\n 'quickApps.opening': 'Opening application…',\n 'quickApps.bootstrapFailed': 'Application access could not be established. Reopen it from Quick Apps and check browser cookie settings.',\n}\nexport const quickAppBootstrapZh: Record<keyof typeof quickAppBootstrapEn, string> = {\n 'quickApps.opening': '正在打开应用…',\n 'quickApps.bootstrapFailed': '无法建立应用访问,请从快捷应用重新打开并检查浏览器 Cookie 设置。',\n}\n","import { quickAppBootstrapEn, quickAppBootstrapZh } from '../../shared/quick-apps-bootstrap-locale.js'\n\nexport const en = {\n 'quickApps.storagePreview': 'App data is saved in this browser. IndexedDB and URLs starting with / are not supported in this view.',\n 'quickApps.storageFailed': 'App data could not be saved in this browser: {message}',\n 'quickApps.sandboxPreview': 'Workspace preview. Browser storage and URLs starting with / may not work in this view.',\n 'quickApps.runtime.not-configured': 'This Host does not provide workspace HTML previews. Update its CodingNS plugin and reopen the shortcut.',\n 'quickApps.runtime.config-invalid': 'The Host’s HTML hosting configuration or TLS certificate is invalid.',\n 'quickApps.runtime.lan-stopped': 'Start LAN access on the owning Host to open this HTML app.',\n 'quickApps.runtime.ui-not-allowed': 'This DSH address is not enabled in the Host’s HTML hosting configuration.',\n 'quickApps.runtime.ports-exhausted': 'The reserved app ports have all been used. Extend the Host’s app port range; previously used ports cannot be reassigned.',\n 'quickApps.runtime.ports-busy': 'The available app ports are currently in use. Try again after they are released.',\n 'quickApps.workspaceAccessHelp': 'Saving lets this app read, create, update and delete files in {workspace}. Hidden files, credentials and other workspaces stay protected.',\n 'quickApps.saveWorkspaceAccess': 'Save and allow workspace access',\n 'quickApps.workspaceAccessHostUpdate': 'This Host needs an update to support workspace access. The shortcut was saved without enabling it.',\n 'quickApps.workspaceAccessUnavailable': 'Update the owning Host to support workspace access. The shortcut was not changed.',\n 'quickApps.markdown': 'Markdown', 'quickApps.source': 'Source', 'quickApps.viewMode': 'View as',\n 'quickApps.markdownUnavailable': 'Native Markdown preview is unavailable in this DSH version. Showing source.',\n 'quickApps.maximize': 'Maximize viewer', 'quickApps.restore': 'Restore viewer', 'quickApps.loadingDocument': 'Loading…',\n 'quickApps.documentEditor': 'Document editor', 'quickApps.editorFailed': 'The editor could not load.',\n 'quickApps.copyCode': 'Copy code', 'quickApps.copied': 'Copied', 'quickApps.code': 'Code', 'quickApps.footnotes': 'Footnotes', 'quickApps.unwrapText': 'Disable wrapping',\n 'quickApps.imagesUnavailable': 'Some images are unavailable or outside this document folder.',\n 'quickApps.documentHome': 'Back to entry document', 'quickApps.documentLinkDenied': 'This link is outside the document folder or uses an unsupported path.',\n 'quickApps.documentHostUpdate': 'Update the owning Host plugin to enable document operations. This document remains viewable.',\n 'quickApps.documentConflict': 'The file changed on the Host. Your draft is preserved. Copy your changes before reloading the latest file.',\n 'quickApps.documentAccessExpired': 'Document access has ended or is unavailable. Your draft is preserved; copy it before closing and reopening the shortcut.',\n 'quickApps.documentSaved': 'Saved to the workspace.', 'quickApps.unsaved': 'Unsaved changes',\n 'quickApps.allowEditing': 'Allow editing', 'quickApps.allowEditingHelp': 'Allow changes to {path}? This approval applies only to this file and ends when you close the viewer.',\n 'quickApps.discardTitle': 'Unsaved changes', 'quickApps.discard': 'Discard changes', 'quickApps.discardHelp': 'Your changes to {path} have not been saved. Discard them and continue?',\n 'quickApps.viewerTools': 'Viewer controls', 'quickApps.wrapText': 'Wrap text', 'quickApps.reloadView': 'Reload', 'quickApps.entryAddress': 'Application entry address',\n 'quickApps.noWorkspaces': 'No managed workspaces available', 'quickApps.browse': 'Browse…',\n 'quickApps.chooseFile': 'Choose a workspace file', 'quickApps.useFile': 'Use this file', 'quickApps.currentFolder': 'Current folder',\n 'quickApps.parentFolder': 'Go to parent folder',\n 'quickApps.refreshFiles': 'Refresh', 'quickApps.loadingFiles': 'Loading files…', 'quickApps.emptyFolder': 'This folder has no selectable files or folders.',\n 'quickApps.filesTruncated': 'Only the first part of this folder is shown. You can enter the file path directly.',\n 'quickApps.selectFileHint': 'Open a folder, then select an HTML application or text document.',\n 'quickApps.browseUnavailable': 'File browsing is unavailable on this Host. You can still enter a workspace-relative file path.',\n 'quickApps.browseHostUpdateRequired': 'This Host does not support file browsing. Update or reload its CodingNS plugin, then refresh this page. You can still enter a workspace-relative file path.',\n ...quickAppBootstrapEn,\n 'quickApps.manage': 'Edit shortcuts', 'quickApps.done': 'Done', 'quickApps.editShortcut': 'Edit shortcut',\n 'quickApps.collapseBar': 'Collapse Quick Apps', 'quickApps.expandBar': 'Restore Quick Apps', 'quickApps.removeNamed': 'Remove {title}',\n 'quickApps.reorderHelp': 'Drag to reorder, or use Alt + arrow keys.', 'quickApps.reordered': 'Shortcut order saved.',\n 'quickApps.manageHelp': 'Choose a shortcut to edit its source, permissions or remove it.',\n 'quickApps.openNamed': 'Open {title}', 'quickApps.editNamed': 'Edit {title}',\n 'quickApps.count': 'Shortcuts: {count}', 'quickApps.loading': 'Loading shortcuts…', 'quickApps.retry': 'Try again',\n 'quickApps.emptyTitle': 'Your workspace, one click away',\n 'quickApps.advanced': 'Advanced options', 'quickApps.accessAndRemoval': 'Access and shortcut management',\n 'quickApps.titleHelp': 'Leave blank to use the file or application folder name.',\n 'quickApps.entryHelp': 'Choose a file or enter its path within the workspace.',\n 'quickApps.entryPlaceholder': 'apps/calendar/index.html',\n 'quickApps.entryRequired': 'Enter an application or document file path.', 'quickApps.orderInvalid': 'Use a whole number for the list order.',\n 'quickApps.saved': 'Shortcut saved.', 'quickApps.revoked': 'File access revoked. Existing launches have closed.',\n 'quickApps.saveBeforeAccess': 'Save your changes before managing access or removing this shortcut.',\n 'quickApps.conflict': 'This shortcut changed elsewhere. Your edits are still here; reopen the shortcut to load the latest version.',\n 'quickApps.order': 'List order', 'quickApps.mounts': 'Additional resource folders (optional)',\n 'quickApps.mount.urlPrefix': 'App URL path', 'quickApps.mount.workspacePath': 'Workspace folder',\n 'quickApps.addMount': 'Add resource folder', 'quickApps.removeMount': 'Remove resource folder',\n 'quickApps.title': 'Quick Apps', 'quickApps.description': 'Open workspace HTML applications and text documents without a conversation.',\n 'quickApps.close': 'Close Quick Apps', 'quickApps.back': 'Back to shortcuts', 'quickApps.application': 'Workspace application',\n 'quickApps.add': 'Add shortcut', 'quickApps.open': 'Open', 'quickApps.edit': 'Edit', 'quickApps.remove': 'Remove shortcut',\n 'quickApps.permissions': 'File permissions', 'quickApps.revoke': 'Revoke access', 'quickApps.save': 'Save', 'quickApps.cancel': 'Cancel',\n 'quickApps.titleField': 'Title', 'quickApps.entryPath': 'Entry file', 'quickApps.documentRoot': 'Application folder',\n 'quickApps.workspace': 'Workspace', 'quickApps.chooseWorkspace': 'Choose a managed workspace', 'quickApps.localHost': 'This Host',\n 'quickApps.kind': 'Open as', 'quickApps.html': 'HTML application', 'quickApps.text': 'Text document',\n 'quickApps.networkAllow': 'Local addresses',\n 'quickApps.networkAllowHelp': 'Leave this empty to block loopback, private networks, link-local addresses, and cloud metadata. Add one local IP, CIDR range, or hostname per line, up to 16. Examples: 127.0.0.1, localhost, 192.168.1.0/24.',\n 'quickApps.networkAllowPlaceholder': '127.0.0.1\\nlocalhost\\n192.168.1.0/24',\n 'quickApps.networkAllowInvalid': 'Use a local IP address, CIDR range, or hostname, with one entry per line.',\n 'quickApps.spa': 'Use the entry page for application navigation',\n 'quickApps.pathHelp': 'Enter workspace-relative paths. Use a dedicated application folder; an empty folder path selects the workspace root.',\n 'quickApps.empty': 'No shortcuts yet. In edit mode, add an HTML application or text document from a managed workspace.',\n 'quickApps.removeHelp': 'Removing a shortcut leaves its source files intact.',\n 'quickApps.permissionHelp': 'Optional file access for the next launch. Enter comma-separated workspace-relative folders; leave blank to deny. Approvals expire when the Host restarts or the shortcut or application code changes. Saving closes existing launches.',\n 'quickApps.permission.read': 'Read folders', 'quickApps.permission.write': 'Create and update folders', 'quickApps.permission.delete': 'Delete files in folders',\n 'quickApps.permissionsSaved': 'Permissions saved for the next launch.',\n 'quickApps.unavailable': 'HTML preview is unavailable on this Host connection. Update the owning Host plugin and reopen the shortcut.',\n 'quickApps.status.unsupported-runtime': 'HTML preview is unavailable on this Host connection.',\n 'quickApps.status.disconnected-host': 'The owning Host has no supported Quick Apps connection.',\n 'quickApps.status.unsupported-connection': 'This PeerHost relay cannot open Quick Apps. Use a direct connection to the owning Host.',\n 'quickApps.status.missing-workspace': 'The original workspace is unavailable.',\n 'quickApps.status.missing-file': 'The entry file or application folder is missing or cannot be accessed.',\n}\nexport const zh: Record<keyof typeof en, string> = {\n 'quickApps.storagePreview': '应用数据保存在当前浏览器中。此视图不支持 IndexedDB 和以 / 开头的网址。',\n 'quickApps.storageFailed': '无法在当前浏览器中保存应用数据:{message}',\n 'quickApps.sandboxPreview': '工作区预览:浏览器存储和以 / 开头的网址可能无法在此视图中使用。',\n 'quickApps.runtime.not-configured': '此主机尚不支持工作区 HTML 预览,请更新其 CodingNS 插件后重新打开快捷方式。',\n 'quickApps.runtime.config-invalid': '主机的 HTML 托管配置或 TLS 证书无效。',\n 'quickApps.runtime.lan-stopped': '请先在所属主机启动局域网访问,再打开此 HTML 应用。',\n 'quickApps.runtime.ui-not-allowed': '主机的 HTML 托管配置尚未启用当前 DSH 地址。',\n 'quickApps.runtime.ports-exhausted': '预留的应用端口已全部使用,请扩展主机的应用端口范围;已用端口不能重新分配。',\n 'quickApps.runtime.ports-busy': '可用的应用端口正被占用,请在端口释放后重试。',\n 'quickApps.workspaceAccessHelp': '保存后,此应用可读取、新建、修改和删除 {workspace} 中的文件。隐藏文件、凭据和其他工作区仍受保护。',\n 'quickApps.saveWorkspaceAccess': '保存并允许访问工作区',\n 'quickApps.workspaceAccessHostUpdate': '所属主机需要更新才能支持工作区访问。快捷方式已保存,但尚未启用此权限。',\n 'quickApps.workspaceAccessUnavailable': '请更新所属主机以支持工作区访问。快捷方式未更改。',\n 'quickApps.markdown': 'Markdown', 'quickApps.source': '源码', 'quickApps.viewMode': '查看方式',\n 'quickApps.markdownUnavailable': '当前 DSH 版本不支持原生 Markdown 预览,已显示源码。',\n 'quickApps.maximize': '最大化查看器', 'quickApps.restore': '还原查看器', 'quickApps.loadingDocument': '正在加载…',\n 'quickApps.documentEditor': '文档编辑器', 'quickApps.editorFailed': '编辑器加载失败。',\n 'quickApps.copyCode': '复制代码', 'quickApps.copied': '已复制', 'quickApps.code': '代码', 'quickApps.footnotes': '脚注', 'quickApps.unwrapText': '关闭自动换行',\n 'quickApps.imagesUnavailable': '部分图片不可用或位于文档目录之外。',\n 'quickApps.documentHome': '返回入口文档', 'quickApps.documentLinkDenied': '链接位于文档目录之外或使用了不支持的路径。',\n 'quickApps.documentHostUpdate': '请更新所属主机插件以启用文档操作,当前文档仍可查看。',\n 'quickApps.documentConflict': '主机上的文件已更改,你的草稿仍然保留。请先复制修改内容,再重新加载最新文件。',\n 'quickApps.documentAccessExpired': '文档访问已结束或不可用,草稿仍然保留。请先复制草稿,再关闭并重新打开快捷方式。',\n 'quickApps.documentSaved': '已保存到工作区。', 'quickApps.unsaved': '有未保存的修改',\n 'quickApps.allowEditing': '允许编辑', 'quickApps.allowEditingHelp': '允许修改 {path} 吗?本次授权仅适用于此文件,关闭查看器后失效。',\n 'quickApps.discardTitle': '有未保存的修改', 'quickApps.discard': '放弃修改', 'quickApps.discardHelp': '对 {path} 的修改尚未保存。是否放弃修改并继续?',\n 'quickApps.viewerTools': '查看器工具', 'quickApps.wrapText': '自动换行', 'quickApps.reloadView': '重新加载', 'quickApps.entryAddress': '应用入口地址',\n 'quickApps.noWorkspaces': '暂无可用的受管工作区', 'quickApps.browse': '浏览…',\n 'quickApps.chooseFile': '选择工作区文件', 'quickApps.useFile': '使用此文件', 'quickApps.currentFolder': '当前目录',\n 'quickApps.parentFolder': '返回上级目录',\n 'quickApps.refreshFiles': '刷新', 'quickApps.loadingFiles': '正在加载文件…', 'quickApps.emptyFolder': '此目录没有可选择的文件或文件夹。',\n 'quickApps.filesTruncated': '当前仅显示部分内容,也可直接填写文件路径。',\n 'quickApps.selectFileHint': '打开文件夹,再选择 HTML 应用或文本文档。',\n 'quickApps.browseUnavailable': '此主机暂不支持文件浏览,仍可填写相对于工作区的文件路径。',\n 'quickApps.browseHostUpdateRequired': '此主机尚不支持文件浏览。请更新或重新加载该主机的 CodingNS 插件后刷新页面,也可直接填写相对于工作区的文件路径。',\n ...quickAppBootstrapZh,\n 'quickApps.manage': '编辑快捷应用', 'quickApps.done': '完成', 'quickApps.editShortcut': '编辑快捷方式',\n 'quickApps.collapseBar': '收起快捷应用', 'quickApps.expandBar': '展开快捷应用', 'quickApps.removeNamed': '移除{title}',\n 'quickApps.reorderHelp': '拖动调整顺序,或使用 Alt + 方向键。', 'quickApps.reordered': '快捷应用顺序已保存。',\n 'quickApps.manageHelp': '选择快捷应用,修改来源、设置权限或移除快捷方式。',\n 'quickApps.openNamed': '打开{title}', 'quickApps.editNamed': '编辑{title}',\n 'quickApps.count': '{count} 个快捷应用', 'quickApps.loading': '正在加载快捷应用…', 'quickApps.retry': '重试',\n 'quickApps.emptyTitle': '一键打开工作区里的应用与文档',\n 'quickApps.advanced': '高级选项', 'quickApps.accessAndRemoval': '访问与快捷方式管理',\n 'quickApps.titleHelp': '留空则使用文件名或应用目录名。',\n 'quickApps.entryHelp': '选择文件,或填写它在工作区内的路径。',\n 'quickApps.entryPlaceholder': 'apps/calendar/index.html',\n 'quickApps.entryRequired': '请填写应用或文档的文件路径。', 'quickApps.orderInvalid': '列表顺序请填写整数。',\n 'quickApps.saved': '快捷方式已保存。', 'quickApps.revoked': '文件访问权限已撤销,已打开的应用已关闭。',\n 'quickApps.saveBeforeAccess': '请先保存修改,再管理访问权限或移除此快捷方式。',\n 'quickApps.conflict': '此快捷方式已在其他位置更新。你的修改仍保留在此处,重新打开快捷方式可加载最新版本。',\n 'quickApps.order': '列表顺序', 'quickApps.mounts': '附加资源目录(可选)',\n 'quickApps.mount.urlPrefix': '应用网址路径', 'quickApps.mount.workspacePath': '工作区目录',\n 'quickApps.addMount': '添加资源目录', 'quickApps.removeMount': '移除资源目录',\n 'quickApps.title': '快捷应用', 'quickApps.description': '无需打开会话,即可访问工作区内的 HTML 应用和文本文档。',\n 'quickApps.close': '关闭快捷应用', 'quickApps.back': '返回快捷列表', 'quickApps.application': '工作区应用',\n 'quickApps.add': '添加快捷方式', 'quickApps.open': '打开', 'quickApps.edit': '编辑', 'quickApps.remove': '移除快捷方式',\n 'quickApps.permissions': '文件权限', 'quickApps.revoke': '撤销访问', 'quickApps.save': '保存', 'quickApps.cancel': '取消',\n 'quickApps.titleField': '名称', 'quickApps.entryPath': '入口文件', 'quickApps.documentRoot': '应用目录',\n 'quickApps.workspace': '工作区', 'quickApps.chooseWorkspace': '选择受管工作区', 'quickApps.localHost': '当前主机',\n 'quickApps.kind': '打开方式', 'quickApps.html': 'HTML 应用', 'quickApps.text': '文本文档',\n 'quickApps.networkAllow': '允许的本地地址',\n 'quickApps.networkAllowHelp': '留空则拒绝回环、私网、链路本地和云元数据地址。每行填写一个本地 IP、CIDR 网段或主机名,最多 16 个。例如 127.0.0.1、localhost、192.168.1.0/24。',\n 'quickApps.networkAllowPlaceholder': '127.0.0.1\\nlocalhost\\n192.168.1.0/24',\n 'quickApps.networkAllowInvalid': '请逐行填写本地 IP、CIDR 网段或主机名。',\n 'quickApps.spa': '应用内导航使用入口页面',\n 'quickApps.pathHelp': '填写相对于工作区的路径。建议使用专用应用目录;目录留空表示工作区根目录。',\n 'quickApps.empty': '还没有快捷方式。可在编辑模式下从受管工作区添加 HTML 应用或文本文档。',\n 'quickApps.removeHelp': '移除快捷方式不会删除源文件。',\n 'quickApps.permissionHelp': '为下次打开应用设置可选文件权限。填写相对于工作区的目录,以逗号分隔;留空表示禁止。主机重启、快捷方式或应用代码变更后需要重新授权。保存会关闭现有应用。',\n 'quickApps.permission.read': '允许读取的目录', 'quickApps.permission.write': '允许创建和更新的目录', 'quickApps.permission.delete': '允许删除文件的目录',\n 'quickApps.permissionsSaved': '已保存下次打开应用时使用的权限。',\n 'quickApps.unavailable': '当前主机连接暂不支持 HTML 预览,请更新所属主机插件后重新打开快捷方式。',\n 'quickApps.status.unsupported-runtime': '当前主机连接暂不支持 HTML 预览。',\n 'quickApps.status.disconnected-host': '所属主机暂不支持快捷应用连接。',\n 'quickApps.status.unsupported-connection': '此 PeerHost 中转连接无法打开快捷应用,请使用直连方式连接所属主机。',\n 'quickApps.status.missing-workspace': '原工作区不可用。',\n 'quickApps.status.missing-file': '入口文件或应用目录不存在或无法访问。',\n}\n","export const en: Record<string, string> = {\n 'cli.team.label': 'Team eligibility',\n 'cli.team.leadAndMember': 'Collaborator and Lead',\n 'cli.team.member': 'Collaborator',\n 'cli.team.reason.version': 'Full Team support requires a verified DSH alpha.2 or alpha.3 host.',\n 'cli.team.reason.profile': 'Enable the native DSH Team profile to use Teams.',\n 'cli.team.reason.disabled': 'Enable the CodingNS bridge and this Agent to use Teams.',\n 'cli.team.reason.adapter': 'This Agent does not provide the required Team tool transport.',\n 'cli.team.reason.installation': 'Install and enable this Agent before using Teams.',\n 'cli.manage.reasonLabel.application-managed': 'Check in app',\n 'cli.manage.reasonLabel.unknown-version': 'Version unknown',\n 'cli.manage.reasonLabel.legacy-distribution': 'Legacy distribution',\n 'cli.manage.reasonLabel.no-release-source': 'No verified feed',\n 'cli.manage.reasonLabel.incomparable-version': 'Different release channel',\n 'cli.manage.reason.application-managed': 'This Agent is managed by its application. No comparable runtime release feed is verified; use the application’s Check for Updates.',\n 'cli.manage.reason.unknown-version': 'The installed version could not be identified. Re-detect the Agent before comparing releases.',\n 'cli.manage.reason.legacy-distribution': 'This legacy distribution has no comparable current release feed. See the official migration guide.',\n 'cli.manage.reason.no-release-source': 'No verified release feed is available for this installation and platform. See the official guide.',\n 'cli.manage.reason.incomparable-version': 'The installed and published versions use different release channels and cannot be compared safely.',\n 'cli.manage.availableInApp': 'Version {version} is available. Complete the update in {name}.',\n 'cli.manage.updateInApp': 'Update in app',\n 'cli.manage.open': 'Manage external Agents',\n 'cli.manage.listTitle': 'External Agents',\n 'cli.manage.details': 'Details',\n 'cli.manage.methodUnknown': 'No supported automatic updater was identified for this installation. Re-detect to retry, or follow the official guide below.',\n 'cli.manage.hostUnsupported': 'This Host has not loaded update checking. Reload the Host with the current plugin, then refresh this list.',\n 'cli.manage.state.unchecked': 'Not checked',\n 'cli.manage.state.checking': 'Checking…',\n 'cli.manage.state.current': 'Up to date',\n 'cli.manage.state.unavailable': 'Check manually',\n 'cli.manage.state.error': 'Check failed',\n 'cli.manage.failure.timeout': 'Release check timed out. Refresh to retry.',\n 'cli.manage.failure.network': 'Could not reach the release source. Check the Host network and refresh.',\n 'cli.manage.failure.http': 'The release source returned HTTP {status}. Refresh to retry.',\n 'cli.manage.failure.invalid-response': 'The release source returned invalid metadata. Use the official guide.',\n 'cli.manage.install': 'Install',\n 'cli.manage.update': 'Update',\n 'cli.manage.unchecked': 'Use Refresh to check for updates',\n 'cli.manage.checking': 'Checking for updates…',\n 'cli.manage.available': 'Update available: {version}',\n 'cli.manage.current': 'No newer release found',\n 'cli.manage.unavailable': 'No comparable release found. Check the official update guide.',\n 'cli.manage.error': 'Update check failed. Refresh to retry.',\n 'cli.manage.title': '{action} {name}',\n 'cli.manage.host': 'Target Host: {name} ({platform})',\n 'cli.manage.loading': 'Checking the Agent and official methods…',\n 'cli.manage.review': 'Review the command and prerequisites. It runs on this Host with your user account. Updates may require restarting Agent sessions.',\n 'cli.manage.source': 'Official installation and update guide',\n 'cli.manage.run': 'Run {action}',\n 'cli.manage.running': 'Running…',\n 'cli.manage.result.running': '{action} in progress',\n 'cli.manage.result.succeeded': '{action} completed',\n 'cli.manage.result.failed': '{action} failed',\n 'cli.manage.result.cancelled': '{action} cancelled',\n 'cli.manage.log.running': 'Live',\n 'cli.manage.log.succeeded': 'Completed',\n 'cli.manage.log.failed': 'Failed',\n 'cli.manage.log.cancelled': 'Cancelled',\n 'cli.manage.waitingOutput': 'Waiting for output…',\n 'cli.manage.emptyOutput': 'The command produced no output.',\n 'cli.manage.latestOutput': 'Jump to latest ↓',\n 'cli.manage.catalog.refreshing': 'Refreshing the Agent list…',\n 'cli.manage.catalog.refreshed': 'Agent list refreshed with the detected version.',\n 'cli.manage.catalog.failed': 'The update succeeded, but the Agent list could not be refreshed.',\n 'cli.manage.refreshList': 'Refresh list',\n 'cli.manage.succeeded': 'Command completed. Detected version: {version}',\n 'cli.manage.failed': 'The operation failed.',\n 'cli.manage.cancelled': 'The operation was cancelled.',\n 'cli.manage.cancel': 'Cancel operation',\n 'cli.manage.close': 'Close',\n 'cli.manage.redetect': 'Re-detect installation',\n 'cli.manage.output': 'Command output',\n 'cli.manage.background': 'You can close this dialog and return to this Agent to see the result.',\n 'cli.manage.otherBusy': 'Another Agent operation is running on this Host: {name}',\n 'cli.manage.retryStatus': 'Retry status',\n 'cli.manage.reviewAgain': 'Review another operation',\n}\n\nexport const zh: Record<string, string> = {\n 'cli.team.label': '团队适配能力',\n 'cli.team.leadAndMember': '协作者和管理者',\n 'cli.team.member': '协作者',\n 'cli.team.reason.version': '完整团队功能需要经过验证的 DSH alpha.2 或 alpha.3 主机。',\n 'cli.team.reason.profile': '请启用 DSH 原生团队配置后使用团队功能。',\n 'cli.team.reason.disabled': '请启用 CodingNS 桥接和此 Agent 后使用团队功能。',\n 'cli.team.reason.adapter': '此 Agent 尚未提供所需的团队工具通道。',\n 'cli.team.reason.installation': '请先安装并启用此 Agent,再使用团队功能。',\n 'cli.manage.reasonLabel.application-managed': '在应用中检查',\n 'cli.manage.reasonLabel.unknown-version': '版本未知',\n 'cli.manage.reasonLabel.legacy-distribution': '旧版发行包',\n 'cli.manage.reasonLabel.no-release-source': '暂无可用版本源',\n 'cli.manage.reasonLabel.incomparable-version': '版本通道不同',\n 'cli.manage.reason.application-managed': '此 Agent 由所属应用管理,尚未验证可比较的运行时版本源,请使用应用内的“检查更新”。',\n 'cli.manage.reason.unknown-version': '无法识别已安装版本,请重新检测 Agent 后再比较版本。',\n 'cli.manage.reason.legacy-distribution': '此旧版发行包没有可比较的当前版本源,请查看官方迁移指南。',\n 'cli.manage.reason.no-release-source': '此安装和平台尚无经过验证的版本源,请查看官方指南。',\n 'cli.manage.reason.incomparable-version': '已安装版本与发布版本属于不同通道,无法可靠比较。',\n 'cli.manage.availableInApp': '发现版本 {version},请在 {name} 中完成更新。',\n 'cli.manage.updateInApp': '在应用中更新',\n 'cli.manage.open': '管理外部 Agent',\n 'cli.manage.listTitle': '外部 Agent',\n 'cli.manage.details': '详情',\n 'cli.manage.methodUnknown': '未能识别此安装的自动更新方式。可重新检测重试,或查看下方官方指南。',\n 'cli.manage.hostUnsupported': '此主机尚未加载更新检查功能。请让主机加载当前插件后,再刷新列表。',\n 'cli.manage.state.unchecked': '未检查更新',\n 'cli.manage.state.checking': '检查中…',\n 'cli.manage.state.current': '已是最新',\n 'cli.manage.state.unavailable': '需手动检查',\n 'cli.manage.state.error': '检查失败',\n 'cli.manage.failure.timeout': '版本检查超时,请刷新重试。',\n 'cli.manage.failure.network': '无法连接版本来源,请检查主机网络后刷新。',\n 'cli.manage.failure.http': '版本来源返回 HTTP {status},请刷新重试。',\n 'cli.manage.failure.invalid-response': '版本来源返回的数据无效,请查看官方指南。',\n 'cli.manage.install': '安装',\n 'cli.manage.update': '更新',\n 'cli.manage.unchecked': '点击刷新检查更新',\n 'cli.manage.checking': '正在检查更新…',\n 'cli.manage.available': '有新版本:{version}',\n 'cli.manage.current': '未发现更新版本',\n 'cli.manage.unavailable': '未找到可比较的版本,请查看官方更新指南。',\n 'cli.manage.error': '检查更新失败,请刷新重试。',\n 'cli.manage.title': '{action} {name}',\n 'cli.manage.host': '目标主机:{name}({platform})',\n 'cli.manage.loading': '正在检查 Agent 和官方安装方式…',\n 'cli.manage.review': '请核对命令和前置要求。命令将以当前用户在此主机上执行,更新后可能需要重新开启 Agent 会话。',\n 'cli.manage.source': '官方安装与更新指南',\n 'cli.manage.run': '执行{action}',\n 'cli.manage.running': '正在执行…',\n 'cli.manage.result.running': '正在{action}',\n 'cli.manage.result.succeeded': '{action}成功',\n 'cli.manage.result.failed': '{action}失败',\n 'cli.manage.result.cancelled': '已取消{action}',\n 'cli.manage.log.running': '实时输出',\n 'cli.manage.log.succeeded': '已完成',\n 'cli.manage.log.failed': '失败',\n 'cli.manage.log.cancelled': '已取消',\n 'cli.manage.waitingOutput': '等待命令输出…',\n 'cli.manage.emptyOutput': '命令未产生输出。',\n 'cli.manage.latestOutput': '跳至最新 ↓',\n 'cli.manage.catalog.refreshing': '正在刷新 Agent 列表…',\n 'cli.manage.catalog.refreshed': 'Agent 列表已刷新,当前显示检测到的新版本。',\n 'cli.manage.catalog.failed': '更新已成功,但 Agent 列表刷新失败。',\n 'cli.manage.refreshList': '刷新列表',\n 'cli.manage.succeeded': '命令已完成,检测到版本:{version}',\n 'cli.manage.failed': '操作失败。',\n 'cli.manage.cancelled': '操作已取消。',\n 'cli.manage.cancel': '取消操作',\n 'cli.manage.close': '关闭',\n 'cli.manage.redetect': '重新检测安装',\n 'cli.manage.output': '命令输出',\n 'cli.manage.background': '可以关闭此窗口,稍后再次打开此 Agent 查看结果。',\n 'cli.manage.otherBusy': '此主机上的另一个 Agent 操作正在执行:{name}',\n 'cli.manage.retryStatus': '重新查询状态',\n 'cli.manage.reviewAgain': '查看新的操作',\n}\n","/** Copy for the optional Magpie usage dashboard. */\nexport const en: Record<string, string> = {\n 'feature.magpieManagement.label': 'Magpie management and usage',\n 'feature.magpieManagement.description': 'Enable to add a separate Magpie Management page below Plugins in the global sidebar.',\n 'magpie.sidebarLabel': 'Magpie',\n 'magpie.context.system': 'System prompt',\n 'magpie.context.tools': 'Tools',\n 'magpie.context.memory': 'Memory',\n 'magpie.context.files': 'Files',\n 'magpie.context.results': 'Tool results',\n 'magpie.context.chat': 'Conversation content',\n 'magpie.context.usedPercent': 'Context used {percent}%',\n 'magpie.context.window': 'Context window',\n 'magpie.context.used': 'Used context',\n 'magpie.context.native': 'DSH context',\n 'magpie.context.nativeTools': 'Tool definitions',\n 'magpie.context.nativeMessages': 'Conversation messages',\n 'magpie.context.nativeComposition': 'Estimated composition (share of total)',\n 'magpie.context.modelWindow': 'Model window {value}',\n 'magpie.context.cache': 'Prompt cache',\n 'magpie.context.hit': 'hit',\n 'magpie.context.close': 'Close context',\n 'magpie.context.composition': 'Context composition',\n 'magpie.context.content': 'Content',\n 'magpie.context.all': 'All',\n 'magpie.context.allCount': 'All · {count}',\n 'magpie.context.empty': 'No content available',\n 'magpie.context.rounds': '{count} rounds',\n 'magpie.context.requests': '{count} requests',\n 'magpie.context.request': 'Request {count}',\n 'magpie.context.earlierRounds': 'Earlier {count} rounds',\n 'magpie.context.round': 'Round {count}',\n 'magpie.usage': 'Usage',\n 'magpie.routing': 'Routing',\n 'magpie.statTokens': 'Tokens',\n 'magpie.statCalls': 'Requests',\n 'magpie.statTurns': 'Turns',\n 'magpie.statSteps': 'Steps',\n 'magpie.statWriteDown': 'Output',\n 'magpie.statSessions': 'Sessions',\n 'magpie.statReasoning': 'Reasoning',\n 'magpie.statReasoningNote': 'Counted as output',\n 'magpie.statSpeed': 'Output speed',\n 'magpie.statLatency': 'First text',\n 'magpie.statLatencyNote': 'Average first-text latency',\n 'magpie.topSessions': 'Top sessions',\n 'magpie.dailyTrend': 'Daily trend',\n 'magpie.ncolTime': 'Time',\n 'magpie.ncolRequested': 'Requested model',\n 'magpie.ncolProvider': 'Provider / account',\n 'magpie.ncolServed': 'Served model',\n 'magpie.ncolInput': 'Input',\n 'magpie.ncolOutput': 'Output',\n 'magpie.ncolCost': 'Cost',\n 'magpie.ncolFirstText': 'First text',\n 'magpie.ncolDuration': 'Duration',\n 'magpie.ncolSpeed': 'Speed',\n 'magpie.ncolStatus': 'Status',\n 'magpie.open': 'Open Magpie dashboard',\n 'magpie.pageTitle': 'Magpie observatory',\n 'magpie.pageSubtitle': 'A live ledger of routing, usage, and subscription allowance.',\n 'magpie.periodLabel': 'PERIOD',\n 'magpie.chart.calls': 'Magpie requests over time',\n 'magpie.chart.tokens': 'Magpie tokens over time',\n 'magpie.chart.cost': 'Magpie reported cost over time',\n 'magpie.close': 'Return to the conversation',\n 'magpie.overview': 'Overview',\n 'magpie.sessions': 'Sessions',\n 'magpie.requests': 'Requests',\n 'magpie.quotas': 'Subscriptions',\n 'magpie.today': 'Today',\n 'magpie.week': '7 days',\n 'magpie.month': '30 days',\n 'magpie.all': 'All time',\n 'magpie.refresh': 'Refresh',\n 'magpie.refreshing': 'Refreshing…',\n 'magpie.update.title': 'Magpie update',\n 'magpie.update.open': 'Magpie {version}; open update details',\n 'magpie.update.openAvailable': 'Magpie {version}; update {latest} available; open update details',\n 'magpie.update.badge': 'New',\n 'magpie.update.close': 'Close Magpie update details',\n 'magpie.update.description': 'Opening this page checks for updates automatically. Download and restart only run after you confirm a manual update.',\n 'magpie.update.unavailable': 'Magpie update status is unavailable.',\n 'magpie.update.unsupported': 'This Magpie version does not expose a supported update API.',\n 'magpie.update.invalid': 'Magpie returned an update response CodingNS cannot safely read.',\n 'magpie.update.current': 'Current {version}',\n 'magpie.update.latest': 'Latest {version}',\n 'magpie.update.releaseNotes': 'Release notes for {version}',\n 'magpie.update.check': 'Check for updates',\n 'magpie.update.checking': 'Checking for updates…',\n 'magpie.update.downloading': 'Magpie is downloading the update…',\n 'magpie.update.manual': 'Manual update',\n 'magpie.update.retry': 'Retry update',\n 'magpie.update.confirmTitle': 'Confirm Magpie update',\n 'magpie.update.confirmWarning': 'Magpie may download a new binary, restart its Web process, and interrupt active requests.',\n 'magpie.update.confirm': 'Confirm and update',\n 'magpie.update.requested': 'Magpie accepted the update request.',\n 'magpie.update.restartRequested': 'Magpie accepted the update and may restart now. The admin page will reconnect afterward.',\n 'magpie.update.state.checking': 'Checking',\n 'magpie.update.state.latest': 'Up to date',\n 'magpie.update.state.found': 'Update available',\n 'magpie.update.state.downloading': 'Downloading',\n 'magpie.update.state.ready': 'Ready to restart',\n 'magpie.update.state.available': 'Update available manually',\n 'magpie.update.state.source': 'Source build',\n 'magpie.update.state.error': 'Update error',\n 'magpie.update.state.blocked': 'Update blocked',\n 'magpie.loading': 'Reading the local Magpie Web API…',\n 'magpie.webApiUnavailable': 'The Host could not start or authenticate Magpie Web. Startup is automatic; verify that the Magpie CLI is available, then retry.',\n 'magpie.unavailable': 'Magpie data is unavailable on this Host.',\n 'magpie.cliUnavailable': 'The Host could not find or run the Magpie CLI. Verify `magpie --version` in the DSH Host environment.',\n 'magpie.cliVersionUnsupported': 'This Magpie CLI version is not supported. The dashboard requires Magpie 0.1.1295 or later.',\n 'magpie.catalogUnavailable': 'The Host could not read `magpie models dsh` or find its Gateway address.',\n 'magpie.hostRpcOutdated': 'This Host is missing the Magpie usage or management RPC. Update/reload CodingNS on the Host to enable management panels.',\n 'magpie.featureDisabled': 'Magpie Management is disabled in the Host settings. Enable it in CodingNS settings and retry.',\n 'magpie.hostRequestFailed': 'The Host request failed. Check the Host connection and retry.',\n 'magpie.usageUnavailable': 'Usage data could not be read. Other sections may still be available.',\n 'magpie.quotaUnavailable': 'Subscription data could not be read.',\n 'magpie.codexControlsUnavailable': 'Codex account identity was not reported; account controls are unavailable.',\n 'magpie.codexPolicyFailed': 'Could not update the Codex account setting. Refresh and try again.',\n 'magpie.codexPolicyUnavailable': 'Codex policy settings are unavailable.',\n 'magpie.codexResetFailed': 'Could not use a reset card. Refresh and try again.',\n 'magpie.resetDialogAccount': 'Account: {account}',\n 'magpie.resetDialogBody': 'This uses one reset card from the {count} available and immediately restores the current quota window. This cannot be undone. Continue?',\n 'magpie.historyUnavailable': 'Quota history could not be read.',\n 'magpie.noUsage': 'No usage was reported for this period.',\n 'magpie.noSessions': 'No sessions were reported for this period.',\n 'magpie.noRequests': 'No request rows are available for this selection.',\n 'magpie.noQuotas': 'No subscription quota cards are available.',\n 'magpie.noHistory': 'No quota history is available.',\n 'magpie.costNote': 'Cost is reported by Magpie; the API does not specify a currency.',\n 'magpie.metricCalls': 'Requests',\n 'magpie.metricErrors': 'Errors',\n 'magpie.metricRetries': 'Retries',\n 'magpie.metricInput': 'Input tokens',\n 'magpie.metricOutput': 'Output tokens',\n 'magpie.metricCacheRead': 'Cache read',\n 'magpie.metricCacheWrite': 'Cache written',\n 'magpie.metricReasoning': 'Reasoning tokens',\n 'magpie.metricCost': 'Reported cost',\n 'magpie.metricUnpriced': 'Unpriced requests',\n 'magpie.metricLatency': 'Measured requests',\n 'magpie.metricTtft': 'TTFT reported (ms)',\n 'magpie.metricDecode': 'Decode time reported',\n 'magpie.metricDecodeTokens': 'Decode tokens',\n 'magpie.metricDecodeCount': 'decode count',\n 'magpie.timeline': 'Usage over time',\n 'magpie.tokens': 'Input + output tokens',\n 'magpie.byProvider': 'By provider',\n 'magpie.byModel': 'By model',\n 'magpie.byAccount': 'By account',\n 'magpie.modelBreakdown': 'Model breakdown',\n 'magpie.modelAggregate': 'Aggregate',\n 'magpie.modelPerAccount': 'Per account',\n 'magpie.byAgent': 'By Agent',\n 'magpie.management.providers': 'Providers',\n 'magpie.management.groupsTab': 'Routing groups',\n 'magpie.management.classifierEmpty': 'Choose a model',\n 'magpie.management.classifierHint': 'Asked once as each turn begins; a small, fast model without reasoning is best.',\n 'magpie.management.contextCustom': 'Custom',\n 'magpie.management.contextHint': 'The window Agents are told this group takes, so they compact before a member turns the conversation away.',\n 'magpie.management.contextInvalid': 'Enter a number of tokens, like 200k or 1m.',\n 'magpie.management.contextLargest': 'Largest member',\n 'magpie.management.contextSmallest': 'Smallest member',\n 'magpie.management.contextTokens': '{count} token',\n 'magpie.management.effortAgent': 'As the Agent asks',\n 'magpie.management.effortAgentHint': 'Each request reasons as much as the Agent asked for.',\n 'magpie.management.effortAuto': 'Picked per turn',\n 'magpie.management.effortAutoHint': 'A classifier rates each turn and asks its model for the nearest level; requests without reasoning stay without.',\n 'magpie.management.effortNeedsClassifier': 'Picking a level per turn needs a model that rates the turn. No model is available here.',\n 'magpie.management.levelsNamed': 'Chosen here',\n 'magpie.management.levelsNamedHint': 'Agents are offered these; a member without one is sent the level it has nearest.',\n 'magpie.management.levelsShared': 'Shared by its models',\n 'magpie.management.levelsSharedHint': 'Agents are offered the levels every member has.',\n 'magpie.management.reviewContext': 'Context window: {value}',\n 'magpie.management.reviewEffort': 'Effort: {value}',\n 'magpie.management.reviewEffortAuto': 'picked per turn by {model}',\n 'magpie.management.reviewLevels': 'Reasoning levels: {value}',\n 'magpie.management.accounts': 'Accounts',\n 'magpie.management.groups': 'Routing groups',\n 'magpie.management.loading': 'Reading Magpie provider, account, and routing-group settings…',\n 'magpie.management.cliVersionUnsupported': 'Magpie Web returned provider or routing-group data this Host cannot read. Update Magpie Web or CodingNS and retry.',\n 'magpie.management.providersUnavailable': 'Magpie provider settings could not be read in a supported format.',\n 'magpie.management.accountsUnavailable': 'Magpie account status could not be read.',\n 'magpie.management.groupsUnavailable': 'Magpie routing groups could not be read in a supported format.',\n 'magpie.management.noProviders': 'No Magpie providers were found.',\n 'magpie.management.noAccounts': 'No subscription accounts were reported by Magpie.',\n 'magpie.management.noGroups': 'No routing groups were found.',\n 'magpie.management.accountApiRequired': 'Host-managed Magpie Web is unavailable. Retry after the Host reconnects.',\n 'magpie.management.accountRoleNote': 'Primary is the Agent\\'s signed-in account; secondary accounts can be placed in or removed from the failover rotation.',\n 'magpie.management.unlinkedAccounts': 'Accounts without a listed provider',\n 'magpie.management.unlinkedAccountsNote': 'These accounts are still shown, but Magpie did not provide a matching account Agent identity for any listed provider.',\n 'magpie.management.noLinkedAccounts': 'No subscription accounts are linked to this provider.',\n 'magpie.management.primaryAccount': 'Primary · signed in',\n 'magpie.management.secondaryAccount': 'Secondary',\n 'magpie.management.inRotation': 'In routing rotation',\n 'magpie.management.primaryPaused': 'Primary paused',\n 'magpie.management.outOfRotation': 'Out of rotation',\n 'magpie.management.addToRotation': 'Add to failover rotation',\n 'magpie.management.removeFromRotation': 'Remove from failover rotation',\n 'magpie.management.pausePrimary': 'Pause primary account',\n 'magpie.management.lastAccountInRotation': 'Magpie requires at least one account to remain in rotation.',\n 'magpie.management.reviewAccount': 'Review account routing change',\n 'magpie.management.reviewAccountOn': 'Add {account} to this provider\\'s failover rotation.',\n 'magpie.management.reviewAccountOff': 'Remove {account} from this provider\\'s rotation. Magpie may move Agents using it to another provider/model.',\n 'magpie.management.accountSaveFailed': 'Magpie did not confirm this account change. Refresh and inspect its current routing state.',\n 'magpie.management.turnProviderOn': 'Turn provider on',\n 'magpie.management.turnProviderOff': 'Turn provider off',\n 'magpie.management.reviewProviderStatus': 'Routing availability: {value}',\n 'magpie.management.providerAccount': 'Account: {account}',\n 'magpie.management.modelCountUnknown': 'Model count not reported',\n 'magpie.management.modelCounts': '{exposed} exposed / {total} available models',\n 'magpie.management.providerName': 'Provider name',\n 'magpie.management.providerId': 'Provider ID',\n 'magpie.management.providerIdHint': 'Lower-case letters, digits and dashes, as model IDs spell it ({id}/model). Renaming carries the routing groups and Agent configs that name its models along.',\n 'magpie.management.providerIdLocked': 'Magpie stores this provider under an ID it will not write again, so it cannot be renamed here.',\n 'magpie.management.providerIdInvalid': 'An ID needs at least one letter or digit.',\n 'magpie.management.providerIdPreview': 'Saved as {id}; the current one stays a remembered alias.',\n 'magpie.management.endpointType': 'Endpoint type',\n 'magpie.management.endpointUrl': 'Endpoint URL',\n 'magpie.management.exposedModels': 'Exposed models',\n 'magpie.management.providerModelsHint': 'Magpie returned the complete model inventory. Check a model to expose it for routing; the original order is preserved.',\n 'magpie.management.providerModelsUnavailable': 'Magpie returned model entries this Host cannot safely edit. The list is read-only; other supported provider fields remain editable.',\n 'magpie.management.noProviderModels': 'Magpie did not return any model entries for this provider.',\n 'magpie.management.enableAllModels': 'Enable all',\n 'magpie.management.disableAllModels': 'Disable all',\n 'magpie.management.groupName': 'Group name',\n 'magpie.management.groupModels': 'Ordered models and patterns',\n 'magpie.management.groupModelsHint': 'Arrange the selected models and patterns in priority order. Use Add a model to insert another Magpie model without expanding the full inventory.',\n 'magpie.management.addGroupModel': 'Add a model',\n 'magpie.management.searchGroupModels': 'Filter models...',\n 'magpie.management.noMatchingGroupModels': 'No matching models.',\n 'magpie.management.otherGroupModels': 'Other models',\n 'magpie.management.noSelectedGroupModels': 'No models or patterns are selected for this group.',\n 'magpie.management.moveModelUp': 'Move {model} up',\n 'magpie.management.moveModelDown': 'Move {model} down',\n 'magpie.management.routing': 'Invocation policy',\n 'magpie.management.routing.smart': 'Smart',\n 'magpie.management.routing.order': 'In order',\n 'magpie.management.routing.rotate': 'In turn',\n 'magpie.management.routing.usage': 'Least used',\n 'magpie.management.routing.pace': 'Weekly pace',\n 'magpie.management.routing.weight': 'By weight',\n 'magpie.management.routing.manual': 'Manual',\n 'magpie.management.routing.free': 'Free first',\n 'magpie.management.stays': 'Account stickiness',\n 'magpie.management.stays.auto': 'Auto',\n 'magpie.management.stays.session': 'Session',\n 'magpie.management.stays.turn': 'Within a turn',\n 'magpie.management.stays.off': 'Off',\n 'magpie.management.stays.strict': 'Strict',\n 'magpie.management.routingHint': 'How this group sends a request to its members.',\n 'magpie.management.staysHint': 'How long a conversation stays with the member that answered it.',\n 'magpie.management.manualPick': 'Model sent every request',\n 'magpie.management.manualPickHint': 'Manual sends every request to this member; the others wait until another is picked.',\n 'magpie.management.unlists': 'Agents see the group only',\n 'magpie.management.unlistsHint': 'On, Agent model lists show the group and not the models it names; a request naming one is still answered.',\n 'magpie.management.fastMode': 'Fast mode',\n 'magpie.management.fastModeHint': '{model} is asked for its vendor\\'s fast mode (OpenAI service_tier \"priority\"): quicker, at a higher price.',\n 'magpie.management.noFastModels': 'Agents list the models below as they are; none takes this group\\'s reasoning levels or fast mode.',\n 'magpie.management.context': 'Context limit',\n 'magpie.management.levels': 'Reasoning levels',\n 'magpie.management.family': 'Family tag',\n 'magpie.management.effort': 'Effort policy',\n 'magpie.management.classifier': 'Classifier model',\n 'magpie.management.pick': 'Manually picked model',\n 'magpie.management.listed': 'List group models separately to Agents',\n 'magpie.management.active': 'Active',\n 'magpie.management.inactive': 'Inactive',\n 'magpie.management.enabled': 'Routing on',\n 'magpie.management.disabled': 'Routing off',\n 'magpie.management.on': 'On',\n 'magpie.management.off': 'Off',\n 'magpie.management.unknown': 'Unknown',\n 'magpie.management.noAccountWindows': 'No allowance windows reported.',\n 'magpie.management.readAt': 'Read {time}',\n 'magpie.management.membersCount': '{count} members',\n 'magpie.management.usedBy': 'Used by {agents}',\n 'magpie.management.reviewProvider': 'Review provider changes',\n 'magpie.management.reviewGroup': 'Review routing-group changes',\n 'magpie.management.reviewName': 'Name: {value}',\n 'magpie.management.reviewProviderId': 'ID: {from} → {to}',\n 'magpie.management.providerIdRenameHint': 'Magpie saves the other changes under the current ID first, then moves the provider: the routing groups and Agent configs naming its models follow, and the current ID stays an alias of the new one.',\n 'magpie.management.reviewEndpoint': '{field} endpoint: {value}',\n 'magpie.management.reviewModels': 'Model list: {count} entries',\n 'magpie.management.reviewRouting': 'Routing: {value}',\n 'magpie.management.reviewStays': 'Stickiness: {value}',\n 'magpie.management.manualPickEmpty': 'Choose a model',\n 'magpie.management.reviewPick': 'Manual pick: {value}',\n 'magpie.management.reviewUnlists': 'Group only: {value}',\n 'magpie.management.reviewFast': 'Fast mode: {count} models',\n 'magpie.management.reviewListed': 'Listed: {value}',\n 'magpie.management.reviewChanges': 'Review changes',\n 'magpie.management.cancel': 'Cancel',\n 'magpie.management.apply': 'Apply changes',\n 'magpie.management.saving': 'Saving…',\n 'magpie.management.saved': 'Saved and verified against Magpie.',\n 'magpie.management.saveFailed': 'Magpie did not confirm this change. Refresh and inspect the current values.',\n 'magpie.management.reset': 'Reset',\n 'magpie.sessionsCount': '{count} sessions',\n 'magpie.sessionSearch': 'Filter sessions by Agent or ID',\n 'magpie.openRequests': 'Inspect requests',\n 'magpie.clearSession': 'Clear session filter',\n 'magpie.requestFor': 'Requests for {agent} · {id}',\n 'magpie.colTime': 'Time',\n 'magpie.colProvider': 'Provider / account',\n 'magpie.colRoute': 'Requested → served',\n 'magpie.colTokens': 'Tokens',\n 'magpie.colCost': 'Cost',\n 'magpie.colStatus': 'Status / time',\n 'magpie.routeId': 'Route #{id}',\n 'magpie.priced': 'Priced',\n 'magpie.unpricedStatus': 'Unpriced',\n 'magpie.previous': 'Previous',\n 'magpie.next': 'Next',\n 'magpie.pageOf': 'Page {page}',\n 'magpie.loadMore': 'Load more',\n 'magpie.loadedCount': 'Loaded {count}',\n 'magpie.quotaHistory': 'Allowance history',\n 'magpie.quotaHistoryNote': 'Remaining allowance values recorded by Magpie; units follow each provider.',\n 'magpie.dailyUsage': 'Daily usage',\n 'magpie.remaining': '{percent}% remaining',\n 'magpie.used': '{percent}% used',\n 'magpie.quotaViewLabel': 'Subscription card values',\n 'magpie.quotaViewUsed': 'Used',\n 'magpie.quotaViewRemaining': 'Remaining',\n 'magpie.quotaViewFailed': 'Could not save the display mode',\n 'magpie.resets': 'Resets {time}',\n 'magpie.account': 'Account {account}',\n 'magpie.noLimit': 'No reported limit',\n 'magpie.quotaAccounts': '{count} accounts',\n 'magpie.quotaShowAllAccounts': 'Show all accounts',\n 'magpie.quotaShowMainAccount': 'Show main account only',\n 'magpie.quotaCollapseAccounts': '{count} accounts · collapse',\n 'magpie.balance': 'Balance',\n 'magpie.quotaRemainingAccounts': '+{count} more',\n 'magpie.sessionCountUnknown': 'Session count not reported',\n 'magpie.install.platform': 'Host platform: {platform}',\n 'magpie.install.title': 'Magpie is not available on this Host',\n 'magpie.install.detected': 'Detected Magpie {version} at {command}',\n 'magpie.install.recheck': 'Detect again',\n 'magpie.install.checking': 'Detecting…',\n 'magpie.install.checkedAt': 'Last checked {time}',\n 'magpie.install.reason.launch': 'The entry {command} exists but Magpie could not run. Check the installation and try again.',\n 'magpie.install.reason.timeout': 'The entry {command} did not answer in time. Check the installation and try again.',\n 'magpie.install.reason.version': 'The entry {command} ran but did not report a recognizable Magpie version.',\n 'magpie.install.command': 'magpie --version',\n 'magpie.install.installHelp.macos': 'Install Magpie with the official GitHub release or installation script, then reopen DSH. The Host reads the login shell PATH and common standalone binary directories such as Homebrew and ~/.local/bin.',\n 'magpie.install.installHelp.windows': 'Install Magpie from the official GitHub release or installation script. The Host reads the Windows registry PATH and checks the installer\\'s %USERPROFILE%\\\\.local\\\\bin location plus other common standalone binary directories. Reopen DSH after installing so it picks up the new PATH.',\n 'magpie.install.installHelp.linux': 'Install Magpie with the official GitHub release or installation script, then reopen DSH. The Host reads the login shell PATH plus /usr/local/bin and ~/.local/bin.',\n 'magpie.install.customToggle': 'Specify the Magpie path',\n 'magpie.install.customLabel': 'Absolute path to the Magpie executable',\n 'magpie.install.customPlaceholder': '/opt/homebrew/bin/magpie or C:\\\\Users\\\\you\\\\.local\\\\bin\\\\magpie.exe',\n 'magpie.install.customHelp': 'Use an unquoted absolute file path without arguments. A working path is saved on this Host and revalidated after restarting DSH.',\n 'magpie.install.customApply': 'Detect this path',\n 'magpie.install.customReset': 'Restore automatic detection',\n 'magpie.install.disabledNote': 'Magpie management stays off until a working Magpie CLI is detected.',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.magpieManagement.label': 'Magpie 管理与用量',\n 'feature.magpieManagement.description': '启用后,会在全局侧栏的「插件」下方添加独立的 Magpie 管理页面。',\n 'magpie.sidebarLabel': 'Magpie',\n 'magpie.context.system': '系统提示词',\n 'magpie.context.tools': '工具',\n 'magpie.context.memory': '记忆',\n 'magpie.context.files': '文件',\n 'magpie.context.results': '工具结果',\n 'magpie.context.chat': '会话内容',\n 'magpie.context.usedPercent': '上下文已用 {percent}%',\n 'magpie.context.window': '上下文窗口',\n 'magpie.context.used': '已用上下文',\n 'magpie.context.native': 'DSH 上下文',\n 'magpie.context.nativeTools': '工具定义',\n 'magpie.context.nativeMessages': '对话消息',\n 'magpie.context.nativeComposition': '估算组成(占估算总量的比例)',\n 'magpie.context.modelWindow': '模型窗口 {value}',\n 'magpie.context.cache': '提示词缓存',\n 'magpie.context.hit': '命中',\n 'magpie.context.close': '关闭上下文',\n 'magpie.context.composition': '上下文组成',\n 'magpie.context.content': '内容',\n 'magpie.context.all': '全部',\n 'magpie.context.allCount': '全部 · {count}',\n 'magpie.context.empty': '没有可显示的内容',\n 'magpie.context.rounds': '{count} 轮',\n 'magpie.context.requests': '{count} 个请求',\n 'magpie.context.request': '请求 {count}',\n 'magpie.context.earlierRounds': '更早的 {count} 轮',\n 'magpie.context.round': '第 {count} 轮',\n 'magpie.usage': '用量',\n 'magpie.routing': '路由',\n 'magpie.statTokens': 'Token',\n 'magpie.statCalls': '请求',\n 'magpie.statTurns': '回合',\n 'magpie.statSteps': '步骤',\n 'magpie.statWriteDown': '输出',\n 'magpie.statSessions': '会话数',\n 'magpie.statReasoning': '推理',\n 'magpie.statReasoningNote': '计入输出',\n 'magpie.statSpeed': '输出速度',\n 'magpie.statLatency': '首字耗时',\n 'magpie.statLatencyNote': '首字平均耗时',\n 'magpie.topSessions': '最耗会话',\n 'magpie.dailyTrend': '每日趋势',\n 'magpie.ncolTime': '时间',\n 'magpie.ncolRequested': '请求模型',\n 'magpie.ncolProvider': '供应商 · 账号',\n 'magpie.ncolServed': '实际模型',\n 'magpie.ncolInput': '输入',\n 'magpie.ncolOutput': '输出',\n 'magpie.ncolCost': '费用',\n 'magpie.ncolFirstText': '首字耗时',\n 'magpie.ncolDuration': '耗时',\n 'magpie.ncolSpeed': '速度',\n 'magpie.ncolStatus': '状态',\n 'magpie.open': '打开 Magpie 面板',\n 'magpie.pageTitle': 'Magpie 用量观测台',\n 'magpie.pageSubtitle': '实时查看路由、用量和订阅额度记录。',\n 'magpie.periodLabel': '周期',\n 'magpie.chart.calls': 'Magpie 请求趋势',\n 'magpie.chart.tokens': 'Magpie Token 趋势',\n 'magpie.chart.cost': 'Magpie 报告费用趋势',\n 'magpie.close': '返回当前对话',\n 'magpie.overview': '总览',\n 'magpie.sessions': '会话',\n 'magpie.requests': '请求',\n 'magpie.quotas': '订阅',\n 'magpie.today': '今天',\n 'magpie.week': '近 7 天',\n 'magpie.month': '近 30 天',\n 'magpie.all': '全部',\n 'magpie.refresh': '刷新',\n 'magpie.refreshing': '正在刷新…',\n 'magpie.update.title': 'Magpie 更新',\n 'magpie.update.open': 'Magpie {version};打开更新详情',\n 'magpie.update.openAvailable': 'Magpie {version};发现新版本 {latest};打开更新详情',\n 'magpie.update.badge': '新',\n 'magpie.update.close': '关闭 Magpie 更新详情',\n 'magpie.update.description': '打开管理页时会自动检查更新;只有你确认手动更新后,才会下载或重启。',\n 'magpie.update.unavailable': '暂时无法读取 Magpie 更新状态。',\n 'magpie.update.unsupported': '当前 Magpie 版本没有可支持的更新 API。',\n 'magpie.update.invalid': 'Magpie 返回了 CodingNS 无法安全读取的更新数据。',\n 'magpie.update.current': '当前 {version}',\n 'magpie.update.latest': '最新 {version}',\n 'magpie.update.releaseNotes': '{version} 的更新说明',\n 'magpie.update.check': '检查更新',\n 'magpie.update.checking': '正在检查更新…',\n 'magpie.update.downloading': 'Magpie 正在下载更新…',\n 'magpie.update.manual': '手动更新',\n 'magpie.update.retry': '重试更新',\n 'magpie.update.confirmTitle': '确认更新 Magpie',\n 'magpie.update.confirmWarning': 'Magpie 可能下载新的程序文件、重启 Web 进程,并中断正在进行的请求。',\n 'magpie.update.confirm': '确认并更新',\n 'magpie.update.requested': 'Magpie 已接受更新请求。',\n 'magpie.update.restartRequested': 'Magpie 已接受更新,可能会立即重启;管理页稍后会自动重新连接。',\n 'magpie.update.state.checking': '检查中',\n 'magpie.update.state.latest': '已是最新',\n 'magpie.update.state.found': '发现更新',\n 'magpie.update.state.downloading': '下载中',\n 'magpie.update.state.ready': '已准备重启',\n 'magpie.update.state.available': '可手动更新',\n 'magpie.update.state.source': '源码版本',\n 'magpie.update.state.error': '更新出错',\n 'magpie.update.state.blocked': '更新被阻止',\n 'magpie.loading': '正在读取本机 Magpie Web API…',\n 'magpie.webApiUnavailable': 'Host 无法启动或认证 Magpie Web。服务会自动启动;请确认 Magpie CLI 可用后重试。',\n 'magpie.unavailable': '此 Host 上的 Magpie 数据不可用。',\n 'magpie.cliUnavailable': 'Host 无法找到或运行 Magpie CLI。请在 DSH Host 环境中确认 `magpie --version` 可用。',\n 'magpie.cliVersionUnsupported': '此 Magpie CLI 版本暂不支持;用量面板要求 Magpie 0.1.1295 或更高版本。',\n 'magpie.catalogUnavailable': 'Host 无法读取 `magpie models dsh`,或未能从中找到 Gateway 地址。',\n 'magpie.hostRpcOutdated': '此 Host 缺少 Magpie 用量或管理 RPC。请在 Host 更新/重载 CodingNS 后使用管理面板。',\n 'magpie.featureDisabled': 'Host 设置中的 Magpie 管理功能未启用。请在 CodingNS 设置中启用后重试。',\n 'magpie.hostRequestFailed': 'Host 请求失败。请检查 Host 连接后重试。',\n 'magpie.usageUnavailable': '无法读取用量数据;其他区块仍可能可用。',\n 'magpie.quotaUnavailable': '无法读取订阅数据。',\n 'magpie.codexControlsUnavailable': '未报告 Codex 账号身份,无法显示账号控制项。',\n 'magpie.codexPolicyFailed': '无法更新 Codex 账号设置,请刷新后重试。',\n 'magpie.codexPolicyUnavailable': '暂时无法读取 Codex 使用规则。',\n 'magpie.codexResetFailed': '无法使用重置卡,请刷新后重试。',\n 'magpie.resetDialogAccount': '账号:{account}',\n 'magpie.resetDialogBody': '将使用当前 {count} 张重置卡中的 1 张,并立即恢复当前额度窗口。此操作不可撤销,确定继续吗?',\n 'magpie.historyUnavailable': '无法读取额度历史。',\n 'magpie.noUsage': '此周期没有用量记录。',\n 'magpie.noSessions': '此周期没有会话记录。',\n 'magpie.noRequests': '当前选择没有可显示的请求记录。',\n 'magpie.noQuotas': '没有可用的订阅额度卡片。',\n 'magpie.noHistory': '没有可用的额度历史。',\n 'magpie.costNote': '费用由 Magpie 提供;API 未声明币种。',\n 'magpie.metricCalls': '请求数',\n 'magpie.metricErrors': '错误数',\n 'magpie.metricRetries': '重试数',\n 'magpie.metricInput': '输入 Token',\n 'magpie.metricOutput': '输出 Token',\n 'magpie.metricCacheRead': '缓存读取',\n 'magpie.metricCacheWrite': '缓存写入',\n 'magpie.metricReasoning': '推理 Token',\n 'magpie.metricCost': '报告费用',\n 'magpie.metricUnpriced': '未计价请求',\n 'magpie.metricLatency': '已测时请求',\n 'magpie.metricTtft': '报告 TTFT(毫秒)',\n 'magpie.metricDecode': '报告解码时间',\n 'magpie.metricDecodeTokens': '解码 Token',\n 'magpie.metricDecodeCount': '次解码',\n 'magpie.timeline': '用量趋势',\n 'magpie.tokens': '输入 + 输出 Token',\n 'magpie.byProvider': '按提供商',\n 'magpie.byModel': '按模型',\n 'magpie.byAccount': '按账户',\n 'magpie.modelBreakdown': '模型明细方式',\n 'magpie.modelAggregate': '汇总',\n 'magpie.modelPerAccount': '按账户',\n 'magpie.byAgent': '按 Agent',\n 'magpie.management.providers': '提供商',\n 'magpie.management.groupsTab': '路由组',\n 'magpie.management.classifierEmpty': '请选择模型',\n 'magpie.management.classifierHint': '每轮开始时询问一次;不带推理的小型快速模型最合适。',\n 'magpie.management.contextCustom': '自定义',\n 'magpie.management.contextHint': '告知 Agent 此路由组的上下文窗口,让它在成员拒绝之前先行压缩。',\n 'magpie.management.contextInvalid': '请填写 token 数量,例如 200k 或 1m。',\n 'magpie.management.contextLargest': '最大成员',\n 'magpie.management.contextSmallest': '最小成员',\n 'magpie.management.contextTokens': '{count} tokens',\n 'magpie.management.effortAgent': '按 Agent 请求',\n 'magpie.management.effortAgentHint': '每个请求按 Agent 请求的推理强度处理。',\n 'magpie.management.effortAuto': '按轮挑选',\n 'magpie.management.effortAutoHint': '分类器判断每轮的难度,并让该轮按最近的档位请求;原本不带推理的请求仍然不带。',\n 'magpie.management.effortNeedsClassifier': '按轮挑选需要一个评判该轮的模型,此处没有可用模型。',\n 'magpie.management.levelsNamed': '在此指定',\n 'magpie.management.levelsNamedHint': '向 Agent 提供这些档位;没有该档位的成员会按最近的档位下发。',\n 'magpie.management.levelsShared': '沿用各模型共有',\n 'magpie.management.levelsSharedHint': '向 Agent 提供所有成员都具备的推理档位。',\n 'magpie.management.reviewContext': '上下文窗口:{value}',\n 'magpie.management.reviewEffort': '推理强度:{value}',\n 'magpie.management.reviewEffortAuto': '由 {model} 按轮挑选',\n 'magpie.management.reviewLevels': '推理档位:{value}',\n 'magpie.management.accounts': '账户',\n 'magpie.management.groups': '路由组',\n 'magpie.management.loading': '正在读取 Magpie 提供商、账户和路由组设置…',\n 'magpie.management.cliVersionUnsupported': 'Magpie Web 返回的提供商或路由组数据无法由此 Host 读取。请更新 Magpie Web 或 CodingNS 后重试。',\n 'magpie.management.providersUnavailable': '无法按受支持的格式读取 Magpie 提供商设置。',\n 'magpie.management.accountsUnavailable': '无法读取 Magpie 账户状态。',\n 'magpie.management.groupsUnavailable': '无法按受支持的格式读取 Magpie 路由组。',\n 'magpie.management.noProviders': '未找到 Magpie 提供商。',\n 'magpie.management.noAccounts': 'Magpie 未报告订阅账户。',\n 'magpie.management.noGroups': '未找到路由组。',\n 'magpie.management.accountApiRequired': 'Host 管理的 Magpie Web 当前不可用;请在 Host 重新连接后重试。',\n 'magpie.management.accountRoleNote': '主账户是 Agent 当前登录的账户;次级账户可加入或移出故障转移轮换。',\n 'magpie.management.unlinkedAccounts': '未匹配到提供商的账户',\n 'magpie.management.unlinkedAccountsNote': '这些账户仍会显示;但 Magpie 没有为任何已列出的提供商返回匹配的账户 Agent 标识。',\n 'magpie.management.noLinkedAccounts': '此提供商没有关联的订阅账户。',\n 'magpie.management.primaryAccount': '主账户 · 当前登录',\n 'magpie.management.secondaryAccount': '次级账户',\n 'magpie.management.inRotation': '参与路由轮换',\n 'magpie.management.primaryPaused': '主账户已暂停',\n 'magpie.management.outOfRotation': '未参与轮换',\n 'magpie.management.addToRotation': '加入故障转移轮换',\n 'magpie.management.removeFromRotation': '移出故障转移轮换',\n 'magpie.management.pausePrimary': '暂停主账户',\n 'magpie.management.lastAccountInRotation': 'Magpie 要求至少保留一个参与轮换的账户。',\n 'magpie.management.reviewAccount': '确认账户路由变更',\n 'magpie.management.reviewAccountOn': '将 {account} 加入此提供商的故障转移轮换。',\n 'magpie.management.reviewAccountOff': '将 {account} 移出此提供商的轮换。Magpie 可能会让正在使用它的 Agent 改用其他提供商/模型。',\n 'magpie.management.accountSaveFailed': 'Magpie 未确认此账户变更。请刷新并检查当前路由状态。',\n 'magpie.management.turnProviderOn': '启用提供商',\n 'magpie.management.turnProviderOff': '停用提供商',\n 'magpie.management.reviewProviderStatus': '路由状态:{value}',\n 'magpie.management.providerAccount': '账户:{account}',\n 'magpie.management.modelCountUnknown': '未报告模型数量',\n 'magpie.management.modelCounts': '已公开 {exposed} / 可用 {total} 个模型',\n 'magpie.management.providerName': '提供商名称',\n 'magpie.management.providerId': '提供商 ID',\n 'magpie.management.providerIdHint': '只能使用小写字母、数字和短横线,模型 ID 以它开头({id}/模型)。改名时会一并迁移引用其模型的路由组与 Agent 配置。',\n 'magpie.management.providerIdLocked': 'Magpie 以这个不会再写入的 ID 保存该提供商,因此此处不能改名。',\n 'magpie.management.providerIdInvalid': 'ID 至少需要一个字母或数字。',\n 'magpie.management.providerIdPreview': '将保存为 {id};原 ID 仍会作为别名保留。',\n 'magpie.management.endpointType': '端点类型',\n 'magpie.management.endpointUrl': '端点 URL',\n 'magpie.management.exposedModels': '已公开模型',\n 'magpie.management.providerModelsHint': 'Magpie 已返回完整模型清单。勾选模型即可将其公开到路由中;原始顺序会保留。',\n 'magpie.management.providerModelsUnavailable': 'Magpie 返回了此 Host 无法安全编辑的模型条目;模型列表已设为只读,其他受支持的提供商字段仍可编辑。',\n 'magpie.management.noProviderModels': 'Magpie 没有为此提供商返回模型条目。',\n 'magpie.management.enableAllModels': '全部启用',\n 'magpie.management.disableAllModels': '全部停用',\n 'magpie.management.groupName': '路由组名称',\n 'magpie.management.groupModels': '有序模型与匹配模式',\n 'magpie.management.groupModelsHint': '按优先级排列已选模型和匹配模式。使用“添加模型”即可加入其他 Magpie 模型,不再展开完整清单。',\n 'magpie.management.addGroupModel': '添加模型',\n 'magpie.management.searchGroupModels': '筛选模型…',\n 'magpie.management.noMatchingGroupModels': '没有匹配的模型。',\n 'magpie.management.otherGroupModels': '其他模型',\n 'magpie.management.noSelectedGroupModels': '此路由组尚未选择模型或匹配模式。',\n 'magpie.management.moveModelUp': '将 {model} 上移',\n 'magpie.management.moveModelDown': '将 {model} 下移',\n 'magpie.management.routing': '调用策略',\n 'magpie.management.routing.smart': '智能',\n 'magpie.management.routing.order': '按顺序',\n 'magpie.management.routing.rotate': '轮流',\n 'magpie.management.routing.usage': '最少使用',\n 'magpie.management.routing.pace': '重置前用完',\n 'magpie.management.routing.weight': '按权重',\n 'magpie.management.routing.manual': '手动',\n 'magpie.management.routing.free': '免费优先',\n 'magpie.management.stays': '账户粘性',\n 'magpie.management.stays.auto': '自动',\n 'magpie.management.stays.session': '整个会话',\n 'magpie.management.stays.turn': '一轮之内',\n 'magpie.management.stays.off': '关闭',\n 'magpie.management.stays.strict': '严格',\n 'magpie.management.routingHint': '此路由组如何把请求发往组内模型。',\n 'magpie.management.staysHint': '会话在多长时间内固定在应答它的成员上。',\n 'magpie.management.manualPick': '固定发送的模型',\n 'magpie.management.manualPickHint': '「手动」会把每个请求都发给此成员,其余成员在另行选择前不参与。',\n 'magpie.management.unlists': 'Agent 只看到路由组',\n 'magpie.management.unlistsHint': '开启后,Agent 的模型列表只显示路由组,不显示它包含的模型;直接点名这些模型的请求仍会应答。',\n 'magpie.management.fastMode': '快速模式',\n 'magpie.management.fastModeHint': '会向 {model} 请求其厂商的快速模式(OpenAI service_tier \"priority\"):更快,但价格更高。',\n 'magpie.management.noFastModels': 'Agent 列表中的模型按原样列出;此路由组的推理档位与快速模式都不作用于它们。',\n 'magpie.management.context': '上下文上限',\n 'magpie.management.levels': '推理等级',\n 'magpie.management.family': '模型族标签',\n 'magpie.management.effort': '推理策略',\n 'magpie.management.classifier': '分类器模型',\n 'magpie.management.pick': '手动选择的模型',\n 'magpie.management.listed': '向 Agent 单独公开组内模型',\n 'magpie.management.active': '活跃',\n 'magpie.management.inactive': '未活跃',\n 'magpie.management.enabled': '路由开启',\n 'magpie.management.disabled': '路由关闭',\n 'magpie.management.on': '开启',\n 'magpie.management.off': '关闭',\n 'magpie.management.unknown': '未知',\n 'magpie.management.noAccountWindows': '未报告额度窗口。',\n 'magpie.management.readAt': '读取于 {time}',\n 'magpie.management.membersCount': '{count} 个成员',\n 'magpie.management.usedBy': '使用方:{agents}',\n 'magpie.management.reviewProvider': '确认提供商变更',\n 'magpie.management.reviewGroup': '确认路由组变更',\n 'magpie.management.reviewName': '名称:{value}',\n 'magpie.management.reviewProviderId': 'ID:{from} → {to}',\n 'magpie.management.providerIdRenameHint': 'Magpie 会先在当前 ID 下保存其他变更,再迁移该提供商:引用其模型的路由组与 Agent 配置会随之迁移,当前 ID 会保留为新 ID 的别名。',\n 'magpie.management.reviewEndpoint': '{field} 端点:{value}',\n 'magpie.management.reviewModels': '模型列表:{count} 项',\n 'magpie.management.reviewRouting': '路由:{value}',\n 'magpie.management.reviewStays': '粘性:{value}',\n 'magpie.management.manualPickEmpty': '请选择模型',\n 'magpie.management.reviewPick': '手动固定:{value}',\n 'magpie.management.reviewUnlists': '只显示路由组:{value}',\n 'magpie.management.reviewFast': '快速模式:{count} 个模型',\n 'magpie.management.reviewListed': '公开:{value}',\n 'magpie.management.reviewChanges': '检查变更',\n 'magpie.management.cancel': '取消',\n 'magpie.management.apply': '应用变更',\n 'magpie.management.saving': '保存中…',\n 'magpie.management.saved': '已保存,并已通过 Magpie 回读验证。',\n 'magpie.management.saveFailed': 'Magpie 未确认此变更。请刷新并检查当前值。',\n 'magpie.management.reset': '重置',\n 'magpie.sessionsCount': '{count} 个会话',\n 'magpie.sessionSearch': '按 Agent 或 ID 筛选会话',\n 'magpie.openRequests': '查看请求',\n 'magpie.clearSession': '清除会话筛选',\n 'magpie.requestFor': '{agent} 的请求 · {id}',\n 'magpie.colTime': '时间',\n 'magpie.colProvider': '提供商 / 账户',\n 'magpie.colRoute': '请求 → 实际服务',\n 'magpie.colTokens': 'Token',\n 'magpie.colCost': '费用',\n 'magpie.colStatus': '状态 / 耗时',\n 'magpie.routeId': '路由 #{id}',\n 'magpie.priced': '已计价',\n 'magpie.unpricedStatus': '未计价',\n 'magpie.previous': '上一页',\n 'magpie.next': '下一页',\n 'magpie.pageOf': '第 {page} 页',\n 'magpie.loadMore': '加载更多',\n 'magpie.loadedCount': '已加载 {count} 条',\n 'magpie.quotaHistory': '额度历史',\n 'magpie.quotaHistoryNote': 'Magpie 记录的剩余额度;单位以各提供商报告为准。',\n 'magpie.dailyUsage': '每日用量',\n 'magpie.remaining': '剩余 {percent}%',\n 'magpie.used': '已用 {percent}%',\n 'magpie.quotaViewLabel': '订阅卡显示口径',\n 'magpie.quotaViewUsed': '已用',\n 'magpie.quotaViewRemaining': '剩余',\n 'magpie.quotaViewFailed': '显示口径保存失败',\n 'magpie.resets': '重置时间 {time}',\n 'magpie.account': '账户 {account}',\n 'magpie.noLimit': '未报告额度上限',\n 'magpie.quotaAccounts': '{count} 个账号',\n 'magpie.quotaShowAllAccounts': '展开全部账号',\n 'magpie.quotaShowMainAccount': '只显示主账号',\n 'magpie.quotaCollapseAccounts': '{count} 个账号 · 收起其余账号',\n 'magpie.balance': '余额',\n 'magpie.quotaRemainingAccounts': '另 {count} 个',\n 'magpie.sessionCountUnknown': '未报告会话总数',\n 'magpie.install.platform': 'Host 平台:{platform}',\n 'magpie.install.title': '本机未找到可用的 Magpie',\n 'magpie.install.detected': '已检测到 Magpie {version}:{command}',\n 'magpie.install.recheck': '重新检测',\n 'magpie.install.checking': '检测中…',\n 'magpie.install.checkedAt': '上次检测:{time}',\n 'magpie.install.reason.launch': '入口 {command} 存在,但 Magpie 无法运行;请检查安装后重试。',\n 'magpie.install.reason.timeout': '入口 {command} 未在限定时间内响应;请检查安装后重试。',\n 'magpie.install.reason.version': '入口 {command} 已运行,但没有输出可识别的 Magpie 版本。',\n 'magpie.install.command': 'magpie --version',\n 'magpie.install.installHelp.macos': '请使用官方 GitHub Release 或安装脚本安装 Magpie,然后重新打开 DSH。Host 会读取登录 Shell 的 PATH,以及 Homebrew、/usr/local/bin、~/.local/bin 等常见独立程序目录。',\n 'magpie.install.installHelp.windows': '请使用官方 GitHub Release 或安装脚本安装 Magpie。Host 会读取 Windows 注册表中的 PATH,并检查安装脚本使用的 %USERPROFILE%\\\\.local\\\\bin 以及其他常见独立程序目录。安装后请重新打开 DSH,以读取新的 PATH。',\n 'magpie.install.installHelp.linux': '请使用官方 GitHub Release 或安装脚本安装 Magpie,然后重新打开 DSH。Host 会读取登录 Shell 的 PATH、/usr/local/bin 和 ~/.local/bin。',\n 'magpie.install.customToggle': '手动指定 Magpie 路径',\n 'magpie.install.customLabel': 'Magpie 可执行文件的绝对路径',\n 'magpie.install.customPlaceholder': '/opt/homebrew/bin/magpie 或 C:\\\\Users\\\\你\\\\.local\\\\bin\\\\magpie.exe',\n 'magpie.install.customHelp': '请输入不带引号和参数的文件绝对路径。检测成功后保存在当前 Host,重启 DSH 后会重新校验。',\n 'magpie.install.customApply': '检测此路径',\n 'magpie.install.customReset': '恢复自动检测',\n 'magpie.install.disabledNote': '检测到可用的 Magpie CLI 前,Magpie 管理保持关闭。',\n}\n","export const en: Record<string, string> = {\n 'update.localeTag': 'en-US',\n 'update.newVersionBadge': 'New',\n 'update.toggleDetails': 'Show or hide update details',\n 'update.newVersion': 'New version {version}',\n 'update.title': 'Plugin updates',\n 'update.description': 'Check npm releases and review the exact GitHub tag.',\n 'update.hostVersion': 'Running Host:',\n 'update.clientVersion': 'Running Client:',\n 'update.installedVersion': 'Installed package:',\n 'update.unknown': 'Unknown',\n 'update.activationHelp': 'Package installation and live code activation are reported separately. This DSH version cannot confirm a Desktop Client reload.',\n 'update.channel': 'Release channel',\n 'update.latest': 'npm latest',\n 'update.next': 'npm next (prerelease)',\n 'update.exact': 'Exact version',\n 'update.exactVersion': 'Exact npm version',\n 'update.check': 'Check for updates',\n 'update.checking': 'Checking npm and GitHub...',\n 'update.requestError': 'The request could not be completed. Retry the check or review native DSH Plugins.',\n 'update.previousResult': 'Previous check shown. Check again before updating.',\n 'update.targetVersion': 'Target version:',\n 'update.publishedAt': 'Published:',\n 'update.releasePublishedAt': 'GitHub release published:',\n 'update.commit': 'Source commit:',\n 'update.compatibility': 'DSH compatibility:',\n 'update.openRelease': 'Open exact GitHub release',\n 'update.noNotes': 'Release notes are unavailable for this exact tag.',\n 'update.nativeFallback': 'Use native DSH Plugins to review package status and complete any required update or restart.',\n 'update.review': 'Review update',\n 'update.confirmTitle': 'Confirm the exact package update',\n 'update.confirmHelp': 'Install Codingns4DSH {version} through the DSH package manager? The new Host and Client code may require a DSH restart.',\n 'update.confirm': 'Confirm and update',\n 'update.back': 'Back',\n 'update.cancel': 'Request cancellation',\n 'update.refreshStatus': 'Refresh operation status',\n 'update.operationHelp': 'DSH owns this operation. Closing settings does not cancel it. Cancellation is confirmed only after DSH finishes restoring the package files.',\n 'update.packageState': 'Package:',\n 'update.hostActivation': 'Host activation:',\n 'update.clientActivation': 'Client activation:',\n 'update.checkState.up-to-date': 'This channel is up to date.',\n 'update.checkState.update-available': 'A newer version is available.',\n 'update.checkState.no-newer-version': 'This channel is older than the running or installed version.',\n 'update.checkState.incompatible': 'This target is incompatible with the running DSH.',\n 'update.checkState.compatibility-unknown': 'Target compatibility could not be confirmed. Updating is blocked.',\n 'update.checkState.unavailable': 'Update information is unavailable.',\n 'update.checkState.unsupported': 'This runtime does not support checking the active version.',\n 'update.compatibilityState.compatible': 'Compatible',\n 'update.compatibilityState.incompatible': 'Incompatible',\n 'update.compatibilityState.unknown': 'Unknown',\n 'update.phase.installing': 'Installing through DSH...',\n 'update.phase.cancelling': 'Waiting for DSH cancellation...',\n 'update.phase.applying': 'DSH is applying the package...',\n 'update.phase.completed': 'Operation completed',\n 'update.application.applied-without-desktop-restart': 'Host and Client are active at the target version.',\n 'update.application.restart-required': 'Package installed; restart required to activate the code.',\n 'update.application.activation-unknown': 'Live activation could not be confirmed.',\n 'update.application.failed': 'The update failed. Review package status before retrying.',\n 'update.application.cancelled': 'DSH cancelled the update.',\n 'update.application.unsupported': 'Use native DSH Plugins to update this package.',\n 'update.package.installed': 'Installed',\n 'update.package.unchanged': 'Unchanged',\n 'update.package.rolled-back': 'Profile files restored by DSH',\n 'update.package.unknown': 'Unknown; review native DSH Plugins',\n}\n\nexport const zh: Record<string, string> = {\n 'update.localeTag': 'zh-CN',\n 'update.newVersionBadge': '新版本',\n 'update.toggleDetails': '展开或收起更新详情',\n 'update.newVersion': '新版本 {version}',\n 'update.title': '插件更新',\n 'update.description': '检查 npm 发布版本,并查看对应的 GitHub 标签。',\n 'update.hostVersion': '运行中的 Host:',\n 'update.clientVersion': '运行中的 Client:',\n 'update.installedVersion': '已安装的软件包:',\n 'update.unknown': '未知',\n 'update.activationHelp': '软件包安装状态与运行时代码激活状态分开显示。当前 DSH 版本无法确认 Desktop Client 是否已重新加载。',\n 'update.channel': '发布渠道',\n 'update.latest': 'npm latest(稳定版)',\n 'update.next': 'npm next(预发布版)',\n 'update.exact': '指定版本',\n 'update.exactVersion': 'npm 指定版本号',\n 'update.check': '检查更新',\n 'update.checking': '正在检查 npm 和 GitHub……',\n 'update.requestError': '请求未完成。请重试,或到 DSH 原生插件页面查看状态。',\n 'update.previousResult': '显示的是上一次检查结果。更新前请重新检查。',\n 'update.targetVersion': '目标版本:',\n 'update.publishedAt': 'npm 发布时间:',\n 'update.releasePublishedAt': 'GitHub 发布时间:',\n 'update.commit': '源代码提交:',\n 'update.compatibility': 'DSH 兼容性:',\n 'update.openRelease': '打开对应的 GitHub Release',\n 'update.noNotes': '该精确标签没有可用的 Release notes。',\n 'update.nativeFallback': '请到 DSH 原生插件页面查看软件包状态,并完成必要的更新或重启。',\n 'update.review': '查看更新',\n 'update.confirmTitle': '确认更新指定软件包',\n 'update.confirmHelp': '通过 DSH 软件包管理器安装 Codingns4DSH {version}?新的 Host 和 Client 代码可能需要重启 DSH 才能生效。',\n 'update.confirm': '确认并更新',\n 'update.back': '返回',\n 'update.cancel': '请求取消',\n 'update.refreshStatus': '刷新操作状态',\n 'update.operationHelp': '此操作由 DSH 管理。关闭设置不会取消操作;只有 DSH 完成软件包恢复后,取消才会被确认。',\n 'update.packageState': '软件包状态:',\n 'update.hostActivation': 'Host 激活状态:',\n 'update.clientActivation': 'Client 激活状态:',\n 'update.checkState.up-to-date': '此渠道已经是最新版本。',\n 'update.checkState.update-available': '发现新版本。',\n 'update.checkState.no-newer-version': '此渠道版本低于当前运行或已安装版本。',\n 'update.checkState.incompatible': '此目标版本与当前 DSH 不兼容。',\n 'update.checkState.compatibility-unknown': '无法确认目标版本兼容性,更新已阻止。',\n 'update.checkState.unavailable': '更新信息暂不可用。',\n 'update.checkState.unsupported': '当前运行环境不支持检查活动版本。',\n 'update.compatibilityState.compatible': '兼容',\n 'update.compatibilityState.incompatible': '不兼容',\n 'update.compatibilityState.unknown': '未知',\n 'update.phase.installing': '正在通过 DSH 安装……',\n 'update.phase.cancelling': '正在等待 DSH 完成取消……',\n 'update.phase.applying': 'DSH 正在应用软件包……',\n 'update.phase.completed': '操作已完成',\n 'update.application.applied-without-desktop-restart': 'Host 和 Client 已运行目标版本。',\n 'update.application.restart-required': '软件包已安装;需要重启才能激活新代码。',\n 'update.application.activation-unknown': '无法确认运行时代码是否已激活。',\n 'update.application.failed': '更新失败。请先检查软件包状态再重试。',\n 'update.application.cancelled': 'DSH 已取消更新。',\n 'update.application.unsupported': '请使用 DSH 原生插件页面更新此软件包。',\n 'update.package.installed': '已安装',\n 'update.package.unchanged': '未改变',\n 'update.package.rolled-back': 'DSH 已恢复配置文件',\n 'update.package.unknown': '未知;请检查 DSH 原生插件页面',\n}\n","export const en: Record<string, string> = {\n 'feature.credentials.label': 'Credential management',\n 'feature.credentials.description': 'Store usernames, passwords, API keys, and other confidential values on the Host. Selected fields reach external Agent processes only through environment variables.',\n 'credentials.title': 'Saved credentials',\n 'credentials.add': 'Add credential',\n 'credentials.edit': 'Edit',\n 'credentials.delete': 'Delete',\n 'credentials.deleteConfirm': 'Delete this credential? Existing sessions will stop receiving it on their next turn.',\n 'credentials.label': 'Name',\n 'credentials.id': 'ID',\n 'credentials.field': 'Field',\n 'credentials.value': 'Value',\n 'credentials.addField': 'Add field',\n 'credentials.removeField': 'Remove field',\n 'credentials.keepExisting': 'Keep existing value',\n 'credentials.clearValue': 'Clear value',\n 'credentials.save': 'Save credential',\n 'credentials.cancel': 'Cancel',\n 'credentials.empty': 'No credentials saved.',\n 'credentials.masked': 'stored',\n 'credentials.saved': 'Credential saved.',\n 'credentials.deleted': 'Credential deleted.',\n 'credentials.failed': 'Credential operation failed.',\n 'credentials.security': 'Secret values are stored on the Host and are never returned to this page or sent through the Agent conversation.',\n 'credentials.sessionBindings': 'Session environment bindings',\n 'credentials.sessionBindingsHint': 'Choose fields for the current external Agent session. Only the selected environment variable names are saved.',\n 'credentials.choose': 'Choose credentials',\n 'credentials.noneSelected': 'No credentials selected',\n 'credentials.bindingEnv': 'Environment variable',\n 'credentials.bindingSaved': 'Credential bindings saved.',\n 'credentials.bindingLoadFailed': 'Could not read saved credentials.',\n 'credentials.unsupported': 'This Agent does not support Host-managed environment injection.',\n 'credentials.masterPassword': 'Master password',\n 'credentials.currentMasterPassword': 'Current master password',\n 'credentials.newMasterPassword': 'New master password',\n 'credentials.masterPasswordHint': 'Set a Host-local master password for credential management. The password is never returned to the browser after saving.',\n 'credentials.saveMasterPassword': 'Save master password',\n 'credentials.masterPasswordSaved': 'Master password saved.',\n 'credentials.loading': 'Loading credentials…',\n 'credentials.disabledHint': 'Enable the credential management module before managing credentials.',\n 'credentials.referenceSearch': 'Search credentials',\n 'credentials.referenceEmpty': 'No matching credentials.',\n 'credentials.commandLabel': 'Credential',\n 'credentials.commandDescription': 'Insert a Host-managed credential reference into this external Agent session.',\n 'credentials.commandUnavailable': 'Could not insert this credential reference.',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.credentials.label': '凭据管理',\n 'feature.credentials.description': '在 Host 保存用户名、密码、API Key 和其他机密值。选中的字段只通过环境变量提供给外部 Agent 进程。',\n 'credentials.title': '已保存的凭据',\n 'credentials.add': '添加凭据',\n 'credentials.edit': '编辑',\n 'credentials.delete': '删除',\n 'credentials.deleteConfirm': '删除这条凭据?已有会话下一轮将不再收到它。',\n 'credentials.label': '名称',\n 'credentials.id': 'ID',\n 'credentials.field': '字段',\n 'credentials.value': '值',\n 'credentials.addField': '添加字段',\n 'credentials.removeField': '移除字段',\n 'credentials.keepExisting': '保留现有值',\n 'credentials.clearValue': '清除值',\n 'credentials.save': '保存凭据',\n 'credentials.cancel': '取消',\n 'credentials.empty': '尚未保存凭据。',\n 'credentials.masked': '已保存',\n 'credentials.saved': '凭据已保存。',\n 'credentials.deleted': '凭据已删除。',\n 'credentials.failed': '凭据操作失败。',\n 'credentials.security': '机密值只保存在 Host,不会返回到此页面,也不会通过 Agent 对话发送。',\n 'credentials.sessionBindings': '会话环境变量绑定',\n 'credentials.sessionBindingsHint': '为当前外部 Agent 会话选择字段。保存的只有环境变量名。',\n 'credentials.choose': '选择凭据',\n 'credentials.noneSelected': '未选择凭据',\n 'credentials.bindingEnv': '环境变量',\n 'credentials.bindingSaved': '凭据绑定已保存。',\n 'credentials.bindingLoadFailed': '无法读取已保存凭据。',\n 'credentials.unsupported': '此 Agent 不支持 Host 管理的环境变量注入。',\n 'credentials.masterPassword': '主密码',\n 'credentials.currentMasterPassword': '当前主密码',\n 'credentials.newMasterPassword': '新主密码',\n 'credentials.masterPasswordHint': '为凭据管理设置仅保存在 Host 的主密码。保存后不会把密码返回到浏览器。',\n 'credentials.saveMasterPassword': '保存主密码',\n 'credentials.masterPasswordSaved': '主密码已保存。',\n 'credentials.loading': '正在加载凭据…',\n 'credentials.disabledHint': '请先启用凭据管理模块,再管理凭据。',\n 'credentials.referenceSearch': '搜索凭据',\n 'credentials.referenceEmpty': '没有匹配的凭据。',\n 'credentials.commandLabel': '凭据',\n 'credentials.commandDescription': '向当前外部 Agent 会话插入 Host 管理的凭据引用。',\n 'credentials.commandUnavailable': '无法插入此凭据引用。',\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client'\nimport type { Translate } from '@deepseek-ai/dsh-client-ui-slots'\nimport * as debugDictionary from './locales/debug.js'\nimport * as fileWorkspaceDictionary from './locales/fileWorkspace.js'\nimport * as gitDictionary from './locales/git.js'\nimport * as panelsDictionary from './locales/panels.js'\nimport * as peerHostDictionary from './locales/peerHost.js'\nimport * as peerHostWorkspaceDictionary from './locales/peerHostWorkspace.js'\nimport * as terminalAuthDictionary from './locales/terminalAuth.js'\nimport * as usageDictionary from './locales/usage.js'\nimport * as subagentCollapsedDictionary from './locales/subagentCollapsed.js'\nimport * as quickAppsDictionary from './locales/quickApps.js'\nimport * as cliManagementDictionary from './locales/cliManagement.js'\nimport * as magpieDictionary from './locales/magpie.js'\nimport * as pluginUpdateDictionary from './locales/pluginUpdate.js'\nimport * as credentialsDictionary from './locales/credentials.js'\n\n/** Codingns4DSH 自有词典命名空间。词典缺少的语言由 DSH 自动回退到英文。 */\nexport const CODINGNS_LOCALE_NS = 'codingns' as const\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n codingns: string\n }\n}\n\n/** Client 侧服务中实际使用的 DSH 语言运行时最小接口。 */\nexport type CodingNsLocale = Pick<LocaleRuntime, 'bind' | 'getSnapshot' | 'subscribe' | 'register'>\nexport type CodingNsTranslator = Translate<string>\n\nconst CORE_EN: Record<string, string> = {\n 'common.brand': 'Codingns4DSH',\n 'settings.title': 'Codingns4DSH features',\n 'settings.subtitle': 'Configure modules without changing DSH global settings.',\n 'settings.version': 'Codingns4DSH v{version}',\n 'settings.compatibility': 'Compatible with DSH {range}',\n 'settings.testedDshVersion': 'Tested with DSH {version}',\n 'settings.untestedDshWarning': 'DSH {version} is newer than the latest tested version ({tested}). Compatibility has not been verified; plugin installation and operation remain enabled.',\n 'settings.toggle': '{label} toggle',\n 'settings.legacyFallback': 'This DSH version uses compatibility mode; multi-tab and shell-selection extensions are unavailable.',\n 'settings.versionBlocked': 'This module is unavailable on DSH {version}; it requires DSH {minimum} or newer.',\n 'settings.moduleEnabled': '{label} enabled.',\n 'settings.moduleDisabled': '{label} disabled.',\n 'settings.moduleWriteRejected': 'The setting change was rejected; please retry.',\n 'settings.requirement.magpieInstall': 'Magpie is not installed or not usable on this Host. Install Magpie and detect again before enabling this module.',\n 'settings.requirement.checking': 'Checking whether Magpie is available on this Host…',\n 'settings.promo.sectionLabel': 'Codingns4DSH promotion',\n 'settings.promo.version': 'Version {version}',\n 'settings.promo.starHint': 'If Codingns4DSH helps you, please give us a Star on GitHub — it means a lot to us.',\n 'settings.promo.github': 'GitHub',\n 'settings.promo.actionLabel': 'Open the Codingns4DSH GitHub repository in a new tab',\n 'feature.workspaceSession.legacyFallback': 'DSH 0.1.5 compatibility path is enabled but not verified. Session-row DOM injection and archive entry placement may vary; restoring archived sessions is unavailable.',\n 'feature.lanAccess.label': 'LAN access to DSH',\n 'feature.lanAccess.description': 'Access DSH through a LAN IP, provide crypto.randomUUID when needed, and forward the listener to the current DSH Web port.',\n 'feature.loginProtection.label': 'Login protection',\n 'feature.loginProtection.description': 'Protect LAN and relay DSH Web access with one local account; loopback access is always allowed.',\n 'feature.reverseProxy.label': 'Relay access service',\n 'feature.reverseProxy.description': 'Access a DSH Host through the isolated Codingns4DSH relay.',\n 'feature.cliAdapters.label': 'External Agent integration',\n 'feature.cliAdapters.description': 'View installed external Agents, versions, command paths, available models, and enable them independently. External Agent context panels keep only the occupancy percentage and totals.',\n 'feature.workspaceSession.label': 'Workspace session enhancement',\n 'feature.workspaceSession.description': 'Show Agent logos, archived-session entries, workspace hiding controls, subscription or usage information, local quick sessions, and an optional remembered conversation/right-sidebar width ratio.',\n 'feature.workspaceMcp.label': 'Workspace MCP server',\n 'feature.workspaceMcp.description': 'Expose managed workspace tools to local MCP clients, with optional LAN access through the authenticated Host listener.',\n 'workspaceMcp.setupTitle': 'MCP access key',\n 'workspaceMcp.setupInstruction': 'Generate a key to save it on the Host and enable the local MCP listener.',\n 'workspaceMcp.lanAccessLabel': 'Expose MCP on the LAN',\n 'workspaceMcp.lanAccessDescription': 'Allow authenticated MCP clients on the LAN access listener to use the same MCP endpoint and port.',\n 'workspaceMcp.lanAccessSaved': 'Workspace MCP LAN exposure setting saved.',\n 'workspaceMcp.lanAccessStatus': 'LAN exposure: {status}',\n 'workspaceMcp.generateKey': 'Generate key and enable',\n 'workspaceMcp.rotateKey': 'Rotate key',\n 'workspaceMcp.generating': 'Generating…',\n 'workspaceMcp.generatedKey': 'Generated Workspace MCP API key',\n 'workspaceMcp.keyGenerated': 'Workspace MCP key generated and module enabled.',\n 'workspaceMcp.copyKey': 'Copy key',\n 'workspaceMcp.keyCopied': 'Workspace MCP key copied.',\n 'workspaceMcp.copyFailed': 'Could not copy the key. Select and copy it manually.',\n 'workspaceMcp.keyShownOnce': 'This key is shown only now. Copy it into your MCP client before closing or refreshing this panel.',\n 'workspaceMcp.capabilityDescription': 'MCP capability description',\n 'workspaceMcp.capabilityTitle': 'Supported MCP capabilities',\n 'workspaceMcp.capabilitySubtitle': 'The list below describes the fixed Workspace MCP tool catalog and its access boundaries.',\n 'workspaceMcp.capabilityName': 'Name',\n 'workspaceMcp.capabilityPermission': 'Permission',\n 'workspaceMcp.capabilityDescriptionField': 'Description',\n 'workspaceMcp.capabilityParameters': 'Invocation parameters',\n 'workspaceMcp.capabilityRemarks': 'Remarks',\n 'workspaceMcp.closeCapabilities': 'Close',\n 'workspaceMcp.installPromptTitle': 'Install the Agent Skill',\n 'workspaceMcp.installPromptHint': 'Copy this prompt to your Agent. It will install the root SKILL.md into that Agent’s personal skills directory.',\n 'workspaceMcp.copyInstallPrompt': 'Copy install prompt',\n 'workspaceMcp.installPromptCopied': 'Agent Skill installation prompt copied.',\n 'workspaceMcp.installPromptText': 'Fetch https://github.com/jingyi0605/Codingns4DSH/blob/main/SKILL.md and install it into your personal Agent Skills directory using your documented Skill installation method.',\n 'workspaceMcp.capability.workspaceList.permission': 'Read managed workspace metadata',\n 'workspaceMcp.capability.workspaceList.description': 'Lists managed workspaces available to the local Host.',\n 'workspaceMcp.capability.workspaceList.parameters': '{}',\n 'workspaceMcp.capability.workspaceList.remarks': 'Returns names and active session counts; filesystem roots are never exposed.',\n 'workspaceMcp.capability.sessionList.permission': 'Read bounded session metadata',\n 'workspaceMcp.capability.sessionList.description': 'Lists sessions belonging to managed workspaces.',\n 'workspaceMcp.capability.sessionList.parameters': '{ workspaceId?, limit?, offset? }',\n 'workspaceMcp.capability.sessionList.remarks': 'Results are paginated and contain metadata only, without full conversation history.',\n 'workspaceMcp.capability.sessionCreate.permission': 'Create a managed session and optionally queue a prompt',\n 'workspaceMcp.capability.sessionCreate.description': 'Creates a native DSH session and can select an installed adapter/model.',\n 'workspaceMcp.capability.sessionCreate.parameters': '{ workspaceId, adapterId?, modelId?, prompt? }',\n 'workspaceMcp.capability.sessionCreate.remarks': 'External adapter sessions require an initial prompt; uncertain outcomes include the created session ID.',\n 'workspaceMcp.capability.sessionContinue.permission': 'Queue a message in an existing session',\n 'workspaceMcp.capability.sessionContinue.description': 'Continues one exact managed session without replacing its identity.',\n 'workspaceMcp.capability.sessionContinue.parameters': '{ sessionId, message }',\n 'workspaceMcp.capability.sessionContinue.remarks': 'The session is revalidated immediately before prompt admission.',\n 'workspaceMcp.capability.sessionQuestions.permission': 'Read unresolved native questions',\n 'workspaceMcp.capability.sessionQuestions.description': 'Lists questions currently awaiting an answer in a managed session.',\n 'workspaceMcp.capability.sessionQuestions.parameters': '{ sessionId }',\n 'workspaceMcp.capability.sessionQuestions.remarks': 'Question content and options are bounded; archived or unrelated sessions are rejected.',\n 'workspaceMcp.capability.sessionAnswer.permission': 'Answer one unresolved native question',\n 'workspaceMcp.capability.sessionAnswer.description': 'Submits validated answers through the native DSH question mechanism.',\n 'workspaceMcp.capability.sessionAnswer.parameters': '{ sessionId, callId, answer }',\n 'workspaceMcp.capability.sessionAnswer.remarks': 'The call ID must come from the current question list and answers are checked against its options.',\n 'workspaceMcp.capability.sessionRequestPermission.permission': 'Request human approval',\n 'workspaceMcp.capability.sessionRequestPermission.description': 'Asks the native DSH approval UI to decide an operation.',\n 'workspaceMcp.capability.sessionRequestPermission.parameters': '{ sessionId, toolName, reason, callId? }',\n 'workspaceMcp.capability.sessionRequestPermission.remarks': 'Requires an active DSH turn; the MCP client cannot approve its own request.',\n 'workspaceMcp.capability.sessionPermissionStatus.permission': 'Read an owned approval outcome',\n 'workspaceMcp.capability.sessionPermissionStatus.description': 'Reads the status of an approval request created by this MCP feature.',\n 'workspaceMcp.capability.sessionPermissionStatus.parameters': '{ sessionId, requestId }',\n 'workspaceMcp.capability.sessionPermissionStatus.remarks': 'Only DSH-issued request IDs retained by the live feature are queryable.',\n 'workspaceMcp.capability.terminalList.permission': 'Read live terminal metadata',\n 'workspaceMcp.capability.terminalList.description': 'Lists terminal instances attached to one managed session.',\n 'workspaceMcp.capability.terminalList.parameters': '{ workspaceId, sessionId }',\n 'workspaceMcp.capability.terminalList.remarks': 'Only live terminals in the specified workspace/session scope are returned.',\n 'workspaceMcp.capability.terminalRead.permission': 'Read terminal output',\n 'workspaceMcp.capability.terminalRead.description': 'Returns a bounded output snapshot from one live terminal.',\n 'workspaceMcp.capability.terminalRead.parameters': '{ workspaceId, sessionId, terminalId, limitBytes? }',\n 'workspaceMcp.capability.terminalRead.remarks': 'Output is limited to 64 KiB and is never read from an unrelated terminal.',\n 'workspaceMcp.capability.terminalWrite.permission': 'Write terminal input',\n 'workspaceMcp.capability.terminalWrite.description': 'Writes bounded text to one existing live terminal process.',\n 'workspaceMcp.capability.terminalWrite.parameters': '{ workspaceId, sessionId, terminalId, data }',\n 'workspaceMcp.capability.terminalWrite.remarks': 'Input is limited to 16 KiB, rejects NUL bytes, and cannot create arbitrary processes.',\n 'workspaceMcp.statusTitle': 'Host status',\n 'workspaceMcp.loading': 'Reading Workspace MCP status…',\n 'workspaceMcp.statusFailed': 'Unable to read Workspace MCP status from the Host.',\n 'workspaceMcp.apiKeyStatus': 'API key: {status}',\n 'workspaceMcp.enabledStatus': 'Module: {status}',\n 'workspaceMcp.listeningStatus': 'Listener: {status}',\n 'workspaceMcp.configured': 'configured',\n 'workspaceMcp.notConfigured': 'not configured',\n 'workspaceMcp.on': 'on',\n 'workspaceMcp.off': 'off',\n 'workspaceMcp.url': 'Endpoint',\n 'workspaceMcp.refresh': 'Refresh status',\n 'workspaceMcp.reason.keyMissing': 'Generate a Workspace MCP API key to start the listener.',\n 'workspaceMcp.reason.keyStoreFailed': 'The Host could not access the Workspace MCP key file.',\n 'workspaceMcp.reason.disabled': 'The Workspace MCP module is disabled.',\n 'workspaceMcp.reason.listenFailed': 'The local MCP listener could not start.',\n 'workspaceMcp.reason.other': 'The Host reported an additional status reason.',\n 'feature.mobileAccess.label': 'Mobile access enhancements',\n 'feature.mobileAccess.description': 'On phones or narrow viewports, hide the left sidebar entirely and keep only the top-left logo as the way back in.',\n 'mobile.hideSidebarOnMobile': 'Fully hide the left sidebar on mobile',\n 'mobile.hideSidebarOnMobileDescription': 'DSH keeps a 56px icon rail when the sidebar is collapsed on a narrow screen. Turning this on collapses that rail to zero width and floats the native logo button at the top-left as the only entry point; opening the sidebar still uses the DSH layout service.',\n 'mobile.optimizeSettingsOnMobile': 'Optimize mobile settings',\n 'mobile.optimizeSettingsOnMobileDescription': 'Use a compact layout for the settings window on mobile screens.',\n 'mobile.viewportMax': 'Mobile viewport limit (px)',\n 'mobile.viewportMaxHelp': 'At or below this width the sidebar is treated as mobile; the range is 480–1280.',\n 'mobile.saved': 'Mobile access settings saved.',\n 'mobile.pwaRequiresListener': 'These assets are served by the LAN access listener; start that listener in the LAN access card first.',\n 'feature.terminal.label': 'Terminal enhancements',\n 'feature.terminal.description': 'Configure the default shell and terminal appearance. Enabling or disabling requires a DSH restart.',\n 'feature.fileManagement.label': 'File management enhancements',\n 'feature.fileManagement.description': 'Add file and folder operation menus to the DSH file sidebar and edit common text files in place.',\n 'fileManagement.menuEnhancement': 'File and folder operation menu',\n 'fileManagement.menuEnhancementDescription': 'Show the right-click operation menu for files and folders in the DSH sidebar, and copy relative or absolute paths from the file viewer.',\n 'fileManagement.fileEditor': 'File viewer editor',\n 'fileManagement.fileEditorDescription': 'Show the icon button for editing supported text files with syntax highlighting and line numbers.',\n 'fileManagement.sessionChangedFiles': 'Show current session changed files',\n 'fileManagement.sessionChangedFilesDescription': 'Show the files changed in the current session and their Git Diff.',\n 'fileManagement.saved': 'File management settings saved.',\n 'terminal.title': 'Terminal',\n 'terminal.new': 'New terminal',\n 'terminal.close': 'Close terminal',\n 'terminal.refresh': 'Refresh terminal',\n 'terminal.tools': 'Terminal shortcuts',\n 'terminal.holdCtrl': 'Hold Ctrl',\n 'terminal.holdAlt': 'Hold Alt',\n 'terminal.holdWin': 'Hold Win',\n 'terminal.holdOption': 'Hold Option',\n 'terminal.holdCommand': 'Hold Command',\n 'terminal.holdSuper': 'Hold Super',\n 'terminal.shortcutTab': 'Tab',\n 'terminal.shortcutEscape': 'Escape',\n 'terminal.shortcutEnter': 'Enter',\n 'terminal.shortcutBackspace': 'Backspace',\n 'terminal.shortcutUp': 'Arrow up',\n 'terminal.shortcutDown': 'Arrow down',\n 'terminal.shortcutLeft': 'Arrow left',\n 'terminal.shortcutRight': 'Arrow right',\n 'terminal.shortcutC': 'C (Ctrl+C when Ctrl is held)',\n 'terminal.shortcutD': 'D (Ctrl+D when Ctrl is held)',\n 'terminal.shortcutL': 'L (Ctrl+L when Ctrl is held)',\n 'terminal.shortcutZ': 'Z (Ctrl+Z when Ctrl is held)',\n 'terminal.description': 'Run commands in the session workspace',\n 'terminal.loadingShell': 'Reading shells…',\n 'terminal.retry': 'Retry',\n 'terminal.noShell': 'No available shell',\n 'terminal.selectShell': 'Select Shell',\n 'terminal.error': 'Terminal error',\n 'terminal.rename': 'Double-click to rename terminal',\n 'terminal.cleanupFailed': 'Terminal “{title}” could not be closed: {message}',\n 'terminal.currentStatus': 'Current status: {status}; Host platform: {platform}',\n 'terminal.enhanced': 'Terminal enhancement enabled',\n 'terminal.basic': 'Basic local terminal',\n 'terminal.saved': 'Terminal settings saved',\n 'terminal.saveRejected': 'Host rejected the terminal settings change; please retry.',\n 'terminal.readingStatus': 'Reading Host terminal status…',\n 'terminal.restartNote': 'Enabling or disabling requires a DSH restart. Disabling stops restoration and connection only; existing tmux or ConPTY sessions are not terminated.',\n 'terminal.appearanceTitle': 'Terminal appearance',\n 'terminal.resetAppearance': 'Reset appearance defaults',\n 'terminal.newDefault': 'New terminal default',\n 'terminal.theme': 'Theme',\n 'terminal.bindingScope': 'Terminal binding scope',\n 'terminal.systemRecommended': 'System recommended',\n 'terminal.inheritDshTheme': 'Inherit DSH theme',\n 'terminal.custom': 'Custom',\n 'terminal.background': 'Background color',\n 'terminal.foreground': 'Text color',\n 'terminal.cursorColor': 'Cursor color',\n 'terminal.fontSize': 'Font size (px)',\n 'terminal.lineHeight': 'Line height',\n 'terminal.cursorShape': 'Cursor shape',\n 'terminal.cursorBlink': 'Cursor blink',\n 'terminal.scrollback': 'Scrollback lines',\n 'terminal.inherit': 'Inherit',\n 'terminal.workspaceBinding': 'Bind by workspace (recommended)',\n 'terminal.sessionBinding': 'Bind by DSH session',\n 'terminal.workspaceBindingHelp': 'Workspace mode shares a terminal between DSH sessions in the same workspace; session mode gives each session its own terminal. Changing the scope requires a restart.',\n 'terminal.defaultProfileHelp': '“System recommended” is resolved by Host from the operating system and installed shells; unavailable saved values fall back to the system recommendation.',\n 'terminal.profileUnavailable': '{profile} (currently unavailable)',\n 'terminal.cursorInherit': 'Inherit',\n 'terminal.cursorBlock': 'Block',\n 'terminal.cursorBar': 'Bar',\n 'terminal.cursorUnderline': 'Underline',\n 'terminal.cursorOn': 'On',\n 'terminal.cursorOff': 'Off',\n 'terminal.unsupportedPlatform': 'Unsupported platform',\n 'lan.listenHost': 'Listen host',\n 'lan.description': 'Add a listener on this machine and redirect access to the current DSH Web. This is LAN access and does not use the cross-NAT relay service.',\n 'lan.listenPort': 'Listen port',\n 'lan.dshPort': 'Local DSH port (auto-detected, or enter manually)',\n 'lan.allInterfaces': 'All interfaces (0.0.0.0)',\n 'lan.detect': 'Auto-detect',\n 'lan.detectMultiple': 'Multiple DSH instance ports detected: {ports}. Select one manually.',\n 'lan.detectNone': 'No DSH Web port detected. Enter it manually.',\n 'lan.detected': 'Detected DSH Web ports: {ports}',\n 'lan.autoStart': 'Auto-start (restore the current mapping when DSH starts)',\n 'lan.start': 'Start LAN access to DSH',\n 'lan.update': 'Update LAN access to DSH',\n 'lan.stop': 'Stop',\n 'lan.forwardTarget': '→ DSH Web 127.0.0.1:{dshPort}',\n 'lan.statusStopped': 'Stopped',\n 'lan.statusStarting': 'Starting…',\n 'lan.statusListening': 'Running',\n 'lan.statusListeningCount': 'Running · {count} address(es) available',\n 'lan.statusError': 'Start failed',\n 'lan.accessUrlEmpty': 'No reachable address yet. Start the listener to get an access URL.',\n 'lan.copy': 'Copy',\n 'lan.copied': 'Copied',\n 'lan.copyAddressHint': 'Click to copy {url}',\n 'lan.copySuccess': 'Access URL copied',\n 'lan.copyFailed': 'Unable to copy the access URL',\n 'lan.started': 'LAN access to DSH started: {url}',\n 'lan.stopped': 'LAN access to DSH stopped',\n 'lan.autoStartOn': 'Auto-start enabled. The mapping will be restored the next time DSH starts.',\n 'lan.autoStartOff': 'Auto-start disabled',\n 'lan.processing': 'Processing…',\n 'lan.pwa.title': 'Mobile PWA assets',\n 'lan.pwa.description': 'Serve the manifest, icons, and install guidance from the LAN entry. Assets are only reachable through this listener.',\n 'lan.pwa.enabled': 'Provide PWA assets (manifest + icons)',\n 'lan.pwa.enabledHelp': 'Overrides the upstream manifest for this listener only: display mode becomes standalone and PNG icons are added.',\n 'lan.pwa.serviceWorker': 'Enable Service Worker',\n 'lan.pwa.serviceWorkerHelp': 'Only registers over HTTPS. Keeping it off avoids leaving a Service Worker on the phone.',\n 'lan.pwa.installPrompt': 'Show install guidance',\n 'lan.pwa.notifications': 'Notifications',\n 'lan.pwa.notificationsOff': 'Off',\n 'lan.pwa.notificationsLocal': 'Local (page open)',\n 'lan.pwa.notificationsPush': 'Push (needs VAPID)',\n 'lan.pwa.loopbackWarning': 'If NGINX runs on this same machine and proxies to 127.0.0.1, the proxy treats the traffic as loopback and skips login protection. Add authentication at the NGINX side or use a remote NGINX.',\n 'lan.pwa.saved': 'PWA settings saved',\n 'lan.pwa.requestPermission': 'Request notification permission',\n 'lan.pwa.permissionGranted': 'Notification permission granted',\n 'lan.pwa.permissionNotGranted': 'Notification permission was not granted',\n 'lan.pwa.sendTest': 'Send test notification',\n 'lan.pwa.testBody': 'This is a local test notification from Codingns4DSH.',\n 'lan.pwa.testSent': 'Test notification sent',\n 'lan.pwa.testFailed': 'Test notification failed: permission or platform unsupported',\n 'lan.pwa.subscribe': 'Subscribe to push',\n 'lan.pwa.unsubscribe': 'Unsubscribe',\n 'lan.pwa.pushUnavailable': 'Push is unavailable: the host push service is not enabled',\n 'lan.pwa.pushNeedsPermission': 'Allow notifications before subscribing',\n 'lan.pwa.swNeeded': 'Turn on the Service Worker before subscribing to push',\n 'lan.pwa.pushSubscribed': 'Push subscribed ({count} device(s) registered)',\n 'lan.pwa.pushUnsubscribed': 'Push subscription removed',\n 'lan.pwa.pushTest': 'Send test push',\n 'lan.pwa.pushTestSummary': 'Push result: {sent} sent, {failed} failed, {removed} cleaned',\n 'lan.pwa.pushDevices': 'Registered devices: {count}',\n 'lan.pwa.unregisterSw': 'Unregister Service Worker',\n 'lan.pwa.unregisterSwDone': 'Service Worker unregistered',\n 'lan.pwa.unregisterSwFailed': 'No Service Worker to unregister',\n 'lan.pwa.notificationState': 'Permission: {permission}; Notification API: {supported}; Secure context: {secure}; Service Worker: {sw}',\n 'lan.pwa.yes': 'yes',\n 'lan.pwa.no': 'no',\n 'lan.pwa.swActive': 'active',\n 'lan.pwa.swMissing': 'not registered',\n 'relay.controlApi': 'Relay service address',\n 'relay.add': 'Add',\n 'relay.cancel': 'Cancel',\n 'relay.adding': 'Adding…',\n 'relay.email': 'Email',\n 'relay.password': 'Password',\n 'relay.refreshDevices': 'Refresh devices',\n 'relay.logout': 'Log out',\n 'relay.bindHost': 'Bind current Host',\n 'relay.unbindHost': 'Unbind current Host',\n 'relay.hostLabel': 'Host label',\n 'relay.hostPublicKey': 'Host public key',\n 'relay.hostFingerprint': 'Host fingerprint',\n 'relay.settings': 'Service settings',\n 'relay.loginHint': 'Log in to Codingns4DSH to manage devices and the current Host.',\n 'relay.addServer': 'Add relay server',\n 'relay.addServerHint': 'Enter a new Control API address.',\n 'relay.login': 'Log in',\n 'relay.loggingIn': 'Logging in…',\n 'relay.noAccountPrefix': 'No account? ',\n 'relay.register': 'Register here',\n 'relay.noAccountSuffix': '.',\n 'relay.loggedIn': 'Logged in',\n 'relay.loggingOut': 'Logged out',\n 'relay.loginSuccess': 'Login succeeded',\n 'relay.h5LoginAddress': 'H5 login page',\n 'relay.copied': 'Copied',\n 'relay.copyAddressHint': 'Click address to copy',\n 'relay.copySuccess': 'H5 login address copied',\n 'relay.copyFailed': 'Unable to copy the H5 login address',\n 'relay.loggedOut': 'Logged out',\n 'relay.bindSuccess': 'Host bound successfully',\n 'relay.unbindSuccess': 'Host unbound',\n 'relay.device': 'Device: {value}',\n 'relay.dshVersion': 'DSH version: {value}',\n 'relay.computerName': 'Computer name: {value}',\n 'relay.host': 'Host: {value}',\n 'relay.devicesSummary': 'Current device {current}; other active devices: {count}',\n 'relay.deviceStatus': 'Device status: {value}',\n 'relay.dshDevices': 'Codingns4DSH devices',\n 'relay.selectDevice': 'Select a DSH Host',\n 'relay.online': 'online',\n 'relay.offline': 'offline',\n 'relay.unknown': 'Unknown',\n 'relay.unrecognized': 'Unrecognized',\n 'relay.unbound': 'Unbound',\n 'cli.installStatus': 'Installation status',\n 'cli.enabledStatus': 'Enabled status',\n 'cli.version': 'Version',\n 'cli.commandPath': 'Command path',\n 'cli.diagnostic': 'Detection diagnostic',\n 'cli.protocol': 'Standard protocol',\n 'cli.capabilities': 'Verified capabilities',\n 'cli.installed': 'Installed',\n 'cli.installedOffline': 'Installed (not connected)',\n 'cli.notInstalled': 'Not installed',\n 'cli.detecting': 'Detecting…',\n 'cli.detectionFailed': 'Detection failed',\n 'cli.redetect': 'Detect again',\n 'cli.redetectAll': 'Detect all again',\n 'cli.redetectHostUnsupported': 'The connected Host does not support Agent detection refresh. Load the same CodingNS plugin version on the Host as this page, restart the Host, then refresh the page.',\n 'cli.enabled': 'Enabled',\n 'cli.disabled': 'Disabled',\n 'cli.notDetectedVersion': 'Version not detected',\n 'cli.notDetectedCommand': 'Command not detected',\n 'cli.undeclared': 'Undeclared',\n 'cli.defaultEffort': 'Default',\n 'cli.thinkingLevel': 'Thinking level: {value}',\n 'cli.agentSelector': 'Agent selector',\n 'cli.modelSelector': 'Model and thinking level selector',\n 'cli.adapterToggle': '{name} toggle',\n 'cli.subagentBridge': 'Managed subagents',\n 'cli.subagentBridgeDescription': 'Route subagent calls made by external Agents into DSH-native continuable subagent sessions (OpenCode, Command Code, Claude Code, Codex, Gemini, Grok, MiniMax Code).',\n 'cli.subagentBridgeToggle': 'Managed subagents toggle',\n 'cli.subagentBridgeEnabled': 'Managed subagents enabled',\n 'cli.subagentBridgeDisabled': 'Managed subagents disabled',\n 'cli.subagentBridgeConcurrency': 'Concurrent managed subagents',\n 'cli.subagentBridgeConcurrencyHelp': 'How many subagents one parent session may keep running at once. External Agents often open a whole batch in parallel; calls beyond this limit are reported as dispatch failures instead of silently falling back to the built-in subagent.',\n 'cli.subagentBridgeConcurrencySaved': 'Concurrency limit saved',\n 'delegate.label': 'Delegate',\n 'delegate.description': 'Dispatch this task to an external Agent as a DSH-native subagent session',\n 'delegate.searchPlaceholder': 'Search external Agents',\n 'delegate.searchEmpty': 'No external Agent is installed and enabled',\n 'delegate.searchNoResults': 'No matching Agent',\n 'delegate.composerPlaceholder': '/ Commands, @ Files or conversations, # Delegation menu',\n 'delegate.started': 'Delegated to {name}; it runs in its own native subagent session.',\n 'delegate.failed': 'Delegation failed',\n 'delegate.draftUnsupported': 'This DSH version cannot write a delegation draft. Please upgrade DSH.',\n 'delegate.selected': 'Selected {name}; continue entering the task and submit it.',\n 'delegate.popupNoResults': 'No matching items',\n 'delegate.selectModel': 'Choose a model for {name}',\n 'delegate.loadingModels': 'Loading model catalog…',\n 'delegate.modelCatalogFailed': 'Model catalog failed to load',\n 'delegate.selectAdapter': 'Choose a delegation adapter',\n 'delegate.cardTitle': 'Delegation task',\n 'delegate.cardStatus': 'Delegating',\n 'delegate.cardTarget': '{label} ({adapter}{model})',\n 'skills.label': 'Skills',\n 'skills.description': 'Browse and explicitly invoke Skills provided by the current Agent',\n 'skills.searchPlaceholder': 'Search Skills',\n 'skills.searchEmpty': 'The current Agent has no available Skills',\n 'skills.searchNoResults': 'No matching Skill',\n 'skills.draftUnsupported': 'This DSH version cannot write a Skill mention. Please upgrade DSH.',\n 'cli.loadingModel': 'Loading models…',\n 'cli.noModelsAvailable': 'No models available',\n 'cli.model': 'Model',\n 'cli.modelSearch': 'Search models…',\n 'cli.modelSearchClear': 'Clear search',\n 'cli.modelSearchEmpty': 'No matching models.',\n 'cli.thinking': 'Thinking level',\n 'cli.back': '‹ Back',\n 'cli.chooseModel': 'Choose model, current {model}, thinking level {effort}',\n 'cli.chooseModelMenu': 'Model and thinking level',\n 'cli.serviceTier': 'Service tier',\n 'cli.serviceTierFast': 'Fast',\n 'cli.serviceTierStandard': 'Standard',\n 'cli.serviceTierToggle': 'Fast service tier toggle, current {name}',\n 'cli.readingAgents': 'Reading external Agent status…',\n 'cli.noAgents': 'No external Agent is currently available.',\n 'cli.agentList': 'Agent list',\n 'cli.agentHost': 'Agent Host',\n 'cli.localHost': 'Current Host',\n 'cli.peerHostReadOnly': 'Viewing Agents on {name}. Refresh detection or open details here; manage enable settings on that Host.',\n 'cli.peerHostUnavailable': '{name} is not available. Check its connection and sign-in in PeerHost management; relay connections do not support Agent queries yet.',\n 'cli.peerHostListError': 'Unable to read PeerHost list: {message}',\n 'cli.peerHostRpcReadOnly': 'PeerHost Agent settings only support viewing and refreshing catalogs',\n 'cli.peerHostRpcFailed': 'Remote Agent catalog request failed: HTTP {status}',\n 'cli.peerHostRpcInvalid': 'Invalid remote Agent catalog response',\n 'cli.agentCount': '{count} Agents',\n 'cli.viewDetails': 'View {name} details',\n 'cli.closeDetails': 'Close Agent details',\n 'cli.modelCatalog': 'Model catalog',\n 'cli.agentNotInstalled': 'Agent is not installed; the model catalog cannot be read.',\n 'cli.agentDisabled': 'Agent is disabled; enable it before reading the model catalog.',\n 'cli.readingModels': 'Reading model catalog…',\n 'cli.done': 'Done',\n 'cli.noModels': 'No models found.',\n 'cli.currentAgent': 'Current Agent: {name}{locked}',\n 'cli.locked': ' (locked)',\n 'cli.selectAgent': 'Select Agent',\n 'cli.catalogLoadFailed': 'Could not load external Agents.',\n 'cli.retryCatalog': 'Retry loading Agents',\n 'workspace.showLogo': 'Show Agent logo',\n 'workspace.logoDescription': 'Display the selected external Agent logo in native workspace session rows.',\n 'workspace.optimizeSessionTitles': 'Optimize DSH session title generation',\n 'workspace.optimizeSessionTitlesDescription': 'Generate concise, complete topic titles for subsequent automatic title requests. Existing titles are not bulk-renamed; manual names are preserved.',\n 'workspace.showArchivedSessions': 'Show archived workspace sessions',\n 'workspace.archivedSessionsDescription': 'Display an archived-session folder entry above each workspace\\'s more-sessions button.',\n 'workspace.showWorkspaceHiding': 'Show workspace hiding controls',\n 'workspace.workspaceHidingDescription': 'Add a Hide workspace action to each workspace menu and show hidden workspaces through the workspace filter.',\n 'workspace.showSubscriptionUsage': 'Show subscription and usage',\n 'workspace.subscriptionUsageDescription': 'Detect and display provider subscription balances and upstream usage in the conversation footer.',\n 'workspace.subscriptionUsageSettings': 'Settings',\n 'subscriptionUsage.dialogTitle': 'Usage query settings',\n 'subscriptionUsage.dialogHint': 'The timeout applies to every adapter. The refresh interval drives the footer usage query; 0 disables automatic refresh, and a result is reused while it is still fresh.',\n 'subscriptionUsage.timeoutSecs': 'Query timeout (seconds)',\n 'subscriptionUsage.refreshInterval': 'Auto refresh interval (minutes)',\n 'subscriptionUsage.refreshIntervalHint': '0 disables automatic refresh.',\n 'subscriptionUsage.cancel': 'Cancel',\n 'subscriptionUsage.save': 'Save',\n 'subscriptionUsage.saved': 'Usage query settings saved',\n 'workspace.showQuickPhrases': 'Show quick sessions',\n 'workspace.quickPhrasesDescription': 'Keep reusable session instructions locally in Codingns4DSH and show the quick sessions button inside the composer.',\n 'workspace.showSkillQuickReference': 'Index the selected Agent Skills for quick command references',\n 'workspace.skillQuickReferenceDescription': 'Load Skills from the selected Agent, insert them as one reference chip, and render them as a compact element in the message list.',\n 'workspace.rememberConversationRightbarRatio': 'Remember conversation and right sidebar width ratio',\n 'workspace.rememberConversationRightbarRatioDescription': 'Restore the right sidebar proportion after refreshing this browser; the ratio is stored locally.',\n 'mobile.sidebarGestures': 'Swipe to open or close sidebars',\n 'mobile.team.title': 'Agent Team',\n 'mobile.team.close': 'Close Agent Team',\n 'mobile.sidebarGesturesDescription': 'On touch devices, swipe horizontally in the conversation area to toggle a sidebar. Cross the configured share of the viewport width, or give a quick flick to trigger it.',\n 'mobile.sidebarGestureMapping': 'Swipe direction',\n 'mobile.sidebarGestureMappingInward': 'Swipe right: session list; swipe left: right sidebar',\n 'mobile.sidebarGestureMappingSwap': 'Swapped',\n 'mobile.sidebarGestureEdge': 'Start area',\n 'mobile.sidebarGestureEdgeAvoid': 'Keep away from screen edges (recommended)',\n 'mobile.sidebarGestureEdgeEdge': 'Allow edge swipes',\n 'mobile.sidebarGestureDistance': 'Trigger distance (% of viewport width)',\n 'mobile.sidebarGestureDistanceHelp': 'Cross this share of the viewport width to trigger; a quick flick works too. Smaller values are more sensitive (15–80).',\n 'mobile.sidebarGestureSaved': 'Gesture settings saved',\n 'workspace.quickPhrasesTitle': 'Quick sessions',\n 'workspace.quickPhrasesHint': 'Click an item in the composer to fill the current draft.',\n 'workspace.quickPhrasesEmpty': 'No quick sessions yet.',\n 'workspace.quickPhrasesPlaceholder': 'Enter a reusable session instruction',\n 'workspace.quickPhrasesAdd': 'Add quick session',\n 'workspace.quickPhrasesCancel': 'Cancel',\n 'workspace.quickPhrasesAddDialogLabel': 'Add a quick session',\n 'workspace.quickPhrasesDelete': 'Delete quick session',\n 'workspace.quickPhrasesMoveUp': 'Move quick session up',\n 'workspace.quickPhrasesMoveDown': 'Move quick session down',\n 'workspace.quickPhrasesDrag': 'Drag to reorder quick session',\n 'workspace.quickPhrasesSaved': 'Quick session settings saved',\n 'workspace.quickPhrasesSaveFailed': 'Unable to save quick session settings',\n 'workspace.quickPhrasesTrigger': 'Quick sessions',\n 'workspace.quickPhrasesDialogLabel': 'Choose a quick session',\n 'workspace.quickPhrasesClose': 'Close quick sessions',\n}\n\nconst CORE_ZH: Record<string, string> = {\n 'common.brand': 'Codingns4DSH',\n 'settings.title': 'Codingns4DSH 功能模块',\n 'settings.subtitle': '按模块配置 Codingns4DSH 功能,不影响 DSH 的全局设置。',\n 'settings.version': 'Codingns4DSH v{version}',\n 'settings.compatibility': '兼容 DSH {range}',\n 'settings.testedDshVersion': '已验证 DSH {version}',\n 'settings.untestedDshWarning': '当前 DSH {version} 高于插件最新已验证版本({tested}),兼容性尚未验证;不影响插件安装和运行。',\n 'settings.toggle': '{label}开关',\n 'settings.legacyFallback': '当前 DSH 版本使用兼容模式;多 Tab 和 Shell 选择扩展不可用。',\n 'settings.versionBlocked': '当前 DSH {version} 不支持此模块;需要 DSH {minimum} 或更高版本。',\n 'settings.moduleEnabled': '已启用{label}',\n 'settings.moduleDisabled': '已禁用{label}',\n 'settings.moduleWriteRejected': '设置未被接受,请重试。',\n 'settings.requirement.magpieInstall': '本机未安装 Magpie 或 Magpie 不可用;请先安装并重新检测,再启用此模块。',\n 'settings.requirement.checking': '正在检测本机是否可用的 Magpie…',\n 'settings.promo.sectionLabel': 'Codingns4DSH 推广',\n 'settings.promo.version': '版本 v{version}',\n 'settings.promo.starHint': '如果 Codingns4DSH 帮到了你,请在 GitHub 点个 Star,这对我们意义重大。',\n 'settings.promo.github': 'GitHub',\n 'settings.promo.actionLabel': '在新标签页打开 Codingns4DSH 的 GitHub 仓库',\n 'feature.workspaceSession.legacyFallback': '已启用 DSH 0.1.5 兼容路径,但尚未完成验证。会话行 DOM 注入和归档入口位置可能存在差异;当前版本不支持取消归档。',\n 'feature.lanAccess.label': '局域网访问DSH',\n 'feature.lanAccess.description': '通过局域网访问 DSH',\n 'feature.loginProtection.label': '登录保护',\n 'feature.loginProtection.description': '统一账号保护访问',\n 'feature.reverseProxy.label': '中转访问服务',\n 'feature.reverseProxy.description': '通过中继访问 Host',\n 'feature.cliAdapters.label': '外部Agent集成',\n 'feature.cliAdapters.description': '管理外部 Agent',\n 'feature.workspaceSession.label': '工作区会话增强',\n 'feature.workspaceSession.description': '增强工作区会话体验',\n 'feature.workspaceMcp.label': '工作区 MCP 服务',\n 'feature.workspaceMcp.description': '通过 Host 认证监听器向本机 MCP 客户端提供受管理工作区工具,并可单独开放局域网访问。',\n 'workspaceMcp.setupTitle': 'MCP 访问密钥',\n 'workspaceMcp.setupInstruction': '生成密钥后会保存在 Host 并自动启用本机 MCP 监听器。',\n 'workspaceMcp.lanAccessLabel': '允许局域网访问 MCP',\n 'workspaceMcp.lanAccessDescription': '允许局域网访问监听器上的已认证 MCP 客户端使用同一个 MCP 端点和端口。',\n 'workspaceMcp.lanAccessSaved': 'Workspace MCP 局域网访问设置已保存。',\n 'workspaceMcp.lanAccessStatus': '局域网开放:{status}',\n 'workspaceMcp.generateKey': '生成密钥并启用',\n 'workspaceMcp.rotateKey': '轮换密钥',\n 'workspaceMcp.generating': '正在生成…',\n 'workspaceMcp.generatedKey': '生成的 Workspace MCP API Key',\n 'workspaceMcp.keyGenerated': 'Workspace MCP 密钥已生成,模块已启用。',\n 'workspaceMcp.copyKey': '复制密钥',\n 'workspaceMcp.keyCopied': 'Workspace MCP 密钥已复制。',\n 'workspaceMcp.copyFailed': '无法复制密钥,请手动选择并复制。',\n 'workspaceMcp.keyShownOnce': '密钥仅在此时显示。关闭或刷新面板前,请先复制到 MCP 客户端。',\n 'workspaceMcp.capabilityDescription': 'MCP 能力说明',\n 'workspaceMcp.capabilityTitle': '支持的 MCP 能力',\n 'workspaceMcp.capabilitySubtitle': '以下列表说明 Workspace MCP 的固定工具目录及其访问边界。',\n 'workspaceMcp.capabilityName': '名称',\n 'workspaceMcp.capabilityPermission': '权限',\n 'workspaceMcp.capabilityDescriptionField': '描述',\n 'workspaceMcp.capabilityParameters': '调用参数',\n 'workspaceMcp.capabilityRemarks': '备注',\n 'workspaceMcp.closeCapabilities': '关闭',\n 'workspaceMcp.installPromptTitle': '安装 Agent Skill',\n 'workspaceMcp.installPromptHint': '复制此提示词并发送给 Agent,它会将仓库根目录的 SKILL.md 安装到该 Agent 的个人 Skills 目录。',\n 'workspaceMcp.copyInstallPrompt': '复制安装提示词',\n 'workspaceMcp.installPromptCopied': 'Agent Skill 安装提示词已复制。',\n 'workspaceMcp.installPromptText': '获取 https://github.com/jingyi0605/Codingns4DSH/blob/main/SKILL.md,并使用你已记录的 Skill 安装方式,将其安装到你自己的 Agent 个人 Skills 目录。',\n 'workspaceMcp.capability.workspaceList.permission': '读取受管理工作区元数据',\n 'workspaceMcp.capability.workspaceList.description': '列出当前 Host 可管理的工作区。',\n 'workspaceMcp.capability.workspaceList.parameters': '{}',\n 'workspaceMcp.capability.workspaceList.remarks': '只返回名称和活动会话数,不暴露文件系统根目录。',\n 'workspaceMcp.capability.sessionList.permission': '读取有界会话元数据',\n 'workspaceMcp.capability.sessionList.description': '列出受管理工作区中的会话。',\n 'workspaceMcp.capability.sessionList.parameters': '{ workspaceId?, limit?, offset? }',\n 'workspaceMcp.capability.sessionList.remarks': '结果支持分页,只返回元数据,不返回完整对话历史。',\n 'workspaceMcp.capability.sessionCreate.permission': '创建受管理会话并可排队发送初始提示',\n 'workspaceMcp.capability.sessionCreate.description': '创建原生 DSH 会话,并可选择已安装的适配器和模型。',\n 'workspaceMcp.capability.sessionCreate.parameters': '{ workspaceId, adapterId?, modelId?, prompt? }',\n 'workspaceMcp.capability.sessionCreate.remarks': '外部适配器会话必须提供初始提示;不确定结果会返回已创建的会话 ID。',\n 'workspaceMcp.capability.sessionContinue.permission': '向已有会话排队发送消息',\n 'workspaceMcp.capability.sessionContinue.description': '继续指定的受管理会话,不替换其身份。',\n 'workspaceMcp.capability.sessionContinue.parameters': '{ sessionId, message }',\n 'workspaceMcp.capability.sessionContinue.remarks': '消息接纳前会重新校验会话归属和可用性。',\n 'workspaceMcp.capability.sessionQuestions.permission': '读取未解决的原生问题',\n 'workspaceMcp.capability.sessionQuestions.description': '列出受管理会话中等待回答的问题。',\n 'workspaceMcp.capability.sessionQuestions.parameters': '{ sessionId }',\n 'workspaceMcp.capability.sessionQuestions.remarks': '问题内容和选项有大小限制;归档或无关会话会被拒绝。',\n 'workspaceMcp.capability.sessionAnswer.permission': '回答一个未解决的原生问题',\n 'workspaceMcp.capability.sessionAnswer.description': '通过 DSH 原生问题机制提交经过校验的答案。',\n 'workspaceMcp.capability.sessionAnswer.parameters': '{ sessionId, callId, answer }',\n 'workspaceMcp.capability.sessionAnswer.remarks': 'callId 必须来自当前问题列表,答案会按原生选项校验。',\n 'workspaceMcp.capability.sessionRequestPermission.permission': '请求人工审批',\n 'workspaceMcp.capability.sessionRequestPermission.description': '通过 DSH 原生审批界面请求对某项操作作出决定。',\n 'workspaceMcp.capability.sessionRequestPermission.parameters': '{ sessionId, toolName, reason, callId? }',\n 'workspaceMcp.capability.sessionRequestPermission.remarks': '必须存在活动 DSH 回合;MCP 客户端不能批准自己的请求。',\n 'workspaceMcp.capability.sessionPermissionStatus.permission': '读取已拥有的审批结果',\n 'workspaceMcp.capability.sessionPermissionStatus.description': '读取当前 MCP 模块创建的审批请求状态。',\n 'workspaceMcp.capability.sessionPermissionStatus.parameters': '{ sessionId, requestId }',\n 'workspaceMcp.capability.sessionPermissionStatus.remarks': '只能查询当前模块保留的 DSH 原生请求 ID。',\n 'workspaceMcp.capability.terminalList.permission': '读取活动终端元数据',\n 'workspaceMcp.capability.terminalList.description': '列出一个受管理会话附属的终端实例。',\n 'workspaceMcp.capability.terminalList.parameters': '{ workspaceId, sessionId }',\n 'workspaceMcp.capability.terminalList.remarks': '只返回指定工作区和会话范围内的活动终端。',\n 'workspaceMcp.capability.terminalRead.permission': '读取终端输出',\n 'workspaceMcp.capability.terminalRead.description': '读取一个活动终端的有界输出快照。',\n 'workspaceMcp.capability.terminalRead.parameters': '{ workspaceId, sessionId, terminalId, limitBytes? }',\n 'workspaceMcp.capability.terminalRead.remarks': '输出上限为 64 KiB,不会读取其他终端。',\n 'workspaceMcp.capability.terminalWrite.permission': '写入终端输入',\n 'workspaceMcp.capability.terminalWrite.description': '向一个已有的活动终端进程写入有界文本。',\n 'workspaceMcp.capability.terminalWrite.parameters': '{ workspaceId, sessionId, terminalId, data }',\n 'workspaceMcp.capability.terminalWrite.remarks': '输入上限为 16 KiB,拒绝 NUL 字节,不能创建任意进程。',\n 'workspaceMcp.statusTitle': 'Host 状态',\n 'workspaceMcp.loading': '正在读取工作区 MCP 状态…',\n 'workspaceMcp.statusFailed': '无法从 Host 读取工作区 MCP 状态。',\n 'workspaceMcp.apiKeyStatus': 'API Key:{status}',\n 'workspaceMcp.enabledStatus': '模块:{status}',\n 'workspaceMcp.listeningStatus': '监听器:{status}',\n 'workspaceMcp.configured': '已配置',\n 'workspaceMcp.notConfigured': '未配置',\n 'workspaceMcp.on': '已开启',\n 'workspaceMcp.off': '已关闭',\n 'workspaceMcp.url': '端点',\n 'workspaceMcp.refresh': '刷新状态',\n 'workspaceMcp.reason.keyMissing': '请生成 Workspace MCP API Key 以启动监听器。',\n 'workspaceMcp.reason.keyStoreFailed': 'Host 无法访问 Workspace MCP 密钥文件。',\n 'workspaceMcp.reason.disabled': '工作区 MCP 模块已关闭。',\n 'workspaceMcp.reason.listenFailed': '本机 MCP 监听器无法启动。',\n 'workspaceMcp.reason.other': 'Host 返回了其他状态原因。',\n 'feature.mobileAccess.label': '移动端访问增强',\n 'feature.mobileAccess.description': '优化移动端访问布局',\n 'mobile.hideSidebarOnMobile': '移动端彻底隐藏左侧边栏',\n 'mobile.hideSidebarOnMobileDescription': 'DSH 在窄屏下收起侧栏时仍保留 56px 图标轨道。开启后该轨道收为 0 宽,并把 DSH 自己的折叠态 logo 按钮浮到左上角作为唯一入口;展开侧栏仍由 DSH 布局服务完成。',\n 'mobile.optimizeSettingsOnMobile': '优化移动端设置界面',\n 'mobile.optimizeSettingsOnMobileDescription': '在移动端使用更紧凑的设置布局。',\n 'mobile.viewportMax': '移动端视口上限(像素)',\n 'mobile.viewportMaxHelp': '视口宽度小于或等于该值时按移动端处理,范围为 480–1280。',\n 'mobile.saved': '移动端访问设置已保存',\n 'mobile.pwaRequiresListener': '这些资产由「局域网访问DSH」的监听端口提供,请先在局域网卡片中启动监听。',\n 'feature.terminal.label': '终端增强',\n 'feature.terminal.description': '配置终端与默认 Shell',\n 'feature.fileManagement.label': '文件管理增强',\n 'feature.fileManagement.description': '增强文件侧栏操作',\n 'fileManagement.menuEnhancement': '文件管理菜单增强',\n 'fileManagement.menuEnhancementDescription': '在 DSH 文件侧栏为文件和目录显示右键操作菜单,并在文件查看器中复制相对路径或绝对路径。',\n 'fileManagement.fileEditor': '文件查看器编辑功能',\n 'fileManagement.fileEditorDescription': '为支持的文本文件显示编辑图标按钮,并保留语法高亮和行号。',\n 'fileManagement.sessionChangedFiles': '显示当前会话修改的文件',\n 'fileManagement.sessionChangedFilesDescription': '在当前会话顶部显示已修改文件,并支持查看 Git Diff 和暂存。',\n 'fileManagement.saved': '文件管理设置已保存。',\n 'terminal.title': '终端',\n 'terminal.new': '新建终端',\n 'terminal.close': '关闭终端',\n 'terminal.refresh': '刷新终端',\n 'terminal.tools': '终端快捷操作',\n 'terminal.holdCtrl': '按住 Ctrl',\n 'terminal.holdAlt': '按住 Alt',\n 'terminal.holdWin': '按住 Win',\n 'terminal.holdOption': '按住 Option',\n 'terminal.holdCommand': '按住 Command',\n 'terminal.holdSuper': '按住 Super',\n 'terminal.shortcutTab': 'Tab 制表键',\n 'terminal.shortcutEscape': 'Esc 退出键',\n 'terminal.shortcutEnter': 'Enter 回车键',\n 'terminal.shortcutBackspace': 'Backspace 退格键',\n 'terminal.shortcutUp': '向上箭头',\n 'terminal.shortcutDown': '向下箭头',\n 'terminal.shortcutLeft': '向左箭头',\n 'terminal.shortcutRight': '向右箭头',\n 'terminal.shortcutC': 'C(按住 Ctrl 时发送 Ctrl+C)',\n 'terminal.shortcutD': 'D(按住 Ctrl 时发送 Ctrl+D)',\n 'terminal.shortcutL': 'L(按住 Ctrl 时发送 Ctrl+L)',\n 'terminal.shortcutZ': 'Z(按住 Ctrl 时发送 Ctrl+Z)',\n 'terminal.description': '在会话工作区运行命令',\n 'terminal.loadingShell': '正在读取 Shell…',\n 'terminal.retry': '重试',\n 'terminal.noShell': '没有可用的 Shell',\n 'terminal.selectShell': '选择 Shell',\n 'terminal.error': '终端错误',\n 'terminal.rename': '双击重命名终端',\n 'terminal.cleanupFailed': '终端「{title}」未能结束:{message}',\n 'terminal.currentStatus': '当前运行状态:{status};Host 平台:{platform}',\n 'terminal.enhanced': '终端增强已启用',\n 'terminal.basic': '基础本地终端',\n 'terminal.saved': '终端设置已保存',\n 'terminal.saveRejected': 'Host 拒绝了终端设置变更,请重试。',\n 'terminal.readingStatus': '正在读取 Host 终端状态...',\n 'terminal.restartNote': '启用或禁用需要重启 DSH。禁用只会停止恢复和连接,不会结束已有的 tmux 或 ConPTY 会话。',\n 'terminal.appearanceTitle': '终端样式',\n 'terminal.resetAppearance': '重置为默认样式',\n 'terminal.newDefault': '新建终端默认项',\n 'terminal.theme': '主题',\n 'terminal.bindingScope': '终端绑定范围',\n 'terminal.systemRecommended': '系统推荐',\n 'terminal.inheritDshTheme': '继承 DSH 主题',\n 'terminal.custom': '自定义',\n 'terminal.background': '背景色',\n 'terminal.foreground': '文本颜色',\n 'terminal.cursorColor': '光标颜色',\n 'terminal.fontSize': '字号(px)',\n 'terminal.lineHeight': '行高',\n 'terminal.cursorShape': '光标形状',\n 'terminal.cursorBlink': '光标闪烁',\n 'terminal.scrollback': '回滚行数',\n 'terminal.inherit': '继承',\n 'terminal.workspaceBinding': '按工作区绑定(推荐)',\n 'terminal.sessionBinding': '按 DSH 会话绑定',\n 'terminal.workspaceBindingHelp': '工作区模式下,同一工作区的不同 DSH 会话共享终端;会话模式下,每个会话拥有独立终端。切换范围需要重启 DSH。',\n 'terminal.defaultProfileHelp': '“系统推荐”由 Host 根据操作系统和已安装的 shell 解析;不可用的已保存项会回退到系统推荐。',\n 'terminal.profileUnavailable': '{profile}(当前不可用)',\n 'terminal.cursorInherit': '继承',\n 'terminal.cursorBlock': '方块',\n 'terminal.cursorBar': '竖线',\n 'terminal.cursorUnderline': '下划线',\n 'terminal.cursorOn': '开启',\n 'terminal.cursorOff': '关闭',\n 'terminal.unsupportedPlatform': '不支持的平台',\n 'lan.listenHost': '监听地址',\n 'lan.description': '在本机增加一个监听端口,将访问重定向到当前 DSH Web。此功能属于局域网访问,不经过跨 NAT 中转服务。',\n 'lan.listenPort': '监听端口',\n 'lan.dshPort': 'DSH 本地端口(自动探测,也可手动填写)',\n 'lan.allInterfaces': '所有网卡(0.0.0.0)',\n 'lan.detect': '自动探测',\n 'lan.detectMultiple': '检测到多个 DSH 实例端口:{ports},请手动选择。',\n 'lan.detectNone': '未探测到 DSH Web 端口,请手动填写',\n 'lan.detected': '已探测到 DSH Web 端口:{ports}',\n 'lan.autoStart': '自动启动(启动 DSH 时自动恢复当前映射)',\n 'lan.start': '启动局域网访问DSH',\n 'lan.update': '更新局域网访问DSH',\n 'lan.stop': '停止',\n 'lan.forwardTarget': '→ DSH Web 127.0.0.1:{dshPort}',\n 'lan.statusStopped': '未启动',\n 'lan.statusStarting': '启动中…',\n 'lan.statusListening': '运行中',\n 'lan.statusListeningCount': '运行中 · 可用地址 {count} 个',\n 'lan.statusError': '启动失败',\n 'lan.accessUrlEmpty': '暂无可访问地址,启动监听后即可获得访问 URL。',\n 'lan.copy': '复制',\n 'lan.copied': '已复制',\n 'lan.copyAddressHint': '点击复制 {url}',\n 'lan.copySuccess': '访问地址已复制',\n 'lan.copyFailed': '无法复制访问地址',\n 'lan.started': '局域网访问DSH已启动:{url}',\n 'lan.stopped': '局域网访问DSH已停止',\n 'lan.autoStartOn': '已开启自动启动,下一次启动 DSH 时将自动恢复映射',\n 'lan.autoStartOff': '已关闭自动启动',\n 'lan.processing': '处理中…',\n 'lan.pwa.title': '移动端 PWA 资产',\n 'lan.pwa.description': '由局域网入口提供 manifest、图标与安装引导;这些资产只在这个监听端口上可达。',\n 'lan.pwa.enabled': '提供 PWA 资产(manifest + 图标)',\n 'lan.pwa.enabledHelp': '只覆盖本入口的 manifest:显示模式改为独立窗口,并补齐 PNG 图标。',\n 'lan.pwa.serviceWorker': '启用 Service Worker',\n 'lan.pwa.serviceWorkerHelp': '仅在 HTTPS 下注册;保持关闭可避免在手机上留下驻留脚本。',\n 'lan.pwa.installPrompt': '显示安装引导',\n 'lan.pwa.notifications': '通知',\n 'lan.pwa.notificationsOff': '关闭',\n 'lan.pwa.notificationsLocal': '本地通知(页面打开时)',\n 'lan.pwa.notificationsPush': '推送(需要 VAPID)',\n 'lan.pwa.loopbackWarning': '若 NGINX 与本机同机反代到 127.0.0.1,代理会按回环流量放行并跳过登录保护;请在 NGINX 侧加鉴权,或改用异机反代。',\n 'lan.pwa.saved': 'PWA 设置已保存',\n 'lan.pwa.requestPermission': '请求通知权限',\n 'lan.pwa.permissionGranted': '已获得通知权限',\n 'lan.pwa.permissionNotGranted': '未获得通知权限',\n 'lan.pwa.sendTest': '发送测试通知',\n 'lan.pwa.testBody': '这是一条来自 Codingns4DSH 的本地测试通知。',\n 'lan.pwa.testSent': '测试通知已发送',\n 'lan.pwa.testFailed': '测试通知失败:权限不足或平台不支持',\n 'lan.pwa.subscribe': '订阅推送',\n 'lan.pwa.unsubscribe': '取消订阅',\n 'lan.pwa.pushUnavailable': '推送不可用:Host 未启用推送服务',\n 'lan.pwa.pushNeedsPermission': '请先允许通知权限',\n 'lan.pwa.swNeeded': '订阅推送前需要先开启 Service Worker',\n 'lan.pwa.pushSubscribed': '已订阅推送(共 {count} 台设备)',\n 'lan.pwa.pushUnsubscribed': '已取消推送订阅',\n 'lan.pwa.pushTest': '发送测试推送',\n 'lan.pwa.pushTestSummary': '推送结果:成功 {sent},失败 {failed},已清理 {removed}',\n 'lan.pwa.pushDevices': '已登记设备:{count}',\n 'lan.pwa.unregisterSw': '注销 Service Worker',\n 'lan.pwa.unregisterSwDone': '已注销 Service Worker',\n 'lan.pwa.unregisterSwFailed': '没有可注销的 Service Worker',\n 'lan.pwa.notificationState': '权限:{permission};通知 API:{supported};安全上下文:{secure};Service Worker:{sw}',\n 'lan.pwa.yes': '是',\n 'lan.pwa.no': '否',\n 'lan.pwa.swActive': '已激活',\n 'lan.pwa.swMissing': '未注册',\n 'relay.controlApi': '中转服务地址',\n 'relay.add': '添加',\n 'relay.cancel': '取消',\n 'relay.adding': '添加中…',\n 'relay.email': '邮箱',\n 'relay.password': '密码',\n 'relay.refreshDevices': '刷新设备',\n 'relay.logout': '退出登录',\n 'relay.bindHost': '绑定 Host',\n 'relay.unbindHost': '解绑当前 Host',\n 'relay.hostLabel': 'Host 标签',\n 'relay.hostPublicKey': 'Host 公钥',\n 'relay.hostFingerprint': 'Host 指纹',\n 'relay.settings': '服务设置',\n 'relay.loginHint': '登录 Codingns4DSH,管理设备和当前 Host。',\n 'relay.addServer': '添加中转服务器',\n 'relay.addServerHint': '请输入新的 Control API 地址。',\n 'relay.login': '登录',\n 'relay.loggingIn': '登录中…',\n 'relay.noAccountPrefix': '没有账号,',\n 'relay.register': '点这里注册',\n 'relay.noAccountSuffix': '。',\n 'relay.loggedIn': '已登录',\n 'relay.loggingOut': '退出登录',\n 'relay.loginSuccess': '登录成功',\n 'relay.h5LoginAddress': 'H5 登录页面地址',\n 'relay.copied': '已复制',\n 'relay.copyAddressHint': '点击地址复制',\n 'relay.copySuccess': 'H5 登录页面地址复制成功',\n 'relay.copyFailed': '无法复制 H5 登录页面地址',\n 'relay.bindSuccess': 'Host 绑定成功',\n 'relay.unbindSuccess': 'Host 已解绑',\n 'relay.loggedOut': '已退出登录',\n 'relay.device': '设备:{value}',\n 'relay.dshVersion': 'DSH 版本:{value}',\n 'relay.computerName': '计算机名:{value}',\n 'relay.host': 'Host:{value}',\n 'relay.devicesSummary': '当前设备 {current},活动设备 {count} 台',\n 'relay.deviceStatus': '设备状态:{value}',\n 'relay.dshDevices': 'Codingns4DSH 设备',\n 'relay.selectDevice': '选择 DSH Host',\n 'relay.online': '在线',\n 'relay.offline': '离线',\n 'relay.unknown': '未知',\n 'relay.unrecognized': '未识别',\n 'relay.unbound': '未绑定',\n 'cli.installStatus': '安装状态',\n 'cli.enabledStatus': '启用状态',\n 'cli.version': '版本',\n 'cli.commandPath': '命令路径',\n 'cli.diagnostic': '探测诊断',\n 'cli.protocol': '标准协议',\n 'cli.capabilities': '已验证能力',\n 'cli.installed': '已安装',\n 'cli.installedOffline': '已安装(未连接)',\n 'cli.notInstalled': '未安装',\n 'cli.detecting': '检测中…',\n 'cli.detectionFailed': '检测失败',\n 'cli.redetect': '重新检测',\n 'cli.redetectAll': '重新检测全部',\n 'cli.redetectHostUnsupported': '当前连接的 Host 不支持重新检测 Agent。请确认 Host 已安装与页面一致的 CodingNS 插件版本,重启 Host 后再刷新页面。',\n 'cli.enabled': '已启用',\n 'cli.disabled': '已停用',\n 'cli.notDetectedVersion': '未检测到版本',\n 'cli.notDetectedCommand': '未检测到命令',\n 'cli.undeclared': '未声明',\n 'cli.defaultEffort': '默认',\n 'cli.thinkingLevel': '思考等级:{value}',\n 'cli.agentSelector': 'Agent 选择器',\n 'cli.modelSelector': '模型与思考强度选择器',\n 'cli.adapterToggle': '{name}启用开关',\n 'cli.subagentBridge': '子代理托管',\n 'cli.subagentBridgeDescription': '把外部 Agent 自己开的子代理调用转投为 DSH 原生可续子会话(OpenCode、Command Code、Claude Code、Codex、Gemini、Grok、MiniMax Code)。',\n 'cli.subagentBridgeToggle': '子代理托管开关',\n 'cli.subagentBridgeEnabled': '子代理托管已开启',\n 'cli.subagentBridgeDisabled': '子代理托管已关闭',\n 'cli.subagentBridgeConcurrency': '并发子代理上限',\n 'cli.subagentBridgeConcurrencyHelp': '同一父会话可同时运行的托管子代理数。外部 Agent 常会一次并发开出一整批子代理;超过上限的调用会明确报出派发失败,而不是悄悄回退到内建子代理。',\n 'cli.subagentBridgeConcurrencySaved': '并发上限已保存',\n 'delegate.label': '委派',\n 'delegate.description': '把当前任务派发给外部 Agent,作为 DSH 原生子智能体会话运行',\n 'delegate.searchPlaceholder': '搜索外部 Agent',\n 'delegate.searchEmpty': '没有已安装并启用的外部 Agent',\n 'delegate.searchNoResults': '没有匹配的 Agent',\n 'delegate.composerPlaceholder': '/调用指令,@文件或对话,#呼出委派菜单',\n 'delegate.started': '已委派给 {name},它将在独立的原生子智能体会话中运行。',\n 'delegate.failed': '委派失败',\n 'delegate.draftUnsupported': '当前 DSH 不支持委派草稿写入,请先升级 DSH。',\n 'delegate.selected': '已选择 {name},请继续输入委派任务后提交。',\n 'delegate.popupNoResults': '没有匹配项',\n 'delegate.selectModel': '选择 {name} 的模型',\n 'delegate.loadingModels': '正在加载模型目录…',\n 'delegate.modelCatalogFailed': '模型目录加载失败',\n 'delegate.selectAdapter': '选择委派适配器',\n 'delegate.cardTitle': '委派任务',\n 'delegate.cardStatus': '委派中',\n 'delegate.cardTarget': '{label}({adapter}{model})',\n 'skills.label': '技能',\n 'skills.description': '浏览并显式调用当前 Agent 提供的技能',\n 'skills.searchPlaceholder': '搜索技能',\n 'skills.searchEmpty': '当前 Agent 没有可用技能',\n 'skills.searchNoResults': '没有匹配的技能',\n 'skills.draftUnsupported': '当前 DSH 不支持写入技能引用,请先升级 DSH。',\n 'cli.loadingModel': '加载模型…',\n 'cli.noModelsAvailable': '无可用模型',\n 'cli.model': '模型',\n 'cli.modelSearch': '搜索模型…',\n 'cli.modelSearchClear': '清除搜索',\n 'cli.modelSearchEmpty': '没有匹配的模型。',\n 'cli.thinking': '思考等级',\n 'cli.back': '‹ 返回',\n 'cli.chooseModel': '选择模型,当前 {model},思考等级 {effort}',\n 'cli.chooseModelMenu': '模型与思考等级',\n 'cli.serviceTier': '服务档位',\n 'cli.serviceTierFast': 'Fast',\n 'cli.serviceTierStandard': '标准',\n 'cli.serviceTierToggle': 'Fast 服务档位开关,当前 {name}',\n 'cli.readingAgents': '正在读取外部 Agent 状态…',\n 'cli.noAgents': '当前没有可用的外部 Agent。',\n 'cli.agentList': '代理列表',\n 'cli.agentHost': 'Agent 所属 Host',\n 'cli.localHost': '本机 Host',\n 'cli.peerHostReadOnly': '正在查看 {name} 的 Agent。可刷新检测和查看详情,启用设置请前往该 Host 管理。',\n 'cli.peerHostUnavailable': '{name} 暂不可用,请在 PeerHost 管理中检查连接与登录状态;中转连接暂不支持 Agent 查询。',\n 'cli.peerHostListError': '读取 PeerHost 列表失败:{message}',\n 'cli.peerHostRpcReadOnly': 'PeerHost Agent 设置只支持查看和刷新目录',\n 'cli.peerHostRpcFailed': '远端 Agent 目录请求失败:HTTP {status}',\n 'cli.peerHostRpcInvalid': '远端 Agent 目录响应格式无效',\n 'cli.agentCount': '{count} 个 Agent',\n 'cli.viewDetails': '查看 {name} 详情',\n 'cli.closeDetails': '关闭 Agent 详情',\n 'cli.modelCatalog': '模型目录',\n 'cli.agentNotInstalled': 'Agent 未安装,无法读取模型目录。',\n 'cli.agentDisabled': 'Agent 已停用,启用后才能读取模型目录。',\n 'cli.readingModels': '正在读取模型目录…',\n 'cli.done': '完成',\n 'cli.noModels': '没有读取到模型。',\n 'cli.currentAgent': '当前 Agent:{name}{locked}',\n 'cli.locked': '(已锁定)',\n 'cli.selectAgent': '选择 Agent',\n 'cli.catalogLoadFailed': '无法加载外部 Agent。',\n 'cli.retryCatalog': '重新加载 Agent',\n 'workspace.showLogo': '显示 Agent Logo',\n 'workspace.logoDescription': '在原生工作区会话行显示所选外部 Agent 的 Logo。',\n 'workspace.optimizeSessionTitles': '优化DSH会话标题生成逻辑',\n 'workspace.optimizeSessionTitlesDescription': '概括完整主题,中文通常为 12~24 字;仅对后续自动标题请求生效,不批量改写旧标题,保留手动命名。',\n 'workspace.showArchivedSessions': '显示工作区归档会话',\n 'workspace.archivedSessionsDescription': '在每个工作区的“展开其余会话”按钮上方显示已归档的会话入口。',\n 'workspace.showWorkspaceHiding': '显示工作区隐藏功能',\n 'workspace.workspaceHidingDescription': '在工作区菜单中加入“隐藏工作区”,通过工作区筛选菜单显示隐藏的工作区并支持恢复。',\n 'workspace.showSubscriptionUsage': '显示订阅/用量检测',\n 'workspace.subscriptionUsageDescription': '在对话底部检测并显示 Agent 订阅余额和上游用量。',\n 'workspace.subscriptionUsageSettings': '设置',\n 'subscriptionUsage.dialogTitle': '用量查询设置',\n 'subscriptionUsage.dialogHint': '超时时间作用于所有适配器;自动查询间隔作用于对话底部的用量查询,0 表示不自动查询,间隔内的查询结果会直接复用。',\n 'subscriptionUsage.timeoutSecs': '超时时间(秒)',\n 'subscriptionUsage.refreshInterval': '自动查询间隔(分钟)',\n 'subscriptionUsage.refreshIntervalHint': '0 表示不自动查询。',\n 'subscriptionUsage.cancel': '取消',\n 'subscriptionUsage.save': '保存',\n 'subscriptionUsage.saved': '用量查询设置已保存',\n 'workspace.showQuickPhrases': '在对话框中显示快捷短语组件',\n 'workspace.quickPhrasesDescription': '在 Codingns4DSH 内本地保存可复用的会话指令,并将快捷会话按钮显示在输入工具区。',\n 'workspace.showSkillQuickReference': '索引指定 Agent 的 Skill 列表并通过指令快速引用',\n 'workspace.skillQuickReferenceDescription': '加载本次会话所选 Agent 的 Skill,将其作为整体引用元素插入聊天框,并在消息列表中美化显示。',\n 'workspace.rememberConversationRightbarRatio': '记忆对话窗口与右侧栏的宽度比例',\n 'workspace.rememberConversationRightbarRatioDescription': '刷新后恢复右侧栏比例;比例仅保存在当前浏览器中。',\n 'mobile.sidebarGestures': '横滑开合侧栏',\n 'mobile.team.title': '智能体团队',\n 'mobile.team.close': '关闭智能体团队',\n 'mobile.sidebarGesturesDescription': '触摸设备上在对话区横滑即可开合侧栏;跨过设定的视口宽度比例即触发,快速轻甩同样有效。',\n 'mobile.sidebarGestureMapping': '方向映射',\n 'mobile.sidebarGestureMappingInward': '右滑开合会话列表,左滑开合右边栏',\n 'mobile.sidebarGestureMappingSwap': '互换方向',\n 'mobile.sidebarGestureEdge': '起手区域',\n 'mobile.sidebarGestureEdgeAvoid': '避开屏幕边缘(推荐)',\n 'mobile.sidebarGestureEdgeEdge': '允许贴边起手',\n 'mobile.sidebarGestureDistance': '触发距离(占视口宽度百分比)',\n 'mobile.sidebarGestureDistanceHelp': '横滑跨过视口宽度的该比例即触发,快速轻甩同样有效;数值越小越灵敏(15–80)。',\n 'mobile.sidebarGestureSaved': '手势设置已保存',\n 'workspace.quickPhrasesTitle': '快捷会话',\n 'workspace.quickPhrasesHint': '点击条目即可填入当前对话框。',\n 'workspace.quickPhrasesEmpty': '还没有快捷会话。',\n 'workspace.quickPhrasesPlaceholder': '输入可复用的会话指令',\n 'workspace.quickPhrasesAdd': '添加快捷会话',\n 'workspace.quickPhrasesCancel': '取消',\n 'workspace.quickPhrasesAddDialogLabel': '添加快捷会话',\n 'workspace.quickPhrasesDelete': '删除快捷会话',\n 'workspace.quickPhrasesMoveUp': '上移快捷会话',\n 'workspace.quickPhrasesMoveDown': '下移快捷会话',\n 'workspace.quickPhrasesDrag': '拖动以调整快捷会话顺序',\n 'workspace.quickPhrasesSaved': '快捷会话设置已保存',\n 'workspace.quickPhrasesSaveFailed': '快捷会话设置保存失败',\n 'workspace.quickPhrasesTrigger': '快捷会话',\n 'workspace.quickPhrasesDialogLabel': '选择快捷会话',\n 'workspace.quickPhrasesClose': '关闭快捷会话',\n}\n\n/**\n * 合并核心词典与各域片段。\n *\n * 每个域片段只声明自己的键;一旦两个片段出现同名键,后面的会静默覆盖前面的,\n * 因此 scripts/check-client-i18n.mjs 会把重复键判为错误。\n */\nconst en: Record<string, string> = {\n ...CORE_EN,\n ...gitDictionary.en,\n ...debugDictionary.en,\n ...peerHostDictionary.en,\n ...peerHostWorkspaceDictionary.en,\n ...usageDictionary.en,\n ...fileWorkspaceDictionary.en,\n ...terminalAuthDictionary.en,\n ...panelsDictionary.en,\n ...subagentCollapsedDictionary.en,\n ...quickAppsDictionary.en,\n ...cliManagementDictionary.en,\n ...magpieDictionary.en,\n ...pluginUpdateDictionary.en,\n ...credentialsDictionary.en,\n}\n\nconst zh: Record<string, string> = {\n ...CORE_ZH,\n ...gitDictionary.zh,\n ...debugDictionary.zh,\n ...peerHostDictionary.zh,\n ...peerHostWorkspaceDictionary.zh,\n ...usageDictionary.zh,\n ...fileWorkspaceDictionary.zh,\n ...terminalAuthDictionary.zh,\n ...panelsDictionary.zh,\n ...subagentCollapsedDictionary.zh,\n ...quickAppsDictionary.zh,\n ...cliManagementDictionary.zh,\n ...magpieDictionary.zh,\n ...pluginUpdateDictionary.zh,\n ...credentialsDictionary.zh,\n}\n\n/** 在当前 Client Cordis 作用域注册中英文词典。 */\nexport function registerCodingNsLocale(ctx: Context): () => void {\n return ctx.locale.register(CODINGNS_LOCALE_NS, { en, zh })\n}\n\n/** 订阅 DSH 语言修订,并返回当前 Codingns4DSH 命名空间翻译函数。 */\nexport function useCodingNsTranslator(locale: CodingNsLocale): CodingNsTranslator {\n // useSyncExternalStore 要求 subscribe/getSnapshot 保持稳定引用:内联闭包会让\n // React 在每次渲染后追加一次一致性检查,并在引用变化时强制重新渲染。\n const store = useMemo(() => localeSnapshotHandle(locale), [locale])\n useSyncExternalStore(store.subscribe, store.getRevision, store.getRevision)\n return locale.bind(CODINGNS_LOCALE_NS)\n}\n\nfunction localeSnapshotHandle(locale: CodingNsLocale): {\n readonly subscribe: (listener: () => void) => () => void\n readonly getRevision: () => number\n} {\n return {\n subscribe: (listener) => locale.subscribe(listener),\n getRevision: () => locale.getSnapshot().revision,\n }\n}\n\n/** 非 React 注册回调使用的翻译函数。 */\nexport function codingNsTranslator(locale: CodingNsLocale): CodingNsTranslator {\n return locale.bind(CODINGNS_LOCALE_NS)\n}\n\n/**\n * 命令式模块的翻译函数入口。\n *\n * 正式运行总是由功能模块注入 DSH locale 服务;只有单测或非 Cordis 宿主没有\n * locale 时,才退回内置中文词典,保证命令式模块仍可独立运行。\n */\nexport function resolveCodingNsTranslator(locale?: CodingNsLocale): CodingNsTranslator {\n return locale === undefined ? staticCodingNsTranslator() : codingNsTranslator(locale)\n}\n\n/** 无 locale 服务时的内置中文兜底;插值规则与 DSH 的 `{name}` 保持一致。 */\nfunction staticCodingNsTranslator(): CodingNsTranslator {\n return (key, params) => {\n const template = zh[key] ?? key\n if (params === undefined) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name) => (name in params ? String(params[name]) : match))\n }\n}\n","import type { CodingNsCliAdapterId } from './contracts/cli-adapter.js'\n\nexport const CLI_PROVIDER_PREFIX = 'codingns-cli-'\n\n/** DSH provider routes are global; persisted adapter IDs remain plugin-local. */\nexport function toCliProviderId(adapterId: CodingNsCliAdapterId): string {\n return `${CLI_PROVIDER_PREFIX}${adapterId}`\n}\n\n/** A bare brand name does not establish ownership of a DSH provider. */\nexport function fromCliProviderId(provider: unknown): CodingNsCliAdapterId | undefined {\n if (typeof provider !== 'string' || !provider.startsWith(CLI_PROVIDER_PREFIX)) return undefined\n const adapterId = provider.slice(CLI_PROVIDER_PREFIX.length)\n return adapterId === '' ? undefined : adapterId\n}\n","import { resolveCodingNsTranslator, type CodingNsTranslator } from './locale.js'\nimport { fromCliProviderId } from '../shared/cli-provider-route.js'\nimport { PROVIDER_ICON_FILES } from '../shared/provider-icon-resources.js'\n\nexport interface ProviderVisual {\n readonly adapterId: string | null\n readonly displayName: string\n readonly iconUrl: string | undefined\n readonly color: string\n}\n\ninterface ProviderDefinition {\n readonly adapterId: string\n readonly displayName: string\n readonly displayNameKey?: string\n readonly color: string\n}\n\n/** 未绑定和未知 Agent 使用中性灰,绝不冒充任一已知品牌色。 */\nexport const PROVIDER_NEUTRAL_COLOR = '#71717a'\n\n/**\n * 外部 Agent 标识、显示名称与标签颜色的唯一映射。浏览器入口另行安装内联资产。\n *\n * 标签颜色用于会话行/归档列表的彩色标识:优先贴近本地图标或品牌色,\n * 并保持在浅色与深色主题下都可读的中等明度区间。\n */\nconst PROVIDER_DEFINITIONS: Readonly<Record<string, ProviderDefinition>> = {\n dsh: { adapterId: 'dsh', displayName: 'DeepSeek Harness', color: '#2563eb' },\n 'command-code': { adapterId: 'command-code', displayName: 'Command Code', color: '#8b5cf6' },\n 'claude-code': { adapterId: 'claude-code', displayName: 'Claude Code', color: '#d97757' },\n kimi: { adapterId: 'kimi', displayName: 'Kimi', color: '#0ea5e9' },\n gemini: { adapterId: 'gemini', displayName: 'Gemini CLI', color: '#4285f4' },\n pi: { adapterId: 'pi', displayName: 'Pi', color: '#f59e0b' },\n codex: { adapterId: 'codex', displayName: 'Codex', color: '#10a37f' },\n opencode: { adapterId: 'opencode', displayName: 'OpenCode', color: '#14b8a6' },\n grok: { adapterId: 'grok', displayName: 'Grok', color: '#71717a' },\n mcode: { adapterId: 'mcode', displayName: 'MiniMax Code', color: '#f97316' },\n zcode: { adapterId: 'zcode', displayName: 'ZCode', color: '#38bdf8' },\n codebuddy: { adapterId: 'codebuddy', displayName: 'CodeBuddy', color: '#2563eb' },\n workbuddy: { adapterId: 'workbuddy', displayName: 'WorkBuddy', color: '#0f766e' },\n 'cursor-cli': { adapterId: 'cursor-cli', displayName: 'Cursor CLI', color: '#111827' },\n 'kiro-cli': { adapterId: 'kiro-cli', displayName: 'Kiro CLI', color: '#7c3aed' },\n qoder: { adapterId: 'qoder', displayName: 'Qoder', color: '#ea580c' },\n 'qoder-cn': { adapterId: 'qoder-cn', displayName: 'Qoder CN', color: '#c2410c' },\n antigravity: { adapterId: 'antigravity', displayName: 'Antigravity', color: '#1d4ed8' },\n doubao: { adapterId: 'doubao', displayName: 'Doubao App', displayNameKey: 'provider.doubao', color: '#477fe8' },\n}\n\nconst PROVIDER_ICONS: Record<string, string> = {}\n\nconst PROVIDER_ICON_ALIASES: Readonly<Record<string, string>> = {\n claude: 'claude-code',\n commandcode: 'command-code',\n 'minimax-code': 'mcode',\n minimax: 'mcode',\n cursor: 'cursor-cli',\n agy: 'antigravity',\n codingns4dsh: 'dsh',\n 'workbuddy-ai': 'workbuddy',\n 'grok-(supergrok)': 'grok',\n openai: 'codex',\n 'openai-api': 'codex',\n 'openai-subscription': 'codex',\n 'codex-subscription': 'codex',\n anthropic: 'claude-code',\n 'anthropic-subscription': 'claude-code',\n 'claude-subscription': 'claude-code',\n 'gemini-cli': 'gemini',\n 'google-gemini': 'gemini',\n 'codebuddy-cn': 'codebuddy',\n deepseek: 'dsh',\n 'deepseek-api': 'dsh',\n 'deepseek-harness': 'dsh',\n 'deepseek-subscription': 'dsh',\n supergrok: 'grok',\n}\n\nconst MODEL_PROVIDER_PATTERNS: readonly [RegExp, string][] = [\n [/(?:^|[\\-/])deepseek(?:[-./]|$)/u, 'dsh'],\n [/(?:^|[\\-/])codex(?:[-./]|$)/u, 'codex'],\n [/(?:^|[\\-/])gpt(?:[-./]|$)/u, 'codex'],\n [/(?:^|[\\-/])(?:claude|opus|sonnet|haiku)(?:[-./]|$)/u, 'claude-code'],\n [/(?:^|[\\-/])gemini(?:[-./]|$)/u, 'gemini'],\n [/(?:^|[\\-/])kimi(?:[-./]|$)/u, 'kimi'],\n [/(?:^|[\\-/])grok(?:[-./]|$)/u, 'grok'],\n [/(?:^|[\\-/])(?:minimax|mcode)(?:[-./]|$)/u, 'mcode'],\n [/(?:^|[\\-/])workbuddy(?:[-./]|$)/u, 'workbuddy'],\n [/(?:^|[\\-/])codebuddy(?:[-./]|$)/u, 'codebuddy'],\n [/(?:^|[\\-/])cursor(?:[-./]|$)/u, 'cursor-cli'],\n [/(?:^|[\\-/])qoder(?:[-./]|$)/u, 'qoder'],\n [/(?:^|[\\-/])command(?:-?code)(?:[-./]|$)/u, 'command-code'],\n [/(?:^|[\\-/])zcode(?:[-./]|$)/u, 'zcode'],\n [/(?:^|[\\-/])antigravity(?:[-./]|$)/u, 'antigravity'],\n]\n\nconst KNOWN_PROVIDER_ICON_IDS = new Set([\n ...Object.keys(PROVIDER_DEFINITIONS),\n ...Object.keys(PROVIDER_ICON_FILES),\n ...Object.values(PROVIDER_ICON_ALIASES),\n])\n\n/** 只由浏览器入口调用,使普通 Node 测试不需要加载 png/svg。 */\nexport function installProviderIcons(icons: Readonly<Record<string, string>>): void {\n for (const adapterId of Object.keys(PROVIDER_ICONS)) delete PROVIDER_ICONS[adapterId]\n // 资源也包含 R4 等上游品牌,不要求它同时是可执行的 Agent。\n for (const adapterId of Object.keys(icons)) {\n const iconUrl = icons[adapterId]\n if (iconUrl !== undefined) PROVIDER_ICONS[adapterId] = iconUrl\n }\n}\n\nexport function providerIconUrl(adapterId: string): string | undefined {\n return providerIconUrlForIdentities([adapterId])\n}\n\n/**\n * Resolve one canonical provider asset ID from the identities emitted by a\n * Magpie record. Specific provider identities win over the Magpie gateway;\n * model-family inference is only used when no provider identity is known.\n */\nexport function resolveProviderIconId(identities: readonly (string | null | undefined)[]): string | undefined {\n const candidates = providerIconCandidates(identities)\n return candidates[0]\n}\n\n/** Resolve and load a logo for a record that may expose several identities. */\nexport function providerIconUrlForIdentities(identities: readonly (string | null | undefined)[]): string | undefined {\n for (const iconId of providerIconCandidates(identities)) {\n const iconUrl = PROVIDER_ICONS[iconId]\n if (iconUrl !== undefined) return iconUrl\n }\n return undefined\n}\n\n/**\n * 未绑定和未知值都返回中性占位,绝不冒充任一已知品牌。\n *\n * 第二个参数是 Codingns4DSH 词典翻译函数;未提供时退回内置中文词典,\n * 保证不接 locale 的调用方与单测仍能拿到稳定的展示名。\n */\nexport function providerVisual(adapterId: string | undefined, t?: CodingNsTranslator): ProviderVisual {\n const translate = t ?? resolveCodingNsTranslator()\n if (adapterId === undefined || adapterId.trim() === '') {\n return { adapterId: null, displayName: translate('provider.unbound'), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n const normalizedAdapterId = normalizeProviderAdapterId(adapterId)\n const definition = PROVIDER_DEFINITIONS[normalizedAdapterId]\n if (definition === undefined) {\n return { adapterId, displayName: translate('provider.unknown', { adapterId }), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n return { ...definition, displayName: definition.displayNameKey ? translate(definition.displayNameKey) : definition.displayName, iconUrl: providerIconUrl(adapterId) }\n}\n\n/** 兼容旧版 CN profile 的会话快照,但不重新暴露第二个 Provider。 */\nfunction normalizeProviderAdapterId(adapterId: string): string {\n const normalized = fromCliProviderId(adapterId) ?? adapterId\n return normalized === 'codebuddy-cn' ? 'codebuddy' : normalized\n}\n\nfunction providerIconCandidates(identities: readonly (string | null | undefined)[]): readonly string[] {\n const specific: string[] = []\n const inferred: string[] = []\n const gateway: string[] = []\n const seen = new Set<string>()\n let hasSpecificProvider = false\n\n const add = (target: string[], iconId: string): void => {\n if (seen.has(iconId)) return\n seen.add(iconId)\n target.push(iconId)\n }\n\n for (const identity of identities) {\n if (identity === undefined || identity === null || identity.trim() === '') continue\n const normalized = normalizeProviderIdentity(identity)\n const cliAdapterId = fromCliProviderId(normalized)\n const values = [\n ...(cliAdapterId === undefined ? [] : [normalizeProviderIdentity(cliAdapterId)]),\n normalized,\n ...normalized.split('/').filter((value) => value !== '').reverse(),\n ]\n for (const value of values) {\n const iconId = canonicalProviderIconId(value)\n if (iconId === undefined) continue\n if (iconId === 'magpie') add(gateway, iconId)\n else {\n hasSpecificProvider = true\n add(specific, iconId)\n }\n }\n for (const value of values) {\n for (const [pattern, iconId] of MODEL_PROVIDER_PATTERNS) {\n if (pattern.test(value)) add(inferred, iconId)\n }\n }\n }\n\n // Do not let a gateway label mask the actual provider or a recognizable model family.\n return hasSpecificProvider ? specific : [...inferred, ...gateway]\n}\n\nfunction canonicalProviderIconId(value: string): string | undefined {\n const normalized = normalizeProviderIdentity(value)\n const aliased = PROVIDER_ICON_ALIASES[normalized] ?? normalized\n if (KNOWN_PROVIDER_ICON_IDS.has(aliased) || PROVIDER_ICONS[aliased] !== undefined) return aliased\n return undefined\n}\n\nfunction normalizeProviderIdentity(value: string): string {\n return value.trim().toLocaleLowerCase().replace(/[\\s_]+/gu, '-')\n}\n\nexport { PROVIDER_DEFINITIONS, PROVIDER_ICONS }\n","/**\n * Codingns4DSH 调试日志开关。\n *\n * 调试输出默认关闭。需要查看启动或 RPC 追踪时,使用\n * `CODINGNS4DSH_DEBUG=1 dsh ...` 启动 DSH;浏览器侧同时支持 `?dshDebug=1`。\n * 只看警告和错误时使用 `CODINGNS4DSH_DEBUG_LEVEL=warn`,也接受\n * `CODINGNS4DSH_DEBUG=warn` 作为简写。\n */\nexport const CODINGNS4DSH_DEBUG_ENV = 'CODINGNS4DSH_DEBUG'\nexport const CODINGNS4DSH_DEBUG_LEVEL_ENV = 'CODINGNS4DSH_DEBUG_LEVEL'\n/** 兼容脚本化启动器的显式警告模式开关。 */\nexport const CODINGNS4DSH_DEBUG_WARN_ENV = 'CODINGNS4DSH_DEBUG_WARN'\n\nconst LEGACY_DEBUG_ENV = 'CODINGNS4DSH_TUNNEL_DEBUG'\n\nexport type CodingNsDebugLevel = 'off' | 'warn' | 'info'\n\n/** 当前运行环境是否明确要求输出调试日志。 */\nexport function resolveCodingNsDebugEnabled(): boolean {\n return resolveCodingNsDebugLevel() !== 'off'\n}\n\n/** 解析调试日志级别;`warn` 会过滤普通追踪信息,只保留警告和错误。 */\nexport function resolveCodingNsDebugLevel(): CodingNsDebugLevel {\n const globals = globalThis as typeof globalThis & {\n __CODINGNS4DSH_DEBUG_ENABLED__?: unknown\n __CODINGNS4DSH_DEBUG_LEVEL__?: unknown\n __CODINGNS4DSH_TUNNEL_DEBUG__?: unknown\n }\n if (globals.__CODINGNS4DSH_DEBUG_LEVEL__ !== undefined) {\n return parseDebugLevel(globals.__CODINGNS4DSH_DEBUG_LEVEL__)\n }\n const globalValue = globals.__CODINGNS4DSH_DEBUG_ENABLED__ ?? globals.__CODINGNS4DSH_TUNNEL_DEBUG__\n if (globalValue !== undefined) return parseDebugValue(globalValue) ? 'info' : 'off'\n\n if (typeof location !== 'undefined') {\n const searchParams = new URL(location.href).searchParams\n const queryValue = searchParams.get('dshDebugLevel') ?? searchParams.get('dshDebug')\n if (queryValue !== null) return parseDebugLevel(queryValue)\n }\n\n if (typeof localStorage !== 'undefined') {\n try {\n const storedLevel = localStorage.getItem('codingns4dsh-debug-level')\n if (storedLevel !== null) return parseDebugLevel(storedLevel)\n const storedWarn = localStorage.getItem('codingns4dsh-debug-warn')\n if (storedWarn !== null && parseDebugValue(storedWarn)) return 'warn'\n const stored = localStorage.getItem('codingns4dsh-debug')\n ?? localStorage.getItem('codingns4dsh-tunnel-debug')\n if (stored !== null) return parseDebugLevel(stored)\n } catch {\n // 隐私模式或受限 iframe 可能禁止读取 localStorage,继续检查进程环境变量。\n }\n }\n\n if (typeof process !== 'undefined') {\n const level = process.env[CODINGNS4DSH_DEBUG_LEVEL_ENV]\n if (level !== undefined) return parseDebugLevel(level)\n if (parseDebugValue(process.env[CODINGNS4DSH_DEBUG_WARN_ENV])) return 'warn'\n return parseDebugLevel(process.env[CODINGNS4DSH_DEBUG_ENV] ?? process.env[LEGACY_DEBUG_ENV])\n }\n return 'off'\n}\n\n/** 输出受统一开关控制的调试信息。 */\nexport function debugInfo(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugLevel() === 'info') console.info(message, ...args)\n}\n\n/** 输出受统一开关控制的调试警告。 */\nexport function debugWarn(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugEnabled()) console.warn(message, ...args)\n}\n\nfunction parseDebugValue(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value !== 'string') return false\n return /^(1|true|yes|on)$/iu.test(value.trim())\n}\n\nfunction parseDebugLevel(value: unknown): CodingNsDebugLevel {\n if (typeof value === 'boolean') return value ? 'info' : 'off'\n if (typeof value !== 'string') return 'off'\n const normalized = value.trim().toLowerCase()\n if (/^(warn|warning|error)$/u.test(normalized)) return 'warn'\n if (/^(1|true|yes|on|info|debug)$/u.test(normalized)) return 'info'\n return 'off'\n}\n","import type { CodingNsDshErrorCode } from './errors.js'\n\n/** Codingns4DSH Host RPC 的固定逻辑通道。 */\nexport const CODINGNS_RPC_CHANNEL = '/codingns'\n\nexport interface CodingNsRpcRequest<TPayload = unknown> {\n method: string\n payload: TPayload\n signal?: AbortSignal\n}\n\nexport interface CodingNsStreamRequest<TPayload = unknown> {\n method: string\n payload: TPayload\n signal?: AbortSignal\n}\n\nexport interface CodingNsTransportGeneration {\n id: number\n host: { home: string }\n}\n\nexport interface CodingNsTransport {\n rpc<TResponse = unknown, TPayload = unknown>(request: CodingNsRpcRequest<TPayload>): Promise<TResponse>\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>\n openStream<TChunk = unknown, TPayload = unknown>(request: CodingNsStreamRequest<TPayload>): AsyncIterable<TChunk>\n loadBundle(url: string): Promise<void>\n getGeneration(): CodingNsTransportGeneration | undefined\n onGenerationChange(listener: (generation: CodingNsTransportGeneration | undefined) => void): () => void\n reconnect(signal?: AbortSignal): Promise<void>\n close(): Promise<void>\n}\n\nexport interface CodingNsTransportHooks {\n rpc?: CodingNsTransport['rpc']\n fetch?: CodingNsTransport['fetch']\n openStream?: CodingNsTransport['openStream']\n loadBundle?: CodingNsTransport['loadBundle']\n generation?: CodingNsTransport['getGeneration']\n onGenerationChange?: CodingNsTransport['onGenerationChange']\n reconnect?: CodingNsTransport['reconnect']\n close?: CodingNsTransport['close']\n}\n\nexport interface CodingNsTransportErrorShape {\n code: CodingNsDshErrorCode\n message: string\n generationId?: number\n}\n","/** PeerHost 目标路由;短期 relay ticket 永远不属于持久配置。 */\nexport type PeerHostRoute =\n | {\n readonly kind: 'lan'\n readonly baseUrl: string\n readonly normalizedOrigin: string\n }\n | {\n readonly kind: 'relay'\n readonly deviceId: string\n readonly relayEntryId: string\n readonly transportVersion: string\n }\n\nexport type PeerHostStatus =\n | 'configured'\n | 'checking'\n | 'ready'\n | 'plugin_missing'\n | 'version_mismatch'\n | 'identity_changed'\n | 'session_required'\n | 'unreachable'\n | 'reconnecting'\n | 'disabled'\n\n/** Host 侧保存的 PeerHost 配置与脱敏握手状态。凭据不在此 DTO 中。 */\nexport interface PeerHostRecord {\n readonly id: string\n readonly ownerUserId: string\n readonly displayName: string\n readonly route: PeerHostRoute\n readonly status: PeerHostStatus\n readonly pluginId: string | null\n readonly pluginVersion: string | null\n readonly dshVersion: string | null\n /** 远端操作系统主机名;旧记录没有此字段时保持缺省。 */\n readonly hostname?: string | null\n /** 远端 DSH 配置文件名;只返回名称,不返回本地路径。 */\n readonly configProfile?: string | null\n readonly apiCompatibility: string | null\n readonly fingerprint: string | null\n readonly lastCheckedAt: number | null\n readonly lastErrorCode: PeerHostErrorCode | null\n /**\n * 工作区标签配色;缺省时客户端按名称推导稳定色。\n *\n * 颜色只影响本机侧栏标签,不参与握手、代理或目标 Host 的任何状态。\n */\n readonly color?: string | null\n /**\n * 用户显式添加的远端工作区 ID。\n *\n * 聚合摘要只投影这个集合内的远端工作区;缺省或空集合表示\"尚未显式添加任何\n * 远端工作区\",此时不展示该 Host 的任何工作区——这是默认行为,不是降级。\n */\n readonly visibleWorkspaceIds?: readonly string[]\n readonly createdAt: number\n readonly updatedAt: number\n}\n\n/** Client 管理面板可见的 PeerHost 摘要;仅暴露局域网地址,凭据和中转路由详情仍留在 Host。 */\nexport type PeerHostClientRoute =\n | { readonly kind: 'lan'; readonly baseUrl?: string }\n | { readonly kind: 'relay' }\n\nexport type PeerHostClientRecord = Omit<PeerHostRecord, 'route'> & {\n readonly route: PeerHostClientRoute\n}\n\n/** Client 可见的 PeerHost 诊断快照;不包含完整路由、凭据或正文。 */\nexport interface PeerHostDiagnosticSnapshot {\n readonly peerHostId: string\n readonly routeKind: 'lan' | 'relay'\n readonly status: PeerHostStatus\n readonly lastErrorCode: PeerHostErrorCode | null\n readonly lastCheckedAt: number | null\n readonly fingerprint: string | null\n}\n\n/** 当前 Host 插件自有 WebSocket 入口;不包含任何目标 Host 地址或凭据。 */\nexport interface PeerHostWebSocketEndpoint {\n readonly host: string\n readonly port: number\n readonly path: string\n}\n\n/** 所有跨 Host 资源共用的完整作用域。 */\nexport interface HostScope {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string | null\n readonly scopeGeneration: number\n}\n\n/** 只保留标题投影及远端原生序号,避免把实时标题降级为无法覆盖旧值的缓存。 */\nexport interface PeerHostSessionTitleProjection {\n readonly kind: 'cached' | 'sequenced'\n readonly asOfSeq: number\n readonly values: { readonly title: string | null }\n}\n\n/** 会话摘要只用于聚合导航,不包含历史消息或工具内容。 */\nexport interface PeerHostSessionRecord {\n readonly scope: HostScope\n readonly title: string\n /** 旧版摘要缺省;不得使用 updatedAt 伪造原生事件序号。 */\n readonly titleProjection?: PeerHostSessionTitleProjection\n readonly status: string\n /** 来自真实执行状态的证明;不能把导航层默认 idle 当作完成证明。 */\n readonly activity?: 'running' | 'idle' | 'unknown'\n readonly updatedAt: number\n /** DSH 原生会话是否仍处于待首条消息的临时状态。 */\n readonly blank: boolean\n /** 远端 CodingNS CLI 会话绑定的适配器;旧 Host 未提供时保持缺省。 */\n readonly adapterId?: string\n /** 子会话身份仅用于原生目录与路由,不改变工作区侧栏的可见会话。 */\n readonly origin?: 'subagent'\n readonly parentSessionId?: string\n}\n\n/** 当前 Host 和 PeerHost 统一使用的工作区摘要。 */\nexport interface AggregateWorkspaceSummary {\n readonly key: string\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly displayName: string\n /** 工作区在所属 Host 上的真实路径;原生文件面板等按路径解析,不能用 workspaceId 代替。 */\n readonly path: string\n readonly hostLabel: string\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly sessions: readonly PeerHostSessionRecord[]\n /**\n * 已归档会话。远端侧栏默认隐藏这些行,但归档入口、归档集合与取消归档路由\n * 仍需要它们;子代理会话在可见与归档两侧都不出现。\n */\n readonly archivedSessions?: readonly PeerHostSessionRecord[]\n /** 可见工作区下的子会话,进入状态和路由目录,但不占侧栏成员槽位。 */\n readonly subagentSessions?: readonly PeerHostSessionRecord[]\n}\n\nexport interface AggregateHostResult {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n /** 该 Host 工作区标签的配色;缺省时客户端按名称推导稳定色。 */\n readonly hostColor?: string | null\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly errorCode: PeerHostErrorCode | null\n /** 摘要能力不可用时保留可诊断原因,禁止以空工作区伪装成功。 */\n readonly diagnostic?: string\n readonly workspaces: readonly AggregateWorkspaceSummary[]\n}\n\n/**\n * 工作区标签配色的取值范围。\n *\n * 只接受 `#rrggbb`:颜色会被写进本机侧栏 DOM 的内联样式,开放任意字符串\n * 等于把 CSS 注入面交给远端配置。\n */\nexport const PEER_HOST_COLOR_PATTERN = /^#[0-9a-f]{6}$/u\n\n/** 校验并归一化工作区标签配色;非法值返回 null,由消费方回退到推导色。 */\nexport function normalizePeerHostColor(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim().toLowerCase()\n return PEER_HOST_COLOR_PATTERN.test(trimmed) ? trimmed : null\n}\n\n/** 管理面板的默认配色候选;顺序即下拉顺序。 */\nexport const PEER_HOST_COLOR_PRESETS = Object.freeze([\n '#1677ff',\n '#722ed1',\n '#13c2c2',\n '#52c41a',\n '#fa8c16',\n '#eb2f96',\n '#f5222d',\n '#8c8c8c',\n] as const)\n\n/** Aggregated Host 只允许本地插件基线;远端不得提供 Manifest、Bundle 或 UI Slot。 */\nexport interface AggregatedHostLocalPluginBaseline {\n readonly pluginId: string\n readonly pluginVersion: string\n readonly manifestSource: 'local'\n readonly bundleSource: 'local'\n readonly uiSource: 'local'\n readonly allowRemoteManifest: false\n readonly allowRemoteBundle: false\n}\n\n/** 目标 Host 的执行能力摘要;不包含 token、路由地址或插件正文。 */\nexport interface AggregatedHostCapabilitySummary {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n readonly status: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly dshVersion: string | null\n readonly apiCompatibility: string | null\n readonly capabilities: readonly string[]\n readonly diagnostic?: string\n}\n\n/** Client 读取的 Manifest 只代表当前 Host 的本地插件基线。 */\nexport interface AggregatedHostManifestBoundary {\n readonly source: 'local'\n readonly plugin: AggregatedHostLocalPluginBaseline\n readonly remoteManifest: 'forbidden'\n readonly remoteBundle: 'forbidden'\n}\n\n/** Aggregated Transport 的物理连接 generation;作用域 generation 仍由 HostScope 管理。 */\nexport interface AggregatedHostGeneration {\n readonly id: number\n readonly host: { readonly home: string }\n readonly connectedAt: number\n}\n\nexport interface AggregatedHostRpcRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostFetchRequest {\n readonly scope: HostScope\n readonly path: string\n readonly method?: string\n readonly headers?: Readonly<Record<string, string>>\n readonly body?: string\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostStreamRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\n/** Client 侧只提交自己的 Socket;目标连接和 token 由 Host 侧代理服务持有。 */\nexport interface AggregatedHostWebSocketClient {\n readonly readyState: number\n send(data: string): void\n close(code?: number, reason?: string): void\n on(event: 'message' | 'close' | 'error', listener: (...args: any[]) => void): void\n}\n\n/** Aggregated Host 的内部稳定 Transport;不替换普通插件 ctx.connection。 */\nexport interface AggregatedHostTransport {\n readonly kind: 'aggregated-host'\n readonly localPlugin: AggregatedHostLocalPluginBaseline\n getCapabilities(): readonly AggregatedHostCapabilitySummary[]\n rpc<TResponse = unknown>(request: AggregatedHostRpcRequest): Promise<TResponse>\n fetch(request: AggregatedHostFetchRequest): Promise<Response>\n openStream<TChunk = unknown>(request: AggregatedHostStreamRequest): AsyncIterable<TChunk>\n openWebSocket(client: AggregatedHostWebSocketClient, scope: HostScope): Promise<() => void>\n getGeneration(): AggregatedHostGeneration | undefined\n onGenerationChange(listener: (generation: AggregatedHostGeneration | undefined) => void): () => void\n reconnect(signal?: AbortSignal): Promise<void>\n readManifest(): AggregatedHostManifestBoundary\n loadBundle(url: string): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * 聚合 Host 对外暴露的资源命名空间。\n *\n * 远端 Host 的 workspace/session id 只在各自 Host 内唯一,不能直接交给\n * 本地 DSH Store。聚合层使用版本化、可逆的虚拟 ID,避免不同 Host 的同名\n * 资源碰撞,同时保留真实 ID 供路由层转发。\n */\nexport type VirtualWorkspaceId = string\nexport type VirtualSessionId = string\n\nexport interface VirtualWorkspaceRef {\n readonly virtualWorkspaceId: VirtualWorkspaceId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n}\n\nexport interface VirtualSessionRef {\n readonly virtualSessionId: VirtualSessionId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string\n}\n\n/** 混合 Workspace 顺序的持久化内容,只保存虚拟 ID,不复制 Host 数据。 */\nexport interface AggregateWorkspaceOrder {\n readonly version: 1\n readonly orderedWorkspaceIds: readonly VirtualWorkspaceId[]\n}\n\nexport const VIRTUAL_RESOURCE_ID_PREFIX = 'codingns:peer-host:v1'\n\nexport function createVirtualWorkspaceId(hostId: string, workspaceId: string): VirtualWorkspaceId {\n return createVirtualResourceId('workspace', hostId, workspaceId)\n}\n\nexport function createVirtualSessionId(hostId: string, sessionId: string): VirtualSessionId {\n return createVirtualResourceId('session', hostId, sessionId)\n}\n\nexport function parseVirtualWorkspaceId(value: string): VirtualWorkspaceRef | null {\n const parsed = parseVirtualResourceId(value, 'workspace')\n if (parsed === null) return null\n return { virtualWorkspaceId: value, hostId: parsed.hostId, targetHostId: parsed.hostId === 'local' ? null : parsed.hostId, workspaceId: parsed.resourceId }\n}\n\nexport function parseVirtualSessionId(value: string): { readonly hostId: string; readonly sessionId: string } | null {\n const parsed = parseVirtualResourceId(value, 'session')\n return parsed === null ? null : { hostId: parsed.hostId, sessionId: parsed.resourceId }\n}\n\nfunction createVirtualResourceId(kind: 'workspace' | 'session', hostId: string, resourceId: string): string {\n const host = requiredResourcePart(hostId, 'hostId')\n const resource = requiredResourcePart(resourceId, kind === 'workspace' ? 'workspaceId' : 'sessionId')\n return `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:${encodeURIComponent(host)}:${encodeURIComponent(resource)}`\n}\n\nfunction parseVirtualResourceId(value: string, kind: 'workspace' | 'session'): { readonly hostId: string; readonly resourceId: string } | null {\n if (typeof value !== 'string') return null\n const prefix = `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:`\n if (!value.startsWith(prefix)) return null\n const parts = value.slice(prefix.length).split(':')\n if (parts.length !== 2 || parts.some((part) => part === '')) return null\n try {\n const hostId = decodeURIComponent(parts[0]!)\n const resourceId = decodeURIComponent(parts[1]!)\n return hostId && resourceId ? { hostId, resourceId } : null\n } catch {\n return null\n }\n}\n\nfunction requiredResourcePart(value: string, name: string): string {\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${name} 不能为空`)\n return value\n}\n\nexport const PEER_HOST_ERROR_CODES = {\n NOT_FOUND: 'PEER_HOST_NOT_FOUND',\n NOT_READY: 'PEER_HOST_NOT_READY',\n SESSION_REQUIRED: 'PEER_HOST_SESSION_REQUIRED',\n PROXY_PATH_NOT_ALLOWED: 'PEER_HOST_PROXY_PATH_NOT_ALLOWED',\n PROXY_ACCESS_DENIED: 'PEER_HOST_PROXY_ACCESS_DENIED',\n SCOPE_MISMATCH: 'PEER_HOST_SCOPE_MISMATCH',\n PROXY_UNREACHABLE: 'PEER_HOST_PROXY_UNREACHABLE',\n RESPONSE_INVALID: 'PEER_HOST_RESPONSE_INVALID',\n TOOL_UNSUPPORTED: 'PEER_HOST_TOOL_UNSUPPORTED',\n INVALID_ROUTE: 'PEER_HOST_INVALID_ROUTE',\n DUPLICATE: 'PEER_HOST_DUPLICATE',\n PLUGIN_MISSING: 'PEER_HOST_PLUGIN_MISSING',\n VERSION_MISMATCH: 'PEER_HOST_VERSION_MISMATCH',\n IDENTITY_CHANGED: 'PEER_HOST_IDENTITY_CHANGED',\n UNREACHABLE: 'PEER_HOST_UNREACHABLE',\n RELAY_UNAVAILABLE: 'PEER_HOST_RELAY_UNAVAILABLE',\n AGGREGATE_UNAVAILABLE: 'PEER_HOST_AGGREGATE_UNAVAILABLE',\n STALE_GENERATION: 'PEER_HOST_STALE_GENERATION',\n AGGREGATED_TRANSPORT_UNSUPPORTED: 'PEER_HOST_AGGREGATED_TRANSPORT_UNSUPPORTED',\n AGGREGATED_MANIFEST_FORBIDDEN: 'PEER_HOST_AGGREGATED_MANIFEST_FORBIDDEN',\n AGGREGATED_BUNDLE_FORBIDDEN: 'PEER_HOST_AGGREGATED_BUNDLE_FORBIDDEN',\n} as const\n\nexport type PeerHostErrorCode = typeof PEER_HOST_ERROR_CODES[keyof typeof PEER_HOST_ERROR_CODES]\n\n/** 可安全返回 Client 的结构化错误,不携带凭据、完整 URL 或内容数据。 */\nexport interface PeerHostErrorShape {\n readonly code: PeerHostErrorCode\n readonly peerHostId?: string\n readonly message: string\n}\n\n/** 作用域管理器仍使用的兼容引用;新跨 Host 代码应优先使用 HostScope。 */\nexport interface ResourceScopeRef {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n scopeGeneration: number\n sessionId?: string | null\n}\n\nexport interface ResourceScopeInput {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n sessionId?: string | null\n}\n\nexport type ResourceScopeSnapshot = Readonly<ResourceScopeRef>\n\n/** 作用域拥有的清理函数。清理函数必须可重复调用而不会产生副作用。 */\nexport type ResourceScopeDisposer = () => void | Promise<void>\n\n/** 作用域已经失效时统一抛出的错误。 */\nexport class ResourceScopeStaleError extends Error {\n readonly code = 'RESOURCE_SCOPE_STALE' as const\n\n constructor(message = 'Resource scope is stale') {\n super(message)\n this.name = 'ResourceScopeStaleError'\n }\n}\n","import type {\n CodingNsCliAdapterDescriptor,\n CodingNsCliModel,\n CodingNsCliModelCatalog,\n CodingNsCliSessionRecord,\n} from '../shared/contracts/cli-adapter.js'\nimport { CODINGNS_RPC_CHANNEL } from '../shared/contracts/transport.js'\nimport { debugInfo, debugWarn } from '../shared/debug.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport type { CodingNsTranslator } from './locale.js'\n\n/** 设置页和选择器使用同一状态文案,检测中或失败都不能显示成未安装。 */\nexport function adapterDetectionLabel(adapter: CodingNsCliAdapterDescriptor): 'cli.detecting' | 'cli.detectionFailed' | 'cli.installed' | 'cli.installedOffline' | 'cli.notInstalled' {\n if (adapter.detectionState === 'pending' || adapter.detectionState === 'running') return 'cli.detecting'\n if (adapter.detectionState === 'error') return 'cli.detectionFailed'\n if (adapter.installed && adapter.runtimeState === 'installed') return 'cli.installedOffline'\n return adapter.installed ? 'cli.installed' : 'cli.notInstalled'\n}\n\n/** Client 侧访问 Host CLI 命名空间的统一入口。 */\nexport async function callCliRpc<T>(rpc: CodingNsRpcClient, action: string, payload: unknown, signal?: AbortSignal): Promise<T> {\n let response\n try {\n debugInfo('codingns4dsh: cli rpc request', { channel: CODINGNS_RPC_CHANNEL, action })\n response = await rpc.call(CODINGNS_RPC_CHANNEL, `cli/${action}`, payload, signal)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (!/HTTP (?:404|405)\\b/u.test(message)) throw error\n debugWarn('codingns4dsh: cli rpc fallback', { action, error: message })\n try {\n response = await rpc.call('/api', `codingns/cli/${action}`, payload, signal)\n } catch (fallbackError) {\n console.error('codingns4dsh: cli rpc fallback failed', { action, error: fallbackError })\n throw fallbackError\n }\n }\n if (!response.ok) {\n console.error('codingns4dsh: cli rpc response error', { action, error: response.error })\n throw new Error(response.error.message)\n }\n debugInfo('codingns4dsh: cli rpc response success', { action })\n return response.value as T\n}\n\nexport function adapterCatalogWithDsh(catalog: readonly CodingNsCliAdapterDescriptor[], dshVersion?: string): CodingNsCliAdapterDescriptor[] {\n // 对话框只展示实际可用的适配器;未安装或已停用的适配器由设置页管理。\n const available = catalog.filter((adapter) => adapter.installed && adapter.enabled)\n const version = dshVersion?.trim()\n const existingDsh = available.find((adapter) => adapter.id === 'dsh')\n if (existingDsh !== undefined) {\n if (version === undefined || version === '' || existingDsh.version === version) return available\n return available.map((adapter) => adapter.id === 'dsh' ? { ...adapter, version } : adapter)\n }\n return [{ id: 'dsh', name: 'DeepSeek Harness', installed: true, enabled: true, version: version === undefined || version === '' ? null : version, command: null }, ...available]\n}\n\nexport function firstModel(catalog: CodingNsCliModelCatalog): CodingNsCliModel | undefined {\n for (const group of catalog.groups) {\n const model = group.models[0]\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function findModel(catalog: CodingNsCliModelCatalog, modelId: string | undefined): CodingNsCliModel | undefined {\n if (modelId === undefined) return undefined\n for (const group of catalog.groups) {\n const model = group.models.find((item) => item.id === modelId)\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** 旧 Host 缺少重新检测动作时给出版本提示;网络和检测错误仍保留原始原因。 */\nexport function catalogRefreshErrorMessage(error: unknown, t: CodingNsTranslator): string {\n const message = errorMessage(error)\n return /^未知 CLI RPC: cli\\/catalog\\/refresh$/u.test(message)\n ? t('cli.redetectHostUnsupported')\n : message\n}\n\n/** 读取 Host 持久化的外部会话索引;兼容数组和带 items/sessions 的响应包装。 */\nexport async function listCliSessions(\n rpc: CodingNsRpcClient,\n options: { readonly includeArchived?: boolean; readonly adapterId?: string } = {},\n): Promise<readonly CodingNsCliSessionRecord[]> {\n const value = await callCliRpc<unknown>(rpc, 'session/list', options)\n const rows = Array.isArray(value)\n ? value\n : isRecord(value) && Array.isArray(value.items)\n ? value.items\n : isRecord(value) && Array.isArray(value.sessions)\n ? value.sessions\n : []\n return rows.filter(isCliSessionRecord).map(redactCliSessionRecord)\n}\n\n/** 把已存在的 DSH 会话恢复到原生会话页面;插件不接管消息列表。 */\nexport async function restoreCliSession(\n rpc: CodingNsRpcClient,\n record: CodingNsCliSessionRecord,\n): Promise<void> {\n await callCliRpc(rpc, 'session/set', {\n sessionId: record.dshSessionId,\n adapterId: record.adapterId,\n ...(record.modelId ? { modelId: record.modelId } : {}),\n ...(record.effortId ? { effortId: record.effortId } : {}),\n ...(record.serviceTierId ? { serviceTierId: record.serviceTierId } : {}),\n ...(record.providerId ? { providerId: record.providerId } : {}),\n ...(record.providerSessionId ? { providerSessionId: record.providerSessionId } : {}),\n })\n navigateToDshSession(record.dshSessionId)\n}\n\n/** 通过 Host 同步归档 DSH 原生会话和 Codingns4DSH 外部会话索引。 */\nexport async function archiveCliSession(\n rpc: CodingNsRpcClient,\n sessionId: string,\n): Promise<void> {\n await callCliRpc(rpc, 'session/archive', { sessionId })\n}\n\n/**\n * 使用 DSH 当前的会话路由,而不是在插件中复制会话消息组件。\n * 旧版 DSH 使用 `/sessions/:id`,新版 workspace 页面使用同一路径的 workspace 前缀,\n * 因此保留当前 workspace 段并只替换 session id。\n */\nexport function navigateToDshSession(sessionId: string): void {\n if (typeof window === 'undefined' || sessionId.trim() === '') return\n const encoded = encodeURIComponent(sessionId.trim())\n const pathname = window.location.pathname\n const nextPath = /^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u, `$1${encoded}`)\n : /^\\/sessions\\/[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^\\/sessions\\/[^/]+(?:\\/.*)?$/u, `/sessions/${encoded}`)\n : `/sessions/${encoded}`\n if (`${window.location.pathname}${window.location.search}${window.location.hash}` === `${nextPath}${window.location.search}${window.location.hash}`) return\n window.history.pushState({}, '', nextPath)\n window.dispatchEvent(new PopStateEvent('popstate'))\n}\n\nfunction isCliSessionRecord(value: unknown): value is CodingNsCliSessionRecord {\n if (!isRecord(value)) return false\n return typeof value.dshSessionId === 'string'\n && value.dshSessionId.trim() !== ''\n && typeof value.adapterId === 'string'\n && value.adapterId.trim() !== ''\n && (value.status === 'active' || value.status === 'idle' || value.status === 'error' || value.status === 'archived')\n && typeof value.createdAt === 'string'\n && typeof value.updatedAt === 'string'\n}\n\n/** 双重防护:即使旧 Host 错误返回 rawStoreRef,浏览器也不会把它留在状态中。 */\nfunction redactCliSessionRecord(record: CodingNsCliSessionRecord): CodingNsCliSessionRecord {\n const { rawStoreRef: _rawStoreRef, ...safe } = record\n return safe\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { CodingNsCliAdapterDescriptor } from '../shared/contracts/cli-adapter.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport { callCliRpc } from './cli-catalog.js'\n\nconst loads = new WeakMap<CodingNsRpcClient, Map<string, Promise<readonly CodingNsCliAdapterDescriptor[]>>>()\nexport type AdapterCatalogChange =\n | { readonly kind: 'adapter' }\n | { readonly kind: 'models'; readonly adapterId: string }\n\nconst listeners = new WeakMap<CodingNsRpcClient, Set<(change: AdapterCatalogChange) => void>>()\n\n/** 手动检测完成后,让已挂载的选择器和模型目录一起更新。 */\nexport function notifyAdapterCatalogChanged(rpc: CodingNsRpcClient): void {\n publishCatalogChange(rpc, { kind: 'adapter' })\n}\n\n/** Model enrichment must not trigger a fresh adapter-installation scan. */\nexport function notifyModelCatalogChanged(rpc: CodingNsRpcClient, adapterId: string): void {\n publishCatalogChange(rpc, { kind: 'models', adapterId })\n}\n\nfunction publishCatalogChange(rpc: CodingNsRpcClient, change: AdapterCatalogChange): void {\n for (const listener of listeners.get(rpc) ?? []) listener(change)\n}\n\nexport function subscribeAdapterCatalogChanged(rpc: CodingNsRpcClient, listener: (change: AdapterCatalogChange) => void): () => void {\n let entries = listeners.get(rpc)\n if (entries === undefined) { entries = new Set(); listeners.set(rpc, entries) }\n entries.add(listener)\n return () => { entries.delete(listener) }\n}\n\n/** Poll only while installation detection or an explicitly requested release check is pending. */\nexport function watchAdapterCatalog(\n rpc: CodingNsRpcClient,\n sessionId: string | undefined,\n onValue: (value: readonly CodingNsCliAdapterDescriptor[]) => void,\n onError: (error: unknown) => void = () => undefined,\n): () => void {\n let active = true\n let busy = false\n let dirty = false\n let started = Date.now()\n let failures = 0\n let timer: ReturnType<typeof setTimeout> | undefined\n const refresh = async (): Promise<void> => {\n if (!active) return\n if (busy) { dirty = true; return }\n clearTimeout(timer)\n busy = true\n try {\n let requests = loads.get(rpc)\n if (requests === undefined) { requests = new Map(); loads.set(rpc, requests) }\n const key = sessionId ?? ''\n let request = requests.get(key)\n if (request === undefined) {\n request = callCliRpc<readonly CodingNsCliAdapterDescriptor[]>(rpc, 'catalog', sessionId === undefined ? {} : { sessionId }, AbortSignal.timeout(10_000))\n .finally(() => { if (requests.get(key) === request) requests.delete(key) })\n requests.set(key, request)\n }\n const value = await request\n if (!active) return\n failures = 0\n onValue(value)\n if (value.some((entry) => entry.detectionState === 'pending' || entry.detectionState === 'running' || entry.update?.state === 'checking') && Date.now() - started < 120_000) {\n timer = setTimeout(() => { void refresh() }, 1_000)\n }\n } catch (error) {\n if (active) {\n failures += 1\n if (failures === 1) onError(error)\n if (Date.now() - started < 120_000) timer = setTimeout(() => { void refresh() }, Math.min(1_000 * 2 ** failures, 15_000))\n }\n }\n finally {\n busy = false\n if (dirty && active) { dirty = false; void refresh() }\n }\n }\n const remove = subscribeAdapterCatalogChanged(rpc, (change) => {\n if (change.kind !== 'adapter') return\n started = Date.now()\n void refresh()\n })\n void refresh()\n return () => { active = false; clearTimeout(timer); remove() }\n}\n","import type { CodingNsCliModelCatalog } from '../shared/contracts/cli-adapter.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport { callCliRpc } from './cli-catalog.js'\nimport { notifyModelCatalogChanged } from './adapter-catalog-watch.js'\nimport { parseVirtualSessionId } from '../shared/contracts/peer-host.js'\n\n/**\n * Client 侧模型目录缓存。\n *\n * Agent 选择器、模型选择器和委派弹层共享同一份 RPC 结果。缓存只属于当前\n * RPC 客户端实例与会话所属 Host,同一 Host 的会话共享目录,跨 Host 不复用。\n */\nconst modelCatalogCaches = new WeakMap<object, Map<string, CodingNsCliModelCatalog>>()\nconst modelCatalogLoads = new WeakMap<object, Map<string, Promise<CodingNsCliModelCatalog>>>()\n/** PeerHost 复用页面 RPC 实例,用稳定的 Host 身份隔离目录、请求与复检节流。 */\nconst modelCatalogHostKeys = new WeakMap<object, Map<string, object>>()\n\nfunction modelCatalogKey(rpc: CodingNsRpcClient, sessionId?: string): object {\n const hostId = sessionId === undefined ? undefined : parseVirtualSessionId(sessionId)?.hostId\n if (hostId === undefined) return rpc as object\n let hosts = modelCatalogHostKeys.get(rpc as object)\n if (hosts === undefined) {\n hosts = new Map()\n modelCatalogHostKeys.set(rpc as object, hosts)\n }\n let key = hosts.get(hostId)\n if (key === undefined) { key = {}; hosts.set(hostId, key) }\n return key\n}\n\n/**\n * Client 缓存有效期。\n *\n * 目录里既有模型清单,也有账号级事实(例如 Codex 的 `officialSubscription`\n * 与 `defaultServiceTier`)。后者会随用户在外部工具里切换供应商或登录状态而\n * 变化,而页面不会因此重新挂载。若 Client 永久持有第一次的结果,依赖这些事实\n * 的控件(Codex 官方订阅的 Fast 档位开关)就会在整场会话里一直缺失。\n *\n * 因此这里给出一个短 TTL:命中即用(不阻塞渲染),过期后重新请求。Host 侧还会\n * 比对 Provider 配置指纹,配置真正变化时立即失效,不依赖这个 TTL。\n */\nexport const MODEL_CATALOG_CACHE_TTL_MS = 60_000\n\ninterface CachedCatalog {\n readonly value: CodingNsCliModelCatalog\n readonly storedAt: number\n readonly ttlMs: number\n}\n\nconst modelCatalogCacheTimes = new WeakMap<object, Map<string, CachedCatalog>>()\n\nfunction cacheEntry(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): CachedCatalog | undefined {\n return cacheTimesFor(rpc, sessionId).get(adapterId)\n}\n\nfunction cacheTimesFor(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CachedCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogCacheTimes.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogCacheTimes.set(key, times)\n }\n return times\n}\n\nfunction storeCatalog(rpc: CodingNsRpcClient, adapterId: string, value: CodingNsCliModelCatalog, sessionId?: string, ttlMs = MODEL_CATALOG_CACHE_TTL_MS): void {\n getModelCatalogCache(rpc, sessionId).set(adapterId, value)\n cacheTimesFor(rpc, sessionId).set(adapterId, { value, storedAt: Date.now(), ttlMs })\n}\n\n/** 指定会话时只作废其 Host;旧调用不传会话时仍清理整个 RPC 的指定目录。 */\nexport function invalidateModelCatalogCache(rpc: CodingNsRpcClient, adapterId?: string, sessionId?: string): void {\n const keys = sessionId === undefined\n ? [rpc as object, ...(modelCatalogHostKeys.get(rpc as object)?.values() ?? [])]\n : [modelCatalogKey(rpc, sessionId)]\n for (const key of keys) {\n const cache = modelCatalogCaches.get(key)\n const times = modelCatalogCacheTimes.get(key)\n const loads = modelCatalogLoads.get(key)\n if (adapterId === undefined) loads?.clear()\n else loads?.delete(adapterId)\n if (adapterId === undefined) { cache?.clear(); times?.clear() }\n else { cache?.delete(adapterId); times?.delete(adapterId) }\n }\n}\n\n/**\n * 「判定可能过期」时的复检节流。\n *\n * 目录声明了服务档位却未确认官方订阅时,值得再探测一次;但真实第三方接入会\n * 长期停在这个状态,不能每次挂载都发一次请求。这里按适配器记录最近一次复检\n * 时间,只有超过间隔才允许再次作废缓存。\n */\nexport const MODEL_CATALOG_REVALIDATE_INTERVAL_MS = 60_000\n\nconst modelCatalogRevalidations = new WeakMap<object, Map<string, number>>()\n\nexport function shouldRevalidateModelCatalog(\n rpc: CodingNsRpcClient,\n adapterId: string,\n needsRevalidation: boolean,\n sessionId?: string,\n): boolean {\n if (!needsRevalidation) return false\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogRevalidations.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogRevalidations.set(key, times)\n }\n const last = times.get(adapterId)\n const now = Date.now()\n if (last !== undefined && now - last < MODEL_CATALOG_REVALIDATE_INTERVAL_MS) return false\n times.set(adapterId, now)\n return true\n}\n\nexport function getModelCatalogCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CodingNsCliModelCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogCaches.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogCaches.set(key, cache)\n }\n return cache\n}\n\nexport function loadModelCatalog(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): Promise<CodingNsCliModelCatalog> {\n const cached = getModelCatalogCache(rpc, sessionId).get(adapterId)\n const entry = cached === undefined ? undefined : cacheEntry(rpc, adapterId, sessionId)\n // A successful stale catalog stays visible while a fresh base and optional\n // Magpie enrichment load in the background.\n if (cached !== undefined && cached.fallback !== true && entry?.value === cached && isFreshCacheEntry(rpc, adapterId, cached, sessionId)) {\n return Promise.resolve(cached)\n }\n const loads = getModelCatalogLoadCache(rpc, sessionId)\n const running = loads.get(adapterId)\n if (running !== undefined) return cached !== undefined && cached.fallback !== true ? Promise.resolve(cached) : running\n\n const hasStaleCatalog = cached !== undefined && cached.fallback !== true && entry?.value === cached\n if (cached !== undefined && !hasStaleCatalog) invalidateModelCatalogCache(rpc, adapterId, sessionId)\n\n const request = callCliRpc<CodingNsCliModelCatalog>(rpc, 'models', {\n adapterId,\n stage: 'base',\n ...(sessionId === undefined ? {} : { sessionId }),\n }).then((value) => {\n // 手动重新检测已替换请求时,迟到结果不能复活被作废的目录。\n if (loads.get(adapterId) !== request) return loadModelCatalog(rpc, adapterId, sessionId)\n if (value.fallback === true) {\n if (hasStaleCatalog && cached !== undefined) storeCatalog(rpc, adapterId, cached, sessionId, 5_000)\n else invalidateModelCatalogCache(rpc, adapterId, sessionId)\n } else {\n storeCatalog(rpc, adapterId, value, sessionId)\n if (hasStaleCatalog) notifyModelCatalogChanged(rpc, adapterId)\n }\n return value\n })\n loads.set(adapterId, request)\n\n // The base result above is the only part awaited by the caller. Enrichment\n // is a second, shared Host request; its completed snapshot replaces the base\n // cache and wakes mounted selectors without a timer or blocking spinner.\n void request.then(async (base) => {\n if (base.fallback === true || base.magpiePending !== true || loads.get(adapterId) !== request) return\n try {\n const enriched = await callCliRpc<CodingNsCliModelCatalog>(rpc, 'models', {\n adapterId,\n stage: 'enriched',\n ...(sessionId === undefined ? {} : { sessionId }),\n })\n if (loads.get(adapterId) !== request || getModelCatalogCache(rpc, sessionId).get(adapterId) !== base || enriched.fallback === true) return\n storeCatalog(rpc, adapterId, enriched, sessionId)\n notifyModelCatalogChanged(rpc, adapterId)\n } catch {\n if (loads.get(adapterId) !== request || getModelCatalogCache(rpc, sessionId).get(adapterId) !== base) return\n const readyBase = withoutMagpiePending(base)\n storeCatalog(rpc, adapterId, readyBase, sessionId, 5_000)\n notifyModelCatalogChanged(rpc, adapterId)\n }\n }).catch(() => {\n if (loads.get(adapterId) !== request) return\n const current = getModelCatalogCache(rpc, sessionId).get(adapterId)\n if (current === undefined || current.fallback === true || cacheEntry(rpc, adapterId, sessionId)?.value !== current) return\n // Keep showing the last good snapshot and avoid immediately retrying a\n // failing Host after every render.\n storeCatalog(rpc, adapterId, current, sessionId, 5_000)\n }).finally(() => {\n if (loads.get(adapterId) === request) loads.delete(adapterId)\n })\n\n if (hasStaleCatalog) return Promise.resolve(cached)\n return request\n}\n\nfunction withoutMagpiePending(catalog: CodingNsCliModelCatalog): CodingNsCliModelCatalog {\n if (catalog.magpiePending !== true) return catalog\n const { magpiePending: _magpiePending, ...ready } = catalog\n return ready\n}\n\n/** 缓存条目是否仍在有效期内;没有时间戳的旧条目按过期处理并触发一次重新读取。 */\nfunction isFreshCacheEntry(rpc: CodingNsRpcClient, adapterId: string, cached: CodingNsCliModelCatalog, sessionId?: string): boolean {\n const entry = cacheEntry(rpc, adapterId, sessionId)\n if (entry === undefined || entry.value !== cached) return false\n return Date.now() - entry.storedAt < entry.ttlMs\n}\n\nfunction getModelCatalogLoadCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, Promise<CodingNsCliModelCatalog>> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogLoads.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogLoads.set(key, cache)\n }\n return cache\n}\n","import * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport { createElement, type ComponentType, type ComponentProps, type ReactNode } from 'react'\n\n/** 富文本菜单沿用宿主的键盘导航、焦点归还和外部点击关闭行为。 */\nexport { Menu as DshMenu } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { Button as DshButton, Checkbox as DshCheckbox, Input as DshInput, Modal as DshModal } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { FileTypeIcon as DshFileTypeIcon, classifyFileType as classifyDshFileType, IconFolderCloseRegular as DshFolderIcon } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { PathLabel as DshPathLabel, Tooltip as DshTooltip } from '@deepseek-ai/dsh-client-ui-primitives'\n\n/** Older primitive packages may lack Markdown delegation. Do not fail the whole footer. */\nexport function hasNativeMarkdown(source: object = primitives): boolean {\n const value = source as Partial<typeof primitives>\n return value.MarkdownText !== undefined && typeof value.MarkdownDelegateProvider === 'function'\n}\nexport const DshMarkdownText = primitives.MarkdownText ?? (({ text }: ComponentProps<typeof primitives.MarkdownText>) => createElement('pre', null, text))\nexport const DshMarkdownDelegate = primitives.MarkdownDelegateProvider ?? (({ children }: { children: ReactNode }) => createElement('div', null, children))\n\ntype IconComponent = ComponentType<{ readonly size?: number; readonly className?: string }>\ntype ShortcutKeysComponent = ComponentType<{ readonly keys: readonly string[] }>\ntype PrimitiveExports = typeof primitives & {\n readonly IconPlusOutlineRegular?: IconComponent\n readonly IconPlusOutlineMedium?: IconComponent\n readonly IconChevronDownOutlineRegular?: IconComponent\n readonly IconChevronDownOutlineMedium?: IconComponent\n readonly IconChevronUpOutlineRegular?: IconComponent\n readonly IconChevronUpOutlineMedium?: IconComponent\n readonly IconChevronLeftOutlineRegular?: IconComponent\n readonly IconChevronLeftOutlineMedium?: IconComponent\n readonly IconChevronRightOutlineRegular?: IconComponent\n readonly IconChevronRightOutlineMedium?: IconComponent\n readonly IconRefreshOutlineRegular?: IconComponent\n readonly IconRefreshOutlineMedium?: IconComponent\n readonly IconSlidersTwoOutlineRegular?: IconComponent\n readonly IconSlidersTwoOutlineMedium?: IconComponent\n readonly IconSettingsOutlineRegular?: IconComponent\n readonly IconSettingsOutlineMedium?: IconComponent\n readonly IconPlusOutline16?: IconComponent\n readonly IconChevronDownOutline14?: IconComponent\n readonly IconDataOutlineRegular?: IconComponent\n readonly IconDataOutlineMedium?: IconComponent\n readonly IconDataOutline16?: IconComponent\n readonly IconShareOutlineRegular?: IconComponent\n readonly IconShareOutlineMedium?: IconComponent\n readonly IconSendOutlineRegular?: IconComponent\n readonly IconSendOutlineMedium?: IconComponent\n readonly IconCloseOutlineRegular?: IconComponent\n readonly IconCloseOutlineMedium?: IconComponent\n readonly IconCloseFillRegular?: IconComponent\n readonly IconCloseFillMedium?: IconComponent\n readonly IconChatOutlineRegular?: IconComponent\n readonly IconChatOutlineMedium?: IconComponent\n readonly IconStopFillRegular?: IconComponent\n readonly IconStopFillMedium?: IconComponent\n readonly IconPhoneOutlineRegular?: IconComponent\n readonly IconPhoneOutlineMedium?: IconComponent\n readonly IconWrapFillRegular?: IconComponent\n readonly IconNowrapFillRegular?: IconComponent\n readonly ShortcutKeys?: ShortcutKeysComponent\n}\n\nconst unavailableIcon: IconComponent = () => null\nconst fallbackShortcutKeys: ShortcutKeysComponent = ({ keys }) => createElement('span', undefined, keys.join(' + '))\n\nexport type DshControlIconName = 'add' | 'phone' | 'settings' | 'close' | 'send' | 'stop' | 'chat' | 'clear'\n/** Shared controls prefer Host icons and use matching local chat/phone fallbacks when absent. */\nexport function resolveControlIcon(name: DshControlIconName): IconComponent {\n const value = primitives as PrimitiveExports\n switch (name) {\n case 'add': return resolvePlusIcon()\n case 'clear': return resolveRefreshIcon()\n case 'settings': return value.IconSettingsOutlineRegular ?? value.IconSettingsOutlineMedium ?? resolveToolIcon()\n case 'close': return value.IconCloseOutlineRegular ?? value.IconCloseOutlineMedium ?? unavailableIcon\n case 'chat': return value.IconChatOutlineRegular ?? value.IconChatOutlineMedium ?? ChatBubbleIcon\n case 'send': return value.IconSendOutlineRegular ?? value.IconSendOutlineMedium ?? unavailableIcon\n case 'stop': return value.IconStopFillRegular ?? value.IconStopFillMedium ?? unavailableIcon\n case 'phone': return value.IconPhoneOutlineRegular ?? value.IconPhoneOutlineMedium ?? TelephoneIcon\n }\n}\n/** 沿用 DSH 新对话的气泡轮廓,内部使用三点表示进入已有对话。 */\nfunction ChatBubbleIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M2.37091 11.2501C1.58745 9.89288 1.32067 8.29835 1.61969 6.76006C1.91872 5.22177 2.76342 3.8433 3.99826 2.87846C5.2331 1.91362 6.77494 1.42737 8.33988 1.50925C9.90482 1.59113 11.3875 2.23562 12.5149 3.32406C13.6425 4.41269 14.3387 5.87206 14.4754 7.4334C14.612 8.99474 14.18 10.5529 13.2587 11.8209C12.3375 13.0888 10.9891 13.9813 9.46194 14.3337C8.18691 14.628 6.85895 14.5294 5.64989 14.0605C5.1712 13.8748 4.76962 13.4932 4.26534 13.3967C3.67413 13.2835 2.95257 13.5598 2.03794 14.3337' }),\n ...[5.25, 8, 10.75].map((cx) => createElement('circle', { key: cx, cx, cy: 8, r: 0.65, fill: 'currentColor', stroke: 'none' })))\n}\nfunction TelephoneIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M3.1 1.8h2l1.1 3.1-1.4 1.4a10.5 10.5 0 0 0 4.9 4.9l1.4-1.4 3.1 1.1v2a1.4 1.4 0 0 1-1.6 1.4A13 13 0 0 1 1.7 3.4a1.4 1.4 0 0 1 1.4-1.6Z' }))\n}\n\n/**\n * 图标导出兼容层。0.1.7 可能改名为 Regular/Medium,运行时优先使用新导出,\n * 旧导出仍作为回退;业务组件不再直接判断 DSH 版本。\n */\nexport function resolvePlusIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconPlusOutlineRegular ?? value.IconPlusOutlineMedium ?? value.IconPlusOutline16 ?? unavailableIcon\n}\n\nexport function resolveChevronDownIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? value.IconChevronDownOutline14 ?? unavailableIcon\n}\n\n/** 终端工具栏使用的原生刷新图标。 */\nexport function resolveRefreshIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconRefreshOutlineRegular ?? value.IconRefreshOutlineMedium ?? unavailableIcon\n}\n\n/** Document toolbar glyphs shared with the native text preview. */\nexport function resolveTextWrapIcon(wrapped: boolean): IconComponent {\n const value = primitives as PrimitiveExports\n return (wrapped ? value.IconNowrapFillRegular : value.IconWrapFillRegular) ?? unavailableIcon\n}\n\n/** Native viewer controls; keep optional glyph compatibility at the adapter boundary. */\nexport function resolveViewerIcon(name: 'edit' | 'save' | 'fullscreen' | 'restore' | 'back' | 'home'): IconComponent {\n const icons = primitives as unknown as Record<string, IconComponent | undefined>\n const key = { edit: 'IconEditOutlineRegular', save: 'IconCheckOutlineRegular', fullscreen: 'IconFullscreenOutlineRegular',\n restore: 'IconFullscreenOutlineRegular', back: 'IconChevronLeftOutlineRegular', home: 'IconFileOutlineRegular' }[name]\n return icons[key] ?? resolveRefreshIcon()\n}\n\n/** 终端工具栏入口使用的原生工具图标。 */\nexport function resolveToolIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconSlidersTwoOutlineRegular\n ?? value.IconSlidersTwoOutlineMedium\n ?? value.IconSettingsOutlineRegular\n ?? value.IconSettingsOutlineMedium\n ?? unavailableIcon\n}\n\n/** 终端快捷操作的方向图标。 */\nexport function resolveTerminalArrowIcon(direction: 'up' | 'down' | 'left' | 'right'): IconComponent {\n const value = primitives as PrimitiveExports\n if (direction === 'up') return value.IconChevronUpOutlineRegular ?? value.IconChevronUpOutlineMedium ?? unavailableIcon\n if (direction === 'down') return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? unavailableIcon\n if (direction === 'left') return value.IconChevronLeftOutlineRegular ?? value.IconChevronLeftOutlineMedium ?? unavailableIcon\n return value.IconChevronRightOutlineRegular ?? value.IconChevronRightOutlineMedium ?? unavailableIcon\n}\n\n/** 终端按键标签使用 DSH 原生 ShortcutKeys,旧版本缺失时退回纯文本。 */\nexport function resolveShortcutKeys(): ShortcutKeysComponent {\n const value = primitives as PrimitiveExports\n return value.ShortcutKeys ?? fallbackShortcutKeys\n}\n\n/**\n * 模型图标:DSH 原生模型选择器在紧凑状态显示的 data 图标(0.1.7 起为 Regular/Medium,\n * 0.1.6 为 16 后缀),插件模型选择器收起时与之保持一致。\n */\nexport function resolveDataIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconDataOutlineRegular ?? value.IconDataOutlineMedium ?? value.IconDataOutline16 ?? unavailableIcon\n}\n\n/**\n * `/委派` 菜单行图标:优先使用共享(send/share)字形,缺失时回退到插件通用的\n * data 图标,保证旧版 DSH 仍能渲染出一行可识别的委派入口。\n */\nexport function resolveDelegateIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconShareOutlineRegular\n ?? value.IconShareOutlineMedium\n ?? value.IconSendOutlineRegular\n ?? value.IconSendOutlineMedium\n ?? resolveDataIcon()\n}\n\n/**\n * 模型搜索框的清除按钮图标,与内置模型选择器的搜索清除按钮同一字形;\n * 旧版 DSH 缺少该导出时退化为不回退图标,清除按钮的文字标签仍然可用。\n */\nexport function resolveCloseFillIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconCloseFillRegular ?? value.IconCloseFillMedium ?? unavailableIcon\n}\n\n/**\n * 模型搜索的模糊排序。\n *\n * 内置模型选择器用 primitives 的 `rankByName` 排名搜索结构:查询必须是名称的\n * 大小写不敏感子序列,前缀命中优先,其次按对齐分数。插件模型选择器复用同一\n * 排序,保证同一查询在内置与外部 Agent 两个选择器里得到相同的顺序;旧版 DSH\n * 缺少该导出时退回等价的本地实现,行为不变。\n */\nexport type RankModelByName = <T extends { readonly name: string }>(items: readonly T[], rawQuery: string) => readonly T[]\n\nexport const rankModelByName: RankModelByName = (items, rawQuery) => {\n const exported = (primitives as Partial<typeof primitives>).rankByName\n if (typeof exported === 'function') return exported(items, rawQuery) as readonly (typeof items)[number][]\n return rankByNameFallback(items, rawQuery)\n}\n\n/** 名称起始与 `-`/`_` 分隔处额外加分,与宿主实现保持一致。 */\nfunction boundaryBonus(name: string, index: number): number {\n return index === 0 || name.charAt(index - 1) === '-' || name.charAt(index - 1) === '_' ? 8 : 0\n}\n\n/** 有序子序列的最强对齐分数;查询不是子序列时返回 undefined。 */\nfunction alignmentScore(name: string, query: string): number | undefined {\n if (query.length > name.length) return undefined\n const noMatch = Number.NEGATIVE_INFINITY\n let previous = Array.from({ length: name.length }, () => noMatch).map((_, index) => name.charAt(index) === query.charAt(0) ? 1 + boundaryBonus(name, index) - index : noMatch)\n for (let queryIndex = 1; queryIndex < query.length; queryIndex++) {\n const current = Array.from({ length: name.length }, () => noMatch)\n let left = noMatch\n let leftLeft = noMatch\n let bestGapped = noMatch\n for (const [index, prior] of previous.entries()) {\n if (leftLeft !== noMatch) bestGapped = Math.max(bestGapped, leftLeft + index - 2)\n if (name.charAt(index) === query.charAt(queryIndex)) {\n const bonus = 1 + boundaryBonus(name, index)\n let score = noMatch\n if (left !== noMatch) score = left + bonus + 4\n if (bestGapped !== noMatch) score = Math.max(score, bestGapped + bonus + 1 - index)\n current[index] = score\n }\n leftLeft = left\n left = prior\n }\n previous = current\n }\n let best = noMatch\n for (const score of previous) best = Math.max(best, score)\n return best === noMatch ? undefined : best\n}\n\nfunction rankByNameFallback<T extends { readonly name: string }>(items: readonly T[], rawQuery: string): readonly T[] {\n const query = rawQuery.toLowerCase()\n if (query === '') return items\n const ranked: Array<{ item: T; index: number; prefix: boolean; score: number }> = []\n items.forEach((item, index) => {\n const lower = item.name.toLowerCase()\n const score = alignmentScore(lower, query)\n if (score === undefined) return\n ranked.push({ item, index, prefix: lower.startsWith(query), score })\n })\n ranked.sort((left, right) => Number(right.prefix) - Number(left.prefix) || right.score - left.score || left.index - right.index)\n return ranked.map((match) => match.item)\n}\n","import { createElement, type ReactElement } from 'react'\nimport { providerIconUrl } from './provider-icons.js'\nimport { PROVIDER_ICON_PATH } from '../shared/provider-icon-resources.js'\n\nexport const MAGPIE_MODEL_TAG_ATTRIBUTE = 'data-codingns-magpie-model-tag'\n\n/**\n * Magpie 模型来源标签使用的喜鹊图标。\n *\n * 图标必须走本机 Host 的固定资源路由:此前指向 GitHub 上的 `icon-256.png`,\n * 而在离线、Host 无外网出口,或页面策略只允许 `img-src 'self'` 时该外链会被\n * 浏览器拦截,标签容器虽然渲染出来却不显示任何图像。本地路由随插件一起安装,\n * 无网络依赖,也不会被同源策略挡住。\n */\nexport function magpieModelLogoUrl(): string {\n return providerIconUrl('magpie') ?? `${PROVIDER_ICON_PATH}magpie.png`\n}\n\nconst tagStyle = {\n display: 'inline-flex',\n flex: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '18px',\n maxWidth: '45%',\n gap: '4px',\n height: '18px',\n marginInlineStart: 'auto',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n} as const\n\nconst tagLogoStyle = {\n display: 'block',\n width: '16px',\n height: '16px',\n flex: '0 0 16px',\n objectFit: 'contain',\n borderRadius: '4px',\n} as const\n\nconst providerStyle = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: '12px',\n color: 'var(--dsw-alias-label-secondary)',\n} as const\n\n/** Compact visual source marker shared by every model-list surface. */\nexport function MagpieModelTag(props: { readonly providerId?: string | undefined }): ReactElement {\n return createElement('span', {\n [MAGPIE_MODEL_TAG_ATTRIBUTE]: '',\n role: 'note',\n 'aria-label': props.providerId ?? 'Provided by Magpie',\n title: props.providerId ?? 'Provided by Magpie',\n style: tagStyle,\n }, props.providerId === undefined ? null : createElement('span', { style: providerStyle }, props.providerId),\n createElement('img', { src: magpieModelLogoUrl(), alt: 'Provided by Magpie', style: tagLogoStyle }))\n}\n\n/** Native DSH owns its menu DOM, so its option rows receive the same badge imperatively. */\nexport function createMagpieModelTagNode(document: Document, modelId?: string, providerId?: string): HTMLSpanElement {\n const tag = document.createElement('span')\n tag.setAttribute(MAGPIE_MODEL_TAG_ATTRIBUTE, '')\n if (modelId !== undefined) tag.dataset.modelId = modelId\n if (providerId !== undefined) tag.dataset.providerId = providerId\n tag.setAttribute('role', 'note')\n tag.setAttribute('aria-label', providerId ?? 'Provided by Magpie')\n tag.title = providerId ?? 'Provided by Magpie'\n Object.assign(tag.style, tagStyle)\n\n if (providerId !== undefined) {\n const provider = document.createElement('span')\n provider.textContent = providerId\n Object.assign(provider.style, providerStyle)\n tag.append(provider)\n }\n const logo = document.createElement('img')\n logo.setAttribute('src', magpieModelLogoUrl())\n logo.setAttribute('alt', 'Provided by Magpie')\n Object.assign(logo.style, tagLogoStyle)\n tag.append(logo)\n return tag\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.magpie-model-tag.js","names":["en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","zh","en","en","zh","en","zh","en","zh","en","zh","en","zh","gitDictionary.en","debugDictionary.en","peerHostDictionary.en","peerHostWorkspaceDictionary.en","usageDictionary.en","fileWorkspaceDictionary.en","terminalAuthDictionary.en","panelsDictionary.en","subagentCollapsedDictionary.en","quickAppsDictionary.en","cliManagementDictionary.en","magpieDictionary.en","pluginUpdateDictionary.en","credentialsDictionary.en","gitDictionary.zh","debugDictionary.zh","peerHostDictionary.zh","peerHostWorkspaceDictionary.zh","usageDictionary.zh","fileWorkspaceDictionary.zh","terminalAuthDictionary.zh","panelsDictionary.zh","subagentCollapsedDictionary.zh","quickAppsDictionary.zh","cliManagementDictionary.zh","magpieDictionary.zh","pluginUpdateDictionary.zh","credentialsDictionary.zh","useMemo","primitives","createElement","icons","value","createElement"],"sources":["../../../../src/shared/provider-icon-resources.ts","../../../../src/client/locales/debug.ts","../../../../src/client/locales/fileWorkspace.ts","../../../../src/client/locales/git.ts","../../../../src/client/locales/panels.ts","../../../../src/client/locales/peerHost.ts","../../../../src/client/locales/peerHostWorkspace.ts","../../../../src/client/locales/terminalAuth.ts","../../../../src/client/locales/usage.ts","../../../../src/client/locales/subagentCollapsed.ts","../../../../src/shared/quick-apps-bootstrap-locale.ts","../../../../src/client/locales/quickApps.ts","../../../../src/client/locales/cliManagement.ts","../../../../src/client/locales/magpie.ts","../../../../src/client/locales/pluginUpdate.ts","../../../../src/client/locales/credentials.ts","../../../../src/client/locale.ts","../../../../src/shared/cli-provider-route.ts","../../../../src/client/provider-icons.ts","../../../../src/shared/debug.ts","../../../../src/shared/contracts/transport.ts","../../../../src/shared/contracts/peer-host.ts","../../../../src/client/cli-catalog.ts","../../../../src/client/adapter-catalog-watch.ts","../../../../src/client/model-catalog-cache.ts","../../../../src/dsh-capabilities/client/primitives-adapter.ts","../../../../src/client/magpie-model-tag.ts"],"sourcesContent":["/** Client 与 Host 共用固定资源目录;避开 Desktop 将 /assets 固定映射到应用安装目录的路径。 */\nexport const PROVIDER_ICON_PATH = '/api/codingns/provider-icons/'\n\nexport const PROVIDER_ICON_FILES: Readonly<Record<string, string>> = {\n magpie: 'magpie.png',\n dsh: 'deepseek-harness.svg',\n 'command-code': 'command-code.svg',\n 'claude-code': 'claude-code.png',\n kimi: 'kimi.png',\n gemini: 'gemini.png',\n pi: 'pi.svg',\n codex: 'codex.png',\n opencode: 'opencode.png',\n grok: 'grok.png',\n mcode: 'minimax-code.svg',\n zcode: 'zcode.svg',\n r4: 'r4.svg',\n codebuddy: 'codebuddy.svg',\n workbuddy: 'workbuddy.svg',\n 'cursor-cli': 'cursor-cli.svg',\n 'kiro-cli': 'kiro-cli.svg',\n qoder: 'qoder.svg',\n 'qoder-cn': 'qoder-cn.svg',\n antigravity: 'antigravity.svg',\n doubao: 'doubao.png',\n}\n","/**\n * debug 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'debug.title': 'Debug',\n 'debug.guideDescription': 'Start workspace commands, check ports, and open services',\n 'debug.readingWorkspace': 'Reading workspace…',\n 'debug.eyebrow': 'Workspace tools',\n 'debug.heading': 'Workspace debugging',\n 'debug.profileCount': '{count} configurations',\n 'debug.addProfileAria': 'Add launch configuration',\n 'debug.addProfile': 'Add configuration',\n 'debug.emptyTitle': 'No launch configurations yet',\n 'debug.emptyText': 'Add a command for the current workspace to start a terminal, check its port, and open the service from here.',\n 'debug.addFirstProfile': 'Add the first configuration',\n 'debug.runningCount': '{count} running',\n 'debug.notRunning': 'Not running',\n 'debug.metaCwd': 'Directory',\n 'debug.metaPort': 'Port',\n 'debug.metaRuntime': 'Runtime',\n 'debug.proxyEnabled': 'Proxy enabled',\n 'debug.portUnknown': 'Port status not checked yet',\n 'debug.portListening': 'Port {port} is listening',\n 'debug.portListeningPid': 'Port {port} is listening · PID {pid}',\n 'debug.portStopped': 'Port {port} is not listening',\n 'debug.launch': 'Start',\n 'debug.checkPort': 'Check port',\n 'debug.killPortHint': 'Kill only the port listener and keep the terminal window',\n 'debug.killProcess': 'Kill process',\n 'debug.stopHint': 'Stop and close the terminal window',\n 'debug.stop': 'Stop',\n 'debug.edit': 'Edit',\n 'debug.delete': 'Delete',\n 'debug.enableProxy': 'Enable proxy',\n 'debug.openProxy': 'Open proxy',\n 'debug.proxyTurnOff': 'Turn off',\n 'debug.formAddTitle': 'Add quick launch item',\n 'debug.formEditTitle': 'Edit quick launch item',\n 'debug.formHint': 'Save a reusable set of launch arguments, then open the terminal with one click.',\n 'debug.closeFormAria': 'Close the quick launch form',\n 'debug.sectionLaunch': 'Launch entry',\n 'debug.sectionLaunchHint': 'Enter the full command, for example pnpm run dev --host 0.0.0.0.',\n 'debug.fieldName': 'Name',\n 'debug.fieldNamePlaceholder': 'For example: frontend development',\n 'debug.fieldCwd': 'Launch directory (path relative to the workspace)',\n 'debug.fieldCwdPlaceholder': 'Leave empty to use the root directory',\n 'debug.fieldCommand': 'Full launch command',\n 'debug.fieldCommandPlaceholder': 'For example: pnpm run dev --host 0.0.0.0',\n 'debug.sectionRuntime': 'Runtime environment (optional)',\n 'debug.sectionRuntimeHint': 'Only shells actually detected by the Host are shown.',\n 'debug.fieldShell': 'Terminal shell',\n 'debug.runtimeHint': 'The runtime is chosen automatically by the Host platform (effective capability: {runtime}).',\n 'debug.sectionPort': 'Service check',\n 'debug.sectionPortHint': 'The port is checked automatically every 5 seconds, or refresh it manually.',\n 'debug.fieldPort': 'Listening port (optional)',\n 'debug.fieldProxy': 'Reverse proxy',\n 'debug.proxyToggleLabel': 'Allow access to confirmed services',\n 'debug.proxyToggleAria': 'Enable service proxy',\n 'debug.close': 'Close',\n 'debug.saveAriaCreate': 'Save the configuration and create the quick launch item',\n 'debug.saveAriaUpdate': 'Save the quick launch item changes',\n 'debug.saving': 'Saving…',\n 'debug.saveAsQuickLaunch': 'Save as quick launch',\n 'debug.saveChanges': 'Save changes',\n 'debug.saved': 'Launch configuration saved',\n 'debug.updated': 'Launch configuration updated',\n 'debug.confirmDelete': 'Delete the launch configuration “{name}”?',\n 'debug.deleted': 'Launch configuration deleted',\n 'debug.confirmKillPort': 'Kill the process listening on port {port}?',\n 'debug.portKilled': 'The listening process was terminated',\n 'debug.proxyEnabledMessage': 'Proxy enabled: {url}',\n 'debug.shellSystemDefault': 'System default',\n 'debug.shellSystemDefaultAuto': 'System default (auto-select)',\n 'debug.runtimeMacosTmux': 'macOS with tmux',\n 'debug.runtimeLinuxTmux': 'Linux with tmux',\n 'debug.runtimeWindowsConpty': 'Windows with ConPTY',\n 'debug.runtimeLocalPty': 'local-pty (in-process PTY)',\n 'debug.runtimeWaiting': 'Waiting for Host terminal status',\n 'feature.debug.label': 'Workspace debugging',\n 'feature.debug.description': 'Launch terminals and check services',\n}\n\nexport const zh: Record<string, string> = {\n 'debug.title': '调试',\n 'debug.guideDescription': '启动工作区命令、检查端口并访问服务',\n 'debug.readingWorkspace': '正在读取工作区…',\n 'debug.eyebrow': '工作区工具',\n 'debug.heading': '工作区调试',\n 'debug.profileCount': '{count} 个配置',\n 'debug.addProfileAria': '添加启动配置',\n 'debug.addProfile': '添加配置',\n 'debug.emptyTitle': '还没有启动配置',\n 'debug.emptyText': '为当前 Workspace 添加一个命令,即可从这里启动终端、检查端口和访问服务。',\n 'debug.addFirstProfile': '添加第一个配置',\n 'debug.runningCount': '{count} 个运行中',\n 'debug.notRunning': '未运行',\n 'debug.metaCwd': '目录',\n 'debug.metaPort': '端口',\n 'debug.metaRuntime': '运行方式',\n 'debug.proxyEnabled': '代理已启用',\n 'debug.portUnknown': '端口状态尚未检查',\n 'debug.portListening': '端口 {port} 正在监听',\n 'debug.portListeningPid': '端口 {port} 正在监听 · PID {pid}',\n 'debug.portStopped': '端口 {port} 未监听',\n 'debug.launch': '启动',\n 'debug.checkPort': '检查端口',\n 'debug.killPortHint': '只结束端口监听进程,保留终端窗口',\n 'debug.killProcess': '结束进程',\n 'debug.stopHint': '停止并关闭终端窗口',\n 'debug.stop': '停止',\n 'debug.edit': '编辑',\n 'debug.delete': '删除',\n 'debug.enableProxy': '开启代理',\n 'debug.openProxy': '打开代理',\n 'debug.proxyTurnOff': '关闭',\n 'debug.formAddTitle': '添加快捷启动项',\n 'debug.formEditTitle': '编辑快捷启动项',\n 'debug.formHint': '保存一组可重复使用的启动参数,之后可以一键打开终端。',\n 'debug.closeFormAria': '关闭快捷启动项',\n 'debug.sectionLaunch': '启动入口',\n 'debug.sectionLaunchHint': '直接输入完整命令,例如 pnpm run dev --host 0.0.0.0。',\n 'debug.fieldName': '名称',\n 'debug.fieldNamePlaceholder': '例如:前端开发',\n 'debug.fieldCwd': '启动目录(Workspace 内相对路径)',\n 'debug.fieldCwdPlaceholder': '留空使用根目录',\n 'debug.fieldCommand': '完整启动命令',\n 'debug.fieldCommandPlaceholder': '例如:pnpm run dev --host 0.0.0.0',\n 'debug.sectionRuntime': '执行环境(可选)',\n 'debug.sectionRuntimeHint': '只显示 Host 实际检测到的 Shell。',\n 'debug.fieldShell': '终端 Shell',\n 'debug.runtimeHint': '运行方式由 Host 平台自动选择(实际能力:{runtime})。',\n 'debug.sectionPort': '服务检查',\n 'debug.sectionPortHint': '端口每 5 秒自动检查,也可手动刷新。',\n 'debug.fieldPort': '监听端口(可选)',\n 'debug.fieldProxy': '反向代理',\n 'debug.proxyToggleLabel': '允许访问已确认的服务',\n 'debug.proxyToggleAria': '启用服务代理',\n 'debug.close': '关闭',\n 'debug.saveAriaCreate': '保存配置并创建快捷启动项',\n 'debug.saveAriaUpdate': '保存快捷启动项修改',\n 'debug.saving': '保存中…',\n 'debug.saveAsQuickLaunch': '保存为快捷启动',\n 'debug.saveChanges': '保存修改',\n 'debug.saved': '启动配置已保存',\n 'debug.updated': '启动配置已更新',\n 'debug.confirmDelete': '确认删除“{name}”启动配置?',\n 'debug.deleted': '启动配置已删除',\n 'debug.confirmKillPort': '确认结束端口 {port} 的监听进程?',\n 'debug.portKilled': '监听进程已结束',\n 'debug.proxyEnabledMessage': '代理已开启:{url}',\n 'debug.shellSystemDefault': '系统默认',\n 'debug.shellSystemDefaultAuto': '系统默认(自动选择)',\n 'debug.runtimeMacosTmux': 'macOS 使用 tmux',\n 'debug.runtimeLinuxTmux': 'Linux 使用 tmux',\n 'debug.runtimeWindowsConpty': 'Windows 使用 ConPTY',\n 'debug.runtimeLocalPty': '使用 local-pty(进程内 PTY)',\n 'debug.runtimeWaiting': '等待 Host 终端能力状态',\n 'feature.debug.label': '工作区调试',\n 'feature.debug.description': '启动终端并检查服务',\n}\n","/**\n * fileWorkspace 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'htmlFiles.confirmConnect': 'Allow this HTML page to read, save, and delete files in these locations?\\n\\nPage: {path}\\n\\n{scopes}\\n\\nAccess lasts until this preview is closed or reloaded.',\n 'htmlFiles.cancelled': 'Workspace file connection cancelled.',\n 'fileMenu.expandFolder': 'Expand folder',\n 'fileMenu.openFile': 'Open file',\n 'fileMenu.download': 'Download file',\n 'fileMenu.newFile': 'New file',\n 'fileMenu.newDirectory': 'New folder',\n 'fileMenu.rename': 'Rename / move',\n 'fileMenu.copy': 'Copy',\n 'fileMenu.cut': 'Cut',\n 'fileMenu.paste': 'Paste',\n 'fileMenu.copyRelativePath': 'Copy relative path',\n 'fileMenu.copyAbsolutePath': 'Copy absolute path',\n 'fileMenu.gitIgnore': 'Add to Git exclude',\n 'fileMenu.delete': 'Delete',\n 'fileMenu.promptNewDirectory': 'Enter a new folder name or relative path',\n 'fileMenu.promptNewFile': 'Enter a new file name or relative path',\n 'fileMenu.promptRename': 'Enter a new file name or relative path',\n 'fileMenu.confirmDelete': 'Delete \"{name}\"?',\n 'fileMenu.copiedRelativePath': 'Relative path copied',\n 'fileMenu.copiedAbsolutePath': 'Absolute path copied',\n 'fileMenu.copyPathFailed': 'Unable to copy the path',\n 'fileMenu.operationDone': 'File operation completed',\n 'fileMenu.unresolvedPath': 'Unable to resolve the current file path',\n 'fileEditor.edit': 'Edit file',\n 'fileEditor.editorLabel': 'File content editor',\n 'fileEditor.save': 'Save file',\n 'fileEditor.cancel': 'Cancel editing',\n 'fileEditor.saved': 'File saved',\n 'sessionFiles.title': 'Changed files',\n 'sessionFiles.count': '{count} files',\n 'sessionFiles.refresh': 'Refresh',\n 'sessionFiles.close': 'Close diff',\n 'sessionFiles.loadingDiff': 'Reading diff…',\n 'sessionFiles.stageAll': 'Stage all',\n 'sessionFiles.loading': 'Reading session changes…',\n 'sessionFiles.empty': 'No changed files were detected in this session',\n 'sessionFiles.selectFile': 'Select a file to view its diff',\n 'sessionFiles.noDiff': 'No diff available for this file',\n 'sessionFiles.tabLabel': 'Changed files {count}',\n 'sessionFiles.stageDirectory': 'Stage folder',\n 'sessionFiles.unstage': 'Unstage',\n 'sessionFiles.stage': 'Add to staged changes',\n 'sessionFiles.discard': 'Discard changes',\n 'archive.title': 'Archived sessions',\n 'archive.entryCount': 'Archived sessions {count}',\n 'archive.close': 'Close',\n 'archive.searchPlaceholder': 'Search archived sessions',\n 'archive.empty': 'No archived sessions found.',\n 'archive.createdAt': 'Created: {time}',\n 'archive.archivedAt': 'Archived: {time}',\n 'archive.restore': 'Unarchive',\n 'archive.restoreUnsupportedTitle': 'This DSH version does not support unarchiving',\n 'archive.restoreUnsupported': 'Unarchive (not supported in this version)',\n 'archive.processing': 'Processing…',\n 'workspaceVisibility.hide': 'Hide workspace',\n 'workspaceVisibility.showHidden': 'Show hidden workspaces',\n 'workspaceVisibility.hiddenCount': 'Hidden workspaces {count}',\n 'workspaceVisibility.restore': 'Restore workspace {title}',\n 'mobileRail.openSidebar': 'Open sidebar',\n 'provider.unbound': 'No Agent bound',\n 'provider.doubao': 'Doubao App',\n 'provider.unknown': 'Unknown Agent ({adapterId})',\n 'toolStream.statusFailed': 'Failed',\n 'toolStream.statusCompleted': 'Completed',\n 'toolStream.statusRunning': 'Running',\n 'toolStream.missingMarker': 'External tool node is missing its start marker',\n 'pwaPrompt.install': 'Install to home screen',\n 'pwaPrompt.hint': 'After installing, open it straight from the home screen for a standalone window and more screen space.',\n 'pwaPrompt.dismiss': 'Not now',\n 'pwaPrompt.iosHint': 'Tap \"Share\" then \"Add to Home Screen\" to install.',\n}\n\nexport const zh: Record<string, string> = {\n 'htmlFiles.confirmConnect': '允许此 HTML 页面读取、保存和删除以下位置中的文件吗?\\n\\n页面:{path}\\n\\n{scopes}\\n\\n授权在关闭或重新加载预览后失效。',\n 'htmlFiles.cancelled': '已取消工作区文件连接。',\n 'fileMenu.expandFolder': '展开文件夹',\n 'fileMenu.openFile': '打开文件',\n 'fileMenu.download': '下载文件',\n 'fileMenu.newFile': '新建文件',\n 'fileMenu.newDirectory': '新建目录',\n 'fileMenu.rename': '重命名/移动',\n 'fileMenu.copy': '复制',\n 'fileMenu.cut': '剪切',\n 'fileMenu.paste': '粘贴',\n 'fileMenu.copyRelativePath': '复制相对路径',\n 'fileMenu.copyAbsolutePath': '复制绝对路径',\n 'fileMenu.gitIgnore': '添加到 Git 排除',\n 'fileMenu.delete': '删除',\n 'fileMenu.promptNewDirectory': '输入新目录名称或相对路径',\n 'fileMenu.promptNewFile': '输入新文件名称或相对路径',\n 'fileMenu.promptRename': '输入新的文件名或相对路径',\n 'fileMenu.confirmDelete': '确定删除“{name}”吗?',\n 'fileMenu.copiedRelativePath': '已复制相对路径',\n 'fileMenu.copiedAbsolutePath': '已复制绝对路径',\n 'fileMenu.copyPathFailed': '复制路径失败',\n 'fileMenu.operationDone': '文件操作已完成',\n 'fileMenu.unresolvedPath': '无法解析当前文件路径',\n 'fileEditor.edit': '编辑文件',\n 'fileEditor.editorLabel': '文件内容编辑器',\n 'fileEditor.save': '保存文件',\n 'fileEditor.cancel': '取消编辑',\n 'fileEditor.saved': '文件已保存',\n 'sessionFiles.title': '修改文件',\n 'sessionFiles.count': '{count} 个文件',\n 'sessionFiles.refresh': '刷新',\n 'sessionFiles.close': '关闭 Diff',\n 'sessionFiles.loadingDiff': '正在读取 Diff…',\n 'sessionFiles.stageAll': '全部暂存',\n 'sessionFiles.loading': '正在读取会话修改…',\n 'sessionFiles.empty': '本次会话没有已识别的修改文件',\n 'sessionFiles.selectFile': '选择文件查看 Diff',\n 'sessionFiles.noDiff': '当前文件没有可显示的 Diff',\n 'sessionFiles.tabLabel': '修改文件 {count}',\n 'sessionFiles.stageDirectory': '暂存目录',\n 'sessionFiles.unstage': '撤销暂存',\n 'sessionFiles.stage': '添加到暂存区',\n 'sessionFiles.discard': '撤销变更',\n 'archive.title': '已归档的会话',\n 'archive.entryCount': '已归档的会话 {count}',\n 'archive.close': '关闭',\n 'archive.searchPlaceholder': '搜索已归档会话',\n 'archive.empty': '没有找到归档会话。',\n 'archive.createdAt': '创建时间:{time}',\n 'archive.archivedAt': '归档时间:{time}',\n 'archive.restore': '取消归档',\n 'archive.restoreUnsupportedTitle': '当前 DSH 版本不支持取消归档',\n 'archive.restoreUnsupported': '取消归档(当前版本不支持)',\n 'archive.processing': '处理中…',\n 'workspaceVisibility.hide': '隐藏工作区',\n 'workspaceVisibility.showHidden': '显示隐藏的工作区',\n 'workspaceVisibility.hiddenCount': '隐藏的工作区 {count}',\n 'workspaceVisibility.restore': '恢复工作区 {title}',\n 'mobileRail.openSidebar': '打开侧边栏',\n 'provider.unbound': '未绑定 Agent',\n 'provider.doubao': '豆包 App',\n 'provider.unknown': '未知 Agent({adapterId})',\n 'toolStream.statusFailed': '失败',\n 'toolStream.statusCompleted': '已完成',\n 'toolStream.statusRunning': '运行中',\n 'toolStream.missingMarker': '外部工具节点缺少起始标记',\n 'pwaPrompt.install': '安装到主屏幕',\n 'pwaPrompt.hint': '安装后可从主屏幕直接打开,获得独立窗口与更完整的屏幕空间。',\n 'pwaPrompt.dismiss': '以后再说',\n 'pwaPrompt.iosHint': '点击「分享」→「添加到主屏幕」即可安装。',\n}\n","/**\n * git 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'feature.gitManagement.label': 'Git repository management',\n 'feature.gitManagement.description': 'View changes and manage commits',\n 'git.tabTitle': 'Git',\n 'git.guideDescription': 'View changes, commits, and version history',\n 'git.panelLabel': 'Git repository management',\n 'git.opFetch': 'Fetch',\n 'git.opPull': 'Pull',\n 'git.opPush': 'Push',\n 'git.opUndo': 'Undo commit',\n 'git.refresh': 'Refresh',\n 'git.operationRunning': '{operation} in progress…',\n 'git.operationInProgress': '{operation} in progress…',\n 'git.operationDone': '{operation} completed',\n 'git.operationCompleted': 'Operation completed',\n 'git.noWorkspace': 'No workspace is currently available',\n 'git.commitMessageRequired': 'Enter a commit message',\n 'git.commitHashCopied': 'Git version hash copied',\n 'git.commitMessageCopied': 'Commit message copied',\n 'git.copyUnsupported': 'Copying is not supported in this environment',\n 'git.readingCommitDiff': 'Reading commit diff…',\n 'git.readingFileDiff': 'Reading file diff…',\n 'git.viewSwitcherLabel': 'Switch between files and version views',\n 'git.switchToFiles': 'Files',\n 'git.switchToHistory': 'Versions',\n 'git.readingStatus': 'Reading Git status…',\n 'git.noRepository': 'This directory is not a Git repository yet',\n 'git.initHint': 'Initialize it to view changes, commits, and version history.',\n 'git.init': 'Initialize Git',\n 'git.summary': '{staged} staged · {unstaged} unstaged · {total} commits ({scope})',\n 'git.commitChanges': 'Commit changes',\n 'git.stagingEmpty': 'Staging area is empty',\n 'git.stagedCount': '{count} staged',\n 'git.commitPlaceholder': 'Type a commit message here',\n 'git.generatingMessage': 'Generating commit message…',\n 'git.generationEnabled': 'Generate commit messages',\n 'git.generationEnabledHelp': 'Show the Generate button in the Git panel to draft a message from staged changes.',\n 'git.messageDetail': 'Commit message level',\n 'git.messageConcise': 'Concise — subject only',\n 'git.messageDetailed': 'Detailed — subject and change summary',\n 'git.messageModels': 'Commit message models',\n 'git.messageModelsPicker': 'Add commit message models',\n 'git.messageModelsHelp': 'Drag to set priority; models are tried in order. An empty pool follows the default DSH model. If generation fails, your existing draft is kept.',\n 'git.settingsSaved': 'Git settings saved',\n 'git.messagePrompt': 'Git commit rule prompt',\n 'git.messagePromptHelp': 'Custom rules for commit-message language, style, and conventions. Leave blank to use defaults; the selected detail level still applies.',\n 'git.messagePromptPlaceholder': 'For example: Use Conventional Commits, include a scope, and write in English.',\n 'git.messagePromptSave': 'Save commit rules',\n 'git.messagePromptSaving': 'Saving commit rules…',\n 'git.draftMessage': 'Generate commit message',\n 'git.commit': 'Commit',\n 'git.stagedFiles': 'Staged files',\n 'git.unstagedFiles': 'Unstaged files',\n 'git.unstageDirectory': 'Unstage directory',\n 'git.stageDirectory': 'Add directory to staging',\n 'git.discardDirectory': 'Discard directory changes',\n 'git.unstageFile': 'Unstage',\n 'git.stageFile': 'Add to staging',\n 'git.discardFile': 'Discard changes',\n 'git.unstageAll': 'Unstage all',\n 'git.addAllToStaging': 'Add all to staging',\n 'git.stageAll': 'Stage all',\n 'git.discardAllChanges': 'Discard all changes',\n 'git.pullRunning': '⟳ Pull in progress…',\n 'git.pushRunning': '⟳ Push in progress…',\n 'git.viewAllVersions': 'View all versions',\n 'git.loadMoreVersions': 'Show more versions (100 each)',\n 'git.undoLastCommit': 'Undo last commit',\n 'git.operationsMenu': 'Git operations menu',\n 'git.commitDiff': 'Commit Diff',\n 'git.commitDiffTitle': 'Commit Diff · {hash}',\n 'git.closeDiff': 'Close Diff',\n 'git.changedFiles': 'Changed files',\n 'git.noFileChanges': 'No file changes detected.',\n 'git.originalPath': 'Original path: {path}',\n 'git.binary': 'Binary',\n 'git.truncated': 'Content truncated',\n 'git.noTextDiff': 'No text diff to display.',\n 'git.fileDiff': 'File Diff',\n 'git.fileDiffTitle': 'File Diff · {path}',\n 'git.staged': 'Staged',\n 'git.unstaged': 'Unstaged',\n 'git.stagedDiffHead': 'Staged diff (against HEAD)',\n 'git.worktreeDiff': 'Working tree diff',\n 'git.binaryFile': 'Binary file',\n 'git.statusAdded': 'Added',\n 'git.statusDeleted': 'Deleted',\n 'git.statusRenamed': 'Renamed',\n 'git.statusCopied': 'Copied',\n 'git.statusModified': 'Modified',\n 'git.graphLegend': 'Commit graph: solid colored lines are lanes (branch topology); blue dashed lines are commits not yet pushed to a remote. Hover a node to see the origin and branches of that commit.',\n 'git.versionCount': 'Git versions ({count})',\n 'git.scopeHint': 'Version scope: list only the current branch, or list all local and remote-tracking branches',\n 'git.scopeLabel': 'Version scope',\n 'git.currentBranch': 'Current branch',\n 'git.allBranches': 'All branches',\n 'git.switchBranch': 'Switch branch',\n 'git.noCommits': 'No commits yet',\n 'git.loading': 'Loading…',\n 'git.authorSuffix': '{date} · Author {author}',\n 'git.versionMenu': 'Version actions menu',\n 'git.viewChangesAndDiff': 'View changed files and diff',\n 'git.copyCommitHash': 'Copy Commit Hash',\n 'git.copyCommitMessage': 'Copy commit message',\n 'git.copyVersionHash': 'Copy Git version hash',\n 'git.remoteBranch': 'Remote branch',\n 'git.tag': 'Tag',\n 'git.localBranch': 'Local branch',\n 'git.refTitle': '{kind}: {name}',\n 'git.originLocalWithRemote': 'Local commit: only on a local branch and not yet pushed to a remote (blue dashed line)',\n 'git.originLocalOnly': 'Local commit: only on a local branch (this repository has no remote, blue dashed line)',\n 'git.originSynced': 'Synced: both the current branch and the remote-tracking branch contain this commit (solid colored line)',\n 'git.originRemote': 'Remote commit: only the remote-tracking branch contains it, not local yet (try Fetch/Pull first)',\n 'git.originOtherBranch': 'Other branch: only another local branch contains it; neither the current branch nor the remote has it (blue dashed line)',\n 'git.originUnknown': 'Origin unknown: the Host did not return the commit origin (colored by lane)',\n 'git.branchesAndTags': 'Branches and tags: {refs}',\n 'git.refSeparator': '; ',\n 'git.author': 'Author: {name}',\n 'git.unknownDate': 'Unknown date',\n 'git.unknownTime': 'Unknown time',\n 'git.dateLabel': '{month}/{day}',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.gitManagement.label': 'Git 仓库管理',\n 'feature.gitManagement.description': '查看改动并管理提交',\n 'git.tabTitle': 'Git',\n 'git.guideDescription': '查看改动、提交和版本历史',\n 'git.panelLabel': 'Git 仓库管理',\n 'git.opFetch': 'Fetch',\n 'git.opPull': 'Pull',\n 'git.opPush': 'Push',\n 'git.opUndo': '撤销提交',\n 'git.refresh': '刷新',\n 'git.operationRunning': '正在{operation}…',\n 'git.operationInProgress': '{operation}进行中…',\n 'git.operationDone': '{operation}已完成',\n 'git.operationCompleted': '操作已完成',\n 'git.noWorkspace': '当前没有可用的工作区',\n 'git.commitMessageRequired': '请输入提交说明',\n 'git.commitHashCopied': 'Git 版本号已复制',\n 'git.commitMessageCopied': '提交信息已复制',\n 'git.copyUnsupported': '当前环境不支持复制',\n 'git.readingCommitDiff': '正在读取提交 Diff…',\n 'git.readingFileDiff': '正在读取文件 Diff…',\n 'git.viewSwitcherLabel': '切换文件与版本视图',\n 'git.switchToFiles': '切换文件',\n 'git.switchToHistory': '切换版本',\n 'git.readingStatus': '正在读取 Git 状态…',\n 'git.noRepository': '当前目录还没有 Git 仓库',\n 'git.initHint': '初始化后即可查看改动、提交和版本历史。',\n 'git.init': '初始化 Git',\n 'git.summary': '{staged} 个已暂存 · {unstaged} 个未暂存 · {total} 条提交({scope})',\n 'git.commitChanges': '提交更改',\n 'git.stagingEmpty': '暂存区为空',\n 'git.stagedCount': '{count} 个已暂存',\n 'git.commitPlaceholder': '在这里输入提交信息',\n 'git.generatingMessage': '正在生成提交信息…',\n 'git.generationEnabled': '生成 Git 提交信息',\n 'git.generationEnabledHelp': '在 Git 面板显示生成按钮,根据已暂存的改动起草提交信息。',\n 'git.messageDetail': '提交信息级别',\n 'git.messageConcise': '简洁 — 仅标题',\n 'git.messageDetailed': '详细 — 标题与变更摘要',\n 'git.messageModels': '提交信息模型',\n 'git.messageModelsPicker': '添加提交信息模型',\n 'git.messageModelsHelp': '拖拽调整优先级,按顺序尝试模型;模型池为空时跟随 DSH 默认模型。生成失败时保留已有草稿。',\n 'git.settingsSaved': 'Git 设置已保存',\n 'git.messagePrompt': 'Git 提交规则提示词',\n 'git.messagePromptHelp': '自定义提交信息的语言、风格和格式规范。留空时使用默认规则;简洁或详细级别仍然生效。',\n 'git.messagePromptPlaceholder': '例如:使用 Conventional Commits 格式,包含 scope,并使用英文编写。',\n 'git.messagePromptSave': '保存提交规则',\n 'git.messagePromptSaving': '正在保存提交规则…',\n 'git.draftMessage': '生成提交信息',\n 'git.commit': '提交',\n 'git.stagedFiles': '暂存文件',\n 'git.unstagedFiles': '未提交文件',\n 'git.unstageDirectory': '撤销目录暂存',\n 'git.stageDirectory': '将目录添加到暂存区',\n 'git.discardDirectory': '撤销目录变更',\n 'git.unstageFile': '撤销暂存',\n 'git.stageFile': '添加到暂存区',\n 'git.discardFile': '撤销变更',\n 'git.unstageAll': '取消全部暂存',\n 'git.addAllToStaging': '全部添加到暂存区',\n 'git.stageAll': '暂存全部',\n 'git.discardAllChanges': '放弃全部改动',\n 'git.pullRunning': '⟳ Pull 进行中…',\n 'git.pushRunning': '⟳ Push 进行中…',\n 'git.viewAllVersions': '查看所有版本',\n 'git.loadMoreVersions': '查看更多版本(每次 100 条)',\n 'git.undoLastCommit': '撤销上次提交',\n 'git.operationsMenu': 'Git 操作菜单',\n 'git.commitDiff': '提交 Diff',\n 'git.commitDiffTitle': '提交 Diff · {hash}',\n 'git.closeDiff': '关闭 Diff',\n 'git.changedFiles': '变更文件',\n 'git.noFileChanges': '没有检测到文件变更。',\n 'git.originalPath': '原路径:{path}',\n 'git.binary': '二进制',\n 'git.truncated': '内容已截断',\n 'git.noTextDiff': '当前没有可显示的文本差异。',\n 'git.fileDiff': '文件 Diff',\n 'git.fileDiffTitle': '文件 Diff · {path}',\n 'git.staged': '已暂存',\n 'git.unstaged': '未暂存',\n 'git.stagedDiffHead': '暂存区 Diff(相对 HEAD)',\n 'git.worktreeDiff': '工作区 Diff',\n 'git.binaryFile': '二进制文件',\n 'git.statusAdded': '新增',\n 'git.statusDeleted': '删除',\n 'git.statusRenamed': '重命名',\n 'git.statusCopied': '复制',\n 'git.statusModified': '修改',\n 'git.graphLegend': '提交图:彩色实线=泳道(分支拓扑),蓝色虚线=尚未推送到远程的提交;鼠标悬浮节点可看该提交的归属与分支',\n 'git.versionCount': 'Git 版本 ({count})',\n 'git.scopeHint': '版本范围:只列当前分支,或列出全部本地分支与远程跟踪分支',\n 'git.scopeLabel': '版本范围',\n 'git.currentBranch': '当前分支',\n 'git.allBranches': '全部分支',\n 'git.switchBranch': '切换分支',\n 'git.noCommits': '暂无提交',\n 'git.loading': '正在加载…',\n 'git.authorSuffix': '{date} · 作者 {author}',\n 'git.versionMenu': '版本操作菜单',\n 'git.viewChangesAndDiff': '查看更改文件与 Diff',\n 'git.copyCommitHash': '复制 Commit Hash',\n 'git.copyCommitMessage': '复制提交信息',\n 'git.copyVersionHash': '复制 Git 版本号',\n 'git.remoteBranch': '远程分支',\n 'git.tag': '标签',\n 'git.localBranch': '本地分支',\n 'git.refTitle': '{kind}:{name}',\n 'git.originLocalWithRemote': '本地提交:只在本地分支上,尚未推送到远程(蓝色虚线)',\n 'git.originLocalOnly': '本地提交:只在本地分支上(当前仓库没有远程,蓝色虚线)',\n 'git.originSynced': '已同步:当前分支与远程跟踪分支都包含该提交(彩色实线)',\n 'git.originRemote': '远程提交:只有远程跟踪分支包含该提交,本地还没有(可先 Fetch/Pull)',\n 'git.originOtherBranch': '其他分支:只有其他本地分支包含该提交,当前分支与远程都没有(蓝色虚线)',\n 'git.originUnknown': '归属未知:Host 未返回提交归属(按泳道配色)',\n 'git.branchesAndTags': '分支与标签:{refs}',\n 'git.refSeparator': ';',\n 'git.author': '作者:{name}',\n 'git.unknownDate': '未知日期',\n 'git.unknownTime': '未知时间',\n 'git.dateLabel': '{month}月{day}日',\n}\n","/**\n * panels 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'common.listSeparator': ', ',\n 'settings.unknownVersion': 'Unknown version',\n 'settings.maintenanceDisabled': 'This module is disabled by maintenance policy; the setting will not start it.',\n 'cli.thinkingLevelTitle': 'Thinking level ({model})',\n 'cli.adapterEnabled': '{name} enabled',\n 'cli.adapterDisabled': '{name} disabled',\n 'cli.translationConversation': 'Translate conversation',\n 'cli.translationConversationToggle': 'Toggle conversation translation',\n 'cli.translationSettings': 'Conversation translation settings',\n 'cli.translationSettingsClose': 'Close',\n 'cli.translationSettingsDescription': 'Choose which messages to translate for {agent}. These options are saved separately for each agent and apply to its conversations with translation enabled.',\n 'cli.translationUserMessages': 'Translate user messages',\n 'cli.translationThinkingMessages': 'Translate AI thinking messages',\n 'cli.translationAssistantMessages': 'Translate AI final messages',\n 'lan.fieldListenPort': 'listen port',\n 'lan.fieldDshPort': 'DSH local port',\n 'lan.fieldMustBeNumber': '{field} must be a number',\n 'lan.fieldMustBeInteger': '{field} must be an integer from {minimum} to 65535',\n 'workspace.sessionSettingsSaved': 'Workspace session settings saved',\n 'feature.sessionTranslation.label': 'Session translation',\n 'feature.sessionTranslation.description': 'Translate selected external Agent requests and replies while keeping tools, commands, paths, and original history unchanged. Control DSH native session translation using the switch in the conversation model selector.',\n 'translation.inputTitle': 'Translate requests before sending',\n 'translation.inputLanguage': 'Request language',\n 'translation.outputTitle': 'Translate the AI’s reasoning and final messages into the language specified below',\n 'translation.outputLanguage': 'Reply language',\n 'translation.modelTitle': 'Translation model pool',\n 'translation.rulesTitle': 'Translation rules',\n 'translation.rulesHelp': 'Rules apply to input, reasoning, and replies, including text already in the target language. They take priority over the default translation prompts.',\n 'translation.rulesEmpty': 'No custom rules. The default translation prompts apply.',\n 'translation.ruleAdd': 'Add rule',\n 'translation.ruleEdit': 'Edit rule {number}',\n 'translation.ruleRemove': 'Remove rule {number}',\n 'translation.ruleText': 'Rule instructions',\n 'translation.rulePlaceholder': 'For example: Keep product names in their original language.',\n 'translation.ruleSave': 'Save rule',\n 'translation.ruleSaving': 'Saving…',\n 'translation.ruleCancel': 'Cancel',\n 'translation.modelFollowDefault': 'Use the default DSH model',\n 'translation.modelResetTitle': 'Use the default DSH model?',\n 'translation.modelResetHelp': 'This will clear all {count} models and their priority order from the pool, then follow the default DSH model. Continue?',\n 'translation.modelResetConfirm': 'Clear pool and use default',\n 'translation.modelUnavailable': 'Saved model is unavailable',\n 'translation.modelLoading': 'Loading available DSH models…',\n 'translation.modelEmpty': 'No DSH text models are available.',\n 'translation.modelHelp': 'Drag to set priority; the first model is tried first. If all models fail, the original text is kept.',\n 'translation.modelDefaultActive': 'No models selected; using the default DSH model.',\n 'translation.modelPriority': 'Priority {priority}',\n 'translation.modelPoolCount': '{count} models · ordered by priority',\n 'translation.modelPoolEmpty': 'Add models to set up automatic fallback.',\n 'translation.modelAdd': 'Add models',\n 'translation.modelRemove': 'Remove {model}',\n 'translation.modelDrag': 'Reorder {model}',\n 'translation.modelDragHelp': 'Drag to reorder, or use the Up and Down arrow keys.',\n 'translation.modelReordered': '{model} moved to priority {priority}',\n 'translation.modelPickerTitle': 'Add translation models',\n 'translation.modelPickerHelp': 'Select models to add to the end of the pool. Drag them to adjust priority after adding.',\n 'translation.modelSearch': 'Search models or providers',\n 'translation.modelPickerCount': '{count} selected',\n 'translation.modelAddSelected': 'Add selected ({count})',\n 'translation.modelCancel': 'Cancel',\n 'translation.modelNoMatches': 'No matching models.',\n 'translation.modelAllAdded': 'All available models are already in the pool.',\n 'translation.detailsTitle': 'Translation details',\n 'translation.viewDetails': 'View translation details',\n 'translation.statusTranslated': 'Translated',\n 'translation.statusTranslating': 'Translating…',\n 'translation.progressHelp': 'Preparing and translating your message. The translation result will be available when this finishes.',\n 'translation.statusFailed': 'Translation failed; original kept',\n 'translation.failure.timeout': 'The translation request timed out.',\n 'translation.failure.cancelled': 'The translation request was cancelled.',\n 'translation.failure.rate-limit': 'The translation provider rate limit was reached.',\n 'translation.failure.network': 'A network error interrupted the translation request.',\n 'translation.failure.unavailable': 'The translation provider was temporarily unavailable.',\n 'translation.failure.invalid-response': 'The translation response failed format, language, completion, or protected-text validation.',\n 'translation.failure.configuration': 'The translation model or provider configuration was rejected or unavailable.',\n 'translation.failure.provider': 'The translation provider or runtime reported an unclassified error.',\n 'translation.failure.unknown': 'No failure details were saved for this translation.',\n 'translation.retry': 'Retry translation',\n 'translation.sendDirectly': 'Send directly',\n 'translation.cancelSending': 'Cancel sending',\n 'translation.inputFailedTitle': 'Message translation failed',\n 'translation.inputFailedHelp': 'Your message has not been sent. Choose how to continue.',\n 'translation.decisionFailed': 'Could not apply your choice. Please try again.',\n 'translation.statusNotNeeded': 'Already in the target language; translation skipped',\n 'translation.detectedLanguage': 'Detected language',\n 'translation.modelNotUsed': 'Not used; translation was unnecessary',\n 'translation.originalText': 'Original text',\n 'translation.translatedText': 'Translation',\n 'translation.actualSentText': 'Actual sent text:',\n 'translation.modelUsed': 'Model used',\n 'translation.modelUnknown': 'Model information unavailable',\n 'translation.modelOfficial': 'DeepSeek official',\n 'translation.modelThirdParty': 'Third-party',\n 'translation.saveRejected': 'The translation settings could not be saved.',\n 'translation.saved': 'Translation settings saved',\n 'translation.language.zh': '简体中文', 'translation.language.en': 'English', 'translation.language.fr': 'Français', 'translation.language.de': 'Deutsch', 'translation.language.ja': '日本語',\n 'translation.adapter.claude': 'Claude Code', 'translation.adapter.codex': 'Codex', 'translation.adapter.pi': 'Pi', 'translation.adapter.opencode': 'OpenCode', 'translation.adapter.antigravity': 'Antigravity', 'translation.adapter.grok': 'Grok', 'translation.adapter.cursor': 'Cursor', 'translation.adapter.kiro': 'Kiro',\n}\n\nexport const zh: Record<string, string> = {\n 'common.listSeparator': '、',\n 'settings.unknownVersion': '未知版本',\n 'settings.maintenanceDisabled': '该模块当前由维护策略停用,设置不会启动它。',\n 'cli.thinkingLevelTitle': '思考等级({model})',\n 'cli.adapterEnabled': '已启用 {name}',\n 'cli.adapterDisabled': '已停用 {name}',\n 'cli.translationConversation': '翻译对话',\n 'cli.translationConversationToggle': '切换对话翻译',\n 'cli.translationSettings': '对话翻译设置',\n 'cli.translationSettingsClose': '关闭',\n 'cli.translationSettingsDescription': '选择 {agent} 需要翻译的消息类型。选项按 Agent 独立保存,应用于该 Agent 已开启对话翻译的会话。',\n 'cli.translationUserMessages': '翻译用户消息',\n 'cli.translationThinkingMessages': '翻译 AI 思考消息',\n 'cli.translationAssistantMessages': '翻译 AI 正式消息',\n 'lan.fieldListenPort': '监听端口',\n 'lan.fieldDshPort': 'DSH 本地端口',\n 'lan.fieldMustBeNumber': '{field} 必须是数字',\n 'lan.fieldMustBeInteger': '{field} 必须是 {minimum} 到 65535 的整数',\n 'workspace.sessionSettingsSaved': '工作区会话设置已保存',\n 'feature.sessionTranslation.label': '会话翻译',\n 'feature.sessionTranslation.description': '为选定的外部 Agent 翻译请求和回复,同时保留工具、命令、路径与原始历史;DSH 原生会话翻译由对话框模型选择器中的会话翻译开关控制。',\n 'translation.inputTitle': '发送前翻译请求',\n 'translation.inputLanguage': '请求目标语言',\n 'translation.outputTitle': 'AI的思考内容和正式消息翻译为以下指定语言',\n 'translation.outputLanguage': '回复语言',\n 'translation.modelTitle': '翻译模型池',\n 'translation.rulesTitle': '翻译规则',\n 'translation.rulesHelp': '规则适用于输入、思考和回复,包括已经是目标语言的文本。规则的优先级高于默认翻译提示词。',\n 'translation.rulesEmpty': '尚未添加自定义规则,使用默认翻译提示词。',\n 'translation.ruleAdd': '添加规则',\n 'translation.ruleEdit': '编辑规则 {number}',\n 'translation.ruleRemove': '移除规则 {number}',\n 'translation.ruleText': '规则内容',\n 'translation.rulePlaceholder': '例如:产品名称保留原文,不进行翻译。',\n 'translation.ruleSave': '保存规则',\n 'translation.ruleSaving': '正在保存…',\n 'translation.ruleCancel': '取消',\n 'translation.modelFollowDefault': '跟随 DSH 默认模型',\n 'translation.modelResetTitle': '确认跟随 DSH 默认模型?',\n 'translation.modelResetHelp': '这将清空模型池中的全部 {count} 个模型及其优先级顺序,并改为跟随 DSH 默认模型。是否继续?',\n 'translation.modelResetConfirm': '清空并跟随默认模型',\n 'translation.modelUnavailable': '已保存的模型当前不可用',\n 'translation.modelLoading': '正在加载可用的 DSH 模型…',\n 'translation.modelEmpty': '当前没有可用的 DSH 文本模型。',\n 'translation.modelHelp': '拖拽调整优先级,优先使用列表首个模型;全部失败时保留原文。',\n 'translation.modelDefaultActive': '未选择模型,当前跟随 DSH 默认模型。',\n 'translation.modelPriority': '优先级 {priority}',\n 'translation.modelPoolCount': '{count} 个模型 · 按优先级排列',\n 'translation.modelPoolEmpty': '添加模型,配置自动回退顺序。',\n 'translation.modelAdd': '添加模型',\n 'translation.modelRemove': '移除 {model}',\n 'translation.modelDrag': '调整 {model} 的顺序',\n 'translation.modelDragHelp': '拖拽调整顺序,也可使用上下方向键。',\n 'translation.modelReordered': '{model} 已移至优先级 {priority}',\n 'translation.modelPickerTitle': '添加翻译模型',\n 'translation.modelPickerHelp': '选择模型后添加到模型池末尾,添加后可拖拽调整优先级。',\n 'translation.modelSearch': '搜索模型或供应商',\n 'translation.modelPickerCount': '已选择 {count} 个',\n 'translation.modelAddSelected': '添加所选({count})',\n 'translation.modelCancel': '取消',\n 'translation.modelNoMatches': '没有匹配的模型。',\n 'translation.modelAllAdded': '所有可用模型均已添加到模型池。',\n 'translation.detailsTitle': '翻译详情',\n 'translation.viewDetails': '查看翻译详情',\n 'translation.statusTranslated': '已翻译',\n 'translation.statusTranslating': '正在翻译…',\n 'translation.progressHelp': '正在准备并翻译消息,完成后可查看翻译结果。',\n 'translation.statusFailed': '翻译失败,已保留原文',\n 'translation.failure.timeout': '翻译请求超时。',\n 'translation.failure.cancelled': '翻译请求已取消。',\n 'translation.failure.rate-limit': '翻译服务商的请求频率已达上限。',\n 'translation.failure.network': '网络错误中断了翻译请求。',\n 'translation.failure.unavailable': '翻译服务商暂时不可用。',\n 'translation.failure.invalid-response': '翻译结果未通过格式、语言、完整性或受保护文本校验。',\n 'translation.failure.configuration': '翻译模型或服务商配置被拒绝或不可用。',\n 'translation.failure.provider': '翻译服务商或运行时返回了未分类错误。',\n 'translation.failure.unknown': '此翻译未保存失败详情。',\n 'translation.retry': '重试翻译',\n 'translation.sendDirectly': '直接发送',\n 'translation.cancelSending': '取消发送',\n 'translation.inputFailedTitle': '消息翻译失败',\n 'translation.inputFailedHelp': '消息尚未发送,请选择如何继续。',\n 'translation.decisionFailed': '未能应用你的选择,请重试。',\n 'translation.statusNotNeeded': '原文已是目标语言,无需翻译',\n 'translation.detectedLanguage': '检测到的语言',\n 'translation.modelNotUsed': '未调用,原文无需翻译',\n 'translation.originalText': '原文',\n 'translation.translatedText': '译文',\n 'translation.actualSentText': '实际发送文本:',\n 'translation.modelUsed': '翻译模型',\n 'translation.modelUnknown': '暂无模型信息',\n 'translation.modelOfficial': 'DeepSeek 官方',\n 'translation.modelThirdParty': '第三方',\n 'translation.saveRejected': '会话翻译设置未能保存。',\n 'translation.saved': '会话翻译设置已保存',\n 'translation.language.zh': '简体中文', 'translation.language.en': '英语', 'translation.language.fr': '法语', 'translation.language.de': '德语', 'translation.language.ja': '日语',\n 'translation.adapter.claude': 'Claude Code', 'translation.adapter.codex': 'Codex', 'translation.adapter.pi': 'Pi', 'translation.adapter.opencode': 'OpenCode', 'translation.adapter.antigravity': 'Antigravity', 'translation.adapter.grok': 'Grok', 'translation.adapter.cursor': 'Cursor', 'translation.adapter.kiro': 'Kiro',\n}\n","/**\n * peerHost 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'feature.peerHost.label': 'Manage other DSH Hosts',\n 'feature.peerHost.description': 'Aggregate sessions from multiple Hosts',\n 'peerHost.panelTitle': 'Manage other DSH Hosts',\n 'peerHost.panelSubtitle': 'Connect to and manage other registered work hosts',\n 'peerHost.closePanel': 'Close PeerHost management',\n 'peerHost.close': 'Close',\n 'peerHost.addHost': 'Add Host',\n 'peerHost.registeredHosts': 'Registered Hosts',\n 'peerHost.listHint': 'Manage connections, resources, and access status',\n 'peerHost.closeDialogTitle': 'Close {title}',\n 'peerHost.nameOptional': 'Name (optional)',\n 'peerHost.hostUrl': 'Host URL',\n 'peerHost.targetUsername': 'Target Host username',\n 'peerHost.targetPassword': 'Target Host password',\n 'peerHost.identifyingAccount': 'Identifying the current account…',\n 'peerHost.loginNote': 'Credentials are only used for the target Host session; the password is not saved in the browser.',\n 'peerHost.addAndLogin': 'Add and sign in',\n 'peerHost.adding': 'Adding…',\n 'peerHost.retrying': 'Retrying…',\n 'peerHost.handshakeFailed': 'The PeerHost was registered, but its handshake status is “{status}”; fix the URL or credentials and submit again.',\n 'peerHost.identityLocal': 'Read account “{username}” from the current page as the suggested username; this does not sign in to the remote Host.',\n 'peerHost.identityRelay': 'Read account “{username}” from the current relay login as the suggested username; the target Host password is still required.',\n 'peerHost.identityUnknown': 'The current page account could not be identified; enter the target Host username and password.',\n 'peerHost.readingList': 'Reading PeerHosts...',\n 'peerHost.emptyList': 'No other Host has been added yet. Click “+” in the top right to add one.',\n 'peerHost.colorDefaultHint': 'Default color (derived from the name)',\n 'peerHost.colorLabel': 'Label color {color}',\n 'peerHost.hostnameValue': 'Hostname: {hostname}',\n 'peerHost.notReported': 'Not reported',\n 'peerHost.dshVersion': 'DSH version',\n 'peerHost.unknown': 'Unknown',\n 'peerHost.visibleWorkspaces': 'Visible workspaces',\n 'peerHost.memory': 'Memory',\n 'peerHost.edit': 'Edit',\n 'peerHost.test': 'Test',\n 'peerHost.enable': 'Enable',\n 'peerHost.disable': 'Disable',\n 'peerHost.delete': 'Delete',\n 'peerHost.confirmDelete': 'Delete PeerHost “{name}”?',\n 'peerHost.noSample': 'No sample yet',\n 'peerHost.editHost': 'Edit Host',\n 'peerHost.name': 'Name',\n 'peerHost.hostUrlOptional': 'Host URL (optional)',\n 'peerHost.targetUsernameOptional': 'Target Host username (optional)',\n 'peerHost.targetPasswordOptional': 'Target Host password (optional)',\n 'peerHost.passwordKeepNote': 'Leave the password blank to keep the saved credentials; entering a password performs the handshake and sign-in immediately.',\n 'peerHost.saveAndConnect': 'Save and connect',\n 'peerHost.urlBackfilledNote': 'The URL was filled in from the record; leave it blank to keep the current URL.',\n 'peerHost.relayRouteNote': 'The relay route is stored by the Host and cannot be changed from the client.',\n 'peerHost.passwordRequiresUsername': 'Entering a password also requires the target Host username; leave the password blank to keep the current credentials.',\n 'peerHost.saving': 'Saving…',\n 'peerHost.credentialSavedNote': 'This Host already has saved credentials for that target, so connections complete automatically; leave the fields blank to keep them.',\n 'peerHost.colorSection': 'Workspace label color',\n 'peerHost.usePresetColor': 'Use color {color}',\n 'peerHost.colorReset': 'Default',\n 'peerHost.statusConfigured': 'Not tested',\n 'peerHost.statusChecking': 'Testing',\n 'peerHost.statusReady': 'Connected',\n 'peerHost.statusPluginMissing': 'Plugin missing',\n 'peerHost.statusVersionMismatch': 'Version mismatch',\n 'peerHost.statusIdentityChanged': 'Identity changed',\n 'peerHost.statusSessionRequired': 'Sign-in required',\n 'peerHost.statusUnreachable': 'Unreachable',\n 'peerHost.statusReconnecting': 'Reconnecting',\n 'peerHost.statusDisabled': 'Disabled',\n 'peerHost.debugWorkspaceUnavailable': 'The remote debug workspace scope is unavailable. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.gitWorkspaceUnavailable': 'The remote Git workspace is temporarily unavailable. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.fileWorkspaceUnavailable': 'The remote file scope is unavailable or inconsistent. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.questionSessionUnavailable': 'The session for this remote question is unavailable. Please reconnect.',\n 'peerHost.sessionUnavailable': 'The remote session scope is unavailable. Please wait for PeerHost workspaces to refresh.',\n 'peerHost.attachmentFolderUnsupported': 'Add individual files to the remote session; local folders cannot be attached.',\n 'peerHost.reference.section': 'Conversations',\n 'peerHost.reference.newSession': 'New session',\n 'peerHost.stateExternal': 'The Transport structure of this page is not supported, so the plugin cannot wrap it and PeerHost aggregation is disabled; refreshing the page will not change the result.',\n 'peerHost.stateNotInstalledDesktop': 'The preboot shim is not installed in this Desktop page; restart DSH Desktop and reopen the page.',\n 'peerHost.stateNotInstalledWeb': 'The preboot shim is not installed in this page; refresh DSH Web and then enable PeerHost.',\n 'peerHost.stateRequiresReload': 'The preboot shim is installed, but the current Connection has not bound the aggregate Transport; refresh DSH Web before using remote workspaces.',\n 'peerHost.stateActive': 'The preboot shim has taken over the page Transport; the native Connection of this page keeps reusing the same instance.',\n 'peerHost.statePending': 'The preboot shim is installed with CodingNS; it takes effect as soon as PeerHost is enabled, and native workspaces read the aggregate Transport directly.',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.peerHost.label': '管理其他 DSH Host',\n 'feature.peerHost.description': '聚合多个 Host 会话',\n 'peerHost.panelTitle': '管理其他 DSH Host',\n 'peerHost.panelSubtitle': '连接并管理已登记的其他工作主机',\n 'peerHost.closePanel': '关闭 PeerHost 管理',\n 'peerHost.close': '关闭',\n 'peerHost.addHost': '添加 Host',\n 'peerHost.registeredHosts': '已登记的 Host',\n 'peerHost.listHint': '管理连接、资源和访问状态',\n 'peerHost.closeDialogTitle': '关闭{title}',\n 'peerHost.nameOptional': '名称(可选)',\n 'peerHost.hostUrl': 'Host 地址',\n 'peerHost.targetUsername': '目标 Host 用户名',\n 'peerHost.targetPassword': '目标 Host 密码',\n 'peerHost.identifyingAccount': '正在识别当前登录账号…',\n 'peerHost.loginNote': '登录信息只用于目标 Host 会话;密码不会保存到浏览器。',\n 'peerHost.addAndLogin': '添加并登录',\n 'peerHost.adding': '添加中…',\n 'peerHost.retrying': '重试中…',\n 'peerHost.handshakeFailed': 'PeerHost 已登记,但握手状态为“{status}”;请修正地址或凭据后再次提交。',\n 'peerHost.identityLocal': '已读取当前页面账号“{username}”作为用户名建议;这不会自动登录远程 Host',\n 'peerHost.identityRelay': '已读取当前中转账号“{username}”作为用户名建议;仍需目标 Host 自己的密码',\n 'peerHost.identityUnknown': '未识别当前页面账号;请填写目标 Host 的用户名和密码',\n 'peerHost.readingList': '正在读取 PeerHost...',\n 'peerHost.emptyList': '尚未添加其他 Host。点击右上角“+”添加。',\n 'peerHost.colorDefaultHint': '默认配色(按名称推导)',\n 'peerHost.colorLabel': '标签配色 {color}',\n 'peerHost.hostnameValue': '主机名:{hostname}',\n 'peerHost.notReported': '未上报',\n 'peerHost.dshVersion': 'DSH 版本',\n 'peerHost.unknown': '未知',\n 'peerHost.visibleWorkspaces': '可见工作区',\n 'peerHost.memory': '内存',\n 'peerHost.edit': '编辑',\n 'peerHost.test': '测试',\n 'peerHost.enable': '启用',\n 'peerHost.disable': '禁用',\n 'peerHost.delete': '删除',\n 'peerHost.confirmDelete': '确认删除 PeerHost“{name}”?',\n 'peerHost.noSample': '暂无采样',\n 'peerHost.editHost': '编辑 Host',\n 'peerHost.name': '名称',\n 'peerHost.hostUrlOptional': 'Host 地址(可选)',\n 'peerHost.targetUsernameOptional': '目标 Host 用户名(可选)',\n 'peerHost.targetPasswordOptional': '目标 Host 密码(可选)',\n 'peerHost.passwordKeepNote': '密码留空表示保持已保存的登录凭据不变;填写密码后会立即握手并登录。',\n 'peerHost.saveAndConnect': '保存并连接',\n 'peerHost.urlBackfilledNote': '地址已从记录中回填;留空表示保持当前地址不变。',\n 'peerHost.relayRouteNote': '中转路由由 Host 侧保存,当前不可在客户端修改。',\n 'peerHost.passwordRequiresUsername': '填写密码时必须同时填写目标 Host 用户名;密码留空即可保持当前凭据。',\n 'peerHost.saving': '保存中…',\n 'peerHost.credentialSavedNote': '当前 Host 已保存该目标的登录凭据,连接会自动完成;留空即可保持不变。',\n 'peerHost.colorSection': '工作区标签配色',\n 'peerHost.usePresetColor': '使用配色 {color}',\n 'peerHost.colorReset': '默认',\n 'peerHost.statusConfigured': '待测试',\n 'peerHost.statusChecking': '测试中',\n 'peerHost.statusReady': '已连接',\n 'peerHost.statusPluginMissing': '插件缺失',\n 'peerHost.statusVersionMismatch': '版本不匹配',\n 'peerHost.statusIdentityChanged': '身份已变化',\n 'peerHost.statusSessionRequired': '需要登录',\n 'peerHost.statusUnreachable': '无法连接',\n 'peerHost.statusReconnecting': '重连中',\n 'peerHost.statusDisabled': '已禁用',\n 'peerHost.debugWorkspaceUnavailable': '远程调试工作区作用域不可用,请等待 PeerHost 工作区刷新',\n 'peerHost.gitWorkspaceUnavailable': '远程 Git 工作区暂不可用,请等待 PeerHost 工作区刷新',\n 'peerHost.fileWorkspaceUnavailable': '远程文件作用域不可用或不一致,请等待 PeerHost 工作区刷新',\n 'peerHost.questionSessionUnavailable': '远端问题所属会话不可用,请重新连接',\n 'peerHost.sessionUnavailable': '远端会话作用域暂不可用,请等待 PeerHost 工作区刷新',\n 'peerHost.attachmentFolderUnsupported': '请向远程会话添加单个文件,不能附加本机文件夹。',\n 'peerHost.reference.section': '对话',\n 'peerHost.reference.newSession': '新会话',\n 'peerHost.stateExternal': '当前页面的 Transport 结构不受支持,插件无法包装它,PeerHost 聚合已停用;刷新页面不会改变结果。',\n 'peerHost.stateNotInstalledDesktop': '当前 Desktop 页面没有安装 preboot shim;请重启 DSH Desktop 后再打开页面。',\n 'peerHost.stateNotInstalledWeb': '当前页面未安装 preboot shim;请刷新 DSH Web 后再启用 PeerHost。',\n 'peerHost.stateRequiresReload': 'preboot shim 已安装,但当前 Connection 尚未绑定聚合 Transport;请刷新 DSH Web 后再操作远端工作区。',\n 'peerHost.stateActive': 'preboot shim 已接管页面 Transport;本次页面的原生 Connection 将继续复用同一实例。',\n 'peerHost.statePending': 'preboot shim 已随 CodingNS 安装;启用 PeerHost 后立即生效,原生工作区会直接读取聚合 Transport。',\n}\n","/**\n * peerHostWorkspace 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'peerHostWorkspace.tabLocal': 'Local folders',\n 'peerHostWorkspace.tabRemote': 'Remote HOST',\n 'peerHostWorkspace.sourceLabel': 'Workspace source',\n 'peerHostWorkspace.heading': 'Remote HOST workspaces',\n 'peerHostWorkspace.hint': 'Choose a Host to view its added workspaces; use the candidates below to add another one.',\n 'peerHostWorkspace.loadingHosts': 'Reading registered Hosts…',\n 'peerHostWorkspace.noHosts': 'No other Host is registered yet. Add one under “Manage other DSH Hosts” first.',\n 'peerHostWorkspace.loadingWorkspaces': 'Reading the workspaces registered on this Host…',\n 'peerHostWorkspace.noWorkspaces': 'This Host has no registered workspaces.',\n 'peerHostWorkspace.addedHeading': 'Added workspaces',\n 'peerHostWorkspace.availableHeading': 'Add a workspace',\n 'peerHostWorkspace.noAddedWorkspaces': 'No remote workspace has been added to this Host yet.',\n 'peerHostWorkspace.columnWorkspace': 'Workspace',\n 'peerHostWorkspace.columnSessions': 'Sessions',\n 'peerHostWorkspace.columnHost': 'Remote HOST',\n 'peerHostWorkspace.columnPath': 'Path',\n 'peerHostWorkspace.columnActions': 'Actions',\n 'peerHostWorkspace.remove': 'Remove',\n 'peerHostWorkspace.removeLabel': 'Remove workspace “{name}”',\n 'peerHostWorkspace.removeHint': 'Remove from this workspace list; keep the remote folder and sessions.',\n 'peerHostWorkspace.disconnectedHint': 'Disconnected; expand to view the cached session list.',\n 'peerHostWorkspace.dismissDisconnected': 'Remove disconnected workspace record',\n 'peerHostWorkspace.dismissDisconnectedHint': 'Hide this cached record while disconnected. Added workspaces return after reconnection.',\n 'peerHostWorkspace.noSessions': 'No sessions',\n 'peerHostWorkspace.sessionCount': '{count} sessions',\n 'peerHostWorkspace.added': 'Added; the workspace appears in the sidebar after you close this dialog.',\n 'peerHostWorkspace.removed': 'Removed; the remote folder and sessions are kept. You can add it again below.',\n 'peerHostWorkspace.statusConfigured': 'Pending connection',\n 'peerHostWorkspace.statusChecking': 'Checking',\n 'peerHostWorkspace.statusReady': 'Connected',\n 'peerHostWorkspace.statusPluginMissing': 'Plugin missing',\n 'peerHostWorkspace.statusVersionMismatch': 'Version mismatch',\n 'peerHostWorkspace.statusIdentityChanged': 'Identity changed',\n 'peerHostWorkspace.statusSessionRequired': 'Sign-in required',\n 'peerHostWorkspace.statusUnreachable': 'Unreachable',\n 'peerHostWorkspace.statusReconnecting': 'Reconnecting',\n 'peerHostWorkspace.statusDisabled': 'Disabled',\n 'peerHostWorkspace.hintSessionRequired': '“{host}” needs a new sign-in. Open “Manage other DSH Hosts”, choose “Edit” for this Host, and save the account and password.',\n 'peerHostWorkspace.hintUnreachable': '“{host}” is unreachable. Make sure the target machine is running, then click “Test” in the management panel to retry.',\n 'peerHostWorkspace.hintVersionMismatch': '“{host}” is incompatible. The client plugin version must be at least the PeerHost plugin version; the DSH version and API compatibility must also be supported.',\n 'peerHostWorkspace.hintPluginMissing': '“{host}” does not have this plugin installed, so its workspaces cannot be aggregated.',\n 'peerHostWorkspace.hintIdentityChanged': 'The identity of “{host}” changed. Run “Test” and sign in again in the management panel.',\n 'peerHostWorkspace.hintNotReady': '“{host}” is currently “{status}”; finish connecting it in the management panel first.',\n 'peerHostWorkspace.manageHosts': 'Manage other DSH Hosts',\n}\n\nexport const zh: Record<string, string> = {\n 'peerHostWorkspace.tabLocal': '本机文件夹',\n 'peerHostWorkspace.tabRemote': '远程 HOST',\n 'peerHostWorkspace.sourceLabel': '工作区来源',\n 'peerHostWorkspace.heading': '远程 HOST 工作区',\n 'peerHostWorkspace.hint': '选择一台 Host 查看已添加的工作区;可在下方候选列表继续添加工作区。',\n 'peerHostWorkspace.loadingHosts': '正在读取已登记的 Host…',\n 'peerHostWorkspace.noHosts': '尚未登记其他 Host。请先在“管理其他 DSH Host”中添加。',\n 'peerHostWorkspace.loadingWorkspaces': '正在读取该 Host 已登记的工作区…',\n 'peerHostWorkspace.noWorkspaces': '该 Host 上没有已登记的工作区。',\n 'peerHostWorkspace.addedHeading': '已添加的远程工作区',\n 'peerHostWorkspace.availableHeading': '添加远程工作区',\n 'peerHostWorkspace.noAddedWorkspaces': '该 Host 尚未添加远程工作区。',\n 'peerHostWorkspace.columnWorkspace': '工作区名称',\n 'peerHostWorkspace.columnSessions': '会话数',\n 'peerHostWorkspace.columnHost': '所属远程 HOST',\n 'peerHostWorkspace.columnPath': '路径',\n 'peerHostWorkspace.columnActions': '操作',\n 'peerHostWorkspace.remove': '移除',\n 'peerHostWorkspace.removeLabel': '移除工作区“{name}”',\n 'peerHostWorkspace.removeHint': '仅取消在当前端添加,保留远端目录和会话。',\n 'peerHostWorkspace.disconnectedHint': '连接已断开,仍可展开查看缓存的会话列表。',\n 'peerHostWorkspace.dismissDisconnected': '移除断开的工作区记录',\n 'peerHostWorkspace.dismissDisconnectedHint': '断线期间隐藏此缓存记录;连接恢复后仍按工作区添加状态显示。',\n 'peerHostWorkspace.noSessions': '无会话',\n 'peerHostWorkspace.sessionCount': '{count} 个会话',\n 'peerHostWorkspace.added': '已添加;关闭对话框后该工作区会出现在侧栏。',\n 'peerHostWorkspace.removed': '已移除;远端目录和会话保留,可在下方重新添加。',\n 'peerHostWorkspace.statusConfigured': '待连接',\n 'peerHostWorkspace.statusChecking': '检查中',\n 'peerHostWorkspace.statusReady': '已连接',\n 'peerHostWorkspace.statusPluginMissing': '插件缺失',\n 'peerHostWorkspace.statusVersionMismatch': '版本不匹配',\n 'peerHostWorkspace.statusIdentityChanged': '身份已变化',\n 'peerHostWorkspace.statusSessionRequired': '需要登录',\n 'peerHostWorkspace.statusUnreachable': '无法连接',\n 'peerHostWorkspace.statusReconnecting': '重连中',\n 'peerHostWorkspace.statusDisabled': '已禁用',\n 'peerHostWorkspace.hintSessionRequired': '“{host}”需要重新登录。请到“管理其他 DSH Host”打开该 Host 的“编辑”,填入账号密码保存即可。',\n 'peerHostWorkspace.hintUnreachable': '“{host}”当前无法连接。请确认目标机器已启动,然后在管理面板点“测试”重试。',\n 'peerHostWorkspace.hintVersionMismatch': '“{host}”版本不兼容。客户端插件版本须不低于 PeerHost 插件版本,DSH 版本及 API 兼容标识也须受支持。',\n 'peerHostWorkspace.hintPluginMissing': '“{host}”没有安装本插件,无法聚合它的工作区。',\n 'peerHostWorkspace.hintIdentityChanged': '“{host}”的身份已变化。请在管理面板重新“测试”并登录。',\n 'peerHostWorkspace.hintNotReady': '“{host}”当前状态为“{status}”,请先在管理面板完成连接。',\n 'peerHostWorkspace.manageHosts': '管理其他 DSH Host',\n}\n","/**\n * terminalAuth 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'terminalShare.title': 'Share terminal output to a conversation',\n 'terminalShare.menuTitle': 'Share to a conversation',\n 'terminalShare.more': 'More conversations',\n 'terminalShare.untitled': 'Untitled conversation',\n 'terminalShare.time.now': 'now',\n 'terminalShare.time.minutes': '{n}min',\n 'terminalShare.time.hours': '{n}h',\n 'terminalShare.time.days': '{n}d',\n 'terminalShare.time.months': '{n}mo',\n 'terminalShare.time.years': '{n}y',\n 'terminalShare.time.unknown': 'Update time unknown',\n 'terminalShare.selectionActions': 'Selected terminal text',\n 'terminalShare.copy': 'Copy',\n 'terminalShare.share': 'Share',\n 'terminalShare.preview.title': 'Terminal log',\n 'terminalShare.preview.close': 'Close',\n 'terminalShare.preview.metadata': '{title} · {lines} lines · {time}',\n 'terminalShare.preview.invalid': 'This log reference is invalid. Please share the terminal log again.',\n 'terminalShare.referenceUnavailable': 'Log reference cards are temporarily unavailable. Please retry.',\n 'terminalShare.selectionLimited': 'Selection exceeds 200 lines / 32 KiB; sharing the first {lines} retained lines.',\n 'terminalShare.unavailable': 'Conversation sharing is unavailable. This feature requires the DSH draft-persistence API added in 0.2.1-alpha.1.',\n 'terminalShare.snapshot.heading': 'Terminal log snapshot (read-only debugging context)',\n 'terminalShare.snapshot.terminal': 'Terminal: {title}',\n 'terminalShare.snapshot.host': 'Source Host: {host}',\n 'terminalShare.snapshot.workspace': 'Workspace: {workspace}',\n 'terminalShare.snapshot.cwd': 'Launch directory: {cwd}',\n 'terminalShare.snapshot.shell': 'Shell: {shell}',\n 'terminalShare.snapshot.time': 'Captured at: {time}',\n 'terminalShare.snapshot.range': 'Range: {range}, {lines} lines retained',\n 'terminalShare.snapshot.truncated': 'Content truncated: yes',\n 'terminalShare.snapshot.complete': 'Content truncated: no',\n 'terminalShare.range.selection': 'Selected text',\n 'terminalShare.range.recent': 'Recent output (up to 200 lines)',\n 'terminalShare.range.screen': 'Current screen',\n 'terminalShare.empty': 'No output in this range.',\n 'terminalShare.loading': 'Loading conversations…',\n 'terminalShare.new': 'New conversation',\n 'terminalShare.retry': 'Refresh conversations',\n 'terminalShare.adding': 'Adding…',\n 'terminalShare.referenceLabel': 'Terminal: {title} · {lines} lines',\n 'terminalView.errorDetail': 'Terminal error: {message}',\n 'terminalView.readOnly': 'This page is currently read-only.',\n 'terminalView.reconnect': 'Reconnect',\n 'terminalView.readingEnvironment': 'Reading the terminal environment…',\n 'terminalView.loadTimeout': 'The terminal service did not respond in time. Please retry.',\n 'terminalView.starting': 'Starting…',\n 'terminalView.connecting': 'Connecting…',\n 'terminalView.disconnected': 'Connection lost.',\n 'terminalView.lost': 'The terminal runtime is gone (the process may have been ended externally).',\n 'terminalView.rebuild': 'Rebuild terminal',\n 'terminalView.exited': 'Process exited ({exitCode})',\n 'terminalView.unavailable': 'Unavailable',\n 'terminalView.closed': 'The terminal is closed.',\n 'loginProtection.saved': 'Login protection settings saved',\n 'loginProtection.savedRelaySession': 'Settings saved. Relay access requires entering the password again to establish a session for this tab.',\n 'loginProtection.panelHint': 'Add local account verification for LAN and relay access. Loopback 127.0.0.1 / ::1 is never protected. The password is verified only on the Host and never enters browser settings or the URL; while the page stays open, the session is renewed automatically as it nears expiry.',\n 'loginProtection.enable': 'Enable login protection',\n 'loginProtection.username': 'Local username',\n 'loginProtection.newPassword': 'New password (leave blank to keep the current one)',\n 'loginProtection.password': 'Password (at least 8 characters)',\n 'loginProtection.timeoutSeconds': 'Session timeout (seconds)',\n 'loginProtection.scopes': 'Applies to',\n 'loginProtection.scopeLan': 'LAN access',\n 'loginProtection.scopeLanHint': 'LAN interface entry',\n 'loginProtection.scopeRelay': 'Relay access',\n 'loginProtection.scopeRelayHint': 'Codingns4DSH relay',\n 'loginProtection.scopeOption': '{label} ({hint})',\n 'loginProtection.saving': 'Saving…',\n 'loginProtection.save': 'Save login protection',\n 'loginProtection.errorTimeoutRange': 'The session timeout must be between 60 and 604800 seconds',\n 'loginProtection.errorScopesRequired': 'Select at least one scope',\n}\n\nexport const zh: Record<string, string> = {\n 'terminalShare.title': '分享终端输出至会话',\n 'terminalShare.menuTitle': '分享至会话',\n 'terminalShare.more': '更多会话',\n 'terminalShare.untitled': '未命名会话',\n 'terminalShare.time.now': '刚刚',\n 'terminalShare.time.minutes': '{n}分钟',\n 'terminalShare.time.hours': '{n}小时',\n 'terminalShare.time.days': '{n}天',\n 'terminalShare.time.months': '{n}个月',\n 'terminalShare.time.years': '{n}年',\n 'terminalShare.time.unknown': '更新时间未知',\n 'terminalShare.selectionActions': '终端选中文字',\n 'terminalShare.copy': '复制',\n 'terminalShare.share': '分享',\n 'terminalShare.preview.title': '终端日志',\n 'terminalShare.preview.close': '关闭',\n 'terminalShare.preview.metadata': '{title} · {lines} 行 · {time}',\n 'terminalShare.preview.invalid': '日志引用已损坏,请重新分享终端日志。',\n 'terminalShare.referenceUnavailable': '日志引用卡片暂不可用,请稍后重试。',\n 'terminalShare.selectionLimited': '选区超过 200 行 / 32 KiB,仅分享前 {lines} 行已保留的内容。',\n 'terminalShare.unavailable': '会话分享服务不可用;此功能需要 DSH 自 0.2.1-alpha.1 起提供的草稿保存能力。',\n 'terminalShare.snapshot.heading': '终端日志快照(只读调试资料)',\n 'terminalShare.snapshot.terminal': '终端:{title}',\n 'terminalShare.snapshot.host': '来源 Host:{host}',\n 'terminalShare.snapshot.workspace': '工作区:{workspace}',\n 'terminalShare.snapshot.cwd': '启动目录:{cwd}',\n 'terminalShare.snapshot.shell': 'Shell:{shell}',\n 'terminalShare.snapshot.time': '采集时间:{time}',\n 'terminalShare.snapshot.range': '范围:{range},保留 {lines} 行',\n 'terminalShare.snapshot.truncated': '内容已截断:是',\n 'terminalShare.snapshot.complete': '内容已截断:否',\n 'terminalShare.range.selection': '选中内容',\n 'terminalShare.range.recent': '最近输出(最多 200 行)',\n 'terminalShare.range.screen': '当前屏幕',\n 'terminalShare.empty': '此范围没有输出。',\n 'terminalShare.loading': '正在读取会话…',\n 'terminalShare.new': '新建会话',\n 'terminalShare.retry': '刷新会话列表',\n 'terminalShare.adding': '正在加入…',\n 'terminalShare.referenceLabel': '终端:{title} · {lines} 行',\n 'terminalView.errorDetail': '终端错误:{message}',\n 'terminalView.readOnly': '此页面当前只读。',\n 'terminalView.reconnect': '重新连接',\n 'terminalView.readingEnvironment': '正在读取终端环境…',\n 'terminalView.loadTimeout': '终端服务响应超时,请重试。',\n 'terminalView.starting': '正在启动…',\n 'terminalView.connecting': '正在连接…',\n 'terminalView.disconnected': '连接已断开。',\n 'terminalView.lost': '终端运行时已丢失(进程可能被外部结束)。',\n 'terminalView.rebuild': '重建终端',\n 'terminalView.exited': '进程已退出({exitCode})',\n 'terminalView.unavailable': '不可用',\n 'terminalView.closed': '终端已关闭。',\n 'loginProtection.saved': '登录保护设置已保存',\n 'loginProtection.savedRelaySession': '设置已保存;中继访问需要重新输入密码以建立当前标签页会话',\n 'loginProtection.panelHint': '为局域网和中继访问统一增加本地账号验证。本机 127.0.0.1 / ::1 永远不受此保护。密码只在 Host 侧验证,不会进入浏览器设置或 URL;页面保持打开时,会在会话临近超时时自动续期。',\n 'loginProtection.enable': '启用登录保护',\n 'loginProtection.username': '本地用户名',\n 'loginProtection.newPassword': '新密码(留空保持不变)',\n 'loginProtection.password': '密码(至少 8 位)',\n 'loginProtection.timeoutSeconds': '会话超时(秒)',\n 'loginProtection.scopes': '应用范围',\n 'loginProtection.scopeLan': '局域网访问',\n 'loginProtection.scopeLanHint': '局域网网卡入口',\n 'loginProtection.scopeRelay': '中继访问',\n 'loginProtection.scopeRelayHint': 'Codingns4DSH 中继',\n 'loginProtection.scopeOption': '{label}({hint})',\n 'loginProtection.saving': '保存中…',\n 'loginProtection.save': '保存登录保护',\n 'loginProtection.errorTimeoutRange': '会话超时时间必须是 60 到 604800 秒',\n 'loginProtection.errorScopesRequired': '至少选择一个应用范围',\n}\n","/**\n * usage 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\n 'usage.r4StatsPeriod': 'Account usage · UTC',\n 'usage.r4TodayIoTokens': 'Input + output tokens today',\n 'usage.r4WeekRequests': 'Requests · last 7 days',\n 'usage.r4WeekIoTokens': 'Input + output tokens · last 7 days',\n 'usage.r4WeekCost': 'Cost · last 7 days',\n 'usage.r4ModelsWeek': 'By model · last 7 days',\n 'usage.r4TodayUsage': 'Account usage today (UTC)',\n 'usage.r4KeyRemainingLimit': 'Key remaining / limit',\n 'usage.r4TodayCost': 'Cost today (UTC)',\n 'usage.r4AccountSnapshot': 'Account balance (snapshot)',\n 'usage.r4PackageBalance': 'Package balance',\n 'usage.r4WalletBalance': 'Wallet balance',\n 'usage.r4PackageExpiry': 'Next package expiry',\n 'usage.r4KeyQuota': 'Current Key · lifetime spend limit',\n 'usage.r4KeyLimit': 'Key limit',\n 'usage.r4NoLimit': 'No Key limit',\n 'usage.r4KeySpent': 'Key settled spend',\n 'usage.r4KeyHeld': 'Key in-flight holds',\n 'usage.r4KeyRemaining': 'Key remaining (after holds)',\n 'usage.r4AccountUsage': 'Account usage · today and last 7 days (UTC)',\n 'usage.r4inputTokens': 'Prompt tokens today',\n 'usage.r4outputTokens': 'Completion tokens today',\n 'usage.r4cacheReadTokens': 'Cache-read tokens today',\n 'usage.r4cacheCreationTokens': 'Cache-creation tokens today',\n 'usage.slotLabel': 'Agent subscription balance',\n 'usage.remainingLabel': '{provider} subscription balance {percent}%',\n 'usage.upstreamBalanceLabel': '{provider} upstream balance {amount}',\n 'usage.balanceLabel': '{provider} balance {amount}',\n 'usage.providerBalanceLabel': '{provider} remaining {amount}',\n 'usage.providerBalancePlanLabel': '{provider} · {plan} · {amount}',\n 'usage.unavailable': 'Unavailable',\n 'usage.upstreamNotProvided': 'Not provided by upstream',\n 'usage.available': 'Available',\n 'usage.subscriptionRemaining': 'Subscription balance',\n 'usage.todayCostShort': 'Today {amount}',\n 'usage.accountBalance': 'Account balance',\n 'usage.officialRemaining': 'Official balance',\n 'usage.windowFiveHour': '5-hour quota',\n 'usage.windowWeekly': 'Weekly quota',\n 'usage.windowMonthly': 'Monthly quota',\n 'usage.quotaGroupGemini': 'Gemini models',\n 'usage.quotaGroupThirdParty': 'Claude and GPT models',\n 'usage.popoverSubscriptionUsage': '{provider} subscription usage',\n 'usage.popoverSubscriptionTitle': '{provider} subscription',\n 'usage.windowRemaining': '{label} remaining {percent}%',\n 'usage.resetsIn': 'Resets in {time}',\n 'usage.windowDays': '{count}-day quota',\n 'usage.windowHours': '{count}-hour quota',\n 'usage.windowMinutes': '{count}-minute quota',\n 'usage.officialRemainingPopover': '{provider} official balance',\n 'usage.usedOfTotal': 'Used {used} / {total}',\n 'usage.usedShort': 'Used {amount}',\n 'usage.expiresIn': 'Expires in {time}',\n 'usage.expired': 'Expired',\n 'usage.noMoreStats': 'No further statistics',\n 'usage.providerDetails': 'Upstream details',\n 'usage.keyStatus': 'API key status',\n 'usage.keyActive': 'Active',\n 'usage.keyExpired': 'Expired',\n 'usage.providerAccountBalance': '{provider} account balance',\n 'usage.granted': 'Granted {amount}',\n 'usage.toppedUp': 'Topped up {amount}',\n 'usage.deepseekApiNote': 'The official DeepSeek API currently exposes only an account balance endpoint; request, token, and cost details are unavailable.',\n 'usage.upstreamUsageTitle': '{provider} upstream usage',\n 'usage.addressMissing': 'Address not provided',\n 'usage.statTodayRequests': 'Requests today',\n 'usage.statTodayTokens': 'Tokens today',\n 'usage.statTodayCost': 'Cost today',\n 'usage.statTotalRequests': 'Total requests',\n 'usage.statTotalTokens': 'Total tokens',\n 'usage.statTotalCost': 'Total cost',\n 'usage.statTodayCacheHitRate': 'Cache hit rate today',\n 'usage.statTotalCacheHitRate': 'Overall cache hit rate',\n 'usage.byModel': 'By model',\n 'usage.byDay': 'By day',\n 'usage.noModelStats': 'No per-model statistics',\n 'usage.colModel': 'Model',\n 'usage.colDate': 'Date',\n 'usage.colRequests': 'Requests',\n 'usage.colToken': 'Token',\n 'usage.colCost': 'Cost',\n 'usage.colCache': 'Cache',\n 'usage.newApiBalance': 'Balance',\n 'usage.newApiUsed': 'Used',\n 'usage.newApiUnlimited': 'Unlimited',\n 'usage.providerDeepseekOfficial': 'DeepSeek Official',\n 'usage.providerUpstream': '{name} upstream',\n 'usage.countdownDaysHours': '{days}d {hours}h',\n 'usage.countdownHoursMinutes': '{hours}h {minutes}m',\n 'usage.countdownHours': '{hours}h',\n 'usage.countdownMinutes': '{minutes}m',\n 'usage.creditBalanceLabel': 'Credits',\n 'usage.creditUnlimited': 'Unlimited',\n 'usage.resetCreditsLabel': 'Reset credits',\n 'usage.resetCreditsCount': '{count}',\n 'usage.resetCreditsExpiresAt': 'expires in {time}',\n 'usage.resetCreditsExpired': 'expired',\n 'usage.resetCreditsMore': '{count} more',\n 'usage.resetButton': 'Reset subscription',\n 'usage.resetTooltipReady': 'Consumes one reset credit to restore the current window',\n 'usage.resetTooltipNone': 'No reset credits available',\n 'usage.resetDialogTitle': 'Reset subscription usage?',\n 'usage.resetDialogBody': 'This consumes one reset credit and immediately restores the current usage window, with {count} left. This cannot be undone. Continue?',\n 'usage.resetDialogCancel': 'Cancel',\n 'usage.resetDialogConfirm': 'Confirm reset',\n 'usage.resetDialogPending': 'Resetting…',\n 'usage.resetDialogClose': 'Close',\n 'usage.resetOutcomeReset': 'The current usage window has been reset and reset credits refreshed.',\n 'usage.resetOutcomeAlreadyRedeemed': 'This reset already took effect; usage has been refreshed.',\n 'usage.resetOutcomeNothingToReset': 'No window has reached its limit; no reset credit was consumed.',\n 'usage.resetOutcomeNoCredit': 'No reset credits available; nothing was reset.',\n 'usage.resetFailed': 'Reset failed. Try again later.',\n 'usage.magpieUsageLabel': 'Magpie usage, session and route',\n 'usage.magpieShortLabel': 'Magpie',\n 'usage.magpieTitle': 'Magpie usage',\n 'usage.magpieTodayScope': 'Today · all Magpie agents',\n 'usage.magpieTabUsage': 'Usage',\n 'usage.magpieTabRoute': 'Route + quota',\n 'usage.magpieAggregateTitle': 'Gateway usage',\n 'usage.magpieSessionTitle': 'This Agent session',\n 'usage.magpieSessionTodayTitle': 'This Agent session · today',\n 'usage.magpieRouteTitle': 'Latest route',\n 'usage.magpieUsageUnavailable': 'Magpie usage is unavailable.',\n 'usage.magpieRequests': 'Requests',\n 'usage.magpieErrors': 'Errors',\n 'usage.magpieInputTokens': 'Input tokens',\n 'usage.magpieOutputTokens': 'Output tokens',\n 'usage.magpieCacheReadTokens': 'Cache read',\n 'usage.magpieCacheWriteTokens': 'Cache written',\n 'usage.magpieTotalTokens': 'Input + output',\n 'usage.magpieCost': 'Estimated cost',\n 'usage.magpieCacheHitRate': 'Cache hit rate',\n 'usage.magpieAccountPolicies': 'Codex account controls',\n 'usage.magpieResetCountLabel': 'Reset cards',\n 'usage.magpieResetCount': '{count} reset cards',\n 'usage.magpieResetWhenWeek': 'Auto-use a reset when the weekly window is exhausted',\n 'usage.magpieResetBeforeExpiry': 'Auto-use a reset before it expires',\n 'usage.magpieUseCredits': 'Use credits after quota is exhausted',\n 'usage.magpieUseReset': 'Use one reset card',\n 'usage.magpieUpdated': 'Updated {time}',\n 'usage.magpieAgent': 'Agent: {agent}',\n 'usage.magpieSessionNoUsage': 'No matching session usage today.',\n 'usage.magpieSessionIdUnavailable': 'This Agent session cannot be linked to Magpie.',\n 'usage.magpieRouteUnavailable': 'Magpie route information is unavailable.',\n 'usage.magpieRouteNoRequests': 'Magpie has no route for this session yet.',\n 'usage.magpieAskedModel': 'Requested model',\n 'usage.magpieRouteGroup': 'Routing group',\n 'usage.magpieRouteRule': 'Routing rule',\n 'usage.magpieRouteAccount': 'Upstream account',\n 'usage.magpieRoutedModel': 'Current destination',\n 'usage.magpieServedModel': 'Model that replied',\n 'usage.magpieEffort': 'Reasoning level',\n 'usage.magpieRequestStatus': 'Request status',\n 'usage.magpieRouteDone': 'Complete · ',\n 'usage.magpieRouteRunning': 'In progress · ',\n 'usage.magpieAttempts': 'Attempts',\n 'usage.magpieUnknownModel': 'Model not provided',\n 'usage.magpieFallback': 'Fallback',\n 'usage.magpieQuotaTitle': 'Upstream quota',\n 'usage.magpieQuotaUnavailable': 'Magpie quota data is unavailable.',\n 'usage.magpieQuotaProviderUnavailable': 'The upstream provider for this session is not identified yet.',\n 'usage.magpieQuotaNoData': 'No quota was reported for the upstream provider.',\n 'usage.magpieQuotaNoWindows': 'No quota windows reported.',\n 'usage.magpieQuotaAccount': 'Account: {account}',\n 'usage.magpieQuotaBalance': 'Balance: {balance}',\n 'usage.magpieQuotaRemaining': '{name} remaining {percent}%',\n 'usage.magpieQuotaResets': 'Resets at {time}',\n 'usage.magpieRouteFlowTitle': 'Routing flow',\n 'usage.magpieRouteComplete': 'Completed',\n 'accountBar.userFallback': 'User',\n 'accountBar.connectionManageTitle': 'Connection management · Manage other DSH Hosts',\n 'accountBar.identityClickHint': '{identity} · Click to manage sign-in',\n 'accountBar.connectionManage': 'Connection management',\n 'accountBar.userAria': 'User: {identity}',\n 'accountBar.localAccount': '{identity} (local account)',\n 'accountBar.unknownAccount': 'Unrecognized account',\n 'accountBar.access': 'Access: {access}',\n 'accountBar.accessWithLatency': 'Access: {access} · {latency} ms',\n 'accountBar.memory': 'Memory',\n 'accountBar.hostCpu': 'Host CPU',\n 'accountBar.hostMemory': 'Host memory',\n 'accountBar.managePeerHost': 'Manage PeerHost',\n 'accountBar.managePeerHostHint': 'Connect and manage other DSH Hosts',\n 'accountBar.loggingOut': 'Signing out…',\n 'accountBar.logout': 'Sign out',\n 'accountBar.relay': 'Relay',\n 'accountBar.direct': 'Direct',\n // Magpie 订阅卡的签到状态、账号分组与重置卡文案。\n 'usage.checkinClaimed': 'Checked in today{credit} · {streak}',\n 'usage.checkinStreak': '{days}-day streak',\n 'usage.checkinFailed': 'Check-in failed',\n 'usage.checkinIneligible': 'This account does not take part in check-in',\n 'usage.checkinInactive': 'Check-in is not enabled',\n 'usage.checkinCaptcha': 'Check-in needs a captcha',\n 'usage.checkinOwnApp': 'Check in from the official app',\n 'usage.checkinPending': 'Not checked in yet today',\n 'usage.checkinUnknown': 'Check-in state unknown',\n 'usage.quotaActiveAccount': 'In use',\n 'usage.quotaGroupAccounts': '{count} accounts',\n 'usage.quotaCollapseAccounts': 'Collapse account details',\n 'usage.quotaExpandAccounts': 'Expand account details',\n 'usage.quotaDailyTotal': 'Today {amount}',\n 'usage.quotaPlanUntil': 'Plan until',\n 'usage.quotaReadFailed': 'Read failed: {reason}',\n 'usage.quotaRunsOut': 'At the current rate {amount} runs out {time}',\n 'usage.resetCardsLabel': 'Reset cards',\n 'usage.resetCardsByWindow': 'Resets · 5h {fiveHour} · weekly {weekly}',\n 'usage.resetCardsCount': '{count} reset cards',\n 'usage.resetCardsExpiresAt': 'Expires {time}',\n // 路由标题栏的“查看请求”入口与请求模态框;明细文案复用 magpie.* 词典。\n 'usage.magpieViewRequests': 'View requests',\n 'usage.magpieRequestsTitle': 'Magpie requests',\n 'usage.magpieRequestsClose': 'Close',\n}\n\nexport const zh: Record<string, string> = {\n 'usage.r4StatsPeriod': '账户用量 · UTC',\n 'usage.r4TodayIoTokens': '今日输入与输出 Token',\n 'usage.r4WeekRequests': '近 7 天请求数',\n 'usage.r4WeekIoTokens': '近 7 天输入与输出 Token',\n 'usage.r4WeekCost': '近 7 天费用',\n 'usage.r4ModelsWeek': '按模型统计 · 近 7 天',\n 'usage.r4TodayUsage': '今日账户用量(UTC)',\n 'usage.r4KeyRemainingLimit': 'Key 剩余 / 限额',\n 'usage.r4TodayCost': '今日费用(UTC)',\n 'usage.r4AccountSnapshot': '账户余额(快照)',\n 'usage.r4PackageBalance': '套餐余额',\n 'usage.r4WalletBalance': '钱包余额',\n 'usage.r4PackageExpiry': '最近套餐到期时间',\n 'usage.r4KeyQuota': '当前 Key · 终身消费限额',\n 'usage.r4KeyLimit': 'Key 限额',\n 'usage.r4NoLimit': 'Key 未设限',\n 'usage.r4KeySpent': 'Key 已结算消费',\n 'usage.r4KeyHeld': 'Key 请求中冻结金额',\n 'usage.r4KeyRemaining': 'Key 剩余额度(扣除冻结)',\n 'usage.r4AccountUsage': '账户用量 · 今日与近 7 天(UTC)',\n 'usage.r4inputTokens': '今日输入 Token',\n 'usage.r4outputTokens': '今日输出 Token',\n 'usage.r4cacheReadTokens': '今日缓存读取 Token',\n 'usage.r4cacheCreationTokens': '今日缓存写入 Token',\n 'usage.slotLabel': 'Agent 订阅余量',\n 'usage.remainingLabel': '{provider} 订阅余量 {percent}%',\n 'usage.upstreamBalanceLabel': '{provider} 上游余额 {amount}',\n 'usage.balanceLabel': '{provider} 余额 {amount}',\n 'usage.providerBalanceLabel': '{provider} 余量 {amount}',\n 'usage.providerBalancePlanLabel': '{provider} · {plan} · {amount}',\n 'usage.unavailable': '不可用',\n 'usage.upstreamNotProvided': '上游未提供',\n 'usage.available': '可用',\n 'usage.subscriptionRemaining': '订阅余量',\n 'usage.todayCostShort': '今日 {amount}',\n 'usage.accountBalance': '账户余额',\n 'usage.officialRemaining': '官方余量',\n 'usage.windowFiveHour': '5 小时额度',\n 'usage.windowWeekly': '周额度',\n 'usage.windowMonthly': '月额度',\n 'usage.quotaGroupGemini': 'Gemini 模型',\n 'usage.quotaGroupThirdParty': 'Claude 与 GPT 模型',\n 'usage.popoverSubscriptionUsage': '{provider} 订阅使用情况',\n 'usage.popoverSubscriptionTitle': '{provider} 订阅',\n 'usage.windowRemaining': '{label}剩余 {percent}%',\n 'usage.resetsIn': '重置于 {time}',\n 'usage.windowDays': '{count} 天额度',\n 'usage.windowHours': '{count} 小时额度',\n 'usage.windowMinutes': '{count} 分钟额度',\n 'usage.officialRemainingPopover': '{provider} 官方余量',\n 'usage.usedOfTotal': '已用 {used} / {total}',\n 'usage.usedShort': '已用 {amount}',\n 'usage.expiresIn': '{time}到期',\n 'usage.expired': '已到期',\n 'usage.noMoreStats': '暂无更多统计',\n 'usage.providerDetails': '上游详情',\n 'usage.keyStatus': 'API Key 状态',\n 'usage.keyActive': '有效',\n 'usage.keyExpired': '已过期',\n 'usage.providerAccountBalance': '{provider} 账户余额',\n 'usage.granted': '赠送 {amount}',\n 'usage.toppedUp': '充值 {amount}',\n 'usage.deepseekApiNote': '官方 DeepSeek API 当前只提供账户余额接口,暂无请求量、Token 或费用明细。',\n 'usage.upstreamUsageTitle': '{provider} 上游用量',\n 'usage.addressMissing': '地址未提供',\n 'usage.statTodayRequests': '今日请求数',\n 'usage.statTodayTokens': '今日 Token 用量',\n 'usage.statTodayCost': '今日费用',\n 'usage.statTotalRequests': '累计请求数',\n 'usage.statTotalTokens': '累计 Token 用量',\n 'usage.statTotalCost': '累计费用',\n 'usage.statTodayCacheHitRate': '今日缓存命中率',\n 'usage.statTotalCacheHitRate': '累计缓存命中率',\n 'usage.byModel': '按模型统计',\n 'usage.byDay': '按日统计',\n 'usage.noModelStats': '暂无按模型统计',\n 'usage.colModel': '模型',\n 'usage.colDate': '日期',\n 'usage.colRequests': '请求',\n 'usage.colToken': 'Token',\n 'usage.colCost': '费用',\n 'usage.colCache': '缓存',\n 'usage.newApiBalance': '余额',\n 'usage.newApiUsed': '已用',\n 'usage.newApiUnlimited': '无限额度',\n 'usage.providerDeepseekOfficial': 'DeepSeek 官方',\n 'usage.providerUpstream': '{name} 上游',\n 'usage.countdownDaysHours': '{days}天{hours}小时后',\n 'usage.countdownHoursMinutes': '{hours}小时{minutes}分钟后',\n 'usage.countdownHours': '{hours}小时后',\n 'usage.countdownMinutes': '{minutes}分钟后',\n 'usage.creditBalanceLabel': '剩余点数',\n 'usage.creditUnlimited': '不限',\n 'usage.resetCreditsLabel': '重置次数',\n 'usage.resetCreditsCount': '{count} 次',\n 'usage.resetCreditsExpiresAt': '{time}到期',\n 'usage.resetCreditsExpired': '已过期',\n 'usage.resetCreditsMore': '还有 {count} 张',\n 'usage.resetButton': '重置订阅',\n 'usage.resetTooltipReady': '消耗 1 次重置次数以立即恢复当前窗口',\n 'usage.resetTooltipNone': '没有可用的重置次数',\n 'usage.resetDialogTitle': '确认重置订阅用量',\n 'usage.resetDialogBody': '将消耗 1 次重置次数立即恢复当前用量窗口,剩余 {count} 次。此操作不可撤销,确定继续吗?',\n 'usage.resetDialogCancel': '取消',\n 'usage.resetDialogConfirm': '确认重置',\n 'usage.resetDialogPending': '正在重置…',\n 'usage.resetDialogClose': '关闭',\n 'usage.resetOutcomeReset': '已重置当前用量窗口,重置次数已更新。',\n 'usage.resetOutcomeAlreadyRedeemed': '该次重置此前已生效,已刷新最新用量。',\n 'usage.resetOutcomeNothingToReset': '当前没有达到限额的窗口,未消耗重置次数。',\n 'usage.resetOutcomeNoCredit': '没有可用的重置次数,未执行重置。',\n 'usage.resetFailed': '重置失败,请稍后重试。',\n 'usage.magpieUsageLabel': 'Magpie 用量、会话与路由',\n 'usage.magpieShortLabel': 'Magpie',\n 'usage.magpieTitle': 'Magpie 用量',\n 'usage.magpieTodayScope': '今日 · 所有 Magpie Agent',\n 'usage.magpieTabUsage': '用量',\n 'usage.magpieTabRoute': '路由 + 配额',\n 'usage.magpieAggregateTitle': '网关用量',\n 'usage.magpieSessionTitle': '当前 Agent 会话',\n 'usage.magpieSessionTodayTitle': '当前 Agent 会话 · 今日',\n 'usage.magpieRouteTitle': '最近路由',\n 'usage.magpieUsageUnavailable': '暂时无法读取 Magpie 用量。',\n 'usage.magpieRequests': '请求数',\n 'usage.magpieErrors': '失败数',\n 'usage.magpieInputTokens': '输入 Token',\n 'usage.magpieOutputTokens': '输出 Token',\n 'usage.magpieCacheReadTokens': '缓存读取',\n 'usage.magpieCacheWriteTokens': '缓存写入',\n 'usage.magpieTotalTokens': '输入 + 输出',\n 'usage.magpieCost': '预估费用',\n 'usage.magpieCacheHitRate': '缓存命中率',\n 'usage.magpieAccountPolicies': 'Codex 账号控制',\n 'usage.magpieResetCountLabel': '重置卡',\n 'usage.magpieResetCount': '{count} 张重置卡',\n 'usage.magpieResetWhenWeek': '周额度用尽时自动使用重置卡',\n 'usage.magpieResetBeforeExpiry': '重置卡到期前自动使用',\n 'usage.magpieUseCredits': '额度用尽后使用点数',\n 'usage.magpieUseReset': '使用一张重置卡',\n 'usage.magpieUpdated': '更新于 {time}',\n 'usage.magpieAgent': 'Agent:{agent}',\n 'usage.magpieSessionNoUsage': '今天还没有找到此会话的用量。',\n 'usage.magpieSessionIdUnavailable': '无法将当前 Agent 会话与 Magpie 对应。',\n 'usage.magpieRouteUnavailable': '暂时无法读取 Magpie 路由信息。',\n 'usage.magpieRouteNoRequests': 'Magpie 尚无此会话的路由记录。',\n 'usage.magpieAskedModel': '请求的模型',\n 'usage.magpieRouteGroup': '路由分组',\n 'usage.magpieRouteRule': '路由规则',\n 'usage.magpieRouteAccount': '上游账号',\n 'usage.magpieRoutedModel': '当前目标',\n 'usage.magpieServedModel': '实际响应模型',\n 'usage.magpieEffort': '推理强度',\n 'usage.magpieRequestStatus': '请求状态',\n 'usage.magpieRouteDone': '已完成 · ',\n 'usage.magpieRouteRunning': '进行中 · ',\n 'usage.magpieAttempts': '尝试记录',\n 'usage.magpieUnknownModel': '上游未提供模型名',\n 'usage.magpieFallback': '已回退',\n 'usage.magpieQuotaTitle': '上游配额',\n 'usage.magpieQuotaUnavailable': '暂时无法读取 Magpie 配额。',\n 'usage.magpieQuotaProviderUnavailable': '尚未识别此会话实际使用的上游提供商。',\n 'usage.magpieQuotaNoData': '上游提供商没有报告配额信息。',\n 'usage.magpieQuotaNoWindows': '上游没有报告配额窗口。',\n 'usage.magpieQuotaAccount': '账号:{account}',\n 'usage.magpieQuotaBalance': '余额:{balance}',\n 'usage.magpieQuotaRemaining': '{name} 剩余 {percent}%',\n 'usage.magpieQuotaResets': '重置于 {time}',\n 'usage.magpieRouteFlowTitle': '路由流转',\n 'usage.magpieRouteComplete': '已完成',\n 'accountBar.userFallback': '用户',\n 'accountBar.connectionManageTitle': '连接管理 · 管理其他 DSH Host',\n 'accountBar.identityClickHint': '{identity} · 点击管理登录',\n 'accountBar.connectionManage': '连接管理',\n 'accountBar.userAria': '用户:{identity}',\n 'accountBar.localAccount': '{identity}(本地账号)',\n 'accountBar.unknownAccount': '未识别账号',\n 'accountBar.access': '访问:{access}',\n 'accountBar.accessWithLatency': '访问:{access} · {latency} ms',\n 'accountBar.memory': '内存',\n 'accountBar.hostCpu': '主机 CPU',\n 'accountBar.hostMemory': '主机内存',\n 'accountBar.managePeerHost': '管理 PeerHost',\n 'accountBar.managePeerHostHint': '连接和管理其他 DSH Host',\n 'accountBar.loggingOut': '注销中…',\n 'accountBar.logout': '注销登录',\n 'accountBar.relay': '中转',\n 'accountBar.direct': '直连',\n // Magpie 订阅卡的签到状态、账号分组与重置卡文案。\n 'usage.checkinClaimed': '今日已签到{credit} · {streak}',\n 'usage.checkinStreak': '连续 {days} 天',\n 'usage.checkinFailed': '签到失败',\n 'usage.checkinIneligible': '该账号不参与签到',\n 'usage.checkinInactive': '未启用签到',\n 'usage.checkinCaptcha': '签到需要验证码',\n 'usage.checkinOwnApp': '请在官方 App 内签到',\n 'usage.checkinPending': '今日尚未签到',\n 'usage.checkinUnknown': '签到状态未知',\n 'usage.quotaActiveAccount': '使用中',\n 'usage.quotaGroupAccounts': '{count} 个账号',\n 'usage.quotaCollapseAccounts': '收起账号明细',\n 'usage.quotaExpandAccounts': '展开账号明细',\n 'usage.quotaDailyTotal': '今日 {amount}',\n 'usage.quotaPlanUntil': '套餐到期',\n 'usage.quotaReadFailed': '读取失败:{reason}',\n 'usage.quotaRunsOut': '按当前速度,{amount} 将在 {time} 耗尽',\n 'usage.resetCardsLabel': '重置卡',\n 'usage.resetCardsByWindow': '重置卡 · 5 小时 {fiveHour} · 每周 {weekly}',\n 'usage.resetCardsCount': '{count} 张重置卡',\n 'usage.resetCardsExpiresAt': '最近到期 {time}',\n // 路由标题栏的“查看请求”入口与请求模态框;明细文案复用 magpie.* 词典。\n 'usage.magpieViewRequests': '查看请求',\n 'usage.magpieRequestsTitle': 'Magpie 请求',\n 'usage.magpieRequestsClose': '关闭',\n}\n","/**\n * subagentCollapsed 域词典片段。\n *\n * 停止子 Agent 分组的专用文案;键名按 `<域>.<语义>` 规则加前缀,\n * 合并与命名空间注册由 ../locale.ts 统一完成,运行时的组件命名空间\n * 注册仍使用同一份 zh/en。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const zh = {\n 'subagentCollapsed.inactive.one': '已停止 {count} 个子智能体',\n 'subagentCollapsed.inactive.other': '已停止 {count} 个子智能体',\n 'subagentCollapsed.inactive.expand': '展开已停止的子智能体',\n 'subagentCollapsed.inactive.collapse': '收起已停止的子智能体',\n 'subagentCollapsed.count.total.one': '{count} 个子智能体',\n 'subagentCollapsed.count.total.other': '{count} 个子智能体',\n 'subagentCollapsed.count.running.one': '{count} 个子智能体,正在运行',\n 'subagentCollapsed.count.running.other': '{count} 个子智能体,正在运行',\n 'subagentCollapsed.activity.running': '正在运行',\n 'subagentCollapsed.activity.completed': '已完成',\n 'subagentCollapsed.activity.inactive': '当前未运行',\n 'subagentCollapsed.tokens.thousand': '{value}K',\n 'subagentCollapsed.tokens.million': '{value}M',\n 'subagentCollapsed.tokens.total': '{value} tok',\n 'subagentCollapsed.duration.seconds': '{seconds}秒',\n 'subagentCollapsed.duration.minutes': '{minutes}分{seconds}秒',\n 'subagentCollapsed.duration.hours': '{hours}小时{minutes}分{seconds}秒',\n 'subagentCollapsed.duration.days': '{days}天',\n 'subagentCollapsed.duration.daysHours': '{days}天{hours}小时',\n 'subagentCollapsed.duration.months': '{months}个月',\n 'subagentCollapsed.duration.monthsDays': '{months}个月{days}天',\n 'subagentCollapsed.duration.years': '{years}年',\n 'subagentCollapsed.duration.yearsMonths': '{years}年{months}个月',\n 'subagentCollapsed.duration.exactDays': '{days}天 {hours}:{minutes}:{seconds}',\n 'subagentCollapsed.duration.exactTitle': '用时 {duration}',\n 'subagentCollapsed.mode.oneShot': '一次性',\n 'subagentCollapsed.mode.continuable': '可继续',\n 'subagentCollapsed.mode.unknown': '模式未知',\n 'subagentCollapsed.branch.collapse': '收起 {label} 的下级子智能体',\n 'subagentCollapsed.branch.expand': '展开 {label} 的下级子智能体',\n 'subagentCollapsed.loading.label': '正在加载子智能体…',\n 'subagentCollapsed.loading.aria': '正在加载子智能体',\n 'subagentCollapsed.load.error': '无法加载子智能体',\n 'subagentCollapsed.retry': '重试',\n 'subagentCollapsed.diagnostic.corrupt': '会话记录损坏',\n 'subagentCollapsed.diagnostic.unsupported': '子智能体记录版本不受支持',\n 'subagentCollapsed.diagnostic.unavailable': '会话记录暂不可用',\n 'subagentCollapsed.tree.aria': '子智能体会话',\n 'subagentCollapsed.switcher.aria': '切换到 {title}',\n 'subagentCollapsed.open.sidebar': '在侧边栏打开',\n 'subagentCollapsed.open.sidebar.aria': '在侧边栏打开 {label}',\n}\n\nexport const en: Record<keyof typeof zh, string> = {\n 'subagentCollapsed.inactive.one': '{count} stopped subagent',\n 'subagentCollapsed.inactive.other': '{count} stopped subagents',\n 'subagentCollapsed.inactive.expand': 'Show stopped subagents',\n 'subagentCollapsed.inactive.collapse': 'Hide stopped subagents',\n 'subagentCollapsed.count.total.one': '{count} subagent',\n 'subagentCollapsed.count.total.other': '{count} subagents',\n 'subagentCollapsed.count.running.one': '{count} subagent running',\n 'subagentCollapsed.count.running.other': '{count} subagents running',\n 'subagentCollapsed.activity.running': 'running',\n 'subagentCollapsed.activity.completed': 'completed',\n 'subagentCollapsed.activity.inactive': 'not running',\n 'subagentCollapsed.tokens.thousand': '{value}K',\n 'subagentCollapsed.tokens.million': '{value}M',\n 'subagentCollapsed.tokens.total': '{value} tok',\n 'subagentCollapsed.duration.seconds': '{seconds}s',\n 'subagentCollapsed.duration.minutes': '{minutes}m {seconds}s',\n 'subagentCollapsed.duration.hours': '{hours}h {minutes}m {seconds}s',\n 'subagentCollapsed.duration.days': '{days}d',\n 'subagentCollapsed.duration.daysHours': '{days}d {hours}h',\n 'subagentCollapsed.duration.months': '{months}mo',\n 'subagentCollapsed.duration.monthsDays': '{months}mo {days}d',\n 'subagentCollapsed.duration.years': '{years}y',\n 'subagentCollapsed.duration.yearsMonths': '{years}y {months}mo',\n 'subagentCollapsed.duration.exactDays': '{days}d {hours}:{minutes}:{seconds}',\n 'subagentCollapsed.duration.exactTitle': 'Duration {duration}',\n 'subagentCollapsed.mode.oneShot': 'one-shot',\n 'subagentCollapsed.mode.continuable': 'continuable',\n 'subagentCollapsed.mode.unknown': 'unknown mode',\n 'subagentCollapsed.branch.collapse': 'Collapse {label} descendants',\n 'subagentCollapsed.branch.expand': 'Expand {label} descendants',\n 'subagentCollapsed.loading.label': 'Loading subagents…',\n 'subagentCollapsed.loading.aria': 'Loading subagents',\n 'subagentCollapsed.load.error': 'Unable to load subagents',\n 'subagentCollapsed.retry': 'Retry',\n 'subagentCollapsed.diagnostic.corrupt': 'corrupted session record',\n 'subagentCollapsed.diagnostic.unsupported': 'unsupported subagent record version',\n 'subagentCollapsed.diagnostic.unavailable': 'session record temporarily unavailable',\n 'subagentCollapsed.tree.aria': 'Subagent sessions',\n 'subagentCollapsed.switcher.aria': 'Switch to {title}',\n 'subagentCollapsed.open.sidebar': 'Open in sidebar',\n 'subagentCollapsed.open.sidebar.aria': 'Open {label} in sidebar',\n}\n","/** Shared by the client dictionary and the isolated credential landing page. */\nexport const quickAppBootstrapEn = {\n 'quickApps.opening': 'Opening application…',\n 'quickApps.bootstrapFailed': 'Application access could not be established. Reopen it from Quick Apps and check browser cookie settings.',\n}\nexport const quickAppBootstrapZh: Record<keyof typeof quickAppBootstrapEn, string> = {\n 'quickApps.opening': '正在打开应用…',\n 'quickApps.bootstrapFailed': '无法建立应用访问,请从快捷应用重新打开并检查浏览器 Cookie 设置。',\n}\n","import { quickAppBootstrapEn, quickAppBootstrapZh } from '../../shared/quick-apps-bootstrap-locale.js'\n\nexport const en = {\n 'quickApps.storagePreview': 'App data is saved in this browser. IndexedDB and URLs starting with / are not supported in this view.',\n 'quickApps.storageFailed': 'App data could not be saved in this browser: {message}',\n 'quickApps.sandboxPreview': 'Workspace preview. Browser storage and URLs starting with / may not work in this view.',\n 'quickApps.runtime.not-configured': 'This Host does not provide workspace HTML previews. Update its CodingNS plugin and reopen the shortcut.',\n 'quickApps.runtime.config-invalid': 'The Host’s HTML hosting configuration or TLS certificate is invalid.',\n 'quickApps.runtime.lan-stopped': 'Start LAN access on the owning Host to open this HTML app.',\n 'quickApps.runtime.ui-not-allowed': 'This DSH address is not enabled in the Host’s HTML hosting configuration.',\n 'quickApps.runtime.ports-exhausted': 'The reserved app ports have all been used. Extend the Host’s app port range; previously used ports cannot be reassigned.',\n 'quickApps.runtime.ports-busy': 'The available app ports are currently in use. Try again after they are released.',\n 'quickApps.workspaceAccessHelp': 'Saving lets this app read, create, update and delete files in {workspace}. Hidden files, credentials and other workspaces stay protected.',\n 'quickApps.saveWorkspaceAccess': 'Save and allow workspace access',\n 'quickApps.workspaceAccessHostUpdate': 'This Host needs an update to support workspace access. The shortcut was saved without enabling it.',\n 'quickApps.workspaceAccessUnavailable': 'Update the owning Host to support workspace access. The shortcut was not changed.',\n 'quickApps.markdown': 'Markdown', 'quickApps.source': 'Source', 'quickApps.viewMode': 'View as',\n 'quickApps.markdownUnavailable': 'Native Markdown preview is unavailable in this DSH version. Showing source.',\n 'quickApps.maximize': 'Maximize viewer', 'quickApps.restore': 'Restore viewer', 'quickApps.loadingDocument': 'Loading…',\n 'quickApps.documentEditor': 'Document editor', 'quickApps.editorFailed': 'The editor could not load.',\n 'quickApps.copyCode': 'Copy code', 'quickApps.copied': 'Copied', 'quickApps.code': 'Code', 'quickApps.footnotes': 'Footnotes', 'quickApps.unwrapText': 'Disable wrapping',\n 'quickApps.imagesUnavailable': 'Some images are unavailable or outside this document folder.',\n 'quickApps.documentHome': 'Back to entry document', 'quickApps.documentLinkDenied': 'This link is outside the document folder or uses an unsupported path.',\n 'quickApps.documentHostUpdate': 'Update the owning Host plugin to enable document operations. This document remains viewable.',\n 'quickApps.documentConflict': 'The file changed on the Host. Your draft is preserved. Copy your changes before reloading the latest file.',\n 'quickApps.documentAccessExpired': 'Document access has ended or is unavailable. Your draft is preserved; copy it before closing and reopening the shortcut.',\n 'quickApps.documentSaved': 'Saved to the workspace.', 'quickApps.unsaved': 'Unsaved changes',\n 'quickApps.allowEditing': 'Allow editing', 'quickApps.allowEditingHelp': 'Allow changes to {path}? This approval applies only to this file and ends when you close the viewer.',\n 'quickApps.discardTitle': 'Unsaved changes', 'quickApps.discard': 'Discard changes', 'quickApps.discardHelp': 'Your changes to {path} have not been saved. Discard them and continue?',\n 'quickApps.viewerTools': 'Viewer controls', 'quickApps.wrapText': 'Wrap text', 'quickApps.reloadView': 'Reload', 'quickApps.entryAddress': 'Application entry address',\n 'quickApps.noWorkspaces': 'No managed workspaces available', 'quickApps.browse': 'Browse…',\n 'quickApps.chooseFile': 'Choose a workspace file', 'quickApps.useFile': 'Use this file', 'quickApps.currentFolder': 'Current folder',\n 'quickApps.parentFolder': 'Go to parent folder',\n 'quickApps.refreshFiles': 'Refresh', 'quickApps.loadingFiles': 'Loading files…', 'quickApps.emptyFolder': 'This folder has no selectable files or folders.',\n 'quickApps.filesTruncated': 'Only the first part of this folder is shown. You can enter the file path directly.',\n 'quickApps.selectFileHint': 'Open a folder, then select an HTML application or text document.',\n 'quickApps.browseUnavailable': 'File browsing is unavailable on this Host. You can still enter a workspace-relative file path.',\n 'quickApps.browseHostUpdateRequired': 'This Host does not support file browsing. Update or reload its CodingNS plugin, then refresh this page. You can still enter a workspace-relative file path.',\n ...quickAppBootstrapEn,\n 'quickApps.manage': 'Edit shortcuts', 'quickApps.done': 'Done', 'quickApps.editShortcut': 'Edit shortcut',\n 'quickApps.collapseBar': 'Collapse Quick Apps', 'quickApps.expandBar': 'Restore Quick Apps', 'quickApps.removeNamed': 'Remove {title}',\n 'quickApps.reorderHelp': 'Drag to reorder, or use Alt + arrow keys.', 'quickApps.reordered': 'Shortcut order saved.',\n 'quickApps.manageHelp': 'Choose a shortcut to edit its source, permissions or remove it.',\n 'quickApps.openNamed': 'Open {title}', 'quickApps.editNamed': 'Edit {title}',\n 'quickApps.count': 'Shortcuts: {count}', 'quickApps.loading': 'Loading shortcuts…', 'quickApps.retry': 'Try again',\n 'quickApps.emptyTitle': 'Your workspace, one click away',\n 'quickApps.advanced': 'Advanced options', 'quickApps.accessAndRemoval': 'Access and shortcut management',\n 'quickApps.titleHelp': 'Leave blank to use the file or application folder name.',\n 'quickApps.entryHelp': 'Choose a file or enter its path within the workspace.',\n 'quickApps.entryPlaceholder': 'apps/calendar/index.html',\n 'quickApps.entryRequired': 'Enter an application or document file path.', 'quickApps.orderInvalid': 'Use a whole number for the list order.',\n 'quickApps.saved': 'Shortcut saved.', 'quickApps.revoked': 'File access revoked. Existing launches have closed.',\n 'quickApps.saveBeforeAccess': 'Save your changes before managing access or removing this shortcut.',\n 'quickApps.conflict': 'This shortcut changed elsewhere. Your edits are still here; reopen the shortcut to load the latest version.',\n 'quickApps.order': 'List order', 'quickApps.mounts': 'Additional resource folders (optional)',\n 'quickApps.mount.urlPrefix': 'App URL path', 'quickApps.mount.workspacePath': 'Workspace folder',\n 'quickApps.addMount': 'Add resource folder', 'quickApps.removeMount': 'Remove resource folder',\n 'quickApps.title': 'Quick Apps', 'quickApps.description': 'Open workspace HTML applications and text documents without a conversation.',\n 'quickApps.close': 'Close Quick Apps', 'quickApps.back': 'Back to shortcuts', 'quickApps.application': 'Workspace application',\n 'quickApps.add': 'Add shortcut', 'quickApps.open': 'Open', 'quickApps.edit': 'Edit', 'quickApps.remove': 'Remove shortcut',\n 'quickApps.permissions': 'File permissions', 'quickApps.revoke': 'Revoke access', 'quickApps.save': 'Save', 'quickApps.cancel': 'Cancel',\n 'quickApps.titleField': 'Title', 'quickApps.entryPath': 'Entry file', 'quickApps.documentRoot': 'Application folder',\n 'quickApps.workspace': 'Workspace', 'quickApps.chooseWorkspace': 'Choose a managed workspace', 'quickApps.localHost': 'This Host',\n 'quickApps.kind': 'Open as', 'quickApps.html': 'HTML application', 'quickApps.text': 'Text document',\n 'quickApps.networkAllow': 'Local addresses',\n 'quickApps.networkAllowHelp': 'Leave this empty to block loopback, private networks, link-local addresses, and cloud metadata. Add one local IP, CIDR range, or hostname per line, up to 16. Examples: 127.0.0.1, localhost, 192.168.1.0/24.',\n 'quickApps.networkAllowPlaceholder': '127.0.0.1\\nlocalhost\\n192.168.1.0/24',\n 'quickApps.networkAllowInvalid': 'Use a local IP address, CIDR range, or hostname, with one entry per line.',\n 'quickApps.spa': 'Use the entry page for application navigation',\n 'quickApps.pathHelp': 'Enter workspace-relative paths. Use a dedicated application folder; an empty folder path selects the workspace root.',\n 'quickApps.empty': 'No shortcuts yet. In edit mode, add an HTML application or text document from a managed workspace.',\n 'quickApps.removeHelp': 'Removing a shortcut leaves its source files intact.',\n 'quickApps.permissionHelp': 'Optional file access for the next launch. Enter comma-separated workspace-relative folders; leave blank to deny. Approvals expire when the Host restarts or the shortcut or application code changes. Saving closes existing launches.',\n 'quickApps.permission.read': 'Read folders', 'quickApps.permission.write': 'Create and update folders', 'quickApps.permission.delete': 'Delete files in folders',\n 'quickApps.permissionsSaved': 'Permissions saved for the next launch.',\n 'quickApps.unavailable': 'HTML preview is unavailable on this Host connection. Update the owning Host plugin and reopen the shortcut.',\n 'quickApps.status.unsupported-runtime': 'HTML preview is unavailable on this Host connection.',\n 'quickApps.status.disconnected-host': 'The owning Host has no supported Quick Apps connection.',\n 'quickApps.status.unsupported-connection': 'This PeerHost relay cannot open Quick Apps. Use a direct connection to the owning Host.',\n 'quickApps.status.missing-workspace': 'The original workspace is unavailable.',\n 'quickApps.status.missing-file': 'The entry file or application folder is missing or cannot be accessed.',\n}\nexport const zh: Record<keyof typeof en, string> = {\n 'quickApps.storagePreview': '应用数据保存在当前浏览器中。此视图不支持 IndexedDB 和以 / 开头的网址。',\n 'quickApps.storageFailed': '无法在当前浏览器中保存应用数据:{message}',\n 'quickApps.sandboxPreview': '工作区预览:浏览器存储和以 / 开头的网址可能无法在此视图中使用。',\n 'quickApps.runtime.not-configured': '此主机尚不支持工作区 HTML 预览,请更新其 CodingNS 插件后重新打开快捷方式。',\n 'quickApps.runtime.config-invalid': '主机的 HTML 托管配置或 TLS 证书无效。',\n 'quickApps.runtime.lan-stopped': '请先在所属主机启动局域网访问,再打开此 HTML 应用。',\n 'quickApps.runtime.ui-not-allowed': '主机的 HTML 托管配置尚未启用当前 DSH 地址。',\n 'quickApps.runtime.ports-exhausted': '预留的应用端口已全部使用,请扩展主机的应用端口范围;已用端口不能重新分配。',\n 'quickApps.runtime.ports-busy': '可用的应用端口正被占用,请在端口释放后重试。',\n 'quickApps.workspaceAccessHelp': '保存后,此应用可读取、新建、修改和删除 {workspace} 中的文件。隐藏文件、凭据和其他工作区仍受保护。',\n 'quickApps.saveWorkspaceAccess': '保存并允许访问工作区',\n 'quickApps.workspaceAccessHostUpdate': '所属主机需要更新才能支持工作区访问。快捷方式已保存,但尚未启用此权限。',\n 'quickApps.workspaceAccessUnavailable': '请更新所属主机以支持工作区访问。快捷方式未更改。',\n 'quickApps.markdown': 'Markdown', 'quickApps.source': '源码', 'quickApps.viewMode': '查看方式',\n 'quickApps.markdownUnavailable': '当前 DSH 版本不支持原生 Markdown 预览,已显示源码。',\n 'quickApps.maximize': '最大化查看器', 'quickApps.restore': '还原查看器', 'quickApps.loadingDocument': '正在加载…',\n 'quickApps.documentEditor': '文档编辑器', 'quickApps.editorFailed': '编辑器加载失败。',\n 'quickApps.copyCode': '复制代码', 'quickApps.copied': '已复制', 'quickApps.code': '代码', 'quickApps.footnotes': '脚注', 'quickApps.unwrapText': '关闭自动换行',\n 'quickApps.imagesUnavailable': '部分图片不可用或位于文档目录之外。',\n 'quickApps.documentHome': '返回入口文档', 'quickApps.documentLinkDenied': '链接位于文档目录之外或使用了不支持的路径。',\n 'quickApps.documentHostUpdate': '请更新所属主机插件以启用文档操作,当前文档仍可查看。',\n 'quickApps.documentConflict': '主机上的文件已更改,你的草稿仍然保留。请先复制修改内容,再重新加载最新文件。',\n 'quickApps.documentAccessExpired': '文档访问已结束或不可用,草稿仍然保留。请先复制草稿,再关闭并重新打开快捷方式。',\n 'quickApps.documentSaved': '已保存到工作区。', 'quickApps.unsaved': '有未保存的修改',\n 'quickApps.allowEditing': '允许编辑', 'quickApps.allowEditingHelp': '允许修改 {path} 吗?本次授权仅适用于此文件,关闭查看器后失效。',\n 'quickApps.discardTitle': '有未保存的修改', 'quickApps.discard': '放弃修改', 'quickApps.discardHelp': '对 {path} 的修改尚未保存。是否放弃修改并继续?',\n 'quickApps.viewerTools': '查看器工具', 'quickApps.wrapText': '自动换行', 'quickApps.reloadView': '重新加载', 'quickApps.entryAddress': '应用入口地址',\n 'quickApps.noWorkspaces': '暂无可用的受管工作区', 'quickApps.browse': '浏览…',\n 'quickApps.chooseFile': '选择工作区文件', 'quickApps.useFile': '使用此文件', 'quickApps.currentFolder': '当前目录',\n 'quickApps.parentFolder': '返回上级目录',\n 'quickApps.refreshFiles': '刷新', 'quickApps.loadingFiles': '正在加载文件…', 'quickApps.emptyFolder': '此目录没有可选择的文件或文件夹。',\n 'quickApps.filesTruncated': '当前仅显示部分内容,也可直接填写文件路径。',\n 'quickApps.selectFileHint': '打开文件夹,再选择 HTML 应用或文本文档。',\n 'quickApps.browseUnavailable': '此主机暂不支持文件浏览,仍可填写相对于工作区的文件路径。',\n 'quickApps.browseHostUpdateRequired': '此主机尚不支持文件浏览。请更新或重新加载该主机的 CodingNS 插件后刷新页面,也可直接填写相对于工作区的文件路径。',\n ...quickAppBootstrapZh,\n 'quickApps.manage': '编辑快捷应用', 'quickApps.done': '完成', 'quickApps.editShortcut': '编辑快捷方式',\n 'quickApps.collapseBar': '收起快捷应用', 'quickApps.expandBar': '展开快捷应用', 'quickApps.removeNamed': '移除{title}',\n 'quickApps.reorderHelp': '拖动调整顺序,或使用 Alt + 方向键。', 'quickApps.reordered': '快捷应用顺序已保存。',\n 'quickApps.manageHelp': '选择快捷应用,修改来源、设置权限或移除快捷方式。',\n 'quickApps.openNamed': '打开{title}', 'quickApps.editNamed': '编辑{title}',\n 'quickApps.count': '{count} 个快捷应用', 'quickApps.loading': '正在加载快捷应用…', 'quickApps.retry': '重试',\n 'quickApps.emptyTitle': '一键打开工作区里的应用与文档',\n 'quickApps.advanced': '高级选项', 'quickApps.accessAndRemoval': '访问与快捷方式管理',\n 'quickApps.titleHelp': '留空则使用文件名或应用目录名。',\n 'quickApps.entryHelp': '选择文件,或填写它在工作区内的路径。',\n 'quickApps.entryPlaceholder': 'apps/calendar/index.html',\n 'quickApps.entryRequired': '请填写应用或文档的文件路径。', 'quickApps.orderInvalid': '列表顺序请填写整数。',\n 'quickApps.saved': '快捷方式已保存。', 'quickApps.revoked': '文件访问权限已撤销,已打开的应用已关闭。',\n 'quickApps.saveBeforeAccess': '请先保存修改,再管理访问权限或移除此快捷方式。',\n 'quickApps.conflict': '此快捷方式已在其他位置更新。你的修改仍保留在此处,重新打开快捷方式可加载最新版本。',\n 'quickApps.order': '列表顺序', 'quickApps.mounts': '附加资源目录(可选)',\n 'quickApps.mount.urlPrefix': '应用网址路径', 'quickApps.mount.workspacePath': '工作区目录',\n 'quickApps.addMount': '添加资源目录', 'quickApps.removeMount': '移除资源目录',\n 'quickApps.title': '快捷应用', 'quickApps.description': '无需打开会话,即可访问工作区内的 HTML 应用和文本文档。',\n 'quickApps.close': '关闭快捷应用', 'quickApps.back': '返回快捷列表', 'quickApps.application': '工作区应用',\n 'quickApps.add': '添加快捷方式', 'quickApps.open': '打开', 'quickApps.edit': '编辑', 'quickApps.remove': '移除快捷方式',\n 'quickApps.permissions': '文件权限', 'quickApps.revoke': '撤销访问', 'quickApps.save': '保存', 'quickApps.cancel': '取消',\n 'quickApps.titleField': '名称', 'quickApps.entryPath': '入口文件', 'quickApps.documentRoot': '应用目录',\n 'quickApps.workspace': '工作区', 'quickApps.chooseWorkspace': '选择受管工作区', 'quickApps.localHost': '当前主机',\n 'quickApps.kind': '打开方式', 'quickApps.html': 'HTML 应用', 'quickApps.text': '文本文档',\n 'quickApps.networkAllow': '允许的本地地址',\n 'quickApps.networkAllowHelp': '留空则拒绝回环、私网、链路本地和云元数据地址。每行填写一个本地 IP、CIDR 网段或主机名,最多 16 个。例如 127.0.0.1、localhost、192.168.1.0/24。',\n 'quickApps.networkAllowPlaceholder': '127.0.0.1\\nlocalhost\\n192.168.1.0/24',\n 'quickApps.networkAllowInvalid': '请逐行填写本地 IP、CIDR 网段或主机名。',\n 'quickApps.spa': '应用内导航使用入口页面',\n 'quickApps.pathHelp': '填写相对于工作区的路径。建议使用专用应用目录;目录留空表示工作区根目录。',\n 'quickApps.empty': '还没有快捷方式。可在编辑模式下从受管工作区添加 HTML 应用或文本文档。',\n 'quickApps.removeHelp': '移除快捷方式不会删除源文件。',\n 'quickApps.permissionHelp': '为下次打开应用设置可选文件权限。填写相对于工作区的目录,以逗号分隔;留空表示禁止。主机重启、快捷方式或应用代码变更后需要重新授权。保存会关闭现有应用。',\n 'quickApps.permission.read': '允许读取的目录', 'quickApps.permission.write': '允许创建和更新的目录', 'quickApps.permission.delete': '允许删除文件的目录',\n 'quickApps.permissionsSaved': '已保存下次打开应用时使用的权限。',\n 'quickApps.unavailable': '当前主机连接暂不支持 HTML 预览,请更新所属主机插件后重新打开快捷方式。',\n 'quickApps.status.unsupported-runtime': '当前主机连接暂不支持 HTML 预览。',\n 'quickApps.status.disconnected-host': '所属主机暂不支持快捷应用连接。',\n 'quickApps.status.unsupported-connection': '此 PeerHost 中转连接无法打开快捷应用,请使用直连方式连接所属主机。',\n 'quickApps.status.missing-workspace': '原工作区不可用。',\n 'quickApps.status.missing-file': '入口文件或应用目录不存在或无法访问。',\n}\n","export const en: Record<string, string> = {\n 'cli.team.label': 'Team eligibility',\n 'cli.team.leadAndMember': 'Collaborator and Lead',\n 'cli.team.member': 'Collaborator',\n 'cli.team.reason.version': 'Full Team support requires a verified DSH alpha.2 or alpha.3 host.',\n 'cli.team.reason.profile': 'Enable the native DSH Team profile to use Teams.',\n 'cli.team.reason.disabled': 'Enable the CodingNS bridge and this Agent to use Teams.',\n 'cli.team.reason.adapter': 'This Agent does not provide the required Team tool transport.',\n 'cli.team.reason.installation': 'Install and enable this Agent before using Teams.',\n 'cli.manage.reasonLabel.application-managed': 'Check in app',\n 'cli.manage.reasonLabel.unknown-version': 'Version unknown',\n 'cli.manage.reasonLabel.legacy-distribution': 'Legacy distribution',\n 'cli.manage.reasonLabel.no-release-source': 'No verified feed',\n 'cli.manage.reasonLabel.incomparable-version': 'Different release channel',\n 'cli.manage.reason.application-managed': 'This Agent is managed by its application. No comparable runtime release feed is verified; use the application’s Check for Updates.',\n 'cli.manage.reason.unknown-version': 'The installed version could not be identified. Re-detect the Agent before comparing releases.',\n 'cli.manage.reason.legacy-distribution': 'This legacy distribution has no comparable current release feed. See the official migration guide.',\n 'cli.manage.reason.no-release-source': 'No verified release feed is available for this installation and platform. See the official guide.',\n 'cli.manage.reason.incomparable-version': 'The installed and published versions use different release channels and cannot be compared safely.',\n 'cli.manage.availableInApp': 'Version {version} is available. Complete the update in {name}.',\n 'cli.manage.updateInApp': 'Update in app',\n 'cli.manage.open': 'Manage external Agents',\n 'cli.manage.listTitle': 'External Agents',\n 'cli.manage.details': 'Details',\n 'cli.manage.methodUnknown': 'No supported automatic updater was identified for this installation. Re-detect to retry, or follow the official guide below.',\n 'cli.manage.hostUnsupported': 'This Host has not loaded update checking. Reload the Host with the current plugin, then refresh this list.',\n 'cli.manage.state.unchecked': 'Not checked',\n 'cli.manage.state.checking': 'Checking…',\n 'cli.manage.state.current': 'Up to date',\n 'cli.manage.state.unavailable': 'Check manually',\n 'cli.manage.state.error': 'Check failed',\n 'cli.manage.failure.timeout': 'Release check timed out. Refresh to retry.',\n 'cli.manage.failure.network': 'Could not reach the release source. Check the Host network and refresh.',\n 'cli.manage.failure.http': 'The release source returned HTTP {status}. Refresh to retry.',\n 'cli.manage.failure.invalid-response': 'The release source returned invalid metadata. Use the official guide.',\n 'cli.manage.install': 'Install',\n 'cli.manage.update': 'Update',\n 'cli.manage.unchecked': 'Use Refresh to check for updates',\n 'cli.manage.checking': 'Checking for updates…',\n 'cli.manage.available': 'Update available: {version}',\n 'cli.manage.current': 'No newer release found',\n 'cli.manage.unavailable': 'No comparable release found. Check the official update guide.',\n 'cli.manage.error': 'Update check failed. Refresh to retry.',\n 'cli.manage.title': '{action} {name}',\n 'cli.manage.host': 'Target Host: {name} ({platform})',\n 'cli.manage.loading': 'Checking the Agent and official methods…',\n 'cli.manage.review': 'Review the command and prerequisites. It runs on this Host with your user account. Updates may require restarting Agent sessions.',\n 'cli.manage.source': 'Official installation and update guide',\n 'cli.manage.run': 'Run {action}',\n 'cli.manage.running': 'Running…',\n 'cli.manage.result.running': '{action} in progress',\n 'cli.manage.result.succeeded': '{action} completed',\n 'cli.manage.result.failed': '{action} failed',\n 'cli.manage.result.cancelled': '{action} cancelled',\n 'cli.manage.log.running': 'Live',\n 'cli.manage.log.succeeded': 'Completed',\n 'cli.manage.log.failed': 'Failed',\n 'cli.manage.log.cancelled': 'Cancelled',\n 'cli.manage.waitingOutput': 'Waiting for output…',\n 'cli.manage.emptyOutput': 'The command produced no output.',\n 'cli.manage.latestOutput': 'Jump to latest ↓',\n 'cli.manage.catalog.refreshing': 'Refreshing the Agent list…',\n 'cli.manage.catalog.refreshed': 'Agent list refreshed with the detected version.',\n 'cli.manage.catalog.failed': 'The update succeeded, but the Agent list could not be refreshed.',\n 'cli.manage.refreshList': 'Refresh list',\n 'cli.manage.succeeded': 'Command completed. Detected version: {version}',\n 'cli.manage.failed': 'The operation failed.',\n 'cli.manage.cancelled': 'The operation was cancelled.',\n 'cli.manage.cancel': 'Cancel operation',\n 'cli.manage.close': 'Close',\n 'cli.manage.redetect': 'Re-detect installation',\n 'cli.manage.output': 'Command output',\n 'cli.manage.background': 'You can close this dialog and return to this Agent to see the result.',\n 'cli.manage.otherBusy': 'Another Agent operation is running on this Host: {name}',\n 'cli.manage.retryStatus': 'Retry status',\n 'cli.manage.reviewAgain': 'Review another operation',\n}\n\nexport const zh: Record<string, string> = {\n 'cli.team.label': '团队适配能力',\n 'cli.team.leadAndMember': '协作者和管理者',\n 'cli.team.member': '协作者',\n 'cli.team.reason.version': '完整团队功能需要经过验证的 DSH alpha.2 或 alpha.3 主机。',\n 'cli.team.reason.profile': '请启用 DSH 原生团队配置后使用团队功能。',\n 'cli.team.reason.disabled': '请启用 CodingNS 桥接和此 Agent 后使用团队功能。',\n 'cli.team.reason.adapter': '此 Agent 尚未提供所需的团队工具通道。',\n 'cli.team.reason.installation': '请先安装并启用此 Agent,再使用团队功能。',\n 'cli.manage.reasonLabel.application-managed': '在应用中检查',\n 'cli.manage.reasonLabel.unknown-version': '版本未知',\n 'cli.manage.reasonLabel.legacy-distribution': '旧版发行包',\n 'cli.manage.reasonLabel.no-release-source': '暂无可用版本源',\n 'cli.manage.reasonLabel.incomparable-version': '版本通道不同',\n 'cli.manage.reason.application-managed': '此 Agent 由所属应用管理,尚未验证可比较的运行时版本源,请使用应用内的“检查更新”。',\n 'cli.manage.reason.unknown-version': '无法识别已安装版本,请重新检测 Agent 后再比较版本。',\n 'cli.manage.reason.legacy-distribution': '此旧版发行包没有可比较的当前版本源,请查看官方迁移指南。',\n 'cli.manage.reason.no-release-source': '此安装和平台尚无经过验证的版本源,请查看官方指南。',\n 'cli.manage.reason.incomparable-version': '已安装版本与发布版本属于不同通道,无法可靠比较。',\n 'cli.manage.availableInApp': '发现版本 {version},请在 {name} 中完成更新。',\n 'cli.manage.updateInApp': '在应用中更新',\n 'cli.manage.open': '管理外部 Agent',\n 'cli.manage.listTitle': '外部 Agent',\n 'cli.manage.details': '详情',\n 'cli.manage.methodUnknown': '未能识别此安装的自动更新方式。可重新检测重试,或查看下方官方指南。',\n 'cli.manage.hostUnsupported': '此主机尚未加载更新检查功能。请让主机加载当前插件后,再刷新列表。',\n 'cli.manage.state.unchecked': '未检查更新',\n 'cli.manage.state.checking': '检查中…',\n 'cli.manage.state.current': '已是最新',\n 'cli.manage.state.unavailable': '需手动检查',\n 'cli.manage.state.error': '检查失败',\n 'cli.manage.failure.timeout': '版本检查超时,请刷新重试。',\n 'cli.manage.failure.network': '无法连接版本来源,请检查主机网络后刷新。',\n 'cli.manage.failure.http': '版本来源返回 HTTP {status},请刷新重试。',\n 'cli.manage.failure.invalid-response': '版本来源返回的数据无效,请查看官方指南。',\n 'cli.manage.install': '安装',\n 'cli.manage.update': '更新',\n 'cli.manage.unchecked': '点击刷新检查更新',\n 'cli.manage.checking': '正在检查更新…',\n 'cli.manage.available': '有新版本:{version}',\n 'cli.manage.current': '未发现更新版本',\n 'cli.manage.unavailable': '未找到可比较的版本,请查看官方更新指南。',\n 'cli.manage.error': '检查更新失败,请刷新重试。',\n 'cli.manage.title': '{action} {name}',\n 'cli.manage.host': '目标主机:{name}({platform})',\n 'cli.manage.loading': '正在检查 Agent 和官方安装方式…',\n 'cli.manage.review': '请核对命令和前置要求。命令将以当前用户在此主机上执行,更新后可能需要重新开启 Agent 会话。',\n 'cli.manage.source': '官方安装与更新指南',\n 'cli.manage.run': '执行{action}',\n 'cli.manage.running': '正在执行…',\n 'cli.manage.result.running': '正在{action}',\n 'cli.manage.result.succeeded': '{action}成功',\n 'cli.manage.result.failed': '{action}失败',\n 'cli.manage.result.cancelled': '已取消{action}',\n 'cli.manage.log.running': '实时输出',\n 'cli.manage.log.succeeded': '已完成',\n 'cli.manage.log.failed': '失败',\n 'cli.manage.log.cancelled': '已取消',\n 'cli.manage.waitingOutput': '等待命令输出…',\n 'cli.manage.emptyOutput': '命令未产生输出。',\n 'cli.manage.latestOutput': '跳至最新 ↓',\n 'cli.manage.catalog.refreshing': '正在刷新 Agent 列表…',\n 'cli.manage.catalog.refreshed': 'Agent 列表已刷新,当前显示检测到的新版本。',\n 'cli.manage.catalog.failed': '更新已成功,但 Agent 列表刷新失败。',\n 'cli.manage.refreshList': '刷新列表',\n 'cli.manage.succeeded': '命令已完成,检测到版本:{version}',\n 'cli.manage.failed': '操作失败。',\n 'cli.manage.cancelled': '操作已取消。',\n 'cli.manage.cancel': '取消操作',\n 'cli.manage.close': '关闭',\n 'cli.manage.redetect': '重新检测安装',\n 'cli.manage.output': '命令输出',\n 'cli.manage.background': '可以关闭此窗口,稍后再次打开此 Agent 查看结果。',\n 'cli.manage.otherBusy': '此主机上的另一个 Agent 操作正在执行:{name}',\n 'cli.manage.retryStatus': '重新查询状态',\n 'cli.manage.reviewAgain': '查看新的操作',\n}\n","/** Copy for the optional Magpie usage dashboard. */\nexport const en: Record<string, string> = {\n 'feature.magpieManagement.label': 'Magpie management and usage',\n 'feature.magpieManagement.description': 'Enable to add a separate Magpie Management page below Plugins in the global sidebar.',\n 'magpie.sidebarLabel': 'Magpie',\n 'magpie.context.system': 'System prompt',\n 'magpie.context.tools': 'Tools',\n 'magpie.context.memory': 'Memory',\n 'magpie.context.files': 'Files',\n 'magpie.context.results': 'Tool results',\n 'magpie.context.chat': 'Conversation content',\n 'magpie.context.usedPercent': 'Context used {percent}%',\n 'magpie.context.window': 'Context window',\n 'magpie.context.used': 'Used context',\n 'magpie.context.native': 'DSH context',\n 'magpie.context.nativeTools': 'Tool definitions',\n 'magpie.context.nativeMessages': 'Conversation messages',\n 'magpie.context.nativeComposition': 'Estimated composition (share of total)',\n 'magpie.context.modelWindow': 'Model window {value}',\n 'magpie.context.cache': 'Prompt cache',\n 'magpie.context.hit': 'hit',\n 'magpie.context.close': 'Close context',\n 'magpie.context.composition': 'Context composition',\n 'magpie.context.content': 'Content',\n 'magpie.context.all': 'All',\n 'magpie.context.allCount': 'All · {count}',\n 'magpie.context.empty': 'No content available',\n 'magpie.context.rounds': '{count} rounds',\n 'magpie.context.requests': '{count} requests',\n 'magpie.context.request': 'Request {count}',\n 'magpie.context.earlierRounds': 'Earlier {count} rounds',\n 'magpie.context.round': 'Round {count}',\n 'magpie.usage': 'Usage',\n 'magpie.routing': 'Routing',\n 'magpie.statTokens': 'Tokens',\n 'magpie.statCalls': 'Requests',\n 'magpie.statTurns': 'Turns',\n 'magpie.statSteps': 'Steps',\n 'magpie.statWriteDown': 'Output',\n 'magpie.statSessions': 'Sessions',\n 'magpie.statReasoning': 'Reasoning',\n 'magpie.statReasoningNote': 'Counted as output',\n 'magpie.statSpeed': 'Output speed',\n 'magpie.statLatency': 'First text',\n 'magpie.statLatencyNote': 'Average first-text latency',\n 'magpie.topSessions': 'Top sessions',\n 'magpie.sortMetric': 'Sort by',\n 'magpie.dailyTrend': 'Daily trend',\n 'magpie.ncolTime': 'Time',\n 'magpie.ncolRequested': 'Requested model',\n 'magpie.ncolProvider': 'Provider / account',\n 'magpie.ncolServed': 'Served model',\n 'magpie.ncolInput': 'Input',\n 'magpie.ncolOutput': 'Output',\n 'magpie.ncolCost': 'Cost',\n 'magpie.ncolFirstText': 'First text',\n 'magpie.ncolDuration': 'Duration',\n 'magpie.ncolSpeed': 'Speed',\n 'magpie.ncolStatus': 'Status',\n 'magpie.open': 'Open Magpie dashboard',\n 'magpie.pageTitle': 'Magpie observatory',\n 'magpie.pageSubtitle': 'A live ledger of routing, usage, and subscription allowance.',\n 'magpie.periodLabel': 'PERIOD',\n 'magpie.chart.calls': 'Magpie requests over time',\n 'magpie.chart.tokens': 'Magpie tokens over time',\n 'magpie.chart.cost': 'Magpie reported cost over time',\n 'magpie.close': 'Return to the conversation',\n 'magpie.overview': 'Overview',\n 'magpie.sessions': 'Sessions',\n 'magpie.requests': 'Requests',\n 'magpie.quotas': 'Subscriptions',\n 'magpie.today': 'Today',\n 'magpie.week': '7 days',\n 'magpie.month': '30 days',\n 'magpie.all': 'All time',\n 'magpie.refresh': 'Refresh',\n 'magpie.refreshing': 'Refreshing…',\n 'magpie.update.title': 'Magpie update',\n 'magpie.update.open': 'Magpie {version}; open update details',\n 'magpie.update.openAvailable': 'Magpie {version}; update {latest} available; open update details',\n 'magpie.update.badge': 'New',\n 'magpie.update.close': 'Close Magpie update details',\n 'magpie.update.description': 'Opening this page checks for updates automatically. Download and restart only run after you confirm a manual update.',\n 'magpie.update.unavailable': 'Magpie update status is unavailable.',\n 'magpie.update.unsupported': 'This Magpie version does not expose a supported update API.',\n 'magpie.update.invalid': 'Magpie returned an update response CodingNS cannot safely read.',\n 'magpie.update.current': 'Current {version}',\n 'magpie.update.latest': 'Latest {version}',\n 'magpie.update.releaseNotes': 'Release notes for {version}',\n 'magpie.update.check': 'Check for updates',\n 'magpie.update.checking': 'Checking for updates…',\n 'magpie.update.downloading': 'Magpie is downloading the update…',\n 'magpie.update.manual': 'Manual update',\n 'magpie.update.retry': 'Retry update',\n 'magpie.update.confirmTitle': 'Confirm Magpie update',\n 'magpie.update.confirmWarning': 'Magpie may download a new binary, restart its Web process, and interrupt active requests.',\n 'magpie.update.confirm': 'Confirm and update',\n 'magpie.update.requested': 'Magpie accepted the update request.',\n 'magpie.update.restartRequested': 'Magpie accepted the update and may restart now. The admin page will reconnect afterward.',\n 'magpie.update.state.checking': 'Checking',\n 'magpie.update.state.latest': 'Up to date',\n 'magpie.update.state.found': 'Update available',\n 'magpie.update.state.downloading': 'Downloading',\n 'magpie.update.state.ready': 'Ready to restart',\n 'magpie.update.state.available': 'Update available manually',\n 'magpie.update.state.source': 'Source build',\n 'magpie.update.state.error': 'Update error',\n 'magpie.update.state.blocked': 'Update blocked',\n 'magpie.loading': 'Reading the local Magpie Web API…',\n 'magpie.webApiUnavailable': 'The Host could not start or authenticate Magpie Web. Startup is automatic; verify that the Magpie CLI is available, then retry.',\n 'magpie.unavailable': 'Magpie data is unavailable on this Host.',\n 'magpie.cliUnavailable': 'The Host could not find or run the Magpie CLI. Verify `magpie --version` in the DSH Host environment.',\n 'magpie.cliVersionUnsupported': 'This Magpie CLI version is not supported. The dashboard requires Magpie 0.1.1295 or later.',\n 'magpie.catalogUnavailable': 'The Host could not read `magpie models dsh` or find its Gateway address.',\n 'magpie.hostRpcOutdated': 'This Host is missing the Magpie usage or management RPC. Update/reload CodingNS on the Host to enable management panels.',\n 'magpie.featureDisabled': 'Magpie Management is disabled in the Host settings. Enable it in CodingNS settings and retry.',\n 'magpie.hostRequestFailed': 'The Host request failed. Check the Host connection and retry.',\n 'magpie.usageUnavailable': 'Usage data could not be read. Other sections may still be available.',\n 'magpie.quotaUnavailable': 'Subscription data could not be read.',\n 'magpie.codexControlsUnavailable': 'Codex account identity was not reported; account controls are unavailable.',\n 'magpie.codexPolicyFailed': 'Could not update the Codex account setting. Refresh and try again.',\n 'magpie.codexPolicyUnavailable': 'Codex policy settings are unavailable.',\n 'magpie.codexResetFailed': 'Could not use a reset card. Refresh and try again.',\n 'magpie.resetDialogAccount': 'Account: {account}',\n 'magpie.resetDialogBody': 'This uses one reset card from the {count} available and immediately restores the current quota window. This cannot be undone. Continue?',\n 'magpie.historyUnavailable': 'Quota history could not be read.',\n 'magpie.noUsage': 'No usage was reported for this period.',\n 'magpie.noSessions': 'No sessions were reported for this period.',\n 'magpie.noRequests': 'No request rows are available for this selection.',\n 'magpie.noQuotas': 'No subscription quota cards are available.',\n 'magpie.noHistory': 'No quota history is available.',\n 'magpie.costNote': 'Cost is reported by Magpie; the API does not specify a currency.',\n 'magpie.metricCalls': 'Requests',\n 'magpie.metricErrors': 'Errors',\n 'magpie.metricRetries': 'Retries',\n 'magpie.metricInput': 'Input tokens',\n 'magpie.metricOutput': 'Output tokens',\n 'magpie.metricCacheRead': 'Cache read',\n 'magpie.metricCacheWrite': 'Cache written',\n 'magpie.metricReasoning': 'Reasoning tokens',\n 'magpie.metricCost': 'Reported cost',\n 'magpie.metricUnpriced': 'Unpriced requests',\n 'magpie.metricLatency': 'Measured requests',\n 'magpie.metricTtft': 'TTFT reported (ms)',\n 'magpie.metricDecode': 'Decode time reported',\n 'magpie.metricDecodeTokens': 'Decode tokens',\n 'magpie.metricDecodeCount': 'decode count',\n 'magpie.timeline': 'Usage over time',\n 'magpie.tokens': 'Input + output tokens',\n 'magpie.byProvider': 'By provider',\n 'magpie.byModel': 'By model',\n 'magpie.byAccount': 'By account',\n 'magpie.modelBreakdown': 'Model breakdown',\n 'magpie.modelAggregate': 'Aggregate',\n 'magpie.modelPerAccount': 'Per account',\n 'magpie.byAgent': 'By Agent',\n 'magpie.management.providers': 'Providers',\n 'magpie.management.groupsTab': 'Routing groups',\n 'magpie.management.classifierEmpty': 'Choose a model',\n 'magpie.management.classifierHint': 'Asked once as each turn begins; a small, fast model without reasoning is best.',\n 'magpie.management.contextCustom': 'Custom',\n 'magpie.management.contextHint': 'The window Agents are told this group takes, so they compact before a member turns the conversation away.',\n 'magpie.management.contextInvalid': 'Enter a number of tokens, like 200k or 1m.',\n 'magpie.management.contextLargest': 'Largest member',\n 'magpie.management.contextSmallest': 'Smallest member',\n 'magpie.management.contextTokens': '{count} token',\n 'magpie.management.effortAgent': 'As the Agent asks',\n 'magpie.management.effortAgentHint': 'Each request reasons as much as the Agent asked for.',\n 'magpie.management.effortAuto': 'Picked per turn',\n 'magpie.management.effortAutoHint': 'A classifier rates each turn and asks its model for the nearest level; requests without reasoning stay without.',\n 'magpie.management.effortNeedsClassifier': 'Picking a level per turn needs a model that rates the turn. No model is available here.',\n 'magpie.management.levelsNamed': 'Chosen here',\n 'magpie.management.levelsNamedHint': 'Agents are offered these; a member without one is sent the level it has nearest.',\n 'magpie.management.levelsShared': 'Shared by its models',\n 'magpie.management.levelsSharedHint': 'Agents are offered the levels every member has.',\n 'magpie.management.reviewContext': 'Context window: {value}',\n 'magpie.management.reviewEffort': 'Effort: {value}',\n 'magpie.management.reviewEffortAuto': 'picked per turn by {model}',\n 'magpie.management.reviewLevels': 'Reasoning levels: {value}',\n 'magpie.management.accounts': 'Accounts',\n 'magpie.management.groups': 'Routing groups',\n 'magpie.management.loading': 'Reading Magpie provider, account, and routing-group settings…',\n 'magpie.management.cliVersionUnsupported': 'Magpie Web returned provider or routing-group data this Host cannot read. Update Magpie Web or CodingNS and retry.',\n 'magpie.management.providersUnavailable': 'Magpie provider settings could not be read in a supported format.',\n 'magpie.management.accountsUnavailable': 'Magpie account status could not be read.',\n 'magpie.management.groupsUnavailable': 'Magpie routing groups could not be read in a supported format.',\n 'magpie.management.noProviders': 'No Magpie providers were found.',\n 'magpie.management.noAccounts': 'No subscription accounts were reported by Magpie.',\n 'magpie.management.noGroups': 'No routing groups were found.',\n 'magpie.management.accountApiRequired': 'Host-managed Magpie Web is unavailable. Retry after the Host reconnects.',\n 'magpie.management.accountRoleNote': 'Primary is the Agent\\'s signed-in account; secondary accounts can be placed in or removed from the failover rotation.',\n 'magpie.management.unlinkedAccounts': 'Accounts without a listed provider',\n 'magpie.management.unlinkedAccountsNote': 'These accounts are still shown, but Magpie did not provide a matching account Agent identity for any listed provider.',\n 'magpie.management.noLinkedAccounts': 'No subscription accounts are linked to this provider.',\n 'magpie.management.primaryAccount': 'Primary · signed in',\n 'magpie.management.secondaryAccount': 'Secondary',\n 'magpie.management.inRotation': 'In routing rotation',\n 'magpie.management.primaryPaused': 'Primary paused',\n 'magpie.management.outOfRotation': 'Out of rotation',\n 'magpie.management.addToRotation': 'Add to failover rotation',\n 'magpie.management.removeFromRotation': 'Remove from failover rotation',\n 'magpie.management.pausePrimary': 'Pause primary account',\n 'magpie.management.lastAccountInRotation': 'Magpie requires at least one account to remain in rotation.',\n 'magpie.management.reviewAccount': 'Review account routing change',\n 'magpie.management.reviewAccountOn': 'Add {account} to this provider\\'s failover rotation.',\n 'magpie.management.reviewAccountOff': 'Remove {account} from this provider\\'s rotation. Magpie may move Agents using it to another provider/model.',\n 'magpie.management.accountSaveFailed': 'Magpie did not confirm this account change. Refresh and inspect its current routing state.',\n 'magpie.management.turnProviderOn': 'Turn provider on',\n 'magpie.management.turnProviderOff': 'Turn provider off',\n 'magpie.management.reviewProviderStatus': 'Routing availability: {value}',\n 'magpie.management.providerAccount': 'Account: {account}',\n 'magpie.management.modelCountUnknown': 'Model count not reported',\n 'magpie.management.modelCounts': '{exposed} exposed / {total} available models',\n 'magpie.management.providerName': 'Provider name',\n 'magpie.management.providerId': 'Provider ID',\n 'magpie.management.providerIdHint': 'Lower-case letters, digits and dashes, as model IDs spell it ({id}/model). Renaming carries the routing groups and Agent configs that name its models along.',\n 'magpie.management.providerIdLocked': 'Magpie stores this provider under an ID it will not write again, so it cannot be renamed here.',\n 'magpie.management.providerIdInvalid': 'An ID needs at least one letter or digit.',\n 'magpie.management.providerIdPreview': 'Saved as {id}; the current one stays a remembered alias.',\n 'magpie.management.endpointType': 'Endpoint type',\n 'magpie.management.endpointUrl': 'Endpoint URL',\n 'magpie.management.exposedModels': 'Exposed models',\n 'magpie.management.providerModelsHint': 'Magpie returned the complete model inventory. Check a model to expose it for routing; the original order is preserved.',\n 'magpie.management.providerModelsUnavailable': 'Magpie returned model entries this Host cannot safely edit. The list is read-only; other supported provider fields remain editable.',\n 'magpie.management.noProviderModels': 'Magpie did not return any model entries for this provider.',\n 'magpie.management.enableAllModels': 'Enable all',\n 'magpie.management.disableAllModels': 'Disable all',\n 'magpie.management.groupName': 'Group name',\n 'magpie.management.groupModels': 'Ordered models and patterns',\n 'magpie.management.groupModelsHint': 'Arrange the selected models and patterns in priority order. Use Add a model to insert another Magpie model without expanding the full inventory.',\n 'magpie.management.addGroupModel': 'Add a model',\n 'magpie.management.searchGroupModels': 'Filter models...',\n 'magpie.management.noMatchingGroupModels': 'No matching models.',\n 'magpie.management.otherGroupModels': 'Other models',\n 'magpie.management.noSelectedGroupModels': 'No models or patterns are selected for this group.',\n 'magpie.management.moveModelUp': 'Move {model} up',\n 'magpie.management.moveModelDown': 'Move {model} down',\n 'magpie.management.routing': 'Invocation policy',\n 'magpie.management.routing.smart': 'Smart',\n 'magpie.management.routing.order': 'In order',\n 'magpie.management.routing.rotate': 'In turn',\n 'magpie.management.routing.usage': 'Least used',\n 'magpie.management.routing.pace': 'Weekly pace',\n 'magpie.management.routing.weight': 'By weight',\n 'magpie.management.routing.manual': 'Manual',\n 'magpie.management.routing.free': 'Free first',\n 'magpie.management.stays': 'Account stickiness',\n 'magpie.management.stays.auto': 'Auto',\n 'magpie.management.stays.session': 'Session',\n 'magpie.management.stays.turn': 'Within a turn',\n 'magpie.management.stays.off': 'Off',\n 'magpie.management.stays.strict': 'Strict',\n 'magpie.management.routingHint': 'How this group sends a request to its members.',\n 'magpie.management.staysHint': 'How long a conversation stays with the member that answered it.',\n 'magpie.management.manualPick': 'Model sent every request',\n 'magpie.management.manualPickHint': 'Manual sends every request to this member; the others wait until another is picked.',\n 'magpie.management.unlists': 'Agents see the group only',\n 'magpie.management.unlistsHint': 'On, Agent model lists show the group and not the models it names; a request naming one is still answered.',\n 'magpie.management.fastMode': 'Fast mode',\n 'magpie.management.fastModeHint': '{model} is asked for its vendor\\'s fast mode (OpenAI service_tier \"priority\"): quicker, at a higher price.',\n 'magpie.management.noFastModels': 'Agents list the models below as they are; none takes this group\\'s reasoning levels or fast mode.',\n 'magpie.management.context': 'Context limit',\n 'magpie.management.levels': 'Reasoning levels',\n 'magpie.management.family': 'Family tag',\n 'magpie.management.effort': 'Effort policy',\n 'magpie.management.classifier': 'Classifier model',\n 'magpie.management.pick': 'Manually picked model',\n 'magpie.management.listed': 'List group models separately to Agents',\n 'magpie.management.active': 'Active',\n 'magpie.management.inactive': 'Inactive',\n 'magpie.management.enabled': 'Routing on',\n 'magpie.management.disabled': 'Routing off',\n 'magpie.management.on': 'On',\n 'magpie.management.off': 'Off',\n 'magpie.management.unknown': 'Unknown',\n 'magpie.management.noAccountWindows': 'No allowance windows reported.',\n 'magpie.management.readAt': 'Read {time}',\n 'magpie.management.membersCount': '{count} members',\n 'magpie.management.usedBy': 'Used by {agents}',\n 'magpie.management.reviewProvider': 'Review provider changes',\n 'magpie.management.reviewGroup': 'Review routing-group changes',\n 'magpie.management.reviewName': 'Name: {value}',\n 'magpie.management.reviewProviderId': 'ID: {from} → {to}',\n 'magpie.management.providerIdRenameHint': 'Magpie saves the other changes under the current ID first, then moves the provider: the routing groups and Agent configs naming its models follow, and the current ID stays an alias of the new one.',\n 'magpie.management.reviewEndpoint': '{field} endpoint: {value}',\n 'magpie.management.reviewModels': 'Model list: {count} entries',\n 'magpie.management.reviewRouting': 'Routing: {value}',\n 'magpie.management.reviewStays': 'Stickiness: {value}',\n 'magpie.management.manualPickEmpty': 'Choose a model',\n 'magpie.management.reviewPick': 'Manual pick: {value}',\n 'magpie.management.reviewUnlists': 'Group only: {value}',\n 'magpie.management.reviewFast': 'Fast mode: {count} models',\n 'magpie.management.reviewListed': 'Listed: {value}',\n 'magpie.management.reviewChanges': 'Review changes',\n 'magpie.management.cancel': 'Cancel',\n 'magpie.management.apply': 'Apply changes',\n 'magpie.management.saving': 'Saving…',\n 'magpie.management.saved': 'Saved and verified against Magpie.',\n 'magpie.management.saveFailed': 'Magpie did not confirm this change. Refresh and inspect the current values.',\n 'magpie.management.reset': 'Reset',\n 'magpie.sessionsCount': '{count} sessions',\n 'magpie.sessionSearch': 'Filter sessions by Agent or ID',\n 'magpie.openRequests': 'Inspect requests',\n 'magpie.clearSession': 'Clear session filter',\n 'magpie.requestFor': 'Requests for {agent} · {id}',\n 'magpie.colTime': 'Time',\n 'magpie.colProvider': 'Provider / account',\n 'magpie.colRoute': 'Requested → served',\n 'magpie.colTokens': 'Tokens',\n 'magpie.colCost': 'Cost',\n 'magpie.colStatus': 'Status / time',\n 'magpie.routeId': 'Route #{id}',\n 'magpie.priced': 'Priced',\n 'magpie.unpricedStatus': 'Unpriced',\n 'magpie.previous': 'Previous',\n 'magpie.next': 'Next',\n 'magpie.pageOf': 'Page {page}',\n 'magpie.loadMore': 'Load more',\n 'magpie.loadedCount': 'Loaded {count}',\n 'magpie.quotaHistory': 'Allowance history',\n 'magpie.quotaHistoryNote': 'Remaining allowance values recorded by Magpie; units follow each provider.',\n 'magpie.dailyUsage': 'Daily usage',\n 'magpie.remaining': '{percent}% remaining',\n 'magpie.used': '{percent}% used',\n 'magpie.quotaViewLabel': 'Subscription card values',\n 'magpie.quotaViewUsed': 'Used',\n 'magpie.quotaViewRemaining': 'Remaining',\n 'magpie.quotaViewFailed': 'Could not save the display mode',\n 'magpie.resets': 'Resets {time}',\n 'magpie.account': 'Account {account}',\n 'magpie.noLimit': 'No reported limit',\n 'magpie.quotaAccounts': '{count} accounts',\n 'magpie.quotaShowAllAccounts': 'Show all accounts',\n 'magpie.quotaShowMainAccount': 'Show main account only',\n 'magpie.quotaCollapseAccounts': '{count} accounts · collapse',\n 'magpie.balance': 'Balance',\n 'magpie.quotaRemainingAccounts': '+{count} more',\n 'magpie.sessionCountUnknown': 'Session count not reported',\n 'magpie.install.platform': 'Host platform: {platform}',\n 'magpie.install.title': 'Magpie is not available on this Host',\n 'magpie.install.detected': 'Detected Magpie {version} at {command}',\n 'magpie.install.recheck': 'Detect again',\n 'magpie.install.checking': 'Detecting…',\n 'magpie.install.checkedAt': 'Last checked {time}',\n 'magpie.install.reason.launch': 'The entry {command} exists but Magpie could not run. Check the installation and try again.',\n 'magpie.install.reason.timeout': 'The entry {command} did not answer in time. Check the installation and try again.',\n 'magpie.install.reason.version': 'The entry {command} ran but did not report a recognizable Magpie version.',\n 'magpie.install.command': 'magpie --version',\n 'magpie.install.installHelp.macos': 'Install Magpie with the official GitHub release or installation script, then reopen DSH. The Host reads the login shell PATH and common standalone binary directories such as Homebrew and ~/.local/bin.',\n 'magpie.install.installHelp.windows': 'Install Magpie from the official GitHub release or installation script. The Host reads the Windows registry PATH and checks the installer\\'s %USERPROFILE%\\\\.local\\\\bin location plus other common standalone binary directories. Reopen DSH after installing so it picks up the new PATH.',\n 'magpie.install.installHelp.linux': 'Install Magpie with the official GitHub release or installation script, then reopen DSH. The Host reads the login shell PATH plus /usr/local/bin and ~/.local/bin.',\n 'magpie.install.customToggle': 'Specify the Magpie path',\n 'magpie.install.customLabel': 'Absolute path to the Magpie executable',\n 'magpie.install.customPlaceholder': '/opt/homebrew/bin/magpie or C:\\\\Users\\\\you\\\\.local\\\\bin\\\\magpie.exe',\n 'magpie.install.customHelp': 'Use an unquoted absolute file path without arguments. A working path is saved on this Host and revalidated after restarting DSH.',\n 'magpie.install.customApply': 'Detect this path',\n 'magpie.install.customReset': 'Restore automatic detection',\n 'magpie.install.disabledNote': 'Magpie management stays off until a working Magpie CLI is detected.',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.magpieManagement.label': 'Magpie 管理与用量',\n 'feature.magpieManagement.description': '启用后,会在全局侧栏的「插件」下方添加独立的 Magpie 管理页面。',\n 'magpie.sidebarLabel': 'Magpie',\n 'magpie.context.system': '系统提示词',\n 'magpie.context.tools': '工具',\n 'magpie.context.memory': '记忆',\n 'magpie.context.files': '文件',\n 'magpie.context.results': '工具结果',\n 'magpie.context.chat': '会话内容',\n 'magpie.context.usedPercent': '上下文已用 {percent}%',\n 'magpie.context.window': '上下文窗口',\n 'magpie.context.used': '已用上下文',\n 'magpie.context.native': 'DSH 上下文',\n 'magpie.context.nativeTools': '工具定义',\n 'magpie.context.nativeMessages': '对话消息',\n 'magpie.context.nativeComposition': '估算组成(占估算总量的比例)',\n 'magpie.context.modelWindow': '模型窗口 {value}',\n 'magpie.context.cache': '提示词缓存',\n 'magpie.context.hit': '命中',\n 'magpie.context.close': '关闭上下文',\n 'magpie.context.composition': '上下文组成',\n 'magpie.context.content': '内容',\n 'magpie.context.all': '全部',\n 'magpie.context.allCount': '全部 · {count}',\n 'magpie.context.empty': '没有可显示的内容',\n 'magpie.context.rounds': '{count} 轮',\n 'magpie.context.requests': '{count} 个请求',\n 'magpie.context.request': '请求 {count}',\n 'magpie.context.earlierRounds': '更早的 {count} 轮',\n 'magpie.context.round': '第 {count} 轮',\n 'magpie.usage': '用量',\n 'magpie.routing': '路由',\n 'magpie.statTokens': 'Token',\n 'magpie.statCalls': '请求',\n 'magpie.statTurns': '回合',\n 'magpie.statSteps': '步骤',\n 'magpie.statWriteDown': '输出',\n 'magpie.statSessions': '会话数',\n 'magpie.statReasoning': '推理',\n 'magpie.statReasoningNote': '计入输出',\n 'magpie.statSpeed': '输出速度',\n 'magpie.statLatency': '首字耗时',\n 'magpie.statLatencyNote': '首字平均耗时',\n 'magpie.topSessions': '最耗会话',\n 'magpie.sortMetric': '排序指标',\n 'magpie.dailyTrend': '每日趋势',\n 'magpie.ncolTime': '时间',\n 'magpie.ncolRequested': '请求模型',\n 'magpie.ncolProvider': '供应商 · 账号',\n 'magpie.ncolServed': '实际模型',\n 'magpie.ncolInput': '输入',\n 'magpie.ncolOutput': '输出',\n 'magpie.ncolCost': '费用',\n 'magpie.ncolFirstText': '首字耗时',\n 'magpie.ncolDuration': '耗时',\n 'magpie.ncolSpeed': '速度',\n 'magpie.ncolStatus': '状态',\n 'magpie.open': '打开 Magpie 面板',\n 'magpie.pageTitle': 'Magpie 用量观测台',\n 'magpie.pageSubtitle': '实时查看路由、用量和订阅额度记录。',\n 'magpie.periodLabel': '周期',\n 'magpie.chart.calls': 'Magpie 请求趋势',\n 'magpie.chart.tokens': 'Magpie Token 趋势',\n 'magpie.chart.cost': 'Magpie 报告费用趋势',\n 'magpie.close': '返回当前对话',\n 'magpie.overview': '总览',\n 'magpie.sessions': '会话',\n 'magpie.requests': '请求',\n 'magpie.quotas': '订阅',\n 'magpie.today': '今天',\n 'magpie.week': '近 7 天',\n 'magpie.month': '近 30 天',\n 'magpie.all': '全部',\n 'magpie.refresh': '刷新',\n 'magpie.refreshing': '正在刷新…',\n 'magpie.update.title': 'Magpie 更新',\n 'magpie.update.open': 'Magpie {version};打开更新详情',\n 'magpie.update.openAvailable': 'Magpie {version};发现新版本 {latest};打开更新详情',\n 'magpie.update.badge': '新',\n 'magpie.update.close': '关闭 Magpie 更新详情',\n 'magpie.update.description': '打开管理页时会自动检查更新;只有你确认手动更新后,才会下载或重启。',\n 'magpie.update.unavailable': '暂时无法读取 Magpie 更新状态。',\n 'magpie.update.unsupported': '当前 Magpie 版本没有可支持的更新 API。',\n 'magpie.update.invalid': 'Magpie 返回了 CodingNS 无法安全读取的更新数据。',\n 'magpie.update.current': '当前 {version}',\n 'magpie.update.latest': '最新 {version}',\n 'magpie.update.releaseNotes': '{version} 的更新说明',\n 'magpie.update.check': '检查更新',\n 'magpie.update.checking': '正在检查更新…',\n 'magpie.update.downloading': 'Magpie 正在下载更新…',\n 'magpie.update.manual': '手动更新',\n 'magpie.update.retry': '重试更新',\n 'magpie.update.confirmTitle': '确认更新 Magpie',\n 'magpie.update.confirmWarning': 'Magpie 可能下载新的程序文件、重启 Web 进程,并中断正在进行的请求。',\n 'magpie.update.confirm': '确认并更新',\n 'magpie.update.requested': 'Magpie 已接受更新请求。',\n 'magpie.update.restartRequested': 'Magpie 已接受更新,可能会立即重启;管理页稍后会自动重新连接。',\n 'magpie.update.state.checking': '检查中',\n 'magpie.update.state.latest': '已是最新',\n 'magpie.update.state.found': '发现更新',\n 'magpie.update.state.downloading': '下载中',\n 'magpie.update.state.ready': '已准备重启',\n 'magpie.update.state.available': '可手动更新',\n 'magpie.update.state.source': '源码版本',\n 'magpie.update.state.error': '更新出错',\n 'magpie.update.state.blocked': '更新被阻止',\n 'magpie.loading': '正在读取本机 Magpie Web API…',\n 'magpie.webApiUnavailable': 'Host 无法启动或认证 Magpie Web。服务会自动启动;请确认 Magpie CLI 可用后重试。',\n 'magpie.unavailable': '此 Host 上的 Magpie 数据不可用。',\n 'magpie.cliUnavailable': 'Host 无法找到或运行 Magpie CLI。请在 DSH Host 环境中确认 `magpie --version` 可用。',\n 'magpie.cliVersionUnsupported': '此 Magpie CLI 版本暂不支持;用量面板要求 Magpie 0.1.1295 或更高版本。',\n 'magpie.catalogUnavailable': 'Host 无法读取 `magpie models dsh`,或未能从中找到 Gateway 地址。',\n 'magpie.hostRpcOutdated': '此 Host 缺少 Magpie 用量或管理 RPC。请在 Host 更新/重载 CodingNS 后使用管理面板。',\n 'magpie.featureDisabled': 'Host 设置中的 Magpie 管理功能未启用。请在 CodingNS 设置中启用后重试。',\n 'magpie.hostRequestFailed': 'Host 请求失败。请检查 Host 连接后重试。',\n 'magpie.usageUnavailable': '无法读取用量数据;其他区块仍可能可用。',\n 'magpie.quotaUnavailable': '无法读取订阅数据。',\n 'magpie.codexControlsUnavailable': '未报告 Codex 账号身份,无法显示账号控制项。',\n 'magpie.codexPolicyFailed': '无法更新 Codex 账号设置,请刷新后重试。',\n 'magpie.codexPolicyUnavailable': '暂时无法读取 Codex 使用规则。',\n 'magpie.codexResetFailed': '无法使用重置卡,请刷新后重试。',\n 'magpie.resetDialogAccount': '账号:{account}',\n 'magpie.resetDialogBody': '将使用当前 {count} 张重置卡中的 1 张,并立即恢复当前额度窗口。此操作不可撤销,确定继续吗?',\n 'magpie.historyUnavailable': '无法读取额度历史。',\n 'magpie.noUsage': '此周期没有用量记录。',\n 'magpie.noSessions': '此周期没有会话记录。',\n 'magpie.noRequests': '当前选择没有可显示的请求记录。',\n 'magpie.noQuotas': '没有可用的订阅额度卡片。',\n 'magpie.noHistory': '没有可用的额度历史。',\n 'magpie.costNote': '费用由 Magpie 提供;API 未声明币种。',\n 'magpie.metricCalls': '请求数',\n 'magpie.metricErrors': '错误数',\n 'magpie.metricRetries': '重试数',\n 'magpie.metricInput': '输入 Token',\n 'magpie.metricOutput': '输出 Token',\n 'magpie.metricCacheRead': '缓存读取',\n 'magpie.metricCacheWrite': '缓存写入',\n 'magpie.metricReasoning': '推理 Token',\n 'magpie.metricCost': '报告费用',\n 'magpie.metricUnpriced': '未计价请求',\n 'magpie.metricLatency': '已测时请求',\n 'magpie.metricTtft': '报告 TTFT(毫秒)',\n 'magpie.metricDecode': '报告解码时间',\n 'magpie.metricDecodeTokens': '解码 Token',\n 'magpie.metricDecodeCount': '次解码',\n 'magpie.timeline': '用量趋势',\n 'magpie.tokens': '输入 + 输出 Token',\n 'magpie.byProvider': '按提供商',\n 'magpie.byModel': '按模型',\n 'magpie.byAccount': '按账户',\n 'magpie.modelBreakdown': '模型明细方式',\n 'magpie.modelAggregate': '汇总',\n 'magpie.modelPerAccount': '按账户',\n 'magpie.byAgent': '按 Agent',\n 'magpie.management.providers': '提供商',\n 'magpie.management.groupsTab': '路由组',\n 'magpie.management.classifierEmpty': '请选择模型',\n 'magpie.management.classifierHint': '每轮开始时询问一次;不带推理的小型快速模型最合适。',\n 'magpie.management.contextCustom': '自定义',\n 'magpie.management.contextHint': '告知 Agent 此路由组的上下文窗口,让它在成员拒绝之前先行压缩。',\n 'magpie.management.contextInvalid': '请填写 token 数量,例如 200k 或 1m。',\n 'magpie.management.contextLargest': '最大成员',\n 'magpie.management.contextSmallest': '最小成员',\n 'magpie.management.contextTokens': '{count} tokens',\n 'magpie.management.effortAgent': '按 Agent 请求',\n 'magpie.management.effortAgentHint': '每个请求按 Agent 请求的推理强度处理。',\n 'magpie.management.effortAuto': '按轮挑选',\n 'magpie.management.effortAutoHint': '分类器判断每轮的难度,并让该轮按最近的档位请求;原本不带推理的请求仍然不带。',\n 'magpie.management.effortNeedsClassifier': '按轮挑选需要一个评判该轮的模型,此处没有可用模型。',\n 'magpie.management.levelsNamed': '在此指定',\n 'magpie.management.levelsNamedHint': '向 Agent 提供这些档位;没有该档位的成员会按最近的档位下发。',\n 'magpie.management.levelsShared': '沿用各模型共有',\n 'magpie.management.levelsSharedHint': '向 Agent 提供所有成员都具备的推理档位。',\n 'magpie.management.reviewContext': '上下文窗口:{value}',\n 'magpie.management.reviewEffort': '推理强度:{value}',\n 'magpie.management.reviewEffortAuto': '由 {model} 按轮挑选',\n 'magpie.management.reviewLevels': '推理档位:{value}',\n 'magpie.management.accounts': '账户',\n 'magpie.management.groups': '路由组',\n 'magpie.management.loading': '正在读取 Magpie 提供商、账户和路由组设置…',\n 'magpie.management.cliVersionUnsupported': 'Magpie Web 返回的提供商或路由组数据无法由此 Host 读取。请更新 Magpie Web 或 CodingNS 后重试。',\n 'magpie.management.providersUnavailable': '无法按受支持的格式读取 Magpie 提供商设置。',\n 'magpie.management.accountsUnavailable': '无法读取 Magpie 账户状态。',\n 'magpie.management.groupsUnavailable': '无法按受支持的格式读取 Magpie 路由组。',\n 'magpie.management.noProviders': '未找到 Magpie 提供商。',\n 'magpie.management.noAccounts': 'Magpie 未报告订阅账户。',\n 'magpie.management.noGroups': '未找到路由组。',\n 'magpie.management.accountApiRequired': 'Host 管理的 Magpie Web 当前不可用;请在 Host 重新连接后重试。',\n 'magpie.management.accountRoleNote': '主账户是 Agent 当前登录的账户;次级账户可加入或移出故障转移轮换。',\n 'magpie.management.unlinkedAccounts': '未匹配到提供商的账户',\n 'magpie.management.unlinkedAccountsNote': '这些账户仍会显示;但 Magpie 没有为任何已列出的提供商返回匹配的账户 Agent 标识。',\n 'magpie.management.noLinkedAccounts': '此提供商没有关联的订阅账户。',\n 'magpie.management.primaryAccount': '主账户 · 当前登录',\n 'magpie.management.secondaryAccount': '次级账户',\n 'magpie.management.inRotation': '参与路由轮换',\n 'magpie.management.primaryPaused': '主账户已暂停',\n 'magpie.management.outOfRotation': '未参与轮换',\n 'magpie.management.addToRotation': '加入故障转移轮换',\n 'magpie.management.removeFromRotation': '移出故障转移轮换',\n 'magpie.management.pausePrimary': '暂停主账户',\n 'magpie.management.lastAccountInRotation': 'Magpie 要求至少保留一个参与轮换的账户。',\n 'magpie.management.reviewAccount': '确认账户路由变更',\n 'magpie.management.reviewAccountOn': '将 {account} 加入此提供商的故障转移轮换。',\n 'magpie.management.reviewAccountOff': '将 {account} 移出此提供商的轮换。Magpie 可能会让正在使用它的 Agent 改用其他提供商/模型。',\n 'magpie.management.accountSaveFailed': 'Magpie 未确认此账户变更。请刷新并检查当前路由状态。',\n 'magpie.management.turnProviderOn': '启用提供商',\n 'magpie.management.turnProviderOff': '停用提供商',\n 'magpie.management.reviewProviderStatus': '路由状态:{value}',\n 'magpie.management.providerAccount': '账户:{account}',\n 'magpie.management.modelCountUnknown': '未报告模型数量',\n 'magpie.management.modelCounts': '已公开 {exposed} / 可用 {total} 个模型',\n 'magpie.management.providerName': '提供商名称',\n 'magpie.management.providerId': '提供商 ID',\n 'magpie.management.providerIdHint': '只能使用小写字母、数字和短横线,模型 ID 以它开头({id}/模型)。改名时会一并迁移引用其模型的路由组与 Agent 配置。',\n 'magpie.management.providerIdLocked': 'Magpie 以这个不会再写入的 ID 保存该提供商,因此此处不能改名。',\n 'magpie.management.providerIdInvalid': 'ID 至少需要一个字母或数字。',\n 'magpie.management.providerIdPreview': '将保存为 {id};原 ID 仍会作为别名保留。',\n 'magpie.management.endpointType': '端点类型',\n 'magpie.management.endpointUrl': '端点 URL',\n 'magpie.management.exposedModels': '已公开模型',\n 'magpie.management.providerModelsHint': 'Magpie 已返回完整模型清单。勾选模型即可将其公开到路由中;原始顺序会保留。',\n 'magpie.management.providerModelsUnavailable': 'Magpie 返回了此 Host 无法安全编辑的模型条目;模型列表已设为只读,其他受支持的提供商字段仍可编辑。',\n 'magpie.management.noProviderModels': 'Magpie 没有为此提供商返回模型条目。',\n 'magpie.management.enableAllModels': '全部启用',\n 'magpie.management.disableAllModels': '全部停用',\n 'magpie.management.groupName': '路由组名称',\n 'magpie.management.groupModels': '有序模型与匹配模式',\n 'magpie.management.groupModelsHint': '按优先级排列已选模型和匹配模式。使用“添加模型”即可加入其他 Magpie 模型,不再展开完整清单。',\n 'magpie.management.addGroupModel': '添加模型',\n 'magpie.management.searchGroupModels': '筛选模型…',\n 'magpie.management.noMatchingGroupModels': '没有匹配的模型。',\n 'magpie.management.otherGroupModels': '其他模型',\n 'magpie.management.noSelectedGroupModels': '此路由组尚未选择模型或匹配模式。',\n 'magpie.management.moveModelUp': '将 {model} 上移',\n 'magpie.management.moveModelDown': '将 {model} 下移',\n 'magpie.management.routing': '调用策略',\n 'magpie.management.routing.smart': '智能',\n 'magpie.management.routing.order': '按顺序',\n 'magpie.management.routing.rotate': '轮流',\n 'magpie.management.routing.usage': '最少使用',\n 'magpie.management.routing.pace': '重置前用完',\n 'magpie.management.routing.weight': '按权重',\n 'magpie.management.routing.manual': '手动',\n 'magpie.management.routing.free': '免费优先',\n 'magpie.management.stays': '账户粘性',\n 'magpie.management.stays.auto': '自动',\n 'magpie.management.stays.session': '整个会话',\n 'magpie.management.stays.turn': '一轮之内',\n 'magpie.management.stays.off': '关闭',\n 'magpie.management.stays.strict': '严格',\n 'magpie.management.routingHint': '此路由组如何把请求发往组内模型。',\n 'magpie.management.staysHint': '会话在多长时间内固定在应答它的成员上。',\n 'magpie.management.manualPick': '固定发送的模型',\n 'magpie.management.manualPickHint': '「手动」会把每个请求都发给此成员,其余成员在另行选择前不参与。',\n 'magpie.management.unlists': 'Agent 只看到路由组',\n 'magpie.management.unlistsHint': '开启后,Agent 的模型列表只显示路由组,不显示它包含的模型;直接点名这些模型的请求仍会应答。',\n 'magpie.management.fastMode': '快速模式',\n 'magpie.management.fastModeHint': '会向 {model} 请求其厂商的快速模式(OpenAI service_tier \"priority\"):更快,但价格更高。',\n 'magpie.management.noFastModels': 'Agent 列表中的模型按原样列出;此路由组的推理档位与快速模式都不作用于它们。',\n 'magpie.management.context': '上下文上限',\n 'magpie.management.levels': '推理等级',\n 'magpie.management.family': '模型族标签',\n 'magpie.management.effort': '推理策略',\n 'magpie.management.classifier': '分类器模型',\n 'magpie.management.pick': '手动选择的模型',\n 'magpie.management.listed': '向 Agent 单独公开组内模型',\n 'magpie.management.active': '活跃',\n 'magpie.management.inactive': '未活跃',\n 'magpie.management.enabled': '路由开启',\n 'magpie.management.disabled': '路由关闭',\n 'magpie.management.on': '开启',\n 'magpie.management.off': '关闭',\n 'magpie.management.unknown': '未知',\n 'magpie.management.noAccountWindows': '未报告额度窗口。',\n 'magpie.management.readAt': '读取于 {time}',\n 'magpie.management.membersCount': '{count} 个成员',\n 'magpie.management.usedBy': '使用方:{agents}',\n 'magpie.management.reviewProvider': '确认提供商变更',\n 'magpie.management.reviewGroup': '确认路由组变更',\n 'magpie.management.reviewName': '名称:{value}',\n 'magpie.management.reviewProviderId': 'ID:{from} → {to}',\n 'magpie.management.providerIdRenameHint': 'Magpie 会先在当前 ID 下保存其他变更,再迁移该提供商:引用其模型的路由组与 Agent 配置会随之迁移,当前 ID 会保留为新 ID 的别名。',\n 'magpie.management.reviewEndpoint': '{field} 端点:{value}',\n 'magpie.management.reviewModels': '模型列表:{count} 项',\n 'magpie.management.reviewRouting': '路由:{value}',\n 'magpie.management.reviewStays': '粘性:{value}',\n 'magpie.management.manualPickEmpty': '请选择模型',\n 'magpie.management.reviewPick': '手动固定:{value}',\n 'magpie.management.reviewUnlists': '只显示路由组:{value}',\n 'magpie.management.reviewFast': '快速模式:{count} 个模型',\n 'magpie.management.reviewListed': '公开:{value}',\n 'magpie.management.reviewChanges': '检查变更',\n 'magpie.management.cancel': '取消',\n 'magpie.management.apply': '应用变更',\n 'magpie.management.saving': '保存中…',\n 'magpie.management.saved': '已保存,并已通过 Magpie 回读验证。',\n 'magpie.management.saveFailed': 'Magpie 未确认此变更。请刷新并检查当前值。',\n 'magpie.management.reset': '重置',\n 'magpie.sessionsCount': '{count} 个会话',\n 'magpie.sessionSearch': '按 Agent 或 ID 筛选会话',\n 'magpie.openRequests': '查看请求',\n 'magpie.clearSession': '清除会话筛选',\n 'magpie.requestFor': '{agent} 的请求 · {id}',\n 'magpie.colTime': '时间',\n 'magpie.colProvider': '提供商 / 账户',\n 'magpie.colRoute': '请求 → 实际服务',\n 'magpie.colTokens': 'Token',\n 'magpie.colCost': '费用',\n 'magpie.colStatus': '状态 / 耗时',\n 'magpie.routeId': '路由 #{id}',\n 'magpie.priced': '已计价',\n 'magpie.unpricedStatus': '未计价',\n 'magpie.previous': '上一页',\n 'magpie.next': '下一页',\n 'magpie.pageOf': '第 {page} 页',\n 'magpie.loadMore': '加载更多',\n 'magpie.loadedCount': '已加载 {count} 条',\n 'magpie.quotaHistory': '额度历史',\n 'magpie.quotaHistoryNote': 'Magpie 记录的剩余额度;单位以各提供商报告为准。',\n 'magpie.dailyUsage': '每日用量',\n 'magpie.remaining': '剩余 {percent}%',\n 'magpie.used': '已用 {percent}%',\n 'magpie.quotaViewLabel': '订阅卡显示口径',\n 'magpie.quotaViewUsed': '已用',\n 'magpie.quotaViewRemaining': '剩余',\n 'magpie.quotaViewFailed': '显示口径保存失败',\n 'magpie.resets': '重置时间 {time}',\n 'magpie.account': '账户 {account}',\n 'magpie.noLimit': '未报告额度上限',\n 'magpie.quotaAccounts': '{count} 个账号',\n 'magpie.quotaShowAllAccounts': '展开全部账号',\n 'magpie.quotaShowMainAccount': '只显示主账号',\n 'magpie.quotaCollapseAccounts': '{count} 个账号 · 收起其余账号',\n 'magpie.balance': '余额',\n 'magpie.quotaRemainingAccounts': '另 {count} 个',\n 'magpie.sessionCountUnknown': '未报告会话总数',\n 'magpie.install.platform': 'Host 平台:{platform}',\n 'magpie.install.title': '本机未找到可用的 Magpie',\n 'magpie.install.detected': '已检测到 Magpie {version}:{command}',\n 'magpie.install.recheck': '重新检测',\n 'magpie.install.checking': '检测中…',\n 'magpie.install.checkedAt': '上次检测:{time}',\n 'magpie.install.reason.launch': '入口 {command} 存在,但 Magpie 无法运行;请检查安装后重试。',\n 'magpie.install.reason.timeout': '入口 {command} 未在限定时间内响应;请检查安装后重试。',\n 'magpie.install.reason.version': '入口 {command} 已运行,但没有输出可识别的 Magpie 版本。',\n 'magpie.install.command': 'magpie --version',\n 'magpie.install.installHelp.macos': '请使用官方 GitHub Release 或安装脚本安装 Magpie,然后重新打开 DSH。Host 会读取登录 Shell 的 PATH,以及 Homebrew、/usr/local/bin、~/.local/bin 等常见独立程序目录。',\n 'magpie.install.installHelp.windows': '请使用官方 GitHub Release 或安装脚本安装 Magpie。Host 会读取 Windows 注册表中的 PATH,并检查安装脚本使用的 %USERPROFILE%\\\\.local\\\\bin 以及其他常见独立程序目录。安装后请重新打开 DSH,以读取新的 PATH。',\n 'magpie.install.installHelp.linux': '请使用官方 GitHub Release 或安装脚本安装 Magpie,然后重新打开 DSH。Host 会读取登录 Shell 的 PATH、/usr/local/bin 和 ~/.local/bin。',\n 'magpie.install.customToggle': '手动指定 Magpie 路径',\n 'magpie.install.customLabel': 'Magpie 可执行文件的绝对路径',\n 'magpie.install.customPlaceholder': '/opt/homebrew/bin/magpie 或 C:\\\\Users\\\\你\\\\.local\\\\bin\\\\magpie.exe',\n 'magpie.install.customHelp': '请输入不带引号和参数的文件绝对路径。检测成功后保存在当前 Host,重启 DSH 后会重新校验。',\n 'magpie.install.customApply': '检测此路径',\n 'magpie.install.customReset': '恢复自动检测',\n 'magpie.install.disabledNote': '检测到可用的 Magpie CLI 前,Magpie 管理保持关闭。',\n}\n","export const en: Record<string, string> = {\n 'update.localeTag': 'en-US',\n 'update.newVersionBadge': 'New',\n 'update.toggleDetails': 'Show or hide update details',\n 'update.newVersion': 'New version {version}',\n 'update.title': 'Plugin updates',\n 'update.description': 'Check npm releases and review the exact GitHub tag.',\n 'update.hostVersion': 'Running Host:',\n 'update.clientVersion': 'Running Client:',\n 'update.installedVersion': 'Installed package:',\n 'update.unknown': 'Unknown',\n 'update.activationHelp': 'Package installation and live code activation are reported separately. This DSH version cannot confirm a Desktop Client reload.',\n 'update.channel': 'Release channel',\n 'update.latest': 'npm latest',\n 'update.next': 'npm next (prerelease)',\n 'update.exact': 'Exact version',\n 'update.exactVersion': 'Exact npm version',\n 'update.check': 'Check for updates',\n 'update.checking': 'Checking npm and GitHub...',\n 'update.requestError': 'The request could not be completed. Retry the check or review native DSH Plugins.',\n 'update.previousResult': 'Previous check shown. Check again before updating.',\n 'update.targetVersion': 'Target version:',\n 'update.publishedAt': 'Published:',\n 'update.releasePublishedAt': 'GitHub release published:',\n 'update.commit': 'Source commit:',\n 'update.compatibility': 'DSH compatibility:',\n 'update.openRelease': 'Open exact GitHub release',\n 'update.noNotes': 'Release notes are unavailable for this exact tag.',\n 'update.nativeFallback': 'Use native DSH Plugins to review package status and complete any required update or restart.',\n 'update.review': 'Review update',\n 'update.confirmTitle': 'Confirm the exact package update',\n 'update.confirmHelp': 'Install Codingns4DSH {version} through the DSH package manager? The new Host and Client code may require a DSH restart.',\n 'update.confirm': 'Confirm and update',\n 'update.back': 'Back',\n 'update.cancel': 'Request cancellation',\n 'update.refreshStatus': 'Refresh operation status',\n 'update.operationHelp': 'DSH owns this operation. Closing settings does not cancel it. Cancellation is confirmed only after DSH finishes restoring the package files.',\n 'update.packageState': 'Package:',\n 'update.hostActivation': 'Host activation:',\n 'update.clientActivation': 'Client activation:',\n 'update.checkState.up-to-date': 'This channel is up to date.',\n 'update.checkState.update-available': 'A newer version is available.',\n 'update.checkState.no-newer-version': 'This channel is older than the running or installed version.',\n 'update.checkState.incompatible': 'This target is incompatible with the running DSH.',\n 'update.checkState.compatibility-unknown': 'Target compatibility could not be confirmed. Updating is blocked.',\n 'update.checkState.unavailable': 'Update information is unavailable.',\n 'update.checkState.unsupported': 'This runtime does not support checking the active version.',\n 'update.compatibilityState.compatible': 'Compatible',\n 'update.compatibilityState.incompatible': 'Incompatible',\n 'update.compatibilityState.unknown': 'Unknown',\n 'update.phase.installing': 'Installing through DSH...',\n 'update.phase.cancelling': 'Waiting for DSH cancellation...',\n 'update.phase.applying': 'DSH is applying the package...',\n 'update.phase.completed': 'Operation completed',\n 'update.application.applied-without-desktop-restart': 'Host and Client are active at the target version.',\n 'update.application.restart-required': 'Package installed; restart required to activate the code.',\n 'update.application.activation-unknown': 'Live activation could not be confirmed.',\n 'update.application.failed': 'The update failed. Review package status before retrying.',\n 'update.application.cancelled': 'DSH cancelled the update.',\n 'update.application.unsupported': 'Use native DSH Plugins to update this package.',\n 'update.package.installed': 'Installed',\n 'update.package.unchanged': 'Unchanged',\n 'update.package.rolled-back': 'Profile files restored by DSH',\n 'update.package.unknown': 'Unknown; review native DSH Plugins',\n}\n\nexport const zh: Record<string, string> = {\n 'update.localeTag': 'zh-CN',\n 'update.newVersionBadge': '新版本',\n 'update.toggleDetails': '展开或收起更新详情',\n 'update.newVersion': '新版本 {version}',\n 'update.title': '插件更新',\n 'update.description': '检查 npm 发布版本,并查看对应的 GitHub 标签。',\n 'update.hostVersion': '运行中的 Host:',\n 'update.clientVersion': '运行中的 Client:',\n 'update.installedVersion': '已安装的软件包:',\n 'update.unknown': '未知',\n 'update.activationHelp': '软件包安装状态与运行时代码激活状态分开显示。当前 DSH 版本无法确认 Desktop Client 是否已重新加载。',\n 'update.channel': '发布渠道',\n 'update.latest': 'npm latest(稳定版)',\n 'update.next': 'npm next(预发布版)',\n 'update.exact': '指定版本',\n 'update.exactVersion': 'npm 指定版本号',\n 'update.check': '检查更新',\n 'update.checking': '正在检查 npm 和 GitHub……',\n 'update.requestError': '请求未完成。请重试,或到 DSH 原生插件页面查看状态。',\n 'update.previousResult': '显示的是上一次检查结果。更新前请重新检查。',\n 'update.targetVersion': '目标版本:',\n 'update.publishedAt': 'npm 发布时间:',\n 'update.releasePublishedAt': 'GitHub 发布时间:',\n 'update.commit': '源代码提交:',\n 'update.compatibility': 'DSH 兼容性:',\n 'update.openRelease': '打开对应的 GitHub Release',\n 'update.noNotes': '该精确标签没有可用的 Release notes。',\n 'update.nativeFallback': '请到 DSH 原生插件页面查看软件包状态,并完成必要的更新或重启。',\n 'update.review': '查看更新',\n 'update.confirmTitle': '确认更新指定软件包',\n 'update.confirmHelp': '通过 DSH 软件包管理器安装 Codingns4DSH {version}?新的 Host 和 Client 代码可能需要重启 DSH 才能生效。',\n 'update.confirm': '确认并更新',\n 'update.back': '返回',\n 'update.cancel': '请求取消',\n 'update.refreshStatus': '刷新操作状态',\n 'update.operationHelp': '此操作由 DSH 管理。关闭设置不会取消操作;只有 DSH 完成软件包恢复后,取消才会被确认。',\n 'update.packageState': '软件包状态:',\n 'update.hostActivation': 'Host 激活状态:',\n 'update.clientActivation': 'Client 激活状态:',\n 'update.checkState.up-to-date': '此渠道已经是最新版本。',\n 'update.checkState.update-available': '发现新版本。',\n 'update.checkState.no-newer-version': '此渠道版本低于当前运行或已安装版本。',\n 'update.checkState.incompatible': '此目标版本与当前 DSH 不兼容。',\n 'update.checkState.compatibility-unknown': '无法确认目标版本兼容性,更新已阻止。',\n 'update.checkState.unavailable': '更新信息暂不可用。',\n 'update.checkState.unsupported': '当前运行环境不支持检查活动版本。',\n 'update.compatibilityState.compatible': '兼容',\n 'update.compatibilityState.incompatible': '不兼容',\n 'update.compatibilityState.unknown': '未知',\n 'update.phase.installing': '正在通过 DSH 安装……',\n 'update.phase.cancelling': '正在等待 DSH 完成取消……',\n 'update.phase.applying': 'DSH 正在应用软件包……',\n 'update.phase.completed': '操作已完成',\n 'update.application.applied-without-desktop-restart': 'Host 和 Client 已运行目标版本。',\n 'update.application.restart-required': '软件包已安装;需要重启才能激活新代码。',\n 'update.application.activation-unknown': '无法确认运行时代码是否已激活。',\n 'update.application.failed': '更新失败。请先检查软件包状态再重试。',\n 'update.application.cancelled': 'DSH 已取消更新。',\n 'update.application.unsupported': '请使用 DSH 原生插件页面更新此软件包。',\n 'update.package.installed': '已安装',\n 'update.package.unchanged': '未改变',\n 'update.package.rolled-back': 'DSH 已恢复配置文件',\n 'update.package.unknown': '未知;请检查 DSH 原生插件页面',\n}\n","export const en: Record<string, string> = {\n 'feature.credentials.label': 'Credential management',\n 'feature.credentials.description': 'Store usernames, passwords, API keys, and other confidential values on the Host. Selected fields reach external Agent processes only through environment variables.',\n 'credentials.title': 'Saved credentials',\n 'credentials.add': 'Add credential',\n 'credentials.edit': 'Edit',\n 'credentials.delete': 'Delete',\n 'credentials.deleteConfirm': 'Delete this credential? Existing sessions will stop receiving it on their next turn.',\n 'credentials.label': 'Name',\n 'credentials.id': 'ID',\n 'credentials.field': 'Field',\n 'credentials.value': 'Value',\n 'credentials.addField': 'Add field',\n 'credentials.removeField': 'Remove field',\n 'credentials.keepExisting': 'Keep existing value',\n 'credentials.clearValue': 'Clear value',\n 'credentials.save': 'Save credential',\n 'credentials.cancel': 'Cancel',\n 'credentials.empty': 'No credentials saved.',\n 'credentials.masked': 'stored',\n 'credentials.saved': 'Credential saved.',\n 'credentials.deleted': 'Credential deleted.',\n 'credentials.failed': 'Credential operation failed.',\n 'credentials.security': 'Secret values are stored on the Host and are never returned to this page or sent through the Agent conversation.',\n 'credentials.sessionBindings': 'Session environment bindings',\n 'credentials.sessionBindingsHint': 'Choose fields for the current external Agent session. Only the selected environment variable names are saved.',\n 'credentials.choose': 'Choose credentials',\n 'credentials.noneSelected': 'No credentials selected',\n 'credentials.bindingEnv': 'Environment variable',\n 'credentials.bindingSaved': 'Credential bindings saved.',\n 'credentials.bindingLoadFailed': 'Could not read saved credentials.',\n 'credentials.unsupported': 'This Agent does not support Host-managed environment injection.',\n 'credentials.masterPassword': 'Master password',\n 'credentials.currentMasterPassword': 'Current master password',\n 'credentials.newMasterPassword': 'New master password',\n 'credentials.masterPasswordHint': 'Set a Host-local master password for credential management. The password is never returned to the browser after saving.',\n 'credentials.saveMasterPassword': 'Save master password',\n 'credentials.masterPasswordSaved': 'Master password saved.',\n 'credentials.loading': 'Loading credentials…',\n 'credentials.disabledHint': 'Enable the credential management module before managing credentials.',\n 'credentials.referenceSearch': 'Search credentials',\n 'credentials.referenceEmpty': 'No matching credentials.',\n 'credentials.commandLabel': 'Credential',\n 'credentials.commandDescription': 'Insert a Host-managed credential reference into this external Agent session.',\n 'credentials.commandUnavailable': 'Could not insert this credential reference.',\n}\n\nexport const zh: Record<string, string> = {\n 'feature.credentials.label': '凭据管理',\n 'feature.credentials.description': '在 Host 保存用户名、密码、API Key 和其他机密值。选中的字段只通过环境变量提供给外部 Agent 进程。',\n 'credentials.title': '已保存的凭据',\n 'credentials.add': '添加凭据',\n 'credentials.edit': '编辑',\n 'credentials.delete': '删除',\n 'credentials.deleteConfirm': '删除这条凭据?已有会话下一轮将不再收到它。',\n 'credentials.label': '名称',\n 'credentials.id': 'ID',\n 'credentials.field': '字段',\n 'credentials.value': '值',\n 'credentials.addField': '添加字段',\n 'credentials.removeField': '移除字段',\n 'credentials.keepExisting': '保留现有值',\n 'credentials.clearValue': '清除值',\n 'credentials.save': '保存凭据',\n 'credentials.cancel': '取消',\n 'credentials.empty': '尚未保存凭据。',\n 'credentials.masked': '已保存',\n 'credentials.saved': '凭据已保存。',\n 'credentials.deleted': '凭据已删除。',\n 'credentials.failed': '凭据操作失败。',\n 'credentials.security': '机密值只保存在 Host,不会返回到此页面,也不会通过 Agent 对话发送。',\n 'credentials.sessionBindings': '会话环境变量绑定',\n 'credentials.sessionBindingsHint': '为当前外部 Agent 会话选择字段。保存的只有环境变量名。',\n 'credentials.choose': '选择凭据',\n 'credentials.noneSelected': '未选择凭据',\n 'credentials.bindingEnv': '环境变量',\n 'credentials.bindingSaved': '凭据绑定已保存。',\n 'credentials.bindingLoadFailed': '无法读取已保存凭据。',\n 'credentials.unsupported': '此 Agent 不支持 Host 管理的环境变量注入。',\n 'credentials.masterPassword': '主密码',\n 'credentials.currentMasterPassword': '当前主密码',\n 'credentials.newMasterPassword': '新主密码',\n 'credentials.masterPasswordHint': '为凭据管理设置仅保存在 Host 的主密码。保存后不会把密码返回到浏览器。',\n 'credentials.saveMasterPassword': '保存主密码',\n 'credentials.masterPasswordSaved': '主密码已保存。',\n 'credentials.loading': '正在加载凭据…',\n 'credentials.disabledHint': '请先启用凭据管理模块,再管理凭据。',\n 'credentials.referenceSearch': '搜索凭据',\n 'credentials.referenceEmpty': '没有匹配的凭据。',\n 'credentials.commandLabel': '凭据',\n 'credentials.commandDescription': '向当前外部 Agent 会话插入 Host 管理的凭据引用。',\n 'credentials.commandUnavailable': '无法插入此凭据引用。',\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client'\nimport type { Translate } from '@deepseek-ai/dsh-client-ui-slots'\nimport * as debugDictionary from './locales/debug.js'\nimport * as fileWorkspaceDictionary from './locales/fileWorkspace.js'\nimport * as gitDictionary from './locales/git.js'\nimport * as panelsDictionary from './locales/panels.js'\nimport * as peerHostDictionary from './locales/peerHost.js'\nimport * as peerHostWorkspaceDictionary from './locales/peerHostWorkspace.js'\nimport * as terminalAuthDictionary from './locales/terminalAuth.js'\nimport * as usageDictionary from './locales/usage.js'\nimport * as subagentCollapsedDictionary from './locales/subagentCollapsed.js'\nimport * as quickAppsDictionary from './locales/quickApps.js'\nimport * as cliManagementDictionary from './locales/cliManagement.js'\nimport * as magpieDictionary from './locales/magpie.js'\nimport * as pluginUpdateDictionary from './locales/pluginUpdate.js'\nimport * as credentialsDictionary from './locales/credentials.js'\n\n/** Codingns4DSH 自有词典命名空间。词典缺少的语言由 DSH 自动回退到英文。 */\nexport const CODINGNS_LOCALE_NS = 'codingns' as const\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n codingns: string\n }\n}\n\n/** Client 侧服务中实际使用的 DSH 语言运行时最小接口。 */\nexport type CodingNsLocale = Pick<LocaleRuntime, 'bind' | 'getSnapshot' | 'subscribe' | 'register'>\nexport type CodingNsTranslator = Translate<string>\n\nconst CORE_EN: Record<string, string> = {\n 'common.brand': 'Codingns4DSH',\n 'settings.title': 'Codingns4DSH features',\n 'settings.subtitle': 'Configure modules without changing DSH global settings.',\n 'settings.version': 'Codingns4DSH v{version}',\n 'settings.compatibility': 'Compatible with DSH {range}',\n 'settings.testedDshVersion': 'Tested with DSH {version}',\n 'settings.untestedDshWarning': 'DSH {version} is newer than the latest tested version ({tested}). Compatibility has not been verified; plugin installation and operation remain enabled.',\n 'settings.toggle': '{label} toggle',\n 'settings.legacyFallback': 'This DSH version uses compatibility mode; multi-tab and shell-selection extensions are unavailable.',\n 'settings.versionBlocked': 'This module is unavailable on DSH {version}; it requires DSH {minimum} or newer.',\n 'settings.moduleEnabled': '{label} enabled.',\n 'settings.moduleDisabled': '{label} disabled.',\n 'settings.moduleWriteRejected': 'The setting change was rejected; please retry.',\n 'settings.requirement.magpieInstall': 'Magpie is not installed or not usable on this Host. Install Magpie and detect again before enabling this module.',\n 'settings.requirement.checking': 'Checking whether Magpie is available on this Host…',\n 'settings.promo.sectionLabel': 'Codingns4DSH promotion',\n 'settings.promo.version': 'Version {version}',\n 'settings.promo.starHint': 'If Codingns4DSH helps you, please give us a Star on GitHub — it means a lot to us.',\n 'settings.promo.github': 'GitHub',\n 'settings.promo.actionLabel': 'Open the Codingns4DSH GitHub repository in a new tab',\n 'feature.workspaceSession.legacyFallback': 'DSH 0.1.5 compatibility path is enabled but not verified. Session-row DOM injection and archive entry placement may vary; restoring archived sessions is unavailable.',\n 'feature.lanAccess.label': 'LAN access to DSH',\n 'feature.lanAccess.description': 'Access DSH through a LAN IP, provide crypto.randomUUID when needed, and forward the listener to the current DSH Web port.',\n 'feature.loginProtection.label': 'Login protection',\n 'feature.loginProtection.description': 'Protect LAN and relay DSH Web access with one local account; loopback access is always allowed.',\n 'feature.reverseProxy.label': 'Relay access service',\n 'feature.reverseProxy.description': 'Access a DSH Host through the isolated Codingns4DSH relay.',\n 'feature.cliAdapters.label': 'External Agent integration',\n 'feature.cliAdapters.description': 'View installed external Agents, versions, command paths, available models, and enable them independently. External Agent context panels keep only the occupancy percentage and totals.',\n 'feature.workspaceSession.label': 'Workspace session enhancement',\n 'feature.workspaceSession.description': 'Show Agent logos, archived-session entries, workspace hiding controls, subscription or usage information, local quick sessions, and an optional remembered conversation/right-sidebar width ratio.',\n 'feature.workspaceMcp.label': 'Workspace MCP server',\n 'feature.workspaceMcp.description': 'Expose managed workspace tools to local MCP clients, with optional LAN access through the authenticated Host listener.',\n 'workspaceMcp.setupTitle': 'MCP access key',\n 'workspaceMcp.setupInstruction': 'Generate a key to save it on the Host and enable the local MCP listener.',\n 'workspaceMcp.lanAccessLabel': 'Expose MCP on the LAN',\n 'workspaceMcp.lanAccessDescription': 'Allow authenticated MCP clients on the LAN access listener to use the same MCP endpoint and port.',\n 'workspaceMcp.lanAccessSaved': 'Workspace MCP LAN exposure setting saved.',\n 'workspaceMcp.lanAccessStatus': 'LAN exposure: {status}',\n 'workspaceMcp.generateKey': 'Generate key and enable',\n 'workspaceMcp.rotateKey': 'Rotate key',\n 'workspaceMcp.generating': 'Generating…',\n 'workspaceMcp.generatedKey': 'Generated Workspace MCP API key',\n 'workspaceMcp.keyGenerated': 'Workspace MCP key generated and module enabled.',\n 'workspaceMcp.copyKey': 'Copy key',\n 'workspaceMcp.keyCopied': 'Workspace MCP key copied.',\n 'workspaceMcp.copyFailed': 'Could not copy the key. Select and copy it manually.',\n 'workspaceMcp.keyShownOnce': 'This key is shown only now. Copy it into your MCP client before closing or refreshing this panel.',\n 'workspaceMcp.capabilityDescription': 'MCP capability description',\n 'workspaceMcp.capabilityTitle': 'Supported MCP capabilities',\n 'workspaceMcp.capabilitySubtitle': 'The list below describes the fixed Workspace MCP tool catalog and its access boundaries.',\n 'workspaceMcp.capabilityName': 'Name',\n 'workspaceMcp.capabilityPermission': 'Permission',\n 'workspaceMcp.capabilityDescriptionField': 'Description',\n 'workspaceMcp.capabilityParameters': 'Invocation parameters',\n 'workspaceMcp.capabilityRemarks': 'Remarks',\n 'workspaceMcp.closeCapabilities': 'Close',\n 'workspaceMcp.installPromptTitle': 'Install the Agent Skill',\n 'workspaceMcp.installPromptHint': 'Copy this prompt to your Agent. It will install the root SKILL.md into that Agent’s personal skills directory.',\n 'workspaceMcp.copyInstallPrompt': 'Copy install prompt',\n 'workspaceMcp.installPromptCopied': 'Agent Skill installation prompt copied.',\n 'workspaceMcp.installPromptText': 'Fetch https://github.com/jingyi0605/Codingns4DSH/blob/main/SKILL.md and install it into your personal Agent Skills directory using your documented Skill installation method.',\n 'workspaceMcp.capability.workspaceList.permission': 'Read managed workspace metadata',\n 'workspaceMcp.capability.workspaceList.description': 'Lists managed workspaces available to the local Host.',\n 'workspaceMcp.capability.workspaceList.parameters': '{}',\n 'workspaceMcp.capability.workspaceList.remarks': 'Returns names and active session counts; filesystem roots are never exposed.',\n 'workspaceMcp.capability.sessionList.permission': 'Read bounded session metadata',\n 'workspaceMcp.capability.sessionList.description': 'Lists sessions belonging to managed workspaces.',\n 'workspaceMcp.capability.sessionList.parameters': '{ workspaceId?, limit?, offset? }',\n 'workspaceMcp.capability.sessionList.remarks': 'Results are paginated and contain metadata only, without full conversation history.',\n 'workspaceMcp.capability.sessionCreate.permission': 'Create a managed session and optionally queue a prompt',\n 'workspaceMcp.capability.sessionCreate.description': 'Creates a native DSH session and can select an installed adapter/model.',\n 'workspaceMcp.capability.sessionCreate.parameters': '{ workspaceId, adapterId?, modelId?, prompt? }',\n 'workspaceMcp.capability.sessionCreate.remarks': 'External adapter sessions require an initial prompt; uncertain outcomes include the created session ID.',\n 'workspaceMcp.capability.sessionContinue.permission': 'Queue a message in an existing session',\n 'workspaceMcp.capability.sessionContinue.description': 'Continues one exact managed session without replacing its identity.',\n 'workspaceMcp.capability.sessionContinue.parameters': '{ sessionId, message }',\n 'workspaceMcp.capability.sessionContinue.remarks': 'The session is revalidated immediately before prompt admission.',\n 'workspaceMcp.capability.sessionQuestions.permission': 'Read unresolved native questions',\n 'workspaceMcp.capability.sessionQuestions.description': 'Lists questions currently awaiting an answer in a managed session.',\n 'workspaceMcp.capability.sessionQuestions.parameters': '{ sessionId }',\n 'workspaceMcp.capability.sessionQuestions.remarks': 'Question content and options are bounded; archived or unrelated sessions are rejected.',\n 'workspaceMcp.capability.sessionAnswer.permission': 'Answer one unresolved native question',\n 'workspaceMcp.capability.sessionAnswer.description': 'Submits validated answers through the native DSH question mechanism.',\n 'workspaceMcp.capability.sessionAnswer.parameters': '{ sessionId, callId, answer }',\n 'workspaceMcp.capability.sessionAnswer.remarks': 'The call ID must come from the current question list and answers are checked against its options.',\n 'workspaceMcp.capability.sessionRequestPermission.permission': 'Request human approval',\n 'workspaceMcp.capability.sessionRequestPermission.description': 'Asks the native DSH approval UI to decide an operation.',\n 'workspaceMcp.capability.sessionRequestPermission.parameters': '{ sessionId, toolName, reason, callId? }',\n 'workspaceMcp.capability.sessionRequestPermission.remarks': 'Requires an active DSH turn; the MCP client cannot approve its own request.',\n 'workspaceMcp.capability.sessionPermissionStatus.permission': 'Read an owned approval outcome',\n 'workspaceMcp.capability.sessionPermissionStatus.description': 'Reads the status of an approval request created by this MCP feature.',\n 'workspaceMcp.capability.sessionPermissionStatus.parameters': '{ sessionId, requestId }',\n 'workspaceMcp.capability.sessionPermissionStatus.remarks': 'Only DSH-issued request IDs retained by the live feature are queryable.',\n 'workspaceMcp.capability.terminalList.permission': 'Read live terminal metadata',\n 'workspaceMcp.capability.terminalList.description': 'Lists terminal instances attached to one managed session.',\n 'workspaceMcp.capability.terminalList.parameters': '{ workspaceId, sessionId }',\n 'workspaceMcp.capability.terminalList.remarks': 'Only live terminals in the specified workspace/session scope are returned.',\n 'workspaceMcp.capability.terminalRead.permission': 'Read terminal output',\n 'workspaceMcp.capability.terminalRead.description': 'Returns a bounded output snapshot from one live terminal.',\n 'workspaceMcp.capability.terminalRead.parameters': '{ workspaceId, sessionId, terminalId, limitBytes? }',\n 'workspaceMcp.capability.terminalRead.remarks': 'Output is limited to 64 KiB and is never read from an unrelated terminal.',\n 'workspaceMcp.capability.terminalWrite.permission': 'Write terminal input',\n 'workspaceMcp.capability.terminalWrite.description': 'Writes bounded text to one existing live terminal process.',\n 'workspaceMcp.capability.terminalWrite.parameters': '{ workspaceId, sessionId, terminalId, data }',\n 'workspaceMcp.capability.terminalWrite.remarks': 'Input is limited to 16 KiB, rejects NUL bytes, and cannot create arbitrary processes.',\n 'workspaceMcp.statusTitle': 'Host status',\n 'workspaceMcp.loading': 'Reading Workspace MCP status…',\n 'workspaceMcp.statusFailed': 'Unable to read Workspace MCP status from the Host.',\n 'workspaceMcp.apiKeyStatus': 'API key: {status}',\n 'workspaceMcp.enabledStatus': 'Module: {status}',\n 'workspaceMcp.listeningStatus': 'Listener: {status}',\n 'workspaceMcp.configured': 'configured',\n 'workspaceMcp.notConfigured': 'not configured',\n 'workspaceMcp.on': 'on',\n 'workspaceMcp.off': 'off',\n 'workspaceMcp.url': 'Endpoint',\n 'workspaceMcp.refresh': 'Refresh status',\n 'workspaceMcp.reason.keyMissing': 'Generate a Workspace MCP API key to start the listener.',\n 'workspaceMcp.reason.keyStoreFailed': 'The Host could not access the Workspace MCP key file.',\n 'workspaceMcp.reason.disabled': 'The Workspace MCP module is disabled.',\n 'workspaceMcp.reason.listenFailed': 'The local MCP listener could not start.',\n 'workspaceMcp.reason.other': 'The Host reported an additional status reason.',\n 'feature.mobileAccess.label': 'Mobile access enhancements',\n 'feature.mobileAccess.description': 'On phones or narrow viewports, hide the left sidebar entirely and keep only the top-left logo as the way back in.',\n 'mobile.hideSidebarOnMobile': 'Fully hide the left sidebar on mobile',\n 'mobile.hideSidebarOnMobileDescription': 'DSH keeps a 56px icon rail when the sidebar is collapsed on a narrow screen. Turning this on collapses that rail to zero width and floats the native logo button at the top-left as the only entry point; opening the sidebar still uses the DSH layout service.',\n 'mobile.optimizeSettingsOnMobile': 'Optimize mobile settings',\n 'mobile.optimizeSettingsOnMobileDescription': 'Use a compact layout for the settings window on mobile screens.',\n 'mobile.viewportMax': 'Mobile viewport limit (px)',\n 'mobile.viewportMaxHelp': 'At or below this width the sidebar is treated as mobile; the range is 480–1280.',\n 'mobile.saved': 'Mobile access settings saved.',\n 'mobile.pwaRequiresListener': 'These assets are served by the LAN access listener; start that listener in the LAN access card first.',\n 'feature.terminal.label': 'Terminal enhancements',\n 'feature.terminal.description': 'Configure the default shell and terminal appearance. Enabling or disabling requires a DSH restart.',\n 'feature.fileManagement.label': 'File management enhancements',\n 'feature.fileManagement.description': 'Add file and folder operation menus to the DSH file sidebar and edit common text files in place.',\n 'fileManagement.menuEnhancement': 'File and folder operation menu',\n 'fileManagement.menuEnhancementDescription': 'Show the right-click operation menu for files and folders in the DSH sidebar, and copy relative or absolute paths from the file viewer.',\n 'fileManagement.fileEditor': 'File viewer editor',\n 'fileManagement.fileEditorDescription': 'Show the icon button for editing supported text files with syntax highlighting and line numbers.',\n 'fileManagement.sessionChangedFiles': 'Show current session changed files',\n 'fileManagement.sessionChangedFilesDescription': 'Show the files changed in the current session and their Git Diff.',\n 'fileManagement.saved': 'File management settings saved.',\n 'terminal.title': 'Terminal',\n 'terminal.new': 'New terminal',\n 'terminal.close': 'Close terminal',\n 'terminal.refresh': 'Refresh terminal',\n 'terminal.tools': 'Terminal shortcuts',\n 'terminal.holdCtrl': 'Hold Ctrl',\n 'terminal.holdAlt': 'Hold Alt',\n 'terminal.holdWin': 'Hold Win',\n 'terminal.holdOption': 'Hold Option',\n 'terminal.holdCommand': 'Hold Command',\n 'terminal.holdSuper': 'Hold Super',\n 'terminal.shortcutTab': 'Tab',\n 'terminal.shortcutEscape': 'Escape',\n 'terminal.shortcutEnter': 'Enter',\n 'terminal.shortcutBackspace': 'Backspace',\n 'terminal.shortcutUp': 'Arrow up',\n 'terminal.shortcutDown': 'Arrow down',\n 'terminal.shortcutLeft': 'Arrow left',\n 'terminal.shortcutRight': 'Arrow right',\n 'terminal.shortcutC': 'C (Ctrl+C when Ctrl is held)',\n 'terminal.shortcutD': 'D (Ctrl+D when Ctrl is held)',\n 'terminal.shortcutL': 'L (Ctrl+L when Ctrl is held)',\n 'terminal.shortcutZ': 'Z (Ctrl+Z when Ctrl is held)',\n 'terminal.description': 'Run commands in the session workspace',\n 'terminal.loadingShell': 'Reading shells…',\n 'terminal.retry': 'Retry',\n 'terminal.noShell': 'No available shell',\n 'terminal.selectShell': 'Select Shell',\n 'terminal.error': 'Terminal error',\n 'terminal.rename': 'Double-click to rename terminal',\n 'terminal.cleanupFailed': 'Terminal “{title}” could not be closed: {message}',\n 'terminal.currentStatus': 'Current status: {status}; Host platform: {platform}',\n 'terminal.enhanced': 'Terminal enhancement enabled',\n 'terminal.basic': 'Basic local terminal',\n 'terminal.saved': 'Terminal settings saved',\n 'terminal.saveRejected': 'Host rejected the terminal settings change; please retry.',\n 'terminal.readingStatus': 'Reading Host terminal status…',\n 'terminal.restartNote': 'Enabling or disabling requires a DSH restart. Disabling stops restoration and connection only; existing tmux or ConPTY sessions are not terminated.',\n 'terminal.appearanceTitle': 'Terminal appearance',\n 'terminal.resetAppearance': 'Reset appearance defaults',\n 'terminal.newDefault': 'New terminal default',\n 'terminal.theme': 'Theme',\n 'terminal.bindingScope': 'Terminal binding scope',\n 'terminal.systemRecommended': 'System recommended',\n 'terminal.inheritDshTheme': 'Inherit DSH theme',\n 'terminal.custom': 'Custom',\n 'terminal.background': 'Background color',\n 'terminal.foreground': 'Text color',\n 'terminal.cursorColor': 'Cursor color',\n 'terminal.fontSize': 'Font size (px)',\n 'terminal.lineHeight': 'Line height',\n 'terminal.cursorShape': 'Cursor shape',\n 'terminal.cursorBlink': 'Cursor blink',\n 'terminal.scrollback': 'Scrollback lines',\n 'terminal.inherit': 'Inherit',\n 'terminal.workspaceBinding': 'Bind by workspace (recommended)',\n 'terminal.sessionBinding': 'Bind by DSH session',\n 'terminal.workspaceBindingHelp': 'Workspace mode shares a terminal between DSH sessions in the same workspace; session mode gives each session its own terminal. Changing the scope requires a restart.',\n 'terminal.defaultProfileHelp': '“System recommended” is resolved by Host from the operating system and installed shells; unavailable saved values fall back to the system recommendation.',\n 'terminal.profileUnavailable': '{profile} (currently unavailable)',\n 'terminal.cursorInherit': 'Inherit',\n 'terminal.cursorBlock': 'Block',\n 'terminal.cursorBar': 'Bar',\n 'terminal.cursorUnderline': 'Underline',\n 'terminal.cursorOn': 'On',\n 'terminal.cursorOff': 'Off',\n 'terminal.unsupportedPlatform': 'Unsupported platform',\n 'lan.listenHost': 'Listen host',\n 'lan.description': 'Add a listener on this machine and redirect access to the current DSH Web. This is LAN access and does not use the cross-NAT relay service.',\n 'lan.listenPort': 'Listen port',\n 'lan.dshPort': 'Local DSH port (auto-detected, or enter manually)',\n 'lan.allInterfaces': 'All interfaces (0.0.0.0)',\n 'lan.detect': 'Auto-detect',\n 'lan.detectMultiple': 'Multiple DSH instance ports detected: {ports}. Select one manually.',\n 'lan.detectNone': 'No DSH Web port detected. Enter it manually.',\n 'lan.detected': 'Detected DSH Web ports: {ports}',\n 'lan.autoStart': 'Auto-start (restore the current mapping when DSH starts)',\n 'lan.start': 'Start LAN access to DSH',\n 'lan.update': 'Update LAN access to DSH',\n 'lan.stop': 'Stop',\n 'lan.forwardTarget': '→ DSH Web 127.0.0.1:{dshPort}',\n 'lan.statusStopped': 'Stopped',\n 'lan.statusStarting': 'Starting…',\n 'lan.statusListening': 'Running',\n 'lan.statusListeningCount': 'Running · {count} address(es) available',\n 'lan.statusError': 'Start failed',\n 'lan.accessUrlEmpty': 'No reachable address yet. Start the listener to get an access URL.',\n 'lan.copy': 'Copy',\n 'lan.copied': 'Copied',\n 'lan.copyAddressHint': 'Click to copy {url}',\n 'lan.copySuccess': 'Access URL copied',\n 'lan.copyFailed': 'Unable to copy the access URL',\n 'lan.started': 'LAN access to DSH started: {url}',\n 'lan.stopped': 'LAN access to DSH stopped',\n 'lan.autoStartOn': 'Auto-start enabled. The mapping will be restored the next time DSH starts.',\n 'lan.autoStartOff': 'Auto-start disabled',\n 'lan.processing': 'Processing…',\n 'lan.pwa.title': 'Mobile PWA assets',\n 'lan.pwa.description': 'Serve the manifest, icons, and install guidance from the LAN entry. Assets are only reachable through this listener.',\n 'lan.pwa.enabled': 'Provide PWA assets (manifest + icons)',\n 'lan.pwa.enabledHelp': 'Overrides the upstream manifest for this listener only: display mode becomes standalone and PNG icons are added.',\n 'lan.pwa.serviceWorker': 'Enable Service Worker',\n 'lan.pwa.serviceWorkerHelp': 'Only registers over HTTPS. Keeping it off avoids leaving a Service Worker on the phone.',\n 'lan.pwa.installPrompt': 'Show install guidance',\n 'lan.pwa.notifications': 'Notifications',\n 'lan.pwa.notificationsOff': 'Off',\n 'lan.pwa.notificationsLocal': 'Local (page open)',\n 'lan.pwa.notificationsPush': 'Push (needs VAPID)',\n 'lan.pwa.loopbackWarning': 'If NGINX runs on this same machine and proxies to 127.0.0.1, the proxy treats the traffic as loopback and skips login protection. Add authentication at the NGINX side or use a remote NGINX.',\n 'lan.pwa.saved': 'PWA settings saved',\n 'lan.pwa.requestPermission': 'Request notification permission',\n 'lan.pwa.permissionGranted': 'Notification permission granted',\n 'lan.pwa.permissionNotGranted': 'Notification permission was not granted',\n 'lan.pwa.sendTest': 'Send test notification',\n 'lan.pwa.testBody': 'This is a local test notification from Codingns4DSH.',\n 'lan.pwa.testSent': 'Test notification sent',\n 'lan.pwa.testFailed': 'Test notification failed: permission or platform unsupported',\n 'lan.pwa.subscribe': 'Subscribe to push',\n 'lan.pwa.unsubscribe': 'Unsubscribe',\n 'lan.pwa.pushUnavailable': 'Push is unavailable: the host push service is not enabled',\n 'lan.pwa.pushNeedsPermission': 'Allow notifications before subscribing',\n 'lan.pwa.swNeeded': 'Turn on the Service Worker before subscribing to push',\n 'lan.pwa.pushSubscribed': 'Push subscribed ({count} device(s) registered)',\n 'lan.pwa.pushUnsubscribed': 'Push subscription removed',\n 'lan.pwa.pushTest': 'Send test push',\n 'lan.pwa.pushTestSummary': 'Push result: {sent} sent, {failed} failed, {removed} cleaned',\n 'lan.pwa.pushDevices': 'Registered devices: {count}',\n 'lan.pwa.unregisterSw': 'Unregister Service Worker',\n 'lan.pwa.unregisterSwDone': 'Service Worker unregistered',\n 'lan.pwa.unregisterSwFailed': 'No Service Worker to unregister',\n 'lan.pwa.notificationState': 'Permission: {permission}; Notification API: {supported}; Secure context: {secure}; Service Worker: {sw}',\n 'lan.pwa.yes': 'yes',\n 'lan.pwa.no': 'no',\n 'lan.pwa.swActive': 'active',\n 'lan.pwa.swMissing': 'not registered',\n 'relay.controlApi': 'Relay service address',\n 'relay.add': 'Add',\n 'relay.cancel': 'Cancel',\n 'relay.adding': 'Adding…',\n 'relay.email': 'Email',\n 'relay.password': 'Password',\n 'relay.refreshDevices': 'Refresh devices',\n 'relay.logout': 'Log out',\n 'relay.bindHost': 'Bind current Host',\n 'relay.unbindHost': 'Unbind current Host',\n 'relay.hostLabel': 'Host label',\n 'relay.hostPublicKey': 'Host public key',\n 'relay.hostFingerprint': 'Host fingerprint',\n 'relay.settings': 'Service settings',\n 'relay.loginHint': 'Log in to Codingns4DSH to manage devices and the current Host.',\n 'relay.addServer': 'Add relay server',\n 'relay.addServerHint': 'Enter a new Control API address.',\n 'relay.login': 'Log in',\n 'relay.loggingIn': 'Logging in…',\n 'relay.noAccountPrefix': 'No account? ',\n 'relay.register': 'Register here',\n 'relay.noAccountSuffix': '.',\n 'relay.loggedIn': 'Logged in',\n 'relay.loggingOut': 'Logged out',\n 'relay.loginSuccess': 'Login succeeded',\n 'relay.h5LoginAddress': 'H5 login page',\n 'relay.copied': 'Copied',\n 'relay.copyAddressHint': 'Click address to copy',\n 'relay.copySuccess': 'H5 login address copied',\n 'relay.copyFailed': 'Unable to copy the H5 login address',\n 'relay.loggedOut': 'Logged out',\n 'relay.bindSuccess': 'Host bound successfully',\n 'relay.unbindSuccess': 'Host unbound',\n 'relay.device': 'Device: {value}',\n 'relay.dshVersion': 'DSH version: {value}',\n 'relay.computerName': 'Computer name: {value}',\n 'relay.host': 'Host: {value}',\n 'relay.devicesSummary': 'Current device {current}; other active devices: {count}',\n 'relay.deviceStatus': 'Device status: {value}',\n 'relay.dshDevices': 'Codingns4DSH devices',\n 'relay.selectDevice': 'Select a DSH Host',\n 'relay.online': 'online',\n 'relay.offline': 'offline',\n 'relay.unknown': 'Unknown',\n 'relay.unrecognized': 'Unrecognized',\n 'relay.unbound': 'Unbound',\n 'cli.installStatus': 'Installation status',\n 'cli.enabledStatus': 'Enabled status',\n 'cli.version': 'Version',\n 'cli.commandPath': 'Command path',\n 'cli.diagnostic': 'Detection diagnostic',\n 'cli.protocol': 'Standard protocol',\n 'cli.capabilities': 'Verified capabilities',\n 'cli.installed': 'Installed',\n 'cli.installedOffline': 'Installed (not connected)',\n 'cli.notInstalled': 'Not installed',\n 'cli.detecting': 'Detecting…',\n 'cli.detectionFailed': 'Detection failed',\n 'cli.redetect': 'Detect again',\n 'cli.redetectAll': 'Detect all again',\n 'cli.redetectHostUnsupported': 'The connected Host does not support Agent detection refresh. Load the same CodingNS plugin version on the Host as this page, restart the Host, then refresh the page.',\n 'cli.enabled': 'Enabled',\n 'cli.disabled': 'Disabled',\n 'cli.notDetectedVersion': 'Version not detected',\n 'cli.notDetectedCommand': 'Command not detected',\n 'cli.undeclared': 'Undeclared',\n 'cli.defaultEffort': 'Default',\n 'cli.antigravityNativeModel': '{name} · Antigravity',\n 'cli.thinkingLevel': 'Thinking level: {value}',\n 'cli.agentSelector': 'Agent selector',\n 'cli.modelSelector': 'Model and thinking level selector',\n 'cli.adapterToggle': '{name} toggle',\n 'cli.subagentBridge': 'Managed subagents',\n 'cli.subagentBridgeDescription': 'Route subagent calls made by external Agents into DSH-native continuable subagent sessions (OpenCode, Command Code, Claude Code, Codex, Gemini, Grok, MiniMax Code).',\n 'cli.subagentBridgeToggle': 'Managed subagents toggle',\n 'cli.subagentBridgeEnabled': 'Managed subagents enabled',\n 'cli.subagentBridgeDisabled': 'Managed subagents disabled',\n 'cli.subagentBridgeConcurrency': 'Concurrent managed subagents',\n 'cli.subagentBridgeConcurrencyHelp': 'How many subagents one parent session may keep running at once. External Agents often open a whole batch in parallel; calls beyond this limit are reported as dispatch failures instead of silently falling back to the built-in subagent.',\n 'cli.subagentBridgeConcurrencySaved': 'Concurrency limit saved',\n 'delegate.label': 'Delegate',\n 'delegate.description': 'Dispatch this task to an external Agent as a DSH-native subagent session',\n 'delegate.searchPlaceholder': 'Search external Agents',\n 'delegate.searchEmpty': 'No external Agent is installed and enabled',\n 'delegate.searchNoResults': 'No matching Agent',\n 'delegate.composerPlaceholder': '/ Commands, @ Files or conversations, # Delegation menu',\n 'delegate.started': 'Delegated to {name}; it runs in its own native subagent session.',\n 'delegate.failed': 'Delegation failed',\n 'delegate.draftUnsupported': 'This DSH version cannot write a delegation draft. Please upgrade DSH.',\n 'delegate.selected': 'Selected {name}; continue entering the task and submit it.',\n 'delegate.popupNoResults': 'No matching items',\n 'delegate.selectModel': 'Choose a model for {name}',\n 'delegate.loadingModels': 'Loading model catalog…',\n 'delegate.modelCatalogFailed': 'Model catalog failed to load',\n 'delegate.selectAdapter': 'Choose a delegation adapter',\n 'delegate.cardTitle': 'Delegation task',\n 'delegate.cardStatus': 'Delegating',\n 'delegate.cardTarget': '{label} ({adapter}{model})',\n 'skills.label': 'Skills',\n 'skills.description': 'Browse and explicitly invoke Skills provided by the current Agent',\n 'skills.searchPlaceholder': 'Search Skills',\n 'skills.searchEmpty': 'The current Agent has no available Skills',\n 'skills.searchNoResults': 'No matching Skill',\n 'skills.draftUnsupported': 'This DSH version cannot write a Skill mention. Please upgrade DSH.',\n 'cli.loadingModel': 'Loading models…',\n 'cli.noModelsAvailable': 'No models available',\n 'cli.model': 'Model',\n 'cli.modelSearch': 'Search models…',\n 'cli.modelSearchClear': 'Clear search',\n 'cli.modelSearchEmpty': 'No matching models.',\n 'cli.thinking': 'Thinking level',\n 'cli.back': '‹ Back',\n 'cli.chooseModel': 'Choose model, current {model}, thinking level {effort}',\n 'cli.chooseModelMenu': 'Model and thinking level',\n 'cli.serviceTier': 'Service tier',\n 'cli.serviceTierFast': 'Fast',\n 'cli.serviceTierStandard': 'Standard',\n 'cli.serviceTierToggle': 'Fast service tier toggle, current {name}',\n 'cli.readingAgents': 'Reading external Agent status…',\n 'cli.noAgents': 'No external Agent is currently available.',\n 'cli.agentList': 'Agent list',\n 'cli.agentHost': 'Agent Host',\n 'cli.localHost': 'Current Host',\n 'cli.peerHostReadOnly': 'Viewing Agents on {name}. Refresh detection or open details here; manage enable settings on that Host.',\n 'cli.peerHostUnavailable': '{name} is not available. Check its connection and sign-in in PeerHost management; relay connections do not support Agent queries yet.',\n 'cli.peerHostListError': 'Unable to read PeerHost list: {message}',\n 'cli.peerHostRpcReadOnly': 'PeerHost Agent settings only support viewing and refreshing catalogs',\n 'cli.peerHostRpcFailed': 'Remote Agent catalog request failed: HTTP {status}',\n 'cli.peerHostRpcInvalid': 'Invalid remote Agent catalog response',\n 'cli.agentCount': '{count} Agents',\n 'cli.viewDetails': 'View {name} details',\n 'cli.closeDetails': 'Close Agent details',\n 'cli.modelCatalog': 'Model catalog',\n 'cli.agentNotInstalled': 'Agent is not installed; the model catalog cannot be read.',\n 'cli.agentDisabled': 'Agent is disabled; enable it before reading the model catalog.',\n 'cli.readingModels': 'Reading model catalog…',\n 'cli.done': 'Done',\n 'cli.noModels': 'No models found.',\n 'cli.currentAgent': 'Current Agent: {name}{locked}',\n 'cli.locked': ' (locked)',\n 'cli.selectAgent': 'Select Agent',\n 'cli.catalogLoadFailed': 'Could not load external Agents.',\n 'cli.retryCatalog': 'Retry loading Agents',\n 'workspace.showLogo': 'Show Agent logo',\n 'workspace.logoDescription': 'Display the selected external Agent logo in native workspace session rows.',\n 'workspace.optimizeSessionTitles': 'Optimize DSH session title generation',\n 'workspace.optimizeSessionTitlesDescription': 'Generate concise, complete topic titles for subsequent automatic title requests. Existing titles are not bulk-renamed; manual names are preserved.',\n 'workspace.showArchivedSessions': 'Show archived workspace sessions',\n 'workspace.archivedSessionsDescription': 'Display an archived-session folder entry above each workspace\\'s more-sessions button.',\n 'workspace.showWorkspaceHiding': 'Show workspace hiding controls',\n 'workspace.workspaceHidingDescription': 'Add a Hide workspace action to each workspace menu and show hidden workspaces through the workspace filter.',\n 'workspace.showSubscriptionUsage': 'Show subscription and usage',\n 'workspace.subscriptionUsageDescription': 'Detect and display provider subscription balances and upstream usage in the conversation footer.',\n 'workspace.subscriptionUsageSettings': 'Settings',\n 'subscriptionUsage.dialogTitle': 'Usage query settings',\n 'subscriptionUsage.dialogHint': 'The timeout applies to every adapter. The refresh interval drives the footer usage query; 0 disables automatic refresh, and a result is reused while it is still fresh.',\n 'subscriptionUsage.timeoutSecs': 'Query timeout (seconds)',\n 'subscriptionUsage.refreshInterval': 'Auto refresh interval (minutes)',\n 'subscriptionUsage.refreshIntervalHint': '0 disables automatic refresh.',\n 'subscriptionUsage.cancel': 'Cancel',\n 'subscriptionUsage.save': 'Save',\n 'subscriptionUsage.saved': 'Usage query settings saved',\n 'workspace.showQuickPhrases': 'Show quick sessions',\n 'workspace.quickPhrasesDescription': 'Keep reusable session instructions locally in Codingns4DSH and show the quick sessions button inside the composer.',\n 'workspace.showSkillQuickReference': 'Index the selected Agent Skills for quick command references',\n 'workspace.skillQuickReferenceDescription': 'Load Skills from the selected Agent, insert them as one reference chip, and render them as a compact element in the message list.',\n 'workspace.rememberConversationRightbarRatio': 'Remember conversation and right sidebar width ratio',\n 'workspace.rememberConversationRightbarRatioDescription': 'Restore the right sidebar proportion after refreshing this browser; the ratio is stored locally.',\n 'mobile.sidebarGestures': 'Swipe to open or close sidebars',\n 'mobile.team.title': 'Agent Team',\n 'mobile.team.close': 'Close Agent Team',\n 'mobile.sidebarGesturesDescription': 'On touch devices, swipe horizontally in the conversation area to toggle a sidebar. Cross the configured share of the viewport width, or give a quick flick to trigger it.',\n 'mobile.sidebarGestureMapping': 'Swipe direction',\n 'mobile.sidebarGestureMappingInward': 'Swipe right: session list; swipe left: right sidebar',\n 'mobile.sidebarGestureMappingSwap': 'Swapped',\n 'mobile.sidebarGestureEdge': 'Start area',\n 'mobile.sidebarGestureEdgeAvoid': 'Keep away from screen edges (recommended)',\n 'mobile.sidebarGestureEdgeEdge': 'Allow edge swipes',\n 'mobile.sidebarGestureDistance': 'Trigger distance (% of viewport width)',\n 'mobile.sidebarGestureDistanceHelp': 'Cross this share of the viewport width to trigger; a quick flick works too. Smaller values are more sensitive (15–80).',\n 'mobile.sidebarGestureSaved': 'Gesture settings saved',\n 'workspace.quickPhrasesTitle': 'Quick sessions',\n 'workspace.quickPhrasesHint': 'Click an item in the composer to fill the current draft.',\n 'workspace.quickPhrasesEmpty': 'No quick sessions yet.',\n 'workspace.quickPhrasesPlaceholder': 'Enter a reusable session instruction',\n 'workspace.quickPhrasesAdd': 'Add quick session',\n 'workspace.quickPhrasesCancel': 'Cancel',\n 'workspace.quickPhrasesAddDialogLabel': 'Add a quick session',\n 'workspace.quickPhrasesDelete': 'Delete quick session',\n 'workspace.quickPhrasesMoveUp': 'Move quick session up',\n 'workspace.quickPhrasesMoveDown': 'Move quick session down',\n 'workspace.quickPhrasesDrag': 'Drag to reorder quick session',\n 'workspace.quickPhrasesSaved': 'Quick session settings saved',\n 'workspace.quickPhrasesSaveFailed': 'Unable to save quick session settings',\n 'workspace.quickPhrasesTrigger': 'Quick sessions',\n 'workspace.quickPhrasesDialogLabel': 'Choose a quick session',\n 'workspace.quickPhrasesClose': 'Close quick sessions',\n}\n\nconst CORE_ZH: Record<string, string> = {\n 'common.brand': 'Codingns4DSH',\n 'settings.title': 'Codingns4DSH 功能模块',\n 'settings.subtitle': '按模块配置 Codingns4DSH 功能,不影响 DSH 的全局设置。',\n 'settings.version': 'Codingns4DSH v{version}',\n 'settings.compatibility': '兼容 DSH {range}',\n 'settings.testedDshVersion': '已验证 DSH {version}',\n 'settings.untestedDshWarning': '当前 DSH {version} 高于插件最新已验证版本({tested}),兼容性尚未验证;不影响插件安装和运行。',\n 'settings.toggle': '{label}开关',\n 'settings.legacyFallback': '当前 DSH 版本使用兼容模式;多 Tab 和 Shell 选择扩展不可用。',\n 'settings.versionBlocked': '当前 DSH {version} 不支持此模块;需要 DSH {minimum} 或更高版本。',\n 'settings.moduleEnabled': '已启用{label}',\n 'settings.moduleDisabled': '已禁用{label}',\n 'settings.moduleWriteRejected': '设置未被接受,请重试。',\n 'settings.requirement.magpieInstall': '本机未安装 Magpie 或 Magpie 不可用;请先安装并重新检测,再启用此模块。',\n 'settings.requirement.checking': '正在检测本机是否可用的 Magpie…',\n 'settings.promo.sectionLabel': 'Codingns4DSH 推广',\n 'settings.promo.version': '版本 v{version}',\n 'settings.promo.starHint': '如果 Codingns4DSH 帮到了你,请在 GitHub 点个 Star,这对我们意义重大。',\n 'settings.promo.github': 'GitHub',\n 'settings.promo.actionLabel': '在新标签页打开 Codingns4DSH 的 GitHub 仓库',\n 'feature.workspaceSession.legacyFallback': '已启用 DSH 0.1.5 兼容路径,但尚未完成验证。会话行 DOM 注入和归档入口位置可能存在差异;当前版本不支持取消归档。',\n 'feature.lanAccess.label': '局域网访问DSH',\n 'feature.lanAccess.description': '通过局域网访问 DSH',\n 'feature.loginProtection.label': '登录保护',\n 'feature.loginProtection.description': '统一账号保护访问',\n 'feature.reverseProxy.label': '中转访问服务',\n 'feature.reverseProxy.description': '通过中继访问 Host',\n 'feature.cliAdapters.label': '外部Agent集成',\n 'feature.cliAdapters.description': '管理外部 Agent',\n 'feature.workspaceSession.label': '工作区会话增强',\n 'feature.workspaceSession.description': '增强工作区会话体验',\n 'feature.workspaceMcp.label': '工作区 MCP 服务',\n 'feature.workspaceMcp.description': '通过 Host 认证监听器向本机 MCP 客户端提供受管理工作区工具,并可单独开放局域网访问。',\n 'workspaceMcp.setupTitle': 'MCP 访问密钥',\n 'workspaceMcp.setupInstruction': '生成密钥后会保存在 Host 并自动启用本机 MCP 监听器。',\n 'workspaceMcp.lanAccessLabel': '允许局域网访问 MCP',\n 'workspaceMcp.lanAccessDescription': '允许局域网访问监听器上的已认证 MCP 客户端使用同一个 MCP 端点和端口。',\n 'workspaceMcp.lanAccessSaved': 'Workspace MCP 局域网访问设置已保存。',\n 'workspaceMcp.lanAccessStatus': '局域网开放:{status}',\n 'workspaceMcp.generateKey': '生成密钥并启用',\n 'workspaceMcp.rotateKey': '轮换密钥',\n 'workspaceMcp.generating': '正在生成…',\n 'workspaceMcp.generatedKey': '生成的 Workspace MCP API Key',\n 'workspaceMcp.keyGenerated': 'Workspace MCP 密钥已生成,模块已启用。',\n 'workspaceMcp.copyKey': '复制密钥',\n 'workspaceMcp.keyCopied': 'Workspace MCP 密钥已复制。',\n 'workspaceMcp.copyFailed': '无法复制密钥,请手动选择并复制。',\n 'workspaceMcp.keyShownOnce': '密钥仅在此时显示。关闭或刷新面板前,请先复制到 MCP 客户端。',\n 'workspaceMcp.capabilityDescription': 'MCP 能力说明',\n 'workspaceMcp.capabilityTitle': '支持的 MCP 能力',\n 'workspaceMcp.capabilitySubtitle': '以下列表说明 Workspace MCP 的固定工具目录及其访问边界。',\n 'workspaceMcp.capabilityName': '名称',\n 'workspaceMcp.capabilityPermission': '权限',\n 'workspaceMcp.capabilityDescriptionField': '描述',\n 'workspaceMcp.capabilityParameters': '调用参数',\n 'workspaceMcp.capabilityRemarks': '备注',\n 'workspaceMcp.closeCapabilities': '关闭',\n 'workspaceMcp.installPromptTitle': '安装 Agent Skill',\n 'workspaceMcp.installPromptHint': '复制此提示词并发送给 Agent,它会将仓库根目录的 SKILL.md 安装到该 Agent 的个人 Skills 目录。',\n 'workspaceMcp.copyInstallPrompt': '复制安装提示词',\n 'workspaceMcp.installPromptCopied': 'Agent Skill 安装提示词已复制。',\n 'workspaceMcp.installPromptText': '获取 https://github.com/jingyi0605/Codingns4DSH/blob/main/SKILL.md,并使用你已记录的 Skill 安装方式,将其安装到你自己的 Agent 个人 Skills 目录。',\n 'workspaceMcp.capability.workspaceList.permission': '读取受管理工作区元数据',\n 'workspaceMcp.capability.workspaceList.description': '列出当前 Host 可管理的工作区。',\n 'workspaceMcp.capability.workspaceList.parameters': '{}',\n 'workspaceMcp.capability.workspaceList.remarks': '只返回名称和活动会话数,不暴露文件系统根目录。',\n 'workspaceMcp.capability.sessionList.permission': '读取有界会话元数据',\n 'workspaceMcp.capability.sessionList.description': '列出受管理工作区中的会话。',\n 'workspaceMcp.capability.sessionList.parameters': '{ workspaceId?, limit?, offset? }',\n 'workspaceMcp.capability.sessionList.remarks': '结果支持分页,只返回元数据,不返回完整对话历史。',\n 'workspaceMcp.capability.sessionCreate.permission': '创建受管理会话并可排队发送初始提示',\n 'workspaceMcp.capability.sessionCreate.description': '创建原生 DSH 会话,并可选择已安装的适配器和模型。',\n 'workspaceMcp.capability.sessionCreate.parameters': '{ workspaceId, adapterId?, modelId?, prompt? }',\n 'workspaceMcp.capability.sessionCreate.remarks': '外部适配器会话必须提供初始提示;不确定结果会返回已创建的会话 ID。',\n 'workspaceMcp.capability.sessionContinue.permission': '向已有会话排队发送消息',\n 'workspaceMcp.capability.sessionContinue.description': '继续指定的受管理会话,不替换其身份。',\n 'workspaceMcp.capability.sessionContinue.parameters': '{ sessionId, message }',\n 'workspaceMcp.capability.sessionContinue.remarks': '消息接纳前会重新校验会话归属和可用性。',\n 'workspaceMcp.capability.sessionQuestions.permission': '读取未解决的原生问题',\n 'workspaceMcp.capability.sessionQuestions.description': '列出受管理会话中等待回答的问题。',\n 'workspaceMcp.capability.sessionQuestions.parameters': '{ sessionId }',\n 'workspaceMcp.capability.sessionQuestions.remarks': '问题内容和选项有大小限制;归档或无关会话会被拒绝。',\n 'workspaceMcp.capability.sessionAnswer.permission': '回答一个未解决的原生问题',\n 'workspaceMcp.capability.sessionAnswer.description': '通过 DSH 原生问题机制提交经过校验的答案。',\n 'workspaceMcp.capability.sessionAnswer.parameters': '{ sessionId, callId, answer }',\n 'workspaceMcp.capability.sessionAnswer.remarks': 'callId 必须来自当前问题列表,答案会按原生选项校验。',\n 'workspaceMcp.capability.sessionRequestPermission.permission': '请求人工审批',\n 'workspaceMcp.capability.sessionRequestPermission.description': '通过 DSH 原生审批界面请求对某项操作作出决定。',\n 'workspaceMcp.capability.sessionRequestPermission.parameters': '{ sessionId, toolName, reason, callId? }',\n 'workspaceMcp.capability.sessionRequestPermission.remarks': '必须存在活动 DSH 回合;MCP 客户端不能批准自己的请求。',\n 'workspaceMcp.capability.sessionPermissionStatus.permission': '读取已拥有的审批结果',\n 'workspaceMcp.capability.sessionPermissionStatus.description': '读取当前 MCP 模块创建的审批请求状态。',\n 'workspaceMcp.capability.sessionPermissionStatus.parameters': '{ sessionId, requestId }',\n 'workspaceMcp.capability.sessionPermissionStatus.remarks': '只能查询当前模块保留的 DSH 原生请求 ID。',\n 'workspaceMcp.capability.terminalList.permission': '读取活动终端元数据',\n 'workspaceMcp.capability.terminalList.description': '列出一个受管理会话附属的终端实例。',\n 'workspaceMcp.capability.terminalList.parameters': '{ workspaceId, sessionId }',\n 'workspaceMcp.capability.terminalList.remarks': '只返回指定工作区和会话范围内的活动终端。',\n 'workspaceMcp.capability.terminalRead.permission': '读取终端输出',\n 'workspaceMcp.capability.terminalRead.description': '读取一个活动终端的有界输出快照。',\n 'workspaceMcp.capability.terminalRead.parameters': '{ workspaceId, sessionId, terminalId, limitBytes? }',\n 'workspaceMcp.capability.terminalRead.remarks': '输出上限为 64 KiB,不会读取其他终端。',\n 'workspaceMcp.capability.terminalWrite.permission': '写入终端输入',\n 'workspaceMcp.capability.terminalWrite.description': '向一个已有的活动终端进程写入有界文本。',\n 'workspaceMcp.capability.terminalWrite.parameters': '{ workspaceId, sessionId, terminalId, data }',\n 'workspaceMcp.capability.terminalWrite.remarks': '输入上限为 16 KiB,拒绝 NUL 字节,不能创建任意进程。',\n 'workspaceMcp.statusTitle': 'Host 状态',\n 'workspaceMcp.loading': '正在读取工作区 MCP 状态…',\n 'workspaceMcp.statusFailed': '无法从 Host 读取工作区 MCP 状态。',\n 'workspaceMcp.apiKeyStatus': 'API Key:{status}',\n 'workspaceMcp.enabledStatus': '模块:{status}',\n 'workspaceMcp.listeningStatus': '监听器:{status}',\n 'workspaceMcp.configured': '已配置',\n 'workspaceMcp.notConfigured': '未配置',\n 'workspaceMcp.on': '已开启',\n 'workspaceMcp.off': '已关闭',\n 'workspaceMcp.url': '端点',\n 'workspaceMcp.refresh': '刷新状态',\n 'workspaceMcp.reason.keyMissing': '请生成 Workspace MCP API Key 以启动监听器。',\n 'workspaceMcp.reason.keyStoreFailed': 'Host 无法访问 Workspace MCP 密钥文件。',\n 'workspaceMcp.reason.disabled': '工作区 MCP 模块已关闭。',\n 'workspaceMcp.reason.listenFailed': '本机 MCP 监听器无法启动。',\n 'workspaceMcp.reason.other': 'Host 返回了其他状态原因。',\n 'feature.mobileAccess.label': '移动端访问增强',\n 'feature.mobileAccess.description': '优化移动端访问布局',\n 'mobile.hideSidebarOnMobile': '移动端彻底隐藏左侧边栏',\n 'mobile.hideSidebarOnMobileDescription': 'DSH 在窄屏下收起侧栏时仍保留 56px 图标轨道。开启后该轨道收为 0 宽,并把 DSH 自己的折叠态 logo 按钮浮到左上角作为唯一入口;展开侧栏仍由 DSH 布局服务完成。',\n 'mobile.optimizeSettingsOnMobile': '优化移动端设置界面',\n 'mobile.optimizeSettingsOnMobileDescription': '在移动端使用更紧凑的设置布局。',\n 'mobile.viewportMax': '移动端视口上限(像素)',\n 'mobile.viewportMaxHelp': '视口宽度小于或等于该值时按移动端处理,范围为 480–1280。',\n 'mobile.saved': '移动端访问设置已保存',\n 'mobile.pwaRequiresListener': '这些资产由「局域网访问DSH」的监听端口提供,请先在局域网卡片中启动监听。',\n 'feature.terminal.label': '终端增强',\n 'feature.terminal.description': '配置终端与默认 Shell',\n 'feature.fileManagement.label': '文件管理增强',\n 'feature.fileManagement.description': '增强文件侧栏操作',\n 'fileManagement.menuEnhancement': '文件管理菜单增强',\n 'fileManagement.menuEnhancementDescription': '在 DSH 文件侧栏为文件和目录显示右键操作菜单,并在文件查看器中复制相对路径或绝对路径。',\n 'fileManagement.fileEditor': '文件查看器编辑功能',\n 'fileManagement.fileEditorDescription': '为支持的文本文件显示编辑图标按钮,并保留语法高亮和行号。',\n 'fileManagement.sessionChangedFiles': '显示当前会话修改的文件',\n 'fileManagement.sessionChangedFilesDescription': '在当前会话顶部显示已修改文件,并支持查看 Git Diff 和暂存。',\n 'fileManagement.saved': '文件管理设置已保存。',\n 'terminal.title': '终端',\n 'terminal.new': '新建终端',\n 'terminal.close': '关闭终端',\n 'terminal.refresh': '刷新终端',\n 'terminal.tools': '终端快捷操作',\n 'terminal.holdCtrl': '按住 Ctrl',\n 'terminal.holdAlt': '按住 Alt',\n 'terminal.holdWin': '按住 Win',\n 'terminal.holdOption': '按住 Option',\n 'terminal.holdCommand': '按住 Command',\n 'terminal.holdSuper': '按住 Super',\n 'terminal.shortcutTab': 'Tab 制表键',\n 'terminal.shortcutEscape': 'Esc 退出键',\n 'terminal.shortcutEnter': 'Enter 回车键',\n 'terminal.shortcutBackspace': 'Backspace 退格键',\n 'terminal.shortcutUp': '向上箭头',\n 'terminal.shortcutDown': '向下箭头',\n 'terminal.shortcutLeft': '向左箭头',\n 'terminal.shortcutRight': '向右箭头',\n 'terminal.shortcutC': 'C(按住 Ctrl 时发送 Ctrl+C)',\n 'terminal.shortcutD': 'D(按住 Ctrl 时发送 Ctrl+D)',\n 'terminal.shortcutL': 'L(按住 Ctrl 时发送 Ctrl+L)',\n 'terminal.shortcutZ': 'Z(按住 Ctrl 时发送 Ctrl+Z)',\n 'terminal.description': '在会话工作区运行命令',\n 'terminal.loadingShell': '正在读取 Shell…',\n 'terminal.retry': '重试',\n 'terminal.noShell': '没有可用的 Shell',\n 'terminal.selectShell': '选择 Shell',\n 'terminal.error': '终端错误',\n 'terminal.rename': '双击重命名终端',\n 'terminal.cleanupFailed': '终端「{title}」未能结束:{message}',\n 'terminal.currentStatus': '当前运行状态:{status};Host 平台:{platform}',\n 'terminal.enhanced': '终端增强已启用',\n 'terminal.basic': '基础本地终端',\n 'terminal.saved': '终端设置已保存',\n 'terminal.saveRejected': 'Host 拒绝了终端设置变更,请重试。',\n 'terminal.readingStatus': '正在读取 Host 终端状态...',\n 'terminal.restartNote': '启用或禁用需要重启 DSH。禁用只会停止恢复和连接,不会结束已有的 tmux 或 ConPTY 会话。',\n 'terminal.appearanceTitle': '终端样式',\n 'terminal.resetAppearance': '重置为默认样式',\n 'terminal.newDefault': '新建终端默认项',\n 'terminal.theme': '主题',\n 'terminal.bindingScope': '终端绑定范围',\n 'terminal.systemRecommended': '系统推荐',\n 'terminal.inheritDshTheme': '继承 DSH 主题',\n 'terminal.custom': '自定义',\n 'terminal.background': '背景色',\n 'terminal.foreground': '文本颜色',\n 'terminal.cursorColor': '光标颜色',\n 'terminal.fontSize': '字号(px)',\n 'terminal.lineHeight': '行高',\n 'terminal.cursorShape': '光标形状',\n 'terminal.cursorBlink': '光标闪烁',\n 'terminal.scrollback': '回滚行数',\n 'terminal.inherit': '继承',\n 'terminal.workspaceBinding': '按工作区绑定(推荐)',\n 'terminal.sessionBinding': '按 DSH 会话绑定',\n 'terminal.workspaceBindingHelp': '工作区模式下,同一工作区的不同 DSH 会话共享终端;会话模式下,每个会话拥有独立终端。切换范围需要重启 DSH。',\n 'terminal.defaultProfileHelp': '“系统推荐”由 Host 根据操作系统和已安装的 shell 解析;不可用的已保存项会回退到系统推荐。',\n 'terminal.profileUnavailable': '{profile}(当前不可用)',\n 'terminal.cursorInherit': '继承',\n 'terminal.cursorBlock': '方块',\n 'terminal.cursorBar': '竖线',\n 'terminal.cursorUnderline': '下划线',\n 'terminal.cursorOn': '开启',\n 'terminal.cursorOff': '关闭',\n 'terminal.unsupportedPlatform': '不支持的平台',\n 'lan.listenHost': '监听地址',\n 'lan.description': '在本机增加一个监听端口,将访问重定向到当前 DSH Web。此功能属于局域网访问,不经过跨 NAT 中转服务。',\n 'lan.listenPort': '监听端口',\n 'lan.dshPort': 'DSH 本地端口(自动探测,也可手动填写)',\n 'lan.allInterfaces': '所有网卡(0.0.0.0)',\n 'lan.detect': '自动探测',\n 'lan.detectMultiple': '检测到多个 DSH 实例端口:{ports},请手动选择。',\n 'lan.detectNone': '未探测到 DSH Web 端口,请手动填写',\n 'lan.detected': '已探测到 DSH Web 端口:{ports}',\n 'lan.autoStart': '自动启动(启动 DSH 时自动恢复当前映射)',\n 'lan.start': '启动局域网访问DSH',\n 'lan.update': '更新局域网访问DSH',\n 'lan.stop': '停止',\n 'lan.forwardTarget': '→ DSH Web 127.0.0.1:{dshPort}',\n 'lan.statusStopped': '未启动',\n 'lan.statusStarting': '启动中…',\n 'lan.statusListening': '运行中',\n 'lan.statusListeningCount': '运行中 · 可用地址 {count} 个',\n 'lan.statusError': '启动失败',\n 'lan.accessUrlEmpty': '暂无可访问地址,启动监听后即可获得访问 URL。',\n 'lan.copy': '复制',\n 'lan.copied': '已复制',\n 'lan.copyAddressHint': '点击复制 {url}',\n 'lan.copySuccess': '访问地址已复制',\n 'lan.copyFailed': '无法复制访问地址',\n 'lan.started': '局域网访问DSH已启动:{url}',\n 'lan.stopped': '局域网访问DSH已停止',\n 'lan.autoStartOn': '已开启自动启动,下一次启动 DSH 时将自动恢复映射',\n 'lan.autoStartOff': '已关闭自动启动',\n 'lan.processing': '处理中…',\n 'lan.pwa.title': '移动端 PWA 资产',\n 'lan.pwa.description': '由局域网入口提供 manifest、图标与安装引导;这些资产只在这个监听端口上可达。',\n 'lan.pwa.enabled': '提供 PWA 资产(manifest + 图标)',\n 'lan.pwa.enabledHelp': '只覆盖本入口的 manifest:显示模式改为独立窗口,并补齐 PNG 图标。',\n 'lan.pwa.serviceWorker': '启用 Service Worker',\n 'lan.pwa.serviceWorkerHelp': '仅在 HTTPS 下注册;保持关闭可避免在手机上留下驻留脚本。',\n 'lan.pwa.installPrompt': '显示安装引导',\n 'lan.pwa.notifications': '通知',\n 'lan.pwa.notificationsOff': '关闭',\n 'lan.pwa.notificationsLocal': '本地通知(页面打开时)',\n 'lan.pwa.notificationsPush': '推送(需要 VAPID)',\n 'lan.pwa.loopbackWarning': '若 NGINX 与本机同机反代到 127.0.0.1,代理会按回环流量放行并跳过登录保护;请在 NGINX 侧加鉴权,或改用异机反代。',\n 'lan.pwa.saved': 'PWA 设置已保存',\n 'lan.pwa.requestPermission': '请求通知权限',\n 'lan.pwa.permissionGranted': '已获得通知权限',\n 'lan.pwa.permissionNotGranted': '未获得通知权限',\n 'lan.pwa.sendTest': '发送测试通知',\n 'lan.pwa.testBody': '这是一条来自 Codingns4DSH 的本地测试通知。',\n 'lan.pwa.testSent': '测试通知已发送',\n 'lan.pwa.testFailed': '测试通知失败:权限不足或平台不支持',\n 'lan.pwa.subscribe': '订阅推送',\n 'lan.pwa.unsubscribe': '取消订阅',\n 'lan.pwa.pushUnavailable': '推送不可用:Host 未启用推送服务',\n 'lan.pwa.pushNeedsPermission': '请先允许通知权限',\n 'lan.pwa.swNeeded': '订阅推送前需要先开启 Service Worker',\n 'lan.pwa.pushSubscribed': '已订阅推送(共 {count} 台设备)',\n 'lan.pwa.pushUnsubscribed': '已取消推送订阅',\n 'lan.pwa.pushTest': '发送测试推送',\n 'lan.pwa.pushTestSummary': '推送结果:成功 {sent},失败 {failed},已清理 {removed}',\n 'lan.pwa.pushDevices': '已登记设备:{count}',\n 'lan.pwa.unregisterSw': '注销 Service Worker',\n 'lan.pwa.unregisterSwDone': '已注销 Service Worker',\n 'lan.pwa.unregisterSwFailed': '没有可注销的 Service Worker',\n 'lan.pwa.notificationState': '权限:{permission};通知 API:{supported};安全上下文:{secure};Service Worker:{sw}',\n 'lan.pwa.yes': '是',\n 'lan.pwa.no': '否',\n 'lan.pwa.swActive': '已激活',\n 'lan.pwa.swMissing': '未注册',\n 'relay.controlApi': '中转服务地址',\n 'relay.add': '添加',\n 'relay.cancel': '取消',\n 'relay.adding': '添加中…',\n 'relay.email': '邮箱',\n 'relay.password': '密码',\n 'relay.refreshDevices': '刷新设备',\n 'relay.logout': '退出登录',\n 'relay.bindHost': '绑定 Host',\n 'relay.unbindHost': '解绑当前 Host',\n 'relay.hostLabel': 'Host 标签',\n 'relay.hostPublicKey': 'Host 公钥',\n 'relay.hostFingerprint': 'Host 指纹',\n 'relay.settings': '服务设置',\n 'relay.loginHint': '登录 Codingns4DSH,管理设备和当前 Host。',\n 'relay.addServer': '添加中转服务器',\n 'relay.addServerHint': '请输入新的 Control API 地址。',\n 'relay.login': '登录',\n 'relay.loggingIn': '登录中…',\n 'relay.noAccountPrefix': '没有账号,',\n 'relay.register': '点这里注册',\n 'relay.noAccountSuffix': '。',\n 'relay.loggedIn': '已登录',\n 'relay.loggingOut': '退出登录',\n 'relay.loginSuccess': '登录成功',\n 'relay.h5LoginAddress': 'H5 登录页面地址',\n 'relay.copied': '已复制',\n 'relay.copyAddressHint': '点击地址复制',\n 'relay.copySuccess': 'H5 登录页面地址复制成功',\n 'relay.copyFailed': '无法复制 H5 登录页面地址',\n 'relay.bindSuccess': 'Host 绑定成功',\n 'relay.unbindSuccess': 'Host 已解绑',\n 'relay.loggedOut': '已退出登录',\n 'relay.device': '设备:{value}',\n 'relay.dshVersion': 'DSH 版本:{value}',\n 'relay.computerName': '计算机名:{value}',\n 'relay.host': 'Host:{value}',\n 'relay.devicesSummary': '当前设备 {current},活动设备 {count} 台',\n 'relay.deviceStatus': '设备状态:{value}',\n 'relay.dshDevices': 'Codingns4DSH 设备',\n 'relay.selectDevice': '选择 DSH Host',\n 'relay.online': '在线',\n 'relay.offline': '离线',\n 'relay.unknown': '未知',\n 'relay.unrecognized': '未识别',\n 'relay.unbound': '未绑定',\n 'cli.installStatus': '安装状态',\n 'cli.enabledStatus': '启用状态',\n 'cli.version': '版本',\n 'cli.commandPath': '命令路径',\n 'cli.diagnostic': '探测诊断',\n 'cli.protocol': '标准协议',\n 'cli.capabilities': '已验证能力',\n 'cli.installed': '已安装',\n 'cli.installedOffline': '已安装(未连接)',\n 'cli.notInstalled': '未安装',\n 'cli.detecting': '检测中…',\n 'cli.detectionFailed': '检测失败',\n 'cli.redetect': '重新检测',\n 'cli.redetectAll': '重新检测全部',\n 'cli.redetectHostUnsupported': '当前连接的 Host 不支持重新检测 Agent。请确认 Host 已安装与页面一致的 CodingNS 插件版本,重启 Host 后再刷新页面。',\n 'cli.enabled': '已启用',\n 'cli.disabled': '已停用',\n 'cli.notDetectedVersion': '未检测到版本',\n 'cli.notDetectedCommand': '未检测到命令',\n 'cli.undeclared': '未声明',\n 'cli.defaultEffort': '默认',\n 'cli.antigravityNativeModel': '{name} · Antigravity',\n 'cli.thinkingLevel': '思考等级:{value}',\n 'cli.agentSelector': 'Agent 选择器',\n 'cli.modelSelector': '模型与思考强度选择器',\n 'cli.adapterToggle': '{name}启用开关',\n 'cli.subagentBridge': '子代理托管',\n 'cli.subagentBridgeDescription': '把外部 Agent 自己开的子代理调用转投为 DSH 原生可续子会话(OpenCode、Command Code、Claude Code、Codex、Gemini、Grok、MiniMax Code)。',\n 'cli.subagentBridgeToggle': '子代理托管开关',\n 'cli.subagentBridgeEnabled': '子代理托管已开启',\n 'cli.subagentBridgeDisabled': '子代理托管已关闭',\n 'cli.subagentBridgeConcurrency': '并发子代理上限',\n 'cli.subagentBridgeConcurrencyHelp': '同一父会话可同时运行的托管子代理数。外部 Agent 常会一次并发开出一整批子代理;超过上限的调用会明确报出派发失败,而不是悄悄回退到内建子代理。',\n 'cli.subagentBridgeConcurrencySaved': '并发上限已保存',\n 'delegate.label': '委派',\n 'delegate.description': '把当前任务派发给外部 Agent,作为 DSH 原生子智能体会话运行',\n 'delegate.searchPlaceholder': '搜索外部 Agent',\n 'delegate.searchEmpty': '没有已安装并启用的外部 Agent',\n 'delegate.searchNoResults': '没有匹配的 Agent',\n 'delegate.composerPlaceholder': '/调用指令,@文件或对话,#呼出委派菜单',\n 'delegate.started': '已委派给 {name},它将在独立的原生子智能体会话中运行。',\n 'delegate.failed': '委派失败',\n 'delegate.draftUnsupported': '当前 DSH 不支持委派草稿写入,请先升级 DSH。',\n 'delegate.selected': '已选择 {name},请继续输入委派任务后提交。',\n 'delegate.popupNoResults': '没有匹配项',\n 'delegate.selectModel': '选择 {name} 的模型',\n 'delegate.loadingModels': '正在加载模型目录…',\n 'delegate.modelCatalogFailed': '模型目录加载失败',\n 'delegate.selectAdapter': '选择委派适配器',\n 'delegate.cardTitle': '委派任务',\n 'delegate.cardStatus': '委派中',\n 'delegate.cardTarget': '{label}({adapter}{model})',\n 'skills.label': '技能',\n 'skills.description': '浏览并显式调用当前 Agent 提供的技能',\n 'skills.searchPlaceholder': '搜索技能',\n 'skills.searchEmpty': '当前 Agent 没有可用技能',\n 'skills.searchNoResults': '没有匹配的技能',\n 'skills.draftUnsupported': '当前 DSH 不支持写入技能引用,请先升级 DSH。',\n 'cli.loadingModel': '加载模型…',\n 'cli.noModelsAvailable': '无可用模型',\n 'cli.model': '模型',\n 'cli.modelSearch': '搜索模型…',\n 'cli.modelSearchClear': '清除搜索',\n 'cli.modelSearchEmpty': '没有匹配的模型。',\n 'cli.thinking': '思考等级',\n 'cli.back': '‹ 返回',\n 'cli.chooseModel': '选择模型,当前 {model},思考等级 {effort}',\n 'cli.chooseModelMenu': '模型与思考等级',\n 'cli.serviceTier': '服务档位',\n 'cli.serviceTierFast': 'Fast',\n 'cli.serviceTierStandard': '标准',\n 'cli.serviceTierToggle': 'Fast 服务档位开关,当前 {name}',\n 'cli.readingAgents': '正在读取外部 Agent 状态…',\n 'cli.noAgents': '当前没有可用的外部 Agent。',\n 'cli.agentList': '代理列表',\n 'cli.agentHost': 'Agent 所属 Host',\n 'cli.localHost': '本机 Host',\n 'cli.peerHostReadOnly': '正在查看 {name} 的 Agent。可刷新检测和查看详情,启用设置请前往该 Host 管理。',\n 'cli.peerHostUnavailable': '{name} 暂不可用,请在 PeerHost 管理中检查连接与登录状态;中转连接暂不支持 Agent 查询。',\n 'cli.peerHostListError': '读取 PeerHost 列表失败:{message}',\n 'cli.peerHostRpcReadOnly': 'PeerHost Agent 设置只支持查看和刷新目录',\n 'cli.peerHostRpcFailed': '远端 Agent 目录请求失败:HTTP {status}',\n 'cli.peerHostRpcInvalid': '远端 Agent 目录响应格式无效',\n 'cli.agentCount': '{count} 个 Agent',\n 'cli.viewDetails': '查看 {name} 详情',\n 'cli.closeDetails': '关闭 Agent 详情',\n 'cli.modelCatalog': '模型目录',\n 'cli.agentNotInstalled': 'Agent 未安装,无法读取模型目录。',\n 'cli.agentDisabled': 'Agent 已停用,启用后才能读取模型目录。',\n 'cli.readingModels': '正在读取模型目录…',\n 'cli.done': '完成',\n 'cli.noModels': '没有读取到模型。',\n 'cli.currentAgent': '当前 Agent:{name}{locked}',\n 'cli.locked': '(已锁定)',\n 'cli.selectAgent': '选择 Agent',\n 'cli.catalogLoadFailed': '无法加载外部 Agent。',\n 'cli.retryCatalog': '重新加载 Agent',\n 'workspace.showLogo': '显示 Agent Logo',\n 'workspace.logoDescription': '在原生工作区会话行显示所选外部 Agent 的 Logo。',\n 'workspace.optimizeSessionTitles': '优化DSH会话标题生成逻辑',\n 'workspace.optimizeSessionTitlesDescription': '概括完整主题,中文通常为 12~24 字;仅对后续自动标题请求生效,不批量改写旧标题,保留手动命名。',\n 'workspace.showArchivedSessions': '显示工作区归档会话',\n 'workspace.archivedSessionsDescription': '在每个工作区的“展开其余会话”按钮上方显示已归档的会话入口。',\n 'workspace.showWorkspaceHiding': '显示工作区隐藏功能',\n 'workspace.workspaceHidingDescription': '在工作区菜单中加入“隐藏工作区”,通过工作区筛选菜单显示隐藏的工作区并支持恢复。',\n 'workspace.showSubscriptionUsage': '显示订阅/用量检测',\n 'workspace.subscriptionUsageDescription': '在对话底部检测并显示 Agent 订阅余额和上游用量。',\n 'workspace.subscriptionUsageSettings': '设置',\n 'subscriptionUsage.dialogTitle': '用量查询设置',\n 'subscriptionUsage.dialogHint': '超时时间作用于所有适配器;自动查询间隔作用于对话底部的用量查询,0 表示不自动查询,间隔内的查询结果会直接复用。',\n 'subscriptionUsage.timeoutSecs': '超时时间(秒)',\n 'subscriptionUsage.refreshInterval': '自动查询间隔(分钟)',\n 'subscriptionUsage.refreshIntervalHint': '0 表示不自动查询。',\n 'subscriptionUsage.cancel': '取消',\n 'subscriptionUsage.save': '保存',\n 'subscriptionUsage.saved': '用量查询设置已保存',\n 'workspace.showQuickPhrases': '在对话框中显示快捷短语组件',\n 'workspace.quickPhrasesDescription': '在 Codingns4DSH 内本地保存可复用的会话指令,并将快捷会话按钮显示在输入工具区。',\n 'workspace.showSkillQuickReference': '索引指定 Agent 的 Skill 列表并通过指令快速引用',\n 'workspace.skillQuickReferenceDescription': '加载本次会话所选 Agent 的 Skill,将其作为整体引用元素插入聊天框,并在消息列表中美化显示。',\n 'workspace.rememberConversationRightbarRatio': '记忆对话窗口与右侧栏的宽度比例',\n 'workspace.rememberConversationRightbarRatioDescription': '刷新后恢复右侧栏比例;比例仅保存在当前浏览器中。',\n 'mobile.sidebarGestures': '横滑开合侧栏',\n 'mobile.team.title': '智能体团队',\n 'mobile.team.close': '关闭智能体团队',\n 'mobile.sidebarGesturesDescription': '触摸设备上在对话区横滑即可开合侧栏;跨过设定的视口宽度比例即触发,快速轻甩同样有效。',\n 'mobile.sidebarGestureMapping': '方向映射',\n 'mobile.sidebarGestureMappingInward': '右滑开合会话列表,左滑开合右边栏',\n 'mobile.sidebarGestureMappingSwap': '互换方向',\n 'mobile.sidebarGestureEdge': '起手区域',\n 'mobile.sidebarGestureEdgeAvoid': '避开屏幕边缘(推荐)',\n 'mobile.sidebarGestureEdgeEdge': '允许贴边起手',\n 'mobile.sidebarGestureDistance': '触发距离(占视口宽度百分比)',\n 'mobile.sidebarGestureDistanceHelp': '横滑跨过视口宽度的该比例即触发,快速轻甩同样有效;数值越小越灵敏(15–80)。',\n 'mobile.sidebarGestureSaved': '手势设置已保存',\n 'workspace.quickPhrasesTitle': '快捷会话',\n 'workspace.quickPhrasesHint': '点击条目即可填入当前对话框。',\n 'workspace.quickPhrasesEmpty': '还没有快捷会话。',\n 'workspace.quickPhrasesPlaceholder': '输入可复用的会话指令',\n 'workspace.quickPhrasesAdd': '添加快捷会话',\n 'workspace.quickPhrasesCancel': '取消',\n 'workspace.quickPhrasesAddDialogLabel': '添加快捷会话',\n 'workspace.quickPhrasesDelete': '删除快捷会话',\n 'workspace.quickPhrasesMoveUp': '上移快捷会话',\n 'workspace.quickPhrasesMoveDown': '下移快捷会话',\n 'workspace.quickPhrasesDrag': '拖动以调整快捷会话顺序',\n 'workspace.quickPhrasesSaved': '快捷会话设置已保存',\n 'workspace.quickPhrasesSaveFailed': '快捷会话设置保存失败',\n 'workspace.quickPhrasesTrigger': '快捷会话',\n 'workspace.quickPhrasesDialogLabel': '选择快捷会话',\n 'workspace.quickPhrasesClose': '关闭快捷会话',\n}\n\n/**\n * 合并核心词典与各域片段。\n *\n * 每个域片段只声明自己的键;一旦两个片段出现同名键,后面的会静默覆盖前面的,\n * 因此 scripts/check-client-i18n.mjs 会把重复键判为错误。\n */\nconst en: Record<string, string> = {\n ...CORE_EN,\n ...gitDictionary.en,\n ...debugDictionary.en,\n ...peerHostDictionary.en,\n ...peerHostWorkspaceDictionary.en,\n ...usageDictionary.en,\n ...fileWorkspaceDictionary.en,\n ...terminalAuthDictionary.en,\n ...panelsDictionary.en,\n ...subagentCollapsedDictionary.en,\n ...quickAppsDictionary.en,\n ...cliManagementDictionary.en,\n ...magpieDictionary.en,\n ...pluginUpdateDictionary.en,\n ...credentialsDictionary.en,\n}\n\nconst zh: Record<string, string> = {\n ...CORE_ZH,\n ...gitDictionary.zh,\n ...debugDictionary.zh,\n ...peerHostDictionary.zh,\n ...peerHostWorkspaceDictionary.zh,\n ...usageDictionary.zh,\n ...fileWorkspaceDictionary.zh,\n ...terminalAuthDictionary.zh,\n ...panelsDictionary.zh,\n ...subagentCollapsedDictionary.zh,\n ...quickAppsDictionary.zh,\n ...cliManagementDictionary.zh,\n ...magpieDictionary.zh,\n ...pluginUpdateDictionary.zh,\n ...credentialsDictionary.zh,\n}\n\n/** 在当前 Client Cordis 作用域注册中英文词典。 */\nexport function registerCodingNsLocale(ctx: Context): () => void {\n return ctx.locale.register(CODINGNS_LOCALE_NS, { en, zh })\n}\n\n/** 订阅 DSH 语言修订,并返回当前 Codingns4DSH 命名空间翻译函数。 */\nexport function useCodingNsTranslator(locale: CodingNsLocale): CodingNsTranslator {\n // useSyncExternalStore 要求 subscribe/getSnapshot 保持稳定引用:内联闭包会让\n // React 在每次渲染后追加一次一致性检查,并在引用变化时强制重新渲染。\n const store = useMemo(() => localeSnapshotHandle(locale), [locale])\n useSyncExternalStore(store.subscribe, store.getRevision, store.getRevision)\n return locale.bind(CODINGNS_LOCALE_NS)\n}\n\nfunction localeSnapshotHandle(locale: CodingNsLocale): {\n readonly subscribe: (listener: () => void) => () => void\n readonly getRevision: () => number\n} {\n return {\n subscribe: (listener) => locale.subscribe(listener),\n getRevision: () => locale.getSnapshot().revision,\n }\n}\n\n/** 非 React 注册回调使用的翻译函数。 */\nexport function codingNsTranslator(locale: CodingNsLocale): CodingNsTranslator {\n return locale.bind(CODINGNS_LOCALE_NS)\n}\n\n/**\n * 命令式模块的翻译函数入口。\n *\n * 正式运行总是由功能模块注入 DSH locale 服务;只有单测或非 Cordis 宿主没有\n * locale 时,才退回内置中文词典,保证命令式模块仍可独立运行。\n */\nexport function resolveCodingNsTranslator(locale?: CodingNsLocale): CodingNsTranslator {\n return locale === undefined ? staticCodingNsTranslator() : codingNsTranslator(locale)\n}\n\n/** 无 locale 服务时的内置中文兜底;插值规则与 DSH 的 `{name}` 保持一致。 */\nfunction staticCodingNsTranslator(): CodingNsTranslator {\n return (key, params) => {\n const template = zh[key] ?? key\n if (params === undefined) return template\n return template.replace(/\\{(\\w+)\\}/g, (match, name) => (name in params ? String(params[name]) : match))\n }\n}\n","import type { CodingNsCliAdapterId } from './contracts/cli-adapter.js'\n\nexport const CLI_PROVIDER_PREFIX = 'codingns-cli-'\n\n/** DSH provider routes are global; persisted adapter IDs remain plugin-local. */\nexport function toCliProviderId(adapterId: CodingNsCliAdapterId): string {\n return `${CLI_PROVIDER_PREFIX}${adapterId}`\n}\n\n/** A bare brand name does not establish ownership of a DSH provider. */\nexport function fromCliProviderId(provider: unknown): CodingNsCliAdapterId | undefined {\n if (typeof provider !== 'string' || !provider.startsWith(CLI_PROVIDER_PREFIX)) return undefined\n const adapterId = provider.slice(CLI_PROVIDER_PREFIX.length)\n return adapterId === '' ? undefined : adapterId\n}\n","import { resolveCodingNsTranslator, type CodingNsTranslator } from './locale.js'\nimport { fromCliProviderId } from '../shared/cli-provider-route.js'\nimport { PROVIDER_ICON_FILES } from '../shared/provider-icon-resources.js'\n\nexport interface ProviderVisual {\n readonly adapterId: string | null\n readonly displayName: string\n readonly iconUrl: string | undefined\n readonly color: string\n}\n\ninterface ProviderDefinition {\n readonly adapterId: string\n readonly displayName: string\n readonly displayNameKey?: string\n readonly color: string\n}\n\n/** 未绑定和未知 Agent 使用中性灰,绝不冒充任一已知品牌色。 */\nexport const PROVIDER_NEUTRAL_COLOR = '#71717a'\n\n/**\n * 外部 Agent 标识、显示名称与标签颜色的唯一映射。浏览器入口另行安装内联资产。\n *\n * 标签颜色用于会话行/归档列表的彩色标识:优先贴近本地图标或品牌色,\n * 并保持在浅色与深色主题下都可读的中等明度区间。\n */\nconst PROVIDER_DEFINITIONS: Readonly<Record<string, ProviderDefinition>> = {\n dsh: { adapterId: 'dsh', displayName: 'DeepSeek Harness', color: '#2563eb' },\n 'command-code': { adapterId: 'command-code', displayName: 'Command Code', color: '#8b5cf6' },\n 'claude-code': { adapterId: 'claude-code', displayName: 'Claude Code', color: '#d97757' },\n kimi: { adapterId: 'kimi', displayName: 'Kimi', color: '#0ea5e9' },\n gemini: { adapterId: 'gemini', displayName: 'Gemini CLI', color: '#4285f4' },\n pi: { adapterId: 'pi', displayName: 'Pi', color: '#f59e0b' },\n codex: { adapterId: 'codex', displayName: 'Codex', color: '#10a37f' },\n opencode: { adapterId: 'opencode', displayName: 'OpenCode', color: '#14b8a6' },\n grok: { adapterId: 'grok', displayName: 'Grok', color: '#71717a' },\n mcode: { adapterId: 'mcode', displayName: 'MiniMax Code', color: '#f97316' },\n zcode: { adapterId: 'zcode', displayName: 'ZCode', color: '#38bdf8' },\n codebuddy: { adapterId: 'codebuddy', displayName: 'CodeBuddy', color: '#2563eb' },\n workbuddy: { adapterId: 'workbuddy', displayName: 'WorkBuddy', color: '#0f766e' },\n 'cursor-cli': { adapterId: 'cursor-cli', displayName: 'Cursor CLI', color: '#111827' },\n 'kiro-cli': { adapterId: 'kiro-cli', displayName: 'Kiro CLI', color: '#7c3aed' },\n qoder: { adapterId: 'qoder', displayName: 'Qoder', color: '#ea580c' },\n 'qoder-cn': { adapterId: 'qoder-cn', displayName: 'Qoder CN', color: '#c2410c' },\n antigravity: { adapterId: 'antigravity', displayName: 'Antigravity', color: '#1d4ed8' },\n doubao: { adapterId: 'doubao', displayName: 'Doubao App', displayNameKey: 'provider.doubao', color: '#477fe8' },\n}\n\nconst PROVIDER_ICONS: Record<string, string> = {}\n\nconst PROVIDER_ICON_ALIASES: Readonly<Record<string, string>> = {\n claude: 'claude-code',\n commandcode: 'command-code',\n 'minimax-code': 'mcode',\n minimax: 'mcode',\n cursor: 'cursor-cli',\n agy: 'antigravity',\n codingns4dsh: 'dsh',\n 'workbuddy-ai': 'workbuddy',\n 'grok-(supergrok)': 'grok',\n openai: 'codex',\n 'openai-api': 'codex',\n 'openai-subscription': 'codex',\n 'codex-subscription': 'codex',\n anthropic: 'claude-code',\n 'anthropic-subscription': 'claude-code',\n 'claude-subscription': 'claude-code',\n 'gemini-cli': 'gemini',\n 'google-gemini': 'gemini',\n 'codebuddy-cn': 'codebuddy',\n deepseek: 'dsh',\n 'deepseek-api': 'dsh',\n 'deepseek-harness': 'dsh',\n 'deepseek-subscription': 'dsh',\n supergrok: 'grok',\n}\n\nconst MODEL_PROVIDER_PATTERNS: readonly [RegExp, string][] = [\n [/(?:^|[\\-/])deepseek(?:[-./]|$)/u, 'dsh'],\n [/(?:^|[\\-/])codex(?:[-./]|$)/u, 'codex'],\n [/(?:^|[\\-/])gpt(?:[-./]|$)/u, 'codex'],\n [/(?:^|[\\-/])(?:claude|opus|sonnet|haiku)(?:[-./]|$)/u, 'claude-code'],\n [/(?:^|[\\-/])gemini(?:[-./]|$)/u, 'gemini'],\n [/(?:^|[\\-/])kimi(?:[-./]|$)/u, 'kimi'],\n [/(?:^|[\\-/])grok(?:[-./]|$)/u, 'grok'],\n [/(?:^|[\\-/])(?:minimax|mcode)(?:[-./]|$)/u, 'mcode'],\n [/(?:^|[\\-/])workbuddy(?:[-./]|$)/u, 'workbuddy'],\n [/(?:^|[\\-/])codebuddy(?:[-./]|$)/u, 'codebuddy'],\n [/(?:^|[\\-/])cursor(?:[-./]|$)/u, 'cursor-cli'],\n [/(?:^|[\\-/])qoder(?:[-./]|$)/u, 'qoder'],\n [/(?:^|[\\-/])command(?:-?code)(?:[-./]|$)/u, 'command-code'],\n [/(?:^|[\\-/])zcode(?:[-./]|$)/u, 'zcode'],\n [/(?:^|[\\-/])antigravity(?:[-./]|$)/u, 'antigravity'],\n]\n\nconst KNOWN_PROVIDER_ICON_IDS = new Set([\n ...Object.keys(PROVIDER_DEFINITIONS),\n ...Object.keys(PROVIDER_ICON_FILES),\n ...Object.values(PROVIDER_ICON_ALIASES),\n])\n\n/** 只由浏览器入口调用,使普通 Node 测试不需要加载 png/svg。 */\nexport function installProviderIcons(icons: Readonly<Record<string, string>>): void {\n for (const adapterId of Object.keys(PROVIDER_ICONS)) delete PROVIDER_ICONS[adapterId]\n // 资源也包含 R4 等上游品牌,不要求它同时是可执行的 Agent。\n for (const adapterId of Object.keys(icons)) {\n const iconUrl = icons[adapterId]\n if (iconUrl !== undefined) PROVIDER_ICONS[adapterId] = iconUrl\n }\n}\n\nexport function providerIconUrl(adapterId: string): string | undefined {\n return providerIconUrlForIdentities([adapterId])\n}\n\n/**\n * Resolve one canonical provider asset ID from the identities emitted by a\n * Magpie record. Specific provider identities win over the Magpie gateway;\n * model-family inference is only used when no provider identity is known.\n */\nexport function resolveProviderIconId(identities: readonly (string | null | undefined)[]): string | undefined {\n const candidates = providerIconCandidates(identities)\n return candidates[0]\n}\n\n/** Resolve and load a logo for a record that may expose several identities. */\nexport function providerIconUrlForIdentities(identities: readonly (string | null | undefined)[]): string | undefined {\n for (const iconId of providerIconCandidates(identities)) {\n const iconUrl = PROVIDER_ICONS[iconId]\n if (iconUrl !== undefined) return iconUrl\n }\n return undefined\n}\n\n/**\n * 未绑定和未知值都返回中性占位,绝不冒充任一已知品牌。\n *\n * 第二个参数是 Codingns4DSH 词典翻译函数;未提供时退回内置中文词典,\n * 保证不接 locale 的调用方与单测仍能拿到稳定的展示名。\n */\nexport function providerVisual(adapterId: string | undefined, t?: CodingNsTranslator): ProviderVisual {\n const translate = t ?? resolveCodingNsTranslator()\n if (adapterId === undefined || adapterId.trim() === '') {\n return { adapterId: null, displayName: translate('provider.unbound'), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n const normalizedAdapterId = normalizeProviderAdapterId(adapterId)\n const definition = PROVIDER_DEFINITIONS[normalizedAdapterId]\n if (definition === undefined) {\n return { adapterId, displayName: translate('provider.unknown', { adapterId }), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n return { ...definition, displayName: definition.displayNameKey ? translate(definition.displayNameKey) : definition.displayName, iconUrl: providerIconUrl(adapterId) }\n}\n\n/** 兼容旧版 CN profile 的会话快照,但不重新暴露第二个 Provider。 */\nfunction normalizeProviderAdapterId(adapterId: string): string {\n const normalized = fromCliProviderId(adapterId) ?? adapterId\n return normalized === 'codebuddy-cn' ? 'codebuddy' : normalized\n}\n\nfunction providerIconCandidates(identities: readonly (string | null | undefined)[]): readonly string[] {\n const specific: string[] = []\n const inferred: string[] = []\n const gateway: string[] = []\n const seen = new Set<string>()\n let hasSpecificProvider = false\n\n const add = (target: string[], iconId: string): void => {\n if (seen.has(iconId)) return\n seen.add(iconId)\n target.push(iconId)\n }\n\n for (const identity of identities) {\n if (identity === undefined || identity === null || identity.trim() === '') continue\n const normalized = normalizeProviderIdentity(identity)\n const cliAdapterId = fromCliProviderId(normalized)\n const values = [\n ...(cliAdapterId === undefined ? [] : [normalizeProviderIdentity(cliAdapterId)]),\n normalized,\n ...normalized.split('/').filter((value) => value !== '').reverse(),\n ]\n for (const value of values) {\n const iconId = canonicalProviderIconId(value)\n if (iconId === undefined) continue\n if (iconId === 'magpie') add(gateway, iconId)\n else {\n hasSpecificProvider = true\n add(specific, iconId)\n }\n }\n for (const value of values) {\n for (const [pattern, iconId] of MODEL_PROVIDER_PATTERNS) {\n if (pattern.test(value)) add(inferred, iconId)\n }\n }\n }\n\n // Do not let a gateway label mask the actual provider or a recognizable model family.\n return hasSpecificProvider ? specific : [...inferred, ...gateway]\n}\n\nfunction canonicalProviderIconId(value: string): string | undefined {\n const normalized = normalizeProviderIdentity(value)\n const aliased = PROVIDER_ICON_ALIASES[normalized] ?? normalized\n if (KNOWN_PROVIDER_ICON_IDS.has(aliased) || PROVIDER_ICONS[aliased] !== undefined) return aliased\n return undefined\n}\n\nfunction normalizeProviderIdentity(value: string): string {\n return value.trim().toLocaleLowerCase().replace(/[\\s_]+/gu, '-')\n}\n\nexport { PROVIDER_DEFINITIONS, PROVIDER_ICONS }\n","/**\n * Codingns4DSH 调试日志开关。\n *\n * 调试输出默认关闭。需要查看启动或 RPC 追踪时,使用\n * `CODINGNS4DSH_DEBUG=1 dsh ...` 启动 DSH;浏览器侧同时支持 `?dshDebug=1`。\n * 只看警告和错误时使用 `CODINGNS4DSH_DEBUG_LEVEL=warn`,也接受\n * `CODINGNS4DSH_DEBUG=warn` 作为简写。\n */\nexport const CODINGNS4DSH_DEBUG_ENV = 'CODINGNS4DSH_DEBUG'\nexport const CODINGNS4DSH_DEBUG_LEVEL_ENV = 'CODINGNS4DSH_DEBUG_LEVEL'\n/** 兼容脚本化启动器的显式警告模式开关。 */\nexport const CODINGNS4DSH_DEBUG_WARN_ENV = 'CODINGNS4DSH_DEBUG_WARN'\n\nconst LEGACY_DEBUG_ENV = 'CODINGNS4DSH_TUNNEL_DEBUG'\n\nexport type CodingNsDebugLevel = 'off' | 'warn' | 'info'\n\n/** 当前运行环境是否明确要求输出调试日志。 */\nexport function resolveCodingNsDebugEnabled(): boolean {\n return resolveCodingNsDebugLevel() !== 'off'\n}\n\n/** 解析调试日志级别;`warn` 会过滤普通追踪信息,只保留警告和错误。 */\nexport function resolveCodingNsDebugLevel(): CodingNsDebugLevel {\n const globals = globalThis as typeof globalThis & {\n __CODINGNS4DSH_DEBUG_ENABLED__?: unknown\n __CODINGNS4DSH_DEBUG_LEVEL__?: unknown\n __CODINGNS4DSH_TUNNEL_DEBUG__?: unknown\n }\n if (globals.__CODINGNS4DSH_DEBUG_LEVEL__ !== undefined) {\n return parseDebugLevel(globals.__CODINGNS4DSH_DEBUG_LEVEL__)\n }\n const globalValue = globals.__CODINGNS4DSH_DEBUG_ENABLED__ ?? globals.__CODINGNS4DSH_TUNNEL_DEBUG__\n if (globalValue !== undefined) return parseDebugValue(globalValue) ? 'info' : 'off'\n\n if (typeof location !== 'undefined') {\n const searchParams = new URL(location.href).searchParams\n const queryValue = searchParams.get('dshDebugLevel') ?? searchParams.get('dshDebug')\n if (queryValue !== null) return parseDebugLevel(queryValue)\n }\n\n if (typeof localStorage !== 'undefined') {\n try {\n const storedLevel = localStorage.getItem('codingns4dsh-debug-level')\n if (storedLevel !== null) return parseDebugLevel(storedLevel)\n const storedWarn = localStorage.getItem('codingns4dsh-debug-warn')\n if (storedWarn !== null && parseDebugValue(storedWarn)) return 'warn'\n const stored = localStorage.getItem('codingns4dsh-debug')\n ?? localStorage.getItem('codingns4dsh-tunnel-debug')\n if (stored !== null) return parseDebugLevel(stored)\n } catch {\n // 隐私模式或受限 iframe 可能禁止读取 localStorage,继续检查进程环境变量。\n }\n }\n\n if (typeof process !== 'undefined') {\n const level = process.env[CODINGNS4DSH_DEBUG_LEVEL_ENV]\n if (level !== undefined) return parseDebugLevel(level)\n if (parseDebugValue(process.env[CODINGNS4DSH_DEBUG_WARN_ENV])) return 'warn'\n return parseDebugLevel(process.env[CODINGNS4DSH_DEBUG_ENV] ?? process.env[LEGACY_DEBUG_ENV])\n }\n return 'off'\n}\n\n/** 输出受统一开关控制的调试信息。 */\nexport function debugInfo(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugLevel() === 'info') console.info(message, ...args)\n}\n\n/** 输出受统一开关控制的调试警告。 */\nexport function debugWarn(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugEnabled()) console.warn(message, ...args)\n}\n\nfunction parseDebugValue(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value !== 'string') return false\n return /^(1|true|yes|on)$/iu.test(value.trim())\n}\n\nfunction parseDebugLevel(value: unknown): CodingNsDebugLevel {\n if (typeof value === 'boolean') return value ? 'info' : 'off'\n if (typeof value !== 'string') return 'off'\n const normalized = value.trim().toLowerCase()\n if (/^(warn|warning|error)$/u.test(normalized)) return 'warn'\n if (/^(1|true|yes|on|info|debug)$/u.test(normalized)) return 'info'\n return 'off'\n}\n","import type { CodingNsDshErrorCode } from './errors.js'\n\n/** Codingns4DSH Host RPC 的固定逻辑通道。 */\nexport const CODINGNS_RPC_CHANNEL = '/codingns'\n\nexport interface CodingNsRpcRequest<TPayload = unknown> {\n method: string\n payload: TPayload\n signal?: AbortSignal\n}\n\nexport interface CodingNsStreamRequest<TPayload = unknown> {\n method: string\n payload: TPayload\n signal?: AbortSignal\n}\n\nexport interface CodingNsTransportGeneration {\n id: number\n host: { home: string }\n}\n\nexport interface CodingNsTransport {\n rpc<TResponse = unknown, TPayload = unknown>(request: CodingNsRpcRequest<TPayload>): Promise<TResponse>\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>\n openStream<TChunk = unknown, TPayload = unknown>(request: CodingNsStreamRequest<TPayload>): AsyncIterable<TChunk>\n loadBundle(url: string): Promise<void>\n getGeneration(): CodingNsTransportGeneration | undefined\n onGenerationChange(listener: (generation: CodingNsTransportGeneration | undefined) => void): () => void\n reconnect(signal?: AbortSignal): Promise<void>\n close(): Promise<void>\n}\n\nexport interface CodingNsTransportHooks {\n rpc?: CodingNsTransport['rpc']\n fetch?: CodingNsTransport['fetch']\n openStream?: CodingNsTransport['openStream']\n loadBundle?: CodingNsTransport['loadBundle']\n generation?: CodingNsTransport['getGeneration']\n onGenerationChange?: CodingNsTransport['onGenerationChange']\n reconnect?: CodingNsTransport['reconnect']\n close?: CodingNsTransport['close']\n}\n\nexport interface CodingNsTransportErrorShape {\n code: CodingNsDshErrorCode\n message: string\n generationId?: number\n}\n","/** PeerHost 目标路由;短期 relay ticket 永远不属于持久配置。 */\nexport type PeerHostRoute =\n | {\n readonly kind: 'lan'\n readonly baseUrl: string\n readonly normalizedOrigin: string\n }\n | {\n readonly kind: 'relay'\n readonly deviceId: string\n readonly relayEntryId: string\n readonly transportVersion: string\n }\n\nexport type PeerHostStatus =\n | 'configured'\n | 'checking'\n | 'ready'\n | 'plugin_missing'\n | 'version_mismatch'\n | 'identity_changed'\n | 'session_required'\n | 'unreachable'\n | 'reconnecting'\n | 'disabled'\n\n/** Host 侧保存的 PeerHost 配置与脱敏握手状态。凭据不在此 DTO 中。 */\nexport interface PeerHostRecord {\n readonly id: string\n readonly ownerUserId: string\n readonly displayName: string\n readonly route: PeerHostRoute\n readonly status: PeerHostStatus\n readonly pluginId: string | null\n readonly pluginVersion: string | null\n readonly dshVersion: string | null\n /** 远端操作系统主机名;旧记录没有此字段时保持缺省。 */\n readonly hostname?: string | null\n /** 远端 DSH 配置文件名;只返回名称,不返回本地路径。 */\n readonly configProfile?: string | null\n readonly apiCompatibility: string | null\n readonly fingerprint: string | null\n readonly lastCheckedAt: number | null\n readonly lastErrorCode: PeerHostErrorCode | null\n /**\n * 工作区标签配色;缺省时客户端按名称推导稳定色。\n *\n * 颜色只影响本机侧栏标签,不参与握手、代理或目标 Host 的任何状态。\n */\n readonly color?: string | null\n /**\n * 用户显式添加的远端工作区 ID。\n *\n * 聚合摘要只投影这个集合内的远端工作区;缺省或空集合表示\"尚未显式添加任何\n * 远端工作区\",此时不展示该 Host 的任何工作区——这是默认行为,不是降级。\n */\n readonly visibleWorkspaceIds?: readonly string[]\n readonly createdAt: number\n readonly updatedAt: number\n}\n\n/** Client 管理面板可见的 PeerHost 摘要;仅暴露局域网地址,凭据和中转路由详情仍留在 Host。 */\nexport type PeerHostClientRoute =\n | { readonly kind: 'lan'; readonly baseUrl?: string }\n | { readonly kind: 'relay' }\n\nexport type PeerHostClientRecord = Omit<PeerHostRecord, 'route'> & {\n readonly route: PeerHostClientRoute\n}\n\n/** Client 可见的 PeerHost 诊断快照;不包含完整路由、凭据或正文。 */\nexport interface PeerHostDiagnosticSnapshot {\n readonly peerHostId: string\n readonly routeKind: 'lan' | 'relay'\n readonly status: PeerHostStatus\n readonly lastErrorCode: PeerHostErrorCode | null\n readonly lastCheckedAt: number | null\n readonly fingerprint: string | null\n}\n\n/** 当前 Host 插件自有 WebSocket 入口;不包含任何目标 Host 地址或凭据。 */\nexport interface PeerHostWebSocketEndpoint {\n readonly host: string\n readonly port: number\n readonly path: string\n}\n\n/** 所有跨 Host 资源共用的完整作用域。 */\nexport interface HostScope {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string | null\n readonly scopeGeneration: number\n}\n\n/** 只保留标题投影及远端原生序号,避免把实时标题降级为无法覆盖旧值的缓存。 */\nexport interface PeerHostSessionTitleProjection {\n readonly kind: 'cached' | 'sequenced'\n readonly asOfSeq: number\n readonly values: { readonly title: string | null }\n}\n\n/** 会话摘要只用于聚合导航,不包含历史消息或工具内容。 */\nexport interface PeerHostSessionRecord {\n readonly scope: HostScope\n readonly title: string\n /** 旧版摘要缺省;不得使用 updatedAt 伪造原生事件序号。 */\n readonly titleProjection?: PeerHostSessionTitleProjection\n readonly status: string\n /** 来自真实执行状态的证明;不能把导航层默认 idle 当作完成证明。 */\n readonly activity?: 'running' | 'idle' | 'unknown'\n readonly updatedAt: number\n /** DSH 原生会话是否仍处于待首条消息的临时状态。 */\n readonly blank: boolean\n /** 远端 CodingNS CLI 会话绑定的适配器;旧 Host 未提供时保持缺省。 */\n readonly adapterId?: string\n /** 子会话身份仅用于原生目录与路由,不改变工作区侧栏的可见会话。 */\n readonly origin?: 'subagent'\n readonly parentSessionId?: string\n}\n\n/** 当前 Host 和 PeerHost 统一使用的工作区摘要。 */\nexport interface AggregateWorkspaceSummary {\n readonly key: string\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly displayName: string\n /** 工作区在所属 Host 上的真实路径;原生文件面板等按路径解析,不能用 workspaceId 代替。 */\n readonly path: string\n readonly hostLabel: string\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly sessions: readonly PeerHostSessionRecord[]\n /**\n * 已归档会话。远端侧栏默认隐藏这些行,但归档入口、归档集合与取消归档路由\n * 仍需要它们;子代理会话在可见与归档两侧都不出现。\n */\n readonly archivedSessions?: readonly PeerHostSessionRecord[]\n /** 可见工作区下的子会话,进入状态和路由目录,但不占侧栏成员槽位。 */\n readonly subagentSessions?: readonly PeerHostSessionRecord[]\n}\n\nexport interface AggregateHostResult {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n /** 该 Host 工作区标签的配色;缺省时客户端按名称推导稳定色。 */\n readonly hostColor?: string | null\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly errorCode: PeerHostErrorCode | null\n /** 摘要能力不可用时保留可诊断原因,禁止以空工作区伪装成功。 */\n readonly diagnostic?: string\n readonly workspaces: readonly AggregateWorkspaceSummary[]\n}\n\n/**\n * 工作区标签配色的取值范围。\n *\n * 只接受 `#rrggbb`:颜色会被写进本机侧栏 DOM 的内联样式,开放任意字符串\n * 等于把 CSS 注入面交给远端配置。\n */\nexport const PEER_HOST_COLOR_PATTERN = /^#[0-9a-f]{6}$/u\n\n/** 校验并归一化工作区标签配色;非法值返回 null,由消费方回退到推导色。 */\nexport function normalizePeerHostColor(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim().toLowerCase()\n return PEER_HOST_COLOR_PATTERN.test(trimmed) ? trimmed : null\n}\n\n/** 管理面板的默认配色候选;顺序即下拉顺序。 */\nexport const PEER_HOST_COLOR_PRESETS = Object.freeze([\n '#1677ff',\n '#722ed1',\n '#13c2c2',\n '#52c41a',\n '#fa8c16',\n '#eb2f96',\n '#f5222d',\n '#8c8c8c',\n] as const)\n\n/** Aggregated Host 只允许本地插件基线;远端不得提供 Manifest、Bundle 或 UI Slot。 */\nexport interface AggregatedHostLocalPluginBaseline {\n readonly pluginId: string\n readonly pluginVersion: string\n readonly manifestSource: 'local'\n readonly bundleSource: 'local'\n readonly uiSource: 'local'\n readonly allowRemoteManifest: false\n readonly allowRemoteBundle: false\n}\n\n/** 目标 Host 的执行能力摘要;不包含 token、路由地址或插件正文。 */\nexport interface AggregatedHostCapabilitySummary {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n readonly status: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly dshVersion: string | null\n readonly apiCompatibility: string | null\n readonly capabilities: readonly string[]\n readonly diagnostic?: string\n}\n\n/** Client 读取的 Manifest 只代表当前 Host 的本地插件基线。 */\nexport interface AggregatedHostManifestBoundary {\n readonly source: 'local'\n readonly plugin: AggregatedHostLocalPluginBaseline\n readonly remoteManifest: 'forbidden'\n readonly remoteBundle: 'forbidden'\n}\n\n/** Aggregated Transport 的物理连接 generation;作用域 generation 仍由 HostScope 管理。 */\nexport interface AggregatedHostGeneration {\n readonly id: number\n readonly host: { readonly home: string }\n readonly connectedAt: number\n}\n\nexport interface AggregatedHostRpcRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostFetchRequest {\n readonly scope: HostScope\n readonly path: string\n readonly method?: string\n readonly headers?: Readonly<Record<string, string>>\n readonly body?: string\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostStreamRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\n/** Client 侧只提交自己的 Socket;目标连接和 token 由 Host 侧代理服务持有。 */\nexport interface AggregatedHostWebSocketClient {\n readonly readyState: number\n send(data: string): void\n close(code?: number, reason?: string): void\n on(event: 'message' | 'close' | 'error', listener: (...args: any[]) => void): void\n}\n\n/** Aggregated Host 的内部稳定 Transport;不替换普通插件 ctx.connection。 */\nexport interface AggregatedHostTransport {\n readonly kind: 'aggregated-host'\n readonly localPlugin: AggregatedHostLocalPluginBaseline\n getCapabilities(): readonly AggregatedHostCapabilitySummary[]\n rpc<TResponse = unknown>(request: AggregatedHostRpcRequest): Promise<TResponse>\n fetch(request: AggregatedHostFetchRequest): Promise<Response>\n openStream<TChunk = unknown>(request: AggregatedHostStreamRequest): AsyncIterable<TChunk>\n openWebSocket(client: AggregatedHostWebSocketClient, scope: HostScope): Promise<() => void>\n getGeneration(): AggregatedHostGeneration | undefined\n onGenerationChange(listener: (generation: AggregatedHostGeneration | undefined) => void): () => void\n reconnect(signal?: AbortSignal): Promise<void>\n readManifest(): AggregatedHostManifestBoundary\n loadBundle(url: string): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * 聚合 Host 对外暴露的资源命名空间。\n *\n * 远端 Host 的 workspace/session id 只在各自 Host 内唯一,不能直接交给\n * 本地 DSH Store。聚合层使用版本化、可逆的虚拟 ID,避免不同 Host 的同名\n * 资源碰撞,同时保留真实 ID 供路由层转发。\n */\nexport type VirtualWorkspaceId = string\nexport type VirtualSessionId = string\n\nexport interface VirtualWorkspaceRef {\n readonly virtualWorkspaceId: VirtualWorkspaceId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n}\n\nexport interface VirtualSessionRef {\n readonly virtualSessionId: VirtualSessionId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string\n}\n\n/** 混合 Workspace 顺序的持久化内容,只保存虚拟 ID,不复制 Host 数据。 */\nexport interface AggregateWorkspaceOrder {\n readonly version: 1\n readonly orderedWorkspaceIds: readonly VirtualWorkspaceId[]\n}\n\nexport const VIRTUAL_RESOURCE_ID_PREFIX = 'codingns:peer-host:v1'\n\nexport function createVirtualWorkspaceId(hostId: string, workspaceId: string): VirtualWorkspaceId {\n return createVirtualResourceId('workspace', hostId, workspaceId)\n}\n\nexport function createVirtualSessionId(hostId: string, sessionId: string): VirtualSessionId {\n return createVirtualResourceId('session', hostId, sessionId)\n}\n\nexport function parseVirtualWorkspaceId(value: string): VirtualWorkspaceRef | null {\n const parsed = parseVirtualResourceId(value, 'workspace')\n if (parsed === null) return null\n return { virtualWorkspaceId: value, hostId: parsed.hostId, targetHostId: parsed.hostId === 'local' ? null : parsed.hostId, workspaceId: parsed.resourceId }\n}\n\nexport function parseVirtualSessionId(value: string): { readonly hostId: string; readonly sessionId: string } | null {\n const parsed = parseVirtualResourceId(value, 'session')\n return parsed === null ? null : { hostId: parsed.hostId, sessionId: parsed.resourceId }\n}\n\nfunction createVirtualResourceId(kind: 'workspace' | 'session', hostId: string, resourceId: string): string {\n const host = requiredResourcePart(hostId, 'hostId')\n const resource = requiredResourcePart(resourceId, kind === 'workspace' ? 'workspaceId' : 'sessionId')\n return `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:${encodeURIComponent(host)}:${encodeURIComponent(resource)}`\n}\n\nfunction parseVirtualResourceId(value: string, kind: 'workspace' | 'session'): { readonly hostId: string; readonly resourceId: string } | null {\n if (typeof value !== 'string') return null\n const prefix = `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:`\n if (!value.startsWith(prefix)) return null\n const parts = value.slice(prefix.length).split(':')\n if (parts.length !== 2 || parts.some((part) => part === '')) return null\n try {\n const hostId = decodeURIComponent(parts[0]!)\n const resourceId = decodeURIComponent(parts[1]!)\n return hostId && resourceId ? { hostId, resourceId } : null\n } catch {\n return null\n }\n}\n\nfunction requiredResourcePart(value: string, name: string): string {\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${name} 不能为空`)\n return value\n}\n\nexport const PEER_HOST_ERROR_CODES = {\n NOT_FOUND: 'PEER_HOST_NOT_FOUND',\n NOT_READY: 'PEER_HOST_NOT_READY',\n SESSION_REQUIRED: 'PEER_HOST_SESSION_REQUIRED',\n PROXY_PATH_NOT_ALLOWED: 'PEER_HOST_PROXY_PATH_NOT_ALLOWED',\n PROXY_ACCESS_DENIED: 'PEER_HOST_PROXY_ACCESS_DENIED',\n SCOPE_MISMATCH: 'PEER_HOST_SCOPE_MISMATCH',\n PROXY_UNREACHABLE: 'PEER_HOST_PROXY_UNREACHABLE',\n RESPONSE_INVALID: 'PEER_HOST_RESPONSE_INVALID',\n TOOL_UNSUPPORTED: 'PEER_HOST_TOOL_UNSUPPORTED',\n INVALID_ROUTE: 'PEER_HOST_INVALID_ROUTE',\n DUPLICATE: 'PEER_HOST_DUPLICATE',\n PLUGIN_MISSING: 'PEER_HOST_PLUGIN_MISSING',\n VERSION_MISMATCH: 'PEER_HOST_VERSION_MISMATCH',\n IDENTITY_CHANGED: 'PEER_HOST_IDENTITY_CHANGED',\n UNREACHABLE: 'PEER_HOST_UNREACHABLE',\n RELAY_UNAVAILABLE: 'PEER_HOST_RELAY_UNAVAILABLE',\n AGGREGATE_UNAVAILABLE: 'PEER_HOST_AGGREGATE_UNAVAILABLE',\n STALE_GENERATION: 'PEER_HOST_STALE_GENERATION',\n AGGREGATED_TRANSPORT_UNSUPPORTED: 'PEER_HOST_AGGREGATED_TRANSPORT_UNSUPPORTED',\n AGGREGATED_MANIFEST_FORBIDDEN: 'PEER_HOST_AGGREGATED_MANIFEST_FORBIDDEN',\n AGGREGATED_BUNDLE_FORBIDDEN: 'PEER_HOST_AGGREGATED_BUNDLE_FORBIDDEN',\n} as const\n\nexport type PeerHostErrorCode = typeof PEER_HOST_ERROR_CODES[keyof typeof PEER_HOST_ERROR_CODES]\n\n/** 可安全返回 Client 的结构化错误,不携带凭据、完整 URL 或内容数据。 */\nexport interface PeerHostErrorShape {\n readonly code: PeerHostErrorCode\n readonly peerHostId?: string\n readonly message: string\n}\n\n/** 作用域管理器仍使用的兼容引用;新跨 Host 代码应优先使用 HostScope。 */\nexport interface ResourceScopeRef {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n scopeGeneration: number\n sessionId?: string | null\n}\n\nexport interface ResourceScopeInput {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n sessionId?: string | null\n}\n\nexport type ResourceScopeSnapshot = Readonly<ResourceScopeRef>\n\n/** 作用域拥有的清理函数。清理函数必须可重复调用而不会产生副作用。 */\nexport type ResourceScopeDisposer = () => void | Promise<void>\n\n/** 作用域已经失效时统一抛出的错误。 */\nexport class ResourceScopeStaleError extends Error {\n readonly code = 'RESOURCE_SCOPE_STALE' as const\n\n constructor(message = 'Resource scope is stale') {\n super(message)\n this.name = 'ResourceScopeStaleError'\n }\n}\n","import type {\n CodingNsCliAdapterDescriptor,\n CodingNsCliModel,\n CodingNsCliModelCatalog,\n CodingNsCliSessionRecord,\n} from '../shared/contracts/cli-adapter.js'\nimport { CODINGNS_RPC_CHANNEL } from '../shared/contracts/transport.js'\nimport { debugInfo, debugWarn } from '../shared/debug.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport type { CodingNsTranslator } from './locale.js'\n\n/** 设置页和选择器使用同一状态文案,检测中或失败都不能显示成未安装。 */\nexport function adapterDetectionLabel(adapter: CodingNsCliAdapterDescriptor): 'cli.detecting' | 'cli.detectionFailed' | 'cli.installed' | 'cli.installedOffline' | 'cli.notInstalled' {\n if (adapter.detectionState === 'pending' || adapter.detectionState === 'running') return 'cli.detecting'\n if (adapter.detectionState === 'error') return 'cli.detectionFailed'\n if (adapter.installed && adapter.runtimeState === 'installed') return 'cli.installedOffline'\n return adapter.installed ? 'cli.installed' : 'cli.notInstalled'\n}\n\n/** Client 侧访问 Host CLI 命名空间的统一入口。 */\nexport async function callCliRpc<T>(rpc: CodingNsRpcClient, action: string, payload: unknown, signal?: AbortSignal): Promise<T> {\n let response\n try {\n debugInfo('codingns4dsh: cli rpc request', { channel: CODINGNS_RPC_CHANNEL, action })\n response = await rpc.call(CODINGNS_RPC_CHANNEL, `cli/${action}`, payload, signal)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (!/HTTP (?:404|405)\\b/u.test(message)) throw error\n debugWarn('codingns4dsh: cli rpc fallback', { action, error: message })\n try {\n response = await rpc.call('/api', `codingns/cli/${action}`, payload, signal)\n } catch (fallbackError) {\n console.error('codingns4dsh: cli rpc fallback failed', { action, error: fallbackError })\n throw fallbackError\n }\n }\n if (!response.ok) {\n console.error('codingns4dsh: cli rpc response error', { action, error: response.error })\n throw new Error(response.error.message)\n }\n debugInfo('codingns4dsh: cli rpc response success', { action })\n return response.value as T\n}\n\nexport function adapterCatalogWithDsh(catalog: readonly CodingNsCliAdapterDescriptor[], dshVersion?: string): CodingNsCliAdapterDescriptor[] {\n // 对话框只展示实际可用的适配器;未安装或已停用的适配器由设置页管理。\n const available = catalog.filter((adapter) => adapter.installed && adapter.enabled)\n const version = dshVersion?.trim()\n const existingDsh = available.find((adapter) => adapter.id === 'dsh')\n if (existingDsh !== undefined) {\n if (version === undefined || version === '' || existingDsh.version === version) return available\n return available.map((adapter) => adapter.id === 'dsh' ? { ...adapter, version } : adapter)\n }\n return [{ id: 'dsh', name: 'DeepSeek Harness', installed: true, enabled: true, version: version === undefined || version === '' ? null : version, command: null }, ...available]\n}\n\nexport function firstModel(catalog: CodingNsCliModelCatalog): CodingNsCliModel | undefined {\n for (const group of catalog.groups) {\n const model = group.models[0]\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function findModel(catalog: CodingNsCliModelCatalog, modelId: string | undefined): CodingNsCliModel | undefined {\n if (modelId === undefined) return undefined\n for (const group of catalog.groups) {\n const model = group.models.find((item) => item.id === modelId)\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** 旧 Host 缺少重新检测动作时给出版本提示;网络和检测错误仍保留原始原因。 */\nexport function catalogRefreshErrorMessage(error: unknown, t: CodingNsTranslator): string {\n const message = errorMessage(error)\n return /^未知 CLI RPC: cli\\/catalog\\/refresh$/u.test(message)\n ? t('cli.redetectHostUnsupported')\n : message\n}\n\n/** 读取 Host 持久化的外部会话索引;兼容数组和带 items/sessions 的响应包装。 */\nexport async function listCliSessions(\n rpc: CodingNsRpcClient,\n options: { readonly includeArchived?: boolean; readonly adapterId?: string } = {},\n): Promise<readonly CodingNsCliSessionRecord[]> {\n const value = await callCliRpc<unknown>(rpc, 'session/list', options)\n const rows = Array.isArray(value)\n ? value\n : isRecord(value) && Array.isArray(value.items)\n ? value.items\n : isRecord(value) && Array.isArray(value.sessions)\n ? value.sessions\n : []\n return rows.filter(isCliSessionRecord).map(redactCliSessionRecord)\n}\n\n/** 把已存在的 DSH 会话恢复到原生会话页面;插件不接管消息列表。 */\nexport async function restoreCliSession(\n rpc: CodingNsRpcClient,\n record: CodingNsCliSessionRecord,\n): Promise<void> {\n await callCliRpc(rpc, 'session/set', {\n sessionId: record.dshSessionId,\n adapterId: record.adapterId,\n ...(record.modelId ? { modelId: record.modelId } : {}),\n ...(record.effortId ? { effortId: record.effortId } : {}),\n ...(record.serviceTierId ? { serviceTierId: record.serviceTierId } : {}),\n ...(record.providerId ? { providerId: record.providerId } : {}),\n ...(record.providerSessionId ? { providerSessionId: record.providerSessionId } : {}),\n })\n navigateToDshSession(record.dshSessionId)\n}\n\n/** 通过 Host 同步归档 DSH 原生会话和 Codingns4DSH 外部会话索引。 */\nexport async function archiveCliSession(\n rpc: CodingNsRpcClient,\n sessionId: string,\n): Promise<void> {\n await callCliRpc(rpc, 'session/archive', { sessionId })\n}\n\n/**\n * 使用 DSH 当前的会话路由,而不是在插件中复制会话消息组件。\n * 旧版 DSH 使用 `/sessions/:id`,新版 workspace 页面使用同一路径的 workspace 前缀,\n * 因此保留当前 workspace 段并只替换 session id。\n */\nexport function navigateToDshSession(sessionId: string): void {\n if (typeof window === 'undefined' || sessionId.trim() === '') return\n const encoded = encodeURIComponent(sessionId.trim())\n const pathname = window.location.pathname\n const nextPath = /^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u, `$1${encoded}`)\n : /^\\/sessions\\/[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^\\/sessions\\/[^/]+(?:\\/.*)?$/u, `/sessions/${encoded}`)\n : `/sessions/${encoded}`\n if (`${window.location.pathname}${window.location.search}${window.location.hash}` === `${nextPath}${window.location.search}${window.location.hash}`) return\n window.history.pushState({}, '', nextPath)\n window.dispatchEvent(new PopStateEvent('popstate'))\n}\n\nfunction isCliSessionRecord(value: unknown): value is CodingNsCliSessionRecord {\n if (!isRecord(value)) return false\n return typeof value.dshSessionId === 'string'\n && value.dshSessionId.trim() !== ''\n && typeof value.adapterId === 'string'\n && value.adapterId.trim() !== ''\n && (value.status === 'active' || value.status === 'idle' || value.status === 'error' || value.status === 'archived')\n && typeof value.createdAt === 'string'\n && typeof value.updatedAt === 'string'\n}\n\n/** 双重防护:即使旧 Host 错误返回 rawStoreRef,浏览器也不会把它留在状态中。 */\nfunction redactCliSessionRecord(record: CodingNsCliSessionRecord): CodingNsCliSessionRecord {\n const { rawStoreRef: _rawStoreRef, ...safe } = record\n return safe\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { CodingNsCliAdapterDescriptor } from '../shared/contracts/cli-adapter.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport { callCliRpc } from './cli-catalog.js'\n\nconst loads = new WeakMap<CodingNsRpcClient, Map<string, Promise<readonly CodingNsCliAdapterDescriptor[]>>>()\nexport type AdapterCatalogChange =\n | { readonly kind: 'adapter' }\n | { readonly kind: 'models'; readonly adapterId: string }\n\nconst listeners = new WeakMap<CodingNsRpcClient, Set<(change: AdapterCatalogChange) => void>>()\n\n/** 手动检测完成后,让已挂载的选择器和模型目录一起更新。 */\nexport function notifyAdapterCatalogChanged(rpc: CodingNsRpcClient): void {\n publishCatalogChange(rpc, { kind: 'adapter' })\n}\n\n/** Model enrichment must not trigger a fresh adapter-installation scan. */\nexport function notifyModelCatalogChanged(rpc: CodingNsRpcClient, adapterId: string): void {\n publishCatalogChange(rpc, { kind: 'models', adapterId })\n}\n\nfunction publishCatalogChange(rpc: CodingNsRpcClient, change: AdapterCatalogChange): void {\n for (const listener of listeners.get(rpc) ?? []) listener(change)\n}\n\nexport function subscribeAdapterCatalogChanged(rpc: CodingNsRpcClient, listener: (change: AdapterCatalogChange) => void): () => void {\n let entries = listeners.get(rpc)\n if (entries === undefined) { entries = new Set(); listeners.set(rpc, entries) }\n entries.add(listener)\n return () => { entries.delete(listener) }\n}\n\n/** Poll only while installation detection or an explicitly requested release check is pending. */\nexport function watchAdapterCatalog(\n rpc: CodingNsRpcClient,\n sessionId: string | undefined,\n onValue: (value: readonly CodingNsCliAdapterDescriptor[]) => void,\n onError: (error: unknown) => void = () => undefined,\n): () => void {\n let active = true\n let busy = false\n let dirty = false\n let started = Date.now()\n let failures = 0\n let timer: ReturnType<typeof setTimeout> | undefined\n const refresh = async (): Promise<void> => {\n if (!active) return\n if (busy) { dirty = true; return }\n clearTimeout(timer)\n busy = true\n try {\n let requests = loads.get(rpc)\n if (requests === undefined) { requests = new Map(); loads.set(rpc, requests) }\n const key = sessionId ?? ''\n let request = requests.get(key)\n if (request === undefined) {\n request = callCliRpc<readonly CodingNsCliAdapterDescriptor[]>(rpc, 'catalog', sessionId === undefined ? {} : { sessionId }, AbortSignal.timeout(10_000))\n .finally(() => { if (requests.get(key) === request) requests.delete(key) })\n requests.set(key, request)\n }\n const value = await request\n if (!active) return\n failures = 0\n onValue(value)\n if (value.some((entry) => entry.detectionState === 'pending' || entry.detectionState === 'running' || entry.update?.state === 'checking') && Date.now() - started < 120_000) {\n timer = setTimeout(() => { void refresh() }, 1_000)\n }\n } catch (error) {\n if (active) {\n failures += 1\n if (failures === 1) onError(error)\n if (Date.now() - started < 120_000) timer = setTimeout(() => { void refresh() }, Math.min(1_000 * 2 ** failures, 15_000))\n }\n }\n finally {\n busy = false\n if (dirty && active) { dirty = false; void refresh() }\n }\n }\n const remove = subscribeAdapterCatalogChanged(rpc, (change) => {\n if (change.kind !== 'adapter') return\n started = Date.now()\n void refresh()\n })\n void refresh()\n return () => { active = false; clearTimeout(timer); remove() }\n}\n","import type { CodingNsCliModelCatalog } from '../shared/contracts/cli-adapter.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport { callCliRpc } from './cli-catalog.js'\nimport { notifyModelCatalogChanged } from './adapter-catalog-watch.js'\nimport { parseVirtualSessionId } from '../shared/contracts/peer-host.js'\n\n/**\n * Client 侧模型目录缓存。\n *\n * Agent 选择器、模型选择器和委派弹层共享同一份 RPC 结果。缓存只属于当前\n * RPC 客户端实例与会话所属 Host,同一 Host 的会话共享目录,跨 Host 不复用。\n */\nconst modelCatalogCaches = new WeakMap<object, Map<string, CodingNsCliModelCatalog>>()\nconst modelCatalogLoads = new WeakMap<object, Map<string, Promise<CodingNsCliModelCatalog>>>()\n/** PeerHost 复用页面 RPC 实例,用稳定的 Host 身份隔离目录、请求与复检节流。 */\nconst modelCatalogHostKeys = new WeakMap<object, Map<string, object>>()\n\nfunction modelCatalogKey(rpc: CodingNsRpcClient, sessionId?: string): object {\n const hostId = sessionId === undefined ? undefined : parseVirtualSessionId(sessionId)?.hostId\n if (hostId === undefined) return rpc as object\n let hosts = modelCatalogHostKeys.get(rpc as object)\n if (hosts === undefined) {\n hosts = new Map()\n modelCatalogHostKeys.set(rpc as object, hosts)\n }\n let key = hosts.get(hostId)\n if (key === undefined) { key = {}; hosts.set(hostId, key) }\n return key\n}\n\n/**\n * Client 缓存有效期。\n *\n * 目录里既有模型清单,也有账号级事实(例如 Codex 的 `officialSubscription`\n * 与 `defaultServiceTier`)。后者会随用户在外部工具里切换供应商或登录状态而\n * 变化,而页面不会因此重新挂载。若 Client 永久持有第一次的结果,依赖这些事实\n * 的控件(Codex 官方订阅的 Fast 档位开关)就会在整场会话里一直缺失。\n *\n * 因此这里给出一个短 TTL:命中即用(不阻塞渲染),过期后重新请求。Host 侧还会\n * 比对 Provider 配置指纹,配置真正变化时立即失效,不依赖这个 TTL。\n */\nexport const MODEL_CATALOG_CACHE_TTL_MS = 60_000\n\ninterface CachedCatalog {\n readonly value: CodingNsCliModelCatalog\n readonly storedAt: number\n readonly ttlMs: number\n}\n\nconst modelCatalogCacheTimes = new WeakMap<object, Map<string, CachedCatalog>>()\n\nfunction cacheEntry(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): CachedCatalog | undefined {\n return cacheTimesFor(rpc, sessionId).get(adapterId)\n}\n\nfunction cacheTimesFor(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CachedCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogCacheTimes.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogCacheTimes.set(key, times)\n }\n return times\n}\n\nfunction storeCatalog(rpc: CodingNsRpcClient, adapterId: string, value: CodingNsCliModelCatalog, sessionId?: string, ttlMs = MODEL_CATALOG_CACHE_TTL_MS): void {\n getModelCatalogCache(rpc, sessionId).set(adapterId, value)\n cacheTimesFor(rpc, sessionId).set(adapterId, { value, storedAt: Date.now(), ttlMs })\n}\n\n/** 指定会话时只作废其 Host;旧调用不传会话时仍清理整个 RPC 的指定目录。 */\nexport function invalidateModelCatalogCache(rpc: CodingNsRpcClient, adapterId?: string, sessionId?: string): void {\n const keys = sessionId === undefined\n ? [rpc as object, ...(modelCatalogHostKeys.get(rpc as object)?.values() ?? [])]\n : [modelCatalogKey(rpc, sessionId)]\n for (const key of keys) {\n const cache = modelCatalogCaches.get(key)\n const times = modelCatalogCacheTimes.get(key)\n const loads = modelCatalogLoads.get(key)\n if (adapterId === undefined) loads?.clear()\n else loads?.delete(adapterId)\n if (adapterId === undefined) { cache?.clear(); times?.clear() }\n else { cache?.delete(adapterId); times?.delete(adapterId) }\n }\n}\n\n/**\n * 「判定可能过期」时的复检节流。\n *\n * 目录声明了服务档位却未确认官方订阅时,值得再探测一次;但真实第三方接入会\n * 长期停在这个状态,不能每次挂载都发一次请求。这里按适配器记录最近一次复检\n * 时间,只有超过间隔才允许再次作废缓存。\n */\nexport const MODEL_CATALOG_REVALIDATE_INTERVAL_MS = 60_000\n\nconst modelCatalogRevalidations = new WeakMap<object, Map<string, number>>()\n\nexport function shouldRevalidateModelCatalog(\n rpc: CodingNsRpcClient,\n adapterId: string,\n needsRevalidation: boolean,\n sessionId?: string,\n): boolean {\n if (!needsRevalidation) return false\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogRevalidations.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogRevalidations.set(key, times)\n }\n const last = times.get(adapterId)\n const now = Date.now()\n if (last !== undefined && now - last < MODEL_CATALOG_REVALIDATE_INTERVAL_MS) return false\n times.set(adapterId, now)\n return true\n}\n\nexport function getModelCatalogCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CodingNsCliModelCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogCaches.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogCaches.set(key, cache)\n }\n return cache\n}\n\nexport function loadModelCatalog(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): Promise<CodingNsCliModelCatalog> {\n const cached = getModelCatalogCache(rpc, sessionId).get(adapterId)\n const entry = cached === undefined ? undefined : cacheEntry(rpc, adapterId, sessionId)\n // A successful stale catalog stays visible while a fresh base and optional\n // Magpie enrichment load in the background.\n if (cached !== undefined && cached.fallback !== true && entry?.value === cached && isFreshCacheEntry(rpc, adapterId, cached, sessionId)) {\n return Promise.resolve(cached)\n }\n const loads = getModelCatalogLoadCache(rpc, sessionId)\n const running = loads.get(adapterId)\n if (running !== undefined) return cached !== undefined && cached.fallback !== true ? Promise.resolve(cached) : running\n\n const hasStaleCatalog = cached !== undefined && cached.fallback !== true && entry?.value === cached\n if (cached !== undefined && !hasStaleCatalog) invalidateModelCatalogCache(rpc, adapterId, sessionId)\n\n const request = callCliRpc<CodingNsCliModelCatalog>(rpc, 'models', {\n adapterId,\n stage: 'base',\n ...(sessionId === undefined ? {} : { sessionId }),\n }).then((value) => {\n // 手动重新检测已替换请求时,迟到结果不能复活被作废的目录。\n if (loads.get(adapterId) !== request) return loadModelCatalog(rpc, adapterId, sessionId)\n if (value.fallback === true) {\n if (hasStaleCatalog && cached !== undefined) storeCatalog(rpc, adapterId, cached, sessionId, 5_000)\n else invalidateModelCatalogCache(rpc, adapterId, sessionId)\n } else {\n storeCatalog(rpc, adapterId, value, sessionId)\n if (hasStaleCatalog) notifyModelCatalogChanged(rpc, adapterId)\n }\n return value\n })\n loads.set(adapterId, request)\n\n // The base result above is the only part awaited by the caller. Enrichment\n // is a second, shared Host request; its completed snapshot replaces the base\n // cache and wakes mounted selectors without a timer or blocking spinner.\n void request.then(async (base) => {\n if (base.fallback === true || base.magpiePending !== true || loads.get(adapterId) !== request) return\n try {\n const enriched = await callCliRpc<CodingNsCliModelCatalog>(rpc, 'models', {\n adapterId,\n stage: 'enriched',\n ...(sessionId === undefined ? {} : { sessionId }),\n })\n if (loads.get(adapterId) !== request || getModelCatalogCache(rpc, sessionId).get(adapterId) !== base || enriched.fallback === true) return\n storeCatalog(rpc, adapterId, enriched, sessionId)\n notifyModelCatalogChanged(rpc, adapterId)\n } catch {\n if (loads.get(adapterId) !== request || getModelCatalogCache(rpc, sessionId).get(adapterId) !== base) return\n const readyBase = withoutMagpiePending(base)\n storeCatalog(rpc, adapterId, readyBase, sessionId, 5_000)\n notifyModelCatalogChanged(rpc, adapterId)\n }\n }).catch(() => {\n if (loads.get(adapterId) !== request) return\n const current = getModelCatalogCache(rpc, sessionId).get(adapterId)\n if (current === undefined || current.fallback === true || cacheEntry(rpc, adapterId, sessionId)?.value !== current) return\n // Keep showing the last good snapshot and avoid immediately retrying a\n // failing Host after every render.\n storeCatalog(rpc, adapterId, current, sessionId, 5_000)\n }).finally(() => {\n if (loads.get(adapterId) === request) loads.delete(adapterId)\n })\n\n if (hasStaleCatalog) return Promise.resolve(cached)\n return request\n}\n\nfunction withoutMagpiePending(catalog: CodingNsCliModelCatalog): CodingNsCliModelCatalog {\n if (catalog.magpiePending !== true) return catalog\n const { magpiePending: _magpiePending, ...ready } = catalog\n return ready\n}\n\n/** 缓存条目是否仍在有效期内;没有时间戳的旧条目按过期处理并触发一次重新读取。 */\nfunction isFreshCacheEntry(rpc: CodingNsRpcClient, adapterId: string, cached: CodingNsCliModelCatalog, sessionId?: string): boolean {\n const entry = cacheEntry(rpc, adapterId, sessionId)\n if (entry === undefined || entry.value !== cached) return false\n return Date.now() - entry.storedAt < entry.ttlMs\n}\n\nfunction getModelCatalogLoadCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, Promise<CodingNsCliModelCatalog>> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogLoads.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogLoads.set(key, cache)\n }\n return cache\n}\n","import * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport { createElement, type ComponentType, type ComponentProps, type ReactNode } from 'react'\n\n/** 富文本菜单沿用宿主的键盘导航、焦点归还和外部点击关闭行为。 */\nexport { Menu as DshMenu } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { Button as DshButton, Checkbox as DshCheckbox, Input as DshInput, Modal as DshModal } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { FileTypeIcon as DshFileTypeIcon, classifyFileType as classifyDshFileType, IconFolderCloseRegular as DshFolderIcon } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { PathLabel as DshPathLabel, Tooltip as DshTooltip } from '@deepseek-ai/dsh-client-ui-primitives'\n\n/** Older primitive packages may lack Markdown delegation. Do not fail the whole footer. */\nexport function hasNativeMarkdown(source: object = primitives): boolean {\n const value = source as Partial<typeof primitives>\n return value.MarkdownText !== undefined && typeof value.MarkdownDelegateProvider === 'function'\n}\nexport const DshMarkdownText = primitives.MarkdownText ?? (({ text }: ComponentProps<typeof primitives.MarkdownText>) => createElement('pre', null, text))\nexport const DshMarkdownDelegate = primitives.MarkdownDelegateProvider ?? (({ children }: { children: ReactNode }) => createElement('div', null, children))\n\ntype IconComponent = ComponentType<{ readonly size?: number; readonly className?: string }>\ntype ShortcutKeysComponent = ComponentType<{ readonly keys: readonly string[] }>\ntype PrimitiveExports = typeof primitives & {\n readonly IconPlusOutlineRegular?: IconComponent\n readonly IconPlusOutlineMedium?: IconComponent\n readonly IconChevronDownOutlineRegular?: IconComponent\n readonly IconChevronDownOutlineMedium?: IconComponent\n readonly IconChevronUpOutlineRegular?: IconComponent\n readonly IconChevronUpOutlineMedium?: IconComponent\n readonly IconChevronLeftOutlineRegular?: IconComponent\n readonly IconChevronLeftOutlineMedium?: IconComponent\n readonly IconChevronRightOutlineRegular?: IconComponent\n readonly IconChevronRightOutlineMedium?: IconComponent\n readonly IconRefreshOutlineRegular?: IconComponent\n readonly IconRefreshOutlineMedium?: IconComponent\n readonly IconSlidersTwoOutlineRegular?: IconComponent\n readonly IconSlidersTwoOutlineMedium?: IconComponent\n readonly IconSettingsOutlineRegular?: IconComponent\n readonly IconSettingsOutlineMedium?: IconComponent\n readonly IconPlusOutline16?: IconComponent\n readonly IconChevronDownOutline14?: IconComponent\n readonly IconDataOutlineRegular?: IconComponent\n readonly IconDataOutlineMedium?: IconComponent\n readonly IconDataOutline16?: IconComponent\n readonly IconShareOutlineRegular?: IconComponent\n readonly IconShareOutlineMedium?: IconComponent\n readonly IconSendOutlineRegular?: IconComponent\n readonly IconSendOutlineMedium?: IconComponent\n readonly IconCloseOutlineRegular?: IconComponent\n readonly IconCloseOutlineMedium?: IconComponent\n readonly IconCloseFillRegular?: IconComponent\n readonly IconCloseFillMedium?: IconComponent\n readonly IconChatOutlineRegular?: IconComponent\n readonly IconChatOutlineMedium?: IconComponent\n readonly IconStopFillRegular?: IconComponent\n readonly IconStopFillMedium?: IconComponent\n readonly IconPhoneOutlineRegular?: IconComponent\n readonly IconPhoneOutlineMedium?: IconComponent\n readonly IconWrapFillRegular?: IconComponent\n readonly IconNowrapFillRegular?: IconComponent\n readonly ShortcutKeys?: ShortcutKeysComponent\n}\n\nconst unavailableIcon: IconComponent = () => null\nconst fallbackShortcutKeys: ShortcutKeysComponent = ({ keys }) => createElement('span', undefined, keys.join(' + '))\n\nexport type DshControlIconName = 'add' | 'phone' | 'settings' | 'close' | 'send' | 'stop' | 'chat' | 'clear'\n/** Shared controls prefer Host icons and use matching local chat/phone fallbacks when absent. */\nexport function resolveControlIcon(name: DshControlIconName): IconComponent {\n const value = primitives as PrimitiveExports\n switch (name) {\n case 'add': return resolvePlusIcon()\n case 'clear': return resolveRefreshIcon()\n case 'settings': return value.IconSettingsOutlineRegular ?? value.IconSettingsOutlineMedium ?? resolveToolIcon()\n case 'close': return value.IconCloseOutlineRegular ?? value.IconCloseOutlineMedium ?? unavailableIcon\n case 'chat': return value.IconChatOutlineRegular ?? value.IconChatOutlineMedium ?? ChatBubbleIcon\n case 'send': return value.IconSendOutlineRegular ?? value.IconSendOutlineMedium ?? unavailableIcon\n case 'stop': return value.IconStopFillRegular ?? value.IconStopFillMedium ?? unavailableIcon\n case 'phone': return value.IconPhoneOutlineRegular ?? value.IconPhoneOutlineMedium ?? TelephoneIcon\n }\n}\n/** 沿用 DSH 新对话的气泡轮廓,内部使用三点表示进入已有对话。 */\nfunction ChatBubbleIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M2.37091 11.2501C1.58745 9.89288 1.32067 8.29835 1.61969 6.76006C1.91872 5.22177 2.76342 3.8433 3.99826 2.87846C5.2331 1.91362 6.77494 1.42737 8.33988 1.50925C9.90482 1.59113 11.3875 2.23562 12.5149 3.32406C13.6425 4.41269 14.3387 5.87206 14.4754 7.4334C14.612 8.99474 14.18 10.5529 13.2587 11.8209C12.3375 13.0888 10.9891 13.9813 9.46194 14.3337C8.18691 14.628 6.85895 14.5294 5.64989 14.0605C5.1712 13.8748 4.76962 13.4932 4.26534 13.3967C3.67413 13.2835 2.95257 13.5598 2.03794 14.3337' }),\n ...[5.25, 8, 10.75].map((cx) => createElement('circle', { key: cx, cx, cy: 8, r: 0.65, fill: 'currentColor', stroke: 'none' })))\n}\nfunction TelephoneIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M3.1 1.8h2l1.1 3.1-1.4 1.4a10.5 10.5 0 0 0 4.9 4.9l1.4-1.4 3.1 1.1v2a1.4 1.4 0 0 1-1.6 1.4A13 13 0 0 1 1.7 3.4a1.4 1.4 0 0 1 1.4-1.6Z' }))\n}\n\n/**\n * 图标导出兼容层。0.1.7 可能改名为 Regular/Medium,运行时优先使用新导出,\n * 旧导出仍作为回退;业务组件不再直接判断 DSH 版本。\n */\nexport function resolvePlusIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconPlusOutlineRegular ?? value.IconPlusOutlineMedium ?? value.IconPlusOutline16 ?? unavailableIcon\n}\n\nexport function resolveChevronDownIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? value.IconChevronDownOutline14 ?? unavailableIcon\n}\n\n/** 终端工具栏使用的原生刷新图标。 */\nexport function resolveRefreshIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconRefreshOutlineRegular ?? value.IconRefreshOutlineMedium ?? unavailableIcon\n}\n\n/** Document toolbar glyphs shared with the native text preview. */\nexport function resolveTextWrapIcon(wrapped: boolean): IconComponent {\n const value = primitives as PrimitiveExports\n return (wrapped ? value.IconNowrapFillRegular : value.IconWrapFillRegular) ?? unavailableIcon\n}\n\n/** Native viewer controls; keep optional glyph compatibility at the adapter boundary. */\nexport function resolveViewerIcon(name: 'edit' | 'save' | 'fullscreen' | 'restore' | 'back' | 'home'): IconComponent {\n const icons = primitives as unknown as Record<string, IconComponent | undefined>\n const key = { edit: 'IconEditOutlineRegular', save: 'IconCheckOutlineRegular', fullscreen: 'IconFullscreenOutlineRegular',\n restore: 'IconFullscreenOutlineRegular', back: 'IconChevronLeftOutlineRegular', home: 'IconFileOutlineRegular' }[name]\n return icons[key] ?? resolveRefreshIcon()\n}\n\n/** 终端工具栏入口使用的原生工具图标。 */\nexport function resolveToolIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconSlidersTwoOutlineRegular\n ?? value.IconSlidersTwoOutlineMedium\n ?? value.IconSettingsOutlineRegular\n ?? value.IconSettingsOutlineMedium\n ?? unavailableIcon\n}\n\n/** 终端快捷操作的方向图标。 */\nexport function resolveTerminalArrowIcon(direction: 'up' | 'down' | 'left' | 'right'): IconComponent {\n const value = primitives as PrimitiveExports\n if (direction === 'up') return value.IconChevronUpOutlineRegular ?? value.IconChevronUpOutlineMedium ?? unavailableIcon\n if (direction === 'down') return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? unavailableIcon\n if (direction === 'left') return value.IconChevronLeftOutlineRegular ?? value.IconChevronLeftOutlineMedium ?? unavailableIcon\n return value.IconChevronRightOutlineRegular ?? value.IconChevronRightOutlineMedium ?? unavailableIcon\n}\n\n/** 终端按键标签使用 DSH 原生 ShortcutKeys,旧版本缺失时退回纯文本。 */\nexport function resolveShortcutKeys(): ShortcutKeysComponent {\n const value = primitives as PrimitiveExports\n return value.ShortcutKeys ?? fallbackShortcutKeys\n}\n\n/**\n * 模型图标:DSH 原生模型选择器在紧凑状态显示的 data 图标(0.1.7 起为 Regular/Medium,\n * 0.1.6 为 16 后缀),插件模型选择器收起时与之保持一致。\n */\nexport function resolveDataIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconDataOutlineRegular ?? value.IconDataOutlineMedium ?? value.IconDataOutline16 ?? unavailableIcon\n}\n\n/**\n * `/委派` 菜单行图标:优先使用共享(send/share)字形,缺失时回退到插件通用的\n * data 图标,保证旧版 DSH 仍能渲染出一行可识别的委派入口。\n */\nexport function resolveDelegateIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconShareOutlineRegular\n ?? value.IconShareOutlineMedium\n ?? value.IconSendOutlineRegular\n ?? value.IconSendOutlineMedium\n ?? resolveDataIcon()\n}\n\n/**\n * 模型搜索框的清除按钮图标,与内置模型选择器的搜索清除按钮同一字形;\n * 旧版 DSH 缺少该导出时退化为不回退图标,清除按钮的文字标签仍然可用。\n */\nexport function resolveCloseFillIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconCloseFillRegular ?? value.IconCloseFillMedium ?? unavailableIcon\n}\n\n/**\n * 模型搜索的模糊排序。\n *\n * 内置模型选择器用 primitives 的 `rankByName` 排名搜索结构:查询必须是名称的\n * 大小写不敏感子序列,前缀命中优先,其次按对齐分数。插件模型选择器复用同一\n * 排序,保证同一查询在内置与外部 Agent 两个选择器里得到相同的顺序;旧版 DSH\n * 缺少该导出时退回等价的本地实现,行为不变。\n */\nexport type RankModelByName = <T extends { readonly name: string }>(items: readonly T[], rawQuery: string) => readonly T[]\n\nexport const rankModelByName: RankModelByName = (items, rawQuery) => {\n const exported = (primitives as Partial<typeof primitives>).rankByName\n if (typeof exported === 'function') return exported(items, rawQuery) as readonly (typeof items)[number][]\n return rankByNameFallback(items, rawQuery)\n}\n\n/** 名称起始与 `-`/`_` 分隔处额外加分,与宿主实现保持一致。 */\nfunction boundaryBonus(name: string, index: number): number {\n return index === 0 || name.charAt(index - 1) === '-' || name.charAt(index - 1) === '_' ? 8 : 0\n}\n\n/** 有序子序列的最强对齐分数;查询不是子序列时返回 undefined。 */\nfunction alignmentScore(name: string, query: string): number | undefined {\n if (query.length > name.length) return undefined\n const noMatch = Number.NEGATIVE_INFINITY\n let previous = Array.from({ length: name.length }, () => noMatch).map((_, index) => name.charAt(index) === query.charAt(0) ? 1 + boundaryBonus(name, index) - index : noMatch)\n for (let queryIndex = 1; queryIndex < query.length; queryIndex++) {\n const current = Array.from({ length: name.length }, () => noMatch)\n let left = noMatch\n let leftLeft = noMatch\n let bestGapped = noMatch\n for (const [index, prior] of previous.entries()) {\n if (leftLeft !== noMatch) bestGapped = Math.max(bestGapped, leftLeft + index - 2)\n if (name.charAt(index) === query.charAt(queryIndex)) {\n const bonus = 1 + boundaryBonus(name, index)\n let score = noMatch\n if (left !== noMatch) score = left + bonus + 4\n if (bestGapped !== noMatch) score = Math.max(score, bestGapped + bonus + 1 - index)\n current[index] = score\n }\n leftLeft = left\n left = prior\n }\n previous = current\n }\n let best = noMatch\n for (const score of previous) best = Math.max(best, score)\n return best === noMatch ? undefined : best\n}\n\nfunction rankByNameFallback<T extends { readonly name: string }>(items: readonly T[], rawQuery: string): readonly T[] {\n const query = rawQuery.toLowerCase()\n if (query === '') return items\n const ranked: Array<{ item: T; index: number; prefix: boolean; score: number }> = []\n items.forEach((item, index) => {\n const lower = item.name.toLowerCase()\n const score = alignmentScore(lower, query)\n if (score === undefined) return\n ranked.push({ item, index, prefix: lower.startsWith(query), score })\n })\n ranked.sort((left, right) => Number(right.prefix) - Number(left.prefix) || right.score - left.score || left.index - right.index)\n return ranked.map((match) => match.item)\n}\n","import { createElement, type ReactElement } from 'react'\nimport { providerIconUrl } from './provider-icons.js'\nimport { PROVIDER_ICON_PATH } from '../shared/provider-icon-resources.js'\n\nexport const MAGPIE_MODEL_TAG_ATTRIBUTE = 'data-codingns-magpie-model-tag'\n\n/**\n * Magpie 模型来源标签使用的喜鹊图标。\n *\n * 图标必须走本机 Host 的固定资源路由:此前指向 GitHub 上的 `icon-256.png`,\n * 而在离线、Host 无外网出口,或页面策略只允许 `img-src 'self'` 时该外链会被\n * 浏览器拦截,标签容器虽然渲染出来却不显示任何图像。本地路由随插件一起安装,\n * 无网络依赖,也不会被同源策略挡住。\n */\nexport function magpieModelLogoUrl(): string {\n return providerIconUrl('magpie') ?? `${PROVIDER_ICON_PATH}magpie.png`\n}\n\nconst tagStyle = {\n display: 'inline-flex',\n flex: 'none',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '18px',\n maxWidth: '45%',\n gap: '4px',\n height: '18px',\n marginInlineStart: 'auto',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n} as const\n\nconst tagLogoStyle = {\n display: 'block',\n width: '16px',\n height: '16px',\n flex: '0 0 16px',\n objectFit: 'contain',\n borderRadius: '4px',\n} as const\n\nconst providerStyle = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontSize: '12px',\n color: 'var(--dsw-alias-label-secondary)',\n} as const\n\n/** Compact visual source marker shared by every model-list surface. */\nexport function MagpieModelTag(props: { readonly providerId?: string | undefined }): ReactElement {\n return createElement('span', {\n [MAGPIE_MODEL_TAG_ATTRIBUTE]: '',\n role: 'note',\n 'aria-label': props.providerId ?? 'Provided by Magpie',\n title: props.providerId ?? 'Provided by Magpie',\n style: tagStyle,\n }, props.providerId === undefined ? null : createElement('span', { style: providerStyle }, props.providerId),\n createElement('img', { src: magpieModelLogoUrl(), alt: 'Provided by Magpie', style: tagLogoStyle }))\n}\n\n/** Native DSH owns its menu DOM, so its option rows receive the same badge imperatively. */\nexport function createMagpieModelTagNode(document: Document, modelId?: string, providerId?: string): HTMLSpanElement {\n const tag = document.createElement('span')\n tag.setAttribute(MAGPIE_MODEL_TAG_ATTRIBUTE, '')\n if (modelId !== undefined) tag.dataset.modelId = modelId\n if (providerId !== undefined) tag.dataset.providerId = providerId\n tag.setAttribute('role', 'note')\n tag.setAttribute('aria-label', providerId ?? 'Provided by Magpie')\n tag.title = providerId ?? 'Provided by Magpie'\n Object.assign(tag.style, tagStyle)\n\n if (providerId !== undefined) {\n const provider = document.createElement('span')\n provider.textContent = providerId\n Object.assign(provider.style, providerStyle)\n tag.append(provider)\n }\n const logo = document.createElement('img')\n logo.setAttribute('src', magpieModelLogoUrl())\n logo.setAttribute('alt', 'Provided by Magpie')\n Object.assign(logo.style, tagLogoStyle)\n tag.append(logo)\n return tag\n}\n"],"mappings":"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"}
|