@jingyi0605/codingns4dsh 0.2.1-beta.6 → 0.2.1-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +4 -4
- package/README.md +21 -5
- package/THIRD_PARTY_NOTICES +5 -0
- package/assets/provider-icons/r4.svg +4 -0
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/client/assistant-settings-styles.d.ts.map +1 -1
- package/data/build/dist/client/assistant-settings-styles.js +3 -2
- package/data/build/dist/client/assistant-settings-styles.js.map +1 -1
- package/data/build/dist/client/avatar/catalog-panel.d.ts.map +1 -1
- package/data/build/dist/client/avatar/catalog-panel.js +7 -5
- package/data/build/dist/client/avatar/catalog-panel.js.map +1 -1
- package/data/build/dist/client/avatar/catalog-picker.d.ts.map +1 -1
- package/data/build/dist/client/avatar/catalog-picker.js +2 -1
- package/data/build/dist/client/avatar/catalog-picker.js.map +1 -1
- package/data/build/dist/client/avatar/desktop-bridge.d.ts +7 -3
- package/data/build/dist/client/avatar/desktop-bridge.d.ts.map +1 -1
- package/data/build/dist/client/avatar/desktop-bridge.js +64 -5
- package/data/build/dist/client/avatar/desktop-bridge.js.map +1 -1
- package/data/build/dist/client/avatar/desktop-view.d.ts +6 -0
- package/data/build/dist/client/avatar/desktop-view.d.ts.map +1 -1
- package/data/build/dist/client/avatar/desktop-view.js +98 -5
- package/data/build/dist/client/avatar/desktop-view.js.map +1 -1
- package/data/build/dist/client/avatar/engine.d.ts.map +1 -1
- package/data/build/dist/client/avatar/engine.js +3 -2
- package/data/build/dist/client/avatar/engine.js.map +1 -1
- package/data/build/dist/client/avatar/floating.d.ts +8 -3
- package/data/build/dist/client/avatar/floating.d.ts.map +1 -1
- package/data/build/dist/client/avatar/floating.js +22 -4
- package/data/build/dist/client/avatar/floating.js.map +1 -1
- package/data/build/dist/client/avatar/image.d.ts +1 -1
- package/data/build/dist/client/avatar/image.d.ts.map +1 -1
- package/data/build/dist/client/avatar/image.js +2 -2
- package/data/build/dist/client/avatar/image.js.map +1 -1
- package/data/build/dist/client/avatar/live2d.d.ts +14 -3
- package/data/build/dist/client/avatar/live2d.d.ts.map +1 -1
- package/data/build/dist/client/avatar/live2d.js +62 -9
- package/data/build/dist/client/avatar/live2d.js.map +1 -1
- package/data/build/dist/client/avatar/loading.d.ts.map +1 -1
- package/data/build/dist/client/avatar/loading.js +3 -2
- package/data/build/dist/client/avatar/loading.js.map +1 -1
- package/data/build/dist/client/avatar/notification-bubble.d.ts +39 -0
- package/data/build/dist/client/avatar/notification-bubble.d.ts.map +1 -0
- package/data/build/dist/client/avatar/notification-bubble.js +353 -0
- package/data/build/dist/client/avatar/notification-bubble.js.map +1 -0
- package/data/build/dist/client/avatar/notification-surface.d.ts +16 -0
- package/data/build/dist/client/avatar/notification-surface.d.ts.map +1 -0
- package/data/build/dist/client/avatar/notification-surface.js +54 -0
- package/data/build/dist/client/avatar/notification-surface.js.map +1 -0
- package/data/build/dist/client/avatar/reaction-badge.d.ts +7 -0
- package/data/build/dist/client/avatar/reaction-badge.d.ts.map +1 -0
- package/data/build/dist/client/avatar/reaction-badge.js +20 -0
- package/data/build/dist/client/avatar/reaction-badge.js.map +1 -0
- package/data/build/dist/client/avatar/registry.d.ts +2 -1
- package/data/build/dist/client/avatar/registry.d.ts.map +1 -1
- package/data/build/dist/client/avatar/registry.js.map +1 -1
- package/data/build/dist/client/avatar/settings-panel.d.ts.map +1 -1
- package/data/build/dist/client/avatar/settings-panel.js +7 -5
- package/data/build/dist/client/avatar/settings-panel.js.map +1 -1
- package/data/build/dist/client/avatar/slot.d.ts +2 -1
- package/data/build/dist/client/avatar/slot.d.ts.map +1 -1
- package/data/build/dist/client/avatar/slot.js +5 -4
- package/data/build/dist/client/avatar/slot.js.map +1 -1
- package/data/build/dist/client/avatar/spritesheet.d.ts +4 -2
- package/data/build/dist/client/avatar/spritesheet.d.ts.map +1 -1
- package/data/build/dist/client/avatar/spritesheet.js +18 -9
- package/data/build/dist/client/avatar/spritesheet.js.map +1 -1
- package/data/build/dist/client/bundle.js +6881 -1776
- 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 +2 -0
- package/data/build/dist/client/cli-catalog.js.map +1 -1
- package/data/build/dist/client/cli-session-config-cache.d.ts +17 -0
- package/data/build/dist/client/cli-session-config-cache.d.ts.map +1 -0
- package/data/build/dist/client/cli-session-config-cache.js +56 -0
- package/data/build/dist/client/cli-session-config-cache.js.map +1 -0
- package/data/build/dist/client/cli-settings-rpc.d.ts +5 -0
- package/data/build/dist/client/cli-settings-rpc.d.ts.map +1 -0
- package/data/build/dist/client/cli-settings-rpc.js +60 -0
- package/data/build/dist/client/cli-settings-rpc.js.map +1 -0
- package/data/build/dist/client/cli-slots.d.ts.map +1 -1
- package/data/build/dist/client/cli-slots.js +24 -40
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.assistant-configuration-view.js +264 -55
- package/data/build/dist/client/client.assistant-configuration-view.js.map +1 -1
- package/data/build/dist/client/client.assistant-debug-workbench.js +4 -4
- package/data/build/dist/client/client.assistant-debug-workbench.js.map +1 -1
- package/data/build/dist/client/{client.assistant-prompts.js → client.assistant-notifications.js} +63 -2
- package/data/build/dist/client/client.assistant-notifications.js.map +1 -0
- package/data/build/dist/client/client.assistant-prompt-editor.js +4 -4
- package/data/build/dist/client/client.assistant-prompt-editor.js.map +1 -1
- package/data/build/dist/client/client.assistant-workbench.js +287 -161
- package/data/build/dist/client/client.assistant-workbench.js.map +1 -1
- package/data/build/dist/client/client.delegate-command.js +12 -25
- package/data/build/dist/client/client.delegate-command.js.map +1 -1
- package/data/build/dist/client/client.manager.js +201 -25
- package/data/build/dist/client/client.manager.js.map +1 -1
- package/data/build/dist/client/client.model-catalog-cache.js +2 -1
- package/data/build/dist/client/client.model-catalog-cache.js.map +1 -1
- package/data/build/dist/client/client.native-workspace-store.js +42 -11
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
- package/data/build/dist/client/client.react-dom.js +250 -0
- package/data/build/dist/client/client.react-dom.js.map +1 -1
- package/data/build/dist/client/client.theme.js +58 -12
- package/data/build/dist/client/client.theme.js.map +1 -1
- package/data/build/dist/client/client.transport.js +342 -46
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/debug/ui.d.ts.map +1 -1
- package/data/build/dist/client/debug/ui.js +30 -29
- package/data/build/dist/client/debug/ui.js.map +1 -1
- package/data/build/dist/client/delegate-command.d.ts.map +1 -1
- package/data/build/dist/client/delegate-command.js +12 -21
- package/data/build/dist/client/delegate-command.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +61859 -158
- package/data/build/dist/client/external-tool-stream.d.ts.map +1 -1
- package/data/build/dist/client/external-tool-stream.js +2 -1
- package/data/build/dist/client/external-tool-stream.js.map +1 -1
- package/data/build/dist/client/features/assistant-configuration-session.js +3 -3
- package/data/build/dist/client/features/assistant-configuration-session.js.map +1 -1
- package/data/build/dist/client/features/assistant-configuration-tabs.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-configuration-tabs.js +2 -1
- package/data/build/dist/client/features/assistant-configuration-tabs.js.map +1 -1
- package/data/build/dist/client/features/assistant-configuration-view.d.ts +8 -0
- package/data/build/dist/client/features/assistant-configuration-view.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-configuration-view.js +99 -3
- package/data/build/dist/client/features/assistant-configuration-view.js.map +1 -1
- package/data/build/dist/client/features/assistant-conversation-message.d.ts +2 -1
- package/data/build/dist/client/features/assistant-conversation-message.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-conversation-message.js +64 -28
- package/data/build/dist/client/features/assistant-conversation-message.js.map +1 -1
- package/data/build/dist/client/features/assistant-debug-workbench.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-debug-workbench.js +3 -2
- package/data/build/dist/client/features/assistant-debug-workbench.js.map +1 -1
- package/data/build/dist/client/features/assistant-floating-call.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-floating-call.js +4 -3
- package/data/build/dist/client/features/assistant-floating-call.js.map +1 -1
- package/data/build/dist/client/features/assistant-notification-store.d.ts +72 -0
- package/data/build/dist/client/features/assistant-notification-store.d.ts.map +1 -0
- package/data/build/dist/client/features/assistant-notification-store.js +439 -0
- package/data/build/dist/client/features/assistant-notification-store.js.map +1 -0
- package/data/build/dist/client/features/assistant-realtime-call.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-realtime-call.js +13 -12
- package/data/build/dist/client/features/assistant-realtime-call.js.map +1 -1
- package/data/build/dist/client/features/assistant-record-style.js +11 -4
- package/data/build/dist/client/features/assistant-record-style.js.map +1 -1
- package/data/build/dist/client/features/assistant-voice-initialization.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-voice-initialization.js +4 -2
- package/data/build/dist/client/features/assistant-voice-initialization.js.map +1 -1
- package/data/build/dist/client/features/assistant-voice-settings-group.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-voice-settings-group.js +2 -1
- package/data/build/dist/client/features/assistant-voice-settings-group.js.map +1 -1
- package/data/build/dist/client/features/assistant-voice-settings.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-voice-settings.js +4 -3
- package/data/build/dist/client/features/assistant-voice-settings.js.map +1 -1
- package/data/build/dist/client/features/assistant-workbench-controls.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-workbench-controls.js +6 -5
- package/data/build/dist/client/features/assistant-workbench-controls.js.map +1 -1
- package/data/build/dist/client/features/assistant-workbench.d.ts +4 -0
- package/data/build/dist/client/features/assistant-workbench.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-workbench.js +37 -9
- package/data/build/dist/client/features/assistant-workbench.js.map +1 -1
- package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
- package/data/build/dist/client/features/cli-adapters.js +140 -35
- package/data/build/dist/client/features/cli-adapters.js.map +1 -1
- package/data/build/dist/client/features/file-management-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/file-management-panel.js +3 -10
- package/data/build/dist/client/features/file-management-panel.js.map +1 -1
- package/data/build/dist/client/features/global-voice-assistant.d.ts +6 -0
- package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -1
- package/data/build/dist/client/features/global-voice-assistant.js +117 -3
- package/data/build/dist/client/features/global-voice-assistant.js.map +1 -1
- package/data/build/dist/client/features/index.d.ts +1 -0
- package/data/build/dist/client/features/index.d.ts.map +1 -1
- package/data/build/dist/client/features/index.js +3 -0
- package/data/build/dist/client/features/index.js.map +1 -1
- package/data/build/dist/client/features/lan-access-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/lan-access-panel.js +6 -4
- package/data/build/dist/client/features/lan-access-panel.js.map +1 -1
- package/data/build/dist/client/features/login-protection-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/login-protection-panel.js +7 -2
- package/data/build/dist/client/features/login-protection-panel.js.map +1 -1
- package/data/build/dist/client/features/mobile-access-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access-panel.js +19 -13
- package/data/build/dist/client/features/mobile-access-panel.js.map +1 -1
- package/data/build/dist/client/features/peer-host.d.ts +3 -0
- package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/client/features/peer-host.js +445 -28
- package/data/build/dist/client/features/peer-host.js.map +1 -1
- package/data/build/dist/client/features/reverse-proxy-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/reverse-proxy-panel.js +5 -4
- package/data/build/dist/client/features/reverse-proxy-panel.js.map +1 -1
- package/data/build/dist/client/features/subagent-collapsed-lineage.d.ts +9 -0
- package/data/build/dist/client/features/subagent-collapsed-lineage.d.ts.map +1 -0
- package/data/build/dist/client/features/subagent-collapsed-lineage.js +28 -0
- package/data/build/dist/client/features/subagent-collapsed-lineage.js.map +1 -0
- package/data/build/dist/client/features/subscription-usage-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/subscription-usage-panel.js +4 -3
- package/data/build/dist/client/features/subscription-usage-panel.js.map +1 -1
- package/data/build/dist/client/features/terminal-enhancement-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/terminal-enhancement-panel.js +6 -4
- package/data/build/dist/client/features/terminal-enhancement-panel.js.map +1 -1
- package/data/build/dist/client/features/types.d.ts +8 -0
- package/data/build/dist/client/features/types.d.ts.map +1 -1
- package/data/build/dist/client/features/voice-conversation-dialog.d.ts.map +1 -1
- package/data/build/dist/client/features/voice-conversation-dialog.js +7 -6
- package/data/build/dist/client/features/voice-conversation-dialog.js.map +1 -1
- package/data/build/dist/client/features/voice-initialization-dialog.d.ts.map +1 -1
- package/data/build/dist/client/features/voice-initialization-dialog.js +7 -6
- package/data/build/dist/client/features/voice-initialization-dialog.js.map +1 -1
- 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 +44 -96
- package/data/build/dist/client/features/workspace-session-enhancement-panel.js.map +1 -1
- package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
- package/data/build/dist/client/file-management-dom.js +42 -28
- package/data/build/dist/client/file-management-dom.js.map +1 -1
- package/data/build/dist/client/font-scale.d.ts +37 -0
- package/data/build/dist/client/font-scale.d.ts.map +1 -0
- package/data/build/dist/client/font-scale.js +56 -0
- package/data/build/dist/client/font-scale.js.map +1 -0
- package/data/build/dist/client/git-management.d.ts.map +1 -1
- package/data/build/dist/client/git-management.js +80 -37
- package/data/build/dist/client/git-management.js.map +1 -1
- 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/index.js +43 -1
- package/data/build/dist/client/index.js.map +1 -1
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +27 -2
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/assistantWorkbench.d.ts +45 -0
- package/data/build/dist/client/locales/assistantWorkbench.d.ts.map +1 -1
- package/data/build/dist/client/locales/assistantWorkbench.js +30 -6
- package/data/build/dist/client/locales/assistantWorkbench.js.map +1 -1
- package/data/build/dist/client/locales/peerHost.d.ts.map +1 -1
- package/data/build/dist/client/locales/peerHost.js +10 -0
- package/data/build/dist/client/locales/peerHost.js.map +1 -1
- package/data/build/dist/client/locales/peerHostWorkspace.d.ts.map +1 -1
- package/data/build/dist/client/locales/peerHostWorkspace.js +16 -0
- package/data/build/dist/client/locales/peerHostWorkspace.js.map +1 -1
- package/data/build/dist/client/locales/subagentCollapsed.d.ts +53 -0
- package/data/build/dist/client/locales/subagentCollapsed.d.ts.map +1 -0
- package/data/build/dist/client/locales/subagentCollapsed.js +95 -0
- package/data/build/dist/client/locales/subagentCollapsed.js.map +1 -0
- package/data/build/dist/client/locales/terminalAuth.js +2 -2
- 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 +48 -0
- package/data/build/dist/client/locales/usage.js.map +1 -1
- package/data/build/dist/client/native-workspace-store.d.ts +10 -0
- package/data/build/dist/client/native-workspace-store.d.ts.map +1 -1
- package/data/build/dist/client/native-workspace-store.js +22 -1
- package/data/build/dist/client/native-workspace-store.js.map +1 -1
- package/data/build/dist/client/peer-host-color.d.ts +3 -0
- package/data/build/dist/client/peer-host-color.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-color.js +16 -0
- package/data/build/dist/client/peer-host-color.js.map +1 -1
- package/data/build/dist/client/peer-host-file-links.d.ts +8 -0
- package/data/build/dist/client/peer-host-file-links.d.ts.map +1 -0
- package/data/build/dist/client/peer-host-file-links.js +43 -0
- package/data/build/dist/client/peer-host-file-links.js.map +1 -0
- package/data/build/dist/client/peer-host-management-api.d.ts +2 -1
- package/data/build/dist/client/peer-host-management-api.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-management-api.js +2 -1
- package/data/build/dist/client/peer-host-management-api.js.map +1 -1
- package/data/build/dist/client/peer-host-native-projection.d.ts +20 -8
- package/data/build/dist/client/peer-host-native-projection.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-native-projection.js +127 -15
- package/data/build/dist/client/peer-host-native-projection.js.map +1 -1
- package/data/build/dist/client/peer-host-native-store-projection.d.ts +2 -0
- package/data/build/dist/client/peer-host-native-store-projection.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-native-store-projection.js +52 -13
- package/data/build/dist/client/peer-host-native-store-projection.js.map +1 -1
- package/data/build/dist/client/peer-host-reference-source.d.ts +18 -0
- package/data/build/dist/client/peer-host-reference-source.d.ts.map +1 -0
- package/data/build/dist/client/peer-host-reference-source.js +174 -0
- package/data/build/dist/client/peer-host-reference-source.js.map +1 -0
- package/data/build/dist/client/peer-host-remote-events.d.ts +48 -0
- package/data/build/dist/client/peer-host-remote-events.d.ts.map +1 -0
- package/data/build/dist/client/peer-host-remote-events.js +328 -0
- package/data/build/dist/client/peer-host-remote-events.js.map +1 -0
- package/data/build/dist/client/peer-host-scoped-client.d.ts +3 -0
- package/data/build/dist/client/peer-host-scoped-client.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-scoped-client.js +5 -2
- package/data/build/dist/client/peer-host-scoped-client.js.map +1 -1
- package/data/build/dist/client/peer-host-workspace-tab.d.ts +2 -0
- package/data/build/dist/client/peer-host-workspace-tab.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-workspace-tab.js +62 -29
- package/data/build/dist/client/peer-host-workspace-tab.js.map +1 -1
- package/data/build/dist/client/peer-host-workspace-tag.d.ts +5 -0
- package/data/build/dist/client/peer-host-workspace-tag.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-workspace-tag.js +57 -14
- package/data/build/dist/client/peer-host-workspace-tag.js.map +1 -1
- package/data/build/dist/client/provider-icons.d.ts.map +1 -1
- package/data/build/dist/client/provider-icons.js +2 -1
- package/data/build/dist/client/provider-icons.js.map +1 -1
- package/data/build/dist/client/quick-phrase-slot.d.ts.map +1 -1
- package/data/build/dist/client/quick-phrase-slot.js +12 -11
- package/data/build/dist/client/quick-phrase-slot.js.map +1 -1
- package/data/build/dist/client/serial-polling.d.ts +1 -0
- package/data/build/dist/client/serial-polling.d.ts.map +1 -1
- package/data/build/dist/client/serial-polling.js +4 -2
- package/data/build/dist/client/serial-polling.js.map +1 -1
- package/data/build/dist/client/session-adapter-cache.d.ts +2 -0
- package/data/build/dist/client/session-adapter-cache.d.ts.map +1 -1
- package/data/build/dist/client/session-adapter-cache.js +11 -0
- package/data/build/dist/client/session-adapter-cache.js.map +1 -1
- package/data/build/dist/client/session-changed-files-view.d.ts +15 -0
- package/data/build/dist/client/session-changed-files-view.d.ts.map +1 -1
- package/data/build/dist/client/session-changed-files-view.js +73 -29
- package/data/build/dist/client/session-changed-files-view.js.map +1 -1
- package/data/build/dist/client/settings-controls.d.ts +29 -0
- package/data/build/dist/client/settings-controls.d.ts.map +1 -0
- package/data/build/dist/client/settings-controls.js +80 -0
- package/data/build/dist/client/settings-controls.js.map +1 -0
- package/data/build/dist/client/settings-section.d.ts.map +1 -1
- package/data/build/dist/client/settings-section.js +7 -11
- package/data/build/dist/client/settings-section.js.map +1 -1
- package/data/build/dist/client/skill-command.d.ts.map +1 -1
- package/data/build/dist/client/skill-command.js +2 -1
- package/data/build/dist/client/skill-command.js.map +1 -1
- package/data/build/dist/client/style.css +2561 -0
- package/data/build/dist/client/subagent-collapsed-lineage.d.ts +103 -0
- package/data/build/dist/client/subagent-collapsed-lineage.d.ts.map +1 -0
- package/data/build/dist/client/subagent-collapsed-lineage.js +664 -0
- package/data/build/dist/client/subagent-collapsed-lineage.js.map +1 -0
- package/data/build/dist/client/subscription-slot.d.ts +8 -2
- package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
- package/data/build/dist/client/subscription-slot.js +55 -34
- package/data/build/dist/client/subscription-slot.js.map +1 -1
- package/data/build/dist/client/terminal/ui.d.ts.map +1 -1
- package/data/build/dist/client/terminal/ui.js +26 -8
- package/data/build/dist/client/terminal/ui.js.map +1 -1
- package/data/build/dist/client/theme.d.ts +2 -0
- package/data/build/dist/client/theme.d.ts.map +1 -1
- package/data/build/dist/client/theme.js +20 -12
- package/data/build/dist/client/theme.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +22 -10
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts +15 -0
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js +86 -0
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts +10 -0
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.js +199 -0
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.js +8 -2
- package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.js.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +13 -3
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +37 -3
- 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/avatar/materials.d.ts.map +1 -1
- package/data/build/dist/host/avatar/materials.js +3 -1
- package/data/build/dist/host/avatar/materials.js.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +13 -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 +136 -11
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/claude-driver.js +1 -1
- 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 +65 -31
- package/data/build/dist/host/cli-adapters/codebuddy-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +1 -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 +36 -9
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts +13 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.js +271 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.js.map +1 -0
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.js +136 -16
- package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/delegate-dispatch.d.ts +4 -3
- package/data/build/dist/host/cli-adapters/delegate-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/delegate-dispatch.js +7 -6
- package/data/build/dist/host/cli-adapters/delegate-dispatch.js.map +1 -1
- package/data/build/dist/host/cli-adapters/doubao-app.d.ts +32 -11
- package/data/build/dist/host/cli-adapters/doubao-app.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/doubao-app.js +195 -24
- package/data/build/dist/host/cli-adapters/doubao-app.js.map +1 -1
- package/data/build/dist/host/cli-adapters/doubao-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/doubao-driver.js +3 -1
- package/data/build/dist/host/cli-adapters/doubao-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-config.d.ts +16 -0
- package/data/build/dist/host/cli-adapters/dsh-config.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/dsh-config.js +153 -0
- package/data/build/dist/host/cli-adapters/dsh-config.js.map +1 -0
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +2 -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 +16 -5
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-tool-history.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-tool-history.js +23 -3
- package/data/build/dist/host/cli-adapters/dsh-tool-history.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 +72 -28
- package/data/build/dist/host/cli-adapters/feature.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 +22 -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 +24 -2
- 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 +113 -4
- 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 +63 -18
- 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 +35 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.js.map +1 -1
- package/data/build/dist/host/cli-adapters/new-api-subscription.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/new-api-subscription.js +2 -45
- package/data/build/dist/host/cli-adapters/new-api-subscription.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +6 -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 +10 -3
- package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +334 -62
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.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 +134 -14
- package/data/build/dist/host/cli-adapters/pi-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts +3 -0
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/provider-subscription.js +13 -45
- package/data/build/dist/host/cli-adapters/provider-subscription.js.map +1 -1
- package/data/build/dist/host/cli-adapters/r4-subscription.d.ts +13 -0
- package/data/build/dist/host/cli-adapters/r4-subscription.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/r4-subscription.js +111 -0
- package/data/build/dist/host/cli-adapters/r4-subscription.js.map +1 -0
- package/data/build/dist/host/cli-adapters/registry.d.ts +2 -0
- package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.js +14 -3
- package/data/build/dist/host/cli-adapters/registry.js.map +1 -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 +7 -0
- package/data/build/dist/host/cli-adapters/stream-normalizer.js.map +1 -1
- package/data/build/dist/host/cli-adapters/subagent-tool.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/subagent-tool.js +28 -7
- package/data/build/dist/host/cli-adapters/subagent-tool.js.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-server.d.ts +1 -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.map +1 -1
- package/data/build/dist/host/cli-bridge/command-code-mod.d.ts +24 -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 +121 -23
- package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.js +26 -6
- package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.d.ts +45 -4
- package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.js +129 -14
- package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +20 -5
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/controller.d.ts +27 -2
- package/data/build/dist/host/desktop-assistant/controller.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/controller.js +197 -7
- package/data/build/dist/host/desktop-assistant/controller.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/feature.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/feature.js +41 -4
- package/data/build/dist/host/desktop-assistant/feature.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/launcher.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/launcher.js +3 -1
- package/data/build/dist/host/desktop-assistant/launcher.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/mac-agent.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/mac-agent.js +41 -10
- package/data/build/dist/host/desktop-assistant/mac-agent.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/notifications.d.ts +16 -0
- package/data/build/dist/host/desktop-assistant/notifications.d.ts.map +1 -0
- package/data/build/dist/host/desktop-assistant/notifications.js +45 -0
- package/data/build/dist/host/desktop-assistant/notifications.js.map +1 -0
- package/data/build/dist/host/desktop-assistant/win-agent.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/win-agent.js +95 -8
- package/data/build/dist/host/desktop-assistant/win-agent.js.map +1 -1
- package/data/build/dist/host/features/assistant-lifecycle-settings.js +1 -1
- package/data/build/dist/host/features/assistant-lifecycle-settings.js.map +1 -1
- package/data/build/dist/host/features/assistant-management-tools.d.ts +2 -1
- package/data/build/dist/host/features/assistant-management-tools.d.ts.map +1 -1
- package/data/build/dist/host/features/assistant-management-tools.js +10 -3
- package/data/build/dist/host/features/assistant-management-tools.js.map +1 -1
- package/data/build/dist/host/features/assistant-notification-events.d.ts +77 -0
- package/data/build/dist/host/features/assistant-notification-events.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-notification-events.js +574 -0
- package/data/build/dist/host/features/assistant-notification-events.js.map +1 -0
- package/data/build/dist/host/features/assistant-notification-source.d.ts +32 -0
- package/data/build/dist/host/features/assistant-notification-source.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-notification-source.js +101 -0
- package/data/build/dist/host/features/assistant-notification-source.js.map +1 -0
- package/data/build/dist/host/features/assistant-notification-stream.d.ts +26 -0
- package/data/build/dist/host/features/assistant-notification-stream.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-notification-stream.js +179 -0
- package/data/build/dist/host/features/assistant-notification-stream.js.map +1 -0
- package/data/build/dist/host/features/assistant-notifications.d.ts +78 -0
- package/data/build/dist/host/features/assistant-notifications.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-notifications.js +436 -0
- package/data/build/dist/host/features/assistant-notifications.js.map +1 -0
- package/data/build/dist/host/features/assistant-peer-notifications.d.ts +53 -0
- package/data/build/dist/host/features/assistant-peer-notifications.d.ts.map +1 -0
- package/data/build/dist/host/features/assistant-peer-notifications.js +197 -0
- package/data/build/dist/host/features/assistant-peer-notifications.js.map +1 -0
- package/data/build/dist/host/features/assistant-tts-service.d.ts.map +1 -1
- package/data/build/dist/host/features/assistant-tts-service.js +2 -2
- package/data/build/dist/host/features/assistant-tts-service.js.map +1 -1
- package/data/build/dist/host/features/assistant-voice-initialization.js +1 -1
- package/data/build/dist/host/features/assistant-voice-initialization.js.map +1 -1
- package/data/build/dist/host/features/git-management.js +2 -1
- package/data/build/dist/host/features/git-management.js.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.d.ts +2 -2
- package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.js +179 -4
- package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
- package/data/build/dist/host/features/index.d.ts +1 -0
- package/data/build/dist/host/features/index.d.ts.map +1 -1
- package/data/build/dist/host/features/index.js +3 -0
- package/data/build/dist/host/features/index.js.map +1 -1
- package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/host/features/peer-host.js +193 -75
- package/data/build/dist/host/features/peer-host.js.map +1 -1
- package/data/build/dist/host/features/session-title-optimization.d.ts +5 -0
- package/data/build/dist/host/features/session-title-optimization.d.ts.map +1 -0
- package/data/build/dist/host/features/session-title-optimization.js +26 -0
- package/data/build/dist/host/features/session-title-optimization.js.map +1 -0
- package/data/build/dist/host/features/types.d.ts +9 -1
- package/data/build/dist/host/features/types.d.ts.map +1 -1
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +23 -1
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
- package/data/build/dist/host/lan-access-dsh.js +9 -1
- package/data/build/dist/host/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/aggregated-host-transport.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/aggregated-host-transport.js +8 -2
- package/data/build/dist/host/modules/peer-host/aggregated-host-transport.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/host-api-proxy-service.d.ts +5 -1
- package/data/build/dist/host/modules/peer-host/host-api-proxy-service.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/host-api-proxy-service.js +72 -23
- package/data/build/dist/host/modules/peer-host/host-api-proxy-service.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/host-ws-proxy-service.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/host-ws-proxy-service.js +7 -5
- package/data/build/dist/host/modules/peer-host/host-ws-proxy-service.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.d.ts +6 -1
- package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.js +7 -0
- package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-handshake.d.ts +2 -1
- package/data/build/dist/host/modules/peer-host/peer-host-handshake.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-handshake.js +11 -10
- package/data/build/dist/host/modules/peer-host/peer-host-handshake.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +7 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +63 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.d.ts +6 -3
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.js +92 -5
- package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts +15 -0
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts.map +1 -0
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js +101 -0
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js.map +1 -0
- package/data/build/dist/host/modules/peer-host/peer-host-native-transport.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-transport.js +44 -11
- package/data/build/dist/host/modules/peer-host/peer-host-native-transport.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.js +75 -20
- package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-request-errors.d.ts +31 -0
- package/data/build/dist/host/modules/peer-host/peer-host-request-errors.d.ts.map +1 -0
- package/data/build/dist/host/modules/peer-host/peer-host-request-errors.js +60 -0
- package/data/build/dist/host/modules/peer-host/peer-host-request-errors.js.map +1 -0
- package/data/build/dist/host/modules/peer-host/peer-host-session.d.ts +12 -4
- package/data/build/dist/host/modules/peer-host/peer-host-session.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-session.js +28 -18
- package/data/build/dist/host/modules/peer-host/peer-host-session.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.d.ts +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.js +15 -4
- package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.d.ts +22 -0
- package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.d.ts.map +1 -0
- package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.js +133 -0
- package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.js.map +1 -0
- 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 +89 -9
- 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 +11 -2
- 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 +14 -3
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/host/terminal/controller-factory.d.ts +1 -0
- package/data/build/dist/host/terminal/controller-factory.d.ts.map +1 -1
- package/data/build/dist/host/terminal/controller-factory.js +3 -0
- package/data/build/dist/host/terminal/controller-factory.js.map +1 -1
- package/data/build/dist/host/terminal/startup.d.ts +3 -0
- package/data/build/dist/host/terminal/startup.d.ts.map +1 -1
- package/data/build/dist/host/terminal/startup.js +1 -0
- package/data/build/dist/host/terminal/startup.js.map +1 -1
- package/data/build/dist/host/terminal/terminal-controller.d.ts +8 -0
- package/data/build/dist/host/terminal/terminal-controller.d.ts.map +1 -1
- package/data/build/dist/host/terminal/terminal-controller.js +2 -1
- package/data/build/dist/host/terminal/terminal-controller.js.map +1 -1
- package/data/build/dist/shared/assistant-avatar-adapters.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-avatar-adapters.js +3 -0
- package/data/build/dist/shared/assistant-avatar-adapters.js.map +1 -1
- package/data/build/dist/shared/assistant-avatar.d.ts +11 -1
- package/data/build/dist/shared/assistant-avatar.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-avatar.js +31 -1
- package/data/build/dist/shared/assistant-avatar.js.map +1 -1
- package/data/build/dist/shared/assistant-message-timeline.d.ts +11 -0
- package/data/build/dist/shared/assistant-message-timeline.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-message-timeline.js +19 -0
- package/data/build/dist/shared/assistant-message-timeline.js.map +1 -1
- package/data/build/dist/shared/assistant-notification-feed.d.ts +44 -0
- package/data/build/dist/shared/assistant-notification-feed.d.ts.map +1 -0
- package/data/build/dist/shared/assistant-notification-feed.js +88 -0
- package/data/build/dist/shared/assistant-notification-feed.js.map +1 -0
- package/data/build/dist/shared/assistant-notifications.d.ts +141 -0
- package/data/build/dist/shared/assistant-notifications.d.ts.map +1 -0
- package/data/build/dist/shared/assistant-notifications.js +32 -0
- package/data/build/dist/shared/assistant-notifications.js.map +1 -0
- package/data/build/dist/shared/assistant-session-messages.d.ts +13 -0
- package/data/build/dist/shared/assistant-session-messages.d.ts.map +1 -0
- package/data/build/dist/shared/assistant-session-messages.js +155 -0
- package/data/build/dist/shared/assistant-session-messages.js.map +1 -0
- package/data/build/dist/shared/assistant-tts.js +1 -1
- package/data/build/dist/shared/contracts/assistant.d.ts +13 -0
- package/data/build/dist/shared/contracts/assistant.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/cli-adapter.d.ts +5 -1
- package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.d.ts +5 -0
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +3 -0
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts +2 -2
- package/data/build/dist/shared/contracts/peer-host.d.ts +15 -0
- package/data/build/dist/shared/contracts/peer-host.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/peer-host.js.map +1 -1
- package/data/build/dist/shared/contracts/subscription.d.ts +31 -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/version.d.ts +12 -8
- package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.js +11 -7
- package/data/build/dist/shared/contracts/version.js.map +1 -1
- package/data/build/dist/shared/desktop-assistant.d.ts +74 -1
- package/data/build/dist/shared/desktop-assistant.d.ts.map +1 -1
- package/data/build/dist/shared/desktop-assistant.js +201 -2
- package/data/build/dist/shared/desktop-assistant.js.map +1 -1
- package/data/build/dist/shared/index.d.ts +2 -2
- package/data/build/dist/shared/index.d.ts.map +1 -1
- package/data/build/dist/shared/index.js.map +1 -1
- package/data/build/dist/shared/peer-host-file-location.d.ts +11 -0
- package/data/build/dist/shared/peer-host-file-location.d.ts.map +1 -0
- package/data/build/dist/shared/peer-host-file-location.js +20 -0
- package/data/build/dist/shared/peer-host-file-location.js.map +1 -0
- package/data/build/dist/shared/peer-host-http-routes.d.ts +10 -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 +7 -1
- package/data/build/dist/shared/peer-host-http-routes.js.map +1 -1
- package/data/build/dist/shared/provider-icon-resources.d.ts.map +1 -1
- package/data/build/dist/shared/provider-icon-resources.js +1 -0
- package/data/build/dist/shared/provider-icon-resources.js.map +1 -1
- package/data/build/dist/shared/session-reference.d.ts +11 -0
- package/data/build/dist/shared/session-reference.d.ts.map +1 -0
- package/data/build/dist/shared/session-reference.js +29 -0
- package/data/build/dist/shared/session-reference.js.map +1 -0
- package/data/build/dist/shared/session-title.d.ts +12 -0
- package/data/build/dist/shared/session-title.d.ts.map +1 -0
- package/data/build/dist/shared/session-title.js +65 -0
- package/data/build/dist/shared/session-title.js.map +1 -0
- package/data/build/dist/shared/voice-initialization.d.ts +1 -1
- package/data/build/dist/shared/voice-initialization.d.ts.map +1 -1
- package/data/build/dist/shared/voice-initialization.js +1 -1
- package/data/build/dist/shared/voice-initialization.js.map +1 -1
- package/data/build/dist/shared/voice-models.d.ts +2 -2
- package/data/build/dist/shared/voice-models.d.ts.map +1 -1
- package/data/build/dist/shared/voice-models.js +9 -9
- package/data/build/dist/shared/voice-models.js.map +1 -1
- package/data/build/dist/typert.host.d.ts +18 -1
- package/data/build/dist/typert.host.d.ts.map +1 -1
- package/data/build/dist/typert.host.js +28 -3
- package/data/build/dist/typert.host.js.map +1 -1
- package/data/build/dist/typert.notifications-client.d.ts +5 -0
- package/data/build/dist/typert.notifications-client.d.ts.map +1 -0
- package/data/build/dist/typert.notifications-client.js +7 -0
- package/data/build/dist/typert.notifications-client.js.map +1 -0
- package/data/build/dist/typert.remote-client.js +1 -1
- package/data/build/dist/typert.remote-client.js.map +1 -1
- package/package.json +41 -33
- package/profile/README.md +2 -2
- package/profile/package.json +3 -3
- package/profile/version.json +3 -3
- package/version.json +3 -3
- package/data/build/dist/client/client.assistant-prompts.js.map +0 -1
|
@@ -13,8 +13,13 @@ import { isPeerHostAggregateRefreshRegistered, registerPeerHostAggregateRefresh,
|
|
|
13
13
|
import { resolveCodingNsTranslator, useCodingNsTranslator } from '../locale.js';
|
|
14
14
|
import { publishSessionAdapter } from '../session-adapter-cache.js';
|
|
15
15
|
import { startSerialPolling } from '../serial-polling.js';
|
|
16
|
+
import { PeerHostRemoteEvents } from '../peer-host-remote-events.js';
|
|
17
|
+
import { installPeerHostFileLinkRouting } from '../peer-host-file-links.js';
|
|
18
|
+
import { registerPeerHostReferenceSource } from '../peer-host-reference-source.js';
|
|
16
19
|
/** 聚合刷新周期;远端资源只影响自身节点,刷新失败不改变本机界面。 */
|
|
17
20
|
const PEER_HOST_AGGREGATE_REFRESH_MS = 30_000;
|
|
21
|
+
/** 有断线节点时缩短复检周期,成功重连后恢复正常频率。 */
|
|
22
|
+
const PEER_HOST_RECOVERY_REFRESH_MS = 5_000;
|
|
18
23
|
/** 新建会话尚未出现在聚合摘要时,临时保留其远端作用域的最长时间。 */
|
|
19
24
|
const PEER_HOST_PENDING_SESSION_SCOPE_TTL_MS = 30_000;
|
|
20
25
|
/** 远端会话流刷新聚合的合并窗口,避免每个文本增量都触发完整摘要读取。 */
|
|
@@ -47,14 +52,39 @@ export const peerHostFeature = {
|
|
|
47
52
|
const shim = globalThis[DSH_PEER_HOST_PREBOOT_SHIM_GLOBAL];
|
|
48
53
|
const projection = createPeerHostNativeProjection();
|
|
49
54
|
const transport = shim === undefined ? undefined : createPeerHostPageTransport(projection, context.services.uiContext, context.services.locale);
|
|
55
|
+
// 官方 ui-reference 在远程 Session 尚未完成本地保留、或目标 Host 版本没有
|
|
56
|
+
// sessionReferenceResolver 时会静默丢弃整组对话候选。PeerHost 已经持有摘要,
|
|
57
|
+
// 让兜底源只在可确认的远程会话/工作区上生效,保证 @ 菜单仍能列出可引用会话。
|
|
58
|
+
const referenceSource = context.services.uiContext?.inject(['inputTriggers', 'sessions'], (scope) => {
|
|
59
|
+
scope.effect(() => {
|
|
60
|
+
// 先挂载不依赖新 Remote 的摘要兜底;若嵌套 Remote 随后就绪,切换到
|
|
61
|
+
// Resolver 感知版本,官方候选成功时不会在菜单中产生重复项。
|
|
62
|
+
let dispose = registerPeerHostReferenceSource(scope, projection, context.services.locale);
|
|
63
|
+
const resolverFiber = scope.inject(['remote.sessionReferenceResolver'], (resolverScope) => {
|
|
64
|
+
dispose();
|
|
65
|
+
dispose = registerPeerHostReferenceSource(resolverScope, projection, context.services.locale);
|
|
66
|
+
});
|
|
67
|
+
return () => {
|
|
68
|
+
dispose();
|
|
69
|
+
void resolverFiber.dispose();
|
|
70
|
+
};
|
|
71
|
+
}, 'codingns4dsh: PeerHost session reference source');
|
|
72
|
+
});
|
|
73
|
+
if (referenceSource !== undefined)
|
|
74
|
+
context.resources.add(() => referenceSource.dispose());
|
|
50
75
|
const management = createPeerHostManagementApi(context.services.rpc);
|
|
51
76
|
if (shim !== undefined) {
|
|
52
77
|
shim.activate(transport.hooks);
|
|
53
78
|
context.resources.add(() => {
|
|
79
|
+
transport.dispose();
|
|
54
80
|
shim.deactivate();
|
|
55
81
|
// 资源按逆序释放:此时 Desktop 路由和导航订阅已还原,重新加载本机目录,
|
|
56
82
|
// 避免停用 PeerHost 后仍展示最后一个远端 Host 的全局缓存。
|
|
57
83
|
refreshDshModelCatalog(context.services.uiContext);
|
|
84
|
+
// Web 路径没有额外的原生 Remote 路由,不需要为了停用插件强制结束当前
|
|
85
|
+
// Connection 代次;否则 DSH 会在每次手动重连后自动再发一次 session/list。
|
|
86
|
+
if (shim.getMode?.() === 'desktop')
|
|
87
|
+
reconnectNativeEvents(context.services.uiContext);
|
|
58
88
|
});
|
|
59
89
|
// 原生侧栏在插件 apply 时按引用捕获 `workspaces.list`,只能就地投影这个对象;
|
|
60
90
|
// 没有 shim 就没有原生 Remote 路由,此时不注入,避免出现点不开的远端条目。
|
|
@@ -81,6 +111,7 @@ export const peerHostFeature = {
|
|
|
81
111
|
...(context.services.remote === undefined ? {} : { remote: context.services.remote }),
|
|
82
112
|
hooks: transport.hooks,
|
|
83
113
|
matchesScope: transport.matchesScope,
|
|
114
|
+
mergeEvents: transport.mergeEvents,
|
|
84
115
|
decorateLocalResult: (method, result) => method === 'session/list' ? mergeSessionListResult(result, projection) : result,
|
|
85
116
|
});
|
|
86
117
|
if (route !== undefined)
|
|
@@ -93,16 +124,44 @@ export const peerHostFeature = {
|
|
|
93
124
|
});
|
|
94
125
|
if (navigation !== undefined)
|
|
95
126
|
context.resources.add(() => navigation.dispose());
|
|
127
|
+
// 文件路径的平台取自资源所属会话,不能由本机平台或前台选择决定。
|
|
128
|
+
const fileLinks = context.services.uiContext?.inject(['sidebarRight'], (scope) => {
|
|
129
|
+
scope.effect(() => installPeerHostFileLinkRouting(scope, (sessionId) => (projection.sessions().find((session) => session.sessionId === sessionId)?.cwd)) ?? (() => undefined), 'codingns4dsh: PeerHost file links');
|
|
130
|
+
});
|
|
131
|
+
if (fileLinks !== undefined)
|
|
132
|
+
context.resources.add(() => fileLinks.dispose());
|
|
133
|
+
// Desktop 的原生 `$events` 可能早于插件启动;切换一次客户端连接代次,让
|
|
134
|
+
// 已打开的流使用聚合入口。Web 路径从 preboot shim 开始就使用当前入口,
|
|
135
|
+
// 这里重连只会白白触发 DSH 的 session/list 基线刷新。
|
|
136
|
+
if (shim.getMode?.() === 'desktop')
|
|
137
|
+
reconnectNativeEvents(context.services.uiContext);
|
|
96
138
|
}
|
|
97
139
|
const panel = startPeerHostManagementPanel({ rpc: context.services.rpc, locale: context.services.locale });
|
|
98
140
|
context.resources.add(() => panel.dispose());
|
|
99
141
|
// 工作区标签:远端工作区不再把 Host 名写进标题文本,改由彩色标签表达归属。
|
|
100
|
-
|
|
142
|
+
let latestAggregate = [];
|
|
143
|
+
const tag = startPeerHostWorkspaceTag({
|
|
144
|
+
locale: context.services.locale,
|
|
145
|
+
onDismissDisconnectedWorkspace: async (virtualWorkspaceId) => {
|
|
146
|
+
const workspace = parseVirtualWorkspaceId(virtualWorkspaceId);
|
|
147
|
+
if (workspace === null || workspace.targetHostId === null)
|
|
148
|
+
return;
|
|
149
|
+
await management.dismissDisconnectedWorkspace(workspace.targetHostId, workspace.workspaceId);
|
|
150
|
+
// 本地立即隐藏已确认移除的缓存,不等待下一次网络复检完成。
|
|
151
|
+
latestAggregate = latestAggregate.map((host) => host.targetHostId === workspace.targetHostId && host.availability !== 'ready'
|
|
152
|
+
? { ...host, workspaces: host.workspaces.filter((item) => item.workspaceId !== workspace.workspaceId) } : host);
|
|
153
|
+
tag.setAggregate(latestAggregate);
|
|
154
|
+
if (transport?.setAggregate(latestAggregate) === true)
|
|
155
|
+
await refreshPeerHostNativeSessions(context.services.uiContext);
|
|
156
|
+
await polling.refresh({ afterPending: true });
|
|
157
|
+
},
|
|
158
|
+
});
|
|
101
159
|
context.resources.add(() => tag.dispose());
|
|
102
160
|
// 原生"添加工作区"对话框保持主体不变,只额外挂一个"远程 HOST"标签页。
|
|
103
161
|
const workspaceTab = startPeerHostWorkspaceTab({
|
|
104
162
|
api: management,
|
|
105
163
|
onWorkspaceAdded: () => polling.refresh({ afterPending: true }),
|
|
164
|
+
onWorkspaceRemoved: () => polling.refresh({ afterPending: true }),
|
|
106
165
|
locale: context.services.locale,
|
|
107
166
|
});
|
|
108
167
|
context.resources.add(() => workspaceTab.dispose());
|
|
@@ -110,6 +169,7 @@ export const peerHostFeature = {
|
|
|
110
169
|
// 因此聚合变化后触发一次原生列表刷新,由页面 Transport 在 session/list 响应里补齐。
|
|
111
170
|
const refresh = async (signal) => {
|
|
112
171
|
const orderReference = projection.workspaceOrder();
|
|
172
|
+
const sessionMembershipBefore = sessionMembershipKey(projection.sessions());
|
|
113
173
|
try {
|
|
114
174
|
const aggregate = await management.aggregate(signal);
|
|
115
175
|
// Host 端先完成 aggregate 再 hydrate 顺序;按同一顺序读取可避免拿到空的初始 order,
|
|
@@ -126,8 +186,15 @@ export const peerHostFeature = {
|
|
|
126
186
|
// 聚合读取期间如果用户完成了一次拖拽,保留本地刚确认的顺序;本轮只更新
|
|
127
187
|
// 工作区内容,下一轮再从 Host 读取顺序,避免旧的 order 响应覆盖拖拽结果。
|
|
128
188
|
const refreshedOrder = projection.workspaceOrder() === orderReference ? orderedWorkspaceIds : undefined;
|
|
189
|
+
latestAggregate = aggregate;
|
|
129
190
|
tag.setAggregate(aggregate);
|
|
130
|
-
|
|
191
|
+
const projectionChanged = transport === undefined
|
|
192
|
+
? projection.setAggregate(aggregate, refreshedOrder)
|
|
193
|
+
: transport.setAggregate(aggregate, refreshedOrder);
|
|
194
|
+
// 运行态、标题和更新时间都由事件流增量承载;只有会话成员集合增删时
|
|
195
|
+
// 才需要让原生 SessionManager 重新取一次完整 session/list。
|
|
196
|
+
// 普通聚合状态只更新投影,避免流事件把完整请求放大成风暴。
|
|
197
|
+
if (projectionChanged && sessionMembershipBefore !== sessionMembershipKey(projection.sessions())) {
|
|
131
198
|
await refreshPeerHostNativeSessions(context.services.uiContext);
|
|
132
199
|
}
|
|
133
200
|
return true;
|
|
@@ -138,8 +205,17 @@ export const peerHostFeature = {
|
|
|
138
205
|
}
|
|
139
206
|
};
|
|
140
207
|
// 首次聚合后台执行,慢远端不能挡住后续模块启动;隐藏页面暂停自动刷新。
|
|
141
|
-
const polling = startSerialPolling(refresh, PEER_HOST_AGGREGATE_REFRESH_MS
|
|
208
|
+
const polling = startSerialPolling(refresh, PEER_HOST_AGGREGATE_REFRESH_MS, {
|
|
209
|
+
// 即使断线缓存被手动隐藏,也继续检查 Host;隐藏页仍暂停轮询。
|
|
210
|
+
getIntervalMs: () => latestAggregate.some((host) => host.targetHostId !== null && host.availability !== 'ready')
|
|
211
|
+
? PEER_HOST_RECOVERY_REFRESH_MS : PEER_HOST_AGGREGATE_REFRESH_MS,
|
|
212
|
+
});
|
|
142
213
|
context.resources.add(() => polling.dispose());
|
|
214
|
+
const online = () => { void polling.refresh({ afterPending: true }); };
|
|
215
|
+
if (typeof window !== 'undefined') {
|
|
216
|
+
window.addEventListener('online', online);
|
|
217
|
+
context.resources.add(() => window.removeEventListener('online', online));
|
|
218
|
+
}
|
|
143
219
|
// 归档入口等原生操作完成后可以立刻请求刷新,而不必等待下一个周期。
|
|
144
220
|
context.resources.add(registerPeerHostAggregateRefresh(() => polling.refresh({ afterPending: true })));
|
|
145
221
|
},
|
|
@@ -148,7 +224,8 @@ export const peerHostFeature = {
|
|
|
148
224
|
/** 将 DSH preboot shim 绑定到当前页面的 Host RPC;不调用 Connection.rpc,避免递归。 */
|
|
149
225
|
export function createPeerHostPageTransport(projection = createPeerHostNativeProjection(), uiContext, locale) {
|
|
150
226
|
const t = resolveCodingNsTranslator(locale);
|
|
151
|
-
const
|
|
227
|
+
const originalGlobalFetch = globalThis.fetch;
|
|
228
|
+
const fetchImpl = typeof originalGlobalFetch === 'function' ? originalGlobalFetch.bind(globalThis) : undefined;
|
|
152
229
|
const scopes = new Map();
|
|
153
230
|
const remoteHostScopes = new Map();
|
|
154
231
|
// DSH 的模型目录是 Host generation 级缓存;PeerHost 工作区切换不会触发 DSH
|
|
@@ -232,6 +309,61 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
232
309
|
failure.code = error.code;
|
|
233
310
|
throw failure;
|
|
234
311
|
};
|
|
312
|
+
const scopeForSessionExport = (url) => {
|
|
313
|
+
const virtualSessionId = url.searchParams.get('sessionId');
|
|
314
|
+
if (virtualSessionId === null)
|
|
315
|
+
return undefined;
|
|
316
|
+
const parsed = parseVirtualSessionId(virtualSessionId);
|
|
317
|
+
if (parsed === null)
|
|
318
|
+
return undefined;
|
|
319
|
+
const scope = scopes.get(virtualSessionId);
|
|
320
|
+
return scope?.targetHostId === parsed.hostId ? scope : undefined;
|
|
321
|
+
};
|
|
322
|
+
const sessionExportPath = (url, scope) => {
|
|
323
|
+
const parsed = parseVirtualSessionId(url.searchParams.get('sessionId') ?? '');
|
|
324
|
+
if (parsed === null || scope.targetHostId !== parsed.hostId)
|
|
325
|
+
throw new Error('远程 Session 导出作用域不匹配');
|
|
326
|
+
const rewritten = new URL(url.href);
|
|
327
|
+
rewritten.searchParams.set('sessionId', parsed.sessionId);
|
|
328
|
+
return rewritten.pathname + rewritten.search;
|
|
329
|
+
};
|
|
330
|
+
const readFetchUrl = (input) => {
|
|
331
|
+
const raw = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
332
|
+
return new URL(raw, typeof document === 'undefined' ? 'http://codingns.invalid' : document.baseURI);
|
|
333
|
+
};
|
|
334
|
+
const remoteSessionExportFetch = async (input, init) => {
|
|
335
|
+
if (fetchImpl === undefined)
|
|
336
|
+
throw new Error('当前页面没有 fetch');
|
|
337
|
+
const request = typeof Request !== 'undefined' && input instanceof Request ? input : undefined;
|
|
338
|
+
const method = (init?.method ?? request?.method ?? 'GET').toUpperCase();
|
|
339
|
+
const url = readFetchUrl(input);
|
|
340
|
+
if (url.pathname !== '/api/session.export' || (method !== 'GET' && method !== 'HEAD'))
|
|
341
|
+
return fetchImpl(input, init);
|
|
342
|
+
const scope = scopeForSessionExport(url);
|
|
343
|
+
if (scope === undefined || scope.targetHostId === null)
|
|
344
|
+
return fetchImpl(input, init);
|
|
345
|
+
const headers = init?.headers === undefined && request === undefined
|
|
346
|
+
? undefined
|
|
347
|
+
: Object.fromEntries(new Headers(init?.headers ?? request?.headers).entries());
|
|
348
|
+
const response = asRecord(await codingNsCall('peerHost/request', {
|
|
349
|
+
peerHostId: scope.targetHostId,
|
|
350
|
+
scope,
|
|
351
|
+
path: sessionExportPath(url, scope),
|
|
352
|
+
method,
|
|
353
|
+
...(headers === undefined ? {} : { headers }),
|
|
354
|
+
}, init?.signal ?? request?.signal));
|
|
355
|
+
const status = typeof response?.status === 'number' ? response.status : 502;
|
|
356
|
+
const responseHeaders = new Headers(Array.isArray(response?.headers) ? response.headers : undefined);
|
|
357
|
+
// DSH 导出控制器会读取 HEAD 的正文来补充失败原因。浏览器原生 HEAD
|
|
358
|
+
// 响应不会暴露正文,但这里是页面内合成的 Response,保留代理返回的
|
|
359
|
+
// 文本错误可以把目标 Host 的真实鉴权原因传回 UI;成功 HEAD 仍为空正文。
|
|
360
|
+
const body = typeof response?.bodyBase64 === 'string'
|
|
361
|
+
? decodeBase64(response.bodyBase64)
|
|
362
|
+
: typeof response?.body === 'string' ? response.body : '';
|
|
363
|
+
return new Response(body, { status, headers: responseHeaders });
|
|
364
|
+
};
|
|
365
|
+
const restoreGlobalFetch = installSessionExportFetchPatch(originalGlobalFetch, remoteSessionExportFetch);
|
|
366
|
+
const restoreAnchorClick = installSessionExportAnchorPatch(remoteSessionExportFetch, scopeForSessionExport);
|
|
235
367
|
const findScope = (value) => {
|
|
236
368
|
if (typeof value === 'string') {
|
|
237
369
|
const session = scopes.get(value);
|
|
@@ -261,12 +393,41 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
261
393
|
return undefined;
|
|
262
394
|
};
|
|
263
395
|
const scopeForNativeRequest = (method, value) => {
|
|
396
|
+
// 问题答案是任意用户内容,只能由正式 agentId 决定目标,不能扫描答案里的字符串。
|
|
397
|
+
if (method === 'userQuestions/answer' || method === 'userQuestions/attachWait')
|
|
398
|
+
return findScope(questionAgentId(value));
|
|
399
|
+
// 反馈只能由 request.sessionId 决定归属,消息 ID、反馈文字和版本号都不是路由身份。
|
|
400
|
+
if (method.startsWith('messageFeedback/') || method === 'sessionFeedback/record') {
|
|
401
|
+
const input = asRecord(value);
|
|
402
|
+
const request = asRecord(asRecord(input?.args)?.request ?? input?.request);
|
|
403
|
+
return findScope(request?.sessionId);
|
|
404
|
+
}
|
|
264
405
|
const direct = findScope(value);
|
|
265
406
|
if (direct !== undefined)
|
|
266
407
|
return direct;
|
|
267
408
|
return method === 'session/modelCatalog' && !containsResourceId(value) ? navigationScope() : undefined;
|
|
268
409
|
};
|
|
269
410
|
const scopeForPluginRequest = (endpoint, value) => {
|
|
411
|
+
// 设置页明确选择本机时,不能让无会话的目录查询跟随前台远端工作区。
|
|
412
|
+
if ((endpoint === 'cli/catalog' || endpoint === 'cli/models' || endpoint === 'cli/catalog/refresh')
|
|
413
|
+
&& asRecord(value)?.catalogHostId === 'local')
|
|
414
|
+
return undefined;
|
|
415
|
+
if (endpoint.startsWith('fileManagement/')) {
|
|
416
|
+
// 文件内容与路径均不参与路由;显式资源必须属于同一台 Host 的同一工作区。
|
|
417
|
+
const input = asRecord(value);
|
|
418
|
+
const workspace = findScope(input?.workspaceId);
|
|
419
|
+
const session = findScope(input?.sessionId);
|
|
420
|
+
if (hasVirtualResourceScope(value)) {
|
|
421
|
+
if (typeof input?.workspaceId === 'string' && workspace === undefined)
|
|
422
|
+
return undefined;
|
|
423
|
+
if (typeof input?.sessionId === 'string' && session === undefined)
|
|
424
|
+
return undefined;
|
|
425
|
+
if (workspace !== undefined && session !== undefined
|
|
426
|
+
&& (workspace.targetHostId !== session.targetHostId || workspace.workspaceId !== session.workspaceId))
|
|
427
|
+
return undefined;
|
|
428
|
+
}
|
|
429
|
+
return workspace ?? session;
|
|
430
|
+
}
|
|
270
431
|
// 调试只按顶层资源选择 Host,配置正文里的字符串不能影响路由。
|
|
271
432
|
if (isDebugPluginEndpoint(endpoint)) {
|
|
272
433
|
const input = asRecord(value);
|
|
@@ -333,6 +494,27 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
333
494
|
}
|
|
334
495
|
return false;
|
|
335
496
|
};
|
|
497
|
+
/** 判断请求中是否仍携带虚拟资源 ID;作用域丢失时不能把它交给本机 Gateway。 */
|
|
498
|
+
const containsVirtualResourceId = (value) => {
|
|
499
|
+
if (typeof value === 'string')
|
|
500
|
+
return parseVirtualSessionId(value) !== null || parseVirtualWorkspaceId(value) !== null;
|
|
501
|
+
if (Array.isArray(value))
|
|
502
|
+
return value.some(containsVirtualResourceId);
|
|
503
|
+
const record = asRecord(value);
|
|
504
|
+
return record !== null && Object.values(record).some(containsVirtualResourceId);
|
|
505
|
+
};
|
|
506
|
+
const hasUnresolvedVirtualNativeScope = (method, value) => {
|
|
507
|
+
// 问题答案正文允许引用任意会话 ID;唯一的路由身份是 agentId,不能扫描正文。
|
|
508
|
+
if (method === 'userQuestions/answer' || method === 'userQuestions/attachWait')
|
|
509
|
+
return false;
|
|
510
|
+
// 反馈只能由 request.sessionId 决定归属,消息 ID、反馈文字和版本号都不是路由身份。
|
|
511
|
+
if (method.startsWith('messageFeedback/') || method === 'sessionFeedback/record') {
|
|
512
|
+
const input = asRecord(value);
|
|
513
|
+
const request = asRecord(asRecord(input?.args)?.request ?? input?.request);
|
|
514
|
+
return typeof request?.sessionId === 'string' && parseVirtualSessionId(request.sessionId) !== null;
|
|
515
|
+
}
|
|
516
|
+
return containsVirtualResourceId(value);
|
|
517
|
+
};
|
|
336
518
|
const rewriteCliPayload = (value, scope, key = '') => {
|
|
337
519
|
if (typeof value === 'string') {
|
|
338
520
|
const parsed = parseVirtualSessionId(value);
|
|
@@ -356,7 +538,7 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
356
538
|
method: 'POST',
|
|
357
539
|
body: JSON.stringify({ rpcId: createRequestId(), method: endpoint, payload: endpoint.startsWith('git/')
|
|
358
540
|
? { ...asRecord(payload), workspaceId: scope.workspaceId }
|
|
359
|
-
: endpoint.startsWith('cli/') ? rewriteCliPayload(payload, scope) :
|
|
541
|
+
: endpoint.startsWith('cli/') ? rewriteCliPayload(payload, scope) : rewritePluginResourcePayload(payload, scope) }),
|
|
360
542
|
}, signal));
|
|
361
543
|
const status = typeof response?.status === 'number' ? response.status : 500;
|
|
362
544
|
const body = typeof response?.body === 'string' ? response.body : '';
|
|
@@ -422,9 +604,27 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
422
604
|
signal?.throwIfAborted();
|
|
423
605
|
}
|
|
424
606
|
finally {
|
|
425
|
-
await codingNsCall('peerHost/nativeStreamClose', { streamId, scope }).catch(() => undefined);
|
|
607
|
+
await codingNsCall('peerHost/nativeStreamClose', { streamId, scope }, AbortSignal.timeout(5_000)).catch(() => undefined);
|
|
426
608
|
}
|
|
427
609
|
})();
|
|
610
|
+
// DSH 自己会在每个 Connection 代次完成时刷新一次真实 session/list;PeerHost
|
|
611
|
+
// 只需在首次事件流握手成功后补一次虚拟会话基线,后续增量由事件流和聚合变化驱动。
|
|
612
|
+
let nativeSessionPrepared = false;
|
|
613
|
+
const events = new PeerHostRemoteEvents({
|
|
614
|
+
open: (scope, signal) => openRemoteStream('$events', { args: {} }, scope, signal),
|
|
615
|
+
reply: (scope, payload, signal) => codingNsCall('peerHost/native', { method: '$events/result', payload, scope }, signal),
|
|
616
|
+
accepts: (agentId, scope) => scopes.get(agentId)?.targetHostId === scope.targetHostId,
|
|
617
|
+
onSessionStatus: (sessionId, running) => {
|
|
618
|
+
if (projection.setSessionRunning(sessionId, running))
|
|
619
|
+
void refreshPeerHostNativeSessions(uiContext);
|
|
620
|
+
},
|
|
621
|
+
prepare: async () => {
|
|
622
|
+
if (nativeSessionPrepared)
|
|
623
|
+
return;
|
|
624
|
+
nativeSessionPrepared = true;
|
|
625
|
+
await refreshPeerHostNativeSessions(uiContext);
|
|
626
|
+
},
|
|
627
|
+
});
|
|
428
628
|
const pendingSessionScopes = new Map();
|
|
429
629
|
const forgetPendingSession = (sessionId) => {
|
|
430
630
|
const pending = pendingSessionScopes.get(sessionId);
|
|
@@ -464,17 +664,40 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
464
664
|
scopes.set(sessionId, created);
|
|
465
665
|
refreshModelCatalogForScope(navigationScope());
|
|
466
666
|
};
|
|
667
|
+
/** 父会话目录早于聚合到达时,复用新建会话的临时作用域与清理机制。 */
|
|
668
|
+
const rememberSubagentCatalog = (scope, value) => {
|
|
669
|
+
const catalog = asRecord(asRecord(asRecord(value)?.projections)?.values)?.subagentCatalog;
|
|
670
|
+
if (!Array.isArray(catalog))
|
|
671
|
+
return;
|
|
672
|
+
for (const child of catalog) {
|
|
673
|
+
const id = asRecord(child)?.id;
|
|
674
|
+
if (typeof id === 'string' && !scopes.has(id))
|
|
675
|
+
rememberCreatedSession(scope, { sessionId: id });
|
|
676
|
+
}
|
|
677
|
+
};
|
|
467
678
|
const hooks = {
|
|
468
679
|
rpc: async ({ method, payload, signal }) => {
|
|
469
680
|
const value = asRecord(payload);
|
|
470
681
|
const channel = typeof value?.channel === 'string' ? value.channel : '/codingns';
|
|
471
682
|
const body = value?.payload;
|
|
683
|
+
if (channel === '/api' && method === '$events/result' && events.ownsResult(body)) {
|
|
684
|
+
try {
|
|
685
|
+
return { ok: true, value: await events.reply(body, signal) };
|
|
686
|
+
}
|
|
687
|
+
catch (error) {
|
|
688
|
+
const code = error.code;
|
|
689
|
+
return { ok: false, error: { code: typeof code === 'string' ? code : 'gateway/internal', message: error instanceof Error ? error.message : String(error) } };
|
|
690
|
+
}
|
|
691
|
+
}
|
|
472
692
|
const endpoint = peerHostPluginEndpoint(channel, method);
|
|
473
693
|
if (endpoint === 'cli/session/adapter-map') {
|
|
474
694
|
return await mergeRemoteAdapterMap(await request(channel, method, body, signal), signal);
|
|
475
695
|
}
|
|
476
696
|
if (endpoint !== undefined) {
|
|
477
|
-
if (
|
|
697
|
+
if (endpoint.startsWith('fileManagement/') && hasVirtualResourceScope(body) && scopeForPluginRequest(endpoint, body) === undefined) {
|
|
698
|
+
return { ok: false, error: { code: 'PEER_HOST_SCOPE_MISMATCH', message: t('peerHost.fileWorkspaceUnavailable') } };
|
|
699
|
+
}
|
|
700
|
+
if (isDebugPluginEndpoint(endpoint) && hasVirtualResourceScope(body) && scopeForPluginRequest(endpoint, body) === undefined) {
|
|
478
701
|
return { ok: false, error: { code: 'PEER_HOST_SCOPE_MISMATCH', message: t('peerHost.debugWorkspaceUnavailable') } };
|
|
479
702
|
}
|
|
480
703
|
// Git 只由顶层 workspaceId 决定归属,文件名和提交正文不能参与 Host 选择。
|
|
@@ -494,17 +717,41 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
494
717
|
}
|
|
495
718
|
if (channel === '/api' && isDshNativeRemoteMethod(method)) {
|
|
496
719
|
const scope = scopeForNativeRequest(method, body);
|
|
720
|
+
if (scope === undefined && hasVirtualQuestionAgent(method, body)) {
|
|
721
|
+
return { ok: false, error: { code: 'PEER_HOST_SCOPE_MISMATCH', message: t('peerHost.questionSessionUnavailable') } };
|
|
722
|
+
}
|
|
723
|
+
if (scope === undefined && hasUnresolvedVirtualNativeScope(method, body)) {
|
|
724
|
+
return { ok: false, error: { code: 'PEER_HOST_SCOPE_MISMATCH', message: t('peerHost.sessionUnavailable') } };
|
|
725
|
+
}
|
|
497
726
|
if (scope !== undefined && scope.targetHostId !== null) {
|
|
498
727
|
// DSH 的 client 契约要求 unary 结果是 `{ok, value}` / `{ok:false, error}` 信封:
|
|
499
728
|
// 返回裸值会让网关在 `rebuiltFailure(result.error)` 读 undefined.code 而崩成 carrierFailure。
|
|
500
729
|
try {
|
|
501
730
|
const created = decodeNativeResponseBytes(await codingNsCall('peerHost/native', { method, payload: body, scope }, signal));
|
|
502
|
-
|
|
731
|
+
const createsSession = method === 'session/create' || method === 'session/fork';
|
|
732
|
+
const refreshesNativeList = method === 'session/rename' || method === 'workspace/archiveSession' || method === 'workspace/unarchiveSession';
|
|
733
|
+
if (createsSession) {
|
|
503
734
|
rememberCreatedSession(scope, created);
|
|
504
735
|
// 侧栏按聚合摘要里的 workspace.sessionIds 归组,新会话只有在刷新后的摘要里
|
|
505
736
|
// 才会挂到远端工作区。不立刻刷新,它会先落在"未分组/本机默认工作区",
|
|
506
737
|
// 看起来像新建到了本机。刷新失败不影响创建结果。
|
|
507
|
-
|
|
738
|
+
}
|
|
739
|
+
if (createsSession || refreshesNativeList) {
|
|
740
|
+
// 这些是用户明确完成的写操作,允许补一次聚合读取,避免等待 30 秒轮询。
|
|
741
|
+
// 改名、归档和取消归档的成员集合不变,因此在聚合完成后额外刷新一次原生
|
|
742
|
+
// session/list;refreshPeerHostNativeSessions 自身保留 5 秒最小间隔。
|
|
743
|
+
let aggregateRefresh;
|
|
744
|
+
try {
|
|
745
|
+
aggregateRefresh = requestPeerHostAggregateRefresh();
|
|
746
|
+
}
|
|
747
|
+
catch {
|
|
748
|
+
aggregateRefresh = undefined;
|
|
749
|
+
}
|
|
750
|
+
if (refreshesNativeList) {
|
|
751
|
+
void Promise.resolve(aggregateRefresh)
|
|
752
|
+
.then(() => refreshPeerHostNativeSessions(uiContext))
|
|
753
|
+
.catch(() => undefined);
|
|
754
|
+
}
|
|
508
755
|
}
|
|
509
756
|
return { ok: true, value: created };
|
|
510
757
|
}
|
|
@@ -527,8 +774,18 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
527
774
|
const value = asRecord(payload);
|
|
528
775
|
const channel = typeof value?.channel === 'string' ? value.channel : '/api';
|
|
529
776
|
const body = value?.payload;
|
|
777
|
+
if (channel === '/api' && method === '$events') {
|
|
778
|
+
return events.open(localSignal => openDshGatewayStream(method, body, localSignal), signal);
|
|
779
|
+
}
|
|
530
780
|
if (channel === '/api' && isDshNativeRemoteMethod(method)) {
|
|
531
781
|
const scope = scopeForNativeRequest(method, body);
|
|
782
|
+
if (scope === undefined && hasVirtualQuestionAgent(method, body))
|
|
783
|
+
throw new Error('远端问题所属会话不可用,请重新连接');
|
|
784
|
+
if (scope === undefined && hasUnresolvedVirtualNativeScope(method, body)) {
|
|
785
|
+
const error = new Error(t('peerHost.sessionUnavailable'));
|
|
786
|
+
error.code = 'PEER_HOST_SCOPE_MISMATCH';
|
|
787
|
+
throw error;
|
|
788
|
+
}
|
|
532
789
|
if (scope !== undefined && scope.targetHostId !== null) {
|
|
533
790
|
const stream = openRemoteStream(method, body, scope, signal);
|
|
534
791
|
if (method !== 'session/follow')
|
|
@@ -540,6 +797,9 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
540
797
|
try {
|
|
541
798
|
for await (const chunk of stream) {
|
|
542
799
|
emitted = true;
|
|
800
|
+
// 父会话先公布子会话目录,聚合稍后才补基线。立即登记已验证的虚拟 ID,
|
|
801
|
+
// 避免用户在这段窗口打开子会话时把 CLI 配置读到本机并缓存成 dsh。
|
|
802
|
+
rememberSubagentCatalog(scope, chunk);
|
|
543
803
|
scheduleAggregateRefresh();
|
|
544
804
|
yield chunk;
|
|
545
805
|
}
|
|
@@ -552,27 +812,43 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
552
812
|
})();
|
|
553
813
|
}
|
|
554
814
|
}
|
|
555
|
-
//
|
|
815
|
+
// 其余本机流必须回到 DSH Gateway:本地 baseline 不能
|
|
556
816
|
// 走 PeerHost,否则原生 workspace/session Store 会整体停在 loading。
|
|
557
817
|
if (channel !== '/api')
|
|
558
818
|
throw new Error('CODINGNS_BASELINE_STREAM');
|
|
559
819
|
return openDshGatewayStream(method, body, signal);
|
|
560
820
|
},
|
|
561
821
|
fetch: (input, init) => {
|
|
562
|
-
|
|
563
|
-
return Promise.reject(new Error('当前页面没有 fetch'));
|
|
564
|
-
return fetchImpl(input, init);
|
|
822
|
+
return remoteSessionExportFetch(input, init);
|
|
565
823
|
},
|
|
566
824
|
};
|
|
567
825
|
return {
|
|
568
826
|
hooks,
|
|
827
|
+
mergeEvents: (local, signal) => events.open(local, signal),
|
|
828
|
+
dispose() {
|
|
829
|
+
events.dispose();
|
|
830
|
+
restoreAnchorClick();
|
|
831
|
+
restoreGlobalFetch();
|
|
832
|
+
if (aggregateRefreshTimer !== undefined)
|
|
833
|
+
clearTimeout(aggregateRefreshTimer);
|
|
834
|
+
for (const sessionId of pendingSessionScopes.keys())
|
|
835
|
+
forgetPendingSession(sessionId);
|
|
836
|
+
},
|
|
569
837
|
/** 该请求是否落在某个远端 Host 的作用域内;Desktop 连接路由用它决定是否分流。 */
|
|
570
838
|
matchesScope(value, method) {
|
|
839
|
+
if (method === '$events/result')
|
|
840
|
+
return events.ownsResult(value);
|
|
841
|
+
if (hasVirtualQuestionAgent(method ?? '', value))
|
|
842
|
+
return true;
|
|
571
843
|
const endpoint = method?.replace(/^codingns\//u, '') ?? '';
|
|
844
|
+
if (endpoint.startsWith('fileManagement/')) {
|
|
845
|
+
const scope = scopeForPluginRequest(endpoint, value);
|
|
846
|
+
return scope === undefined ? hasVirtualResourceScope(value) : scope.targetHostId !== null;
|
|
847
|
+
}
|
|
572
848
|
if (isDebugPluginEndpoint(endpoint)) {
|
|
573
849
|
const scope = scopeForPluginRequest(endpoint, value);
|
|
574
850
|
// 聚合暂时缺失时仍接管虚拟资源,返回明确错误,禁止回落本机调试服务。
|
|
575
|
-
return scope === undefined ?
|
|
851
|
+
return scope === undefined ? hasVirtualResourceScope(value) : scope.targetHostId !== null;
|
|
576
852
|
}
|
|
577
853
|
if (method?.startsWith('git/') || method?.startsWith('codingns/git/')) {
|
|
578
854
|
const workspaceId = asRecord(value)?.workspaceId;
|
|
@@ -587,7 +863,11 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
587
863
|
const scope = cli === undefined
|
|
588
864
|
? scopeForNativeRequest(method ?? '', value)
|
|
589
865
|
: scopeForPluginRequest(cli, value);
|
|
590
|
-
|
|
866
|
+
if (scope !== undefined)
|
|
867
|
+
return scope.targetHostId !== null;
|
|
868
|
+
// 只有原生 Remote 方法会在 hooks 里明确报错、拒绝回落本机;CLI 等插件端点
|
|
869
|
+
// 没有这层守卫,作用域丢失时必须交还本机,不能假装接管后静默落到本机。
|
|
870
|
+
return isDshNativeRemoteMethod(method ?? '') && hasUnresolvedVirtualNativeScope(method ?? '', value);
|
|
591
871
|
},
|
|
592
872
|
watchNavigation() {
|
|
593
873
|
const store = readNativeNavigationStore(uiContext);
|
|
@@ -597,8 +877,11 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
597
877
|
return stop ?? (() => undefined);
|
|
598
878
|
},
|
|
599
879
|
setAggregate(aggregate, orderedWorkspaceIds) {
|
|
880
|
+
const previousScopes = new Map(scopes);
|
|
881
|
+
const now = Date.now();
|
|
600
882
|
scopes.clear();
|
|
601
883
|
remoteHostScopes.clear();
|
|
884
|
+
const visibleWorkspaceIds = new Set();
|
|
602
885
|
for (const host of aggregate) {
|
|
603
886
|
if (host.targetHostId !== null) {
|
|
604
887
|
remoteHostScopes.set(host.targetHostId, { hostId: host.hostId, targetHostId: host.targetHostId, workspaceId: '__aggregate__', sessionId: null, scopeGeneration: 0 });
|
|
@@ -606,19 +889,31 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
606
889
|
for (const workspace of host.workspaces) {
|
|
607
890
|
const virtualHostId = host.targetHostId ?? host.hostId;
|
|
608
891
|
const virtualWorkspaceId = createVirtualWorkspaceId(virtualHostId, workspace.workspaceId);
|
|
892
|
+
visibleWorkspaceIds.add(virtualWorkspaceId);
|
|
609
893
|
const workspaceScope = { hostId: host.hostId, targetHostId: host.targetHostId, workspaceId: workspace.workspaceId, sessionId: null, scopeGeneration: 0 };
|
|
610
894
|
scopes.set(virtualWorkspaceId, workspaceScope);
|
|
611
895
|
// 归档会话也要能解析作用域:取消归档请求按虚拟会话 ID 路由到目标 Host。
|
|
612
|
-
for (const session of [...workspace.sessions, ...(workspace.archivedSessions ?? [])]) {
|
|
896
|
+
for (const session of [...workspace.sessions, ...(workspace.archivedSessions ?? []), ...(workspace.subagentSessions ?? [])]) {
|
|
613
897
|
if (session.scope.sessionId === null)
|
|
614
898
|
continue;
|
|
615
899
|
scopes.set(createVirtualSessionId(virtualHostId, session.scope.sessionId), { ...workspaceScope, sessionId: session.scope.sessionId });
|
|
616
900
|
}
|
|
617
901
|
}
|
|
618
902
|
}
|
|
903
|
+
// 聚合刷新可能暂时漏掉会话元数据,但只要工作区仍存在,当前页面的远端会话
|
|
904
|
+
// 就不能立即改走本机 Gateway。真实删除会在目标 Host 返回明确的 not-found。
|
|
905
|
+
for (const [sessionId, scope] of previousScopes) {
|
|
906
|
+
if (scope.targetHostId === null || scope.sessionId === null || scopes.has(sessionId))
|
|
907
|
+
continue;
|
|
908
|
+
const pending = pendingSessionScopes.get(sessionId);
|
|
909
|
+
if (pending !== undefined && pending.expiresAt <= now)
|
|
910
|
+
continue;
|
|
911
|
+
if (visibleWorkspaceIds.has(createVirtualWorkspaceId(scope.targetHostId, scope.workspaceId)))
|
|
912
|
+
scopes.set(sessionId, scope);
|
|
913
|
+
}
|
|
619
914
|
// 刚创建、尚未进入聚合的会话要保住作用域;聚合里已存在的以聚合为准。
|
|
620
|
-
//
|
|
621
|
-
|
|
915
|
+
// 聚合确认后清掉 pending 记录;会话摘要暂缺时由上面的最后确认作用域接管,
|
|
916
|
+
// 直到工作区消失。目标 Host 的会话错误仍保持在 PeerHost 边界内,不回落本机。
|
|
622
917
|
for (const [sessionId, pending] of [...pendingSessionScopes]) {
|
|
623
918
|
if (scopes.has(sessionId)) {
|
|
624
919
|
forgetPendingSession(sessionId);
|
|
@@ -631,7 +926,18 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
631
926
|
scopes.set(sessionId, pending.scope);
|
|
632
927
|
}
|
|
633
928
|
refreshModelCatalogForScope(navigationScope());
|
|
634
|
-
|
|
929
|
+
const changed = projection.setAggregate(aggregate, orderedWorkspaceIds);
|
|
930
|
+
for (const sessionId of projection.consumeCompletedSessionTransitions()) {
|
|
931
|
+
const scope = scopes.get(sessionId);
|
|
932
|
+
if (scope === undefined)
|
|
933
|
+
continue;
|
|
934
|
+
projection.setSessionRunning(sessionId, false);
|
|
935
|
+
events.replayCompletedSessionStatus(sessionId, scope);
|
|
936
|
+
}
|
|
937
|
+
events.replayPendingSessionStatuses();
|
|
938
|
+
const readyHosts = new Set(aggregate.filter(host => host.availability === 'ready' && host.workspaces.length > 0).map(host => host.targetHostId));
|
|
939
|
+
events.setPeers([...remoteHostScopes.values()].filter(scope => readyHosts.has(scope.targetHostId)));
|
|
940
|
+
return changed;
|
|
635
941
|
},
|
|
636
942
|
};
|
|
637
943
|
}
|
|
@@ -639,12 +945,22 @@ export function createPeerHostPageTransport(projection = createPeerHostNativePro
|
|
|
639
945
|
function peerHostPluginEndpoint(channel, method) {
|
|
640
946
|
const endpoint = channel === '/codingns' ? method
|
|
641
947
|
: channel === '/api' && method.startsWith('codingns/') ? method.slice('codingns/'.length) : '';
|
|
642
|
-
return endpoint.startsWith('cli/') || endpoint.startsWith('git/') || endpoint.startsWith('debug/') || endpoint === 'terminal/status' ? endpoint : undefined;
|
|
948
|
+
return endpoint.startsWith('cli/') || endpoint.startsWith('git/') || endpoint.startsWith('debug/') || endpoint.startsWith('fileManagement/') || endpoint === 'terminal/status' ? endpoint : undefined;
|
|
949
|
+
}
|
|
950
|
+
function questionAgentId(value) {
|
|
951
|
+
const input = asRecord(value);
|
|
952
|
+
return asRecord(input?.args)?.agentId ?? input?.agentId;
|
|
953
|
+
}
|
|
954
|
+
function hasVirtualQuestionAgent(method, value) {
|
|
955
|
+
if (method !== 'userQuestions/answer' && method !== 'userQuestions/attachWait')
|
|
956
|
+
return false;
|
|
957
|
+
const id = questionAgentId(value);
|
|
958
|
+
return typeof id === 'string' && parseVirtualSessionId(id) !== null;
|
|
643
959
|
}
|
|
644
960
|
function isDebugPluginEndpoint(endpoint) {
|
|
645
961
|
return endpoint.startsWith('debug/') || endpoint === 'terminal/status';
|
|
646
962
|
}
|
|
647
|
-
function
|
|
963
|
+
function hasVirtualResourceScope(value) {
|
|
648
964
|
const input = asRecord(value);
|
|
649
965
|
return (typeof input?.workspaceId === 'string' && parseVirtualWorkspaceId(input.workspaceId) !== null)
|
|
650
966
|
|| (typeof input?.sessionId === 'string' && parseVirtualSessionId(input.sessionId) !== null);
|
|
@@ -661,8 +977,8 @@ function projectGitWorkspaceIds(value, workspaceId, virtualWorkspaceId) {
|
|
|
661
977
|
key === 'workspaceId' && child === workspaceId ? virtualWorkspaceId : projectGitWorkspaceIds(child, workspaceId, virtualWorkspaceId),
|
|
662
978
|
]));
|
|
663
979
|
}
|
|
664
|
-
/**
|
|
665
|
-
function
|
|
980
|
+
/** 只还原调试与文件请求的顶层资源标识,配置、文件正文和路径必须原样保存。 */
|
|
981
|
+
function rewritePluginResourcePayload(value, scope) {
|
|
666
982
|
const input = asRecord(value);
|
|
667
983
|
if (input === null)
|
|
668
984
|
return value;
|
|
@@ -670,7 +986,7 @@ function rewriteDebugPayload(value, scope) {
|
|
|
670
986
|
const workspace = typeof input.workspaceId === 'string' ? parseVirtualWorkspaceId(input.workspaceId) : null;
|
|
671
987
|
if (workspace !== null) {
|
|
672
988
|
if (workspace.hostId !== scope.targetHostId || workspace.workspaceId !== scope.workspaceId)
|
|
673
|
-
throw new Error('
|
|
989
|
+
throw new Error('请求的 Workspace 与目标 Host 作用域不一致');
|
|
674
990
|
result.workspaceId = workspace.workspaceId;
|
|
675
991
|
}
|
|
676
992
|
for (const key of ['sessionId', 'dshSessionId']) {
|
|
@@ -678,7 +994,7 @@ function rewriteDebugPayload(value, scope) {
|
|
|
678
994
|
if (session === null)
|
|
679
995
|
continue;
|
|
680
996
|
if (session.hostId !== scope.targetHostId)
|
|
681
|
-
throw new Error('
|
|
997
|
+
throw new Error('请求的 Session 与目标 Host 作用域不一致');
|
|
682
998
|
result[key] = session.sessionId;
|
|
683
999
|
}
|
|
684
1000
|
return result;
|
|
@@ -725,6 +1041,9 @@ export function installPeerHostConnectionRouting(options) {
|
|
|
725
1041
|
// RemoteStreamMuxClient),因此 uplink 与重连行为都不受影响;也不要动
|
|
726
1042
|
// `connection.rpc.open`,否则网关会认为本页自带流通道而不再启动/重连 mux。
|
|
727
1043
|
const patchedOpenRemoteStream = (endpoint, payload, signal, uplink, noConnection) => {
|
|
1044
|
+
if (endpoint === '$events' && options.mergeEvents !== undefined) {
|
|
1045
|
+
return options.mergeEvents(localSignal => originalCallRemote.call(remote, endpoint, payload, localSignal, uplink, noConnection), signal);
|
|
1046
|
+
}
|
|
728
1047
|
if (typeof options.hooks.openStream === 'function' && isPeerScoped('/api', endpoint, payload)) {
|
|
729
1048
|
return options.hooks.openStream({ method: endpoint, payload: { channel: '/api', payload, uplink }, ...(signal === undefined ? {} : { signal }) });
|
|
730
1049
|
}
|
|
@@ -762,6 +1081,14 @@ function readConnectionHandle(uiContext) {
|
|
|
762
1081
|
return undefined;
|
|
763
1082
|
}
|
|
764
1083
|
}
|
|
1084
|
+
/** 只更新浏览器内的事件订阅代次,不重启 Host 或任何运行实例。 */
|
|
1085
|
+
function reconnectNativeEvents(uiContext) {
|
|
1086
|
+
try {
|
|
1087
|
+
const connection = uiContext?.get('connection');
|
|
1088
|
+
connection?.reconnect?.();
|
|
1089
|
+
}
|
|
1090
|
+
catch { /* 原生连接尚未挂载时,首次连接会直接使用新的入口。 */ }
|
|
1091
|
+
}
|
|
765
1092
|
/** 只借用原生导航数据,不修改选择策略,也不从后台保留会话推断前台。 */
|
|
766
1093
|
function readNativeNavigationStore(uiContext) {
|
|
767
1094
|
try {
|
|
@@ -908,10 +1235,15 @@ function refreshDshModelCatalog(uiContext) {
|
|
|
908
1235
|
// 模型选择插件未挂载或 DSH 版本没有该内部服务时,不影响远程请求本身。
|
|
909
1236
|
}
|
|
910
1237
|
}
|
|
1238
|
+
/** 只比较会话成员集合,避免把每个状态增量放大成完整列表请求。 */
|
|
1239
|
+
function sessionMembershipKey(sessions) {
|
|
1240
|
+
return sessions.map((session) => session.sessionId).join('\u0000');
|
|
1241
|
+
}
|
|
911
1242
|
/** 打开当前页面 DSH Gateway 的单个 Remote 流;协议与 dsh-api-gateway 保持一致。 */
|
|
912
1243
|
function openDshGatewayStream(endpoint, payload, signal) {
|
|
913
1244
|
const streamId = `codingns_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
914
1245
|
return (async function* () {
|
|
1246
|
+
signal?.throwIfAborted();
|
|
915
1247
|
const WebSocketCtor = globalThis.WebSocket;
|
|
916
1248
|
if (typeof WebSocketCtor !== 'function')
|
|
917
1249
|
throw new Error('当前页面没有可用 WebSocket');
|
|
@@ -947,16 +1279,29 @@ function openDshGatewayStream(endpoint, payload, signal) {
|
|
|
947
1279
|
}
|
|
948
1280
|
};
|
|
949
1281
|
const onError = () => { failure = new Error('DSH Remote stream WebSocket 失败'); notify(); };
|
|
950
|
-
const onAbort = () => { failure = signal?.reason instanceof Error ? signal.reason : new Error('DSH Remote stream 已取消'); notify(); };
|
|
1282
|
+
const onAbort = () => { failure = signal?.reason instanceof Error ? signal.reason : new Error('DSH Remote stream 已取消'); notify(); socket.close(1000, 'stream aborted'); };
|
|
1283
|
+
const onClose = () => { if (!ended)
|
|
1284
|
+
failure ??= new Error('DSH Remote stream WebSocket 已关闭'); notify(); };
|
|
951
1285
|
socket.addEventListener('message', onMessage);
|
|
952
1286
|
socket.addEventListener('error', onError);
|
|
1287
|
+
socket.addEventListener('close', onClose);
|
|
953
1288
|
signal?.addEventListener('abort', onAbort, { once: true });
|
|
954
1289
|
try {
|
|
955
1290
|
await new Promise((resolve, reject) => {
|
|
956
|
-
const
|
|
957
|
-
|
|
1291
|
+
const cleanup = () => {
|
|
1292
|
+
socket.removeEventListener('open', opened);
|
|
1293
|
+
socket.removeEventListener('error', failed);
|
|
1294
|
+
socket.removeEventListener('close', failed);
|
|
1295
|
+
signal?.removeEventListener('abort', failed);
|
|
1296
|
+
};
|
|
1297
|
+
const opened = () => { cleanup(); resolve(); };
|
|
1298
|
+
const failed = () => { cleanup(); reject(failure ?? new Error('DSH Remote stream WebSocket 打开失败')); };
|
|
958
1299
|
socket.addEventListener('open', opened, { once: true });
|
|
959
1300
|
socket.addEventListener('error', failed, { once: true });
|
|
1301
|
+
socket.addEventListener('close', failed, { once: true });
|
|
1302
|
+
signal?.addEventListener('abort', failed, { once: true });
|
|
1303
|
+
if (signal?.aborted)
|
|
1304
|
+
failed();
|
|
960
1305
|
});
|
|
961
1306
|
signal?.throwIfAborted();
|
|
962
1307
|
socket.send(JSON.stringify({ type: 'open', streamId, endpoint, payload }));
|
|
@@ -976,6 +1321,9 @@ function openDshGatewayStream(endpoint, payload, signal) {
|
|
|
976
1321
|
}
|
|
977
1322
|
finally {
|
|
978
1323
|
signal?.removeEventListener('abort', onAbort);
|
|
1324
|
+
socket.removeEventListener('message', onMessage);
|
|
1325
|
+
socket.removeEventListener('error', onError);
|
|
1326
|
+
socket.removeEventListener('close', onClose);
|
|
979
1327
|
socket.close(1000, 'stream closed');
|
|
980
1328
|
}
|
|
981
1329
|
})();
|
|
@@ -991,6 +1339,75 @@ function isDesktopTopologyPage() {
|
|
|
991
1339
|
return false;
|
|
992
1340
|
}
|
|
993
1341
|
}
|
|
1342
|
+
/** 导出插件直接使用全局 fetch;把远程虚拟 Session 的预检请求接入页面 Transport。 */
|
|
1343
|
+
function installSessionExportFetchPatch(original, routed) {
|
|
1344
|
+
if (original === undefined || typeof window === 'undefined')
|
|
1345
|
+
return () => undefined;
|
|
1346
|
+
const wrapped = ((input, init) => routed(input, init));
|
|
1347
|
+
try {
|
|
1348
|
+
globalThis.fetch = wrapped;
|
|
1349
|
+
}
|
|
1350
|
+
catch {
|
|
1351
|
+
return () => undefined;
|
|
1352
|
+
}
|
|
1353
|
+
return () => {
|
|
1354
|
+
if (globalThis.fetch === wrapped)
|
|
1355
|
+
globalThis.fetch = original;
|
|
1356
|
+
};
|
|
1357
|
+
}
|
|
1358
|
+
/** 导出插件的 GET 使用原生锚点导航;远程 ZIP 必须先经代理取回 Blob 再触发下载。 */
|
|
1359
|
+
function installSessionExportAnchorPatch(fetcher, findScope) {
|
|
1360
|
+
if (typeof window === 'undefined' || typeof document === 'undefined')
|
|
1361
|
+
return () => undefined;
|
|
1362
|
+
const prototype = globalThis.HTMLAnchorElement?.prototype;
|
|
1363
|
+
const originalClick = prototype?.click;
|
|
1364
|
+
if (prototype === undefined || originalClick === undefined)
|
|
1365
|
+
return () => undefined;
|
|
1366
|
+
const patchedClick = function () {
|
|
1367
|
+
let url;
|
|
1368
|
+
try {
|
|
1369
|
+
url = new URL(this.href, document.baseURI);
|
|
1370
|
+
}
|
|
1371
|
+
catch {
|
|
1372
|
+
originalClick.call(this);
|
|
1373
|
+
return;
|
|
1374
|
+
}
|
|
1375
|
+
if (url.pathname !== '/api/session.export' || findScope(url) === undefined) {
|
|
1376
|
+
originalClick.call(this);
|
|
1377
|
+
return;
|
|
1378
|
+
}
|
|
1379
|
+
const filename = this.download;
|
|
1380
|
+
void fetcher(url, { method: 'GET' }).then(async (response) => {
|
|
1381
|
+
if (!response.ok)
|
|
1382
|
+
return;
|
|
1383
|
+
const blobUrl = URL.createObjectURL(await response.blob());
|
|
1384
|
+
const download = document.createElement('a');
|
|
1385
|
+
download.href = blobUrl;
|
|
1386
|
+
download.download = filename;
|
|
1387
|
+
originalClick.call(download);
|
|
1388
|
+
setTimeout(() => URL.revokeObjectURL(blobUrl), 0);
|
|
1389
|
+
}).catch(() => undefined);
|
|
1390
|
+
};
|
|
1391
|
+
try {
|
|
1392
|
+
prototype.click = patchedClick;
|
|
1393
|
+
}
|
|
1394
|
+
catch {
|
|
1395
|
+
return () => undefined;
|
|
1396
|
+
}
|
|
1397
|
+
return () => {
|
|
1398
|
+
if (prototype.click === patchedClick)
|
|
1399
|
+
prototype.click = originalClick;
|
|
1400
|
+
};
|
|
1401
|
+
}
|
|
1402
|
+
function decodeBase64(value) {
|
|
1403
|
+
if (typeof atob !== 'function')
|
|
1404
|
+
throw new Error('当前页面不支持 Base64 解码');
|
|
1405
|
+
const binary = atob(value);
|
|
1406
|
+
const bytes = new Uint8Array(binary.length);
|
|
1407
|
+
for (let index = 0; index < binary.length; index += 1)
|
|
1408
|
+
bytes[index] = binary.charCodeAt(index);
|
|
1409
|
+
return bytes.buffer;
|
|
1410
|
+
}
|
|
994
1411
|
/** PeerHost 启用状态说明;安装动作发生在启动页 preboot 阶段。 */
|
|
995
1412
|
function PeerHostPanel({ services, enabled }) {
|
|
996
1413
|
const t = useCodingNsTranslator(services.locale);
|