@jingyi0605/codingns4dsh 0.2.1-beta.12 → 0.2.1-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/README.en.md +5 -5
  2. package/README.md +6 -9
  3. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
  4. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts.map +1 -1
  5. package/data/build/dist/bootstrap/index.d.ts +1 -1
  6. package/data/build/dist/bootstrap/index.d.ts.map +1 -1
  7. package/data/build/dist/client/account-bar.d.ts.map +1 -1
  8. package/data/build/dist/client/account-bar.js +24 -70
  9. package/data/build/dist/client/account-bar.js.map +1 -1
  10. package/data/build/dist/client/adapter-catalog-watch.d.ts +1 -1
  11. package/data/build/dist/client/adapter-catalog-watch.d.ts.map +1 -1
  12. package/data/build/dist/client/adapter-catalog-watch.js +2 -2
  13. package/data/build/dist/client/adapter-catalog-watch.js.map +1 -1
  14. package/data/build/dist/client/bundle.js +40225 -25580
  15. package/data/build/dist/client/bundle.js.map +1 -1
  16. package/data/build/dist/client/cli-management-dialog.d.ts +21 -0
  17. package/data/build/dist/client/cli-management-dialog.d.ts.map +1 -0
  18. package/data/build/dist/client/cli-management-dialog.js +215 -0
  19. package/data/build/dist/client/cli-management-dialog.js.map +1 -0
  20. package/data/build/dist/client/cli-management-terminal.d.ts +9 -0
  21. package/data/build/dist/client/cli-management-terminal.d.ts.map +1 -0
  22. package/data/build/dist/client/cli-management-terminal.js +30 -0
  23. package/data/build/dist/client/cli-management-terminal.js.map +1 -0
  24. package/data/build/dist/client/cli-settings-dialog.d.ts +9 -0
  25. package/data/build/dist/client/cli-settings-dialog.d.ts.map +1 -0
  26. package/data/build/dist/client/cli-settings-dialog.js +45 -0
  27. package/data/build/dist/client/cli-settings-dialog.js.map +1 -0
  28. package/data/build/dist/client/cli-settings-rpc.js +1 -1
  29. package/data/build/dist/client/cli-settings-rpc.js.map +1 -1
  30. package/data/build/dist/client/cli-slots.d.ts +4 -0
  31. package/data/build/dist/client/cli-slots.d.ts.map +1 -1
  32. package/data/build/dist/client/cli-slots.js +26 -10
  33. package/data/build/dist/client/cli-slots.js.map +1 -1
  34. package/data/build/dist/client/client.editor-engine.js +4 -1
  35. package/data/build/dist/client/client.editor-engine.js.map +1 -1
  36. package/data/build/dist/client/client.model-catalog-cache.js +9 -1
  37. package/data/build/dist/client/client.model-catalog-cache.js.map +1 -1
  38. package/data/build/dist/client/client.native-workspace-store.js +9 -15
  39. package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
  40. package/data/build/dist/client/client.primitives-adapter.js +53 -0
  41. package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
  42. package/data/build/dist/client/client.session-translation.js +16 -0
  43. package/data/build/dist/client/client.session-translation.js.map +1 -1
  44. package/data/build/dist/client/client.transport.js +487 -44
  45. package/data/build/dist/client/client.transport.js.map +1 -1
  46. package/data/build/dist/client/conversation-translation-settings.d.ts +2 -1
  47. package/data/build/dist/client/conversation-translation-settings.d.ts.map +1 -1
  48. package/data/build/dist/client/conversation-translation-settings.js +7 -5
  49. package/data/build/dist/client/conversation-translation-settings.js.map +1 -1
  50. package/data/build/dist/client/desktop-assistant.js +595 -152
  51. package/data/build/dist/client/editor-engine.d.ts +1 -1
  52. package/data/build/dist/client/editor-engine.d.ts.map +1 -1
  53. package/data/build/dist/client/editor-engine.js +4 -1
  54. package/data/build/dist/client/editor-engine.js.map +1 -1
  55. package/data/build/dist/client/features/cli-adapters.d.ts +3 -1
  56. package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
  57. package/data/build/dist/client/features/cli-adapters.js +183 -105
  58. package/data/build/dist/client/features/cli-adapters.js.map +1 -1
  59. package/data/build/dist/client/features/file-management.d.ts.map +1 -1
  60. package/data/build/dist/client/features/file-management.js +2 -0
  61. package/data/build/dist/client/features/file-management.js.map +1 -1
  62. package/data/build/dist/client/features/index.d.ts.map +1 -1
  63. package/data/build/dist/client/features/index.js +2 -0
  64. package/data/build/dist/client/features/index.js.map +1 -1
  65. package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
  66. package/data/build/dist/client/features/mobile-access.js +7 -0
  67. package/data/build/dist/client/features/mobile-access.js.map +1 -1
  68. package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
  69. package/data/build/dist/client/features/peer-host.js +3 -0
  70. package/data/build/dist/client/features/peer-host.js.map +1 -1
  71. package/data/build/dist/client/features/quick-apps.d.ts +3 -0
  72. package/data/build/dist/client/features/quick-apps.d.ts.map +1 -0
  73. package/data/build/dist/client/features/quick-apps.js +14 -0
  74. package/data/build/dist/client/features/quick-apps.js.map +1 -0
  75. package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
  76. package/data/build/dist/client/features/workspace-session-enhancement.js +6 -0
  77. package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
  78. package/data/build/dist/client/git-management.d.ts.map +1 -1
  79. package/data/build/dist/client/git-management.js +11 -30
  80. package/data/build/dist/client/git-management.js.map +1 -1
  81. package/data/build/dist/client/git-panel-styles.d.ts +4 -0
  82. package/data/build/dist/client/git-panel-styles.d.ts.map +1 -1
  83. package/data/build/dist/client/git-panel-styles.js +14 -0
  84. package/data/build/dist/client/git-panel-styles.js.map +1 -1
  85. package/data/build/dist/client/html-workspace-files.d.ts +4 -0
  86. package/data/build/dist/client/html-workspace-files.d.ts.map +1 -0
  87. package/data/build/dist/client/html-workspace-files.js +114 -0
  88. package/data/build/dist/client/html-workspace-files.js.map +1 -0
  89. package/data/build/dist/client/locale.d.ts.map +1 -1
  90. package/data/build/dist/client/locale.js +14 -0
  91. package/data/build/dist/client/locale.js.map +1 -1
  92. package/data/build/dist/client/locales/cliManagement.d.ts +3 -0
  93. package/data/build/dist/client/locales/cliManagement.d.ts.map +1 -0
  94. package/data/build/dist/client/locales/cliManagement.js +155 -0
  95. package/data/build/dist/client/locales/cliManagement.js.map +1 -0
  96. package/data/build/dist/client/locales/fileWorkspace.d.ts.map +1 -1
  97. package/data/build/dist/client/locales/fileWorkspace.js +4 -0
  98. package/data/build/dist/client/locales/fileWorkspace.js.map +1 -1
  99. package/data/build/dist/client/locales/panels.js +2 -2
  100. package/data/build/dist/client/locales/panels.js.map +1 -1
  101. package/data/build/dist/client/locales/quickApps.d.ts +132 -0
  102. package/data/build/dist/client/locales/quickApps.d.ts.map +1 -0
  103. package/data/build/dist/client/locales/quickApps.js +154 -0
  104. package/data/build/dist/client/locales/quickApps.js.map +1 -0
  105. package/data/build/dist/client/mobile-team-panel-dom.d.ts +14 -0
  106. package/data/build/dist/client/mobile-team-panel-dom.d.ts.map +1 -0
  107. package/data/build/dist/client/mobile-team-panel-dom.js +164 -0
  108. package/data/build/dist/client/mobile-team-panel-dom.js.map +1 -0
  109. package/data/build/dist/client/native-model-translation-menu.d.ts.map +1 -1
  110. package/data/build/dist/client/native-model-translation-menu.js +3 -1
  111. package/data/build/dist/client/native-model-translation-menu.js.map +1 -1
  112. package/data/build/dist/client/provider-icons.d.ts.map +1 -1
  113. package/data/build/dist/client/provider-icons.js +3 -1
  114. package/data/build/dist/client/provider-icons.js.map +1 -1
  115. package/data/build/dist/client/quick-apps/browser-storage.d.ts +24 -0
  116. package/data/build/dist/client/quick-apps/browser-storage.d.ts.map +1 -0
  117. package/data/build/dist/client/quick-apps/browser-storage.js +114 -0
  118. package/data/build/dist/client/quick-apps/browser-storage.js.map +1 -0
  119. package/data/build/dist/client/quick-apps/client.d.ts +31 -0
  120. package/data/build/dist/client/quick-apps/client.d.ts.map +1 -0
  121. package/data/build/dist/client/quick-apps/client.js +68 -0
  122. package/data/build/dist/client/quick-apps/client.js.map +1 -0
  123. package/data/build/dist/client/quick-apps/document.d.ts +26 -0
  124. package/data/build/dist/client/quick-apps/document.d.ts.map +1 -0
  125. package/data/build/dist/client/quick-apps/document.js +110 -0
  126. package/data/build/dist/client/quick-apps/document.js.map +1 -0
  127. package/data/build/dist/client/quick-apps/file-picker.d.ts +14 -0
  128. package/data/build/dist/client/quick-apps/file-picker.d.ts.map +1 -0
  129. package/data/build/dist/client/quick-apps/file-picker.js +51 -0
  130. package/data/build/dist/client/quick-apps/file-picker.js.map +1 -0
  131. package/data/build/dist/client/quick-apps/launcher.d.ts +7 -0
  132. package/data/build/dist/client/quick-apps/launcher.d.ts.map +1 -0
  133. package/data/build/dist/client/quick-apps/launcher.js +252 -0
  134. package/data/build/dist/client/quick-apps/launcher.js.map +1 -0
  135. package/data/build/dist/client/quick-apps/presentation.d.ts +16 -0
  136. package/data/build/dist/client/quick-apps/presentation.d.ts.map +1 -0
  137. package/data/build/dist/client/quick-apps/presentation.js +31 -0
  138. package/data/build/dist/client/quick-apps/presentation.js.map +1 -0
  139. package/data/build/dist/client/quick-apps/reorder-animation.d.ts +6 -0
  140. package/data/build/dist/client/quick-apps/reorder-animation.d.ts.map +1 -0
  141. package/data/build/dist/client/quick-apps/reorder-animation.js +50 -0
  142. package/data/build/dist/client/quick-apps/reorder-animation.js.map +1 -0
  143. package/data/build/dist/client/quick-apps/reorder.d.ts +26 -0
  144. package/data/build/dist/client/quick-apps/reorder.d.ts.map +1 -0
  145. package/data/build/dist/client/quick-apps/reorder.js +128 -0
  146. package/data/build/dist/client/quick-apps/reorder.js.map +1 -0
  147. package/data/build/dist/client/quick-apps/styles.d.ts +3 -0
  148. package/data/build/dist/client/quick-apps/styles.d.ts.map +1 -0
  149. package/data/build/dist/client/quick-apps/styles.js +143 -0
  150. package/data/build/dist/client/quick-apps/styles.js.map +1 -0
  151. package/data/build/dist/client/quick-apps/ui.d.ts +20 -0
  152. package/data/build/dist/client/quick-apps/ui.d.ts.map +1 -0
  153. package/data/build/dist/client/quick-apps/ui.js +21 -0
  154. package/data/build/dist/client/quick-apps/ui.js.map +1 -0
  155. package/data/build/dist/client/quick-apps/viewer.d.ts +16 -0
  156. package/data/build/dist/client/quick-apps/viewer.d.ts.map +1 -0
  157. package/data/build/dist/client/quick-apps/viewer.js +165 -0
  158. package/data/build/dist/client/quick-apps/viewer.js.map +1 -0
  159. package/data/build/dist/client/quick-apps/workspace-picker.d.ts +19 -0
  160. package/data/build/dist/client/quick-apps/workspace-picker.d.ts.map +1 -0
  161. package/data/build/dist/client/quick-apps/workspace-picker.js +30 -0
  162. package/data/build/dist/client/quick-apps/workspace-picker.js.map +1 -0
  163. package/data/build/dist/client/session-translation-chat.d.ts +1 -1
  164. package/data/build/dist/client/session-translation-chat.d.ts.map +1 -1
  165. package/data/build/dist/client/session-translation-chat.js +26 -22
  166. package/data/build/dist/client/session-translation-chat.js.map +1 -1
  167. package/data/build/dist/client/sidebar-footer-style.d.ts +13 -0
  168. package/data/build/dist/client/sidebar-footer-style.d.ts.map +1 -0
  169. package/data/build/dist/client/sidebar-footer-style.js +54 -0
  170. package/data/build/dist/client/sidebar-footer-style.js.map +1 -0
  171. package/data/build/dist/client/style.css +219 -219
  172. package/data/build/dist/client/terminal/model.d.ts.map +1 -1
  173. package/data/build/dist/client/terminal/model.js +2 -1
  174. package/data/build/dist/client/terminal/model.js.map +1 -1
  175. package/data/build/dist/client/workspace-session-rightbar-dom.d.ts.map +1 -1
  176. package/data/build/dist/client/workspace-session-rightbar-dom.js +12 -21
  177. package/data/build/dist/client/workspace-session-rightbar-dom.js.map +1 -1
  178. package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
  179. package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
  180. package/data/build/dist/client/workspace-session-visibility-dom.js +5 -4
  181. package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
  182. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts +4 -0
  183. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts.map +1 -0
  184. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js +8 -0
  185. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js.map +1 -0
  186. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +18 -0
  187. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
  188. package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +21 -0
  189. package/data/build/dist/dsh-capabilities/client/primitives-adapter.js.map +1 -1
  190. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts +18 -0
  191. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts.map +1 -0
  192. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js +11 -0
  193. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js.map +1 -0
  194. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts +8 -0
  195. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -0
  196. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +100 -0
  197. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -0
  198. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts +3 -0
  199. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts.map +1 -0
  200. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js +22 -0
  201. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js.map +1 -0
  202. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts +52 -0
  203. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts.map +1 -0
  204. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js +109 -0
  205. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js.map +1 -0
  206. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts +11 -0
  207. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts.map +1 -0
  208. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js +97 -0
  209. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js.map +1 -0
  210. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts +36 -0
  211. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts.map +1 -0
  212. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js +164 -0
  213. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js.map +1 -0
  214. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts +44 -0
  215. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts.map +1 -0
  216. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js +240 -0
  217. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js.map +1 -0
  218. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts +37 -0
  219. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts.map +1 -0
  220. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js +35 -0
  221. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js.map +1 -0
  222. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts +13 -0
  223. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts.map +1 -0
  224. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js +30 -0
  225. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js.map +1 -0
  226. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts +21 -0
  227. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts.map +1 -0
  228. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js +132 -0
  229. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js.map +1 -0
  230. package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts +10 -0
  231. package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts.map +1 -0
  232. package/data/build/dist/dsh-capabilities/host/quick-app-transport.js +33 -0
  233. package/data/build/dist/dsh-capabilities/host/quick-app-transport.js.map +1 -0
  234. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +7 -0
  235. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -0
  236. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +18 -0
  237. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -0
  238. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts +13 -0
  239. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts.map +1 -0
  240. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js +24 -0
  241. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js.map +1 -0
  242. package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
  243. package/data/build/dist/dsh-capabilities/matrix.js +16 -8
  244. package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
  245. package/data/build/dist/dsh-capabilities/routes.d.ts +1 -0
  246. package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
  247. package/data/build/dist/dsh-capabilities/routes.js +27 -6
  248. package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
  249. package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
  250. package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
  251. package/data/build/dist/dsh-capabilities/types.js.map +1 -1
  252. package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
  253. package/data/build/dist/host/cli-adapters/acp-cli-driver.js +6 -3
  254. package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
  255. package/data/build/dist/host/cli-adapters/binary-detection.d.ts.map +1 -1
  256. package/data/build/dist/host/cli-adapters/binary-detection.js +7 -3
  257. package/data/build/dist/host/cli-adapters/binary-detection.js.map +1 -1
  258. package/data/build/dist/host/cli-adapters/claude-driver.d.ts +1 -0
  259. package/data/build/dist/host/cli-adapters/claude-driver.d.ts.map +1 -1
  260. package/data/build/dist/host/cli-adapters/claude-driver.js +183 -20
  261. package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
  262. package/data/build/dist/host/cli-adapters/codex-driver.d.ts +18 -0
  263. package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
  264. package/data/build/dist/host/cli-adapters/codex-driver.js +110 -11
  265. package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
  266. package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts +91 -0
  267. package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts.map +1 -0
  268. package/data/build/dist/host/cli-adapters/codex-performance-projection.js +8 -0
  269. package/data/build/dist/host/cli-adapters/codex-performance-projection.js.map +1 -0
  270. package/data/build/dist/host/cli-adapters/codex-performance.d.ts +16 -0
  271. package/data/build/dist/host/cli-adapters/codex-performance.d.ts.map +1 -0
  272. package/data/build/dist/host/cli-adapters/codex-performance.js +81 -0
  273. package/data/build/dist/host/cli-adapters/codex-performance.js.map +1 -0
  274. package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts.map +1 -1
  275. package/data/build/dist/host/cli-adapters/command-code-acp-loader.js +11 -1
  276. package/data/build/dist/host/cli-adapters/command-code-acp-loader.js.map +1 -1
  277. package/data/build/dist/host/cli-adapters/command-code-driver.js +3 -2
  278. package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
  279. package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts +3 -1
  280. package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts.map +1 -1
  281. package/data/build/dist/host/cli-adapters/desktop-app-runtime.js +41 -4
  282. package/data/build/dist/host/cli-adapters/desktop-app-runtime.js.map +1 -1
  283. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
  284. package/data/build/dist/host/cli-adapters/dsh-message-projector.js +19 -5
  285. package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
  286. package/data/build/dist/host/cli-adapters/dsh-virtual-providers.d.ts.map +1 -1
  287. package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js +3 -2
  288. package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js.map +1 -1
  289. package/data/build/dist/host/cli-adapters/feature.d.ts +2 -0
  290. package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
  291. package/data/build/dist/host/cli-adapters/feature.js +164 -34
  292. package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
  293. package/data/build/dist/host/cli-adapters/gemini-driver.d.ts.map +1 -1
  294. package/data/build/dist/host/cli-adapters/gemini-driver.js +4 -2
  295. package/data/build/dist/host/cli-adapters/gemini-driver.js.map +1 -1
  296. package/data/build/dist/host/cli-adapters/grok-driver.d.ts +6 -0
  297. package/data/build/dist/host/cli-adapters/grok-driver.d.ts.map +1 -1
  298. package/data/build/dist/host/cli-adapters/grok-driver.js +327 -30
  299. package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
  300. package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts +123 -0
  301. package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts.map +1 -0
  302. package/data/build/dist/host/cli-adapters/grok-performance-projection.js +48 -0
  303. package/data/build/dist/host/cli-adapters/grok-performance-projection.js.map +1 -0
  304. package/data/build/dist/host/cli-adapters/grok-usage.d.ts +45 -0
  305. package/data/build/dist/host/cli-adapters/grok-usage.d.ts.map +1 -0
  306. package/data/build/dist/host/cli-adapters/grok-usage.js +197 -0
  307. package/data/build/dist/host/cli-adapters/grok-usage.js.map +1 -0
  308. package/data/build/dist/host/cli-adapters/legacy-session-adapter.d.ts.map +1 -1
  309. package/data/build/dist/host/cli-adapters/legacy-session-adapter.js +20 -3
  310. package/data/build/dist/host/cli-adapters/legacy-session-adapter.js.map +1 -1
  311. package/data/build/dist/host/cli-adapters/management-installation.d.ts +5 -0
  312. package/data/build/dist/host/cli-adapters/management-installation.d.ts.map +1 -0
  313. package/data/build/dist/host/cli-adapters/management-installation.js +131 -0
  314. package/data/build/dist/host/cli-adapters/management-installation.js.map +1 -0
  315. package/data/build/dist/host/cli-adapters/management-methods.d.ts +37 -0
  316. package/data/build/dist/host/cli-adapters/management-methods.d.ts.map +1 -0
  317. package/data/build/dist/host/cli-adapters/management-methods.js +144 -0
  318. package/data/build/dist/host/cli-adapters/management-methods.js.map +1 -0
  319. package/data/build/dist/host/cli-adapters/management-process.d.ts +7 -0
  320. package/data/build/dist/host/cli-adapters/management-process.d.ts.map +1 -0
  321. package/data/build/dist/host/cli-adapters/management-process.js +62 -0
  322. package/data/build/dist/host/cli-adapters/management-process.js.map +1 -0
  323. package/data/build/dist/host/cli-adapters/management.d.ts +32 -0
  324. package/data/build/dist/host/cli-adapters/management.d.ts.map +1 -0
  325. package/data/build/dist/host/cli-adapters/management.js +177 -0
  326. package/data/build/dist/host/cli-adapters/management.js.map +1 -0
  327. package/data/build/dist/host/cli-adapters/mcode-driver.d.ts.map +1 -1
  328. package/data/build/dist/host/cli-adapters/mcode-driver.js +11 -4
  329. package/data/build/dist/host/cli-adapters/mcode-driver.js.map +1 -1
  330. package/data/build/dist/host/cli-adapters/model-catalog.d.ts +1 -0
  331. package/data/build/dist/host/cli-adapters/model-catalog.d.ts.map +1 -1
  332. package/data/build/dist/host/cli-adapters/model-catalog.js +62 -0
  333. package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
  334. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts +1 -1
  335. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts.map +1 -1
  336. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js +11 -3
  337. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js.map +1 -1
  338. package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts +7 -1
  339. package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts.map +1 -1
  340. package/data/build/dist/host/cli-adapters/native-team-subagent.js +4 -2
  341. package/data/build/dist/host/cli-adapters/native-team-subagent.js.map +1 -1
  342. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +22 -0
  343. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
  344. package/data/build/dist/host/cli-adapters/opencode-driver.js +105 -17
  345. package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
  346. package/data/build/dist/host/cli-adapters/process-utils.d.ts +2 -0
  347. package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
  348. package/data/build/dist/host/cli-adapters/process-utils.js +16 -11
  349. package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
  350. package/data/build/dist/host/cli-adapters/registry.d.ts +7 -1
  351. package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
  352. package/data/build/dist/host/cli-adapters/registry.js +98 -30
  353. package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
  354. package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts +74 -0
  355. package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts.map +1 -0
  356. package/data/build/dist/host/cli-adapters/session-performance-projection.js +83 -0
  357. package/data/build/dist/host/cli-adapters/session-performance-projection.js.map +1 -0
  358. package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts.map +1 -1
  359. package/data/build/dist/host/cli-adapters/standard-stream-driver.js +4 -0
  360. package/data/build/dist/host/cli-adapters/standard-stream-driver.js.map +1 -1
  361. package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts +3 -1
  362. package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts.map +1 -1
  363. package/data/build/dist/host/cli-adapters/stream-normalizer.js +2 -0
  364. package/data/build/dist/host/cli-adapters/stream-normalizer.js.map +1 -1
  365. package/data/build/dist/host/cli-adapters/subagent-tool.js +1 -1
  366. package/data/build/dist/host/cli-adapters/subagent-tool.js.map +1 -1
  367. package/data/build/dist/host/cli-adapters/team-input.d.ts +17 -0
  368. package/data/build/dist/host/cli-adapters/team-input.d.ts.map +1 -0
  369. package/data/build/dist/host/cli-adapters/team-input.js +67 -0
  370. package/data/build/dist/host/cli-adapters/team-input.js.map +1 -0
  371. package/data/build/dist/host/cli-adapters/update-check.d.ts +34 -0
  372. package/data/build/dist/host/cli-adapters/update-check.d.ts.map +1 -0
  373. package/data/build/dist/host/cli-adapters/update-check.js +263 -0
  374. package/data/build/dist/host/cli-adapters/update-check.js.map +1 -0
  375. package/data/build/dist/host/cli-adapters/zcode-driver.d.ts.map +1 -1
  376. package/data/build/dist/host/cli-adapters/zcode-driver.js +6 -1
  377. package/data/build/dist/host/cli-adapters/zcode-driver.js.map +1 -1
  378. package/data/build/dist/host/cli-adapters/zcode-update.d.ts +8 -0
  379. package/data/build/dist/host/cli-adapters/zcode-update.d.ts.map +1 -0
  380. package/data/build/dist/host/cli-adapters/zcode-update.js +149 -0
  381. package/data/build/dist/host/cli-adapters/zcode-update.js.map +1 -0
  382. package/data/build/dist/host/cli-bridge/bridge-holder.d.ts +14 -0
  383. package/data/build/dist/host/cli-bridge/bridge-holder.d.ts.map +1 -1
  384. package/data/build/dist/host/cli-bridge/bridge-holder.js +53 -6
  385. package/data/build/dist/host/cli-bridge/bridge-holder.js.map +1 -1
  386. package/data/build/dist/host/cli-bridge/bridge-server.d.ts +4 -0
  387. package/data/build/dist/host/cli-bridge/bridge-server.d.ts.map +1 -1
  388. package/data/build/dist/host/cli-bridge/bridge-server.js +34 -6
  389. package/data/build/dist/host/cli-bridge/bridge-server.js.map +1 -1
  390. package/data/build/dist/host/cli-bridge/command-code-mod.d.ts.map +1 -1
  391. package/data/build/dist/host/cli-bridge/command-code-mod.js +43 -0
  392. package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
  393. package/data/build/dist/host/cli-bridge/dispatch.js +1 -1
  394. package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
  395. package/data/build/dist/host/cli-bridge/injections.d.ts +3 -0
  396. package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
  397. package/data/build/dist/host/cli-bridge/injections.js +23 -7
  398. package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
  399. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +22 -3
  400. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
  401. package/data/build/dist/host/cli-bridge/team-adapters.d.ts +11 -0
  402. package/data/build/dist/host/cli-bridge/team-adapters.d.ts.map +1 -0
  403. package/data/build/dist/host/cli-bridge/team-adapters.js +22 -0
  404. package/data/build/dist/host/cli-bridge/team-adapters.js.map +1 -0
  405. package/data/build/dist/host/cli-bridge/team-dispatch.d.ts +28 -0
  406. package/data/build/dist/host/cli-bridge/team-dispatch.d.ts.map +1 -0
  407. package/data/build/dist/host/cli-bridge/team-dispatch.js +208 -0
  408. package/data/build/dist/host/cli-bridge/team-dispatch.js.map +1 -0
  409. package/data/build/dist/host/cli-bridge/team-tool.d.ts +3 -0
  410. package/data/build/dist/host/cli-bridge/team-tool.d.ts.map +1 -0
  411. package/data/build/dist/host/cli-bridge/team-tool.js +18 -0
  412. package/data/build/dist/host/cli-bridge/team-tool.js.map +1 -0
  413. package/data/build/dist/host/features/file-management.d.ts.map +1 -1
  414. package/data/build/dist/host/features/file-management.js +8 -0
  415. package/data/build/dist/host/features/file-management.js.map +1 -1
  416. package/data/build/dist/host/features/index.d.ts.map +1 -1
  417. package/data/build/dist/host/features/index.js +2 -0
  418. package/data/build/dist/host/features/index.js.map +1 -1
  419. package/data/build/dist/host/features/lan-access-dsh.js +1 -1
  420. package/data/build/dist/host/features/lan-access-dsh.js.map +1 -1
  421. package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
  422. package/data/build/dist/host/features/peer-host.js +7 -0
  423. package/data/build/dist/host/features/peer-host.js.map +1 -1
  424. package/data/build/dist/host/features/quick-apps.d.ts +4 -0
  425. package/data/build/dist/host/features/quick-apps.d.ts.map +1 -0
  426. package/data/build/dist/host/features/quick-apps.js +158 -0
  427. package/data/build/dist/host/features/quick-apps.js.map +1 -0
  428. package/data/build/dist/host/features/session-prompt-translation.d.ts +1 -1
  429. package/data/build/dist/host/features/session-prompt-translation.d.ts.map +1 -1
  430. package/data/build/dist/host/features/session-prompt-translation.js +13 -4
  431. package/data/build/dist/host/features/session-prompt-translation.js.map +1 -1
  432. package/data/build/dist/host/features/session-translation-protection.d.ts +6 -0
  433. package/data/build/dist/host/features/session-translation-protection.d.ts.map +1 -1
  434. package/data/build/dist/host/features/session-translation-protection.js +21 -0
  435. package/data/build/dist/host/features/session-translation-protection.js.map +1 -1
  436. package/data/build/dist/host/features/session-translation-recovery.d.ts +3 -2
  437. package/data/build/dist/host/features/session-translation-recovery.d.ts.map +1 -1
  438. package/data/build/dist/host/features/session-translation-recovery.js +6 -3
  439. package/data/build/dist/host/features/session-translation-recovery.js.map +1 -1
  440. package/data/build/dist/host/features/session-translation-service.d.ts +3 -0
  441. package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
  442. package/data/build/dist/host/features/session-translation-service.js +14 -8
  443. package/data/build/dist/host/features/session-translation-service.js.map +1 -1
  444. package/data/build/dist/host/features/types.d.ts +10 -0
  445. package/data/build/dist/host/features/types.d.ts.map +1 -1
  446. package/data/build/dist/host/html-workspace-files.d.ts +3 -0
  447. package/data/build/dist/host/html-workspace-files.d.ts.map +1 -0
  448. package/data/build/dist/host/html-workspace-files.js +135 -0
  449. package/data/build/dist/host/html-workspace-files.js.map +1 -0
  450. package/data/build/dist/host/index.d.ts.map +1 -1
  451. package/data/build/dist/host/index.js +27 -2
  452. package/data/build/dist/host/index.js.map +1 -1
  453. package/data/build/dist/host/lan-access-dsh.d.ts +5 -1
  454. package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
  455. package/data/build/dist/host/lan-access-dsh.js +43 -2
  456. package/data/build/dist/host/lan-access-dsh.js.map +1 -1
  457. package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts +5 -0
  458. package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts.map +1 -0
  459. package/data/build/dist/host/modules/peer-host/quick-app-gateway.js +27 -0
  460. package/data/build/dist/host/modules/peer-host/quick-app-gateway.js.map +1 -0
  461. package/data/build/dist/host/modules/quick-apps/browse.d.ts +5 -0
  462. package/data/build/dist/host/modules/quick-apps/browse.d.ts.map +1 -0
  463. package/data/build/dist/host/modules/quick-apps/browse.js +37 -0
  464. package/data/build/dist/host/modules/quick-apps/browse.js.map +1 -0
  465. package/data/build/dist/host/modules/quick-apps/code-revision.d.ts +4 -0
  466. package/data/build/dist/host/modules/quick-apps/code-revision.d.ts.map +1 -0
  467. package/data/build/dist/host/modules/quick-apps/code-revision.js +39 -0
  468. package/data/build/dist/host/modules/quick-apps/code-revision.js.map +1 -0
  469. package/data/build/dist/host/modules/quick-apps/documents.d.ts +14 -0
  470. package/data/build/dist/host/modules/quick-apps/documents.d.ts.map +1 -0
  471. package/data/build/dist/host/modules/quick-apps/documents.js +87 -0
  472. package/data/build/dist/host/modules/quick-apps/documents.js.map +1 -0
  473. package/data/build/dist/host/modules/quick-apps/errors.d.ts +8 -0
  474. package/data/build/dist/host/modules/quick-apps/errors.d.ts.map +1 -0
  475. package/data/build/dist/host/modules/quick-apps/errors.js +15 -0
  476. package/data/build/dist/host/modules/quick-apps/errors.js.map +1 -0
  477. package/data/build/dist/host/modules/quick-apps/file-api.d.ts +30 -0
  478. package/data/build/dist/host/modules/quick-apps/file-api.d.ts.map +1 -0
  479. package/data/build/dist/host/modules/quick-apps/file-api.js +149 -0
  480. package/data/build/dist/host/modules/quick-apps/file-api.js.map +1 -0
  481. package/data/build/dist/host/modules/quick-apps/launches.d.ts +35 -0
  482. package/data/build/dist/host/modules/quick-apps/launches.d.ts.map +1 -0
  483. package/data/build/dist/host/modules/quick-apps/launches.js +80 -0
  484. package/data/build/dist/host/modules/quick-apps/launches.js.map +1 -0
  485. package/data/build/dist/host/modules/quick-apps/paths.d.ts +14 -0
  486. package/data/build/dist/host/modules/quick-apps/paths.d.ts.map +1 -0
  487. package/data/build/dist/host/modules/quick-apps/paths.js +72 -0
  488. package/data/build/dist/host/modules/quick-apps/paths.js.map +1 -0
  489. package/data/build/dist/host/modules/quick-apps/registry.d.ts +30 -0
  490. package/data/build/dist/host/modules/quick-apps/registry.d.ts.map +1 -0
  491. package/data/build/dist/host/modules/quick-apps/registry.js +186 -0
  492. package/data/build/dist/host/modules/quick-apps/registry.js.map +1 -0
  493. package/data/build/dist/host/modules/quick-apps/remote.d.ts +38 -0
  494. package/data/build/dist/host/modules/quick-apps/remote.d.ts.map +1 -0
  495. package/data/build/dist/host/modules/quick-apps/remote.js +238 -0
  496. package/data/build/dist/host/modules/quick-apps/remote.js.map +1 -0
  497. package/data/build/dist/host/modules/quick-apps/service.d.ts +27 -0
  498. package/data/build/dist/host/modules/quick-apps/service.d.ts.map +1 -0
  499. package/data/build/dist/host/modules/quick-apps/service.js +174 -0
  500. package/data/build/dist/host/modules/quick-apps/service.js.map +1 -0
  501. package/data/build/dist/host/modules/quick-apps/static-handler.d.ts +8 -0
  502. package/data/build/dist/host/modules/quick-apps/static-handler.d.ts.map +1 -0
  503. package/data/build/dist/host/modules/quick-apps/static-handler.js +190 -0
  504. package/data/build/dist/host/modules/quick-apps/static-handler.js.map +1 -0
  505. package/data/build/dist/host/native-session-bridge.d.ts +5 -0
  506. package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
  507. package/data/build/dist/host/native-session-bridge.js +3 -0
  508. package/data/build/dist/host/native-session-bridge.js.map +1 -1
  509. package/data/build/dist/host/rpc.d.ts.map +1 -1
  510. package/data/build/dist/host/rpc.js +8 -3
  511. package/data/build/dist/host/rpc.js.map +1 -1
  512. package/data/build/dist/host/session-migration-repair.js +48 -35
  513. package/data/build/dist/host/session-migration-repair.js.map +1 -1
  514. package/data/build/dist/host/settings.d.ts.map +1 -1
  515. package/data/build/dist/host/settings.js +13 -0
  516. package/data/build/dist/host/settings.js.map +1 -1
  517. package/data/build/dist/host/workspace-file-mutations.d.ts +2 -0
  518. package/data/build/dist/host/workspace-file-mutations.d.ts.map +1 -0
  519. package/data/build/dist/host/workspace-file-mutations.js +15 -0
  520. package/data/build/dist/host/workspace-file-mutations.js.map +1 -0
  521. package/data/build/dist/shared/cli-provider-route.d.ts +7 -0
  522. package/data/build/dist/shared/cli-provider-route.d.ts.map +1 -0
  523. package/data/build/dist/shared/cli-provider-route.js +13 -0
  524. package/data/build/dist/shared/cli-provider-route.js.map +1 -0
  525. package/data/build/dist/shared/codex-performance.d.ts +3 -0
  526. package/data/build/dist/shared/codex-performance.d.ts.map +1 -0
  527. package/data/build/dist/shared/codex-performance.js +2 -0
  528. package/data/build/dist/shared/codex-performance.js.map +1 -0
  529. package/data/build/dist/shared/contracts/agent-team.d.ts +14 -0
  530. package/data/build/dist/shared/contracts/agent-team.d.ts.map +1 -0
  531. package/data/build/dist/shared/contracts/agent-team.js +48 -0
  532. package/data/build/dist/shared/contracts/agent-team.js.map +1 -0
  533. package/data/build/dist/shared/contracts/cli-adapter.d.ts +35 -0
  534. package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
  535. package/data/build/dist/shared/contracts/cli-management.d.ts +29 -0
  536. package/data/build/dist/shared/contracts/cli-management.d.ts.map +1 -0
  537. package/data/build/dist/shared/contracts/cli-management.js +2 -0
  538. package/data/build/dist/shared/contracts/cli-management.js.map +1 -0
  539. package/data/build/dist/shared/contracts/config.d.ts +2 -0
  540. package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
  541. package/data/build/dist/shared/contracts/config.js.map +1 -1
  542. package/data/build/dist/shared/contracts/errors.d.ts +2 -2
  543. package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
  544. package/data/build/dist/shared/contracts/quick-apps.d.ts +68 -0
  545. package/data/build/dist/shared/contracts/quick-apps.d.ts.map +1 -0
  546. package/data/build/dist/shared/contracts/quick-apps.js +4 -0
  547. package/data/build/dist/shared/contracts/quick-apps.js.map +1 -0
  548. package/data/build/dist/shared/contracts/session-translation.d.ts +8 -3
  549. package/data/build/dist/shared/contracts/session-translation.d.ts.map +1 -1
  550. package/data/build/dist/shared/contracts/session-translation.js +14 -0
  551. package/data/build/dist/shared/contracts/session-translation.js.map +1 -1
  552. package/data/build/dist/shared/contracts/version.d.ts +9 -15
  553. package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
  554. package/data/build/dist/shared/contracts/version.js +8 -14
  555. package/data/build/dist/shared/contracts/version.js.map +1 -1
  556. package/data/build/dist/shared/peer-host-http-routes.d.ts +4 -0
  557. package/data/build/dist/shared/peer-host-http-routes.d.ts.map +1 -1
  558. package/data/build/dist/shared/peer-host-http-routes.js +4 -0
  559. package/data/build/dist/shared/peer-host-http-routes.js.map +1 -1
  560. package/data/build/dist/shared/quick-app-browser-storage.d.ts +33 -0
  561. package/data/build/dist/shared/quick-app-browser-storage.d.ts.map +1 -0
  562. package/data/build/dist/shared/quick-app-browser-storage.js +33 -0
  563. package/data/build/dist/shared/quick-app-browser-storage.js.map +1 -0
  564. package/data/build/dist/shared/quick-app-proxy-path.d.ts +6 -0
  565. package/data/build/dist/shared/quick-app-proxy-path.d.ts.map +1 -0
  566. package/data/build/dist/shared/quick-app-proxy-path.js +18 -0
  567. package/data/build/dist/shared/quick-app-proxy-path.js.map +1 -0
  568. package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts +9 -0
  569. package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts.map +1 -0
  570. package/data/build/dist/shared/quick-app-storage-bootstrap.js +186 -0
  571. package/data/build/dist/shared/quick-app-storage-bootstrap.js.map +1 -0
  572. package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts +7 -0
  573. package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts.map +1 -0
  574. package/data/build/dist/shared/quick-apps-bootstrap-locale.js +10 -0
  575. package/data/build/dist/shared/quick-apps-bootstrap-locale.js.map +1 -0
  576. package/data/build/dist/shared/request-performance.d.ts +15 -0
  577. package/data/build/dist/shared/request-performance.d.ts.map +1 -0
  578. package/data/build/dist/shared/request-performance.js +3 -0
  579. package/data/build/dist/shared/request-performance.js.map +1 -0
  580. package/package.json +32 -32
  581. package/profile/README.md +2 -2
  582. package/profile/package.json +3 -3
  583. package/profile/version.json +3 -3
  584. package/version.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"client.primitives-adapter.js","names":["createElement","primitives","value"],"sources":["../../../../src/shared/contracts/peer-host.ts","../../../../src/dsh-capabilities/client/primitives-adapter.ts"],"sourcesContent":["/** PeerHost 目标路由;短期 relay ticket 永远不属于持久配置。 */\nexport type PeerHostRoute =\n | {\n readonly kind: 'lan'\n readonly baseUrl: string\n readonly normalizedOrigin: string\n }\n | {\n readonly kind: 'relay'\n readonly deviceId: string\n readonly relayEntryId: string\n readonly transportVersion: string\n }\n\nexport type PeerHostStatus =\n | 'configured'\n | 'checking'\n | 'ready'\n | 'plugin_missing'\n | 'version_mismatch'\n | 'identity_changed'\n | 'session_required'\n | 'unreachable'\n | 'reconnecting'\n | 'disabled'\n\n/** Host 侧保存的 PeerHost 配置与脱敏握手状态。凭据不在此 DTO 中。 */\nexport interface PeerHostRecord {\n readonly id: string\n readonly ownerUserId: string\n readonly displayName: string\n readonly route: PeerHostRoute\n readonly status: PeerHostStatus\n readonly pluginId: string | null\n readonly pluginVersion: string | null\n readonly dshVersion: string | null\n /** 远端操作系统主机名;旧记录没有此字段时保持缺省。 */\n readonly hostname?: string | null\n /** 远端 DSH 配置文件名;只返回名称,不返回本地路径。 */\n readonly configProfile?: string | null\n readonly apiCompatibility: string | null\n readonly fingerprint: string | null\n readonly lastCheckedAt: number | null\n readonly lastErrorCode: PeerHostErrorCode | null\n /**\n * 工作区标签配色;缺省时客户端按名称推导稳定色。\n *\n * 颜色只影响本机侧栏标签,不参与握手、代理或目标 Host 的任何状态。\n */\n readonly color?: string | null\n /**\n * 用户显式添加的远端工作区 ID。\n *\n * 聚合摘要只投影这个集合内的远端工作区;缺省或空集合表示\"尚未显式添加任何\n * 远端工作区\",此时不展示该 Host 的任何工作区——这是默认行为,不是降级。\n */\n readonly visibleWorkspaceIds?: readonly string[]\n readonly createdAt: number\n readonly updatedAt: number\n}\n\n/** Client 管理面板可见的 PeerHost 摘要;仅暴露局域网地址,凭据和中转路由详情仍留在 Host。 */\nexport type PeerHostClientRoute =\n | { readonly kind: 'lan'; readonly baseUrl?: string }\n | { readonly kind: 'relay' }\n\nexport type PeerHostClientRecord = Omit<PeerHostRecord, 'route'> & {\n readonly route: PeerHostClientRoute\n}\n\n/** Client 可见的 PeerHost 诊断快照;不包含完整路由、凭据或正文。 */\nexport interface PeerHostDiagnosticSnapshot {\n readonly peerHostId: string\n readonly routeKind: 'lan' | 'relay'\n readonly status: PeerHostStatus\n readonly lastErrorCode: PeerHostErrorCode | null\n readonly lastCheckedAt: number | null\n readonly fingerprint: string | null\n}\n\n/** 当前 Host 插件自有 WebSocket 入口;不包含任何目标 Host 地址或凭据。 */\nexport interface PeerHostWebSocketEndpoint {\n readonly host: string\n readonly port: number\n readonly path: string\n}\n\n/** 所有跨 Host 资源共用的完整作用域。 */\nexport interface HostScope {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string | null\n readonly scopeGeneration: number\n}\n\n/** 只保留标题投影及远端原生序号,避免把实时标题降级为无法覆盖旧值的缓存。 */\nexport interface PeerHostSessionTitleProjection {\n readonly kind: 'cached' | 'sequenced'\n readonly asOfSeq: number\n readonly values: { readonly title: string | null }\n}\n\n/** 会话摘要只用于聚合导航,不包含历史消息或工具内容。 */\nexport interface PeerHostSessionRecord {\n readonly scope: HostScope\n readonly title: string\n /** 旧版摘要缺省;不得使用 updatedAt 伪造原生事件序号。 */\n readonly titleProjection?: PeerHostSessionTitleProjection\n readonly status: string\n /** 来自真实执行状态的证明;不能把导航层默认 idle 当作完成证明。 */\n readonly activity?: 'running' | 'idle' | 'unknown'\n readonly updatedAt: number\n /** DSH 原生会话是否仍处于待首条消息的临时状态。 */\n readonly blank: boolean\n /** 远端 CodingNS CLI 会话绑定的适配器;旧 Host 未提供时保持缺省。 */\n readonly adapterId?: string\n /** 子会话身份仅用于原生目录与路由,不改变工作区侧栏的可见会话。 */\n readonly origin?: 'subagent'\n readonly parentSessionId?: string\n}\n\n/** 当前 Host 和 PeerHost 统一使用的工作区摘要。 */\nexport interface AggregateWorkspaceSummary {\n readonly key: string\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly displayName: string\n /** 工作区在所属 Host 上的真实路径;原生文件面板等按路径解析,不能用 workspaceId 代替。 */\n readonly path: string\n readonly hostLabel: string\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly sessions: readonly PeerHostSessionRecord[]\n /**\n * 已归档会话。远端侧栏默认隐藏这些行,但归档入口、归档集合与取消归档路由\n * 仍需要它们;子代理会话在可见与归档两侧都不出现。\n */\n readonly archivedSessions?: readonly PeerHostSessionRecord[]\n /** 可见工作区下的子会话,进入状态和路由目录,但不占侧栏成员槽位。 */\n readonly subagentSessions?: readonly PeerHostSessionRecord[]\n}\n\nexport interface AggregateHostResult {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n /** 该 Host 工作区标签的配色;缺省时客户端按名称推导稳定色。 */\n readonly hostColor?: string | null\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly errorCode: PeerHostErrorCode | null\n /** 摘要能力不可用时保留可诊断原因,禁止以空工作区伪装成功。 */\n readonly diagnostic?: string\n readonly workspaces: readonly AggregateWorkspaceSummary[]\n}\n\n/**\n * 工作区标签配色的取值范围。\n *\n * 只接受 `#rrggbb`:颜色会被写进本机侧栏 DOM 的内联样式,开放任意字符串\n * 等于把 CSS 注入面交给远端配置。\n */\nexport const PEER_HOST_COLOR_PATTERN = /^#[0-9a-f]{6}$/u\n\n/** 校验并归一化工作区标签配色;非法值返回 null,由消费方回退到推导色。 */\nexport function normalizePeerHostColor(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim().toLowerCase()\n return PEER_HOST_COLOR_PATTERN.test(trimmed) ? trimmed : null\n}\n\n/** 管理面板的默认配色候选;顺序即下拉顺序。 */\nexport const PEER_HOST_COLOR_PRESETS = Object.freeze([\n '#1677ff',\n '#722ed1',\n '#13c2c2',\n '#52c41a',\n '#fa8c16',\n '#eb2f96',\n '#f5222d',\n '#8c8c8c',\n] as const)\n\n/** Aggregated Host 只允许本地插件基线;远端不得提供 Manifest、Bundle 或 UI Slot。 */\nexport interface AggregatedHostLocalPluginBaseline {\n readonly pluginId: string\n readonly pluginVersion: string\n readonly manifestSource: 'local'\n readonly bundleSource: 'local'\n readonly uiSource: 'local'\n readonly allowRemoteManifest: false\n readonly allowRemoteBundle: false\n}\n\n/** 目标 Host 的执行能力摘要;不包含 token、路由地址或插件正文。 */\nexport interface AggregatedHostCapabilitySummary {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n readonly status: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly dshVersion: string | null\n readonly apiCompatibility: string | null\n readonly capabilities: readonly string[]\n readonly diagnostic?: string\n}\n\n/** Client 读取的 Manifest 只代表当前 Host 的本地插件基线。 */\nexport interface AggregatedHostManifestBoundary {\n readonly source: 'local'\n readonly plugin: AggregatedHostLocalPluginBaseline\n readonly remoteManifest: 'forbidden'\n readonly remoteBundle: 'forbidden'\n}\n\n/** Aggregated Transport 的物理连接 generation;作用域 generation 仍由 HostScope 管理。 */\nexport interface AggregatedHostGeneration {\n readonly id: number\n readonly host: { readonly home: string }\n readonly connectedAt: number\n}\n\nexport interface AggregatedHostRpcRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostFetchRequest {\n readonly scope: HostScope\n readonly path: string\n readonly method?: string\n readonly headers?: Readonly<Record<string, string>>\n readonly body?: string\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostStreamRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\n/** Client 侧只提交自己的 Socket;目标连接和 token 由 Host 侧代理服务持有。 */\nexport interface AggregatedHostWebSocketClient {\n readonly readyState: number\n send(data: string): void\n close(code?: number, reason?: string): void\n on(event: 'message' | 'close' | 'error', listener: (...args: any[]) => void): void\n}\n\n/** Aggregated Host 的内部稳定 Transport;不替换普通插件 ctx.connection。 */\nexport interface AggregatedHostTransport {\n readonly kind: 'aggregated-host'\n readonly localPlugin: AggregatedHostLocalPluginBaseline\n getCapabilities(): readonly AggregatedHostCapabilitySummary[]\n rpc<TResponse = unknown>(request: AggregatedHostRpcRequest): Promise<TResponse>\n fetch(request: AggregatedHostFetchRequest): Promise<Response>\n openStream<TChunk = unknown>(request: AggregatedHostStreamRequest): AsyncIterable<TChunk>\n openWebSocket(client: AggregatedHostWebSocketClient, scope: HostScope): Promise<() => void>\n getGeneration(): AggregatedHostGeneration | undefined\n onGenerationChange(listener: (generation: AggregatedHostGeneration | undefined) => void): () => void\n reconnect(signal?: AbortSignal): Promise<void>\n readManifest(): AggregatedHostManifestBoundary\n loadBundle(url: string): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * 聚合 Host 对外暴露的资源命名空间。\n *\n * 远端 Host 的 workspace/session id 只在各自 Host 内唯一,不能直接交给\n * 本地 DSH Store。聚合层使用版本化、可逆的虚拟 ID,避免不同 Host 的同名\n * 资源碰撞,同时保留真实 ID 供路由层转发。\n */\nexport type VirtualWorkspaceId = string\nexport type VirtualSessionId = string\n\nexport interface VirtualWorkspaceRef {\n readonly virtualWorkspaceId: VirtualWorkspaceId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n}\n\nexport interface VirtualSessionRef {\n readonly virtualSessionId: VirtualSessionId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string\n}\n\n/** 混合 Workspace 顺序的持久化内容,只保存虚拟 ID,不复制 Host 数据。 */\nexport interface AggregateWorkspaceOrder {\n readonly version: 1\n readonly orderedWorkspaceIds: readonly VirtualWorkspaceId[]\n}\n\nexport const VIRTUAL_RESOURCE_ID_PREFIX = 'codingns:peer-host:v1'\n\nexport function createVirtualWorkspaceId(hostId: string, workspaceId: string): VirtualWorkspaceId {\n return createVirtualResourceId('workspace', hostId, workspaceId)\n}\n\nexport function createVirtualSessionId(hostId: string, sessionId: string): VirtualSessionId {\n return createVirtualResourceId('session', hostId, sessionId)\n}\n\nexport function parseVirtualWorkspaceId(value: string): VirtualWorkspaceRef | null {\n const parsed = parseVirtualResourceId(value, 'workspace')\n if (parsed === null) return null\n return { virtualWorkspaceId: value, hostId: parsed.hostId, targetHostId: parsed.hostId === 'local' ? null : parsed.hostId, workspaceId: parsed.resourceId }\n}\n\nexport function parseVirtualSessionId(value: string): { readonly hostId: string; readonly sessionId: string } | null {\n const parsed = parseVirtualResourceId(value, 'session')\n return parsed === null ? null : { hostId: parsed.hostId, sessionId: parsed.resourceId }\n}\n\nfunction createVirtualResourceId(kind: 'workspace' | 'session', hostId: string, resourceId: string): string {\n const host = requiredResourcePart(hostId, 'hostId')\n const resource = requiredResourcePart(resourceId, kind === 'workspace' ? 'workspaceId' : 'sessionId')\n return `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:${encodeURIComponent(host)}:${encodeURIComponent(resource)}`\n}\n\nfunction parseVirtualResourceId(value: string, kind: 'workspace' | 'session'): { readonly hostId: string; readonly resourceId: string } | null {\n if (typeof value !== 'string') return null\n const prefix = `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:`\n if (!value.startsWith(prefix)) return null\n const parts = value.slice(prefix.length).split(':')\n if (parts.length !== 2 || parts.some((part) => part === '')) return null\n try {\n const hostId = decodeURIComponent(parts[0]!)\n const resourceId = decodeURIComponent(parts[1]!)\n return hostId && resourceId ? { hostId, resourceId } : null\n } catch {\n return null\n }\n}\n\nfunction requiredResourcePart(value: string, name: string): string {\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${name} 不能为空`)\n return value\n}\n\nexport const PEER_HOST_ERROR_CODES = {\n NOT_FOUND: 'PEER_HOST_NOT_FOUND',\n NOT_READY: 'PEER_HOST_NOT_READY',\n SESSION_REQUIRED: 'PEER_HOST_SESSION_REQUIRED',\n PROXY_PATH_NOT_ALLOWED: 'PEER_HOST_PROXY_PATH_NOT_ALLOWED',\n PROXY_ACCESS_DENIED: 'PEER_HOST_PROXY_ACCESS_DENIED',\n SCOPE_MISMATCH: 'PEER_HOST_SCOPE_MISMATCH',\n PROXY_UNREACHABLE: 'PEER_HOST_PROXY_UNREACHABLE',\n RESPONSE_INVALID: 'PEER_HOST_RESPONSE_INVALID',\n TOOL_UNSUPPORTED: 'PEER_HOST_TOOL_UNSUPPORTED',\n INVALID_ROUTE: 'PEER_HOST_INVALID_ROUTE',\n DUPLICATE: 'PEER_HOST_DUPLICATE',\n PLUGIN_MISSING: 'PEER_HOST_PLUGIN_MISSING',\n VERSION_MISMATCH: 'PEER_HOST_VERSION_MISMATCH',\n IDENTITY_CHANGED: 'PEER_HOST_IDENTITY_CHANGED',\n UNREACHABLE: 'PEER_HOST_UNREACHABLE',\n RELAY_UNAVAILABLE: 'PEER_HOST_RELAY_UNAVAILABLE',\n AGGREGATE_UNAVAILABLE: 'PEER_HOST_AGGREGATE_UNAVAILABLE',\n STALE_GENERATION: 'PEER_HOST_STALE_GENERATION',\n AGGREGATED_TRANSPORT_UNSUPPORTED: 'PEER_HOST_AGGREGATED_TRANSPORT_UNSUPPORTED',\n AGGREGATED_MANIFEST_FORBIDDEN: 'PEER_HOST_AGGREGATED_MANIFEST_FORBIDDEN',\n AGGREGATED_BUNDLE_FORBIDDEN: 'PEER_HOST_AGGREGATED_BUNDLE_FORBIDDEN',\n} as const\n\nexport type PeerHostErrorCode = typeof PEER_HOST_ERROR_CODES[keyof typeof PEER_HOST_ERROR_CODES]\n\n/** 可安全返回 Client 的结构化错误,不携带凭据、完整 URL 或内容数据。 */\nexport interface PeerHostErrorShape {\n readonly code: PeerHostErrorCode\n readonly peerHostId?: string\n readonly message: string\n}\n\n/** 作用域管理器仍使用的兼容引用;新跨 Host 代码应优先使用 HostScope。 */\nexport interface ResourceScopeRef {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n scopeGeneration: number\n sessionId?: string | null\n}\n\nexport interface ResourceScopeInput {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n sessionId?: string | null\n}\n\nexport type ResourceScopeSnapshot = Readonly<ResourceScopeRef>\n\n/** 作用域拥有的清理函数。清理函数必须可重复调用而不会产生副作用。 */\nexport type ResourceScopeDisposer = () => void | Promise<void>\n\n/** 作用域已经失效时统一抛出的错误。 */\nexport class ResourceScopeStaleError extends Error {\n readonly code = 'RESOURCE_SCOPE_STALE' as const\n\n constructor(message = 'Resource scope is stale') {\n super(message)\n this.name = 'ResourceScopeStaleError'\n }\n}\n","import * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport { createElement, type ComponentType } from 'react'\n\n/** 富文本菜单沿用宿主的键盘导航、焦点归还和外部点击关闭行为。 */\nexport { Menu as DshMenu } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { Button as DshButton, Checkbox as DshCheckbox, Input as DshInput, Modal as DshModal } from '@deepseek-ai/dsh-client-ui-primitives'\n\ntype IconComponent = ComponentType<{ readonly size?: number; readonly className?: string }>\ntype ShortcutKeysComponent = ComponentType<{ readonly keys: readonly string[] }>\ntype PrimitiveExports = typeof primitives & {\n readonly IconPlusOutlineRegular?: IconComponent\n readonly IconPlusOutlineMedium?: IconComponent\n readonly IconChevronDownOutlineRegular?: IconComponent\n readonly IconChevronDownOutlineMedium?: IconComponent\n readonly IconChevronUpOutlineRegular?: IconComponent\n readonly IconChevronUpOutlineMedium?: IconComponent\n readonly IconChevronLeftOutlineRegular?: IconComponent\n readonly IconChevronLeftOutlineMedium?: IconComponent\n readonly IconChevronRightOutlineRegular?: IconComponent\n readonly IconChevronRightOutlineMedium?: IconComponent\n readonly IconRefreshOutlineRegular?: IconComponent\n readonly IconRefreshOutlineMedium?: IconComponent\n readonly IconSlidersTwoOutlineRegular?: IconComponent\n readonly IconSlidersTwoOutlineMedium?: IconComponent\n readonly IconSettingsOutlineRegular?: IconComponent\n readonly IconSettingsOutlineMedium?: IconComponent\n readonly IconPlusOutline16?: IconComponent\n readonly IconChevronDownOutline14?: IconComponent\n readonly IconDataOutlineRegular?: IconComponent\n readonly IconDataOutlineMedium?: IconComponent\n readonly IconDataOutline16?: IconComponent\n readonly IconShareOutlineRegular?: IconComponent\n readonly IconShareOutlineMedium?: IconComponent\n readonly IconSendOutlineRegular?: IconComponent\n readonly IconSendOutlineMedium?: IconComponent\n readonly IconCloseOutlineRegular?: IconComponent\n readonly IconCloseOutlineMedium?: IconComponent\n readonly IconChatOutlineRegular?: IconComponent\n readonly IconChatOutlineMedium?: IconComponent\n readonly IconStopFillRegular?: IconComponent\n readonly IconStopFillMedium?: IconComponent\n readonly IconPhoneOutlineRegular?: IconComponent\n readonly IconPhoneOutlineMedium?: IconComponent\n readonly ShortcutKeys?: ShortcutKeysComponent\n}\n\nconst unavailableIcon: IconComponent = () => null\nconst fallbackShortcutKeys: ShortcutKeysComponent = ({ keys }) => createElement('span', undefined, keys.join(' + '))\n\nexport type AssistantControlIcon = 'add' | 'phone' | 'settings' | 'close' | 'send' | 'stop' | 'chat' | 'clear'\n/** 助理控件优先共用宿主图标,缺少的电话与普通对话采用相同 16px 画布和细描边。 */\nexport function resolveAssistantControlIcon(name: AssistantControlIcon): IconComponent {\n const value = primitives as PrimitiveExports\n switch (name) {\n case 'add': return resolvePlusIcon()\n case 'clear': return resolveRefreshIcon()\n case 'settings': return value.IconSettingsOutlineRegular ?? value.IconSettingsOutlineMedium ?? resolveToolIcon()\n case 'close': return value.IconCloseOutlineRegular ?? value.IconCloseOutlineMedium ?? unavailableIcon\n case 'chat': return value.IconChatOutlineRegular ?? value.IconChatOutlineMedium ?? AssistantChatIcon\n case 'send': return value.IconSendOutlineRegular ?? value.IconSendOutlineMedium ?? unavailableIcon\n case 'stop': return value.IconStopFillRegular ?? value.IconStopFillMedium ?? unavailableIcon\n case 'phone': return value.IconPhoneOutlineRegular ?? value.IconPhoneOutlineMedium ?? AssistantPhoneIcon\n }\n}\n/** 沿用 DSH 新对话的气泡轮廓,内部使用三点表示进入已有对话。 */\nfunction AssistantChatIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M2.37091 11.2501C1.58745 9.89288 1.32067 8.29835 1.61969 6.76006C1.91872 5.22177 2.76342 3.8433 3.99826 2.87846C5.2331 1.91362 6.77494 1.42737 8.33988 1.50925C9.90482 1.59113 11.3875 2.23562 12.5149 3.32406C13.6425 4.41269 14.3387 5.87206 14.4754 7.4334C14.612 8.99474 14.18 10.5529 13.2587 11.8209C12.3375 13.0888 10.9891 13.9813 9.46194 14.3337C8.18691 14.628 6.85895 14.5294 5.64989 14.0605C5.1712 13.8748 4.76962 13.4932 4.26534 13.3967C3.67413 13.2835 2.95257 13.5598 2.03794 14.3337' }),\n ...[5.25, 8, 10.75].map((cx) => createElement('circle', { key: cx, cx, cy: 8, r: 0.65, fill: 'currentColor', stroke: 'none' })))\n}\nfunction AssistantPhoneIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M3.1 1.8h2l1.1 3.1-1.4 1.4a10.5 10.5 0 0 0 4.9 4.9l1.4-1.4 3.1 1.1v2a1.4 1.4 0 0 1-1.6 1.4A13 13 0 0 1 1.7 3.4a1.4 1.4 0 0 1 1.4-1.6Z' }))\n}\n\n/**\n * 图标导出兼容层。0.1.7 可能改名为 Regular/Medium,运行时优先使用新导出,\n * 旧导出仍作为回退;业务组件不再直接判断 DSH 版本。\n */\nexport function resolvePlusIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconPlusOutlineRegular ?? value.IconPlusOutlineMedium ?? value.IconPlusOutline16 ?? unavailableIcon\n}\n\nexport function resolveChevronDownIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? value.IconChevronDownOutline14 ?? unavailableIcon\n}\n\n/** 终端工具栏使用的原生刷新图标。 */\nexport function resolveRefreshIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconRefreshOutlineRegular ?? value.IconRefreshOutlineMedium ?? unavailableIcon\n}\n\n/** 终端工具栏入口使用的原生工具图标。 */\nexport function resolveToolIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconSlidersTwoOutlineRegular\n ?? value.IconSlidersTwoOutlineMedium\n ?? value.IconSettingsOutlineRegular\n ?? value.IconSettingsOutlineMedium\n ?? unavailableIcon\n}\n\n/** 终端快捷操作的方向图标。 */\nexport function resolveTerminalArrowIcon(direction: 'up' | 'down' | 'left' | 'right'): IconComponent {\n const value = primitives as PrimitiveExports\n if (direction === 'up') return value.IconChevronUpOutlineRegular ?? value.IconChevronUpOutlineMedium ?? unavailableIcon\n if (direction === 'down') return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? unavailableIcon\n if (direction === 'left') return value.IconChevronLeftOutlineRegular ?? value.IconChevronLeftOutlineMedium ?? unavailableIcon\n return value.IconChevronRightOutlineRegular ?? value.IconChevronRightOutlineMedium ?? unavailableIcon\n}\n\n/** 终端按键标签使用 DSH 原生 ShortcutKeys,旧版本缺失时退回纯文本。 */\nexport function resolveShortcutKeys(): ShortcutKeysComponent {\n const value = primitives as PrimitiveExports\n return value.ShortcutKeys ?? fallbackShortcutKeys\n}\n\n/**\n * 模型图标:DSH 原生模型选择器在紧凑状态显示的 data 图标(0.1.7 起为 Regular/Medium,\n * 0.1.6 为 16 后缀),插件模型选择器收起时与之保持一致。\n */\nexport function resolveDataIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconDataOutlineRegular ?? value.IconDataOutlineMedium ?? value.IconDataOutline16 ?? unavailableIcon\n}\n\n/**\n * `/委派` 菜单行图标:优先使用共享(send/share)字形,缺失时回退到插件通用的\n * data 图标,保证旧版 DSH 仍能渲染出一行可识别的委派入口。\n */\nexport function resolveDelegateIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconShareOutlineRegular\n ?? value.IconShareOutlineMedium\n ?? value.IconSendOutlineRegular\n ?? value.IconSendOutlineMedium\n ?? resolveDataIcon()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;EAkKA,MAAa,0BAA0B;;EAGvC,SAAgB,uBAAuB,OAA+B;GACpE,IAAI,OAAO,UAAU,UAAU,OAAO;GACtC,MAAM,UAAU,MAAM,KAAK,CAAC,CAAC,YAAY;GACzC,OAAO,wBAAwB,KAAK,OAAO,IAAI,UAAU;EAC3D;;EAGA,MAAa,0BAA0B,OAAO,OAAO;GACnD;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAU;EAuHV,MAAa,6BAA6B;EAE1C,SAAgB,yBAAyB,QAAgB,aAAyC;GAChG,OAAO,wBAAwB,aAAa,QAAQ,WAAW;EACjE;EAEA,SAAgB,uBAAuB,QAAgB,WAAqC;GAC1F,OAAO,wBAAwB,WAAW,QAAQ,SAAS;EAC7D;EAEA,SAAgB,wBAAwB,OAA2C;GACjF,MAAM,SAAS,uBAAuB,OAAO,WAAW;GACxD,IAAI,WAAW,MAAM,OAAO;GAC5B,OAAO;IAAE,oBAAoB;IAAO,QAAQ,OAAO;IAAQ,cAAc,OAAO,WAAW,UAAU,OAAO,OAAO;IAAQ,aAAa,OAAO;GAAW;EAC5J;EAEA,SAAgB,sBAAsB,OAA+E;GACnH,MAAM,SAAS,uBAAuB,OAAO,SAAS;GACtD,OAAO,WAAW,OAAO,OAAO;IAAE,QAAQ,OAAO;IAAQ,WAAW,OAAO;GAAW;EACxF;EAEA,SAAS,wBAAwB,MAA+B,QAAgB,YAA4B;GAC1G,MAAM,OAAO,qBAAqB,QAAQ,QAAQ;GAClD,MAAM,WAAW,qBAAqB,YAAY,SAAS,cAAc,gBAAgB,WAAW;GACpG,OAAO,GAAG,2BAA2B,GAAG,KAAK,GAAG,mBAAmB,IAAI,EAAE,GAAG,mBAAmB,QAAQ;EACzG;EAEA,SAAS,uBAAuB,OAAe,MAAgG;GAC7I,IAAI,OAAO,UAAU,UAAU,OAAO;GACtC,MAAM,SAAS,GAAG,2BAA2B,GAAG,KAAK;GACrD,IAAI,CAAC,MAAM,WAAW,MAAM,GAAG,OAAO;GACtC,MAAM,QAAQ,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG;GAClD,IAAI,MAAM,WAAW,KAAK,MAAM,MAAM,SAAS,SAAS,EAAE,GAAG,OAAO;GACpE,IAAI;IACF,MAAM,SAAS,mBAAmB,MAAM,EAAG;IAC3C,MAAM,aAAa,mBAAmB,MAAM,EAAG;IAC/C,OAAO,UAAU,aAAa;KAAE;KAAQ;IAAW,IAAI;GACzD,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAS,qBAAqB,OAAe,MAAsB;GACjE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,GAAG,KAAK,MAAM;GACxF,OAAO;EACT;EAEA,MAAa,wBAAwB;GACnC,WAAW;GACX,WAAW;GACX,kBAAkB;GAClB,wBAAwB;GACxB,qBAAqB;GACrB,gBAAgB;GAChB,mBAAmB;GACnB,kBAAkB;GAClB,kBAAkB;GAClB,eAAe;GACf,WAAW;GACX,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,aAAa;GACb,mBAAmB;GACnB,uBAAuB;GACvB,kBAAkB;GAClB,kCAAkC;GAClC,+BAA+B;GAC/B,6BAA6B;EAC/B;;EAiCA,IAAa,0BAAb,cAA6C,MAAM;GACjD,OAAgB;GAEhB,YAAY,UAAU,2BAA2B;IAC/C,MAAM,OAAO;IACb,KAAK,OAAO;GACd;EACF;;;EC3WA,MAAM,wBAAuC;EAC7C,MAAM,wBAA+C,EAAE,YAAA,GAAWA,MAAAA,cAAAA,CAAc,QAAQ,KAAA,GAAW,KAAK,KAAK,KAAK,CAAC;;EAInH,SAAgB,4BAA4B,MAA2C;GACrF,MAAM,QAAQC;GACd,QAAQ,MAAR;IACE,KAAK,OAAO,OAAO,gBAAgB;IACnC,KAAK,SAAS,OAAO,mBAAmB;IACxC,KAAK,YAAY,OAAO,MAAM,8BAA8B,MAAM,6BAA6B,gBAAgB;IAC/G,KAAK,SAAS,OAAO,MAAM,2BAA2B,MAAM,0BAA0B;IACtF,KAAK,QAAQ,OAAO,MAAM,0BAA0B,MAAM,yBAAyB;IACnF,KAAK,QAAQ,OAAO,MAAM,0BAA0B,MAAM,yBAAyB;IACnF,KAAK,QAAQ,OAAO,MAAM,uBAAuB,MAAM,sBAAsB;IAC7E,KAAK,SAAS,OAAO,MAAM,2BAA2B,MAAM,0BAA0B;GACxF;EACF;;EAEA,SAAS,kBAAkB,EAAE,OAAO,IAAI,aAAsE;GAC5G,QAAA,GAAOD,MAAAA,cAAAA,CAAc,OAAO;IAAE,OAAO;IAAM,QAAQ;IAAM;IAAW,SAAS;IAAa,MAAM;IAAQ,eAAe;IAAM,WAAW;IACtI,QAAQ;IAAgB,aAAa;IAAG,eAAe;IAAS,gBAAgB;GAAQ,IAAA,GACxFA,MAAAA,cAAAA,CAAc,QAAQ,EAAE,GAAG,2eAA2e,CAAC,GACvgB,GAAG;IAAC;IAAM;IAAG;GAAK,CAAC,CAAC,KAAK,QAAA,GAAOA,MAAAA,cAAAA,CAAc,UAAU;IAAE,KAAK;IAAI;IAAI,IAAI;IAAG,GAAG;IAAM,MAAM;IAAgB,QAAQ;GAAO,CAAC,CAAC,CAAC;EACnI;EACA,SAAS,mBAAmB,EAAE,OAAO,IAAI,aAAsE;GAC7G,QAAA,GAAOA,MAAAA,cAAAA,CAAc,OAAO;IAAE,OAAO;IAAM,QAAQ;IAAM;IAAW,SAAS;IAAa,MAAM;IAAQ,eAAe;IACrH,QAAQ;IAAgB,aAAa;IAAG,eAAe;IAAS,gBAAgB;GAAQ,IAAA,GACxFA,MAAAA,cAAAA,CAAc,QAAQ,EAAE,GAAG,wIAAwI,CAAC,CAAC;EACzK;;;;;EAMA,SAAgB,kBAAiC;GAC/C,MAAM,QAAQC;GACd,OAAO,MAAM,0BAA0B,MAAM,yBAAyB,MAAM,qBAAqB;EACnG;EAEA,SAAgB,yBAAwC;GACtD,MAAM,QAAQA;GACd,OAAO,MAAM,iCAAiC,MAAM,gCAAgC,MAAM,4BAA4B;EACxH;;EAGA,SAAgB,qBAAoC;GAClD,MAAM,QAAQA;GACd,OAAO,MAAM,6BAA6B,MAAM,4BAA4B;EAC9E;;EAGA,SAAgB,kBAAiC;GAC/C,MAAM,QAAQA;GACd,OAAO,MAAM,gCACR,MAAM,+BACN,MAAM,8BACN,MAAM,6BACN;EACP;;EAGA,SAAgB,yBAAyB,WAA4D;GACnG,MAAM,QAAQA;GACd,IAAI,cAAc,MAAM,OAAO,MAAM,+BAA+B,MAAM,8BAA8B;GACxG,IAAI,cAAc,QAAQ,OAAO,MAAM,iCAAiC,MAAM,gCAAgC;GAC9G,IAAI,cAAc,QAAQ,OAAO,MAAM,iCAAiC,MAAM,gCAAgC;GAC9G,OAAO,MAAM,kCAAkC,MAAM,iCAAiC;EACxF;;EAGA,SAAgB,sBAA6C;GAE3D,OAAOC,sCAAM,gBAAgB;EAC/B;;;;;EAMA,SAAgB,kBAAiC;GAC/C,MAAM,QAAQD;GACd,OAAO,MAAM,0BAA0B,MAAM,yBAAyB,MAAM,qBAAqB;EACnG;;;;;EAMA,SAAgB,sBAAqC;GACnD,MAAM,QAAQA;GACd,OAAO,MAAM,2BACR,MAAM,0BACN,MAAM,0BACN,MAAM,yBACN,gBAAgB;EACvB"}
1
+ {"version":3,"file":"client.primitives-adapter.js","names":["primitives","createElement","icons","value"],"sources":["../../../../src/shared/contracts/peer-host.ts","../../../../src/dsh-capabilities/client/primitives-adapter.ts"],"sourcesContent":["/** PeerHost 目标路由;短期 relay ticket 永远不属于持久配置。 */\nexport type PeerHostRoute =\n | {\n readonly kind: 'lan'\n readonly baseUrl: string\n readonly normalizedOrigin: string\n }\n | {\n readonly kind: 'relay'\n readonly deviceId: string\n readonly relayEntryId: string\n readonly transportVersion: string\n }\n\nexport type PeerHostStatus =\n | 'configured'\n | 'checking'\n | 'ready'\n | 'plugin_missing'\n | 'version_mismatch'\n | 'identity_changed'\n | 'session_required'\n | 'unreachable'\n | 'reconnecting'\n | 'disabled'\n\n/** Host 侧保存的 PeerHost 配置与脱敏握手状态。凭据不在此 DTO 中。 */\nexport interface PeerHostRecord {\n readonly id: string\n readonly ownerUserId: string\n readonly displayName: string\n readonly route: PeerHostRoute\n readonly status: PeerHostStatus\n readonly pluginId: string | null\n readonly pluginVersion: string | null\n readonly dshVersion: string | null\n /** 远端操作系统主机名;旧记录没有此字段时保持缺省。 */\n readonly hostname?: string | null\n /** 远端 DSH 配置文件名;只返回名称,不返回本地路径。 */\n readonly configProfile?: string | null\n readonly apiCompatibility: string | null\n readonly fingerprint: string | null\n readonly lastCheckedAt: number | null\n readonly lastErrorCode: PeerHostErrorCode | null\n /**\n * 工作区标签配色;缺省时客户端按名称推导稳定色。\n *\n * 颜色只影响本机侧栏标签,不参与握手、代理或目标 Host 的任何状态。\n */\n readonly color?: string | null\n /**\n * 用户显式添加的远端工作区 ID。\n *\n * 聚合摘要只投影这个集合内的远端工作区;缺省或空集合表示\"尚未显式添加任何\n * 远端工作区\",此时不展示该 Host 的任何工作区——这是默认行为,不是降级。\n */\n readonly visibleWorkspaceIds?: readonly string[]\n readonly createdAt: number\n readonly updatedAt: number\n}\n\n/** Client 管理面板可见的 PeerHost 摘要;仅暴露局域网地址,凭据和中转路由详情仍留在 Host。 */\nexport type PeerHostClientRoute =\n | { readonly kind: 'lan'; readonly baseUrl?: string }\n | { readonly kind: 'relay' }\n\nexport type PeerHostClientRecord = Omit<PeerHostRecord, 'route'> & {\n readonly route: PeerHostClientRoute\n}\n\n/** Client 可见的 PeerHost 诊断快照;不包含完整路由、凭据或正文。 */\nexport interface PeerHostDiagnosticSnapshot {\n readonly peerHostId: string\n readonly routeKind: 'lan' | 'relay'\n readonly status: PeerHostStatus\n readonly lastErrorCode: PeerHostErrorCode | null\n readonly lastCheckedAt: number | null\n readonly fingerprint: string | null\n}\n\n/** 当前 Host 插件自有 WebSocket 入口;不包含任何目标 Host 地址或凭据。 */\nexport interface PeerHostWebSocketEndpoint {\n readonly host: string\n readonly port: number\n readonly path: string\n}\n\n/** 所有跨 Host 资源共用的完整作用域。 */\nexport interface HostScope {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string | null\n readonly scopeGeneration: number\n}\n\n/** 只保留标题投影及远端原生序号,避免把实时标题降级为无法覆盖旧值的缓存。 */\nexport interface PeerHostSessionTitleProjection {\n readonly kind: 'cached' | 'sequenced'\n readonly asOfSeq: number\n readonly values: { readonly title: string | null }\n}\n\n/** 会话摘要只用于聚合导航,不包含历史消息或工具内容。 */\nexport interface PeerHostSessionRecord {\n readonly scope: HostScope\n readonly title: string\n /** 旧版摘要缺省;不得使用 updatedAt 伪造原生事件序号。 */\n readonly titleProjection?: PeerHostSessionTitleProjection\n readonly status: string\n /** 来自真实执行状态的证明;不能把导航层默认 idle 当作完成证明。 */\n readonly activity?: 'running' | 'idle' | 'unknown'\n readonly updatedAt: number\n /** DSH 原生会话是否仍处于待首条消息的临时状态。 */\n readonly blank: boolean\n /** 远端 CodingNS CLI 会话绑定的适配器;旧 Host 未提供时保持缺省。 */\n readonly adapterId?: string\n /** 子会话身份仅用于原生目录与路由,不改变工作区侧栏的可见会话。 */\n readonly origin?: 'subagent'\n readonly parentSessionId?: string\n}\n\n/** 当前 Host 和 PeerHost 统一使用的工作区摘要。 */\nexport interface AggregateWorkspaceSummary {\n readonly key: string\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly displayName: string\n /** 工作区在所属 Host 上的真实路径;原生文件面板等按路径解析,不能用 workspaceId 代替。 */\n readonly path: string\n readonly hostLabel: string\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly sessions: readonly PeerHostSessionRecord[]\n /**\n * 已归档会话。远端侧栏默认隐藏这些行,但归档入口、归档集合与取消归档路由\n * 仍需要它们;子代理会话在可见与归档两侧都不出现。\n */\n readonly archivedSessions?: readonly PeerHostSessionRecord[]\n /** 可见工作区下的子会话,进入状态和路由目录,但不占侧栏成员槽位。 */\n readonly subagentSessions?: readonly PeerHostSessionRecord[]\n}\n\nexport interface AggregateHostResult {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n /** 该 Host 工作区标签的配色;缺省时客户端按名称推导稳定色。 */\n readonly hostColor?: string | null\n readonly availability: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly errorCode: PeerHostErrorCode | null\n /** 摘要能力不可用时保留可诊断原因,禁止以空工作区伪装成功。 */\n readonly diagnostic?: string\n readonly workspaces: readonly AggregateWorkspaceSummary[]\n}\n\n/**\n * 工作区标签配色的取值范围。\n *\n * 只接受 `#rrggbb`:颜色会被写进本机侧栏 DOM 的内联样式,开放任意字符串\n * 等于把 CSS 注入面交给远端配置。\n */\nexport const PEER_HOST_COLOR_PATTERN = /^#[0-9a-f]{6}$/u\n\n/** 校验并归一化工作区标签配色;非法值返回 null,由消费方回退到推导色。 */\nexport function normalizePeerHostColor(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim().toLowerCase()\n return PEER_HOST_COLOR_PATTERN.test(trimmed) ? trimmed : null\n}\n\n/** 管理面板的默认配色候选;顺序即下拉顺序。 */\nexport const PEER_HOST_COLOR_PRESETS = Object.freeze([\n '#1677ff',\n '#722ed1',\n '#13c2c2',\n '#52c41a',\n '#fa8c16',\n '#eb2f96',\n '#f5222d',\n '#8c8c8c',\n] as const)\n\n/** Aggregated Host 只允许本地插件基线;远端不得提供 Manifest、Bundle 或 UI Slot。 */\nexport interface AggregatedHostLocalPluginBaseline {\n readonly pluginId: string\n readonly pluginVersion: string\n readonly manifestSource: 'local'\n readonly bundleSource: 'local'\n readonly uiSource: 'local'\n readonly allowRemoteManifest: false\n readonly allowRemoteBundle: false\n}\n\n/** 目标 Host 的执行能力摘要;不包含 token、路由地址或插件正文。 */\nexport interface AggregatedHostCapabilitySummary {\n readonly hostId: string\n readonly targetHostId: string | null\n readonly hostLabel: string\n readonly status: 'ready' | 'checking' | 'unreachable' | 'unsupported'\n readonly dshVersion: string | null\n readonly apiCompatibility: string | null\n readonly capabilities: readonly string[]\n readonly diagnostic?: string\n}\n\n/** Client 读取的 Manifest 只代表当前 Host 的本地插件基线。 */\nexport interface AggregatedHostManifestBoundary {\n readonly source: 'local'\n readonly plugin: AggregatedHostLocalPluginBaseline\n readonly remoteManifest: 'forbidden'\n readonly remoteBundle: 'forbidden'\n}\n\n/** Aggregated Transport 的物理连接 generation;作用域 generation 仍由 HostScope 管理。 */\nexport interface AggregatedHostGeneration {\n readonly id: number\n readonly host: { readonly home: string }\n readonly connectedAt: number\n}\n\nexport interface AggregatedHostRpcRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostFetchRequest {\n readonly scope: HostScope\n readonly path: string\n readonly method?: string\n readonly headers?: Readonly<Record<string, string>>\n readonly body?: string\n readonly signal?: AbortSignal\n}\n\nexport interface AggregatedHostStreamRequest {\n readonly scope: HostScope\n readonly method: string\n readonly payload?: unknown\n readonly signal?: AbortSignal\n}\n\n/** Client 侧只提交自己的 Socket;目标连接和 token 由 Host 侧代理服务持有。 */\nexport interface AggregatedHostWebSocketClient {\n readonly readyState: number\n send(data: string): void\n close(code?: number, reason?: string): void\n on(event: 'message' | 'close' | 'error', listener: (...args: any[]) => void): void\n}\n\n/** Aggregated Host 的内部稳定 Transport;不替换普通插件 ctx.connection。 */\nexport interface AggregatedHostTransport {\n readonly kind: 'aggregated-host'\n readonly localPlugin: AggregatedHostLocalPluginBaseline\n getCapabilities(): readonly AggregatedHostCapabilitySummary[]\n rpc<TResponse = unknown>(request: AggregatedHostRpcRequest): Promise<TResponse>\n fetch(request: AggregatedHostFetchRequest): Promise<Response>\n openStream<TChunk = unknown>(request: AggregatedHostStreamRequest): AsyncIterable<TChunk>\n openWebSocket(client: AggregatedHostWebSocketClient, scope: HostScope): Promise<() => void>\n getGeneration(): AggregatedHostGeneration | undefined\n onGenerationChange(listener: (generation: AggregatedHostGeneration | undefined) => void): () => void\n reconnect(signal?: AbortSignal): Promise<void>\n readManifest(): AggregatedHostManifestBoundary\n loadBundle(url: string): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * 聚合 Host 对外暴露的资源命名空间。\n *\n * 远端 Host 的 workspace/session id 只在各自 Host 内唯一,不能直接交给\n * 本地 DSH Store。聚合层使用版本化、可逆的虚拟 ID,避免不同 Host 的同名\n * 资源碰撞,同时保留真实 ID 供路由层转发。\n */\nexport type VirtualWorkspaceId = string\nexport type VirtualSessionId = string\n\nexport interface VirtualWorkspaceRef {\n readonly virtualWorkspaceId: VirtualWorkspaceId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n}\n\nexport interface VirtualSessionRef {\n readonly virtualSessionId: VirtualSessionId\n readonly hostId: string\n readonly targetHostId: string | null\n readonly workspaceId: string\n readonly sessionId: string\n}\n\n/** 混合 Workspace 顺序的持久化内容,只保存虚拟 ID,不复制 Host 数据。 */\nexport interface AggregateWorkspaceOrder {\n readonly version: 1\n readonly orderedWorkspaceIds: readonly VirtualWorkspaceId[]\n}\n\nexport const VIRTUAL_RESOURCE_ID_PREFIX = 'codingns:peer-host:v1'\n\nexport function createVirtualWorkspaceId(hostId: string, workspaceId: string): VirtualWorkspaceId {\n return createVirtualResourceId('workspace', hostId, workspaceId)\n}\n\nexport function createVirtualSessionId(hostId: string, sessionId: string): VirtualSessionId {\n return createVirtualResourceId('session', hostId, sessionId)\n}\n\nexport function parseVirtualWorkspaceId(value: string): VirtualWorkspaceRef | null {\n const parsed = parseVirtualResourceId(value, 'workspace')\n if (parsed === null) return null\n return { virtualWorkspaceId: value, hostId: parsed.hostId, targetHostId: parsed.hostId === 'local' ? null : parsed.hostId, workspaceId: parsed.resourceId }\n}\n\nexport function parseVirtualSessionId(value: string): { readonly hostId: string; readonly sessionId: string } | null {\n const parsed = parseVirtualResourceId(value, 'session')\n return parsed === null ? null : { hostId: parsed.hostId, sessionId: parsed.resourceId }\n}\n\nfunction createVirtualResourceId(kind: 'workspace' | 'session', hostId: string, resourceId: string): string {\n const host = requiredResourcePart(hostId, 'hostId')\n const resource = requiredResourcePart(resourceId, kind === 'workspace' ? 'workspaceId' : 'sessionId')\n return `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:${encodeURIComponent(host)}:${encodeURIComponent(resource)}`\n}\n\nfunction parseVirtualResourceId(value: string, kind: 'workspace' | 'session'): { readonly hostId: string; readonly resourceId: string } | null {\n if (typeof value !== 'string') return null\n const prefix = `${VIRTUAL_RESOURCE_ID_PREFIX}:${kind}:`\n if (!value.startsWith(prefix)) return null\n const parts = value.slice(prefix.length).split(':')\n if (parts.length !== 2 || parts.some((part) => part === '')) return null\n try {\n const hostId = decodeURIComponent(parts[0]!)\n const resourceId = decodeURIComponent(parts[1]!)\n return hostId && resourceId ? { hostId, resourceId } : null\n } catch {\n return null\n }\n}\n\nfunction requiredResourcePart(value: string, name: string): string {\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${name} 不能为空`)\n return value\n}\n\nexport const PEER_HOST_ERROR_CODES = {\n NOT_FOUND: 'PEER_HOST_NOT_FOUND',\n NOT_READY: 'PEER_HOST_NOT_READY',\n SESSION_REQUIRED: 'PEER_HOST_SESSION_REQUIRED',\n PROXY_PATH_NOT_ALLOWED: 'PEER_HOST_PROXY_PATH_NOT_ALLOWED',\n PROXY_ACCESS_DENIED: 'PEER_HOST_PROXY_ACCESS_DENIED',\n SCOPE_MISMATCH: 'PEER_HOST_SCOPE_MISMATCH',\n PROXY_UNREACHABLE: 'PEER_HOST_PROXY_UNREACHABLE',\n RESPONSE_INVALID: 'PEER_HOST_RESPONSE_INVALID',\n TOOL_UNSUPPORTED: 'PEER_HOST_TOOL_UNSUPPORTED',\n INVALID_ROUTE: 'PEER_HOST_INVALID_ROUTE',\n DUPLICATE: 'PEER_HOST_DUPLICATE',\n PLUGIN_MISSING: 'PEER_HOST_PLUGIN_MISSING',\n VERSION_MISMATCH: 'PEER_HOST_VERSION_MISMATCH',\n IDENTITY_CHANGED: 'PEER_HOST_IDENTITY_CHANGED',\n UNREACHABLE: 'PEER_HOST_UNREACHABLE',\n RELAY_UNAVAILABLE: 'PEER_HOST_RELAY_UNAVAILABLE',\n AGGREGATE_UNAVAILABLE: 'PEER_HOST_AGGREGATE_UNAVAILABLE',\n STALE_GENERATION: 'PEER_HOST_STALE_GENERATION',\n AGGREGATED_TRANSPORT_UNSUPPORTED: 'PEER_HOST_AGGREGATED_TRANSPORT_UNSUPPORTED',\n AGGREGATED_MANIFEST_FORBIDDEN: 'PEER_HOST_AGGREGATED_MANIFEST_FORBIDDEN',\n AGGREGATED_BUNDLE_FORBIDDEN: 'PEER_HOST_AGGREGATED_BUNDLE_FORBIDDEN',\n} as const\n\nexport type PeerHostErrorCode = typeof PEER_HOST_ERROR_CODES[keyof typeof PEER_HOST_ERROR_CODES]\n\n/** 可安全返回 Client 的结构化错误,不携带凭据、完整 URL 或内容数据。 */\nexport interface PeerHostErrorShape {\n readonly code: PeerHostErrorCode\n readonly peerHostId?: string\n readonly message: string\n}\n\n/** 作用域管理器仍使用的兼容引用;新跨 Host 代码应优先使用 HostScope。 */\nexport interface ResourceScopeRef {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n scopeGeneration: number\n sessionId?: string | null\n}\n\nexport interface ResourceScopeInput {\n hostId: string\n workspaceId: string\n targetHostId: string | null\n sessionId?: string | null\n}\n\nexport type ResourceScopeSnapshot = Readonly<ResourceScopeRef>\n\n/** 作用域拥有的清理函数。清理函数必须可重复调用而不会产生副作用。 */\nexport type ResourceScopeDisposer = () => void | Promise<void>\n\n/** 作用域已经失效时统一抛出的错误。 */\nexport class ResourceScopeStaleError extends Error {\n readonly code = 'RESOURCE_SCOPE_STALE' as const\n\n constructor(message = 'Resource scope is stale') {\n super(message)\n this.name = 'ResourceScopeStaleError'\n }\n}\n","import * as primitives from '@deepseek-ai/dsh-client-ui-primitives'\nimport { createElement, type ComponentType, type ComponentProps, type ReactNode } from 'react'\n\n/** 富文本菜单沿用宿主的键盘导航、焦点归还和外部点击关闭行为。 */\nexport { Menu as DshMenu } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { Button as DshButton, Checkbox as DshCheckbox, Input as DshInput, Modal as DshModal } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { FileTypeIcon as DshFileTypeIcon, classifyFileType as classifyDshFileType, IconFolderCloseRegular as DshFolderIcon } from '@deepseek-ai/dsh-client-ui-primitives'\nexport { PathLabel as DshPathLabel, Tooltip as DshTooltip } from '@deepseek-ai/dsh-client-ui-primitives'\n\n/** Older primitive packages may lack Markdown delegation. Do not fail the whole footer. */\nexport function hasNativeMarkdown(source: object = primitives): boolean {\n const value = source as Partial<typeof primitives>\n return value.MarkdownText !== undefined && typeof value.MarkdownDelegateProvider === 'function'\n}\nexport const DshMarkdownText = primitives.MarkdownText ?? (({ text }: ComponentProps<typeof primitives.MarkdownText>) => createElement('pre', null, text))\nexport const DshMarkdownDelegate = primitives.MarkdownDelegateProvider ?? (({ children }: { children: ReactNode }) => createElement('div', null, children))\n\ntype IconComponent = ComponentType<{ readonly size?: number; readonly className?: string }>\ntype ShortcutKeysComponent = ComponentType<{ readonly keys: readonly string[] }>\ntype PrimitiveExports = typeof primitives & {\n readonly IconPlusOutlineRegular?: IconComponent\n readonly IconPlusOutlineMedium?: IconComponent\n readonly IconChevronDownOutlineRegular?: IconComponent\n readonly IconChevronDownOutlineMedium?: IconComponent\n readonly IconChevronUpOutlineRegular?: IconComponent\n readonly IconChevronUpOutlineMedium?: IconComponent\n readonly IconChevronLeftOutlineRegular?: IconComponent\n readonly IconChevronLeftOutlineMedium?: IconComponent\n readonly IconChevronRightOutlineRegular?: IconComponent\n readonly IconChevronRightOutlineMedium?: IconComponent\n readonly IconRefreshOutlineRegular?: IconComponent\n readonly IconRefreshOutlineMedium?: IconComponent\n readonly IconSlidersTwoOutlineRegular?: IconComponent\n readonly IconSlidersTwoOutlineMedium?: IconComponent\n readonly IconSettingsOutlineRegular?: IconComponent\n readonly IconSettingsOutlineMedium?: IconComponent\n readonly IconPlusOutline16?: IconComponent\n readonly IconChevronDownOutline14?: IconComponent\n readonly IconDataOutlineRegular?: IconComponent\n readonly IconDataOutlineMedium?: IconComponent\n readonly IconDataOutline16?: IconComponent\n readonly IconShareOutlineRegular?: IconComponent\n readonly IconShareOutlineMedium?: IconComponent\n readonly IconSendOutlineRegular?: IconComponent\n readonly IconSendOutlineMedium?: IconComponent\n readonly IconCloseOutlineRegular?: IconComponent\n readonly IconCloseOutlineMedium?: IconComponent\n readonly IconChatOutlineRegular?: IconComponent\n readonly IconChatOutlineMedium?: IconComponent\n readonly IconStopFillRegular?: IconComponent\n readonly IconStopFillMedium?: IconComponent\n readonly IconPhoneOutlineRegular?: IconComponent\n readonly IconPhoneOutlineMedium?: IconComponent\n readonly IconWrapFillRegular?: IconComponent\n readonly IconNowrapFillRegular?: IconComponent\n readonly ShortcutKeys?: ShortcutKeysComponent\n}\n\nconst unavailableIcon: IconComponent = () => null\nconst fallbackShortcutKeys: ShortcutKeysComponent = ({ keys }) => createElement('span', undefined, keys.join(' + '))\n\nexport type AssistantControlIcon = 'add' | 'phone' | 'settings' | 'close' | 'send' | 'stop' | 'chat' | 'clear'\n/** 助理控件优先共用宿主图标,缺少的电话与普通对话采用相同 16px 画布和细描边。 */\nexport function resolveAssistantControlIcon(name: AssistantControlIcon): IconComponent {\n const value = primitives as PrimitiveExports\n switch (name) {\n case 'add': return resolvePlusIcon()\n case 'clear': return resolveRefreshIcon()\n case 'settings': return value.IconSettingsOutlineRegular ?? value.IconSettingsOutlineMedium ?? resolveToolIcon()\n case 'close': return value.IconCloseOutlineRegular ?? value.IconCloseOutlineMedium ?? unavailableIcon\n case 'chat': return value.IconChatOutlineRegular ?? value.IconChatOutlineMedium ?? AssistantChatIcon\n case 'send': return value.IconSendOutlineRegular ?? value.IconSendOutlineMedium ?? unavailableIcon\n case 'stop': return value.IconStopFillRegular ?? value.IconStopFillMedium ?? unavailableIcon\n case 'phone': return value.IconPhoneOutlineRegular ?? value.IconPhoneOutlineMedium ?? AssistantPhoneIcon\n }\n}\n/** 沿用 DSH 新对话的气泡轮廓,内部使用三点表示进入已有对话。 */\nfunction AssistantChatIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M2.37091 11.2501C1.58745 9.89288 1.32067 8.29835 1.61969 6.76006C1.91872 5.22177 2.76342 3.8433 3.99826 2.87846C5.2331 1.91362 6.77494 1.42737 8.33988 1.50925C9.90482 1.59113 11.3875 2.23562 12.5149 3.32406C13.6425 4.41269 14.3387 5.87206 14.4754 7.4334C14.612 8.99474 14.18 10.5529 13.2587 11.8209C12.3375 13.0888 10.9891 13.9813 9.46194 14.3337C8.18691 14.628 6.85895 14.5294 5.64989 14.0605C5.1712 13.8748 4.76962 13.4932 4.26534 13.3967C3.67413 13.2835 2.95257 13.5598 2.03794 14.3337' }),\n ...[5.25, 8, 10.75].map((cx) => createElement('circle', { key: cx, cx, cy: 8, r: 0.65, fill: 'currentColor', stroke: 'none' })))\n}\nfunction AssistantPhoneIcon({ size = 20, className }: { readonly size?: number; readonly className?: string }) {\n return createElement('svg', { width: size, height: size, className, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true,\n stroke: 'currentColor', strokeWidth: 1, strokeLinecap: 'round', strokeLinejoin: 'round' },\n createElement('path', { d: 'M3.1 1.8h2l1.1 3.1-1.4 1.4a10.5 10.5 0 0 0 4.9 4.9l1.4-1.4 3.1 1.1v2a1.4 1.4 0 0 1-1.6 1.4A13 13 0 0 1 1.7 3.4a1.4 1.4 0 0 1 1.4-1.6Z' }))\n}\n\n/**\n * 图标导出兼容层。0.1.7 可能改名为 Regular/Medium,运行时优先使用新导出,\n * 旧导出仍作为回退;业务组件不再直接判断 DSH 版本。\n */\nexport function resolvePlusIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconPlusOutlineRegular ?? value.IconPlusOutlineMedium ?? value.IconPlusOutline16 ?? unavailableIcon\n}\n\nexport function resolveChevronDownIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? value.IconChevronDownOutline14 ?? unavailableIcon\n}\n\n/** 终端工具栏使用的原生刷新图标。 */\nexport function resolveRefreshIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconRefreshOutlineRegular ?? value.IconRefreshOutlineMedium ?? unavailableIcon\n}\n\n/** Document toolbar glyphs shared with the native text preview. */\nexport function resolveTextWrapIcon(wrapped: boolean): IconComponent {\n const value = primitives as PrimitiveExports\n return (wrapped ? value.IconNowrapFillRegular : value.IconWrapFillRegular) ?? unavailableIcon\n}\n\n/** Native viewer controls; keep optional glyph compatibility at the adapter boundary. */\nexport function resolveViewerIcon(name: 'edit' | 'save' | 'fullscreen' | 'restore' | 'back' | 'home'): IconComponent {\n const icons = primitives as unknown as Record<string, IconComponent | undefined>\n const key = { edit: 'IconEditOutlineRegular', save: 'IconCheckOutlineRegular', fullscreen: 'IconFullscreenOutlineRegular',\n restore: 'IconFullscreenOutlineRegular', back: 'IconChevronLeftOutlineRegular', home: 'IconFileOutlineRegular' }[name]\n return icons[key] ?? resolveRefreshIcon()\n}\n\n/** 终端工具栏入口使用的原生工具图标。 */\nexport function resolveToolIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconSlidersTwoOutlineRegular\n ?? value.IconSlidersTwoOutlineMedium\n ?? value.IconSettingsOutlineRegular\n ?? value.IconSettingsOutlineMedium\n ?? unavailableIcon\n}\n\n/** 终端快捷操作的方向图标。 */\nexport function resolveTerminalArrowIcon(direction: 'up' | 'down' | 'left' | 'right'): IconComponent {\n const value = primitives as PrimitiveExports\n if (direction === 'up') return value.IconChevronUpOutlineRegular ?? value.IconChevronUpOutlineMedium ?? unavailableIcon\n if (direction === 'down') return value.IconChevronDownOutlineRegular ?? value.IconChevronDownOutlineMedium ?? unavailableIcon\n if (direction === 'left') return value.IconChevronLeftOutlineRegular ?? value.IconChevronLeftOutlineMedium ?? unavailableIcon\n return value.IconChevronRightOutlineRegular ?? value.IconChevronRightOutlineMedium ?? unavailableIcon\n}\n\n/** 终端按键标签使用 DSH 原生 ShortcutKeys,旧版本缺失时退回纯文本。 */\nexport function resolveShortcutKeys(): ShortcutKeysComponent {\n const value = primitives as PrimitiveExports\n return value.ShortcutKeys ?? fallbackShortcutKeys\n}\n\n/**\n * 模型图标:DSH 原生模型选择器在紧凑状态显示的 data 图标(0.1.7 起为 Regular/Medium,\n * 0.1.6 为 16 后缀),插件模型选择器收起时与之保持一致。\n */\nexport function resolveDataIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconDataOutlineRegular ?? value.IconDataOutlineMedium ?? value.IconDataOutline16 ?? unavailableIcon\n}\n\n/**\n * `/委派` 菜单行图标:优先使用共享(send/share)字形,缺失时回退到插件通用的\n * data 图标,保证旧版 DSH 仍能渲染出一行可识别的委派入口。\n */\nexport function resolveDelegateIcon(): IconComponent {\n const value = primitives as PrimitiveExports\n return value.IconShareOutlineRegular\n ?? value.IconShareOutlineMedium\n ?? value.IconSendOutlineRegular\n ?? value.IconSendOutlineMedium\n ?? resolveDataIcon()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;EAkKA,MAAa,0BAA0B;;EAGvC,SAAgB,uBAAuB,OAA+B;GACpE,IAAI,OAAO,UAAU,UAAU,OAAO;GACtC,MAAM,UAAU,MAAM,KAAK,CAAC,CAAC,YAAY;GACzC,OAAO,wBAAwB,KAAK,OAAO,IAAI,UAAU;EAC3D;;EAGA,MAAa,0BAA0B,OAAO,OAAO;GACnD;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAU;EAuHV,MAAa,6BAA6B;EAE1C,SAAgB,yBAAyB,QAAgB,aAAyC;GAChG,OAAO,wBAAwB,aAAa,QAAQ,WAAW;EACjE;EAEA,SAAgB,uBAAuB,QAAgB,WAAqC;GAC1F,OAAO,wBAAwB,WAAW,QAAQ,SAAS;EAC7D;EAEA,SAAgB,wBAAwB,OAA2C;GACjF,MAAM,SAAS,uBAAuB,OAAO,WAAW;GACxD,IAAI,WAAW,MAAM,OAAO;GAC5B,OAAO;IAAE,oBAAoB;IAAO,QAAQ,OAAO;IAAQ,cAAc,OAAO,WAAW,UAAU,OAAO,OAAO;IAAQ,aAAa,OAAO;GAAW;EAC5J;EAEA,SAAgB,sBAAsB,OAA+E;GACnH,MAAM,SAAS,uBAAuB,OAAO,SAAS;GACtD,OAAO,WAAW,OAAO,OAAO;IAAE,QAAQ,OAAO;IAAQ,WAAW,OAAO;GAAW;EACxF;EAEA,SAAS,wBAAwB,MAA+B,QAAgB,YAA4B;GAC1G,MAAM,OAAO,qBAAqB,QAAQ,QAAQ;GAClD,MAAM,WAAW,qBAAqB,YAAY,SAAS,cAAc,gBAAgB,WAAW;GACpG,OAAO,GAAG,2BAA2B,GAAG,KAAK,GAAG,mBAAmB,IAAI,EAAE,GAAG,mBAAmB,QAAQ;EACzG;EAEA,SAAS,uBAAuB,OAAe,MAAgG;GAC7I,IAAI,OAAO,UAAU,UAAU,OAAO;GACtC,MAAM,SAAS,GAAG,2BAA2B,GAAG,KAAK;GACrD,IAAI,CAAC,MAAM,WAAW,MAAM,GAAG,OAAO;GACtC,MAAM,QAAQ,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM,GAAG;GAClD,IAAI,MAAM,WAAW,KAAK,MAAM,MAAM,SAAS,SAAS,EAAE,GAAG,OAAO;GACpE,IAAI;IACF,MAAM,SAAS,mBAAmB,MAAM,EAAG;IAC3C,MAAM,aAAa,mBAAmB,MAAM,EAAG;IAC/C,OAAO,UAAU,aAAa;KAAE;KAAQ;IAAW,IAAI;GACzD,QAAQ;IACN,OAAO;GACT;EACF;EAEA,SAAS,qBAAqB,OAAe,MAAsB;GACjE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,UAAU,GAAG,KAAK,MAAM;GACxF,OAAO;EACT;EAEA,MAAa,wBAAwB;GACnC,WAAW;GACX,WAAW;GACX,kBAAkB;GAClB,wBAAwB;GACxB,qBAAqB;GACrB,gBAAgB;GAChB,mBAAmB;GACnB,kBAAkB;GAClB,kBAAkB;GAClB,eAAe;GACf,WAAW;GACX,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,aAAa;GACb,mBAAmB;GACnB,uBAAuB;GACvB,kBAAkB;GAClB,kCAAkC;GAClC,+BAA+B;GAC/B,6BAA6B;EAC/B;;EAiCA,IAAa,0BAAb,cAA6C,MAAM;GACjD,OAAgB;GAEhB,YAAY,UAAU,2BAA2B;IAC/C,MAAM,OAAO;IACb,KAAK,OAAO;GACd;EACF;;;;EC/YA,SAAgB,kBAAkB,SAAiBA,uCAAqB;GACtE,MAAM,QAAQ;GACd,OAAO,MAAM,iBAAiB,KAAA,KAAa,OAAO,MAAM,6BAA6B;EACvF;EACA,MAAa,kBAAkBA,sCAAW,kBAAkB,EAAE,YAAA,GAA2DC,MAAAA,cAAAA,CAAc,OAAO,MAAM,IAAI;EACxJ,MAAa,sBAAsBD,sCAAW,8BAA8B,EAAE,gBAAA,GAAwCC,MAAAA,cAAAA,CAAc,OAAO,MAAM,QAAQ;EA2CzJ,MAAM,wBAAuC;EAC7C,MAAM,wBAA+C,EAAE,YAAA,GAAWA,MAAAA,cAAAA,CAAc,QAAQ,KAAA,GAAW,KAAK,KAAK,KAAK,CAAC;;EAInH,SAAgB,4BAA4B,MAA2C;GACrF,MAAM,QAAQD;GACd,QAAQ,MAAR;IACE,KAAK,OAAO,OAAO,gBAAgB;IACnC,KAAK,SAAS,OAAO,mBAAmB;IACxC,KAAK,YAAY,OAAO,MAAM,8BAA8B,MAAM,6BAA6B,gBAAgB;IAC/G,KAAK,SAAS,OAAO,MAAM,2BAA2B,MAAM,0BAA0B;IACtF,KAAK,QAAQ,OAAO,MAAM,0BAA0B,MAAM,yBAAyB;IACnF,KAAK,QAAQ,OAAO,MAAM,0BAA0B,MAAM,yBAAyB;IACnF,KAAK,QAAQ,OAAO,MAAM,uBAAuB,MAAM,sBAAsB;IAC7E,KAAK,SAAS,OAAO,MAAM,2BAA2B,MAAM,0BAA0B;GACxF;EACF;;EAEA,SAAS,kBAAkB,EAAE,OAAO,IAAI,aAAsE;GAC5G,QAAA,GAAOC,MAAAA,cAAAA,CAAc,OAAO;IAAE,OAAO;IAAM,QAAQ;IAAM;IAAW,SAAS;IAAa,MAAM;IAAQ,eAAe;IAAM,WAAW;IACtI,QAAQ;IAAgB,aAAa;IAAG,eAAe;IAAS,gBAAgB;GAAQ,IAAA,GACxFA,MAAAA,cAAAA,CAAc,QAAQ,EAAE,GAAG,2eAA2e,CAAC,GACvgB,GAAG;IAAC;IAAM;IAAG;GAAK,CAAC,CAAC,KAAK,QAAA,GAAOA,MAAAA,cAAAA,CAAc,UAAU;IAAE,KAAK;IAAI;IAAI,IAAI;IAAG,GAAG;IAAM,MAAM;IAAgB,QAAQ;GAAO,CAAC,CAAC,CAAC;EACnI;EACA,SAAS,mBAAmB,EAAE,OAAO,IAAI,aAAsE;GAC7G,QAAA,GAAOA,MAAAA,cAAAA,CAAc,OAAO;IAAE,OAAO;IAAM,QAAQ;IAAM;IAAW,SAAS;IAAa,MAAM;IAAQ,eAAe;IACrH,QAAQ;IAAgB,aAAa;IAAG,eAAe;IAAS,gBAAgB;GAAQ,IAAA,GACxFA,MAAAA,cAAAA,CAAc,QAAQ,EAAE,GAAG,wIAAwI,CAAC,CAAC;EACzK;;;;;EAMA,SAAgB,kBAAiC;GAC/C,MAAM,QAAQD;GACd,OAAO,MAAM,0BAA0B,MAAM,yBAAyB,MAAM,qBAAqB;EACnG;EAEA,SAAgB,yBAAwC;GACtD,MAAM,QAAQA;GACd,OAAO,MAAM,iCAAiC,MAAM,gCAAgC,MAAM,4BAA4B;EACxH;;EAGA,SAAgB,qBAAoC;GAClD,MAAM,QAAQA;GACd,OAAO,MAAM,6BAA6B,MAAM,4BAA4B;EAC9E;;EAGA,SAAgB,oBAAoB,SAAiC;GACnE,MAAM,QAAQA;GACd,QAAQ,UAAU,MAAM,wBAAwB,MAAM,wBAAwB;EAChF;;EAGA,SAAgB,kBAAkB,MAAmF;GAInH,OAAOE,sCAFK;IAAE,MAAM;IAA0B,MAAM;IAA2B,YAAY;IACzF,SAAS;IAAgC,MAAM;IAAiC,MAAM;GAAyB,EAAE,UAC9F,mBAAmB;EAC1C;;EAGA,SAAgB,kBAAiC;GAC/C,MAAM,QAAQF;GACd,OAAO,MAAM,gCACR,MAAM,+BACN,MAAM,8BACN,MAAM,6BACN;EACP;;EAGA,SAAgB,yBAAyB,WAA4D;GACnG,MAAM,QAAQA;GACd,IAAI,cAAc,MAAM,OAAO,MAAM,+BAA+B,MAAM,8BAA8B;GACxG,IAAI,cAAc,QAAQ,OAAO,MAAM,iCAAiC,MAAM,gCAAgC;GAC9G,IAAI,cAAc,QAAQ,OAAO,MAAM,iCAAiC,MAAM,gCAAgC;GAC9G,OAAO,MAAM,kCAAkC,MAAM,iCAAiC;EACxF;;EAGA,SAAgB,sBAA6C;GAE3D,OAAOG,sCAAM,gBAAgB;EAC/B;;;;;EAMA,SAAgB,kBAAiC;GAC/C,MAAM,QAAQH;GACd,OAAO,MAAM,0BAA0B,MAAM,yBAAyB,MAAM,qBAAqB;EACnG;;;;;EAMA,SAAgB,sBAAqC;GACnD,MAAM,QAAQA;GACd,OAAO,MAAM,2BACR,MAAM,0BACN,MAAM,0BACN,MAAM,yBACN,gBAAgB;EACvB"}
@@ -55,6 +55,15 @@ window.__ModuleLoader__.load({
55
55
  function supportsSessionTranslation(adapterId) {
56
56
  return adapterId === "dsh" || isSessionTranslationAdapter(adapterId);
57
57
  }
58
+ /** Preserve existing choices until an adapter overrides them. Missing legacy values default on. */
59
+ function resolveSessionTranslationOptions(settings, adapterId) {
60
+ const options = settings?.adapterOptions?.[adapterId];
61
+ return {
62
+ inputEnabled: (options?.inputEnabled ?? settings?.inputEnabled) !== false,
63
+ reasoningEnabled: (options?.reasoningEnabled ?? settings?.reasoningEnabled) !== false,
64
+ assistantEnabled: (options?.assistantEnabled ?? settings?.assistantEnabled) !== false
65
+ };
66
+ }
58
67
  /** 判断任意字符串是否为受支持的翻译语言。 */
59
68
  function isSessionTranslationLanguage(value) {
60
69
  return typeof value === "string" && SESSION_TRANSLATION_LANGUAGES.includes(value);
@@ -79,6 +88,7 @@ window.__ModuleLoader__.load({
79
88
  outputLanguage: isSessionTranslationLanguage(value.outputLanguage) ? value.outputLanguage : fallback.outputLanguage,
80
89
  bilingual: value.bilingual === true,
81
90
  nativeEnabled: value.nativeEnabled === true,
91
+ ...value.adapterOptions === void 0 ? {} : { adapterOptions: Object.fromEntries(Object.entries(value.adapterOptions).filter(([adapterId]) => supportsSessionTranslation(adapterId)).map(([adapterId]) => [adapterId, resolveSessionTranslationOptions(value, adapterId)])) },
82
92
  ...translationModel === void 0 ? {} : { translationModel },
83
93
  ...translationModels === void 0 ? {} : { translationModels },
84
94
  ...translationRules === void 0 ? {} : { translationRules }
@@ -144,6 +154,12 @@ window.__ModuleLoader__.load({
144
154
  return readSessionTranslationMetrics;
145
155
  }
146
156
  });
157
+ Object.defineProperty(exports, "resolveSessionTranslationOptions", {
158
+ enumerable: true,
159
+ get: function() {
160
+ return resolveSessionTranslationOptions;
161
+ }
162
+ });
147
163
  Object.defineProperty(exports, "supportsSessionTranslation", {
148
164
  enumerable: true,
149
165
  get: function() {
@@ -1 +1 @@
1
- {"version":3,"file":"client.session-translation.js","names":[],"sources":["../../../../src/shared/contracts/session-translation.ts"],"sourcesContent":["/** 会话翻译中间件支持的语言。 */\nexport type SessionTranslationLanguage = 'en' | 'fr' | 'de' | 'ja' | 'zh'\n\n/** 输出内容类别;工具调用、命令和路径不属于可翻译内容。 */\nexport type SessionTranslationOutputKind = 'reasoning' | 'assistant'\n\n/** 翻译请求使用的 DSH 原生模型;不保存密钥,只保存 provider/model 标识。 */\nexport interface SessionTranslationModel {\n readonly provider: string\n readonly model: string\n}\n\n/** 会话翻译中间件的持久化设置。 */\nexport interface SessionTranslationSettings {\n /** Message categories are enabled unless explicitly disabled in older or current settings. */\n readonly inputEnabled?: boolean\n readonly reasoningEnabled?: boolean\n readonly assistantEnabled?: boolean\n /** 用户输入送入 Agent 的目的语言。 */\n readonly inputLanguage: SessionTranslationLanguage\n /** 输出翻译语言;默认中文。 */\n readonly outputLanguage: SessionTranslationLanguage\n /** 是否在 UI 和历史回看中同时保留原文与译文。 */\n readonly bilingual: boolean\n /** 翻译模型;缺省时跟随 DSH 当前默认模型。 */\n readonly translationModel?: SessionTranslationModel\n /** Models in priority order. An empty pool follows the DSH default; absent pools use the legacy selection. */\n readonly translationModels?: readonly SessionTranslationModel[]\n /** Custom prompt instructions that take precedence over the default translation prompts. */\n readonly translationRules?: readonly string[]\n /**\n * DSH 原生会话是否参与翻译;缺省关闭。\n *\n * 原生会话的回复由 DSH 自己写入 `assistant/message`,开启输出翻译后正文会变成\n * 译文、原文只留在块元数据里,因此不能默认改变既有行为。\n */\n readonly nativeEnabled?: boolean\n}\n\nexport const SESSION_TRANSLATION_ADAPTER_IDS = [\n 'command-code', 'claude-code', 'kimi', 'gemini', 'pi', 'codex', 'opencode', 'grok',\n 'mcode', 'zcode', 'codebuddy', 'workbuddy', 'cursor-cli', 'kiro-cli', 'qoder', 'qoder-cn',\n 'antigravity', 'doubao',\n] as const\n\n/** DSH 内置 Agent 的适配器标识;它没有外部驱动,但同样支持会话翻译。 */\nexport const DSH_NATIVE_SESSION_ADAPTER_ID = 'dsh' as const\n\nexport const SESSION_TRANSLATION_LANGUAGES = ['en', 'fr', 'de', 'ja', 'zh'] as const\n\nexport const DEFAULT_SESSION_TRANSLATION_SETTINGS: SessionTranslationSettings = {\n inputEnabled: true,\n reasoningEnabled: true,\n assistantEnabled: true,\n inputLanguage: 'en',\n outputLanguage: 'zh',\n bilingual: false,\n nativeEnabled: false,\n}\n\n/**\n * 外部 Agent 适配器判定。\n *\n * 只表示「会话由插件的外部 CLI 驱动接管」,因此 DSH 原生 Agent 不在其中:该判定\n * 还被用来把外部 Agent 的虚拟 Provider 排除在翻译模型目录之外,混入 `dsh` 会污染\n * 这一语义。会话是否可翻译统一使用 {@link supportsSessionTranslation}。\n */\nexport function isSessionTranslationAdapter(adapterId: string): boolean {\n return (SESSION_TRANSLATION_ADAPTER_IDS as readonly string[]).includes(adapterId)\n}\n\n/** 外部 Agent 与 DSH 原生 Agent 都支持会话翻译。 */\nexport function supportsSessionTranslation(adapterId: string): boolean {\n return adapterId === DSH_NATIVE_SESSION_ADAPTER_ID || isSessionTranslationAdapter(adapterId)\n}\n\n/** 判断任意字符串是否为受支持的翻译语言。 */\nexport function isSessionTranslationLanguage(value: unknown): value is SessionTranslationLanguage {\n return typeof value === 'string' && (SESSION_TRANSLATION_LANGUAGES as readonly string[]).includes(value)\n}\n\n/**\n * 归一化翻译设置:旧设置快照可能缺少 `nativeEnabled`,非法语言回落到默认值。\n *\n * 与 `session-translation-service.ts` 的内部归一化保持同一语义,供客户端设置页在\n * 写入前补齐字段,避免旧快照把新字段写丢。\n */\nexport function normalizeSessionTranslationSettings(value: SessionTranslationSettings | undefined): SessionTranslationSettings {\n const fallback = DEFAULT_SESSION_TRANSLATION_SETTINGS\n if (value === undefined) return fallback\n const translationModel = normalizeTranslationModel(value.translationModel)\n const translationModels = Array.isArray(value.translationModels) ? normalizeTranslationModels(value.translationModels) : undefined\n const translationRules = Array.isArray(value.translationRules)\n ? value.translationRules.filter((rule): rule is string => typeof rule === 'string').map((rule) => rule.trim()).filter((rule) => rule !== '')\n : undefined\n return {\n inputEnabled: value.inputEnabled !== false,\n reasoningEnabled: value.reasoningEnabled !== false,\n assistantEnabled: value.assistantEnabled !== false,\n inputLanguage: isSessionTranslationLanguage(value.inputLanguage) ? value.inputLanguage : fallback.inputLanguage,\n outputLanguage: isSessionTranslationLanguage(value.outputLanguage) ? value.outputLanguage : fallback.outputLanguage,\n bilingual: value.bilingual === true,\n nativeEnabled: value.nativeEnabled === true,\n ...(translationModel === undefined ? {} : { translationModel }),\n ...(translationModels === undefined ? {} : { translationModels }),\n ...(translationRules === undefined ? {} : { translationRules }),\n }\n}\n\nfunction normalizeTranslationModels(values: readonly SessionTranslationModel[]): readonly SessionTranslationModel[] {\n const models: SessionTranslationModel[] = []\n const seen = new Set<string>()\n for (const value of values) {\n const model = normalizeTranslationModel(value)\n if (model === undefined) continue\n const key = JSON.stringify([model.provider, model.model])\n if (seen.has(key)) continue\n seen.add(key)\n models.push(model)\n }\n return models\n}\n\nfunction normalizeTranslationModel(value: SessionTranslationModel | undefined): SessionTranslationModel | undefined {\n if (value === undefined || value === null || typeof value.provider !== 'string' || typeof value.model !== 'string') return undefined\n const provider = value.provider.trim()\n const model = value.model.trim()\n return provider === '' || model === '' ? undefined : { provider, model }\n}\n\nexport interface SessionTranslationFailure {\n readonly code: 'timeout' | 'cancelled' | 'rate-limit' | 'network' | 'unavailable' | 'invalid-response' | 'configuration' | 'provider'\n readonly retryable: boolean\n}\n\nexport interface SessionTranslationMetrics {\n /** Elapsed translation time, including model selection and fallback attempts. */\n readonly durationMs?: number\n /** Reported token consumption across model attempts, including cached input. */\n readonly totalTokens?: number\n}\n\n/** Preserve available metrics while accepting records saved before metrics existed. */\nexport function readSessionTranslationMetrics(value: unknown): SessionTranslationMetrics {\n const record = asRecord(value)\n const durationMs = record?.durationMs\n const totalTokens = record?.totalTokens\n return {\n ...(typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0 ? { durationMs } : {}),\n ...(typeof totalTokens === 'number' && Number.isSafeInteger(totalTokens) && totalTokens >= 0 ? { totalTokens } : {}),\n }\n}\n\nexport interface SessionTranslationRecord extends SessionTranslationMetrics {\n readonly original: string\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 回复文本所在的 DSH 内容块类型,供界面将原文入口放回对应内容块。 */\n readonly outputKind?: SessionTranslationOutputKind\n readonly bilingual: boolean\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 本次尝试失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n /** Structured failure details; absent in older translation records. */\n readonly failure?: SessionTranslationFailure\n}\n\nexport type SessionTranslationRecoveryChoice = 'retry' | 'send' | 'cancel'\n\n/** A failed submission remains on the host until the user makes a choice. */\nexport interface SessionTranslationPendingInput {\n readonly id: string\n readonly sessionId: string\n readonly record: SessionTranslationRecord\n}\n\n/** 用户输入的原文、实际送出的译文和翻译模型,作为 DSH 历史元数据保存。 */\nexport interface SessionTranslationInputRecord extends SessionTranslationMetrics {\n readonly original: string\n /** 包含附件提示等不翻译内容的最终 Provider prompt。 */\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 翻译失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n}\n\n/**\n * 从 DSH 原生用户消息的 source 元数据读取输入翻译记录。\n *\n * 该字段由 `agent/pre-step` 写入并随 `user/message` 持久化;未知或不完整的历史\n * 结构一律返回 undefined,调用方按「没有翻译」处理。\n */\nexport function readNativeTranslationRecord(source: unknown): SessionTranslationInputRecord | undefined {\n const record = asRecord(source)\n const candidate = asRecord(record?.codingnsTranslationInput)\n if (candidate === null) return undefined\n if (typeof candidate.original !== 'string' || typeof candidate.translated !== 'string') return undefined\n if (candidate.original.trim() === '' || candidate.translated.trim() === '') return undefined\n const targetLanguage = isSessionTranslationLanguage(candidate.targetLanguage) ? candidate.targetLanguage : undefined\n if (targetLanguage === undefined) return undefined\n const model = normalizeTranslationModel(asRecord(candidate.model) as SessionTranslationModel | undefined)\n const sourceLanguage = isSessionTranslationLanguage(candidate.sourceLanguage) ? candidate.sourceLanguage : undefined\n return {\n original: candidate.original,\n translated: candidate.translated,\n targetLanguage,\n ...(sourceLanguage === undefined ? {} : { sourceLanguage }),\n ...(candidate.alreadyTargetLanguage === true ? { alreadyTargetLanguage: true } : {}),\n ...(candidate.failed === true ? { failed: true } : {}),\n ...(model === undefined ? {} : { model }),\n ...readSessionTranslationMetrics(candidate),\n }\n}\n\n/** 输入记录转换为详情弹层使用的通用记录;`outputKind` 缺省表示输入方向。 */\nexport function toSessionTranslationRecord(\n record: SessionTranslationInputRecord,\n options: { readonly outputKind?: SessionTranslationOutputKind; readonly bilingual?: boolean } = {},\n): SessionTranslationRecord {\n return {\n original: record.original,\n translated: record.translated,\n targetLanguage: record.targetLanguage,\n bilingual: options.bilingual === true,\n ...(options.outputKind === undefined ? {} : { outputKind: options.outputKind }),\n ...(record.sourceLanguage === undefined ? {} : { sourceLanguage: record.sourceLanguage }),\n ...(record.alreadyTargetLanguage === true ? { alreadyTargetLanguage: true } : {}),\n ...(record.failed === true ? { failed: true } : {}),\n ...(record.model === undefined ? {} : { model: record.model }),\n ...readSessionTranslationMetrics(record),\n }\n}\n\nfunction asRecord(value: unknown): Record<string, any> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, any> : null\n}\n\n/** 外部 Agent 的历史上下文使用实际发送的译文;DSH 用户消息正文保留用户原文。 */\nexport function formatSessionTranslationInput(record: SessionTranslationInputRecord): string {\n return record.translated\n}\n\n/** Return the output translation; native DSH history keeps the original and the client reads this record. */\nexport function formatSessionTranslationOutput(record: SessionTranslationRecord): string {\n return record.translated\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.session-translation.js","names":[],"sources":["../../../../src/shared/contracts/session-translation.ts"],"sourcesContent":["/** 会话翻译中间件支持的语言。 */\nexport type SessionTranslationLanguage = 'en' | 'fr' | 'de' | 'ja' | 'zh'\n\n/** 输出内容类别;工具调用、命令和路径不属于可翻译内容。 */\nexport type SessionTranslationOutputKind = 'reasoning' | 'assistant'\n\n/** 翻译请求使用的 DSH 原生模型;不保存密钥,只保存 provider/model 标识。 */\nexport interface SessionTranslationModel {\n readonly provider: string\n readonly model: string\n}\n\n/** Message categories saved independently for each agent adapter. */\nexport interface SessionTranslationOptions {\n readonly inputEnabled?: boolean\n readonly reasoningEnabled?: boolean\n readonly assistantEnabled?: boolean\n}\n\n/** Persisted translation settings; top-level message options remain legacy defaults. */\nexport interface SessionTranslationSettings extends SessionTranslationOptions {\n readonly adapterOptions?: Readonly<Record<string, SessionTranslationOptions>>\n /** 用户输入送入 Agent 的目的语言。 */\n readonly inputLanguage: SessionTranslationLanguage\n /** 输出翻译语言;默认中文。 */\n readonly outputLanguage: SessionTranslationLanguage\n /** 是否在 UI 和历史回看中同时保留原文与译文。 */\n readonly bilingual: boolean\n /** 翻译模型;缺省时跟随 DSH 当前默认模型。 */\n readonly translationModel?: SessionTranslationModel\n /** Models in priority order. An empty pool follows the DSH default; absent pools use the legacy selection. */\n readonly translationModels?: readonly SessionTranslationModel[]\n /** Custom prompt instructions that take precedence over the default translation prompts. */\n readonly translationRules?: readonly string[]\n /**\n * DSH 原生会话是否参与翻译;缺省关闭。\n *\n * 原生会话的回复由 DSH 自己写入 `assistant/message`,开启输出翻译后正文会变成\n * 译文、原文只留在块元数据里,因此不能默认改变既有行为。\n */\n readonly nativeEnabled?: boolean\n}\n\nexport const SESSION_TRANSLATION_ADAPTER_IDS = [\n 'command-code', 'claude-code', 'kimi', 'gemini', 'pi', 'codex', 'opencode', 'grok',\n 'mcode', 'zcode', 'codebuddy', 'workbuddy', 'cursor-cli', 'kiro-cli', 'qoder', 'qoder-cn',\n 'antigravity', 'doubao',\n] as const\n\n/** DSH 内置 Agent 的适配器标识;它没有外部驱动,但同样支持会话翻译。 */\nexport const DSH_NATIVE_SESSION_ADAPTER_ID = 'dsh' as const\n\nexport const SESSION_TRANSLATION_LANGUAGES = ['en', 'fr', 'de', 'ja', 'zh'] as const\n\nexport const DEFAULT_SESSION_TRANSLATION_SETTINGS: SessionTranslationSettings = {\n inputEnabled: true,\n reasoningEnabled: true,\n assistantEnabled: true,\n inputLanguage: 'en',\n outputLanguage: 'zh',\n bilingual: false,\n nativeEnabled: false,\n}\n\n/**\n * 外部 Agent 适配器判定。\n *\n * 只表示「会话由插件的外部 CLI 驱动接管」,因此 DSH 原生 Agent 不在其中:该判定\n * 还被用来把外部 Agent 的虚拟 Provider 排除在翻译模型目录之外,混入 `dsh` 会污染\n * 这一语义。会话是否可翻译统一使用 {@link supportsSessionTranslation}。\n */\nexport function isSessionTranslationAdapter(adapterId: string): boolean {\n return (SESSION_TRANSLATION_ADAPTER_IDS as readonly string[]).includes(adapterId)\n}\n\n/** 外部 Agent 与 DSH 原生 Agent 都支持会话翻译。 */\nexport function supportsSessionTranslation(adapterId: string): boolean {\n return adapterId === DSH_NATIVE_SESSION_ADAPTER_ID || isSessionTranslationAdapter(adapterId)\n}\n\n/** Preserve existing choices until an adapter overrides them. Missing legacy values default on. */\nexport function resolveSessionTranslationOptions(settings: SessionTranslationSettings | undefined, adapterId: string): Required<SessionTranslationOptions> {\n const options = settings?.adapterOptions?.[adapterId]\n return {\n inputEnabled: (options?.inputEnabled ?? settings?.inputEnabled) !== false,\n reasoningEnabled: (options?.reasoningEnabled ?? settings?.reasoningEnabled) !== false,\n assistantEnabled: (options?.assistantEnabled ?? settings?.assistantEnabled) !== false,\n }\n}\n\n/** 判断任意字符串是否为受支持的翻译语言。 */\nexport function isSessionTranslationLanguage(value: unknown): value is SessionTranslationLanguage {\n return typeof value === 'string' && (SESSION_TRANSLATION_LANGUAGES as readonly string[]).includes(value)\n}\n\n/**\n * 归一化翻译设置:旧设置快照可能缺少 `nativeEnabled`,非法语言回落到默认值。\n *\n * 与 `session-translation-service.ts` 的内部归一化保持同一语义,供客户端设置页在\n * 写入前补齐字段,避免旧快照把新字段写丢。\n */\nexport function normalizeSessionTranslationSettings(value: SessionTranslationSettings | undefined): SessionTranslationSettings {\n const fallback = DEFAULT_SESSION_TRANSLATION_SETTINGS\n if (value === undefined) return fallback\n const translationModel = normalizeTranslationModel(value.translationModel)\n const translationModels = Array.isArray(value.translationModels) ? normalizeTranslationModels(value.translationModels) : undefined\n const translationRules = Array.isArray(value.translationRules)\n ? value.translationRules.filter((rule): rule is string => typeof rule === 'string').map((rule) => rule.trim()).filter((rule) => rule !== '')\n : undefined\n return {\n inputEnabled: value.inputEnabled !== false,\n reasoningEnabled: value.reasoningEnabled !== false,\n assistantEnabled: value.assistantEnabled !== false,\n inputLanguage: isSessionTranslationLanguage(value.inputLanguage) ? value.inputLanguage : fallback.inputLanguage,\n outputLanguage: isSessionTranslationLanguage(value.outputLanguage) ? value.outputLanguage : fallback.outputLanguage,\n bilingual: value.bilingual === true,\n nativeEnabled: value.nativeEnabled === true,\n ...(value.adapterOptions === undefined ? {} : {\n adapterOptions: Object.fromEntries(Object.entries(value.adapterOptions)\n .filter(([adapterId]) => supportsSessionTranslation(adapterId))\n .map(([adapterId]) => [adapterId, resolveSessionTranslationOptions(value, adapterId)])),\n }),\n ...(translationModel === undefined ? {} : { translationModel }),\n ...(translationModels === undefined ? {} : { translationModels }),\n ...(translationRules === undefined ? {} : { translationRules }),\n }\n}\n\nfunction normalizeTranslationModels(values: readonly SessionTranslationModel[]): readonly SessionTranslationModel[] {\n const models: SessionTranslationModel[] = []\n const seen = new Set<string>()\n for (const value of values) {\n const model = normalizeTranslationModel(value)\n if (model === undefined) continue\n const key = JSON.stringify([model.provider, model.model])\n if (seen.has(key)) continue\n seen.add(key)\n models.push(model)\n }\n return models\n}\n\nfunction normalizeTranslationModel(value: SessionTranslationModel | undefined): SessionTranslationModel | undefined {\n if (value === undefined || value === null || typeof value.provider !== 'string' || typeof value.model !== 'string') return undefined\n const provider = value.provider.trim()\n const model = value.model.trim()\n return provider === '' || model === '' ? undefined : { provider, model }\n}\n\nexport interface SessionTranslationFailure {\n readonly code: 'timeout' | 'cancelled' | 'rate-limit' | 'network' | 'unavailable' | 'invalid-response' | 'configuration' | 'provider'\n readonly retryable: boolean\n}\n\nexport interface SessionTranslationMetrics {\n /** Elapsed translation time, including model selection and fallback attempts. */\n readonly durationMs?: number\n /** Reported token consumption across model attempts, including cached input. */\n readonly totalTokens?: number\n}\n\n/** Preserve available metrics while accepting records saved before metrics existed. */\nexport function readSessionTranslationMetrics(value: unknown): SessionTranslationMetrics {\n const record = asRecord(value)\n const durationMs = record?.durationMs\n const totalTokens = record?.totalTokens\n return {\n ...(typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0 ? { durationMs } : {}),\n ...(typeof totalTokens === 'number' && Number.isSafeInteger(totalTokens) && totalTokens >= 0 ? { totalTokens } : {}),\n }\n}\n\nexport interface SessionTranslationRecord extends SessionTranslationMetrics {\n readonly original: string\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 回复文本所在的 DSH 内容块类型,供界面将原文入口放回对应内容块。 */\n readonly outputKind?: SessionTranslationOutputKind\n readonly bilingual: boolean\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 本次尝试失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n /** Structured failure details; absent in older translation records. */\n readonly failure?: SessionTranslationFailure\n}\n\nexport type SessionTranslationRecoveryChoice = 'retry' | 'send' | 'cancel'\n\n/** A failed submission remains on the host until the user makes a choice. */\nexport interface SessionTranslationPendingInput {\n readonly id: string\n readonly sessionId: string\n readonly record: SessionTranslationRecord\n}\n\n/** 用户输入的原文、实际送出的译文和翻译模型,作为 DSH 历史元数据保存。 */\nexport interface SessionTranslationInputRecord extends SessionTranslationMetrics {\n readonly original: string\n /** 包含附件提示等不翻译内容的最终 Provider prompt。 */\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 翻译失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n}\n\n/**\n * 从 DSH 原生用户消息的 source 元数据读取输入翻译记录。\n *\n * 该字段由 `agent/pre-step` 写入并随 `user/message` 持久化;未知或不完整的历史\n * 结构一律返回 undefined,调用方按「没有翻译」处理。\n */\nexport function readNativeTranslationRecord(source: unknown): SessionTranslationInputRecord | undefined {\n const record = asRecord(source)\n const candidate = asRecord(record?.codingnsTranslationInput)\n if (candidate === null) return undefined\n if (typeof candidate.original !== 'string' || typeof candidate.translated !== 'string') return undefined\n if (candidate.original.trim() === '' || candidate.translated.trim() === '') return undefined\n const targetLanguage = isSessionTranslationLanguage(candidate.targetLanguage) ? candidate.targetLanguage : undefined\n if (targetLanguage === undefined) return undefined\n const model = normalizeTranslationModel(asRecord(candidate.model) as SessionTranslationModel | undefined)\n const sourceLanguage = isSessionTranslationLanguage(candidate.sourceLanguage) ? candidate.sourceLanguage : undefined\n return {\n original: candidate.original,\n translated: candidate.translated,\n targetLanguage,\n ...(sourceLanguage === undefined ? {} : { sourceLanguage }),\n ...(candidate.alreadyTargetLanguage === true ? { alreadyTargetLanguage: true } : {}),\n ...(candidate.failed === true ? { failed: true } : {}),\n ...(model === undefined ? {} : { model }),\n ...readSessionTranslationMetrics(candidate),\n }\n}\n\n/** 输入记录转换为详情弹层使用的通用记录;`outputKind` 缺省表示输入方向。 */\nexport function toSessionTranslationRecord(\n record: SessionTranslationInputRecord,\n options: { readonly outputKind?: SessionTranslationOutputKind; readonly bilingual?: boolean } = {},\n): SessionTranslationRecord {\n return {\n original: record.original,\n translated: record.translated,\n targetLanguage: record.targetLanguage,\n bilingual: options.bilingual === true,\n ...(options.outputKind === undefined ? {} : { outputKind: options.outputKind }),\n ...(record.sourceLanguage === undefined ? {} : { sourceLanguage: record.sourceLanguage }),\n ...(record.alreadyTargetLanguage === true ? { alreadyTargetLanguage: true } : {}),\n ...(record.failed === true ? { failed: true } : {}),\n ...(record.model === undefined ? {} : { model: record.model }),\n ...readSessionTranslationMetrics(record),\n }\n}\n\nfunction asRecord(value: unknown): Record<string, any> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, any> : null\n}\n\n/** 外部 Agent 的历史上下文使用实际发送的译文;DSH 用户消息正文保留用户原文。 */\nexport function formatSessionTranslationInput(record: SessionTranslationInputRecord): string {\n return record.translated\n}\n\n/** Return the output translation; native DSH history keeps the original and the client reads this record. */\nexport function formatSessionTranslationOutput(record: SessionTranslationRecord): string {\n return record.translated\n}\n"],"mappings":"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"}