@jingyi0605/codingns4dsh 0.2.1-beta.7 → 0.2.1-beta.9
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 +3 -3
- package/README.md +9 -3
- package/data/build/dist/bootstrap/dsh-peer-host-preboot-shim.d.ts.map +1 -1
- package/data/build/dist/bootstrap/dsh-peer-host-preboot-shim.js +26 -1
- package/data/build/dist/bootstrap/dsh-peer-host-preboot-shim.js.map +1 -1
- package/data/build/dist/client/account-bar.d.ts.map +1 -1
- package/data/build/dist/client/account-bar.js +33 -21
- package/data/build/dist/client/account-bar.js.map +1 -1
- package/data/build/dist/client/avatar/desktop-bridge.js +1 -1
- package/data/build/dist/client/avatar/desktop-bridge.js.map +1 -1
- package/data/build/dist/client/avatar/desktop-view.d.ts +6 -2
- package/data/build/dist/client/avatar/desktop-view.d.ts.map +1 -1
- package/data/build/dist/client/avatar/desktop-view.js +48 -13
- package/data/build/dist/client/avatar/desktop-view.js.map +1 -1
- package/data/build/dist/client/avatar/floating.d.ts +5 -2
- package/data/build/dist/client/avatar/floating.d.ts.map +1 -1
- package/data/build/dist/client/avatar/floating.js +16 -5
- package/data/build/dist/client/avatar/floating.js.map +1 -1
- package/data/build/dist/client/avatar/notification-bubble.d.ts +24 -5
- package/data/build/dist/client/avatar/notification-bubble.d.ts.map +1 -1
- package/data/build/dist/client/avatar/notification-bubble.js +253 -66
- package/data/build/dist/client/avatar/notification-bubble.js.map +1 -1
- package/data/build/dist/client/avatar/notification-surface.d.ts +16 -0
- package/data/build/dist/client/avatar/notification-surface.d.ts.map +1 -0
- package/data/build/dist/client/avatar/notification-surface.js +54 -0
- package/data/build/dist/client/avatar/notification-surface.js.map +1 -0
- package/data/build/dist/client/avatar/reaction-badge.d.ts.map +1 -1
- package/data/build/dist/client/avatar/reaction-badge.js +11 -2
- package/data/build/dist/client/avatar/reaction-badge.js.map +1 -1
- package/data/build/dist/client/bundle.js +2628 -566
- 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 +26 -2
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.assistant-notifications.js.map +1 -1
- package/data/build/dist/client/client.assistant-workbench.js +235 -109
- package/data/build/dist/client/client.assistant-workbench.js.map +1 -1
- package/data/build/dist/client/client.delegate-command.js +6 -6
- package/data/build/dist/client/client.delegate-command.js.map +1 -1
- package/data/build/dist/client/client.manager.js +46 -9
- package/data/build/dist/client/client.manager.js.map +1 -1
- package/data/build/dist/client/client.native-workspace-store.js +39 -3
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.session-translation.js +54 -0
- package/data/build/dist/client/client.session-translation.js.map +1 -0
- package/data/build/dist/client/client.theme.js +2 -0
- package/data/build/dist/client/client.theme.js.map +1 -1
- package/data/build/dist/client/client.transport.js +123 -11
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +57927 -387
- package/data/build/dist/client/features/assistant-conversation-message.d.ts +2 -1
- package/data/build/dist/client/features/assistant-conversation-message.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-conversation-message.js +59 -24
- package/data/build/dist/client/features/assistant-conversation-message.js.map +1 -1
- package/data/build/dist/client/features/assistant-notification-store.d.ts +8 -2
- package/data/build/dist/client/features/assistant-notification-store.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-notification-store.js +45 -1
- package/data/build/dist/client/features/assistant-notification-store.js.map +1 -1
- package/data/build/dist/client/features/assistant-record-style.js +11 -4
- package/data/build/dist/client/features/assistant-record-style.js.map +1 -1
- package/data/build/dist/client/features/assistant-workbench.d.ts +4 -0
- package/data/build/dist/client/features/assistant-workbench.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-workbench.js +27 -1
- package/data/build/dist/client/features/assistant-workbench.js.map +1 -1
- package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -1
- package/data/build/dist/client/features/global-voice-assistant.js +46 -8
- package/data/build/dist/client/features/global-voice-assistant.js.map +1 -1
- package/data/build/dist/client/features/index.d.ts +1 -0
- package/data/build/dist/client/features/index.d.ts.map +1 -1
- package/data/build/dist/client/features/index.js +3 -0
- package/data/build/dist/client/features/index.js.map +1 -1
- package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/client/features/peer-host.js +130 -17
- package/data/build/dist/client/features/peer-host.js.map +1 -1
- package/data/build/dist/client/features/session-translation.d.ts +3 -0
- package/data/build/dist/client/features/session-translation.d.ts.map +1 -0
- package/data/build/dist/client/features/session-translation.js +116 -0
- package/data/build/dist/client/features/session-translation.js.map +1 -0
- package/data/build/dist/client/index.d.ts.map +1 -1
- package/data/build/dist/client/index.js +6 -1
- package/data/build/dist/client/index.js.map +1 -1
- package/data/build/dist/client/locales/assistantWorkbench.d.ts +17 -3
- package/data/build/dist/client/locales/assistantWorkbench.d.ts.map +1 -1
- package/data/build/dist/client/locales/assistantWorkbench.js +15 -11
- package/data/build/dist/client/locales/assistantWorkbench.js.map +1 -1
- package/data/build/dist/client/locales/panels.d.ts.map +1 -1
- package/data/build/dist/client/locales/panels.js +62 -0
- package/data/build/dist/client/locales/panels.js.map +1 -1
- package/data/build/dist/client/peer-host-native-projection.d.ts +4 -0
- package/data/build/dist/client/peer-host-native-projection.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-native-projection.js +40 -1
- package/data/build/dist/client/peer-host-native-projection.js.map +1 -1
- package/data/build/dist/client/peer-host-remote-events.d.ts +14 -0
- package/data/build/dist/client/peer-host-remote-events.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-remote-events.js +92 -3
- package/data/build/dist/client/peer-host-remote-events.js.map +1 -1
- package/data/build/dist/client/session-file-links.d.ts +11 -0
- package/data/build/dist/client/session-file-links.d.ts.map +1 -0
- package/data/build/dist/client/{peer-host-file-links.js → session-file-links.js} +13 -3
- package/data/build/dist/client/session-file-links.js.map +1 -0
- package/data/build/dist/client/session-translation-chat.d.ts +6 -0
- package/data/build/dist/client/session-translation-chat.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-chat.js +686 -0
- package/data/build/dist/client/session-translation-chat.js.map +1 -0
- package/data/build/dist/client/style.css +2561 -0
- package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
- package/data/build/dist/client/subscription-slot.js +5 -1
- package/data/build/dist/client/subscription-slot.js.map +1 -1
- package/data/build/dist/client/theme.d.ts +2 -0
- package/data/build/dist/client/theme.d.ts.map +1 -1
- package/data/build/dist/client/theme.js +3 -0
- package/data/build/dist/client/theme.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +43 -15
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts +9 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js +65 -0
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +21 -0
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js +100 -3
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +11 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js +80 -14
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts +13 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.js +271 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.js.map +1 -0
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts +8 -1
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.js +45 -2
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts +8 -2
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.js +32 -3
- package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-history.d.ts +27 -0
- package/data/build/dist/host/cli-adapters/command-code-history.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-history.js +131 -1
- package/data/build/dist/host/cli-adapters/command-code-history.js.map +1 -1
- package/data/build/dist/host/cli-adapters/delegation-mention-rewrite.js +9 -9
- package/data/build/dist/host/cli-adapters/delegation-mention-rewrite.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +13 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js +95 -12
- package/data/build/dist/host/cli-adapters/dsh-message-projector.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 +287 -19
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.js +108 -47
- package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/legacy-session-settings.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/legacy-session-settings.js +7 -2
- package/data/build/dist/host/cli-adapters/legacy-session-settings.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +4 -2
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.js +78 -31
- package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.d.ts +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +83 -9
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js.map +1 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts +5 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.js +90 -25
- package/data/build/dist/host/cli-adapters/provider-subscription.js.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.js +22 -5
- package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
- package/data/build/dist/host/cli-adapters/session-store.d.ts +1 -0
- package/data/build/dist/host/cli-adapters/session-store.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/session-store.js +3 -0
- package/data/build/dist/host/cli-adapters/session-store.js.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-server.js +2 -2
- package/data/build/dist/host/cli-bridge/bridge-server.js.map +1 -1
- package/data/build/dist/host/cli-bridge/command-code-mod.js +21 -21
- package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.js +19 -19
- package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.d.ts +32 -0
- package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.js +137 -1
- package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +20 -20
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/controller.d.ts +3 -0
- package/data/build/dist/host/desktop-assistant/controller.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/controller.js +49 -4
- package/data/build/dist/host/desktop-assistant/controller.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/mac-agent.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/mac-agent.js +15 -3
- package/data/build/dist/host/desktop-assistant/mac-agent.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/win-agent.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/win-agent.js +21 -3
- package/data/build/dist/host/desktop-assistant/win-agent.js.map +1 -1
- package/data/build/dist/host/features/assistant-management-tools.d.ts +2 -1
- package/data/build/dist/host/features/assistant-management-tools.d.ts.map +1 -1
- package/data/build/dist/host/features/assistant-management-tools.js +10 -3
- package/data/build/dist/host/features/assistant-management-tools.js.map +1 -1
- package/data/build/dist/host/features/assistant-notification-events.js +1 -1
- package/data/build/dist/host/features/assistant-notification-events.js.map +1 -1
- package/data/build/dist/host/features/assistant-notifications.d.ts +8 -1
- package/data/build/dist/host/features/assistant-notifications.d.ts.map +1 -1
- package/data/build/dist/host/features/assistant-notifications.js +114 -12
- package/data/build/dist/host/features/assistant-notifications.js.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.d.ts +2 -2
- package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.js +89 -2
- package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
- package/data/build/dist/host/features/index.d.ts +1 -0
- package/data/build/dist/host/features/index.d.ts.map +1 -1
- package/data/build/dist/host/features/index.js +3 -0
- package/data/build/dist/host/features/index.js.map +1 -1
- package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/host/features/peer-host.js +41 -5
- package/data/build/dist/host/features/peer-host.js.map +1 -1
- package/data/build/dist/host/features/session-translation-service.d.ts +31 -0
- package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation-service.js +451 -0
- package/data/build/dist/host/features/session-translation-service.js.map +1 -0
- package/data/build/dist/host/features/session-translation.d.ts +5 -0
- package/data/build/dist/host/features/session-translation.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation.js +37 -0
- package/data/build/dist/host/features/session-translation.js.map +1 -0
- package/data/build/dist/host/features/types.d.ts +6 -1
- package/data/build/dist/host/features/types.d.ts.map +1 -1
- package/data/build/dist/host/image-artifact-store.d.ts +21 -0
- package/data/build/dist/host/image-artifact-store.d.ts.map +1 -0
- package/data/build/dist/host/image-artifact-store.js +136 -0
- package/data/build/dist/host/image-artifact-store.js.map +1 -0
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +3 -0
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +7 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +23 -4
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.d.ts +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.js +2 -0
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.js.map +1 -1
- package/data/build/dist/host/native-session-bridge.d.ts +16 -1
- package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
- package/data/build/dist/host/native-session-bridge.js +69 -9
- package/data/build/dist/host/native-session-bridge.js.map +1 -1
- package/data/build/dist/host/rpc.js +4 -4
- package/data/build/dist/host/rpc.js.map +1 -1
- package/data/build/dist/host/session-changes.d.ts.map +1 -1
- package/data/build/dist/host/session-changes.js +196 -13
- package/data/build/dist/host/session-changes.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +8 -0
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/shared/assistant-message-timeline.d.ts +11 -0
- package/data/build/dist/shared/assistant-message-timeline.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-message-timeline.js +19 -0
- package/data/build/dist/shared/assistant-message-timeline.js.map +1 -1
- package/data/build/dist/shared/assistant-notifications.d.ts +35 -1
- package/data/build/dist/shared/assistant-notifications.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-notifications.js +8 -0
- package/data/build/dist/shared/assistant-notifications.js.map +1 -1
- package/data/build/dist/shared/assistant-session-messages.d.ts +13 -0
- package/data/build/dist/shared/assistant-session-messages.d.ts.map +1 -0
- package/data/build/dist/shared/assistant-session-messages.js +155 -0
- package/data/build/dist/shared/assistant-session-messages.js.map +1 -0
- package/data/build/dist/shared/contracts/assistant.d.ts +13 -0
- package/data/build/dist/shared/contracts/assistant.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/cli-adapter.d.ts +25 -2
- package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.d.ts +6 -0
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +3 -0
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/session-translation.d.ts +58 -0
- package/data/build/dist/shared/contracts/session-translation.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/session-translation.js +23 -0
- package/data/build/dist/shared/contracts/session-translation.js.map +1 -0
- package/data/build/dist/shared/contracts/version.d.ts +1 -1
- package/data/build/dist/shared/contracts/version.js +1 -1
- package/data/build/dist/shared/delegation-carrier.js +6 -6
- package/data/build/dist/shared/delegation-carrier.js.map +1 -1
- package/data/build/dist/shared/desktop-assistant.d.ts +10 -3
- package/data/build/dist/shared/desktop-assistant.d.ts.map +1 -1
- package/data/build/dist/shared/desktop-assistant.js +46 -14
- package/data/build/dist/shared/desktop-assistant.js.map +1 -1
- package/data/build/dist/shared/index.d.ts +2 -1
- package/data/build/dist/shared/index.d.ts.map +1 -1
- package/data/build/dist/shared/index.js +2 -1
- package/data/build/dist/shared/index.js.map +1 -1
- package/package.json +17 -15
- package/profile/README.md +2 -2
- package/profile/package.json +2 -2
- package/profile/version.json +1 -1
- package/version.json +1 -1
- package/data/build/dist/client/peer-host-file-links.d.ts +0 -8
- package/data/build/dist/client/peer-host-file-links.d.ts.map +0 -1
- package/data/build/dist/client/peer-host-file-links.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.transport.js","names":["en","zh","zh","en","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","zh","en","zh","en","assistantAvatarDictionary.en","assistantDebugDictionary.en","gitDictionary.en","debugDictionary.en","peerHostDictionary.en","peerHostWorkspaceDictionary.en","usageDictionary.en","voiceModelsDictionary.en","assistantTtsDictionary.en","assistantWorkbenchDictionary.en","fileWorkspaceDictionary.en","terminalAuthDictionary.en","panelsDictionary.en","subagentCollapsedDictionary.en","assistantAvatarDictionary.zh","assistantDebugDictionary.zh","gitDictionary.zh","debugDictionary.zh","peerHostDictionary.zh","peerHostWorkspaceDictionary.zh","usageDictionary.zh","voiceModelsDictionary.zh","assistantTtsDictionary.zh","assistantWorkbenchDictionary.zh","fileWorkspaceDictionary.zh","terminalAuthDictionary.zh","panelsDictionary.zh","subagentCollapsedDictionary.zh","useMemo"],"sources":["../../../../src/client/locales/debug.ts","../../../../src/client/locales/assistantDebug.ts","../../../../src/client/locales/assistantAvatar.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/voiceModels.ts","../../../../src/client/locales/assistantTts.ts","../../../../src/client/locales/assistantWorkbench.ts","../../../../src/client/locales/subagentCollapsed.ts","../../../../src/client/locale.ts","../../../../src/shared/contracts/transport.ts"],"sourcesContent":["/**\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","/** 全局助理调试页词典;状态名与 JSON 只在明确的调试区域展示。 */\nexport const zh: Record<string, string> = {\n 'assistant.debug.open': '全局项目状态调试',\n 'assistant.debug.title': '全局助理管理状态调试',\n 'assistant.debug.description': '独立检查工作区范围、会话状态和文字指令,无需启动语音。',\n 'assistant.debug.refresh': '强制刷新状态',\n 'assistant.debug.loading': '正在读取最新状态…',\n 'assistant.debug.close': '关闭调试',\n 'assistant.debug.scope': '管理范围',\n 'assistant.debug.scopeHint': '勾选后允许助理读取和派发该工作区的会话;归档会话始终排除。',\n 'assistant.debug.missingWorkspace': '当前列表中不可用',\n 'assistant.debug.overview': '索引版本 {generation} · 纳入 {included} · 排除 {excluded} · 摘要读取失败 {unreadable}',\n 'assistant.debug.updated': '状态更新时间:{time}',\n 'assistant.debug.model': '当前语音模型:{model}',\n 'assistant.debug.noModel': '尚未配置',\n 'assistant.debug.sessions': '受管会话',\n 'assistant.debug.noSessions': '没有纳入索引的会话,请先检查管理范围。',\n 'assistant.debug.excluded': '排除的会话',\n 'assistant.debug.noExcluded': '没有可见的排除记录。',\n 'assistant.debug.archived': '已归档',\n 'assistant.debug.outsideScope': '工作区未纳入管理',\n 'assistant.debug.summary': '完整进展汇总',\n 'assistant.debug.noSummary': '没有可读取的会话正文摘要。',\n 'assistant.debug.untitled': '未命名会话',\n 'assistant.debug.status.waiting': '等待用户处理',\n 'assistant.debug.status.running': '运行中',\n 'assistant.debug.status.completed': '已完成',\n 'assistant.debug.status.error': '出错',\n 'assistant.debug.status.unknown': '状态未知',\n 'assistant.debug.waiting.approval': '等待审批',\n 'assistant.debug.waiting.question': '等待回答',\n 'assistant.debug.command': '文字指令调试',\n 'assistant.debug.commandHint': '预览只解析意图;执行会走当前助理逻辑,并可能向匹配的会话派发任务。',\n 'assistant.debug.commandPlaceholder': '例如:查询进展,或让某个会话检查登录问题',\n 'assistant.debug.preview': '预览意图',\n 'assistant.debug.execute': '执行文字指令',\n 'assistant.debug.result': '本次指令结果',\n 'assistant.debug.raw': '原始状态快照(JSON)',\n 'assistant.debug.sources': '数据来源与操作能力',\n 'assistant.debug.serviceState': '{service}:{state}',\n 'assistant.debug.service.workspaceList': '工作区列表',\n 'assistant.debug.service.sessionList': '会话列表',\n 'assistant.debug.service.summaryRead': '本地会话正文摘要读取',\n 'assistant.debug.service.taskDispatch': '本地任务派发',\n 'assistant.debug.service.remoteGateway': '远端 Host 汇聚与派发',\n 'assistant.debug.available': '已接入',\n 'assistant.debug.unavailable': '未接入',\n 'assistant.debug.warnings': '状态读取诊断',\n 'assistant.debug.workspaceCounts': '纳入 {included} 个会话 · 排除 {excluded} 个会话',\n 'assistant.debug.export': '下载状态快照',\n 'assistant.debug.stepsDescription': '选择项目 → 查看范围内会话 → 完成后自动索引 → 检查结果与记录 → 用 LLM 文字问答。',\n 'assistant.debug.steps': '调试步骤',\n 'assistant.debug.tab.scope': '1. 设置索引范围',\n 'assistant.debug.tab.sessions': '2. 范围内工作区和会话',\n 'assistant.debug.tab.result': '3. 当前索引结果',\n 'assistant.debug.tab.records': '4. 索引记录',\n 'assistant.debug.tab.chat': '5. LLM 文本对话',\n 'assistant.debug.rangeHelp': '勾选需要索引的工作区,选择会立即保存。归档会话始终排除;空闲会话自动索引,运行中的会话等待本轮完成。',\n 'assistant.debug.selectedCount': '已选择 {count} 个工作区',\n 'assistant.debug.scopeEmpty': '尚未选择工作区,请先设置索引范围。',\n 'assistant.debug.projectCount': '{name} · {count} 个未归档会话',\n 'assistant.debug.projectEmpty': '该工作区没有可见的未归档会话。',\n 'assistant.debug.sessionTitle': '{title} · {status}',\n 'assistant.debug.shortTitle': '未命名会话({id})',\n 'assistant.debug.viewRefresh': '刷新面板',\n 'assistant.debug.build': '执行索引',\n 'assistant.debug.indexing': '正在索引会话正文…',\n 'assistant.debug.indexState.not-built': '尚未建立索引,空闲会话将自动索引,也可点击“执行索引”。',\n 'assistant.debug.indexState.ready': '索引已生成,可用于 LLM 问答。',\n 'assistant.debug.indexState.stale': '有会话待更新,当前轮次结束后会自动增量索引。',\n 'assistant.debug.indexState.building': '正在构建新索引,请等待完成。',\n 'assistant.debug.indexState.incomplete': '索引尚不完整:运行中的会话等待完成,失败项可点击“执行索引”重试。',\n 'assistant.debug.indexTime': '索引时间 {time} · 第 {generation} 版',\n 'assistant.debug.quality': '索引 {total} 个会话 · 有正文 {read} · 无正文 {empty} · 状态未知 {unknown} · 读取失败 {failed}',\n 'assistant.debug.technical': '高级诊断(接口、排除记录和原始 JSON)',\n 'assistant.debug.excludedCount': '排除记录({count} 个)',\n 'assistant.debug.excludedRow': '{workspace} / {name} · {reason}',\n 'assistant.debug.recordsHelp': '保留本次 Host 运行期间最近 30 次实际索引。刷新面板不会触发索引;展开记录可查看每个会话的读取结果。',\n 'assistant.debug.noRecords': '暂无索引记录,等待会话完成后自动索引,也可点击“执行索引”。',\n 'assistant.debug.recordTitle': '{time} · {trigger} · {state}',\n 'assistant.debug.recordStats': '耗时 {duration} ms · 纳入 {included} · 排除 {excluded} · 读取失败 {failed}',\n 'assistant.debug.recordScope': '本次范围:{names}',\n 'assistant.debug.recordSession': '{workspace} / {name} · {result}',\n 'assistant.debug.recordState.running': '索引中',\n 'assistant.debug.recordState.completed': '已完成',\n 'assistant.debug.recordState.failed': '失败',\n 'assistant.debug.trigger.manual': '手动触发',\n 'assistant.debug.trigger.automatic': '助理自动触发',\n 'assistant.debug.readResult.read': '正文已读取',\n 'assistant.debug.readResult.empty': '没有可提取的正文',\n 'assistant.debug.readResult.failed': '正文读取失败',\n 'assistant.debug.chatHelp': '复用 DSH 已配置模型,基于当前索引进行多轮问答。本轮只回答项目状态问题,不派发任务。切换模型、范围或索引版本后重新开始对话。',\n 'assistant.debug.chatNeedsIndex': '等待当前范围内会话完成并自动更新索引后,再发送消息。',\n 'assistant.debug.chatGeneration': '本次对话依据第 {generation} 版索引',\n 'assistant.debug.chatModel': 'LLM 模型',\n 'assistant.debug.modelsLoading': '正在读取 DSH 模型列表…',\n 'assistant.debug.modelsEmpty': '没有可用的 DSH 原生 API 模型,请先在 DSH 模型设置中配置提供商和模型。',\n 'assistant.debug.chooseModel': '请选择 DSH 模型',\n 'assistant.debug.modelsRefresh': '刷新模型列表',\n 'assistant.debug.chatClear': '重新开始对话',\n 'assistant.debug.chatInput': '输入项目状态问题',\n 'assistant.debug.chatPlaceholder': '例如:这些项目分别在做什么?哪些会话需要我处理?',\n 'assistant.debug.chatEmpty': '先生成索引,再选择模型并发送问题。用户消息和 AI 回复会显示在这里。',\n 'assistant.debug.chatGenerating': 'LLM 正在回复…',\n 'assistant.debug.chatFailed': '本次回复失败,请查看错误信息。',\n 'assistant.debug.chatCancelled': '本次回复已停止。',\n 'assistant.debug.chatSend': '发送给 LLM',\n 'assistant.debug.chatStop': '停止回复',\n 'assistant.debug.chatRole.user': '你',\n 'assistant.debug.chatRole.assistant': '全局助理',\n 'assistant.debug.sharedModel': '索引总结与对话使用的 LLM 模型',\n 'assistant.debug.prompt.index': '索引总结前置提示词',\n 'assistant.debug.prompt.chat': '对话前置提示词',\n 'assistant.debug.promptHelp': '索引按固定结构提取事实、任务和证据。对话默认一到两句、100字以内,先说重点和处理动作,追问再展开。修改索引提示词后自动重建,运行中的会话仍等待完成;修改对话提示词只重新开始对话。保存空白值恢复默认。',\n 'assistant.debug.promptSave': '保存提示词',\n 'assistant.debug.promptDefault': '填入默认提示词',\n 'assistant.debug.analysisTitle': 'LLM 结构化会话索引',\n 'assistant.debug.analysisDeferred': '本批次已结束,部分会话等待本轮执行完成',\n 'assistant.debug.taskProgress': '会话索引:完成 {completed}/{total} · 复用 {reused} · 等待会话完成 {deferred} · 排队 {queued} · 运行 {running} · 失败或停止 {failed}',\n 'assistant.debug.taskHelp': '会话执行结束后自动增量索引,未变化结果直接复用;最多两个独立请求,单项90秒超时。',\n 'assistant.debug.taskReused': '沿用上次结果,本次未调用模型',\n 'assistant.debug.sessionVersion': '当前版本 {source} · 已索引版本 {indexed}',\n 'assistant.debug.sessionMaterialVersion': '索引材料版本 {source} · 已索引版本 {indexed}',\n 'assistant.debug.sessionStateHelp': '会话“已完成”表示本轮执行结束;索引状态独立显示,只有当前版本索引成功才标记“索引已完成”。',\n 'assistant.debug.sessionIndex.pending': '尚未索引',\n 'assistant.debug.sessionIndex.waiting': '等待本轮完成后索引',\n 'assistant.debug.sessionIndex.waiting-user': '等待用户处理后索引',\n 'assistant.debug.sessionIndex.waiting-status': '等待会话状态同步',\n 'assistant.debug.sessionIndex.queued': '索引排队中',\n 'assistant.debug.sessionIndex.running': '索引中',\n 'assistant.debug.sessionIndex.completed': '索引已完成',\n 'assistant.debug.sessionIndex.stale': '索引待更新',\n 'assistant.debug.sessionIndex.failed': '索引失败',\n 'assistant.debug.sessionIndex.cancelled': '索引已停止',\n 'assistant.debug.taskState.deferred': '等待会话完成',\n 'assistant.debug.taskRow': '{workspace} / {name} · {state}',\n 'assistant.debug.taskRaw': '{name}:模型原始输出(未校验)',\n 'assistant.debug.taskState.queued': '排队中',\n 'assistant.debug.taskState.running': '索引中',\n 'assistant.debug.taskState.completed': '已完成',\n 'assistant.debug.taskState.failed': '失败',\n 'assistant.debug.taskState.cancelled': '已停止',\n 'assistant.debug.thinking.disabled': '本次索引已传入关闭思考参数',\n 'assistant.debug.thinking.provider-default': '使用模型默认参数,未确认支持关闭思考',\n 'assistant.debug.thinking.pending': '尚未读取思考参数',\n 'assistant.debug.taskAttempt': '模型调用:{attempt}/{max} 次(含首次调用)',\n 'assistant.debug.taskPreviousAttempt': '前次模型调用:{attempt}/{max} 次(含首次调用)',\n 'assistant.debug.taskRetryWait': '等待自动重试:第 {attempt} 次调用,约 {seconds} 秒后开始',\n 'assistant.debug.modelRaw': '模型原始输出(尚未作为有效索引)',\n 'assistant.debug.sourceStatus': '来源运行状态:{status}(与历史工作进展分开记录)',\n 'assistant.debug.material.excerpt': '依据有限会话摘录,不代表完整历史',\n 'assistant.debug.material.unavailable': '没有可读取的正文',\n 'assistant.debug.field.objective': '工作目标',\n 'assistant.debug.field.progress': '已有进展与验证结果',\n 'assistant.debug.field.blockers': '当前阻碍',\n 'assistant.debug.field.pendingTasks': '已提出的待办',\n 'assistant.debug.field.nextActions': '下一步行动',\n 'assistant.debug.field.openQuestions': '需要补充的信息',\n 'assistant.debug.noEvidence': '暂无来源证据',\n 'assistant.debug.noQuestions': '未提出额外信息缺口',\n 'assistant.debug.evidence': '查看来源证据',\n 'assistant.debug.evidenceSource.title': '会话标题',\n 'assistant.debug.evidenceSource.summary': '正文摘录',\n 'assistant.debug.evidenceQuote': '{source}:{quote}',\n 'assistant.debug.actionTitle': '{kind} · {priority}优先级 · {action}',\n 'assistant.debug.actionReason': '依据:{reason}',\n 'assistant.debug.actionKind.recorded': '已有任务',\n 'assistant.debug.actionKind.suggested': '建议(未安排)',\n 'assistant.debug.priority.high': '高',\n 'assistant.debug.priority.normal': '普通',\n 'assistant.debug.priority.low': '低',\n 'assistant.debug.analysisModel': '总结模型:{provider} / {model}',\n 'assistant.debug.analysisRecord': 'LLM 总结:{provider} / {model} · {state} · {duration} ms',\n 'assistant.debug.analysisStop': '停止索引总结',\n 'assistant.debug.summarizing': '正在总结项目进展…',\n 'assistant.debug.analysisState.running': '正在生成总结…',\n 'assistant.debug.analysisState.completed': '总结已生成',\n 'assistant.debug.analysisState.failed': '总结失败,原始索引材料已保留',\n 'assistant.debug.analysisState.cancelled': '总结已停止,原始索引材料已保留',\n 'assistant.debug.rawEvidence': '以下是原始会话摘录,作为总结证据保留,不是 LLM 生成的进展判断。',\n}\n\nexport const en: Record<string, string> = {\n 'assistant.debug.open': 'Global project state debug',\n 'assistant.debug.title': 'Global assistant management debug',\n 'assistant.debug.description': 'Inspect workspace scope, session state and text commands without starting voice.',\n 'assistant.debug.refresh': 'Force refresh',\n 'assistant.debug.loading': 'Reading current state…',\n 'assistant.debug.close': 'Close debug',\n 'assistant.debug.scope': 'Managed scope',\n 'assistant.debug.scopeHint': 'Select workspaces to allow reading and dispatch. Archived sessions are always excluded.',\n 'assistant.debug.missingWorkspace': 'Unavailable in the current list',\n 'assistant.debug.overview': 'Index {generation} · Included {included} · Excluded {excluded} · Unreadable summaries {unreadable}',\n 'assistant.debug.updated': 'Updated: {time}',\n 'assistant.debug.model': 'Current voice model: {model}',\n 'assistant.debug.noModel': 'Not configured',\n 'assistant.debug.sessions': 'Managed sessions',\n 'assistant.debug.noSessions': 'No sessions are included. Check the managed scope first.',\n 'assistant.debug.excluded': 'Excluded sessions',\n 'assistant.debug.noExcluded': 'No visible excluded records.',\n 'assistant.debug.archived': 'Archived',\n 'assistant.debug.outsideScope': 'Workspace outside managed scope',\n 'assistant.debug.summary': 'Full progress summary',\n 'assistant.debug.noSummary': 'No readable session summary.',\n 'assistant.debug.untitled': 'Untitled session',\n 'assistant.debug.status.waiting': 'Waiting for user',\n 'assistant.debug.status.running': 'Running',\n 'assistant.debug.status.completed': 'Completed',\n 'assistant.debug.status.error': 'Error',\n 'assistant.debug.status.unknown': 'Unknown state',\n 'assistant.debug.waiting.approval': 'Waiting for approval',\n 'assistant.debug.waiting.question': 'Waiting for an answer',\n 'assistant.debug.command': 'Text command debug',\n 'assistant.debug.commandHint': 'Preview only parses intent. Execute runs the assistant logic and may dispatch to a matched session.',\n 'assistant.debug.commandPlaceholder': 'For example: query progress, or ask a session to check a login problem',\n 'assistant.debug.preview': 'Preview intent',\n 'assistant.debug.execute': 'Execute text command',\n 'assistant.debug.result': 'Command result',\n 'assistant.debug.raw': 'Raw state snapshot (JSON)',\n 'assistant.debug.sources': 'Data sources and operations',\n 'assistant.debug.serviceState': '{service}: {state}',\n 'assistant.debug.service.workspaceList': 'Workspace list',\n 'assistant.debug.service.sessionList': 'Session list',\n 'assistant.debug.service.summaryRead': 'Local session summary reading',\n 'assistant.debug.service.taskDispatch': 'Local task dispatch',\n 'assistant.debug.service.remoteGateway': 'Remote Host aggregation and dispatch',\n 'assistant.debug.available': 'Connected interface',\n 'assistant.debug.unavailable': 'Missing interface',\n 'assistant.debug.warnings': 'State reading diagnostics',\n 'assistant.debug.workspaceCounts': '{included} included sessions · {excluded} excluded sessions',\n 'assistant.debug.export': 'Download snapshot',\n 'assistant.debug.stepsDescription': 'Choose projects → Review sessions → Index automatically after completion → Inspect results and records → Chat with an LLM.',\n 'assistant.debug.steps': 'Debug steps',\n 'assistant.debug.tab.scope': '1. Index scope',\n 'assistant.debug.tab.sessions': '2. Workspaces and sessions',\n 'assistant.debug.tab.result': '3. Current index',\n 'assistant.debug.tab.records': '4. Index records',\n 'assistant.debug.tab.chat': '5. LLM text chat',\n 'assistant.debug.rangeHelp': 'Workspace selection is saved immediately. Archived sessions are excluded. Idle sessions are indexed automatically; running sessions wait for turn completion.',\n 'assistant.debug.selectedCount': '{count} workspaces selected',\n 'assistant.debug.scopeEmpty': 'Choose workspaces to define the index scope first.',\n 'assistant.debug.projectCount': '{name} · {count} unarchived sessions',\n 'assistant.debug.projectEmpty': 'No visible unarchived sessions in this workspace.',\n 'assistant.debug.sessionTitle': '{title} · {status}',\n 'assistant.debug.shortTitle': 'Untitled session ({id})',\n 'assistant.debug.viewRefresh': 'Refresh view',\n 'assistant.debug.build': 'Build index',\n 'assistant.debug.indexing': 'Indexing session content…',\n 'assistant.debug.indexState.not-built': 'No index yet. Idle sessions will be indexed automatically, or click Build index.',\n 'assistant.debug.indexState.ready': 'Index is ready for LLM chat.',\n 'assistant.debug.indexState.stale': 'Sessions have pending changes. Incremental indexing starts after their current turns finish.',\n 'assistant.debug.indexState.building': 'Building a new index. Please wait.',\n 'assistant.debug.indexState.incomplete': 'Index incomplete: running sessions wait for completion; click Build index to retry failures.',\n 'assistant.debug.indexTime': 'Indexed {time} · Version {generation}',\n 'assistant.debug.quality': '{total} sessions · {read} with content · {empty} without content · {unknown} unknown states · {failed} read failures',\n 'assistant.debug.technical': 'Advanced diagnostics (services, exclusions and JSON)',\n 'assistant.debug.excludedCount': 'Excluded records ({count})',\n 'assistant.debug.excludedRow': '{workspace} / {name} · {reason}',\n 'assistant.debug.recordsHelp': 'Last 30 index builds during this Host run. Refreshing the view does not build an index. Expand a record for per-session outcomes.',\n 'assistant.debug.noRecords': 'No records yet. Indexing starts after turn completion, or click Build index.',\n 'assistant.debug.recordTitle': '{time} · {trigger} · {state}',\n 'assistant.debug.recordStats': '{duration} ms · {included} included · {excluded} excluded · {failed} read failures',\n 'assistant.debug.recordScope': 'Scope: {names}',\n 'assistant.debug.recordSession': '{workspace} / {name} · {result}',\n 'assistant.debug.recordState.running': 'Indexing',\n 'assistant.debug.recordState.completed': 'Completed',\n 'assistant.debug.recordState.failed': 'Failed',\n 'assistant.debug.trigger.manual': 'Manual',\n 'assistant.debug.trigger.automatic': 'Assistant automatic',\n 'assistant.debug.readResult.read': 'Content read',\n 'assistant.debug.readResult.empty': 'No extractable content',\n 'assistant.debug.readResult.failed': 'Content read failed',\n 'assistant.debug.chatHelp': 'Use configured DSH models for multi-turn questions about the current index. This round is read-only and does not dispatch tasks. Changing model, scope or index resets the conversation.',\n 'assistant.debug.chatNeedsIndex': 'Wait for scoped sessions to finish and automatic indexing to complete before chatting.',\n 'assistant.debug.chatGeneration': 'Using index version {generation}',\n 'assistant.debug.chatModel': 'LLM model',\n 'assistant.debug.modelsLoading': 'Loading DSH models…',\n 'assistant.debug.modelsEmpty': 'No native DSH API models are available. Configure a provider and model in DSH model settings first.',\n 'assistant.debug.chooseModel': 'Choose a DSH model',\n 'assistant.debug.modelsRefresh': 'Refresh models',\n 'assistant.debug.chatClear': 'New conversation',\n 'assistant.debug.chatInput': 'Ask about project status',\n 'assistant.debug.chatPlaceholder': 'For example: What is each project working on? Which sessions need my attention?',\n 'assistant.debug.chatEmpty': 'Build an index, choose a model and send a question. Your messages and AI replies appear here.',\n 'assistant.debug.chatGenerating': 'LLM is replying…',\n 'assistant.debug.chatFailed': 'Reply failed. See the error below.',\n 'assistant.debug.chatCancelled': 'Reply stopped.',\n 'assistant.debug.chatSend': 'Send to LLM',\n 'assistant.debug.chatStop': 'Stop reply',\n 'assistant.debug.chatRole.user': 'You',\n 'assistant.debug.chatRole.assistant': 'Global assistant',\n 'assistant.debug.sharedModel': 'LLM model for index summaries and chat',\n 'assistant.debug.prompt.index': 'Index summary prefix prompt',\n 'assistant.debug.prompt.chat': 'Chat prefix prompt',\n 'assistant.debug.promptHelp': 'Indexing extracts facts, tasks and evidence in a fixed structure. Chat defaults to one or two short sentences within 100 characters, focusing on the main point and action; ask for details to expand. Changing the index prompt rebuilds automatically after running turns finish; changing the chat prompt starts a new conversation. An empty prompt restores its default.',\n 'assistant.debug.promptSave': 'Save prompt',\n 'assistant.debug.promptDefault': 'Fill default prompt',\n 'assistant.debug.analysisTitle': 'LLM structured session index',\n 'assistant.debug.analysisDeferred': 'Batch finished; some sessions are waiting for their current execution to end',\n 'assistant.debug.taskProgress': 'Session indexing: {completed}/{total} complete · {reused} reused · {deferred} waiting for turn completion · {queued} queued · {running} running · {failed} failed or stopped',\n 'assistant.debug.taskHelp': 'Incremental indexing starts after session execution ends and reuses unchanged results. Up to two independent requests, each with a 90-second timeout.',\n 'assistant.debug.taskReused': 'Kept the previous outcome; no model request this time',\n 'assistant.debug.sessionVersion': 'Current version {source} · Indexed version {indexed}',\n 'assistant.debug.sessionMaterialVersion': 'Index material version {source} · Indexed version {indexed}',\n 'assistant.debug.sessionStateHelp': 'Completed means the current turn has ended. Index status is shown separately and is complete only after the current version is successfully indexed.',\n 'assistant.debug.sessionIndex.pending': 'Not indexed yet',\n 'assistant.debug.sessionIndex.waiting': 'Indexing waits for turn completion',\n 'assistant.debug.sessionIndex.waiting-user': 'Indexing waits for user action',\n 'assistant.debug.sessionIndex.waiting-status': 'Waiting for session status sync',\n 'assistant.debug.sessionIndex.queued': 'Index queued',\n 'assistant.debug.sessionIndex.running': 'Indexing',\n 'assistant.debug.sessionIndex.completed': 'Index complete',\n 'assistant.debug.sessionIndex.stale': 'Index update pending',\n 'assistant.debug.sessionIndex.failed': 'Index failed',\n 'assistant.debug.sessionIndex.cancelled': 'Index stopped',\n 'assistant.debug.taskState.deferred': 'Waiting for session completion',\n 'assistant.debug.taskRow': '{workspace} / {name} · {state}',\n 'assistant.debug.taskRaw': '{name}: raw model output (unvalidated)',\n 'assistant.debug.taskState.queued': 'Queued',\n 'assistant.debug.taskState.running': 'Indexing',\n 'assistant.debug.taskState.completed': 'Completed',\n 'assistant.debug.taskState.failed': 'Failed',\n 'assistant.debug.taskState.cancelled': 'Stopped',\n 'assistant.debug.thinking.disabled': 'Thinking disabled for this index request',\n 'assistant.debug.thinking.provider-default': 'Using model defaults; a thinking-off option was not confirmed',\n 'assistant.debug.thinking.pending': 'Thinking parameters not resolved yet',\n 'assistant.debug.taskAttempt': 'Model attempts: {attempt}/{max}, including the first call',\n 'assistant.debug.taskPreviousAttempt': 'Previous model attempts: {attempt}/{max}, including the first call',\n 'assistant.debug.taskRetryWait': 'Automatic retry: attempt {attempt} starts in about {seconds} seconds',\n 'assistant.debug.modelRaw': 'Raw model output (not a valid index yet)',\n 'assistant.debug.sourceStatus': 'Source runtime state: {status} (separate from work progress)',\n 'assistant.debug.material.excerpt': 'Based on limited session excerpts, not full history',\n 'assistant.debug.material.unavailable': 'No readable body',\n 'assistant.debug.field.objective': 'Work objective',\n 'assistant.debug.field.progress': 'Progress and verification',\n 'assistant.debug.field.blockers': 'Blockers',\n 'assistant.debug.field.pendingTasks': 'Recorded pending tasks',\n 'assistant.debug.field.nextActions': 'Next actions',\n 'assistant.debug.field.openQuestions': 'Missing information',\n 'assistant.debug.noEvidence': 'No source evidence yet',\n 'assistant.debug.noQuestions': 'No additional information gaps identified',\n 'assistant.debug.evidence': 'View source evidence',\n 'assistant.debug.evidenceSource.title': 'Session title',\n 'assistant.debug.evidenceSource.summary': 'Body excerpt',\n 'assistant.debug.evidenceQuote': '{source}: {quote}',\n 'assistant.debug.actionTitle': '{kind} · {priority} priority · {action}',\n 'assistant.debug.actionReason': 'Reason: {reason}',\n 'assistant.debug.actionKind.recorded': 'Recorded task',\n 'assistant.debug.actionKind.suggested': 'Suggestion (not scheduled)',\n 'assistant.debug.priority.high': 'High',\n 'assistant.debug.priority.normal': 'Normal',\n 'assistant.debug.priority.low': 'Low',\n 'assistant.debug.analysisModel': 'Summary model: {provider} / {model}',\n 'assistant.debug.analysisRecord': 'LLM summary: {provider} / {model} · {state} · {duration} ms',\n 'assistant.debug.analysisStop': 'Stop index summary',\n 'assistant.debug.summarizing': 'Summarizing project progress…',\n 'assistant.debug.analysisState.running': 'Generating summary…',\n 'assistant.debug.analysisState.completed': 'Summary generated',\n 'assistant.debug.analysisState.failed': 'Summary failed; source index retained',\n 'assistant.debug.analysisState.cancelled': 'Summary stopped; source index retained',\n 'assistant.debug.rawEvidence': 'These source excerpts are retained as evidence, rather than LLM-generated progress conclusions.',\n}\n","export const en = {\n 'avatar.portraitTitle': 'Avatar',\n 'avatar.portraitEdit': 'Adjust avatar',\n 'avatar.portraitLocalHint': 'Saved in this browser for this character; conversation and sidebar avatars update together.',\n 'avatar.portraitDraftHint': 'Avatar adjustments apply when you save the configuration.',\n 'avatar.portraitConfirm': 'Confirm crop',\n 'avatar.portraitDragHint': 'Drag the image or use arrow keys; zoom to adjust the crop.',\n 'avatar.portraitCropArea': 'Avatar crop area',\n 'avatar.portraitZoom': 'Zoom',\n 'avatar.portraitLoading': 'Preparing the crop image…',\n 'avatar.portraitSaving': 'Saving avatar…',\n 'avatar.portraitCancel': 'Cancel',\n 'avatar.portraitSave': 'Save avatar',\n 'avatar.portraitSourceFailed': 'The character image is unavailable. Retry after the character has loaded.',\n 'avatar.portraitSaveFailed': 'Avatar could not be saved. Check browser storage and try again.',\n 'avatar.settingsTitle': 'Assistant appearance',\n 'avatar.settingsDescription': 'Choose one character for both the floating companion and the assistant conversation.',\n 'avatar.thirdPartyTitle': 'Third-party characters',\n 'avatar.thirdPartyTerms': 'Third-party character terms · {version}',\n 'avatar.thirdPartyTermsContent': 'Characters belong to their authors. Directory inclusion does not grant a license or commercial rights. Selecting a character automatically downloads complete materials from upstream websites for temporary preview. Applying it requires confirmation of its material license. Check attribution, noncommercial, sharing, and individual character restrictions. Installation downloads materials only and does not execute plugin code.',\n 'avatar.thirdPartyAgree': 'I have read and agree to these third-party character terms.',\n 'avatar.thirdPartyEnable': 'Enable third-party characters',\n 'avatar.thirdPartyConfirm': 'Agree and enable',\n 'avatar.thirdPartyConsentRequired': 'Please agree to the third-party character terms first.',\n 'avatar.catalogLoading': 'Loading character records…',\n 'avatar.catalogRetry': 'Reload the list',\n 'avatar.catalogEmpty': 'No third-party characters are currently listed.',\n 'avatar.catalogPreview': 'Static character preview',\n 'avatar.catalogLicenseLink': 'Read the material license',\n 'avatar.catalogPreviewHint': 'Selecting a character automatically downloads complete materials for temporary preview. Switching or closing automatically clears it. Applying the character requires license confirmation and keeps the verified materials.',\n 'avatar.temporaryUnavailable': 'Preview is unavailable while character settings are disabled.',\n 'avatar.temporaryUse': 'Use this character',\n 'avatar.temporaryLoadFailed': 'The preview could not load. Select the character again to retry.',\n 'avatar.temporaryLive2dLoadFailed': 'The Live2D preview could not load. Check the Host engine or select the character again to retry.',\n 'avatar.loadErrorReason': 'Reason: {reason}',\n 'avatar.live2dEngineUnavailable': 'The Live2D engine is not ready yet. Select the Live2D character again in appearance settings to install it automatically.',\n 'avatar.live2dRuntimeInvalid': 'The Live2D engine does not export the expected interface. Check its version.',\n 'avatar.live2dWebglUnavailable': 'This browser could not create a WebGL drawing context.',\n 'avatar.catalogPreviewFailed': 'The upstream preview is unavailable. You can check the repository before installing.',\n 'avatar.catalogSize': 'Full download: approximately {size} · {files} files',\n 'avatar.catalogLicenseAgree': 'I have read this character’s license, accept its restrictions, and confirm applying this character.',\n 'avatar.catalogDownload': 'Confirm download and use',\n 'avatar.catalogInstalled': 'Already installed',\n 'avatar.floatingEnabled': 'Show floating companion',\n 'avatar.dialogEnabled': 'Show character in conversation',\n 'avatar.selected': 'Current character',\n 'avatar.builtinName': 'Yu Niu',\n 'avatar.builtinMaleName': 'Yu Zai',\n 'avatar.externalName': '{name} · third-party',\n 'avatar.thirdPartyBadge': 'Third-party',\n 'avatar.externalHint': 'Third-party characters are external dependencies and are not preinstalled with the plugin. Install them as needed after creating your assistant.',\n 'avatar.live2dDependencyHint': 'The Live2D engine (l2d@2.1.1) is downloaded into the CodingNS data directory the first time you select a Live2D character, after you confirm the engine license. Character installation still downloads materials only.',\n 'avatar.engineTerms': 'Live2D engine license · {version}',\n 'avatar.engineTermsContent': 'The engine is the third-party package l2d@2.1.1 from the public npm registry. It bundles the Live2D Cubism SDK at runtime, which is governed by the Live2D Proprietary Software License; confirm that your use, including commercial use, is permitted. The Host downloads this exact version over HTTPS, verifies its SHA-512 digest and installs it only into the CodingNS data directory. It is not bundled with the plugin, does not modify the DSH profile or plugin dependencies, and loads only when a Live2D character is displayed.',\n 'avatar.engineAgree': 'I have read the engine license notice and agree to download and install the Live2D engine.',\n 'avatar.engineConfirm': 'Agree and install',\n 'avatar.engineInstalling': 'Downloading and installing the Live2D engine…',\n 'avatar.engineCancel': 'Cancel installation',\n 'avatar.engineInstallFailed': 'Live2D engine installation failed: {reason}',\n 'avatar.engineRetry': 'Retry installation',\n 'avatar.engineCancelled': 'Live2D engine installation was cancelled.',\n 'avatar.engineInstalled': 'Live2D engine is ready.',\n 'avatar.engineMissing': 'The current character needs the Live2D engine, which is not installed on this Host yet.',\n 'avatar.engineInstall': 'Install the Live2D engine',\n 'avatar.preset.whaleSprite': 'DeepSeek whale · full-body chibi',\n 'avatar.preset.whaleLive2d': 'DeepSeek whale · Live2D at the desk',\n 'avatar.floatingSize': 'Companion size',\n 'avatar.size.mini': 'Mini',\n 'avatar.size.standard': 'Standard',\n 'avatar.size.custom': 'Custom',\n 'avatar.customSize': 'Custom size (px)',\n 'avatar.dialogSize': 'Conversation character size',\n 'avatar.remove': 'Remove this custom character',\n 'avatar.add': 'Add a character',\n 'avatar.addMode': 'Addition method',\n 'avatar.customMaterial': 'Custom materials',\n 'avatar.importPackage': 'Install an appearance package',\n 'avatar.adapter': 'Package format',\n 'avatar.adapter.auto': 'Detect automatically',\n 'avatar.adapter.native': 'CodingNS appearance package',\n 'avatar.adapter.codex': 'Codex pet.json',\n 'avatar.adapter.dsh': 'DSH Live2D pet.json',\n 'avatar.adapter.cubism': 'Live2D model.json / model3.json',\n 'avatar.manifestUrl': 'Repository or resource URL',\n 'avatar.importHint': 'Enter a public GitHub repository, folder, JSON manifest, Live2D model or image URL. Choose a package to download its materials locally, then register and use it. Check its license before use.',\n 'avatar.importUse': 'Install and use',\n 'avatar.discover': 'Find appearance packages',\n 'avatar.installCandidate': 'Choose a package',\n 'avatar.installCurrent': 'Install this character locally',\n 'avatar.installProgress': 'Finding or installing character materials…',\n 'avatar.cancel': 'Cancel',\n 'avatar.cancelled': 'Appearance installation cancelled.',\n 'avatar.discovered': 'Appearance packages found. Choose one to install.',\n 'avatar.importing': 'Importing…',\n 'avatar.packageAuthor': 'Author: {author}',\n 'avatar.packageLicense': 'License: {license}',\n 'avatar.packageSource': 'Package source',\n 'avatar.packageHomepage': 'Package details and license',\n 'avatar.notDeclared': 'Not declared',\n 'avatar.name': 'Character name',\n 'avatar.type': 'Character format',\n 'avatar.type.image': 'Image',\n 'avatar.type.spritesheet': 'Animated pet sprite sheet',\n 'avatar.type.live2d': 'Live2D character',\n 'avatar.source': 'Character resource address',\n 'avatar.sourceHint.image': 'Use an image address, such as PNG or WebP. Transparent backgrounds work best.',\n 'avatar.sourceHint.spritesheet': 'Use a Codex v1/v2 sprite sheet address and choose its matching dimensions.',\n 'avatar.sourceHint.live2d': 'Use a .model.json or .model3.json address. Its textures and motions must also be accessible. Full-body display needs a full-body model.',\n 'avatar.sourceHint.custom': 'Use the resource address supported by this renderer.',\n 'avatar.spriteVersion': 'Sprite sheet layout',\n 'avatar.addUse': 'Add and use',\n 'avatar.customName': 'Custom character',\n 'avatar.invalidSource': 'Enter an HTTP(S) address or a path beginning with / on this site.',\n 'avatar.saved': 'Assistant appearance saved.',\n 'avatar.character': '{name} · assistant character',\n 'avatar.loadFailed': 'The character could not be loaded. Showing the built-in character.',\n 'avatar.loading': 'Your companion is on the way…',\n 'avatar.loadingCompact': 'Loading…',\n 'avatar.loadEngine': 'Preparing the character engine…',\n 'avatar.loadRendering': 'Preparing the character display…',\n 'avatar.loadProgress': 'Character loading progress',\n 'avatar.loadElapsed': '{seconds}s total',\n 'avatar.loadElapsedCompact': '{seconds}s',\n 'avatar.loadResourcesElapsed': 'Resources ready at {seconds}s',\n 'avatar.cacheUnknown': 'Cache status unknown',\n 'avatar.cacheUnknownCompact': 'Cache unknown',\n 'avatar.cacheTiny': 'Host {cached}/{total}',\n 'avatar.cacheBefore': 'Host cache before loading: {cached}/{total}',\n 'avatar.cacheShort': 'Host cache before load {cached}/{total}',\n 'avatar.cacheDownloads': '{count} new Host downloads',\n 'avatar.cacheDownloadsCompact': '{count} new downloads',\n 'avatar.cacheDownloadsTiny': '+{count} downloads',\n 'avatar.openAssistant': 'Open the global assistant',\n 'avatar.desktopFallback': 'Desktop companion unavailable; showing inside this window.',\n 'avatar.dragHint': 'Drag to move; click to open the assistant.',\n}\n\nexport const zh: Record<keyof typeof en, string> = {\n 'avatar.portraitTitle': '头像',\n 'avatar.portraitEdit': '微调头像',\n 'avatar.portraitLocalHint': '按形象保存在当前浏览器,对话与侧栏头像同步更新。',\n 'avatar.portraitDraftHint': '头像调整将在保存配置后生效。',\n 'avatar.portraitConfirm': '确认裁剪',\n 'avatar.portraitDragHint': '拖动图片或使用方向键,再缩放调整裁剪范围。',\n 'avatar.portraitCropArea': '头像裁剪区域',\n 'avatar.portraitZoom': '缩放',\n 'avatar.portraitLoading': '正在准备裁剪图片…',\n 'avatar.portraitSaving': '正在保存头像…',\n 'avatar.portraitCancel': '取消',\n 'avatar.portraitSave': '保存头像',\n 'avatar.portraitSourceFailed': '暂时无法读取形象图片,形象加载完成后可重试。',\n 'avatar.portraitSaveFailed': '头像保存失败,请检查浏览器存储后重试。',\n 'avatar.settingsTitle': '助理形象',\n 'avatar.settingsDescription': '选择一个角色,同时用于悬浮宠物和助理对话。',\n 'avatar.thirdPartyTitle': '第三方形象',\n 'avatar.thirdPartyTerms': '第三方形象使用说明 · {version}',\n 'avatar.thirdPartyTermsContent': '第三方形象归各作者所有,列入目录不代表获得使用或商业授权。选择形象后会自动从上游网站下载完整素材用于临时预览,正式应用时需确认该形象的素材许可。请核对署名、非商业、共享方式及角色个别限制。安装只下载素材,不执行第三方插件代码。',\n 'avatar.thirdPartyAgree': '我已阅读并同意第三方形象使用说明。',\n 'avatar.thirdPartyEnable': '启用第三方形象',\n 'avatar.thirdPartyConfirm': '同意并启用',\n 'avatar.thirdPartyConsentRequired': '请先同意第三方形象使用说明',\n 'avatar.catalogLoading': '正在加载形象记录…',\n 'avatar.catalogRetry': '重新加载列表',\n 'avatar.catalogEmpty': '暂无第三方形象记录。',\n 'avatar.catalogPreview': '形象静态预览',\n 'avatar.catalogLicenseLink': '查看素材许可',\n 'avatar.catalogPreviewHint': '选择后自动下载完整素材并临时预览;切换或关闭后自动清理。采用此形象时才需确认许可,并保留已验证素材。',\n 'avatar.temporaryUnavailable': '形象设置不可用,暂时无法预览。',\n 'avatar.temporaryUse': '采用此形象',\n 'avatar.temporaryLoadFailed': '形象预览加载失败,请重新选择形象后重试。',\n 'avatar.temporaryLive2dLoadFailed': 'Live2D 形象预览加载失败,请检查 Host 引擎或重新选择形象后重试。',\n 'avatar.loadErrorReason': '原因:{reason}',\n 'avatar.live2dEngineUnavailable': 'Live2D 引擎尚未就绪,请在形象设置中重新选择该 Live2D 形象以自动安装。',\n 'avatar.live2dRuntimeInvalid': 'Live2D 引擎未提供预期接口,请检查引擎版本。',\n 'avatar.live2dWebglUnavailable': '当前浏览器无法创建 WebGL 绘图上下文。',\n 'avatar.catalogPreviewFailed': '上游预览暂时无法显示,可先查看仓库后再决定是否安装。',\n 'avatar.catalogSize': '完整下载:约 {size} · {files} 个文件',\n 'avatar.catalogLicenseAgree': '我已阅读该形象许可,接受其限制,并确认应用此形象。',\n 'avatar.catalogDownload': '确认下载并使用',\n 'avatar.catalogInstalled': '已安装',\n 'avatar.floatingEnabled': '显示悬浮宠物',\n 'avatar.dialogEnabled': '对话中显示角色',\n 'avatar.selected': '当前形象',\n 'avatar.builtinName': '鱼妞',\n 'avatar.builtinMaleName': '鱼仔',\n 'avatar.externalName': '{name} · 第三方',\n 'avatar.thirdPartyBadge': '第三方',\n 'avatar.externalHint': '第三方形象为外部依赖,不随插件预装,可在创建后按需安装。',\n 'avatar.live2dDependencyHint': '首次选择 Live2D 形象并确认引擎许可后,Host 会把引擎(l2d@2.1.1)下载到 CodingNS 自有目录。形象安装仍只下载素材。',\n 'avatar.engineTerms': 'Live2D 引擎许可 · {version}',\n 'avatar.engineTermsContent': '引擎是来自公开 npm 源的第三方包 l2d@2.1.1,运行时集成 Live2D Cubism SDK,受 Live2D Proprietary Software License 约束;请自行确认你的使用(包括商业用途)已获许可。Host 通过 HTTPS 下载这一精确版本、校验 SHA-512 摘要,并且只安装到 CodingNS 自有数据目录;引擎不随插件打包,不修改 DSH Profile 或插件依赖,只在显示 Live2D 形象时加载。',\n 'avatar.engineAgree': '我已阅读引擎许可说明,并同意下载安装 Live2D 引擎。',\n 'avatar.engineConfirm': '同意并安装',\n 'avatar.engineInstalling': '正在下载并安装 Live2D 引擎…',\n 'avatar.engineCancel': '取消安装',\n 'avatar.engineInstallFailed': 'Live2D 引擎安装失败:{reason}',\n 'avatar.engineRetry': '重试安装',\n 'avatar.engineCancelled': 'Live2D 引擎安装已取消。',\n 'avatar.engineInstalled': 'Live2D 引擎已就绪。',\n 'avatar.engineMissing': '当前形象需要 Live2D 引擎,本 Host 尚未安装。',\n 'avatar.engineInstall': '安装 Live2D 引擎',\n 'avatar.preset.whaleSprite': '大肥鱼 · Q版全身',\n 'avatar.preset.whaleLive2d': '大肥鱼 · Live2D 桌前',\n 'avatar.floatingSize': '悬浮宠物大小',\n 'avatar.size.mini': '迷你',\n 'avatar.size.standard': '标准',\n 'avatar.size.custom': '自定义',\n 'avatar.customSize': '自定义尺寸(像素)',\n 'avatar.dialogSize': '对话角色大小',\n 'avatar.remove': '移除此自定义形象',\n 'avatar.add': '添加形象',\n 'avatar.addMode': '添加方式',\n 'avatar.customMaterial': '自定义素材',\n 'avatar.importPackage': '安装形象包',\n 'avatar.adapter': '形象包格式',\n 'avatar.adapter.auto': '自动识别',\n 'avatar.adapter.native': 'CodingNS 形象包',\n 'avatar.adapter.codex': 'Codex pet.json',\n 'avatar.adapter.dsh': 'DSH Live2D pet.json',\n 'avatar.adapter.cubism': 'Live2D model.json / model3.json',\n 'avatar.manifestUrl': '仓库或资源 URL',\n 'avatar.importHint': '填写公开 GitHub 仓库、目录、JSON 清单、Live2D 模型或图片 URL;选择形象后下载素材到本地,再登记并启用。使用前请确认素材许可。',\n 'avatar.importUse': '安装并使用',\n 'avatar.discover': '查找形象包',\n 'avatar.installCandidate': '选择待安装形象',\n 'avatar.installCurrent': '将此形象安装到本地',\n 'avatar.installProgress': '正在查找或安装形象素材…',\n 'avatar.cancel': '取消',\n 'avatar.cancelled': '形象安装已取消。',\n 'avatar.discovered': '已找到形象包,请选择后安装。',\n 'avatar.importing': '正在导入…',\n 'avatar.packageAuthor': '作者:{author}',\n 'avatar.packageLicense': '许可:{license}',\n 'avatar.packageSource': '形象包来源',\n 'avatar.packageHomepage': '形象包详情与许可',\n 'avatar.notDeclared': '未声明',\n 'avatar.name': '角色名称',\n 'avatar.type': '形象格式',\n 'avatar.type.image': '图片',\n 'avatar.type.spritesheet': '宠物动作图集',\n 'avatar.type.live2d': 'Live2D 角色',\n 'avatar.source': '形象资源地址',\n 'avatar.sourceHint.image': '填写 PNG、WebP 等图片地址,透明背景效果更好。',\n 'avatar.sourceHint.spritesheet': '填写 Codex v1/v2 宠物图集地址,并选择对应的图片尺寸。',\n 'avatar.sourceHint.live2d': '填写 .model.json 或 .model3.json 地址,贴图和动作文件也需能访问。全身展示需使用全身模型。',\n 'avatar.sourceHint.custom': '填写此渲染器支持的资源地址。',\n 'avatar.spriteVersion': '图集布局',\n 'avatar.addUse': '添加并使用',\n 'avatar.customName': '自定义形象',\n 'avatar.invalidSource': '请填写 HTTP(S) 地址,或本站以 / 开头的资源路径。',\n 'avatar.saved': '助理形象已保存。',\n 'avatar.character': '{name} · 助理形象',\n 'avatar.loadFailed': '形象暂时无法加载,已显示内置角色。',\n 'avatar.loading': '小伙伴正在赶来…',\n 'avatar.loadingCompact': '载入中…',\n 'avatar.loadEngine': '正在准备形象引擎…',\n 'avatar.loadRendering': '正在准备形象显示…',\n 'avatar.loadProgress': '形象加载进度',\n 'avatar.loadElapsed': '总用时 {seconds} 秒',\n 'avatar.loadElapsedCompact': '{seconds} 秒',\n 'avatar.loadResourcesElapsed': '资源就绪 {seconds} 秒',\n 'avatar.cacheUnknown': '缓存状态未知',\n 'avatar.cacheUnknownCompact': '缓存未知',\n 'avatar.cacheTiny': 'Host {cached}/{total}',\n 'avatar.cacheBefore': '加载前 Host 缓存:{cached}/{total}',\n 'avatar.cacheShort': '加载前 Host 缓存 {cached}/{total}',\n 'avatar.cacheDownloads': 'Host 新增下载 {count} 项',\n 'avatar.cacheDownloadsCompact': '新增下载 {count} 项',\n 'avatar.cacheDownloadsTiny': '下载 +{count}',\n 'avatar.openAssistant': '打开全局智能助理',\n 'avatar.desktopFallback': '系统悬浮暂不可用,当前在窗口内显示',\n 'avatar.dragHint': '拖动调整位置,点击打开助理。',\n}\n","/**\n * fileWorkspace 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\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.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 '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.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.draftUnavailable': 'Commit message generation is not available yet',\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.draftUnavailable': '生成提交信息功能暂未开放',\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 '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}\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 'lan.fieldListenPort': '监听端口',\n 'lan.fieldDshPort': 'DSH 本地端口',\n 'lan.fieldMustBeNumber': '{field} 必须是数字',\n 'lan.fieldMustBeInteger': '{field} 必须是 {minimum} 到 65535 的整数',\n 'workspace.sessionSettingsSaved': '工作区会话设置已保存',\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.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.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 '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}\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 '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}\n","export const en = {\n 'voice.models.prepared': 'Model resources are ready. Save the configuration to use this recognition model.',\n 'voice.settings.input': 'Speech input', 'voice.settings.output': 'Speech output',\n 'voice.settings.inputDescription': 'Recognition model and microphone',\n 'voice.settings.outputDescription': 'Voice, previews and speech controls',\n 'voice.models.description': 'Check downloads, verify a model, and choose which model to use.',\n 'voice.models.recognitionHint': 'Converts microphone speech to text. Managed independently of the voice used for playback.',\n 'voice.models.current': 'Current model',\n 'voice.models.none': 'No model configured',\n 'voice.models.custom': 'Custom model configured',\n 'voice.models.running': 'Realtime recognition is running',\n 'voice.models.ready': 'Recognition runtime loaded; conversation stopped',\n 'voice.models.stopped': 'Realtime conversation has not started',\n 'voice.models.refresh': 'Refresh status',\n 'voice.models.refreshing': 'Refreshing…',\n 'voice.models.loading': 'Reading model files on the Host…',\n 'voice.models.unknown': 'Status pending',\n 'voice.models.downloaded': 'Downloaded',\n 'voice.models.partial': 'Incomplete files',\n 'voice.models.missing': 'Not downloaded',\n 'voice.models.inUse': 'Current model',\n 'voice.models.unchecked': 'Not verified',\n 'voice.models.passed': 'Verification passed',\n 'voice.models.failed': 'Verification failed',\n 'voice.models.fileCount': '{count}/{total} files · {size} on disk',\n 'voice.models.checkedAt': 'Last verified: {time}',\n 'voice.models.fileDetails': 'File details and locations',\n 'voice.models.fileMissing': 'Missing or empty',\n 'voice.models.partialSize': '{size} incomplete',\n 'voice.models.downloadUse': 'Download and use',\n 'voice.models.completeDownload': 'Complete download and use',\n 'voice.models.use': 'Verify and use',\n 'voice.models.verify': 'Verify availability',\n 'voice.models.redownload': 'Download again',\n 'voice.models.verifying': 'Loading model and testing recognition…',\n 'voice.models.verified': 'Verification passed: the model loads and completes recognition.',\n 'voice.models.applied': 'Verification passed and this model is now selected. Return to start realtime conversation.',\n 'voice.models.otherOperation': 'Another page is downloading or verifying a model. Status will refresh automatically.',\n 'voice.models.stopBeforeSwitch': 'Stop the current realtime conversation before switching or downloading a model again. Verification is still available.',\n 'voice.models.localHint': 'Models are stored on this Host. Verification tests model loading and recognition without using your microphone.',\n 'voice.models.close': 'Close',\n}\n\nexport const zh: Record<keyof typeof en, string> = {\n 'voice.models.prepared': '模型资源已准备好,保存配置后使用此识别模型。',\n 'voice.settings.input': '语音输入', 'voice.settings.output': '语音输出',\n 'voice.settings.inputDescription': '识别模型与麦克风设置',\n 'voice.settings.outputDescription': '音色、试听与播报参数',\n 'voice.models.description': '查看下载状态,验证模型可用性,选择当前使用的模型。',\n 'voice.models.recognitionHint': '将麦克风语音转换为文字,与播报音色独立设置。',\n 'voice.models.current': '当前模型',\n 'voice.models.none': '尚未配置模型',\n 'voice.models.custom': '已配置自定义模型',\n 'voice.models.running': '实时识别正在运行',\n 'voice.models.ready': '识别运行时已加载,对话已停止',\n 'voice.models.stopped': '尚未启动实时对话',\n 'voice.models.refresh': '刷新状态',\n 'voice.models.refreshing': '正在刷新……',\n 'voice.models.loading': '正在读取 Host 上的模型文件……',\n 'voice.models.unknown': '状态待查询',\n 'voice.models.downloaded': '已下载',\n 'voice.models.partial': '文件不完整',\n 'voice.models.missing': '未下载',\n 'voice.models.inUse': '当前使用',\n 'voice.models.unchecked': '尚未验证',\n 'voice.models.passed': '验证通过',\n 'voice.models.failed': '验证失败',\n 'voice.models.fileCount': '{count}/{total} 个文件 · 本地占用 {size}',\n 'voice.models.checkedAt': '最近验证:{time}',\n 'voice.models.fileDetails': '文件详情与保存位置',\n 'voice.models.fileMissing': '缺失或为空',\n 'voice.models.partialSize': '未完成 {size}',\n 'voice.models.downloadUse': '下载并使用',\n 'voice.models.completeDownload': '补全下载并使用',\n 'voice.models.use': '验证并使用',\n 'voice.models.verify': '验证可用性',\n 'voice.models.redownload': '重新下载',\n 'voice.models.verifying': '正在加载模型并验证识别能力……',\n 'voice.models.verified': '验证通过:模型可以加载并完成识别。',\n 'voice.models.applied': '模型验证通过,已设为当前使用。可返回助理窗口开始实时对话。',\n 'voice.models.otherOperation': '其他页面正在下载或验证模型,状态将自动刷新。',\n 'voice.models.stopBeforeSwitch': '实时对话正在运行,请先停止对话再切换或重新下载模型;仍可验证模型可用性。',\n 'voice.models.localHint': '模型保存在当前 Host。验证会检查模型加载和识别能力,无需使用麦克风。',\n 'voice.models.close': '关闭',\n}\n","/** 独立音色面板词典;官方名称保留原文,元数据标签随界面语言翻译。 */\nexport const en = {\n 'tts.wizardPrepareResources': 'Prepare voice resources', 'tts.wizardDraftReady': 'Voice resources are ready. Configuration changes apply after saving.',\n 'tts.prepare': 'Prepare MOSS resources', 'tts.importDraft': 'Import voice', 'tts.resetDraftParameters': 'Restore defaults',\n 'tts.title': 'Voice settings', 'tts.description': 'Choose a MOSS voice, preview it, or import an open reference recording.',\n 'tts.backend': 'Speech output', 'tts.browser': 'Browser voice', 'tts.moss': 'Local MOSS ONNX',\n 'tts.setup': 'Initialize and use MOSS', 'tts.refresh': 'Refresh', 'tts.selected': 'Voice', 'tts.apply': 'Apply voice',\n 'tts.original': 'Preview reference audio', 'tts.preview': 'Preview voice', 'tts.stop': 'Stop preview',\n 'tts.previewText': 'Preview text', 'tts.defaultText': 'Hello, I am your assistant. How can I help you today?',\n 'tts.ready': 'MOSS is ready', 'tts.notReady': 'Initialize MOSS to apply voices or import recordings. The voice environment is prepared automatically.',\n 'tts.wizardTitle': 'First-time voice setup', 'tts.wizardDescription': 'Enable speech with recommended settings. No fields to fill in.',\n 'tts.wizardChecking': 'Checking existing voice resources…', 'tts.wizardDefault': 'Chinese–English recognition',\n 'tts.wizardModel': 'Recognition: {model}', 'tts.wizardVoice': 'Voice: {voice}',\n 'tts.wizardHint': 'Resources download only when enabled. The environment is managed automatically; existing choices and completed downloads are kept. Start voice chat afterward to allow microphone access.',\n 'tts.wizardEnable': 'Enable voice', 'tts.wizardPreparing': 'Preparing…', 'tts.wizardRetry': 'Retry setup',\n 'tts.wizardRecognition': 'Preparing speech recognition…', 'tts.wizardSpeech': 'Preparing local speech output…',\n 'tts.wizardReady': 'Voice is ready', 'tts.wizardListen': 'Try the voice', 'tts.wizardAdvanced': 'Advanced voice settings',\n 'tts.site': 'Open voice library', 'tts.openSite': 'Open website', 'tts.import': 'Import and apply',\n 'tts.openRecordings': 'Browse importable recordings',\n 'tts.source': 'Recording ID or file URL', 'tts.name': 'Name (optional)', 'tts.language': 'Language', 'tts.gender': 'Gender',\n 'tts.sourceHint': 'Use a WAV/FLAC recording lasting 2–30 seconds. Model-specific voice embeddings are not supported.',\n 'tts.kyutaiHint': 'Example: kyutai:voice-donations/0a67.wav. Import CC0 / CC BY 4.0 sources.',\n 'tts.aishellHint': 'Example: aishell:SSB00050001. You can also paste a Hugging Face file URL.',\n 'tts.license': 'License: {license}', 'tts.sourceLink': 'Voice source', 'tts.remove': 'Remove imported voice',\n 'tts.male': 'Male', 'tts.female': 'Female', 'tts.unknown': 'Unspecified',\n 'tts.zh': 'Chinese', 'tts.en': 'English', 'tts.ja': 'Japanese', 'tts.fr': 'French',\n 'tts.originalHint': 'Built-in references are decoded from official audio codes; imported references play the source recording. Use Preview voice to hear local synthesis.',\n 'tts.loadError': 'Unable to play this recording. Check the network or import it again.',\n 'tts.busy': 'Processing…', 'tts.saved': 'Voice settings saved.',\n 'tts.playbackSettings': 'Speech controls', 'tts.rate': 'Speed (×)', 'tts.volume': 'Volume (%)',\n 'tts.rateHint': 'MOSS playback speed also changes pitch.',\n 'tts.advanced': 'Advanced MOSS settings', 'tts.segmentPauseMs': 'Pause between segments (ms)', 'tts.chunkTokens': 'Text per segment (tokens)',\n 'tts.seed': 'Random seed', 'tts.autoSeed': 'Automatic',\n 'tts.advancedHint': 'These settings apply to MOSS. Pause is inserted between generated segments. Shorter segments may reduce coherence.',\n 'tts.seedHint': 'Leave empty for automatic randomness. Use the same seed, text and voice to compare generated speech.',\n 'tts.parametersHint': 'Preview uses the values above. Save them to apply to assistant speech; changing the voice keeps these settings.',\n 'tts.saveParameters': 'Save speech controls', 'tts.resetParameters': 'Restore and save defaults',\n}\nexport const zh: Record<keyof typeof en, string> = {\n 'tts.wizardPrepareResources': '准备语音资源', 'tts.wizardDraftReady': '语音资源已就绪,配置保存后生效。',\n 'tts.prepare': '准备 MOSS 资源', 'tts.importDraft': '导入音色', 'tts.resetDraftParameters': '恢复默认值',\n 'tts.title': '音色设置', 'tts.description': '选择 MOSS 音色、试听,或从开放录音库导入参考声音。',\n 'tts.backend': '语音输出', 'tts.browser': '浏览器音色', 'tts.moss': '本地 MOSS ONNX',\n 'tts.setup': '初始化并使用 MOSS', 'tts.refresh': '刷新状态', 'tts.selected': '音色', 'tts.apply': '应用音色',\n 'tts.original': '试听参考音频', 'tts.preview': '试听音色', 'tts.stop': '停止试听',\n 'tts.previewText': '试听文本', 'tts.defaultText': '你好,我是你的助理。今天有什么需要我帮忙的?',\n 'tts.ready': 'MOSS 已就绪', 'tts.notReady': '初始化 MOSS 后可以应用或导入音色;语音运行环境会自动准备。',\n 'tts.wizardTitle': '初次语音配置', 'tts.wizardDescription': '使用推荐设置启用语音,无需填写任何配置。',\n 'tts.wizardChecking': '正在检查已有语音资源……', 'tts.wizardDefault': '中英双语识别',\n 'tts.wizardModel': '识别:{model}', 'tts.wizardVoice': '音色:{voice}',\n 'tts.wizardHint': '点击启用后才下载资源,运行环境自动准备;已有选择和已完成下载会保留。完成后点击“开始语音”授权麦克风。',\n 'tts.wizardEnable': '启用语音', 'tts.wizardPreparing': '正在准备……', 'tts.wizardRetry': '重试配置',\n 'tts.wizardRecognition': '正在准备语音识别……', 'tts.wizardSpeech': '正在准备本地播报……',\n 'tts.wizardReady': '语音已就绪', 'tts.wizardListen': '试听声音', 'tts.wizardAdvanced': '高级声音设置',\n 'tts.site': '开放音色库', 'tts.openSite': '打开网站', 'tts.import': '导入并应用',\n 'tts.openRecordings': '查看可导入录音目录',\n 'tts.source': '录音 ID 或文件网址', 'tts.name': '名称(可选)', 'tts.language': '语言', 'tts.gender': '性别',\n 'tts.sourceHint': '使用 2~30 秒的 WAV/FLAC 参考录音;不支持其他模型专用的音色嵌入。',\n 'tts.kyutaiHint': '示例:kyutai:voice-donations/0a67.wav;支持 CC0/CC BY 4.0 来源。',\n 'tts.aishellHint': '示例:aishell:SSB00050001;也可粘贴 Hugging Face 中单个音频文件的网址。',\n 'tts.license': '许可:{license}', 'tts.sourceLink': '音色来源', 'tts.remove': '移除导入音色',\n 'tts.male': '男声', 'tts.female': '女声', 'tts.unknown': '未标注',\n 'tts.zh': '中文', 'tts.en': '英语', 'tts.ja': '日语', 'tts.fr': '法语',\n 'tts.originalHint': '内置预设由官方参考编码还原,导入音色播放原始录音;实际生成效果请使用“试听音色”。',\n 'tts.loadError': '参考录音播放失败,请检查网络或重新导入。',\n 'tts.busy': '正在处理……', 'tts.saved': '音色设置已保存。',\n 'tts.playbackSettings': '播报控制', 'tts.rate': '语速(倍)', 'tts.volume': '音量(%)',\n 'tts.rateHint': 'MOSS 播放变速会同时改变音高。',\n 'tts.advanced': 'MOSS 高级设置', 'tts.segmentPauseMs': '分段停顿(毫秒)', 'tts.chunkTokens': '单段文本长度(token)',\n 'tts.seed': '随机种子', 'tts.autoSeed': '自动随机',\n 'tts.advancedHint': '以下设置仅影响 MOSS。停顿加在生成的文本分段之间;分段过短可能影响语音连贯性。',\n 'tts.seedHint': '留空自动随机;固定种子配合同一文本和音色,便于比较生成效果。',\n 'tts.parametersHint': '合成试听使用当前数值,保存后应用于助理播报;切换音色会保留这些设置。',\n 'tts.saveParameters': '保存播报设置', 'tts.resetParameters': '恢复并保存默认值',\n}\n","/** 生命周期工作台文案;高级资源管理复用原有词典。 */\nexport const zh = {\n 'awb.notifications.title': '会话提醒', 'awb.notifications.hint': '在悬浮助理旁显示提醒,查看会话后标记已读。',\n 'awb.notifications.enabled': '启用会话提醒', 'awb.notifications.completed': '本轮完成', 'awb.notifications.error': '运行出错',\n 'awb.notifications.question': '需要回答', 'awb.notifications.approval': '等待审批', 'awb.notifications.questionTag': '问题', 'awb.notifications.approvalTag': '权限请求',\n 'awb.notifications.autoClose': '通知自动关闭', 'awb.notifications.autoCloseHint': '启用后,失败、提问与审批的气泡在设定时间后自动收起;完成提示始终固定 10 秒关闭。未读记录仍会保留。',\n 'awb.notifications.autoCloseDuration': '自动关闭时间', 'awb.notifications.autoCloseDurationHint': '选择气泡自动收起的时间。', 'awb.notifications.seconds': '秒',\n 'awb.notifications.open': '查看会话', 'awb.notifications.dismiss': '收起提醒', 'awb.notifications.list': '提醒列表',\n 'awb.notifications.unread': '{count} 条未读', 'awb.notifications.pending': '{count} 项待处理',\n 'awb.notifications.empty': '暂无提醒', 'awb.notifications.next': '下一页', 'awb.notifications.previous': '上一页',\n 'awb.notifications.closeList': '关闭提醒列表', 'awb.notifications.disconnected': '远端暂不可达', 'awb.notifications.expired': '提醒已失效',\n 'awb.notifications.actionUnavailable': '通知操作暂不可用,请重试',\n 'awb.call.title': '实时语音', 'awb.call.connecting': '正在连接…', 'awb.call.ending': '正在结束通话…',\n 'awb.call.minimize': '收起通话', 'awb.call.restore': '恢复实时对话', 'awb.call.silent': '声音已关闭', 'awb.call.error': '通话异常,请点击查看',\n 'awb.call.listening': '正在听你说', 'awb.call.thinking': '正在准备回复', 'awb.call.speaking': '正在回复', 'awb.call.muted': '麦克风已静音',\n 'awb.call.caption': '实时字幕', 'awb.call.waiting': '说点什么吧', 'awb.call.microphone': '静音麦克风', 'awb.call.unmute': '开启麦克风',\n 'awb.call.speaker': '扬声器', 'awb.call.speakerSettings': '切换扬声器', 'awb.call.playSound': '播放声音',\n 'awb.call.defaultSpeaker': '系统默认扬声器', 'awb.call.outputDevice': '播放设备', 'awb.call.hangup': '挂断',\n 'awb.call.record': '语音沟通', 'awb.call.count': '{count} 条语句', 'awb.call.details': '语音沟通详情',\n 'awb.call.startedAt': '开始时间', 'awb.call.endedAt': '结束时间', 'awb.call.duration': '通话时长', 'awb.call.noMessages': '这次通话没有记录到语句。',\n 'awb.call.interrupted': '已打断', 'awb.call.tools': '能力调用记录', 'awb.call.noTools': '这次通话没有能力调用。',\n 'awb.call.workspace': '工作区能力', 'awb.call.webSearch': '联网搜索', 'awb.call.attachment': '附件读取',\n 'awb.call.tool.running': '进行中', 'awb.call.tool.completed': '已完成', 'awb.call.tool.failed': '失败', 'awb.call.tool.cancelled': '已取消',\n 'awb.call.arguments': '调用参数', 'awb.call.result': '返回结果', 'awb.call.toolDetails': '查看参数与结果',\n 'awb.preparationUnsupported': '当前 Host 不支持仅准备资源,请更新 Host 后再操作。',\n 'awb.title': '智能助理', 'awb.create': '创建助理', 'awb.configure': '配置', 'awb.chat': '对话', 'awb.close': '关闭',\n 'awb.name': '名称', 'awb.model': '对话模型', 'awb.defaultModel': '跟随 DSH 默认模型', 'awb.noModel': '没有可用模型,请先配置 DSH 模型',\n 'awb.setupTitle': '创建你的助理', 'awb.setupSubtitle': '设定身份与交流方式,让它成为你的日常伙伴。',\n 'awb.createStart': '创建并开始对话',\n 'awb.tab.basic': '基本信息', 'awb.tab.appearance': '形象管理', 'awb.tab.voice': '声音管理',\n 'awb.setupLater': '创建后,可以按需关联项目和设置声音。', 'awb.namePlaceholder': '给助理起个名字',\n 'awb.personality': '性格背景', 'awb.personalityPlaceholder': '例如:你是我的编程伙伴,性格温和、直说重点。熟悉软件开发,回答清楚自然,遇到不确定的信息会先说明。',\n 'awb.personalityPreview': '设定它的性格、背景与交流习惯。', 'awb.unnamed': '你的助理', 'awb.capabilities': '项目与声音',\n 'awb.workspaces': '关联项目', 'awb.scopeHint': '只读取勾选项目中的可见会话;不选择项目也可以普通交流。',\n 'awb.offlineWorkspace': '暂不可用的项目:{id}', 'awb.workspaceColumn': '工作区', 'awb.workspaceCountColumn': '会话数', 'awb.workspacePathColumn': '路径', 'awb.workspaceHostColumn': '所属 HOST', 'awb.workspaceHost': 'HOST:{host}', 'awb.avatar': '形象', 'awb.voice': '声音', 'awb.browserVoice': '浏览器默认声音',\n 'awb.mossSetupHint': '当前可使用浏览器声音。需要本地音色时,可在此页安装 MOSS。',\n 'awb.more': '更多设置',\n 'awb.moreHint': '所有配置点击「保存配置」后生效。',\n 'awb.save': '保存配置', 'awb.cancel': '取消',\n 'awb.placeholder': '发送消息…', 'awb.empty': '你好,今天想聊些什么?', 'awb.send': '发送', 'awb.stop': '停止回复',\n 'awb.state.thinking': '思考中', 'awb.state.updating': '认知更新', 'awb.state.idle': '空闲', 'awb.state.working': '工作中',\n 'awb.voiceUnavailable': '声音尚未就绪,请在声音管理中配置。',\n 'awb.attachments.add': '添加附件', 'awb.attachments.remove': '移除附件:{name}', 'awb.attachments.unnamed': '附件',\n 'awb.attachments.prompt': '请查看我发送的附件。',\n 'awb.attachments.countError': '最多添加 6 个附件。', 'awb.attachments.sizeError': '单个附件不超过 10 MiB,总大小不超过 20 MiB。',\n 'awb.attachments.typeError': '图片支持 PNG、JPEG、WebP 和 GIF,请转换后添加。',\n 'awb.command.clear': '清理对话,保留助理配置', 'awb.command.attachmentsError': '清理指令不能携带附件,请先移除附件。',\n 'awb.maintenance': '对话维护', 'awb.compress': '压缩对话', 'awb.clear': '清理对话', 'awb.reset': '重置助理',\n 'awb.clearConfirm': '清理后会删除助理的消息和交流摘要。关联项目与助理配置会保留。',\n 'awb.resetConfirm': '重置后会删除助理配置、对话和派生索引,并返回创建界面。原始项目会话和下载素材会保留。',\n 'awb.resetFinalTitle': '再次确认重置', 'awb.resetContinue': '继续重置', 'awb.resetFinalAction': '确认重置',\n 'awb.resetFinalConfirm': '确定要重置助理吗?助理配置、对话和派生索引将被清空,无法从此界面撤销。原始项目会话和下载素材会保留。',\n 'awb.confirm': '确认', 'awb.busy': '处理中…', 'awb.loading': '正在读取助理…', 'awb.retry': '重试',\n 'awb.summary': '历史交流摘要', 'awb.saved': '配置已保存', 'awb.compressed': '对话已压缩,保留最近三轮', 'awb.cleared': '对话已清理',\n 'awb.index.ready': '项目认知已就绪', 'awb.index.pending': '项目认知更新中', 'awb.index.empty': '未关联项目',\n 'awb.disabled': '启用此功能后即可创建与使用助理。', 'awb.open': '打开智能助理', 'awb.initial': '创建一位助理,把项目认知、文字、语音和形象放在一起。',\n 'awb.asr': '语音识别模型', 'awb.devices': '音频设备', 'awb.prompts': '提示词', 'awb.unavailableSelection': '原选择暂不可用:{id}',\n}\nexport const en: Record<keyof typeof zh, string> = {\n 'awb.notifications.title': 'Session notices', 'awb.notifications.hint': 'Show notices beside the floating assistant. Viewing a session marks its notice as read.',\n 'awb.notifications.enabled': 'Enable session notices', 'awb.notifications.completed': 'Turn completed', 'awb.notifications.error': 'Run failed',\n 'awb.notifications.question': 'Answer needed', 'awb.notifications.approval': 'Approval needed', 'awb.notifications.questionTag': 'Question', 'awb.notifications.approvalTag': 'Permission request',\n 'awb.notifications.autoClose': 'Auto-close notices', 'awb.notifications.autoCloseHint': 'When enabled, failure, question and approval notices collapse after the selected time; completion notices always close after 10 seconds. Unread records remain available.',\n 'awb.notifications.autoCloseDuration': 'Auto-close time', 'awb.notifications.autoCloseDurationHint': 'Choose when the bubble is collapsed.', 'awb.notifications.seconds': ' seconds',\n 'awb.notifications.open': 'View session', 'awb.notifications.dismiss': 'Collapse notice', 'awb.notifications.list': 'Notice list',\n 'awb.notifications.unread': '{count} unread', 'awb.notifications.pending': '{count} pending',\n 'awb.notifications.empty': 'No notices', 'awb.notifications.next': 'Next page', 'awb.notifications.previous': 'Previous page',\n 'awb.notifications.closeList': 'Close notice list', 'awb.notifications.disconnected': 'Remote host unavailable', 'awb.notifications.expired': 'Notice expired',\n 'awb.notifications.actionUnavailable': 'Notice action is unavailable. Please try again.',\n 'awb.call.title': 'Live voice', 'awb.call.connecting': 'Connecting…', 'awb.call.ending': 'Ending call…',\n 'awb.call.minimize': 'Minimize call', 'awb.call.restore': 'Restore live conversation', 'awb.call.silent': 'Speaker muted', 'awb.call.error': 'Call error; click to view',\n 'awb.call.listening': 'Listening', 'awb.call.thinking': 'Preparing a reply', 'awb.call.speaking': 'Speaking', 'awb.call.muted': 'Microphone muted',\n 'awb.call.caption': 'Live captions', 'awb.call.waiting': 'Say something', 'awb.call.microphone': 'Mute microphone', 'awb.call.unmute': 'Unmute microphone',\n 'awb.call.speaker': 'Speaker', 'awb.call.speakerSettings': 'Choose speaker', 'awb.call.playSound': 'Play audio',\n 'awb.call.defaultSpeaker': 'System default speaker', 'awb.call.outputDevice': 'Output device', 'awb.call.hangup': 'End call',\n 'awb.call.record': 'Voice conversation', 'awb.call.count': '{count} utterances', 'awb.call.details': 'Voice conversation details',\n 'awb.call.startedAt': 'Started', 'awb.call.endedAt': 'Ended', 'awb.call.duration': 'Duration', 'awb.call.noMessages': 'No utterances were recorded in this call.',\n 'awb.call.interrupted': 'Interrupted', 'awb.call.tools': 'Capability calls', 'awb.call.noTools': 'No capabilities were called in this conversation.',\n 'awb.call.workspace': 'Workspace capability', 'awb.call.webSearch': 'Web search', 'awb.call.attachment': 'Attachment read',\n 'awb.call.tool.running': 'Running', 'awb.call.tool.completed': 'Completed', 'awb.call.tool.failed': 'Failed', 'awb.call.tool.cancelled': 'Cancelled',\n 'awb.call.arguments': 'Arguments', 'awb.call.result': 'Result', 'awb.call.toolDetails': 'View arguments and result',\n 'awb.preparationUnsupported': 'This Host does not support preparing resources without applying settings. Update the Host before proceeding.',\n 'awb.title': 'Assistant', 'awb.create': 'Create assistant', 'awb.configure': 'Configure', 'awb.chat': 'Chat', 'awb.close': 'Close',\n 'awb.name': 'Name', 'awb.model': 'Chat model', 'awb.defaultModel': 'Follow DSH default model', 'awb.noModel': 'No available model. Configure a DSH model first.',\n 'awb.setupTitle': 'Create your assistant', 'awb.setupSubtitle': 'Give your everyday companion an identity and a way to communicate.',\n 'awb.createStart': 'Create and start chatting',\n 'awb.tab.basic': 'Basic information', 'awb.tab.appearance': 'Appearance management', 'awb.tab.voice': 'Voice management',\n 'awb.setupLater': 'You can connect projects and choose voices after creation.', 'awb.namePlaceholder': 'Give your assistant a name',\n 'awb.personality': 'Personality and background', 'awb.personalityPlaceholder': 'For example: You are my programming companion, patient and direct. You understand software development, communicate clearly, and acknowledge uncertainty.',\n 'awb.personalityPreview': 'Describe its personality, background, and communication style.', 'awb.unnamed': 'Your assistant', 'awb.capabilities': 'Projects and voices',\n 'awb.workspaces': 'Projects', 'awb.scopeHint': 'Only visible sessions in selected projects are readable. You can chat without selecting projects.',\n 'awb.offlineWorkspace': 'Unavailable project: {id}', 'awb.workspaceColumn': 'Workspace', 'awb.workspaceCountColumn': 'Sessions', 'awb.workspacePathColumn': 'Path', 'awb.workspaceHostColumn': 'PeerHost', 'awb.workspaceHost': 'HOST: {host}', 'awb.avatar': 'Appearance', 'awb.voice': 'Voice', 'awb.browserVoice': 'Browser default voice',\n 'awb.mossSetupHint': 'Browser speech is available. Install MOSS on this page to use local voices.',\n 'awb.more': 'More settings',\n 'awb.moreHint': 'All settings apply after you save the configuration.',\n 'awb.save': 'Save configuration', 'awb.cancel': 'Cancel',\n 'awb.placeholder': 'Send a message…', 'awb.empty': 'Hello, what would you like to talk about?', 'awb.send': 'Send', 'awb.stop': 'Stop reply',\n 'awb.state.thinking': 'Thinking', 'awb.state.updating': 'Updating knowledge', 'awb.state.idle': 'Idle', 'awb.state.working': 'Working',\n 'awb.voiceUnavailable': 'Voice is not ready. Configure it in Voice management.',\n 'awb.attachments.add': 'Add attachments', 'awb.attachments.remove': 'Remove attachment: {name}', 'awb.attachments.unnamed': 'Attachment',\n 'awb.attachments.prompt': 'Please review the attachments I sent.',\n 'awb.attachments.countError': 'Add up to 6 attachments.', 'awb.attachments.sizeError': 'Each attachment may be up to 10 MiB, with a total of 20 MiB.',\n 'awb.attachments.typeError': 'Images support PNG, JPEG, WebP, and GIF. Convert this image before adding it.',\n 'awb.command.clear': 'Clear conversation and keep assistant settings', 'awb.command.attachmentsError': 'A clear command cannot include attachments. Remove them first.',\n 'awb.maintenance': 'Conversation maintenance', 'awb.compress': 'Compress conversation', 'awb.clear': 'Clear conversation', 'awb.reset': 'Reset assistant',\n 'awb.clearConfirm': 'This deletes assistant messages and their summary. Project scope and assistant settings are kept.',\n 'awb.resetConfirm': 'This deletes assistant settings, conversation, and derived indexes, then returns to creation. Original project sessions and downloaded assets are kept.',\n 'awb.resetFinalTitle': 'Confirm reset again', 'awb.resetContinue': 'Continue reset', 'awb.resetFinalAction': 'Confirm reset',\n 'awb.resetFinalConfirm': 'Reset your assistant? Settings, conversation, and derived indexes will be cleared and cannot be restored from this page. Original project sessions and downloaded assets are kept.',\n 'awb.confirm': 'Confirm', 'awb.busy': 'Working…', 'awb.loading': 'Reading assistant…', 'awb.retry': 'Retry',\n 'awb.summary': 'Conversation summary', 'awb.saved': 'Configuration saved', 'awb.compressed': 'Conversation compressed; the latest three turns are kept', 'awb.cleared': 'Conversation cleared',\n 'awb.index.ready': 'Project knowledge ready', 'awb.index.pending': 'Updating project knowledge', 'awb.index.empty': 'No projects selected',\n 'awb.disabled': 'Enable this feature to create and use your assistant.', 'awb.open': 'Open assistant', 'awb.initial': 'Create an assistant with project knowledge, text, voice, and an appearance in one place.',\n 'awb.asr': 'Speech recognition models', 'awb.devices': 'Audio devices', 'awb.prompts': 'Prompts', 'awb.unavailableSelection': 'Previous selection unavailable: {id}',\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","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 assistantDebugDictionary from './locales/assistantDebug.js'\nimport * as assistantAvatarDictionary from './locales/assistantAvatar.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 voiceModelsDictionary from './locales/voiceModels.js'\nimport * as assistantTtsDictionary from './locales/assistantTts.js'\nimport * as assistantWorkbenchDictionary from './locales/assistantWorkbench.js'\nimport * as subagentCollapsedDictionary from './locales/subagentCollapsed.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.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.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.assistant.label': 'Global smart assistant (Testing)',\n 'feature.assistant.description': 'Summarize progress across selected workspaces and route voice or text instructions to an explicit target session. After enabling this module, fully quit and restart DSH Desktop.',\n 'voice.globalAssistant': 'Global voice assistant (Testing)',\n 'voice.audioNotice': 'Audio is processed by the configured local or cloud voice provider.',\n 'voice.emptyTranscript': 'No usable speech was recognized; nothing was submitted. Please try again.',\n 'voice.invalidTranscript': 'The transcription was not valid, so nothing was submitted. Please say it again.',\n 'voice.secureContextRequired': 'Microphone access requires a secure browser context. Use HTTPS, WSS, or localhost and try again.',\n 'voice.microphoneNotice': 'Starting this control uses the microphone in this browser.',\n 'voice.microphoneUpdated': 'Microphone updated.',\n 'voice.inputDevice': 'Input device',\n 'voice.defaultMicrophone': 'Browser default microphone',\n 'voice.unnamedMicrophone': 'Unnamed microphone',\n 'voice.outputDevice': 'Output device',\n 'voice.defaultOutput': 'Browser/OS default output',\n 'voice.unnamedOutput': 'Unnamed output',\n 'voice.outputUpdated': 'Output device updated.',\n 'voice.dialog.title': 'Global voice assistant (Testing)',\n 'voice.dialog.description': 'Start when you are ready. Recognized speech and assistant replies appear here in real time.',\n 'voice.dialog.realtimeHint': 'Realtime recognition with LLM follow-up conversations. Brief replies use the same project index and model as text debugging.',\n 'voice.dialog.unavailable': 'Realtime Sherpa-ONNX is unavailable. Check the local runtime and model configuration; fallback transcription is disabled.',\n 'voice.dialog.liveText': 'Conversation',\n 'voice.dialog.user': 'You',\n 'voice.dialog.assistant': 'Global assistant',\n 'voice.dialog.empty': 'Nothing recognized yet.',\n 'voice.dialog.start': 'Start realtime conversation',\n 'voice.dialog.stop': 'Stop conversation',\n 'voice.dialog.close': 'Close',\n 'voice.dialog.clear': 'Clear conversation',\n 'voice.dialog.status.loading': 'Preparing microphone…',\n 'voice.dialog.status.listening': 'Listening',\n 'voice.dialog.status.thinking': 'Thinking',\n 'voice.dialog.status.speaking': 'Speaking',\n 'voice.dialog.status.recording': 'Recording',\n 'voice.dialog.status.error': 'Error',\n 'voice.dialog.status.active': 'Active',\n 'voice.dialog.status.idle': 'Idle',\n 'voice.setup.open': 'Configure voice assistant (Testing)',\n 'voice.setup.title': 'Voice model management (Testing)',\n 'voice.setup.description': 'Choose a recommended realtime model. CodingNS will download and initialize it automatically.',\n 'voice.setup.onlyRealtime': 'Only streaming models that support realtime conversation are shown. Files are stored on the current Host and reused after download.',\n 'voice.setup.model': 'Realtime voice model',\n 'voice.setup.modelRequired': 'Choose a realtime voice model.',\n 'voice.setup.downloadHint': 'The first setup downloads the model and configures the runtime. You will not need to enter file paths.',\n 'voice.setup.downloading': 'Downloading and initializing the model. Keep this window open…',\n 'voice.setup.checking': 'Checking local model files…',\n 'voice.setup.downloadFile': 'Downloading file ({index}/{count})',\n 'voice.setup.fileProgress': 'Current file download progress',\n 'voice.setup.filePercent': 'Current file: {percent}%',\n 'voice.setup.downloadedSize': '{size} downloaded',\n 'voice.setup.initializing': 'Model downloaded. Initializing…',\n 'voice.setup.completed': 'Initialization complete',\n 'voice.setup.provider': 'Voice provider',\n 'voice.setup.provider.dsh': 'DSH speechToText(browser hold-to-speak)',\n 'voice.setup.provider.sherpa': 'Sherpa-ONNX(local realtime)',\n 'voice.setup.providerDshHint': 'This mode uses the Host speechToText provider for sentence transcription and browser speech synthesis for replies. No local Sherpa model is required.',\n 'voice.setup.modelHint': 'Enter absolute paths to the Sherpa-ONNX model files on the Host machine.',\n 'voice.setup.asrEncoder': 'ASR encoder model',\n 'voice.setup.asrDecoder': 'ASR decoder model',\n 'voice.setup.asrJoiner': 'ASR joiner model',\n 'voice.setup.asrTokens': 'ASR tokens file',\n 'voice.setup.vadModel': 'VAD model(optional)',\n 'voice.setup.ttsModel': 'TTS model(optional)',\n 'voice.setup.ttsTokens': 'TTS tokens(optional)',\n 'voice.setup.ttsLexicon': 'TTS lexicon(optional)',\n 'voice.setup.optional': 'Optional; leave empty to disable',\n 'voice.setup.required': 'Sherpa-ONNX requires encoder, decoder, joiner, and tokens paths.',\n 'voice.setup.cancel': 'Cancel',\n 'voice.setup.save': 'Download and initialize',\n 'voice.setup.reconfigure': 'Manage models',\n 'voice.setup.status.uninitialized': 'Not initialized; the assistant button opens setup instead of starting voice.',\n 'voice.setup.status.dsh': 'DSH speechToText sentence transcription with browser speech synthesis.',\n 'voice.setup.status.sherpa': 'Sherpa-ONNX local realtime mode.',\n 'assistant.scopeDescription': 'Only selected workspaces are readable by the global assistant. Archived sessions are always excluded.',\n 'assistant.noWorkspaces': 'No workspaces are available in this Host.',\n 'assistant.saved': 'Assistant scope saved.',\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.',\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.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 '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.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.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.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.assistant.label': '全局智能助理(测试中)',\n 'feature.assistant.description': '汇总受管工作区进展,并把语音或文字指令派发到明确的目标会话。启用该模块后,请彻底重启 DSH Desktop。',\n 'voice.globalAssistant': '全局语音助理(测试中)',\n 'voice.audioNotice': '音频会交给当前配置的本地或云端语音提供方处理。',\n 'voice.emptyTranscript': '未识别到有效语音,未提交内容;请重试。',\n 'voice.invalidTranscript': '转写结果无效,未提交内容;请重新说一遍。',\n 'voice.secureContextRequired': '麦克风需要浏览器安全上下文,请改用 HTTPS、WSS 或 localhost 后重试。',\n 'voice.microphoneNotice': '启动此入口会使用当前浏览器的麦克风。',\n 'voice.microphoneUpdated': '麦克风已更新。',\n 'voice.inputDevice': '输入设备',\n 'voice.defaultMicrophone': '浏览器默认麦克风',\n 'voice.unnamedMicrophone': '未命名麦克风',\n 'voice.outputDevice': '输出设备',\n 'voice.defaultOutput': '浏览器/系统默认输出',\n 'voice.unnamedOutput': '未命名输出设备',\n 'voice.outputUpdated': '输出设备已更新。',\n 'voice.dialog.title': '全局语音助理(测试中)',\n 'voice.dialog.description': '点击开始后说话,识别文字和助理回复会实时显示在这里。',\n 'voice.dialog.realtimeHint': '支持连续追问,沿用文字调试的项目索引和模型,简短回复并播报。',\n 'voice.dialog.unavailable': 'Sherpa-ONNX 实时模式不可用,请检查本地运行时和模型配置;已禁用回退转写。',\n 'voice.dialog.liveText': '实时对话',\n 'voice.dialog.user': '你',\n 'voice.dialog.assistant': '全局助理',\n 'voice.dialog.empty': '暂时还没有识别文字。',\n 'voice.dialog.start': '开始实时对话',\n 'voice.dialog.stop': '停止对话',\n 'voice.dialog.close': '关闭',\n 'voice.dialog.clear': '清空对话',\n 'voice.dialog.status.loading': '正在准备麦克风……',\n 'voice.dialog.status.listening': '正在聆听',\n 'voice.dialog.status.thinking': '正在思考',\n 'voice.dialog.status.speaking': '正在播报',\n 'voice.dialog.status.recording': '正在录音',\n 'voice.dialog.status.error': '出错',\n 'voice.dialog.status.active': '运行中',\n 'voice.dialog.status.idle': '未启动',\n 'voice.setup.open': '配置语音助理(测试中)',\n 'voice.setup.title': '语音模型管理(测试中)',\n 'voice.setup.description': '选择一个推荐的实时模型,系统会自动下载并完成初始化。',\n 'voice.setup.onlyRealtime': '这里只显示支持实时对话的流式语音模型。模型文件保存在当前 Host,已下载的文件会自动复用。',\n 'voice.setup.model': '实时语音模型',\n 'voice.setup.modelRequired': '请选择一个实时语音模型。',\n 'voice.setup.downloadHint': '首次使用会自动下载模型并配置运行时,之后无需再次填写路径。',\n 'voice.setup.downloading': '正在下载并初始化模型,请保持此窗口打开……',\n 'voice.setup.checking': '正在检查本地模型文件……',\n 'voice.setup.downloadFile': '正在下载文件({index}/{count})',\n 'voice.setup.fileProgress': '当前文件下载进度',\n 'voice.setup.filePercent': '当前文件:{percent}%',\n 'voice.setup.downloadedSize': '已下载 {size}',\n 'voice.setup.initializing': '模型已下载,正在初始化……',\n 'voice.setup.completed': '初始化完成',\n 'voice.setup.provider': '语音提供商',\n 'voice.setup.provider.dsh': 'DSH speechToText(浏览器按住说话)',\n 'voice.setup.provider.sherpa': 'Sherpa-ONNX(本地实时模式)',\n 'voice.setup.providerDshHint': '此模式使用 Host 的 speechToText 进行句级转写,并使用浏览器 speechSynthesis 播报回复,不需要本地 Sherpa 模型。',\n 'voice.setup.modelHint': '请输入 Host 机器上的 Sherpa-ONNX 模型文件绝对路径。',\n 'voice.setup.asrEncoder': 'ASR encoder 模型',\n 'voice.setup.asrDecoder': 'ASR decoder 模型',\n 'voice.setup.asrJoiner': 'ASR joiner 模型',\n 'voice.setup.asrTokens': 'ASR tokens 文件',\n 'voice.setup.vadModel': 'VAD 模型(可选)',\n 'voice.setup.ttsModel': 'TTS 模型(可选)',\n 'voice.setup.ttsTokens': 'TTS tokens(可选)',\n 'voice.setup.ttsLexicon': 'TTS lexicon(可选)',\n 'voice.setup.optional': '可选;留空表示禁用',\n 'voice.setup.required': 'Sherpa-ONNX 必须填写 encoder、decoder、joiner 和 tokens 路径。',\n 'voice.setup.cancel': '取消',\n 'voice.setup.save': '下载并初始化',\n 'voice.setup.reconfigure': '管理模型',\n 'voice.setup.status.uninitialized': '尚未初始化;点击助手按钮只打开配置页,不会直接启动语音。',\n 'voice.setup.status.dsh': '使用 DSH speechToText 句级转写和浏览器语音播报。',\n 'voice.setup.status.sherpa': '使用 Sherpa-ONNX 本地实时模式。',\n 'assistant.scopeDescription': '全局助理只读取已勾选的工作区,已归档会话始终排除。',\n 'assistant.noWorkspaces': '当前 Host 没有可选工作区。',\n 'assistant.saved': '助理受管范围已保存。',\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.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 '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.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 ...assistantAvatarDictionary.en,\n ...assistantDebugDictionary.en,\n ...gitDictionary.en,\n ...debugDictionary.en,\n ...peerHostDictionary.en,\n ...peerHostWorkspaceDictionary.en,\n ...usageDictionary.en,\n ...voiceModelsDictionary.en,\n ...assistantTtsDictionary.en,\n ...assistantWorkbenchDictionary.en,\n ...fileWorkspaceDictionary.en,\n ...terminalAuthDictionary.en,\n ...panelsDictionary.en,\n ...subagentCollapsedDictionary.en,\n}\n\nconst zh: Record<string, string> = {\n ...CORE_ZH,\n ...assistantAvatarDictionary.zh,\n ...assistantDebugDictionary.zh,\n ...gitDictionary.zh,\n ...debugDictionary.zh,\n ...peerHostDictionary.zh,\n ...peerHostWorkspaceDictionary.zh,\n ...usageDictionary.zh,\n ...voiceModelsDictionary.zh,\n ...assistantTtsDictionary.zh,\n ...assistantWorkbenchDictionary.zh,\n ...fileWorkspaceDictionary.zh,\n ...terminalAuthDictionary.zh,\n ...panelsDictionary.zh,\n ...subagentCollapsedDictionary.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 { 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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.transport.js","names":["en","zh","zh","en","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","en","zh","zh","en","zh","en","assistantAvatarDictionary.en","assistantDebugDictionary.en","gitDictionary.en","debugDictionary.en","peerHostDictionary.en","peerHostWorkspaceDictionary.en","usageDictionary.en","voiceModelsDictionary.en","assistantTtsDictionary.en","assistantWorkbenchDictionary.en","fileWorkspaceDictionary.en","terminalAuthDictionary.en","panelsDictionary.en","subagentCollapsedDictionary.en","assistantAvatarDictionary.zh","assistantDebugDictionary.zh","gitDictionary.zh","debugDictionary.zh","peerHostDictionary.zh","peerHostWorkspaceDictionary.zh","usageDictionary.zh","voiceModelsDictionary.zh","assistantTtsDictionary.zh","assistantWorkbenchDictionary.zh","fileWorkspaceDictionary.zh","terminalAuthDictionary.zh","panelsDictionary.zh","subagentCollapsedDictionary.zh","useMemo"],"sources":["../../../../src/client/locales/debug.ts","../../../../src/client/locales/assistantDebug.ts","../../../../src/client/locales/assistantAvatar.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/voiceModels.ts","../../../../src/client/locales/assistantTts.ts","../../../../src/client/locales/assistantWorkbench.ts","../../../../src/client/locales/subagentCollapsed.ts","../../../../src/client/locale.ts","../../../../src/shared/contracts/transport.ts"],"sourcesContent":["/**\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","/** 全局助理调试页词典;状态名与 JSON 只在明确的调试区域展示。 */\nexport const zh: Record<string, string> = {\n 'assistant.debug.open': '全局项目状态调试',\n 'assistant.debug.title': '全局助理管理状态调试',\n 'assistant.debug.description': '独立检查工作区范围、会话状态和文字指令,无需启动语音。',\n 'assistant.debug.refresh': '强制刷新状态',\n 'assistant.debug.loading': '正在读取最新状态…',\n 'assistant.debug.close': '关闭调试',\n 'assistant.debug.scope': '管理范围',\n 'assistant.debug.scopeHint': '勾选后允许助理读取和派发该工作区的会话;归档会话始终排除。',\n 'assistant.debug.missingWorkspace': '当前列表中不可用',\n 'assistant.debug.overview': '索引版本 {generation} · 纳入 {included} · 排除 {excluded} · 摘要读取失败 {unreadable}',\n 'assistant.debug.updated': '状态更新时间:{time}',\n 'assistant.debug.model': '当前语音模型:{model}',\n 'assistant.debug.noModel': '尚未配置',\n 'assistant.debug.sessions': '受管会话',\n 'assistant.debug.noSessions': '没有纳入索引的会话,请先检查管理范围。',\n 'assistant.debug.excluded': '排除的会话',\n 'assistant.debug.noExcluded': '没有可见的排除记录。',\n 'assistant.debug.archived': '已归档',\n 'assistant.debug.outsideScope': '工作区未纳入管理',\n 'assistant.debug.summary': '完整进展汇总',\n 'assistant.debug.noSummary': '没有可读取的会话正文摘要。',\n 'assistant.debug.untitled': '未命名会话',\n 'assistant.debug.status.waiting': '等待用户处理',\n 'assistant.debug.status.running': '运行中',\n 'assistant.debug.status.completed': '已完成',\n 'assistant.debug.status.error': '出错',\n 'assistant.debug.status.unknown': '状态未知',\n 'assistant.debug.waiting.approval': '等待审批',\n 'assistant.debug.waiting.question': '等待回答',\n 'assistant.debug.command': '文字指令调试',\n 'assistant.debug.commandHint': '预览只解析意图;执行会走当前助理逻辑,并可能向匹配的会话派发任务。',\n 'assistant.debug.commandPlaceholder': '例如:查询进展,或让某个会话检查登录问题',\n 'assistant.debug.preview': '预览意图',\n 'assistant.debug.execute': '执行文字指令',\n 'assistant.debug.result': '本次指令结果',\n 'assistant.debug.raw': '原始状态快照(JSON)',\n 'assistant.debug.sources': '数据来源与操作能力',\n 'assistant.debug.serviceState': '{service}:{state}',\n 'assistant.debug.service.workspaceList': '工作区列表',\n 'assistant.debug.service.sessionList': '会话列表',\n 'assistant.debug.service.summaryRead': '本地会话正文摘要读取',\n 'assistant.debug.service.taskDispatch': '本地任务派发',\n 'assistant.debug.service.remoteGateway': '远端 Host 汇聚与派发',\n 'assistant.debug.available': '已接入',\n 'assistant.debug.unavailable': '未接入',\n 'assistant.debug.warnings': '状态读取诊断',\n 'assistant.debug.workspaceCounts': '纳入 {included} 个会话 · 排除 {excluded} 个会话',\n 'assistant.debug.export': '下载状态快照',\n 'assistant.debug.stepsDescription': '选择项目 → 查看范围内会话 → 完成后自动索引 → 检查结果与记录 → 用 LLM 文字问答。',\n 'assistant.debug.steps': '调试步骤',\n 'assistant.debug.tab.scope': '1. 设置索引范围',\n 'assistant.debug.tab.sessions': '2. 范围内工作区和会话',\n 'assistant.debug.tab.result': '3. 当前索引结果',\n 'assistant.debug.tab.records': '4. 索引记录',\n 'assistant.debug.tab.chat': '5. LLM 文本对话',\n 'assistant.debug.rangeHelp': '勾选需要索引的工作区,选择会立即保存。归档会话始终排除;空闲会话自动索引,运行中的会话等待本轮完成。',\n 'assistant.debug.selectedCount': '已选择 {count} 个工作区',\n 'assistant.debug.scopeEmpty': '尚未选择工作区,请先设置索引范围。',\n 'assistant.debug.projectCount': '{name} · {count} 个未归档会话',\n 'assistant.debug.projectEmpty': '该工作区没有可见的未归档会话。',\n 'assistant.debug.sessionTitle': '{title} · {status}',\n 'assistant.debug.shortTitle': '未命名会话({id})',\n 'assistant.debug.viewRefresh': '刷新面板',\n 'assistant.debug.build': '执行索引',\n 'assistant.debug.indexing': '正在索引会话正文…',\n 'assistant.debug.indexState.not-built': '尚未建立索引,空闲会话将自动索引,也可点击“执行索引”。',\n 'assistant.debug.indexState.ready': '索引已生成,可用于 LLM 问答。',\n 'assistant.debug.indexState.stale': '有会话待更新,当前轮次结束后会自动增量索引。',\n 'assistant.debug.indexState.building': '正在构建新索引,请等待完成。',\n 'assistant.debug.indexState.incomplete': '索引尚不完整:运行中的会话等待完成,失败项可点击“执行索引”重试。',\n 'assistant.debug.indexTime': '索引时间 {time} · 第 {generation} 版',\n 'assistant.debug.quality': '索引 {total} 个会话 · 有正文 {read} · 无正文 {empty} · 状态未知 {unknown} · 读取失败 {failed}',\n 'assistant.debug.technical': '高级诊断(接口、排除记录和原始 JSON)',\n 'assistant.debug.excludedCount': '排除记录({count} 个)',\n 'assistant.debug.excludedRow': '{workspace} / {name} · {reason}',\n 'assistant.debug.recordsHelp': '保留本次 Host 运行期间最近 30 次实际索引。刷新面板不会触发索引;展开记录可查看每个会话的读取结果。',\n 'assistant.debug.noRecords': '暂无索引记录,等待会话完成后自动索引,也可点击“执行索引”。',\n 'assistant.debug.recordTitle': '{time} · {trigger} · {state}',\n 'assistant.debug.recordStats': '耗时 {duration} ms · 纳入 {included} · 排除 {excluded} · 读取失败 {failed}',\n 'assistant.debug.recordScope': '本次范围:{names}',\n 'assistant.debug.recordSession': '{workspace} / {name} · {result}',\n 'assistant.debug.recordState.running': '索引中',\n 'assistant.debug.recordState.completed': '已完成',\n 'assistant.debug.recordState.failed': '失败',\n 'assistant.debug.trigger.manual': '手动触发',\n 'assistant.debug.trigger.automatic': '助理自动触发',\n 'assistant.debug.readResult.read': '正文已读取',\n 'assistant.debug.readResult.empty': '没有可提取的正文',\n 'assistant.debug.readResult.failed': '正文读取失败',\n 'assistant.debug.chatHelp': '复用 DSH 已配置模型,基于当前索引进行多轮问答。本轮只回答项目状态问题,不派发任务。切换模型、范围或索引版本后重新开始对话。',\n 'assistant.debug.chatNeedsIndex': '等待当前范围内会话完成并自动更新索引后,再发送消息。',\n 'assistant.debug.chatGeneration': '本次对话依据第 {generation} 版索引',\n 'assistant.debug.chatModel': 'LLM 模型',\n 'assistant.debug.modelsLoading': '正在读取 DSH 模型列表…',\n 'assistant.debug.modelsEmpty': '没有可用的 DSH 原生 API 模型,请先在 DSH 模型设置中配置提供商和模型。',\n 'assistant.debug.chooseModel': '请选择 DSH 模型',\n 'assistant.debug.modelsRefresh': '刷新模型列表',\n 'assistant.debug.chatClear': '重新开始对话',\n 'assistant.debug.chatInput': '输入项目状态问题',\n 'assistant.debug.chatPlaceholder': '例如:这些项目分别在做什么?哪些会话需要我处理?',\n 'assistant.debug.chatEmpty': '先生成索引,再选择模型并发送问题。用户消息和 AI 回复会显示在这里。',\n 'assistant.debug.chatGenerating': 'LLM 正在回复…',\n 'assistant.debug.chatFailed': '本次回复失败,请查看错误信息。',\n 'assistant.debug.chatCancelled': '本次回复已停止。',\n 'assistant.debug.chatSend': '发送给 LLM',\n 'assistant.debug.chatStop': '停止回复',\n 'assistant.debug.chatRole.user': '你',\n 'assistant.debug.chatRole.assistant': '全局助理',\n 'assistant.debug.sharedModel': '索引总结与对话使用的 LLM 模型',\n 'assistant.debug.prompt.index': '索引总结前置提示词',\n 'assistant.debug.prompt.chat': '对话前置提示词',\n 'assistant.debug.promptHelp': '索引按固定结构提取事实、任务和证据。对话默认一到两句、100字以内,先说重点和处理动作,追问再展开。修改索引提示词后自动重建,运行中的会话仍等待完成;修改对话提示词只重新开始对话。保存空白值恢复默认。',\n 'assistant.debug.promptSave': '保存提示词',\n 'assistant.debug.promptDefault': '填入默认提示词',\n 'assistant.debug.analysisTitle': 'LLM 结构化会话索引',\n 'assistant.debug.analysisDeferred': '本批次已结束,部分会话等待本轮执行完成',\n 'assistant.debug.taskProgress': '会话索引:完成 {completed}/{total} · 复用 {reused} · 等待会话完成 {deferred} · 排队 {queued} · 运行 {running} · 失败或停止 {failed}',\n 'assistant.debug.taskHelp': '会话执行结束后自动增量索引,未变化结果直接复用;最多两个独立请求,单项90秒超时。',\n 'assistant.debug.taskReused': '沿用上次结果,本次未调用模型',\n 'assistant.debug.sessionVersion': '当前版本 {source} · 已索引版本 {indexed}',\n 'assistant.debug.sessionMaterialVersion': '索引材料版本 {source} · 已索引版本 {indexed}',\n 'assistant.debug.sessionStateHelp': '会话“已完成”表示本轮执行结束;索引状态独立显示,只有当前版本索引成功才标记“索引已完成”。',\n 'assistant.debug.sessionIndex.pending': '尚未索引',\n 'assistant.debug.sessionIndex.waiting': '等待本轮完成后索引',\n 'assistant.debug.sessionIndex.waiting-user': '等待用户处理后索引',\n 'assistant.debug.sessionIndex.waiting-status': '等待会话状态同步',\n 'assistant.debug.sessionIndex.queued': '索引排队中',\n 'assistant.debug.sessionIndex.running': '索引中',\n 'assistant.debug.sessionIndex.completed': '索引已完成',\n 'assistant.debug.sessionIndex.stale': '索引待更新',\n 'assistant.debug.sessionIndex.failed': '索引失败',\n 'assistant.debug.sessionIndex.cancelled': '索引已停止',\n 'assistant.debug.taskState.deferred': '等待会话完成',\n 'assistant.debug.taskRow': '{workspace} / {name} · {state}',\n 'assistant.debug.taskRaw': '{name}:模型原始输出(未校验)',\n 'assistant.debug.taskState.queued': '排队中',\n 'assistant.debug.taskState.running': '索引中',\n 'assistant.debug.taskState.completed': '已完成',\n 'assistant.debug.taskState.failed': '失败',\n 'assistant.debug.taskState.cancelled': '已停止',\n 'assistant.debug.thinking.disabled': '本次索引已传入关闭思考参数',\n 'assistant.debug.thinking.provider-default': '使用模型默认参数,未确认支持关闭思考',\n 'assistant.debug.thinking.pending': '尚未读取思考参数',\n 'assistant.debug.taskAttempt': '模型调用:{attempt}/{max} 次(含首次调用)',\n 'assistant.debug.taskPreviousAttempt': '前次模型调用:{attempt}/{max} 次(含首次调用)',\n 'assistant.debug.taskRetryWait': '等待自动重试:第 {attempt} 次调用,约 {seconds} 秒后开始',\n 'assistant.debug.modelRaw': '模型原始输出(尚未作为有效索引)',\n 'assistant.debug.sourceStatus': '来源运行状态:{status}(与历史工作进展分开记录)',\n 'assistant.debug.material.excerpt': '依据有限会话摘录,不代表完整历史',\n 'assistant.debug.material.unavailable': '没有可读取的正文',\n 'assistant.debug.field.objective': '工作目标',\n 'assistant.debug.field.progress': '已有进展与验证结果',\n 'assistant.debug.field.blockers': '当前阻碍',\n 'assistant.debug.field.pendingTasks': '已提出的待办',\n 'assistant.debug.field.nextActions': '下一步行动',\n 'assistant.debug.field.openQuestions': '需要补充的信息',\n 'assistant.debug.noEvidence': '暂无来源证据',\n 'assistant.debug.noQuestions': '未提出额外信息缺口',\n 'assistant.debug.evidence': '查看来源证据',\n 'assistant.debug.evidenceSource.title': '会话标题',\n 'assistant.debug.evidenceSource.summary': '正文摘录',\n 'assistant.debug.evidenceQuote': '{source}:{quote}',\n 'assistant.debug.actionTitle': '{kind} · {priority}优先级 · {action}',\n 'assistant.debug.actionReason': '依据:{reason}',\n 'assistant.debug.actionKind.recorded': '已有任务',\n 'assistant.debug.actionKind.suggested': '建议(未安排)',\n 'assistant.debug.priority.high': '高',\n 'assistant.debug.priority.normal': '普通',\n 'assistant.debug.priority.low': '低',\n 'assistant.debug.analysisModel': '总结模型:{provider} / {model}',\n 'assistant.debug.analysisRecord': 'LLM 总结:{provider} / {model} · {state} · {duration} ms',\n 'assistant.debug.analysisStop': '停止索引总结',\n 'assistant.debug.summarizing': '正在总结项目进展…',\n 'assistant.debug.analysisState.running': '正在生成总结…',\n 'assistant.debug.analysisState.completed': '总结已生成',\n 'assistant.debug.analysisState.failed': '总结失败,原始索引材料已保留',\n 'assistant.debug.analysisState.cancelled': '总结已停止,原始索引材料已保留',\n 'assistant.debug.rawEvidence': '以下是原始会话摘录,作为总结证据保留,不是 LLM 生成的进展判断。',\n}\n\nexport const en: Record<string, string> = {\n 'assistant.debug.open': 'Global project state debug',\n 'assistant.debug.title': 'Global assistant management debug',\n 'assistant.debug.description': 'Inspect workspace scope, session state and text commands without starting voice.',\n 'assistant.debug.refresh': 'Force refresh',\n 'assistant.debug.loading': 'Reading current state…',\n 'assistant.debug.close': 'Close debug',\n 'assistant.debug.scope': 'Managed scope',\n 'assistant.debug.scopeHint': 'Select workspaces to allow reading and dispatch. Archived sessions are always excluded.',\n 'assistant.debug.missingWorkspace': 'Unavailable in the current list',\n 'assistant.debug.overview': 'Index {generation} · Included {included} · Excluded {excluded} · Unreadable summaries {unreadable}',\n 'assistant.debug.updated': 'Updated: {time}',\n 'assistant.debug.model': 'Current voice model: {model}',\n 'assistant.debug.noModel': 'Not configured',\n 'assistant.debug.sessions': 'Managed sessions',\n 'assistant.debug.noSessions': 'No sessions are included. Check the managed scope first.',\n 'assistant.debug.excluded': 'Excluded sessions',\n 'assistant.debug.noExcluded': 'No visible excluded records.',\n 'assistant.debug.archived': 'Archived',\n 'assistant.debug.outsideScope': 'Workspace outside managed scope',\n 'assistant.debug.summary': 'Full progress summary',\n 'assistant.debug.noSummary': 'No readable session summary.',\n 'assistant.debug.untitled': 'Untitled session',\n 'assistant.debug.status.waiting': 'Waiting for user',\n 'assistant.debug.status.running': 'Running',\n 'assistant.debug.status.completed': 'Completed',\n 'assistant.debug.status.error': 'Error',\n 'assistant.debug.status.unknown': 'Unknown state',\n 'assistant.debug.waiting.approval': 'Waiting for approval',\n 'assistant.debug.waiting.question': 'Waiting for an answer',\n 'assistant.debug.command': 'Text command debug',\n 'assistant.debug.commandHint': 'Preview only parses intent. Execute runs the assistant logic and may dispatch to a matched session.',\n 'assistant.debug.commandPlaceholder': 'For example: query progress, or ask a session to check a login problem',\n 'assistant.debug.preview': 'Preview intent',\n 'assistant.debug.execute': 'Execute text command',\n 'assistant.debug.result': 'Command result',\n 'assistant.debug.raw': 'Raw state snapshot (JSON)',\n 'assistant.debug.sources': 'Data sources and operations',\n 'assistant.debug.serviceState': '{service}: {state}',\n 'assistant.debug.service.workspaceList': 'Workspace list',\n 'assistant.debug.service.sessionList': 'Session list',\n 'assistant.debug.service.summaryRead': 'Local session summary reading',\n 'assistant.debug.service.taskDispatch': 'Local task dispatch',\n 'assistant.debug.service.remoteGateway': 'Remote Host aggregation and dispatch',\n 'assistant.debug.available': 'Connected interface',\n 'assistant.debug.unavailable': 'Missing interface',\n 'assistant.debug.warnings': 'State reading diagnostics',\n 'assistant.debug.workspaceCounts': '{included} included sessions · {excluded} excluded sessions',\n 'assistant.debug.export': 'Download snapshot',\n 'assistant.debug.stepsDescription': 'Choose projects → Review sessions → Index automatically after completion → Inspect results and records → Chat with an LLM.',\n 'assistant.debug.steps': 'Debug steps',\n 'assistant.debug.tab.scope': '1. Index scope',\n 'assistant.debug.tab.sessions': '2. Workspaces and sessions',\n 'assistant.debug.tab.result': '3. Current index',\n 'assistant.debug.tab.records': '4. Index records',\n 'assistant.debug.tab.chat': '5. LLM text chat',\n 'assistant.debug.rangeHelp': 'Workspace selection is saved immediately. Archived sessions are excluded. Idle sessions are indexed automatically; running sessions wait for turn completion.',\n 'assistant.debug.selectedCount': '{count} workspaces selected',\n 'assistant.debug.scopeEmpty': 'Choose workspaces to define the index scope first.',\n 'assistant.debug.projectCount': '{name} · {count} unarchived sessions',\n 'assistant.debug.projectEmpty': 'No visible unarchived sessions in this workspace.',\n 'assistant.debug.sessionTitle': '{title} · {status}',\n 'assistant.debug.shortTitle': 'Untitled session ({id})',\n 'assistant.debug.viewRefresh': 'Refresh view',\n 'assistant.debug.build': 'Build index',\n 'assistant.debug.indexing': 'Indexing session content…',\n 'assistant.debug.indexState.not-built': 'No index yet. Idle sessions will be indexed automatically, or click Build index.',\n 'assistant.debug.indexState.ready': 'Index is ready for LLM chat.',\n 'assistant.debug.indexState.stale': 'Sessions have pending changes. Incremental indexing starts after their current turns finish.',\n 'assistant.debug.indexState.building': 'Building a new index. Please wait.',\n 'assistant.debug.indexState.incomplete': 'Index incomplete: running sessions wait for completion; click Build index to retry failures.',\n 'assistant.debug.indexTime': 'Indexed {time} · Version {generation}',\n 'assistant.debug.quality': '{total} sessions · {read} with content · {empty} without content · {unknown} unknown states · {failed} read failures',\n 'assistant.debug.technical': 'Advanced diagnostics (services, exclusions and JSON)',\n 'assistant.debug.excludedCount': 'Excluded records ({count})',\n 'assistant.debug.excludedRow': '{workspace} / {name} · {reason}',\n 'assistant.debug.recordsHelp': 'Last 30 index builds during this Host run. Refreshing the view does not build an index. Expand a record for per-session outcomes.',\n 'assistant.debug.noRecords': 'No records yet. Indexing starts after turn completion, or click Build index.',\n 'assistant.debug.recordTitle': '{time} · {trigger} · {state}',\n 'assistant.debug.recordStats': '{duration} ms · {included} included · {excluded} excluded · {failed} read failures',\n 'assistant.debug.recordScope': 'Scope: {names}',\n 'assistant.debug.recordSession': '{workspace} / {name} · {result}',\n 'assistant.debug.recordState.running': 'Indexing',\n 'assistant.debug.recordState.completed': 'Completed',\n 'assistant.debug.recordState.failed': 'Failed',\n 'assistant.debug.trigger.manual': 'Manual',\n 'assistant.debug.trigger.automatic': 'Assistant automatic',\n 'assistant.debug.readResult.read': 'Content read',\n 'assistant.debug.readResult.empty': 'No extractable content',\n 'assistant.debug.readResult.failed': 'Content read failed',\n 'assistant.debug.chatHelp': 'Use configured DSH models for multi-turn questions about the current index. This round is read-only and does not dispatch tasks. Changing model, scope or index resets the conversation.',\n 'assistant.debug.chatNeedsIndex': 'Wait for scoped sessions to finish and automatic indexing to complete before chatting.',\n 'assistant.debug.chatGeneration': 'Using index version {generation}',\n 'assistant.debug.chatModel': 'LLM model',\n 'assistant.debug.modelsLoading': 'Loading DSH models…',\n 'assistant.debug.modelsEmpty': 'No native DSH API models are available. Configure a provider and model in DSH model settings first.',\n 'assistant.debug.chooseModel': 'Choose a DSH model',\n 'assistant.debug.modelsRefresh': 'Refresh models',\n 'assistant.debug.chatClear': 'New conversation',\n 'assistant.debug.chatInput': 'Ask about project status',\n 'assistant.debug.chatPlaceholder': 'For example: What is each project working on? Which sessions need my attention?',\n 'assistant.debug.chatEmpty': 'Build an index, choose a model and send a question. Your messages and AI replies appear here.',\n 'assistant.debug.chatGenerating': 'LLM is replying…',\n 'assistant.debug.chatFailed': 'Reply failed. See the error below.',\n 'assistant.debug.chatCancelled': 'Reply stopped.',\n 'assistant.debug.chatSend': 'Send to LLM',\n 'assistant.debug.chatStop': 'Stop reply',\n 'assistant.debug.chatRole.user': 'You',\n 'assistant.debug.chatRole.assistant': 'Global assistant',\n 'assistant.debug.sharedModel': 'LLM model for index summaries and chat',\n 'assistant.debug.prompt.index': 'Index summary prefix prompt',\n 'assistant.debug.prompt.chat': 'Chat prefix prompt',\n 'assistant.debug.promptHelp': 'Indexing extracts facts, tasks and evidence in a fixed structure. Chat defaults to one or two short sentences within 100 characters, focusing on the main point and action; ask for details to expand. Changing the index prompt rebuilds automatically after running turns finish; changing the chat prompt starts a new conversation. An empty prompt restores its default.',\n 'assistant.debug.promptSave': 'Save prompt',\n 'assistant.debug.promptDefault': 'Fill default prompt',\n 'assistant.debug.analysisTitle': 'LLM structured session index',\n 'assistant.debug.analysisDeferred': 'Batch finished; some sessions are waiting for their current execution to end',\n 'assistant.debug.taskProgress': 'Session indexing: {completed}/{total} complete · {reused} reused · {deferred} waiting for turn completion · {queued} queued · {running} running · {failed} failed or stopped',\n 'assistant.debug.taskHelp': 'Incremental indexing starts after session execution ends and reuses unchanged results. Up to two independent requests, each with a 90-second timeout.',\n 'assistant.debug.taskReused': 'Kept the previous outcome; no model request this time',\n 'assistant.debug.sessionVersion': 'Current version {source} · Indexed version {indexed}',\n 'assistant.debug.sessionMaterialVersion': 'Index material version {source} · Indexed version {indexed}',\n 'assistant.debug.sessionStateHelp': 'Completed means the current turn has ended. Index status is shown separately and is complete only after the current version is successfully indexed.',\n 'assistant.debug.sessionIndex.pending': 'Not indexed yet',\n 'assistant.debug.sessionIndex.waiting': 'Indexing waits for turn completion',\n 'assistant.debug.sessionIndex.waiting-user': 'Indexing waits for user action',\n 'assistant.debug.sessionIndex.waiting-status': 'Waiting for session status sync',\n 'assistant.debug.sessionIndex.queued': 'Index queued',\n 'assistant.debug.sessionIndex.running': 'Indexing',\n 'assistant.debug.sessionIndex.completed': 'Index complete',\n 'assistant.debug.sessionIndex.stale': 'Index update pending',\n 'assistant.debug.sessionIndex.failed': 'Index failed',\n 'assistant.debug.sessionIndex.cancelled': 'Index stopped',\n 'assistant.debug.taskState.deferred': 'Waiting for session completion',\n 'assistant.debug.taskRow': '{workspace} / {name} · {state}',\n 'assistant.debug.taskRaw': '{name}: raw model output (unvalidated)',\n 'assistant.debug.taskState.queued': 'Queued',\n 'assistant.debug.taskState.running': 'Indexing',\n 'assistant.debug.taskState.completed': 'Completed',\n 'assistant.debug.taskState.failed': 'Failed',\n 'assistant.debug.taskState.cancelled': 'Stopped',\n 'assistant.debug.thinking.disabled': 'Thinking disabled for this index request',\n 'assistant.debug.thinking.provider-default': 'Using model defaults; a thinking-off option was not confirmed',\n 'assistant.debug.thinking.pending': 'Thinking parameters not resolved yet',\n 'assistant.debug.taskAttempt': 'Model attempts: {attempt}/{max}, including the first call',\n 'assistant.debug.taskPreviousAttempt': 'Previous model attempts: {attempt}/{max}, including the first call',\n 'assistant.debug.taskRetryWait': 'Automatic retry: attempt {attempt} starts in about {seconds} seconds',\n 'assistant.debug.modelRaw': 'Raw model output (not a valid index yet)',\n 'assistant.debug.sourceStatus': 'Source runtime state: {status} (separate from work progress)',\n 'assistant.debug.material.excerpt': 'Based on limited session excerpts, not full history',\n 'assistant.debug.material.unavailable': 'No readable body',\n 'assistant.debug.field.objective': 'Work objective',\n 'assistant.debug.field.progress': 'Progress and verification',\n 'assistant.debug.field.blockers': 'Blockers',\n 'assistant.debug.field.pendingTasks': 'Recorded pending tasks',\n 'assistant.debug.field.nextActions': 'Next actions',\n 'assistant.debug.field.openQuestions': 'Missing information',\n 'assistant.debug.noEvidence': 'No source evidence yet',\n 'assistant.debug.noQuestions': 'No additional information gaps identified',\n 'assistant.debug.evidence': 'View source evidence',\n 'assistant.debug.evidenceSource.title': 'Session title',\n 'assistant.debug.evidenceSource.summary': 'Body excerpt',\n 'assistant.debug.evidenceQuote': '{source}: {quote}',\n 'assistant.debug.actionTitle': '{kind} · {priority} priority · {action}',\n 'assistant.debug.actionReason': 'Reason: {reason}',\n 'assistant.debug.actionKind.recorded': 'Recorded task',\n 'assistant.debug.actionKind.suggested': 'Suggestion (not scheduled)',\n 'assistant.debug.priority.high': 'High',\n 'assistant.debug.priority.normal': 'Normal',\n 'assistant.debug.priority.low': 'Low',\n 'assistant.debug.analysisModel': 'Summary model: {provider} / {model}',\n 'assistant.debug.analysisRecord': 'LLM summary: {provider} / {model} · {state} · {duration} ms',\n 'assistant.debug.analysisStop': 'Stop index summary',\n 'assistant.debug.summarizing': 'Summarizing project progress…',\n 'assistant.debug.analysisState.running': 'Generating summary…',\n 'assistant.debug.analysisState.completed': 'Summary generated',\n 'assistant.debug.analysisState.failed': 'Summary failed; source index retained',\n 'assistant.debug.analysisState.cancelled': 'Summary stopped; source index retained',\n 'assistant.debug.rawEvidence': 'These source excerpts are retained as evidence, rather than LLM-generated progress conclusions.',\n}\n","export const en = {\n 'avatar.portraitTitle': 'Avatar',\n 'avatar.portraitEdit': 'Adjust avatar',\n 'avatar.portraitLocalHint': 'Saved in this browser for this character; conversation and sidebar avatars update together.',\n 'avatar.portraitDraftHint': 'Avatar adjustments apply when you save the configuration.',\n 'avatar.portraitConfirm': 'Confirm crop',\n 'avatar.portraitDragHint': 'Drag the image or use arrow keys; zoom to adjust the crop.',\n 'avatar.portraitCropArea': 'Avatar crop area',\n 'avatar.portraitZoom': 'Zoom',\n 'avatar.portraitLoading': 'Preparing the crop image…',\n 'avatar.portraitSaving': 'Saving avatar…',\n 'avatar.portraitCancel': 'Cancel',\n 'avatar.portraitSave': 'Save avatar',\n 'avatar.portraitSourceFailed': 'The character image is unavailable. Retry after the character has loaded.',\n 'avatar.portraitSaveFailed': 'Avatar could not be saved. Check browser storage and try again.',\n 'avatar.settingsTitle': 'Assistant appearance',\n 'avatar.settingsDescription': 'Choose one character for both the floating companion and the assistant conversation.',\n 'avatar.thirdPartyTitle': 'Third-party characters',\n 'avatar.thirdPartyTerms': 'Third-party character terms · {version}',\n 'avatar.thirdPartyTermsContent': 'Characters belong to their authors. Directory inclusion does not grant a license or commercial rights. Selecting a character automatically downloads complete materials from upstream websites for temporary preview. Applying it requires confirmation of its material license. Check attribution, noncommercial, sharing, and individual character restrictions. Installation downloads materials only and does not execute plugin code.',\n 'avatar.thirdPartyAgree': 'I have read and agree to these third-party character terms.',\n 'avatar.thirdPartyEnable': 'Enable third-party characters',\n 'avatar.thirdPartyConfirm': 'Agree and enable',\n 'avatar.thirdPartyConsentRequired': 'Please agree to the third-party character terms first.',\n 'avatar.catalogLoading': 'Loading character records…',\n 'avatar.catalogRetry': 'Reload the list',\n 'avatar.catalogEmpty': 'No third-party characters are currently listed.',\n 'avatar.catalogPreview': 'Static character preview',\n 'avatar.catalogLicenseLink': 'Read the material license',\n 'avatar.catalogPreviewHint': 'Selecting a character automatically downloads complete materials for temporary preview. Switching or closing automatically clears it. Applying the character requires license confirmation and keeps the verified materials.',\n 'avatar.temporaryUnavailable': 'Preview is unavailable while character settings are disabled.',\n 'avatar.temporaryUse': 'Use this character',\n 'avatar.temporaryLoadFailed': 'The preview could not load. Select the character again to retry.',\n 'avatar.temporaryLive2dLoadFailed': 'The Live2D preview could not load. Check the Host engine or select the character again to retry.',\n 'avatar.loadErrorReason': 'Reason: {reason}',\n 'avatar.live2dEngineUnavailable': 'The Live2D engine is not ready yet. Select the Live2D character again in appearance settings to install it automatically.',\n 'avatar.live2dRuntimeInvalid': 'The Live2D engine does not export the expected interface. Check its version.',\n 'avatar.live2dWebglUnavailable': 'This browser could not create a WebGL drawing context.',\n 'avatar.catalogPreviewFailed': 'The upstream preview is unavailable. You can check the repository before installing.',\n 'avatar.catalogSize': 'Full download: approximately {size} · {files} files',\n 'avatar.catalogLicenseAgree': 'I have read this character’s license, accept its restrictions, and confirm applying this character.',\n 'avatar.catalogDownload': 'Confirm download and use',\n 'avatar.catalogInstalled': 'Already installed',\n 'avatar.floatingEnabled': 'Show floating companion',\n 'avatar.dialogEnabled': 'Show character in conversation',\n 'avatar.selected': 'Current character',\n 'avatar.builtinName': 'Yu Niu',\n 'avatar.builtinMaleName': 'Yu Zai',\n 'avatar.externalName': '{name} · third-party',\n 'avatar.thirdPartyBadge': 'Third-party',\n 'avatar.externalHint': 'Third-party characters are external dependencies and are not preinstalled with the plugin. Install them as needed after creating your assistant.',\n 'avatar.live2dDependencyHint': 'The Live2D engine (l2d@2.1.1) is downloaded into the CodingNS data directory the first time you select a Live2D character, after you confirm the engine license. Character installation still downloads materials only.',\n 'avatar.engineTerms': 'Live2D engine license · {version}',\n 'avatar.engineTermsContent': 'The engine is the third-party package l2d@2.1.1 from the public npm registry. It bundles the Live2D Cubism SDK at runtime, which is governed by the Live2D Proprietary Software License; confirm that your use, including commercial use, is permitted. The Host downloads this exact version over HTTPS, verifies its SHA-512 digest and installs it only into the CodingNS data directory. It is not bundled with the plugin, does not modify the DSH profile or plugin dependencies, and loads only when a Live2D character is displayed.',\n 'avatar.engineAgree': 'I have read the engine license notice and agree to download and install the Live2D engine.',\n 'avatar.engineConfirm': 'Agree and install',\n 'avatar.engineInstalling': 'Downloading and installing the Live2D engine…',\n 'avatar.engineCancel': 'Cancel installation',\n 'avatar.engineInstallFailed': 'Live2D engine installation failed: {reason}',\n 'avatar.engineRetry': 'Retry installation',\n 'avatar.engineCancelled': 'Live2D engine installation was cancelled.',\n 'avatar.engineInstalled': 'Live2D engine is ready.',\n 'avatar.engineMissing': 'The current character needs the Live2D engine, which is not installed on this Host yet.',\n 'avatar.engineInstall': 'Install the Live2D engine',\n 'avatar.preset.whaleSprite': 'DeepSeek whale · full-body chibi',\n 'avatar.preset.whaleLive2d': 'DeepSeek whale · Live2D at the desk',\n 'avatar.floatingSize': 'Companion size',\n 'avatar.size.mini': 'Mini',\n 'avatar.size.standard': 'Standard',\n 'avatar.size.custom': 'Custom',\n 'avatar.customSize': 'Custom size (px)',\n 'avatar.dialogSize': 'Conversation character size',\n 'avatar.remove': 'Remove this custom character',\n 'avatar.add': 'Add a character',\n 'avatar.addMode': 'Addition method',\n 'avatar.customMaterial': 'Custom materials',\n 'avatar.importPackage': 'Install an appearance package',\n 'avatar.adapter': 'Package format',\n 'avatar.adapter.auto': 'Detect automatically',\n 'avatar.adapter.native': 'CodingNS appearance package',\n 'avatar.adapter.codex': 'Codex pet.json',\n 'avatar.adapter.dsh': 'DSH Live2D pet.json',\n 'avatar.adapter.cubism': 'Live2D model.json / model3.json',\n 'avatar.manifestUrl': 'Repository or resource URL',\n 'avatar.importHint': 'Enter a public GitHub repository, folder, JSON manifest, Live2D model or image URL. Choose a package to download its materials locally, then register and use it. Check its license before use.',\n 'avatar.importUse': 'Install and use',\n 'avatar.discover': 'Find appearance packages',\n 'avatar.installCandidate': 'Choose a package',\n 'avatar.installCurrent': 'Install this character locally',\n 'avatar.installProgress': 'Finding or installing character materials…',\n 'avatar.cancel': 'Cancel',\n 'avatar.cancelled': 'Appearance installation cancelled.',\n 'avatar.discovered': 'Appearance packages found. Choose one to install.',\n 'avatar.importing': 'Importing…',\n 'avatar.packageAuthor': 'Author: {author}',\n 'avatar.packageLicense': 'License: {license}',\n 'avatar.packageSource': 'Package source',\n 'avatar.packageHomepage': 'Package details and license',\n 'avatar.notDeclared': 'Not declared',\n 'avatar.name': 'Character name',\n 'avatar.type': 'Character format',\n 'avatar.type.image': 'Image',\n 'avatar.type.spritesheet': 'Animated pet sprite sheet',\n 'avatar.type.live2d': 'Live2D character',\n 'avatar.source': 'Character resource address',\n 'avatar.sourceHint.image': 'Use an image address, such as PNG or WebP. Transparent backgrounds work best.',\n 'avatar.sourceHint.spritesheet': 'Use a Codex v1/v2 sprite sheet address and choose its matching dimensions.',\n 'avatar.sourceHint.live2d': 'Use a .model.json or .model3.json address. Its textures and motions must also be accessible. Full-body display needs a full-body model.',\n 'avatar.sourceHint.custom': 'Use the resource address supported by this renderer.',\n 'avatar.spriteVersion': 'Sprite sheet layout',\n 'avatar.addUse': 'Add and use',\n 'avatar.customName': 'Custom character',\n 'avatar.invalidSource': 'Enter an HTTP(S) address or a path beginning with / on this site.',\n 'avatar.saved': 'Assistant appearance saved.',\n 'avatar.character': '{name} · assistant character',\n 'avatar.loadFailed': 'The character could not be loaded. Showing the built-in character.',\n 'avatar.loading': 'Your companion is on the way…',\n 'avatar.loadingCompact': 'Loading…',\n 'avatar.loadEngine': 'Preparing the character engine…',\n 'avatar.loadRendering': 'Preparing the character display…',\n 'avatar.loadProgress': 'Character loading progress',\n 'avatar.loadElapsed': '{seconds}s total',\n 'avatar.loadElapsedCompact': '{seconds}s',\n 'avatar.loadResourcesElapsed': 'Resources ready at {seconds}s',\n 'avatar.cacheUnknown': 'Cache status unknown',\n 'avatar.cacheUnknownCompact': 'Cache unknown',\n 'avatar.cacheTiny': 'Host {cached}/{total}',\n 'avatar.cacheBefore': 'Host cache before loading: {cached}/{total}',\n 'avatar.cacheShort': 'Host cache before load {cached}/{total}',\n 'avatar.cacheDownloads': '{count} new Host downloads',\n 'avatar.cacheDownloadsCompact': '{count} new downloads',\n 'avatar.cacheDownloadsTiny': '+{count} downloads',\n 'avatar.openAssistant': 'Open the global assistant',\n 'avatar.desktopFallback': 'Desktop companion unavailable; showing inside this window.',\n 'avatar.dragHint': 'Drag to move; click to open the assistant.',\n}\n\nexport const zh: Record<keyof typeof en, string> = {\n 'avatar.portraitTitle': '头像',\n 'avatar.portraitEdit': '微调头像',\n 'avatar.portraitLocalHint': '按形象保存在当前浏览器,对话与侧栏头像同步更新。',\n 'avatar.portraitDraftHint': '头像调整将在保存配置后生效。',\n 'avatar.portraitConfirm': '确认裁剪',\n 'avatar.portraitDragHint': '拖动图片或使用方向键,再缩放调整裁剪范围。',\n 'avatar.portraitCropArea': '头像裁剪区域',\n 'avatar.portraitZoom': '缩放',\n 'avatar.portraitLoading': '正在准备裁剪图片…',\n 'avatar.portraitSaving': '正在保存头像…',\n 'avatar.portraitCancel': '取消',\n 'avatar.portraitSave': '保存头像',\n 'avatar.portraitSourceFailed': '暂时无法读取形象图片,形象加载完成后可重试。',\n 'avatar.portraitSaveFailed': '头像保存失败,请检查浏览器存储后重试。',\n 'avatar.settingsTitle': '助理形象',\n 'avatar.settingsDescription': '选择一个角色,同时用于悬浮宠物和助理对话。',\n 'avatar.thirdPartyTitle': '第三方形象',\n 'avatar.thirdPartyTerms': '第三方形象使用说明 · {version}',\n 'avatar.thirdPartyTermsContent': '第三方形象归各作者所有,列入目录不代表获得使用或商业授权。选择形象后会自动从上游网站下载完整素材用于临时预览,正式应用时需确认该形象的素材许可。请核对署名、非商业、共享方式及角色个别限制。安装只下载素材,不执行第三方插件代码。',\n 'avatar.thirdPartyAgree': '我已阅读并同意第三方形象使用说明。',\n 'avatar.thirdPartyEnable': '启用第三方形象',\n 'avatar.thirdPartyConfirm': '同意并启用',\n 'avatar.thirdPartyConsentRequired': '请先同意第三方形象使用说明',\n 'avatar.catalogLoading': '正在加载形象记录…',\n 'avatar.catalogRetry': '重新加载列表',\n 'avatar.catalogEmpty': '暂无第三方形象记录。',\n 'avatar.catalogPreview': '形象静态预览',\n 'avatar.catalogLicenseLink': '查看素材许可',\n 'avatar.catalogPreviewHint': '选择后自动下载完整素材并临时预览;切换或关闭后自动清理。采用此形象时才需确认许可,并保留已验证素材。',\n 'avatar.temporaryUnavailable': '形象设置不可用,暂时无法预览。',\n 'avatar.temporaryUse': '采用此形象',\n 'avatar.temporaryLoadFailed': '形象预览加载失败,请重新选择形象后重试。',\n 'avatar.temporaryLive2dLoadFailed': 'Live2D 形象预览加载失败,请检查 Host 引擎或重新选择形象后重试。',\n 'avatar.loadErrorReason': '原因:{reason}',\n 'avatar.live2dEngineUnavailable': 'Live2D 引擎尚未就绪,请在形象设置中重新选择该 Live2D 形象以自动安装。',\n 'avatar.live2dRuntimeInvalid': 'Live2D 引擎未提供预期接口,请检查引擎版本。',\n 'avatar.live2dWebglUnavailable': '当前浏览器无法创建 WebGL 绘图上下文。',\n 'avatar.catalogPreviewFailed': '上游预览暂时无法显示,可先查看仓库后再决定是否安装。',\n 'avatar.catalogSize': '完整下载:约 {size} · {files} 个文件',\n 'avatar.catalogLicenseAgree': '我已阅读该形象许可,接受其限制,并确认应用此形象。',\n 'avatar.catalogDownload': '确认下载并使用',\n 'avatar.catalogInstalled': '已安装',\n 'avatar.floatingEnabled': '显示悬浮宠物',\n 'avatar.dialogEnabled': '对话中显示角色',\n 'avatar.selected': '当前形象',\n 'avatar.builtinName': '鱼妞',\n 'avatar.builtinMaleName': '鱼仔',\n 'avatar.externalName': '{name} · 第三方',\n 'avatar.thirdPartyBadge': '第三方',\n 'avatar.externalHint': '第三方形象为外部依赖,不随插件预装,可在创建后按需安装。',\n 'avatar.live2dDependencyHint': '首次选择 Live2D 形象并确认引擎许可后,Host 会把引擎(l2d@2.1.1)下载到 CodingNS 自有目录。形象安装仍只下载素材。',\n 'avatar.engineTerms': 'Live2D 引擎许可 · {version}',\n 'avatar.engineTermsContent': '引擎是来自公开 npm 源的第三方包 l2d@2.1.1,运行时集成 Live2D Cubism SDK,受 Live2D Proprietary Software License 约束;请自行确认你的使用(包括商业用途)已获许可。Host 通过 HTTPS 下载这一精确版本、校验 SHA-512 摘要,并且只安装到 CodingNS 自有数据目录;引擎不随插件打包,不修改 DSH Profile 或插件依赖,只在显示 Live2D 形象时加载。',\n 'avatar.engineAgree': '我已阅读引擎许可说明,并同意下载安装 Live2D 引擎。',\n 'avatar.engineConfirm': '同意并安装',\n 'avatar.engineInstalling': '正在下载并安装 Live2D 引擎…',\n 'avatar.engineCancel': '取消安装',\n 'avatar.engineInstallFailed': 'Live2D 引擎安装失败:{reason}',\n 'avatar.engineRetry': '重试安装',\n 'avatar.engineCancelled': 'Live2D 引擎安装已取消。',\n 'avatar.engineInstalled': 'Live2D 引擎已就绪。',\n 'avatar.engineMissing': '当前形象需要 Live2D 引擎,本 Host 尚未安装。',\n 'avatar.engineInstall': '安装 Live2D 引擎',\n 'avatar.preset.whaleSprite': '大肥鱼 · Q版全身',\n 'avatar.preset.whaleLive2d': '大肥鱼 · Live2D 桌前',\n 'avatar.floatingSize': '悬浮宠物大小',\n 'avatar.size.mini': '迷你',\n 'avatar.size.standard': '标准',\n 'avatar.size.custom': '自定义',\n 'avatar.customSize': '自定义尺寸(像素)',\n 'avatar.dialogSize': '对话角色大小',\n 'avatar.remove': '移除此自定义形象',\n 'avatar.add': '添加形象',\n 'avatar.addMode': '添加方式',\n 'avatar.customMaterial': '自定义素材',\n 'avatar.importPackage': '安装形象包',\n 'avatar.adapter': '形象包格式',\n 'avatar.adapter.auto': '自动识别',\n 'avatar.adapter.native': 'CodingNS 形象包',\n 'avatar.adapter.codex': 'Codex pet.json',\n 'avatar.adapter.dsh': 'DSH Live2D pet.json',\n 'avatar.adapter.cubism': 'Live2D model.json / model3.json',\n 'avatar.manifestUrl': '仓库或资源 URL',\n 'avatar.importHint': '填写公开 GitHub 仓库、目录、JSON 清单、Live2D 模型或图片 URL;选择形象后下载素材到本地,再登记并启用。使用前请确认素材许可。',\n 'avatar.importUse': '安装并使用',\n 'avatar.discover': '查找形象包',\n 'avatar.installCandidate': '选择待安装形象',\n 'avatar.installCurrent': '将此形象安装到本地',\n 'avatar.installProgress': '正在查找或安装形象素材…',\n 'avatar.cancel': '取消',\n 'avatar.cancelled': '形象安装已取消。',\n 'avatar.discovered': '已找到形象包,请选择后安装。',\n 'avatar.importing': '正在导入…',\n 'avatar.packageAuthor': '作者:{author}',\n 'avatar.packageLicense': '许可:{license}',\n 'avatar.packageSource': '形象包来源',\n 'avatar.packageHomepage': '形象包详情与许可',\n 'avatar.notDeclared': '未声明',\n 'avatar.name': '角色名称',\n 'avatar.type': '形象格式',\n 'avatar.type.image': '图片',\n 'avatar.type.spritesheet': '宠物动作图集',\n 'avatar.type.live2d': 'Live2D 角色',\n 'avatar.source': '形象资源地址',\n 'avatar.sourceHint.image': '填写 PNG、WebP 等图片地址,透明背景效果更好。',\n 'avatar.sourceHint.spritesheet': '填写 Codex v1/v2 宠物图集地址,并选择对应的图片尺寸。',\n 'avatar.sourceHint.live2d': '填写 .model.json 或 .model3.json 地址,贴图和动作文件也需能访问。全身展示需使用全身模型。',\n 'avatar.sourceHint.custom': '填写此渲染器支持的资源地址。',\n 'avatar.spriteVersion': '图集布局',\n 'avatar.addUse': '添加并使用',\n 'avatar.customName': '自定义形象',\n 'avatar.invalidSource': '请填写 HTTP(S) 地址,或本站以 / 开头的资源路径。',\n 'avatar.saved': '助理形象已保存。',\n 'avatar.character': '{name} · 助理形象',\n 'avatar.loadFailed': '形象暂时无法加载,已显示内置角色。',\n 'avatar.loading': '小伙伴正在赶来…',\n 'avatar.loadingCompact': '载入中…',\n 'avatar.loadEngine': '正在准备形象引擎…',\n 'avatar.loadRendering': '正在准备形象显示…',\n 'avatar.loadProgress': '形象加载进度',\n 'avatar.loadElapsed': '总用时 {seconds} 秒',\n 'avatar.loadElapsedCompact': '{seconds} 秒',\n 'avatar.loadResourcesElapsed': '资源就绪 {seconds} 秒',\n 'avatar.cacheUnknown': '缓存状态未知',\n 'avatar.cacheUnknownCompact': '缓存未知',\n 'avatar.cacheTiny': 'Host {cached}/{total}',\n 'avatar.cacheBefore': '加载前 Host 缓存:{cached}/{total}',\n 'avatar.cacheShort': '加载前 Host 缓存 {cached}/{total}',\n 'avatar.cacheDownloads': 'Host 新增下载 {count} 项',\n 'avatar.cacheDownloadsCompact': '新增下载 {count} 项',\n 'avatar.cacheDownloadsTiny': '下载 +{count}',\n 'avatar.openAssistant': '打开全局智能助理',\n 'avatar.desktopFallback': '系统悬浮暂不可用,当前在窗口内显示',\n 'avatar.dragHint': '拖动调整位置,点击打开助理。',\n}\n","/**\n * fileWorkspace 域词典片段。\n *\n * 只放该域新增的键;合并与命名空间注册由 ../locale.ts 统一完成。\n * 规范见 docs/开发规范/20260930-前端文案国际化规范.md。\n */\nexport const en: Record<string, string> = {\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.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 '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.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.draftUnavailable': 'Commit message generation is not available yet',\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.draftUnavailable': '生成提交信息功能暂未开放',\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 '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.',\n 'translation.inputTitle': 'Translate requests before sending',\n 'translation.inputLanguage': 'Request language',\n 'translation.outputTitle': 'Translate visible replies',\n 'translation.outputLanguage': 'Reply language',\n 'translation.modelTitle': 'Translation model',\n 'translation.modelFollowDefault': 'Use the default DSH model',\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': 'DeepSeek official and configured third-party models are available here. Translation requests always disable thinking.',\n 'translation.detailsTitle': 'Translation details',\n 'translation.viewDetails': 'View translation details',\n 'translation.statusTranslated': 'Translated',\n 'translation.statusFailed': 'Translation failed; original kept',\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': 'Translated / 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 '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 翻译请求和回复,同时保留工具、命令、路径与原始历史。',\n 'translation.inputTitle': '发送前翻译请求',\n 'translation.inputLanguage': '请求目标语言',\n 'translation.outputTitle': '翻译界面回复',\n 'translation.outputLanguage': '回复语言',\n 'translation.modelTitle': '翻译模型',\n 'translation.modelFollowDefault': '跟随 DSH 默认模型',\n 'translation.modelUnavailable': '已保存的模型当前不可用',\n 'translation.modelLoading': '正在加载可用的 DSH 模型…',\n 'translation.modelEmpty': '当前没有可用的 DSH 文本模型。',\n 'translation.modelHelp': '这里可以选择 DeepSeek 官方模型或已配置的第三方模型;翻译请求始终关闭思考。',\n 'translation.detailsTitle': '翻译详情',\n 'translation.viewDetails': '查看翻译详情',\n 'translation.statusTranslated': '已翻译',\n 'translation.statusFailed': '翻译失败,已保留原文',\n 'translation.statusNotNeeded': '原文已是目标语言,无需翻译',\n 'translation.detectedLanguage': '检测到的语言',\n 'translation.modelNotUsed': '未调用,原文无需翻译',\n 'translation.originalText': '原文',\n 'translation.translatedText': '译文 / 实际发送文本',\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.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.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 '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}\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 '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}\n","export const en = {\n 'voice.models.prepared': 'Model resources are ready. Save the configuration to use this recognition model.',\n 'voice.settings.input': 'Speech input', 'voice.settings.output': 'Speech output',\n 'voice.settings.inputDescription': 'Recognition model and microphone',\n 'voice.settings.outputDescription': 'Voice, previews and speech controls',\n 'voice.models.description': 'Check downloads, verify a model, and choose which model to use.',\n 'voice.models.recognitionHint': 'Converts microphone speech to text. Managed independently of the voice used for playback.',\n 'voice.models.current': 'Current model',\n 'voice.models.none': 'No model configured',\n 'voice.models.custom': 'Custom model configured',\n 'voice.models.running': 'Realtime recognition is running',\n 'voice.models.ready': 'Recognition runtime loaded; conversation stopped',\n 'voice.models.stopped': 'Realtime conversation has not started',\n 'voice.models.refresh': 'Refresh status',\n 'voice.models.refreshing': 'Refreshing…',\n 'voice.models.loading': 'Reading model files on the Host…',\n 'voice.models.unknown': 'Status pending',\n 'voice.models.downloaded': 'Downloaded',\n 'voice.models.partial': 'Incomplete files',\n 'voice.models.missing': 'Not downloaded',\n 'voice.models.inUse': 'Current model',\n 'voice.models.unchecked': 'Not verified',\n 'voice.models.passed': 'Verification passed',\n 'voice.models.failed': 'Verification failed',\n 'voice.models.fileCount': '{count}/{total} files · {size} on disk',\n 'voice.models.checkedAt': 'Last verified: {time}',\n 'voice.models.fileDetails': 'File details and locations',\n 'voice.models.fileMissing': 'Missing or empty',\n 'voice.models.partialSize': '{size} incomplete',\n 'voice.models.downloadUse': 'Download and use',\n 'voice.models.completeDownload': 'Complete download and use',\n 'voice.models.use': 'Verify and use',\n 'voice.models.verify': 'Verify availability',\n 'voice.models.redownload': 'Download again',\n 'voice.models.verifying': 'Loading model and testing recognition…',\n 'voice.models.verified': 'Verification passed: the model loads and completes recognition.',\n 'voice.models.applied': 'Verification passed and this model is now selected. Return to start realtime conversation.',\n 'voice.models.otherOperation': 'Another page is downloading or verifying a model. Status will refresh automatically.',\n 'voice.models.stopBeforeSwitch': 'Stop the current realtime conversation before switching or downloading a model again. Verification is still available.',\n 'voice.models.localHint': 'Models are stored on this Host. Verification tests model loading and recognition without using your microphone.',\n 'voice.models.close': 'Close',\n}\n\nexport const zh: Record<keyof typeof en, string> = {\n 'voice.models.prepared': '模型资源已准备好,保存配置后使用此识别模型。',\n 'voice.settings.input': '语音输入', 'voice.settings.output': '语音输出',\n 'voice.settings.inputDescription': '识别模型与麦克风设置',\n 'voice.settings.outputDescription': '音色、试听与播报参数',\n 'voice.models.description': '查看下载状态,验证模型可用性,选择当前使用的模型。',\n 'voice.models.recognitionHint': '将麦克风语音转换为文字,与播报音色独立设置。',\n 'voice.models.current': '当前模型',\n 'voice.models.none': '尚未配置模型',\n 'voice.models.custom': '已配置自定义模型',\n 'voice.models.running': '实时识别正在运行',\n 'voice.models.ready': '识别运行时已加载,对话已停止',\n 'voice.models.stopped': '尚未启动实时对话',\n 'voice.models.refresh': '刷新状态',\n 'voice.models.refreshing': '正在刷新……',\n 'voice.models.loading': '正在读取 Host 上的模型文件……',\n 'voice.models.unknown': '状态待查询',\n 'voice.models.downloaded': '已下载',\n 'voice.models.partial': '文件不完整',\n 'voice.models.missing': '未下载',\n 'voice.models.inUse': '当前使用',\n 'voice.models.unchecked': '尚未验证',\n 'voice.models.passed': '验证通过',\n 'voice.models.failed': '验证失败',\n 'voice.models.fileCount': '{count}/{total} 个文件 · 本地占用 {size}',\n 'voice.models.checkedAt': '最近验证:{time}',\n 'voice.models.fileDetails': '文件详情与保存位置',\n 'voice.models.fileMissing': '缺失或为空',\n 'voice.models.partialSize': '未完成 {size}',\n 'voice.models.downloadUse': '下载并使用',\n 'voice.models.completeDownload': '补全下载并使用',\n 'voice.models.use': '验证并使用',\n 'voice.models.verify': '验证可用性',\n 'voice.models.redownload': '重新下载',\n 'voice.models.verifying': '正在加载模型并验证识别能力……',\n 'voice.models.verified': '验证通过:模型可以加载并完成识别。',\n 'voice.models.applied': '模型验证通过,已设为当前使用。可返回助理窗口开始实时对话。',\n 'voice.models.otherOperation': '其他页面正在下载或验证模型,状态将自动刷新。',\n 'voice.models.stopBeforeSwitch': '实时对话正在运行,请先停止对话再切换或重新下载模型;仍可验证模型可用性。',\n 'voice.models.localHint': '模型保存在当前 Host。验证会检查模型加载和识别能力,无需使用麦克风。',\n 'voice.models.close': '关闭',\n}\n","/** 独立音色面板词典;官方名称保留原文,元数据标签随界面语言翻译。 */\nexport const en = {\n 'tts.wizardPrepareResources': 'Prepare voice resources', 'tts.wizardDraftReady': 'Voice resources are ready. Configuration changes apply after saving.',\n 'tts.prepare': 'Prepare MOSS resources', 'tts.importDraft': 'Import voice', 'tts.resetDraftParameters': 'Restore defaults',\n 'tts.title': 'Voice settings', 'tts.description': 'Choose a MOSS voice, preview it, or import an open reference recording.',\n 'tts.backend': 'Speech output', 'tts.browser': 'Browser voice', 'tts.moss': 'Local MOSS ONNX',\n 'tts.setup': 'Initialize and use MOSS', 'tts.refresh': 'Refresh', 'tts.selected': 'Voice', 'tts.apply': 'Apply voice',\n 'tts.original': 'Preview reference audio', 'tts.preview': 'Preview voice', 'tts.stop': 'Stop preview',\n 'tts.previewText': 'Preview text', 'tts.defaultText': 'Hello, I am your assistant. How can I help you today?',\n 'tts.ready': 'MOSS is ready', 'tts.notReady': 'Initialize MOSS to apply voices or import recordings. The voice environment is prepared automatically.',\n 'tts.wizardTitle': 'First-time voice setup', 'tts.wizardDescription': 'Enable speech with recommended settings. No fields to fill in.',\n 'tts.wizardChecking': 'Checking existing voice resources…', 'tts.wizardDefault': 'Chinese–English recognition',\n 'tts.wizardModel': 'Recognition: {model}', 'tts.wizardVoice': 'Voice: {voice}',\n 'tts.wizardHint': 'Resources download only when enabled. The environment is managed automatically; existing choices and completed downloads are kept. Start voice chat afterward to allow microphone access.',\n 'tts.wizardEnable': 'Enable voice', 'tts.wizardPreparing': 'Preparing…', 'tts.wizardRetry': 'Retry setup',\n 'tts.wizardRecognition': 'Preparing speech recognition…', 'tts.wizardSpeech': 'Preparing local speech output…',\n 'tts.wizardReady': 'Voice is ready', 'tts.wizardListen': 'Try the voice', 'tts.wizardAdvanced': 'Advanced voice settings',\n 'tts.site': 'Open voice library', 'tts.openSite': 'Open website', 'tts.import': 'Import and apply',\n 'tts.openRecordings': 'Browse importable recordings',\n 'tts.source': 'Recording ID or file URL', 'tts.name': 'Name (optional)', 'tts.language': 'Language', 'tts.gender': 'Gender',\n 'tts.sourceHint': 'Use a WAV/FLAC recording lasting 2–30 seconds. Model-specific voice embeddings are not supported.',\n 'tts.kyutaiHint': 'Example: kyutai:voice-donations/0a67.wav. Import CC0 / CC BY 4.0 sources.',\n 'tts.aishellHint': 'Example: aishell:SSB00050001. You can also paste a Hugging Face file URL.',\n 'tts.license': 'License: {license}', 'tts.sourceLink': 'Voice source', 'tts.remove': 'Remove imported voice',\n 'tts.male': 'Male', 'tts.female': 'Female', 'tts.unknown': 'Unspecified',\n 'tts.zh': 'Chinese', 'tts.en': 'English', 'tts.ja': 'Japanese', 'tts.fr': 'French',\n 'tts.originalHint': 'Built-in references are decoded from official audio codes; imported references play the source recording. Use Preview voice to hear local synthesis.',\n 'tts.loadError': 'Unable to play this recording. Check the network or import it again.',\n 'tts.busy': 'Processing…', 'tts.saved': 'Voice settings saved.',\n 'tts.playbackSettings': 'Speech controls', 'tts.rate': 'Speed (×)', 'tts.volume': 'Volume (%)',\n 'tts.rateHint': 'MOSS playback speed also changes pitch.',\n 'tts.advanced': 'Advanced MOSS settings', 'tts.segmentPauseMs': 'Pause between segments (ms)', 'tts.chunkTokens': 'Text per segment (tokens)',\n 'tts.seed': 'Random seed', 'tts.autoSeed': 'Automatic',\n 'tts.advancedHint': 'These settings apply to MOSS. Pause is inserted between generated segments. Shorter segments may reduce coherence.',\n 'tts.seedHint': 'Leave empty for automatic randomness. Use the same seed, text and voice to compare generated speech.',\n 'tts.parametersHint': 'Preview uses the values above. Save them to apply to assistant speech; changing the voice keeps these settings.',\n 'tts.saveParameters': 'Save speech controls', 'tts.resetParameters': 'Restore and save defaults',\n}\nexport const zh: Record<keyof typeof en, string> = {\n 'tts.wizardPrepareResources': '准备语音资源', 'tts.wizardDraftReady': '语音资源已就绪,配置保存后生效。',\n 'tts.prepare': '准备 MOSS 资源', 'tts.importDraft': '导入音色', 'tts.resetDraftParameters': '恢复默认值',\n 'tts.title': '音色设置', 'tts.description': '选择 MOSS 音色、试听,或从开放录音库导入参考声音。',\n 'tts.backend': '语音输出', 'tts.browser': '浏览器音色', 'tts.moss': '本地 MOSS ONNX',\n 'tts.setup': '初始化并使用 MOSS', 'tts.refresh': '刷新状态', 'tts.selected': '音色', 'tts.apply': '应用音色',\n 'tts.original': '试听参考音频', 'tts.preview': '试听音色', 'tts.stop': '停止试听',\n 'tts.previewText': '试听文本', 'tts.defaultText': '你好,我是你的助理。今天有什么需要我帮忙的?',\n 'tts.ready': 'MOSS 已就绪', 'tts.notReady': '初始化 MOSS 后可以应用或导入音色;语音运行环境会自动准备。',\n 'tts.wizardTitle': '初次语音配置', 'tts.wizardDescription': '使用推荐设置启用语音,无需填写任何配置。',\n 'tts.wizardChecking': '正在检查已有语音资源……', 'tts.wizardDefault': '中英双语识别',\n 'tts.wizardModel': '识别:{model}', 'tts.wizardVoice': '音色:{voice}',\n 'tts.wizardHint': '点击启用后才下载资源,运行环境自动准备;已有选择和已完成下载会保留。完成后点击“开始语音”授权麦克风。',\n 'tts.wizardEnable': '启用语音', 'tts.wizardPreparing': '正在准备……', 'tts.wizardRetry': '重试配置',\n 'tts.wizardRecognition': '正在准备语音识别……', 'tts.wizardSpeech': '正在准备本地播报……',\n 'tts.wizardReady': '语音已就绪', 'tts.wizardListen': '试听声音', 'tts.wizardAdvanced': '高级声音设置',\n 'tts.site': '开放音色库', 'tts.openSite': '打开网站', 'tts.import': '导入并应用',\n 'tts.openRecordings': '查看可导入录音目录',\n 'tts.source': '录音 ID 或文件网址', 'tts.name': '名称(可选)', 'tts.language': '语言', 'tts.gender': '性别',\n 'tts.sourceHint': '使用 2~30 秒的 WAV/FLAC 参考录音;不支持其他模型专用的音色嵌入。',\n 'tts.kyutaiHint': '示例:kyutai:voice-donations/0a67.wav;支持 CC0/CC BY 4.0 来源。',\n 'tts.aishellHint': '示例:aishell:SSB00050001;也可粘贴 Hugging Face 中单个音频文件的网址。',\n 'tts.license': '许可:{license}', 'tts.sourceLink': '音色来源', 'tts.remove': '移除导入音色',\n 'tts.male': '男声', 'tts.female': '女声', 'tts.unknown': '未标注',\n 'tts.zh': '中文', 'tts.en': '英语', 'tts.ja': '日语', 'tts.fr': '法语',\n 'tts.originalHint': '内置预设由官方参考编码还原,导入音色播放原始录音;实际生成效果请使用“试听音色”。',\n 'tts.loadError': '参考录音播放失败,请检查网络或重新导入。',\n 'tts.busy': '正在处理……', 'tts.saved': '音色设置已保存。',\n 'tts.playbackSettings': '播报控制', 'tts.rate': '语速(倍)', 'tts.volume': '音量(%)',\n 'tts.rateHint': 'MOSS 播放变速会同时改变音高。',\n 'tts.advanced': 'MOSS 高级设置', 'tts.segmentPauseMs': '分段停顿(毫秒)', 'tts.chunkTokens': '单段文本长度(token)',\n 'tts.seed': '随机种子', 'tts.autoSeed': '自动随机',\n 'tts.advancedHint': '以下设置仅影响 MOSS。停顿加在生成的文本分段之间;分段过短可能影响语音连贯性。',\n 'tts.seedHint': '留空自动随机;固定种子配合同一文本和音色,便于比较生成效果。',\n 'tts.parametersHint': '合成试听使用当前数值,保存后应用于助理播报;切换音色会保留这些设置。',\n 'tts.saveParameters': '保存播报设置', 'tts.resetParameters': '恢复并保存默认值',\n}\n","/** 生命周期工作台文案;高级资源管理复用原有词典。 */\nexport const zh = {\n 'awb.notifications.title': '会话提醒', 'awb.notifications.hint': '在悬浮助理旁显示提醒,查看会话后标记已读。',\n 'awb.notifications.enabled': '启用会话提醒', 'awb.notifications.completed': '本轮完成', 'awb.notifications.error': '运行出错',\n 'awb.notifications.question': '需要回答', 'awb.notifications.approval': '等待审批', 'awb.notifications.questionTag': '问题', 'awb.notifications.approvalTag': '权限申请',\n 'awb.notifications.requestPrefix': '有', 'awb.notifications.requestSuffix': '需要你来处理',\n 'awb.notifications.autoClose': '通知自动关闭', 'awb.notifications.autoCloseHint': '启用后,失败、提问与审批的气泡在设定时间后自动收起;完成提示始终固定 10 秒关闭。未读记录仍会保留。',\n 'awb.notifications.autoCloseDuration': '自动关闭时间', 'awb.notifications.autoCloseDurationHint': '选择气泡自动收起的时间。', 'awb.notifications.seconds': '秒',\n 'awb.notifications.open': '查看会话', 'awb.notifications.dismiss': '收起提醒', 'awb.notifications.collapse': '收起通知', 'awb.notifications.expand': '展开通知', 'awb.notifications.list': '提醒列表',\n 'awb.notifications.clearAll': '一键清理', 'awb.notifications.clearAllLabel': '一键清理全部通知',\n 'awb.notifications.unread': '{count} 条未读', 'awb.notifications.pending': '{count} 项待处理',\n 'awb.notifications.unreadFilterLabel': '筛选未读通知:{count} 条未读', 'awb.notifications.pendingFilterLabel': '筛选待处理通知:{count} 项待处理',\n 'awb.notifications.empty': '暂无提醒', 'awb.notifications.disconnected': '远端暂不可达', 'awb.notifications.expired': '提醒已失效',\n 'awb.notifications.actionUnavailable': '通知操作暂不可用,请重试',\n 'awb.call.title': '实时语音', 'awb.call.connecting': '正在连接…', 'awb.call.ending': '正在结束通话…',\n 'awb.call.minimize': '收起通话', 'awb.call.restore': '恢复实时对话', 'awb.call.silent': '声音已关闭', 'awb.call.error': '通话异常,请点击查看',\n 'awb.call.listening': '正在听你说', 'awb.call.thinking': '正在准备回复', 'awb.call.speaking': '正在回复', 'awb.call.muted': '麦克风已静音',\n 'awb.call.caption': '实时字幕', 'awb.call.waiting': '说点什么吧', 'awb.call.microphone': '静音麦克风', 'awb.call.unmute': '开启麦克风',\n 'awb.call.speaker': '扬声器', 'awb.call.speakerSettings': '切换扬声器', 'awb.call.playSound': '播放声音',\n 'awb.call.defaultSpeaker': '系统默认扬声器', 'awb.call.outputDevice': '播放设备', 'awb.call.hangup': '挂断',\n 'awb.call.record': '语音沟通', 'awb.call.count': '{count} 条语句', 'awb.call.details': '语音沟通详情',\n 'awb.call.startedAt': '开始时间', 'awb.call.endedAt': '结束时间', 'awb.call.duration': '通话时长', 'awb.call.noMessages': '这次通话没有记录到语句。',\n 'awb.call.interrupted': '已打断', 'awb.call.tools': '能力调用记录', 'awb.call.noTools': '这次通话没有能力调用。',\n 'awb.call.workspace': '工作区能力', 'awb.call.webSearch': '联网搜索', 'awb.call.attachment': '附件读取',\n 'awb.call.tool.running': '进行中', 'awb.call.tool.completed': '已完成', 'awb.call.tool.failed': '失败', 'awb.call.tool.cancelled': '已取消',\n 'awb.call.arguments': '调用参数', 'awb.call.result': '返回结果', 'awb.call.toolDetails': '查看参数与结果', 'awb.call.step': '执行步骤', 'awb.call.stepDetails': '展开查看步骤中的工具调用', 'awb.call.separator': '、', 'awb.call.toolCount': '{count} 次调用', 'awb.call.stepRead': '已读取文件', 'awb.call.stepSearch': '已搜索网页', 'awb.call.stepWorkspace': '已调用工具', 'awb.call.stepTool': '已执行操作',\n 'awb.preparationUnsupported': '当前 Host 不支持仅准备资源,请更新 Host 后再操作。',\n 'awb.title': '智能助理', 'awb.create': '创建助理', 'awb.configure': '配置', 'awb.chat': '对话', 'awb.close': '关闭',\n 'awb.name': '名称', 'awb.model': '对话模型', 'awb.defaultModel': '跟随 DSH 默认模型', 'awb.noModel': '没有可用模型,请先配置 DSH 模型',\n 'awb.setupTitle': '创建你的助理', 'awb.setupSubtitle': '设定身份与交流方式,让它成为你的日常伙伴。',\n 'awb.createStart': '创建并开始对话',\n 'awb.tab.basic': '基本信息', 'awb.tab.appearance': '形象管理', 'awb.tab.voice': '声音管理',\n 'awb.setupLater': '创建后,可以按需关联项目和设置声音。', 'awb.namePlaceholder': '给助理起个名字',\n 'awb.personality': '性格背景', 'awb.personalityPlaceholder': '例如:你是我的编程伙伴,性格温和、直说重点。熟悉软件开发,回答清楚自然,遇到不确定的信息会先说明。',\n 'awb.personalityPreview': '设定它的性格、背景与交流习惯。', 'awb.unnamed': '你的助理', 'awb.capabilities': '项目与声音',\n 'awb.workspaces': '关联项目', 'awb.scopeHint': '只读取勾选项目中的可见会话;不选择项目也可以普通交流。',\n 'awb.offlineWorkspace': '暂不可用的项目:{id}', 'awb.workspaceColumn': '工作区', 'awb.workspaceCountColumn': '会话数', 'awb.workspacePathColumn': '路径', 'awb.workspaceHostColumn': '所属 HOST', 'awb.workspaceHost': 'HOST:{host}', 'awb.avatar': '形象', 'awb.voice': '声音', 'awb.browserVoice': '浏览器默认声音',\n 'awb.mossSetupHint': '当前可使用浏览器声音。需要本地音色时,可在此页安装 MOSS。',\n 'awb.more': '更多设置',\n 'awb.moreHint': '所有配置点击「保存配置」后生效。',\n 'awb.save': '保存配置', 'awb.cancel': '取消',\n 'awb.placeholder': '发送消息…', 'awb.empty': '你好,今天想聊些什么?', 'awb.send': '发送', 'awb.stop': '停止回复',\n 'awb.state.thinking': '思考中', 'awb.state.updating': '认知更新', 'awb.state.idle': '空闲', 'awb.state.working': '工作中',\n 'awb.voiceUnavailable': '声音尚未就绪,请在声音管理中配置。',\n 'awb.attachments.add': '添加附件', 'awb.attachments.remove': '移除附件:{name}', 'awb.attachments.unnamed': '附件',\n 'awb.attachments.prompt': '请查看我发送的附件。',\n 'awb.attachments.countError': '最多添加 6 个附件。', 'awb.attachments.sizeError': '单个附件不超过 10 MiB,总大小不超过 20 MiB。',\n 'awb.attachments.typeError': '图片支持 PNG、JPEG、WebP 和 GIF,请转换后添加。',\n 'awb.command.clear': '清理对话,保留助理配置', 'awb.command.attachmentsError': '清理指令不能携带附件,请先移除附件。',\n 'awb.maintenance': '对话维护', 'awb.compress': '压缩对话', 'awb.clear': '清理对话', 'awb.reset': '重置助理',\n 'awb.clearConfirm': '清理后会删除助理的消息和交流摘要。关联项目与助理配置会保留。',\n 'awb.resetConfirm': '重置后会删除助理配置、对话和派生索引,并返回创建界面。原始项目会话和下载素材会保留。',\n 'awb.resetFinalTitle': '再次确认重置', 'awb.resetContinue': '继续重置', 'awb.resetFinalAction': '确认重置',\n 'awb.resetFinalConfirm': '确定要重置助理吗?助理配置、对话和派生索引将被清空,无法从此界面撤销。原始项目会话和下载素材会保留。',\n 'awb.confirm': '确认', 'awb.busy': '处理中…', 'awb.loading': '正在准备助理', 'awb.loadingHint': '正在准备你的对话…', 'awb.retry': '重试',\n 'awb.summary': '历史交流摘要', 'awb.saved': '配置已保存', 'awb.compressed': '对话已压缩,保留最近三轮', 'awb.cleared': '对话已清理',\n 'awb.index.ready': '项目认知已就绪', 'awb.index.pending': '项目认知更新中', 'awb.index.empty': '未关联项目',\n 'awb.disabled': '启用此功能后即可创建与使用助理。', 'awb.open': '打开智能助理', 'awb.initial': '创建一位助理,把项目认知、文字、语音和形象放在一起。',\n 'awb.asr': '语音识别模型', 'awb.devices': '音频设备', 'awb.prompts': '提示词', 'awb.unavailableSelection': '原选择暂不可用:{id}',\n}\nexport const en: Record<keyof typeof zh, string> = {\n 'awb.notifications.title': 'Session notices', 'awb.notifications.hint': 'Show notices beside the floating assistant. Viewing a session marks its notice as read.',\n 'awb.notifications.enabled': 'Enable session notices', 'awb.notifications.completed': 'Turn completed', 'awb.notifications.error': 'Run failed',\n 'awb.notifications.question': 'Answer needed', 'awb.notifications.approval': 'Approval needed', 'awb.notifications.questionTag': 'Question', 'awb.notifications.approvalTag': 'Permission request',\n 'awb.notifications.requestPrefix': 'There is a', 'awb.notifications.requestSuffix': 'waiting for your response',\n 'awb.notifications.autoClose': 'Auto-close notices', 'awb.notifications.autoCloseHint': 'When enabled, failure, question and approval notices collapse after the selected time; completion notices always close after 10 seconds. Unread records remain available.',\n 'awb.notifications.autoCloseDuration': 'Auto-close time', 'awb.notifications.autoCloseDurationHint': 'Choose when the bubble is collapsed.', 'awb.notifications.seconds': ' seconds',\n 'awb.notifications.open': 'View session', 'awb.notifications.dismiss': 'Collapse notice', 'awb.notifications.collapse': 'Collapse notifications', 'awb.notifications.expand': 'Expand notifications', 'awb.notifications.list': 'Notice list',\n 'awb.notifications.clearAll': 'Clear all', 'awb.notifications.clearAllLabel': 'Clear all notifications',\n 'awb.notifications.unread': '{count} unread', 'awb.notifications.pending': '{count} pending',\n 'awb.notifications.unreadFilterLabel': 'Filter unread notifications: {count} unread', 'awb.notifications.pendingFilterLabel': 'Filter pending notifications: {count} pending',\n 'awb.notifications.empty': 'No notices', 'awb.notifications.disconnected': 'Remote host unavailable', 'awb.notifications.expired': 'Notice expired',\n 'awb.notifications.actionUnavailable': 'Notice action is unavailable. Please try again.',\n 'awb.call.title': 'Live voice', 'awb.call.connecting': 'Connecting…', 'awb.call.ending': 'Ending call…',\n 'awb.call.minimize': 'Minimize call', 'awb.call.restore': 'Restore live conversation', 'awb.call.silent': 'Speaker muted', 'awb.call.error': 'Call error; click to view',\n 'awb.call.listening': 'Listening', 'awb.call.thinking': 'Preparing a reply', 'awb.call.speaking': 'Speaking', 'awb.call.muted': 'Microphone muted',\n 'awb.call.caption': 'Live captions', 'awb.call.waiting': 'Say something', 'awb.call.microphone': 'Mute microphone', 'awb.call.unmute': 'Unmute microphone',\n 'awb.call.speaker': 'Speaker', 'awb.call.speakerSettings': 'Choose speaker', 'awb.call.playSound': 'Play audio',\n 'awb.call.defaultSpeaker': 'System default speaker', 'awb.call.outputDevice': 'Output device', 'awb.call.hangup': 'End call',\n 'awb.call.record': 'Voice conversation', 'awb.call.count': '{count} utterances', 'awb.call.details': 'Voice conversation details',\n 'awb.call.startedAt': 'Started', 'awb.call.endedAt': 'Ended', 'awb.call.duration': 'Duration', 'awb.call.noMessages': 'No utterances were recorded in this call.',\n 'awb.call.interrupted': 'Interrupted', 'awb.call.tools': 'Capability calls', 'awb.call.noTools': 'No capabilities were called in this conversation.',\n 'awb.call.workspace': 'Workspace capability', 'awb.call.webSearch': 'Web search', 'awb.call.attachment': 'Attachment read',\n 'awb.call.tool.running': 'Running', 'awb.call.tool.completed': 'Completed', 'awb.call.tool.failed': 'Failed', 'awb.call.tool.cancelled': 'Cancelled',\n 'awb.call.arguments': 'Arguments', 'awb.call.result': 'Result', 'awb.call.toolDetails': 'View arguments and result', 'awb.call.step': 'Execution step', 'awb.call.stepDetails': 'Expand to view the tools in this step', 'awb.call.separator': ', ', 'awb.call.toolCount': '{count} calls', 'awb.call.stepRead': 'Read files', 'awb.call.stepSearch': 'Searched the web', 'awb.call.stepWorkspace': 'Called tools', 'awb.call.stepTool': 'Completed an action',\n 'awb.preparationUnsupported': 'This Host does not support preparing resources without applying settings. Update the Host before proceeding.',\n 'awb.title': 'Assistant', 'awb.create': 'Create assistant', 'awb.configure': 'Configure', 'awb.chat': 'Chat', 'awb.close': 'Close',\n 'awb.name': 'Name', 'awb.model': 'Chat model', 'awb.defaultModel': 'Follow DSH default model', 'awb.noModel': 'No available model. Configure a DSH model first.',\n 'awb.setupTitle': 'Create your assistant', 'awb.setupSubtitle': 'Give your everyday companion an identity and a way to communicate.',\n 'awb.createStart': 'Create and start chatting',\n 'awb.tab.basic': 'Basic information', 'awb.tab.appearance': 'Appearance management', 'awb.tab.voice': 'Voice management',\n 'awb.setupLater': 'You can connect projects and choose voices after creation.', 'awb.namePlaceholder': 'Give your assistant a name',\n 'awb.personality': 'Personality and background', 'awb.personalityPlaceholder': 'For example: You are my programming companion, patient and direct. You understand software development, communicate clearly, and acknowledge uncertainty.',\n 'awb.personalityPreview': 'Describe its personality, background, and communication style.', 'awb.unnamed': 'Your assistant', 'awb.capabilities': 'Projects and voices',\n 'awb.workspaces': 'Projects', 'awb.scopeHint': 'Only visible sessions in selected projects are readable. You can chat without selecting projects.',\n 'awb.offlineWorkspace': 'Unavailable project: {id}', 'awb.workspaceColumn': 'Workspace', 'awb.workspaceCountColumn': 'Sessions', 'awb.workspacePathColumn': 'Path', 'awb.workspaceHostColumn': 'PeerHost', 'awb.workspaceHost': 'HOST: {host}', 'awb.avatar': 'Appearance', 'awb.voice': 'Voice', 'awb.browserVoice': 'Browser default voice',\n 'awb.mossSetupHint': 'Browser speech is available. Install MOSS on this page to use local voices.',\n 'awb.more': 'More settings',\n 'awb.moreHint': 'All settings apply after you save the configuration.',\n 'awb.save': 'Save configuration', 'awb.cancel': 'Cancel',\n 'awb.placeholder': 'Send a message…', 'awb.empty': 'Hello, what would you like to talk about?', 'awb.send': 'Send', 'awb.stop': 'Stop reply',\n 'awb.state.thinking': 'Thinking', 'awb.state.updating': 'Updating knowledge', 'awb.state.idle': 'Idle', 'awb.state.working': 'Working',\n 'awb.voiceUnavailable': 'Voice is not ready. Configure it in Voice management.',\n 'awb.attachments.add': 'Add attachments', 'awb.attachments.remove': 'Remove attachment: {name}', 'awb.attachments.unnamed': 'Attachment',\n 'awb.attachments.prompt': 'Please review the attachments I sent.',\n 'awb.attachments.countError': 'Add up to 6 attachments.', 'awb.attachments.sizeError': 'Each attachment may be up to 10 MiB, with a total of 20 MiB.',\n 'awb.attachments.typeError': 'Images support PNG, JPEG, WebP, and GIF. Convert this image before adding it.',\n 'awb.command.clear': 'Clear conversation and keep assistant settings', 'awb.command.attachmentsError': 'A clear command cannot include attachments. Remove them first.',\n 'awb.maintenance': 'Conversation maintenance', 'awb.compress': 'Compress conversation', 'awb.clear': 'Clear conversation', 'awb.reset': 'Reset assistant',\n 'awb.clearConfirm': 'This deletes assistant messages and their summary. Project scope and assistant settings are kept.',\n 'awb.resetConfirm': 'This deletes assistant settings, conversation, and derived indexes, then returns to creation. Original project sessions and downloaded assets are kept.',\n 'awb.resetFinalTitle': 'Confirm reset again', 'awb.resetContinue': 'Continue reset', 'awb.resetFinalAction': 'Confirm reset',\n 'awb.resetFinalConfirm': 'Reset your assistant? Settings, conversation, and derived indexes will be cleared and cannot be restored from this page. Original project sessions and downloaded assets are kept.',\n 'awb.confirm': 'Confirm', 'awb.busy': 'Working…', 'awb.loading': 'Preparing assistant', 'awb.loadingHint': 'Preparing your conversation…', 'awb.retry': 'Retry',\n 'awb.summary': 'Conversation summary', 'awb.saved': 'Configuration saved', 'awb.compressed': 'Conversation compressed; the latest three turns are kept', 'awb.cleared': 'Conversation cleared',\n 'awb.index.ready': 'Project knowledge ready', 'awb.index.pending': 'Updating project knowledge', 'awb.index.empty': 'No projects selected',\n 'awb.disabled': 'Enable this feature to create and use your assistant.', 'awb.open': 'Open assistant', 'awb.initial': 'Create an assistant with project knowledge, text, voice, and an appearance in one place.',\n 'awb.asr': 'Speech recognition models', 'awb.devices': 'Audio devices', 'awb.prompts': 'Prompts', 'awb.unavailableSelection': 'Previous selection unavailable: {id}',\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","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 assistantDebugDictionary from './locales/assistantDebug.js'\nimport * as assistantAvatarDictionary from './locales/assistantAvatar.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 voiceModelsDictionary from './locales/voiceModels.js'\nimport * as assistantTtsDictionary from './locales/assistantTts.js'\nimport * as assistantWorkbenchDictionary from './locales/assistantWorkbench.js'\nimport * as subagentCollapsedDictionary from './locales/subagentCollapsed.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.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.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.assistant.label': 'Global smart assistant (Testing)',\n 'feature.assistant.description': 'Summarize progress across selected workspaces and route voice or text instructions to an explicit target session. After enabling this module, fully quit and restart DSH Desktop.',\n 'voice.globalAssistant': 'Global voice assistant (Testing)',\n 'voice.audioNotice': 'Audio is processed by the configured local or cloud voice provider.',\n 'voice.emptyTranscript': 'No usable speech was recognized; nothing was submitted. Please try again.',\n 'voice.invalidTranscript': 'The transcription was not valid, so nothing was submitted. Please say it again.',\n 'voice.secureContextRequired': 'Microphone access requires a secure browser context. Use HTTPS, WSS, or localhost and try again.',\n 'voice.microphoneNotice': 'Starting this control uses the microphone in this browser.',\n 'voice.microphoneUpdated': 'Microphone updated.',\n 'voice.inputDevice': 'Input device',\n 'voice.defaultMicrophone': 'Browser default microphone',\n 'voice.unnamedMicrophone': 'Unnamed microphone',\n 'voice.outputDevice': 'Output device',\n 'voice.defaultOutput': 'Browser/OS default output',\n 'voice.unnamedOutput': 'Unnamed output',\n 'voice.outputUpdated': 'Output device updated.',\n 'voice.dialog.title': 'Global voice assistant (Testing)',\n 'voice.dialog.description': 'Start when you are ready. Recognized speech and assistant replies appear here in real time.',\n 'voice.dialog.realtimeHint': 'Realtime recognition with LLM follow-up conversations. Brief replies use the same project index and model as text debugging.',\n 'voice.dialog.unavailable': 'Realtime Sherpa-ONNX is unavailable. Check the local runtime and model configuration; fallback transcription is disabled.',\n 'voice.dialog.liveText': 'Conversation',\n 'voice.dialog.user': 'You',\n 'voice.dialog.assistant': 'Global assistant',\n 'voice.dialog.empty': 'Nothing recognized yet.',\n 'voice.dialog.start': 'Start realtime conversation',\n 'voice.dialog.stop': 'Stop conversation',\n 'voice.dialog.close': 'Close',\n 'voice.dialog.clear': 'Clear conversation',\n 'voice.dialog.status.loading': 'Preparing microphone…',\n 'voice.dialog.status.listening': 'Listening',\n 'voice.dialog.status.thinking': 'Thinking',\n 'voice.dialog.status.speaking': 'Speaking',\n 'voice.dialog.status.recording': 'Recording',\n 'voice.dialog.status.error': 'Error',\n 'voice.dialog.status.active': 'Active',\n 'voice.dialog.status.idle': 'Idle',\n 'voice.setup.open': 'Configure voice assistant (Testing)',\n 'voice.setup.title': 'Voice model management (Testing)',\n 'voice.setup.description': 'Choose a recommended realtime model. CodingNS will download and initialize it automatically.',\n 'voice.setup.onlyRealtime': 'Only streaming models that support realtime conversation are shown. Files are stored on the current Host and reused after download.',\n 'voice.setup.model': 'Realtime voice model',\n 'voice.setup.modelRequired': 'Choose a realtime voice model.',\n 'voice.setup.downloadHint': 'The first setup downloads the model and configures the runtime. You will not need to enter file paths.',\n 'voice.setup.downloading': 'Downloading and initializing the model. Keep this window open…',\n 'voice.setup.checking': 'Checking local model files…',\n 'voice.setup.downloadFile': 'Downloading file ({index}/{count})',\n 'voice.setup.fileProgress': 'Current file download progress',\n 'voice.setup.filePercent': 'Current file: {percent}%',\n 'voice.setup.downloadedSize': '{size} downloaded',\n 'voice.setup.initializing': 'Model downloaded. Initializing…',\n 'voice.setup.completed': 'Initialization complete',\n 'voice.setup.provider': 'Voice provider',\n 'voice.setup.provider.dsh': 'DSH speechToText(browser hold-to-speak)',\n 'voice.setup.provider.sherpa': 'Sherpa-ONNX(local realtime)',\n 'voice.setup.providerDshHint': 'This mode uses the Host speechToText provider for sentence transcription and browser speech synthesis for replies. No local Sherpa model is required.',\n 'voice.setup.modelHint': 'Enter absolute paths to the Sherpa-ONNX model files on the Host machine.',\n 'voice.setup.asrEncoder': 'ASR encoder model',\n 'voice.setup.asrDecoder': 'ASR decoder model',\n 'voice.setup.asrJoiner': 'ASR joiner model',\n 'voice.setup.asrTokens': 'ASR tokens file',\n 'voice.setup.vadModel': 'VAD model(optional)',\n 'voice.setup.ttsModel': 'TTS model(optional)',\n 'voice.setup.ttsTokens': 'TTS tokens(optional)',\n 'voice.setup.ttsLexicon': 'TTS lexicon(optional)',\n 'voice.setup.optional': 'Optional; leave empty to disable',\n 'voice.setup.required': 'Sherpa-ONNX requires encoder, decoder, joiner, and tokens paths.',\n 'voice.setup.cancel': 'Cancel',\n 'voice.setup.save': 'Download and initialize',\n 'voice.setup.reconfigure': 'Manage models',\n 'voice.setup.status.uninitialized': 'Not initialized; the assistant button opens setup instead of starting voice.',\n 'voice.setup.status.dsh': 'DSH speechToText sentence transcription with browser speech synthesis.',\n 'voice.setup.status.sherpa': 'Sherpa-ONNX local realtime mode.',\n 'assistant.scopeDescription': 'Only selected workspaces are readable by the global assistant. Archived sessions are always excluded.',\n 'assistant.noWorkspaces': 'No workspaces are available in this Host.',\n 'assistant.saved': 'Assistant scope saved.',\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.',\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.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 '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.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.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.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.assistant.label': '全局智能助理(测试中)',\n 'feature.assistant.description': '汇总受管工作区进展,并把语音或文字指令派发到明确的目标会话。启用该模块后,请彻底重启 DSH Desktop。',\n 'voice.globalAssistant': '全局语音助理(测试中)',\n 'voice.audioNotice': '音频会交给当前配置的本地或云端语音提供方处理。',\n 'voice.emptyTranscript': '未识别到有效语音,未提交内容;请重试。',\n 'voice.invalidTranscript': '转写结果无效,未提交内容;请重新说一遍。',\n 'voice.secureContextRequired': '麦克风需要浏览器安全上下文,请改用 HTTPS、WSS 或 localhost 后重试。',\n 'voice.microphoneNotice': '启动此入口会使用当前浏览器的麦克风。',\n 'voice.microphoneUpdated': '麦克风已更新。',\n 'voice.inputDevice': '输入设备',\n 'voice.defaultMicrophone': '浏览器默认麦克风',\n 'voice.unnamedMicrophone': '未命名麦克风',\n 'voice.outputDevice': '输出设备',\n 'voice.defaultOutput': '浏览器/系统默认输出',\n 'voice.unnamedOutput': '未命名输出设备',\n 'voice.outputUpdated': '输出设备已更新。',\n 'voice.dialog.title': '全局语音助理(测试中)',\n 'voice.dialog.description': '点击开始后说话,识别文字和助理回复会实时显示在这里。',\n 'voice.dialog.realtimeHint': '支持连续追问,沿用文字调试的项目索引和模型,简短回复并播报。',\n 'voice.dialog.unavailable': 'Sherpa-ONNX 实时模式不可用,请检查本地运行时和模型配置;已禁用回退转写。',\n 'voice.dialog.liveText': '实时对话',\n 'voice.dialog.user': '你',\n 'voice.dialog.assistant': '全局助理',\n 'voice.dialog.empty': '暂时还没有识别文字。',\n 'voice.dialog.start': '开始实时对话',\n 'voice.dialog.stop': '停止对话',\n 'voice.dialog.close': '关闭',\n 'voice.dialog.clear': '清空对话',\n 'voice.dialog.status.loading': '正在准备麦克风……',\n 'voice.dialog.status.listening': '正在聆听',\n 'voice.dialog.status.thinking': '正在思考',\n 'voice.dialog.status.speaking': '正在播报',\n 'voice.dialog.status.recording': '正在录音',\n 'voice.dialog.status.error': '出错',\n 'voice.dialog.status.active': '运行中',\n 'voice.dialog.status.idle': '未启动',\n 'voice.setup.open': '配置语音助理(测试中)',\n 'voice.setup.title': '语音模型管理(测试中)',\n 'voice.setup.description': '选择一个推荐的实时模型,系统会自动下载并完成初始化。',\n 'voice.setup.onlyRealtime': '这里只显示支持实时对话的流式语音模型。模型文件保存在当前 Host,已下载的文件会自动复用。',\n 'voice.setup.model': '实时语音模型',\n 'voice.setup.modelRequired': '请选择一个实时语音模型。',\n 'voice.setup.downloadHint': '首次使用会自动下载模型并配置运行时,之后无需再次填写路径。',\n 'voice.setup.downloading': '正在下载并初始化模型,请保持此窗口打开……',\n 'voice.setup.checking': '正在检查本地模型文件……',\n 'voice.setup.downloadFile': '正在下载文件({index}/{count})',\n 'voice.setup.fileProgress': '当前文件下载进度',\n 'voice.setup.filePercent': '当前文件:{percent}%',\n 'voice.setup.downloadedSize': '已下载 {size}',\n 'voice.setup.initializing': '模型已下载,正在初始化……',\n 'voice.setup.completed': '初始化完成',\n 'voice.setup.provider': '语音提供商',\n 'voice.setup.provider.dsh': 'DSH speechToText(浏览器按住说话)',\n 'voice.setup.provider.sherpa': 'Sherpa-ONNX(本地实时模式)',\n 'voice.setup.providerDshHint': '此模式使用 Host 的 speechToText 进行句级转写,并使用浏览器 speechSynthesis 播报回复,不需要本地 Sherpa 模型。',\n 'voice.setup.modelHint': '请输入 Host 机器上的 Sherpa-ONNX 模型文件绝对路径。',\n 'voice.setup.asrEncoder': 'ASR encoder 模型',\n 'voice.setup.asrDecoder': 'ASR decoder 模型',\n 'voice.setup.asrJoiner': 'ASR joiner 模型',\n 'voice.setup.asrTokens': 'ASR tokens 文件',\n 'voice.setup.vadModel': 'VAD 模型(可选)',\n 'voice.setup.ttsModel': 'TTS 模型(可选)',\n 'voice.setup.ttsTokens': 'TTS tokens(可选)',\n 'voice.setup.ttsLexicon': 'TTS lexicon(可选)',\n 'voice.setup.optional': '可选;留空表示禁用',\n 'voice.setup.required': 'Sherpa-ONNX 必须填写 encoder、decoder、joiner 和 tokens 路径。',\n 'voice.setup.cancel': '取消',\n 'voice.setup.save': '下载并初始化',\n 'voice.setup.reconfigure': '管理模型',\n 'voice.setup.status.uninitialized': '尚未初始化;点击助手按钮只打开配置页,不会直接启动语音。',\n 'voice.setup.status.dsh': '使用 DSH speechToText 句级转写和浏览器语音播报。',\n 'voice.setup.status.sherpa': '使用 Sherpa-ONNX 本地实时模式。',\n 'assistant.scopeDescription': '全局助理只读取已勾选的工作区,已归档会话始终排除。',\n 'assistant.noWorkspaces': '当前 Host 没有可选工作区。',\n 'assistant.saved': '助理受管范围已保存。',\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.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 '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.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 ...assistantAvatarDictionary.en,\n ...assistantDebugDictionary.en,\n ...gitDictionary.en,\n ...debugDictionary.en,\n ...peerHostDictionary.en,\n ...peerHostWorkspaceDictionary.en,\n ...usageDictionary.en,\n ...voiceModelsDictionary.en,\n ...assistantTtsDictionary.en,\n ...assistantWorkbenchDictionary.en,\n ...fileWorkspaceDictionary.en,\n ...terminalAuthDictionary.en,\n ...panelsDictionary.en,\n ...subagentCollapsedDictionary.en,\n}\n\nconst zh: Record<string, string> = {\n ...CORE_ZH,\n ...assistantAvatarDictionary.zh,\n ...assistantDebugDictionary.zh,\n ...gitDictionary.zh,\n ...debugDictionary.zh,\n ...peerHostDictionary.zh,\n ...peerHostWorkspaceDictionary.zh,\n ...usageDictionary.zh,\n ...voiceModelsDictionary.zh,\n ...assistantTtsDictionary.zh,\n ...assistantWorkbenchDictionary.zh,\n ...fileWorkspaceDictionary.zh,\n ...terminalAuthDictionary.zh,\n ...panelsDictionary.zh,\n ...subagentCollapsedDictionary.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 { 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"],"mappings":"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"}
|