@jingyi0605/codingns4dsh 0.2.1-beta.12 → 0.2.1-beta.14
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 +5 -5
- package/README.md +6 -9
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts.map +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts.map +1 -1
- package/data/build/dist/client/account-bar.d.ts.map +1 -1
- package/data/build/dist/client/account-bar.js +24 -70
- package/data/build/dist/client/account-bar.js.map +1 -1
- package/data/build/dist/client/adapter-catalog-watch.d.ts +1 -1
- package/data/build/dist/client/adapter-catalog-watch.d.ts.map +1 -1
- package/data/build/dist/client/adapter-catalog-watch.js +2 -2
- package/data/build/dist/client/adapter-catalog-watch.js.map +1 -1
- package/data/build/dist/client/bundle.js +40225 -25580
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/cli-management-dialog.d.ts +21 -0
- package/data/build/dist/client/cli-management-dialog.d.ts.map +1 -0
- package/data/build/dist/client/cli-management-dialog.js +215 -0
- package/data/build/dist/client/cli-management-dialog.js.map +1 -0
- package/data/build/dist/client/cli-management-terminal.d.ts +9 -0
- package/data/build/dist/client/cli-management-terminal.d.ts.map +1 -0
- package/data/build/dist/client/cli-management-terminal.js +30 -0
- package/data/build/dist/client/cli-management-terminal.js.map +1 -0
- package/data/build/dist/client/cli-settings-dialog.d.ts +9 -0
- package/data/build/dist/client/cli-settings-dialog.d.ts.map +1 -0
- package/data/build/dist/client/cli-settings-dialog.js +45 -0
- package/data/build/dist/client/cli-settings-dialog.js.map +1 -0
- package/data/build/dist/client/cli-settings-rpc.js +1 -1
- package/data/build/dist/client/cli-settings-rpc.js.map +1 -1
- package/data/build/dist/client/cli-slots.d.ts +4 -0
- package/data/build/dist/client/cli-slots.d.ts.map +1 -1
- package/data/build/dist/client/cli-slots.js +26 -10
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.editor-engine.js +4 -1
- package/data/build/dist/client/client.editor-engine.js.map +1 -1
- package/data/build/dist/client/client.model-catalog-cache.js +9 -1
- package/data/build/dist/client/client.model-catalog-cache.js.map +1 -1
- package/data/build/dist/client/client.native-workspace-store.js +9 -15
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.primitives-adapter.js +53 -0
- package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
- package/data/build/dist/client/client.session-translation.js +16 -0
- package/data/build/dist/client/client.session-translation.js.map +1 -1
- package/data/build/dist/client/client.transport.js +487 -44
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/conversation-translation-settings.d.ts +2 -1
- package/data/build/dist/client/conversation-translation-settings.d.ts.map +1 -1
- package/data/build/dist/client/conversation-translation-settings.js +7 -5
- package/data/build/dist/client/conversation-translation-settings.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +595 -152
- package/data/build/dist/client/editor-engine.d.ts +1 -1
- package/data/build/dist/client/editor-engine.d.ts.map +1 -1
- package/data/build/dist/client/editor-engine.js +4 -1
- package/data/build/dist/client/editor-engine.js.map +1 -1
- package/data/build/dist/client/features/cli-adapters.d.ts +3 -1
- package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
- package/data/build/dist/client/features/cli-adapters.js +183 -105
- package/data/build/dist/client/features/cli-adapters.js.map +1 -1
- package/data/build/dist/client/features/file-management.d.ts.map +1 -1
- package/data/build/dist/client/features/file-management.js +2 -0
- package/data/build/dist/client/features/file-management.js.map +1 -1
- package/data/build/dist/client/features/index.d.ts.map +1 -1
- package/data/build/dist/client/features/index.js +2 -0
- package/data/build/dist/client/features/index.js.map +1 -1
- package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access.js +7 -0
- package/data/build/dist/client/features/mobile-access.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 +3 -0
- package/data/build/dist/client/features/peer-host.js.map +1 -1
- package/data/build/dist/client/features/quick-apps.d.ts +3 -0
- package/data/build/dist/client/features/quick-apps.d.ts.map +1 -0
- package/data/build/dist/client/features/quick-apps.js +14 -0
- package/data/build/dist/client/features/quick-apps.js.map +1 -0
- package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.js +6 -0
- package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
- package/data/build/dist/client/git-management.d.ts.map +1 -1
- package/data/build/dist/client/git-management.js +11 -30
- package/data/build/dist/client/git-management.js.map +1 -1
- package/data/build/dist/client/git-panel-styles.d.ts +4 -0
- package/data/build/dist/client/git-panel-styles.d.ts.map +1 -1
- package/data/build/dist/client/git-panel-styles.js +14 -0
- package/data/build/dist/client/git-panel-styles.js.map +1 -1
- package/data/build/dist/client/html-workspace-files.d.ts +4 -0
- package/data/build/dist/client/html-workspace-files.d.ts.map +1 -0
- package/data/build/dist/client/html-workspace-files.js +114 -0
- package/data/build/dist/client/html-workspace-files.js.map +1 -0
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +14 -0
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/cliManagement.d.ts +3 -0
- package/data/build/dist/client/locales/cliManagement.d.ts.map +1 -0
- package/data/build/dist/client/locales/cliManagement.js +155 -0
- package/data/build/dist/client/locales/cliManagement.js.map +1 -0
- package/data/build/dist/client/locales/fileWorkspace.d.ts.map +1 -1
- package/data/build/dist/client/locales/fileWorkspace.js +4 -0
- package/data/build/dist/client/locales/fileWorkspace.js.map +1 -1
- package/data/build/dist/client/locales/panels.js +2 -2
- package/data/build/dist/client/locales/panels.js.map +1 -1
- package/data/build/dist/client/locales/quickApps.d.ts +132 -0
- package/data/build/dist/client/locales/quickApps.d.ts.map +1 -0
- package/data/build/dist/client/locales/quickApps.js +154 -0
- package/data/build/dist/client/locales/quickApps.js.map +1 -0
- package/data/build/dist/client/mobile-team-panel-dom.d.ts +14 -0
- package/data/build/dist/client/mobile-team-panel-dom.d.ts.map +1 -0
- package/data/build/dist/client/mobile-team-panel-dom.js +164 -0
- package/data/build/dist/client/mobile-team-panel-dom.js.map +1 -0
- package/data/build/dist/client/native-model-translation-menu.d.ts.map +1 -1
- package/data/build/dist/client/native-model-translation-menu.js +3 -1
- package/data/build/dist/client/native-model-translation-menu.js.map +1 -1
- package/data/build/dist/client/provider-icons.d.ts.map +1 -1
- package/data/build/dist/client/provider-icons.js +3 -1
- package/data/build/dist/client/provider-icons.js.map +1 -1
- package/data/build/dist/client/quick-apps/browser-storage.d.ts +24 -0
- package/data/build/dist/client/quick-apps/browser-storage.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/browser-storage.js +114 -0
- package/data/build/dist/client/quick-apps/browser-storage.js.map +1 -0
- package/data/build/dist/client/quick-apps/client.d.ts +31 -0
- package/data/build/dist/client/quick-apps/client.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/client.js +68 -0
- package/data/build/dist/client/quick-apps/client.js.map +1 -0
- package/data/build/dist/client/quick-apps/document.d.ts +26 -0
- package/data/build/dist/client/quick-apps/document.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/document.js +110 -0
- package/data/build/dist/client/quick-apps/document.js.map +1 -0
- package/data/build/dist/client/quick-apps/file-picker.d.ts +14 -0
- package/data/build/dist/client/quick-apps/file-picker.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/file-picker.js +51 -0
- package/data/build/dist/client/quick-apps/file-picker.js.map +1 -0
- package/data/build/dist/client/quick-apps/launcher.d.ts +7 -0
- package/data/build/dist/client/quick-apps/launcher.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/launcher.js +252 -0
- package/data/build/dist/client/quick-apps/launcher.js.map +1 -0
- package/data/build/dist/client/quick-apps/presentation.d.ts +16 -0
- package/data/build/dist/client/quick-apps/presentation.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/presentation.js +31 -0
- package/data/build/dist/client/quick-apps/presentation.js.map +1 -0
- package/data/build/dist/client/quick-apps/reorder-animation.d.ts +6 -0
- package/data/build/dist/client/quick-apps/reorder-animation.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/reorder-animation.js +50 -0
- package/data/build/dist/client/quick-apps/reorder-animation.js.map +1 -0
- package/data/build/dist/client/quick-apps/reorder.d.ts +26 -0
- package/data/build/dist/client/quick-apps/reorder.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/reorder.js +128 -0
- package/data/build/dist/client/quick-apps/reorder.js.map +1 -0
- package/data/build/dist/client/quick-apps/styles.d.ts +3 -0
- package/data/build/dist/client/quick-apps/styles.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/styles.js +143 -0
- package/data/build/dist/client/quick-apps/styles.js.map +1 -0
- package/data/build/dist/client/quick-apps/ui.d.ts +20 -0
- package/data/build/dist/client/quick-apps/ui.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/ui.js +21 -0
- package/data/build/dist/client/quick-apps/ui.js.map +1 -0
- package/data/build/dist/client/quick-apps/viewer.d.ts +16 -0
- package/data/build/dist/client/quick-apps/viewer.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/viewer.js +165 -0
- package/data/build/dist/client/quick-apps/viewer.js.map +1 -0
- package/data/build/dist/client/quick-apps/workspace-picker.d.ts +19 -0
- package/data/build/dist/client/quick-apps/workspace-picker.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/workspace-picker.js +30 -0
- package/data/build/dist/client/quick-apps/workspace-picker.js.map +1 -0
- package/data/build/dist/client/session-translation-chat.d.ts +1 -1
- package/data/build/dist/client/session-translation-chat.d.ts.map +1 -1
- package/data/build/dist/client/session-translation-chat.js +26 -22
- package/data/build/dist/client/session-translation-chat.js.map +1 -1
- package/data/build/dist/client/sidebar-footer-style.d.ts +13 -0
- package/data/build/dist/client/sidebar-footer-style.d.ts.map +1 -0
- package/data/build/dist/client/sidebar-footer-style.js +54 -0
- package/data/build/dist/client/sidebar-footer-style.js.map +1 -0
- package/data/build/dist/client/style.css +219 -219
- package/data/build/dist/client/terminal/model.d.ts.map +1 -1
- package/data/build/dist/client/terminal/model.js +2 -1
- package/data/build/dist/client/terminal/model.js.map +1 -1
- package/data/build/dist/client/workspace-session-rightbar-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-rightbar-dom.js +12 -21
- package/data/build/dist/client/workspace-session-rightbar-dom.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +5 -4
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts +4 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js +8 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +18 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +21 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts +18 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js +11 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts +8 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +100 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts +3 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js +22 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts +52 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js +109 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts +11 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js +97 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts +36 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js +164 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts +44 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js +240 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts +37 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js +35 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts +13 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js +30 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts +21 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js +132 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts +10 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.js +33 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +7 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +18 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts +13 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js +24 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +16 -8
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.d.ts +1 -0
- package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +27 -6
- package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/types.js.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js +6 -3
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/binary-detection.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/binary-detection.js +7 -3
- package/data/build/dist/host/cli-adapters/binary-detection.js.map +1 -1
- package/data/build/dist/host/cli-adapters/claude-driver.d.ts +1 -0
- package/data/build/dist/host/cli-adapters/claude-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/claude-driver.js +183 -20
- package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +18 -0
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js +110 -11
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts +91 -0
- package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-performance-projection.js +8 -0
- package/data/build/dist/host/cli-adapters/codex-performance-projection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-performance.d.ts +16 -0
- package/data/build/dist/host/cli-adapters/codex-performance.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-performance.js +81 -0
- package/data/build/dist/host/cli-adapters/codex-performance.js.map +1 -0
- 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 +11 -1
- 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.js +3 -2
- package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts +3 -1
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.js +41 -4
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.js.map +1 -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 +19 -5
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-virtual-providers.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js +3 -2
- package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts +2 -0
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +164 -34
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/gemini-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/gemini-driver.js +4 -2
- package/data/build/dist/host/cli-adapters/gemini-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts +6 -0
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.js +327 -30
- package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts +123 -0
- package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/grok-performance-projection.js +48 -0
- package/data/build/dist/host/cli-adapters/grok-performance-projection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/grok-usage.d.ts +45 -0
- package/data/build/dist/host/cli-adapters/grok-usage.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/grok-usage.js +197 -0
- package/data/build/dist/host/cli-adapters/grok-usage.js.map +1 -0
- package/data/build/dist/host/cli-adapters/legacy-session-adapter.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/legacy-session-adapter.js +20 -3
- package/data/build/dist/host/cli-adapters/legacy-session-adapter.js.map +1 -1
- package/data/build/dist/host/cli-adapters/management-installation.d.ts +5 -0
- package/data/build/dist/host/cli-adapters/management-installation.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management-installation.js +131 -0
- package/data/build/dist/host/cli-adapters/management-installation.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management-methods.d.ts +37 -0
- package/data/build/dist/host/cli-adapters/management-methods.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management-methods.js +144 -0
- package/data/build/dist/host/cli-adapters/management-methods.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management-process.d.ts +7 -0
- package/data/build/dist/host/cli-adapters/management-process.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management-process.js +62 -0
- package/data/build/dist/host/cli-adapters/management-process.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management.d.ts +32 -0
- package/data/build/dist/host/cli-adapters/management.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management.js +177 -0
- package/data/build/dist/host/cli-adapters/management.js.map +1 -0
- package/data/build/dist/host/cli-adapters/mcode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/mcode-driver.js +11 -4
- package/data/build/dist/host/cli-adapters/mcode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/model-catalog.d.ts +1 -0
- package/data/build/dist/host/cli-adapters/model-catalog.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/model-catalog.js +62 -0
- package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js +11 -3
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js.map +1 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts +7 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.js +4 -2
- package/data/build/dist/host/cli-adapters/native-team-subagent.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +22 -0
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.js +105 -17
- package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.d.ts +2 -0
- package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.js +16 -11
- package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts +7 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.js +98 -30
- package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
- package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts +74 -0
- package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/session-performance-projection.js +83 -0
- package/data/build/dist/host/cli-adapters/session-performance-projection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/standard-stream-driver.js +4 -0
- package/data/build/dist/host/cli-adapters/standard-stream-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts +3 -1
- package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/stream-normalizer.js +2 -0
- package/data/build/dist/host/cli-adapters/stream-normalizer.js.map +1 -1
- package/data/build/dist/host/cli-adapters/subagent-tool.js +1 -1
- package/data/build/dist/host/cli-adapters/subagent-tool.js.map +1 -1
- package/data/build/dist/host/cli-adapters/team-input.d.ts +17 -0
- package/data/build/dist/host/cli-adapters/team-input.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/team-input.js +67 -0
- package/data/build/dist/host/cli-adapters/team-input.js.map +1 -0
- package/data/build/dist/host/cli-adapters/update-check.d.ts +34 -0
- package/data/build/dist/host/cli-adapters/update-check.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/update-check.js +263 -0
- package/data/build/dist/host/cli-adapters/update-check.js.map +1 -0
- package/data/build/dist/host/cli-adapters/zcode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/zcode-driver.js +6 -1
- package/data/build/dist/host/cli-adapters/zcode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/zcode-update.d.ts +8 -0
- package/data/build/dist/host/cli-adapters/zcode-update.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/zcode-update.js +149 -0
- package/data/build/dist/host/cli-adapters/zcode-update.js.map +1 -0
- package/data/build/dist/host/cli-bridge/bridge-holder.d.ts +14 -0
- package/data/build/dist/host/cli-bridge/bridge-holder.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-holder.js +53 -6
- package/data/build/dist/host/cli-bridge/bridge-holder.js.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-server.d.ts +4 -0
- package/data/build/dist/host/cli-bridge/bridge-server.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-server.js +34 -6
- package/data/build/dist/host/cli-bridge/bridge-server.js.map +1 -1
- package/data/build/dist/host/cli-bridge/command-code-mod.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/command-code-mod.js +43 -0
- package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.js +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.d.ts +3 -0
- package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.js +23 -7
- package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +22 -3
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
- package/data/build/dist/host/cli-bridge/team-adapters.d.ts +11 -0
- package/data/build/dist/host/cli-bridge/team-adapters.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/team-adapters.js +22 -0
- package/data/build/dist/host/cli-bridge/team-adapters.js.map +1 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.d.ts +28 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.js +208 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.js.map +1 -0
- package/data/build/dist/host/cli-bridge/team-tool.d.ts +3 -0
- package/data/build/dist/host/cli-bridge/team-tool.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/team-tool.js +18 -0
- package/data/build/dist/host/cli-bridge/team-tool.js.map +1 -0
- package/data/build/dist/host/features/file-management.d.ts.map +1 -1
- package/data/build/dist/host/features/file-management.js +8 -0
- package/data/build/dist/host/features/file-management.js.map +1 -1
- package/data/build/dist/host/features/index.d.ts.map +1 -1
- package/data/build/dist/host/features/index.js +2 -0
- package/data/build/dist/host/features/index.js.map +1 -1
- package/data/build/dist/host/features/lan-access-dsh.js +1 -1
- package/data/build/dist/host/features/lan-access-dsh.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 +7 -0
- package/data/build/dist/host/features/peer-host.js.map +1 -1
- package/data/build/dist/host/features/quick-apps.d.ts +4 -0
- package/data/build/dist/host/features/quick-apps.d.ts.map +1 -0
- package/data/build/dist/host/features/quick-apps.js +158 -0
- package/data/build/dist/host/features/quick-apps.js.map +1 -0
- package/data/build/dist/host/features/session-prompt-translation.d.ts +1 -1
- package/data/build/dist/host/features/session-prompt-translation.d.ts.map +1 -1
- package/data/build/dist/host/features/session-prompt-translation.js +13 -4
- package/data/build/dist/host/features/session-prompt-translation.js.map +1 -1
- package/data/build/dist/host/features/session-translation-protection.d.ts +6 -0
- package/data/build/dist/host/features/session-translation-protection.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-protection.js +21 -0
- package/data/build/dist/host/features/session-translation-protection.js.map +1 -1
- package/data/build/dist/host/features/session-translation-recovery.d.ts +3 -2
- package/data/build/dist/host/features/session-translation-recovery.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-recovery.js +6 -3
- package/data/build/dist/host/features/session-translation-recovery.js.map +1 -1
- package/data/build/dist/host/features/session-translation-service.d.ts +3 -0
- package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-service.js +14 -8
- package/data/build/dist/host/features/session-translation-service.js.map +1 -1
- package/data/build/dist/host/features/types.d.ts +10 -0
- package/data/build/dist/host/features/types.d.ts.map +1 -1
- package/data/build/dist/host/html-workspace-files.d.ts +3 -0
- package/data/build/dist/host/html-workspace-files.d.ts.map +1 -0
- package/data/build/dist/host/html-workspace-files.js +135 -0
- package/data/build/dist/host/html-workspace-files.js.map +1 -0
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +27 -2
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/lan-access-dsh.d.ts +5 -1
- package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
- package/data/build/dist/host/lan-access-dsh.js +43 -2
- package/data/build/dist/host/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts +5 -0
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts.map +1 -0
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.js +27 -0
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/browse.d.ts +5 -0
- package/data/build/dist/host/modules/quick-apps/browse.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/browse.js +37 -0
- package/data/build/dist/host/modules/quick-apps/browse.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.d.ts +4 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.js +39 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/documents.d.ts +14 -0
- package/data/build/dist/host/modules/quick-apps/documents.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/documents.js +87 -0
- package/data/build/dist/host/modules/quick-apps/documents.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/errors.d.ts +8 -0
- package/data/build/dist/host/modules/quick-apps/errors.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/errors.js +15 -0
- package/data/build/dist/host/modules/quick-apps/errors.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/file-api.d.ts +30 -0
- package/data/build/dist/host/modules/quick-apps/file-api.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/file-api.js +149 -0
- package/data/build/dist/host/modules/quick-apps/file-api.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/launches.d.ts +35 -0
- package/data/build/dist/host/modules/quick-apps/launches.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/launches.js +80 -0
- package/data/build/dist/host/modules/quick-apps/launches.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/paths.d.ts +14 -0
- package/data/build/dist/host/modules/quick-apps/paths.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/paths.js +72 -0
- package/data/build/dist/host/modules/quick-apps/paths.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/registry.d.ts +30 -0
- package/data/build/dist/host/modules/quick-apps/registry.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/registry.js +186 -0
- package/data/build/dist/host/modules/quick-apps/registry.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/remote.d.ts +38 -0
- package/data/build/dist/host/modules/quick-apps/remote.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/remote.js +238 -0
- package/data/build/dist/host/modules/quick-apps/remote.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/service.d.ts +27 -0
- package/data/build/dist/host/modules/quick-apps/service.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/service.js +174 -0
- package/data/build/dist/host/modules/quick-apps/service.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.d.ts +8 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.js +190 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.js.map +1 -0
- package/data/build/dist/host/native-session-bridge.d.ts +5 -0
- package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
- package/data/build/dist/host/native-session-bridge.js +3 -0
- package/data/build/dist/host/native-session-bridge.js.map +1 -1
- package/data/build/dist/host/rpc.d.ts.map +1 -1
- package/data/build/dist/host/rpc.js +8 -3
- package/data/build/dist/host/rpc.js.map +1 -1
- package/data/build/dist/host/session-migration-repair.js +48 -35
- package/data/build/dist/host/session-migration-repair.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +13 -0
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/host/workspace-file-mutations.d.ts +2 -0
- package/data/build/dist/host/workspace-file-mutations.d.ts.map +1 -0
- package/data/build/dist/host/workspace-file-mutations.js +15 -0
- package/data/build/dist/host/workspace-file-mutations.js.map +1 -0
- package/data/build/dist/shared/cli-provider-route.d.ts +7 -0
- package/data/build/dist/shared/cli-provider-route.d.ts.map +1 -0
- package/data/build/dist/shared/cli-provider-route.js +13 -0
- package/data/build/dist/shared/cli-provider-route.js.map +1 -0
- package/data/build/dist/shared/codex-performance.d.ts +3 -0
- package/data/build/dist/shared/codex-performance.d.ts.map +1 -0
- package/data/build/dist/shared/codex-performance.js +2 -0
- package/data/build/dist/shared/codex-performance.js.map +1 -0
- package/data/build/dist/shared/contracts/agent-team.d.ts +14 -0
- package/data/build/dist/shared/contracts/agent-team.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/agent-team.js +48 -0
- package/data/build/dist/shared/contracts/agent-team.js.map +1 -0
- package/data/build/dist/shared/contracts/cli-adapter.d.ts +35 -0
- package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/cli-management.d.ts +29 -0
- package/data/build/dist/shared/contracts/cli-management.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/cli-management.js +2 -0
- package/data/build/dist/shared/contracts/cli-management.js.map +1 -0
- package/data/build/dist/shared/contracts/config.d.ts +2 -0
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts +2 -2
- package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/quick-apps.d.ts +68 -0
- package/data/build/dist/shared/contracts/quick-apps.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/quick-apps.js +4 -0
- package/data/build/dist/shared/contracts/quick-apps.js.map +1 -0
- package/data/build/dist/shared/contracts/session-translation.d.ts +8 -3
- package/data/build/dist/shared/contracts/session-translation.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/session-translation.js +14 -0
- package/data/build/dist/shared/contracts/session-translation.js.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +9 -15
- package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.js +8 -14
- package/data/build/dist/shared/contracts/version.js.map +1 -1
- package/data/build/dist/shared/peer-host-http-routes.d.ts +4 -0
- package/data/build/dist/shared/peer-host-http-routes.d.ts.map +1 -1
- package/data/build/dist/shared/peer-host-http-routes.js +4 -0
- package/data/build/dist/shared/peer-host-http-routes.js.map +1 -1
- package/data/build/dist/shared/quick-app-browser-storage.d.ts +33 -0
- package/data/build/dist/shared/quick-app-browser-storage.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-browser-storage.js +33 -0
- package/data/build/dist/shared/quick-app-browser-storage.js.map +1 -0
- package/data/build/dist/shared/quick-app-proxy-path.d.ts +6 -0
- package/data/build/dist/shared/quick-app-proxy-path.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-proxy-path.js +18 -0
- package/data/build/dist/shared/quick-app-proxy-path.js.map +1 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts +9 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.js +186 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.js.map +1 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts +7 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts.map +1 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.js +10 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.js.map +1 -0
- package/data/build/dist/shared/request-performance.d.ts +15 -0
- package/data/build/dist/shared/request-performance.d.ts.map +1 -0
- package/data/build/dist/shared/request-performance.js +3 -0
- package/data/build/dist/shared/request-performance.js.map +1 -0
- package/package.json +32 -32
- package/profile/README.md +2 -2
- package/profile/package.json +3 -3
- package/profile/version.json +3 -3
- package/version.json +3 -3
|
@@ -6,6 +6,13 @@ window.__ModuleLoader__.load({
|
|
|
6
6
|
var exports = module.exports;
|
|
7
7
|
const require_transport = require("@jingyi0605/codingns4dsh/client.transport.js");
|
|
8
8
|
const require_primitives_adapter = require("@jingyi0605/codingns4dsh/client.primitives-adapter.js");
|
|
9
|
+
/** A bare brand name does not establish ownership of a DSH provider. */
|
|
10
|
+
function fromCliProviderId(provider) {
|
|
11
|
+
if (typeof provider !== "string" || !provider.startsWith("codingns-cli-")) return void 0;
|
|
12
|
+
const adapterId = provider.slice(13);
|
|
13
|
+
return adapterId === "" ? void 0 : adapterId;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
9
16
|
//#region src/client/provider-icons.ts
|
|
10
17
|
/** 未绑定和未知 Agent 使用中性灰,绝不冒充任一已知品牌色。 */
|
|
11
18
|
const PROVIDER_NEUTRAL_COLOR = "#71717a";
|
|
@@ -155,7 +162,8 @@ window.__ModuleLoader__.load({
|
|
|
155
162
|
}
|
|
156
163
|
/** 兼容旧版 CN profile 的会话快照,但不重新暴露第二个 Provider。 */
|
|
157
164
|
function normalizeProviderAdapterId(adapterId) {
|
|
158
|
-
|
|
165
|
+
const normalized = fromCliProviderId(adapterId) ?? adapterId;
|
|
166
|
+
return normalized === "codebuddy-cn" ? "codebuddy" : normalized;
|
|
159
167
|
}
|
|
160
168
|
const CODINGNS4DSH_DEBUG_LEVEL_ENV = "CODINGNS4DSH_DEBUG_LEVEL";
|
|
161
169
|
const LEGACY_DEBUG_ENV = "CODINGNS4DSH_TUNNEL_DEBUG";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.model-catalog-cache.js","names":["resolveCodingNsTranslator","CODINGNS_RPC_CHANNEL","parseVirtualSessionId"],"sources":["../../../../src/client/provider-icons.ts","../../../../src/shared/debug.ts","../../../../src/client/cli-catalog.ts","../../../../src/client/model-catalog-cache.ts"],"sourcesContent":["import { resolveCodingNsTranslator, type CodingNsTranslator } from './locale.js'\n\nexport interface ProviderVisual {\n readonly adapterId: string | null\n readonly displayName: string\n readonly iconUrl: string | undefined\n readonly color: string\n}\n\ninterface ProviderDefinition {\n readonly adapterId: string\n readonly displayName: string\n readonly displayNameKey?: string\n readonly color: string\n}\n\n/** 未绑定和未知 Agent 使用中性灰,绝不冒充任一已知品牌色。 */\nexport const PROVIDER_NEUTRAL_COLOR = '#71717a'\n\n/**\n * 外部 Agent 标识、显示名称与标签颜色的唯一映射。浏览器入口另行安装内联资产。\n *\n * 标签颜色用于会话行/归档列表的彩色标识:优先贴近本地图标或品牌色,\n * 并保持在浅色与深色主题下都可读的中等明度区间。\n */\nconst PROVIDER_DEFINITIONS: Readonly<Record<string, ProviderDefinition>> = {\n dsh: { adapterId: 'dsh', displayName: 'DeepSeek Harness', color: '#2563eb' },\n 'command-code': { adapterId: 'command-code', displayName: 'Command Code', color: '#8b5cf6' },\n 'claude-code': { adapterId: 'claude-code', displayName: 'Claude Code', color: '#d97757' },\n kimi: { adapterId: 'kimi', displayName: 'Kimi', color: '#0ea5e9' },\n gemini: { adapterId: 'gemini', displayName: 'Gemini CLI', color: '#4285f4' },\n pi: { adapterId: 'pi', displayName: 'Pi', color: '#f59e0b' },\n codex: { adapterId: 'codex', displayName: 'Codex', color: '#10a37f' },\n opencode: { adapterId: 'opencode', displayName: 'OpenCode', color: '#14b8a6' },\n grok: { adapterId: 'grok', displayName: 'Grok', color: '#71717a' },\n mcode: { adapterId: 'mcode', displayName: 'MiniMax Code', color: '#f97316' },\n zcode: { adapterId: 'zcode', displayName: 'ZCode', color: '#38bdf8' },\n codebuddy: { adapterId: 'codebuddy', displayName: 'CodeBuddy', color: '#2563eb' },\n workbuddy: { adapterId: 'workbuddy', displayName: 'WorkBuddy', color: '#0f766e' },\n 'cursor-cli': { adapterId: 'cursor-cli', displayName: 'Cursor CLI', color: '#111827' },\n 'kiro-cli': { adapterId: 'kiro-cli', displayName: 'Kiro CLI', color: '#7c3aed' },\n qoder: { adapterId: 'qoder', displayName: 'Qoder', color: '#ea580c' },\n 'qoder-cn': { adapterId: 'qoder-cn', displayName: 'Qoder CN', color: '#c2410c' },\n antigravity: { adapterId: 'antigravity', displayName: 'Antigravity', color: '#1d4ed8' },\n doubao: { adapterId: 'doubao', displayName: 'Doubao App', displayNameKey: 'provider.doubao', color: '#477fe8' },\n}\n\nconst PROVIDER_ICONS: Record<string, string> = {}\n\n/** 只由浏览器入口调用,使普通 Node 测试不需要加载 png/svg。 */\nexport function installProviderIcons(icons: Readonly<Record<string, string>>): void {\n for (const adapterId of Object.keys(PROVIDER_ICONS)) delete PROVIDER_ICONS[adapterId]\n // 资源也包含 R4 等上游品牌,不要求它同时是可执行的 Agent。\n for (const adapterId of Object.keys(icons)) {\n const iconUrl = icons[adapterId]\n if (iconUrl !== undefined) PROVIDER_ICONS[adapterId] = iconUrl\n }\n}\n\nexport function providerIconUrl(adapterId: string): string | undefined {\n return PROVIDER_ICONS[normalizeProviderAdapterId(adapterId)]\n}\n\n/**\n * 未绑定和未知值都返回中性占位,绝不冒充任一已知品牌。\n *\n * 第二个参数是 Codingns4DSH 词典翻译函数;未提供时退回内置中文词典,\n * 保证不接 locale 的调用方与单测仍能拿到稳定的展示名。\n */\nexport function providerVisual(adapterId: string | undefined, t?: CodingNsTranslator): ProviderVisual {\n const translate = t ?? resolveCodingNsTranslator()\n if (adapterId === undefined || adapterId.trim() === '') {\n return { adapterId: null, displayName: translate('provider.unbound'), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n const normalizedAdapterId = normalizeProviderAdapterId(adapterId)\n const definition = PROVIDER_DEFINITIONS[normalizedAdapterId]\n if (definition === undefined) {\n return { adapterId, displayName: translate('provider.unknown', { adapterId }), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n return { ...definition, displayName: definition.displayNameKey ? translate(definition.displayNameKey) : definition.displayName, iconUrl: PROVIDER_ICONS[normalizedAdapterId] }\n}\n\n/** 兼容旧版 CN profile 的会话快照,但不重新暴露第二个 Provider。 */\nfunction normalizeProviderAdapterId(adapterId: string): string {\n return adapterId === 'codebuddy-cn' ? 'codebuddy' : adapterId\n}\n\nexport { PROVIDER_DEFINITIONS, PROVIDER_ICONS }\n","/**\n * Codingns4DSH 调试日志开关。\n *\n * 调试输出默认关闭。需要查看启动或 RPC 追踪时,使用\n * `CODINGNS4DSH_DEBUG=1 dsh ...` 启动 DSH;浏览器侧同时支持 `?dshDebug=1`。\n * 只看警告和错误时使用 `CODINGNS4DSH_DEBUG_LEVEL=warn`,也接受\n * `CODINGNS4DSH_DEBUG=warn` 作为简写。\n */\nexport const CODINGNS4DSH_DEBUG_ENV = 'CODINGNS4DSH_DEBUG'\nexport const CODINGNS4DSH_DEBUG_LEVEL_ENV = 'CODINGNS4DSH_DEBUG_LEVEL'\n/** 兼容脚本化启动器的显式警告模式开关。 */\nexport const CODINGNS4DSH_DEBUG_WARN_ENV = 'CODINGNS4DSH_DEBUG_WARN'\n\nconst LEGACY_DEBUG_ENV = 'CODINGNS4DSH_TUNNEL_DEBUG'\n\nexport type CodingNsDebugLevel = 'off' | 'warn' | 'info'\n\n/** 当前运行环境是否明确要求输出调试日志。 */\nexport function resolveCodingNsDebugEnabled(): boolean {\n return resolveCodingNsDebugLevel() !== 'off'\n}\n\n/** 解析调试日志级别;`warn` 会过滤普通追踪信息,只保留警告和错误。 */\nexport function resolveCodingNsDebugLevel(): CodingNsDebugLevel {\n const globals = globalThis as typeof globalThis & {\n __CODINGNS4DSH_DEBUG_ENABLED__?: unknown\n __CODINGNS4DSH_DEBUG_LEVEL__?: unknown\n __CODINGNS4DSH_TUNNEL_DEBUG__?: unknown\n }\n if (globals.__CODINGNS4DSH_DEBUG_LEVEL__ !== undefined) {\n return parseDebugLevel(globals.__CODINGNS4DSH_DEBUG_LEVEL__)\n }\n const globalValue = globals.__CODINGNS4DSH_DEBUG_ENABLED__ ?? globals.__CODINGNS4DSH_TUNNEL_DEBUG__\n if (globalValue !== undefined) return parseDebugValue(globalValue) ? 'info' : 'off'\n\n if (typeof location !== 'undefined') {\n const searchParams = new URL(location.href).searchParams\n const queryValue = searchParams.get('dshDebugLevel') ?? searchParams.get('dshDebug')\n if (queryValue !== null) return parseDebugLevel(queryValue)\n }\n\n if (typeof localStorage !== 'undefined') {\n try {\n const storedLevel = localStorage.getItem('codingns4dsh-debug-level')\n if (storedLevel !== null) return parseDebugLevel(storedLevel)\n const storedWarn = localStorage.getItem('codingns4dsh-debug-warn')\n if (storedWarn !== null && parseDebugValue(storedWarn)) return 'warn'\n const stored = localStorage.getItem('codingns4dsh-debug')\n ?? localStorage.getItem('codingns4dsh-tunnel-debug')\n if (stored !== null) return parseDebugLevel(stored)\n } catch {\n // 隐私模式或受限 iframe 可能禁止读取 localStorage,继续检查进程环境变量。\n }\n }\n\n if (typeof process !== 'undefined') {\n const level = process.env[CODINGNS4DSH_DEBUG_LEVEL_ENV]\n if (level !== undefined) return parseDebugLevel(level)\n if (parseDebugValue(process.env[CODINGNS4DSH_DEBUG_WARN_ENV])) return 'warn'\n return parseDebugLevel(process.env[CODINGNS4DSH_DEBUG_ENV] ?? process.env[LEGACY_DEBUG_ENV])\n }\n return 'off'\n}\n\n/** 输出受统一开关控制的调试信息。 */\nexport function debugInfo(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugLevel() === 'info') console.info(message, ...args)\n}\n\n/** 输出受统一开关控制的调试警告。 */\nexport function debugWarn(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugEnabled()) console.warn(message, ...args)\n}\n\nfunction parseDebugValue(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value !== 'string') return false\n return /^(1|true|yes|on)$/iu.test(value.trim())\n}\n\nfunction parseDebugLevel(value: unknown): CodingNsDebugLevel {\n if (typeof value === 'boolean') return value ? 'info' : 'off'\n if (typeof value !== 'string') return 'off'\n const normalized = value.trim().toLowerCase()\n if (/^(warn|warning|error)$/u.test(normalized)) return 'warn'\n if (/^(1|true|yes|on|info|debug)$/u.test(normalized)) return 'info'\n return 'off'\n}\n","import type {\n CodingNsCliAdapterDescriptor,\n CodingNsCliModel,\n CodingNsCliModelCatalog,\n CodingNsCliSessionRecord,\n} from '../shared/contracts/cli-adapter.js'\nimport { CODINGNS_RPC_CHANNEL } from '../shared/contracts/transport.js'\nimport { debugInfo, debugWarn } from '../shared/debug.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport type { CodingNsTranslator } from './locale.js'\n\n/** 设置页和选择器使用同一状态文案,检测中或失败都不能显示成未安装。 */\nexport function adapterDetectionLabel(adapter: CodingNsCliAdapterDescriptor): 'cli.detecting' | 'cli.detectionFailed' | 'cli.installed' | 'cli.installedOffline' | 'cli.notInstalled' {\n if (adapter.detectionState === 'pending' || adapter.detectionState === 'running') return 'cli.detecting'\n if (adapter.detectionState === 'error') return 'cli.detectionFailed'\n if (adapter.installed && adapter.runtimeState === 'installed') return 'cli.installedOffline'\n return adapter.installed ? 'cli.installed' : 'cli.notInstalled'\n}\n\n/** Client 侧访问 Host CLI 命名空间的统一入口。 */\nexport async function callCliRpc<T>(rpc: CodingNsRpcClient, action: string, payload: unknown, signal?: AbortSignal): Promise<T> {\n let response\n try {\n debugInfo('codingns4dsh: cli rpc request', { channel: CODINGNS_RPC_CHANNEL, action })\n response = await rpc.call(CODINGNS_RPC_CHANNEL, `cli/${action}`, payload, signal)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (!/HTTP (?:404|405)\\b/u.test(message)) throw error\n debugWarn('codingns4dsh: cli rpc fallback', { action, error: message })\n try {\n response = await rpc.call('/api', `codingns/cli/${action}`, payload, signal)\n } catch (fallbackError) {\n console.error('codingns4dsh: cli rpc fallback failed', { action, error: fallbackError })\n throw fallbackError\n }\n }\n if (!response.ok) {\n console.error('codingns4dsh: cli rpc response error', { action, error: response.error })\n throw new Error(response.error.message)\n }\n debugInfo('codingns4dsh: cli rpc response success', { action })\n return response.value as T\n}\n\nexport function adapterCatalogWithDsh(catalog: readonly CodingNsCliAdapterDescriptor[], dshVersion?: string): CodingNsCliAdapterDescriptor[] {\n // 对话框只展示实际可用的适配器;未安装或已停用的适配器由设置页管理。\n const available = catalog.filter((adapter) => adapter.installed && adapter.enabled)\n const version = dshVersion?.trim()\n const existingDsh = available.find((adapter) => adapter.id === 'dsh')\n if (existingDsh !== undefined) {\n if (version === undefined || version === '' || existingDsh.version === version) return available\n return available.map((adapter) => adapter.id === 'dsh' ? { ...adapter, version } : adapter)\n }\n return [{ id: 'dsh', name: 'DeepSeek Harness', installed: true, enabled: true, version: version === undefined || version === '' ? null : version, command: null }, ...available]\n}\n\nexport function firstModel(catalog: CodingNsCliModelCatalog): CodingNsCliModel | undefined {\n for (const group of catalog.groups) {\n const model = group.models[0]\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function findModel(catalog: CodingNsCliModelCatalog, modelId: string | undefined): CodingNsCliModel | undefined {\n if (modelId === undefined) return undefined\n for (const group of catalog.groups) {\n const model = group.models.find((item) => item.id === modelId)\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** 旧 Host 缺少重新检测动作时给出版本提示;网络和检测错误仍保留原始原因。 */\nexport function catalogRefreshErrorMessage(error: unknown, t: CodingNsTranslator): string {\n const message = errorMessage(error)\n return /^未知 CLI RPC: cli\\/catalog\\/refresh$/u.test(message)\n ? t('cli.redetectHostUnsupported')\n : message\n}\n\n/** 读取 Host 持久化的外部会话索引;兼容数组和带 items/sessions 的响应包装。 */\nexport async function listCliSessions(\n rpc: CodingNsRpcClient,\n options: { readonly includeArchived?: boolean; readonly adapterId?: string } = {},\n): Promise<readonly CodingNsCliSessionRecord[]> {\n const value = await callCliRpc<unknown>(rpc, 'session/list', options)\n const rows = Array.isArray(value)\n ? value\n : isRecord(value) && Array.isArray(value.items)\n ? value.items\n : isRecord(value) && Array.isArray(value.sessions)\n ? value.sessions\n : []\n return rows.filter(isCliSessionRecord).map(redactCliSessionRecord)\n}\n\n/** 把已存在的 DSH 会话恢复到原生会话页面;插件不接管消息列表。 */\nexport async function restoreCliSession(\n rpc: CodingNsRpcClient,\n record: CodingNsCliSessionRecord,\n): Promise<void> {\n await callCliRpc(rpc, 'session/set', {\n sessionId: record.dshSessionId,\n adapterId: record.adapterId,\n ...(record.modelId ? { modelId: record.modelId } : {}),\n ...(record.effortId ? { effortId: record.effortId } : {}),\n ...(record.serviceTierId ? { serviceTierId: record.serviceTierId } : {}),\n ...(record.providerId ? { providerId: record.providerId } : {}),\n ...(record.providerSessionId ? { providerSessionId: record.providerSessionId } : {}),\n })\n navigateToDshSession(record.dshSessionId)\n}\n\n/** 通过 Host 同步归档 DSH 原生会话和 Codingns4DSH 外部会话索引。 */\nexport async function archiveCliSession(\n rpc: CodingNsRpcClient,\n sessionId: string,\n): Promise<void> {\n await callCliRpc(rpc, 'session/archive', { sessionId })\n}\n\n/**\n * 使用 DSH 当前的会话路由,而不是在插件中复制会话消息组件。\n * 旧版 DSH 使用 `/sessions/:id`,新版 workspace 页面使用同一路径的 workspace 前缀,\n * 因此保留当前 workspace 段并只替换 session id。\n */\nexport function navigateToDshSession(sessionId: string): void {\n if (typeof window === 'undefined' || sessionId.trim() === '') return\n const encoded = encodeURIComponent(sessionId.trim())\n const pathname = window.location.pathname\n const nextPath = /^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u, `$1${encoded}`)\n : /^\\/sessions\\/[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^\\/sessions\\/[^/]+(?:\\/.*)?$/u, `/sessions/${encoded}`)\n : `/sessions/${encoded}`\n if (`${window.location.pathname}${window.location.search}${window.location.hash}` === `${nextPath}${window.location.search}${window.location.hash}`) return\n window.history.pushState({}, '', nextPath)\n window.dispatchEvent(new PopStateEvent('popstate'))\n}\n\nfunction isCliSessionRecord(value: unknown): value is CodingNsCliSessionRecord {\n if (!isRecord(value)) return false\n return typeof value.dshSessionId === 'string'\n && value.dshSessionId.trim() !== ''\n && typeof value.adapterId === 'string'\n && value.adapterId.trim() !== ''\n && (value.status === 'active' || value.status === 'idle' || value.status === 'error' || value.status === 'archived')\n && typeof value.createdAt === 'string'\n && typeof value.updatedAt === 'string'\n}\n\n/** 双重防护:即使旧 Host 错误返回 rawStoreRef,浏览器也不会把它留在状态中。 */\nfunction redactCliSessionRecord(record: CodingNsCliSessionRecord): CodingNsCliSessionRecord {\n const { rawStoreRef: _rawStoreRef, ...safe } = record\n return safe\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { CodingNsCliModelCatalog } from '../shared/contracts/cli-adapter.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport { callCliRpc } from './cli-catalog.js'\nimport { parseVirtualSessionId } from '../shared/contracts/peer-host.js'\n\n/**\n * Client 侧模型目录缓存。\n *\n * Agent 选择器、模型选择器和委派弹层共享同一份 RPC 结果。缓存只属于当前\n * RPC 客户端实例与会话所属 Host,同一 Host 的会话共享目录,跨 Host 不复用。\n */\nconst modelCatalogCaches = new WeakMap<object, Map<string, CodingNsCliModelCatalog>>()\nconst modelCatalogLoads = new WeakMap<object, Map<string, Promise<CodingNsCliModelCatalog>>>()\n/** PeerHost 复用页面 RPC 实例,用稳定的 Host 身份隔离目录、请求与复检节流。 */\nconst modelCatalogHostKeys = new WeakMap<object, Map<string, object>>()\n\nfunction modelCatalogKey(rpc: CodingNsRpcClient, sessionId?: string): object {\n const hostId = sessionId === undefined ? undefined : parseVirtualSessionId(sessionId)?.hostId\n if (hostId === undefined) return rpc as object\n let hosts = modelCatalogHostKeys.get(rpc as object)\n if (hosts === undefined) {\n hosts = new Map()\n modelCatalogHostKeys.set(rpc as object, hosts)\n }\n let key = hosts.get(hostId)\n if (key === undefined) { key = {}; hosts.set(hostId, key) }\n return key\n}\n\n/**\n * Client 缓存有效期。\n *\n * 目录里既有模型清单,也有账号级事实(例如 Codex 的 `officialSubscription`\n * 与 `defaultServiceTier`)。后者会随用户在外部工具里切换供应商或登录状态而\n * 变化,而页面不会因此重新挂载。若 Client 永久持有第一次的结果,依赖这些事实\n * 的控件(Codex 官方订阅的 Fast 档位开关)就会在整场会话里一直缺失。\n *\n * 因此这里给出一个短 TTL:命中即用(不阻塞渲染),过期后重新请求。Host 侧还会\n * 比对 Provider 配置指纹,配置真正变化时立即失效,不依赖这个 TTL。\n */\nexport const MODEL_CATALOG_CACHE_TTL_MS = 60_000\n\ninterface CachedCatalog {\n readonly value: CodingNsCliModelCatalog\n readonly storedAt: number\n}\n\nconst modelCatalogCacheTimes = new WeakMap<object, Map<string, CachedCatalog>>()\n\nfunction cacheEntry(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): CachedCatalog | undefined {\n return cacheTimesFor(rpc, sessionId).get(adapterId)\n}\n\nfunction cacheTimesFor(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CachedCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogCacheTimes.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogCacheTimes.set(key, times)\n }\n return times\n}\n\nfunction storeCatalog(rpc: CodingNsRpcClient, adapterId: string, value: CodingNsCliModelCatalog, sessionId?: string): void {\n getModelCatalogCache(rpc, sessionId).set(adapterId, value)\n cacheTimesFor(rpc, sessionId).set(adapterId, { value, storedAt: Date.now() })\n}\n\n/** 指定会话时只作废其 Host;旧调用不传会话时仍清理整个 RPC 的指定目录。 */\nexport function invalidateModelCatalogCache(rpc: CodingNsRpcClient, adapterId?: string, sessionId?: string): void {\n const keys = sessionId === undefined\n ? [rpc as object, ...(modelCatalogHostKeys.get(rpc as object)?.values() ?? [])]\n : [modelCatalogKey(rpc, sessionId)]\n for (const key of keys) {\n const cache = modelCatalogCaches.get(key)\n const times = modelCatalogCacheTimes.get(key)\n const loads = modelCatalogLoads.get(key)\n if (adapterId === undefined) loads?.clear()\n else loads?.delete(adapterId)\n if (adapterId === undefined) { cache?.clear(); times?.clear() }\n else { cache?.delete(adapterId); times?.delete(adapterId) }\n }\n}\n\n/**\n * 「判定可能过期」时的复检节流。\n *\n * 目录声明了服务档位却未确认官方订阅时,值得再探测一次;但真实第三方接入会\n * 长期停在这个状态,不能每次挂载都发一次请求。这里按适配器记录最近一次复检\n * 时间,只有超过间隔才允许再次作废缓存。\n */\nexport const MODEL_CATALOG_REVALIDATE_INTERVAL_MS = 60_000\n\nconst modelCatalogRevalidations = new WeakMap<object, Map<string, number>>()\n\nexport function shouldRevalidateModelCatalog(\n rpc: CodingNsRpcClient,\n adapterId: string,\n needsRevalidation: boolean,\n sessionId?: string,\n): boolean {\n if (!needsRevalidation) return false\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogRevalidations.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogRevalidations.set(key, times)\n }\n const last = times.get(adapterId)\n const now = Date.now()\n if (last !== undefined && now - last < MODEL_CATALOG_REVALIDATE_INTERVAL_MS) return false\n times.set(adapterId, now)\n return true\n}\n\nexport function getModelCatalogCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CodingNsCliModelCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogCaches.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogCaches.set(key, cache)\n }\n return cache\n}\n\nexport function loadModelCatalog(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): Promise<CodingNsCliModelCatalog> {\n const cached = getModelCatalogCache(rpc, sessionId).get(adapterId)\n // 回退目录由 Host 保存;用户重新检测后清理此缓存并读取最新结果。\n if (cached !== undefined && cached.fallback !== true && isFreshCacheEntry(rpc, adapterId, cached, sessionId)) {\n return Promise.resolve(cached)\n }\n if (cached !== undefined) invalidateModelCatalogCache(rpc, adapterId, sessionId)\n const loads = getModelCatalogLoadCache(rpc, sessionId)\n const running = loads.get(adapterId)\n if (running !== undefined) return running\n const request = callCliRpc<CodingNsCliModelCatalog>(rpc, 'models', {\n adapterId,\n ...(sessionId === undefined ? {} : { sessionId }),\n }).then((value) => {\n // 手动重新检测已替换请求时,迟到结果不能复活被作废的目录。\n if (loads.get(adapterId) !== request) return loadModelCatalog(rpc, adapterId, sessionId)\n if (value.fallback === true) invalidateModelCatalogCache(rpc, adapterId, sessionId)\n else storeCatalog(rpc, adapterId, value, sessionId)\n return value\n }).finally(() => {\n if (loads.get(adapterId) === request) loads.delete(adapterId)\n })\n loads.set(adapterId, request)\n return request\n}\n\n/** 缓存条目是否仍在有效期内;没有时间戳的旧条目按过期处理并触发一次重新读取。 */\nfunction isFreshCacheEntry(rpc: CodingNsRpcClient, adapterId: string, cached: CodingNsCliModelCatalog, sessionId?: string): boolean {\n const entry = cacheEntry(rpc, adapterId, sessionId)\n if (entry === undefined || entry.value !== cached) return false\n return Date.now() - entry.storedAt < MODEL_CATALOG_CACHE_TTL_MS\n}\n\nfunction getModelCatalogLoadCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, Promise<CodingNsCliModelCatalog>> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogLoads.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogLoads.set(key, cache)\n }\n return cache\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.model-catalog-cache.js","names":["resolveCodingNsTranslator","CODINGNS_RPC_CHANNEL","parseVirtualSessionId"],"sources":["../../../../src/shared/cli-provider-route.ts","../../../../src/client/provider-icons.ts","../../../../src/shared/debug.ts","../../../../src/client/cli-catalog.ts","../../../../src/client/model-catalog-cache.ts"],"sourcesContent":["import type { CodingNsCliAdapterId } from './contracts/cli-adapter.js'\n\nexport const CLI_PROVIDER_PREFIX = 'codingns-cli-'\n\n/** DSH provider routes are global; persisted adapter IDs remain plugin-local. */\nexport function toCliProviderId(adapterId: CodingNsCliAdapterId): string {\n return `${CLI_PROVIDER_PREFIX}${adapterId}`\n}\n\n/** A bare brand name does not establish ownership of a DSH provider. */\nexport function fromCliProviderId(provider: unknown): CodingNsCliAdapterId | undefined {\n if (typeof provider !== 'string' || !provider.startsWith(CLI_PROVIDER_PREFIX)) return undefined\n const adapterId = provider.slice(CLI_PROVIDER_PREFIX.length)\n return adapterId === '' ? undefined : adapterId\n}\n","import { resolveCodingNsTranslator, type CodingNsTranslator } from './locale.js'\nimport { fromCliProviderId } from '../shared/cli-provider-route.js'\n\nexport interface ProviderVisual {\n readonly adapterId: string | null\n readonly displayName: string\n readonly iconUrl: string | undefined\n readonly color: string\n}\n\ninterface ProviderDefinition {\n readonly adapterId: string\n readonly displayName: string\n readonly displayNameKey?: string\n readonly color: string\n}\n\n/** 未绑定和未知 Agent 使用中性灰,绝不冒充任一已知品牌色。 */\nexport const PROVIDER_NEUTRAL_COLOR = '#71717a'\n\n/**\n * 外部 Agent 标识、显示名称与标签颜色的唯一映射。浏览器入口另行安装内联资产。\n *\n * 标签颜色用于会话行/归档列表的彩色标识:优先贴近本地图标或品牌色,\n * 并保持在浅色与深色主题下都可读的中等明度区间。\n */\nconst PROVIDER_DEFINITIONS: Readonly<Record<string, ProviderDefinition>> = {\n dsh: { adapterId: 'dsh', displayName: 'DeepSeek Harness', color: '#2563eb' },\n 'command-code': { adapterId: 'command-code', displayName: 'Command Code', color: '#8b5cf6' },\n 'claude-code': { adapterId: 'claude-code', displayName: 'Claude Code', color: '#d97757' },\n kimi: { adapterId: 'kimi', displayName: 'Kimi', color: '#0ea5e9' },\n gemini: { adapterId: 'gemini', displayName: 'Gemini CLI', color: '#4285f4' },\n pi: { adapterId: 'pi', displayName: 'Pi', color: '#f59e0b' },\n codex: { adapterId: 'codex', displayName: 'Codex', color: '#10a37f' },\n opencode: { adapterId: 'opencode', displayName: 'OpenCode', color: '#14b8a6' },\n grok: { adapterId: 'grok', displayName: 'Grok', color: '#71717a' },\n mcode: { adapterId: 'mcode', displayName: 'MiniMax Code', color: '#f97316' },\n zcode: { adapterId: 'zcode', displayName: 'ZCode', color: '#38bdf8' },\n codebuddy: { adapterId: 'codebuddy', displayName: 'CodeBuddy', color: '#2563eb' },\n workbuddy: { adapterId: 'workbuddy', displayName: 'WorkBuddy', color: '#0f766e' },\n 'cursor-cli': { adapterId: 'cursor-cli', displayName: 'Cursor CLI', color: '#111827' },\n 'kiro-cli': { adapterId: 'kiro-cli', displayName: 'Kiro CLI', color: '#7c3aed' },\n qoder: { adapterId: 'qoder', displayName: 'Qoder', color: '#ea580c' },\n 'qoder-cn': { adapterId: 'qoder-cn', displayName: 'Qoder CN', color: '#c2410c' },\n antigravity: { adapterId: 'antigravity', displayName: 'Antigravity', color: '#1d4ed8' },\n doubao: { adapterId: 'doubao', displayName: 'Doubao App', displayNameKey: 'provider.doubao', color: '#477fe8' },\n}\n\nconst PROVIDER_ICONS: Record<string, string> = {}\n\n/** 只由浏览器入口调用,使普通 Node 测试不需要加载 png/svg。 */\nexport function installProviderIcons(icons: Readonly<Record<string, string>>): void {\n for (const adapterId of Object.keys(PROVIDER_ICONS)) delete PROVIDER_ICONS[adapterId]\n // 资源也包含 R4 等上游品牌,不要求它同时是可执行的 Agent。\n for (const adapterId of Object.keys(icons)) {\n const iconUrl = icons[adapterId]\n if (iconUrl !== undefined) PROVIDER_ICONS[adapterId] = iconUrl\n }\n}\n\nexport function providerIconUrl(adapterId: string): string | undefined {\n return PROVIDER_ICONS[normalizeProviderAdapterId(adapterId)]\n}\n\n/**\n * 未绑定和未知值都返回中性占位,绝不冒充任一已知品牌。\n *\n * 第二个参数是 Codingns4DSH 词典翻译函数;未提供时退回内置中文词典,\n * 保证不接 locale 的调用方与单测仍能拿到稳定的展示名。\n */\nexport function providerVisual(adapterId: string | undefined, t?: CodingNsTranslator): ProviderVisual {\n const translate = t ?? resolveCodingNsTranslator()\n if (adapterId === undefined || adapterId.trim() === '') {\n return { adapterId: null, displayName: translate('provider.unbound'), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n const normalizedAdapterId = normalizeProviderAdapterId(adapterId)\n const definition = PROVIDER_DEFINITIONS[normalizedAdapterId]\n if (definition === undefined) {\n return { adapterId, displayName: translate('provider.unknown', { adapterId }), iconUrl: undefined, color: PROVIDER_NEUTRAL_COLOR }\n }\n return { ...definition, displayName: definition.displayNameKey ? translate(definition.displayNameKey) : definition.displayName, iconUrl: PROVIDER_ICONS[normalizedAdapterId] }\n}\n\n/** 兼容旧版 CN profile 的会话快照,但不重新暴露第二个 Provider。 */\nfunction normalizeProviderAdapterId(adapterId: string): string {\n const normalized = fromCliProviderId(adapterId) ?? adapterId\n return normalized === 'codebuddy-cn' ? 'codebuddy' : normalized\n}\n\nexport { PROVIDER_DEFINITIONS, PROVIDER_ICONS }\n","/**\n * Codingns4DSH 调试日志开关。\n *\n * 调试输出默认关闭。需要查看启动或 RPC 追踪时,使用\n * `CODINGNS4DSH_DEBUG=1 dsh ...` 启动 DSH;浏览器侧同时支持 `?dshDebug=1`。\n * 只看警告和错误时使用 `CODINGNS4DSH_DEBUG_LEVEL=warn`,也接受\n * `CODINGNS4DSH_DEBUG=warn` 作为简写。\n */\nexport const CODINGNS4DSH_DEBUG_ENV = 'CODINGNS4DSH_DEBUG'\nexport const CODINGNS4DSH_DEBUG_LEVEL_ENV = 'CODINGNS4DSH_DEBUG_LEVEL'\n/** 兼容脚本化启动器的显式警告模式开关。 */\nexport const CODINGNS4DSH_DEBUG_WARN_ENV = 'CODINGNS4DSH_DEBUG_WARN'\n\nconst LEGACY_DEBUG_ENV = 'CODINGNS4DSH_TUNNEL_DEBUG'\n\nexport type CodingNsDebugLevel = 'off' | 'warn' | 'info'\n\n/** 当前运行环境是否明确要求输出调试日志。 */\nexport function resolveCodingNsDebugEnabled(): boolean {\n return resolveCodingNsDebugLevel() !== 'off'\n}\n\n/** 解析调试日志级别;`warn` 会过滤普通追踪信息,只保留警告和错误。 */\nexport function resolveCodingNsDebugLevel(): CodingNsDebugLevel {\n const globals = globalThis as typeof globalThis & {\n __CODINGNS4DSH_DEBUG_ENABLED__?: unknown\n __CODINGNS4DSH_DEBUG_LEVEL__?: unknown\n __CODINGNS4DSH_TUNNEL_DEBUG__?: unknown\n }\n if (globals.__CODINGNS4DSH_DEBUG_LEVEL__ !== undefined) {\n return parseDebugLevel(globals.__CODINGNS4DSH_DEBUG_LEVEL__)\n }\n const globalValue = globals.__CODINGNS4DSH_DEBUG_ENABLED__ ?? globals.__CODINGNS4DSH_TUNNEL_DEBUG__\n if (globalValue !== undefined) return parseDebugValue(globalValue) ? 'info' : 'off'\n\n if (typeof location !== 'undefined') {\n const searchParams = new URL(location.href).searchParams\n const queryValue = searchParams.get('dshDebugLevel') ?? searchParams.get('dshDebug')\n if (queryValue !== null) return parseDebugLevel(queryValue)\n }\n\n if (typeof localStorage !== 'undefined') {\n try {\n const storedLevel = localStorage.getItem('codingns4dsh-debug-level')\n if (storedLevel !== null) return parseDebugLevel(storedLevel)\n const storedWarn = localStorage.getItem('codingns4dsh-debug-warn')\n if (storedWarn !== null && parseDebugValue(storedWarn)) return 'warn'\n const stored = localStorage.getItem('codingns4dsh-debug')\n ?? localStorage.getItem('codingns4dsh-tunnel-debug')\n if (stored !== null) return parseDebugLevel(stored)\n } catch {\n // 隐私模式或受限 iframe 可能禁止读取 localStorage,继续检查进程环境变量。\n }\n }\n\n if (typeof process !== 'undefined') {\n const level = process.env[CODINGNS4DSH_DEBUG_LEVEL_ENV]\n if (level !== undefined) return parseDebugLevel(level)\n if (parseDebugValue(process.env[CODINGNS4DSH_DEBUG_WARN_ENV])) return 'warn'\n return parseDebugLevel(process.env[CODINGNS4DSH_DEBUG_ENV] ?? process.env[LEGACY_DEBUG_ENV])\n }\n return 'off'\n}\n\n/** 输出受统一开关控制的调试信息。 */\nexport function debugInfo(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugLevel() === 'info') console.info(message, ...args)\n}\n\n/** 输出受统一开关控制的调试警告。 */\nexport function debugWarn(message: unknown, ...args: unknown[]): void {\n if (resolveCodingNsDebugEnabled()) console.warn(message, ...args)\n}\n\nfunction parseDebugValue(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value !== 'string') return false\n return /^(1|true|yes|on)$/iu.test(value.trim())\n}\n\nfunction parseDebugLevel(value: unknown): CodingNsDebugLevel {\n if (typeof value === 'boolean') return value ? 'info' : 'off'\n if (typeof value !== 'string') return 'off'\n const normalized = value.trim().toLowerCase()\n if (/^(warn|warning|error)$/u.test(normalized)) return 'warn'\n if (/^(1|true|yes|on|info|debug)$/u.test(normalized)) return 'info'\n return 'off'\n}\n","import type {\n CodingNsCliAdapterDescriptor,\n CodingNsCliModel,\n CodingNsCliModelCatalog,\n CodingNsCliSessionRecord,\n} from '../shared/contracts/cli-adapter.js'\nimport { CODINGNS_RPC_CHANNEL } from '../shared/contracts/transport.js'\nimport { debugInfo, debugWarn } from '../shared/debug.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport type { CodingNsTranslator } from './locale.js'\n\n/** 设置页和选择器使用同一状态文案,检测中或失败都不能显示成未安装。 */\nexport function adapterDetectionLabel(adapter: CodingNsCliAdapterDescriptor): 'cli.detecting' | 'cli.detectionFailed' | 'cli.installed' | 'cli.installedOffline' | 'cli.notInstalled' {\n if (adapter.detectionState === 'pending' || adapter.detectionState === 'running') return 'cli.detecting'\n if (adapter.detectionState === 'error') return 'cli.detectionFailed'\n if (adapter.installed && adapter.runtimeState === 'installed') return 'cli.installedOffline'\n return adapter.installed ? 'cli.installed' : 'cli.notInstalled'\n}\n\n/** Client 侧访问 Host CLI 命名空间的统一入口。 */\nexport async function callCliRpc<T>(rpc: CodingNsRpcClient, action: string, payload: unknown, signal?: AbortSignal): Promise<T> {\n let response\n try {\n debugInfo('codingns4dsh: cli rpc request', { channel: CODINGNS_RPC_CHANNEL, action })\n response = await rpc.call(CODINGNS_RPC_CHANNEL, `cli/${action}`, payload, signal)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (!/HTTP (?:404|405)\\b/u.test(message)) throw error\n debugWarn('codingns4dsh: cli rpc fallback', { action, error: message })\n try {\n response = await rpc.call('/api', `codingns/cli/${action}`, payload, signal)\n } catch (fallbackError) {\n console.error('codingns4dsh: cli rpc fallback failed', { action, error: fallbackError })\n throw fallbackError\n }\n }\n if (!response.ok) {\n console.error('codingns4dsh: cli rpc response error', { action, error: response.error })\n throw new Error(response.error.message)\n }\n debugInfo('codingns4dsh: cli rpc response success', { action })\n return response.value as T\n}\n\nexport function adapterCatalogWithDsh(catalog: readonly CodingNsCliAdapterDescriptor[], dshVersion?: string): CodingNsCliAdapterDescriptor[] {\n // 对话框只展示实际可用的适配器;未安装或已停用的适配器由设置页管理。\n const available = catalog.filter((adapter) => adapter.installed && adapter.enabled)\n const version = dshVersion?.trim()\n const existingDsh = available.find((adapter) => adapter.id === 'dsh')\n if (existingDsh !== undefined) {\n if (version === undefined || version === '' || existingDsh.version === version) return available\n return available.map((adapter) => adapter.id === 'dsh' ? { ...adapter, version } : adapter)\n }\n return [{ id: 'dsh', name: 'DeepSeek Harness', installed: true, enabled: true, version: version === undefined || version === '' ? null : version, command: null }, ...available]\n}\n\nexport function firstModel(catalog: CodingNsCliModelCatalog): CodingNsCliModel | undefined {\n for (const group of catalog.groups) {\n const model = group.models[0]\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function findModel(catalog: CodingNsCliModelCatalog, modelId: string | undefined): CodingNsCliModel | undefined {\n if (modelId === undefined) return undefined\n for (const group of catalog.groups) {\n const model = group.models.find((item) => item.id === modelId)\n if (model !== undefined) return model\n }\n return undefined\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** 旧 Host 缺少重新检测动作时给出版本提示;网络和检测错误仍保留原始原因。 */\nexport function catalogRefreshErrorMessage(error: unknown, t: CodingNsTranslator): string {\n const message = errorMessage(error)\n return /^未知 CLI RPC: cli\\/catalog\\/refresh$/u.test(message)\n ? t('cli.redetectHostUnsupported')\n : message\n}\n\n/** 读取 Host 持久化的外部会话索引;兼容数组和带 items/sessions 的响应包装。 */\nexport async function listCliSessions(\n rpc: CodingNsRpcClient,\n options: { readonly includeArchived?: boolean; readonly adapterId?: string } = {},\n): Promise<readonly CodingNsCliSessionRecord[]> {\n const value = await callCliRpc<unknown>(rpc, 'session/list', options)\n const rows = Array.isArray(value)\n ? value\n : isRecord(value) && Array.isArray(value.items)\n ? value.items\n : isRecord(value) && Array.isArray(value.sessions)\n ? value.sessions\n : []\n return rows.filter(isCliSessionRecord).map(redactCliSessionRecord)\n}\n\n/** 把已存在的 DSH 会话恢复到原生会话页面;插件不接管消息列表。 */\nexport async function restoreCliSession(\n rpc: CodingNsRpcClient,\n record: CodingNsCliSessionRecord,\n): Promise<void> {\n await callCliRpc(rpc, 'session/set', {\n sessionId: record.dshSessionId,\n adapterId: record.adapterId,\n ...(record.modelId ? { modelId: record.modelId } : {}),\n ...(record.effortId ? { effortId: record.effortId } : {}),\n ...(record.serviceTierId ? { serviceTierId: record.serviceTierId } : {}),\n ...(record.providerId ? { providerId: record.providerId } : {}),\n ...(record.providerSessionId ? { providerSessionId: record.providerSessionId } : {}),\n })\n navigateToDshSession(record.dshSessionId)\n}\n\n/** 通过 Host 同步归档 DSH 原生会话和 Codingns4DSH 外部会话索引。 */\nexport async function archiveCliSession(\n rpc: CodingNsRpcClient,\n sessionId: string,\n): Promise<void> {\n await callCliRpc(rpc, 'session/archive', { sessionId })\n}\n\n/**\n * 使用 DSH 当前的会话路由,而不是在插件中复制会话消息组件。\n * 旧版 DSH 使用 `/sessions/:id`,新版 workspace 页面使用同一路径的 workspace 前缀,\n * 因此保留当前 workspace 段并只替换 session id。\n */\nexport function navigateToDshSession(sessionId: string): void {\n if (typeof window === 'undefined' || sessionId.trim() === '') return\n const encoded = encodeURIComponent(sessionId.trim())\n const pathname = window.location.pathname\n const nextPath = /^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^(\\/workspaces\\/[^/]+\\/sessions\\/)[^/]+(?:\\/.*)?$/u, `$1${encoded}`)\n : /^\\/sessions\\/[^/]+(?:\\/.*)?$/u.test(pathname)\n ? pathname.replace(/^\\/sessions\\/[^/]+(?:\\/.*)?$/u, `/sessions/${encoded}`)\n : `/sessions/${encoded}`\n if (`${window.location.pathname}${window.location.search}${window.location.hash}` === `${nextPath}${window.location.search}${window.location.hash}`) return\n window.history.pushState({}, '', nextPath)\n window.dispatchEvent(new PopStateEvent('popstate'))\n}\n\nfunction isCliSessionRecord(value: unknown): value is CodingNsCliSessionRecord {\n if (!isRecord(value)) return false\n return typeof value.dshSessionId === 'string'\n && value.dshSessionId.trim() !== ''\n && typeof value.adapterId === 'string'\n && value.adapterId.trim() !== ''\n && (value.status === 'active' || value.status === 'idle' || value.status === 'error' || value.status === 'archived')\n && typeof value.createdAt === 'string'\n && typeof value.updatedAt === 'string'\n}\n\n/** 双重防护:即使旧 Host 错误返回 rawStoreRef,浏览器也不会把它留在状态中。 */\nfunction redactCliSessionRecord(record: CodingNsCliSessionRecord): CodingNsCliSessionRecord {\n const { rawStoreRef: _rawStoreRef, ...safe } = record\n return safe\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { CodingNsCliModelCatalog } from '../shared/contracts/cli-adapter.js'\nimport type { CodingNsRpcClient } from './features/types.js'\nimport { callCliRpc } from './cli-catalog.js'\nimport { parseVirtualSessionId } from '../shared/contracts/peer-host.js'\n\n/**\n * Client 侧模型目录缓存。\n *\n * Agent 选择器、模型选择器和委派弹层共享同一份 RPC 结果。缓存只属于当前\n * RPC 客户端实例与会话所属 Host,同一 Host 的会话共享目录,跨 Host 不复用。\n */\nconst modelCatalogCaches = new WeakMap<object, Map<string, CodingNsCliModelCatalog>>()\nconst modelCatalogLoads = new WeakMap<object, Map<string, Promise<CodingNsCliModelCatalog>>>()\n/** PeerHost 复用页面 RPC 实例,用稳定的 Host 身份隔离目录、请求与复检节流。 */\nconst modelCatalogHostKeys = new WeakMap<object, Map<string, object>>()\n\nfunction modelCatalogKey(rpc: CodingNsRpcClient, sessionId?: string): object {\n const hostId = sessionId === undefined ? undefined : parseVirtualSessionId(sessionId)?.hostId\n if (hostId === undefined) return rpc as object\n let hosts = modelCatalogHostKeys.get(rpc as object)\n if (hosts === undefined) {\n hosts = new Map()\n modelCatalogHostKeys.set(rpc as object, hosts)\n }\n let key = hosts.get(hostId)\n if (key === undefined) { key = {}; hosts.set(hostId, key) }\n return key\n}\n\n/**\n * Client 缓存有效期。\n *\n * 目录里既有模型清单,也有账号级事实(例如 Codex 的 `officialSubscription`\n * 与 `defaultServiceTier`)。后者会随用户在外部工具里切换供应商或登录状态而\n * 变化,而页面不会因此重新挂载。若 Client 永久持有第一次的结果,依赖这些事实\n * 的控件(Codex 官方订阅的 Fast 档位开关)就会在整场会话里一直缺失。\n *\n * 因此这里给出一个短 TTL:命中即用(不阻塞渲染),过期后重新请求。Host 侧还会\n * 比对 Provider 配置指纹,配置真正变化时立即失效,不依赖这个 TTL。\n */\nexport const MODEL_CATALOG_CACHE_TTL_MS = 60_000\n\ninterface CachedCatalog {\n readonly value: CodingNsCliModelCatalog\n readonly storedAt: number\n}\n\nconst modelCatalogCacheTimes = new WeakMap<object, Map<string, CachedCatalog>>()\n\nfunction cacheEntry(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): CachedCatalog | undefined {\n return cacheTimesFor(rpc, sessionId).get(adapterId)\n}\n\nfunction cacheTimesFor(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CachedCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogCacheTimes.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogCacheTimes.set(key, times)\n }\n return times\n}\n\nfunction storeCatalog(rpc: CodingNsRpcClient, adapterId: string, value: CodingNsCliModelCatalog, sessionId?: string): void {\n getModelCatalogCache(rpc, sessionId).set(adapterId, value)\n cacheTimesFor(rpc, sessionId).set(adapterId, { value, storedAt: Date.now() })\n}\n\n/** 指定会话时只作废其 Host;旧调用不传会话时仍清理整个 RPC 的指定目录。 */\nexport function invalidateModelCatalogCache(rpc: CodingNsRpcClient, adapterId?: string, sessionId?: string): void {\n const keys = sessionId === undefined\n ? [rpc as object, ...(modelCatalogHostKeys.get(rpc as object)?.values() ?? [])]\n : [modelCatalogKey(rpc, sessionId)]\n for (const key of keys) {\n const cache = modelCatalogCaches.get(key)\n const times = modelCatalogCacheTimes.get(key)\n const loads = modelCatalogLoads.get(key)\n if (adapterId === undefined) loads?.clear()\n else loads?.delete(adapterId)\n if (adapterId === undefined) { cache?.clear(); times?.clear() }\n else { cache?.delete(adapterId); times?.delete(adapterId) }\n }\n}\n\n/**\n * 「判定可能过期」时的复检节流。\n *\n * 目录声明了服务档位却未确认官方订阅时,值得再探测一次;但真实第三方接入会\n * 长期停在这个状态,不能每次挂载都发一次请求。这里按适配器记录最近一次复检\n * 时间,只有超过间隔才允许再次作废缓存。\n */\nexport const MODEL_CATALOG_REVALIDATE_INTERVAL_MS = 60_000\n\nconst modelCatalogRevalidations = new WeakMap<object, Map<string, number>>()\n\nexport function shouldRevalidateModelCatalog(\n rpc: CodingNsRpcClient,\n adapterId: string,\n needsRevalidation: boolean,\n sessionId?: string,\n): boolean {\n if (!needsRevalidation) return false\n const key = modelCatalogKey(rpc, sessionId)\n let times = modelCatalogRevalidations.get(key)\n if (times === undefined) {\n times = new Map()\n modelCatalogRevalidations.set(key, times)\n }\n const last = times.get(adapterId)\n const now = Date.now()\n if (last !== undefined && now - last < MODEL_CATALOG_REVALIDATE_INTERVAL_MS) return false\n times.set(adapterId, now)\n return true\n}\n\nexport function getModelCatalogCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, CodingNsCliModelCatalog> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogCaches.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogCaches.set(key, cache)\n }\n return cache\n}\n\nexport function loadModelCatalog(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): Promise<CodingNsCliModelCatalog> {\n const cached = getModelCatalogCache(rpc, sessionId).get(adapterId)\n // 回退目录由 Host 保存;用户重新检测后清理此缓存并读取最新结果。\n if (cached !== undefined && cached.fallback !== true && isFreshCacheEntry(rpc, adapterId, cached, sessionId)) {\n return Promise.resolve(cached)\n }\n if (cached !== undefined) invalidateModelCatalogCache(rpc, adapterId, sessionId)\n const loads = getModelCatalogLoadCache(rpc, sessionId)\n const running = loads.get(adapterId)\n if (running !== undefined) return running\n const request = callCliRpc<CodingNsCliModelCatalog>(rpc, 'models', {\n adapterId,\n ...(sessionId === undefined ? {} : { sessionId }),\n }).then((value) => {\n // 手动重新检测已替换请求时,迟到结果不能复活被作废的目录。\n if (loads.get(adapterId) !== request) return loadModelCatalog(rpc, adapterId, sessionId)\n if (value.fallback === true) invalidateModelCatalogCache(rpc, adapterId, sessionId)\n else storeCatalog(rpc, adapterId, value, sessionId)\n return value\n }).finally(() => {\n if (loads.get(adapterId) === request) loads.delete(adapterId)\n })\n loads.set(adapterId, request)\n return request\n}\n\n/** 缓存条目是否仍在有效期内;没有时间戳的旧条目按过期处理并触发一次重新读取。 */\nfunction isFreshCacheEntry(rpc: CodingNsRpcClient, adapterId: string, cached: CodingNsCliModelCatalog, sessionId?: string): boolean {\n const entry = cacheEntry(rpc, adapterId, sessionId)\n if (entry === undefined || entry.value !== cached) return false\n return Date.now() - entry.storedAt < MODEL_CATALOG_CACHE_TTL_MS\n}\n\nfunction getModelCatalogLoadCache(rpc: CodingNsRpcClient, sessionId?: string): Map<string, Promise<CodingNsCliModelCatalog>> {\n const key = modelCatalogKey(rpc, sessionId)\n let cache = modelCatalogLoads.get(key)\n if (cache === undefined) {\n cache = new Map()\n modelCatalogLoads.set(key, cache)\n }\n return cache\n}\n"],"mappings":"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"}
|
|
@@ -7,21 +7,15 @@ window.__ModuleLoader__.load({
|
|
|
7
7
|
const require_assistant_notifications = require("@jingyi0605/codingns4dsh/client.assistant-notifications.js");
|
|
8
8
|
const require_session_translation = require("@jingyi0605/codingns4dsh/client.session-translation.js");
|
|
9
9
|
//#region src/shared/contracts/version.ts
|
|
10
|
-
/**
|
|
11
|
-
const DSH_VERSION = "0.2.1-
|
|
10
|
+
/** DSH verification target, synchronized with the root version.json. */
|
|
11
|
+
const DSH_VERSION = "0.2.1-rc.2";
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* alpha.2 用 `subagents.startActivation()` 取代 `startContinuable()`,由
|
|
18
|
-
* `subagent.activation` / `subagent.continuable` 两条能力路由分别探测,业务侧
|
|
19
|
-
* 经 `startNativeSubagent()` 归一化调用,因此同一个版本范围仍然成立。
|
|
20
|
-
*
|
|
21
|
-
* 这里保留明确上界,是为了让 npm/DSH 安装期也能识别 0.2.1-alpha.2 这个跨 patch
|
|
22
|
-
* 预发布版本;出现新的 API 世代或结构变化时,应重新验证并更新范围与能力路由。
|
|
13
|
+
* Supported hosts retain the 0.2.0-rc.2 floor and include 0.2.1-rc.2.
|
|
14
|
+
* Capability adapters preserve earlier subagent, peer and message contracts.
|
|
15
|
+
* Keep an explicit upper bound: a later prerelease requires verification before
|
|
16
|
+
* either installation checks or runtime capability selection may accept it.
|
|
23
17
|
*/
|
|
24
|
-
const DSH_COMPATIBILITY = ">=0.2.0-rc.2 <=0.2.1-
|
|
18
|
+
const DSH_COMPATIBILITY = ">=0.2.0-rc.2 <=0.2.1-rc.2";
|
|
25
19
|
/**
|
|
26
20
|
* 兼容范围下界,即插件仍然接受的最低 DSH 版本。
|
|
27
21
|
*
|
|
@@ -30,7 +24,7 @@ window.__ModuleLoader__.load({
|
|
|
30
24
|
* “不支持的 DSH 版本”,把仅仅缺少启动页注入的页面误判为宿主不兼容。
|
|
31
25
|
*/
|
|
32
26
|
function minimumSupportedDshVersion() {
|
|
33
|
-
return /^>=([^ ]+)/u.exec(">=0.2.0-rc.2 <=0.2.1-
|
|
27
|
+
return /^>=([^ ]+)/u.exec(">=0.2.0-rc.2 <=0.2.1-rc.2")?.[1] ?? "0.2.1-rc.2";
|
|
34
28
|
}
|
|
35
29
|
/** Host 注入到浏览器页面的真实 DSH 版本全局字段。 */
|
|
36
30
|
const CODINGNS_DSH_VERSION_GLOBAL = "__CODINGNS_DSH_VERSION__";
|
|
@@ -39,7 +33,7 @@ window.__ModuleLoader__.load({
|
|
|
39
33
|
return /^0\.1\.5(?:-|$)/u.test(version);
|
|
40
34
|
}
|
|
41
35
|
/** Codingns4DSH 插件自身的 npm 版本。 */
|
|
42
|
-
const CODINGNS_VERSION = "0.2.1-beta.
|
|
36
|
+
const CODINGNS_VERSION = "0.2.1-beta.14";
|
|
43
37
|
/** 判断宿主版本是否落在当前插件声明的 DSH 兼容范围内;范围省略上界时不校验上限。 */
|
|
44
38
|
function isDshVersionCompatible(version) {
|
|
45
39
|
const match = /^>=([^ ]+)(?: <=([^ ]+))?$/u.exec(DSH_COMPATIBILITY);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.native-workspace-store.js","names":["DEFAULT_ASSISTANT_NOTIFICATION_SETTINGS","DEFAULT_ASSISTANT_PROMPTS","DEFAULT_SESSION_TRANSLATION_SETTINGS"],"sources":["../../../../src/shared/contracts/version.ts","../../../../src/shared/contracts/config.ts","../../../../src/client/native-workspace-store.ts"],"sourcesContent":["/** 当前经过完整验证的 DSH 版本;源文件由根目录 version.json 同步。 */\nexport const DSH_VERSION = '0.2.1-alpha.3' as const\n\n/** DSH 测试版本别名,供新代码表达语义,保留 DSH_VERSION 兼容旧调用方。 */\nexport const DSH_TESTED_VERSION = DSH_VERSION\n\n/**\n * 插件正式验证的 DSH 版本范围,覆盖 rc.2 到当前验证的 alpha.2。\n *\n * 0.2.0-rc.2、0.2.1-alpha.1 与 0.2.1-alpha.2 属于同一 API 世代:插件直接消费的\n * 20 个宿主包中 18 个接口面未变,会话格式仍为 v4。唯一的服务级破坏性变化是\n * alpha.2 用 `subagents.startActivation()` 取代 `startContinuable()`,由\n * `subagent.activation` / `subagent.continuable` 两条能力路由分别探测,业务侧\n * 经 `startNativeSubagent()` 归一化调用,因此同一个版本范围仍然成立。\n *\n * 这里保留明确上界,是为了让 npm/DSH 安装期也能识别 0.2.1-alpha.2 这个跨 patch\n * 预发布版本;出现新的 API 世代或结构变化时,应重新验证并更新范围与能力路由。\n */\nexport const DSH_COMPATIBILITY = '>=0.2.0-rc.2 <=0.2.1-alpha.3' as const\n\n/**\n * 兼容范围下界,即插件仍然接受的最低 DSH 版本。\n *\n * 供“宿主没有注入真实版本、但已确认处于现代世代”的保守回退使用:回退值取自\n * 范围本身,因此永远落在兼容范围内。写死某个历史版本会在范围收紧后变成\n * “不支持的 DSH 版本”,把仅仅缺少启动页注入的页面误判为宿主不兼容。\n */\nexport function minimumSupportedDshVersion(): string {\n const match = /^>=([^ ]+)/u.exec(DSH_COMPATIBILITY)\n return match?.[1] ?? DSH_VERSION\n}\n\n/** DSH Envelope/Tunnel 协议主版本。 */\nexport const DSH_PROTOCOL_VERSION = 1 as const\n\n/** Host 注入到浏览器页面的真实 DSH 版本全局字段。 */\nexport const CODINGNS_DSH_VERSION_GLOBAL = '__CODINGNS_DSH_VERSION__' as const\n\n/** 识别没有 alpha2 Sidebar 扩展 API 的 DSH 旧版运行时。 */\nexport function isLegacyDshVersion(version: string): boolean {\n return /^0\\.1\\.5(?:-|$)/u.test(version)\n}\n\n/** Codingns4DSH 插件自身的 npm 版本。 */\nexport const CODINGNS_VERSION = '0.2.1-beta.12' as const\n\ninterface ParsedVersion {\n readonly major: number\n readonly minor: number\n readonly patch: number\n readonly prerelease: readonly string[]\n}\n\n/** 判断宿主版本是否落在当前插件声明的 DSH 兼容范围内;范围省略上界时不校验上限。 */\nexport function isDshVersionCompatible(version: string): boolean {\n const match = /^>=([^ ]+)(?: <=([^ ]+))?$/u.exec(DSH_COMPATIBILITY)\n const actual = parseVersion(version)\n const minimum = parseVersion(match?.[1] ?? '')\n if (match === null || !actual || !minimum) return version === DSH_VERSION\n if (match[2] === undefined) return compareVersions(actual, minimum) >= 0\n const maximum = parseVersion(match[2])\n if (maximum === undefined) return version === DSH_VERSION\n return compareVersions(actual, minimum) >= 0 && compareVersions(actual, maximum) <= 0\n}\n\n/** 判断 DSH 版本是否达到某个功能模块要求的最低版本。 */\nexport function isDshVersionAtLeast(version: string, minimum: string): boolean {\n return isVersionAtLeast(version, minimum)\n}\n\n/** 按语义版本比较大小;预发布标识参与排序,构建元数据不影响优先级,非法版本不放行。 */\nexport function isVersionAtLeast(version: string, minimum: string): boolean {\n const actual = parseVersion(version)\n const required = parseVersion(minimum)\n if (!actual || !required) return false\n return compareVersions(actual, required) >= 0\n}\n\nfunction parseVersion(value: string): ParsedVersion | undefined {\n const match = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/u.exec(value)\n if (!match) return undefined\n const core = match.slice(1, 4).map(Number)\n if (!core.every(Number.isSafeInteger)) return undefined\n const prerelease = match[4]?.split('.') ?? []\n // 数字预发布标识不能有前导零;超大数字保留字符串,用长度比较避免精度丢失。\n if (prerelease.some((part) => /^0\\d+$/u.test(part))) return undefined\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease,\n }\n}\n\nfunction compareVersions(left: ParsedVersion, right: ParsedVersion): number {\n for (const key of ['major', 'minor', 'patch'] as const) {\n if (left[key] !== right[key]) return left[key] - right[key]\n }\n if (left.prerelease.length === 0 && right.prerelease.length > 0) return 1\n if (left.prerelease.length > 0 && right.prerelease.length === 0) return -1\n for (let index = 0; index < Math.max(left.prerelease.length, right.prerelease.length); index += 1) {\n const leftPart = left.prerelease[index]\n const rightPart = right.prerelease[index]\n if (leftPart === undefined) return -1\n if (rightPart === undefined) return 1\n if (leftPart === rightPart) continue\n const leftNumeric = /^\\d+$/u.test(leftPart)\n const rightNumeric = /^\\d+$/u.test(rightPart)\n if (leftNumeric !== rightNumeric) return leftNumeric ? -1 : 1\n if (leftNumeric && leftPart.length !== rightPart.length) return leftPart.length - rightPart.length\n return leftPart < rightPart ? -1 : 1\n }\n return 0\n}\n","import type { FeatureDescriptor } from './feature.js'\nimport type { CodingNsCliSessionRecord } from './cli-adapter.js'\nimport { isDshVersionAtLeast } from './version.js'\nimport type { AssistantAppearanceSettings } from '../assistant-avatar.js'\nimport { DEFAULT_ASSISTANT_PROMPTS, type AssistantPromptSettings } from '../assistant-prompts.js'\nimport type { AssistantTtsSettings } from '../assistant-tts.js'\nimport { DEFAULT_ASSISTANT_NOTIFICATION_SETTINGS, type AssistantNotificationSettings } from '../assistant-notifications.js'\nimport { DEFAULT_SESSION_TRANSLATION_SETTINGS, type SessionTranslationSettings } from './session-translation.js'\n\n/** 适配器最近一次使用的模型、思考强度与服务档位。 */\nexport interface CodingNsCliAdapterPreference {\n readonly modelId?: string | undefined\n readonly effortId?: string | undefined\n /** Provider 服务档位(例如 Codex 官方订阅的 Fast);`default` 表示标准速度。 */\n readonly serviceTierId?: string | undefined\n /** 新建会话模型选择器中的“翻译对话”开关,按 Agent 隔离记忆。 */\n readonly translationEnabled?: boolean | undefined\n}\n\n/** 全局智能助理设置;默认空范围,必须由用户显式勾选工作区。 */\nexport type AssistantVoiceProvider = 'dsh-speech-to-text' | 'sherpa-onnx'\n\n/** 全局语音助理初始化配置;模型目录由 Host 自动下载并写入。 */\nexport interface AssistantVoiceSettings {\n initialized: boolean\n provider: AssistantVoiceProvider\n /** 已安装的实时模型目录 ID;旧配置没有该字段时按空值兼容。 */\n modelId?: string\n asrEncoder: string\n asrDecoder: string\n asrJoiner: string\n asrTokens: string\n vadModel: string\n ttsModel: string\n ttsTokens: string\n ttsLexicon: string\n}\n\nexport const DEFAULT_ASSISTANT_VOICE_SETTINGS: AssistantVoiceSettings = {\n initialized: false,\n provider: 'dsh-speech-to-text',\n modelId: '',\n asrEncoder: '',\n asrDecoder: '',\n asrJoiner: '',\n asrTokens: '',\n vadModel: '',\n ttsModel: '',\n ttsTokens: '',\n ttsLexicon: '',\n}\n\nexport interface AssistantSettings {\n /** 旧配置缺省全开;展示仍受模块、助理创建和形象开关约束。 */\n notifications?: AssistantNotificationSettings\n /** 只有显式 initialized=true 表示已创建;缺省或 false 时旧配置仅预填创建表单。 */\n profile?: AssistantProfileSettings\n /** 缺省跟随 DSH 默认模型;固定选择同时用于项目索引与正式对话。 */\n model?: { readonly provider: string; readonly model: string }\n /** 允许助理读取和派发的工作区 ID。 */\n managedWorkspaceIds: string[]\n /** 语音提供方与本地模型路径;未初始化时点击入口只打开模型选择页。 */\n voice: AssistantVoiceSettings\n /** 统一形象配置;旧设置缺失时由展示层补默认值。 */\n appearance?: AssistantAppearanceSettings\n /** 索引总结与对话前置提示词;旧配置使用默认口语化提示词。 */\n prompts?: AssistantPromptSettings\n /** 独立音色与输出后端;缺省保留浏览器播报以兼容旧配置。 */\n tts?: AssistantTtsSettings\n}\n\nexport interface AssistantProfileSettings {\n readonly name: string\n /** 角色性格与背景,旧档案缺省时不额外限定角色;不作为项目事实。 */\n readonly personality?: string\n readonly initialized: boolean\n readonly createdAt: number | null\n}\n\nexport const DEFAULT_ASSISTANT_SETTINGS: AssistantSettings = {\n notifications: DEFAULT_ASSISTANT_NOTIFICATION_SETTINGS,\n managedWorkspaceIds: [],\n voice: DEFAULT_ASSISTANT_VOICE_SETTINGS,\n prompts: DEFAULT_ASSISTANT_PROMPTS,\n}\n\n/** Codingns4DSH 在 DSH 设置文档中持久化的用户选项。 */\nexport interface CodingNsSettings {\n /** Control API 地址不是秘密,可以由 Web 设置页保存到 Host 设置。 */\n controlBaseUrl: string\n /** Control API 地址候选列表;列表本身不包含任何凭据。 */\n controlBaseUrls: string[]\n /** 局域网访问 DSH 的唯一监听映射及启动策略。 */\n lanAccessDsh: LanAccessDshSettings\n /** 插件 Sidebar 终端的默认 profile 与受控外观设置。 */\n terminalEnhancement: TerminalEnhancementSettings\n /** 原生工作区会话行的浏览器端增强选项。 */\n workspaceSessionEnhancement: WorkspaceSessionEnhancementSettings\n /** DSH 文件管理侧栏的独立增强选项。 */\n fileManagement: FileManagementSettings\n /** 手机/平板窄屏访问时的界面增强选项。 */\n mobileAccess: MobileAccessSettings\n /** 用量查询设置:超时控制单次网络查询,间隔控制自动刷新。 */\n subscriptionUsage: SubscriptionUsageSettings\n /** 全局智能助理设置;不绑定当前页面会话。 */\n assistant: AssistantSettings\n /**\n * 功能模块启用意图:模块名 -> 是否启用。\n *\n * 缺省时回落到模块自己声明的 enabledByDefault,因此设置结构不随模块数量变化。\n */\n modules: Record<string, boolean>\n /** 外部 Agent 启用意图:适配器 id -> 是否启用;缺省时所有已注册 Agent 启用。 */\n agentAdapters?: Record<string, boolean>\n /** Host 侧外部 Agent 会话索引;不含凭据和原始消息。 */\n cliSessions?: CodingNsCliSessionRecord[]\n /** 适配器级最近选择;新建会话时作为默认模型和思考强度。 */\n agentAdapterPreferences?: Record<string, CodingNsCliAdapterPreference>\n /** 外部 CLI 子代理托管:把外部 Agent 自己的子代理调用转为 DSH 原生可续子会话。 */\n subagentBridge?: SubagentBridgeSettings\n /** 外部 Agent 会话输入与输出的翻译设置。 */\n sessionTranslation?: SessionTranslationSettings\n}\n\n/** 外部 CLI 子代理托管设置;关闭时所有驱动保持原样。 */\nexport interface SubagentBridgeSettings {\n enabled: boolean\n /**\n * 同一父会话可同时保留的托管子代理数。\n *\n * 外部 CLI(如 Command Code)会在一批里并发开出远超上限的子代理调用;超限\n * 调用过去直接失败并静默回退到 CLI 内建子代理,父会话与界面都看不出差异。\n * 与 DSH 自身的 `maxActiveSubagents`(缺省 8)保持同一量级,并允许用户按机器\n * 负载调整。\n */\n maxConcurrentSubagents: number\n}\n\n/** 并发子代理数上限:下限 1 保证至少能派发,上限避免一次性压垮本机。 */\nexport const SUBAGENT_BRIDGE_MAX_CONCURRENT_LIMITS = { min: 1, max: 32 } as const\n\nexport const DEFAULT_SUBAGENT_BRIDGE_SETTINGS: SubagentBridgeSettings = {\n enabled: false,\n maxConcurrentSubagents: 8,\n}\n\n/** 归一化子代理托管设置:只有显式 true 才算开启;并发数按上下限收敛。 */\nexport function normalizeSubagentBridgeSettings(value: unknown): SubagentBridgeSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n return {\n enabled: record.enabled === true,\n maxConcurrentSubagents: clampSettingsInteger(\n record.maxConcurrentSubagents,\n SUBAGENT_BRIDGE_MAX_CONCURRENT_LIMITS,\n DEFAULT_SUBAGENT_BRIDGE_SETTINGS.maxConcurrentSubagents,\n ),\n }\n}\n\n/** 用量查询设置:超时控制单次网络查询,间隔控制自动刷新。 */\nexport interface SubscriptionUsageSettings {\n /** 单次用量查询的网络超时(秒)。 */\n timeoutSecs: number\n /** 自动查询间隔(分钟);0 表示不自动查询。 */\n refreshIntervalMins: number\n}\n\nexport const DEFAULT_SUBSCRIPTION_USAGE_SETTINGS: SubscriptionUsageSettings = { timeoutSecs: 10, refreshIntervalMins: 5 }\nexport const SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS = { min: 3, max: 120 } as const\nexport const SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS = { min: 0, max: 1440 } as const\n\n/** 归一化用量查询设置:缺省字段回填默认值,越界值收敛到允许范围。 */\nexport function normalizeSubscriptionUsageSettings(value: unknown): SubscriptionUsageSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n return {\n timeoutSecs: clampSettingsInteger(record.timeoutSecs, SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS.timeoutSecs),\n refreshIntervalMins: clampSettingsInteger(record.refreshIntervalMins, SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS.refreshIntervalMins),\n }\n}\n\nfunction clampSettingsInteger(value: unknown, limits: { readonly min: number; readonly max: number }, fallback: number): number {\n const numeric = typeof value === 'number' && Number.isFinite(value) ? Math.round(value) : fallback\n return Math.min(limits.max, Math.max(limits.min, numeric))\n}\n\n/** 0.1.7 ConfigForm 面向用户的持久化配置;Host-only 会话索引不在其中。 */\nexport type CodingNsConfig = Omit<CodingNsSettings, 'cliSessions'>\n\n/** Host 运行时状态,与可编辑配置分离,避免泄露到 Client 配置表单。 */\nexport interface CodingNsRuntimeState {\n readonly cliSessions: CodingNsCliSessionRecord[]\n}\n\n/** 跨平台终端 profile;`system` 由 Host 根据平台和已安装 shell 解析。 */\nexport type TerminalProfileId = 'system' | 'zsh' | 'bash' | 'powershell' | 'cmd' | 'git-bash'\n/** 终端持久记录的归属范围;工作区模式允许不同 DSH 会话共享终端。 */\nexport type TerminalBindingScope = 'workspace' | 'session'\n\nexport type TerminalAppearanceTheme = 'inherit' | 'custom'\nexport type TerminalCursorStyle = 'block' | 'bar' | 'underline'\n\n/** 仅保存可映射到 xterm 公开选项的外观字段。 */\nexport interface TerminalAppearanceSettings {\n theme: TerminalAppearanceTheme\n background: string | null\n foreground: string | null\n cursorColor: string | null\n fontFamily: string | null\n fontSize: number | null\n lineHeight: number | null\n cursorStyle: TerminalCursorStyle | null\n cursorBlink: boolean | null\n scrollback: number | null\n}\n\nexport interface TerminalEnhancementSettings {\n /** 缺省按工作区归属;旧设置缺少此字段时由 schema 回填。 */\n bindingScope?: TerminalBindingScope\n defaultProfile: TerminalProfileId\n appearance: TerminalAppearanceSettings\n}\n\n/** 工作区会话增强的用户可见设置;每个子能力都可以独立开关。 */\nexport interface WorkspaceSessionEnhancementSettings {\n showAdapterLogo: boolean\n /** 是否在每个有归档会话的工作区中显示归档入口。 */\n showArchivedSessions: boolean\n /** 是否在工作区菜单提供隐藏与恢复工作区入口。 */\n showWorkspaceHiding: boolean\n /** 插件本地隐藏的工作区 ID;不改变 DSH 原生工作区数据。 */\n hiddenWorkspaceIds: string[]\n /** 是否在对话底部显示订阅与上游用量检测。 */\n showSubscriptionUsage: boolean\n /** 是否在输入工具区显示快捷会话入口。 */\n showQuickPhrases: boolean\n /** 是否索引当前会话所选 Agent 的 Skill,并通过指令快速引用。 */\n showSkillQuickReference: boolean\n /** 是否优化 DSH 自动标题的语义、长度和失败时的兜底文字。 */\n optimizeSessionTitles: boolean\n /** 是否记忆对话窗口与右侧栏的宽度比例;具体比例保存在当前浏览器。 */\n rememberConversationRightbarRatio: boolean\n /** 插件本地保存的快捷会话条目。 */\n quickPhrases: QuickPhrase[]\n /** 内置快捷会话是否已经完成首次初始化;仅用于兼容旧配置。 */\n quickPhrasesSeeded: boolean\n /**\n * 旧版本曾把手势设置写在这里。保留可选字段只用于读取旧配置,新的设置一律写入\n * `mobileAccess`,避免升级后把用户主动关闭的手势重新打开。\n */\n sidebarGestures?: boolean\n sidebarGestureMapping?: SidebarGestureMapping\n sidebarGestureEdge?: SidebarGestureEdgeMode\n /** 已废弃的像素门槛;只在归一化时用于推导比例,新配置一律写入 `sidebarGestureDistancePercent`。 */\n sidebarGestureThresholdPx?: number\n}\n\n/** 移动端侧栏横滑设置。 */\nexport interface SidebarGestureSettings {\n /** 是否在触摸设备上启用横滑开合左右侧栏。 */\n sidebarGestures: boolean\n /** 手势方向映射:右滑/左滑分别对应哪一侧栏。 */\n sidebarGestureMapping: SidebarGestureMapping\n /** 手势起手区域:是否允许贴上系统边缘热区。 */\n sidebarGestureEdge: SidebarGestureEdgeMode\n /**\n * 触发手势所需的水平位移占视口宽度的百分比。\n *\n * 用比例而不是像素:同一个像素值在 360px 手机与 1024px 平板上的手势占比相差\n * 近三倍,只有比例才能让「灵敏度」这个设置在各类设备上表达同一件事。\n *\n * 该值只约束**距离通道**;位移不足时仍可由甩动通道(快速轻甩)触发。\n */\n sidebarGestureDistancePercent: number\n}\n\n/** 横滑手势的方向映射。 */\nexport type SidebarGestureMapping = 'swipe-inward' | 'swap'\n\n/** 横滑手势的起手区域。 */\nexport type SidebarGestureEdgeMode = 'avoid' | 'edge'\n\nexport const SIDEBAR_GESTURE_DISTANCE_PERCENT_LIMITS = { min: 15, max: 80 } as const\n/**\n * 默认 25%:配合甩动通道,实测有意手势成功率 100%、误触率 0%。\n *\n * 旧默认 40% 与「距离与速度同时达标」的组合让正常滑动被系统性误杀(实测成功率仅 30%),\n * 用户需要重复滑动才能呼出侧栏。\n */\nexport const DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT = 25\n/**\n * 旧像素门槛换算成比例时使用的参考视口宽度。\n *\n * 旧实现的有效阈值是 `max(像素值, 视口宽度 × 40%)`,像素值只有超过该下限才生效。\n * 取常见手机宽度 390px 作为换算基准,并保证结果不低于新的默认值,让「没生效过的旧值」\n * 迁移后直接落到新默认值,从而真正获得本次灵敏度修复。\n */\nexport const SIDEBAR_GESTURE_LEGACY_THRESHOLD_PX_REFERENCE_WIDTH = 390\n\nexport const DEFAULT_SIDEBAR_GESTURE_SETTINGS: SidebarGestureSettings = {\n sidebarGestures: true,\n sidebarGestureMapping: 'swipe-inward',\n sidebarGestureEdge: 'avoid',\n sidebarGestureDistancePercent: DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT,\n}\n\n/** 手势设置的归一化输入;保留旧版本写入的像素门槛用于一次性迁移。 */\nexport type SidebarGestureSettingsInput = Partial<SidebarGestureSettings> & {\n /** 已废弃的像素门槛;只用于推导比例,不再被写回。 */\n sidebarGestureThresholdPx?: number\n}\n\n/** 归一化手势设置:缺省回填、越界收敛,非法枚举回落到默认值。 */\nexport function normalizeSidebarGestureSettings(\n value: SidebarGestureSettingsInput | undefined,\n): SidebarGestureSettings {\n const record = typeof value === 'object' && value !== null ? value as Record<string, unknown> : {}\n const percent = record.sidebarGestureDistancePercent === undefined\n ? legacyThresholdPxToPercent(record.sidebarGestureThresholdPx)\n : record.sidebarGestureDistancePercent\n return {\n // 移动端访问增强默认提供横滑入口;桌面端控制器仍会按触摸能力和视口门禁不挂监听。\n sidebarGestures: record.sidebarGestures === undefined\n ? DEFAULT_SIDEBAR_GESTURE_SETTINGS.sidebarGestures\n : record.sidebarGestures === true,\n sidebarGestureMapping: record.sidebarGestureMapping === 'swap' ? 'swap' : 'swipe-inward',\n sidebarGestureEdge: record.sidebarGestureEdge === 'edge' ? 'edge' : 'avoid',\n sidebarGestureDistancePercent: clampSettingsInteger(\n percent,\n SIDEBAR_GESTURE_DISTANCE_PERCENT_LIMITS,\n DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT,\n ),\n }\n}\n\n/**\n * 把已废弃的像素门槛换算成视口百分比。\n *\n * 换算结果不低于当前默认值:旧像素值在绝大多数移动视口上本来就低于\n * `视口宽度 × 40%`,属于「从未生效」的设置,用户实际上一直在用默认手感。\n * 让它们落到新默认值,才能获得本次灵敏度修复;只有确实高于下限的旧值\n * 才保留其「更严格」的意图。\n */\nfunction legacyThresholdPxToPercent(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) return undefined\n const percent = Math.round(value / SIDEBAR_GESTURE_LEGACY_THRESHOLD_PX_REFERENCE_WIDTH * 100)\n return Math.max(DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT, percent)\n}\n\n/** 文件管理增强的独立能力开关。 */\nexport interface FileManagementSettings {\n /** 是否为文件和目录显示右键操作菜单。 */\n menuEnhancement: boolean\n /** 是否为可编辑文本文件显示编辑器入口。 */\n fileEditor: boolean\n /** 是否在当前会话顶部显示“修改文件”视图。 */\n sessionChangedFiles: boolean\n}\n\nexport const DEFAULT_FILE_MANAGEMENT_SETTINGS: FileManagementSettings = {\n menuEnhancement: true,\n fileEditor: true,\n sessionChangedFiles: true,\n}\n\n/** 移动端访问增强的独立能力开关;全部只作用于浏览器侧界面。 */\nexport interface MobileAccessSettings {\n /** 窄屏下彻底隐藏左侧边栏,只在原位置保留品牌 logo 作为唤起入口。 */\n hideSidebarOnMobile: boolean\n /** 是否启用移动端设置界面布局优化。 */\n optimizeSettingsOnMobile: boolean\n /** 判定“移动端/窄屏”的视口宽度上限(像素)。 */\n mobileViewportMaxPx: number\n /** 移动端触摸设备上是否启用横滑开合左右侧栏。 */\n sidebarGestures: boolean\n /** 手势方向映射:右滑/左滑分别对应哪一侧栏。 */\n sidebarGestureMapping: SidebarGestureMapping\n /** 手势起手区域:是否允许贴上系统边缘热区。 */\n sidebarGestureEdge: SidebarGestureEdgeMode\n /** 触发手势所需的水平位移占视口宽度的百分比(15–80,默认 25)。 */\n sidebarGestureDistancePercent: number\n}\n\nexport const MOBILE_VIEWPORT_MAX_PX_LIMITS = { min: 480, max: 1280 } as const\nexport const DEFAULT_MOBILE_VIEWPORT_MAX_PX = 1024\n\nexport const DEFAULT_MOBILE_ACCESS_SETTINGS: MobileAccessSettings = {\n // 窄屏下 DSH 原生侧栏默认只收起成 56px 图标轨道,仍持续占用横向空间;\n // 默认开启本模块的隐藏能力,用户可随时在设置里关回原生行为。\n hideSidebarOnMobile: true,\n optimizeSettingsOnMobile: true,\n mobileViewportMaxPx: DEFAULT_MOBILE_VIEWPORT_MAX_PX,\n ...DEFAULT_SIDEBAR_GESTURE_SETTINGS,\n}\n\n/**\n * 归一化移动端访问设置:缺省回填默认值,越界值收敛到允许范围。\n * 第二个参数只用于读取旧版本写在 workspaceSessionEnhancement 下的手势设置。\n */\nexport function normalizeMobileAccessSettings(value: unknown, legacyGestureValue?: unknown): MobileAccessSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n const legacy = typeof legacyGestureValue === 'object' && legacyGestureValue !== null && !Array.isArray(legacyGestureValue)\n ? legacyGestureValue as Record<string, unknown>\n : {}\n const gestureValue = (key: string): unknown => record[key] ?? legacy[key]\n const gesture: SidebarGestureSettingsInput = {}\n const sidebarGestures = gestureValue('sidebarGestures')\n const sidebarGestureMapping = gestureValue('sidebarGestureMapping')\n const sidebarGestureEdge = gestureValue('sidebarGestureEdge')\n const sidebarGestureDistancePercent = gestureValue('sidebarGestureDistancePercent')\n const sidebarGestureThresholdPx = gestureValue('sidebarGestureThresholdPx')\n if (sidebarGestures !== undefined) gesture.sidebarGestures = sidebarGestures as boolean\n if (sidebarGestureMapping !== undefined) gesture.sidebarGestureMapping = sidebarGestureMapping as SidebarGestureMapping\n if (sidebarGestureEdge !== undefined) gesture.sidebarGestureEdge = sidebarGestureEdge as SidebarGestureEdgeMode\n if (sidebarGestureDistancePercent !== undefined) gesture.sidebarGestureDistancePercent = sidebarGestureDistancePercent as number\n // 旧像素门槛只在没有新比例值时参与换算,避免把已经迁移过的配置再次改写。\n if (sidebarGestureDistancePercent === undefined && sidebarGestureThresholdPx !== undefined) {\n gesture.sidebarGestureThresholdPx = sidebarGestureThresholdPx as number\n }\n return {\n hideSidebarOnMobile: record.hideSidebarOnMobile === undefined\n ? DEFAULT_MOBILE_ACCESS_SETTINGS.hideSidebarOnMobile\n : record.hideSidebarOnMobile === true,\n optimizeSettingsOnMobile: record.optimizeSettingsOnMobile === undefined\n ? DEFAULT_MOBILE_ACCESS_SETTINGS.optimizeSettingsOnMobile\n : record.optimizeSettingsOnMobile === true,\n mobileViewportMaxPx: clampSettingsInteger(\n record.mobileViewportMaxPx,\n MOBILE_VIEWPORT_MAX_PX_LIMITS,\n DEFAULT_MOBILE_ACCESS_SETTINGS.mobileViewportMaxPx,\n ),\n ...normalizeSidebarGestureSettings(gesture),\n }\n}\n\n/** 可复用的快捷会话文本。 */\nexport interface QuickPhrase {\n id: string\n text: string\n}\n\n/** 首次启用快捷会话时提供的内置指令。 */\nexport const DEFAULT_QUICK_PHRASES: QuickPhrase[] = [\n { id: 'builtin-quick-1', text: '请将本次会话变更的所有代码提交到git暂存区,然后总结一条中文的提交信息' },\n { id: 'builtin-quick-2', text: '分析本项目模块的代码实现,并分析存在的问题' },\n { id: 'builtin-quick-3', text: '分析当前项目中的未提交文件,按照功能模块进行分类提交,提交信息格式请参考我最近的提交记录' },\n { id: 'builtin-quick-4', text: '请给出完整的开发提示词,我将在新的页面中继续开发' },\n]\n\n/** 局域网访问 DSH 的持久化配置;dshPort 为 0 表示启动时自动探测。 */\nexport interface LanAccessDshSettings {\n autoStart: boolean\n listenHost: string\n listenPort: number\n dshPort: number\n /** PWA 资产与安装引导;只在局域网入口生效,不影响本机与中继入口。 */\n pwa: LanAccessDshPwaSettings\n}\n\n/** 局域网入口的 PWA 增强档位。 */\nexport interface LanAccessDshPwaSettings {\n /** 是否由代理提供 manifest、图标等静态资产与启动页元数据。 */\n enabled: boolean\n /** 是否合成 `/sw.js` 并在安全上下文里注册;默认关闭,避免驻留。 */\n serviceWorker: boolean\n /** 是否注入安装引导(Android 提示按钮 / iOS 指引)。 */\n installPrompt: boolean\n /** 通知档位;`push` 需要 Host 侧 VAPID 就绪。 */\n notifications: LanAccessDshNotificationMode\n}\n\nexport type LanAccessDshNotificationMode = 'off' | 'local' | 'push'\n\nexport const DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS: LanAccessDshPwaSettings = {\n enabled: true,\n serviceWorker: false,\n installPrompt: true,\n notifications: 'off',\n}\n\n/** 归一化 PWA 设置:缺省回填默认值,非法枚举回落到最保守档位。 */\nexport function normalizeLanAccessDshPwaSettings(value: unknown): LanAccessDshPwaSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n return {\n enabled: record.enabled === undefined ? DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS.enabled : record.enabled === true,\n serviceWorker: record.serviceWorker === true,\n installPrompt: record.installPrompt === undefined ? DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS.installPrompt : record.installPrompt === true,\n notifications: record.notifications === 'local' || record.notifications === 'push' ? record.notifications : 'off',\n }\n}\n\nexport interface LoginProtectionScopes {\n /** 局域网网卡入口。 */\n lan: boolean\n /** Codingns4DSH 中继入口。 */\n relay: boolean\n}\n\n/** 登录保护的公开设置;密码哈希仅保存在 Host 私有凭据文件中。 */\nexport interface LanAccessDshLoginSettings {\n enabled: boolean\n username: string\n passwordConfigured: boolean\n timeoutSeconds: number\n scopes: LoginProtectionScopes\n}\n\nexport const CODINGNS_SETTINGS_NAMESPACE = 'codingns'\n/** DSH 配置表单可能使用的插件 entry id;scoped 包名是当前 Bundle 的正式 ID。 */\nexport const CODINGNS_SETTINGS_ENTRY_IDS = [\n '@jingyi0605/codingns4dsh',\n 'codingns4dsh',\n CODINGNS_SETTINGS_NAMESPACE,\n] as const\n\nexport function isCodingNsSettingsEntryId(value: unknown): value is typeof CODINGNS_SETTINGS_ENTRY_IDS[number] {\n return typeof value === 'string' && (CODINGNS_SETTINGS_ENTRY_IDS as readonly string[]).includes(value)\n}\n\nexport const CODINGNS_CONTROL_BASE_URL_FIELD = 'controlBaseUrl'\nexport const CODINGNS_CONTROL_BASE_URLS_FIELD = 'controlBaseUrls'\nexport const CODINGNS_MODULES_FIELD = 'modules'\nexport const CODINGNS_LAN_ACCESS_DSH_FIELD = 'lanAccessDsh'\nexport const CODINGNS_TERMINAL_ENHANCEMENT_FIELD = 'terminalEnhancement'\nexport const CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD = 'workspaceSessionEnhancement'\nexport const CODINGNS_FILE_MANAGEMENT_FIELD = 'fileManagement'\nexport const CODINGNS_MOBILE_ACCESS_FIELD = 'mobileAccess'\nexport const CODINGNS_SUBSCRIPTION_USAGE_FIELD = 'subscriptionUsage'\nexport const CODINGNS_SESSION_TRANSLATION_FIELD = 'sessionTranslation'\nexport const CODINGNS_ASSISTANT_FIELD = 'assistant'\nexport const CODINGNS_SUBAGENT_BRIDGE_FIELD = 'subagentBridge'\nexport const DEFAULT_CODINGNS_CONTROL_BASE_URL = 'https://channel.codingns.com:1443'\nexport const DEFAULT_CODINGNS_CONTROL_BASE_URLS = [DEFAULT_CODINGNS_CONTROL_BASE_URL]\n/** 控制站的网页登录地址,用于注册 Codingns4DSH 账号。 */\nexport const CODINGNS_CONTROL_STATION_URL = 'https://channel.codingns.com:1443'\n/** 独立 H5 登录页面地址;登录控制站后可从设置页复制给其他设备。 */\nexport const CODINGNS_H5_LOGIN_URL = 'https://dsh.codingns.com'\nexport const DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS: TerminalEnhancementSettings = {\n bindingScope: 'workspace',\n defaultProfile: 'system',\n appearance: {\n theme: 'inherit',\n background: null,\n foreground: null,\n cursorColor: null,\n fontFamily: null,\n fontSize: null,\n lineHeight: null,\n cursorStyle: null,\n cursorBlink: null,\n scrollback: null,\n },\n}\nexport const DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS: WorkspaceSessionEnhancementSettings = {\n showAdapterLogo: true,\n showArchivedSessions: true,\n showWorkspaceHiding: true,\n hiddenWorkspaceIds: [],\n showSubscriptionUsage: true,\n showQuickPhrases: true,\n showSkillQuickReference: true,\n optimizeSessionTitles: false,\n rememberConversationRightbarRatio: false,\n quickPhrases: DEFAULT_QUICK_PHRASES.map((phrase) => ({ ...phrase })),\n quickPhrasesSeeded: true,\n}\nexport const DEFAULT_CODINGNS_SETTINGS: CodingNsSettings = {\n controlBaseUrl: DEFAULT_CODINGNS_CONTROL_BASE_URL,\n controlBaseUrls: [...DEFAULT_CODINGNS_CONTROL_BASE_URLS],\n modules: {},\n agentAdapters: {},\n agentAdapterPreferences: {},\n subagentBridge: DEFAULT_SUBAGENT_BRIDGE_SETTINGS,\n sessionTranslation: DEFAULT_SESSION_TRANSLATION_SETTINGS,\n terminalEnhancement: DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS,\n workspaceSessionEnhancement: DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS,\n fileManagement: DEFAULT_FILE_MANAGEMENT_SETTINGS,\n mobileAccess: DEFAULT_MOBILE_ACCESS_SETTINGS,\n subscriptionUsage: DEFAULT_SUBSCRIPTION_USAGE_SETTINGS,\n assistant: DEFAULT_ASSISTANT_SETTINGS,\n lanAccessDsh: {\n autoStart: false,\n listenHost: '0.0.0.0',\n listenPort: 13080,\n dshPort: 0,\n pwa: DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS,\n },\n}\n\n/** 重启生效模块在当前进程启动时捕获的有效状态。 */\nexport type RestartFeatureStates = Readonly<Record<string, boolean>>\n\nexport function captureRestartFeatureStates(\n descriptors: readonly FeatureDescriptor[],\n settings: CodingNsSettings | undefined,\n dshVersion?: string,\n): Record<string, boolean> {\n const states: Record<string, boolean> = {}\n for (const descriptor of descriptors) {\n if (descriptor.activation === 'restart') {\n states[descriptor.name] = isFeatureDshVersionCompatible(descriptor, dshVersion)\n && isFeatureEnabled(descriptor, settings)\n }\n }\n return states\n}\n\n/**\n * 判定一个功能模块当前是否应当启用。\n *\n * 常驻模块(ui.alwaysEnabled)始终启用;其余模块读取设置里的用户意图,\n * 用户没有表达过意图时使用模块自己声明的 enabledByDefault。\n */\nexport function isFeatureEnabled(\n descriptor: FeatureDescriptor,\n settings: CodingNsSettings | undefined,\n): boolean {\n if (descriptor.disabled === true) return false\n if (descriptor.ui?.alwaysEnabled === true) return true\n return settings?.modules[descriptor.name] ?? descriptor.enabledByDefault\n}\n\n/** 汇总当前应当启用的模块名,交给 FeatureRegistry.reconcile 对齐状态。 */\nexport function enabledFeatureNames(\n descriptors: readonly FeatureDescriptor[],\n settings: CodingNsSettings | undefined,\n restartStates?: RestartFeatureStates,\n dshVersion?: string,\n): string[] {\n const names: string[] = []\n for (const descriptor of descriptors) {\n const enabled = descriptor.activation === 'restart' && restartStates !== undefined\n ? restartStates[descriptor.name] ?? descriptor.enabledByDefault\n : isFeatureEnabled(descriptor, settings)\n if (enabled && isFeatureDshVersionCompatible(descriptor, dshVersion)) names.push(descriptor.name)\n }\n return names\n}\n\n/** 判断模块是否可以在当前 DSH 版本运行。未提供运行时版本时保留旧调用方行为。 */\nexport function isFeatureDshVersionCompatible(\n descriptor: FeatureDescriptor,\n dshVersion?: string,\n): boolean {\n if (descriptor.minimumDshVersion === undefined || dshVersion === undefined) return true\n return isDshVersionAtLeast(dshVersion, descriptor.minimumDshVersion)\n}\n","import type { Context } from '@deepseek-ai/cordis'\n\n/** DSH 原生 Workspace 列表 Store;消费方只用到这两条读取通道。 */\nexport interface NativeWorkspaceListStore {\n getSnapshot: () => unknown\n subscribe: (listener: () => void) => () => void\n}\n\n/** 原生 Workspace 列表项的最小结构;PeerHost 虚拟工作区也由这份读取提供。 */\nexport interface NativeWorkspaceRecord {\n readonly workspaceId: string\n readonly path?: string\n /** 用于界面展示的真实工作区路径;远程工作区的 `path` 保留为虚拟路由路径。 */\n readonly workspacePath?: string\n readonly title: string\n /** 远程工作区所属的目标 Host;本机工作区没有该字段。 */\n readonly hostId?: string\n /** 远程工作区所属 Host 的友好名称;缺失时由界面回退到 hostId。 */\n readonly hostLabel?: string\n /** 远程工作区所属 Host 的配置颜色;非法值由显示层回退到稳定推导色。 */\n readonly hostColor?: string\n readonly sessionIds: readonly string[]\n}\n\n/** `workspaces.list` 快照的最小结构;归档集合是 Registry 级共享的一份列表。 */\nexport interface NativeWorkspaceSnapshot {\n readonly items: readonly NativeWorkspaceRecord[]\n readonly archivedSessionIds: readonly string[]\n}\n\n/**\n * 读取原生 Workspace 列表 Store 对象本身。\n *\n * PeerHost 顺序投影必须就地改写这个对象的方法,归档入口只读它的快照。\n */\nexport function readNativeWorkspaceListStore(uiContext: Context | undefined): NativeWorkspaceListStore | undefined {\n const store = readNativeService(uiContext, 'workspaces', 'list')\n if (!isRecord(store) || typeof store.getSnapshot !== 'function' || typeof store.subscribe !== 'function') return undefined\n return store as unknown as NativeWorkspaceListStore\n}\n\n/** 读取原生 Workspace 快照;形状不符或服务缺失时返回 undefined,调用方退回原生 Remote。 */\nexport function readNativeWorkspaceSnapshot(uiContext: Context | undefined): NativeWorkspaceSnapshot | undefined {\n const store = readNativeWorkspaceListStore(uiContext)\n const snapshot = store?.getSnapshot()\n const record = isRecord(snapshot) ? snapshot : undefined\n if (record === undefined || !Array.isArray(record.items)) return undefined\n return {\n items: record.items.flatMap((item) => {\n const value = isRecord(item) ? item : undefined\n const workspaceId = readText(value?.workspaceId)\n if (workspaceId === undefined) return []\n const path = readText(value?.path)\n const workspacePath = readText(value?.workspacePath)\n const title = readText(value?.title) ?? workspacePath ?? path ?? workspaceId\n const hostId = readText(value?.hostId)\n const hostLabel = readText(value?.hostLabel)\n const hostColor = readText(value?.hostColor)\n return [{\n workspaceId,\n ...(path === undefined ? {} : { path }),\n ...(workspacePath === undefined ? {} : { workspacePath }),\n title,\n ...(hostId === undefined ? {} : { hostId }),\n ...(hostLabel === undefined ? {} : { hostLabel }),\n ...(hostColor === undefined ? {} : { hostColor }),\n sessionIds: readTextList(value?.sessionIds),\n }]\n }),\n archivedSessionIds: readTextList(record.archivedSessionIds),\n }\n}\n\n/** 只在会话所属工作区变化时通知,避免标题/运行态增量触发昂贵的文件与 Git 查询。 */\nexport function subscribeNativeSessionWorkspace(\n uiContext: Context | undefined,\n sessionId: string,\n listener: () => void,\n): () => void {\n const readWorkspaceId = (): string | undefined => readNativeWorkspaceSnapshot(uiContext)?.items\n .find((item) => item.sessionIds.includes(sessionId))?.workspaceId\n let workspaceId = readWorkspaceId()\n return readNativeWorkspaceListStore(uiContext)?.subscribe(() => {\n const next = readWorkspaceId()\n if (next === workspaceId) return\n workspaceId = next\n listener()\n }) ?? (() => undefined)\n}\n\n/** 读取 DSH 原生服务集合中的字段;非 Web 宿主或版本差异时保持缺失。 */\nexport function readNativeService(uiContext: Context | undefined, name: string, field?: string): unknown {\n if (uiContext === undefined) return undefined\n try {\n const getter = (uiContext as { get?: (service: string) => unknown }).get\n if (typeof getter !== 'function') return undefined\n const service = getter.call(uiContext, name)\n if (field === undefined) return service\n return isRecord(service) ? service[field] : undefined\n } catch {\n // 原生服务不可用(非 Web Client 宿主或版本差异)时保持本机行为。\n return undefined\n }\n}\n\nfunction readText(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined\n}\n\nfunction readTextList(value: unknown): string[] {\n return Array.isArray(value) ? value.flatMap((item) => { const text = readText(item); return text === undefined ? [] : [text] }) : []\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.native-workspace-store.js","names":["DEFAULT_ASSISTANT_NOTIFICATION_SETTINGS","DEFAULT_ASSISTANT_PROMPTS","DEFAULT_SESSION_TRANSLATION_SETTINGS"],"sources":["../../../../src/shared/contracts/version.ts","../../../../src/shared/contracts/config.ts","../../../../src/client/native-workspace-store.ts"],"sourcesContent":["/** DSH verification target, synchronized with the root version.json. */\nexport const DSH_VERSION = '0.2.1-rc.2' as const\n\n/** DSH 测试版本别名,供新代码表达语义,保留 DSH_VERSION 兼容旧调用方。 */\nexport const DSH_TESTED_VERSION = DSH_VERSION\n\n/**\n * Supported hosts retain the 0.2.0-rc.2 floor and include 0.2.1-rc.2.\n * Capability adapters preserve earlier subagent, peer and message contracts.\n * Keep an explicit upper bound: a later prerelease requires verification before\n * either installation checks or runtime capability selection may accept it.\n */\nexport const DSH_COMPATIBILITY = '>=0.2.0-rc.2 <=0.2.1-rc.2' as const\n\n/**\n * 兼容范围下界,即插件仍然接受的最低 DSH 版本。\n *\n * 供“宿主没有注入真实版本、但已确认处于现代世代”的保守回退使用:回退值取自\n * 范围本身,因此永远落在兼容范围内。写死某个历史版本会在范围收紧后变成\n * “不支持的 DSH 版本”,把仅仅缺少启动页注入的页面误判为宿主不兼容。\n */\nexport function minimumSupportedDshVersion(): string {\n const match = /^>=([^ ]+)/u.exec(DSH_COMPATIBILITY)\n return match?.[1] ?? DSH_VERSION\n}\n\n/** DSH Envelope/Tunnel 协议主版本。 */\nexport const DSH_PROTOCOL_VERSION = 1 as const\n\n/** Host 注入到浏览器页面的真实 DSH 版本全局字段。 */\nexport const CODINGNS_DSH_VERSION_GLOBAL = '__CODINGNS_DSH_VERSION__' as const\n\n/** 识别没有 alpha2 Sidebar 扩展 API 的 DSH 旧版运行时。 */\nexport function isLegacyDshVersion(version: string): boolean {\n return /^0\\.1\\.5(?:-|$)/u.test(version)\n}\n\n/** Codingns4DSH 插件自身的 npm 版本。 */\nexport const CODINGNS_VERSION = '0.2.1-beta.14' as const\n\ninterface ParsedVersion {\n readonly major: number\n readonly minor: number\n readonly patch: number\n readonly prerelease: readonly string[]\n}\n\n/** 判断宿主版本是否落在当前插件声明的 DSH 兼容范围内;范围省略上界时不校验上限。 */\nexport function isDshVersionCompatible(version: string): boolean {\n const match = /^>=([^ ]+)(?: <=([^ ]+))?$/u.exec(DSH_COMPATIBILITY)\n const actual = parseVersion(version)\n const minimum = parseVersion(match?.[1] ?? '')\n if (match === null || !actual || !minimum) return version === DSH_VERSION\n if (match[2] === undefined) return compareVersions(actual, minimum) >= 0\n const maximum = parseVersion(match[2])\n if (maximum === undefined) return version === DSH_VERSION\n return compareVersions(actual, minimum) >= 0 && compareVersions(actual, maximum) <= 0\n}\n\n/** 判断 DSH 版本是否达到某个功能模块要求的最低版本。 */\nexport function isDshVersionAtLeast(version: string, minimum: string): boolean {\n return isVersionAtLeast(version, minimum)\n}\n\n/** 按语义版本比较大小;预发布标识参与排序,构建元数据不影响优先级,非法版本不放行。 */\nexport function isVersionAtLeast(version: string, minimum: string): boolean {\n const actual = parseVersion(version)\n const required = parseVersion(minimum)\n if (!actual || !required) return false\n return compareVersions(actual, required) >= 0\n}\n\nfunction parseVersion(value: string): ParsedVersion | undefined {\n const match = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/u.exec(value)\n if (!match) return undefined\n const core = match.slice(1, 4).map(Number)\n if (!core.every(Number.isSafeInteger)) return undefined\n const prerelease = match[4]?.split('.') ?? []\n // 数字预发布标识不能有前导零;超大数字保留字符串,用长度比较避免精度丢失。\n if (prerelease.some((part) => /^0\\d+$/u.test(part))) return undefined\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease,\n }\n}\n\nfunction compareVersions(left: ParsedVersion, right: ParsedVersion): number {\n for (const key of ['major', 'minor', 'patch'] as const) {\n if (left[key] !== right[key]) return left[key] - right[key]\n }\n if (left.prerelease.length === 0 && right.prerelease.length > 0) return 1\n if (left.prerelease.length > 0 && right.prerelease.length === 0) return -1\n for (let index = 0; index < Math.max(left.prerelease.length, right.prerelease.length); index += 1) {\n const leftPart = left.prerelease[index]\n const rightPart = right.prerelease[index]\n if (leftPart === undefined) return -1\n if (rightPart === undefined) return 1\n if (leftPart === rightPart) continue\n const leftNumeric = /^\\d+$/u.test(leftPart)\n const rightNumeric = /^\\d+$/u.test(rightPart)\n if (leftNumeric !== rightNumeric) return leftNumeric ? -1 : 1\n if (leftNumeric && leftPart.length !== rightPart.length) return leftPart.length - rightPart.length\n return leftPart < rightPart ? -1 : 1\n }\n return 0\n}\n","import type { FeatureDescriptor } from './feature.js'\nimport type { CodingNsCliSessionRecord } from './cli-adapter.js'\nimport { isDshVersionAtLeast } from './version.js'\nimport type { AssistantAppearanceSettings } from '../assistant-avatar.js'\nimport { DEFAULT_ASSISTANT_PROMPTS, type AssistantPromptSettings } from '../assistant-prompts.js'\nimport type { AssistantTtsSettings } from '../assistant-tts.js'\nimport { DEFAULT_ASSISTANT_NOTIFICATION_SETTINGS, type AssistantNotificationSettings } from '../assistant-notifications.js'\nimport { DEFAULT_SESSION_TRANSLATION_SETTINGS, type SessionTranslationSettings } from './session-translation.js'\n\n/** 适配器最近一次使用的模型、思考强度与服务档位。 */\nexport interface CodingNsCliAdapterPreference {\n readonly modelId?: string | undefined\n readonly effortId?: string | undefined\n /** Provider 服务档位(例如 Codex 官方订阅的 Fast);`default` 表示标准速度。 */\n readonly serviceTierId?: string | undefined\n /** 新建会话模型选择器中的“翻译对话”开关,按 Agent 隔离记忆。 */\n readonly translationEnabled?: boolean | undefined\n}\n\n/** 全局智能助理设置;默认空范围,必须由用户显式勾选工作区。 */\nexport type AssistantVoiceProvider = 'dsh-speech-to-text' | 'sherpa-onnx'\n\n/** 全局语音助理初始化配置;模型目录由 Host 自动下载并写入。 */\nexport interface AssistantVoiceSettings {\n initialized: boolean\n provider: AssistantVoiceProvider\n /** 已安装的实时模型目录 ID;旧配置没有该字段时按空值兼容。 */\n modelId?: string\n asrEncoder: string\n asrDecoder: string\n asrJoiner: string\n asrTokens: string\n vadModel: string\n ttsModel: string\n ttsTokens: string\n ttsLexicon: string\n}\n\nexport const DEFAULT_ASSISTANT_VOICE_SETTINGS: AssistantVoiceSettings = {\n initialized: false,\n provider: 'dsh-speech-to-text',\n modelId: '',\n asrEncoder: '',\n asrDecoder: '',\n asrJoiner: '',\n asrTokens: '',\n vadModel: '',\n ttsModel: '',\n ttsTokens: '',\n ttsLexicon: '',\n}\n\nexport interface AssistantSettings {\n /** 旧配置缺省全开;展示仍受模块、助理创建和形象开关约束。 */\n notifications?: AssistantNotificationSettings\n /** 只有显式 initialized=true 表示已创建;缺省或 false 时旧配置仅预填创建表单。 */\n profile?: AssistantProfileSettings\n /** 缺省跟随 DSH 默认模型;固定选择同时用于项目索引与正式对话。 */\n model?: { readonly provider: string; readonly model: string }\n /** 允许助理读取和派发的工作区 ID。 */\n managedWorkspaceIds: string[]\n /** 语音提供方与本地模型路径;未初始化时点击入口只打开模型选择页。 */\n voice: AssistantVoiceSettings\n /** 统一形象配置;旧设置缺失时由展示层补默认值。 */\n appearance?: AssistantAppearanceSettings\n /** 索引总结与对话前置提示词;旧配置使用默认口语化提示词。 */\n prompts?: AssistantPromptSettings\n /** 独立音色与输出后端;缺省保留浏览器播报以兼容旧配置。 */\n tts?: AssistantTtsSettings\n}\n\nexport interface AssistantProfileSettings {\n readonly name: string\n /** 角色性格与背景,旧档案缺省时不额外限定角色;不作为项目事实。 */\n readonly personality?: string\n readonly initialized: boolean\n readonly createdAt: number | null\n}\n\nexport const DEFAULT_ASSISTANT_SETTINGS: AssistantSettings = {\n notifications: DEFAULT_ASSISTANT_NOTIFICATION_SETTINGS,\n managedWorkspaceIds: [],\n voice: DEFAULT_ASSISTANT_VOICE_SETTINGS,\n prompts: DEFAULT_ASSISTANT_PROMPTS,\n}\n\n/** Codingns4DSH 在 DSH 设置文档中持久化的用户选项。 */\nexport interface CodingNsSettings {\n /** Control API 地址不是秘密,可以由 Web 设置页保存到 Host 设置。 */\n controlBaseUrl: string\n /** Control API 地址候选列表;列表本身不包含任何凭据。 */\n controlBaseUrls: string[]\n /** 局域网访问 DSH 的唯一监听映射及启动策略。 */\n lanAccessDsh: LanAccessDshSettings\n /** 插件 Sidebar 终端的默认 profile 与受控外观设置。 */\n terminalEnhancement: TerminalEnhancementSettings\n /** 原生工作区会话行的浏览器端增强选项。 */\n workspaceSessionEnhancement: WorkspaceSessionEnhancementSettings\n /** DSH 文件管理侧栏的独立增强选项。 */\n fileManagement: FileManagementSettings\n /** Shortcut references only; approvals and launch secrets are Host runtime state. */\n quickApps?: import('./quick-apps.js').QuickApp[]\n /** 手机/平板窄屏访问时的界面增强选项。 */\n mobileAccess: MobileAccessSettings\n /** 用量查询设置:超时控制单次网络查询,间隔控制自动刷新。 */\n subscriptionUsage: SubscriptionUsageSettings\n /** 全局智能助理设置;不绑定当前页面会话。 */\n assistant: AssistantSettings\n /**\n * 功能模块启用意图:模块名 -> 是否启用。\n *\n * 缺省时回落到模块自己声明的 enabledByDefault,因此设置结构不随模块数量变化。\n */\n modules: Record<string, boolean>\n /** 外部 Agent 启用意图:适配器 id -> 是否启用;缺省时所有已注册 Agent 启用。 */\n agentAdapters?: Record<string, boolean>\n /** Host 侧外部 Agent 会话索引;不含凭据和原始消息。 */\n cliSessions?: CodingNsCliSessionRecord[]\n /** 适配器级最近选择;新建会话时作为默认模型和思考强度。 */\n agentAdapterPreferences?: Record<string, CodingNsCliAdapterPreference>\n /** 外部 CLI 子代理托管:把外部 Agent 自己的子代理调用转为 DSH 原生可续子会话。 */\n subagentBridge?: SubagentBridgeSettings\n /** 外部 Agent 会话输入与输出的翻译设置。 */\n sessionTranslation?: SessionTranslationSettings\n}\n\n/** 外部 CLI 子代理托管设置;关闭时所有驱动保持原样。 */\nexport interface SubagentBridgeSettings {\n enabled: boolean\n /**\n * 同一父会话可同时保留的托管子代理数。\n *\n * 外部 CLI(如 Command Code)会在一批里并发开出远超上限的子代理调用;超限\n * 调用过去直接失败并静默回退到 CLI 内建子代理,父会话与界面都看不出差异。\n * 与 DSH 自身的 `maxActiveSubagents`(缺省 8)保持同一量级,并允许用户按机器\n * 负载调整。\n */\n maxConcurrentSubagents: number\n}\n\n/** 并发子代理数上限:下限 1 保证至少能派发,上限避免一次性压垮本机。 */\nexport const SUBAGENT_BRIDGE_MAX_CONCURRENT_LIMITS = { min: 1, max: 32 } as const\n\nexport const DEFAULT_SUBAGENT_BRIDGE_SETTINGS: SubagentBridgeSettings = {\n enabled: false,\n maxConcurrentSubagents: 8,\n}\n\n/** 归一化子代理托管设置:只有显式 true 才算开启;并发数按上下限收敛。 */\nexport function normalizeSubagentBridgeSettings(value: unknown): SubagentBridgeSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n return {\n enabled: record.enabled === true,\n maxConcurrentSubagents: clampSettingsInteger(\n record.maxConcurrentSubagents,\n SUBAGENT_BRIDGE_MAX_CONCURRENT_LIMITS,\n DEFAULT_SUBAGENT_BRIDGE_SETTINGS.maxConcurrentSubagents,\n ),\n }\n}\n\n/** 用量查询设置:超时控制单次网络查询,间隔控制自动刷新。 */\nexport interface SubscriptionUsageSettings {\n /** 单次用量查询的网络超时(秒)。 */\n timeoutSecs: number\n /** 自动查询间隔(分钟);0 表示不自动查询。 */\n refreshIntervalMins: number\n}\n\nexport const DEFAULT_SUBSCRIPTION_USAGE_SETTINGS: SubscriptionUsageSettings = { timeoutSecs: 10, refreshIntervalMins: 5 }\nexport const SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS = { min: 3, max: 120 } as const\nexport const SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS = { min: 0, max: 1440 } as const\n\n/** 归一化用量查询设置:缺省字段回填默认值,越界值收敛到允许范围。 */\nexport function normalizeSubscriptionUsageSettings(value: unknown): SubscriptionUsageSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n return {\n timeoutSecs: clampSettingsInteger(record.timeoutSecs, SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS.timeoutSecs),\n refreshIntervalMins: clampSettingsInteger(record.refreshIntervalMins, SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS.refreshIntervalMins),\n }\n}\n\nfunction clampSettingsInteger(value: unknown, limits: { readonly min: number; readonly max: number }, fallback: number): number {\n const numeric = typeof value === 'number' && Number.isFinite(value) ? Math.round(value) : fallback\n return Math.min(limits.max, Math.max(limits.min, numeric))\n}\n\n/** 0.1.7 ConfigForm 面向用户的持久化配置;Host-only 会话索引不在其中。 */\nexport type CodingNsConfig = Omit<CodingNsSettings, 'cliSessions'>\n\n/** Host 运行时状态,与可编辑配置分离,避免泄露到 Client 配置表单。 */\nexport interface CodingNsRuntimeState {\n readonly cliSessions: CodingNsCliSessionRecord[]\n}\n\n/** 跨平台终端 profile;`system` 由 Host 根据平台和已安装 shell 解析。 */\nexport type TerminalProfileId = 'system' | 'zsh' | 'bash' | 'powershell' | 'cmd' | 'git-bash'\n/** 终端持久记录的归属范围;工作区模式允许不同 DSH 会话共享终端。 */\nexport type TerminalBindingScope = 'workspace' | 'session'\n\nexport type TerminalAppearanceTheme = 'inherit' | 'custom'\nexport type TerminalCursorStyle = 'block' | 'bar' | 'underline'\n\n/** 仅保存可映射到 xterm 公开选项的外观字段。 */\nexport interface TerminalAppearanceSettings {\n theme: TerminalAppearanceTheme\n background: string | null\n foreground: string | null\n cursorColor: string | null\n fontFamily: string | null\n fontSize: number | null\n lineHeight: number | null\n cursorStyle: TerminalCursorStyle | null\n cursorBlink: boolean | null\n scrollback: number | null\n}\n\nexport interface TerminalEnhancementSettings {\n /** 缺省按工作区归属;旧设置缺少此字段时由 schema 回填。 */\n bindingScope?: TerminalBindingScope\n defaultProfile: TerminalProfileId\n appearance: TerminalAppearanceSettings\n}\n\n/** 工作区会话增强的用户可见设置;每个子能力都可以独立开关。 */\nexport interface WorkspaceSessionEnhancementSettings {\n showAdapterLogo: boolean\n /** 是否在每个有归档会话的工作区中显示归档入口。 */\n showArchivedSessions: boolean\n /** 是否在工作区菜单提供隐藏与恢复工作区入口。 */\n showWorkspaceHiding: boolean\n /** 插件本地隐藏的工作区 ID;不改变 DSH 原生工作区数据。 */\n hiddenWorkspaceIds: string[]\n /** 是否在对话底部显示订阅与上游用量检测。 */\n showSubscriptionUsage: boolean\n /** 是否在输入工具区显示快捷会话入口。 */\n showQuickPhrases: boolean\n /** 是否索引当前会话所选 Agent 的 Skill,并通过指令快速引用。 */\n showSkillQuickReference: boolean\n /** 是否优化 DSH 自动标题的语义、长度和失败时的兜底文字。 */\n optimizeSessionTitles: boolean\n /** 是否记忆对话窗口与右侧栏的宽度比例;具体比例保存在当前浏览器。 */\n rememberConversationRightbarRatio: boolean\n /** 插件本地保存的快捷会话条目。 */\n quickPhrases: QuickPhrase[]\n /** 内置快捷会话是否已经完成首次初始化;仅用于兼容旧配置。 */\n quickPhrasesSeeded: boolean\n /**\n * 旧版本曾把手势设置写在这里。保留可选字段只用于读取旧配置,新的设置一律写入\n * `mobileAccess`,避免升级后把用户主动关闭的手势重新打开。\n */\n sidebarGestures?: boolean\n sidebarGestureMapping?: SidebarGestureMapping\n sidebarGestureEdge?: SidebarGestureEdgeMode\n /** 已废弃的像素门槛;只在归一化时用于推导比例,新配置一律写入 `sidebarGestureDistancePercent`。 */\n sidebarGestureThresholdPx?: number\n}\n\n/** 移动端侧栏横滑设置。 */\nexport interface SidebarGestureSettings {\n /** 是否在触摸设备上启用横滑开合左右侧栏。 */\n sidebarGestures: boolean\n /** 手势方向映射:右滑/左滑分别对应哪一侧栏。 */\n sidebarGestureMapping: SidebarGestureMapping\n /** 手势起手区域:是否允许贴上系统边缘热区。 */\n sidebarGestureEdge: SidebarGestureEdgeMode\n /**\n * 触发手势所需的水平位移占视口宽度的百分比。\n *\n * 用比例而不是像素:同一个像素值在 360px 手机与 1024px 平板上的手势占比相差\n * 近三倍,只有比例才能让「灵敏度」这个设置在各类设备上表达同一件事。\n *\n * 该值只约束**距离通道**;位移不足时仍可由甩动通道(快速轻甩)触发。\n */\n sidebarGestureDistancePercent: number\n}\n\n/** 横滑手势的方向映射。 */\nexport type SidebarGestureMapping = 'swipe-inward' | 'swap'\n\n/** 横滑手势的起手区域。 */\nexport type SidebarGestureEdgeMode = 'avoid' | 'edge'\n\nexport const SIDEBAR_GESTURE_DISTANCE_PERCENT_LIMITS = { min: 15, max: 80 } as const\n/**\n * 默认 25%:配合甩动通道,实测有意手势成功率 100%、误触率 0%。\n *\n * 旧默认 40% 与「距离与速度同时达标」的组合让正常滑动被系统性误杀(实测成功率仅 30%),\n * 用户需要重复滑动才能呼出侧栏。\n */\nexport const DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT = 25\n/**\n * 旧像素门槛换算成比例时使用的参考视口宽度。\n *\n * 旧实现的有效阈值是 `max(像素值, 视口宽度 × 40%)`,像素值只有超过该下限才生效。\n * 取常见手机宽度 390px 作为换算基准,并保证结果不低于新的默认值,让「没生效过的旧值」\n * 迁移后直接落到新默认值,从而真正获得本次灵敏度修复。\n */\nexport const SIDEBAR_GESTURE_LEGACY_THRESHOLD_PX_REFERENCE_WIDTH = 390\n\nexport const DEFAULT_SIDEBAR_GESTURE_SETTINGS: SidebarGestureSettings = {\n sidebarGestures: true,\n sidebarGestureMapping: 'swipe-inward',\n sidebarGestureEdge: 'avoid',\n sidebarGestureDistancePercent: DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT,\n}\n\n/** 手势设置的归一化输入;保留旧版本写入的像素门槛用于一次性迁移。 */\nexport type SidebarGestureSettingsInput = Partial<SidebarGestureSettings> & {\n /** 已废弃的像素门槛;只用于推导比例,不再被写回。 */\n sidebarGestureThresholdPx?: number\n}\n\n/** 归一化手势设置:缺省回填、越界收敛,非法枚举回落到默认值。 */\nexport function normalizeSidebarGestureSettings(\n value: SidebarGestureSettingsInput | undefined,\n): SidebarGestureSettings {\n const record = typeof value === 'object' && value !== null ? value as Record<string, unknown> : {}\n const percent = record.sidebarGestureDistancePercent === undefined\n ? legacyThresholdPxToPercent(record.sidebarGestureThresholdPx)\n : record.sidebarGestureDistancePercent\n return {\n // 移动端访问增强默认提供横滑入口;桌面端控制器仍会按触摸能力和视口门禁不挂监听。\n sidebarGestures: record.sidebarGestures === undefined\n ? DEFAULT_SIDEBAR_GESTURE_SETTINGS.sidebarGestures\n : record.sidebarGestures === true,\n sidebarGestureMapping: record.sidebarGestureMapping === 'swap' ? 'swap' : 'swipe-inward',\n sidebarGestureEdge: record.sidebarGestureEdge === 'edge' ? 'edge' : 'avoid',\n sidebarGestureDistancePercent: clampSettingsInteger(\n percent,\n SIDEBAR_GESTURE_DISTANCE_PERCENT_LIMITS,\n DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT,\n ),\n }\n}\n\n/**\n * 把已废弃的像素门槛换算成视口百分比。\n *\n * 换算结果不低于当前默认值:旧像素值在绝大多数移动视口上本来就低于\n * `视口宽度 × 40%`,属于「从未生效」的设置,用户实际上一直在用默认手感。\n * 让它们落到新默认值,才能获得本次灵敏度修复;只有确实高于下限的旧值\n * 才保留其「更严格」的意图。\n */\nfunction legacyThresholdPxToPercent(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) return undefined\n const percent = Math.round(value / SIDEBAR_GESTURE_LEGACY_THRESHOLD_PX_REFERENCE_WIDTH * 100)\n return Math.max(DEFAULT_SIDEBAR_GESTURE_DISTANCE_PERCENT, percent)\n}\n\n/** 文件管理增强的独立能力开关。 */\nexport interface FileManagementSettings {\n /** 是否为文件和目录显示右键操作菜单。 */\n menuEnhancement: boolean\n /** 是否为可编辑文本文件显示编辑器入口。 */\n fileEditor: boolean\n /** 是否在当前会话顶部显示“修改文件”视图。 */\n sessionChangedFiles: boolean\n}\n\nexport const DEFAULT_FILE_MANAGEMENT_SETTINGS: FileManagementSettings = {\n menuEnhancement: true,\n fileEditor: true,\n sessionChangedFiles: true,\n}\n\n/** 移动端访问增强的独立能力开关;全部只作用于浏览器侧界面。 */\nexport interface MobileAccessSettings {\n /** 窄屏下彻底隐藏左侧边栏,只在原位置保留品牌 logo 作为唤起入口。 */\n hideSidebarOnMobile: boolean\n /** 是否启用移动端设置界面布局优化。 */\n optimizeSettingsOnMobile: boolean\n /** 判定“移动端/窄屏”的视口宽度上限(像素)。 */\n mobileViewportMaxPx: number\n /** 移动端触摸设备上是否启用横滑开合左右侧栏。 */\n sidebarGestures: boolean\n /** 手势方向映射:右滑/左滑分别对应哪一侧栏。 */\n sidebarGestureMapping: SidebarGestureMapping\n /** 手势起手区域:是否允许贴上系统边缘热区。 */\n sidebarGestureEdge: SidebarGestureEdgeMode\n /** 触发手势所需的水平位移占视口宽度的百分比(15–80,默认 25)。 */\n sidebarGestureDistancePercent: number\n}\n\nexport const MOBILE_VIEWPORT_MAX_PX_LIMITS = { min: 480, max: 1280 } as const\nexport const DEFAULT_MOBILE_VIEWPORT_MAX_PX = 1024\n\nexport const DEFAULT_MOBILE_ACCESS_SETTINGS: MobileAccessSettings = {\n // 窄屏下 DSH 原生侧栏默认只收起成 56px 图标轨道,仍持续占用横向空间;\n // 默认开启本模块的隐藏能力,用户可随时在设置里关回原生行为。\n hideSidebarOnMobile: true,\n optimizeSettingsOnMobile: true,\n mobileViewportMaxPx: DEFAULT_MOBILE_VIEWPORT_MAX_PX,\n ...DEFAULT_SIDEBAR_GESTURE_SETTINGS,\n}\n\n/**\n * 归一化移动端访问设置:缺省回填默认值,越界值收敛到允许范围。\n * 第二个参数只用于读取旧版本写在 workspaceSessionEnhancement 下的手势设置。\n */\nexport function normalizeMobileAccessSettings(value: unknown, legacyGestureValue?: unknown): MobileAccessSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n const legacy = typeof legacyGestureValue === 'object' && legacyGestureValue !== null && !Array.isArray(legacyGestureValue)\n ? legacyGestureValue as Record<string, unknown>\n : {}\n const gestureValue = (key: string): unknown => record[key] ?? legacy[key]\n const gesture: SidebarGestureSettingsInput = {}\n const sidebarGestures = gestureValue('sidebarGestures')\n const sidebarGestureMapping = gestureValue('sidebarGestureMapping')\n const sidebarGestureEdge = gestureValue('sidebarGestureEdge')\n const sidebarGestureDistancePercent = gestureValue('sidebarGestureDistancePercent')\n const sidebarGestureThresholdPx = gestureValue('sidebarGestureThresholdPx')\n if (sidebarGestures !== undefined) gesture.sidebarGestures = sidebarGestures as boolean\n if (sidebarGestureMapping !== undefined) gesture.sidebarGestureMapping = sidebarGestureMapping as SidebarGestureMapping\n if (sidebarGestureEdge !== undefined) gesture.sidebarGestureEdge = sidebarGestureEdge as SidebarGestureEdgeMode\n if (sidebarGestureDistancePercent !== undefined) gesture.sidebarGestureDistancePercent = sidebarGestureDistancePercent as number\n // 旧像素门槛只在没有新比例值时参与换算,避免把已经迁移过的配置再次改写。\n if (sidebarGestureDistancePercent === undefined && sidebarGestureThresholdPx !== undefined) {\n gesture.sidebarGestureThresholdPx = sidebarGestureThresholdPx as number\n }\n return {\n hideSidebarOnMobile: record.hideSidebarOnMobile === undefined\n ? DEFAULT_MOBILE_ACCESS_SETTINGS.hideSidebarOnMobile\n : record.hideSidebarOnMobile === true,\n optimizeSettingsOnMobile: record.optimizeSettingsOnMobile === undefined\n ? DEFAULT_MOBILE_ACCESS_SETTINGS.optimizeSettingsOnMobile\n : record.optimizeSettingsOnMobile === true,\n mobileViewportMaxPx: clampSettingsInteger(\n record.mobileViewportMaxPx,\n MOBILE_VIEWPORT_MAX_PX_LIMITS,\n DEFAULT_MOBILE_ACCESS_SETTINGS.mobileViewportMaxPx,\n ),\n ...normalizeSidebarGestureSettings(gesture),\n }\n}\n\n/** 可复用的快捷会话文本。 */\nexport interface QuickPhrase {\n id: string\n text: string\n}\n\n/** 首次启用快捷会话时提供的内置指令。 */\nexport const DEFAULT_QUICK_PHRASES: QuickPhrase[] = [\n { id: 'builtin-quick-1', text: '请将本次会话变更的所有代码提交到git暂存区,然后总结一条中文的提交信息' },\n { id: 'builtin-quick-2', text: '分析本项目模块的代码实现,并分析存在的问题' },\n { id: 'builtin-quick-3', text: '分析当前项目中的未提交文件,按照功能模块进行分类提交,提交信息格式请参考我最近的提交记录' },\n { id: 'builtin-quick-4', text: '请给出完整的开发提示词,我将在新的页面中继续开发' },\n]\n\n/** 局域网访问 DSH 的持久化配置;dshPort 为 0 表示启动时自动探测。 */\nexport interface LanAccessDshSettings {\n autoStart: boolean\n listenHost: string\n listenPort: number\n dshPort: number\n /** PWA 资产与安装引导;只在局域网入口生效,不影响本机与中继入口。 */\n pwa: LanAccessDshPwaSettings\n}\n\n/** 局域网入口的 PWA 增强档位。 */\nexport interface LanAccessDshPwaSettings {\n /** 是否由代理提供 manifest、图标等静态资产与启动页元数据。 */\n enabled: boolean\n /** 是否合成 `/sw.js` 并在安全上下文里注册;默认关闭,避免驻留。 */\n serviceWorker: boolean\n /** 是否注入安装引导(Android 提示按钮 / iOS 指引)。 */\n installPrompt: boolean\n /** 通知档位;`push` 需要 Host 侧 VAPID 就绪。 */\n notifications: LanAccessDshNotificationMode\n}\n\nexport type LanAccessDshNotificationMode = 'off' | 'local' | 'push'\n\nexport const DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS: LanAccessDshPwaSettings = {\n enabled: true,\n serviceWorker: false,\n installPrompt: true,\n notifications: 'off',\n}\n\n/** 归一化 PWA 设置:缺省回填默认值,非法枚举回落到最保守档位。 */\nexport function normalizeLanAccessDshPwaSettings(value: unknown): LanAccessDshPwaSettings {\n const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n return {\n enabled: record.enabled === undefined ? DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS.enabled : record.enabled === true,\n serviceWorker: record.serviceWorker === true,\n installPrompt: record.installPrompt === undefined ? DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS.installPrompt : record.installPrompt === true,\n notifications: record.notifications === 'local' || record.notifications === 'push' ? record.notifications : 'off',\n }\n}\n\nexport interface LoginProtectionScopes {\n /** 局域网网卡入口。 */\n lan: boolean\n /** Codingns4DSH 中继入口。 */\n relay: boolean\n}\n\n/** 登录保护的公开设置;密码哈希仅保存在 Host 私有凭据文件中。 */\nexport interface LanAccessDshLoginSettings {\n enabled: boolean\n username: string\n passwordConfigured: boolean\n timeoutSeconds: number\n scopes: LoginProtectionScopes\n}\n\nexport const CODINGNS_SETTINGS_NAMESPACE = 'codingns'\n/** DSH 配置表单可能使用的插件 entry id;scoped 包名是当前 Bundle 的正式 ID。 */\nexport const CODINGNS_SETTINGS_ENTRY_IDS = [\n '@jingyi0605/codingns4dsh',\n 'codingns4dsh',\n CODINGNS_SETTINGS_NAMESPACE,\n] as const\n\nexport function isCodingNsSettingsEntryId(value: unknown): value is typeof CODINGNS_SETTINGS_ENTRY_IDS[number] {\n return typeof value === 'string' && (CODINGNS_SETTINGS_ENTRY_IDS as readonly string[]).includes(value)\n}\n\nexport const CODINGNS_CONTROL_BASE_URL_FIELD = 'controlBaseUrl'\nexport const CODINGNS_CONTROL_BASE_URLS_FIELD = 'controlBaseUrls'\nexport const CODINGNS_MODULES_FIELD = 'modules'\nexport const CODINGNS_LAN_ACCESS_DSH_FIELD = 'lanAccessDsh'\nexport const CODINGNS_TERMINAL_ENHANCEMENT_FIELD = 'terminalEnhancement'\nexport const CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD = 'workspaceSessionEnhancement'\nexport const CODINGNS_FILE_MANAGEMENT_FIELD = 'fileManagement'\nexport const CODINGNS_MOBILE_ACCESS_FIELD = 'mobileAccess'\nexport const CODINGNS_SUBSCRIPTION_USAGE_FIELD = 'subscriptionUsage'\nexport const CODINGNS_SESSION_TRANSLATION_FIELD = 'sessionTranslation'\nexport const CODINGNS_ASSISTANT_FIELD = 'assistant'\nexport const CODINGNS_SUBAGENT_BRIDGE_FIELD = 'subagentBridge'\nexport const DEFAULT_CODINGNS_CONTROL_BASE_URL = 'https://channel.codingns.com:1443'\nexport const DEFAULT_CODINGNS_CONTROL_BASE_URLS = [DEFAULT_CODINGNS_CONTROL_BASE_URL]\n/** 控制站的网页登录地址,用于注册 Codingns4DSH 账号。 */\nexport const CODINGNS_CONTROL_STATION_URL = 'https://channel.codingns.com:1443'\n/** 独立 H5 登录页面地址;登录控制站后可从设置页复制给其他设备。 */\nexport const CODINGNS_H5_LOGIN_URL = 'https://dsh.codingns.com'\nexport const DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS: TerminalEnhancementSettings = {\n bindingScope: 'workspace',\n defaultProfile: 'system',\n appearance: {\n theme: 'inherit',\n background: null,\n foreground: null,\n cursorColor: null,\n fontFamily: null,\n fontSize: null,\n lineHeight: null,\n cursorStyle: null,\n cursorBlink: null,\n scrollback: null,\n },\n}\nexport const DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS: WorkspaceSessionEnhancementSettings = {\n showAdapterLogo: true,\n showArchivedSessions: true,\n showWorkspaceHiding: true,\n hiddenWorkspaceIds: [],\n showSubscriptionUsage: true,\n showQuickPhrases: true,\n showSkillQuickReference: true,\n optimizeSessionTitles: false,\n rememberConversationRightbarRatio: false,\n quickPhrases: DEFAULT_QUICK_PHRASES.map((phrase) => ({ ...phrase })),\n quickPhrasesSeeded: true,\n}\nexport const DEFAULT_CODINGNS_SETTINGS: CodingNsSettings = {\n controlBaseUrl: DEFAULT_CODINGNS_CONTROL_BASE_URL,\n controlBaseUrls: [...DEFAULT_CODINGNS_CONTROL_BASE_URLS],\n modules: {},\n agentAdapters: {},\n agentAdapterPreferences: {},\n subagentBridge: DEFAULT_SUBAGENT_BRIDGE_SETTINGS,\n sessionTranslation: DEFAULT_SESSION_TRANSLATION_SETTINGS,\n terminalEnhancement: DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS,\n workspaceSessionEnhancement: DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS,\n fileManagement: DEFAULT_FILE_MANAGEMENT_SETTINGS,\n mobileAccess: DEFAULT_MOBILE_ACCESS_SETTINGS,\n subscriptionUsage: DEFAULT_SUBSCRIPTION_USAGE_SETTINGS,\n assistant: DEFAULT_ASSISTANT_SETTINGS,\n lanAccessDsh: {\n autoStart: false,\n listenHost: '0.0.0.0',\n listenPort: 13080,\n dshPort: 0,\n pwa: DEFAULT_LAN_ACCESS_DSH_PWA_SETTINGS,\n },\n}\n\n/** 重启生效模块在当前进程启动时捕获的有效状态。 */\nexport type RestartFeatureStates = Readonly<Record<string, boolean>>\n\nexport function captureRestartFeatureStates(\n descriptors: readonly FeatureDescriptor[],\n settings: CodingNsSettings | undefined,\n dshVersion?: string,\n): Record<string, boolean> {\n const states: Record<string, boolean> = {}\n for (const descriptor of descriptors) {\n if (descriptor.activation === 'restart') {\n states[descriptor.name] = isFeatureDshVersionCompatible(descriptor, dshVersion)\n && isFeatureEnabled(descriptor, settings)\n }\n }\n return states\n}\n\n/**\n * 判定一个功能模块当前是否应当启用。\n *\n * 常驻模块(ui.alwaysEnabled)始终启用;其余模块读取设置里的用户意图,\n * 用户没有表达过意图时使用模块自己声明的 enabledByDefault。\n */\nexport function isFeatureEnabled(\n descriptor: FeatureDescriptor,\n settings: CodingNsSettings | undefined,\n): boolean {\n if (descriptor.disabled === true) return false\n if (descriptor.ui?.alwaysEnabled === true) return true\n return settings?.modules[descriptor.name] ?? descriptor.enabledByDefault\n}\n\n/** 汇总当前应当启用的模块名,交给 FeatureRegistry.reconcile 对齐状态。 */\nexport function enabledFeatureNames(\n descriptors: readonly FeatureDescriptor[],\n settings: CodingNsSettings | undefined,\n restartStates?: RestartFeatureStates,\n dshVersion?: string,\n): string[] {\n const names: string[] = []\n for (const descriptor of descriptors) {\n const enabled = descriptor.activation === 'restart' && restartStates !== undefined\n ? restartStates[descriptor.name] ?? descriptor.enabledByDefault\n : isFeatureEnabled(descriptor, settings)\n if (enabled && isFeatureDshVersionCompatible(descriptor, dshVersion)) names.push(descriptor.name)\n }\n return names\n}\n\n/** 判断模块是否可以在当前 DSH 版本运行。未提供运行时版本时保留旧调用方行为。 */\nexport function isFeatureDshVersionCompatible(\n descriptor: FeatureDescriptor,\n dshVersion?: string,\n): boolean {\n if (descriptor.minimumDshVersion === undefined || dshVersion === undefined) return true\n return isDshVersionAtLeast(dshVersion, descriptor.minimumDshVersion)\n}\n","import type { Context } from '@deepseek-ai/cordis'\n\n/** DSH 原生 Workspace 列表 Store;消费方只用到这两条读取通道。 */\nexport interface NativeWorkspaceListStore {\n getSnapshot: () => unknown\n subscribe: (listener: () => void) => () => void\n}\n\n/** 原生 Workspace 列表项的最小结构;PeerHost 虚拟工作区也由这份读取提供。 */\nexport interface NativeWorkspaceRecord {\n readonly workspaceId: string\n readonly path?: string\n /** 用于界面展示的真实工作区路径;远程工作区的 `path` 保留为虚拟路由路径。 */\n readonly workspacePath?: string\n readonly title: string\n /** 远程工作区所属的目标 Host;本机工作区没有该字段。 */\n readonly hostId?: string\n /** 远程工作区所属 Host 的友好名称;缺失时由界面回退到 hostId。 */\n readonly hostLabel?: string\n /** 远程工作区所属 Host 的配置颜色;非法值由显示层回退到稳定推导色。 */\n readonly hostColor?: string\n readonly sessionIds: readonly string[]\n}\n\n/** `workspaces.list` 快照的最小结构;归档集合是 Registry 级共享的一份列表。 */\nexport interface NativeWorkspaceSnapshot {\n readonly items: readonly NativeWorkspaceRecord[]\n readonly archivedSessionIds: readonly string[]\n}\n\n/**\n * 读取原生 Workspace 列表 Store 对象本身。\n *\n * PeerHost 顺序投影必须就地改写这个对象的方法,归档入口只读它的快照。\n */\nexport function readNativeWorkspaceListStore(uiContext: Context | undefined): NativeWorkspaceListStore | undefined {\n const store = readNativeService(uiContext, 'workspaces', 'list')\n if (!isRecord(store) || typeof store.getSnapshot !== 'function' || typeof store.subscribe !== 'function') return undefined\n return store as unknown as NativeWorkspaceListStore\n}\n\n/** 读取原生 Workspace 快照;形状不符或服务缺失时返回 undefined,调用方退回原生 Remote。 */\nexport function readNativeWorkspaceSnapshot(uiContext: Context | undefined): NativeWorkspaceSnapshot | undefined {\n const store = readNativeWorkspaceListStore(uiContext)\n const snapshot = store?.getSnapshot()\n const record = isRecord(snapshot) ? snapshot : undefined\n if (record === undefined || !Array.isArray(record.items)) return undefined\n return {\n items: record.items.flatMap((item) => {\n const value = isRecord(item) ? item : undefined\n const workspaceId = readText(value?.workspaceId)\n if (workspaceId === undefined) return []\n const path = readText(value?.path)\n const workspacePath = readText(value?.workspacePath)\n const title = readText(value?.title) ?? workspacePath ?? path ?? workspaceId\n const hostId = readText(value?.hostId)\n const hostLabel = readText(value?.hostLabel)\n const hostColor = readText(value?.hostColor)\n return [{\n workspaceId,\n ...(path === undefined ? {} : { path }),\n ...(workspacePath === undefined ? {} : { workspacePath }),\n title,\n ...(hostId === undefined ? {} : { hostId }),\n ...(hostLabel === undefined ? {} : { hostLabel }),\n ...(hostColor === undefined ? {} : { hostColor }),\n sessionIds: readTextList(value?.sessionIds),\n }]\n }),\n archivedSessionIds: readTextList(record.archivedSessionIds),\n }\n}\n\n/** 只在会话所属工作区变化时通知,避免标题/运行态增量触发昂贵的文件与 Git 查询。 */\nexport function subscribeNativeSessionWorkspace(\n uiContext: Context | undefined,\n sessionId: string,\n listener: () => void,\n): () => void {\n const readWorkspaceId = (): string | undefined => readNativeWorkspaceSnapshot(uiContext)?.items\n .find((item) => item.sessionIds.includes(sessionId))?.workspaceId\n let workspaceId = readWorkspaceId()\n return readNativeWorkspaceListStore(uiContext)?.subscribe(() => {\n const next = readWorkspaceId()\n if (next === workspaceId) return\n workspaceId = next\n listener()\n }) ?? (() => undefined)\n}\n\n/** 读取 DSH 原生服务集合中的字段;非 Web 宿主或版本差异时保持缺失。 */\nexport function readNativeService(uiContext: Context | undefined, name: string, field?: string): unknown {\n if (uiContext === undefined) return undefined\n try {\n const getter = (uiContext as { get?: (service: string) => unknown }).get\n if (typeof getter !== 'function') return undefined\n const service = getter.call(uiContext, name)\n if (field === undefined) return service\n return isRecord(service) ? service[field] : undefined\n } catch {\n // 原生服务不可用(非 Web Client 宿主或版本差异)时保持本机行为。\n return undefined\n }\n}\n\nfunction readText(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined\n}\n\nfunction readTextList(value: unknown): string[] {\n return Array.isArray(value) ? value.flatMap((item) => { const text = readText(item); return text === undefined ? [] : [text] }) : []\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n"],"mappings":"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"}
|
|
@@ -116,6 +116,13 @@ window.__ModuleLoader__.load({
|
|
|
116
116
|
};
|
|
117
117
|
//#endregion
|
|
118
118
|
//#region src/dsh-capabilities/client/primitives-adapter.ts
|
|
119
|
+
/** Older primitive packages may lack Markdown delegation. Do not fail the whole footer. */
|
|
120
|
+
function hasNativeMarkdown(source = _deepseek_ai_dsh_client_ui_primitives) {
|
|
121
|
+
const value = source;
|
|
122
|
+
return value.MarkdownText !== void 0 && typeof value.MarkdownDelegateProvider === "function";
|
|
123
|
+
}
|
|
124
|
+
const DshMarkdownText = _deepseek_ai_dsh_client_ui_primitives.MarkdownText ?? (({ text }) => (0, react.createElement)("pre", null, text));
|
|
125
|
+
const DshMarkdownDelegate = _deepseek_ai_dsh_client_ui_primitives.MarkdownDelegateProvider ?? (({ children }) => (0, react.createElement)("div", null, children));
|
|
119
126
|
const unavailableIcon = () => null;
|
|
120
127
|
const fallbackShortcutKeys = ({ keys }) => (0, react.createElement)("span", void 0, keys.join(" + "));
|
|
121
128
|
/** 助理控件优先共用宿主图标,缺少的电话与普通对话采用相同 16px 画布和细描边。 */
|
|
@@ -190,6 +197,22 @@ window.__ModuleLoader__.load({
|
|
|
190
197
|
const value = _deepseek_ai_dsh_client_ui_primitives;
|
|
191
198
|
return value.IconRefreshOutlineRegular ?? value.IconRefreshOutlineMedium ?? unavailableIcon;
|
|
192
199
|
}
|
|
200
|
+
/** Document toolbar glyphs shared with the native text preview. */
|
|
201
|
+
function resolveTextWrapIcon(wrapped) {
|
|
202
|
+
const value = _deepseek_ai_dsh_client_ui_primitives;
|
|
203
|
+
return (wrapped ? value.IconNowrapFillRegular : value.IconWrapFillRegular) ?? unavailableIcon;
|
|
204
|
+
}
|
|
205
|
+
/** Native viewer controls; keep optional glyph compatibility at the adapter boundary. */
|
|
206
|
+
function resolveViewerIcon(name) {
|
|
207
|
+
return _deepseek_ai_dsh_client_ui_primitives[{
|
|
208
|
+
edit: "IconEditOutlineRegular",
|
|
209
|
+
save: "IconCheckOutlineRegular",
|
|
210
|
+
fullscreen: "IconFullscreenOutlineRegular",
|
|
211
|
+
restore: "IconFullscreenOutlineRegular",
|
|
212
|
+
back: "IconChevronLeftOutlineRegular",
|
|
213
|
+
home: "IconFileOutlineRegular"
|
|
214
|
+
}[name]] ?? resolveRefreshIcon();
|
|
215
|
+
}
|
|
193
216
|
/** 终端工具栏入口使用的原生工具图标。 */
|
|
194
217
|
function resolveToolIcon() {
|
|
195
218
|
const value = _deepseek_ai_dsh_client_ui_primitives;
|
|
@@ -224,6 +247,18 @@ window.__ModuleLoader__.load({
|
|
|
224
247
|
return value.IconShareOutlineRegular ?? value.IconShareOutlineMedium ?? value.IconSendOutlineRegular ?? value.IconSendOutlineMedium ?? resolveDataIcon();
|
|
225
248
|
}
|
|
226
249
|
//#endregion
|
|
250
|
+
Object.defineProperty(exports, "DshMarkdownDelegate", {
|
|
251
|
+
enumerable: true,
|
|
252
|
+
get: function() {
|
|
253
|
+
return DshMarkdownDelegate;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
Object.defineProperty(exports, "DshMarkdownText", {
|
|
257
|
+
enumerable: true,
|
|
258
|
+
get: function() {
|
|
259
|
+
return DshMarkdownText;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
227
262
|
Object.defineProperty(exports, "PEER_HOST_COLOR_PRESETS", {
|
|
228
263
|
enumerable: true,
|
|
229
264
|
get: function() {
|
|
@@ -254,6 +289,12 @@ window.__ModuleLoader__.load({
|
|
|
254
289
|
return createVirtualWorkspaceId;
|
|
255
290
|
}
|
|
256
291
|
});
|
|
292
|
+
Object.defineProperty(exports, "hasNativeMarkdown", {
|
|
293
|
+
enumerable: true,
|
|
294
|
+
get: function() {
|
|
295
|
+
return hasNativeMarkdown;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
257
298
|
Object.defineProperty(exports, "normalizePeerHostColor", {
|
|
258
299
|
enumerable: true,
|
|
259
300
|
get: function() {
|
|
@@ -320,12 +361,24 @@ window.__ModuleLoader__.load({
|
|
|
320
361
|
return resolveTerminalArrowIcon;
|
|
321
362
|
}
|
|
322
363
|
});
|
|
364
|
+
Object.defineProperty(exports, "resolveTextWrapIcon", {
|
|
365
|
+
enumerable: true,
|
|
366
|
+
get: function() {
|
|
367
|
+
return resolveTextWrapIcon;
|
|
368
|
+
}
|
|
369
|
+
});
|
|
323
370
|
Object.defineProperty(exports, "resolveToolIcon", {
|
|
324
371
|
enumerable: true,
|
|
325
372
|
get: function() {
|
|
326
373
|
return resolveToolIcon;
|
|
327
374
|
}
|
|
328
375
|
});
|
|
376
|
+
Object.defineProperty(exports, "resolveViewerIcon", {
|
|
377
|
+
enumerable: true,
|
|
378
|
+
get: function() {
|
|
379
|
+
return resolveViewerIcon;
|
|
380
|
+
}
|
|
381
|
+
});
|
|
329
382
|
return module.exports;
|
|
330
383
|
}
|
|
331
384
|
});
|