@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.
Files changed (711) hide show
  1. package/README.en.md +4 -4
  2. package/README.md +21 -5
  3. package/THIRD_PARTY_NOTICES +5 -0
  4. package/assets/provider-icons/r4.svg +4 -0
  5. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
  6. package/data/build/dist/bootstrap/index.d.ts +1 -1
  7. package/data/build/dist/client/assistant-settings-styles.d.ts.map +1 -1
  8. package/data/build/dist/client/assistant-settings-styles.js +3 -2
  9. package/data/build/dist/client/assistant-settings-styles.js.map +1 -1
  10. package/data/build/dist/client/avatar/catalog-panel.d.ts.map +1 -1
  11. package/data/build/dist/client/avatar/catalog-panel.js +7 -5
  12. package/data/build/dist/client/avatar/catalog-panel.js.map +1 -1
  13. package/data/build/dist/client/avatar/catalog-picker.d.ts.map +1 -1
  14. package/data/build/dist/client/avatar/catalog-picker.js +2 -1
  15. package/data/build/dist/client/avatar/catalog-picker.js.map +1 -1
  16. package/data/build/dist/client/avatar/desktop-bridge.d.ts +7 -3
  17. package/data/build/dist/client/avatar/desktop-bridge.d.ts.map +1 -1
  18. package/data/build/dist/client/avatar/desktop-bridge.js +64 -5
  19. package/data/build/dist/client/avatar/desktop-bridge.js.map +1 -1
  20. package/data/build/dist/client/avatar/desktop-view.d.ts +6 -0
  21. package/data/build/dist/client/avatar/desktop-view.d.ts.map +1 -1
  22. package/data/build/dist/client/avatar/desktop-view.js +98 -5
  23. package/data/build/dist/client/avatar/desktop-view.js.map +1 -1
  24. package/data/build/dist/client/avatar/engine.d.ts.map +1 -1
  25. package/data/build/dist/client/avatar/engine.js +3 -2
  26. package/data/build/dist/client/avatar/engine.js.map +1 -1
  27. package/data/build/dist/client/avatar/floating.d.ts +8 -3
  28. package/data/build/dist/client/avatar/floating.d.ts.map +1 -1
  29. package/data/build/dist/client/avatar/floating.js +22 -4
  30. package/data/build/dist/client/avatar/floating.js.map +1 -1
  31. package/data/build/dist/client/avatar/image.d.ts +1 -1
  32. package/data/build/dist/client/avatar/image.d.ts.map +1 -1
  33. package/data/build/dist/client/avatar/image.js +2 -2
  34. package/data/build/dist/client/avatar/image.js.map +1 -1
  35. package/data/build/dist/client/avatar/live2d.d.ts +14 -3
  36. package/data/build/dist/client/avatar/live2d.d.ts.map +1 -1
  37. package/data/build/dist/client/avatar/live2d.js +62 -9
  38. package/data/build/dist/client/avatar/live2d.js.map +1 -1
  39. package/data/build/dist/client/avatar/loading.d.ts.map +1 -1
  40. package/data/build/dist/client/avatar/loading.js +3 -2
  41. package/data/build/dist/client/avatar/loading.js.map +1 -1
  42. package/data/build/dist/client/avatar/notification-bubble.d.ts +39 -0
  43. package/data/build/dist/client/avatar/notification-bubble.d.ts.map +1 -0
  44. package/data/build/dist/client/avatar/notification-bubble.js +353 -0
  45. package/data/build/dist/client/avatar/notification-bubble.js.map +1 -0
  46. package/data/build/dist/client/avatar/notification-surface.d.ts +16 -0
  47. package/data/build/dist/client/avatar/notification-surface.d.ts.map +1 -0
  48. package/data/build/dist/client/avatar/notification-surface.js +54 -0
  49. package/data/build/dist/client/avatar/notification-surface.js.map +1 -0
  50. package/data/build/dist/client/avatar/reaction-badge.d.ts +7 -0
  51. package/data/build/dist/client/avatar/reaction-badge.d.ts.map +1 -0
  52. package/data/build/dist/client/avatar/reaction-badge.js +20 -0
  53. package/data/build/dist/client/avatar/reaction-badge.js.map +1 -0
  54. package/data/build/dist/client/avatar/registry.d.ts +2 -1
  55. package/data/build/dist/client/avatar/registry.d.ts.map +1 -1
  56. package/data/build/dist/client/avatar/registry.js.map +1 -1
  57. package/data/build/dist/client/avatar/settings-panel.d.ts.map +1 -1
  58. package/data/build/dist/client/avatar/settings-panel.js +7 -5
  59. package/data/build/dist/client/avatar/settings-panel.js.map +1 -1
  60. package/data/build/dist/client/avatar/slot.d.ts +2 -1
  61. package/data/build/dist/client/avatar/slot.d.ts.map +1 -1
  62. package/data/build/dist/client/avatar/slot.js +5 -4
  63. package/data/build/dist/client/avatar/slot.js.map +1 -1
  64. package/data/build/dist/client/avatar/spritesheet.d.ts +4 -2
  65. package/data/build/dist/client/avatar/spritesheet.d.ts.map +1 -1
  66. package/data/build/dist/client/avatar/spritesheet.js +18 -9
  67. package/data/build/dist/client/avatar/spritesheet.js.map +1 -1
  68. package/data/build/dist/client/bundle.js +6881 -1776
  69. package/data/build/dist/client/bundle.js.map +1 -1
  70. package/data/build/dist/client/cli-catalog.d.ts +1 -1
  71. package/data/build/dist/client/cli-catalog.d.ts.map +1 -1
  72. package/data/build/dist/client/cli-catalog.js +2 -0
  73. package/data/build/dist/client/cli-catalog.js.map +1 -1
  74. package/data/build/dist/client/cli-session-config-cache.d.ts +17 -0
  75. package/data/build/dist/client/cli-session-config-cache.d.ts.map +1 -0
  76. package/data/build/dist/client/cli-session-config-cache.js +56 -0
  77. package/data/build/dist/client/cli-session-config-cache.js.map +1 -0
  78. package/data/build/dist/client/cli-settings-rpc.d.ts +5 -0
  79. package/data/build/dist/client/cli-settings-rpc.d.ts.map +1 -0
  80. package/data/build/dist/client/cli-settings-rpc.js +60 -0
  81. package/data/build/dist/client/cli-settings-rpc.js.map +1 -0
  82. package/data/build/dist/client/cli-slots.d.ts.map +1 -1
  83. package/data/build/dist/client/cli-slots.js +24 -40
  84. package/data/build/dist/client/cli-slots.js.map +1 -1
  85. package/data/build/dist/client/client.assistant-configuration-view.js +264 -55
  86. package/data/build/dist/client/client.assistant-configuration-view.js.map +1 -1
  87. package/data/build/dist/client/client.assistant-debug-workbench.js +4 -4
  88. package/data/build/dist/client/client.assistant-debug-workbench.js.map +1 -1
  89. package/data/build/dist/client/{client.assistant-prompts.js → client.assistant-notifications.js} +63 -2
  90. package/data/build/dist/client/client.assistant-notifications.js.map +1 -0
  91. package/data/build/dist/client/client.assistant-prompt-editor.js +4 -4
  92. package/data/build/dist/client/client.assistant-prompt-editor.js.map +1 -1
  93. package/data/build/dist/client/client.assistant-workbench.js +287 -161
  94. package/data/build/dist/client/client.assistant-workbench.js.map +1 -1
  95. package/data/build/dist/client/client.delegate-command.js +12 -25
  96. package/data/build/dist/client/client.delegate-command.js.map +1 -1
  97. package/data/build/dist/client/client.manager.js +201 -25
  98. package/data/build/dist/client/client.manager.js.map +1 -1
  99. package/data/build/dist/client/client.model-catalog-cache.js +2 -1
  100. package/data/build/dist/client/client.model-catalog-cache.js.map +1 -1
  101. package/data/build/dist/client/client.native-workspace-store.js +42 -11
  102. package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
  103. package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
  104. package/data/build/dist/client/client.react-dom.js +250 -0
  105. package/data/build/dist/client/client.react-dom.js.map +1 -1
  106. package/data/build/dist/client/client.theme.js +58 -12
  107. package/data/build/dist/client/client.theme.js.map +1 -1
  108. package/data/build/dist/client/client.transport.js +342 -46
  109. package/data/build/dist/client/client.transport.js.map +1 -1
  110. package/data/build/dist/client/debug/ui.d.ts.map +1 -1
  111. package/data/build/dist/client/debug/ui.js +30 -29
  112. package/data/build/dist/client/debug/ui.js.map +1 -1
  113. package/data/build/dist/client/delegate-command.d.ts.map +1 -1
  114. package/data/build/dist/client/delegate-command.js +12 -21
  115. package/data/build/dist/client/delegate-command.js.map +1 -1
  116. package/data/build/dist/client/desktop-assistant.js +61859 -158
  117. package/data/build/dist/client/external-tool-stream.d.ts.map +1 -1
  118. package/data/build/dist/client/external-tool-stream.js +2 -1
  119. package/data/build/dist/client/external-tool-stream.js.map +1 -1
  120. package/data/build/dist/client/features/assistant-configuration-session.js +3 -3
  121. package/data/build/dist/client/features/assistant-configuration-session.js.map +1 -1
  122. package/data/build/dist/client/features/assistant-configuration-tabs.d.ts.map +1 -1
  123. package/data/build/dist/client/features/assistant-configuration-tabs.js +2 -1
  124. package/data/build/dist/client/features/assistant-configuration-tabs.js.map +1 -1
  125. package/data/build/dist/client/features/assistant-configuration-view.d.ts +8 -0
  126. package/data/build/dist/client/features/assistant-configuration-view.d.ts.map +1 -1
  127. package/data/build/dist/client/features/assistant-configuration-view.js +99 -3
  128. package/data/build/dist/client/features/assistant-configuration-view.js.map +1 -1
  129. package/data/build/dist/client/features/assistant-conversation-message.d.ts +2 -1
  130. package/data/build/dist/client/features/assistant-conversation-message.d.ts.map +1 -1
  131. package/data/build/dist/client/features/assistant-conversation-message.js +64 -28
  132. package/data/build/dist/client/features/assistant-conversation-message.js.map +1 -1
  133. package/data/build/dist/client/features/assistant-debug-workbench.d.ts.map +1 -1
  134. package/data/build/dist/client/features/assistant-debug-workbench.js +3 -2
  135. package/data/build/dist/client/features/assistant-debug-workbench.js.map +1 -1
  136. package/data/build/dist/client/features/assistant-floating-call.d.ts.map +1 -1
  137. package/data/build/dist/client/features/assistant-floating-call.js +4 -3
  138. package/data/build/dist/client/features/assistant-floating-call.js.map +1 -1
  139. package/data/build/dist/client/features/assistant-notification-store.d.ts +72 -0
  140. package/data/build/dist/client/features/assistant-notification-store.d.ts.map +1 -0
  141. package/data/build/dist/client/features/assistant-notification-store.js +439 -0
  142. package/data/build/dist/client/features/assistant-notification-store.js.map +1 -0
  143. package/data/build/dist/client/features/assistant-realtime-call.d.ts.map +1 -1
  144. package/data/build/dist/client/features/assistant-realtime-call.js +13 -12
  145. package/data/build/dist/client/features/assistant-realtime-call.js.map +1 -1
  146. package/data/build/dist/client/features/assistant-record-style.js +11 -4
  147. package/data/build/dist/client/features/assistant-record-style.js.map +1 -1
  148. package/data/build/dist/client/features/assistant-voice-initialization.d.ts.map +1 -1
  149. package/data/build/dist/client/features/assistant-voice-initialization.js +4 -2
  150. package/data/build/dist/client/features/assistant-voice-initialization.js.map +1 -1
  151. package/data/build/dist/client/features/assistant-voice-settings-group.d.ts.map +1 -1
  152. package/data/build/dist/client/features/assistant-voice-settings-group.js +2 -1
  153. package/data/build/dist/client/features/assistant-voice-settings-group.js.map +1 -1
  154. package/data/build/dist/client/features/assistant-voice-settings.d.ts.map +1 -1
  155. package/data/build/dist/client/features/assistant-voice-settings.js +4 -3
  156. package/data/build/dist/client/features/assistant-voice-settings.js.map +1 -1
  157. package/data/build/dist/client/features/assistant-workbench-controls.d.ts.map +1 -1
  158. package/data/build/dist/client/features/assistant-workbench-controls.js +6 -5
  159. package/data/build/dist/client/features/assistant-workbench-controls.js.map +1 -1
  160. package/data/build/dist/client/features/assistant-workbench.d.ts +4 -0
  161. package/data/build/dist/client/features/assistant-workbench.d.ts.map +1 -1
  162. package/data/build/dist/client/features/assistant-workbench.js +37 -9
  163. package/data/build/dist/client/features/assistant-workbench.js.map +1 -1
  164. package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
  165. package/data/build/dist/client/features/cli-adapters.js +140 -35
  166. package/data/build/dist/client/features/cli-adapters.js.map +1 -1
  167. package/data/build/dist/client/features/file-management-panel.d.ts.map +1 -1
  168. package/data/build/dist/client/features/file-management-panel.js +3 -10
  169. package/data/build/dist/client/features/file-management-panel.js.map +1 -1
  170. package/data/build/dist/client/features/global-voice-assistant.d.ts +6 -0
  171. package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -1
  172. package/data/build/dist/client/features/global-voice-assistant.js +117 -3
  173. package/data/build/dist/client/features/global-voice-assistant.js.map +1 -1
  174. package/data/build/dist/client/features/index.d.ts +1 -0
  175. package/data/build/dist/client/features/index.d.ts.map +1 -1
  176. package/data/build/dist/client/features/index.js +3 -0
  177. package/data/build/dist/client/features/index.js.map +1 -1
  178. package/data/build/dist/client/features/lan-access-panel.d.ts.map +1 -1
  179. package/data/build/dist/client/features/lan-access-panel.js +6 -4
  180. package/data/build/dist/client/features/lan-access-panel.js.map +1 -1
  181. package/data/build/dist/client/features/login-protection-panel.d.ts.map +1 -1
  182. package/data/build/dist/client/features/login-protection-panel.js +7 -2
  183. package/data/build/dist/client/features/login-protection-panel.js.map +1 -1
  184. package/data/build/dist/client/features/mobile-access-panel.d.ts.map +1 -1
  185. package/data/build/dist/client/features/mobile-access-panel.js +19 -13
  186. package/data/build/dist/client/features/mobile-access-panel.js.map +1 -1
  187. package/data/build/dist/client/features/peer-host.d.ts +3 -0
  188. package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
  189. package/data/build/dist/client/features/peer-host.js +445 -28
  190. package/data/build/dist/client/features/peer-host.js.map +1 -1
  191. package/data/build/dist/client/features/reverse-proxy-panel.d.ts.map +1 -1
  192. package/data/build/dist/client/features/reverse-proxy-panel.js +5 -4
  193. package/data/build/dist/client/features/reverse-proxy-panel.js.map +1 -1
  194. package/data/build/dist/client/features/subagent-collapsed-lineage.d.ts +9 -0
  195. package/data/build/dist/client/features/subagent-collapsed-lineage.d.ts.map +1 -0
  196. package/data/build/dist/client/features/subagent-collapsed-lineage.js +28 -0
  197. package/data/build/dist/client/features/subagent-collapsed-lineage.js.map +1 -0
  198. package/data/build/dist/client/features/subscription-usage-panel.d.ts.map +1 -1
  199. package/data/build/dist/client/features/subscription-usage-panel.js +4 -3
  200. package/data/build/dist/client/features/subscription-usage-panel.js.map +1 -1
  201. package/data/build/dist/client/features/terminal-enhancement-panel.d.ts.map +1 -1
  202. package/data/build/dist/client/features/terminal-enhancement-panel.js +6 -4
  203. package/data/build/dist/client/features/terminal-enhancement-panel.js.map +1 -1
  204. package/data/build/dist/client/features/types.d.ts +8 -0
  205. package/data/build/dist/client/features/types.d.ts.map +1 -1
  206. package/data/build/dist/client/features/voice-conversation-dialog.d.ts.map +1 -1
  207. package/data/build/dist/client/features/voice-conversation-dialog.js +7 -6
  208. package/data/build/dist/client/features/voice-conversation-dialog.js.map +1 -1
  209. package/data/build/dist/client/features/voice-initialization-dialog.d.ts.map +1 -1
  210. package/data/build/dist/client/features/voice-initialization-dialog.js +7 -6
  211. package/data/build/dist/client/features/voice-initialization-dialog.js.map +1 -1
  212. package/data/build/dist/client/features/workspace-session-enhancement-panel.d.ts.map +1 -1
  213. package/data/build/dist/client/features/workspace-session-enhancement-panel.js +44 -96
  214. package/data/build/dist/client/features/workspace-session-enhancement-panel.js.map +1 -1
  215. package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
  216. package/data/build/dist/client/file-management-dom.js +42 -28
  217. package/data/build/dist/client/file-management-dom.js.map +1 -1
  218. package/data/build/dist/client/font-scale.d.ts +37 -0
  219. package/data/build/dist/client/font-scale.d.ts.map +1 -0
  220. package/data/build/dist/client/font-scale.js +56 -0
  221. package/data/build/dist/client/font-scale.js.map +1 -0
  222. package/data/build/dist/client/git-management.d.ts.map +1 -1
  223. package/data/build/dist/client/git-management.js +80 -37
  224. package/data/build/dist/client/git-management.js.map +1 -1
  225. package/data/build/dist/client/index.d.ts +1 -1
  226. package/data/build/dist/client/index.d.ts.map +1 -1
  227. package/data/build/dist/client/index.js +43 -1
  228. package/data/build/dist/client/index.js.map +1 -1
  229. package/data/build/dist/client/locale.d.ts.map +1 -1
  230. package/data/build/dist/client/locale.js +27 -2
  231. package/data/build/dist/client/locale.js.map +1 -1
  232. package/data/build/dist/client/locales/assistantWorkbench.d.ts +45 -0
  233. package/data/build/dist/client/locales/assistantWorkbench.d.ts.map +1 -1
  234. package/data/build/dist/client/locales/assistantWorkbench.js +30 -6
  235. package/data/build/dist/client/locales/assistantWorkbench.js.map +1 -1
  236. package/data/build/dist/client/locales/peerHost.d.ts.map +1 -1
  237. package/data/build/dist/client/locales/peerHost.js +10 -0
  238. package/data/build/dist/client/locales/peerHost.js.map +1 -1
  239. package/data/build/dist/client/locales/peerHostWorkspace.d.ts.map +1 -1
  240. package/data/build/dist/client/locales/peerHostWorkspace.js +16 -0
  241. package/data/build/dist/client/locales/peerHostWorkspace.js.map +1 -1
  242. package/data/build/dist/client/locales/subagentCollapsed.d.ts +53 -0
  243. package/data/build/dist/client/locales/subagentCollapsed.d.ts.map +1 -0
  244. package/data/build/dist/client/locales/subagentCollapsed.js +95 -0
  245. package/data/build/dist/client/locales/subagentCollapsed.js.map +1 -0
  246. package/data/build/dist/client/locales/terminalAuth.js +2 -2
  247. package/data/build/dist/client/locales/terminalAuth.js.map +1 -1
  248. package/data/build/dist/client/locales/usage.d.ts.map +1 -1
  249. package/data/build/dist/client/locales/usage.js +48 -0
  250. package/data/build/dist/client/locales/usage.js.map +1 -1
  251. package/data/build/dist/client/native-workspace-store.d.ts +10 -0
  252. package/data/build/dist/client/native-workspace-store.d.ts.map +1 -1
  253. package/data/build/dist/client/native-workspace-store.js +22 -1
  254. package/data/build/dist/client/native-workspace-store.js.map +1 -1
  255. package/data/build/dist/client/peer-host-color.d.ts +3 -0
  256. package/data/build/dist/client/peer-host-color.d.ts.map +1 -1
  257. package/data/build/dist/client/peer-host-color.js +16 -0
  258. package/data/build/dist/client/peer-host-color.js.map +1 -1
  259. package/data/build/dist/client/peer-host-file-links.d.ts +8 -0
  260. package/data/build/dist/client/peer-host-file-links.d.ts.map +1 -0
  261. package/data/build/dist/client/peer-host-file-links.js +43 -0
  262. package/data/build/dist/client/peer-host-file-links.js.map +1 -0
  263. package/data/build/dist/client/peer-host-management-api.d.ts +2 -1
  264. package/data/build/dist/client/peer-host-management-api.d.ts.map +1 -1
  265. package/data/build/dist/client/peer-host-management-api.js +2 -1
  266. package/data/build/dist/client/peer-host-management-api.js.map +1 -1
  267. package/data/build/dist/client/peer-host-native-projection.d.ts +20 -8
  268. package/data/build/dist/client/peer-host-native-projection.d.ts.map +1 -1
  269. package/data/build/dist/client/peer-host-native-projection.js +127 -15
  270. package/data/build/dist/client/peer-host-native-projection.js.map +1 -1
  271. package/data/build/dist/client/peer-host-native-store-projection.d.ts +2 -0
  272. package/data/build/dist/client/peer-host-native-store-projection.d.ts.map +1 -1
  273. package/data/build/dist/client/peer-host-native-store-projection.js +52 -13
  274. package/data/build/dist/client/peer-host-native-store-projection.js.map +1 -1
  275. package/data/build/dist/client/peer-host-reference-source.d.ts +18 -0
  276. package/data/build/dist/client/peer-host-reference-source.d.ts.map +1 -0
  277. package/data/build/dist/client/peer-host-reference-source.js +174 -0
  278. package/data/build/dist/client/peer-host-reference-source.js.map +1 -0
  279. package/data/build/dist/client/peer-host-remote-events.d.ts +48 -0
  280. package/data/build/dist/client/peer-host-remote-events.d.ts.map +1 -0
  281. package/data/build/dist/client/peer-host-remote-events.js +328 -0
  282. package/data/build/dist/client/peer-host-remote-events.js.map +1 -0
  283. package/data/build/dist/client/peer-host-scoped-client.d.ts +3 -0
  284. package/data/build/dist/client/peer-host-scoped-client.d.ts.map +1 -1
  285. package/data/build/dist/client/peer-host-scoped-client.js +5 -2
  286. package/data/build/dist/client/peer-host-scoped-client.js.map +1 -1
  287. package/data/build/dist/client/peer-host-workspace-tab.d.ts +2 -0
  288. package/data/build/dist/client/peer-host-workspace-tab.d.ts.map +1 -1
  289. package/data/build/dist/client/peer-host-workspace-tab.js +62 -29
  290. package/data/build/dist/client/peer-host-workspace-tab.js.map +1 -1
  291. package/data/build/dist/client/peer-host-workspace-tag.d.ts +5 -0
  292. package/data/build/dist/client/peer-host-workspace-tag.d.ts.map +1 -1
  293. package/data/build/dist/client/peer-host-workspace-tag.js +57 -14
  294. package/data/build/dist/client/peer-host-workspace-tag.js.map +1 -1
  295. package/data/build/dist/client/provider-icons.d.ts.map +1 -1
  296. package/data/build/dist/client/provider-icons.js +2 -1
  297. package/data/build/dist/client/provider-icons.js.map +1 -1
  298. package/data/build/dist/client/quick-phrase-slot.d.ts.map +1 -1
  299. package/data/build/dist/client/quick-phrase-slot.js +12 -11
  300. package/data/build/dist/client/quick-phrase-slot.js.map +1 -1
  301. package/data/build/dist/client/serial-polling.d.ts +1 -0
  302. package/data/build/dist/client/serial-polling.d.ts.map +1 -1
  303. package/data/build/dist/client/serial-polling.js +4 -2
  304. package/data/build/dist/client/serial-polling.js.map +1 -1
  305. package/data/build/dist/client/session-adapter-cache.d.ts +2 -0
  306. package/data/build/dist/client/session-adapter-cache.d.ts.map +1 -1
  307. package/data/build/dist/client/session-adapter-cache.js +11 -0
  308. package/data/build/dist/client/session-adapter-cache.js.map +1 -1
  309. package/data/build/dist/client/session-changed-files-view.d.ts +15 -0
  310. package/data/build/dist/client/session-changed-files-view.d.ts.map +1 -1
  311. package/data/build/dist/client/session-changed-files-view.js +73 -29
  312. package/data/build/dist/client/session-changed-files-view.js.map +1 -1
  313. package/data/build/dist/client/settings-controls.d.ts +29 -0
  314. package/data/build/dist/client/settings-controls.d.ts.map +1 -0
  315. package/data/build/dist/client/settings-controls.js +80 -0
  316. package/data/build/dist/client/settings-controls.js.map +1 -0
  317. package/data/build/dist/client/settings-section.d.ts.map +1 -1
  318. package/data/build/dist/client/settings-section.js +7 -11
  319. package/data/build/dist/client/settings-section.js.map +1 -1
  320. package/data/build/dist/client/skill-command.d.ts.map +1 -1
  321. package/data/build/dist/client/skill-command.js +2 -1
  322. package/data/build/dist/client/skill-command.js.map +1 -1
  323. package/data/build/dist/client/style.css +2561 -0
  324. package/data/build/dist/client/subagent-collapsed-lineage.d.ts +103 -0
  325. package/data/build/dist/client/subagent-collapsed-lineage.d.ts.map +1 -0
  326. package/data/build/dist/client/subagent-collapsed-lineage.js +664 -0
  327. package/data/build/dist/client/subagent-collapsed-lineage.js.map +1 -0
  328. package/data/build/dist/client/subscription-slot.d.ts +8 -2
  329. package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
  330. package/data/build/dist/client/subscription-slot.js +55 -34
  331. package/data/build/dist/client/subscription-slot.js.map +1 -1
  332. package/data/build/dist/client/terminal/ui.d.ts.map +1 -1
  333. package/data/build/dist/client/terminal/ui.js +26 -8
  334. package/data/build/dist/client/terminal/ui.js.map +1 -1
  335. package/data/build/dist/client/theme.d.ts +2 -0
  336. package/data/build/dist/client/theme.d.ts.map +1 -1
  337. package/data/build/dist/client/theme.js +20 -12
  338. package/data/build/dist/client/theme.js.map +1 -1
  339. package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
  340. package/data/build/dist/client/workspace-session-visibility-dom.js +22 -10
  341. package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
  342. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts +15 -0
  343. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts.map +1 -0
  344. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js +86 -0
  345. package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js.map +1 -0
  346. package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts +10 -0
  347. package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts.map +1 -0
  348. package/data/build/dist/dsh-capabilities/host/session-title-adapter.js +199 -0
  349. package/data/build/dist/dsh-capabilities/host/session-title-adapter.js.map +1 -0
  350. package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.d.ts +1 -1
  351. package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.d.ts.map +1 -1
  352. package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.js +8 -2
  353. package/data/build/dist/dsh-capabilities/host/sidebar-session-compat.js.map +1 -1
  354. package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
  355. package/data/build/dist/dsh-capabilities/matrix.js +13 -3
  356. package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
  357. package/data/build/dist/dsh-capabilities/routes.js +37 -3
  358. package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
  359. package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
  360. package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
  361. package/data/build/dist/dsh-capabilities/types.js.map +1 -1
  362. package/data/build/dist/host/avatar/materials.d.ts.map +1 -1
  363. package/data/build/dist/host/avatar/materials.js +3 -1
  364. package/data/build/dist/host/avatar/materials.js.map +1 -1
  365. package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +13 -0
  366. package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
  367. package/data/build/dist/host/cli-adapters/acp-cli-driver.js +136 -11
  368. package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
  369. package/data/build/dist/host/cli-adapters/claude-driver.js +1 -1
  370. package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
  371. package/data/build/dist/host/cli-adapters/codebuddy-driver.d.ts.map +1 -1
  372. package/data/build/dist/host/cli-adapters/codebuddy-driver.js +65 -31
  373. package/data/build/dist/host/cli-adapters/codebuddy-driver.js.map +1 -1
  374. package/data/build/dist/host/cli-adapters/codex-driver.d.ts +1 -0
  375. package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
  376. package/data/build/dist/host/cli-adapters/codex-driver.js +36 -9
  377. package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
  378. package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts +13 -0
  379. package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts.map +1 -0
  380. package/data/build/dist/host/cli-adapters/codex-file-citations.js +271 -0
  381. package/data/build/dist/host/cli-adapters/codex-file-citations.js.map +1 -0
  382. package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
  383. package/data/build/dist/host/cli-adapters/command-code-driver.js +136 -16
  384. package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
  385. package/data/build/dist/host/cli-adapters/delegate-dispatch.d.ts +4 -3
  386. package/data/build/dist/host/cli-adapters/delegate-dispatch.d.ts.map +1 -1
  387. package/data/build/dist/host/cli-adapters/delegate-dispatch.js +7 -6
  388. package/data/build/dist/host/cli-adapters/delegate-dispatch.js.map +1 -1
  389. package/data/build/dist/host/cli-adapters/doubao-app.d.ts +32 -11
  390. package/data/build/dist/host/cli-adapters/doubao-app.d.ts.map +1 -1
  391. package/data/build/dist/host/cli-adapters/doubao-app.js +195 -24
  392. package/data/build/dist/host/cli-adapters/doubao-app.js.map +1 -1
  393. package/data/build/dist/host/cli-adapters/doubao-driver.d.ts.map +1 -1
  394. package/data/build/dist/host/cli-adapters/doubao-driver.js +3 -1
  395. package/data/build/dist/host/cli-adapters/doubao-driver.js.map +1 -1
  396. package/data/build/dist/host/cli-adapters/dsh-config.d.ts +16 -0
  397. package/data/build/dist/host/cli-adapters/dsh-config.d.ts.map +1 -0
  398. package/data/build/dist/host/cli-adapters/dsh-config.js +153 -0
  399. package/data/build/dist/host/cli-adapters/dsh-config.js.map +1 -0
  400. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +2 -1
  401. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
  402. package/data/build/dist/host/cli-adapters/dsh-message-projector.js +16 -5
  403. package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
  404. package/data/build/dist/host/cli-adapters/dsh-tool-history.d.ts.map +1 -1
  405. package/data/build/dist/host/cli-adapters/dsh-tool-history.js +23 -3
  406. package/data/build/dist/host/cli-adapters/dsh-tool-history.js.map +1 -1
  407. package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
  408. package/data/build/dist/host/cli-adapters/feature.js +72 -28
  409. package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
  410. package/data/build/dist/host/cli-adapters/model-catalog.d.ts +1 -0
  411. package/data/build/dist/host/cli-adapters/model-catalog.d.ts.map +1 -1
  412. package/data/build/dist/host/cli-adapters/model-catalog.js +22 -0
  413. package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
  414. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts +24 -2
  415. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts.map +1 -1
  416. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js +113 -4
  417. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js.map +1 -1
  418. package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts +63 -18
  419. package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts.map +1 -1
  420. package/data/build/dist/host/cli-adapters/native-team-subagent.js +35 -1
  421. package/data/build/dist/host/cli-adapters/native-team-subagent.js.map +1 -1
  422. package/data/build/dist/host/cli-adapters/new-api-subscription.d.ts.map +1 -1
  423. package/data/build/dist/host/cli-adapters/new-api-subscription.js +2 -45
  424. package/data/build/dist/host/cli-adapters/new-api-subscription.js.map +1 -1
  425. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +6 -0
  426. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
  427. package/data/build/dist/host/cli-adapters/opencode-driver.js +10 -3
  428. package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
  429. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.d.ts.map +1 -1
  430. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +334 -62
  431. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js.map +1 -1
  432. package/data/build/dist/host/cli-adapters/pi-driver.d.ts.map +1 -1
  433. package/data/build/dist/host/cli-adapters/pi-driver.js +134 -14
  434. package/data/build/dist/host/cli-adapters/pi-driver.js.map +1 -1
  435. package/data/build/dist/host/cli-adapters/provider-subscription.d.ts +3 -0
  436. package/data/build/dist/host/cli-adapters/provider-subscription.d.ts.map +1 -1
  437. package/data/build/dist/host/cli-adapters/provider-subscription.js +13 -45
  438. package/data/build/dist/host/cli-adapters/provider-subscription.js.map +1 -1
  439. package/data/build/dist/host/cli-adapters/r4-subscription.d.ts +13 -0
  440. package/data/build/dist/host/cli-adapters/r4-subscription.d.ts.map +1 -0
  441. package/data/build/dist/host/cli-adapters/r4-subscription.js +111 -0
  442. package/data/build/dist/host/cli-adapters/r4-subscription.js.map +1 -0
  443. package/data/build/dist/host/cli-adapters/registry.d.ts +2 -0
  444. package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
  445. package/data/build/dist/host/cli-adapters/registry.js +14 -3
  446. package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
  447. package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts.map +1 -1
  448. package/data/build/dist/host/cli-adapters/stream-normalizer.js +7 -0
  449. package/data/build/dist/host/cli-adapters/stream-normalizer.js.map +1 -1
  450. package/data/build/dist/host/cli-adapters/subagent-tool.d.ts.map +1 -1
  451. package/data/build/dist/host/cli-adapters/subagent-tool.js +28 -7
  452. package/data/build/dist/host/cli-adapters/subagent-tool.js.map +1 -1
  453. package/data/build/dist/host/cli-bridge/bridge-server.d.ts +1 -0
  454. package/data/build/dist/host/cli-bridge/bridge-server.d.ts.map +1 -1
  455. package/data/build/dist/host/cli-bridge/bridge-server.js.map +1 -1
  456. package/data/build/dist/host/cli-bridge/command-code-mod.d.ts +24 -1
  457. package/data/build/dist/host/cli-bridge/command-code-mod.d.ts.map +1 -1
  458. package/data/build/dist/host/cli-bridge/command-code-mod.js +121 -23
  459. package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
  460. package/data/build/dist/host/cli-bridge/dispatch.d.ts.map +1 -1
  461. package/data/build/dist/host/cli-bridge/dispatch.js +26 -6
  462. package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
  463. package/data/build/dist/host/cli-bridge/injections.d.ts +45 -4
  464. package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
  465. package/data/build/dist/host/cli-bridge/injections.js +129 -14
  466. package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
  467. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +20 -5
  468. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
  469. package/data/build/dist/host/desktop-assistant/controller.d.ts +27 -2
  470. package/data/build/dist/host/desktop-assistant/controller.d.ts.map +1 -1
  471. package/data/build/dist/host/desktop-assistant/controller.js +197 -7
  472. package/data/build/dist/host/desktop-assistant/controller.js.map +1 -1
  473. package/data/build/dist/host/desktop-assistant/feature.d.ts.map +1 -1
  474. package/data/build/dist/host/desktop-assistant/feature.js +41 -4
  475. package/data/build/dist/host/desktop-assistant/feature.js.map +1 -1
  476. package/data/build/dist/host/desktop-assistant/launcher.d.ts.map +1 -1
  477. package/data/build/dist/host/desktop-assistant/launcher.js +3 -1
  478. package/data/build/dist/host/desktop-assistant/launcher.js.map +1 -1
  479. package/data/build/dist/host/desktop-assistant/mac-agent.d.ts.map +1 -1
  480. package/data/build/dist/host/desktop-assistant/mac-agent.js +41 -10
  481. package/data/build/dist/host/desktop-assistant/mac-agent.js.map +1 -1
  482. package/data/build/dist/host/desktop-assistant/notifications.d.ts +16 -0
  483. package/data/build/dist/host/desktop-assistant/notifications.d.ts.map +1 -0
  484. package/data/build/dist/host/desktop-assistant/notifications.js +45 -0
  485. package/data/build/dist/host/desktop-assistant/notifications.js.map +1 -0
  486. package/data/build/dist/host/desktop-assistant/win-agent.d.ts.map +1 -1
  487. package/data/build/dist/host/desktop-assistant/win-agent.js +95 -8
  488. package/data/build/dist/host/desktop-assistant/win-agent.js.map +1 -1
  489. package/data/build/dist/host/features/assistant-lifecycle-settings.js +1 -1
  490. package/data/build/dist/host/features/assistant-lifecycle-settings.js.map +1 -1
  491. package/data/build/dist/host/features/assistant-management-tools.d.ts +2 -1
  492. package/data/build/dist/host/features/assistant-management-tools.d.ts.map +1 -1
  493. package/data/build/dist/host/features/assistant-management-tools.js +10 -3
  494. package/data/build/dist/host/features/assistant-management-tools.js.map +1 -1
  495. package/data/build/dist/host/features/assistant-notification-events.d.ts +77 -0
  496. package/data/build/dist/host/features/assistant-notification-events.d.ts.map +1 -0
  497. package/data/build/dist/host/features/assistant-notification-events.js +574 -0
  498. package/data/build/dist/host/features/assistant-notification-events.js.map +1 -0
  499. package/data/build/dist/host/features/assistant-notification-source.d.ts +32 -0
  500. package/data/build/dist/host/features/assistant-notification-source.d.ts.map +1 -0
  501. package/data/build/dist/host/features/assistant-notification-source.js +101 -0
  502. package/data/build/dist/host/features/assistant-notification-source.js.map +1 -0
  503. package/data/build/dist/host/features/assistant-notification-stream.d.ts +26 -0
  504. package/data/build/dist/host/features/assistant-notification-stream.d.ts.map +1 -0
  505. package/data/build/dist/host/features/assistant-notification-stream.js +179 -0
  506. package/data/build/dist/host/features/assistant-notification-stream.js.map +1 -0
  507. package/data/build/dist/host/features/assistant-notifications.d.ts +78 -0
  508. package/data/build/dist/host/features/assistant-notifications.d.ts.map +1 -0
  509. package/data/build/dist/host/features/assistant-notifications.js +436 -0
  510. package/data/build/dist/host/features/assistant-notifications.js.map +1 -0
  511. package/data/build/dist/host/features/assistant-peer-notifications.d.ts +53 -0
  512. package/data/build/dist/host/features/assistant-peer-notifications.d.ts.map +1 -0
  513. package/data/build/dist/host/features/assistant-peer-notifications.js +197 -0
  514. package/data/build/dist/host/features/assistant-peer-notifications.js.map +1 -0
  515. package/data/build/dist/host/features/assistant-tts-service.d.ts.map +1 -1
  516. package/data/build/dist/host/features/assistant-tts-service.js +2 -2
  517. package/data/build/dist/host/features/assistant-tts-service.js.map +1 -1
  518. package/data/build/dist/host/features/assistant-voice-initialization.js +1 -1
  519. package/data/build/dist/host/features/assistant-voice-initialization.js.map +1 -1
  520. package/data/build/dist/host/features/git-management.js +2 -1
  521. package/data/build/dist/host/features/git-management.js.map +1 -1
  522. package/data/build/dist/host/features/global-voice-rpc.d.ts +2 -2
  523. package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
  524. package/data/build/dist/host/features/global-voice-rpc.js +179 -4
  525. package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
  526. package/data/build/dist/host/features/index.d.ts +1 -0
  527. package/data/build/dist/host/features/index.d.ts.map +1 -1
  528. package/data/build/dist/host/features/index.js +3 -0
  529. package/data/build/dist/host/features/index.js.map +1 -1
  530. package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
  531. package/data/build/dist/host/features/peer-host.js +193 -75
  532. package/data/build/dist/host/features/peer-host.js.map +1 -1
  533. package/data/build/dist/host/features/session-title-optimization.d.ts +5 -0
  534. package/data/build/dist/host/features/session-title-optimization.d.ts.map +1 -0
  535. package/data/build/dist/host/features/session-title-optimization.js +26 -0
  536. package/data/build/dist/host/features/session-title-optimization.js.map +1 -0
  537. package/data/build/dist/host/features/types.d.ts +9 -1
  538. package/data/build/dist/host/features/types.d.ts.map +1 -1
  539. package/data/build/dist/host/index.d.ts.map +1 -1
  540. package/data/build/dist/host/index.js +23 -1
  541. package/data/build/dist/host/index.js.map +1 -1
  542. package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
  543. package/data/build/dist/host/lan-access-dsh.js +9 -1
  544. package/data/build/dist/host/lan-access-dsh.js.map +1 -1
  545. package/data/build/dist/host/modules/peer-host/aggregated-host-transport.d.ts.map +1 -1
  546. package/data/build/dist/host/modules/peer-host/aggregated-host-transport.js +8 -2
  547. package/data/build/dist/host/modules/peer-host/aggregated-host-transport.js.map +1 -1
  548. package/data/build/dist/host/modules/peer-host/host-api-proxy-service.d.ts +5 -1
  549. package/data/build/dist/host/modules/peer-host/host-api-proxy-service.d.ts.map +1 -1
  550. package/data/build/dist/host/modules/peer-host/host-api-proxy-service.js +72 -23
  551. package/data/build/dist/host/modules/peer-host/host-api-proxy-service.js.map +1 -1
  552. package/data/build/dist/host/modules/peer-host/host-ws-proxy-service.d.ts.map +1 -1
  553. package/data/build/dist/host/modules/peer-host/host-ws-proxy-service.js +7 -5
  554. package/data/build/dist/host/modules/peer-host/host-ws-proxy-service.js.map +1 -1
  555. package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.d.ts +6 -1
  556. package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.d.ts.map +1 -1
  557. package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.js +7 -0
  558. package/data/build/dist/host/modules/peer-host/peer-host-aggregate-service.js.map +1 -1
  559. package/data/build/dist/host/modules/peer-host/peer-host-handshake.d.ts +2 -1
  560. package/data/build/dist/host/modules/peer-host/peer-host-handshake.d.ts.map +1 -1
  561. package/data/build/dist/host/modules/peer-host/peer-host-handshake.js +11 -10
  562. package/data/build/dist/host/modules/peer-host/peer-host-handshake.js.map +1 -1
  563. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +7 -1
  564. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
  565. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +63 -1
  566. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
  567. package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.d.ts +6 -3
  568. package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.d.ts.map +1 -1
  569. package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.js +92 -5
  570. package/data/build/dist/host/modules/peer-host/peer-host-native-protocol.js.map +1 -1
  571. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts +15 -0
  572. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts.map +1 -0
  573. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js +101 -0
  574. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js.map +1 -0
  575. package/data/build/dist/host/modules/peer-host/peer-host-native-transport.d.ts.map +1 -1
  576. package/data/build/dist/host/modules/peer-host/peer-host-native-transport.js +44 -11
  577. package/data/build/dist/host/modules/peer-host/peer-host-native-transport.js.map +1 -1
  578. package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.d.ts.map +1 -1
  579. package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.js +75 -20
  580. package/data/build/dist/host/modules/peer-host/peer-host-remote-summary-source.js.map +1 -1
  581. package/data/build/dist/host/modules/peer-host/peer-host-request-errors.d.ts +31 -0
  582. package/data/build/dist/host/modules/peer-host/peer-host-request-errors.d.ts.map +1 -0
  583. package/data/build/dist/host/modules/peer-host/peer-host-request-errors.js +60 -0
  584. package/data/build/dist/host/modules/peer-host/peer-host-request-errors.js.map +1 -0
  585. package/data/build/dist/host/modules/peer-host/peer-host-session.d.ts +12 -4
  586. package/data/build/dist/host/modules/peer-host/peer-host-session.d.ts.map +1 -1
  587. package/data/build/dist/host/modules/peer-host/peer-host-session.js +28 -18
  588. package/data/build/dist/host/modules/peer-host/peer-host-session.js.map +1 -1
  589. package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.d.ts +1 -1
  590. package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.d.ts.map +1 -1
  591. package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.js +15 -4
  592. package/data/build/dist/host/modules/peer-host/peer-host-virtual-registry.js.map +1 -1
  593. package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.d.ts +22 -0
  594. package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.d.ts.map +1 -0
  595. package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.js +133 -0
  596. package/data/build/dist/host/modules/peer-host/peer-host-workspace-cache.js.map +1 -0
  597. package/data/build/dist/host/native-session-bridge.d.ts +2 -0
  598. package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
  599. package/data/build/dist/host/native-session-bridge.js +89 -9
  600. package/data/build/dist/host/native-session-bridge.js.map +1 -1
  601. package/data/build/dist/host/rpc.d.ts.map +1 -1
  602. package/data/build/dist/host/rpc.js +11 -2
  603. package/data/build/dist/host/rpc.js.map +1 -1
  604. package/data/build/dist/host/settings.d.ts.map +1 -1
  605. package/data/build/dist/host/settings.js +14 -3
  606. package/data/build/dist/host/settings.js.map +1 -1
  607. package/data/build/dist/host/terminal/controller-factory.d.ts +1 -0
  608. package/data/build/dist/host/terminal/controller-factory.d.ts.map +1 -1
  609. package/data/build/dist/host/terminal/controller-factory.js +3 -0
  610. package/data/build/dist/host/terminal/controller-factory.js.map +1 -1
  611. package/data/build/dist/host/terminal/startup.d.ts +3 -0
  612. package/data/build/dist/host/terminal/startup.d.ts.map +1 -1
  613. package/data/build/dist/host/terminal/startup.js +1 -0
  614. package/data/build/dist/host/terminal/startup.js.map +1 -1
  615. package/data/build/dist/host/terminal/terminal-controller.d.ts +8 -0
  616. package/data/build/dist/host/terminal/terminal-controller.d.ts.map +1 -1
  617. package/data/build/dist/host/terminal/terminal-controller.js +2 -1
  618. package/data/build/dist/host/terminal/terminal-controller.js.map +1 -1
  619. package/data/build/dist/shared/assistant-avatar-adapters.d.ts.map +1 -1
  620. package/data/build/dist/shared/assistant-avatar-adapters.js +3 -0
  621. package/data/build/dist/shared/assistant-avatar-adapters.js.map +1 -1
  622. package/data/build/dist/shared/assistant-avatar.d.ts +11 -1
  623. package/data/build/dist/shared/assistant-avatar.d.ts.map +1 -1
  624. package/data/build/dist/shared/assistant-avatar.js +31 -1
  625. package/data/build/dist/shared/assistant-avatar.js.map +1 -1
  626. package/data/build/dist/shared/assistant-message-timeline.d.ts +11 -0
  627. package/data/build/dist/shared/assistant-message-timeline.d.ts.map +1 -1
  628. package/data/build/dist/shared/assistant-message-timeline.js +19 -0
  629. package/data/build/dist/shared/assistant-message-timeline.js.map +1 -1
  630. package/data/build/dist/shared/assistant-notification-feed.d.ts +44 -0
  631. package/data/build/dist/shared/assistant-notification-feed.d.ts.map +1 -0
  632. package/data/build/dist/shared/assistant-notification-feed.js +88 -0
  633. package/data/build/dist/shared/assistant-notification-feed.js.map +1 -0
  634. package/data/build/dist/shared/assistant-notifications.d.ts +141 -0
  635. package/data/build/dist/shared/assistant-notifications.d.ts.map +1 -0
  636. package/data/build/dist/shared/assistant-notifications.js +32 -0
  637. package/data/build/dist/shared/assistant-notifications.js.map +1 -0
  638. package/data/build/dist/shared/assistant-session-messages.d.ts +13 -0
  639. package/data/build/dist/shared/assistant-session-messages.d.ts.map +1 -0
  640. package/data/build/dist/shared/assistant-session-messages.js +155 -0
  641. package/data/build/dist/shared/assistant-session-messages.js.map +1 -0
  642. package/data/build/dist/shared/assistant-tts.js +1 -1
  643. package/data/build/dist/shared/contracts/assistant.d.ts +13 -0
  644. package/data/build/dist/shared/contracts/assistant.d.ts.map +1 -1
  645. package/data/build/dist/shared/contracts/cli-adapter.d.ts +5 -1
  646. package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
  647. package/data/build/dist/shared/contracts/config.d.ts +5 -0
  648. package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
  649. package/data/build/dist/shared/contracts/config.js +3 -0
  650. package/data/build/dist/shared/contracts/config.js.map +1 -1
  651. package/data/build/dist/shared/contracts/errors.d.ts +2 -2
  652. package/data/build/dist/shared/contracts/peer-host.d.ts +15 -0
  653. package/data/build/dist/shared/contracts/peer-host.d.ts.map +1 -1
  654. package/data/build/dist/shared/contracts/peer-host.js.map +1 -1
  655. package/data/build/dist/shared/contracts/subscription.d.ts +31 -0
  656. package/data/build/dist/shared/contracts/subscription.d.ts.map +1 -1
  657. package/data/build/dist/shared/contracts/subscription.js.map +1 -1
  658. package/data/build/dist/shared/contracts/version.d.ts +12 -8
  659. package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
  660. package/data/build/dist/shared/contracts/version.js +11 -7
  661. package/data/build/dist/shared/contracts/version.js.map +1 -1
  662. package/data/build/dist/shared/desktop-assistant.d.ts +74 -1
  663. package/data/build/dist/shared/desktop-assistant.d.ts.map +1 -1
  664. package/data/build/dist/shared/desktop-assistant.js +201 -2
  665. package/data/build/dist/shared/desktop-assistant.js.map +1 -1
  666. package/data/build/dist/shared/index.d.ts +2 -2
  667. package/data/build/dist/shared/index.d.ts.map +1 -1
  668. package/data/build/dist/shared/index.js.map +1 -1
  669. package/data/build/dist/shared/peer-host-file-location.d.ts +11 -0
  670. package/data/build/dist/shared/peer-host-file-location.d.ts.map +1 -0
  671. package/data/build/dist/shared/peer-host-file-location.js +20 -0
  672. package/data/build/dist/shared/peer-host-file-location.js.map +1 -0
  673. package/data/build/dist/shared/peer-host-http-routes.d.ts +10 -0
  674. package/data/build/dist/shared/peer-host-http-routes.d.ts.map +1 -1
  675. package/data/build/dist/shared/peer-host-http-routes.js +7 -1
  676. package/data/build/dist/shared/peer-host-http-routes.js.map +1 -1
  677. package/data/build/dist/shared/provider-icon-resources.d.ts.map +1 -1
  678. package/data/build/dist/shared/provider-icon-resources.js +1 -0
  679. package/data/build/dist/shared/provider-icon-resources.js.map +1 -1
  680. package/data/build/dist/shared/session-reference.d.ts +11 -0
  681. package/data/build/dist/shared/session-reference.d.ts.map +1 -0
  682. package/data/build/dist/shared/session-reference.js +29 -0
  683. package/data/build/dist/shared/session-reference.js.map +1 -0
  684. package/data/build/dist/shared/session-title.d.ts +12 -0
  685. package/data/build/dist/shared/session-title.d.ts.map +1 -0
  686. package/data/build/dist/shared/session-title.js +65 -0
  687. package/data/build/dist/shared/session-title.js.map +1 -0
  688. package/data/build/dist/shared/voice-initialization.d.ts +1 -1
  689. package/data/build/dist/shared/voice-initialization.d.ts.map +1 -1
  690. package/data/build/dist/shared/voice-initialization.js +1 -1
  691. package/data/build/dist/shared/voice-initialization.js.map +1 -1
  692. package/data/build/dist/shared/voice-models.d.ts +2 -2
  693. package/data/build/dist/shared/voice-models.d.ts.map +1 -1
  694. package/data/build/dist/shared/voice-models.js +9 -9
  695. package/data/build/dist/shared/voice-models.js.map +1 -1
  696. package/data/build/dist/typert.host.d.ts +18 -1
  697. package/data/build/dist/typert.host.d.ts.map +1 -1
  698. package/data/build/dist/typert.host.js +28 -3
  699. package/data/build/dist/typert.host.js.map +1 -1
  700. package/data/build/dist/typert.notifications-client.d.ts +5 -0
  701. package/data/build/dist/typert.notifications-client.d.ts.map +1 -0
  702. package/data/build/dist/typert.notifications-client.js +7 -0
  703. package/data/build/dist/typert.notifications-client.js.map +1 -0
  704. package/data/build/dist/typert.remote-client.js +1 -1
  705. package/data/build/dist/typert.remote-client.js.map +1 -1
  706. package/package.json +41 -33
  707. package/profile/README.md +2 -2
  708. package/profile/package.json +3 -3
  709. package/profile/version.json +3 -3
  710. package/version.json +3 -3
  711. 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
- const tag = startPeerHostWorkspaceTag();
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
- if (transport?.setAggregate(aggregate, refreshedOrder) === true) {
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 fetchImpl = typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : undefined;
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) : rewriteDebugPayload(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 (isDebugPluginEndpoint(endpoint) && hasVirtualDebugScope(body) && scopeForPluginRequest(endpoint, body) === undefined) {
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
- if (method === 'session/create' || method === 'session/fork') {
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
- void Promise.resolve(requestPeerHostAggregateRefresh()).catch(() => undefined);
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
- // 本机流(含 $events 等非白名单流)必须回到 DSH Gateway:本地 baseline 不能
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
- if (fetchImpl === undefined)
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 ? hasVirtualDebugScope(value) : scope.targetHostId !== null;
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
- return scope !== undefined && scope.targetHostId !== null;
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
- // 一旦聚合确认,pending 记录立即清掉;之后远端删除会随下一次聚合重建自然移除。
621
- const now = Date.now();
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
- return projection.setAggregate(aggregate, orderedWorkspaceIds);
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 hasVirtualDebugScope(value) {
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 rewriteDebugPayload(value, scope) {
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('调试请求的 Workspace 与目标 Host 作用域不一致');
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('调试请求的 Session 与目标 Host 作用域不一致');
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 opened = () => resolve();
957
- const failed = () => reject(new Error('DSH Remote stream WebSocket 打开失败'));
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);