@jingyi0605/codingns4dsh 0.2.0-rc.3 → 0.2.1-beta.1
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 +6 -6
- package/README.md +42 -29
- 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/dsh-peer-host-preboot-shim.js +2 -2
- package/data/build/dist/bootstrap/dsh-peer-host-preboot-shim.js.map +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts.map +1 -1
- package/data/build/dist/client/bundle.js +3164 -181
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/cli-catalog.d.ts +1 -1
- package/data/build/dist/client/cli-catalog.d.ts.map +1 -1
- package/data/build/dist/client/cli-catalog.js +3 -3
- package/data/build/dist/client/cli-catalog.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 +70 -9
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/context-breakdown-dom.d.ts +1 -1
- package/data/build/dist/client/context-breakdown-dom.d.ts.map +1 -1
- package/data/build/dist/client/context-breakdown-dom.js +1 -1
- package/data/build/dist/client/context-breakdown-dom.js.map +1 -1
- package/data/build/dist/client/features/assistant-panel.d.ts +5 -0
- package/data/build/dist/client/features/assistant-panel.d.ts.map +1 -0
- package/data/build/dist/client/features/assistant-panel.js +127 -0
- package/data/build/dist/client/features/assistant-panel.js.map +1 -0
- package/data/build/dist/client/features/global-voice-assistant.d.ts +10 -0
- package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -0
- package/data/build/dist/client/features/global-voice-assistant.js +330 -0
- package/data/build/dist/client/features/global-voice-assistant.js.map +1 -0
- package/data/build/dist/client/features/index.d.ts +2 -0
- package/data/build/dist/client/features/index.d.ts.map +1 -1
- package/data/build/dist/client/features/index.js +4 -0
- package/data/build/dist/client/features/index.js.map +1 -1
- package/data/build/dist/client/features/lan-access.d.ts.map +1 -1
- package/data/build/dist/client/features/lan-access.js +3 -1
- package/data/build/dist/client/features/lan-access.js.map +1 -1
- package/data/build/dist/client/features/types.d.ts +4 -1
- package/data/build/dist/client/features/types.d.ts.map +1 -1
- package/data/build/dist/client/features/voice-conversation-dialog.d.ts +20 -0
- package/data/build/dist/client/features/voice-conversation-dialog.d.ts.map +1 -0
- package/data/build/dist/client/features/voice-conversation-dialog.js +59 -0
- package/data/build/dist/client/features/voice-conversation-dialog.js.map +1 -0
- package/data/build/dist/client/features/voice-initialization-dialog.d.ts +10 -0
- package/data/build/dist/client/features/voice-initialization-dialog.d.ts.map +1 -0
- package/data/build/dist/client/features/voice-initialization-dialog.js +90 -0
- package/data/build/dist/client/features/voice-initialization-dialog.js.map +1 -0
- package/data/build/dist/client/features/workspace-session-enhancement-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement-panel.js +57 -2
- package/data/build/dist/client/features/workspace-session-enhancement-panel.js.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.js +27 -0
- package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
- package/data/build/dist/client/global-voice-runtime-registry.d.ts +27 -0
- package/data/build/dist/client/global-voice-runtime-registry.d.ts.map +1 -0
- package/data/build/dist/client/global-voice-runtime-registry.js +12 -0
- package/data/build/dist/client/global-voice-runtime-registry.js.map +1 -0
- package/data/build/dist/client/index.d.ts +1 -1
- package/data/build/dist/client/index.d.ts.map +1 -1
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +185 -1
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/terminalAuth.d.ts.map +1 -1
- package/data/build/dist/client/locales/terminalAuth.js +2 -0
- package/data/build/dist/client/locales/terminalAuth.js.map +1 -1
- package/data/build/dist/client/locales/usage.d.ts.map +1 -1
- package/data/build/dist/client/locales/usage.js +4 -0
- package/data/build/dist/client/locales/usage.js.map +1 -1
- package/data/build/dist/client/mobile-session-interaction.d.ts +9 -0
- package/data/build/dist/client/mobile-session-interaction.d.ts.map +1 -1
- package/data/build/dist/client/mobile-session-interaction.js +63 -0
- package/data/build/dist/client/mobile-session-interaction.js.map +1 -1
- package/data/build/dist/client/model-catalog-cache.d.ts +23 -0
- package/data/build/dist/client/model-catalog-cache.d.ts.map +1 -1
- package/data/build/dist/client/model-catalog-cache.js +81 -9
- package/data/build/dist/client/model-catalog-cache.js.map +1 -1
- package/data/build/dist/client/service-tier.d.ts +11 -0
- package/data/build/dist/client/service-tier.d.ts.map +1 -1
- package/data/build/dist/client/service-tier.js +15 -0
- package/data/build/dist/client/service-tier.js.map +1 -1
- package/data/build/dist/client/sherpa-voice-adapter.d.ts +46 -0
- package/data/build/dist/client/sherpa-voice-adapter.d.ts.map +1 -0
- package/data/build/dist/client/sherpa-voice-adapter.js +252 -0
- package/data/build/dist/client/sherpa-voice-adapter.js.map +1 -0
- package/data/build/dist/client/skill-command.d.ts +10 -0
- package/data/build/dist/client/skill-command.d.ts.map +1 -0
- package/data/build/dist/client/skill-command.js +258 -0
- package/data/build/dist/client/skill-command.js.map +1 -0
- package/data/build/dist/client/skill-reference-dom.d.ts +38 -0
- package/data/build/dist/client/skill-reference-dom.d.ts.map +1 -0
- package/data/build/dist/client/skill-reference-dom.js +187 -0
- package/data/build/dist/client/skill-reference-dom.js.map +1 -0
- package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
- package/data/build/dist/client/subscription-slot.js +51 -3
- package/data/build/dist/client/subscription-slot.js.map +1 -1
- package/data/build/dist/client/terminal/model.d.ts +40 -2
- package/data/build/dist/client/terminal/model.d.ts.map +1 -1
- package/data/build/dist/client/terminal/model.js +151 -24
- package/data/build/dist/client/terminal/model.js.map +1 -1
- package/data/build/dist/client/terminal/styles.d.ts +8 -0
- package/data/build/dist/client/terminal/styles.d.ts.map +1 -1
- package/data/build/dist/client/terminal/styles.js +23 -2
- package/data/build/dist/client/terminal/styles.js.map +1 -1
- package/data/build/dist/client/terminal/ui.d.ts.map +1 -1
- package/data/build/dist/client/terminal/ui.js +161 -26
- package/data/build/dist/client/terminal/ui.js.map +1 -1
- package/data/build/dist/client/terminal/xterm-view.d.ts.map +1 -1
- package/data/build/dist/client/terminal/xterm-view.js +218 -42
- package/data/build/dist/client/terminal/xterm-view.js.map +1 -1
- package/data/build/dist/client/voice-capture.d.ts +32 -0
- package/data/build/dist/client/voice-capture.d.ts.map +1 -0
- package/data/build/dist/client/voice-capture.js +158 -0
- package/data/build/dist/client/voice-capture.js.map +1 -0
- package/data/build/dist/client/voice-device-manager.d.ts +24 -0
- package/data/build/dist/client/voice-device-manager.d.ts.map +1 -0
- package/data/build/dist/client/voice-device-manager.js +197 -0
- package/data/build/dist/client/voice-device-manager.js.map +1 -0
- package/data/build/dist/client/voice-output.d.ts +14 -0
- package/data/build/dist/client/voice-output.d.ts.map +1 -0
- package/data/build/dist/client/voice-output.js +32 -0
- package/data/build/dist/client/voice-output.js.map +1 -0
- package/data/build/dist/client/voice-security.d.ts +8 -0
- package/data/build/dist/client/voice-security.d.ts.map +1 -0
- package/data/build/dist/client/voice-security.js +26 -0
- package/data/build/dist/client/voice-security.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +12 -1
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +32 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +15 -0
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js +39 -9
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts +39 -2
- package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.js +198 -10
- package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-subscription.d.ts +121 -0
- package/data/build/dist/host/cli-adapters/antigravity-subscription.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/antigravity-subscription.js +504 -0
- package/data/build/dist/host/cli-adapters/antigravity-subscription.js.map +1 -0
- package/data/build/dist/host/cli-adapters/claude-driver.d.ts +21 -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 +173 -7
- package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codebuddy-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codebuddy-driver.js +4 -0
- package/data/build/dist/host/cli-adapters/codebuddy-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +28 -2
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js +234 -5
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-subscription.js +7 -4
- package/data/build/dist/host/cli-adapters/command-code-subscription.js.map +1 -1
- package/data/build/dist/host/cli-adapters/cursor-driver.d.ts +9 -0
- package/data/build/dist/host/cli-adapters/cursor-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/cursor-driver.js +72 -2
- package/data/build/dist/host/cli-adapters/cursor-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/driver.d.ts +21 -1
- package/data/build/dist/host/cli-adapters/driver.d.ts.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 +15 -3
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +18 -1
- 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 -0
- package/data/build/dist/host/cli-adapters/gemini-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.js +4 -0
- package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/json-rpc-process.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/json-rpc-process.js.map +1 -1
- package/data/build/dist/host/cli-adapters/kimi-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/kimi-driver.js +6 -6
- package/data/build/dist/host/cli-adapters/kimi-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/mcode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/mcode-driver.js +2 -0
- package/data/build/dist/host/cli-adapters/mcode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/model-catalog.d.ts +49 -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 +126 -0
- package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +11 -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 +92 -8
- package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/pi-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/pi-driver.js +4 -0
- package/data/build/dist/host/cli-adapters/pi-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.d.ts +10 -3
- package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts +4 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.js +8 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.js.map +1 -1
- package/data/build/dist/host/cli-adapters/qoder-driver.d.ts +15 -0
- package/data/build/dist/host/cli-adapters/qoder-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/qoder-driver.js +171 -3
- package/data/build/dist/host/cli-adapters/qoder-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/qoder-subscription.js +3 -1
- package/data/build/dist/host/cli-adapters/qoder-subscription.js.map +1 -1
- package/data/build/dist/host/cli-adapters/reasoning-content.d.ts +11 -0
- package/data/build/dist/host/cli-adapters/reasoning-content.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/reasoning-content.js +79 -0
- package/data/build/dist/host/cli-adapters/reasoning-content.js.map +1 -0
- package/data/build/dist/host/cli-adapters/registry.d.ts +24 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.js +109 -4
- package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
- package/data/build/dist/host/cli-adapters/rpc-driver-utils.d.ts +3 -2
- package/data/build/dist/host/cli-adapters/rpc-driver-utils.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/rpc-driver-utils.js +8 -2
- package/data/build/dist/host/cli-adapters/rpc-driver-utils.js.map +1 -1
- package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts +3 -2
- 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 +14 -2
- package/data/build/dist/host/cli-adapters/standard-stream-driver.js.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.d.ts +10 -1
- package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.js +28 -8
- package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
- package/data/build/dist/host/features/assistant-dispatch.d.ts +45 -0
- package/data/build/dist/host/features/assistant-dispatch.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-dispatch.js +49 -0
- package/data/build/dist/host/features/assistant-dispatch.js.map +1 -0
- package/data/build/dist/host/features/assistant-intent.d.ts +46 -0
- package/data/build/dist/host/features/assistant-intent.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-intent.js +149 -0
- package/data/build/dist/host/features/assistant-intent.js.map +1 -0
- package/data/build/dist/host/features/assistant-scope-settings.d.ts +25 -0
- package/data/build/dist/host/features/assistant-scope-settings.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-scope-settings.js +33 -0
- package/data/build/dist/host/features/assistant-scope-settings.js.map +1 -0
- package/data/build/dist/host/features/assistant-scope.d.ts +79 -0
- package/data/build/dist/host/features/assistant-scope.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-scope.js +107 -0
- package/data/build/dist/host/features/assistant-scope.js.map +1 -0
- package/data/build/dist/host/features/assistant-session-index.d.ts +44 -0
- package/data/build/dist/host/features/assistant-session-index.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-session-index.js +109 -0
- package/data/build/dist/host/features/assistant-session-index.js.map +1 -0
- package/data/build/dist/host/features/assistant-summary.d.ts +28 -0
- package/data/build/dist/host/features/assistant-summary.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-summary.js +166 -0
- package/data/build/dist/host/features/assistant-summary.js.map +1 -0
- package/data/build/dist/host/features/assistant-voice-stream.d.ts +10 -0
- package/data/build/dist/host/features/assistant-voice-stream.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-voice-stream.js +106 -0
- package/data/build/dist/host/features/assistant-voice-stream.js.map +1 -0
- package/data/build/dist/host/features/assistant-voice-turn.d.ts +27 -0
- package/data/build/dist/host/features/assistant-voice-turn.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-voice-turn.js +54 -0
- package/data/build/dist/host/features/assistant-voice-turn.js.map +1 -0
- package/data/build/dist/host/features/assistant-waiting-state.d.ts +14 -0
- package/data/build/dist/host/features/assistant-waiting-state.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-waiting-state.js +17 -0
- package/data/build/dist/host/features/assistant-waiting-state.js.map +1 -0
- package/data/build/dist/host/features/global-voice-coordinator.d.ts +55 -0
- package/data/build/dist/host/features/global-voice-coordinator.d.ts.map +1 -0
- package/data/build/dist/host/features/global-voice-coordinator.js +221 -0
- package/data/build/dist/host/features/global-voice-coordinator.js.map +1 -0
- package/data/build/dist/host/features/global-voice-rpc.d.ts +25 -0
- package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -0
- package/data/build/dist/host/features/global-voice-rpc.js +862 -0
- package/data/build/dist/host/features/global-voice-rpc.js.map +1 -0
- package/data/build/dist/host/features/index.d.ts +10 -0
- package/data/build/dist/host/features/index.d.ts.map +1 -1
- package/data/build/dist/host/features/index.js +10 -0
- package/data/build/dist/host/features/index.js.map +1 -1
- package/data/build/dist/host/features/peer-host.d.ts +5 -0
- package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/host/features/peer-host.js +232 -2
- package/data/build/dist/host/features/peer-host.js.map +1 -1
- package/data/build/dist/host/features/sherpa-voice-runtime.d.ts +42 -0
- package/data/build/dist/host/features/sherpa-voice-runtime.d.ts.map +1 -0
- package/data/build/dist/host/features/sherpa-voice-runtime.js +193 -0
- package/data/build/dist/host/features/sherpa-voice-runtime.js.map +1 -0
- package/data/build/dist/host/features/types.d.ts +26 -0
- package/data/build/dist/host/features/types.d.ts.map +1 -1
- package/data/build/dist/host/features/voice-agent-actions.d.ts +26 -0
- package/data/build/dist/host/features/voice-agent-actions.d.ts.map +1 -0
- package/data/build/dist/host/features/voice-agent-actions.js +128 -0
- package/data/build/dist/host/features/voice-agent-actions.js.map +1 -0
- package/data/build/dist/host/features/voice-agent-service.d.ts +117 -0
- package/data/build/dist/host/features/voice-agent-service.d.ts.map +1 -0
- package/data/build/dist/host/features/voice-agent-service.js +243 -0
- package/data/build/dist/host/features/voice-agent-service.js.map +1 -0
- package/data/build/dist/host/features/voice-model-setup.d.ts +20 -0
- package/data/build/dist/host/features/voice-model-setup.d.ts.map +1 -0
- package/data/build/dist/host/features/voice-model-setup.js +89 -0
- package/data/build/dist/host/features/voice-model-setup.js.map +1 -0
- package/data/build/dist/host/index.d.ts +2 -2
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +7 -1
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +53 -2
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.js +15 -1
- package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.js.map +1 -1
- package/data/build/dist/host/native-session-bridge.d.ts +2 -0
- package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
- package/data/build/dist/host/native-session-bridge.js +1 -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 +9 -4
- package/data/build/dist/host/rpc.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +19 -1
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/host/terminal/backends/conpty-backend.js.map +1 -1
- package/data/build/dist/host/terminal/terminal-controller.d.ts.map +1 -1
- package/data/build/dist/host/terminal/terminal-controller.js +4 -0
- package/data/build/dist/host/terminal/terminal-controller.js.map +1 -1
- package/data/build/dist/host/terminal/terminal-service.d.ts +21 -1
- package/data/build/dist/host/terminal/terminal-service.d.ts.map +1 -1
- package/data/build/dist/host/terminal/terminal-service.js +118 -7
- package/data/build/dist/host/terminal/terminal-service.js.map +1 -1
- package/data/build/dist/index.d.ts +2 -2
- package/data/build/dist/index.d.ts.map +1 -1
- package/data/build/dist/index.js +1 -1
- package/data/build/dist/index.js.map +1 -1
- package/data/build/dist/shared/contracts/assistant.d.ts +70 -0
- package/data/build/dist/shared/contracts/assistant.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/assistant.js +2 -0
- package/data/build/dist/shared/contracts/assistant.js.map +1 -0
- package/data/build/dist/shared/contracts/cli-adapter.d.ts +33 -1
- package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.d.ts +30 -0
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +20 -0
- 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/subscription.d.ts +30 -0
- package/data/build/dist/shared/contracts/subscription.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/subscription.js.map +1 -1
- package/data/build/dist/shared/contracts/terminal.d.ts +2 -0
- package/data/build/dist/shared/contracts/terminal.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +12 -5
- package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.js +11 -4
- package/data/build/dist/shared/contracts/version.js.map +1 -1
- package/data/build/dist/shared/contracts/voice-runtime.d.ts +90 -0
- package/data/build/dist/shared/contracts/voice-runtime.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/voice-runtime.js +16 -0
- package/data/build/dist/shared/contracts/voice-runtime.js.map +1 -0
- package/data/build/dist/shared/index.d.ts +8 -2
- package/data/build/dist/shared/index.d.ts.map +1 -1
- package/data/build/dist/shared/index.js +5 -1
- package/data/build/dist/shared/index.js.map +1 -1
- package/data/build/dist/shared/voice-models.d.ts +21 -0
- package/data/build/dist/shared/voice-models.d.ts.map +1 -0
- package/data/build/dist/shared/voice-models.js +27 -0
- package/data/build/dist/shared/voice-models.js.map +1 -0
- package/data/build/dist/shared/voice-stream.d.ts +42 -0
- package/data/build/dist/shared/voice-stream.d.ts.map +1 -0
- package/data/build/dist/shared/voice-stream.js +99 -0
- package/data/build/dist/shared/voice-stream.js.map +1 -0
- package/data/build/dist/shared/voice-text.d.ts +3 -0
- package/data/build/dist/shared/voice-text.d.ts.map +1 -0
- package/data/build/dist/shared/voice-text.js +14 -0
- package/data/build/dist/shared/voice-text.js.map +1 -0
- package/data/build/dist/typert.host.d.ts.map +1 -1
- package/data/build/dist/typert.host.js +1 -0
- package/data/build/dist/typert.host.js.map +1 -1
- package/package.json +56 -26
- package/profile/README.md +8 -5
- package/profile/package.json +5 -3
- package/profile/version.json +3 -3
- package/version.json +3 -3
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
import type { CodingNsCliModelCatalog } from '../shared/contracts/cli-adapter.js';
|
|
2
2
|
import type { CodingNsRpcClient } from './features/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Client 缓存有效期。
|
|
5
|
+
*
|
|
6
|
+
* 目录里既有模型清单,也有账号级事实(例如 Codex 的 `officialSubscription`
|
|
7
|
+
* 与 `defaultServiceTier`)。后者会随用户在外部工具里切换供应商或登录状态而
|
|
8
|
+
* 变化,而页面不会因此重新挂载。若 Client 永久持有第一次的结果,依赖这些事实
|
|
9
|
+
* 的控件(Codex 官方订阅的 Fast 档位开关)就会在整场会话里一直缺失。
|
|
10
|
+
*
|
|
11
|
+
* 因此这里给出一个短 TTL:命中即用(不阻塞渲染),过期后重新请求。Host 侧还会
|
|
12
|
+
* 比对 Provider 配置指纹,配置真正变化时立即失效,不依赖这个 TTL。
|
|
13
|
+
*/
|
|
14
|
+
export declare const MODEL_CATALOG_CACHE_TTL_MS = 60000;
|
|
15
|
+
/** 作废某个适配器(或全部适配器)的 Client 目录缓存。 */
|
|
16
|
+
export declare function invalidateModelCatalogCache(rpc: CodingNsRpcClient, adapterId?: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* 「判定可能过期」时的复检节流。
|
|
19
|
+
*
|
|
20
|
+
* 目录声明了服务档位却未确认官方订阅时,值得再探测一次;但真实第三方接入会
|
|
21
|
+
* 长期停在这个状态,不能每次挂载都发一次请求。这里按适配器记录最近一次复检
|
|
22
|
+
* 时间,只有超过间隔才允许再次作废缓存。
|
|
23
|
+
*/
|
|
24
|
+
export declare const MODEL_CATALOG_REVALIDATE_INTERVAL_MS = 60000;
|
|
25
|
+
export declare function shouldRevalidateModelCatalog(rpc: CodingNsRpcClient, adapterId: string, needsRevalidation: boolean): boolean;
|
|
3
26
|
export declare function getModelCatalogCache(rpc: CodingNsRpcClient): Map<string, CodingNsCliModelCatalog>;
|
|
4
27
|
export declare function loadModelCatalog(rpc: CodingNsRpcClient, adapterId: string, sessionId?: string): Promise<CodingNsCliModelCatalog>;
|
|
5
28
|
//# sourceMappingURL=model-catalog-cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-catalog-cache.d.ts","sourceRoot":"","sources":["../../../../src/client/model-catalog-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAA;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAY5D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAQjG;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"model-catalog-cache.d.ts","sourceRoot":"","sources":["../../../../src/client/model-catalog-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAA;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAY5D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAA;AA4BhD,oCAAoC;AACpC,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAU5F;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,QAAS,CAAA;AAI1D,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,iBAAiB,EACtB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,GACzB,OAAO,CAaT;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAQjG;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuBhI"}
|
|
@@ -7,6 +7,72 @@ import { callCliRpc } from './cli-catalog.js';
|
|
|
7
7
|
*/
|
|
8
8
|
const modelCatalogCaches = new WeakMap();
|
|
9
9
|
const modelCatalogLoads = new WeakMap();
|
|
10
|
+
/**
|
|
11
|
+
* Client 缓存有效期。
|
|
12
|
+
*
|
|
13
|
+
* 目录里既有模型清单,也有账号级事实(例如 Codex 的 `officialSubscription`
|
|
14
|
+
* 与 `defaultServiceTier`)。后者会随用户在外部工具里切换供应商或登录状态而
|
|
15
|
+
* 变化,而页面不会因此重新挂载。若 Client 永久持有第一次的结果,依赖这些事实
|
|
16
|
+
* 的控件(Codex 官方订阅的 Fast 档位开关)就会在整场会话里一直缺失。
|
|
17
|
+
*
|
|
18
|
+
* 因此这里给出一个短 TTL:命中即用(不阻塞渲染),过期后重新请求。Host 侧还会
|
|
19
|
+
* 比对 Provider 配置指纹,配置真正变化时立即失效,不依赖这个 TTL。
|
|
20
|
+
*/
|
|
21
|
+
export const MODEL_CATALOG_CACHE_TTL_MS = 60_000;
|
|
22
|
+
const modelCatalogCacheTimes = new WeakMap();
|
|
23
|
+
function cacheEntry(rpc, adapterId) {
|
|
24
|
+
return cacheTimesFor(rpc).get(adapterId);
|
|
25
|
+
}
|
|
26
|
+
function cacheTimesFor(rpc) {
|
|
27
|
+
const key = rpc;
|
|
28
|
+
let times = modelCatalogCacheTimes.get(key);
|
|
29
|
+
if (times === undefined) {
|
|
30
|
+
times = new Map();
|
|
31
|
+
modelCatalogCacheTimes.set(key, times);
|
|
32
|
+
}
|
|
33
|
+
return times;
|
|
34
|
+
}
|
|
35
|
+
function storeCatalog(rpc, adapterId, value) {
|
|
36
|
+
getModelCatalogCache(rpc).set(adapterId, value);
|
|
37
|
+
cacheTimesFor(rpc).set(adapterId, { value, storedAt: Date.now() });
|
|
38
|
+
}
|
|
39
|
+
/** 作废某个适配器(或全部适配器)的 Client 目录缓存。 */
|
|
40
|
+
export function invalidateModelCatalogCache(rpc, adapterId) {
|
|
41
|
+
const cache = getModelCatalogCache(rpc);
|
|
42
|
+
const times = cacheTimesFor(rpc);
|
|
43
|
+
if (adapterId === undefined) {
|
|
44
|
+
cache.clear();
|
|
45
|
+
times.clear();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
cache.delete(adapterId);
|
|
49
|
+
times.delete(adapterId);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 「判定可能过期」时的复检节流。
|
|
53
|
+
*
|
|
54
|
+
* 目录声明了服务档位却未确认官方订阅时,值得再探测一次;但真实第三方接入会
|
|
55
|
+
* 长期停在这个状态,不能每次挂载都发一次请求。这里按适配器记录最近一次复检
|
|
56
|
+
* 时间,只有超过间隔才允许再次作废缓存。
|
|
57
|
+
*/
|
|
58
|
+
export const MODEL_CATALOG_REVALIDATE_INTERVAL_MS = 60_000;
|
|
59
|
+
const modelCatalogRevalidations = new WeakMap();
|
|
60
|
+
export function shouldRevalidateModelCatalog(rpc, adapterId, needsRevalidation) {
|
|
61
|
+
if (!needsRevalidation)
|
|
62
|
+
return false;
|
|
63
|
+
const key = rpc;
|
|
64
|
+
let times = modelCatalogRevalidations.get(key);
|
|
65
|
+
if (times === undefined) {
|
|
66
|
+
times = new Map();
|
|
67
|
+
modelCatalogRevalidations.set(key, times);
|
|
68
|
+
}
|
|
69
|
+
const last = times.get(adapterId);
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
if (last !== undefined && now - last < MODEL_CATALOG_REVALIDATE_INTERVAL_MS)
|
|
72
|
+
return false;
|
|
73
|
+
times.set(adapterId, now);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
10
76
|
export function getModelCatalogCache(rpc) {
|
|
11
77
|
const key = rpc;
|
|
12
78
|
let cache = modelCatalogCaches.get(key);
|
|
@@ -20,10 +86,11 @@ export function loadModelCatalog(rpc, adapterId, sessionId) {
|
|
|
20
86
|
const cached = getModelCatalogCache(rpc).get(adapterId);
|
|
21
87
|
// 回退目录只用于当前渲染,不能在 Client 侧永久占住真实目录。Host 会在
|
|
22
88
|
// 短周期内重试产品快照读取;下一次请求必须有机会拿到恢复后的目录。
|
|
23
|
-
if (cached !== undefined && cached.fallback !== true)
|
|
89
|
+
if (cached !== undefined && cached.fallback !== true && isFreshCacheEntry(rpc, adapterId, cached)) {
|
|
24
90
|
return Promise.resolve(cached);
|
|
25
|
-
|
|
26
|
-
|
|
91
|
+
}
|
|
92
|
+
if (cached !== undefined)
|
|
93
|
+
invalidateModelCatalogCache(rpc, adapterId);
|
|
27
94
|
const loads = getModelCatalogLoadCache(rpc);
|
|
28
95
|
const running = loads.get(adapterId);
|
|
29
96
|
if (running !== undefined)
|
|
@@ -32,12 +99,10 @@ export function loadModelCatalog(rpc, adapterId, sessionId) {
|
|
|
32
99
|
adapterId,
|
|
33
100
|
...(sessionId === undefined ? {} : { sessionId }),
|
|
34
101
|
}).then((value) => {
|
|
35
|
-
if (value.fallback === true)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
getModelCatalogCache(rpc).set(adapterId, value);
|
|
40
|
-
}
|
|
102
|
+
if (value.fallback === true)
|
|
103
|
+
invalidateModelCatalogCache(rpc, adapterId);
|
|
104
|
+
else
|
|
105
|
+
storeCatalog(rpc, adapterId, value);
|
|
41
106
|
return value;
|
|
42
107
|
}).finally(() => {
|
|
43
108
|
if (loads.get(adapterId) === request)
|
|
@@ -46,6 +111,13 @@ export function loadModelCatalog(rpc, adapterId, sessionId) {
|
|
|
46
111
|
loads.set(adapterId, request);
|
|
47
112
|
return request;
|
|
48
113
|
}
|
|
114
|
+
/** 缓存条目是否仍在有效期内;没有时间戳的旧条目按过期处理并触发一次重新读取。 */
|
|
115
|
+
function isFreshCacheEntry(rpc, adapterId, cached) {
|
|
116
|
+
const entry = cacheEntry(rpc, adapterId);
|
|
117
|
+
if (entry === undefined || entry.value !== cached)
|
|
118
|
+
return false;
|
|
119
|
+
return Date.now() - entry.storedAt < MODEL_CATALOG_CACHE_TTL_MS;
|
|
120
|
+
}
|
|
49
121
|
function getModelCatalogLoadCache(rpc) {
|
|
50
122
|
const key = rpc;
|
|
51
123
|
let cache = modelCatalogLoads.get(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-catalog-cache.js","sourceRoot":"","sources":["../../../../src/client/model-catalog-cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAgD,CAAA;AACtF,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAyD,CAAA;AAE9F,MAAM,UAAU,oBAAoB,CAAC,GAAsB;IACzD,MAAM,GAAG,GAAG,GAAa,CAAA;IACzB,IAAI,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,GAAG,EAAE,CAAA;QACjB,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAsB,EAAE,SAAiB,EAAE,SAAkB;IAC5F,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACvD,2CAA2C;IAC3C,mCAAmC;IACnC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;
|
|
1
|
+
{"version":3,"file":"model-catalog-cache.js","sourceRoot":"","sources":["../../../../src/client/model-catalog-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,17 @@ export declare function isServiceTierEnabled(catalog: CodingNsCliModelCatalog |
|
|
|
36
36
|
export declare function toggledServiceTierId(model: CodingNsCliModel | undefined, enabled: boolean): string | undefined;
|
|
37
37
|
/** 生效档位对应的目录条目;标准速度或未知档位返回 undefined。 */
|
|
38
38
|
export declare function activeServiceTier(catalog: CodingNsCliModelCatalog | null, model: CodingNsCliModel | undefined, selectedId: string | undefined): CodingNsCliServiceTier | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* 目录是否「声明了档位、但未确认官方订阅」——即档位开关缺席的原因可能只是判定过期。
|
|
41
|
+
*
|
|
42
|
+
* 这一状态有两种来源,界面上无法区分:
|
|
43
|
+
* - 真实第三方中转/纯 API key:档位确实不会生效,应当持续不展示;
|
|
44
|
+
* - 判定过期:用户在外部工具(cc-switch 等)里刚切回官方订阅,而页面还持有旧目录。
|
|
45
|
+
*
|
|
46
|
+
* 因此它只用来决定「值得再探测一次」,不能用来决定「应该展示开关」。重新探测由
|
|
47
|
+
* Host 的 Provider 配置指纹保证廉价:配置没变时 Host 直接返回缓存,不会重启 CLI。
|
|
48
|
+
*/
|
|
49
|
+
export declare function needsServiceTierRevalidation(catalog: CodingNsCliModelCatalog | null): boolean;
|
|
39
50
|
/**
|
|
40
51
|
* 在“只改了其它字段”的部分更新里保留当前档位选择。
|
|
41
52
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-tier.d.ts","sourceRoot":"","sources":["../../../../src/client/service-tier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAE3H;;;;GAIG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,wBAAwB,YAAY,CAAA;AAEjD,+BAA+B;AAC/B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,sBAAsB,EAAE,CAExG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAClC,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,CAKR;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAET;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9G;AAED,yCAAyC;AACzC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,sBAAsB,GAAG,SAAS,CAGpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,GAAG,SAAS,CAIpB"}
|
|
1
|
+
{"version":3,"file":"service-tier.d.ts","sourceRoot":"","sources":["../../../../src/client/service-tier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAE3H;;;;GAIG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,wBAAwB,YAAY,CAAA;AAEjD,+BAA+B;AAC/B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,sBAAsB,EAAE,CAExG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAClC,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,CAKR;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAET;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9G;AAED,yCAAyC;AACzC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,uBAAuB,GAAG,IAAI,EACvC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,sBAAsB,GAAG,SAAS,CAGpC;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,GAAG,OAAO,CAG7F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,GAAG,SAAS,CAIpB"}
|
|
@@ -55,6 +55,21 @@ export function activeServiceTier(catalog, model, selectedId) {
|
|
|
55
55
|
const id = effectiveServiceTierId(catalog, selectedId);
|
|
56
56
|
return modelServiceTiers(model).find((tier) => tier.id === id);
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* 目录是否「声明了档位、但未确认官方订阅」——即档位开关缺席的原因可能只是判定过期。
|
|
60
|
+
*
|
|
61
|
+
* 这一状态有两种来源,界面上无法区分:
|
|
62
|
+
* - 真实第三方中转/纯 API key:档位确实不会生效,应当持续不展示;
|
|
63
|
+
* - 判定过期:用户在外部工具(cc-switch 等)里刚切回官方订阅,而页面还持有旧目录。
|
|
64
|
+
*
|
|
65
|
+
* 因此它只用来决定「值得再探测一次」,不能用来决定「应该展示开关」。重新探测由
|
|
66
|
+
* Host 的 Provider 配置指纹保证廉价:配置没变时 Host 直接返回缓存,不会重启 CLI。
|
|
67
|
+
*/
|
|
68
|
+
export function needsServiceTierRevalidation(catalog) {
|
|
69
|
+
if (catalog === null || catalog.officialSubscription === true)
|
|
70
|
+
return false;
|
|
71
|
+
return catalog.groups.some((group) => group.models.some((model) => modelServiceTiers(model).length > 0));
|
|
72
|
+
}
|
|
58
73
|
/**
|
|
59
74
|
* 在“只改了其它字段”的部分更新里保留当前档位选择。
|
|
60
75
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-tier.js","sourceRoot":"","sources":["../../../../src/client/service-tier.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,SAAS,CAAA;AAEjD,+BAA+B;AAC/B,MAAM,UAAU,iBAAiB,CAAC,KAAmC;IACnE,OAAO,KAAK,EAAE,YAAY,IAAI,EAAE,CAAA;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAuC,EACvC,KAAmC;IAEnC,OAAO,OAAO,EAAE,oBAAoB,KAAK,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAuC,EACvC,UAA8B;IAE9B,MAAM,QAAQ,GAAG,UAAU,EAAE,IAAI,EAAE,CAAA;IACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAA;IAC9D,MAAM,iBAAiB,GAAG,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAA;IAC7D,OAAO,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,KAAK,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,iBAAiB,CAAA;AACnH,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,oBAAoB,CAClC,OAAuC,EACvC,UAA8B;IAE9B,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,wBAAwB,CAAA;AACjF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAmC,EAAE,OAAgB;IACxF,IAAI,CAAC,OAAO;QAAE,OAAO,wBAAwB,CAAA;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,iBAAiB,CAC/B,OAAuC,EACvC,KAAmC,EACnC,UAA8B;IAE9B,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACtD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAChE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAmC,EACnC,SAA6B;IAE7B,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,EAAE,CAAA;IACjC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAA;AAC1G,CAAC"}
|
|
1
|
+
{"version":3,"file":"service-tier.js","sourceRoot":"","sources":["../../../../src/client/service-tier.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,SAAS,CAAA;AAEjD,+BAA+B;AAC/B,MAAM,UAAU,iBAAiB,CAAC,KAAmC;IACnE,OAAO,KAAK,EAAE,YAAY,IAAI,EAAE,CAAA;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAuC,EACvC,KAAmC;IAEnC,OAAO,OAAO,EAAE,oBAAoB,KAAK,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAuC,EACvC,UAA8B;IAE9B,MAAM,QAAQ,GAAG,UAAU,EAAE,IAAI,EAAE,CAAA;IACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAA;IAC9D,MAAM,iBAAiB,GAAG,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAA;IAC7D,OAAO,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,KAAK,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,iBAAiB,CAAA;AACnH,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,oBAAoB,CAClC,OAAuC,EACvC,UAA8B;IAE9B,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,wBAAwB,CAAA;AACjF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAmC,EAAE,OAAgB;IACxF,IAAI,CAAC,OAAO;QAAE,OAAO,wBAAwB,CAAA;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,iBAAiB,CAC/B,OAAuC,EACvC,KAAmC,EACnC,UAA8B;IAE9B,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACtD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAChE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAuC;IAClF,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,oBAAoB,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AAC1G,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAmC,EACnC,SAA6B;IAE7B,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,EAAE,CAAA;IACjC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IAC7D,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAA;AAC1G,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { CodingNsClientServices } from './features/types.js';
|
|
2
|
+
import type { VoiceClientDevice, VoicePcmFrame, VoiceRuntimeAdapter, VoiceRuntimeCapabilities, VoiceRuntimeListener } from '../shared/contracts/voice-runtime.js';
|
|
3
|
+
export interface SherpaClientVoiceAdapterOptions {
|
|
4
|
+
readonly ownerId: string;
|
|
5
|
+
readonly services: CodingNsClientServices;
|
|
6
|
+
}
|
|
7
|
+
/** 浏览器侧 Sherpa 数据面:设备和权限在 Client,识别在 Host。 */
|
|
8
|
+
export declare class ClientSherpaVoiceAdapter implements VoiceRuntimeAdapter {
|
|
9
|
+
private readonly listeners;
|
|
10
|
+
private readonly services;
|
|
11
|
+
private readonly devices;
|
|
12
|
+
private readonly options;
|
|
13
|
+
private capture;
|
|
14
|
+
private uploader;
|
|
15
|
+
private responseAbort;
|
|
16
|
+
private active;
|
|
17
|
+
private hostLeaseActive;
|
|
18
|
+
private epoch;
|
|
19
|
+
private configuredOwner;
|
|
20
|
+
private selectedInputDeviceId;
|
|
21
|
+
private selectedOutputDeviceId;
|
|
22
|
+
constructor(options: SherpaClientVoiceAdapterOptions);
|
|
23
|
+
get capabilities(): VoiceRuntimeCapabilities;
|
|
24
|
+
get ownerId(): string | undefined;
|
|
25
|
+
get configuredOwnerId(): string;
|
|
26
|
+
get inputDeviceId(): string | undefined;
|
|
27
|
+
get outputDeviceId(): string | undefined;
|
|
28
|
+
get outputDeviceSupported(): boolean;
|
|
29
|
+
subscribe(listener: VoiceRuntimeListener): () => void;
|
|
30
|
+
enumerateInputDevices(): Promise<readonly VoiceClientDevice[]>;
|
|
31
|
+
enumerateOutputDevices(): Promise<readonly VoiceClientDevice[]>;
|
|
32
|
+
selectInputDevice(deviceId: string): Promise<void>;
|
|
33
|
+
selectOutputDevice(deviceId: string): Promise<void>;
|
|
34
|
+
start(ownerId?: string): Promise<void>;
|
|
35
|
+
stop(): Promise<void>;
|
|
36
|
+
interrupt(): Promise<void>;
|
|
37
|
+
sendPcm(frame: VoicePcmFrame, epoch: number): void;
|
|
38
|
+
speak(text: string, epoch: number): Promise<void>;
|
|
39
|
+
dispose(): void;
|
|
40
|
+
private sendPcmFrame;
|
|
41
|
+
private readEvents;
|
|
42
|
+
private handleEvent;
|
|
43
|
+
private applyOutputDevice;
|
|
44
|
+
private emit;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sherpa-voice-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sherpa-voice-adapter.d.ts","sourceRoot":"","sources":["../../../../src/client/sherpa-voice-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAEjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,mBAAmB,EAAE,wBAAwB,EAAqB,oBAAoB,EAAqB,MAAM,sCAAsC,CAAA;AAKvM,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAA;CAC1C;AAED,8CAA8C;AAC9C,qBAAa,wBAAyB,YAAW,mBAAmB;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,qBAAqB,CAAoB;IACjD,OAAO,CAAC,sBAAsB,CAAoB;gBAEtC,OAAO,EAAE,+BAA+B;IAcpD,IAAI,YAAY,IAAI,wBAAwB,CAI3C;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAA0D;IAC3F,IAAI,iBAAiB,IAAI,MAAM,CAAgC;IAC/D,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAAsC;IAC7E,IAAI,cAAc,IAAI,MAAM,GAAG,SAAS,CAAuC;IAC/E,IAAI,qBAAqB,IAAI,OAAO,CAA+I;IAEnL,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAE/C,qBAAqB,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC;IAC9D,sBAAsB,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC;IAC/D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBrB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQhC,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAE5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvD,OAAO,IAAI,IAAI;IAEf,OAAO,CAAC,YAAY;YAMN,UAAU;YAsBV,WAAW;YAaX,iBAAiB;IAQ/B,OAAO,CAAC,IAAI;CACb"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { CODINGNS_RPC_CHANNEL } from '../shared/contracts/transport.js';
|
|
2
|
+
import { encodeVoiceStreamMessage, encodeVoiceStreamOpen } from '../shared/voice-stream.js';
|
|
3
|
+
import { BrowserVoiceDeviceManager } from './voice-device-manager.js';
|
|
4
|
+
import { ClientVoiceCapture } from './voice-capture.js';
|
|
5
|
+
/** 浏览器侧 Sherpa 数据面:设备和权限在 Client,识别在 Host。 */
|
|
6
|
+
export class ClientSherpaVoiceAdapter {
|
|
7
|
+
listeners = new Set();
|
|
8
|
+
services;
|
|
9
|
+
devices;
|
|
10
|
+
options;
|
|
11
|
+
capture;
|
|
12
|
+
uploader;
|
|
13
|
+
responseAbort;
|
|
14
|
+
active = false;
|
|
15
|
+
hostLeaseActive = false;
|
|
16
|
+
epoch = 0;
|
|
17
|
+
configuredOwner;
|
|
18
|
+
selectedInputDeviceId;
|
|
19
|
+
selectedOutputDeviceId;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.services = options.services;
|
|
23
|
+
this.configuredOwner = options.ownerId;
|
|
24
|
+
this.devices = new BrowserVoiceDeviceManager();
|
|
25
|
+
const snapshot = this.devices.snapshot();
|
|
26
|
+
this.selectedInputDeviceId = snapshot.selectedInputId ?? undefined;
|
|
27
|
+
this.selectedOutputDeviceId = snapshot.selectedOutputId ?? undefined;
|
|
28
|
+
this.devices.subscribe((next) => {
|
|
29
|
+
this.selectedInputDeviceId = next.selectedInputId ?? undefined;
|
|
30
|
+
this.selectedOutputDeviceId = next.selectedOutputId ?? undefined;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
get capabilities() {
|
|
34
|
+
const secure = this.devices.snapshot().secureContext;
|
|
35
|
+
const supported = secure && typeof globalThis.fetch === 'function' && typeof globalThis.ReadableStream === 'function';
|
|
36
|
+
return { realtime: supported, wakeWord: false, streamingInput: supported, streamingOutput: false, bargeIn: supported, speechToText: supported, textToSpeech: typeof globalThis.speechSynthesis !== 'undefined' };
|
|
37
|
+
}
|
|
38
|
+
get ownerId() { return this.active ? this.configuredOwner : undefined; }
|
|
39
|
+
get configuredOwnerId() { return this.configuredOwner; }
|
|
40
|
+
get inputDeviceId() { return this.selectedInputDeviceId; }
|
|
41
|
+
get outputDeviceId() { return this.selectedOutputDeviceId; }
|
|
42
|
+
get outputDeviceSupported() { return typeof globalThis.HTMLMediaElement?.prototype?.setSinkId === 'function'; }
|
|
43
|
+
subscribe(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
|
|
44
|
+
async enumerateInputDevices() { return (await this.devices.refresh()).inputs; }
|
|
45
|
+
async enumerateOutputDevices() { return (await this.devices.refresh()).outputs; }
|
|
46
|
+
async selectInputDevice(deviceId) {
|
|
47
|
+
await this.devices.selectInput(deviceId);
|
|
48
|
+
this.selectedInputDeviceId = this.devices.snapshot().selectedInputId ?? undefined;
|
|
49
|
+
if (this.active) {
|
|
50
|
+
await this.stop();
|
|
51
|
+
await this.start(this.configuredOwner);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async selectOutputDevice(deviceId) {
|
|
55
|
+
if (!this.outputDeviceSupported)
|
|
56
|
+
throw new Error('当前浏览器不支持输出设备选择');
|
|
57
|
+
await this.devices.selectOutput(deviceId);
|
|
58
|
+
this.selectedOutputDeviceId = this.devices.snapshot().selectedOutputId ?? undefined;
|
|
59
|
+
await this.applyOutputDevice();
|
|
60
|
+
}
|
|
61
|
+
async start(ownerId) {
|
|
62
|
+
if (this.active)
|
|
63
|
+
return;
|
|
64
|
+
this.configuredOwner = ownerId?.trim() || this.configuredOwner;
|
|
65
|
+
if (this.configuredOwner === '')
|
|
66
|
+
throw new Error('全局语音租约缺少 ownerId');
|
|
67
|
+
const lease = await this.services.rpc.call(CODINGNS_RPC_CHANNEL, 'assistant/voice/start', { ownerId: this.configuredOwner });
|
|
68
|
+
if (!lease.ok)
|
|
69
|
+
throw new Error(lease.error.message);
|
|
70
|
+
if (isRecord(lease.value) && lease.value.unavailable === true)
|
|
71
|
+
throw new Error(typeof lease.value.message === 'string' ? lease.value.message : '本地 Sherpa 语音运行时不可用');
|
|
72
|
+
this.hostLeaseActive = true;
|
|
73
|
+
const snapshot = await this.devices.refresh();
|
|
74
|
+
if (!snapshot.secureContext)
|
|
75
|
+
throw new Error('当前页面不是安全上下文,请改用 HTTPS 或 localhost 后访问麦克风');
|
|
76
|
+
this.epoch += 1;
|
|
77
|
+
const epoch = this.epoch;
|
|
78
|
+
const uploader = new VoiceStreamUploader();
|
|
79
|
+
const abort = new AbortController();
|
|
80
|
+
this.uploader = uploader;
|
|
81
|
+
this.responseAbort = abort;
|
|
82
|
+
this.active = true;
|
|
83
|
+
this.emit({ type: 'state', state: 'loading', epoch });
|
|
84
|
+
try {
|
|
85
|
+
uploader.enqueue(encodeVoiceStreamOpen({ ownerId: this.configuredOwner, clientId: createClientId(), sampleRate: 16_000, channels: 1, encoding: 'pcm16le' }));
|
|
86
|
+
const response = await globalThis.fetch(resolveVoiceStreamUrl(), {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
body: uploader.stream,
|
|
89
|
+
signal: abort.signal,
|
|
90
|
+
credentials: 'same-origin',
|
|
91
|
+
headers: { 'content-type': 'application/octet-stream', accept: 'application/x-ndjson' },
|
|
92
|
+
...{ duplex: 'half' },
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok || response.body === null)
|
|
95
|
+
throw new Error(`语音流连接失败(HTTP ${response.status})`);
|
|
96
|
+
void this.readEvents(response.body, epoch);
|
|
97
|
+
const capture = new ClientVoiceCapture({ devices: this.devices, targetSampleRate: 16_000, onFrame: (frame) => this.sendPcmFrame(frame, epoch), onEnded: (error) => this.emit({ type: 'error', code: 'voice_capture_ended', message: error.message, recoverable: true, epoch }) });
|
|
98
|
+
this.capture = capture;
|
|
99
|
+
await capture.start();
|
|
100
|
+
this.emit({ type: 'state', state: 'listening', epoch });
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
await this.stop().catch(() => undefined);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async stop() {
|
|
108
|
+
if (!this.active && this.capture === undefined && !this.hostLeaseActive)
|
|
109
|
+
return;
|
|
110
|
+
this.active = false;
|
|
111
|
+
let captureError;
|
|
112
|
+
try {
|
|
113
|
+
await this.capture?.stop();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
// 采集器可能已经被浏览器提前终止;无论如何都必须继续释放 Host 租约。
|
|
117
|
+
captureError = error;
|
|
118
|
+
}
|
|
119
|
+
this.capture = undefined;
|
|
120
|
+
this.uploader?.enqueue(encodeVoiceStreamMessage({ type: 'close', epoch: this.epoch }));
|
|
121
|
+
this.uploader?.close();
|
|
122
|
+
this.uploader = undefined;
|
|
123
|
+
this.responseAbort?.abort();
|
|
124
|
+
this.responseAbort = undefined;
|
|
125
|
+
if (this.hostLeaseActive) {
|
|
126
|
+
this.hostLeaseActive = false;
|
|
127
|
+
await this.services.rpc.call(CODINGNS_RPC_CHANNEL, 'assistant/voice/stop', { ownerId: this.configuredOwner }).catch(() => undefined);
|
|
128
|
+
}
|
|
129
|
+
this.epoch += 1;
|
|
130
|
+
this.emit({ type: 'state', state: 'disabled', epoch: this.epoch });
|
|
131
|
+
if (captureError !== undefined)
|
|
132
|
+
throw captureError;
|
|
133
|
+
}
|
|
134
|
+
async interrupt() {
|
|
135
|
+
this.epoch += 1;
|
|
136
|
+
globalThis.speechSynthesis?.cancel();
|
|
137
|
+
this.uploader?.enqueue(encodeVoiceStreamMessage({ type: 'interrupt', epoch: this.epoch }));
|
|
138
|
+
await this.services.rpc.call(CODINGNS_RPC_CHANNEL, 'assistant/voice/interrupt', { ownerId: this.configuredOwner }).catch(() => undefined);
|
|
139
|
+
this.emit({ type: 'barge-in', epoch: this.epoch });
|
|
140
|
+
}
|
|
141
|
+
sendPcm(frame, epoch) { this.sendPcmFrame(frame, epoch); }
|
|
142
|
+
async speak(text, epoch) {
|
|
143
|
+
if (epoch !== this.epoch || text.trim() === '')
|
|
144
|
+
return;
|
|
145
|
+
const synthesis = globalThis.speechSynthesis;
|
|
146
|
+
if (synthesis === undefined || typeof globalThis.SpeechSynthesisUtterance !== 'function')
|
|
147
|
+
throw new Error('当前浏览器不支持语音播报');
|
|
148
|
+
synthesis.cancel();
|
|
149
|
+
await new Promise((resolve) => {
|
|
150
|
+
const utterance = new SpeechSynthesisUtterance(text.trim());
|
|
151
|
+
utterance.lang = 'zh-CN';
|
|
152
|
+
utterance.onend = () => resolve();
|
|
153
|
+
utterance.onerror = () => resolve();
|
|
154
|
+
synthesis.speak(utterance);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
dispose() { void this.stop(); this.devices.dispose(); this.listeners.clear(); }
|
|
158
|
+
sendPcmFrame(frame, epoch) {
|
|
159
|
+
if (!this.active || this.uploader === undefined || epoch !== this.epoch)
|
|
160
|
+
return;
|
|
161
|
+
this.uploader.enqueue(encodeVoiceStreamMessage({ type: 'pcm', sequence: frame.sequence, sampleRate: frame.sampleRate, channels: 1, epoch, byteLength: frame.bytes.byteLength }));
|
|
162
|
+
this.uploader.enqueue(frame.bytes);
|
|
163
|
+
}
|
|
164
|
+
async readEvents(body, streamEpoch) {
|
|
165
|
+
const reader = body.getReader();
|
|
166
|
+
const decoder = new TextDecoder();
|
|
167
|
+
let text = '';
|
|
168
|
+
try {
|
|
169
|
+
while (true) {
|
|
170
|
+
const next = await reader.read();
|
|
171
|
+
if (next.done)
|
|
172
|
+
break;
|
|
173
|
+
text += decoder.decode(next.value, { stream: true });
|
|
174
|
+
let newline = text.indexOf('\n');
|
|
175
|
+
while (newline >= 0) {
|
|
176
|
+
const line = text.slice(0, newline).trim();
|
|
177
|
+
text = text.slice(newline + 1);
|
|
178
|
+
if (line !== '')
|
|
179
|
+
await this.handleEvent(JSON.parse(line), streamEpoch);
|
|
180
|
+
newline = text.indexOf('\n');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (this.active)
|
|
186
|
+
this.emit({ type: 'error', code: 'voice_stream_response_failed', message: error instanceof Error ? error.message : String(error), recoverable: true, epoch: streamEpoch });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async handleEvent(value, streamEpoch) {
|
|
190
|
+
if (streamEpoch !== this.epoch || typeof value.type !== 'string')
|
|
191
|
+
return;
|
|
192
|
+
if (value.type === 'state' && typeof value.state === 'string')
|
|
193
|
+
this.emit({ type: 'state', state: value.state, epoch: readEpoch(value, streamEpoch) });
|
|
194
|
+
else if (value.type === 'partial' && typeof value.text === 'string')
|
|
195
|
+
this.emit({ type: 'partial', text: value.text, epoch: readEpoch(value, streamEpoch) });
|
|
196
|
+
else if (value.type === 'final' && typeof value.text === 'string') {
|
|
197
|
+
const eventEpoch = readEpoch(value, streamEpoch);
|
|
198
|
+
this.emit({ type: 'final', text: value.text, epoch: eventEpoch });
|
|
199
|
+
const result = await this.services.rpc.call(CODINGNS_RPC_CHANNEL, 'assistant/voice/text', { ownerId: this.configuredOwner, text: value.text, requestId: createClientId() });
|
|
200
|
+
if (result.ok && isRecord(result.value) && typeof result.value.speechText === 'string')
|
|
201
|
+
await this.speak(result.value.speechText, eventEpoch);
|
|
202
|
+
}
|
|
203
|
+
else if (value.type === 'barge-in')
|
|
204
|
+
this.emit({ type: 'barge-in', epoch: readEpoch(value, streamEpoch) });
|
|
205
|
+
else if (value.type === 'error')
|
|
206
|
+
this.emit({ type: 'error', code: String(value.code ?? 'voice_stream_error'), message: String(value.message ?? value.code ?? ''), recoverable: value.recoverable !== false, epoch: readEpoch(value, streamEpoch) });
|
|
207
|
+
}
|
|
208
|
+
async applyOutputDevice() {
|
|
209
|
+
if (!this.outputDeviceSupported)
|
|
210
|
+
return;
|
|
211
|
+
for (const media of [...document.querySelectorAll('audio,video')]) {
|
|
212
|
+
const sink = media.setSinkId;
|
|
213
|
+
if (typeof sink === 'function')
|
|
214
|
+
await sink.call(media, this.selectedOutputDeviceId ?? '');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
emit(event) { for (const listener of [...this.listeners]) {
|
|
218
|
+
try {
|
|
219
|
+
listener(event);
|
|
220
|
+
}
|
|
221
|
+
catch { /* UI 订阅者异常不能破坏语音数据面 */ }
|
|
222
|
+
} }
|
|
223
|
+
}
|
|
224
|
+
class VoiceStreamUploader {
|
|
225
|
+
stream;
|
|
226
|
+
controller;
|
|
227
|
+
closed = false;
|
|
228
|
+
constructor() { this.stream = new ReadableStream({ start: (controller) => { this.controller = controller; } }); }
|
|
229
|
+
enqueue(bytes) { if (!this.closed) {
|
|
230
|
+
try {
|
|
231
|
+
this.controller?.enqueue(bytes.slice());
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
this.closed = true;
|
|
235
|
+
}
|
|
236
|
+
} }
|
|
237
|
+
close() { if (this.closed)
|
|
238
|
+
return; this.closed = true; try {
|
|
239
|
+
this.controller?.close();
|
|
240
|
+
}
|
|
241
|
+
catch { /* fetch 已断开 */ } }
|
|
242
|
+
}
|
|
243
|
+
function resolveVoiceStreamUrl() { return new URL('/api/codingns/assistant/voice/stream', globalThis.location?.origin ?? 'http://localhost').toString(); }
|
|
244
|
+
function createClientId() { try {
|
|
245
|
+
return globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return `${Date.now()}-${Math.random()}`;
|
|
249
|
+
} }
|
|
250
|
+
function readEpoch(value, fallback) { return typeof value.epoch === 'number' && Number.isInteger(value.epoch) ? value.epoch : fallback; }
|
|
251
|
+
function isRecord(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); }
|
|
252
|
+
//# sourceMappingURL=sherpa-voice-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sherpa-voice-adapter.js","sourceRoot":"","sources":["../../../../src/client/sherpa-voice-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { CodingNsRpcClient } from './features/types.js';
|
|
3
|
+
import type { CodingNsLocale } from './locale.js';
|
|
4
|
+
export interface RegisterSkillCommandOptions {
|
|
5
|
+
readonly rpc: CodingNsRpcClient;
|
|
6
|
+
readonly locale: CodingNsLocale;
|
|
7
|
+
}
|
|
8
|
+
/** 把 Codex 原生 Skill 目录接入 DSH `/` 菜单。 */
|
|
9
|
+
export declare function registerSkillCommand(ctx: Context, options: RegisterSkillCommandOptions): () => void;
|
|
10
|
+
//# sourceMappingURL=skill-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-command.d.ts","sourceRoot":"","sources":["../../../../src/client/skill-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAiHjD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAChC;AAED,wCAAwC;AACxC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,2BAA2B,GAAG,MAAM,IAAI,CAwBnG"}
|